From 2e510d0833923606b88cc2d53648869a24193a7d Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Tue, 13 Jul 2021 10:07:13 -0400 Subject: [PATCH 1/2] Support dynamic import scanning This fixes dynamic import scanning of packages. --- snowpack/src/scan-imports.ts | 2 +- snowpack/src/sources/local.ts | 11 +++++-- test/snowpack/runtime/runtime.test.js | 42 +++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/snowpack/src/scan-imports.ts b/snowpack/src/scan-imports.ts index c5cd04558d..f9bed5182e 100644 --- a/snowpack/src/scan-imports.ts +++ b/snowpack/src/scan-imports.ts @@ -83,7 +83,7 @@ export function matchDynamicImportValue(importStatement: string) { return matched?.[2] || matched?.[3] || null; } -function getWebModuleSpecifierFromCode(code: string, imp: ImportSpecifier) { +export function getWebModuleSpecifierFromCode(code: string, imp: ImportSpecifier): string | null { // import.meta: we can ignore if (imp.d === -2) { return null; diff --git a/snowpack/src/sources/local.ts b/snowpack/src/sources/local.ts index 085b36d431..1a538104ee 100644 --- a/snowpack/src/sources/local.ts +++ b/snowpack/src/sources/local.ts @@ -16,7 +16,7 @@ import slash from 'slash'; import {getBuiltFileUrls} from '../build/file-urls'; import {logger} from '../logger'; import {scanCodeImportsExports, transformFileImports} from '../rewrite-imports'; -import {getInstallTargets} from '../scan-imports'; +import {getInstallTargets, getWebModuleSpecifierFromCode} from '../scan-imports'; import {ImportMap, PackageOptionsLocal, PackageSource, SnowpackConfig} from '../types'; import { createInstallTarget, @@ -627,7 +627,14 @@ export class PackageSourceLocal implements PackageSource { const packageImports = new Set(); const code = loadedFile.toString('utf8'); for (const imp of await scanCodeImportsExports(code)) { - const spec = code.substring(imp.s, imp.e).replace(/(\/|\\)+$/, ''); // remove trailing slash from end of specifier (easier for Node to resolve) + let spec = getWebModuleSpecifierFromCode(code, imp); + if(spec === null) { + continue; + } + + // remove trailing slash from end of specifier (easier for Node to resolve) + spec = spec.replace(/(\/|\\)+$/, ''); + if (isRemoteUrl(spec)) { continue; } diff --git a/test/snowpack/runtime/runtime.test.js b/test/snowpack/runtime/runtime.test.js index e430e6c012..7cbe303b2e 100644 --- a/test/snowpack/runtime/runtime.test.js +++ b/test/snowpack/runtime/runtime.test.js @@ -238,4 +238,46 @@ describe('runtime', () => { await fixture.cleanup(); } }); + + it('Installs dynamic imports', async () => { + const fixture = await testRuntimeFixture({ + 'packages/@owner/dyn/package.json': dedent` + { + "version": "1.0.0", + "name": "@owner/dyn", + "module": "main.js" + } + `, + 'packages/@owner/dyn/sub/path.js': dedent` + export default 2; + `, + 'package.json': dedent` + { + "version": "1.0.1", + "name": "@snowpack/test-runtime-import-dynamic-pkg", + "dependencies": { + "@owner/dyn": "file:./packages/@owner/dyn" + } + } + `, + 'main.js': dedent` + const promise = import('@owner/dyn/sub/path.js'); + + export default async function() { + let mod = await promise; + return mod.default; + } + ` + }); + + try { + let mod = await fixture.runtime.importModule('/main.js'); + let promise = mod.exports.default(); + let value = await promise; + console.log(value); + expect(value).toEqual(2); + } finally { + await fixture.cleanup(); + } + }); }); From bc7f0d8e056b388259111cc0fb101095a34ab133 Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Tue, 13 Jul 2021 10:14:17 -0400 Subject: [PATCH 2/2] Adding a changeset --- .changeset/curly-dancers-double.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/curly-dancers-double.md diff --git a/.changeset/curly-dancers-double.md b/.changeset/curly-dancers-double.md new file mode 100644 index 0000000000..401ee21fa0 --- /dev/null +++ b/.changeset/curly-dancers-double.md @@ -0,0 +1,5 @@ +--- +'snowpack': patch +--- + +Fixes scanning of dynamic imports on packages