From 0c559cfabdec78b10c8a604b8ef4315487f015fe Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Fri, 6 Dec 2024 18:12:55 -0700 Subject: [PATCH 1/8] add caching pages to next 14 and some tests too --- fixtures/next-14/app/actions.js | 16 ++++++ fixtures/next-14/app/components/Dog.js | 16 ++++++ fixtures/next-14/app/isr-dogs/[id]/page.js | 12 +++++ fixtures/next-14/app/not-found.js | 11 ++++ fixtures/next-14/app/ssg-dogs/[id]/page.js | 11 ++++ fixtures/next-14/app/ssr-dogs/[id]/page.js | 5 ++ fixtures/next-14/next.config.js | 6 ++- package.json | 3 +- test/next-14.test.js | 60 ++++++++++++++++++++++ util/docker/base.dockerfile | 3 ++ util/scripts/run-fixture-locally.js | 54 +++++++++++++++++++ 11 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 fixtures/next-14/app/actions.js create mode 100644 fixtures/next-14/app/components/Dog.js create mode 100644 fixtures/next-14/app/isr-dogs/[id]/page.js create mode 100644 fixtures/next-14/app/not-found.js create mode 100644 fixtures/next-14/app/ssg-dogs/[id]/page.js create mode 100644 fixtures/next-14/app/ssr-dogs/[id]/page.js create mode 100644 util/scripts/run-fixture-locally.js diff --git a/fixtures/next-14/app/actions.js b/fixtures/next-14/app/actions.js new file mode 100644 index 0000000..b54030d --- /dev/null +++ b/fixtures/next-14/app/actions.js @@ -0,0 +1,16 @@ +'use server'; + +import('harperdb'); + +export async function listDogs() { + const dogs = []; + for await (const dog of tables.Dog.search()) { + dogs.push({ id: dog.id }); + } + console.log('dogs', dogs); + return dogs; +} + +export async function getDog(id) { + return tables.Dog.get(id); +} diff --git a/fixtures/next-14/app/components/Dog.js b/fixtures/next-14/app/components/Dog.js new file mode 100644 index 0000000..6597af4 --- /dev/null +++ b/fixtures/next-14/app/components/Dog.js @@ -0,0 +1,16 @@ +import { getDog } from '../actions'; +import { notFound } from 'next/navigation'; + +export default async function Dog({ id }) { + const dog = await getDog(id); + + return dog ? ( +
+

{dog.name}

+

{dog.breed}

+

Woof!

+
+ ) : ( + notFound() + ); +} diff --git a/fixtures/next-14/app/isr-dogs/[id]/page.js b/fixtures/next-14/app/isr-dogs/[id]/page.js new file mode 100644 index 0000000..a058241 --- /dev/null +++ b/fixtures/next-14/app/isr-dogs/[id]/page.js @@ -0,0 +1,12 @@ +import Dog from '../../components/Dog'; +import { listDogs } from '../../actions'; + +export const revalidate = 10; + +export default async function ISRDog({ params }) { + return ; +} + +export function generateStaticParams() { + return listDogs(); +} diff --git a/fixtures/next-14/app/not-found.js b/fixtures/next-14/app/not-found.js new file mode 100644 index 0000000..9177ba3 --- /dev/null +++ b/fixtures/next-14/app/not-found.js @@ -0,0 +1,11 @@ +import Link from 'next/link'; + +export default function NotFound() { + return ( +
+

404 Woof!

+

Page not found.

+ Home +
+ ); +} diff --git a/fixtures/next-14/app/ssg-dogs/[id]/page.js b/fixtures/next-14/app/ssg-dogs/[id]/page.js new file mode 100644 index 0000000..f894b24 --- /dev/null +++ b/fixtures/next-14/app/ssg-dogs/[id]/page.js @@ -0,0 +1,11 @@ +import Dog from '../../components/Dog'; +import { listDogs } from '../../actions'; + +// No revalidation. This page renders based on the list of dogs returned by generateStaticParams. +export default async function SSGDog({ params }) { + return ; +} + +export function generateStaticParams() { + return listDogs(); +} diff --git a/fixtures/next-14/app/ssr-dogs/[id]/page.js b/fixtures/next-14/app/ssr-dogs/[id]/page.js new file mode 100644 index 0000000..630e300 --- /dev/null +++ b/fixtures/next-14/app/ssr-dogs/[id]/page.js @@ -0,0 +1,5 @@ +import Dog from '../../components/Dog'; + +export default async function SSRDog({ params }) { + return ; +} diff --git a/fixtures/next-14/next.config.js b/fixtures/next-14/next.config.js index f053ebf..06bf277 100644 --- a/fixtures/next-14/next.config.js +++ b/fixtures/next-14/next.config.js @@ -1 +1,5 @@ -module.exports = {}; +module.exports = { + experimental: { + serverComponentsExternalPackages: ['harperdb'], + }, +}; diff --git a/package.json b/package.json index 4175620..18b6e8d 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,8 @@ "format:fix": "npm run format -- --write", "pretest": "node util/scripts/pretest.js", "test": "playwright test --workers 3", - "build-fixture": "node util/scripts/build-fixture-cli.js" + "build-fixture": "node util/scripts/build-fixture-cli.js", + "run-fixture-locally": "node util/scripts/run-fixture-locally.js" }, "dependencies": { "shell-quote": "^1.8.1" diff --git a/test/next-14.test.js b/test/next-14.test.js index 25e590e..fcb4933 100644 --- a/test/next-14.test.js +++ b/test/next-14.test.js @@ -11,3 +11,63 @@ test('title', async ({ nextApp, page }) => { await page.goto(nextApp.rest.toString()); await expect(page).toHaveTitle('HarperDB - Next.js v14 App'); }); + +test.describe('caching', () => { + test('isr', async ({ nextApp, page }) => { + const url = `${nextApp.rest}/ssg-dogs/0`; + + let response = await page.goto(url); + expect(response.status()).toBe(200); + await expect(page.locator('h1')).toHaveText('Lincoln'); + + let headers = response.headers(); + expect(headers['x-nextjs-cache']).toBe('STALE'); + expect(headers['cache-control']).toBe('s-maxage=10, stale-while-revalidate'); + + response = await page.goto(url); + expect(response.status()).toBe(304); + await expect(page.locator('h1')).toHaveText('Lincoln'); + + headers = response.headers(); + expect(headers['x-nextjs-cache']).toBe('HIT'); + expect(headers['cache-control']).toBe('s-maxage=10, stale-while-revalidate'); + }); + + test('ssg', async ({ nextApp, page }) => { + const url = `${nextApp.rest}/ssg-dogs/0`; + + let response = await page.goto(url); + expect(response.status()).toBe(200); + await expect(page.locator('h1')).toHaveText('Lincoln'); + + let headers = response.headers(); + expect(headers['x-nextjs-cache']).toBe('HIT'); + expect(headers['cache-control']).toBe('s-maxage=31536000, stale-while-revalidate'); + + response = await page.goto(url); + expect(response.status()).toBe(304); + await expect(page.locator('h1')).toHaveText('Lincoln'); + + headers = response.headers(); + expect(headers['x-nextjs-cache']).toBe('HIT'); + expect(headers['cache-control']).toBe('s-maxage=10, stale-while-revalidate'); + }); + + test('ssr', async ({ nextApp, page }) => { + const url = `${nextApp.rest}/ssr-dogs/0`; + + let response = await page.goto(url); + expect(response.status()).toBe(200); + await expect(page.locator('h1')).toHaveText('Lincoln'); + + let headers = response.headers(); + expect(headers['cache-control']).toBe('private, no-cache, no-store, max-age=0, must-revalidate'); + + response = await page.goto(url); + expect(response.status()).toBe(200); + await expect(page.locator('h1')).toHaveText('Lincoln'); + + headers = response.headers(); + expect(headers['cache-control']).toBe('private, no-cache, no-store, max-age=0, must-revalidate'); + }); +}); diff --git a/util/docker/base.dockerfile b/util/docker/base.dockerfile index 4487fa3..7104df1 100644 --- a/util/docker/base.dockerfile +++ b/util/docker/base.dockerfile @@ -27,6 +27,7 @@ ENV HTTP_PORT=9926 ENV THREADS_COUNT=1 ENV LOGGING_STDSTREAMS=true ENV LOGGING_LEVEL=debug +ENV AUTHENTICATION_AUTHORIZELOCAL=false RUN harperdb start @@ -48,5 +49,7 @@ RUN npm link WORKDIR / +RUN harperdb start + # By default, run HarperDB when the container starts. This can be overridden by passing a different command to the container, or using a new CMD in a child Dockerfile. CMD harperdb run \ No newline at end of file diff --git a/util/scripts/run-fixture-locally.js b/util/scripts/run-fixture-locally.js new file mode 100644 index 0000000..a8d3ac1 --- /dev/null +++ b/util/scripts/run-fixture-locally.js @@ -0,0 +1,54 @@ +// Arg next fixture path +import { parseArgs } from 'node:util'; +import { execSync } from 'node:child_process'; +import { NEXT_MAJORS, ROOT } from '../constants-and-names.js'; +import { symlink } from 'node:fs/promises'; +import { join } from 'node:path'; + +const HELP = `@harperdb/nextjs run fixture locally CLI + +Note: The Node.js version is determined by the Node.js version on your machine. + +Usage: + \x1b[36mnpm run run-fixture-locally\x1b[0m \x1b[35m-- --next-major\x1b[0m=\x1b[32m\x1b[0m + \x1b[36mnpm run run-fixture-locally\x1b[0m \x1b[32m\x1b[0m + +Example: \x1b[33mnpm run run-fixture-locally 14 /hdb \x1b[0m \x1b[2m# Next.js v14 fixture \`fixtures/next-14\`\x1b[0m +`; + +const { values, positionals } = parseArgs({ + options: { 'next-major': { type: 'string' }, 'help': { type: 'boolean' } }, + allowPositionals: true, +}); + +if (values.help) { + console.log(HELP); + process.exit(0); +} + +const nextMajor = values['next-major'] ?? positionals[0]; + +if (nextMajor === undefined) { + console.error('Error: Incorrect arguments.\n'); + console.log(HELP); + process.exit(1); +} + +if (!NEXT_MAJORS.has(nextMajor)) { + console.error(`Error: Invalid next-major: ${nextMajor}. Supported values: ${Array.from(NEXT_MAJORS).join(', ')}`); + process.exit(1); +} + +// execSync('harperdb start', { stdio: 'inherit' }); +const configurationString = execSync(`harperdb get_configuration json=true`, { encoding: 'utf-8' }); +const configuration = JSON.parse(configurationString); +const componentsRoot = configuration.componentsRoot; + +console.log(`⛓️ Linking fixtures to ${componentsRoot}`); + +const linkResults = await Promise.all([ + symlink(join(ROOT, 'fixtures', 'harperdb-base-component'), join(componentsRoot, 'harperdb-base-component')), + symlink(join(ROOT, 'fixtures', `next-${nextMajor}`), join(componentsRoot, `next-${nextMajor}`)), +]); + +execSync(`harperdb restart`, { stdio: 'inherit' }); From 935c69f66489d8149131e1c01bde32382f8d7b1c Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Mon, 9 Dec 2024 16:22:09 -0700 Subject: [PATCH 2/8] redo testing setup lol --- fixtures/harperdb-base-component/package.json | 3 +- fixtures/harperdb-base-component/resources.js | 4 +- fixtures/next-14/.dockerignore | 3 + fixtures/next-14/app/actions.js | 16 --- fixtures/next-14/app/components/Dog.js | 5 +- fixtures/next-14/app/data.js | 9 ++ fixtures/next-14/app/isr-dogs/[id]/page.js | 13 ++- fixtures/next-14/app/ssg-dogs/[id]/page.js | 12 ++- fixtures/next-14/app/ssr-dogs/[id]/page.js | 10 +- fixtures/next-14/config.yaml | 5 + fixtures/next-14/next.config.js | 7 ++ fixtures/next-14/package.json | 11 ++- fixtures/next-14/playwright.config.js | 15 +++ fixtures/next-14/resources.mjs | 11 +++ fixtures/next-14/schema.graphql | 5 + fixtures/next-14/test/next-14.test.js | 97 +++++++++++++++++++ fixtures/next-14/util/global-setup.js | 22 +++++ fixtures/next-14/util/global-teardown.js | 9 ++ test.Dockerfile | 39 ++++++++ 19 files changed, 263 insertions(+), 33 deletions(-) create mode 100644 fixtures/next-14/.dockerignore delete mode 100644 fixtures/next-14/app/actions.js create mode 100644 fixtures/next-14/app/data.js create mode 100644 fixtures/next-14/playwright.config.js create mode 100644 fixtures/next-14/resources.mjs create mode 100644 fixtures/next-14/schema.graphql create mode 100644 fixtures/next-14/test/next-14.test.js create mode 100644 fixtures/next-14/util/global-setup.js create mode 100644 fixtures/next-14/util/global-teardown.js create mode 100644 test.Dockerfile diff --git a/fixtures/harperdb-base-component/package.json b/fixtures/harperdb-base-component/package.json index de0cb1b..eba26bb 100644 --- a/fixtures/harperdb-base-component/package.json +++ b/fixtures/harperdb-base-component/package.json @@ -1,4 +1,5 @@ { "name": "harperdb-base-component", - "private": true + "private": true, + "type": "module" } diff --git a/fixtures/harperdb-base-component/resources.js b/fixtures/harperdb-base-component/resources.js index 90862e7..48bbe97 100644 --- a/fixtures/harperdb-base-component/resources.js +++ b/fixtures/harperdb-base-component/resources.js @@ -12,7 +12,7 @@ const dogs = [ { id: '10', name: 'Bailey', breed: 'Golden Retriever' }, { id: '11', name: 'Sadie', breed: 'Belgian Malinois' }, ]; - +console.log('testing'); for (const dog of dogs) { - tables.Dog.put(dog); + await tables.Dog.put(dog); } diff --git a/fixtures/next-14/.dockerignore b/fixtures/next-14/.dockerignore new file mode 100644 index 0000000..42b9c8a --- /dev/null +++ b/fixtures/next-14/.dockerignore @@ -0,0 +1,3 @@ +node_modules +.next +test-results \ No newline at end of file diff --git a/fixtures/next-14/app/actions.js b/fixtures/next-14/app/actions.js deleted file mode 100644 index b54030d..0000000 --- a/fixtures/next-14/app/actions.js +++ /dev/null @@ -1,16 +0,0 @@ -'use server'; - -import('harperdb'); - -export async function listDogs() { - const dogs = []; - for await (const dog of tables.Dog.search()) { - dogs.push({ id: dog.id }); - } - console.log('dogs', dogs); - return dogs; -} - -export async function getDog(id) { - return tables.Dog.get(id); -} diff --git a/fixtures/next-14/app/components/Dog.js b/fixtures/next-14/app/components/Dog.js index 6597af4..04598fd 100644 --- a/fixtures/next-14/app/components/Dog.js +++ b/fixtures/next-14/app/components/Dog.js @@ -1,9 +1,6 @@ -import { getDog } from '../actions'; import { notFound } from 'next/navigation'; -export default async function Dog({ id }) { - const dog = await getDog(id); - +export default async function Dog({ dog }) { return dog ? (

{dog.name}

diff --git a/fixtures/next-14/app/data.js b/fixtures/next-14/app/data.js new file mode 100644 index 0000000..35176b2 --- /dev/null +++ b/fixtures/next-14/app/data.js @@ -0,0 +1,9 @@ +import('harperdb'); + +export function getDog(id) { + return tables.Dog.get(id); +} + +export function listDogs() { + return tables.Dog.search().map(dog => ({ id: dog.id })); +} \ No newline at end of file diff --git a/fixtures/next-14/app/isr-dogs/[id]/page.js b/fixtures/next-14/app/isr-dogs/[id]/page.js index a058241..65b947f 100644 --- a/fixtures/next-14/app/isr-dogs/[id]/page.js +++ b/fixtures/next-14/app/isr-dogs/[id]/page.js @@ -1,10 +1,17 @@ import Dog from '../../components/Dog'; -import { listDogs } from '../../actions'; +import { listDogs, getDog } from '../../data'; -export const revalidate = 10; +export const revalidate = 1; export default async function ISRDog({ params }) { - return ; + const dog = await getDog(params.id); + + return ( +
+

{new Date().toISOString()}

+ +
+ ); } export function generateStaticParams() { diff --git a/fixtures/next-14/app/ssg-dogs/[id]/page.js b/fixtures/next-14/app/ssg-dogs/[id]/page.js index f894b24..0651281 100644 --- a/fixtures/next-14/app/ssg-dogs/[id]/page.js +++ b/fixtures/next-14/app/ssg-dogs/[id]/page.js @@ -1,9 +1,15 @@ import Dog from '../../components/Dog'; -import { listDogs } from '../../actions'; +import { getDog, listDogs } from '../../data'; -// No revalidation. This page renders based on the list of dogs returned by generateStaticParams. export default async function SSGDog({ params }) { - return ; + const dog = getDog(params.id); + + return ( +
+

{new Date().toISOString()}

+ +
+ ); } export function generateStaticParams() { diff --git a/fixtures/next-14/app/ssr-dogs/[id]/page.js b/fixtures/next-14/app/ssr-dogs/[id]/page.js index 630e300..d998c16 100644 --- a/fixtures/next-14/app/ssr-dogs/[id]/page.js +++ b/fixtures/next-14/app/ssr-dogs/[id]/page.js @@ -1,5 +1,13 @@ import Dog from '../../components/Dog'; +import { getDog } from '../../data'; export default async function SSRDog({ params }) { - return ; + const dog = await getDog(params.id); + + return ( +
+

{new Date().toISOString()}

+ +
+ ); } diff --git a/fixtures/next-14/config.yaml b/fixtures/next-14/config.yaml index c0f2cb6..7fc576d 100644 --- a/fixtures/next-14/config.yaml +++ b/fixtures/next-14/config.yaml @@ -1,3 +1,8 @@ +rest: true +graphqlSchema: + files: './schema.graphql' +jsResource: + files: './resources.mjs' '@harperdb/nextjs': package: '@harperdb/nextjs' files: '/*' diff --git a/fixtures/next-14/next.config.js b/fixtures/next-14/next.config.js index 06bf277..5e07bfc 100644 --- a/fixtures/next-14/next.config.js +++ b/fixtures/next-14/next.config.js @@ -1,4 +1,11 @@ module.exports = { + webpack: (config) => { + config.externals.push({ + harperdb: 'commonjs harperdb', + }); + + return config; + }, experimental: { serverComponentsExternalPackages: ['harperdb'], }, diff --git a/fixtures/next-14/package.json b/fixtures/next-14/package.json index 63ac233..16da2c4 100644 --- a/fixtures/next-14/package.json +++ b/fixtures/next-14/package.json @@ -6,12 +6,17 @@ "build": "next build", "start": "next start", "lint": "next lint", - "postinstall": "npm link @harperdb/nextjs" + "postinstall": "npm link @harperdb/nextjs", + "test": "playwright test" }, "dependencies": { "@harperdb/nextjs": "*", + "harperdb": "^4.4.8", + "next": "^14", "react": "^18", - "react-dom": "^18", - "next": "^14" + "react-dom": "^18" + }, + "devDependencies": { + "@playwright/test": "^1.49.0" } } diff --git a/fixtures/next-14/playwright.config.js b/fixtures/next-14/playwright.config.js new file mode 100644 index 0000000..c77e733 --- /dev/null +++ b/fixtures/next-14/playwright.config.js @@ -0,0 +1,15 @@ +const { defineConfig, devices } = require('@playwright/test'); +const { join } = require('node:path'); + +module.exports = defineConfig({ + testDir: 'test', + fullyParallel: true, + forbidOnly: !!process.env.CI, + projects: [ + { + use: { ...devices['Desktop Chrome'] }, + } + ], + globalSetup: join(__dirname, './util/global-setup.js'), + globalTeardown: join(__dirname, './util/global-teardown.js'), +}); diff --git a/fixtures/next-14/resources.mjs b/fixtures/next-14/resources.mjs new file mode 100644 index 0000000..00c3b7a --- /dev/null +++ b/fixtures/next-14/resources.mjs @@ -0,0 +1,11 @@ +const dogs = [ + { id: '0', name: 'Lincoln', breed: 'Shepherd' }, + { id: '1', name: 'Max', breed: 'Cocker Spaniel' }, + { id: '2', name: 'Bella', breed: 'Lab' }, + { id: '3', name: 'Charlie', breed: 'Great Dane' }, + { id: '4', name: 'Lucy', breed: 'Newfoundland' }, +]; + +for (const dog of dogs) { + await tables.Dog.put(dog); +} diff --git a/fixtures/next-14/schema.graphql b/fixtures/next-14/schema.graphql new file mode 100644 index 0000000..d92a5be --- /dev/null +++ b/fixtures/next-14/schema.graphql @@ -0,0 +1,5 @@ +type Dog @table @export { + id: ID @primaryKey + name: String + breed: String +} diff --git a/fixtures/next-14/test/next-14.test.js b/fixtures/next-14/test/next-14.test.js new file mode 100644 index 0000000..8e438e0 --- /dev/null +++ b/fixtures/next-14/test/next-14.test.js @@ -0,0 +1,97 @@ +import { test, expect } from '@playwright/test'; + +// test.describe.configure({ mode: 'serial' }); +const baseURL = 'http://localhost:9926'; + +test('home page', async ({ page }) => { + await page.goto(baseURL); + await expect(page.locator('h1')).toHaveText('Next.js v14'); +}); + +test('title', async ({ page }) => { + await page.goto(baseURL); + await expect(page).toHaveTitle('HarperDB - Next.js v14 App'); +}); + +test.describe('caching', () => { + test('isr', async ({ page }) => { + const url = `${baseURL}/isr-dogs/0`; + + // ISR Timing is flaky based on build time and test execution time, so do three renders in sequence and only test the last two. + // If the first render is STALE, then the second two will be HITs. + // If the first render is a HIT, then so should the second and third. + + // Reset revalidation time + await page.goto(url); + + // First render + const response1 = await page.goto(url); + const when1 = await page.getByTestId('when').innerText(); + // Should be a Next.js cache hit + expect(response1.headers()['x-nextjs-cache']).toBe('HIT'); + + // Second render, within revalidate time + const response2 = await page.goto(url); + const when2 = await page.getByTestId('when').innerText(); + // Should be a Next.js cache hit + expect(response2.headers()['x-nextjs-cache']).toBe('HIT'); + + expect(when1).toBe(when2); + + // Wait for revalidate time to pass + await page.waitForTimeout(1001); + + // Third render, after revalidate time + const response3 = await page.goto(url); + const when3 = await page.getByTestId('when').innerText(); + + expect(response3.headers()['x-nextjs-cache']).toBe('STALE'); + // Stale hit, so expect page to still be same as before + expect(when2).toBe(when3); + + // Page should be updated after revalidation + const response4 = await page.goto(url); + const when4 = await page.getByTestId('when').innerText(); + // Should be a Next.js cache hit + expect(response4.headers()['x-nextjs-cache']).toBe('HIT'); + + // Assert time has changed + expect(when3).not.toBe(when4); + }); + + test('ssg', async ({ page }) => { + const url = `${baseURL}/ssg-dogs/0`; + + // Every render should be a cache hit and the page should not change + + // First render + const response1 = await page.goto(url); + const when1 = await page.getByTestId('when').innerText(); + expect(response1.headers()['x-nextjs-cache']).toBe('HIT'); + + // Second render + const response2 = await page.goto(url); + const when2 = await page.getByTestId('when').innerText(); + expect(response2.headers()['x-nextjs-cache']).toBe('HIT'); + + expect(when1).toBe(when2); + }); + + test('ssr', async ({ page }) => { + const url = `${baseURL}/ssr-dogs/0`; + + // Every render should be a cache miss and the page should dynamically change + + // First render + const response1 = await page.goto(url); + const when1 = await page.getByTestId('when').innerText(); + expect(response1.headers()['cache-control']).toBe('private, no-cache, no-store, max-age=0, must-revalidate'); + + // Second render + const response2 = await page.goto(url); + const when2 = await page.getByTestId('when').innerText(); + expect(response2.headers()['cache-control']).toBe('private, no-cache, no-store, max-age=0, must-revalidate'); + + expect(when1).not.toBe(when2); + }); +}); diff --git a/fixtures/next-14/util/global-setup.js b/fixtures/next-14/util/global-setup.js new file mode 100644 index 0000000..2fd21bd --- /dev/null +++ b/fixtures/next-14/util/global-setup.js @@ -0,0 +1,22 @@ +const { spawn } = require('node:child_process'); +const { Transform } = require('node:stream'); +const { join } = require('node:path'); + +module.exports = function globalSetup(config) { + return new Promise((resolve, reject) => { + const harperdbProcess = spawn('npx', ['harperdb', 'run', join(__dirname, '..')]); + + harperdbProcess.on('error', reject); + harperdbProcess.on('exit', resolve); + + harperdbProcess.stdout.pipe(new Transform({ + transform(chunk, encoding, callback) { + const data = chunk.toString(); + if (/HarperDB \d+.\d+.\d+ successfully started/.test(data)) { + resolve(); + } + callback(null, chunk); + } + })).pipe(process.stdout); + }); +} \ No newline at end of file diff --git a/fixtures/next-14/util/global-teardown.js b/fixtures/next-14/util/global-teardown.js new file mode 100644 index 0000000..06094d5 --- /dev/null +++ b/fixtures/next-14/util/global-teardown.js @@ -0,0 +1,9 @@ +const { spawn } = require('node:child_process'); + +module.exports = function globalTeardown(config) { + return new Promise((resolve, reject) => { + const harperdbProcess = spawn('npx', ['harperdb', 'stop']); + harperdbProcess.on('error', reject); + harperdbProcess.on('exit', resolve); + }); +} \ No newline at end of file diff --git a/test.Dockerfile b/test.Dockerfile new file mode 100644 index 0000000..80574aa --- /dev/null +++ b/test.Dockerfile @@ -0,0 +1,39 @@ +ARG NODE_VERSION=22 +FROM docker.io/node:${NODE_VERSION}-slim + +EXPOSE 9925 9926 + +RUN npx -y playwright install --with-deps + +# Install HarperDB Globally +RUN npm install -g harperdb@4.4.8 + +# Set HarperDB Environment Variables +ENV TC_AGREEMENT=yes +ENV HDB_ADMIN_USERNAME=hdb_admin +ENV HDB_ADMIN_PASSWORD=password +ENV ROOTPATH=/hdb +ENV OPERATIONSAPI_NETWORK_PORT=9925 +ENV HTTP_PORT=9926 +ENV THREADS_COUNT=1 +ENV LOGGING_STDSTREAMS=true +ENV LOGGING_LEVEL=debug +ENV AUTHENTICATION_AUTHORIZELOCAL=false + +# Create the @harperdb/nextjs module directory so it can be linked locally +RUN mkdir -p /@harperdb/nextjs +COPY config.yaml extension.js cli.js package.json /@harperdb/nextjs/ +WORKDIR /@harperdb/nextjs +# Install dependencies for the @harperdb/nextjs module +RUN npm install --omit=dev +# Create link to the @harperdb/nextjs module +RUN npm link + +WORKDIR / + +ARG FIXTURE +COPY /fixtures/${FIXTURE} /fixture +WORKDIR /fixture +RUN npm install + +CMD npm run test \ No newline at end of file From 4801750db2cbe56011f2bc0201516406194c175c Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Wed, 11 Dec 2024 13:20:10 -0700 Subject: [PATCH 3/8] docker is flaky. ci is broken. but it works locally i guess --- .dockerignore | 1 - .github/workflows/test.yaml | 5 +- fixtures/harperdb-base-component/resources.js | 13 +--- fixtures/next-14/.dockerignore | 3 - fixtures/next-14/config.yaml | 5 -- fixtures/next-14/middleware.js | 9 +++ fixtures/next-14/package.json | 8 +- fixtures/next-14/playwright.config.js | 13 ++-- fixtures/next-14/resources.mjs | 11 --- fixtures/next-14/schema.graphql | 5 -- .../test/{next-14.test.js => index.test.js} | 8 +- fixtures/next-9/playwright.config.js | 15 ++++ fixtures/next-9/test/next-9.test.js | 19 +++++ .../{next-14 => next-9}/util/global-setup.js | 3 +- .../util/global-teardown.js | 0 playwright.config.js | 20 ----- test-utils/global-setup.js | 53 ++++++++++++++ test-utils/global-teardown.js | 9 +++ test-utils/package.json | 8 ++ test.Dockerfile | 23 ++++-- test.Dockerfile.dockerignore | 3 + test/next-13.test.js | 13 ---- test/next-14.test.js | 73 ------------------- test/next-15.test.js | 13 ---- test/next-9.test.js | 19 ----- util/docker/base.dockerfile | 4 +- 26 files changed, 162 insertions(+), 194 deletions(-) delete mode 100644 .dockerignore delete mode 100644 fixtures/next-14/.dockerignore create mode 100644 fixtures/next-14/middleware.js delete mode 100644 fixtures/next-14/resources.mjs delete mode 100644 fixtures/next-14/schema.graphql rename fixtures/next-14/test/{next-14.test.js => index.test.js} (92%) create mode 100644 fixtures/next-9/playwright.config.js create mode 100644 fixtures/next-9/test/next-9.test.js rename fixtures/{next-14 => next-9}/util/global-setup.js (84%) rename fixtures/{next-14 => next-9}/util/global-teardown.js (100%) delete mode 100644 playwright.config.js create mode 100644 test-utils/global-setup.js create mode 100644 test-utils/global-teardown.js create mode 100644 test-utils/package.json create mode 100644 test.Dockerfile.dockerignore delete mode 100644 test/next-13.test.js delete mode 100644 test/next-14.test.js delete mode 100644 test/next-15.test.js delete mode 100644 test/next-9.test.js diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 600e365..0000000 --- a/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -**/node_modules \ No newline at end of file diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index df045a1..ab735d5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,4 +1,4 @@ -name: Test +name: Test Next.js v14 on: push: @@ -22,6 +22,9 @@ jobs: - name: Install dependencies run: npm ci + - name: Install HarperDB + run: npm i -g harperdb@4.4.8 + - name: Install Playwright Browsers run: npx playwright install --with-deps diff --git a/fixtures/harperdb-base-component/resources.js b/fixtures/harperdb-base-component/resources.js index 48bbe97..6da8cf3 100644 --- a/fixtures/harperdb-base-component/resources.js +++ b/fixtures/harperdb-base-component/resources.js @@ -3,16 +3,9 @@ const dogs = [ { id: '1', name: 'Max', breed: 'Cocker Spaniel' }, { id: '2', name: 'Bella', breed: 'Lab' }, { id: '3', name: 'Charlie', breed: 'Great Dane' }, - { id: '4', name: 'Lucy', breed: 'Newfoundland' }, - { id: '5', name: 'Cooper', breed: 'Pug' }, - { id: '6', name: 'Daisy', breed: 'Bull Dog' }, - { id: '7', name: 'Rocky', breed: 'Akita' }, - { id: '8', name: 'Luna', breed: 'Wolf' }, - { id: '9', name: 'Buddy', breed: 'Border Collie' }, - { id: '10', name: 'Bailey', breed: 'Golden Retriever' }, - { id: '11', name: 'Sadie', breed: 'Belgian Malinois' }, + { id: '4', name: 'Lucy', breed: 'Newfoundland' } ]; -console.log('testing'); + for (const dog of dogs) { - await tables.Dog.put(dog); + tables.Dog.put(dog); } diff --git a/fixtures/next-14/.dockerignore b/fixtures/next-14/.dockerignore deleted file mode 100644 index 42b9c8a..0000000 --- a/fixtures/next-14/.dockerignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -.next -test-results \ No newline at end of file diff --git a/fixtures/next-14/config.yaml b/fixtures/next-14/config.yaml index 7fc576d..c0f2cb6 100644 --- a/fixtures/next-14/config.yaml +++ b/fixtures/next-14/config.yaml @@ -1,8 +1,3 @@ -rest: true -graphqlSchema: - files: './schema.graphql' -jsResource: - files: './resources.mjs' '@harperdb/nextjs': package: '@harperdb/nextjs' files: '/*' diff --git a/fixtures/next-14/middleware.js b/fixtures/next-14/middleware.js new file mode 100644 index 0000000..c59687b --- /dev/null +++ b/fixtures/next-14/middleware.js @@ -0,0 +1,9 @@ +import { NextResponse, NextRequest } from 'next/server'; + +export function middleware(request) { + return new NextResponse('Hello from middleware', { headers: { 'x-middleware': 'true' } }); +} + +export const config = { + matcher: '/test-middleware' +} \ No newline at end of file diff --git a/fixtures/next-14/package.json b/fixtures/next-14/package.json index 16da2c4..01a9219 100644 --- a/fixtures/next-14/package.json +++ b/fixtures/next-14/package.json @@ -6,17 +6,17 @@ "build": "next build", "start": "next start", "lint": "next lint", - "postinstall": "npm link @harperdb/nextjs", + "postinstall": "npm link harperdb", "test": "playwright test" }, "dependencies": { - "@harperdb/nextjs": "*", - "harperdb": "^4.4.8", + "@harperdb/nextjs": "file:../../", "next": "^14", "react": "^18", "react-dom": "^18" }, "devDependencies": { - "@playwright/test": "^1.49.0" + "@playwright/test": "^1.49.0", + "test-utils": "file:../../test-utils/" } } diff --git a/fixtures/next-14/playwright.config.js b/fixtures/next-14/playwright.config.js index c77e733..6cb5312 100644 --- a/fixtures/next-14/playwright.config.js +++ b/fixtures/next-14/playwright.config.js @@ -1,15 +1,18 @@ const { defineConfig, devices } = require('@playwright/test'); -const { join } = require('node:path'); module.exports = defineConfig({ - testDir: 'test', fullyParallel: true, forbidOnly: !!process.env.CI, + retries: 2, + expect: { + timeout: 30000, + }, projects: [ { - use: { ...devices['Desktop Chrome'] }, + name: 'chromium', + use: { ...devices['Desktop Chrome'], channel: 'chromium' }, } ], - globalSetup: join(__dirname, './util/global-setup.js'), - globalTeardown: join(__dirname, './util/global-teardown.js'), + globalSetup: require.resolve('test-utils/global-setup.js'), + globalTeardown: require.resolve('test-utils/global-teardown.js'), }); diff --git a/fixtures/next-14/resources.mjs b/fixtures/next-14/resources.mjs deleted file mode 100644 index 00c3b7a..0000000 --- a/fixtures/next-14/resources.mjs +++ /dev/null @@ -1,11 +0,0 @@ -const dogs = [ - { id: '0', name: 'Lincoln', breed: 'Shepherd' }, - { id: '1', name: 'Max', breed: 'Cocker Spaniel' }, - { id: '2', name: 'Bella', breed: 'Lab' }, - { id: '3', name: 'Charlie', breed: 'Great Dane' }, - { id: '4', name: 'Lucy', breed: 'Newfoundland' }, -]; - -for (const dog of dogs) { - await tables.Dog.put(dog); -} diff --git a/fixtures/next-14/schema.graphql b/fixtures/next-14/schema.graphql deleted file mode 100644 index d92a5be..0000000 --- a/fixtures/next-14/schema.graphql +++ /dev/null @@ -1,5 +0,0 @@ -type Dog @table @export { - id: ID @primaryKey - name: String - breed: String -} diff --git a/fixtures/next-14/test/next-14.test.js b/fixtures/next-14/test/index.test.js similarity index 92% rename from fixtures/next-14/test/next-14.test.js rename to fixtures/next-14/test/index.test.js index 8e438e0..6f25557 100644 --- a/fixtures/next-14/test/next-14.test.js +++ b/fixtures/next-14/test/index.test.js @@ -1,6 +1,5 @@ import { test, expect } from '@playwright/test'; -// test.describe.configure({ mode: 'serial' }); const baseURL = 'http://localhost:9926'; test('home page', async ({ page }) => { @@ -95,3 +94,10 @@ test.describe('caching', () => { expect(when1).not.toBe(when2); }); }); + +test('middleware', async ({ page }) => { + const response = await fetch(`${baseURL}/test-middleware`); + expect(response.headers.get('x-middleware')).toBe('true'); + const text = await response.text(); + expect(text).toBe('Hello from middleware'); +}); \ No newline at end of file diff --git a/fixtures/next-9/playwright.config.js b/fixtures/next-9/playwright.config.js new file mode 100644 index 0000000..c77e733 --- /dev/null +++ b/fixtures/next-9/playwright.config.js @@ -0,0 +1,15 @@ +const { defineConfig, devices } = require('@playwright/test'); +const { join } = require('node:path'); + +module.exports = defineConfig({ + testDir: 'test', + fullyParallel: true, + forbidOnly: !!process.env.CI, + projects: [ + { + use: { ...devices['Desktop Chrome'] }, + } + ], + globalSetup: join(__dirname, './util/global-setup.js'), + globalTeardown: join(__dirname, './util/global-teardown.js'), +}); diff --git a/fixtures/next-9/test/next-9.test.js b/fixtures/next-9/test/next-9.test.js new file mode 100644 index 0000000..c45f950 --- /dev/null +++ b/fixtures/next-9/test/next-9.test.js @@ -0,0 +1,19 @@ +import { test, expect } from '@playwright/test'; + +const baseURL = 'http://localhost:9926'; + +test('home page', async ({ page }) => { + await page.goto(baseURL); + await expect(page.locator('h1')).toHaveText('Next.js v9'); +}); + +test('title', async ({ page }) => { + await page.goto(baseURL); + await expect(page).toHaveTitle('HarperDB - Next.js v9 App'); +}); + +test('page 2', async ({ page }) => { + await page.goto(baseURL); + await page.locator('a').click(); + await expect(page.locator('h1')).toHaveText('Page 2'); +}); diff --git a/fixtures/next-14/util/global-setup.js b/fixtures/next-9/util/global-setup.js similarity index 84% rename from fixtures/next-14/util/global-setup.js rename to fixtures/next-9/util/global-setup.js index 2fd21bd..0cf174e 100644 --- a/fixtures/next-14/util/global-setup.js +++ b/fixtures/next-9/util/global-setup.js @@ -11,8 +11,7 @@ module.exports = function globalSetup(config) { harperdbProcess.stdout.pipe(new Transform({ transform(chunk, encoding, callback) { - const data = chunk.toString(); - if (/HarperDB \d+.\d+.\d+ successfully started/.test(data)) { + if (/HarperDB \d+.\d+.\d+ successfully started/.test(chunk.toString())) { resolve(); } callback(null, chunk); diff --git a/fixtures/next-14/util/global-teardown.js b/fixtures/next-9/util/global-teardown.js similarity index 100% rename from fixtures/next-14/util/global-teardown.js rename to fixtures/next-9/util/global-teardown.js diff --git a/playwright.config.js b/playwright.config.js deleted file mode 100644 index ad3f50e..0000000 --- a/playwright.config.js +++ /dev/null @@ -1,20 +0,0 @@ -import { defineConfig, devices } from '@playwright/test'; -import { VERSION_MATRIX } from './util/constants-and-names'; - -export default defineConfig({ - testDir: 'test', - fullyParallel: true, - forbidOnly: !!process.env.CI, - workers: 3, - retries: 2, - expect: { - timeout: 30000, - }, - projects: [ - ...VERSION_MATRIX.map(([nextMajor, nodeMajor]) => ({ - name: `Next.js v${nextMajor} - Node.js v${nodeMajor}`, - use: { versions: { nextMajor, nodeMajor }, ...devices['Desktop Chrome'] }, - testMatch: [`test/next-${nextMajor}.test.js`], - })), - ], -}); diff --git a/test-utils/global-setup.js b/test-utils/global-setup.js new file mode 100644 index 0000000..0bb13b3 --- /dev/null +++ b/test-utils/global-setup.js @@ -0,0 +1,53 @@ +const { spawn, execSync, exec } = require('node:child_process'); +const { Transform } = require('node:stream'); +const { join } = require('node:path'); +const { symlinkSync } = require('node:fs'); +const { setTimeout } = require('node:timers/promises'); + +const ROOT = join(__dirname, '..'); + +function getComponents() { + const componentsString = execSync(`npx harperdb get_components json=true`, { encoding: 'utf-8' }); + return JSON.parse(componentsString); +} + +function getConfiguration() { + const configurationString = execSync(`npx harperdb get_configuration json=true`, { encoding: 'utf-8' }); + return JSON.parse(configurationString); +} + +module.exports = async function globalSetup(config) { + execSync('npx harperdb start', { stdio: 'inherit' }); + await setTimeout(2000); + + const components = getComponents(); + if (!components.entries.some(({ name }) => name === 'harperdb-base-component')) { + const configuration = getConfiguration(); + const componentsRoot = configuration.componentsRoot; + + symlinkSync(join(ROOT, 'fixtures', 'harperdb-base-component'), join(componentsRoot, 'harperdb-base-component')); + + execSync(`npx harperdb restart`); + + await setTimeout(5000); + } + + execSync('npx harperdb stop', { stdio: 'inherit' }); + + await new Promise((resolve, reject) => { + console.log('npx harperdb run', config.rootDir); + const harperdbProcess = spawn('npx', ['harperdb', 'run', config.rootDir]); + + harperdbProcess.on('error', reject); + harperdbProcess.on('exit', resolve); + + harperdbProcess.stdout.pipe(new Transform({ + transform(chunk, encoding, callback) { + if (/HarperDB \d+.\d+.\d+ successfully started/.test(chunk.toString())) { + resolve(); + } + callback(null, chunk); + } + })).pipe(process.stdout); + }); +} \ No newline at end of file diff --git a/test-utils/global-teardown.js b/test-utils/global-teardown.js new file mode 100644 index 0000000..06094d5 --- /dev/null +++ b/test-utils/global-teardown.js @@ -0,0 +1,9 @@ +const { spawn } = require('node:child_process'); + +module.exports = function globalTeardown(config) { + return new Promise((resolve, reject) => { + const harperdbProcess = spawn('npx', ['harperdb', 'stop']); + harperdbProcess.on('error', reject); + harperdbProcess.on('exit', resolve); + }); +} \ No newline at end of file diff --git a/test-utils/package.json b/test-utils/package.json new file mode 100644 index 0000000..28955bb --- /dev/null +++ b/test-utils/package.json @@ -0,0 +1,8 @@ +{ + "name": "test-utils", + "private": true, + "files": [ + "global-setup.js", + "global-teardown.js" + ] +} \ No newline at end of file diff --git a/test.Dockerfile b/test.Dockerfile index 80574aa..a9ae239 100644 --- a/test.Dockerfile +++ b/test.Dockerfile @@ -1,10 +1,8 @@ ARG NODE_VERSION=22 -FROM docker.io/node:${NODE_VERSION}-slim +FROM docker.io/node:${NODE_VERSION}-slim as base EXPOSE 9925 9926 -RUN npx -y playwright install --with-deps - # Install HarperDB Globally RUN npm install -g harperdb@4.4.8 @@ -20,10 +18,18 @@ ENV LOGGING_STDSTREAMS=true ENV LOGGING_LEVEL=debug ENV AUTHENTICATION_AUTHORIZELOCAL=false +RUN harperdb start && sleep 5 + +COPY /fixtures/harperdb-base-component/ /hdb/components/harperdb-base-component/ + +RUN harperdb start && sleep 5 + +COPY /test-utils/ /test-utils/ + # Create the @harperdb/nextjs module directory so it can be linked locally -RUN mkdir -p /@harperdb/nextjs +RUN mkdir -p /@harperdb/nextjs/ COPY config.yaml extension.js cli.js package.json /@harperdb/nextjs/ -WORKDIR /@harperdb/nextjs +WORKDIR /@harperdb/nextjs/ # Install dependencies for the @harperdb/nextjs module RUN npm install --omit=dev # Create link to the @harperdb/nextjs module @@ -31,9 +37,12 @@ RUN npm link WORKDIR / +FROM base as test + ARG FIXTURE -COPY /fixtures/${FIXTURE} /fixture -WORKDIR /fixture +COPY /fixtures/${FIXTURE}/ /fixtures/${FIXTURE}/ +WORKDIR /fixtures/${FIXTURE}/ RUN npm install +RUN npx -y playwright install chromium --with-deps CMD npm run test \ No newline at end of file diff --git a/test.Dockerfile.dockerignore b/test.Dockerfile.dockerignore new file mode 100644 index 0000000..5b5e1ee --- /dev/null +++ b/test.Dockerfile.dockerignore @@ -0,0 +1,3 @@ +**/.next +**/test-results +**/node_modules \ No newline at end of file diff --git a/test/next-13.test.js b/test/next-13.test.js deleted file mode 100644 index ba46df8..0000000 --- a/test/next-13.test.js +++ /dev/null @@ -1,13 +0,0 @@ -import { test, expect } from '../util/test-fixture.js'; - -test.describe.configure({ mode: 'serial' }); - -test('home page', async ({ nextApp, page }) => { - await page.goto(nextApp.rest.toString()); - await expect(page.locator('h1')).toHaveText('Next.js v13'); -}); - -test('title', async ({ nextApp, page }) => { - await page.goto(nextApp.rest.toString()); - await expect(page).toHaveTitle('HarperDB - Next.js v13 App'); -}); diff --git a/test/next-14.test.js b/test/next-14.test.js deleted file mode 100644 index fcb4933..0000000 --- a/test/next-14.test.js +++ /dev/null @@ -1,73 +0,0 @@ -import { test, expect } from '../util/test-fixture.js'; - -test.describe.configure({ mode: 'serial' }); - -test('home page', async ({ nextApp, page }) => { - await page.goto(nextApp.rest.toString()); - await expect(page.locator('h1')).toHaveText('Next.js v14'); -}); - -test('title', async ({ nextApp, page }) => { - await page.goto(nextApp.rest.toString()); - await expect(page).toHaveTitle('HarperDB - Next.js v14 App'); -}); - -test.describe('caching', () => { - test('isr', async ({ nextApp, page }) => { - const url = `${nextApp.rest}/ssg-dogs/0`; - - let response = await page.goto(url); - expect(response.status()).toBe(200); - await expect(page.locator('h1')).toHaveText('Lincoln'); - - let headers = response.headers(); - expect(headers['x-nextjs-cache']).toBe('STALE'); - expect(headers['cache-control']).toBe('s-maxage=10, stale-while-revalidate'); - - response = await page.goto(url); - expect(response.status()).toBe(304); - await expect(page.locator('h1')).toHaveText('Lincoln'); - - headers = response.headers(); - expect(headers['x-nextjs-cache']).toBe('HIT'); - expect(headers['cache-control']).toBe('s-maxage=10, stale-while-revalidate'); - }); - - test('ssg', async ({ nextApp, page }) => { - const url = `${nextApp.rest}/ssg-dogs/0`; - - let response = await page.goto(url); - expect(response.status()).toBe(200); - await expect(page.locator('h1')).toHaveText('Lincoln'); - - let headers = response.headers(); - expect(headers['x-nextjs-cache']).toBe('HIT'); - expect(headers['cache-control']).toBe('s-maxage=31536000, stale-while-revalidate'); - - response = await page.goto(url); - expect(response.status()).toBe(304); - await expect(page.locator('h1')).toHaveText('Lincoln'); - - headers = response.headers(); - expect(headers['x-nextjs-cache']).toBe('HIT'); - expect(headers['cache-control']).toBe('s-maxage=10, stale-while-revalidate'); - }); - - test('ssr', async ({ nextApp, page }) => { - const url = `${nextApp.rest}/ssr-dogs/0`; - - let response = await page.goto(url); - expect(response.status()).toBe(200); - await expect(page.locator('h1')).toHaveText('Lincoln'); - - let headers = response.headers(); - expect(headers['cache-control']).toBe('private, no-cache, no-store, max-age=0, must-revalidate'); - - response = await page.goto(url); - expect(response.status()).toBe(200); - await expect(page.locator('h1')).toHaveText('Lincoln'); - - headers = response.headers(); - expect(headers['cache-control']).toBe('private, no-cache, no-store, max-age=0, must-revalidate'); - }); -}); diff --git a/test/next-15.test.js b/test/next-15.test.js deleted file mode 100644 index bc985e3..0000000 --- a/test/next-15.test.js +++ /dev/null @@ -1,13 +0,0 @@ -import { test, expect } from '../util/test-fixture.js'; - -test.describe.configure({ mode: 'serial' }); - -test('home page', async ({ nextApp, page }) => { - await page.goto(nextApp.rest.toString()); - await expect(page.locator('h1')).toHaveText('Next.js v15'); -}); - -test('title', async ({ nextApp, page }) => { - await page.goto(nextApp.rest.toString()); - await expect(page).toHaveTitle('HarperDB - Next.js v15 App'); -}); diff --git a/test/next-9.test.js b/test/next-9.test.js deleted file mode 100644 index 34c85cc..0000000 --- a/test/next-9.test.js +++ /dev/null @@ -1,19 +0,0 @@ -import { test, expect } from '../util/test-fixture.js'; - -test.describe.configure({ mode: 'serial' }); - -test('home page', async ({ nextApp, page }) => { - await page.goto(nextApp.rest.toString()); - await expect(page.locator('h1')).toHaveText('Next.js v9'); -}); - -test('title', async ({ nextApp, page }) => { - await page.goto(nextApp.rest.toString()); - await expect(page).toHaveTitle('HarperDB - Next.js v9 App'); -}); - -test('page 2', async ({ nextApp, page }) => { - await page.goto(nextApp.rest.toString()); - await page.locator('a').click(); - await expect(page.locator('h1')).toHaveText('Page 2'); -}); diff --git a/util/docker/base.dockerfile b/util/docker/base.dockerfile index 7104df1..04a3474 100644 --- a/util/docker/base.dockerfile +++ b/util/docker/base.dockerfile @@ -29,11 +29,13 @@ ENV LOGGING_STDSTREAMS=true ENV LOGGING_LEVEL=debug ENV AUTHENTICATION_AUTHORIZELOCAL=false -RUN harperdb start +RUN harperdb start && sleep 5 # Add base component COPY /fixtures/harperdb-base-component /hdb/components/harperdb-base-component +RUN harperdb start && sleep 5 + # Create the @harperdb/nextjs module directory so it can be linked locally RUN mkdir -p /@harperdb/nextjs From 93f326b60912013ad50d8b09242d8ac4a27146b1 Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Wed, 11 Dec 2024 13:27:55 -0700 Subject: [PATCH 4/8] try ci change --- .github/workflows/test.yaml | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index ab735d5..815b39d 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -25,13 +25,32 @@ jobs: - name: Install HarperDB run: npm i -g harperdb@4.4.8 - - name: Install Playwright Browsers - run: npx playwright install --with-deps - - - name: Run tests + - name: Start HarperDB + env: + TC_AGREEMENT: yes + HDB_ADMIN: hdb_admin + HDB_ADMIN_PASSWORD: password + ROOTPATH: /hdb + OPERATIONSAPI_NETWORK_PORT: 9925 + HTTP_PORT: 9926 + THREADS_COUNT: 1 + LOGGING_STDSTREAMS: true + LOGGING_LEVEL: debug + AUTHENTICATION_AUTHORIZELOCAL: false + run: harperdb start && sleep 5 + + - name: Install Next.js v14 Fixture dependencies + working-directory: fixtures/next-14 + run: | + npm install + npx playwright install chromium --with-deps + + - name: Run Next.js v14 Fixture tests + working-directory: fixtures/next-14 run: npm run test - uses: actions/upload-artifact@v4 + working-directory: fixtures/next-14 if: ${{ !cancelled() }} with: name: playwright-report From 7c3ae336f25f47a19221a80bdfb61b3e7329959b Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Wed, 11 Dec 2024 13:30:58 -0700 Subject: [PATCH 5/8] ci ci ci --- .github/workflows/test.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 815b39d..5fda59e 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -40,17 +40,16 @@ jobs: run: harperdb start && sleep 5 - name: Install Next.js v14 Fixture dependencies - working-directory: fixtures/next-14 + working-directory: ./fixtures/next-14 run: | npm install npx playwright install chromium --with-deps - name: Run Next.js v14 Fixture tests - working-directory: fixtures/next-14 + working-directory: ./fixtures/next-14 run: npm run test - uses: actions/upload-artifact@v4 - working-directory: fixtures/next-14 if: ${{ !cancelled() }} with: name: playwright-report From 16685f3d4a20759aea3ded40d63fef35e2fb6d1a Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Wed, 11 Dec 2024 13:36:12 -0700 Subject: [PATCH 6/8] try harperdb install --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 5fda59e..f5a2f01 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -37,7 +37,7 @@ jobs: LOGGING_STDSTREAMS: true LOGGING_LEVEL: debug AUTHENTICATION_AUTHORIZELOCAL: false - run: harperdb start && sleep 5 + run: harperdb install - name: Install Next.js v14 Fixture dependencies working-directory: ./fixtures/next-14 From 12f6690bc1841409aa60e0eaebb16c4417842b5d Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Wed, 11 Dec 2024 14:05:09 -0700 Subject: [PATCH 7/8] lets cut the bs --- .github/workflows/test.yaml | 57 - .node-version | 2 +- fixtures/next-14/.node-version | 1 + fixtures/next-14/.npmrc | 1 - fixtures/next-14/next.config.js | 5 +- fixtures/next-14/package-lock.json | 485 ++ fixtures/next-14/package.json | 2 +- fixtures/next-14/playwright.config.js | 6 +- fixtures/next-9/.node-version | 1 + fixtures/next-9/.npmrc | 1 - fixtures/next-9/check-node-version.js | 7 + fixtures/next-9/package-lock.json | 7244 +++++++++++++++++ fixtures/next-9/package.json | 19 +- fixtures/next-9/playwright.config.js | 11 +- .../test/{next-9.test.js => index.test.js} | 0 fixtures/next-9/util/global-setup.js | 21 - fixtures/next-9/util/global-teardown.js | 9 - package.json | 7 +- test.Dockerfile | 48 - test.Dockerfile.dockerignore | 3 - util/build-fixture.js | 70 - util/collected-transform.js | 14 - util/constants-and-names.js | 41 - util/container-engine.js | 16 - util/docker/base.dockerfile | 57 - util/docker/next.dockerfile | 17 - util/fixture.js | 119 - util/scripts/build-fixture-cli.js | 65 - util/scripts/pretest.js | 12 - util/scripts/run-fixture-locally.js | 54 - util/test-fixture.js | 29 - 31 files changed, 7766 insertions(+), 658 deletions(-) delete mode 100644 .github/workflows/test.yaml create mode 100644 fixtures/next-14/.node-version delete mode 100644 fixtures/next-14/.npmrc create mode 100644 fixtures/next-14/package-lock.json create mode 100644 fixtures/next-9/.node-version delete mode 100644 fixtures/next-9/.npmrc create mode 100644 fixtures/next-9/check-node-version.js create mode 100644 fixtures/next-9/package-lock.json rename fixtures/next-9/test/{next-9.test.js => index.test.js} (100%) delete mode 100644 fixtures/next-9/util/global-setup.js delete mode 100644 fixtures/next-9/util/global-teardown.js delete mode 100644 test.Dockerfile delete mode 100644 test.Dockerfile.dockerignore delete mode 100644 util/build-fixture.js delete mode 100644 util/collected-transform.js delete mode 100644 util/constants-and-names.js delete mode 100644 util/container-engine.js delete mode 100644 util/docker/base.dockerfile delete mode 100644 util/docker/next.dockerfile delete mode 100644 util/fixture.js delete mode 100644 util/scripts/build-fixture-cli.js delete mode 100644 util/scripts/pretest.js delete mode 100644 util/scripts/run-fixture-locally.js delete mode 100644 util/test-fixture.js diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml deleted file mode 100644 index f5a2f01..0000000 --- a/.github/workflows/test.yaml +++ /dev/null @@ -1,57 +0,0 @@ -name: Test Next.js v14 - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '22' - cache: 'npm' - - - name: Install dependencies - run: npm ci - - - name: Install HarperDB - run: npm i -g harperdb@4.4.8 - - - name: Start HarperDB - env: - TC_AGREEMENT: yes - HDB_ADMIN: hdb_admin - HDB_ADMIN_PASSWORD: password - ROOTPATH: /hdb - OPERATIONSAPI_NETWORK_PORT: 9925 - HTTP_PORT: 9926 - THREADS_COUNT: 1 - LOGGING_STDSTREAMS: true - LOGGING_LEVEL: debug - AUTHENTICATION_AUTHORIZELOCAL: false - run: harperdb install - - - name: Install Next.js v14 Fixture dependencies - working-directory: ./fixtures/next-14 - run: | - npm install - npx playwright install chromium --with-deps - - - name: Run Next.js v14 Fixture tests - working-directory: ./fixtures/next-14 - run: npm run test - - - uses: actions/upload-artifact@v4 - if: ${{ !cancelled() }} - with: - name: playwright-report - path: playwright-report/ - retention-days: 30 diff --git a/.node-version b/.node-version index fdb2eaa..d135def 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -22.11.0 \ No newline at end of file +22.12.0 \ No newline at end of file diff --git a/fixtures/next-14/.node-version b/fixtures/next-14/.node-version new file mode 100644 index 0000000..d135def --- /dev/null +++ b/fixtures/next-14/.node-version @@ -0,0 +1 @@ +22.12.0 \ No newline at end of file diff --git a/fixtures/next-14/.npmrc b/fixtures/next-14/.npmrc deleted file mode 100644 index 9cf9495..0000000 --- a/fixtures/next-14/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false \ No newline at end of file diff --git a/fixtures/next-14/next.config.js b/fixtures/next-14/next.config.js index 5e07bfc..1525c5d 100644 --- a/fixtures/next-14/next.config.js +++ b/fixtures/next-14/next.config.js @@ -5,8 +5,5 @@ module.exports = { }); return config; - }, - experimental: { - serverComponentsExternalPackages: ['harperdb'], - }, + } }; diff --git a/fixtures/next-14/package-lock.json b/fixtures/next-14/package-lock.json new file mode 100644 index 0000000..47ab55b --- /dev/null +++ b/fixtures/next-14/package-lock.json @@ -0,0 +1,485 @@ +{ + "name": "next-14", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "next-14", + "hasInstallScript": true, + "dependencies": { + "@harperdb/nextjs": "file:../../", + "next": "^14", + "react": "^18", + "react-dom": "^18" + }, + "devDependencies": { + "@playwright/test": "^1.49.0", + "test-utils": "file:../../test-utils/" + } + }, + "../..": { + "name": "@harperdb/nextjs", + "version": "0.0.13", + "license": "MIT", + "dependencies": { + "shell-quote": "^1.8.1" + }, + "bin": { + "harperdb-nextjs": "cli.js" + }, + "devDependencies": { + "@harperdb/code-guidelines": "^0.0.2", + "prettier": "^3.3.3" + } + }, + "../../../harperdb": { + "version": "4.4.8", + "extraneous": true, + "hasInstallScript": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@aws-sdk/client-s3": "3.635.0", + "@aws-sdk/lib-storage": "3.635.0", + "@endo/static-module-record": "^1.0.4", + "@fastify/autoload": "5.10.0", + "@fastify/compress": "~6.5.0", + "@fastify/cors": "~9.0.1", + "@fastify/static": "~7.0.4", + "@turf/area": "6.5.0", + "@turf/boolean-contains": "6.5.0", + "@turf/boolean-disjoint": "6.5.0", + "@turf/boolean-equal": "6.5.0", + "@turf/circle": "6.5.0", + "@turf/difference": "6.5.0", + "@turf/distance": "6.5.0", + "@turf/helpers": "6.5.0", + "@turf/length": "6.5.0", + "alasql": "4.1.10", + "cbor-x": "1.6.0", + "chalk": "4.1.2", + "cli-progress": "3.12.0", + "clone": "2.1.2", + "fast-glob": "3.3.2", + "fastify": "~4.28.1", + "fastify-plugin": "~4.5.1", + "fs-extra": "11.2.0", + "graphql": "^16.9.0", + "gunzip-maybe": "1.4.2", + "human-readable-ids": "1.0.4", + "inquirer": "8.2.6", + "is-number": "7.0.0", + "joi": "17.12.2", + "json-bigint-fixes": "1.1.0", + "json2csv": "5.0.7", + "jsonata": "1.8.7", + "jsonwebtoken": "9.0.2", + "lmdb": "3.1.5", + "lodash": "4.17.21", + "mathjs": "11.12.0", + "minimist": "1.2.8", + "moment": "2.30.1", + "mqtt-packet": "~9.0.0", + "msgpackr": "1.11.2", + "nats": "2.19.0", + "needle": "3.3.1", + "node-forge": "^1.3.1", + "node-stream-zip": "1.15.0", + "node-unix-socket": "0.2.5", + "normalize-path": "^3.0.0", + "ora": "5.4.1", + "ordered-binary": "1.5.3", + "papaparse": "5.4.1", + "passport": "0.6.0", + "passport-http": "0.3.0", + "passport-local": "1.0.0", + "pino": "8.16.0", + "pm2": "5.4.1", + "prompt": "1.3.0", + "properties-reader": "2.3.0", + "recursive-iterator": "3.3.0", + "semver": "7.5.4", + "send": "^1.1.0", + "serve-static": "2.1.0", + "ses": "1.1.0", + "stream-chain": "2.2.5", + "stream-json": "1.8.0", + "systeminformation": "5.23.5", + "tar-fs": "3.0.6", + "ulidx": "0.5.0", + "uuid": "10.0.0", + "validate.js": "0.13.1", + "ws": "8.18.0", + "yaml": "2.5.0" + }, + "bin": { + "harperdb": "bin/harperdb.js" + }, + "devDependencies": { + "@tsconfig/node16": "^1.0.3", + "@types/node": "20.14.8", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "axios": "1.7.5", + "chai": "4.4.1", + "chai-integer": "0.1.0", + "esbuild": "^0.20.2", + "eslint": "^8.57.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-sonarjs": "^2.0.2", + "eventsource": "^2.0.2", + "graphql-http": "^1.22.1", + "hook-std": "3.0.0", + "intercept-stdout": "0.1.2", + "mkcert": "1.5.1", + "mocha": "^10.3.0", + "mocha-teamcity-reporter": "3.0.0", + "mock-require": "3.0.3", + "mock-stdin": "1.0.0", + "mqtt": "~4.3.8", + "newman": "6.1.3", + "node-fetch": "2.6.7", + "nyc": "15.1.0", + "prettier": "3.3.3", + "rewire": "5.0.0", + "rimraf": "3.0.2", + "sinon": "10.0.0", + "sinon-chai": "3.7.0", + "source-map-support": "^0.5.21", + "typescript": "^5.4.2", + "undici": "^6.19.8", + "why-is-node-still-running": "^1.0.0" + }, + "engines": { + "go-lang": "1.21.7", + "minimum-node": "16.0.0", + "nats-server": "2.10.11" + }, + "optionalDependencies": { + "bufferutil": "^4.0.7", + "segfault-handler": "^1.3.0", + "utf-8-validate": "^5.0.10" + } + }, + "../../node_modules/@harperdb/code-guidelines": { + "version": "0.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier": "3.3.3" + } + }, + "../../node_modules/prettier": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "../../node_modules/shell-quote": { + "version": "1.8.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../test-utils": { + "dev": true + }, + "node_modules/@harperdb/nextjs": { + "resolved": "../..", + "link": true + }, + "node_modules/@next/env": { + "version": "14.2.20", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.20", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@playwright/test": { + "version": "1.49.1", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.49.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "14.2.20", + "license": "MIT", + "dependencies": { + "@next/env": "14.2.20", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.20", + "@next/swc-darwin-x64": "14.2.20", + "@next/swc-linux-arm64-gnu": "14.2.20", + "@next/swc-linux-arm64-musl": "14.2.20", + "@next/swc-linux-x64-gnu": "14.2.20", + "@next/swc-linux-x64-musl": "14.2.20", + "@next/swc-win32-arm64-msvc": "14.2.20", + "@next/swc-win32-ia32-msvc": "14.2.20", + "@next/swc-win32-x64-msvc": "14.2.20" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/playwright": { + "version": "1.49.1", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.49.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.49.1", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/test-utils": { + "resolved": "../../test-utils", + "link": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + } + } +} diff --git a/fixtures/next-14/package.json b/fixtures/next-14/package.json index 01a9219..45c5d64 100644 --- a/fixtures/next-14/package.json +++ b/fixtures/next-14/package.json @@ -6,7 +6,7 @@ "build": "next build", "start": "next start", "lint": "next lint", - "postinstall": "npm link harperdb", + "postinstall": "npm link harperdb && npx playwright install chromium", "test": "playwright test" }, "dependencies": { diff --git a/fixtures/next-14/playwright.config.js b/fixtures/next-14/playwright.config.js index 6cb5312..6b14e33 100644 --- a/fixtures/next-14/playwright.config.js +++ b/fixtures/next-14/playwright.config.js @@ -10,9 +10,9 @@ module.exports = defineConfig({ projects: [ { name: 'chromium', - use: { ...devices['Desktop Chrome'], channel: 'chromium' }, + use: { ...devices['Desktop Chrome'] }, } ], - globalSetup: require.resolve('test-utils/global-setup.js'), - globalTeardown: require.resolve('test-utils/global-teardown.js'), + globalSetup: require.resolve('./global-setup.js'), + globalTeardown: require.resolve('./global-teardown.js'), }); diff --git a/fixtures/next-9/.node-version b/fixtures/next-9/.node-version new file mode 100644 index 0000000..1b497a7 --- /dev/null +++ b/fixtures/next-9/.node-version @@ -0,0 +1 @@ +16.20.2 \ No newline at end of file diff --git a/fixtures/next-9/.npmrc b/fixtures/next-9/.npmrc deleted file mode 100644 index 9cf9495..0000000 --- a/fixtures/next-9/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false \ No newline at end of file diff --git a/fixtures/next-9/check-node-version.js b/fixtures/next-9/check-node-version.js new file mode 100644 index 0000000..dbc0201 --- /dev/null +++ b/fixtures/next-9/check-node-version.js @@ -0,0 +1,7 @@ +const required = "16"; +const current = process.version.slice(1).split('.')[0]; + +if (current !== required) { + console.error(`Error: Node version ${required} is required, but you're running version ${current}`); + process.exit(1); +} \ No newline at end of file diff --git a/fixtures/next-9/package-lock.json b/fixtures/next-9/package-lock.json new file mode 100644 index 0000000..170778b --- /dev/null +++ b/fixtures/next-9/package-lock.json @@ -0,0 +1,7244 @@ +{ + "name": "next-9", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "next-9", + "hasInstallScript": true, + "dependencies": { + "@harperdb/nextjs": "file:../../", + "next": "9.5.5", + "react": "16.14.0", + "react-dom": "16.14.0" + }, + "devDependencies": { + "@playwright/test": "1.49.1", + "test-utils": "file:../../test-utils/" + } + }, + "../..": { + "name": "@harperdb/nextjs", + "version": "0.0.13", + "license": "MIT", + "dependencies": { + "shell-quote": "^1.8.1" + }, + "bin": { + "harperdb-nextjs": "cli.js" + }, + "devDependencies": { + "@harperdb/code-guidelines": "^0.0.2", + "prettier": "^3.3.3" + } + }, + "../../node_modules/@harperdb/code-guidelines": { + "version": "0.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier": "3.3.3" + } + }, + "../../node_modules/prettier": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "../../node_modules/shell-quote": { + "version": "1.8.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../test-utils": { + "dev": true + }, + "node_modules/@ampproject/toolbox-core": { + "version": "2.10.1", + "license": "Apache-2.0", + "dependencies": { + "cross-fetch": "3.1.5", + "lru-cache": "6.0.0" + } + }, + "node_modules/@ampproject/toolbox-core/node_modules/cross-fetch": { + "version": "3.1.5", + "license": "MIT", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/@ampproject/toolbox-core/node_modules/node-fetch": { + "version": "2.6.7", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@ampproject/toolbox-optimizer": { + "version": "2.6.0", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@ampproject/toolbox-core": "^2.6.0", + "@ampproject/toolbox-runtime-version": "^2.6.0", + "@ampproject/toolbox-script-csp": "^2.5.4", + "@ampproject/toolbox-validator-rules": "^2.5.4", + "abort-controller": "3.0.0", + "cross-fetch": "3.0.5", + "cssnano-simple": "1.0.5", + "dom-serializer": "1.0.1", + "domhandler": "3.0.0", + "domutils": "2.1.0", + "htmlparser2": "4.1.0", + "https-proxy-agent": "5.0.0", + "lru-cache": "6.0.0", + "node-fetch": "2.6.0", + "normalize-html-whitespace": "1.0.0", + "postcss": "7.0.32", + "postcss-safe-parser": "4.0.2", + "terser": "4.8.0" + }, + "peerDependenciesMeta": { + "jimp": { + "optional": true + }, + "probe-image-size": { + "optional": true + } + } + }, + "node_modules/@ampproject/toolbox-optimizer/node_modules/cssnano-preset-simple": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "postcss": "^7.0.32" + } + }, + "node_modules/@ampproject/toolbox-optimizer/node_modules/cssnano-simple": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "cssnano-preset-simple": "1.1.4", + "postcss": "^7.0.32" + } + }, + "node_modules/@ampproject/toolbox-runtime-version": { + "version": "2.10.1", + "license": "Apache-2.0", + "dependencies": { + "@ampproject/toolbox-core": "2.10.0" + } + }, + "node_modules/@ampproject/toolbox-runtime-version/node_modules/@ampproject/toolbox-core": { + "version": "2.10.0", + "license": "Apache-2.0", + "dependencies": { + "cross-fetch": "3.1.5", + "lru-cache": "6.0.0" + } + }, + "node_modules/@ampproject/toolbox-runtime-version/node_modules/cross-fetch": { + "version": "3.1.5", + "license": "MIT", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/@ampproject/toolbox-runtime-version/node_modules/node-fetch": { + "version": "2.6.7", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@ampproject/toolbox-script-csp": { + "version": "2.10.1", + "license": "Apache-2.0" + }, + "node_modules/@ampproject/toolbox-validator-rules": { + "version": "2.10.1", + "license": "Apache-2.0", + "dependencies": { + "cross-fetch": "3.1.5" + } + }, + "node_modules/@ampproject/toolbox-validator-rules/node_modules/cross-fetch": { + "version": "3.1.5", + "license": "MIT", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/@ampproject/toolbox-validator-rules/node_modules/node-fetch": { + "version": "2.6.7", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.3", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.7.7", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.7", + "@babel/helpers": "^7.7.4", + "@babel/parser": "^7.7.7", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { + "version": "4.24.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/node-releases": { + "version": "2.0.18", + "license": "MIT" + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/update-browserslist-db": { + "version": "1.1.1", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/parser/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.11.5", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.11.5", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.5", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.10.4", + "@babel/plugin-transform-react-jsx": "^7.10.4", + "@babel/plugin-transform-react-jsx-development": "^7.10.4", + "@babel/plugin-transform-react-jsx-self": "^7.10.4", + "@babel/plugin-transform-react-jsx-source": "^7.10.4", + "@babel/plugin-transform-react-pure-annotations": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.11.2", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.26.2", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.4", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.26.2", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.26.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.11.5", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@hapi/accept": { + "version": "5.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/boom": "9.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/boom": { + "version": "9.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/@harperdb/nextjs": { + "resolved": "../..", + "link": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "9.5.5", + "license": "MIT" + }, + "node_modules/@next/polyfill-module": { + "version": "9.5.5", + "license": "MIT" + }, + "node_modules/@next/react-dev-overlay": { + "version": "9.5.5", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.10.4", + "ally.js": "1.4.1", + "anser": "1.4.9", + "chalk": "4.0.0", + "classnames": "2.2.6", + "data-uri-to-buffer": "3.0.0", + "shell-quote": "1.7.2", + "source-map": "0.8.0-beta.0", + "stacktrace-parser": "0.1.10", + "strip-ansi": "6.0.0" + }, + "peerDependencies": { + "react": "^16.9.0", + "react-dom": "^16.9.0", + "webpack": "^4 || ^5" + } + }, + "node_modules/@next/react-dev-overlay/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@next/react-dev-overlay/node_modules/chalk": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@next/react-dev-overlay/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@next/react-dev-overlay/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/@next/react-dev-overlay/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@next/react-dev-overlay/node_modules/shell-quote": { + "version": "1.7.2", + "license": "MIT" + }, + "node_modules/@next/react-dev-overlay/node_modules/source-map": { + "version": "0.8.0-beta.0", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@next/react-dev-overlay/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@next/react-dev-overlay/node_modules/tr46": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/@next/react-dev-overlay/node_modules/webidl-conversions": { + "version": "4.0.2", + "license": "BSD-2-Clause" + }, + "node_modules/@next/react-dev-overlay/node_modules/whatwg-url": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/@next/react-refresh-utils": { + "version": "9.5.5", + "license": "MIT", + "peerDependencies": { + "react-refresh": "0.8.3", + "webpack": "^4 || ^5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@playwright/test": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", + "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.49.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "license": "ISC" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "assert": "1.4.1", + "camelcase": "5.0.0", + "loader-utils": "1.2.3", + "object-path": "0.11.4", + "regex-parser": "2.2.10" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/camelcase": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/emojis-list": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/json5": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "license": "MIT", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ally.js": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "css.escape": "^1.5.0", + "platform": "1.3.3" + } + }, + "node_modules/anser": { + "version": "1.4.9", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/arity-n": { + "version": "1.0.4", + "license": "MIT" + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.1", + "license": "MIT" + }, + "node_modules/assert": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "util": "0.10.3" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.13.2", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/atob": { + "version": "2.1.2", + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "license": "MIT" + }, + "node_modules/babel-plugin-transform-define": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.11", + "traverse": "0.6.6" + }, + "engines": { + "node": ">= 8.x.x" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "license": "MIT", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "license": "MIT", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "license": "ISC", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.13.0", + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001093", + "electron-to-chromium": "^1.3.488", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + }, + "node_modules/buffer": { + "version": "5.6.0", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/cacache": { + "version": "15.0.5", + "license": "ISC", + "dependencies": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "license": "MIT", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/classnames": { + "version": "2.2.6", + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compose-function": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "arity-n": "^1.0.4" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.39.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/browserslist": { + "version": "4.24.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/core-js-compat/node_modules/node-releases": { + "version": "2.0.18", + "license": "MIT" + }, + "node_modules/core-js-compat/node_modules/update-browserslist-db": { + "version": "1.1.1", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.1", + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "node-fetch": "2.6.0" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-loader": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "license": "MIT" + }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano-preset-simple": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001093", + "postcss": "^7.0.32" + } + }, + "node_modules/cssnano-simple": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "cssnano-preset-simple": "1.2.0", + "postcss": "^7.0.32" + } + }, + "node_modules/cyclist": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.2", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.1.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.1", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "3.0.0", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/domutils": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^0.2.1", + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0" + } + }, + "node_modules/domutils/node_modules/dom-serializer": { + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.71", + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.6.1", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.1", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/ext": { + "version": "1.7.0", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "license": "ISC" + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "license": "MIT", + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "1.2.13", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "license": "ISC", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause" + }, + "node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/htmlparser2": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "license": "ISC", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/iferr": { + "version": "0.1.5", + "license": "MIT" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/isobject": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "24.9.0", + "license": "MIT", + "dependencies": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.0.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levenary": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "leven": "^3.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "license": "MIT", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "3.1.10", + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.1", + "license": "MIT" + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mississippi": { + "version": "3.0.0", + "license": "BSD-2-Clause", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.3", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.22.0", + "license": "MIT", + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/native-url": { + "version": "0.3.4", + "license": "Apache-2.0", + "dependencies": { + "querystring": "^0.2.0" + } + }, + "node_modules/neo-async": { + "version": "2.6.1", + "license": "MIT" + }, + "node_modules/next": { + "version": "9.5.5", + "license": "MIT", + "dependencies": { + "@ampproject/toolbox-optimizer": "2.6.0", + "@babel/code-frame": "7.10.4", + "@babel/core": "7.7.7", + "@babel/plugin-proposal-class-properties": "7.10.4", + "@babel/plugin-proposal-export-namespace-from": "7.10.4", + "@babel/plugin-proposal-numeric-separator": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.11.0", + "@babel/plugin-syntax-bigint": "7.8.3", + "@babel/plugin-syntax-dynamic-import": "7.8.3", + "@babel/plugin-syntax-jsx": "7.10.4", + "@babel/plugin-transform-modules-commonjs": "7.10.4", + "@babel/plugin-transform-runtime": "7.11.5", + "@babel/preset-env": "7.11.5", + "@babel/preset-modules": "0.1.4", + "@babel/preset-react": "7.10.4", + "@babel/preset-typescript": "7.10.4", + "@babel/runtime": "7.11.2", + "@babel/types": "7.11.5", + "@hapi/accept": "5.0.1", + "@next/env": "9.5.5", + "@next/polyfill-module": "9.5.5", + "@next/react-dev-overlay": "9.5.5", + "@next/react-refresh-utils": "9.5.5", + "ast-types": "0.13.2", + "babel-plugin-transform-define": "2.0.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24", + "browserslist": "4.13.0", + "buffer": "5.6.0", + "cacache": "15.0.5", + "caniuse-lite": "^1.0.30001113", + "chokidar": "2.1.8", + "crypto-browserify": "3.12.0", + "css-loader": "4.3.0", + "cssnano-simple": "1.2.0", + "find-cache-dir": "3.3.1", + "jest-worker": "24.9.0", + "loader-utils": "2.0.0", + "mkdirp": "0.5.3", + "native-url": "0.3.4", + "neo-async": "2.6.1", + "node-html-parser": "^1.2.19", + "path-browserify": "1.0.1", + "pnp-webpack-plugin": "1.6.4", + "postcss": "7.0.32", + "process": "0.11.10", + "prop-types": "15.7.2", + "react-is": "16.13.1", + "react-refresh": "0.8.3", + "resolve-url-loader": "3.1.1", + "sass-loader": "10.0.2", + "schema-utils": "2.7.1", + "stream-browserify": "3.0.0", + "style-loader": "1.2.1", + "styled-jsx": "3.3.0", + "use-subscription": "1.4.1", + "vm-browserify": "1.1.2", + "watchpack": "2.0.0-beta.13", + "web-vitals": "0.2.4", + "webpack": "4.44.1", + "webpack-sources": "1.4.3" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react": "^16.6.0", + "react-dom": "^16.6.0" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/node-fetch": { + "version": "2.6.0", + "license": "MIT", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-html-parser": { + "version": "1.4.9", + "license": "MIT", + "dependencies": { + "he": "1.2.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/buffer": { + "version": "4.9.2", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/node-libs-browser/node_modules/inherits": { + "version": "2.0.3", + "license": "ISC" + }, + "node_modules/node-libs-browser/node_modules/path-browserify": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/node-libs-browser/node_modules/stream-browserify": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/node-libs-browser/node_modules/util": { + "version": "0.11.1", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/node-releases": { + "version": "1.1.77", + "license": "MIT" + }, + "node_modules/normalize-html-whitespace": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-path": { + "version": "0.11.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "license": "(MIT AND Zlib)" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "license": "ISC", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/platform": { + "version": "1.3.3", + "license": "MIT" + }, + "node_modules/playwright": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", + "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.49.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", + "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.6.4", + "license": "MIT", + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "7.0.32", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "license": "ISC", + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "license": "ISC", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-values": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-safe-parser": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "postcss": "^7.0.26" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss/node_modules/supports-color": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/prop-types": { + "version": "15.7.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.1", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.1", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.1", + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react": { + "version": "16.14.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "16.14.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.14.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.8.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-parser": { + "version": "2.2.10", + "license": "MIT" + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/resolve-url-loader": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "2.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/resolve-url-loader/node_modules/camelcase": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.7.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/resolve-url-loader/node_modules/emojis-list": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url-loader/node_modules/json5": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.21", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/resolve-url-loader/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-url-loader/node_modules/supports-color": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/rework": { + "version": "1.0.1", + "dependencies": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + } + }, + "node_modules/rework-visit": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/rework/node_modules/convert-source-map": { + "version": "0.3.5", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/sass-loader": { + "version": "10.0.2", + "license": "MIT", + "dependencies": { + "klona": "^2.0.3", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/sass-loader/node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "node_modules/sass-loader/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.19.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "license": "MIT", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "license": "MIT", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/split-string": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "license": "MIT", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "license": "MIT", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/string-hash": { + "version": "1.1.3", + "license": "CC0-1.0" + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/style-loader": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/styled-jsx": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@babel/types": "7.8.3", + "babel-plugin-syntax-jsx": "6.18.0", + "convert-source-map": "1.7.0", + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "string-hash": "1.1.3", + "stylis": "3.5.4", + "stylis-rule-sheet": "0.0.10" + }, + "peerDependencies": { + "react": "15.x.x || 16.x.x" + } + }, + "node_modules/styled-jsx/node_modules/@babel/types": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/styled-jsx/node_modules/convert-source-map": { + "version": "1.7.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/styled-jsx/node_modules/emojis-list": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/styled-jsx/node_modules/json5": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/styled-jsx/node_modules/loader-utils": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/styled-jsx/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/styled-jsx/node_modules/source-map": { + "version": "0.7.3", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/stylis": { + "version": "3.5.4", + "license": "MIT" + }, + "node_modules/stylis-rule-sheet": { + "version": "0.0.10", + "license": "MIT", + "peerDependencies": { + "stylis": "^3.5.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.6", + "license": "MIT", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/cacache": { + "version": "12.0.4", + "license": "ISC", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/chownr": { + "version": "1.1.4", + "license": "ISC" + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/make-dir": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ssri": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-utils": { + "resolved": "../../test-utils", + "link": true + }, + "node_modules/through2": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/traverse": { + "version": "0.6.6", + "license": "MIT" + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "license": "MIT" + }, + "node_modules/type": { + "version": "2.7.3", + "license": "ISC" + }, + "node_modules/type-fest": { + "version": "0.7.1", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "license": "ISC", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "license": "MIT" + }, + "node_modules/url": { + "version": "0.11.4", + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/use": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-subscription": { + "version": "1.4.1", + "dependencies": { + "object-assign": "^4.1.1" + }, + "peerDependencies": { + "react": "^16.8.0" + } + }, + "node_modules/util": { + "version": "0.10.3", + "license": "MIT", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.1", + "license": "ISC" + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/watchpack": { + "version": "2.0.0-beta.13", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/web-vitals": { + "version": "0.2.4", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "4.44.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack/node_modules/binary-extensions": { + "version": "2.3.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "optional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack/node_modules/chokidar": { + "version": "3.6.0", + "license": "MIT", + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/webpack/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack/node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/loader-utils": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/webpack/node_modules/watchpack": { + "version": "1.7.5", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "license": "MIT", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + } + } +} diff --git a/fixtures/next-9/package.json b/fixtures/next-9/package.json index c7dfc16..efb7378 100644 --- a/fixtures/next-9/package.json +++ b/fixtures/next-9/package.json @@ -6,12 +6,21 @@ "build": "next build", "start": "next start", "lint": "next lint", - "postinstall": "npm link @harperdb/nextjs" + "postinstall": "npm link harperdb && npx playwright install chromium", + "pretest": "node check-node-version.js", + "test": "playwright test" }, "dependencies": { - "@harperdb/nextjs": "*", - "next": "^9.5.5", - "react": "^16.14.0", - "react-dom": "^16.14.0" + "@harperdb/nextjs": "file:../../", + "next": "9.5.5", + "react": "16.14.0", + "react-dom": "16.14.0" + }, + "devDependencies": { + "@playwright/test": "1.49.1", + "test-utils": "file:../../test-utils/" + }, + "engines": { + "node": "16.x" } } diff --git a/fixtures/next-9/playwright.config.js b/fixtures/next-9/playwright.config.js index c77e733..e8a4be6 100644 --- a/fixtures/next-9/playwright.config.js +++ b/fixtures/next-9/playwright.config.js @@ -1,15 +1,18 @@ const { defineConfig, devices } = require('@playwright/test'); -const { join } = require('node:path'); module.exports = defineConfig({ - testDir: 'test', fullyParallel: true, forbidOnly: !!process.env.CI, + retries: 2, + expect: { + timeout: 30000, + }, projects: [ { + name: 'chromium', use: { ...devices['Desktop Chrome'] }, } ], - globalSetup: join(__dirname, './util/global-setup.js'), - globalTeardown: join(__dirname, './util/global-teardown.js'), + globalSetup: require.resolve('test-utils/global-setup.js'), + globalTeardown: require.resolve('test-utils/global-teardown.js'), }); diff --git a/fixtures/next-9/test/next-9.test.js b/fixtures/next-9/test/index.test.js similarity index 100% rename from fixtures/next-9/test/next-9.test.js rename to fixtures/next-9/test/index.test.js diff --git a/fixtures/next-9/util/global-setup.js b/fixtures/next-9/util/global-setup.js deleted file mode 100644 index 0cf174e..0000000 --- a/fixtures/next-9/util/global-setup.js +++ /dev/null @@ -1,21 +0,0 @@ -const { spawn } = require('node:child_process'); -const { Transform } = require('node:stream'); -const { join } = require('node:path'); - -module.exports = function globalSetup(config) { - return new Promise((resolve, reject) => { - const harperdbProcess = spawn('npx', ['harperdb', 'run', join(__dirname, '..')]); - - harperdbProcess.on('error', reject); - harperdbProcess.on('exit', resolve); - - harperdbProcess.stdout.pipe(new Transform({ - transform(chunk, encoding, callback) { - if (/HarperDB \d+.\d+.\d+ successfully started/.test(chunk.toString())) { - resolve(); - } - callback(null, chunk); - } - })).pipe(process.stdout); - }); -} \ No newline at end of file diff --git a/fixtures/next-9/util/global-teardown.js b/fixtures/next-9/util/global-teardown.js deleted file mode 100644 index 06094d5..0000000 --- a/fixtures/next-9/util/global-teardown.js +++ /dev/null @@ -1,9 +0,0 @@ -const { spawn } = require('node:child_process'); - -module.exports = function globalTeardown(config) { - return new Promise((resolve, reject) => { - const harperdbProcess = spawn('npx', ['harperdb', 'stop']); - harperdbProcess.on('error', reject); - harperdbProcess.on('exit', resolve); - }); -} \ No newline at end of file diff --git a/package.json b/package.json index 18b6e8d..0c01187 100644 --- a/package.json +++ b/package.json @@ -34,18 +34,13 @@ "scripts": { "format": "prettier .", "format:check": "npm run format -- --check", - "format:fix": "npm run format -- --write", - "pretest": "node util/scripts/pretest.js", - "test": "playwright test --workers 3", - "build-fixture": "node util/scripts/build-fixture-cli.js", - "run-fixture-locally": "node util/scripts/run-fixture-locally.js" + "format:fix": "npm run format -- --write" }, "dependencies": { "shell-quote": "^1.8.1" }, "devDependencies": { "@harperdb/code-guidelines": "^0.0.2", - "@playwright/test": "^1.49.0", "prettier": "^3.3.3" }, "prettier": "@harperdb/code-guidelines/prettier" diff --git a/test.Dockerfile b/test.Dockerfile deleted file mode 100644 index a9ae239..0000000 --- a/test.Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -ARG NODE_VERSION=22 -FROM docker.io/node:${NODE_VERSION}-slim as base - -EXPOSE 9925 9926 - -# Install HarperDB Globally -RUN npm install -g harperdb@4.4.8 - -# Set HarperDB Environment Variables -ENV TC_AGREEMENT=yes -ENV HDB_ADMIN_USERNAME=hdb_admin -ENV HDB_ADMIN_PASSWORD=password -ENV ROOTPATH=/hdb -ENV OPERATIONSAPI_NETWORK_PORT=9925 -ENV HTTP_PORT=9926 -ENV THREADS_COUNT=1 -ENV LOGGING_STDSTREAMS=true -ENV LOGGING_LEVEL=debug -ENV AUTHENTICATION_AUTHORIZELOCAL=false - -RUN harperdb start && sleep 5 - -COPY /fixtures/harperdb-base-component/ /hdb/components/harperdb-base-component/ - -RUN harperdb start && sleep 5 - -COPY /test-utils/ /test-utils/ - -# Create the @harperdb/nextjs module directory so it can be linked locally -RUN mkdir -p /@harperdb/nextjs/ -COPY config.yaml extension.js cli.js package.json /@harperdb/nextjs/ -WORKDIR /@harperdb/nextjs/ -# Install dependencies for the @harperdb/nextjs module -RUN npm install --omit=dev -# Create link to the @harperdb/nextjs module -RUN npm link - -WORKDIR / - -FROM base as test - -ARG FIXTURE -COPY /fixtures/${FIXTURE}/ /fixtures/${FIXTURE}/ -WORKDIR /fixtures/${FIXTURE}/ -RUN npm install -RUN npx -y playwright install chromium --with-deps - -CMD npm run test \ No newline at end of file diff --git a/test.Dockerfile.dockerignore b/test.Dockerfile.dockerignore deleted file mode 100644 index 5b5e1ee..0000000 --- a/test.Dockerfile.dockerignore +++ /dev/null @@ -1,3 +0,0 @@ -**/.next -**/test-results -**/node_modules \ No newline at end of file diff --git a/util/build-fixture.js b/util/build-fixture.js deleted file mode 100644 index 66a12e4..0000000 --- a/util/build-fixture.js +++ /dev/null @@ -1,70 +0,0 @@ -import { spawn } from 'node:child_process'; -import { join } from 'node:path'; -import { DEBUG, ROOT, getNodeBaseImageName, getNextImageName } from './constants-and-names.js'; -import { CONTAINER_ENGINE } from './container-engine.js'; -import { CollectedTransform } from './collected-transform.js'; - -function validateResult(result) { - const success = result.code === 0; - - if (DEBUG || !success) { - console.log(`Image \x1b[94m${result.name}\x1b[0m build process exited with: \x1b[35m${result.code}\x1b[0m\n`); - result.stdout !== '' && console.log('\x1b[32mstdout\x1b[0m:\n' + result.stdout + '\n'); - result.stderr !== '' && console.log('\x1b[31mstderr\x1b[0m:\n' + result.stderr + '\n'); - } - - if (!success) { - process.exit(1); - } -} - -function build(name, args, options = {}) { - return new Promise((resolve, reject) => { - const buildProcess = spawn(CONTAINER_ENGINE, args, { cwd: ROOT, stdio: ['ignore', 'pipe', 'pipe'], ...options }); - - const collectedStdout = buildProcess.stdout.pipe(new CollectedTransform()); - const collectedStderr = buildProcess.stderr.pipe(new CollectedTransform()); - - buildProcess.on('error', reject); - buildProcess.on('close', (code) => - resolve({ - name, - code, - stdout: collectedStdout.output, - stderr: collectedStderr.output, - }) - ); - }); -} - -export function buildNodeImage(nodeMajor, validate = true) { - const buildPromise = build(getNodeBaseImageName(nodeMajor), [ - 'build', - '--build-arg', - `NODE_MAJOR=${nodeMajor}`, - '-t', - getNodeBaseImageName(nodeMajor), - '-f', - join(ROOT, 'util', 'docker', 'base.dockerfile'), - ROOT, - ]); - - return validate ? buildPromise.then(validateResult) : buildPromise; -} - -export function buildNextImage(nextMajor, nodeMajor, validate = true) { - const buildPromise = build(getNextImageName(nextMajor, nodeMajor), [ - 'build', - '--build-arg', - `BASE_IMAGE=${getNodeBaseImageName(nodeMajor)}`, - '--build-arg', - `NEXT_MAJOR=${nextMajor}`, - '-t', - getNextImageName(nextMajor, nodeMajor), - '-f', - join(ROOT, 'util', 'docker', 'next.dockerfile'), - ROOT, - ]); - - return validate ? buildPromise.then(validateResult) : buildPromise; -} diff --git a/util/collected-transform.js b/util/collected-transform.js deleted file mode 100644 index 8027cea..0000000 --- a/util/collected-transform.js +++ /dev/null @@ -1,14 +0,0 @@ -import { Transform } from 'node:stream'; - -export class CollectedTransform extends Transform { - #chunks = []; - - _transform(chunk, _, callback) { - this.#chunks.push(chunk); - callback(null, chunk); - } - - get output() { - return Buffer.concat(this.#chunks).toString(); - } -} diff --git a/util/constants-and-names.js b/util/constants-and-names.js deleted file mode 100644 index c2762c7..0000000 --- a/util/constants-and-names.js +++ /dev/null @@ -1,41 +0,0 @@ -import { join } from 'node:path'; - -export const DEBUG = process.env.DEBUG === '1'; - -export const ROOT = join(import.meta.dirname, '..'); - -export const VERSION_MATRIX = [ - // Next.js v9 - ['9', '16'], - // Next.js v13 - ['13', '18'], - ['13', '20'], - ['13', '22'], - // Next.js v14 - ['14', '18'], - ['14', '20'], - ['14', '22'], - // Next.js v15 - ['15', '18'], - ['15', '20'], - ['15', '22'], -]; - -export const NEXT_MAJORS = new Set(VERSION_MATRIX.map(([nextMajor]) => nextMajor)); -export const NODE_MAJORS = new Set(VERSION_MATRIX.map(([_, nodeMajor]) => nodeMajor)); - -export const PORTS = ['9925', '9926']; - -export const CONTAINER_ENGINE_LIST = ['podman', 'docker']; - -export function getNodeBaseImageName(nodeMajor) { - return `harperdb-nextjs/node-base-${nodeMajor}`; -} - -export function getNextImageName(nextMajor, nodeMajor) { - return `harperdb-nextjs/test-image-next-${nextMajor}-node-${nodeMajor}`; -} - -export function getNextContainerName(nextMajor, nodeMajor) { - return `harperdb-nextjs-test-container-next-${nextMajor}-node-${nodeMajor}`; -} diff --git a/util/container-engine.js b/util/container-engine.js deleted file mode 100644 index 185f5ec..0000000 --- a/util/container-engine.js +++ /dev/null @@ -1,16 +0,0 @@ -import { spawnSync } from 'node:child_process'; - -import { CONTAINER_ENGINE_LIST } from './constants-and-names.js'; - -export function getContainerEngine() { - for (const engine of CONTAINER_ENGINE_LIST) { - const { status } = spawnSync(engine, ['--version'], { stdio: 'ignore' }); - if (status === 0) { - return engine; - } - } - - throw new Error(`No container engine found in ${CONTAINER_ENGINE_LIST.join(', ')}`); -} - -export const CONTAINER_ENGINE = getContainerEngine(); diff --git a/util/docker/base.dockerfile b/util/docker/base.dockerfile deleted file mode 100644 index 04a3474..0000000 --- a/util/docker/base.dockerfile +++ /dev/null @@ -1,57 +0,0 @@ -# Base Dockerfile for HarperDB Next.js Integration Tests fixtures -# Must be run from the root of the repository - -ARG NODE_MAJOR - -FROM docker.io/node:${NODE_MAJOR}-slim - -EXPOSE 9925 9926 - -# Install utilities for the container -RUN apt-get update && apt-get install -y \ - # List of tools to install - # curl \ - # Clean Up - && rm -rf /var/lib/apt/lists/* - -# Install HarperDB Globally -RUN npm install -g harperdb@4.4.8 - -# Set HarperDB Environment Variables -ENV TC_AGREEMENT=yes -ENV HDB_ADMIN_USERNAME=hdb_admin -ENV HDB_ADMIN_PASSWORD=password -ENV ROOTPATH=/hdb -ENV OPERATIONSAPI_NETWORK_PORT=9925 -ENV HTTP_PORT=9926 -ENV THREADS_COUNT=1 -ENV LOGGING_STDSTREAMS=true -ENV LOGGING_LEVEL=debug -ENV AUTHENTICATION_AUTHORIZELOCAL=false - -RUN harperdb start && sleep 5 - -# Add base component -COPY /fixtures/harperdb-base-component /hdb/components/harperdb-base-component - -RUN harperdb start && sleep 5 - -# Create the @harperdb/nextjs module directory so it can be linked locally -RUN mkdir -p /@harperdb/nextjs - -COPY config.yaml extension.js cli.js package.json /@harperdb/nextjs/ - -WORKDIR /@harperdb/nextjs - -# Install dependencies for the @harperdb/nextjs module -RUN npm install --omit=dev - -# Create link to the @harperdb/nextjs module -RUN npm link - -WORKDIR / - -RUN harperdb start - -# By default, run HarperDB when the container starts. This can be overridden by passing a different command to the container, or using a new CMD in a child Dockerfile. -CMD harperdb run \ No newline at end of file diff --git a/util/docker/next.dockerfile b/util/docker/next.dockerfile deleted file mode 100644 index 725256b..0000000 --- a/util/docker/next.dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -# Next.js Specific Dockerfile for HarperDB Next.js Integration Tests fixtures -# Must be run from the root of the repository - -ARG BASE_IMAGE - -FROM ${BASE_IMAGE} - -ARG NEXT_MAJOR - -COPY fixtures/next-${NEXT_MAJOR} /hdb/components/next-${NEXT_MAJOR} - -WORKDIR /hdb/components/next-${NEXT_MAJOR} - -# Fixtures should automatically link the @harperdb/nextjs module via their postinstall script. -RUN npm install - -WORKDIR / diff --git a/util/fixture.js b/util/fixture.js deleted file mode 100644 index a596136..0000000 --- a/util/fixture.js +++ /dev/null @@ -1,119 +0,0 @@ -import { spawn, spawnSync } from 'node:child_process'; -import { Transform } from 'node:stream'; - -import { - getNextImageName, - getNextContainerName, - NEXT_MAJORS, - NODE_MAJORS, - PORTS, - DEBUG, -} from './constants-and-names.js'; -import { CONTAINER_ENGINE } from './container-engine.js'; -import { CollectedTransform } from './collected-transform.js'; - -export class Fixture { - constructor({ autoSetup = true, debug = false, nextMajor, nodeMajor }) { - if (!NEXT_MAJORS.has(nextMajor)) { - throw new Error(`nextMajor must be one of ${NEXT_MAJORS.join(', ')}`); - } - this.nextMajor = nextMajor; - - if (!NODE_MAJORS.has(nodeMajor)) { - throw new Error(`nodeMajor must be one of ${NODE_MAJORS.join(', ')}`); - } - this.nodeMajor = nodeMajor; - - this.debug = debug || DEBUG; - - this.imageName = getNextImageName(nextMajor, nodeMajor); - this.containerName = getNextContainerName(nextMajor, nodeMajor); - - if (autoSetup) { - this.ready = this.clear().then(() => this.run()); - } - } - - get #stdio() { - return ['ignore', this.debug ? 'inherit' : 'ignore', this.debug ? 'inherit' : 'ignore']; - } - - #runCommand(args = [], options = {}) { - return new Promise((resolve, reject) => { - const childProcess = spawn(CONTAINER_ENGINE, args, { - stdio: this.#stdio, - ...options, - }); - - childProcess.on('error', reject); - childProcess.on('exit', resolve); - }); - } - - stop() { - return this.#runCommand(['stop', this.containerName]); - } - - rm() { - return this.#runCommand(['rm', this.containerName]); - } - - clear() { - return new Promise((resolve, reject) => { - const psProcess = spawn(CONTAINER_ENGINE, ['ps', '-aq', '-f', `name=${this.containerName}`]); - - psProcess.on('error', reject); - - const collectedStdout = psProcess.stdout.pipe(new CollectedTransform()); - - if (this.debug) { - collectedStdout.pipe(process.stdout); - psProcess.stderr.pipe(process.stderr); - } - - psProcess.on('exit', (code) => { - if (code === 0 && collectedStdout.output !== '') { - return this.stop() - .then(() => this.rm()) - .then(resolve, reject); - } - return resolve(code); - }); - }); - } - - run() { - return new Promise((resolve, reject) => { - const runProcess = spawn(CONTAINER_ENGINE, ['run', '-P', '--name', this.containerName, this.imageName], { - stdio: ['ignore', 'pipe', this.debug ? 'inherit' : 'ignore'], - }); - - runProcess.on('error', reject); - runProcess.on('exit', resolve); - - const stdout = runProcess.stdout.pipe( - new Transform({ - transform(chunk, encoding, callback) { - if (/HarperDB \d+.\d+.\d+ successfully started/.test(chunk.toString())) { - resolve(); - } - callback(null, chunk); - }, - }) - ); - - if (this.debug) { - stdout.pipe(process.stdout); - } - }); - } - - get portMap() { - const portMap = new Map(); - for (const port of PORTS) { - const { stdout } = spawnSync(CONTAINER_ENGINE, ['port', this.containerName, port]); - portMap.set(port, stdout.toString().trim()); - } - return portMap; - } -} diff --git a/util/scripts/build-fixture-cli.js b/util/scripts/build-fixture-cli.js deleted file mode 100644 index e59733f..0000000 --- a/util/scripts/build-fixture-cli.js +++ /dev/null @@ -1,65 +0,0 @@ -import { parseArgs } from 'node:util'; -import { NEXT_MAJORS, NODE_MAJORS, VERSION_MATRIX } from '../constants-and-names.js'; -import { buildNextImage, buildNodeImage } from '../build-fixture.js'; - -const HELP = `@harperdb/nextjs build fixture CLI - -Usage: - \x1b[36mnpm run build-fixture\x1b[0m \x1b[35m-- --next-major\x1b[0m=\x1b[32m\x1b[0m \x1b[35m--node-major=\x1b[0m\x1b[32m\x1b[0m - \x1b[36mnpm run build-fixture\x1b[0m \x1b[32m\x1b[0m \x1b[32m\x1b[0m - -Example: \x1b[33mnpm run build-fixture 15 20\x1b[0m \x1b[2m# Next.js v15 and Node.js v20\x1b[0m -`; - -const { values, positionals } = parseArgs({ - options: { 'next-major': { type: 'string' }, 'node-major': { type: 'string' }, 'help': { type: 'boolean' } }, - allowPositionals: true, -}); - -if (values.help) { - console.log(HELP); - process.exit(0); -} - -let { 'next-major': nextMajor, 'node-major': nodeMajor } = values; - -if (nextMajor === undefined && nodeMajor === undefined) { - [nextMajor, nodeMajor] = positionals; -} - -if (nextMajor === undefined || nodeMajor === undefined) { - console.error('Error: Incorrect arguments.\n'); - console.log(HELP); - process.exit(1); -} - -if (!NEXT_MAJORS.has(nextMajor)) { - console.error(`Error: Invalid next-major: ${nextMajor}. Supported values: ${Array.from(NEXT_MAJORS).join(', ')}`); - process.exit(1); -} - -if (!NODE_MAJORS.has(nodeMajor)) { - console.error(`Error: Invalid node-major: ${nodeMajor}. Supported values: ${Array.from(NODE_MAJORS).join(', ')}`); - process.exit(1); -} - -if (!VERSION_MATRIX.some(([next, node]) => next === nextMajor && node === nodeMajor)) { - console.error( - `Error: Unsupported combination of next-major and node-major: ${nextMajor} and ${nodeMajor}. Supported combinations: ${VERSION_MATRIX.map(([next, node]) => `(${next}, ${node})`).join(' ')}` - ); - process.exit(1); -} - -console.log(`🏗️ Building images for Next.js v${nextMajor} and Node.js v${nodeMajor}`); - -buildNodeImage(nodeMajor) - .then(() => buildNextImage(nextMajor, nodeMajor)) - .then(() => { - console.log('🏗️ Build completed successfully.'); - process.exit(0); - }) - .catch((error) => { - console.error('🏗️ Error: Build failed.'); - console.error(error); - process.exit(1); - }); diff --git a/util/scripts/pretest.js b/util/scripts/pretest.js deleted file mode 100644 index 235cefc..0000000 --- a/util/scripts/pretest.js +++ /dev/null @@ -1,12 +0,0 @@ -import { VERSION_MATRIX, NODE_MAJORS } from '../constants-and-names.js'; -import { buildNodeImage, buildNextImage } from '../build-fixture.js'; - -// Build Node.js Base Images -for (const nodeMajor of NODE_MAJORS) { - await buildNodeImage(nodeMajor); -} - -// Build Next.js Images -for (const [nextMajor, nodeMajor] of VERSION_MATRIX) { - await buildNextImage(nextMajor, nodeMajor); -} diff --git a/util/scripts/run-fixture-locally.js b/util/scripts/run-fixture-locally.js deleted file mode 100644 index a8d3ac1..0000000 --- a/util/scripts/run-fixture-locally.js +++ /dev/null @@ -1,54 +0,0 @@ -// Arg next fixture path -import { parseArgs } from 'node:util'; -import { execSync } from 'node:child_process'; -import { NEXT_MAJORS, ROOT } from '../constants-and-names.js'; -import { symlink } from 'node:fs/promises'; -import { join } from 'node:path'; - -const HELP = `@harperdb/nextjs run fixture locally CLI - -Note: The Node.js version is determined by the Node.js version on your machine. - -Usage: - \x1b[36mnpm run run-fixture-locally\x1b[0m \x1b[35m-- --next-major\x1b[0m=\x1b[32m\x1b[0m - \x1b[36mnpm run run-fixture-locally\x1b[0m \x1b[32m\x1b[0m - -Example: \x1b[33mnpm run run-fixture-locally 14 /hdb \x1b[0m \x1b[2m# Next.js v14 fixture \`fixtures/next-14\`\x1b[0m -`; - -const { values, positionals } = parseArgs({ - options: { 'next-major': { type: 'string' }, 'help': { type: 'boolean' } }, - allowPositionals: true, -}); - -if (values.help) { - console.log(HELP); - process.exit(0); -} - -const nextMajor = values['next-major'] ?? positionals[0]; - -if (nextMajor === undefined) { - console.error('Error: Incorrect arguments.\n'); - console.log(HELP); - process.exit(1); -} - -if (!NEXT_MAJORS.has(nextMajor)) { - console.error(`Error: Invalid next-major: ${nextMajor}. Supported values: ${Array.from(NEXT_MAJORS).join(', ')}`); - process.exit(1); -} - -// execSync('harperdb start', { stdio: 'inherit' }); -const configurationString = execSync(`harperdb get_configuration json=true`, { encoding: 'utf-8' }); -const configuration = JSON.parse(configurationString); -const componentsRoot = configuration.componentsRoot; - -console.log(`⛓️ Linking fixtures to ${componentsRoot}`); - -const linkResults = await Promise.all([ - symlink(join(ROOT, 'fixtures', 'harperdb-base-component'), join(componentsRoot, 'harperdb-base-component')), - symlink(join(ROOT, 'fixtures', `next-${nextMajor}`), join(componentsRoot, `next-${nextMajor}`)), -]); - -execSync(`harperdb restart`, { stdio: 'inherit' }); diff --git a/util/test-fixture.js b/util/test-fixture.js deleted file mode 100644 index e95765b..0000000 --- a/util/test-fixture.js +++ /dev/null @@ -1,29 +0,0 @@ -import { test as base } from '@playwright/test'; - -import { Fixture } from './fixture'; - -export const test = base.extend({ - versions: [ - { nextMajor: '', nodeMajor: '' }, - { option: true, scope: 'worker' }, - ], - nextApp: [ - async ({ versions: { nextMajor, nodeMajor } }, use) => { - const fixture = new Fixture({ nextMajor, nodeMajor }); - await fixture.ready; - - const rest = fixture.portMap.get('9926'); - - if (!rest) { - throw new Error('Rest port not found'); - } - - await use({ rest: `http://${rest}` }); - - await fixture.clear(); - }, - { scope: 'worker', timeout: 60000 }, - ], -}); - -export { expect } from '@playwright/test'; From 7452670e44b4c843b9577af0d1482d3791075b5b Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Wed, 11 Dec 2024 14:14:03 -0700 Subject: [PATCH 8/8] update contributing docs --- CONTRIBUTING.md | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 94c0398..5ba7530 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,37 +2,20 @@ ## Code Organization -All code should abide by the following organization rules: - -- `fixtures/` is for directories that will be utilized in testing. - - They should be fully executable locally for debugging purposes - - They should be as minimal as possible -- `test/` is for Playwright based test files that are executed by `npm run test` - - Test files should use `import { test, expect } from '../util/test-fixture.js';` so that the correct **Fixture** is managed for the test script - - Test files should execute serially, and relevant to the given Next.js versions -- `util/` is for any non-module source code. This includes scripts (`util/scripts/`), docker configurations (`util/docker/`), or any other utility based code. - - Prime examples include the source code responsible for [_building_](./util/scripts/pretest.js) the **Fixtures**, or the custom Playwright [test fixture](./util/test-fixture.js) - The key source files for the repo are: - `cli.js` - `extension.js` - `config.yaml` -- `schema.graphql` -## Testing +These are what are included in the published module and what HarperDB relies on for the component to work. -Testing for this repo uses containers in order to generate stable, isolated environments containing: +The `fixtures/` directory contains testable examples of using this extension. -- HarperDB -- Node.js -- A HarperDB Base Component (responsible for seeding the database) -- A Next.js application Component (which uses this `@harperdb/nextjs` extension) +The `test-utils/` directory contains some scripts for Playwright that the fixtures use to setup HarperDB for the test run. -To execute tests, run `npm run test` - -The first run may take some time as the pretest script is building 12 separate images (3 Node.js ones, 9 Next.js ones). Note, at the moment this operation is parallelized as building is very expensive and can result in the system running out of resources (and crashing the build processes). Subsequent runs utilize the Docker build step cache and are very fast. +## Testing -After the images are built, [Playwright](https://playwright.dev/) will run the tests. These tests each utilize an image, and will manage a container instance relevant to the given Next.js and Node.js pair. +After many, many hours and a plethora of different attempts, setting up HarperDB and running the fixture Playwright tests was too flaky for automation. Review the repository at this [commit](https://github.com/HarperDB/nextjs/tree/b72c05e29bd5afd4b91425ae709effa05bd3c2fd) for some of the prior art. -The tests are configured with generous timeouts and limited to 3 workers at a time to not cause the system to run out of resources. +Instead, for now, fixtures can be tested by running them locally. Make sure to have HarperDB installed globally on your machine. Generally, to run the tests within a fixture, you only have to run `npm install` and `npm run test` from within the specific fixture directory.