From 18ce99d60bb1620e63c4fd4e6eed792b4270e280 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 | 8 +++++--- packages/adapter-cloudflare/files/worker.js | 2 +- packages/adapter-cloudflare/index.js | 7 ++++--- packages/adapter-netlify/index.js | 10 ++++++---- packages/adapter-vercel/index.js | 2 +- packages/kit/src/core/adapt/builder.js | 4 ++++ packages/kit/src/core/build/index.js | 4 +++- packages/kit/src/core/dev/plugin.js | 1 + packages/kit/src/core/generate_manifest/index.js | 1 + packages/kit/types/index.d.ts | 2 ++ packages/kit/types/internal.d.ts | 1 + 13 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 .changeset/smooth-waves-accept.md diff --git a/.changeset/smooth-waves-accept.md b/.changeset/smooth-waves-accept.md new file mode 100644 index 0000000000000..56076284d9a85 --- /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 9c778e8c109ac..c42d85cdbfa46 100644 --- a/packages/adapter-cloudflare-workers/files/entry.js +++ b/packages/adapter-cloudflare-workers/files/entry.js @@ -4,7 +4,7 @@ import { getAssetFromKV } from '@cloudflare/kv-asset-handler'; const server = new Server(manifest); -const prefix = `/${manifest.appDir}/`; +const { prefix } = manifest; addEventListener('fetch', (/** @type {FetchEvent} */ event) => { event.respondWith(handle(event)); diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index f161a109cb373..d4fd54d805a42 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -60,9 +60,11 @@ export default function () { writeFileSync(`${entrypoint}/package.json`, JSON.stringify({ main: 'index.js' })); builder.log.minor('Copying assets...'); - builder.writeClient(bucket); - builder.writeStatic(bucket); - builder.writePrerendered(bucket); + + const prefixedBucket = `${bucket}${builder.config.kit.paths.base}`; + builder.writeClient(prefixedBucket); + builder.writeStatic(prefixedBucket); + builder.writePrerendered(prefixedBucket); } }; } diff --git a/packages/adapter-cloudflare/files/worker.js b/packages/adapter-cloudflare/files/worker.js index 8a56e6a544dbf..aee00203631c0 100644 --- a/packages/adapter-cloudflare/files/worker.js +++ b/packages/adapter-cloudflare/files/worker.js @@ -3,7 +3,7 @@ import { manifest, prerendered } from 'MANIFEST'; const server = new Server(manifest); -const prefix = `/${manifest.appDir}/`; +const { prefix } = manifest; export default { /** diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index d79e658072572..f163229551b9a 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -16,9 +16,10 @@ export default function (options = {}) { builder.rimraf(tmp); builder.mkdirp(tmp); - builder.writeStatic(dest); - builder.writeClient(dest); - builder.writePrerendered(dest); + const prefixedDest = `${dest}${builder.config.kit.paths.base}`; + builder.writeStatic(prefixedDest); + builder.writeClient(prefixedDest); + builder.writePrerendered(prefixedDest); const relativePath = posix.relative(tmp, builder.getServerDirectory()); diff --git a/packages/adapter-netlify/index.js b/packages/adapter-netlify/index.js index 9d9229f9277a0..5f05afd40ab09 100644 --- a/packages/adapter-netlify/index.js +++ b/packages/adapter-netlify/index.js @@ -122,9 +122,11 @@ export default function ({ split = false } = {}) { } builder.log.minor('Copying assets...'); - builder.writeStatic(publish); - builder.writeClient(publish); - builder.writePrerendered(publish); + + const prefixedPublish = `${publish}${builder.config.kit.paths.base}`; + builder.writeStatic(prefixedPublish); + builder.writeClient(prefixedPublish); + builder.writePrerendered(prefixedPublish); builder.log.minor('Writing redirects...'); const redirect_file = join(publish, '_redirects'); @@ -136,7 +138,7 @@ export default function ({ split = false } = {}) { builder.copy('_headers', headers_file); appendFileSync( headers_file, - `\n\n/${builder.config.kit.appDir}/*\n cache-control: public\n cache-control: immutable\n cache-control: max-age=31536000\n` + `\n\n${builder.getPrefixedAppDirectory()}*\n cache-control: public\n cache-control: immutable\n cache-control: max-age=31536000\n` ); } }; diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index 7ed513d8eb9ef..1cdb4735aadf6 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -162,7 +162,7 @@ export default function ({ external = [] } = {}) { ...prerendered_pages, ...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 7c589dff643a4..bee4f1ffef849 100644 --- a/packages/kit/src/core/adapt/builder.js +++ b/packages/kit/src/core/adapt/builder.js @@ -119,6 +119,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, { filter: (file) => file[0] !== '.' diff --git a/packages/kit/src/core/build/index.js b/packages/kit/src/core/build/index.js index 61def523cc7f9..a7308ec85d6e0 100644 --- a/packages/kit/src/core/build/index.js +++ b/packages/kit/src/core/build/index.js @@ -26,6 +26,7 @@ export async function build(config, { log }) { const { manifest_data } = sync.all(config); + const assets_prefix = `${config.kit.paths.assets || config.kit.paths.base}/${config.kit.appDir}/`; const options = { cwd, config, @@ -34,7 +35,7 @@ export async function build(config, { log }) { // during `svelte-kit preview`, because we use a local asset path. If Vite // used relative paths, I _think_ this could get fixed. Issue here: // https://github.com/vitejs/vite/issues/2009 - assets_base: `${config.kit.paths.assets || config.kit.paths.base}/${config.kit.appDir}/`, + assets_base: assets_prefix, manifest_data, output_dir, client_entry_file: path.relative(cwd, `${get_runtime_path(config)}/client/start.js`), @@ -48,6 +49,7 @@ export async function build(config, { log }) { /** @type {import('types').BuildData} */ const build_data = { app_dir: config.kit.appDir, + prefix: assets_prefix, manifest_data: options.manifest_data, service_worker: options.service_worker_entry_file ? 'service-worker.js' : null, // TODO make file configurable? client, diff --git a/packages/kit/src/core/dev/plugin.js b/packages/kit/src/core/dev/plugin.js index d493af9c9a3e8..b431efa138880 100644 --- a/packages/kit/src/core/dev/plugin.js +++ b/packages/kit/src/core/dev/plugin.js @@ -49,6 +49,7 @@ export async function create_plugin(config, cwd) { manifest = { appDir: config.kit.appDir, + prefix: 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/core/generate_manifest/index.js b/packages/kit/src/core/generate_manifest/index.js index 8f25b75c2bf69..2f63243cd0180 100644 --- a/packages/kit/src/core/generate_manifest/index.js +++ b/packages/kit/src/core/generate_manifest/index.js @@ -63,6 +63,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/types/index.d.ts b/packages/kit/types/index.d.ts index b07fbee694f58..d9ce7124a43ff 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -49,6 +49,7 @@ export interface Builder { getClientDirectory(): string; getServerDirectory(): string; getStaticDirectory(): string; + getPrefixedAppDirectory(): string; /** * @param dest the destination folder to which files should be copied @@ -245,6 +246,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 f499d0365463b..ded035763ef07 100644 --- a/packages/kit/types/internal.d.ts +++ b/packages/kit/types/internal.d.ts @@ -43,6 +43,7 @@ export interface Asset { export interface BuildData { app_dir: string; + prefix: string; manifest_data: ManifestData; service_worker: string | null; client: {