From d12a42bfa8d546c89c36c44d6965c3d54d8a2da3 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 11:11:58 -0700 Subject: [PATCH 01/12] [chore] simplify internal prerender API --- .changeset/soft-humans-cheer.md | 5 +++ packages/kit/src/core/prerender/prerender.js | 35 +++++++++++++++++--- packages/kit/src/vite/index.js | 24 +++----------- 3 files changed, 39 insertions(+), 25 deletions(-) create mode 100644 .changeset/soft-humans-cheer.md diff --git a/.changeset/soft-humans-cheer.md b/.changeset/soft-humans-cheer.md new file mode 100644 index 000000000000..6b1be7188549 --- /dev/null +++ b/.changeset/soft-humans-cheer.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +[chore] simplify internal prerender API diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index b634f29b9e9a..e32cc2a5ade5 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -1,5 +1,5 @@ -import { readFileSync, writeFileSync } from 'fs'; -import { dirname, join } from 'path'; +import { readdirSync, readFileSync, statSync, writeFileSync } from 'fs'; +import { dirname, join, relative } from 'path'; import { pathToFileURL, URL } from 'url'; import { mkdirp } from '../../utils/filesystem.js'; import { installPolyfills } from '../../node/polyfills.js'; @@ -52,12 +52,12 @@ const REDIRECT = 3; /** * @param {{ * config: import('types').ValidatedKitConfig; - * entries: string[]; - * files: Set; + * client_out_dir: string; + * manifest_path: string; * log: Logger; * }} opts */ -export async function prerender({ config, entries, files, log }) { +export async function prerender({ config, client_out_dir, manifest_path, log }) { /** @type {import('types').Prerendered} */ const prerendered = { pages: new Map(), @@ -160,6 +160,7 @@ export async function prerender({ config, entries, files, log }) { return file; } + const files = get_files(client_out_dir); const seen = new Set(); const written = new Set(); @@ -321,6 +322,12 @@ export async function prerender({ config, entries, files, log }) { if (config.prerender.enabled) { for (const entry of config.prerender.entries) { if (entry === '*') { + /** @type {import('types').ManifestData} */ + const { routes } = (await import(manifest_path)).manifest._; + const entries = routes + .map((route) => (route.type === 'page' ? route.path : '')) + .filter(Boolean); + for (const entry of entries) { enqueue(null, config.paths.base + entry); // TODO can we pre-normalize these? } @@ -351,3 +358,21 @@ export async function prerender({ config, entries, files, log }) { function getClientAddress() { throw new Error('Cannot read clientAddress during prerendering'); } + +/** + * @param {string} dir + * @param {string} [curr_dir] + */ +function get_files(dir, curr_dir = dir) { + const result = new Set(); + const files = readdirSync(curr_dir); + for (const file of files) { + const name = join(curr_dir, file); + if (statSync(name).isDirectory()) { + get_files(dir, name).forEach((f) => result.add(f)); + } else { + result.add(relative(dir, name)); + } + } + return result; +} diff --git a/packages/kit/src/vite/index.js b/packages/kit/src/vite/index.js index 99023165f7f5..c66e66c6e563 100644 --- a/packages/kit/src/vite/index.js +++ b/packages/kit/src/vite/index.js @@ -302,8 +302,9 @@ function kit() { server }; + const manifest_path = `${paths.output_dir}/server/manifest.js`; fs.writeFileSync( - `${paths.output_dir}/server/manifest.js`, + manifest_path, `export const manifest = ${generate_manifest({ build_data, relative_path: '.', @@ -314,27 +315,10 @@ function kit() { process.env.SVELTEKIT_SERVER_BUILD_COMPLETED = 'true'; log.info('Prerendering'); - const static_files = manifest_data.assets.map((asset) => posixify(asset.file)); - - const files = new Set([ - ...static_files, - ...chunks.map((chunk) => chunk.fileName), - ...assets.map((chunk) => 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, + client_out_dir: vite_config.build.outDir, + manifest_path, log }); From 10f4ca7afb39676d4544958f25e3e58f79970c17 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 12:57:59 -0700 Subject: [PATCH 02/12] Update packages/kit/src/core/prerender/prerender.js Co-authored-by: Rich Harris --- packages/kit/src/core/prerender/prerender.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index e32cc2a5ade5..e417a302b42f 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -1,7 +1,7 @@ import { readdirSync, readFileSync, statSync, writeFileSync } from 'fs'; import { dirname, join, relative } from 'path'; import { pathToFileURL, URL } from 'url'; -import { mkdirp } from '../../utils/filesystem.js'; +import { mkdirp, walk } from '../../utils/filesystem.js'; import { installPolyfills } from '../../node/polyfills.js'; import { is_root_relative, normalize_path, resolve } from '../../utils/url.js'; import { queue } from './queue.js'; From cfa64182bbe06a74355f92d8e67c10173ebef641 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 12:58:04 -0700 Subject: [PATCH 03/12] Update packages/kit/src/core/prerender/prerender.js Co-authored-by: Rich Harris --- packages/kit/src/core/prerender/prerender.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index e417a302b42f..7caacdb2b82c 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -160,7 +160,7 @@ export async function prerender({ config, client_out_dir, manifest_path, log }) return file; } - const files = get_files(client_out_dir); + const files = new Set(walk(client_out_dir)); const seen = new Set(); const written = new Set(); From 88f5b4f48747abb7cfd35ee1c3eec861b4b3fd4f Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 12:58:10 -0700 Subject: [PATCH 04/12] Update packages/kit/src/core/prerender/prerender.js Co-authored-by: Rich Harris --- packages/kit/src/core/prerender/prerender.js | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index 7caacdb2b82c..bb760a9000cf 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -358,21 +358,3 @@ export async function prerender({ config, client_out_dir, manifest_path, log }) function getClientAddress() { throw new Error('Cannot read clientAddress during prerendering'); } - -/** - * @param {string} dir - * @param {string} [curr_dir] - */ -function get_files(dir, curr_dir = dir) { - const result = new Set(); - const files = readdirSync(curr_dir); - for (const file of files) { - const name = join(curr_dir, file); - if (statSync(name).isDirectory()) { - get_files(dir, name).forEach((f) => result.add(f)); - } else { - result.add(relative(dir, name)); - } - } - return result; -} From 612b5bf4fc0d4e5c8e172d414dac61e3487dab91 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 13:18:27 -0700 Subject: [PATCH 05/12] try to fix windows --- packages/kit/src/core/prerender/prerender.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index bb760a9000cf..693227bae5c2 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -1,7 +1,7 @@ import { readdirSync, readFileSync, statSync, writeFileSync } from 'fs'; import { dirname, join, relative } from 'path'; import { pathToFileURL, URL } from 'url'; -import { mkdirp, walk } from '../../utils/filesystem.js'; +import { mkdirp, posixify, walk } from '../../utils/filesystem.js'; import { installPolyfills } from '../../node/polyfills.js'; import { is_root_relative, normalize_path, resolve } from '../../utils/url.js'; import { queue } from './queue.js'; @@ -160,7 +160,7 @@ export async function prerender({ config, client_out_dir, manifest_path, log }) return file; } - const files = new Set(walk(client_out_dir)); + const files = new Set(walk(client_out_dir).map(f => posixify(f))); const seen = new Set(); const written = new Set(); From cc5941802879b55066dd2c22543dd2b10894b0c6 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 13:21:49 -0700 Subject: [PATCH 06/12] format --- packages/kit/src/core/prerender/prerender.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index 693227bae5c2..9718cf69741b 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -160,7 +160,7 @@ export async function prerender({ config, client_out_dir, manifest_path, log }) return file; } - const files = new Set(walk(client_out_dir).map(f => posixify(f))); + const files = new Set(walk(client_out_dir).map((f) => posixify(f))); const seen = new Set(); const written = new Set(); From 04cc4131cd79cd9211a0d6f15be6c364a6d62ae6 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 13:43:54 -0700 Subject: [PATCH 07/12] try to fix windows again --- packages/kit/src/core/prerender/prerender.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index 9718cf69741b..d0c919bdf6cd 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -1,7 +1,7 @@ -import { readdirSync, readFileSync, statSync, writeFileSync } from 'fs'; -import { dirname, join, relative } from 'path'; +import { readFileSync, writeFileSync } from 'fs'; +import { dirname, join } from 'path'; import { pathToFileURL, URL } from 'url'; -import { mkdirp, posixify, walk } from '../../utils/filesystem.js'; +import { mkdirp, walk } from '../../utils/filesystem.js'; import { installPolyfills } from '../../node/polyfills.js'; import { is_root_relative, normalize_path, resolve } from '../../utils/url.js'; import { queue } from './queue.js'; @@ -160,7 +160,7 @@ export async function prerender({ config, client_out_dir, manifest_path, log }) return file; } - const files = new Set(walk(client_out_dir).map((f) => posixify(f))); + const files = new Set(walk(client_out_dir).map((f) => pathToFileURL(f))); const seen = new Set(); const written = new Set(); From 93480f41dbabed23565aaac5907c4052b1c6b156 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 14:11:44 -0700 Subject: [PATCH 08/12] fix --- packages/kit/src/core/prerender/prerender.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index d0c919bdf6cd..a359c8fd94e6 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -160,7 +160,7 @@ export async function prerender({ config, client_out_dir, manifest_path, log }) return file; } - const files = new Set(walk(client_out_dir).map((f) => pathToFileURL(f))); + const files = new Set(walk(client_out_dir).map((f) => pathToFileURL(f).href)); const seen = new Set(); const written = new Set(); From a4afc59714670c23ac9279b699e1b5c73735ca86 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 14:23:23 -0700 Subject: [PATCH 09/12] i clearly haven't slept. also windows :-p --- packages/kit/src/core/prerender/prerender.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index a359c8fd94e6..82c0e8062f5c 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -160,7 +160,7 @@ export async function prerender({ config, client_out_dir, manifest_path, log }) return file; } - const files = new Set(walk(client_out_dir).map((f) => pathToFileURL(f).href)); + const files = new Set(walk(client_out_dir)); const seen = new Set(); const written = new Set(); @@ -323,7 +323,7 @@ export async function prerender({ config, client_out_dir, manifest_path, log }) for (const entry of config.prerender.entries) { if (entry === '*') { /** @type {import('types').ManifestData} */ - const { routes } = (await import(manifest_path)).manifest._; + const { routes } = (await import(pathToFileURL(manifest_path).href)).manifest._; const entries = routes .map((route) => (route.type === 'page' ? route.path : '')) .filter(Boolean); From 7a7b661d25a18aa940fcf6fe8a65c147bbba3621 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 14:48:37 -0700 Subject: [PATCH 10/12] troubleshooting via CI sucks --- packages/kit/src/core/prerender/prerender.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index 82c0e8062f5c..9623f662c37a 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -1,7 +1,7 @@ import { readFileSync, writeFileSync } from 'fs'; import { dirname, join } from 'path'; import { pathToFileURL, URL } from 'url'; -import { mkdirp, walk } from '../../utils/filesystem.js'; +import { mkdirp, posixify, walk } from '../../utils/filesystem.js'; import { installPolyfills } from '../../node/polyfills.js'; import { is_root_relative, normalize_path, resolve } from '../../utils/url.js'; import { queue } from './queue.js'; @@ -160,7 +160,7 @@ export async function prerender({ config, client_out_dir, manifest_path, log }) return file; } - const files = new Set(walk(client_out_dir)); + const files = new Set(walk(client_out_dir).map((f) => posixify(f))); const seen = new Set(); const written = new Set(); From b1a6849259673a19445b2bd0be0ebf08c707d528 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 15:36:42 -0700 Subject: [PATCH 11/12] Update packages/kit/src/core/prerender/prerender.js Co-authored-by: Rich Harris --- packages/kit/src/core/prerender/prerender.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index 9623f662c37a..6474a234aba9 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -160,7 +160,7 @@ export async function prerender({ config, client_out_dir, manifest_path, log }) return file; } - const files = new Set(walk(client_out_dir).map((f) => posixify(f))); + const files = new Set(walk(client_out_dir).map(posixify)); const seen = new Set(); const written = new Set(); From 747536fc9f1eaa15a48342973b41f13d2958d8fd Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 21 Jul 2022 15:48:57 -0700 Subject: [PATCH 12/12] remove changeset --- .changeset/soft-humans-cheer.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/soft-humans-cheer.md diff --git a/.changeset/soft-humans-cheer.md b/.changeset/soft-humans-cheer.md deleted file mode 100644 index 6b1be7188549..000000000000 --- a/.changeset/soft-humans-cheer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -[chore] simplify internal prerender API