From 56754ea668dfee98d4bc448afcd7292667a8fff9 Mon Sep 17 00:00:00 2001 From: Ignatius Bagus Date: Thu, 14 Jul 2022 13:23:32 +0700 Subject: [PATCH 1/9] loop over values instead with `Object.values` --- packages/kit/src/vite/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/kit/src/vite/index.js b/packages/kit/src/vite/index.js index d5a78ea08925..3831a8ddb3fc 100644 --- a/packages/kit/src/vite/index.js +++ b/packages/kit/src/vite/index.js @@ -421,7 +421,6 @@ function collect_output(bundle) { } else { chunks.push(value); } - } return { assets, chunks }; } From 0e7bfe3f49e4d9e70e44a8964ec4576cdce29f71 Mon Sep 17 00:00:00 2001 From: Ignatius Bagus Date: Thu, 14 Jul 2022 13:24:32 +0700 Subject: [PATCH 2/9] missed a closing bracket --- packages/kit/src/vite/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kit/src/vite/index.js b/packages/kit/src/vite/index.js index 3831a8ddb3fc..d5a78ea08925 100644 --- a/packages/kit/src/vite/index.js +++ b/packages/kit/src/vite/index.js @@ -421,6 +421,7 @@ function collect_output(bundle) { } else { chunks.push(value); } + } return { assets, chunks }; } From 64053865f62b684aec61f0ee3241a3f3f0212ffa Mon Sep 17 00:00:00 2001 From: gtm-nayan Date: Thu, 14 Jul 2022 13:11:48 +0545 Subject: [PATCH 3/9] avoid concealing build errors --- packages/kit/src/vite/index.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/vite/index.js b/packages/kit/src/vite/index.js index d5a78ea08925..7680882defae 100644 --- a/packages/kit/src/vite/index.js +++ b/packages/kit/src/vite/index.js @@ -109,6 +109,11 @@ function kit() { */ let paths; + /** + * @type {Error | undefined} + */ + let build_error; + function vite_client_config() { /** @type {Record} */ const input = { @@ -256,6 +261,10 @@ function kit() { } }, + buildEnd(err) { + build_error = err; + }, + /** * Vite builds a single bundle. We need three bundles: client, server, and service worker. * The user's package.json scripts will invoke the Vite CLI to execute the client build. We @@ -351,9 +360,13 @@ function kit() { * Runs the adapter. */ async closeBundle() { - if (!is_build) { - return; // vite calls closeBundle when dev-server restarts, ignore that + if ( + !is_build || // vite calls closeBundle when dev-server restarts, ignore that + build_error // don't try prerendering if build failed + ) { + return; } + if (svelte_config.kit.adapter) { const { adapt } = await import('../core/adapt/index.js'); await adapt(svelte_config, build_data, prerendered, { log }); From 2f845d1494c82e94e7c94442c78e348163d7ae23 Mon Sep 17 00:00:00 2001 From: gtm-nayan Date: Thu, 14 Jul 2022 13:14:19 +0545 Subject: [PATCH 4/9] fix comment --- packages/kit/src/vite/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/vite/index.js b/packages/kit/src/vite/index.js index 7680882defae..bed4932afe28 100644 --- a/packages/kit/src/vite/index.js +++ b/packages/kit/src/vite/index.js @@ -362,7 +362,7 @@ function kit() { async closeBundle() { if ( !is_build || // vite calls closeBundle when dev-server restarts, ignore that - build_error // don't try prerendering if build failed + build_error // don't try adapting if build failed ) { return; } From 9ac7ca8da4e35e4866ae1f317a9b242506f5a48a Mon Sep 17 00:00:00 2001 From: gtm-nayan Date: Thu, 14 Jul 2022 13:15:42 +0545 Subject: [PATCH 5/9] changeset --- .changeset/large-seahorses-check.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/large-seahorses-check.md diff --git a/.changeset/large-seahorses-check.md b/.changeset/large-seahorses-check.md new file mode 100644 index 000000000000..16dd53e44aae --- /dev/null +++ b/.changeset/large-seahorses-check.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: don't try adapting if build failed From 7c2e838ed8a53e174a623f340a91779f8a22ea94 Mon Sep 17 00:00:00 2001 From: gtm-nayan Date: Thu, 14 Jul 2022 17:25:23 +0545 Subject: [PATCH 6/9] Handle errors in writeBundle --- packages/kit/src/vite/index.js | 155 ++++++++++++++++++--------------- 1 file changed, 85 insertions(+), 70 deletions(-) diff --git a/packages/kit/src/vite/index.js b/packages/kit/src/vite/index.js index bed4932afe28..88321dcff2d2 100644 --- a/packages/kit/src/vite/index.js +++ b/packages/kit/src/vite/index.js @@ -114,6 +114,11 @@ function kit() { */ let build_error; + /** + * @type {Error | undefined} + */ + let write_bundle_error; + function vite_client_config() { /** @type {Record} */ const input = { @@ -252,6 +257,9 @@ function kit() { * Clears the output directories. */ buildStart() { + // Reset errors in watch mode + build_error = write_bundle_error = undefined; + if (is_build) { rimraf(paths.build_dir); mkdirp(paths.build_dir); @@ -275,80 +283,86 @@ function kit() { verbose: vite_config.logLevel === 'info' }); - fs.writeFileSync( - `${paths.client_out_dir}/version.json`, - JSON.stringify({ version: process.env.VITE_SVELTEKIT_APP_VERSION }) - ); + try { + fs.writeFileSync( + `${paths.client_out_dir}/version.json`, + JSON.stringify({ version: process.env.VITE_SVELTEKIT_APP_VERSION }) + ); - const { assets, chunks } = collect_output(bundle); - log.info(`Client build completed. Wrote ${chunks.length} chunks and ${assets.length} assets`); - - log.info('Building server'); - const options = { - cwd, - config: svelte_config, - vite_config_env, - build_dir: paths.build_dir, // TODO just pass `paths` - manifest_data, - output_dir: paths.output_dir, - service_worker_entry_file: resolve_entry(svelte_config.kit.files.serviceWorker) - }; - const client = client_build_info(assets, chunks); - const server = await build_server(options, client); - - /** @type {import('types').BuildData} */ - build_data = { - app_dir: svelte_config.kit.appDir, - manifest_data, - service_worker: options.service_worker_entry_file ? 'service-worker.js' : null, // TODO make file configurable? - client, - server - }; + const { assets, chunks } = collect_output(bundle); + log.info( + `Client build completed. Wrote ${chunks.length} chunks and ${assets.length} assets` + ); - fs.writeFileSync( - `${paths.output_dir}/server/manifest.js`, - `export const manifest = ${generate_manifest({ - build_data, - relative_path: '.', - routes: manifest_data.routes - })};\n` - ); + log.info('Building server'); + const options = { + cwd, + config: svelte_config, + vite_config_env, + build_dir: paths.build_dir, // TODO just pass `paths` + manifest_data, + output_dir: paths.output_dir, + service_worker_entry_file: resolve_entry(svelte_config.kit.files.serviceWorker) + }; + const client = client_build_info(assets, chunks); + const server = await build_server(options, client); + + /** @type {import('types').BuildData} */ + build_data = { + app_dir: svelte_config.kit.appDir, + manifest_data, + service_worker: options.service_worker_entry_file ? 'service-worker.js' : null, // TODO make file configurable? + client, + server + }; + + fs.writeFileSync( + `${paths.output_dir}/server/manifest.js`, + `export const manifest = ${generate_manifest({ + build_data, + relative_path: '.', + routes: manifest_data.routes + })};\n` + ); - process.env.SVELTEKIT_SERVER_BUILD_COMPLETED = 'true'; - log.info('Prerendering'); + process.env.SVELTEKIT_SERVER_BUILD_COMPLETED = 'true'; + log.info('Prerendering'); - const static_files = manifest_data.assets.map((asset) => posixify(asset.file)); + const static_files = manifest_data.assets.map((asset) => posixify(asset.file)); - const files = new Set([ - ...static_files, - ...chunks.map((chunk) => `${svelte_config.kit.appDir}/${chunk.fileName}`), - ...assets.map((chunk) => `${svelte_config.kit.appDir}/${chunk.fileName}`) - ]); + const files = new Set([ + ...static_files, + ...chunks.map((chunk) => `${svelte_config.kit.appDir}/${chunk.fileName}`), + ...assets.map((chunk) => `${svelte_config.kit.appDir}/${chunk.fileName}`) + ]); - // TODO is this right? - static_files.forEach((file) => { - if (file.endsWith('/index.html')) { - files.add(file.slice(0, -11)); - } - }); + // TODO is this right? + static_files.forEach((file) => { + if (file.endsWith('/index.html')) { + files.add(file.slice(0, -11)); + } + }); + + prerendered = await prerender({ + config: svelte_config.kit, + entries: manifest_data.routes + .map((route) => (route.type === 'page' ? route.path : '')) + .filter(Boolean), + files, + log + }); + + if (options.service_worker_entry_file) { + if (svelte_config.kit.paths.assets) { + throw new Error('Cannot use service worker alongside config.kit.paths.assets'); + } - prerendered = await prerender({ - config: svelte_config.kit, - entries: manifest_data.routes - .map((route) => (route.type === 'page' ? route.path : '')) - .filter(Boolean), - files, - log - }); + log.info('Building service worker'); - if (options.service_worker_entry_file) { - if (svelte_config.kit.paths.assets) { - throw new Error('Cannot use service worker alongside config.kit.paths.assets'); + await build_service_worker(options, prerendered, client.vite_manifest); } - - log.info('Building service worker'); - - await build_service_worker(options, prerendered, client.vite_manifest); + } catch (error) { + throw (write_bundle_error = /** @type {Error} */ (error)); } console.log( @@ -360,11 +374,12 @@ function kit() { * Runs the adapter. */ async closeBundle() { - if ( - !is_build || // vite calls closeBundle when dev-server restarts, ignore that - build_error // don't try adapting if build failed - ) { - return; + if (!is_build) { + return; // vite calls closeBundle when dev-server restarts, ignore that + } + + if (build_error || write_bundle_error) { + return; // Do not try adapting if build failed } if (svelte_config.kit.adapter) { From 681d785033a1a55036cc672ad8549c4dd7e62d7d Mon Sep 17 00:00:00 2001 From: gtm-nayan Date: Thu, 14 Jul 2022 21:57:38 +0545 Subject: [PATCH 7/9] inline comments --- packages/kit/src/vite/index.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/kit/src/vite/index.js b/packages/kit/src/vite/index.js index 88321dcff2d2..c5a873418dac 100644 --- a/packages/kit/src/vite/index.js +++ b/packages/kit/src/vite/index.js @@ -109,14 +109,10 @@ function kit() { */ let paths; - /** - * @type {Error | undefined} - */ + /** @type {Error | undefined} */ let build_error; - /** - * @type {Error | undefined} - */ + /** @type {Error | undefined} */ let write_bundle_error; function vite_client_config() { From e985f3503c6e0a8e5e778463753ef70e08f81059 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 14 Jul 2022 17:26:32 -0400 Subject: [PATCH 8/9] track success rather than failure --- packages/kit/src/vite/index.js | 159 +++++++++++++++------------------ 1 file changed, 70 insertions(+), 89 deletions(-) diff --git a/packages/kit/src/vite/index.js b/packages/kit/src/vite/index.js index c5a873418dac..7c070e832987 100644 --- a/packages/kit/src/vite/index.js +++ b/packages/kit/src/vite/index.js @@ -109,11 +109,7 @@ function kit() { */ let paths; - /** @type {Error | undefined} */ - let build_error; - - /** @type {Error | undefined} */ - let write_bundle_error; + let completed_build = false; function vite_client_config() { /** @type {Record} */ @@ -253,9 +249,6 @@ function kit() { * Clears the output directories. */ buildStart() { - // Reset errors in watch mode - build_error = write_bundle_error = undefined; - if (is_build) { rimraf(paths.build_dir); mkdirp(paths.build_dir); @@ -265,10 +258,6 @@ function kit() { } }, - buildEnd(err) { - build_error = err; - }, - /** * Vite builds a single bundle. We need three bundles: client, server, and service worker. * The user's package.json scripts will invoke the Vite CLI to execute the client build. We @@ -279,86 +268,80 @@ function kit() { verbose: vite_config.logLevel === 'info' }); - try { - fs.writeFileSync( - `${paths.client_out_dir}/version.json`, - JSON.stringify({ version: process.env.VITE_SVELTEKIT_APP_VERSION }) - ); + fs.writeFileSync( + `${paths.client_out_dir}/version.json`, + JSON.stringify({ version: process.env.VITE_SVELTEKIT_APP_VERSION }) + ); - const { assets, chunks } = collect_output(bundle); - log.info( - `Client build completed. Wrote ${chunks.length} chunks and ${assets.length} assets` - ); + const { assets, chunks } = collect_output(bundle); + log.info(`Client build completed. Wrote ${chunks.length} chunks and ${assets.length} assets`); + + log.info('Building server'); + const options = { + cwd, + config: svelte_config, + vite_config_env, + build_dir: paths.build_dir, // TODO just pass `paths` + manifest_data, + output_dir: paths.output_dir, + service_worker_entry_file: resolve_entry(svelte_config.kit.files.serviceWorker) + }; + const client = client_build_info(assets, chunks); + const server = await build_server(options, client); + + /** @type {import('types').BuildData} */ + build_data = { + app_dir: svelte_config.kit.appDir, + manifest_data, + service_worker: options.service_worker_entry_file ? 'service-worker.js' : null, // TODO make file configurable? + client, + server + }; - log.info('Building server'); - const options = { - cwd, - config: svelte_config, - vite_config_env, - build_dir: paths.build_dir, // TODO just pass `paths` - manifest_data, - output_dir: paths.output_dir, - service_worker_entry_file: resolve_entry(svelte_config.kit.files.serviceWorker) - }; - const client = client_build_info(assets, chunks); - const server = await build_server(options, client); - - /** @type {import('types').BuildData} */ - build_data = { - app_dir: svelte_config.kit.appDir, - manifest_data, - service_worker: options.service_worker_entry_file ? 'service-worker.js' : null, // TODO make file configurable? - client, - server - }; - - fs.writeFileSync( - `${paths.output_dir}/server/manifest.js`, - `export const manifest = ${generate_manifest({ - build_data, - relative_path: '.', - routes: manifest_data.routes - })};\n` - ); + fs.writeFileSync( + `${paths.output_dir}/server/manifest.js`, + `export const manifest = ${generate_manifest({ + build_data, + relative_path: '.', + routes: manifest_data.routes + })};\n` + ); - process.env.SVELTEKIT_SERVER_BUILD_COMPLETED = 'true'; - log.info('Prerendering'); + process.env.SVELTEKIT_SERVER_BUILD_COMPLETED = 'true'; + log.info('Prerendering'); - const static_files = manifest_data.assets.map((asset) => posixify(asset.file)); + const static_files = manifest_data.assets.map((asset) => posixify(asset.file)); - const files = new Set([ - ...static_files, - ...chunks.map((chunk) => `${svelte_config.kit.appDir}/${chunk.fileName}`), - ...assets.map((chunk) => `${svelte_config.kit.appDir}/${chunk.fileName}`) - ]); + const files = new Set([ + ...static_files, + ...chunks.map((chunk) => `${svelte_config.kit.appDir}/${chunk.fileName}`), + ...assets.map((chunk) => `${svelte_config.kit.appDir}/${chunk.fileName}`) + ]); - // TODO is this right? - static_files.forEach((file) => { - if (file.endsWith('/index.html')) { - files.add(file.slice(0, -11)); - } - }); - - prerendered = await prerender({ - config: svelte_config.kit, - entries: manifest_data.routes - .map((route) => (route.type === 'page' ? route.path : '')) - .filter(Boolean), - files, - log - }); - - if (options.service_worker_entry_file) { - if (svelte_config.kit.paths.assets) { - throw new Error('Cannot use service worker alongside config.kit.paths.assets'); - } + // TODO is this right? + static_files.forEach((file) => { + if (file.endsWith('/index.html')) { + files.add(file.slice(0, -11)); + } + }); - log.info('Building service worker'); + prerendered = await prerender({ + config: svelte_config.kit, + entries: manifest_data.routes + .map((route) => (route.type === 'page' ? route.path : '')) + .filter(Boolean), + files, + log + }); - await build_service_worker(options, prerendered, client.vite_manifest); + if (options.service_worker_entry_file) { + if (svelte_config.kit.paths.assets) { + throw new Error('Cannot use service worker alongside config.kit.paths.assets'); } - } catch (error) { - throw (write_bundle_error = /** @type {Error} */ (error)); + + log.info('Building service worker'); + + await build_service_worker(options, prerendered, client.vite_manifest); } console.log( @@ -370,12 +353,10 @@ function kit() { * Runs the adapter. */ async closeBundle() { - if (!is_build) { - return; // vite calls closeBundle when dev-server restarts, ignore that - } - - if (build_error || write_bundle_error) { - return; // Do not try adapting if build failed + if (!completed_build) { + // vite calls closeBundle when dev-server restarts, ignore that, + // and only adapt when build successfully completes. + return; } if (svelte_config.kit.adapter) { From a211e3465858c5b042b0b76fad79e69f8abf6d6a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 14 Jul 2022 17:27:40 -0400 Subject: [PATCH 9/9] oops, missing piece --- packages/kit/src/vite/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/kit/src/vite/index.js b/packages/kit/src/vite/index.js index 7c070e832987..7af326bce55e 100644 --- a/packages/kit/src/vite/index.js +++ b/packages/kit/src/vite/index.js @@ -347,6 +347,8 @@ function kit() { console.log( `\nRun ${colors.bold().cyan('npm run preview')} to preview your production build locally.` ); + + completed_build = true; }, /**