From 0bb4063b1aa294bc8464a27c2449d14b8e78b56a Mon Sep 17 00:00:00 2001 From: Christopher Biscardi Date: Wed, 4 Mar 2020 16:15:22 -0800 Subject: [PATCH 1/3] some changes --- src/config.ts | 18 +++++++++++++++++- src/index.ts | 13 ++++++++++--- src/resolve-remote.ts | 5 ++++- src/scan-imports.ts | 13 +++++++++---- 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/config.ts b/src/config.ts index e4efa5ba7c..d3fe03371a 100644 --- a/src/config.ts +++ b/src/config.ts @@ -73,7 +73,23 @@ const configSchema = { type: 'object', properties: { source: {type: 'string'}, - webDependencies: {type: 'array', items: {type: 'string'}}, + webDependencies: { + type: 'array', + items: { + anyOf: [ + {type: 'string'}, + { + type: 'array', + items: [ + { + type: 'string', + }, + {type: 'string'}, + ], + }, + ], + }, + }, dedupe: { type: 'array', items: {type: 'string'}, diff --git a/src/index.ts b/src/index.ts index f7ec2cf175..573ddc2722 100644 --- a/src/index.ts +++ b/src/index.ts @@ -223,6 +223,7 @@ export async function install( {hasBrowserlistConfig, isExplicit, lockfile}: InstallOptions, config: SnowpackConfig, ) { + // throw new Error('typescript sucks'); // @ts-ignore const { dedupe, namedExports, @@ -258,11 +259,17 @@ export async function install( const installTargetsMap: {[targetLoc: string]: InstallTarget[]} = {}; const skipFailures = !isExplicit; - for (const installSpecifier of allInstallSpecifiers) { + for (const installSpecifierOrArr of allInstallSpecifiers) { + const installSpecifier = Array.isArray(installSpecifierOrArr) + ? installSpecifierOrArr[1] + : installSpecifierOrArr; + const installSpecifierOrAlias = Array.isArray(installSpecifierOrArr) + ? installSpecifierOrArr[0] + : installSpecifierOrArr; const targetName = getWebDependencyName(installSpecifier); if (lockfile && lockfile.imports[installSpecifier]) { installEntrypoints[targetName] = lockfile.imports[installSpecifier]; - importMap.imports[installSpecifier] = `./${targetName}.js`; + importMap.imports[installSpecifierOrAlias] = `./${targetName}.js`; installResults.push([targetName, 'SUCCESS']); logUpdate(formatInstallResults(skipFailures)); continue; @@ -272,7 +279,7 @@ export async function install( if (targetType === 'JS') { const hashQs = useHash ? `?rev=${await generateHashFromFile(targetLoc)}` : ''; installEntrypoints[targetName] = targetLoc; - importMap.imports[installSpecifier] = `./${targetName}.js${hashQs}`; + importMap.imports[installSpecifierOrAlias] = `./${targetName}.js${hashQs}`; installTargetsMap[targetLoc] = installTargets.filter(t => installSpecifier === t.specifier); installResults.push([installSpecifier, 'SUCCESS']); } else if (targetType === 'ASSET') { diff --git a/src/resolve-remote.ts b/src/resolve-remote.ts index 457b7e72dc..def1dfbfb2 100644 --- a/src/resolve-remote.ts +++ b/src/resolve-remote.ts @@ -91,7 +91,10 @@ export async function resolveTargetsFromRemoteCDN( const newLockfile: ImportMap = {imports: {}}; const allInstallSpecifiers = new Set(installTargets.map(dep => dep.specifier)); - for (const installSpecifier of allInstallSpecifiers) { + for (const installSpecifierOrArr of allInstallSpecifiers) { + const installSpecifier = Array.isArray(installSpecifierOrArr) + ? installSpecifierOrArr[1] + : installSpecifierOrArr; const installSemver: string = (pkgManifest.dependencies || {})[installSpecifier] || (pkgManifest.devDependencies || {})[installSpecifier] || diff --git a/src/scan-imports.ts b/src/scan-imports.ts index c30ba23c1c..8849ca6264 100644 --- a/src/scan-imports.ts +++ b/src/scan-imports.ts @@ -22,7 +22,7 @@ const DEFAULT_IMPORT_REGEX = /import\s+(\w)+(,\s\{[\w\s]*\})?\s+from/s; * are metadata about what is actually being imported. */ export type InstallTarget = { - specifier: string; + specifier: string | [string, string]; all: boolean; default: boolean; namespace: boolean; @@ -33,7 +33,7 @@ function stripJsExtension(dep: string): string { return dep.replace(/\.m?js$/i, ''); } -function createInstallTarget(specifier: string, all = true): InstallTarget { +function createInstallTarget(specifier: string | [string, string], all = true): InstallTarget { return { specifier, all, @@ -124,7 +124,8 @@ export function scanDepList(depList: string[], cwd: string): InstallTarget[] { const nodeModulesLoc = nodePath.join(cwd, 'node_modules'); return depList .map(whitelistItem => { - if (!glob.hasMagic(whitelistItem)) { + const safelistName = Array.isArray(whitelistItem) ? whitelistItem[1] : whitelistItem; + if (!glob.hasMagic(safelistName)) { return [createInstallTarget(whitelistItem, true)]; } else { return scanDepList(glob.sync(whitelistItem, {cwd: nodeModulesLoc, nodir: true}), cwd); @@ -158,5 +159,9 @@ export async function scanImports({include, exclude}: ScanImportsParams): Promis .map(filePath => [filePath, fs.readFileSync(filePath, 'utf8')]) .map(([filePath, code]) => getInstallTargetsForFile(filePath, code)) .reduce((flat, item) => flat.concat(item), []) - .sort((impA, impB) => impA.specifier.localeCompare(impB.specifier)); + .sort((impA, impB) => { + const specifierA = Array.isArray(impA.specifier) ? impA.specifier[1] : impA.specifier; + const specifierB = Array.isArray(impB.specifier) ? impB.specifier[1] : impB.specifier; + return specifierA.localeCompare(specifierB); + }); } From c517c5fecd57e325c9c91fbb992fb7ef2aaa52db Mon Sep 17 00:00:00 2001 From: Christopher Biscardi Date: Wed, 4 Mar 2020 21:05:11 -0800 Subject: [PATCH 2/3] use @rollup/plugin-alias --- package-lock.json | 15 +++++++++++++++ package.json | 1 + src/index.ts | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/package-lock.json b/package-lock.json index 776f504b11..ffea94eaac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1630,6 +1630,21 @@ "integrity": "sha512-1ZsOHGc0qJDofO+/98PfchHJqJjtfZL3liVGi4QZ28GtLmTVuZ4SUJFa5NgbsYawnrr//pdNOfx9JiaLFKpzrA==", "dev": true }, + "@rollup/plugin-alias": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-3.0.1.tgz", + "integrity": "sha512-ReSy6iPl3GsWLMNeshXAfgItZFMoMOTYC7MZQQM5va4pqxiGgwl1xZUZfHW6zGyZPK+k8TBadxx+kdmepiUa+g==", + "requires": { + "slash": "^3.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, "@rollup/plugin-commonjs": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz", diff --git a/package.json b/package.json index 4852af1449..5cd187a719 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@babel/core": "^7.6.4", "@babel/preset-env": "^7.6.3", "@babel/types": "^7.6.3", + "@rollup/plugin-alias": "^3.0.1", "@rollup/plugin-commonjs": "^11.0.0", "@rollup/plugin-json": "^4.0.0", "@rollup/plugin-node-resolve": "^7.1.0", diff --git a/src/index.ts b/src/index.ts index 573ddc2722..51bbe7134a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,7 @@ import rollupPluginCommonjs from '@rollup/plugin-commonjs'; import rollupPluginJson from '@rollup/plugin-json'; import rollupPluginNodeResolve from '@rollup/plugin-node-resolve'; import rollupPluginReplace from '@rollup/plugin-replace'; +import rollupPluginAlias from '@rollup/plugin-alias'; import chalk from 'chalk'; import fs from 'fs'; import hasha from 'hasha'; @@ -324,6 +325,11 @@ export async function install( rollupPluginReplace({ 'process.env.NODE_ENV': isOptimized ? '"production"' : '"development"', }), + rollupPluginAlias({ + entries: Array.from(allInstallSpecifiers) + .filter(spec => Array.isArray(spec)) + .map(([alias, mod]) => ({find: alias, replacement: mod})), + }), rollupPluginNodeResolve({ mainFields: ['browser:module', 'module', 'browser', !isStrict && 'main'].filter(isTruthy), modulesOnly: isStrict, // Default: false From 80ea6771a84655de89db5318c91e253d6f5f9e6b Mon Sep 17 00:00:00 2001 From: Christopher Biscardi Date: Thu, 5 Mar 2020 23:41:47 -0800 Subject: [PATCH 3/3] remove my inane development cycle rambling --- src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 51bbe7134a..e0f976c866 100644 --- a/src/index.ts +++ b/src/index.ts @@ -224,7 +224,6 @@ export async function install( {hasBrowserlistConfig, isExplicit, lockfile}: InstallOptions, config: SnowpackConfig, ) { - // throw new Error('typescript sucks'); // @ts-ignore const { dedupe, namedExports,