diff --git a/esinstall/src/index.ts b/esinstall/src/index.ts index 3dbf5c1350..cd3d6b38af 100644 --- a/esinstall/src/index.ts +++ b/esinstall/src/index.ts @@ -87,7 +87,7 @@ function isImportOfPackage(importUrl: string, packageName: string) { */ function resolveWebDependency( dep: string, - {logger, cwd}: {logger: AbstractLogger; cwd: string}, + {cwd}: {cwd: string}, ): DependencyLoc { // if dep points directly to a file within a package, return that reference. // No other lookup required. @@ -114,10 +114,9 @@ function resolveWebDependency( exportMapEntry?.require || exportMapEntry; if (typeof exportMapValue !== 'string') { - logger.error( + throw new Error( `Package "${packageName}" exists but package.json "exports" does not include entry for "./${packageEntrypoint}".`, ); - process.exit(1); } return { type: 'JS', @@ -151,10 +150,9 @@ function resolveWebDependency( depManifest.name && (depManifest.name.startsWith('@reactesm') || depManifest.name.startsWith('@pika/react')) ) { - logger.error( + throw new Error( `React workaround packages no longer needed! Revert back to the official React & React-DOM packages.`, ); - process.exit(1); } let foundEntrypoint: string = depManifest['browser:module'] || @@ -235,16 +233,9 @@ interface InstallOptions { type PublicInstallOptions = Partial; export {PublicInstallOptions as InstallOptions}; -type InstallResult = - | {success: false; importMap: null; stats: null} - | {success: true; importMap: ImportMap; stats: DependencyStatsOutput}; +type InstallResult = {importMap: ImportMap; stats: DependencyStatsOutput}; const FAILED_INSTALL_MESSAGE = 'Install failed.'; -const EMPTY_INSTALL_RETURN: InstallResult = { - success: false, - importMap: null, - stats: null, -}; function setOptionDefaults(_options: PublicInstallOptions): InstallOptions { const options = { @@ -319,7 +310,6 @@ export async function install( } try { const resolvedResult = resolveWebDependency(installSpecifier, { - logger, cwd, }); if (resolvedResult.type === 'JS') { @@ -341,18 +331,16 @@ export async function install( if (skipFailures) { continue; } - logger.error(err.message || err); - throw new Error(FAILED_INSTALL_MESSAGE); + throw err; } } if (Object.keys(installEntrypoints).length === 0 && Object.keys(assetEntrypoints).length === 0) { - logger.error(`No ESM dependencies found! + throw new Error(`No ESM dependencies found! ${colors.dim( ` At least one dependency must have an ESM "module" entrypoint. You can find modern, web-ready packages at ${colors.underline( 'https://www.pika.dev', )}`, )}`); - return EMPTY_INSTALL_RETURN; } await initESModuleLexer; @@ -485,7 +473,6 @@ ${colors.dim( } return { - success: true, importMap, stats: dependencyStats!, }; diff --git a/snowpack/src/commands/build.ts b/snowpack/src/commands/build.ts index 3ec0d2a452..b0d71aaf20 100644 --- a/snowpack/src/commands/build.ts +++ b/snowpack/src/commands/build.ts @@ -64,6 +64,8 @@ async function installOptimizedDependencies( ...commandOptions, installTargets, config: installConfig, + shouldPrintStats: true, + shouldWriteLockfile: false, }); return installResult; } @@ -332,9 +334,6 @@ export async function command(commandOptions: CommandOptions) { const installResult = await installOptimizedDependencies(scannedFiles, installDest, { ...commandOptions, }); - if (!installResult.success || installResult.hasError || !installResult.importMap) { - process.exit(1); - } const allFiles = glob.sync(`**/*`, { cwd: installDest, absolute: true, diff --git a/snowpack/src/commands/dev.ts b/snowpack/src/commands/dev.ts index aaa4a6332a..c658fd478e 100644 --- a/snowpack/src/commands/dev.ts +++ b/snowpack/src/commands/dev.ts @@ -80,7 +80,7 @@ import { resolveDependencyManifest, updateLockfileHash, } from '../util'; -import {command as installCommand} from './install'; +import {getInstallTargets, run as installRunner} from './install'; import {getPort, paint, paintEvent} from './paint'; const DEFAULT_PROXY_ERROR_HANDLER = ( @@ -129,6 +129,30 @@ class InMemoryBuildCache { } } +/** + * Install dependencies needed in "dev" mode. Generally speaking, this scans + * your entire source app for dependency install targets, installs them, + * and then updates the "hash" file used to check node_modules freshness. + */ +async function installDependencies(commandOptions: CommandOptions) { + const {config} = commandOptions; + const installTargets = await getInstallTargets(config); + if (installTargets.length === 0) { + logger.info('Nothing to install.'); + return; + } + // 2. Install dependencies, based on the scan of your final build. + const installResult = await installRunner({ + ...commandOptions, + installTargets, + config, + shouldPrintStats: true, + shouldWriteLockfile: false, + }); + await updateLockfileHash(DEV_DEPENDENCIES_DIR); + return installResult; +} + function shouldProxy(pathPrefix: string, req: http.IncomingMessage) { const reqPath = decodeURI(url.parse(req.url!).pathname!); return reqPath.startsWith(pathPrefix); @@ -270,15 +294,6 @@ export async function startServer(commandOptions: CommandOptions) { }); // Start with a fresh install of your dependencies, if needed. - if (!(await checkLockfileHash(DEV_DEPENDENCIES_DIR)) || !existsSync(dependencyImportMapLoc)) { - logger.debug('Cache out of date or missing. Updating…'); - logger.info(colors.yellow('! updating dependencies...')); - await installCommand(installCommandOptions); - await updateLockfileHash(DEV_DEPENDENCIES_DIR); - } else { - logger.debug(`Cache up-to-date. Using existing cache`); - } - let dependencyImportMap: ImportMap = {imports: {}}; try { dependencyImportMap = JSON.parse( @@ -288,6 +303,14 @@ export async function startServer(commandOptions: CommandOptions) { // no import-map found, safe to ignore } + if (!(await checkLockfileHash(DEV_DEPENDENCIES_DIR)) || !existsSync(dependencyImportMapLoc)) { + logger.debug('Cache out of date or missing. Updating...'); + const installResult = await installDependencies(installCommandOptions); + dependencyImportMap = installResult?.importMap || dependencyImportMap; + } else { + logger.debug(`Cache up-to-date. Using existing cache`); + } + const devProxies = {}; config.proxy.forEach(([pathPrefix, proxyOptions]) => { const proxyServer = (devProxies[pathPrefix] = HttpProxy.createProxyServer(proxyOptions)); @@ -582,7 +605,9 @@ export async function startServer(commandOptions: CommandOptions) { fileLoc: string, responseExt: string, wrappedResponse: string, + retryMissing = true, ): Promise { + let missingPackages: string[] = []; const resolveImportSpecifier = createImportResolver({ fileLoc, dependencyImportMap, @@ -614,25 +639,51 @@ export async function startServer(commandOptions: CommandOptions) { } return resolvedImportUrl; } - const errorTitle = `Error: Import "${spec}" could not be resolved.`; - const errorMessage = `If this is a new package, re-run Snowpack with the ${colors.bold( - '--reload', - )} flag to rebuild. -If Snowpack is having trouble detecting the import, add ${colors.bold( - `"install": ["${spec}"]`, - )} to your Snowpack config file.`; - logger.error(`${errorTitle}\n${errorMessage}`); - hmrEngine.broadcastMessage({ - type: 'error', - title: `${errorTitle}`, - errorMessage, - fileLoc, - }); + missingPackages.push(spec); return spec; }, ); + // A missing package is a broken import, so we need to recover instantly if possible. + if (missingPackages.length > 0) { + // if retryMissing is true, do a fresh dependency install and then retry. + // Only retry once, to prevent an infinite loop when a package doesn't actually exist. + if (retryMissing) { + try { + logger.info(colors.yellow('Dependency cache out of date. Updating...')); + const installResult = await installDependencies(installCommandOptions); + dependencyImportMap = installResult?.importMap || dependencyImportMap; + return resolveResponseImports(fileLoc, responseExt, wrappedResponse, false); + } catch (err) { + const errorTitle = `Dependency Install Error`; + const errorMessage = err.message; + logger.error(`${errorTitle}: ${errorMessage}`); + hmrEngine.broadcastMessage({ + type: 'error', + title: errorTitle, + errorMessage, + fileLoc, + }); + return wrappedResponse; + } + } + // Otherwise, we need to send an error to the user, telling them about this issue. + // A failed retry usually means that Snowpack couldn't detect the import that the browser + // eventually saw post-build. In that case, you need to add it manually. + const errorTitle = `Error: Import "${missingPackages[0]}" could not be resolved.`; + const errorMessage = `If this import doesn't exist in the source file, add ${colors.bold( + `"install": ["${missingPackages[0]}"]`, + )} to your Snowpack config file.`; + logger.error(`${errorTitle}\n${errorMessage}`); + hmrEngine.broadcastMessage({ + type: 'error', + title: errorTitle, + errorMessage, + fileLoc, + }); + } + let code = wrappedResponse; if (responseFileExt === '.js' && reqUrlHmrParam) code = await transformEsmImports(code as string, (imp) => { @@ -1032,6 +1083,12 @@ ${err}`); } export async function command(commandOptions: CommandOptions) { - await startServer(commandOptions); + try { + await startServer(commandOptions); + } catch (err) { + logger.error(err.message); + logger.debug(err.stack); + process.exit(1); + } return new Promise(() => {}); } diff --git a/snowpack/src/commands/install.ts b/snowpack/src/commands/install.ts index b2a9137f62..d5ac897202 100644 --- a/snowpack/src/commands/install.ts +++ b/snowpack/src/commands/install.ts @@ -33,7 +33,7 @@ export async function getInstallTargets( } export async function command(commandOptions: CommandOptions) { - const {cwd, config} = commandOptions; + const {config} = commandOptions; logger.debug('Starting install'); const installTargets = await getInstallTargets(config); @@ -43,29 +43,31 @@ export async function command(commandOptions: CommandOptions) { return; } logger.debug('Running install command'); - const finalResult = await run({...commandOptions, installTargets}); - logger.debug('Install command successfully ran'); - if (finalResult.newLockfile) { - await writeLockfile(path.join(cwd, 'snowpack.lock.json'), finalResult.newLockfile); - logger.debug('Successfully wrote lockfile'); - } - if (finalResult.stats) { - logger.info(printStats(finalResult.stats)); - } - - if (!finalResult.success || finalResult.hasError) { + await run({ + ...commandOptions, + installTargets, + shouldPrintStats: true, + shouldWriteLockfile: true, + }).catch((err) => { + if (err.loc) { + logger.error(colors.red(colors.bold(`✘ ${err.loc.file}`))); + } + if (err.url) { + logger.error(colors.dim(`👉 ${err.url}`)); + } + logger.error(err.message || err); process.exit(1); - } + }); } interface InstallRunOptions extends CommandOptions { installTargets: InstallTarget[]; + shouldWriteLockfile: boolean; + shouldPrintStats: boolean; } interface InstallRunResult { - success: boolean; - hasError: boolean; - importMap: ImportMap | null; + importMap: ImportMap; newLockfile: ImportMap | null; stats: DependencyStatsOutput | null; } @@ -74,17 +76,17 @@ export async function run({ config, lockfile, installTargets, + shouldWriteLockfile, + shouldPrintStats, }: InstallRunOptions): Promise { const {webDependencies} = config; // start const installStart = performance.now(); - logger.info(colors.yellow('! installing dependencies…')); + logger.info(colors.yellow('installing dependencies...')); if (installTargets.length === 0) { return { - success: true, - hasError: false, importMap: {imports: {}} as ImportMap, newLockfile: null, stats: null, @@ -110,31 +112,30 @@ export async function run({ error: (...args: [any, ...any[]]) => logger.error(util.format(...args)), }, ...config.installOptions, - }).catch((err) => { - if (err.loc) { - logger.error(colors.red(colors.bold(`✘ ${err.loc.file}`))); - } - if (err.url) { - logger.error(colors.dim(`👉 ${err.url}`)); - } - logger.error(err.message || err); - process.exit(1); }); + logger.debug('Install ran successfully!'); + if (shouldWriteLockfile && newLockfile) { + await writeLockfile(path.join(cwd, 'snowpack.lock.json'), newLockfile); + logger.debug('Successfully wrote lockfile'); + } + // finish const installEnd = performance.now(); const depList = (finalResult.importMap && Object.keys(finalResult.importMap.imports)) || []; logger.info( `${ depList.length - ? colors.green(`✔`) + ' install complete' + ? colors.green(`✔`) + ' install complete!' : 'install skipped (nothing to install)' } ${colors.dim(`[${((installEnd - installStart) / 1000).toFixed(2)}s]`)}`, ); + if (shouldPrintStats && finalResult.stats) { + logger.info(printStats(finalResult.stats)); + } + return { - success: true, - hasError: false, importMap: finalResult.importMap, newLockfile, stats: finalResult.stats!, diff --git a/test/esinstall/__snapshots__/install.test.js.snap b/test/esinstall/__snapshots__/install.test.js.snap index 4889beb130..fa31553869 100644 --- a/test/esinstall/__snapshots__/install.test.js.snap +++ b/test/esinstall/__snapshots__/install.test.js.snap @@ -21,8 +21,8 @@ exports[`snowpack install config-alias: import-map.json 1`] = ` `; exports[`snowpack install config-alias: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli ├─ preact/compat.js XXXX KB XXXX KB XXXX KB @@ -635,8 +635,8 @@ exports[`snowpack install config-custom-path: import-map.json 1`] = ` `; exports[`snowpack install config-custom-path: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ array-flatten.js XXXX KB XXXX KB XXXX KB" @@ -686,8 +686,8 @@ exports[`snowpack install config-extends: import-map.json 1`] = ` `; exports[`snowpack install config-extends: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ array-flatten.js XXXX KB XXXX KB XXXX KB" @@ -715,8 +715,8 @@ exports[`snowpack install config-external: import-map.json 1`] = ` `; exports[`snowpack install config-external: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ config-external-pkg-a.js XXXX KB XXXX KB XXXX KB" @@ -749,8 +749,8 @@ exports[`snowpack install config-named-exports: import-map.json 1`] = ` `; exports[`snowpack install config-named-exports: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ cjs-named-export-pkg.js XXXX KB XXXX KB XXXX KB" @@ -990,8 +990,8 @@ export { FOO };" `; exports[`snowpack install config-polyfill-node: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ node-builtin-pkg.js XXXX KB XXXX KB XXXX KB" @@ -1015,8 +1015,8 @@ exports[`snowpack install config-rollup: import-map.json 1`] = ` `; exports[`snowpack install config-rollup: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli ├─ svelte-routing.js XXXX KB XXXX KB XXXX KB @@ -3847,8 +3847,8 @@ exports[`snowpack install config-with-cli-flags: import-map.json 1`] = ` `; exports[`snowpack install config-with-cli-flags: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ shallow-equal.js XXXX KB XXXX KB XXXX KB" @@ -3915,8 +3915,8 @@ exports[`snowpack install dep-browser-entrypoint-object: import-map.json 1`] = ` `; exports[`snowpack install dep-browser-entrypoint-object: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli ├─ package-has-valid.js XXXX KB XXXX KB XXXX KB @@ -3953,8 +3953,8 @@ exports[`snowpack install dep-exports: import-map.json 1`] = ` `; exports[`snowpack install dep-exports: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli ├─ preact.js XXXX KB XXXX KB XXXX KB @@ -6455,8 +6455,8 @@ exports[`snowpack install dep-list-complex: import-map.json 1`] = ` `; exports[`snowpack install dep-list-complex: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ dat.gui.js XXXX KB XXXX KB XXXX KB" @@ -6480,8 +6480,8 @@ exports[`snowpack install dep-list-css: import-map.json 1`] = ` `; exports[`snowpack install dep-list-css: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete" +"[snowpack] installing dependencies... +[snowpack] ✔ install complete!" `; exports[`snowpack install dep-list-simple: allFiles 1`] = ` @@ -11151,8 +11151,8 @@ exports[`snowpack install dep-list-simple: import-map.json 1`] = ` `; exports[`snowpack install dep-list-simple: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ async.js XXXX KB XXXX KB XXXX KB" @@ -11240,8 +11240,8 @@ export { Headers, Request, Response };" `; exports[`snowpack install dep-node-fetch: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli ├─ dep-node-fetch-mock-pkg.js XXXX KB XXXX KB XXXX KB @@ -11283,8 +11283,8 @@ exports[`snowpack install dep-remote-url: import-map.json 1`] = ` `; exports[`snowpack install dep-remote-url: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ remote-url-pkg.js XXXX KB XXXX KB XXXX KB" @@ -11340,8 +11340,8 @@ exports[`snowpack install dep-types-only: import-map.json 1`] = ` `; exports[`snowpack install dep-types-only: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ array-flatten.js XXXX KB XXXX KB XXXX KB" @@ -11356,7 +11356,7 @@ exports[`snowpack install error-config-invalid: output 1`] = ` exports[`snowpack install error-empty-dep-list: output 1`] = `"[snowpack] Nothing to install."`; exports[`snowpack install error-file-ext: output 1`] = ` -"[snowpack] ! installing dependencies… +"[snowpack] installing dependencies... [snowpack] Failed to load ../../../node_modules/error-file-ext-dep-b/index.vue Try installing rollup-plugin-vue and adding it to Snowpack (https://www.snowpack.dev/#custom-rollup-plugins) [snowpack] Install failed." @@ -11371,32 +11371,31 @@ exports[`snowpack install error-illegal-env-var: output 1`] = ` exports[`snowpack install error-include-ignore-unsupported-files: output 1`] = `"[snowpack] Nothing to install."`; exports[`snowpack install error-missing-dep: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] Package \\"fake-module\\" not found. Have you installed it? -[snowpack] Install failed." +"[snowpack] installing dependencies... +[snowpack] Package \\"fake-module\\" not found. Have you installed it?" `; exports[`snowpack install error-missing-exports: output 1`] = ` -"[snowpack] ! installing dependencies… +"[snowpack] installing dependencies... [snowpack] Package \\"preact\\" exists but package.json \\"exports\\" does not include entry for \\"./debug/src/check-props\\"." `; exports[`snowpack install error-no-dep-list: output 1`] = `"[snowpack] Nothing to install."`; exports[`snowpack install error-node-builtin-unresolved: output 1`] = ` -"[snowpack] ! installing dependencies… +"[snowpack] installing dependencies... [snowpack] ../../../node_modules/bad-node-builtin-pkg/entrypoint.js Module \\"http\\" (Node.js built-in) is not available in the browser. Run Snowpack with --polyfill-node to fix. [snowpack] Install failed." `; exports[`snowpack install error-react-source-pika: output 1`] = ` -"[snowpack] ! installing dependencies… +"[snowpack] installing dependencies... [snowpack] React workaround packages no longer needed! Revert to the official React & React-DOM packages." `; exports[`snowpack install error-react-workaround: output 1`] = ` -"[snowpack] ! installing dependencies… +"[snowpack] installing dependencies... [snowpack] React workaround packages no longer needed! Revert back to the official React & React-DOM packages." `; @@ -11418,8 +11417,8 @@ exports[`snowpack install exclude: import-map.json 1`] = ` `; exports[`snowpack install exclude: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli ├─ vue-router.js XXXX KB XXXX KB XXXX KB @@ -21713,8 +21712,8 @@ exports[`snowpack install exclude-external-packages: import-map.json 1`] = ` `; exports[`snowpack install exclude-external-packages: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ array-flatten.js XXXX KB XXXX KB XXXX KB" @@ -21736,8 +21735,8 @@ exports[`snowpack install export-maps: import-map.json 1`] = ` `; exports[`snowpack install export-maps: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ preact.js XXXX KB XXXX KB XXXX KB" @@ -22258,8 +22257,8 @@ exports[`snowpack install include: import-map.json 1`] = ` `; exports[`snowpack install include: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli ├─ array-flatten.js XXXX KB XXXX KB XXXX KB @@ -37582,8 +37581,8 @@ exports[`snowpack install include-missing-in-package-json: import-map.json 1`] = `; exports[`snowpack install include-missing-in-package-json: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ @material/list.js XXXX KB XXXX KB XXXX KB" @@ -37978,8 +37977,8 @@ exports[`snowpack install include-ts: import-map.json 1`] = ` `; exports[`snowpack install include-ts: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli ├─ array-flatten.js XXXX KB XXXX KB XXXX KB @@ -51521,8 +51520,8 @@ exports[`snowpack install include-with-alias: import-map.json 1`] = ` `; exports[`snowpack install include-with-alias: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ array-flatten.js XXXX KB XXXX KB XXXX KB" @@ -51917,8 +51916,8 @@ exports[`snowpack install include-with-package-name: import-map.json 1`] = ` `; exports[`snowpack install include-with-package-name: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli ├─ array-flatten.js XXXX KB XXXX KB XXXX KB @@ -65460,8 +65459,8 @@ exports[`snowpack install legacy-mount-alias: import-map.json 1`] = ` `; exports[`snowpack install legacy-mount-alias: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ array-flatten.js XXXX KB XXXX KB XXXX KB" @@ -65491,8 +65490,8 @@ export { cliA, confA, confB, nodeEnv };" `; exports[`snowpack install node-env: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ node-env-mock-pkg.js XXXX KB XXXX KB XXXX KB" @@ -65518,8 +65517,8 @@ exports[`snowpack install package-react: import-map.json 1`] = ` `; exports[`snowpack install package-react: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli ├─ react-dom.js XXXX KB XXXX KB XXXX KB @@ -90639,8 +90638,8 @@ exports[`snowpack install sub-package-json: import-map.json 1`] = ` `; exports[`snowpack install sub-package-json: output 1`] = ` -"[snowpack] ! installing dependencies… -[snowpack] ✔ install complete +"[snowpack] installing dependencies... +[snowpack] ✔ install complete! [snowpack] ⦿ web_modules/ size gzip brotli └─ solid-js/dom.js XXXX KB XXXX KB XXXX KB"