From 5972ab599c304379744bce505f43e63e0116948e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Wed, 16 Aug 2023 10:29:17 +0100 Subject: [PATCH 01/15] feat: simplify `ImportMap` --- node/formats/eszip.ts | 11 +- node/import_map.test.ts | 92 +++++++++++---- node/import_map.ts | 244 ++++++++++++++++++++++------------------ 3 files changed, 212 insertions(+), 135 deletions(-) diff --git a/node/formats/eszip.ts b/node/formats/eszip.ts index 7265da84..b9898df1 100644 --- a/node/formats/eszip.ts +++ b/node/formats/eszip.ts @@ -1,4 +1,5 @@ import { join } from 'path' +import { pathToFileURL } from 'url' import { virtualRoot } from '../../shared/consts.js' import type { WriteStage2Options } from '../../shared/stage2.js' @@ -37,13 +38,19 @@ const bundleESZIP = async ({ const extension = '.eszip' const destPath = join(distDirectory, `${buildID}${extension}`) const { bundler, importMap: bundlerImportMap } = getESZIPPaths() - const importMapData = JSON.stringify(importMap.getContents(basePath, virtualRoot)) + + // Transforming all paths under `basePath` to use the virtual root prefix. + const importMapPrefixes: Record = { + [`${pathToFileURL(basePath)}/`]: virtualRoot, + } + const importMapData = importMap.getContents(importMapPrefixes) + const payload: WriteStage2Options = { basePath, destPath, externals, functions, - importMapData, + importMapData: JSON.stringify(importMapData), } const flags = ['--allow-all', '--no-config', `--import-map=${bundlerImportMap}`] diff --git a/node/import_map.test.ts b/node/import_map.test.ts index 92ae3ce3..298d6aac 100644 --- a/node/import_map.test.ts +++ b/node/import_map.test.ts @@ -4,7 +4,7 @@ import { cwd } from 'process' import { pathToFileURL } from 'url' import tmp from 'tmp-promise' -import { test, expect } from 'vitest' +import { describe, test, expect } from 'vitest' import { ImportMap } from './import_map.js' @@ -48,43 +48,87 @@ test('Resolves relative paths to absolute paths if a base path is not provided', expect(imports['alias:pets']).toBe(`${pathToFileURL(expectedPath).toString()}/`) }) -test('Transforms relative paths so that they become relative to the base path', () => { - const basePath = join(cwd(), 'my-cool-site', 'import-map.json') +describe('Returns the fully resolved import map', () => { const inputFile1 = { - baseURL: pathToFileURL(basePath), + baseURL: new URL('file:///some/full/path/import-map.json'), imports: { - 'alias:pets': './heart/pets/', + specifier1: 'file:///some/full/path/file.js', + specifier2: './file2.js', + specifier3: 'file:///different/full/path/file3.js', + }, + } + const inputFile2 = { + baseURL: new URL('file:///some/cool/path/import-map.json'), + imports: { + 'lib/*': './library/', + }, + scopes: { + 'with/scopes/': { + 'lib/*': 'https://external.netlify/lib/', + foo: './foo-alias', + bar: 'file:///different/full/path/bar.js', + }, }, } - // Without a prefix. - const map1 = new ImportMap([inputFile1]) - const { imports: imports1 } = map1.getContents(cwd()) - - expect(imports1['netlify:edge']).toBe('https://edge.netlify.com/v1/index.ts') - expect(imports1['alias:pets']).toBe('file:///my-cool-site/heart/pets/') - - // With a prefix. - const map2 = new ImportMap([inputFile1]) - const { imports: imports2 } = map2.getContents(cwd(), 'file:///root/') - - expect(imports2['netlify:edge']).toBe('https://edge.netlify.com/v1/index.ts') - expect(imports2['alias:pets']).toBe('file:///root/my-cool-site/heart/pets/') + test('Without prefixes', () => { + const map = new ImportMap([inputFile1, inputFile2]) + const { imports, scopes } = map.getContents() + + expect(imports).toStrictEqual({ + 'lib/*': 'file:///some/cool/path/library/', + specifier3: 'file:///different/full/path/file3.js', + specifier2: 'file:///some/full/path/file2.js', + specifier1: 'file:///some/full/path/file.js', + 'netlify:edge': 'https://edge.netlify.com/v1/index.ts', + }) + + expect(scopes).toStrictEqual({ + 'file:///some/cool/path/with/scopes/': { + 'lib/*': 'https://external.netlify/lib/', + foo: 'file:///some/cool/path/foo-alias', + bar: 'file:///different/full/path/bar.js', + }, + }) + }) + + test('With prefixes', () => { + const map = new ImportMap([inputFile1, inputFile2]) + const { imports, scopes } = map.getContents({ + 'file:///some/': 'file:///root/', + 'file:///different/': 'file:///vendor/', + }) + + expect(imports).toStrictEqual({ + 'lib/*': 'file:///root/cool/path/library/', + specifier3: 'file:///vendor/full/path/file3.js', + specifier2: 'file:///root/full/path/file2.js', + specifier1: 'file:///root/full/path/file.js', + 'netlify:edge': 'https://edge.netlify.com/v1/index.ts', + }) + + expect(scopes).toStrictEqual({ + 'file:///root/cool/path/with/scopes/': { + 'lib/*': 'https://external.netlify/lib/', + foo: 'file:///root/cool/path/foo-alias', + bar: 'file:///vendor/full/path/bar.js', + }, + }) + }) }) test('Throws when an import map uses a relative path to reference a file outside of the base path', () => { - const basePath = join(cwd(), 'my-cool-site') const inputFile1 = { - baseURL: pathToFileURL(join(basePath, 'import_map.json')), + baseURL: new URL('file:///root/project/directory/import-map.json'), imports: { - 'alias:file': '../file.js', + 'alias:file': '../../../file.js', }, } - const map = new ImportMap([inputFile1]) + const map = new ImportMap([inputFile1], 'file:///root') - expect(() => map.getContents(basePath)).toThrowError( - `Import map cannot reference '${join(cwd(), 'file.js')}' as it's outside of the base directory '${basePath}'`, + expect(() => map.getContents()).toThrowError( + `Import map cannot reference '/file.js' as it's outside of the base directory '/root'`, ) }) diff --git a/node/import_map.ts b/node/import_map.ts index 0f1f7caf..d029cce1 100644 --- a/node/import_map.ts +++ b/node/import_map.ts @@ -1,9 +1,9 @@ import { Buffer } from 'buffer' import { promises as fs } from 'fs' -import { dirname, posix, relative, sep } from 'path' +import { dirname, relative } from 'path' import { fileURLToPath, pathToFileURL } from 'url' -import { parse } from '@import-maps/resolve' +import { parse, ParsedImportMap } from '@import-maps/resolve' import { Logger } from './logger.js' import { isFileNotFoundError } from './utils/error.js' @@ -14,7 +14,7 @@ const INTERNAL_IMPORTS = { type Imports = Record -interface ImportMapSource { +export interface ImportMapFile { baseURL: URL imports: Imports scopes?: Record @@ -22,10 +22,16 @@ interface ImportMapSource { // ImportMap can take several import map files and merge them into a final // import map object, also adding the internal imports in the right order. -class ImportMap { - sources: ImportMapSource[] +export class ImportMap { + // The root path which import maps can reference. If an import map attempts + // to reference a file outside this directory, an error will be thrown. + rootPath: string | null - constructor(sources: ImportMapSource[] = []) { + // The different import map files that make up the wider import map. + sources: ImportMapFile[] + + constructor(sources: ImportMapFile[] = [], rootURL: string | null = null) { + this.rootPath = rootURL ? fileURLToPath(rootURL) : null this.sources = [] sources.forEach((file) => { @@ -33,28 +39,62 @@ class ImportMap { }) } - // Transforms an import map by making any relative paths use a different path - // as a base. - static resolve(source: ImportMapSource, basePath?: string, prefix = 'file://') { - const { baseURL, ...importMap } = source - const parsedImportMap = parse(importMap, baseURL) - const { imports = {}, scopes = {} } = parsedImportMap - const resolvedImports = ImportMap.resolveImports(imports, basePath, prefix) - const resolvedScopes: Record = {} + add(source: ImportMapFile) { + this.sources.push(source) + } - Object.keys(scopes).forEach((path) => { - const resolvedPath = ImportMap.resolvePath(new URL(path), basePath, prefix) + async addFile(path: string, logger: Logger) { + const source = await ImportMap.readFile(path, logger) - resolvedScopes[resolvedPath] = ImportMap.resolveImports(scopes[path], basePath, prefix) - }) + if (Object.keys(source.imports).length === 0) { + return + } + + return this.add(source) + } + + async addFiles(paths: (string | undefined)[], logger: Logger) { + for (const path of paths) { + if (path === undefined) { + continue + } + + await this.addFile(path, logger) + } + } - return { ...parsedImportMap, imports: resolvedImports, scopes: resolvedScopes } + // Applies a list of prefixes to an `imports` block, by transforming values + // with the `applyPrefixesToPath` method. + static applyPrefixesToImports(imports: Imports, prefixes: Record): Imports { + return Object.entries(imports).reduce( + (acc, [key, value]) => ({ + ...acc, + [key]: ImportMap.applyPrefixesToPath(value, prefixes), + }), + {}, + ) } - // Takes an imports object and resolves relative specifiers with a given base - // path and URL prefix. - static resolveImports(imports: Record, basePath?: string, prefix?: string) { - const resolvedImports: Record = {} + // Applies a list of prefixes to a given path, returning the replaced path. + // For example, given a `path` of `file:///foo/bar/baz.js` and a `prefixes` + // object with `{"file:///foo/": "file:///hello/"}`, this method will return + // `file:///hello/bar/baz.js`. If no matching prefix is found, the original + // path is returned. + static applyPrefixesToPath(path: string, prefixes: Record) { + for (const prefix in prefixes) { + if (path.startsWith(prefix)) { + return path.replace(prefix, prefixes[prefix]) + } + } + + return path + } + + // Takes an `imports` object and filters out any entries without a URL. Also, + // it checks whether the import map is referencing a path outside `rootPath`, + // if one is set. + filterImports(imports: Record = {}) { + const filteredImports: Record = {} Object.keys(imports).forEach((specifier) => { const url = imports[specifier] @@ -64,79 +104,47 @@ class ImportMap { return } - // If this is a file URL, we might want to transform it to use another - // base path. - if (url.protocol === 'file:') { - resolvedImports[specifier] = ImportMap.resolvePath(url, basePath, prefix) + if (this.rootPath !== null) { + const path = fileURLToPath(url) + const relativePath = relative(this.rootPath, path) - return + if (relativePath.startsWith('..')) { + throw new Error( + `Import map cannot reference '${path}' as it's outside of the base directory '${this.rootPath}'`, + ) + } } - resolvedImports[specifier] = url.toString() + filteredImports[specifier] = url.toString() }) - return resolvedImports - } - - // Takes a URL, turns it into a path relative to the given base, and prepends - // a prefix (such as the virtual root prefix). - static resolvePath(url: URL, basePath?: string, prefix?: string) { - if (basePath === undefined) { - return url.toString() - } - - const path = fileURLToPath(url) - const relativePath = relative(basePath, path) - - if (relativePath.startsWith('..')) { - throw new Error(`Import map cannot reference '${path}' as it's outside of the base directory '${basePath}'`) - } - - // We want to use POSIX paths for the import map regardless of the OS - // we're building in. - let normalizedPath = relativePath.split(sep).join(posix.sep) - - // If the original URL had a trailing slash, ensure the normalized path - // has one too. - if (normalizedPath !== '' && url.pathname.endsWith(posix.sep) && !normalizedPath.endsWith(posix.sep)) { - normalizedPath += posix.sep - } - - const newURL = new URL(normalizedPath, prefix) - - return newURL.toString() - } - - add(source: ImportMapSource) { - this.sources.push(source) + return filteredImports } - async addFile(path: string, logger: Logger) { - const source = await readFile(path, logger) - - if (Object.keys(source.imports).length === 0) { - return + filterScopes(scopes?: ParsedImportMap['scopes']) { + if (scopes === undefined) { + return {} } - return this.add(source) - } + const resolvedScopes: Record = {} - async addFiles(paths: (string | undefined)[], logger: Logger) { - for (const path of paths) { - if (path === undefined) { - continue - } + Object.keys(scopes || {}).forEach((url) => { + resolvedScopes[url] = this.filterImports(scopes[url]) + }) - await this.addFile(path, logger) - } + return resolvedScopes } - getContents(basePath?: string, prefix?: string) { + // Returns the import map as a plain object, with any relative paths resolved + // to full URLs. It takes an optional `prefixes` object that specifies a list + // of prefixes to replace path prefixes (see `applyPrefixesToPath`). Prefixes + // will be applied on both `imports` and `scopes`. + getContents(prefixes: Record = {}) { let imports: Imports = {} let scopes: Record = {} this.sources.forEach((file) => { - const importMap = ImportMap.resolve(file, basePath, prefix) + const importMap = this.resolve(file) imports = { ...imports, ...importMap.imports } scopes = { ...scopes, ...importMap.scopes } @@ -150,12 +158,58 @@ class ImportMap { imports[specifier] = url }) + const transformedImports = ImportMap.applyPrefixesToImports(imports, prefixes) + const transformedScopes = Object.entries(scopes).reduce( + (acc, [key, value]) => ({ + ...acc, + [ImportMap.applyPrefixesToPath(key, prefixes)]: ImportMap.applyPrefixesToImports(value, prefixes), + }), + {}, + ) + + return { + imports: transformedImports, + scopes: transformedScopes, + } + } + + static async readFile(path: string, logger: Logger): Promise { + const baseURL = pathToFileURL(path) + + try { + const data = await fs.readFile(path, 'utf8') + const importMap = JSON.parse(data) + + return { + ...importMap, + baseURL, + } + } catch (error) { + if (isFileNotFoundError(error)) { + logger.system(`Did not find an import map file at '${path}'.`) + } else { + logger.user(`Error while loading import map at '${path}':`, error) + } + } + return { - imports, - scopes, + baseURL, + imports: {}, } } + // Resolves an import map file by transforming all relative paths into full + // URLs. The `baseURL` property of each file is used to resolve all relative + // paths against. + resolve(source: ImportMapFile) { + const { baseURL, ...importMap } = source + const parsedImportMap = parse(importMap, baseURL) + const imports = this.filterImports(parsedImportMap.imports) + const scopes = this.filterScopes(parsedImportMap.scopes) + + return { ...parsedImportMap, imports, scopes } + } + toDataURL() { const data = JSON.stringify(this.getContents()) const encodedImportMap = Buffer.from(data).toString('base64') @@ -173,31 +227,3 @@ class ImportMap { await fs.writeFile(path, JSON.stringify(contents)) } } - -const readFile = async (path: string, logger: Logger): Promise => { - const baseURL = pathToFileURL(path) - - try { - const data = await fs.readFile(path, 'utf8') - const importMap = JSON.parse(data) - - return { - ...importMap, - baseURL, - } - } catch (error) { - if (isFileNotFoundError(error)) { - logger.system(`Did not find an import map file at '${path}'.`) - } else { - logger.user(`Error while loading import map at '${path}':`, error) - } - } - - return { - baseURL, - imports: {}, - } -} - -export { ImportMap, readFile } -export type { ImportMapSource as ImportMapFile } From 71ba635fa8fe8e8197a69582f2c39097a971474c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Wed, 16 Aug 2023 10:37:44 +0100 Subject: [PATCH 02/15] refactor: tweak `filterScopes` --- node/import_map.ts | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/node/import_map.ts b/node/import_map.ts index d029cce1..64756ceb 100644 --- a/node/import_map.ts +++ b/node/import_map.ts @@ -121,18 +121,24 @@ export class ImportMap { return filteredImports } + // Takes a `scopes` object and runs all imports through `filterImports`, + // omitting any scopes for which there are no imports. filterScopes(scopes?: ParsedImportMap['scopes']) { - if (scopes === undefined) { - return {} - } + const filteredScopes: Record = {} - const resolvedScopes: Record = {} + if (scopes !== undefined) { + Object.keys(scopes).forEach((url) => { + const imports = this.filterImports(scopes[url]) - Object.keys(scopes || {}).forEach((url) => { - resolvedScopes[url] = this.filterImports(scopes[url]) - }) + if (Object.keys(imports).length === 0) { + return + } + + filteredScopes[url] = imports + }) + } - return resolvedScopes + return filteredScopes } // Returns the import map as a plain object, with any relative paths resolved From aba81beac09b956155bb24933ed0e2b6151efec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Wed, 16 Aug 2023 10:55:27 +0100 Subject: [PATCH 03/15] chore: fix test --- node/import_map.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/node/import_map.test.ts b/node/import_map.test.ts index 298d6aac..8c3cff9c 100644 --- a/node/import_map.test.ts +++ b/node/import_map.test.ts @@ -119,16 +119,16 @@ describe('Returns the fully resolved import map', () => { test('Throws when an import map uses a relative path to reference a file outside of the base path', () => { const inputFile1 = { - baseURL: new URL('file:///root/project/directory/import-map.json'), + baseURL: pathToFileURL(join(cwd(), 'import-map.json')), imports: { - 'alias:file': '../../../file.js', + 'alias:file': '../file.js', }, } - const map = new ImportMap([inputFile1], 'file:///root') + const map = new ImportMap([inputFile1], pathToFileURL(cwd()).toString()) expect(() => map.getContents()).toThrowError( - `Import map cannot reference '/file.js' as it's outside of the base directory '/root'`, + `Import map cannot reference '${join(cwd(), '..', 'file.js')}' as it's outside of the base directory '${cwd()}'`, ) }) From 2d2fbf13cdbd0ff5a1f9d7d2c48a7f6ce8f1d365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Wed, 16 Aug 2023 13:57:47 +0100 Subject: [PATCH 04/15] feat: add support for npm modules --- .gitignore | 1 + deno/bundle.ts | 4 +- deno/lib/stage2.ts | 25 +- node/bundler.test.ts | 31 +- node/bundler.ts | 62 +- node/feature_flags.ts | 1 + node/formats/eszip.ts | 17 +- node/npm_dependencies.ts | 143 +++ package-lock.json | 988 ++++++++++++++---- package.json | 1 + shared/consts.ts | 2 + shared/stage2.ts | 1 + .../imports_npm_module/functions/func1.ts | 10 +- .../imports_npm_module/functions/lib/util.ts | 3 + .../node_modules/child-1/index.js | 1 + .../node_modules/child-1/package.json | 5 + .../node_modules/child-2/index.js | 3 + .../node_modules/child-2/package.json | 8 + .../node_modules/grandchild-1/index.js | 1 + .../node_modules/grandchild-1/package.json | 5 + .../node_modules/parent-1/index.js | 3 + .../node_modules/parent-1/package.json | 8 + .../node_modules/parent-2/index.js | 4 + .../node_modules/parent-2/package.json | 5 + .../node_modules/parent-3/index.js | 4 + .../node_modules/parent-3/package.json | 8 + test/util.ts | 9 +- 27 files changed, 1099 insertions(+), 254 deletions(-) create mode 100644 node/npm_dependencies.ts create mode 100644 test/fixtures/imports_npm_module/functions/lib/util.ts create mode 100644 test/fixtures/imports_npm_module/node_modules/child-1/index.js create mode 100644 test/fixtures/imports_npm_module/node_modules/child-1/package.json create mode 100644 test/fixtures/imports_npm_module/node_modules/child-2/index.js create mode 100644 test/fixtures/imports_npm_module/node_modules/child-2/package.json create mode 100644 test/fixtures/imports_npm_module/node_modules/grandchild-1/index.js create mode 100644 test/fixtures/imports_npm_module/node_modules/grandchild-1/package.json create mode 100644 test/fixtures/imports_npm_module/node_modules/parent-1/index.js create mode 100644 test/fixtures/imports_npm_module/node_modules/parent-1/package.json create mode 100644 test/fixtures/imports_npm_module/node_modules/parent-2/index.js create mode 100644 test/fixtures/imports_npm_module/node_modules/parent-2/package.json create mode 100644 test/fixtures/imports_npm_module/node_modules/parent-3/index.js create mode 100644 test/fixtures/imports_npm_module/node_modules/parent-3/package.json diff --git a/.gitignore b/.gitignore index c2ac9311..a36d0955 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.swp npm-debug.log node_modules +!test/fixtures/**/node_modules /core .eslintcache .npmrc diff --git a/deno/bundle.ts b/deno/bundle.ts index 530564c3..6df88f90 100644 --- a/deno/bundle.ts +++ b/deno/bundle.ts @@ -1,6 +1,6 @@ import { writeStage2 } from './lib/stage2.ts' const [payload] = Deno.args -const { basePath, destPath, externals, functions, importMapData } = JSON.parse(payload) +const { basePath, destPath, externals, functions, importMapData, vendorDirectory } = JSON.parse(payload) -await writeStage2({ basePath, destPath, externals, functions, importMapData }) +await writeStage2({ basePath, destPath, externals, functions, importMapData, vendorDirectory }) diff --git a/deno/lib/stage2.ts b/deno/lib/stage2.ts index 24814b37..9864544f 100644 --- a/deno/lib/stage2.ts +++ b/deno/lib/stage2.ts @@ -3,7 +3,7 @@ import { build, LoadResponse } from 'https://deno.land/x/eszip@v0.40.0/mod.ts' import * as path from 'https://deno.land/std@0.177.0/path/mod.ts' import type { InputFunction, WriteStage2Options } from '../../shared/stage2.ts' -import { importMapSpecifier, virtualRoot } from '../../shared/consts.ts' +import { importMapSpecifier, virtualRoot, virtualvendorDirectory } from '../../shared/consts.ts' import { PUBLIC_SPECIFIER, STAGE2_SPECIFIER } from './consts.ts' import { inlineModule, loadFromVirtualRoot, loadWithRetry } from './common.ts' @@ -63,7 +63,13 @@ const getVirtualPath = (basePath: string, filePath: string) => { return url } -const stage2Loader = (basePath: string, functions: InputFunction[], externals: Set, importMapData?: string) => { +const stage2Loader = ( + basePath: string, + functions: InputFunction[], + externals: Set, + importMapData: string | undefined, + vendorDirectory?: string, +) => { return async (specifier: string): Promise => { if (specifier === STAGE2_SPECIFIER) { const stage2Entry = getStage2Entry(basePath, functions) @@ -86,13 +92,24 @@ const stage2Loader = (basePath: string, functions: InputFunction[], externals: S return loadFromVirtualRoot(specifier, virtualRoot, basePath) } + if (vendorDirectory !== undefined && specifier.startsWith(virtualvendorDirectory)) { + return loadFromVirtualRoot(specifier, virtualvendorDirectory, vendorDirectory) + } + return await loadWithRetry(specifier) } } -const writeStage2 = async ({ basePath, destPath, externals, functions, importMapData }: WriteStage2Options) => { +const writeStage2 = async ({ + basePath, + destPath, + externals, + functions, + importMapData, + vendorDirectory, +}: WriteStage2Options) => { const importMapURL = importMapData ? importMapSpecifier : undefined - const loader = stage2Loader(basePath, functions, new Set(externals), importMapData) + const loader = stage2Loader(basePath, functions, new Set(externals), importMapData, vendorDirectory) const bytes = await build([STAGE2_SPECIFIER], loader, importMapURL) const directory = path.dirname(destPath) diff --git a/node/bundler.test.ts b/node/bundler.test.ts index 81290761..a2c64942 100644 --- a/node/bundler.test.ts +++ b/node/bundler.test.ts @@ -131,7 +131,7 @@ test('Prints a nice error message when user tries importing NPM module', async ( } catch (error) { expect(error).toBeInstanceOf(BundleError) expect((error as BundleError).message).toEqual( - `It seems like you're trying to import an npm module. This is only supported via CDNs like esm.sh. Have you tried 'import mod from "https://esm.sh/p-retry"'?`, + `It seems like you're trying to import an npm module. This is only supported via CDNs like esm.sh. Have you tried 'import mod from "https://esm.sh/parent-1"'?`, ) } finally { await cleanup() @@ -446,3 +446,32 @@ test('Handles imports with the `node:` prefix', async () => { await cleanup() }) + +test('Loads npm modules from bare specifiers with and without the `npm:` prefix', async () => { + const { basePath, cleanup, distPath } = await useFixture('imports_npm_module') + const sourceDirectory = join(basePath, 'functions') + const declarations: Declaration[] = [ + { + function: 'func1', + path: '/func1', + }, + ] + const vendorDirectory = await tmp.dir() + + await bundle([sourceDirectory], distPath, declarations, { + basePath, + featureFlags: { edge_functions_npm_modules: true }, + vendorTemporaryDirectory: vendorDirectory.path, + }) + const manifestFile = await readFile(resolve(distPath, 'manifest.json'), 'utf8') + const manifest = JSON.parse(manifestFile) + const bundlePath = join(distPath, manifest.bundles[0].asset) + const { func1 } = await runESZIP(bundlePath, vendorDirectory.path) + + expect(func1).toBe( + 'JavaScript, APIs, Markup', + ) + + await cleanup() + await rm(vendorDirectory.path, { force: true, recursive: true }) +}) diff --git a/node/bundler.ts b/node/bundler.ts index 2b648e96..e9880897 100644 --- a/node/bundler.ts +++ b/node/bundler.ts @@ -1,5 +1,6 @@ import { promises as fs } from 'fs' import { join } from 'path' +import { pathToFileURL } from 'url' import commonPathPrefix from 'common-path-prefix' import { v4 as uuidv4 } from 'uuid' @@ -11,46 +12,50 @@ import type { Bundle } from './bundle.js' import { FunctionConfig, getFunctionConfig } from './config.js' import { Declaration, mergeDeclarations } from './declaration.js' import { load as loadDeployConfig } from './deploy_config.js' +import { EdgeFunction } from './edge_function.js' import { FeatureFlags, getFlags } from './feature_flags.js' import { findFunctions } from './finder.js' import { bundle as bundleESZIP } from './formats/eszip.js' import { ImportMap } from './import_map.js' import { getLogger, LogFunction } from './logger.js' import { writeManifest } from './manifest.js' +import { vendorNPMSpecifiers } from './npm_dependencies.js' import { ensureLatestTypes } from './types.js' -interface BundleOptions { +export interface BundleOptions { basePath?: string + bootstrapURL?: string cacheDirectory?: string configPath?: string debug?: boolean distImportMapPath?: string featureFlags?: FeatureFlags importMapPaths?: (string | undefined)[] + internalSrcFolder?: string onAfterDownload?: OnAfterDownloadHook onBeforeDownload?: OnBeforeDownloadHook systemLogger?: LogFunction - internalSrcFolder?: string - bootstrapURL?: string + vendorTemporaryDirectory?: string } -const bundle = async ( +export const bundle = async ( sourceDirectories: string[], distDirectory: string, tomlDeclarations: Declaration[] = [], { basePath: inputBasePath, + bootstrapURL = 'https://edge.netlify.com/bootstrap/index-combined.ts', cacheDirectory, configPath, debug, distImportMapPath, featureFlags: inputFeatureFlags, importMapPaths = [], + internalSrcFolder, onAfterDownload, onBeforeDownload, systemLogger, - internalSrcFolder, - bootstrapURL = 'https://edge.netlify.com/bootstrap/index-combined.ts', + vendorTemporaryDirectory, }: BundleOptions = {}, ) => { const logger = getLogger(systemLogger, debug) @@ -95,6 +100,12 @@ const bundle = async ( const internalFunctions = internalSrcFolder ? await findFunctions([internalSrcFolder]) : [] const functions = [...internalFunctions, ...userFunctions] + const vendor = await vendorDependencies(basePath, functions, featureFlags, vendorTemporaryDirectory) + + if (vendor !== undefined) { + importMap.add(vendor.importMapFile) + } + const functionBundle = await bundleESZIP({ basePath, buildID, @@ -105,6 +116,7 @@ const bundle = async ( functions, featureFlags, importMap, + vendorDirectory: vendor?.directory, }) // The final file name of the bundles contains a SHA256 hash of the contents, @@ -117,7 +129,6 @@ const bundle = async ( const internalConfigPromises = internalFunctions.map( async (func) => [func.name, await getFunctionConfig({ func, importMap, deno, log: logger, bootstrapURL })] as const, ) - const userConfigPromises = userFunctions.map( async (func) => [func.name, await getFunctionConfig({ func, importMap, deno, log: logger, bootstrapURL })] as const, ) @@ -153,6 +164,10 @@ const bundle = async ( layers: deployConfig.layers, }) + if (vendor !== undefined) { + await vendor.cleanup() + } + if (distImportMapPath) { await importMap.writeToFile(distImportMapPath) } @@ -225,5 +240,34 @@ const createFunctionConfig = ({ internalFunctionsWithConfig, declarations }: Cre } }, {} as Record) -export { bundle } -export type { BundleOptions } +const vendorDependencies = async ( + basePath: string, + functions: EdgeFunction[], + featureFlags: FeatureFlags, + directory?: string, +) => { + if (!featureFlags.edge_functions_npm_modules) { + return + } + + const vendor = await vendorNPMSpecifiers( + basePath, + functions.map(({ path }) => path), + directory, + ) + + if (vendor === undefined) { + return + } + + const importMapFile = { + baseURL: pathToFileURL(vendor.directory), + imports: vendor.importMap, + } + + return { + cleanup: vendor.cleanup, + directory: vendor.directory, + importMapFile, + } +} diff --git a/node/feature_flags.ts b/node/feature_flags.ts index c99b5cfa..18d943e1 100644 --- a/node/feature_flags.ts +++ b/node/feature_flags.ts @@ -1,6 +1,7 @@ const defaultFlags = { edge_functions_fail_unsupported_regex: false, edge_functions_path_urlpattern: false, + edge_functions_npm_modules: false, } type FeatureFlag = keyof typeof defaultFlags diff --git a/node/formats/eszip.ts b/node/formats/eszip.ts index b9898df1..8f35e765 100644 --- a/node/formats/eszip.ts +++ b/node/formats/eszip.ts @@ -1,7 +1,7 @@ import { join } from 'path' import { pathToFileURL } from 'url' -import { virtualRoot } from '../../shared/consts.js' +import { virtualRoot, virtualvendorDirectory } from '../../shared/consts.js' import type { WriteStage2Options } from '../../shared/stage2.js' import { DenoBridge } from '../bridge.js' import { Bundle, BundleFormat } from '../bundle.js' @@ -23,6 +23,7 @@ interface BundleESZIPOptions { featureFlags: FeatureFlags functions: EdgeFunction[] importMap: ImportMap + vendorDirectory?: string } const bundleESZIP = async ({ @@ -34,23 +35,27 @@ const bundleESZIP = async ({ externals, functions, importMap, + vendorDirectory, }: BundleESZIPOptions): Promise => { const extension = '.eszip' const destPath = join(distDirectory, `${buildID}${extension}`) - const { bundler, importMap: bundlerImportMap } = getESZIPPaths() - - // Transforming all paths under `basePath` to use the virtual root prefix. const importMapPrefixes: Record = { [`${pathToFileURL(basePath)}/`]: virtualRoot, } - const importMapData = importMap.getContents(importMapPrefixes) + if (vendorDirectory !== undefined) { + importMapPrefixes[`${pathToFileURL(vendorDirectory)}/`] = virtualvendorDirectory + } + + const { bundler, importMap: bundlerImportMap } = getESZIPPaths() + const importMapData = JSON.stringify(importMap.getContents(importMapPrefixes)) const payload: WriteStage2Options = { basePath, destPath, externals, functions, - importMapData: JSON.stringify(importMapData), + importMapData, + vendorDirectory, } const flags = ['--allow-all', '--no-config', `--import-map=${bundlerImportMap}`] diff --git a/node/npm_dependencies.ts b/node/npm_dependencies.ts new file mode 100644 index 00000000..b3c0c7a0 --- /dev/null +++ b/node/npm_dependencies.ts @@ -0,0 +1,143 @@ +import { promises as fs } from 'fs' +import path from 'path' + +import { build, Plugin } from 'esbuild' +import tmp from 'tmp-promise' + +import { npmPrefix } from '../shared/consts.js' + +// esbuild plugin that will traverse the code and look for imports of external +// dependencies (i.e. Node modules). It stores the specifiers found in the Set +// provided. +export const getDependencyTrackerPlugin = (specifiers: Set): Plugin => ({ + name: 'dependency-tracker', + setup(build) { + build.onResolve({ filter: /^(.*)$/ }, (args) => { + // If the specifier has the `npm:` prefix, strip it so that we can use + // the Node.js resolution logic to resolve the right module. + if (args.path.startsWith(npmPrefix)) { + const result = build.resolve(args.path.slice(npmPrefix.length), { + kind: args.kind, + resolveDir: args.resolveDir, + }) + + return result + } + + const isLocalImport = args.path.startsWith(path.sep) || args.path.startsWith('.') + + if (isLocalImport) { + return null + } + + const isRemoteURLImport = args.path.startsWith('https://') || args.path.startsWith('http://') + + if (!isRemoteURLImport) { + specifiers.add(args.path) + } + + // At this point we know we're not dealing with a local import, so we're + // about to leave the boundaries of user code. We mark the specifier as + // external, because we're not interested in traversing the entire module + // tree — i.e. if user code imports module `foo` and that imports `bar`, + // we only want to add `foo` to the list of specifiers, since the whole + // module — including its dependencies like `bar` — will be bundled. + return { external: true } + }) + }, +}) + +export const vendorNPMSpecifiers = async (basePath: string, functions: string[], directory?: string) => { + const specifiers = new Set() + + // The directories that esbuild will use when resolving Node modules. We must + // set these manually because esbuild will be operating from a temporary + // directory that will not live inside the project root, so the normal + // resolution logic won't work. + const nodePaths = [path.join(basePath, 'node_modules')] + + // Do a first pass at bundling to gather a list of specifiers that should be + // loaded as npm dependencies, because they either use the `npm:` prefix or + // they are bare specifiers. We'll collect them in `specifiers`. + await build({ + bundle: true, + entryPoints: functions, + nodePaths, + platform: 'node', + plugins: [getDependencyTrackerPlugin(specifiers)], + write: false, + }) + + // If we found no specifiers, there's nothing left to do here. + if (specifiers.size === 0) { + return + } + + // We need to create some files on disk, which we don't want to write to the + // project directory. If a custom directory has been specified, which happens + // only in tests, we use it. Otherwise, create a random temporary directory. + const temporaryDirectory = directory ? { path: directory } : await tmp.dir() + + // To bundle an entire module and all its dependencies, we create a stub file + // where we re-export everything from that specifier. We do this for every + // specifier, and each of these files will be the entry points to esbuild. + const ops = await Promise.all( + [...specifiers].map(async (specifier, index) => { + const code = `export { default } from "${specifier}"; export * from "${specifier}";` + const filePath = path.join(temporaryDirectory.path, `stub-${index}.js`) + + await fs.writeFile(filePath, code) + + return { filePath, specifier } + }), + ) + const entryPoints = ops.map(({ filePath }) => filePath) + + // Bundle each of the stub files we've created. We'll end up with a compiled + // version of each of the stub files, plus any chunks of shared code between + // stubs (such that a common module isn't bundled twice). + await build({ + allowOverwrite: true, + bundle: true, + entryPoints, + format: 'esm', + nodePaths, + outdir: temporaryDirectory.path, + platform: 'node', + splitting: true, + target: 'es2020', + }) + + // Creates an object that is compatible with the `imports` block of an import + // map, mapping specifiers to the paths of their bundled files on disk. Each + // specifier gets two entries in the import map, one with the `npm:` prefix + // and one without, such that both options are supported. + const importMap = ops.reduce( + (acc, op) => ({ + ...acc, + [op.specifier]: op.filePath, + [npmPrefix + op.specifier]: op.filePath, + }), + {} as Record, + ) + + const cleanup = async () => { + // If a custom temporary directory was specified, we leave the cleanup job + // up to the caller. + if (directory) { + return + } + + try { + await fs.rm(temporaryDirectory.path, { force: true, recursive: true }) + } catch { + // no-op + } + } + + return { + cleanup, + directory: temporaryDirectory.path, + importMap, + } +} diff --git a/package-lock.json b/package-lock.json index 4363c5ee..d857735e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "better-ajv-errors": "^1.2.0", "common-path-prefix": "^3.0.0", "env-paths": "^3.0.0", + "esbuild": "0.19.2", "execa": "^6.0.0", "find-up": "^6.3.0", "get-port": "^6.1.2", @@ -1032,13 +1033,12 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz", - "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", + "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -1048,13 +1048,12 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", - "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", + "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -1064,13 +1063,12 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz", - "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", + "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "android" @@ -1080,13 +1078,12 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", - "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", + "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1096,13 +1093,12 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", - "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", + "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1112,13 +1108,12 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", - "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", + "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -1128,13 +1123,12 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", - "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", + "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -1144,13 +1138,12 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", - "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", + "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1160,13 +1153,12 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", - "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", + "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1176,13 +1168,12 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", - "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", + "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1192,13 +1183,12 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", - "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", + "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1208,13 +1198,12 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", - "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", + "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", "cpu": [ "mips64el" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1224,13 +1213,12 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", - "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", + "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1240,13 +1228,12 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", - "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", + "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1256,13 +1243,12 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", - "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", + "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1272,13 +1258,12 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", - "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", + "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1288,13 +1273,12 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", - "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", + "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "netbsd" @@ -1304,13 +1288,12 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", - "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", + "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" @@ -1320,13 +1303,12 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", - "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", + "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "sunos" @@ -1336,13 +1318,12 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", - "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", + "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1352,13 +1333,12 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", - "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", + "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1368,13 +1348,12 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", - "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", + "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -3623,10 +3602,9 @@ } }, "node_modules/esbuild": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz", - "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", + "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -3635,28 +3613,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.11", - "@esbuild/android-arm64": "0.18.11", - "@esbuild/android-x64": "0.18.11", - "@esbuild/darwin-arm64": "0.18.11", - "@esbuild/darwin-x64": "0.18.11", - "@esbuild/freebsd-arm64": "0.18.11", - "@esbuild/freebsd-x64": "0.18.11", - "@esbuild/linux-arm": "0.18.11", - "@esbuild/linux-arm64": "0.18.11", - "@esbuild/linux-ia32": "0.18.11", - "@esbuild/linux-loong64": "0.18.11", - "@esbuild/linux-mips64el": "0.18.11", - "@esbuild/linux-ppc64": "0.18.11", - "@esbuild/linux-riscv64": "0.18.11", - "@esbuild/linux-s390x": "0.18.11", - "@esbuild/linux-x64": "0.18.11", - "@esbuild/netbsd-x64": "0.18.11", - "@esbuild/openbsd-x64": "0.18.11", - "@esbuild/sunos-x64": "0.18.11", - "@esbuild/win32-arm64": "0.18.11", - "@esbuild/win32-ia32": "0.18.11", - "@esbuild/win32-x64": "0.18.11" + "@esbuild/android-arm": "0.19.2", + "@esbuild/android-arm64": "0.19.2", + "@esbuild/android-x64": "0.19.2", + "@esbuild/darwin-arm64": "0.19.2", + "@esbuild/darwin-x64": "0.19.2", + "@esbuild/freebsd-arm64": "0.19.2", + "@esbuild/freebsd-x64": "0.19.2", + "@esbuild/linux-arm": "0.19.2", + "@esbuild/linux-arm64": "0.19.2", + "@esbuild/linux-ia32": "0.19.2", + "@esbuild/linux-loong64": "0.19.2", + "@esbuild/linux-mips64el": "0.19.2", + "@esbuild/linux-ppc64": "0.19.2", + "@esbuild/linux-riscv64": "0.19.2", + "@esbuild/linux-s390x": "0.19.2", + "@esbuild/linux-x64": "0.19.2", + "@esbuild/netbsd-x64": "0.19.2", + "@esbuild/openbsd-x64": "0.19.2", + "@esbuild/sunos-x64": "0.19.2", + "@esbuild/win32-arm64": "0.19.2", + "@esbuild/win32-ia32": "0.19.2", + "@esbuild/win32-x64": "0.19.2" } }, "node_modules/escalade": { @@ -9096,6 +9074,395 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, "node_modules/vitest": { "version": "0.34.1", "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.1.tgz", @@ -10085,157 +10452,135 @@ } }, "@esbuild/android-arm": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz", - "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", + "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", "optional": true }, "@esbuild/android-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", - "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", + "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", "optional": true }, "@esbuild/android-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz", - "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", + "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", - "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", + "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", "optional": true }, "@esbuild/darwin-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", - "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", + "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", - "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", + "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", - "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", + "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", "optional": true }, "@esbuild/linux-arm": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", - "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", + "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", "optional": true }, "@esbuild/linux-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", - "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", + "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", "optional": true }, "@esbuild/linux-ia32": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", - "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", + "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", "optional": true }, "@esbuild/linux-loong64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", - "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", + "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", - "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", + "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", - "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", + "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", - "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", + "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", "optional": true }, "@esbuild/linux-s390x": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", - "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", + "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", "optional": true }, "@esbuild/linux-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", - "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", + "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", - "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", + "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", - "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", + "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", "optional": true }, "@esbuild/sunos-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", - "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", + "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", "optional": true }, "@esbuild/win32-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", - "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", + "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", "optional": true }, "@esbuild/win32-ia32": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", - "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", + "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", "optional": true }, "@esbuild/win32-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", - "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", + "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", "optional": true }, "@eslint-community/eslint-utils": { @@ -11831,33 +12176,32 @@ } }, "esbuild": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz", - "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.11", - "@esbuild/android-arm64": "0.18.11", - "@esbuild/android-x64": "0.18.11", - "@esbuild/darwin-arm64": "0.18.11", - "@esbuild/darwin-x64": "0.18.11", - "@esbuild/freebsd-arm64": "0.18.11", - "@esbuild/freebsd-x64": "0.18.11", - "@esbuild/linux-arm": "0.18.11", - "@esbuild/linux-arm64": "0.18.11", - "@esbuild/linux-ia32": "0.18.11", - "@esbuild/linux-loong64": "0.18.11", - "@esbuild/linux-mips64el": "0.18.11", - "@esbuild/linux-ppc64": "0.18.11", - "@esbuild/linux-riscv64": "0.18.11", - "@esbuild/linux-s390x": "0.18.11", - "@esbuild/linux-x64": "0.18.11", - "@esbuild/netbsd-x64": "0.18.11", - "@esbuild/openbsd-x64": "0.18.11", - "@esbuild/sunos-x64": "0.18.11", - "@esbuild/win32-arm64": "0.18.11", - "@esbuild/win32-ia32": "0.18.11", - "@esbuild/win32-x64": "0.18.11" + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", + "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", + "requires": { + "@esbuild/android-arm": "0.19.2", + "@esbuild/android-arm64": "0.19.2", + "@esbuild/android-x64": "0.19.2", + "@esbuild/darwin-arm64": "0.19.2", + "@esbuild/darwin-x64": "0.19.2", + "@esbuild/freebsd-arm64": "0.19.2", + "@esbuild/freebsd-x64": "0.19.2", + "@esbuild/linux-arm": "0.19.2", + "@esbuild/linux-arm64": "0.19.2", + "@esbuild/linux-ia32": "0.19.2", + "@esbuild/linux-loong64": "0.19.2", + "@esbuild/linux-mips64el": "0.19.2", + "@esbuild/linux-ppc64": "0.19.2", + "@esbuild/linux-riscv64": "0.19.2", + "@esbuild/linux-s390x": "0.19.2", + "@esbuild/linux-x64": "0.19.2", + "@esbuild/netbsd-x64": "0.19.2", + "@esbuild/openbsd-x64": "0.19.2", + "@esbuild/sunos-x64": "0.19.2", + "@esbuild/win32-arm64": "0.19.2", + "@esbuild/win32-ia32": "0.19.2", + "@esbuild/win32-x64": "0.19.2" } }, "escalade": { @@ -15696,6 +16040,192 @@ "fsevents": "~2.3.2", "postcss": "^8.4.25", "rollup": "^3.25.2" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + } } }, "vite-node": { diff --git a/package.json b/package.json index 83e8dd32..99363a45 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "better-ajv-errors": "^1.2.0", "common-path-prefix": "^3.0.0", "env-paths": "^3.0.0", + "esbuild": "0.19.2", "execa": "^6.0.0", "find-up": "^6.3.0", "get-port": "^6.1.2", diff --git a/shared/consts.ts b/shared/consts.ts index acd5f46e..d19c69e1 100644 --- a/shared/consts.ts +++ b/shared/consts.ts @@ -1,2 +1,4 @@ export const importMapSpecifier = 'netlify:import-map' +export const npmPrefix = 'npm:' export const virtualRoot = 'file:///root/' +export const virtualvendorDirectory = 'file:///vendor/' diff --git a/shared/stage2.ts b/shared/stage2.ts index 64b859ac..0b7cdf00 100644 --- a/shared/stage2.ts +++ b/shared/stage2.ts @@ -9,4 +9,5 @@ export interface WriteStage2Options { externals: string[] functions: InputFunction[] importMapData?: string + vendorDirectory?: string } diff --git a/test/fixtures/imports_npm_module/functions/func1.ts b/test/fixtures/imports_npm_module/functions/func1.ts index 64ec525f..7de2537d 100644 --- a/test/fixtures/imports_npm_module/functions/func1.ts +++ b/test/fixtures/imports_npm_module/functions/func1.ts @@ -1 +1,9 @@ -import pRetry from "p-retry" +import parent1 from 'parent-1' +import parent2 from 'npm:parent-2' +import parent3 from './lib/util.ts' + +export default async () => { + const text = [parent1('JavaScript'), parent2('APIs'), parent3('Markup')].join(', ') + + return new Response(text) +} diff --git a/test/fixtures/imports_npm_module/functions/lib/util.ts b/test/fixtures/imports_npm_module/functions/lib/util.ts new file mode 100644 index 00000000..4ff7cd8a --- /dev/null +++ b/test/fixtures/imports_npm_module/functions/lib/util.ts @@ -0,0 +1,3 @@ +import parent3 from 'parent-3' + +export default parent3 diff --git a/test/fixtures/imports_npm_module/node_modules/child-1/index.js b/test/fixtures/imports_npm_module/node_modules/child-1/index.js new file mode 100644 index 00000000..8ae7e9c4 --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/child-1/index.js @@ -0,0 +1 @@ +export default (input) => `${input}` \ No newline at end of file diff --git a/test/fixtures/imports_npm_module/node_modules/child-1/package.json b/test/fixtures/imports_npm_module/node_modules/child-1/package.json new file mode 100644 index 00000000..4b3a6414 --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/child-1/package.json @@ -0,0 +1,5 @@ +{ + "name": "child-1", + "version": "1.0.0", + "main": "index.js" +} \ No newline at end of file diff --git a/test/fixtures/imports_npm_module/node_modules/child-2/index.js b/test/fixtures/imports_npm_module/node_modules/child-2/index.js new file mode 100644 index 00000000..8505c750 --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/child-2/index.js @@ -0,0 +1,3 @@ +import grandchild1 from "grandchild-1" + +export default (input) => `${grandchild1(input)}` \ No newline at end of file diff --git a/test/fixtures/imports_npm_module/node_modules/child-2/package.json b/test/fixtures/imports_npm_module/node_modules/child-2/package.json new file mode 100644 index 00000000..1e4b084c --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/child-2/package.json @@ -0,0 +1,8 @@ +{ + "name": "child-2", + "version": "1.0.0", + "main": "index.js", + "dependencies": { + "grandchild-1": "1.0.0" + } +} \ No newline at end of file diff --git a/test/fixtures/imports_npm_module/node_modules/grandchild-1/index.js b/test/fixtures/imports_npm_module/node_modules/grandchild-1/index.js new file mode 100644 index 00000000..4fcf6dea --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/grandchild-1/index.js @@ -0,0 +1 @@ +export default (input) => `${input}` \ No newline at end of file diff --git a/test/fixtures/imports_npm_module/node_modules/grandchild-1/package.json b/test/fixtures/imports_npm_module/node_modules/grandchild-1/package.json new file mode 100644 index 00000000..bb88071d --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/grandchild-1/package.json @@ -0,0 +1,5 @@ +{ + "name": "grandchild-1", + "version": "1.0.0", + "main": "index.js" +} \ No newline at end of file diff --git a/test/fixtures/imports_npm_module/node_modules/parent-1/index.js b/test/fixtures/imports_npm_module/node_modules/parent-1/index.js new file mode 100644 index 00000000..c3bcbb5e --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/parent-1/index.js @@ -0,0 +1,3 @@ +import child1 from "child-1" + +export default (input) => `${child1(input)}` \ No newline at end of file diff --git a/test/fixtures/imports_npm_module/node_modules/parent-1/package.json b/test/fixtures/imports_npm_module/node_modules/parent-1/package.json new file mode 100644 index 00000000..b18a38c6 --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/parent-1/package.json @@ -0,0 +1,8 @@ +{ + "name": "parent-1", + "version": "1.0.0", + "main": "index.js", + "dependencies": { + "child-1": "1.0.0" + } +} \ No newline at end of file diff --git a/test/fixtures/imports_npm_module/node_modules/parent-2/index.js b/test/fixtures/imports_npm_module/node_modules/parent-2/index.js new file mode 100644 index 00000000..984b0b18 --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/parent-2/index.js @@ -0,0 +1,4 @@ +import child2 from "child-2" + +export default (input) => `${child2(input)}` + diff --git a/test/fixtures/imports_npm_module/node_modules/parent-2/package.json b/test/fixtures/imports_npm_module/node_modules/parent-2/package.json new file mode 100644 index 00000000..adb0cc33 --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/parent-2/package.json @@ -0,0 +1,5 @@ +{ + "name": "parent-2", + "version": "1.0.0", + "main": "index.js" +} \ No newline at end of file diff --git a/test/fixtures/imports_npm_module/node_modules/parent-3/index.js b/test/fixtures/imports_npm_module/node_modules/parent-3/index.js new file mode 100644 index 00000000..f447613f --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/parent-3/index.js @@ -0,0 +1,4 @@ +import child2 from "child-2" + +export default (input) => `${child2(input)}` + diff --git a/test/fixtures/imports_npm_module/node_modules/parent-3/package.json b/test/fixtures/imports_npm_module/node_modules/parent-3/package.json new file mode 100644 index 00000000..82b794a5 --- /dev/null +++ b/test/fixtures/imports_npm_module/node_modules/parent-3/package.json @@ -0,0 +1,8 @@ +{ + "name": "parent-3", + "version": "1.0.0", + "main": "index.js", + "dependencies": { + "child-2": "1.0.0" + } +} \ No newline at end of file diff --git a/test/util.ts b/test/util.ts index 972e54ad..98aea2bc 100644 --- a/test/util.ts +++ b/test/util.ts @@ -62,7 +62,7 @@ const getRouteMatcher = (manifest: Manifest) => (candidate: string) => return !isExcluded }) -const runESZIP = async (eszipPath: string) => { +const runESZIP = async (eszipPath: string, vendorDirectory?: string) => { const tmpDir = await tmp.dir({ unsafeCleanup: true }) // Extract ESZIP into temporary directory. @@ -86,7 +86,12 @@ const runESZIP = async (eszipPath: string) => { for (const path of [importMapPath, stage2Path]) { const file = await fs.readFile(path, 'utf8') - const normalizedFile = file.replace(/file:\/\/\/root/g, pathToFileURL(virtualRootPath).toString()) + + let normalizedFile = file.replace(/file:\/{3}root/g, pathToFileURL(virtualRootPath).toString()) + + if (vendorDirectory !== undefined) { + normalizedFile = normalizedFile.replace(/file:\/{3}vendor/g, pathToFileURL(vendorDirectory).toString()) + } await fs.writeFile(path, normalizedFile) } From 15ffbd8661f2b4c2323aa2533e8e653e1e2c3e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Wed, 16 Aug 2023 14:02:14 +0100 Subject: [PATCH 05/15] refactor: tidy up --- node/npm_dependencies.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/node/npm_dependencies.ts b/node/npm_dependencies.ts index b3c0c7a0..31bad001 100644 --- a/node/npm_dependencies.ts +++ b/node/npm_dependencies.ts @@ -13,15 +13,15 @@ export const getDependencyTrackerPlugin = (specifiers: Set): Plugin => ( name: 'dependency-tracker', setup(build) { build.onResolve({ filter: /^(.*)$/ }, (args) => { - // If the specifier has the `npm:` prefix, strip it so that we can use - // the Node.js resolution logic to resolve the right module. + // If the specifier has the `npm:` prefix, strip it and use the rest of + // the specifier to resolve the module. if (args.path.startsWith(npmPrefix)) { - const result = build.resolve(args.path.slice(npmPrefix.length), { + const canonicalPath = args.path.slice(npmPrefix.length) + + return build.resolve(canonicalPath, { kind: args.kind, resolveDir: args.resolveDir, }) - - return result } const isLocalImport = args.path.startsWith(path.sep) || args.path.startsWith('.') From 658a2b5e39eb7d0ffe45ad61f31ecba4d78498b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Wed, 16 Aug 2023 14:21:14 +0100 Subject: [PATCH 06/15] fix: only process import statements --- node/npm_dependencies.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/node/npm_dependencies.ts b/node/npm_dependencies.ts index 31bad001..49003a61 100644 --- a/node/npm_dependencies.ts +++ b/node/npm_dependencies.ts @@ -13,6 +13,10 @@ export const getDependencyTrackerPlugin = (specifiers: Set): Plugin => ( name: 'dependency-tracker', setup(build) { build.onResolve({ filter: /^(.*)$/ }, (args) => { + if (args.kind !== 'import-statement') { + return + } + // If the specifier has the `npm:` prefix, strip it and use the rest of // the specifier to resolve the module. if (args.path.startsWith(npmPrefix)) { @@ -27,7 +31,7 @@ export const getDependencyTrackerPlugin = (specifiers: Set): Plugin => ( const isLocalImport = args.path.startsWith(path.sep) || args.path.startsWith('.') if (isLocalImport) { - return null + return } const isRemoteURLImport = args.path.startsWith('https://') || args.path.startsWith('http://') From 99b95373e277c5f7428644fea4b07bec4c8b570b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Thu, 17 Aug 2023 21:08:04 +0100 Subject: [PATCH 07/15] feat: support unprefixed Node.js built-ins --- node/bundler.test.ts | 2 +- node/node_builtins.ts | 53 +++++++++++++++++++ node/npm_dependencies.ts | 15 +++++- .../node_modules/grandchild-1/index.js | 4 +- 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 node/node_builtins.ts diff --git a/node/bundler.test.ts b/node/bundler.test.ts index a2c64942..e3b4a101 100644 --- a/node/bundler.test.ts +++ b/node/bundler.test.ts @@ -469,7 +469,7 @@ test('Loads npm modules from bare specifiers with and without the `npm:` prefix' const { func1 } = await runESZIP(bundlePath, vendorDirectory.path) expect(func1).toBe( - 'JavaScript, APIs, Markup', + `JavaScript, APIs${process.cwd()}, Markup${process.cwd()}`, ) await cleanup() diff --git a/node/node_builtins.ts b/node/node_builtins.ts new file mode 100644 index 00000000..ab1fe594 --- /dev/null +++ b/node/node_builtins.ts @@ -0,0 +1,53 @@ +// From https://github.com/denoland/deno/tree/main/ext/node/polyfills. +export const builtInModules = [ + 'assert', + 'assert/strict', + 'async_hooks', + 'buffer', + 'child_process', + 'cluster', + 'console', + 'constants', + 'crypto', + 'dgram', + 'diagnostics_channel', + 'dns', + 'events', + 'fs', + 'fs/promises', + 'http', + 'http2', + 'https', + 'inspector', + 'module', + 'net', + 'os', + 'path', + 'path/posix', + 'path/win32', + 'perf_hooks', + 'process', + 'punycode', + 'querystring', + 'readline', + 'repl', + 'stream', + 'stream/promises', + 'stream/web', + 'string_decoder', + 'sys', + 'timers', + 'timers/promises', + 'tls', + 'trace_events', + 'tty', + 'url', + 'util', + 'util/types', + 'v8', + 'vm', + 'wasi', + 'webcrypto', + 'worker_threads', + 'zlib', +] diff --git a/node/npm_dependencies.ts b/node/npm_dependencies.ts index 49003a61..f6acdb6c 100644 --- a/node/npm_dependencies.ts +++ b/node/npm_dependencies.ts @@ -6,6 +6,8 @@ import tmp from 'tmp-promise' import { npmPrefix } from '../shared/consts.js' +import { builtInModules } from './node_builtins.js' + // esbuild plugin that will traverse the code and look for imports of external // dependencies (i.e. Node modules). It stores the specifiers found in the Set // provided. @@ -112,6 +114,17 @@ export const vendorNPMSpecifiers = async (basePath: string, functions: string[], target: 'es2020', }) + // Add all Node.js built-ins to the import map, so any unprefixed specifiers + // (e.g. `process`) resolve to the prefixed versions (e.g. `node:prefix`), + // which Deno can process. + const builtIns = builtInModules.reduce( + (acc, name) => ({ + ...acc, + [name]: `node:${name}`, + }), + {} as Record, + ) + // Creates an object that is compatible with the `imports` block of an import // map, mapping specifiers to the paths of their bundled files on disk. Each // specifier gets two entries in the import map, one with the `npm:` prefix @@ -122,7 +135,7 @@ export const vendorNPMSpecifiers = async (basePath: string, functions: string[], [op.specifier]: op.filePath, [npmPrefix + op.specifier]: op.filePath, }), - {} as Record, + builtIns, ) const cleanup = async () => { diff --git a/test/fixtures/imports_npm_module/node_modules/grandchild-1/index.js b/test/fixtures/imports_npm_module/node_modules/grandchild-1/index.js index 4fcf6dea..59c1e941 100644 --- a/test/fixtures/imports_npm_module/node_modules/grandchild-1/index.js +++ b/test/fixtures/imports_npm_module/node_modules/grandchild-1/index.js @@ -1 +1,3 @@ -export default (input) => `${input}` \ No newline at end of file +import { cwd } from "process" + +export default (input) => `${input}${cwd()}` \ No newline at end of file From 73965834048eac94247ea30481a05fdd49a36549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Fri, 18 Aug 2023 00:07:03 +0100 Subject: [PATCH 08/15] feat: add `try/catch` --- .eslintrc.cjs | 1 + node/bundler.ts | 67 +++++++++++++++++++++++++++++++------------------ 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index af995666..183ac59d 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -12,6 +12,7 @@ module.exports = { complexity: 'off', 'import/extensions': 'off', 'max-lines': 'off', + 'max-lines-per-function': 'off', 'max-statements': 'off', 'node/no-missing-import': 'off', 'no-magic-numbers': 'off', diff --git a/node/bundler.ts b/node/bundler.ts index e9880897..845e2e05 100644 --- a/node/bundler.ts +++ b/node/bundler.ts @@ -17,7 +17,7 @@ import { FeatureFlags, getFlags } from './feature_flags.js' import { findFunctions } from './finder.js' import { bundle as bundleESZIP } from './formats/eszip.js' import { ImportMap } from './import_map.js' -import { getLogger, LogFunction } from './logger.js' +import { getLogger, LogFunction, Logger } from './logger.js' import { writeManifest } from './manifest.js' import { vendorNPMSpecifiers } from './npm_dependencies.js' import { ensureLatestTypes } from './types.js' @@ -100,7 +100,13 @@ export const bundle = async ( const internalFunctions = internalSrcFolder ? await findFunctions([internalSrcFolder]) : [] const functions = [...internalFunctions, ...userFunctions] - const vendor = await vendorDependencies(basePath, functions, featureFlags, vendorTemporaryDirectory) + const vendor = await vendorDependencies({ + basePath, + directory: vendorTemporaryDirectory, + featureFlags, + functions, + logger, + }) if (vendor !== undefined) { importMap.add(vendor.importMapFile) @@ -240,34 +246,47 @@ const createFunctionConfig = ({ internalFunctionsWithConfig, declarations }: Cre } }, {} as Record) -const vendorDependencies = async ( - basePath: string, - functions: EdgeFunction[], - featureFlags: FeatureFlags, - directory?: string, -) => { +interface VendorDependenciesOptions { + basePath: string + directory?: string + featureFlags: FeatureFlags + functions: EdgeFunction[] + logger: Logger +} + +const vendorDependencies = async ({ + basePath, + directory, + featureFlags, + functions, + logger, +}: VendorDependenciesOptions) => { if (!featureFlags.edge_functions_npm_modules) { return } - const vendor = await vendorNPMSpecifiers( - basePath, - functions.map(({ path }) => path), - directory, - ) + try { + const vendor = await vendorNPMSpecifiers( + basePath, + functions.map(({ path }) => path), + directory, + ) - if (vendor === undefined) { - return - } + if (vendor === undefined) { + return + } - const importMapFile = { - baseURL: pathToFileURL(vendor.directory), - imports: vendor.importMap, - } + const importMapFile = { + baseURL: pathToFileURL(vendor.directory), + imports: vendor.importMap, + } - return { - cleanup: vendor.cleanup, - directory: vendor.directory, - importMapFile, + return { + cleanup: vendor.cleanup, + directory: vendor.directory, + importMapFile, + } + } catch (error) { + logger.system('Failed to vendor npm specifiers:', error) } } From 4c0f996a1bb08d9030be688722b2a73aad47c610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Fri, 18 Aug 2023 00:07:17 +0100 Subject: [PATCH 09/15] refactor: convert stub path to file URL --- node/npm_dependencies.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/node/npm_dependencies.ts b/node/npm_dependencies.ts index f6acdb6c..57cfca48 100644 --- a/node/npm_dependencies.ts +++ b/node/npm_dependencies.ts @@ -1,5 +1,6 @@ import { promises as fs } from 'fs' import path from 'path' +import { pathToFileURL } from 'url' import { build, Plugin } from 'esbuild' import tmp from 'tmp-promise' @@ -129,14 +130,15 @@ export const vendorNPMSpecifiers = async (basePath: string, functions: string[], // map, mapping specifiers to the paths of their bundled files on disk. Each // specifier gets two entries in the import map, one with the `npm:` prefix // and one without, such that both options are supported. - const importMap = ops.reduce( - (acc, op) => ({ + const importMap = ops.reduce((acc, op) => { + const url = pathToFileURL(op.filePath).toString() + + return { ...acc, - [op.specifier]: op.filePath, - [npmPrefix + op.specifier]: op.filePath, - }), - builtIns, - ) + [op.specifier]: url, + [npmPrefix + op.specifier]: url, + } + }, builtIns) const cleanup = async () => { // If a custom temporary directory was specified, we leave the cleanup job From d278035ffd162120d4aae915fbed595ba8324c1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Fri, 18 Aug 2023 00:18:13 +0100 Subject: [PATCH 10/15] refactor: simplify code --- node/bundler.ts | 71 +++++++--------------------------------- node/npm_dependencies.ts | 6 +++- 2 files changed, 17 insertions(+), 60 deletions(-) diff --git a/node/bundler.ts b/node/bundler.ts index 845e2e05..108b96b0 100644 --- a/node/bundler.ts +++ b/node/bundler.ts @@ -1,6 +1,5 @@ import { promises as fs } from 'fs' import { join } from 'path' -import { pathToFileURL } from 'url' import commonPathPrefix from 'common-path-prefix' import { v4 as uuidv4 } from 'uuid' @@ -12,12 +11,11 @@ import type { Bundle } from './bundle.js' import { FunctionConfig, getFunctionConfig } from './config.js' import { Declaration, mergeDeclarations } from './declaration.js' import { load as loadDeployConfig } from './deploy_config.js' -import { EdgeFunction } from './edge_function.js' import { FeatureFlags, getFlags } from './feature_flags.js' import { findFunctions } from './finder.js' import { bundle as bundleESZIP } from './formats/eszip.js' import { ImportMap } from './import_map.js' -import { getLogger, LogFunction, Logger } from './logger.js' +import { getLogger, LogFunction } from './logger.js' import { writeManifest } from './manifest.js' import { vendorNPMSpecifiers } from './npm_dependencies.js' import { ensureLatestTypes } from './types.js' @@ -100,16 +98,16 @@ export const bundle = async ( const internalFunctions = internalSrcFolder ? await findFunctions([internalSrcFolder]) : [] const functions = [...internalFunctions, ...userFunctions] - const vendor = await vendorDependencies({ - basePath, - directory: vendorTemporaryDirectory, - featureFlags, - functions, - logger, - }) + const vendor = + featureFlags.edge_functions_npm_modules && + (await vendorNPMSpecifiers( + basePath, + functions.map(({ path }) => path), + vendorTemporaryDirectory, + )) - if (vendor !== undefined) { - importMap.add(vendor.importMapFile) + if (vendor) { + importMap.add(vendor.importMap) } const functionBundle = await bundleESZIP({ @@ -122,7 +120,7 @@ export const bundle = async ( functions, featureFlags, importMap, - vendorDirectory: vendor?.directory, + vendorDirectory: vendor ? vendor.directory : undefined, }) // The final file name of the bundles contains a SHA256 hash of the contents, @@ -170,7 +168,7 @@ export const bundle = async ( layers: deployConfig.layers, }) - if (vendor !== undefined) { + if (vendor) { await vendor.cleanup() } @@ -245,48 +243,3 @@ const createFunctionConfig = ({ internalFunctionsWithConfig, declarations }: Cre [functionName]: addGeneratorFallback(mergedConfigFields), } }, {} as Record) - -interface VendorDependenciesOptions { - basePath: string - directory?: string - featureFlags: FeatureFlags - functions: EdgeFunction[] - logger: Logger -} - -const vendorDependencies = async ({ - basePath, - directory, - featureFlags, - functions, - logger, -}: VendorDependenciesOptions) => { - if (!featureFlags.edge_functions_npm_modules) { - return - } - - try { - const vendor = await vendorNPMSpecifiers( - basePath, - functions.map(({ path }) => path), - directory, - ) - - if (vendor === undefined) { - return - } - - const importMapFile = { - baseURL: pathToFileURL(vendor.directory), - imports: vendor.importMap, - } - - return { - cleanup: vendor.cleanup, - directory: vendor.directory, - importMapFile, - } - } catch (error) { - logger.system('Failed to vendor npm specifiers:', error) - } -} diff --git a/node/npm_dependencies.ts b/node/npm_dependencies.ts index 57cfca48..b7ec20bc 100644 --- a/node/npm_dependencies.ts +++ b/node/npm_dependencies.ts @@ -130,7 +130,7 @@ export const vendorNPMSpecifiers = async (basePath: string, functions: string[], // map, mapping specifiers to the paths of their bundled files on disk. Each // specifier gets two entries in the import map, one with the `npm:` prefix // and one without, such that both options are supported. - const importMap = ops.reduce((acc, op) => { + const imports = ops.reduce((acc, op) => { const url = pathToFileURL(op.filePath).toString() return { @@ -139,6 +139,10 @@ export const vendorNPMSpecifiers = async (basePath: string, functions: string[], [npmPrefix + op.specifier]: url, } }, builtIns) + const importMap = { + baseURL: pathToFileURL(temporaryDirectory.path), + imports, + } const cleanup = async () => { // If a custom temporary directory was specified, we leave the cleanup job From 5636ff965aec20ab0f670a4f4a356de612172679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Fri, 18 Aug 2023 00:20:22 +0100 Subject: [PATCH 11/15] refactor: rename variable --- node/bundler.test.ts | 2 +- node/bundler.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/node/bundler.test.ts b/node/bundler.test.ts index e3b4a101..39bfc922 100644 --- a/node/bundler.test.ts +++ b/node/bundler.test.ts @@ -461,7 +461,7 @@ test('Loads npm modules from bare specifiers with and without the `npm:` prefix' await bundle([sourceDirectory], distPath, declarations, { basePath, featureFlags: { edge_functions_npm_modules: true }, - vendorTemporaryDirectory: vendorDirectory.path, + vendorDirectory: vendorDirectory.path, }) const manifestFile = await readFile(resolve(distPath, 'manifest.json'), 'utf8') const manifest = JSON.parse(manifestFile) diff --git a/node/bundler.ts b/node/bundler.ts index 108b96b0..782fb48d 100644 --- a/node/bundler.ts +++ b/node/bundler.ts @@ -33,7 +33,7 @@ export interface BundleOptions { onAfterDownload?: OnAfterDownloadHook onBeforeDownload?: OnBeforeDownloadHook systemLogger?: LogFunction - vendorTemporaryDirectory?: string + vendorDirectory?: string } export const bundle = async ( @@ -53,7 +53,7 @@ export const bundle = async ( onAfterDownload, onBeforeDownload, systemLogger, - vendorTemporaryDirectory, + vendorDirectory, }: BundleOptions = {}, ) => { const logger = getLogger(systemLogger, debug) @@ -103,7 +103,7 @@ export const bundle = async ( (await vendorNPMSpecifiers( basePath, functions.map(({ path }) => path), - vendorTemporaryDirectory, + vendorDirectory, )) if (vendor) { From 4e17a8804f924547ed668b12def47375ecbe519f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Fri, 18 Aug 2023 00:22:11 +0100 Subject: [PATCH 12/15] refactor: rename variable --- deno/lib/stage2.ts | 6 +++--- node/formats/eszip.ts | 4 ++-- shared/consts.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/deno/lib/stage2.ts b/deno/lib/stage2.ts index 9864544f..141055b7 100644 --- a/deno/lib/stage2.ts +++ b/deno/lib/stage2.ts @@ -3,7 +3,7 @@ import { build, LoadResponse } from 'https://deno.land/x/eszip@v0.40.0/mod.ts' import * as path from 'https://deno.land/std@0.177.0/path/mod.ts' import type { InputFunction, WriteStage2Options } from '../../shared/stage2.ts' -import { importMapSpecifier, virtualRoot, virtualvendorDirectory } from '../../shared/consts.ts' +import { importMapSpecifier, virtualRoot, virtualVendorRoot } from '../../shared/consts.ts' import { PUBLIC_SPECIFIER, STAGE2_SPECIFIER } from './consts.ts' import { inlineModule, loadFromVirtualRoot, loadWithRetry } from './common.ts' @@ -92,8 +92,8 @@ const stage2Loader = ( return loadFromVirtualRoot(specifier, virtualRoot, basePath) } - if (vendorDirectory !== undefined && specifier.startsWith(virtualvendorDirectory)) { - return loadFromVirtualRoot(specifier, virtualvendorDirectory, vendorDirectory) + if (vendorDirectory !== undefined && specifier.startsWith(virtualVendorRoot)) { + return loadFromVirtualRoot(specifier, virtualVendorRoot, vendorDirectory) } return await loadWithRetry(specifier) diff --git a/node/formats/eszip.ts b/node/formats/eszip.ts index 8f35e765..49297851 100644 --- a/node/formats/eszip.ts +++ b/node/formats/eszip.ts @@ -1,7 +1,7 @@ import { join } from 'path' import { pathToFileURL } from 'url' -import { virtualRoot, virtualvendorDirectory } from '../../shared/consts.js' +import { virtualRoot, virtualVendorRoot } from '../../shared/consts.js' import type { WriteStage2Options } from '../../shared/stage2.js' import { DenoBridge } from '../bridge.js' import { Bundle, BundleFormat } from '../bundle.js' @@ -44,7 +44,7 @@ const bundleESZIP = async ({ } if (vendorDirectory !== undefined) { - importMapPrefixes[`${pathToFileURL(vendorDirectory)}/`] = virtualvendorDirectory + importMapPrefixes[`${pathToFileURL(vendorDirectory)}/`] = virtualVendorRoot } const { bundler, importMap: bundlerImportMap } = getESZIPPaths() diff --git a/shared/consts.ts b/shared/consts.ts index d19c69e1..293671d2 100644 --- a/shared/consts.ts +++ b/shared/consts.ts @@ -1,4 +1,4 @@ export const importMapSpecifier = 'netlify:import-map' export const npmPrefix = 'npm:' export const virtualRoot = 'file:///root/' -export const virtualvendorDirectory = 'file:///vendor/' +export const virtualVendorRoot = 'file:///vendor/' From 86aeae2ca01905ff669c7b8746e7ed101ac4488d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Tue, 5 Sep 2023 11:40:28 +0100 Subject: [PATCH 13/15] refactor: use `builtinModules` from `node:module` --- node/node_builtins.ts | 53 ---------------------------------------- node/npm_dependencies.ts | 5 ++-- 2 files changed, 2 insertions(+), 56 deletions(-) delete mode 100644 node/node_builtins.ts diff --git a/node/node_builtins.ts b/node/node_builtins.ts deleted file mode 100644 index ab1fe594..00000000 --- a/node/node_builtins.ts +++ /dev/null @@ -1,53 +0,0 @@ -// From https://github.com/denoland/deno/tree/main/ext/node/polyfills. -export const builtInModules = [ - 'assert', - 'assert/strict', - 'async_hooks', - 'buffer', - 'child_process', - 'cluster', - 'console', - 'constants', - 'crypto', - 'dgram', - 'diagnostics_channel', - 'dns', - 'events', - 'fs', - 'fs/promises', - 'http', - 'http2', - 'https', - 'inspector', - 'module', - 'net', - 'os', - 'path', - 'path/posix', - 'path/win32', - 'perf_hooks', - 'process', - 'punycode', - 'querystring', - 'readline', - 'repl', - 'stream', - 'stream/promises', - 'stream/web', - 'string_decoder', - 'sys', - 'timers', - 'timers/promises', - 'tls', - 'trace_events', - 'tty', - 'url', - 'util', - 'util/types', - 'v8', - 'vm', - 'wasi', - 'webcrypto', - 'worker_threads', - 'zlib', -] diff --git a/node/npm_dependencies.ts b/node/npm_dependencies.ts index b7ec20bc..f36a5b6c 100644 --- a/node/npm_dependencies.ts +++ b/node/npm_dependencies.ts @@ -1,4 +1,5 @@ import { promises as fs } from 'fs' +import { builtinModules } from 'module' import path from 'path' import { pathToFileURL } from 'url' @@ -7,8 +8,6 @@ import tmp from 'tmp-promise' import { npmPrefix } from '../shared/consts.js' -import { builtInModules } from './node_builtins.js' - // esbuild plugin that will traverse the code and look for imports of external // dependencies (i.e. Node modules). It stores the specifiers found in the Set // provided. @@ -118,7 +117,7 @@ export const vendorNPMSpecifiers = async (basePath: string, functions: string[], // Add all Node.js built-ins to the import map, so any unprefixed specifiers // (e.g. `process`) resolve to the prefixed versions (e.g. `node:prefix`), // which Deno can process. - const builtIns = builtInModules.reduce( + const builtIns = builtinModules.reduce( (acc, name) => ({ ...acc, [name]: `node:${name}`, From 9cde98c83fbb81c2567fc8740d53b4e663194207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Tue, 5 Sep 2023 11:52:25 +0100 Subject: [PATCH 14/15] refactor: add try/catch --- node/bundler.ts | 48 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/node/bundler.ts b/node/bundler.ts index 782fb48d..efe93766 100644 --- a/node/bundler.ts +++ b/node/bundler.ts @@ -11,11 +11,12 @@ import type { Bundle } from './bundle.js' import { FunctionConfig, getFunctionConfig } from './config.js' import { Declaration, mergeDeclarations } from './declaration.js' import { load as loadDeployConfig } from './deploy_config.js' +import { EdgeFunction } from './edge_function.js' import { FeatureFlags, getFlags } from './feature_flags.js' import { findFunctions } from './finder.js' import { bundle as bundleESZIP } from './formats/eszip.js' import { ImportMap } from './import_map.js' -import { getLogger, LogFunction } from './logger.js' +import { getLogger, LogFunction, Logger } from './logger.js' import { writeManifest } from './manifest.js' import { vendorNPMSpecifiers } from './npm_dependencies.js' import { ensureLatestTypes } from './types.js' @@ -97,14 +98,7 @@ export const bundle = async ( const userFunctions = userSourceDirectories.length === 0 ? [] : await findFunctions(userSourceDirectories) const internalFunctions = internalSrcFolder ? await findFunctions([internalSrcFolder]) : [] const functions = [...internalFunctions, ...userFunctions] - - const vendor = - featureFlags.edge_functions_npm_modules && - (await vendorNPMSpecifiers( - basePath, - functions.map(({ path }) => path), - vendorDirectory, - )) + const vendor = await safelyVendorNPMSpecifiers({ basePath, featureFlags, functions, logger, vendorDirectory }) if (vendor) { importMap.add(vendor.importMap) @@ -120,7 +114,7 @@ export const bundle = async ( functions, featureFlags, importMap, - vendorDirectory: vendor ? vendor.directory : undefined, + vendorDirectory: vendor?.directory, }) // The final file name of the bundles contains a SHA256 hash of the contents, @@ -168,9 +162,7 @@ export const bundle = async ( layers: deployConfig.layers, }) - if (vendor) { - await vendor.cleanup() - } + await vendor?.cleanup() if (distImportMapPath) { await importMap.writeToFile(distImportMapPath) @@ -243,3 +235,33 @@ const createFunctionConfig = ({ internalFunctionsWithConfig, declarations }: Cre [functionName]: addGeneratorFallback(mergedConfigFields), } }, {} as Record) + +interface VendorNPMOptions { + basePath: string + featureFlags: FeatureFlags + functions: EdgeFunction[] + logger: Logger + vendorDirectory: string | undefined +} + +const safelyVendorNPMSpecifiers = async ({ + basePath, + featureFlags, + functions, + logger, + vendorDirectory, +}: VendorNPMOptions) => { + if (!featureFlags.edge_functions_npm_modules) { + return + } + + try { + return await vendorNPMSpecifiers( + basePath, + functions.map(({ path }) => path), + vendorDirectory, + ) + } catch (error) { + logger.system(error) + } +} From aee247b046ed5f827d1b2f3ebc9abdd64a99a497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Tue, 5 Sep 2023 12:07:29 +0100 Subject: [PATCH 15/15] chore: update lock file --- package-lock.json | 1190 ++++++++++++++++++++++++++++++++------------- 1 file changed, 860 insertions(+), 330 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ace00b9..7263b9ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "better-ajv-errors": "^1.2.0", "common-path-prefix": "^3.0.0", "env-paths": "^3.0.0", + "esbuild": "0.19.2", "execa": "^6.0.0", "find-up": "^6.3.0", "get-port": "^6.1.2", @@ -1031,13 +1032,12 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", + "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -1047,13 +1047,12 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", + "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -1063,13 +1062,12 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", + "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "android" @@ -1079,13 +1077,12 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", + "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1095,13 +1092,12 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", + "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1111,13 +1107,12 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", + "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -1127,13 +1122,12 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", + "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -1143,13 +1137,12 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", + "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1159,13 +1152,12 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", + "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1175,13 +1167,12 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", + "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1191,13 +1182,12 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", + "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1207,13 +1197,12 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", + "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", "cpu": [ "mips64el" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1223,13 +1212,12 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", + "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1239,13 +1227,12 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", + "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1255,13 +1242,12 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", + "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1271,13 +1257,12 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", + "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1287,13 +1272,12 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", + "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "netbsd" @@ -1303,13 +1287,12 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", + "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" @@ -1319,13 +1302,12 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", + "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "sunos" @@ -1335,13 +1317,12 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", + "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1351,13 +1332,12 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", + "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1367,13 +1347,12 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", + "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -3622,10 +3601,9 @@ } }, "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", + "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -3634,28 +3612,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/android-arm": "0.19.2", + "@esbuild/android-arm64": "0.19.2", + "@esbuild/android-x64": "0.19.2", + "@esbuild/darwin-arm64": "0.19.2", + "@esbuild/darwin-x64": "0.19.2", + "@esbuild/freebsd-arm64": "0.19.2", + "@esbuild/freebsd-x64": "0.19.2", + "@esbuild/linux-arm": "0.19.2", + "@esbuild/linux-arm64": "0.19.2", + "@esbuild/linux-ia32": "0.19.2", + "@esbuild/linux-loong64": "0.19.2", + "@esbuild/linux-mips64el": "0.19.2", + "@esbuild/linux-ppc64": "0.19.2", + "@esbuild/linux-riscv64": "0.19.2", + "@esbuild/linux-s390x": "0.19.2", + "@esbuild/linux-x64": "0.19.2", + "@esbuild/netbsd-x64": "0.19.2", + "@esbuild/openbsd-x64": "0.19.2", + "@esbuild/sunos-x64": "0.19.2", + "@esbuild/win32-arm64": "0.19.2", + "@esbuild/win32-ia32": "0.19.2", + "@esbuild/win32-x64": "0.19.2" } }, "node_modules/escalade": { @@ -9090,118 +9068,507 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vitest": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.3.tgz", - "integrity": "sha512-7+VA5Iw4S3USYk+qwPxHl8plCMhA5rtfwMjgoQXMT7rO5ldWcdsdo3U1QD289JgglGK4WeOzgoLTsGFu6VISyQ==", + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.34.3", - "@vitest/runner": "0.34.3", - "@vitest/snapshot": "0.34.3", - "@vitest/spy": "0.34.3", - "@vitest/utils": "0.34.3", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.7", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.7.0", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.34.3", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } + "node": ">=12" } }, - "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/vitest": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.3.tgz", + "integrity": "sha512-7+VA5Iw4S3USYk+qwPxHl8plCMhA5rtfwMjgoQXMT7rO5ldWcdsdo3U1QD289JgglGK4WeOzgoLTsGFu6VISyQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.3", + "@vitest/runner": "0.34.3", + "@vitest/snapshot": "0.34.3", + "@vitest/spy": "0.34.3", + "@vitest/utils": "0.34.3", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.34.3", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { "url": "https://github.com/sponsors/ljharb" } }, @@ -10079,157 +10446,135 @@ } }, "@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", + "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", "optional": true }, "@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", + "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", "optional": true }, "@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", + "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", + "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", "optional": true }, "@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", + "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", + "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", + "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", "optional": true }, "@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", + "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", "optional": true }, "@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", + "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", "optional": true }, "@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", + "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", "optional": true }, "@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", + "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", + "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", + "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", + "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", "optional": true }, "@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", + "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", "optional": true }, "@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", + "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", + "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", + "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", "optional": true }, "@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", + "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", "optional": true }, "@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", + "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", "optional": true }, "@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", + "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", "optional": true }, "@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", + "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", "optional": true }, "@eslint-community/eslint-utils": { @@ -11825,33 +12170,32 @@ } }, "esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", + "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", + "requires": { + "@esbuild/android-arm": "0.19.2", + "@esbuild/android-arm64": "0.19.2", + "@esbuild/android-x64": "0.19.2", + "@esbuild/darwin-arm64": "0.19.2", + "@esbuild/darwin-x64": "0.19.2", + "@esbuild/freebsd-arm64": "0.19.2", + "@esbuild/freebsd-x64": "0.19.2", + "@esbuild/linux-arm": "0.19.2", + "@esbuild/linux-arm64": "0.19.2", + "@esbuild/linux-ia32": "0.19.2", + "@esbuild/linux-loong64": "0.19.2", + "@esbuild/linux-mips64el": "0.19.2", + "@esbuild/linux-ppc64": "0.19.2", + "@esbuild/linux-riscv64": "0.19.2", + "@esbuild/linux-s390x": "0.19.2", + "@esbuild/linux-x64": "0.19.2", + "@esbuild/netbsd-x64": "0.19.2", + "@esbuild/openbsd-x64": "0.19.2", + "@esbuild/sunos-x64": "0.19.2", + "@esbuild/win32-arm64": "0.19.2", + "@esbuild/win32-ia32": "0.19.2", + "@esbuild/win32-x64": "0.19.2" } }, "escalade": { @@ -15685,6 +16029,192 @@ "fsevents": "~2.3.2", "postcss": "^8.4.27", "rollup": "^3.27.1" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + } } }, "vite-node": {