From d449b20d96a9deb078042d91bcb5753bc0650548 Mon Sep 17 00:00:00 2001 From: David Roizenman Date: Thu, 24 Mar 2022 15:37:36 -0700 Subject: [PATCH] feat: use config.kit.paths.base for static assets fixes #4442, fixes #2843 - add manifest.prefix and builder.getAppPrefixDirectory() - adapter-cloudflare*: use manifest.prefix instead of manifest.appDir - adapter-netlify: use prefixed appDir for cache headers - adapter-vercel: use prefixed appDir for routes.json - adapter-cloudflare, adapter-cloudflare-workers, adapter-netlify: write static assets to "$dest/$base" --- .changeset/smooth-waves-accept.md | 9 +++++++++ packages/adapter-cloudflare-workers/files/entry.js | 2 +- packages/adapter-cloudflare-workers/index.js | 5 +++-- packages/adapter-cloudflare/index.js | 5 +++-- packages/adapter-cloudflare/src/worker.js | 2 +- packages/adapter-netlify/index.js | 8 +++++--- packages/adapter-vercel/index.js | 2 +- packages/kit/src/core/adapt/builder.js | 4 ++++ packages/kit/src/core/build/index.js | 0 packages/kit/src/core/dev/plugin.js | 0 packages/kit/src/core/generate_manifest/index.js | 1 + packages/kit/src/vite/dev/index.js | 1 + packages/kit/src/vite/index.js | 2 ++ packages/kit/types/index.d.ts | 2 ++ packages/kit/types/internal.d.ts | 1 + 15 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 .changeset/smooth-waves-accept.md create mode 100644 packages/kit/src/core/build/index.js create mode 100644 packages/kit/src/core/dev/plugin.js diff --git a/.changeset/smooth-waves-accept.md b/.changeset/smooth-waves-accept.md new file mode 100644 index 000000000000..56076284d9a8 --- /dev/null +++ b/.changeset/smooth-waves-accept.md @@ -0,0 +1,9 @@ +--- +'@sveltejs/adapter-cloudflare': patch +'@sveltejs/adapter-cloudflare-workers': patch +'@sveltejs/adapter-netlify': patch +'@sveltejs/adapter-vercel': patch +'@sveltejs/kit': patch +--- + +Use config.kit.paths.base prefix for static assets diff --git a/packages/adapter-cloudflare-workers/files/entry.js b/packages/adapter-cloudflare-workers/files/entry.js index 1064a1547763..ccf63e4d4d24 100644 --- a/packages/adapter-cloudflare-workers/files/entry.js +++ b/packages/adapter-cloudflare-workers/files/entry.js @@ -6,7 +6,7 @@ const static_asset_manifest = JSON.parse(static_asset_manifest_json); const server = new Server(manifest); -const prefix = `/${manifest.appDir}/`; +const { prefix } = manifest; export default { /** diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index c8830c12bfa7..5c345661bdf2 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -73,8 +73,9 @@ export default function () { }); builder.log.minor('Copying assets...'); - builder.writeClient(site.bucket); - builder.writePrerendered(site.bucket); + const prefixedBucket = `${site.bucket}${builder.config.kit.paths.base}`; + builder.writeClient(prefixedBucket); + builder.writePrerendered(prefixedBucket); } }; } diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index bfb9d968aa1f..c383d9b90d82 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -23,8 +23,9 @@ export default function () { builder.rimraf(tmp); builder.mkdirp(tmp); - builder.writeClient(dest); - builder.writePrerendered(dest); + const prefixedDest = `${dest}${builder.config.kit.paths.base}`; + builder.writeClient(prefixedDest); + builder.writePrerendered(prefixedDest); const relativePath = posix.relative(tmp, builder.getServerDirectory()); diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index 1ba1bf8d145a..79f0a7453929 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -4,7 +4,7 @@ import * as Cache from 'worktop/cfw.cache'; const server = new Server(manifest); -const prefix = `/${manifest.appDir}/`; +const { prefix } = manifest; /** @type {import('worktop/cfw').Module.Worker<{ ASSETS: import('worktop/cfw.durable').Durable.Object }>} */ const worker = { diff --git a/packages/adapter-netlify/index.js b/packages/adapter-netlify/index.js index 39bc32738954..3bfc1cc93241 100644 --- a/packages/adapter-netlify/index.js +++ b/packages/adapter-netlify/index.js @@ -55,15 +55,17 @@ export default function ({ split = false, edge = edge_set_in_env_var } = {}) { builder.log.minor(`Publishing to "${publish}"`); builder.log.minor('Copying assets...'); - builder.writeClient(publish); - builder.writePrerendered(publish); + + const prefixedPublish = `${publish}${builder.config.kit.paths.base}`; + builder.writeClient(prefixedPublish); + builder.writePrerendered(prefixedPublish); builder.log.minor('Writing custom headers...'); const headers_file = join(publish, '_headers'); builder.copy('_headers', headers_file); appendFileSync( headers_file, - `\n\n/${builder.config.kit.appDir}/immutable/*\n cache-control: public\n cache-control: immutable\n cache-control: max-age=31536000\n` + `\n\n/${builder.getPrefixedAppDirectory()}/immutable/*\n cache-control: public\n cache-control: immutable\n cache-control: max-age=31536000\n` ); // for esbuild, use ESM diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index fc55c079f45d..b85502f79258 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -118,7 +118,7 @@ export default function ({ external = [], edge, split } = {}) { ...redirects[builder.config.kit.trailingSlash], ...prerendered_redirects, { - src: `/${builder.config.kit.appDir}/.+`, + src: `/${builder.getPrefixedAppDirectory()}/.+`, headers: { 'cache-control': 'public, immutable, max-age=31536000' } diff --git a/packages/kit/src/core/adapt/builder.js b/packages/kit/src/core/adapt/builder.js index d54628378bf6..8a4f75beaa98 100644 --- a/packages/kit/src/core/adapt/builder.js +++ b/packages/kit/src/core/adapt/builder.js @@ -121,6 +121,10 @@ export function create_builder({ config, build_data, prerendered, log }) { return config.kit.files.assets; }, + getPrefixedAppDirectory() { + return build_data.prefix; + }, + writeClient(dest) { return [...copy(`${config.kit.outDir}/output/client`, dest)]; }, diff --git a/packages/kit/src/core/build/index.js b/packages/kit/src/core/build/index.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/src/core/dev/plugin.js b/packages/kit/src/core/dev/plugin.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/src/core/generate_manifest/index.js b/packages/kit/src/core/generate_manifest/index.js index 983c8501e99c..b5c8b8ecf9e9 100644 --- a/packages/kit/src/core/generate_manifest/index.js +++ b/packages/kit/src/core/generate_manifest/index.js @@ -65,6 +65,7 @@ export function generate_manifest({ build_data, relative_path, routes, format = // prettier-ignore return `{ appDir: ${s(build_data.app_dir)}, + prefix: ${s(build_data.prefix)}, assets: new Set(${s(assets)}), mimeTypes: ${s(get_mime_lookup(build_data.manifest_data))}, _: { diff --git a/packages/kit/src/vite/dev/index.js b/packages/kit/src/vite/dev/index.js index 4a90a5dbfb11..8b3c0f1cced2 100644 --- a/packages/kit/src/vite/dev/index.js +++ b/packages/kit/src/vite/dev/index.js @@ -44,6 +44,7 @@ export async function dev(vite, vite_config, svelte_config) { manifest = { appDir: svelte_config.kit.appDir, + prefix: svelte_config.kit.appDir, assets: new Set(manifest_data.assets.map((asset) => asset.file)), mimeTypes: get_mime_lookup(manifest_data), _: { diff --git a/packages/kit/src/vite/index.js b/packages/kit/src/vite/index.js index 950cae8e25b5..312bee541949 100644 --- a/packages/kit/src/vite/index.js +++ b/packages/kit/src/vite/index.js @@ -286,6 +286,7 @@ function kit() { log.info(`Client build completed. Wrote ${chunks.length} chunks and ${assets.length} assets`); log.info('Building server'); + const assets_prefix = `${svelte_config.kit.paths.assets || svelte_config.kit.paths.base}/${svelte_config.kit.appDir}/`; const options = { cwd, config: svelte_config, @@ -301,6 +302,7 @@ function kit() { /** @type {import('types').BuildData} */ build_data = { app_dir: svelte_config.kit.appDir, + prefix: assets_prefix, manifest_data, service_worker: options.service_worker_entry_file ? 'service-worker.js' : null, // TODO make file configurable? client, diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index cb9f9fc16376..3dedc37d1d4d 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -45,6 +45,7 @@ export interface Builder { getClientDirectory(): string; getServerDirectory(): string; getStaticDirectory(): string; + getPrefixedAppDirectory(): string; /** * @param dest the destination folder to which files should be copied @@ -273,6 +274,7 @@ export class Server { export interface SSRManifest { appDir: string; + prefix: string; assets: Set; mimeTypes: Record; diff --git a/packages/kit/types/internal.d.ts b/packages/kit/types/internal.d.ts index f7a88de58f37..f8cb1954f21c 100644 --- a/packages/kit/types/internal.d.ts +++ b/packages/kit/types/internal.d.ts @@ -44,6 +44,7 @@ export interface Asset { export interface BuildData { app_dir: string; + prefix: string; manifest_data: ManifestData; service_worker: string | null; client: {