From a7c2f1a657843e108d3048b60684b6f8e665074c Mon Sep 17 00:00:00 2001 From: kanno <812137533@qq.com> Date: Tue, 11 Jul 2023 10:46:47 +0800 Subject: [PATCH] feat: using babel replace magicString (#10) * faet: quque support catch error * perf: improve vm logic * perf: vm logic * chore: clean code * perf: inject script performance * test: make test happy * feat: init code-gen * chore: add docs * fix(vm): should work with catch branch * refactor(code-gen): import & indentifier * refactor: init export rewrite * feat: complete exports node * feat(code-gen): insert new line * feat: named exports * feat: migrate to babel * test: add e2e * chore: fix ci * chore: e2e run with windows * chore: fix ci * chore: clean code * feat: complete duplicated node remove * fix: transform scope * chore: clean code --- .github/workflows/e2e.yaml | 27 ++ .github/workflows/test.yaml | 2 +- .node-version | 1 + Architecture.md | 63 --- README.md | 2 +- __tests__/code-gen.spec.ts | 183 ++++++++ __tests__/fixtures/exporter/exports.js | 3 - __tests__/fixtures/exporter/index.html | 13 - __tests__/fixtures/exporter/main.js | 14 - __tests__/fixtures/importer/index.html | 13 - __tests__/fixtures/importer/main.js | 17 - __tests__/fixtures/name-export/exports.js | 14 - __tests__/fixtures/name-export/main.js | 7 - __tests__/inject.spec.ts | 78 +--- __tests__/plugin.spec.ts | 44 -- __tests__/scanner.spec.ts | 18 +- __tests__/shared.spec.ts | 17 + __tests__/vm.spec.ts | 32 ++ bump.config.ts | 2 +- docs/Background.md | 48 ++ docs/How-it-works.md | 59 +++ e2e/e2e.ts | 110 +++++ e2e/fixture/app.vue | 24 + e2e/fixture/main.js | 4 + .../fixtures/name-export => e2e}/index.html | 2 +- e2e/package.json | 7 + e2e/vite2/e2e.spec.ts | 14 + e2e/vite2/interface.ts | 1 + e2e/vite2/package.json | 8 + e2e/vite2/yarn.lock | 226 +++++++++ e2e/vite3/e2e.spec.ts | 14 + e2e/vite3/interface.ts | 1 + e2e/vite3/package.json | 8 + e2e/vite3/yarn.lock | 232 +++++++++ e2e/vite4/e2e.spec.ts | 14 + e2e/vite4/interface.ts | 1 + e2e/vite4/package.json | 8 + e2e/vite4/yarn.lock | 193 ++++++++ example/src/api.js | 4 + example/src/app.vue | 3 +- example/vite.config.js | 1 + example/yarn.lock | 442 ++++++++++++++---- global.d.ts | 23 - internal/shared.ts | 7 - package.json | 25 +- src/ast.ts | 203 -------- src/code-gen.ts | 278 +++++++++++ src/generator.ts | 192 -------- src/index.ts | 19 +- src/inject.ts | 185 ++++---- src/interface.ts | 8 +- src/scanner.ts | 132 +++--- src/url.ts | 2 + src/vm.ts | 78 ++-- tsconfig.json | 3 +- yarn.lock | 387 ++++++++++++--- 56 files changed, 2448 insertions(+), 1068 deletions(-) create mode 100644 .github/workflows/e2e.yaml create mode 100644 .node-version delete mode 100644 Architecture.md create mode 100644 __tests__/code-gen.spec.ts delete mode 100644 __tests__/fixtures/exporter/exports.js delete mode 100644 __tests__/fixtures/exporter/index.html delete mode 100644 __tests__/fixtures/exporter/main.js delete mode 100644 __tests__/fixtures/importer/index.html delete mode 100644 __tests__/fixtures/importer/main.js delete mode 100644 __tests__/fixtures/name-export/exports.js delete mode 100644 __tests__/fixtures/name-export/main.js delete mode 100644 __tests__/plugin.spec.ts create mode 100644 __tests__/shared.spec.ts create mode 100644 __tests__/vm.spec.ts create mode 100644 docs/Background.md create mode 100644 docs/How-it-works.md create mode 100644 e2e/e2e.ts create mode 100644 e2e/fixture/app.vue create mode 100644 e2e/fixture/main.js rename {__tests__/fixtures/name-export => e2e}/index.html (79%) create mode 100644 e2e/package.json create mode 100644 e2e/vite2/e2e.spec.ts create mode 100644 e2e/vite2/interface.ts create mode 100644 e2e/vite2/package.json create mode 100644 e2e/vite2/yarn.lock create mode 100644 e2e/vite3/e2e.spec.ts create mode 100644 e2e/vite3/interface.ts create mode 100644 e2e/vite3/package.json create mode 100644 e2e/vite3/yarn.lock create mode 100644 e2e/vite4/e2e.spec.ts create mode 100644 e2e/vite4/interface.ts create mode 100644 e2e/vite4/package.json create mode 100644 e2e/vite4/yarn.lock delete mode 100644 global.d.ts delete mode 100644 internal/shared.ts delete mode 100644 src/ast.ts create mode 100644 src/code-gen.ts delete mode 100644 src/generator.ts create mode 100644 src/url.ts diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml new file mode 100644 index 0000000..2934288 --- /dev/null +++ b/.github/workflows/e2e.yaml @@ -0,0 +1,27 @@ +name: E2e test + +on: [push, pull_request] + +jobs: + run-e2e-test: + strategy: + matrix: + version: [16, 18] + os: [ubuntu-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + with: + node-version: ${{ matrix.version }} + + - name: install dependices + run: yarn + + - name: build project + run: yarn build + + - name: prepare e2e + run: yarn prepare:e2e + + - name: run e2e test + run: yarn e2e diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 825ce3d..026283e 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -17,7 +17,7 @@ jobs: run: npm run build - name: Run Test - run: npm run coverage + run: npm run test - name: Report Coverage uses: codecov/codecov-action@v2 diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..95c758c --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +v18.12.1 \ No newline at end of file diff --git a/Architecture.md b/Architecture.md deleted file mode 100644 index bb874c5..0000000 --- a/Architecture.md +++ /dev/null @@ -1,63 +0,0 @@ -# Architecture - - -## Foreword - -`vite-plugin-cdn2` is a plugin that can solves as many problems as possible. - -It can replace `vite-pluigin-cdn` & `vite-plugin-cdn-importer`. Because they don't support `export * from 'module'`. -This is a very ticky case. - -Look at the follow case: - - -```javascript - -export * from 'vue' - -function version () { - retrun 3 -} - - -export function getVersion() { - - return version - -} - - -export function _getVersion() { - - return version - -} - -``` - -To be honestly. If we handle this case the `version` should be renamed. - - -```javascript - -export * from 'moduleA' - -export * from 'moduleB' - - -``` - -They all export a module called `version`. Normally. we rewrite the syntax as named export and purge. -But if we can't handle the first case this behavoir is meaningless. - - -## How it's work? - -`vite-plugin-cdn2` is a light plugin to convert your application code and bind the cdn resource. -First. plugin will scanner your module. and find the global name then to the next stage. -transform your code and apply the cdn resouce. - - -## Advice - -Use `export * from 'module'` as less as possible. If you want to do this,You can split them into 2 files.Don't export the same module (It just a suggestion) \ No newline at end of file diff --git a/README.md b/README.md index b3d9dcd..60fabd5 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ export interface CDNPluginOptions { *auto will read the package.json has unpkg or jsdelivr path. If not willn't be * repalce. set false you can define spare for each module. */ - mode?: PresetDomain + url?: string include?: FilterPattern exclude?: FilterPattern /** diff --git a/__tests__/code-gen.spec.ts b/__tests__/code-gen.spec.ts new file mode 100644 index 0000000..77e3881 --- /dev/null +++ b/__tests__/code-gen.spec.ts @@ -0,0 +1,183 @@ +import test from 'ava' +import { parse, traverse } from '@babel/core' +import { createCodeGenerator } from '../dist/code-gen' +import { createScanner } from '../dist/scanner' +import type { ModuleInfo } from '../src/interface' + + +test('filter', async (t) => { + const code = ` + import { ref } from 'vue'; + const v = ref(0) + ` + const dependencies:Map = new Map() + const codeGen = createCodeGenerator() + dependencies.set('vue', { + name: 'vue', + global: 'Vue', + version: '0.0.0', + relativeModule: '', + bindings: new Set() + }) + codeGen.injectDependencies(dependencies) + t.is(codeGen.filter(code, 'mock.js'), true) +}) + +test('scope', async (t) => { + const code = 'import { version } from \'vue\';\n console.log(version);\n function t() { const version = 3;\n console.log(version) }' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + t.is(res.code, 'console.log(Vue.version);\nfunction t() {\n const version = 3;\n console.log(version);\n}') +}) + +test('exports loose source', async (t) => { + const code = 'import { version } from \'vue\';\n export { version };\n' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + t.is(res.code, 'export const version = Vue.version;') +}) + +test('exports loose source and re named exported name', async (t) => { + const code = 'import { version } from \'vue\';\n export { version, version as default };\n' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + t.is(res.code, 'export const version = Vue.version;\nexport default Vue.version;') +}) + +test('exports loose source and export self module', async (t) => { + const code = 'import { version , ref } from \'vue\';\n const t = \'nonzzz\';\n export { t, version, ref as default };' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + t.is(res.code, 'const t = \'nonzzz\';\nexport { t };\nconst version = Vue.version;\nexport default Vue.ref;') +}) + +test('exports with source', async (t) => { + const code = 'export { ref , version } from \'vue\'' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + t.is(res.code, 'export const ref = Vue.ref,\n version = Vue.version;') +}) + +test('exports with source and re named local name', async (t) => { + const code = 'export { default as myVue, version } from \'vue\'' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + if (!res.code) return + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const ast = await parse(res.code, { babelrc: false, configFile: false })! + const keys:Set = new Set() + await traverse(ast, { + ObjectProperty: { + enter: (path) => { + path.node.key.type === 'Identifier' && keys.add(path.node.key.name) + } + } + }) + t.is(keys.size, scanner.dependencies.get('vue').bindings.size) +}) + +test('exports with source and re named exported name', async (t) => { + const code = 'export { version as default , ref } from \'vue\'' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + t.is(res.code, 'export const ref = Vue.ref;\nexport default Vue.version;') +}) + +test('export all with source and re named it with default', async (t) => { + const code = 'export * as default from \'vue\'' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + if (!res.code) return + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const ast = await parse(res.code, { babelrc: false, configFile: false })! + const keys:Set = new Set() + await traverse(ast, { + ObjectProperty: (path) => { + path.node.key.type === 'Identifier' && keys.add(path.node.key.name) + } + }) + t.is(keys.size, scanner.dependencies.get('vue').bindings.size) +}) + +test('export all with source and re named it with custom', async (t) => { + const code = 'export * as myVue from \'vue\'' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + if (!res.code) return + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const ast = await parse(res.code, { babelrc: false, configFile: false })! + const keys:Set = new Set() + await traverse(ast, { + ObjectProperty: (path) => { + path.node.key.type === 'Identifier' && keys.add(path.node.key.name) + } + }) + t.is(keys.size, scanner.dependencies.get('vue').bindings.size) +}) + +test('export all declaration', async (t) => { + const code = 'export * from \'vue\'' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + if (!res.code) return + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const ast = await parse(res.code, { babelrc: false, configFile: false })! + let size = 0 + await traverse(ast, { + VariableDeclarator: () => { + size++ + } + }) + t.is(size, scanner.dependencies.get('vue').bindings.size) +}) + +test('export with declaration', async (t) => { + const code = 'import { ref } from \'vue\';\nexport const value = ref(0);' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + t.is(res.code, 'export const value = Vue.ref(0);') +}) + + +test('export all module but the current module itself contains duplicated node', async (t) => { + const code = 'export * from \'vue\';\nexport const version = \'self\';' + const scanner = createScanner(['vue']) + await scanner.scanAllDependencies() + const codeGen = createCodeGenerator() + codeGen.injectDependencies(scanner.dependencies) + const res = await codeGen.transform(code) + t.is(/'self'/.test(res.code), true) +}) diff --git a/__tests__/fixtures/exporter/exports.js b/__tests__/fixtures/exporter/exports.js deleted file mode 100644 index 179075d..0000000 --- a/__tests__/fixtures/exporter/exports.js +++ /dev/null @@ -1,3 +0,0 @@ -export * from 'vue' -export * as vue from 'vue' -export { version as default } from 'vue' diff --git a/__tests__/fixtures/exporter/index.html b/__tests__/fixtures/exporter/index.html deleted file mode 100644 index 87d0f0a..0000000 --- a/__tests__/fixtures/exporter/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Document - - -
- - - diff --git a/__tests__/fixtures/exporter/main.js b/__tests__/fixtures/exporter/main.js deleted file mode 100644 index f91ca93..0000000 --- a/__tests__/fixtures/exporter/main.js +++ /dev/null @@ -1,14 +0,0 @@ -import version, { version as _version, vue } from './exports' - -console.log(version) -console.log(_version) -console.log(vue.version) - -function scoped() { - const version = 1 - console.log(version) - console.log(_version) - console.log(vue.version) -} - -scoped() diff --git a/__tests__/fixtures/importer/index.html b/__tests__/fixtures/importer/index.html deleted file mode 100644 index 87d0f0a..0000000 --- a/__tests__/fixtures/importer/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Document - - -
- - - diff --git a/__tests__/fixtures/importer/main.js b/__tests__/fixtures/importer/main.js deleted file mode 100644 index fff0a1f..0000000 --- a/__tests__/fixtures/importer/main.js +++ /dev/null @@ -1,17 +0,0 @@ -import * as vue from 'vue' -import { ref, version } from 'vue' - -console.log(vue.version) - -const v = ref(0) - -function scoped() { - const v = 1 - console.log(v) - console.log(version) - console.log(vue.version) -} - -scoped() - -console.log(v) diff --git a/__tests__/fixtures/name-export/exports.js b/__tests__/fixtures/name-export/exports.js deleted file mode 100644 index 838e10f..0000000 --- a/__tests__/fixtures/name-export/exports.js +++ /dev/null @@ -1,14 +0,0 @@ -import { version } from 'vue' - -export const getVueVersion = () => version - -export const getVersion = () => { - const version = 'version' - return version -} - -const _getVueVersion = () => { - return version -} - -export { _getVueVersion } diff --git a/__tests__/fixtures/name-export/main.js b/__tests__/fixtures/name-export/main.js deleted file mode 100644 index 3e23d5c..0000000 --- a/__tests__/fixtures/name-export/main.js +++ /dev/null @@ -1,7 +0,0 @@ -import { getVueVersion, _getVueVersion, getVersion } from './exports' - -console.log(getVueVersion()) - -console.log(_getVueVersion()) - -console.log(getVersion()) diff --git a/__tests__/inject.spec.ts b/__tests__/inject.spec.ts index fe8bcdb..0fb393f 100644 --- a/__tests__/inject.spec.ts +++ b/__tests__/inject.spec.ts @@ -1,64 +1,22 @@ import test from 'ava' -import { len } from '../src/shared' -import { createInjectScript } from '../src/inject' -import type { IIFEModuleInfo } from '../src/interface' +import { len } from '../dist/shared' +import { createInjectScript } from '../dist/inject' +import { jsdelivr } from '../dist/url' +import type { TrackModule } from '../dist/interface' -test('inject mode auto', (t) => { - const modules: Record = { - fake: { - name: 'fake', - jsdelivr: undefined, - unpkg: 'fake.js', - version: '0.0.0' - } - } - const inject = createInjectScript(modules, Object.keys(modules), 'auto') - t.is(inject.toTags()[0], '') -}) - -test('inject mode jsdelivr', (t) => { - const modules: Record = { - fake: { - name: 'fake', - jsdelivr: 'fake.js', - unpkg: 'fake.js', - version: '0.0.0' - } - } - const inject = createInjectScript(modules, Object.keys(modules), 'jsdelivr') - t.is(inject.toTags()[0], '') -}) - -test('inject mode unpkg', (t) => { - const modules: Record = { - fake: { - name: 'fake', - jsdelivr: 'fake.js', - unpkg: 'fake.js', - version: '0.0.0' - } - } - const inject = createInjectScript(modules, Object.keys(modules), 'unpkg') - t.is(inject.toTags()[0], '') -}) +interface MockIIFEMdoule extends TrackModule{ + relativeModule: string + version: string +} -test('inject with spare', (t) => { - const modules: Record = { - fake: { - name: 'fake', - jsdelivr: 'fake.js', - unpkg: 'fake.js', - version: '0.0.0' - }, - fakeUI: { - name: 'fakeUI', - jsdelivr: 'ui.js', - unpkg: 'ui.js', - spare: ['ui.css', 'theme.css', 'ui2.js'], - version: '1.0.0' - } - } - const inject = createInjectScript(modules, Object.keys(modules), 'auto') - t.is(len(inject.toTags()), 5) - t.is(len(inject.toTags().filter((s) => s.startsWith(' { + const modules:Map = new Map() + modules.set('fake', { + relativeModule: 'fake.js', + version: '0.0.0.', + name: 'fake', + spare: ['fake.css', 'fake2.css', 'fake2.js'] + }) + const injectScript = createInjectScript(modules, jsdelivr) + t.is(len(injectScript.toTags()), 4) }) diff --git a/__tests__/plugin.spec.ts b/__tests__/plugin.spec.ts deleted file mode 100644 index 3aa6f93..0000000 --- a/__tests__/plugin.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import test from 'ava' -import fsp from 'fs/promises' -import path from 'path' -import { build } from 'vite' -import { cdn } from '../dist' -import { getId, sleep } from '../internal/shared' -import type { CDNPluginOptions } from '../dist' - -const defaultWd = __dirname -const dist = path.join(defaultWd, 'dist') - -export async function mockBuild(dir: string, pluginOptions: CDNPluginOptions = {}) { - const id = getId() - await build({ - root: path.join(defaultWd, 'fixtures', dir), - build: { - outDir: path.join(dist, `${dir}-${id}`) - }, - plugins: [cdn(pluginOptions)], - configFile: false, - logLevel: 'silent' - }) - await sleep(5000) - return id -} - -test.after(async () => { - await fsp.rm(dist, { recursive: true }) -}) - -test('plugin importer case', async (t) => { - await mockBuild('importer', { modules: ['vue'] }) - t.pass() -}) - -test('plugin exporter case', async (t) => { - await mockBuild('exporter', { modules: ['vue'] }) - t.pass() -}) - -test('plugin named exporter case', async (t) => { - await mockBuild('name-export', { modules: ['vue'] }) - t.pass() -}) diff --git a/__tests__/scanner.spec.ts b/__tests__/scanner.spec.ts index d34b412..4457d0f 100644 --- a/__tests__/scanner.spec.ts +++ b/__tests__/scanner.spec.ts @@ -1,12 +1,16 @@ import test from 'ava' -import { createScanner } from '../dist' +import { createScanner } from '../dist/scanner' -async function expectScannerTest() { + +test('scanner dependencies', async (t) => { const scanner = createScanner(['vue']) await scanner.scanAllDependencies() - test('scanner dependencies', (t) => { - t.deepEqual(scanner.dependModuleNames, ['vue']) - }) -} + t.is(scanner.dependencies.has('vue'), true) +}) -expectScannerTest() +test('scanner failed', async (t) => { + const scanner = createScanner(['vue', 'react']) + await scanner.scanAllDependencies() + t.is(scanner.failedModule.has('react'), true) + t.is(scanner.dependencies.has('vue'), true) +}) diff --git a/__tests__/shared.spec.ts b/__tests__/shared.spec.ts new file mode 100644 index 0000000..35f08f1 --- /dev/null +++ b/__tests__/shared.spec.ts @@ -0,0 +1,17 @@ +import test from 'ava' +import fsp from 'fs/promises' +import { lookup, len } from '../dist/shared' + + +test('len', (t) => { + t.is(len('123'), 3) + t.is(len([1, 2, 3, 4, 5]), 5) +}) + +test('lookup', async (t) => { + const modulePath = require.resolve('vue') + const file = lookup(modulePath, 'package.json') + const s = await fsp.readFile(file, 'utf8') + const p = JSON.parse(s) + t.is(typeof p === 'object', true) +}) diff --git a/__tests__/vm.spec.ts b/__tests__/vm.spec.ts new file mode 100644 index 0000000..a28b4c7 --- /dev/null +++ b/__tests__/vm.spec.ts @@ -0,0 +1,32 @@ +import test from 'ava' +import { MAX_CONCURRENT, createConcurrentQueue, createVM } from '../dist/vm' + +test('native vm', async (t) => { + const vm = createVM() + await vm.run('var nonzzz = \'test plugin\'', { name: 'nonzzz' }) + t.is(vm.bindings.has('nonzzz'), true) +}) + +test('shadow vm', async (t) => { + const vm = createVM() + await vm.run('window.nonzzz = 123', { name: 'nonzzz' }) + t.is(vm.bindings.has('nonzzz'), true) +}) + +test('throw error in vm', async (t) => { + const vm = createVM() + await vm.run('throw new Error(\'error\')', { name: 'nonzzz' }, (err) => { + t.is(err?.message, 'nonzzz') + }) +}) + +test('task queue', async (t) => { + const tasks = [() => Promise.resolve(1), () => Promise.resolve(2), () => Promise.reject(new Error('3'))] + + const queue = createConcurrentQueue(MAX_CONCURRENT) + for (const task of tasks) { + queue.enqueue(task) + } + const err = await t.throwsAsync(queue.wait()) + t.is(err?.message, '3') +}) diff --git a/bump.config.ts b/bump.config.ts index 8debb9e..d490dea 100644 --- a/bump.config.ts +++ b/bump.config.ts @@ -4,7 +4,7 @@ import json from '@rollup/plugin-json' export default define({ input: 'src/index.ts', - output: { dts: true, exports: 'named' }, + output: { dts: true, exports: 'named', preserveModules: true }, plugins: [cleanUp({ extensions: ['.ts'] }), json()] }) diff --git a/docs/Background.md b/docs/Background.md new file mode 100644 index 0000000..8c341f2 --- /dev/null +++ b/docs/Background.md @@ -0,0 +1,48 @@ +# Background + +`vite-plugin-cdn2` is a vite plugin that can replace `vite-plugin-cdn`,`vite-plugin-cdn2` or others same as package. + +## Principles + +### Cover as many scenes as possible + +Un like other plugins. `vite-plugin-cdn2` can cover as many scenes as possbile. Such as `export * from 'module'` + +### Friendy Options + +If you are using `vite-plugin-cdn-import` you may write the follow option look like: + +```js + +import importToCDN from 'vite-plugin-cdn-import' + +importToCDN({modules: [{ name: 'react', var: 'React' , path: 'umd/react.production.min.js' }] }) + +``` + +But now when you migrate to `vite-plugin-cdn2`, you only need + + +```js + +import { cdn } from 'vite-plugin-cdn2' + +cdn({modules: ['react'] }) + +``` + +## Tradeoffs + +### Don't support dynamic import + +```js + +async function dynamicImport () { + const react = import('react') + return react +} + + +``` + +In most of case, we won't use dynamic import to introduce some libraries. \ No newline at end of file diff --git a/docs/How-it-works.md b/docs/How-it-works.md new file mode 100644 index 0000000..cd5c3f0 --- /dev/null +++ b/docs/How-it-works.md @@ -0,0 +1,59 @@ +# How it works + +None of this is needed to use the library, it's purely for understanding how it works. + +## Scanner Modules + +To be able to generate `modules`. `vite-plugin-cdn2` will create a scanner at `configResolved` hook. It' will create a new threads to record +the package infomation.(So your local environment need support threads). + + +### Input + +```js + +const s = ['vue'] + +``` + +### Output + +```js + +const s = { + vue: { + name: 'vue', + global: 'Vue', + // ... other info + } +} + +``` + +## Transform + +The reason to `vite-plugin-cdn2` can support `export * from 'module'` is because that scanner stage can record all of the package bindings.(All export function or variable). + +### Input + +```js + +export * from 'vue' +export const ref = 1 + +``` + +### Output + + +```js + +export const { onMounted: Vue.onMounted, .... } = Vue // ingored ref because it was been rewrite + +export const ref = 1 + +``` + +## Binding Source + +all of url will generate html element and binding it at `transformIndexHtml` \ No newline at end of file diff --git a/e2e/e2e.ts b/e2e/e2e.ts new file mode 100644 index 0000000..97a096e --- /dev/null +++ b/e2e/e2e.ts @@ -0,0 +1,110 @@ +import path from 'path' +import fsp from 'fs/promises' +import fs from 'fs' +import http from 'http' +import test from 'ava' +import { chromium } from 'playwright' +import { cdn } from '../dist' + +import type { Page } from 'playwright' +import type { Vite2Instance } from './vite2/interface' +import type { Vite3Instance } from './vite3/interface' +import type { Vite4Instance } from './vite4/interface' + +type ViteInstance = Vite2Instance | Vite3Instance | Vite4Instance + +export interface TestOptions { + vite: ViteInstance + pluginOption?: Parameters[number], + plugins: any[] +} + + +type Server = http.Server & { + ip: string +} + +const defaultWd = __dirname + +function prepareAssets(taskName:string, options:TestOptions) { + const { vite, pluginOption = {}, plugins } = options + vite.build({ + root: defaultWd, + build: { + outDir: path.join(defaultWd, 'dist', taskName) + }, + logLevel: 'silent', + plugins: [...plugins, cdn(pluginOption) as any] + }) +} + +function createGetter(obj: T, key: string, getter: ()=>unknown) { + Object.defineProperty(obj, key, { + get: getter + }) +} + +async function createChromeBrowser(server: Server) { + const browser = await chromium.launch() + const page = await browser.newPage() + const localUrl = server.ip + page.goto(localUrl) + + return { page } +} + +function createServer(taskName: string) { + const server = http.createServer() + const mime = { + '.html': 'text/html', + '.css': 'text/css', + '.js': 'text/javascript' + } + const handleRequest = async (req: http.IncomingMessage, res: http.ServerResponse) => { + const fullPath = + req.url === '/' + ? path.join(defaultWd, 'dist', taskName, 'index.html') + : path.join(defaultWd, 'dist', taskName, req.url) + + try { + const file = await fsp.stat(fullPath) + if (file.isFile()) { + const contentType = mime[path.extname(fullPath)] || 'text/plain' + const readStream = fs.createReadStream(fullPath) + res.setHeader('Content-Type', contentType) + res.statusCode = 200 + readStream.pipe(res) + return + } + } catch (error) { + res.statusCode = 404 + res.end(`404 Not Found: ${req.url}`) + } + } + server.on('request', handleRequest) + createGetter(server, 'ip', () => { + const address = server.address() + if (typeof address === 'string') return address + return `http://127.0.0.1:${address.port}` + }) + server.listen(0) + return { server: server as Server } +} + +async function expectTestCase(taskName: string, page: Awaited) { + const expect1 = new Promise(resolve => { + page.on('console', (message) => { + resolve(message.type()) + }) + }) + + test(`${taskName} cdn load`, async (t) => t.is(await expect1, 'info')) +} + +export async function runTest(taskName:string, options: TestOptions) { + await prepareAssets(taskName, options) + await new Promise((resolve) => setTimeout(resolve, 5000)) + const { server } = createServer(taskName) + const { page } = await createChromeBrowser(server) + await expectTestCase(taskName, page) +} diff --git a/e2e/fixture/app.vue b/e2e/fixture/app.vue new file mode 100644 index 0000000..47e9cf8 --- /dev/null +++ b/e2e/fixture/app.vue @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/e2e/fixture/main.js b/e2e/fixture/main.js new file mode 100644 index 0000000..e6bdf5e --- /dev/null +++ b/e2e/fixture/main.js @@ -0,0 +1,4 @@ +import { createApp } from 'vue' +import Application from './app.vue' + +createApp(Application) diff --git a/__tests__/fixtures/name-export/index.html b/e2e/index.html similarity index 79% rename from __tests__/fixtures/name-export/index.html rename to e2e/index.html index 637d96c..562b91d 100644 --- a/__tests__/fixtures/name-export/index.html +++ b/e2e/index.html @@ -8,6 +8,6 @@
- + \ No newline at end of file diff --git a/e2e/package.json b/e2e/package.json new file mode 100644 index 0000000..87af195 --- /dev/null +++ b/e2e/package.json @@ -0,0 +1,7 @@ +{ + "name": "vite-plugin-compression2-e2e", + "private": "true", + "scripts": { + "installer": "yarn --cwd vite2 && yarn --cwd vite3 && yarn --cwd vite4" + } +} \ No newline at end of file diff --git a/e2e/vite2/e2e.spec.ts b/e2e/vite2/e2e.spec.ts new file mode 100644 index 0000000..7401b2a --- /dev/null +++ b/e2e/vite2/e2e.spec.ts @@ -0,0 +1,14 @@ +import vue from '@vitejs/plugin-vue' +import { name } from './package.json' +import { runTest } from '../e2e' + +export default (async function () { + const vite = await import('vite') + runTest(name, { + vite, + pluginOption: { + modules: ['vue'] + }, + plugins: [vue()] + }) +})() diff --git a/e2e/vite2/interface.ts b/e2e/vite2/interface.ts new file mode 100644 index 0000000..5cfffb4 --- /dev/null +++ b/e2e/vite2/interface.ts @@ -0,0 +1 @@ +export type Vite2Instance = typeof import('vite') diff --git a/e2e/vite2/package.json b/e2e/vite2/package.json new file mode 100644 index 0000000..5905c12 --- /dev/null +++ b/e2e/vite2/package.json @@ -0,0 +1,8 @@ +{ + "name": "vite-plugin-cdn2-e2e-vite2", + "private": "true", + "dependencies": { + "vite": "^2", + "@vitejs/plugin-vue": "^2.3.4" + } +} \ No newline at end of file diff --git a/e2e/vite2/yarn.lock b/e2e/vite2/yarn.lock new file mode 100644 index 0000000..620e1cc --- /dev/null +++ b/e2e/vite2/yarn.lock @@ -0,0 +1,226 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@esbuild/linux-loong64@0.14.54": + version "0.14.54" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" + integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== + +"@vitejs/plugin-vue@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz#966a6279060eb2d9d1a02ea1a331af071afdcf9e" + integrity sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg== + +esbuild-android-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" + integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== + +esbuild-android-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" + integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== + +esbuild-darwin-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" + integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== + +esbuild-darwin-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" + integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== + +esbuild-freebsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" + integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== + +esbuild-freebsd-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" + integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== + +esbuild-linux-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" + integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== + +esbuild-linux-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" + integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== + +esbuild-linux-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" + integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== + +esbuild-linux-arm@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" + integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== + +esbuild-linux-mips64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" + integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== + +esbuild-linux-ppc64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" + integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== + +esbuild-linux-riscv64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" + integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== + +esbuild-linux-s390x@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" + integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== + +esbuild-netbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" + integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== + +esbuild-openbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" + integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== + +esbuild-sunos-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" + integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== + +esbuild-windows-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" + integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== + +esbuild-windows-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" + integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== + +esbuild-windows-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" + integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== + +esbuild@^0.14.27: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" + integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== + optionalDependencies: + "@esbuild/linux-loong64" "0.14.54" + esbuild-android-64 "0.14.54" + esbuild-android-arm64 "0.14.54" + esbuild-darwin-64 "0.14.54" + esbuild-darwin-arm64 "0.14.54" + esbuild-freebsd-64 "0.14.54" + esbuild-freebsd-arm64 "0.14.54" + esbuild-linux-32 "0.14.54" + esbuild-linux-64 "0.14.54" + esbuild-linux-arm "0.14.54" + esbuild-linux-arm64 "0.14.54" + esbuild-linux-mips64le "0.14.54" + esbuild-linux-ppc64le "0.14.54" + esbuild-linux-riscv64 "0.14.54" + esbuild-linux-s390x "0.14.54" + esbuild-netbsd-64 "0.14.54" + esbuild-openbsd-64 "0.14.54" + esbuild-sunos-64 "0.14.54" + esbuild-windows-32 "0.14.54" + esbuild-windows-64 "0.14.54" + esbuild-windows-arm64 "0.14.54" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +postcss@^8.4.13: + version "8.4.24" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +resolve@^1.22.0: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +"rollup@>=2.59.0 <2.78.0": + version "2.77.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12" + integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== + optionalDependencies: + fsevents "~2.3.2" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +vite@^2: + version "2.9.16" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.16.tgz#daf7ba50f5cc37a7bf51b118ba06bc36e97898e9" + integrity sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA== + dependencies: + esbuild "^0.14.27" + postcss "^8.4.13" + resolve "^1.22.0" + rollup ">=2.59.0 <2.78.0" + optionalDependencies: + fsevents "~2.3.2" diff --git a/e2e/vite3/e2e.spec.ts b/e2e/vite3/e2e.spec.ts new file mode 100644 index 0000000..7401b2a --- /dev/null +++ b/e2e/vite3/e2e.spec.ts @@ -0,0 +1,14 @@ +import vue from '@vitejs/plugin-vue' +import { name } from './package.json' +import { runTest } from '../e2e' + +export default (async function () { + const vite = await import('vite') + runTest(name, { + vite, + pluginOption: { + modules: ['vue'] + }, + plugins: [vue()] + }) +})() diff --git a/e2e/vite3/interface.ts b/e2e/vite3/interface.ts new file mode 100644 index 0000000..9e8cec5 --- /dev/null +++ b/e2e/vite3/interface.ts @@ -0,0 +1 @@ +export type Vite3Instance = typeof import('vite') diff --git a/e2e/vite3/package.json b/e2e/vite3/package.json new file mode 100644 index 0000000..c11e685 --- /dev/null +++ b/e2e/vite3/package.json @@ -0,0 +1,8 @@ +{ + "name": "vite-plugin-cdn2-e2e-vite3", + "private": "true", + "dependencies": { + "vite": "^3", + "@vitejs/plugin-vue": "^3.2.0" + } +} \ No newline at end of file diff --git a/e2e/vite3/yarn.lock b/e2e/vite3/yarn.lock new file mode 100644 index 0000000..eab549b --- /dev/null +++ b/e2e/vite3/yarn.lock @@ -0,0 +1,232 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@esbuild/android-arm@0.15.18": + version "0.15.18" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80" + integrity sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw== + +"@esbuild/linux-loong64@0.15.18": + version "0.15.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz#128b76ecb9be48b60cf5cfc1c63a4f00691a3239" + integrity sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ== + +"@vitejs/plugin-vue@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz#a1484089dd85d6528f435743f84cdd0d215bbb54" + integrity sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw== + +esbuild-android-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz#20a7ae1416c8eaade917fb2453c1259302c637a5" + integrity sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA== + +esbuild-android-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz#9cc0ec60581d6ad267568f29cf4895ffdd9f2f04" + integrity sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ== + +esbuild-darwin-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz#428e1730ea819d500808f220fbc5207aea6d4410" + integrity sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg== + +esbuild-darwin-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz#b6dfc7799115a2917f35970bfbc93ae50256b337" + integrity sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA== + +esbuild-freebsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz#4e190d9c2d1e67164619ae30a438be87d5eedaf2" + integrity sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA== + +esbuild-freebsd-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz#18a4c0344ee23bd5a6d06d18c76e2fd6d3f91635" + integrity sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA== + +esbuild-linux-32@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz#9a329731ee079b12262b793fb84eea762e82e0ce" + integrity sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg== + +esbuild-linux-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz#532738075397b994467b514e524aeb520c191b6c" + integrity sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw== + +esbuild-linux-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz#5372e7993ac2da8f06b2ba313710d722b7a86e5d" + integrity sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug== + +esbuild-linux-arm@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz#e734aaf259a2e3d109d4886c9e81ec0f2fd9a9cc" + integrity sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA== + +esbuild-linux-mips64le@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz#c0487c14a9371a84eb08fab0e1d7b045a77105eb" + integrity sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ== + +esbuild-linux-ppc64le@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz#af048ad94eed0ce32f6d5a873f7abe9115012507" + integrity sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w== + +esbuild-linux-riscv64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz#423ed4e5927bd77f842bd566972178f424d455e6" + integrity sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg== + +esbuild-linux-s390x@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz#21d21eaa962a183bfb76312e5a01cc5ae48ce8eb" + integrity sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ== + +esbuild-netbsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz#ae75682f60d08560b1fe9482bfe0173e5110b998" + integrity sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg== + +esbuild-openbsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz#79591a90aa3b03e4863f93beec0d2bab2853d0a8" + integrity sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ== + +esbuild-sunos-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz#fd528aa5da5374b7e1e93d36ef9b07c3dfed2971" + integrity sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw== + +esbuild-windows-32@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz#0e92b66ecdf5435a76813c4bc5ccda0696f4efc3" + integrity sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ== + +esbuild-windows-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz#0fc761d785414284fc408e7914226d33f82420d0" + integrity sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw== + +esbuild-windows-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz#5b5bdc56d341d0922ee94965c89ee120a6a86eb7" + integrity sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ== + +esbuild@^0.15.9: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.18.tgz#ea894adaf3fbc036d32320a00d4d6e4978a2f36d" + integrity sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q== + optionalDependencies: + "@esbuild/android-arm" "0.15.18" + "@esbuild/linux-loong64" "0.15.18" + esbuild-android-64 "0.15.18" + esbuild-android-arm64 "0.15.18" + esbuild-darwin-64 "0.15.18" + esbuild-darwin-arm64 "0.15.18" + esbuild-freebsd-64 "0.15.18" + esbuild-freebsd-arm64 "0.15.18" + esbuild-linux-32 "0.15.18" + esbuild-linux-64 "0.15.18" + esbuild-linux-arm "0.15.18" + esbuild-linux-arm64 "0.15.18" + esbuild-linux-mips64le "0.15.18" + esbuild-linux-ppc64le "0.15.18" + esbuild-linux-riscv64 "0.15.18" + esbuild-linux-s390x "0.15.18" + esbuild-netbsd-64 "0.15.18" + esbuild-openbsd-64 "0.15.18" + esbuild-sunos-64 "0.15.18" + esbuild-windows-32 "0.15.18" + esbuild-windows-64 "0.15.18" + esbuild-windows-arm64 "0.15.18" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +postcss@^8.4.18: + version "8.4.24" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +resolve@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rollup@^2.79.1: + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +vite@^3: + version "3.2.7" + resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.7.tgz#35a62826bd4d6b778ae5db8766d023bcd4e7bef3" + integrity sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g== + dependencies: + esbuild "^0.15.9" + postcss "^8.4.18" + resolve "^1.22.1" + rollup "^2.79.1" + optionalDependencies: + fsevents "~2.3.2" diff --git a/e2e/vite4/e2e.spec.ts b/e2e/vite4/e2e.spec.ts new file mode 100644 index 0000000..7401b2a --- /dev/null +++ b/e2e/vite4/e2e.spec.ts @@ -0,0 +1,14 @@ +import vue from '@vitejs/plugin-vue' +import { name } from './package.json' +import { runTest } from '../e2e' + +export default (async function () { + const vite = await import('vite') + runTest(name, { + vite, + pluginOption: { + modules: ['vue'] + }, + plugins: [vue()] + }) +})() diff --git a/e2e/vite4/interface.ts b/e2e/vite4/interface.ts new file mode 100644 index 0000000..3ddd895 --- /dev/null +++ b/e2e/vite4/interface.ts @@ -0,0 +1 @@ +export type Vite4Instance = typeof import('vite') diff --git a/e2e/vite4/package.json b/e2e/vite4/package.json new file mode 100644 index 0000000..1b97297 --- /dev/null +++ b/e2e/vite4/package.json @@ -0,0 +1,8 @@ +{ + "name": "vite-plugin-cdn2-e2e-vite4", + "private": "true", + "dependencies": { + "vite": "^4", + "@vitejs/plugin-vue":"^4.2.3" + } +} \ No newline at end of file diff --git a/e2e/vite4/yarn.lock b/e2e/vite4/yarn.lock new file mode 100644 index 0000000..3957ca6 --- /dev/null +++ b/e2e/vite4/yarn.lock @@ -0,0 +1,193 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@esbuild/android-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" + integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== + +"@esbuild/android-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" + integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== + +"@esbuild/android-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" + integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== + +"@esbuild/darwin-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" + integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== + +"@esbuild/darwin-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" + integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== + +"@esbuild/freebsd-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" + integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== + +"@esbuild/freebsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" + integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== + +"@esbuild/linux-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" + integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== + +"@esbuild/linux-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" + integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== + +"@esbuild/linux-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" + integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== + +"@esbuild/linux-loong64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" + integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== + +"@esbuild/linux-mips64el@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" + integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== + +"@esbuild/linux-ppc64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" + integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== + +"@esbuild/linux-riscv64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" + integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== + +"@esbuild/linux-s390x@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" + integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== + +"@esbuild/linux-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" + integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== + +"@esbuild/netbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" + integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== + +"@esbuild/openbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" + integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== + +"@esbuild/sunos-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" + integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== + +"@esbuild/win32-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" + integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== + +"@esbuild/win32-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" + integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== + +"@esbuild/win32-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" + integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== + +"@vitejs/plugin-vue@^4.2.3": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz#ee0b6dfcc62fe65364e6395bf38fa2ba10bb44b6" + integrity sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw== + +esbuild@^0.17.5: + version "0.17.19" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" + integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== + optionalDependencies: + "@esbuild/android-arm" "0.17.19" + "@esbuild/android-arm64" "0.17.19" + "@esbuild/android-x64" "0.17.19" + "@esbuild/darwin-arm64" "0.17.19" + "@esbuild/darwin-x64" "0.17.19" + "@esbuild/freebsd-arm64" "0.17.19" + "@esbuild/freebsd-x64" "0.17.19" + "@esbuild/linux-arm" "0.17.19" + "@esbuild/linux-arm64" "0.17.19" + "@esbuild/linux-ia32" "0.17.19" + "@esbuild/linux-loong64" "0.17.19" + "@esbuild/linux-mips64el" "0.17.19" + "@esbuild/linux-ppc64" "0.17.19" + "@esbuild/linux-riscv64" "0.17.19" + "@esbuild/linux-s390x" "0.17.19" + "@esbuild/linux-x64" "0.17.19" + "@esbuild/netbsd-x64" "0.17.19" + "@esbuild/openbsd-x64" "0.17.19" + "@esbuild/sunos-x64" "0.17.19" + "@esbuild/win32-arm64" "0.17.19" + "@esbuild/win32-ia32" "0.17.19" + "@esbuild/win32-x64" "0.17.19" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +postcss@^8.4.23: + version "8.4.24" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +rollup@^3.21.0: + version "3.26.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.26.0.tgz#9f2e0316a4ca641911cefd8515c562a9124e6130" + integrity sha512-YzJH0eunH2hr3knvF3i6IkLO/jTjAEwU4HoMUbQl4//Tnl3ou0e7P5SjxdDr8HQJdeUJShlbEHXrrnEHy1l7Yg== + optionalDependencies: + fsevents "~2.3.2" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +vite@^4: + version "4.3.9" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.9.tgz#db896200c0b1aa13b37cdc35c9e99ee2fdd5f96d" + integrity sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg== + dependencies: + esbuild "^0.17.5" + postcss "^8.4.23" + rollup "^3.21.0" + optionalDependencies: + fsevents "~2.3.2" diff --git a/example/src/api.js b/example/src/api.js index 0e10933..7e64172 100644 --- a/example/src/api.js +++ b/example/src/api.js @@ -1,2 +1,6 @@ export { ref as default, onMounted, watchEffect } from 'vue' export * as vue from 'vue' + +export * from 'vue' + +export const version = 'my version' diff --git a/example/src/app.vue b/example/src/app.vue index f437591..26c16a5 100644 --- a/example/src/app.vue +++ b/example/src/app.vue @@ -13,7 +13,7 @@ import { defineComponent } from 'vue' import axios from 'axios' import { useCounterStore } from './counter' -import ref, { onMounted } from './api' +import ref, { onMounted, version } from './api' export default defineComponent({ setup() { @@ -22,6 +22,7 @@ export default defineComponent({ onMounted(() => { console.log('hello world') + console.log(version) }) const clickHandler = () => { diff --git a/example/vite.config.js b/example/vite.config.js index 4842db9..ae3d189 100644 --- a/example/vite.config.js +++ b/example/vite.config.js @@ -5,6 +5,7 @@ import Components from 'unplugin-vue-components/vite' import { cdn } from 'vite-plugin-cdn2' import Inspect from 'vite-plugin-inspect' + export default defineConfig(({ command }) => { return { plugins: [ diff --git a/example/yarn.lock b/example/yarn.lock index b4c2b21..a862646 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -2,16 +2,205 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@antfu/utils@^0.7.2": version "0.7.2" resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.7.2.tgz#3bb6f37a6b188056fe9e2f363b6aa735ed65d7ca" integrity sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g== +"@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" + integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== + +"@babel/core@^7.22.5": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.6.tgz#aafafbe86e9a1679d876b99dc46382964ef72494" + integrity sha512-HPIyDa6n+HKw5dEuway3vVAhBboYCtREBMp+IWeseZy6TFtzn6MHkCH2KKYUOC/vKKwgSMHQW4htBOrmuRPXfw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.6" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + +"@babel/generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" + integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" + integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-validator-option" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + browserslist "^4.21.9" + lru-cache "^5.1.1" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.16.4": version "7.21.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== +"@babel/parser@^7.22.5", "@babel/parser@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.6.tgz#201f8b47be20c76c7c5743b9c16129760bf9a975" + integrity sha512-EIQu22vNkceq3LbjAq7knDf/UmtI2qbcNI8GRBlijez6TpQLvSodJPYfydQmNA5buwkxxxa/PVI44jjYZ+/cLw== + +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.6.tgz#8f2f83a5c588251584914debeee38f35f661a300" + integrity sha512-53CijMvKlLIDlOTrdWiHileRddlIiwUIyCKqYa7lYnnPldXCG5dUSN38uT0cA6i7rHWNKJLH0VU/Kxdr1GzB3w== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.6" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + "@esbuild/android-arm64@0.17.18": version "0.17.18" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz#4aa8d8afcffb4458736ca9b32baa97d7cb5861ea" @@ -122,11 +311,48 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz#3a8e57153905308db357fd02f57c180ee3a0a1fa" integrity sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg== -"@jridgewell/sourcemap-codec@^1.4.13": +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -385,6 +611,13 @@ acorn@^8.8.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -436,6 +669,16 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" +browserslist@^4.21.9: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + dependencies: + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -449,11 +692,25 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.2" +caniuse-lite@^1.0.30001503: + version "1.0.30001512" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz#7450843fb581c39f290305a83523c7a9ef0d4cb4" + integrity sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw== + caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -469,6 +726,18 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + combined-stream@^1.0.6, combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -486,6 +755,11 @@ concat-stream@^1.6.0, concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -506,7 +780,7 @@ dayjs@^1.10.4: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@^4.3.4: +debug@^4.1.0, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -518,16 +792,16 @@ decimal.js@^10.2.1: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +electron-to-chromium@^1.4.431: + version "1.4.450" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.450.tgz#df232c961ee9bf4e8980f86e96a6e9f291720138" + integrity sha512-BLG5HxSELlrMx7dJ2s+8SFlsCtJp37Zpk2VAxyC6CZtbc+9AJeZHfYHbrlSgdXp6saQ8StMqOTEDaBKgA7u1sw== + esbuild@^0.17.5: version "0.17.18" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.18.tgz#f4f8eb6d77384d68cd71c53eb6601c7efe05e746" @@ -556,38 +830,21 @@ esbuild@^0.17.5: "@esbuild/win32-ia32" "0.17.18" "@esbuild/win32-x64" "0.17.18" -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - fast-glob@^3.2.12: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -599,11 +856,6 @@ fast-glob@^3.2.12: merge2 "^1.3.0" micromatch "^4.0.4" -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -660,6 +912,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + get-intrinsic@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" @@ -681,6 +938,11 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -699,6 +961,11 @@ happy-dom@^6.0.4: whatwg-encoding "^2.0.0" whatwg-mimetype "^3.0.0" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -781,6 +1048,21 @@ isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -790,19 +1072,18 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - local-pkg@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + magic-string@^0.25.7: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" @@ -810,13 +1091,6 @@ magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -magic-string@^0.26.4: - version "0.26.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" - integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== - dependencies: - sourcemap-codec "^1.4.8" - magic-string@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529" @@ -878,6 +1152,11 @@ node-fetch@^2.x.x: dependencies: whatwg-url "^5.0.0" +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -888,18 +1167,6 @@ object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - parse-cache-control@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" @@ -937,11 +1204,6 @@ postcss@^8.1.10, postcss@^8.4.23: picocolors "^1.0.0" source-map-js "^1.0.2" -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -1067,7 +1329,7 @@ source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -1084,6 +1346,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -1122,6 +1391,11 @@ then-request@^6.0.0: promise "^8.0.0" qs "^6.4.0" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1139,13 +1413,6 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -1182,19 +1449,26 @@ unplugin@^1.1.0: webpack-sources "^3.2.3" webpack-virtual-modules "^0.5.0" +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== "vite-plugin-cdn2@file:..": - version "0.5.0" + version "0.5.1" dependencies: + "@babel/core" "^7.22.5" "@rollup/pluginutils" "^5.0.2" "@types/estree" "^1.0.1" - escodegen "^2.0.0" happy-dom "^6.0.4" - magic-string "^0.26.4" rs-module-lexer "^1.0.0" vite-plugin-inspect@^0.7.26: @@ -1276,7 +1550,7 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== diff --git a/global.d.ts b/global.d.ts deleted file mode 100644 index 0026dda..0000000 --- a/global.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -interface Loc { - start: number - end: number -} - -declare module 'estree' { - // eslint-disable-next-line @typescript-eslint/no-empty-interface - interface Identifier extends Loc {} - // eslint-disable-next-line @typescript-eslint/no-empty-interface - interface ExportNamedDeclaration extends Loc {} - // eslint-disable-next-line @typescript-eslint/no-empty-interface - interface ExportAllDeclaration extends Loc {} - // eslint-disable-next-line @typescript-eslint/no-empty-interface - interface ImportDeclaration extends Loc {} - // eslint-disable-next-line @typescript-eslint/no-empty-interface - interface FunctionDeclaration extends Loc {} - // eslint-disable-next-line @typescript-eslint/no-empty-interface - interface VariableDeclaration extends Loc {} - // eslint-disable-next-line @typescript-eslint/no-empty-interface - interface ClassDeclaration extends Loc {} -} - -export {} diff --git a/internal/shared.ts b/internal/shared.ts deleted file mode 100644 index a692238..0000000 --- a/internal/shared.ts +++ /dev/null @@ -1,7 +0,0 @@ -export function sleep(delay: number) { - return new Promise((resolve) => setTimeout(resolve, delay)) -} - -export function getId() { - return Math.random().toString(32).slice(2, 10) -} diff --git a/package.json b/package.json index e9bc4f1..523a6c3 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,11 @@ "types": "dist/index.d.ts", "scripts": { "build": "bump", - "test": "ava __tests__/*.spec.ts", + "test": "c8 -r=lcov ava __tests__/code-gen.spec.ts", "lint": "eslint . --fix", "dev": "bump -w", - "coverage": "c8 -r=lcov ava" + "prepare:e2e": "cd e2e && npm run installer", + "e2e": "ava e2e/**/*.spec.ts" }, "keywords": [ "vite", @@ -23,6 +24,18 @@ "README.md", "LICENSE" ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + }, + "./url": { + "import": "./dist/url.mjs", + "require": "./dist/url.js" + }, + "./*": "./*" + }, "author": "Kanno", "license": "MIT", "homepage": "https://github.com/nonzzz/vite-plugin-cdn", @@ -35,11 +48,13 @@ }, "devDependencies": { "@rollup/plugin-json": "^6.0.0", + "@types/babel__core": "^7.20.1", "ava": "^5.2.0", "c8": "^7.12.0", "eslint": "^8.23.1", "eslint-config-kagura": "^1.1.0", "no-bump": "^0.7.1", + "playwright": "^1.35.1", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-dts": "^5.0.0", "ts-node": "^10.9.1", @@ -48,16 +63,16 @@ "vue": "^3.2.47" }, "dependencies": { + "@babel/core": "^7.22.5", "@rollup/pluginutils": "^5.0.2", "@types/estree": "^1.0.1", - "escodegen": "^2.0.0", "happy-dom": "^6.0.4", - "magic-string": "^0.26.4", "rs-module-lexer": "^1.0.0" }, "ava": { "files": [ - "__tests__/*.spec.ts" + "__tests__/*.spec.ts", + "e2e/**/*.spec.ts" ], "extensions": [ "ts" diff --git a/src/ast.ts b/src/ast.ts deleted file mode 100644 index 29c225d..0000000 --- a/src/ast.ts +++ /dev/null @@ -1,203 +0,0 @@ -// refer https://astexplorer.net/ -import type { AttachedScope } from '@rollup/pluginutils' -import type { Node as EsNode } from 'estree' - -export type Node = EsNode & { - scope?: AttachedScope -} - -export interface LocRange { - start:number -} - - -// es-walker is implement from https://github.com/Rich-Harris/estree-walker -// MIT LICENSE - -export interface WalkerContext { - skip: () => void - remove: () => void - replace: (node: Node) => void -} -type WalkerHandler = ( - this: WalkerContext, - node: Node, - parentNode: Node | null, - key: string | number | symbol | null | undefined, - index: number | null | undefined -) => void - -interface WalkOptions { - enter?: WalkerHandler - leave?: WalkerHandler -} - -function isNode(value): value is Node { - return value !== null && typeof value === 'object' && 'type' in value && typeof value.type === 'string' -} - -class Walker { - should_skip: boolean - should_remove: boolean - replacement: Node | null - context: WalkerContext - enter: WalkerHandler - leave: WalkerHandler - constructor(handle: WalkOptions = {}) { - this.should_skip = false - this.should_remove = false - this.replacement = null - this.enter = handle.enter - this.leave = handle.leave - this.context = { - skip: () => (this.should_skip = true), - remove: () => (this.should_remove = true), - replace: (node) => (this.replacement = node) - } - } - - private replace(parent, prop, index, node) { - if (parent && prop) { - // eslint-disable-next-line eqeqeq - if (index != null) { - parent[prop][index] = node - } else { - parent[prop] = node - } - } - } - - private remove(parent, prop, index) { - if (parent && prop) { - if (index !== null && index !== undefined) { - parent[prop].splice(index, 1) - } else { - delete parent[prop] - } - } - } - - visit( - node: Node, - parent: Node | null, - prop?: string | number | symbol | null | undefined, - index?: number | null | undefined - ): Node | null { - if (node) { - if (this.enter) { - const _should_skip = this.should_skip - const _should_remove = this.should_remove - const _replacement = this.replacement - this.should_skip = false - this.should_remove = false - this.replacement = null - - this.enter.call(this.context, node, parent, prop, index) - - if (this.replacement) { - node = this.replacement - this.replace(parent, prop, index, node) - } - - if (this.should_remove) { - this.remove(parent, prop, index) - } - - const skipped = this.should_skip - const removed = this.should_remove - - this.should_skip = _should_skip - this.should_remove = _should_remove - this.replacement = _replacement - - if (skipped) return node - if (removed) return null - } - - let key: keyof Node - - for (key in node) { - const value = node[key] - - if (value && typeof value === 'object') { - if (Array.isArray(value)) { - const nodes = value - for (let i = 0; i < nodes.length; i += 1) { - const item = nodes[i] - if (isNode(item)) { - if (!this.visit(item, node, key, i)) { - // removed - i-- - } - } - } - } else if (isNode(value)) { - this.visit(value, node, key, null) - } - } - } - - if (this.leave) { - const _replacement = this.replacement - const _should_remove = this.should_remove - this.replacement = null - this.should_remove = false - - this.leave.call(this.context, node, parent, prop, index) - - if (this.replacement) { - node = this.replacement - this.replace(parent, prop, index, node) - } - - if (this.should_remove) { - this.remove(parent, prop, index) - } - - const removed = this.should_remove - - this.replacement = _replacement - this.should_remove = _should_remove - - if (removed) return null - } - } - - return node - } -} - -export function walk(ast: Node, handle: WalkOptions) { - const instance = new Walker(handle) - return instance.visit(ast, null) -} - -// isReference is implement from https://github.com/Rich-Harris/is-reference -// MIT LICENSE -export function isReference(node: Node, parent: Node) { - if (node.type === 'MemberExpression') { - return !node.computed && isReference(node.object, node) - } - if (node.type === 'Identifier') { - if (!parent) return true - switch (parent.type) { - case 'MemberExpression': - return parent.computed || node === parent.object - case 'MethodDefinition': - return parent.computed - case 'PropertyDefinition': - return parent.computed || node === parent.value - case 'Property': - return parent.computed || node === parent.value - case 'ExportSpecifier': - case 'ImportSpecifier': - return node === parent.local - case 'LabeledStatement': - case 'BreakStatement': - case 'ContinueStatement': - return false - default: - return true - } - } -} diff --git a/src/code-gen.ts b/src/code-gen.ts new file mode 100644 index 0000000..4400151 --- /dev/null +++ b/src/code-gen.ts @@ -0,0 +1,278 @@ +import { parse as esModuleLexer } from 'rs-module-lexer' +import { parse as babelParse, traverse, transformFromAstAsync, types as t } from '@babel/core' +import { len } from './shared' +import type { NodePath } from '@babel/core' +import type { ModuleInfo } from './interface' + + +function isTopLevelCalled(p:NodePath) { + return t.isProgram(p.parent) || t.isExportDefaultDeclaration(p.parent) || t.isExportNamedDeclaration(p.parent) +} + +export class CodeGen { + private dependencies:Map + injectDependencies(dependencies:Map) { + this.dependencies = dependencies + } + + filter(code:string, id:string) { + const { output } = esModuleLexer({ input: [{ filename: id, code }] }) + if (!len(output)) return false + const { imports } = output[0] + const modules = Array.from(new Set([...imports.map(i => i.n)])) + for (const m of modules) { + if (this.dependencies.has(m)) return true + return false + } + return false + } + + private scanImportDeclarationAndRecord(path:NodePath, references:Map) { + const { global: globalName } = this.dependencies.get(path.node.source.value) + for (const specifier of path.node.specifiers) { + switch (specifier.type) { + case 'ImportDefaultSpecifier': + case 'ImportNamespaceSpecifier': + references.set(specifier.local.name, globalName) + break + case 'ImportSpecifier': + if (specifier.imported.type === 'Identifier') { + references.set(specifier.local.name, `${globalName}.${specifier.imported.name}`) + } + } + } + } + + private overWriteExportNamedDeclaration(path:NodePath, references:Map) { + const nodes:Array = [] + const natives:Array = [] + const hasBindings = path.node.source + const globalName = hasBindings ? this.dependencies.get(path.node.source.value).global : '' + const bindings:Set = hasBindings ? this.dependencies.get(path.node.source.value).bindings : new Set() + + const scanNamedExportsWithSource = (l:t.Identifier, e:t.Identifier, specifier:t.ExportSpecifier) => { + if (!bindings.size) return + if (l.name === 'default' && l.name !== e.name) { + const memberExpression = (p) => t.memberExpression(t.identifier(globalName), t.identifier(p)) + const objectExpression = [...bindings.keys()].map(p => t.objectProperty(t.identifier(p), memberExpression(p))) + const node = t.variableDeclarator(t.identifier(e.name), t.objectExpression(objectExpression)) + nodes.push(node) + return + } + if (e.name === 'default' && l.name !== e.name) { + const node = t.memberExpression(t.identifier(globalName), t.identifier(l.name)) + nodes.push(node) + return + } + if (l.name === e.name) { + if (l.name === 'default') { + const memberExpression = (p) => t.memberExpression(t.identifier(globalName), t.identifier(p)) + const objectExpression = [...bindings.keys()].map(p => t.objectProperty(t.identifier(p), memberExpression(p))) + const node = t.objectExpression(objectExpression) + nodes.push(node) + return + } + if (bindings.has(l.name)) { + const memberExpression = t.memberExpression(t.identifier(globalName), t.identifier(l.name)) + const node = t.variableDeclarator(t.identifier(l.name), memberExpression) + nodes.push(node) + return + } + } + natives.push(specifier) + } + + const scanNamedExportsWithoutSource = (l:t.Identifier, e:t.Identifier, specifier:t.ExportSpecifier) => { + if (references.has(l.name)) { + const [o, p] = references.get(l.name).split('.') + if (e.name === 'default') { + const node = t.memberExpression(t.identifier(o), t.identifier(p)) + nodes.push(node) + return + } + const memberExpression = t.memberExpression(t.identifier(o), t.identifier(p)) + const node = t.variableDeclarator(t.identifier(l.name), memberExpression) + nodes.push(node) + return + } + natives.push(specifier) + } + + for (const specifier of path.node.specifiers) { + if (specifier.type === 'ExportSpecifier') { + const { local, exported } = specifier + if (exported.type !== 'Identifier') continue + if (hasBindings) { + scanNamedExportsWithSource(local, exported, specifier) + } else { + scanNamedExportsWithoutSource(local, exported, specifier) + } + } + if (specifier.type === 'ExportNamespaceSpecifier') { + const e = specifier.exported + if (e.name === 'default') { + const memberExpression = (p) => t.memberExpression(t.identifier(globalName), t.identifier(p)) + const objectExpression = [...bindings.keys()].map(p => t.objectProperty(t.identifier(p), memberExpression(p))) + const node = t.objectExpression(objectExpression) + nodes.push(node) + } else { + const memberExpression = (p) => t.memberExpression(t.identifier(globalName), t.identifier(p)) + const objectExpression = [...bindings.keys()].map(p => t.objectProperty(t.identifier(p), memberExpression(p))) + const node = t.variableDeclarator(t.identifier(e.name), t.objectExpression(objectExpression)) + nodes.push(node) + } + } + } + + // export { default } from 'module' + // export {default as A } from 'module' + // export { B as default } from 'module' + // export { A , B } from 'module' + // export * as default from 'module' + // export * as xx from 'module' + const variableDeclaratorNodes = nodes.filter((node):node is t.VariableDeclarator => node.type === 'VariableDeclarator') + const objectOrMemberExpression = nodes.filter((node):node is t.ObjectExpression | t.MemberExpression => node.type !== 'VariableDeclarator') + if (len(objectOrMemberExpression)) { + const exportDefaultDeclaration = t.exportDefaultDeclaration(objectOrMemberExpression[0]) + if (len(variableDeclaratorNodes) || len(natives)) { + path.insertAfter(exportDefaultDeclaration) + } else { + path.replaceWith(exportDefaultDeclaration) + } + } + if (len(variableDeclaratorNodes)) { + const variableDeclaration = t.variableDeclaration('const', variableDeclaratorNodes) + if (len(natives)) { + const exportNamedDeclaration = t.exportNamedDeclaration(null, natives) + path.replaceWith(exportNamedDeclaration) + path.insertAfter(variableDeclaration) + } else { + path.replaceWith(t.exportNamedDeclaration(variableDeclaration, [])) + } + } + } + + private overWriteExportAllDeclaration(path:NodePath) { + const nodes:Array = [] + const { bindings } = this.dependencies.get(path.node.source.value) + bindings.forEach((binding) => { + const identifier = t.identifier(binding) + const node = t.exportSpecifier(identifier, identifier) + nodes.push(node) + }) + if (len(nodes)) { + const exportNamedDeclaration = t.exportNamedDeclaration(null, nodes, t.stringLiteral(path.node.source.value)) + path.replaceWith(exportNamedDeclaration) + } + } + + private eraseDuplicatedVariableDeclaration(paths: NodePath | NodePath[], declarations: Map>) { + if (!Array.isArray(paths)) return + const traverseNode = (path: NodePath | Array>) => { + if (Array.isArray(path)) return + if (t.isVariableDeclarator(path.node)) { + if (t.isObjectPattern(path.node.id) || t.isArrayPattern(path.node.id)) { + traverseNode(path.get('node.id')) + } + if (t.isRestElement(path.node.id)) { + traverseNode(path.get('node.id.argument')) + } + if (t.isIdentifier(path.node.id)) { + const def = path.node.id.name + if (declarations.has(def)) { + const p = declarations.get(def) + p.remove() + } + declarations.set(def, path) + return + } + } + if (t.isObjectPattern(path.node)) { + for (const prop of path.get('properties') as Array>) { + traverseNode(prop) + } + } + if (t.isArrayPattern(path.node)) { + for (const element of path.get('elements') as Array>) { + traverseNode(element) + } + } + } + for (const path of paths) { + traverseNode(path) + } + } + + async transform(code:string) { + const ast = await babelParse(code, { babelrc: false, configFile: false }) + const references:Map = new Map() + const declarations:Map> = new Map() + traverse(ast, { + ImportDeclaration: { + enter: (path) => { + if (this.dependencies.has(path.node.source.value)) { + this.scanImportDeclarationAndRecord(path, references) + } + }, + exit: (path) => { + if (this.dependencies.has(path.node.source.value)) { + path.remove() + path.skip() + } + } + }, + ExportDeclaration: { + enter: (path) => { + switch (path.node.type) { + case 'ExportDefaultDeclaration': + if (t.isIdentifier(path.node.declaration) && this.dependencies.has(path.node.declaration.name)) { + path.remove() + } + break + case 'ExportNamedDeclaration': + if (this.dependencies.has(path.node.source?.value) || !path.node.declaration) { + this.overWriteExportNamedDeclaration(path as NodePath, references) + } + break + case 'ExportAllDeclaration': + if (this.dependencies.has(path.node.source.value)) { + this.overWriteExportAllDeclaration(path as NodePath) + } + } + } + }, + Declaration: (path) => { + if (!isTopLevelCalled(path)) return + if (t.isClassDeclaration(path.node) || t.isFunctionDeclaration(path.node)) { + const def = path.node.id.name + if (declarations.has(def)) { + const p = declarations.get(def) + p.remove() + } + declarations.set(def, path) + } + if (t.isVariableDeclaration(path.node)) { + this.eraseDuplicatedVariableDeclaration(path.get('declarations'), declarations) + } + }, + Identifier: (path) => { + if (t.isReferenced(path.node, path.parent) && references.has(path.node.name)) { + if (!path.scope.hasBinding(path.node.name)) { + path.node.name = references.get(path.node.name) + path.skip() + } + } + } + }) + const result = await transformFromAstAsync(ast, '', { babelrc: false, configFile: false, sourceMaps: true }) + return { + code: result.code, + map: result.map + } + } +} + + +export function createCodeGenerator() { + return new CodeGen() +} diff --git a/src/generator.ts b/src/generator.ts deleted file mode 100644 index 1107e2f..0000000 --- a/src/generator.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { parse as esModuleLexer } from 'rs-module-lexer' -import escodegen from 'escodegen' -import MagicString from 'magic-string' -import { attachScopes } from '@rollup/pluginutils' -import { len } from './shared' -import { walk, isReference } from './ast' -import type { ExportAllDeclaration, ExportNamedDeclaration, ImportDeclaration, Node, Program } from 'estree' -import type { WalkerContext } from './ast' -import type{ RollupTransformHookContext, ModuleInfo } from './interface' - - -const PLUGIN_GLOBAL_NAME = '__vite__plugin__cdn2__global__' - -class Generator { - private dependencies: Record - constructor() { - this.dependencies = {} - } - - injectDependencies(dependencies: Record) { - this.dependencies = dependencies - } - - // using es-module lexer skip unnecessary file. - filter(code:string, id:string) { - const { output } = esModuleLexer({ input: [{ filename: id, code }] }) - if (!len(output)) return false - const { imports } = output[0] - const modules = new Set([...imports.map(i => i.n)]) - for (const dep in this.dependencies) { - if (modules.has(dep)) return true - } - return false - } - - // overwrite all exprot declaration - private overwriteAllExportDeclaration(node:ExportAllDeclaration, options:{ - rollupTransformHookContext: RollupTransformHookContext, - walkContext:WalkerContext, - }) { - const ref = node.source.value - if (typeof ref !== 'string') return - if (ref in this.dependencies) { - const { rollupTransformHookContext, walkContext } = options - const { bindings: _bindings, global } = this.dependencies[ref] - const bindings = new Set([..._bindings]) - bindings.delete('default') - const code = node.exported - ? `export const ${node.exported.name} = { ${Array.from(bindings).map(dep => `${dep}: ${global}.${dep}`)} };\n` - : `export {${Array.from(bindings).map(dep => dep)} } from '${ref}';\n` - const newNode = (rollupTransformHookContext.parse(code) as Node as Program).body[0] - walkContext.replace(newNode) - } - } - - private overwriteAllNamedExportsWithSource(node:ExportNamedDeclaration, options:{ - rollupTransformHookContext: RollupTransformHookContext, - walkContext:WalkerContext, - program:Program, - }) { - const ref = node.source.value as string - if (ref in this.dependencies) { - const { global, bindings } = this.dependencies[ref] - const { rollupTransformHookContext, walkContext, program } = options - const exports:string[] = [] - const writeContent:string[] = [] - // export { default } from 'module-name' - // export { default as A } from 'module-name' - // export { B as default } from 'module-name' - // export { A, B } from 'module-name' - for (const specifier of node.specifiers) { - const { local, exported } = specifier - if (local.name === exported.name) { - if (local.name === 'default') { - writeContent.push(`const ${PLUGIN_GLOBAL_NAME} = { ${Array.from(bindings).map(dep => `${dep}: ${global}.${dep}`)} };`) - writeContent.push(`export default ${PLUGIN_GLOBAL_NAME};`) - } else { - exports.push(local.name) - } - } else { - if (local.name === 'default') { - writeContent.push(`export const ${exported.name} = { ${Array.from(bindings).map(dep => `${dep}: ${global}.${dep}`)} };`) - } - if (exported.name === 'default') { - writeContent.push(`const ${PLUGIN_GLOBAL_NAME} = ${global}.${specifier.local.name};`) - writeContent.push(`export default ${PLUGIN_GLOBAL_NAME};`) - } - } - } - if (len(exports)) { - writeContent.push(`const { ${exports.map(module => module)} } = ${global};`, `export {${exports.map(module => module)} }`) - } - if (!len(writeContent)) return - const [n1, ...rest] = (rollupTransformHookContext.parse(writeContent.join('\n')) as Node as Program).body - walkContext.replace(n1) - program.body.push(...rest) - } - } - - private scanForImportAndRecord(node:ImportDeclaration, bindings:Map) { - const ref = node.source.value - if (typeof ref !== 'string') return - if (ref in this.dependencies) { - const { global } = this.dependencies[ref] - for (const specifier of node.specifiers) { - // import module from 'module-name' - // import * as module from 'module-name' - if (specifier.type === 'ImportDefaultSpecifier' || specifier.type === 'ImportNamespaceSpecifier') { - bindings.set(specifier.local.name, global) - } - // import { a1, b2 } from 'module-name' - // import {s as S } from 'module-name' - if (specifier.type === 'ImportSpecifier') { - bindings.set(specifier.local.name, `${global}.${specifier.imported.name}`) - } - } - } - } - - overwrite(code:string, rollupTransformHookContext:RollupTransformHookContext) { - const ast = rollupTransformHookContext.parse(code) as Node - // eslint-disable-next-line @typescript-eslint/no-this-alias - const ctx:Generator = this - const bindings:Map = new Map() - // - reocrd the reference. - // - overwrite exports. to export { x, z, y } from 'module' - // - erase named exports - - // I decide don't support dynamic import case - - // handle reference and rewrite identifier - // remove importer node - // overwrite named exports - // syntax analyze - let scope = attachScopes(ast, 'scope') - walk(ast, { - enter(node, parent) { - switch (node.type) { - case 'ImportDeclaration': - ctx.scanForImportAndRecord(node, bindings) - break - case 'ExportAllDeclaration': - ctx.overwriteAllExportDeclaration(node, { rollupTransformHookContext, walkContext: this }) - break - } - if (node.scope) { - // eslint-disable-next-line prefer-destructuring - scope = node.scope - } - if (node.type !== 'Program') { - if (isReference(node, parent)) { - switch (node.type) { - case 'Identifier': - // Even if it's handle `importDeclaration`. It will be remove at leave. - if (bindings.has(node.name) && !scope.contains(node.name)) { - node.name = bindings.get(node.name) - } - } - } - } - }, - leave(node, parent) { - if (node.scope) { - scope = node.scope.parent - } - if (node.type === 'ExportNamedDeclaration') { - if (node.source) { - ctx.overwriteAllNamedExportsWithSource(node, { - walkContext: this, - program: parent as Program, - rollupTransformHookContext - }) - this.skip() - } - } - if (node.type === 'ImportDeclaration') { - const ref = node.source.value - if (typeof ref !== 'string') return - if (ref in ctx.dependencies) this.remove() - } - } - }) - const magicStr = new MagicString(escodegen.generate(ast)) - return { code: magicStr.toString(), map: magicStr.generateMap() } - } -} - - - -export function createGenerator() { - return new Generator() -} diff --git a/src/index.ts b/src/index.ts index 9fe477b..35ebd51 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,16 +1,17 @@ import { createFilter } from '@rollup/pluginutils' import { createScanner } from './scanner' import { createInjectScript } from './inject' -import { createGenerator } from './generator' +import { createCodeGenerator } from './code-gen' import { isSupportThreads } from './shared' +import { jsdelivr } from './url' import type { Plugin } from 'vite' import type { CDNPluginOptions } from './interface' function cdn(opts: CDNPluginOptions = {}): Plugin { - const { modules = [], mode = 'auto', include = /\.(mjs|js|ts|vue|jsx|tsx)(\?.*|)$/, exclude, logLevel = 'warn' } = opts + const { modules = [], url = jsdelivr, include = /\.(mjs|js|ts|vue|jsx|tsx)(\?.*|)$/, exclude, logLevel = 'warn' } = opts const filter = createFilter(include, exclude) const scanner = createScanner(modules) - const generator = createGenerator() + const generator = createCodeGenerator() return { name: 'vite-plugin-cdn', enforce: 'post', @@ -22,7 +23,7 @@ function cdn(opts: CDNPluginOptions = {}): Plugin { await scanner.scanAllDependencies() generator.injectDependencies(scanner.dependencies) if (logLevel === 'warn') { - scanner.failedModuleNames.forEach((name) => config.logger.error(`vite-plugin-cdn2: ${name} resolved failed.Please check it.`)) + scanner.failedModule.forEach((name) => config.logger.error(`vite-plugin-cdn2: ${name} resolved failed.Please check it.`)) } // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { @@ -32,16 +33,16 @@ function cdn(opts: CDNPluginOptions = {}): Plugin { async transform(code, id) { if (!filter(id)) return if (!generator.filter(code, id)) return - return generator.overwrite(code, this) + return generator.transform(code) }, transformIndexHtml(html) { - const inject = createInjectScript(scanner.dependencies, scanner.dependModuleNames, mode) - return inject.inject(html, opts.transform) + const inject = createInjectScript(scanner.dependencies, url) + return inject.text(html, opts.transform) } } } -export { cdn, createScanner } +export { cdn } export default cdn -export type { InjectVisitor, PresetDomain, TrackModule, CDNPluginOptions } from './interface' +export type { InjectVisitor, TrackModule, CDNPluginOptions } from './interface' diff --git a/src/inject.ts b/src/inject.ts index 0a98743..d0531ba 100644 --- a/src/inject.ts +++ b/src/inject.ts @@ -1,63 +1,68 @@ // refer: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script import { URL } from 'url' import { Window } from 'happy-dom' -import type { IIFEModuleInfo, CDNPluginOptions, PresetDomain, ScriptNode, LinkNode } from './interface' import { uniq } from './shared' - -const DOMAIN: Record, string> = { - jsdelivr: 'https://cdn.jsdelivr.net/npm/', - unpkg: 'https://unpkg.com/' -} +import type { IIFEModuleInfo, CDNPluginOptions, ScriptNode, LinkNode } from './interface' function isScript(url: string) { return url.split('.').pop() === 'js' ? 'script' : 'link' } +function makeURL(moduleMeta: IIFEModuleInfo, baseURL:string) { + const { version, name: packageName, relativeModule } = moduleMeta + if (!baseURL) return + return new URL(`${packageName}@${version}/${relativeModule}`, baseURL).href +} + +function makeNode(packageName:string):ScriptNode | LinkNode { + return { + tag: 'link', + url: new Set(), + name: packageName + } +} + class InjectScript { - private modules: { - links: Record - scripts: Record - } + private modules:Map private window: Window - constructor(modules: Record, moduleNames: string[], mode: PresetDomain) { - this.modules = this.prepareModules(modules, moduleNames, mode) + constructor(modules: Map, url: string) { + this.modules = this.prepareSource(modules, url) this.window = new Window() - } + } toTags() { - const nodes = [...Object.values(this.modules.scripts), ...Object.values(this.modules.links)] - // eslint-disable-next-line @typescript-eslint/no-unused-vars - return nodes.flatMap(({ name: _, tag, url = [], ...restProps }) => { - return url.map((url) => { - const element = this.window.document.createElement(tag) - if (tag === 'script') { - element.setAttribute('src', url) - } else { - element.setAttribute('href', url) - } - for (const prop in restProps) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - const value = restProps[prop] - element.setAttribute(prop, value.toString()) - } - return element.toString() - }) + const tags = [] + this.modules.forEach((node) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { tag, url, name: _, ...restProps } = node + if (url.size) { + url.forEach((l) => { + const element = this.window.document.createElement(tag) + element.setAttribute(tag === 'script' ? 'src' : 'href', l) + for (const prop in restProps) { + element.setAttribute(prop, restProps[prop]) + } + tags.push(element.toString()) + }) + } }) - } + return tags + } - inject(html: string, transformHook: undefined | CDNPluginOptions['transform']) { + text(html: string, transformHook?: CDNPluginOptions['transform']) { const { document } = this.window document.body.innerHTML = html if (transformHook) { const hook = transformHook() - for (const module in this.modules.scripts) { - hook.script?.(this.modules.scripts[module]) - } - for (const module in this.modules.links) { - hook.link?.(this.modules.links[module]) - } + this.modules.forEach((node) => { + if (node.tag === 'script') { + hook.script?.(node) + } + if (node.tag === 'link') { + hook.link?.(node) + } + }) } // issue #6 const element = document.body.querySelector('title') @@ -65,81 +70,49 @@ class InjectScript { const text = tags.join('\n') element.insertAdjacentHTML('beforebegin', text) return document.body.innerHTML - } + } - private prepareModules(modules: Record, moduleNames: string[], mode: PresetDomain) { - // we need moduleNames ensure us sciprt or link insertion order. - const makeNode = (module: IIFEModuleInfo, tag: ReturnType): ScriptNode | LinkNode => { - const data: ScriptNode | LinkNode = Object.create(null) - data.url = [] - data.name = module.name - data.tag = tag - return data - } - const links: Record = {} - const scripts: Record = {} + private prepareSource(modules: Map, baseURL: string) { + const container:Map = new Map() - moduleNames.forEach((moduleName) => { - if (moduleName in modules) { - const module = modules[moduleName] - if (typeof mode === 'string') { - const url = this.makeURL(module, mode) - const tag = isScript(url) - const node = makeNode(module, tag) - node.url?.push(url) - if (tag === 'script') { - scripts[moduleName] = node as ScriptNode - } else { - links[moduleName] = node as LinkNode - } + const traverseModule = (moduleMeta: IIFEModuleInfo, moduleName: string) => { + const { spare, name: packageName } = moduleMeta + if (!spare) return + if (Array.isArray(spare)) { + for (const s of uniq(spare)) { + traverseModule({ ...moduleMeta, spare: s }, moduleName) } - const spare = uniq(Array.isArray(module.spare) ? module.spare : module.spare ? [module.spare] : []) - spare.forEach((url) => { - const tag = isScript(url) - if (tag === 'script') { - if (moduleName in scripts) { - scripts[moduleName].url?.push(url) - } else { - const node = makeNode(module, 'script') - node.url?.push(url) - scripts[moduleName] = node as ScriptNode - } - } - if (tag === 'link') { - if (moduleName in links) { - links[moduleName].url?.push(url) - } else { - const node = makeNode(module, 'link') - node.url?.push(url) - links[moduleName] = node as LinkNode - } - } - }) + return + } + const tag = isScript(spare) + const mark = `__${moduleName}__${tag}__` + if (container.has(mark)) { + const node = container.get(mark) + node.url.add(spare) + return } - }) - return { links, scripts } - } - - // we handle all dependenices in scanner. So in this stage. The module - // must have the following fields. - private makeURL(module: IIFEModuleInfo, mode: Exclude) { - // if don't have any path will - if (typeof mode === 'boolean') { - return '' + const node = makeNode(packageName) + node.url.add(spare) + node.tag = isScript(spare) + container.set(mark, node) } - const { jsdelivr, version, name } = module - const base = mode === 'auto' ? (jsdelivr ? 'jsdelivr' : 'unpkg') : mode - const baseURL = DOMAIN[base] - if (!baseURL) return '' - const url = `${name}@${version}/${module[base]}` - return new URL(url, baseURL).href + + modules.forEach((meta, moduleName) => { + const node = makeNode(meta.name) + const url = makeURL(meta, baseURL) + node.url.add(url) + node.tag = isScript(url) + const mark = `__${moduleName}__${node.tag}__` + container.set(mark, node) + if (meta.spare) traverseModule(meta, moduleName) + }) + return container } } export function createInjectScript( - dependModules: Record, - moduleNames: string[], - mode: PresetDomain + dependModules: Map, + url: string ) { - return new InjectScript(dependModules, moduleNames, mode) + return new InjectScript(dependModules, url) } diff --git a/src/interface.ts b/src/interface.ts index 4f166f5..29a843a 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -18,10 +18,9 @@ export interface TrackModule { spare?: Array | string } -export type PresetDomain = 'auto' | 'jsdelivr' | 'unpkg' | false - export interface IIFEModuleInfo extends TrackModule { version: string + relativeModule: string unpkg?: string jsdelivr?: string } @@ -32,7 +31,7 @@ export interface ModuleInfo extends IIFEModuleInfo{ } export interface Serialization { - url?: string[] + url?: Set type?: string name: string tag: 'link' | 'script' @@ -81,8 +80,7 @@ export interface InjectVisitor { export interface CDNPluginOptions { modules?: Array - preset?: PresetDomain - mode?: PresetDomain + url?: string transform?: () => InjectVisitor include?: FilterPattern exclude?: FilterPattern diff --git a/src/scanner.ts b/src/scanner.ts index ff3a57d..da8fb6c 100644 --- a/src/scanner.ts +++ b/src/scanner.ts @@ -1,15 +1,15 @@ import fsp from 'fs/promises' import worker_threads from 'worker_threads' import { createConcurrentQueue, createVM, MAX_CONCURRENT } from './vm' -import { is, lookup, uniq } from './shared' +import { is, len, lookup, uniq } from './shared' import type { MessagePort } from 'worker_threads' import type { TrackModule, IIFEModuleInfo, ModuleInfo } from './interface' -interface WorkerData { - scannerModule: TrackModule[] - workerPort: MessagePort - internalThread: boolean -} + interface WorkerData { + scannerModule: TrackModule[] + workerPort: MessagePort + internalThread: boolean + } function createWorkerThreads(scannerModule: TrackModule[]) { const { port1: mainPort, port2: workerPort } = new worker_threads.MessageChannel() @@ -19,67 +19,58 @@ function createWorkerThreads(scannerModule: TrackModule[]) { transferList: [workerPort], execArgv: [] }) - // record thread id const id = 0 const run = () => { worker.postMessage({ id }) return new Promise((resolve, reject) => { mainPort.on('message', (message) => { if (message.id !== id) reject(new Error(`Internal error: Expected id ${id} but got id ${message.id}`)) - resolve(message.bindings) + if (message.error) { + reject(message.error) + } else { + resolve({ dependencies: message.bindings, failedModule: message.failedModule }) + } worker.terminate() }) }) } - return run() as Promise> + return run() as Promise<{dependencies:Map, failedModule:Set}> } async function tryResolveModule( module: TrackModule, - dependenciesMap:Map + dependenciesMap: Map, + failedModule: Set ) { const { name: moduleName, ...rest } = module - - const packageJson: IIFEModuleInfo & { browser: string } = Object.create(null) - let packageJsonPath = '' try { - // eslint-disable-next-line @typescript-eslint/no-var-requires - Object.assign(packageJson, require(`${moduleName}/package.json`)) - packageJsonPath = require.resolve(`${moduleName}/package.json`) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error: any) { - // handle esm package - if (error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') { - const modulePath = require.resolve(moduleName) - packageJsonPath = lookup(modulePath, 'package.json') - const str = await fsp.readFile(packageJsonPath, 'utf8') - Object.assign(packageJson, JSON.parse(str)) + const modulePath = require.resolve(moduleName) + const packageJsonPath = lookup(modulePath, 'package.json') + const str = await fsp.readFile(packageJsonPath, 'utf8') + const packageJSON:IIFEModuleInfo = JSON.parse(str) + const { version, name, unpkg, jsdelivr } = packageJSON + const meta:ModuleInfo = Object.create(null) + const iifeRelativePath = jsdelivr || unpkg + if (!iifeRelativePath) throw new Error('try resolve file failed.') + if (rest.global) { + Object.assign(meta, { name, version, relativeModule: iifeRelativePath, ...rest }) } else { - throw new Error('Internal error:' + error) + const iifeFilePath = lookup(packageJsonPath, iifeRelativePath) + const code = await fsp.readFile(iifeFilePath, 'utf8') + Object.assign(meta, { name, version, code, relativeModule: iifeRelativePath, ...rest }) } - } - // https://docs.npmjs.com/cli/v9/configuring-npm/package-json#browser - const { version, name, unpkg, jsdelivr, browser } = packageJson - // if user prvoide the global name . Skip eval script - if (rest.global) { - dependenciesMap.set(name, { name, version, unpkg, jsdelivr, bindings: new Set(), ...rest }) - } else { - const iifeRelativePath = typeof browser === 'string' ? browser : jsdelivr ?? unpkg - if (!iifeRelativePath) return - const iifeFilePath = lookup(packageJsonPath, iifeRelativePath) - const code = await fsp.readFile(iifeFilePath, 'utf8') - dependenciesMap.set(name, { name, version, unpkg, jsdelivr, code, bindings: new Set(), ...rest }) - } - const pkg = await import(moduleName) - const keys = Object.keys(pkg) - if (keys.includes('default')) { - const pos = keys.findIndex((k) => k === 'default') - keys.splice(pos, 1) - keys.push(...Object.keys(pkg.default)) - } - - if (dependenciesMap.has(name)) { - dependenciesMap.get(name).bindings = new Set(keys.filter((k) => k !== '__esModule')) + const pkg = await import(moduleName) + const keys = Object.keys(pkg) + // If it's only exports by default + if (keys.includes('default') && len(keys) !== 1) { + const pos = keys.findIndex((k) => k === 'default') + keys.splice(pos, 1) + keys.push(...Object.keys(pkg.default)) + } + const bindings = new Set(keys.filter(v => v !== '__esModule')) + dependenciesMap.set(name, { ...meta, bindings }) + } catch (error) { + failedModule.add(moduleName) } } @@ -89,38 +80,33 @@ function startAsyncThreads() { const { parentPort } = worker_threads const vm = createVM() const dependenciesMap: Map = new Map() + const failedModule: Set = new Set() parentPort?.on('message', (msg) => { (async () => { const { id } = msg - // An Idea. We won't need ensure the task order. - // We only need two tasks. First is the import module.(Node.js has implement `import('module')`) - // The second is find the global name of umd or iife file. (If user pass the global. Skip find global name) - // If this process is ok. we don't need collect bindings in trasnform stage. :) try { const queue = createConcurrentQueue(MAX_CONCURRENT) for (const module of scannerModule) { - queue.enqueue(() => tryResolveModule(module, dependenciesMap)) + queue.enqueue(() => tryResolveModule(module, dependenciesMap, failedModule)) } - // await queue.wait() for (const module of scannerModule) { const { name } = module if (dependenciesMap.has(name)) { const { code, ...rest } = dependenciesMap.get(name) if (!code) { - vm.bindings[name] = rest + vm.bindings.set(name, rest) continue } - vm.run(code, rest, (info) => { - if (!info.unpkg && !info.jsdelivr) return null - return info + vm.run(code, rest, (err:Error) => { + failedModule.add(err.message) }) } } dependenciesMap.clear() - workerPort.postMessage({ bindings: vm.bindings, id }) + workerPort.postMessage({ bindings: vm.bindings, id, failedModule }) } catch (error) { - // + workerPort.postMessage({ error, id }) } })() }) @@ -132,14 +118,19 @@ if (worker_threads.workerData?.internalThread) { class Scanner { modules: Array - dependencies: Record + dependencies: Map + failedModule: Set constructor(modules: Array) { this.modules = this.serialization(modules) - this.dependencies = {} + this.dependencies = new Map() + this.failedModule = new Set() } public async scanAllDependencies() { - this.dependencies = await createWorkerThreads(this.modules) + // we won't throw any exceptions inside this task. + const res = await createWorkerThreads(this.modules) + this.dependencies = res.dependencies + this.failedModule = res.failedModule } private serialization(modules: Array) { @@ -151,21 +142,6 @@ class Scanner { }) .filter((v) => v.name) } - - // ensure the order - get dependModuleNames() { - const deps = Object.keys(this.dependencies) - return this.modules.map((v) => v.name).filter((v) => deps.includes(v)) - } - - get failedModuleNames() { - const failedModules:string[] = [] - this.modules.forEach((module) => { - if (module.name in this.dependencies) return - failedModules.push(module.name) - }) - return failedModules - } } export function createScanner(modules: Array) { diff --git a/src/url.ts b/src/url.ts new file mode 100644 index 0000000..787c340 --- /dev/null +++ b/src/url.ts @@ -0,0 +1,2 @@ +export const unpkg = 'https://unpkg.com/' +export const jsdelivr = 'https://cdn.jsdelivr.net/npm/' diff --git a/src/vm.ts b/src/vm.ts index 6852780..11a3069 100644 --- a/src/vm.ts +++ b/src/vm.ts @@ -1,55 +1,57 @@ import os from 'os' import vm from 'vm' import { Window } from 'happy-dom' +import { len } from './shared' import type { ModuleInfo } from './interface' export function createVM() { - const bindings: Record = {} + const bindings:Map = new Map() const window = new Window() - const context = Object.create(null) - vm.createContext(context) - let _opt:ModuleInfo = null - let _invoke:(info: ModuleInfo) => ModuleInfo | null - let _id = 0 + const context = vm.createContext({}) + let _meta:ModuleInfo = null + let id = 0 + let callerId = 0 - const updateBindgs = (opt:ModuleInfo, globalName:string, invoke:(info: ModuleInfo) => ModuleInfo | null) => { - if (opt && !bindings[opt.name]) { - const re = invoke({ ...opt, global: globalName }) - if (!re) return - bindings[opt.name] = re - } + const updateBindings = (name:string, meta:ModuleInfo) => { + bindings.set(meta.name, { ...meta, global: name }) } - const shadow = new Proxy(window, { - set(target, key:string, value, receiver) { - updateBindgs(_opt, key, _invoke) + set(target, key: string, value, receiver) { + callerId++ + if (id === callerId) updateBindings(key, _meta) Reflect.set(target, key, value, receiver) return true } }) - const run = (code: string, opt: ModuleInfo, invoke: (info: ModuleInfo) => ModuleInfo | null) => { - let id = 0 - _opt = opt - _invoke = invoke + + const run = (code: string, meta: ModuleInfo, handler:(err:Error)=>void) => { + _meta = meta try { vm.runInContext(code, context) - _id++ - } catch (_) { - // If can't process. - shadow.eval(code) - updateBindgs(opt, Object.keys(shadow).pop(), invoke) - } - id++ - - if (id === _id) { - const latest = Object.keys(context).pop() - if (latest) { - shadow[latest] = context[latest] + // TODO + // This is a temporary solution. + // when vm run script it can't run others logic in threads it will directly + // end the function. + // So we need to get the last one using the tag. + // https://github.com/nodejs/help/issues/1378 + id = len(Object.keys(context)) + Object.assign(shadow, context) + // context free + for (const key in context) { + Reflect.deleteProperty(context, key) + } + _meta = null + callerId = 0 + id = 0 + } catch (error) { + try { + // In most cases there will only be one variable + window.eval(code) + updateBindings(Object.keys(shadow).pop(), meta) + } catch (_) { + handler(new Error(meta.name)) } - _id-- } - _opt = null - _invoke = null } return { run, bindings } } @@ -64,10 +66,12 @@ class Queue { maxConcurrent: number queue: Array<() => Promise> running: number + errors: Error[] constructor(maxConcurrent: number) { this.maxConcurrent = maxConcurrent this.queue = [] this.running = 0 + this.errors = [] } enqueue(task: () => Promise) { @@ -81,6 +85,8 @@ class Queue { this.running++ try { await task?.() + } catch (err) { + this.errors.push(err) } finally { this.running-- this.run() @@ -92,6 +98,10 @@ class Queue { while (this.running) { await new Promise((resolve) => setTimeout(resolve, 0)) } + if (len(this.errors)) { + const message = this.errors.reduce((acc, cur) => acc += cur.message, '') + throw new Error(message) + } } } diff --git a/tsconfig.json b/tsconfig.json index e97dbc4..2b420a7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,6 +11,5 @@ "module": "CommonJS", "moduleResolution": "node", "outDir": "dist" - }, - "include": ["src/*", "global.d.ts"] + } } diff --git a/yarn.lock b/yarn.lock index 1e029c8..a4f5a82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,14 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@babel/code-frame@^7.18.6": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" @@ -9,11 +17,144 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" + integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== + +"@babel/core@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" + integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" + integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" + integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" + integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@babel/helper-validator-identifier@^7.18.6": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helpers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" + integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" @@ -23,11 +164,59 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" + integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== + "@babel/parser@^7.16.4": version "7.21.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" + integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -111,6 +300,15 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" @@ -121,6 +319,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" @@ -139,7 +342,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== @@ -324,6 +527,39 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== +"@types/babel__core@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + dependencies: + "@babel/types" "^7.20.7" + "@types/concat-stream@^1.6.0": version "1.6.1" resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" @@ -807,6 +1043,16 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" +browserslist@^4.21.3: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + dependencies: + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -853,6 +1099,11 @@ callsites@^4.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.0.0.tgz#8014cea4fedfe681a30e2f7d2d557dd95808a92a" integrity sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ== +caniuse-lite@^1.0.30001503: + version "1.0.30001510" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001510.tgz#077b7ceba430473142ffd47ed89a78bd7b10075f" + integrity sha512-z35lD6xjHklPNgjW4P68R30Er5OCIZE0C1bUf8IMXSh34WJYXfIy+GxIEraQXYJ2dvTU8TumjYAeLrPhpMlsuw== + caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1032,7 +1283,7 @@ concordance@^5.0.4: semver "^7.3.2" well-known-symbols "^2.0.0" -convert-source-map@^1.6.0: +convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== @@ -1085,14 +1336,14 @@ date-time@^3.1.0: dependencies: time-zone "^1.0.0" -debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -1145,6 +1396,11 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +electron-to-chromium@^1.4.431: + version "1.4.447" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.447.tgz#ac69d3a7b3713e9ae94bb30ba65c3114e4d76a38" + integrity sha512-sxX0LXh+uL41hSJsujAN86PjhrV/6c79XmpY0TvjZStV6VxIgarf8SRkUoUTuYmFcZQTemsoqo8qXOGw5npWfw== + emittery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-1.0.1.tgz#e0cf36e2d7eef94dbd025969f642d57ae50a56cd" @@ -1313,18 +1569,6 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - eslint-config-kagura@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-config-kagura/-/eslint-config-kagura-1.1.0.tgz#c751a4055c68d22cda8d54039c3b958446f14099" @@ -1409,7 +1653,7 @@ espree@^9.5.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.0" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -1479,7 +1723,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -1574,6 +1818,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -1635,6 +1884,11 @@ glob@^8.0.3: minimatch "^5.0.1" once "^1.3.0" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + globals@^13.19.0: version "13.20.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" @@ -1956,6 +2210,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -1966,6 +2225,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -1974,14 +2238,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - load-json-file@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-7.0.1.tgz#a3c9fde6beffb6bedb5acf104fad6bb1604e1b00" @@ -2011,6 +2267,13 @@ lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -2025,13 +2288,6 @@ magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -magic-string@^0.26.4: - version "0.26.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" - integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== - dependencies: - sourcemap-codec "^1.4.8" - magic-string@^0.27.0: version "0.27.0" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" @@ -2179,6 +2435,11 @@ node-fetch@^2.x.x: dependencies: whatwg-url "^5.0.0" +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + nofilter@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" @@ -2201,18 +2462,6 @@ once@^1.3.0: dependencies: wrappy "1" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -2347,6 +2596,18 @@ pkg-conf@^4.0.0: find-up "^6.0.0" load-json-file "^7.0.0" +playwright-core@1.35.1: + version "1.35.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.35.1.tgz#52c1e6ffaa6a8c29de1a5bdf8cce0ce290ffb81d" + integrity sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg== + +playwright@^1.35.1: + version "1.35.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.35.1.tgz#f991d0c76ae517d4a0023d9428b09d19d5e87128" + integrity sha512-NbwBeGJLu5m7VGM0+xtlmLAH9VUfWwYOhUi/lSEDyGg46r1CA9RWlvoc5yywxR9AzQb0mOCm7bWtOXV7/w43ZA== + dependencies: + playwright-core "1.35.1" + plur@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/plur/-/plur-5.1.0.tgz#bff58c9f557b9061d60d8ebf93959cf4b08594ae" @@ -2377,11 +2638,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - pretty-ms@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-8.0.0.tgz#a35563b2a02df01e595538f86d7de54ca23194a3" @@ -2560,7 +2816,7 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@^6.0.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -2645,7 +2901,7 @@ source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -2797,6 +3053,11 @@ time-zone@^1.0.0: resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" integrity sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA== +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2852,13 +3113,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-fest@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" @@ -2879,6 +3133,14 @@ typescript@^4.8.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -2970,7 +3232,7 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@^1.2.3, word-wrap@~1.2.3: +word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -3002,6 +3264,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"