@sveltejs/kit
Advanced tools
Comparing version 2.0.3 to 2.0.4
{ | ||
"name": "@sveltejs/kit", | ||
"version": "2.0.3", | ||
"version": "2.0.4", | ||
"description": "The fastest way to build Svelte apps", | ||
@@ -5,0 +5,0 @@ "repository": { |
@@ -5,3 +5,3 @@ # The fastest way to build Svelte apps | ||
The quickest way to get started is via the [create-svelte](https://github.com/sveltejs/kit/tree/master/packages/create-svelte) package: | ||
The quickest way to get started is via the [create-svelte](https://github.com/sveltejs/kit/tree/main/packages/create-svelte) package: | ||
@@ -19,2 +19,2 @@ ```bash | ||
[The Changelog for this package is available on GitHub](https://github.com/sveltejs/kit/blob/master/packages/kit/CHANGELOG.md). | ||
[The Changelog for this package is available on GitHub](https://github.com/sveltejs/kit/blob/main/packages/kit/CHANGELOG.md). |
@@ -73,3 +73,4 @@ import fs from 'node:fs'; | ||
output: { | ||
entryFileNames: '[name].js', | ||
// .mjs so that esbuild doesn't incorrectly inject `export` https://github.com/vitejs/vite/issues/15379 | ||
entryFileNames: 'service-worker.mjs', | ||
assetFileNames: `${kit.appDir}/immutable/assets/[name].[hash][extname]`, | ||
@@ -96,2 +97,5 @@ inlineDynamicImports: true | ||
}); | ||
// rename .mjs to .js to avoid incorrect MIME types with ancient webservers | ||
fs.renameSync(`${out}/client/service-worker.mjs`, `${out}/client/service-worker.js`); | ||
} |
import fs from 'node:fs'; | ||
import path, { join } from 'node:path'; | ||
import path from 'node:path'; | ||
@@ -22,3 +22,2 @@ import { svelte } from '@sveltejs/vite-plugin-svelte'; | ||
import { get_config_aliases, get_env, strip_virtual_prefix } from './utils.js'; | ||
import { SVELTE_KIT_ASSETS } from '../../constants.js'; | ||
import { write_client_manifest } from '../../core/sync/write_client_manifest.js'; | ||
@@ -30,3 +29,2 @@ import prerender from '../../core/postbuild/prerender.js'; | ||
import { dedent, isSvelte5Plus } from '../../core/sync/utils.js'; | ||
import sirv from 'sirv'; | ||
import { | ||
@@ -112,6 +110,10 @@ env_dynamic_private, | ||
const basename = path.basename(filename); | ||
if (basename.startsWith('+layout.') && !content.includes('<slot')) { | ||
const has_children = | ||
content.includes('<slot') || (isSvelte5Plus() && content.includes('{@render')); | ||
if (basename.startsWith('+layout.') && !has_children) { | ||
const message = | ||
`\n${colors.bold().red(path.relative('.', filename))}\n` + | ||
'`<slot />` missing — inner content will not be rendered'; | ||
`\`<slot />\`${isSvelte5Plus() ? ' or `{@render ...}` tag' : ''}` + | ||
' missing — inner content will not be rendered'; | ||
@@ -337,6 +339,2 @@ if (!warned.has(message)) { | ||
vite_config = config; | ||
// This is a hack to prevent Vite from nuking useful logs, | ||
// pending https://github.com/vitejs/vite/issues/9378 | ||
config.logger.warn(''); | ||
} | ||
@@ -633,27 +631,2 @@ }; | ||
configurePreviewServer(vite) { | ||
// generated client assets and the contents of `static` | ||
// should we use Vite's built-in asset server for this? | ||
// we would need to set the outDir to do so | ||
const { paths } = svelte_config.kit; | ||
const assets = paths.assets ? SVELTE_KIT_ASSETS : paths.base; | ||
vite.middlewares.use( | ||
scoped( | ||
assets, | ||
sirv(join(svelte_config.kit.outDir, 'output/client'), { | ||
setHeaders: (res, pathname) => { | ||
if (pathname.startsWith(`/${svelte_config.kit.appDir}/immutable`)) { | ||
res.setHeader('cache-control', 'public,max-age=31536000,immutable'); | ||
} | ||
if (vite_config.preview.cors) { | ||
res.setHeader('Access-Control-Allow-Origin', '*'); | ||
res.setHeader( | ||
'Access-Control-Allow-Headers', | ||
'Origin, Content-Type, Accept, Range' | ||
); | ||
} | ||
} | ||
}) | ||
) | ||
); | ||
return preview(vite, vite_config, svelte_config); | ||
@@ -951,23 +924,1 @@ }, | ||
`; | ||
/** | ||
* @param {string} scope | ||
* @param {(req: import('http').IncomingMessage, res: import('http').ServerResponse, next: () => void) => void} handler | ||
* @returns {(req: import('http').IncomingMessage, res: import('http').ServerResponse, next: () => void) => void} | ||
*/ | ||
function scoped(scope, handler) { | ||
if (scope === '') return handler; | ||
return (req, res, next) => { | ||
if (req.url?.startsWith(scope)) { | ||
const original_url = req.url; | ||
req.url = req.url.slice(scope.length); | ||
handler(req, res, () => { | ||
req.url = original_url; | ||
next(); | ||
}); | ||
} else { | ||
next(); | ||
} | ||
}; | ||
} |
@@ -10,2 +10,3 @@ import fs from 'node:fs'; | ||
import { SVELTE_KIT_ASSETS } from '../../../constants.js'; | ||
import { not_found } from '../utils.js'; | ||
@@ -25,2 +26,3 @@ /** @typedef {import('http').IncomingMessage} Req */ | ||
const { paths } = svelte_config.kit; | ||
const base = paths.base; | ||
const assets = paths.assets ? SVELTE_KIT_ASSETS : paths.base; | ||
@@ -54,18 +56,41 @@ | ||
return () => { | ||
// prerendered dependencies | ||
// Remove the base middleware. It screws with the URL. | ||
// It also only lets through requests beginning with the base path, so that requests beginning | ||
// with the assets URL never reach us. We could serve assets separately before the base | ||
// middleware, but we'd need that to occur after the compression and cors middlewares, so would | ||
// need to insert it manually into the stack, which would be at least as bad as doing this. | ||
for (let i = vite.middlewares.stack.length - 1; i > 0; i--) { | ||
// @ts-expect-error using internals | ||
if (vite.middlewares.stack[i].handle.name === 'viteBaseMiddleware') { | ||
vite.middlewares.stack.splice(i, 1); | ||
} | ||
} | ||
// generated client assets and the contents of `static` | ||
vite.middlewares.use( | ||
mutable(join(svelte_config.kit.outDir, 'output/prerendered/dependencies')) | ||
scoped( | ||
assets, | ||
sirv(join(svelte_config.kit.outDir, 'output/client'), { | ||
setHeaders: (res, pathname) => { | ||
// only apply to immutable directory, not e.g. version.json | ||
if (pathname.startsWith(`/${svelte_config.kit.appDir}/immutable`)) { | ||
res.setHeader('cache-control', 'public,max-age=31536000,immutable'); | ||
} | ||
} | ||
}) | ||
) | ||
); | ||
// prerendered pages (we can't just use sirv because we need to | ||
// preserve the correct trailingSlash behaviour) | ||
vite.middlewares.use((req, res, next) => { | ||
let if_none_match_value = req.headers['if-none-match']; | ||
const original_url = /** @type {string} */ (req.url); | ||
const { pathname, search } = new URL(original_url, 'http://dummy'); | ||
if (if_none_match_value?.startsWith('W/"')) { | ||
if_none_match_value = if_none_match_value.substring(2); | ||
} | ||
if (if_none_match_value === etag) { | ||
res.statusCode = 304; | ||
// if `paths.base === '/a/b/c`, then the root route is `/a/b/c/`, | ||
// regardless of the `trailingSlash` route option | ||
if (base.length > 1 && pathname === base) { | ||
let location = base + '/'; | ||
if (search) location += search; | ||
res.writeHead(307, { | ||
location | ||
}); | ||
res.end(); | ||
@@ -75,50 +100,80 @@ return; | ||
const { pathname, search } = new URL(/** @type {string} */ (req.url), 'http://dummy'); | ||
if (pathname.startsWith(base)) { | ||
next(); | ||
} else { | ||
res.statusCode = 404; | ||
not_found(req, res, base); | ||
} | ||
}); | ||
let filename = normalizePath( | ||
join(svelte_config.kit.outDir, 'output/prerendered/pages' + pathname) | ||
); | ||
let prerendered = is_file(filename); | ||
// prerendered dependencies | ||
vite.middlewares.use( | ||
scoped(base, mutable(join(svelte_config.kit.outDir, 'output/prerendered/dependencies'))) | ||
); | ||
if (!prerendered) { | ||
const has_trailing_slash = pathname.endsWith('/'); | ||
const html_filename = `${filename}${has_trailing_slash ? 'index.html' : '.html'}`; | ||
// prerendered pages (we can't just use sirv because we need to | ||
// preserve the correct trailingSlash behaviour) | ||
vite.middlewares.use( | ||
scoped(base, (req, res, next) => { | ||
let if_none_match_value = req.headers['if-none-match']; | ||
/** @type {string | undefined} */ | ||
let redirect; | ||
if (if_none_match_value?.startsWith('W/"')) { | ||
if_none_match_value = if_none_match_value.substring(2); | ||
} | ||
if (is_file(html_filename)) { | ||
filename = html_filename; | ||
prerendered = true; | ||
} else if (has_trailing_slash) { | ||
if (is_file(filename.slice(0, -1) + '.html')) { | ||
redirect = pathname.slice(0, -1); | ||
} | ||
} else if (is_file(filename + '/index.html')) { | ||
redirect = pathname + '/'; | ||
if (if_none_match_value === etag) { | ||
res.statusCode = 304; | ||
res.end(); | ||
return; | ||
} | ||
if (redirect) { | ||
if (search) redirect += search; | ||
res.writeHead(307, { | ||
location: redirect | ||
}); | ||
const { pathname, search } = new URL(/** @type {string} */ (req.url), 'http://dummy'); | ||
res.end(); | ||
let filename = normalizePath( | ||
join(svelte_config.kit.outDir, 'output/prerendered/pages' + pathname) | ||
); | ||
let prerendered = is_file(filename); | ||
return; | ||
if (!prerendered) { | ||
const has_trailing_slash = pathname.endsWith('/'); | ||
const html_filename = `${filename}${has_trailing_slash ? 'index.html' : '.html'}`; | ||
/** @type {string | undefined} */ | ||
let redirect; | ||
if (is_file(html_filename)) { | ||
filename = html_filename; | ||
prerendered = true; | ||
} else if (has_trailing_slash) { | ||
if (is_file(filename.slice(0, -1) + '.html')) { | ||
redirect = pathname.slice(0, -1); | ||
} | ||
} else if (is_file(filename + '/index.html')) { | ||
redirect = pathname + '/'; | ||
} | ||
if (redirect) { | ||
if (search) redirect += search; | ||
res.writeHead(307, { | ||
location: redirect | ||
}); | ||
res.end(); | ||
return; | ||
} | ||
} | ||
} | ||
if (prerendered) { | ||
res.writeHead(200, { | ||
'content-type': lookup(pathname) || 'text/html', | ||
etag | ||
}); | ||
if (prerendered) { | ||
res.writeHead(200, { | ||
'content-type': lookup(pathname) || 'text/html', | ||
etag | ||
}); | ||
fs.createReadStream(filename).pipe(res); | ||
} else { | ||
next(); | ||
} | ||
}); | ||
fs.createReadStream(filename).pipe(res); | ||
} else { | ||
next(); | ||
} | ||
}) | ||
); | ||
@@ -128,3 +183,2 @@ // SSR | ||
const host = req.headers['host']; | ||
req.url = req.originalUrl; | ||
@@ -163,2 +217,24 @@ const request = await getRequest({ | ||
/** | ||
* @param {string} scope | ||
* @param {Handler} handler | ||
* @returns {Handler} | ||
*/ | ||
function scoped(scope, handler) { | ||
if (scope === '') return handler; | ||
return (req, res, next) => { | ||
if (req.url?.startsWith(scope)) { | ||
const original_url = req.url; | ||
req.url = req.url.slice(scope.length); | ||
handler(req, res, () => { | ||
req.url = original_url; | ||
next(); | ||
}); | ||
} else { | ||
next(); | ||
} | ||
}; | ||
} | ||
/** @param {string} path */ | ||
@@ -165,0 +241,0 @@ function is_file(path) { |
@@ -14,3 +14,3 @@ import { client_method } from '../client/singletons.js'; | ||
* | ||
* @type {(url: string | URL, opts?: { replaceState?: boolean; noScroll?: boolean; keepFocus?: boolean; invalidateAll?: boolean; }) => Promise<void>} | ||
* @type {(url: string | URL, opts?: { replaceState?: boolean; noScroll?: boolean; keepFocus?: boolean; invalidateAll?: boolean; state?: App.PageState }) => Promise<void>} | ||
* @param {string | URL} url Where to navigate to. Note that if you've set [`config.kit.paths.base`](https://kit.svelte.dev/docs/configuration#paths) and the URL is root-relative, you need to prepend the base path if you want to navigate within the app. | ||
@@ -17,0 +17,0 @@ * @param {Object} [opts] Options related to the navigation |
@@ -1,2 +0,2 @@ | ||
This module provides access to runtime environment variables, as defined by the platform you're running on. For example if you're using [`adapter-node`](https://github.com/sveltejs/kit/tree/master/packages/adapter-node) (or running [`vite preview`](https://kit.svelte.dev/docs/cli)), this is equivalent to `process.env`. This module only includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://kit.svelte.dev/docs/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://kit.svelte.dev/docs/configuration#env) (if configured). | ||
This module provides access to runtime environment variables, as defined by the platform you're running on. For example if you're using [`adapter-node`](https://github.com/sveltejs/kit/tree/main/packages/adapter-node) (or running [`vite preview`](https://kit.svelte.dev/docs/cli)), this is equivalent to `process.env`. This module only includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://kit.svelte.dev/docs/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://kit.svelte.dev/docs/configuration#env) (if configured). | ||
@@ -3,0 +3,0 @@ This module cannot be imported into client-side code. |
// generated during release, do not modify | ||
/** @type {string} */ | ||
export const VERSION = '2.0.3'; | ||
export const VERSION = '2.0.4'; |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
701843
20480