From 2137717ea8592c310ada93490feabbd9eea125ea Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 12 Jan 2024 22:46:07 +0100 Subject: [PATCH] fix: remove internal `__sveltekit/` module declarations from types (#11620) * fix: remove internal `__sveltekit/` module declarations from types Takes advantage of the fact that dts-buddy doesn't detect the ambient-private.d.ts module declarations (which arguably is a bit weird and could result in buggy behavior, but we can use it to our advantage here). fixes #11607 * lint * re-export values from internal modules * move files * point dts-buddy at facade .d.ts files * remove some junk we no longer need --------- Co-authored-by: Rich Harris --- .changeset/brave-cats-tan.md | 5 ++ packages/kit/scripts/generate-dts.js | 16 ++++- packages/kit/src/runtime/app/environment.js | 12 ---- .../kit/src/runtime/app/environment/index.js | 6 ++ .../src/runtime/app/environment/types.d.ts | 19 ++++++ packages/kit/src/runtime/app/paths.js | 23 ------- packages/kit/src/runtime/app/paths/index.js | 8 +++ packages/kit/src/runtime/app/paths/types.d.ts | 28 ++++++++ packages/kit/src/types/ambient-private.d.ts | 25 ++++--- packages/kit/src/types/ambient.d.ts | 38 ----------- packages/kit/src/types/global-private.d.ts | 11 +++ packages/kit/types/index.d.ts | 67 +++++++------------ sites/kit.svelte.dev/scripts/types/index.js | 16 ----- 13 files changed, 132 insertions(+), 142 deletions(-) create mode 100644 .changeset/brave-cats-tan.md delete mode 100644 packages/kit/src/runtime/app/environment.js create mode 100644 packages/kit/src/runtime/app/environment/index.js create mode 100644 packages/kit/src/runtime/app/environment/types.d.ts delete mode 100644 packages/kit/src/runtime/app/paths.js create mode 100644 packages/kit/src/runtime/app/paths/index.js create mode 100644 packages/kit/src/runtime/app/paths/types.d.ts create mode 100644 packages/kit/src/types/global-private.d.ts diff --git a/.changeset/brave-cats-tan.md b/.changeset/brave-cats-tan.md new file mode 100644 index 000000000000..5ca5c1527151 --- /dev/null +++ b/.changeset/brave-cats-tan.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +fix: remove internal `__sveltekit/` module declarations from types diff --git a/packages/kit/scripts/generate-dts.js b/packages/kit/scripts/generate-dts.js index 8eeffb5b2f82..5d23c06d23f8 100644 --- a/packages/kit/scripts/generate-dts.js +++ b/packages/kit/scripts/generate-dts.js @@ -1,6 +1,7 @@ import { createBundle } from 'dts-buddy'; +import { readFileSync } from 'node:fs'; -createBundle({ +await createBundle({ output: 'types/index.d.ts', modules: { '@sveltejs/kit': 'src/exports/public.d.ts', @@ -8,11 +9,20 @@ createBundle({ '@sveltejs/kit/node': 'src/exports/node/index.js', '@sveltejs/kit/node/polyfills': 'src/exports/node/polyfills.js', '@sveltejs/kit/vite': 'src/exports/vite/index.js', - '$app/environment': 'src/runtime/app/environment.js', + '$app/environment': 'src/runtime/app/environment/types.d.ts', '$app/forms': 'src/runtime/app/forms.js', '$app/navigation': 'src/runtime/app/navigation.js', - '$app/paths': 'src/runtime/app/paths.js', + '$app/paths': 'src/runtime/app/paths/types.d.ts', '$app/stores': 'src/runtime/app/stores.js' }, include: ['src'] }); + +// dts-buddy doesn't inline imports of module declaration in ambient-private.d.ts but also doesn't include them, resulting in broken types - guard against that +const types = readFileSync('./types/index.d.ts', 'utf-8'); +if (types.includes('__sveltekit/')) { + throw new Error( + 'Found __sveltekit/ in types/index.d.ts - make sure to hide internal modules by not just reexporting them. Contents:\n\n' + + types + ); +} diff --git a/packages/kit/src/runtime/app/environment.js b/packages/kit/src/runtime/app/environment.js deleted file mode 100644 index 8393ee6dbda6..000000000000 --- a/packages/kit/src/runtime/app/environment.js +++ /dev/null @@ -1,12 +0,0 @@ -import { BROWSER, DEV } from 'esm-env'; -export { building, version } from '__sveltekit/environment'; - -/** - * `true` if the app is running in the browser. - */ -export const browser = BROWSER; - -/** - * Whether the dev server is running. This is not guaranteed to correspond to `NODE_ENV` or `MODE`. - */ -export const dev = DEV; diff --git a/packages/kit/src/runtime/app/environment/index.js b/packages/kit/src/runtime/app/environment/index.js new file mode 100644 index 000000000000..2b5461940c12 --- /dev/null +++ b/packages/kit/src/runtime/app/environment/index.js @@ -0,0 +1,6 @@ +import { BROWSER, DEV } from 'esm-env'; +export { building, version } from '__sveltekit/environment'; + +export const browser = BROWSER; + +export const dev = DEV; diff --git a/packages/kit/src/runtime/app/environment/types.d.ts b/packages/kit/src/runtime/app/environment/types.d.ts new file mode 100644 index 000000000000..da76eae46502 --- /dev/null +++ b/packages/kit/src/runtime/app/environment/types.d.ts @@ -0,0 +1,19 @@ +/** + * `true` if the app is running in the browser. + */ +export const browser: boolean; + +/** + * Whether the dev server is running. This is not guaranteed to correspond to `NODE_ENV` or `MODE`. + */ +export const dev: boolean; + +/** + * SvelteKit analyses your app during the `build` step by running it. During this process, `building` is `true`. This also applies during prerendering. + */ +export const building: boolean; + +/** + * The value of `config.kit.version.name`. + */ +export const version: string; diff --git a/packages/kit/src/runtime/app/paths.js b/packages/kit/src/runtime/app/paths.js deleted file mode 100644 index 32df2e1b3eda..000000000000 --- a/packages/kit/src/runtime/app/paths.js +++ /dev/null @@ -1,23 +0,0 @@ -export { base, assets } from '__sveltekit/paths'; -import { base } from '__sveltekit/paths'; -import { resolve_route } from '../../utils/routing.js'; - -/** - * Populate a route ID with params to resolve a pathname. - * @example - * ```js - * resolveRoute( - * `/blog/[slug]/[...somethingElse]`, - * { - * slug: 'hello-world', - * somethingElse: 'something/else' - * } - * ); // `/blog/hello-world/something/else` - * ``` - * @param {string} id - * @param {Record} params - * @returns {string} - */ -export function resolveRoute(id, params) { - return base + resolve_route(id, params); -} diff --git a/packages/kit/src/runtime/app/paths/index.js b/packages/kit/src/runtime/app/paths/index.js new file mode 100644 index 000000000000..5a150fbfaa0f --- /dev/null +++ b/packages/kit/src/runtime/app/paths/index.js @@ -0,0 +1,8 @@ +export { base, assets } from '__sveltekit/paths'; +import { base } from '__sveltekit/paths'; +import { resolve_route } from '../../../utils/routing.js'; + +/** @type {import('./types.d.ts').resolveRoute} */ +export function resolveRoute(id, params) { + return base + resolve_route(id, params); +} diff --git a/packages/kit/src/runtime/app/paths/types.d.ts b/packages/kit/src/runtime/app/paths/types.d.ts new file mode 100644 index 000000000000..0bc521a9fdb8 --- /dev/null +++ b/packages/kit/src/runtime/app/paths/types.d.ts @@ -0,0 +1,28 @@ +/** + * A string that matches [`config.kit.paths.base`](https://kit.svelte.dev/docs/configuration#paths). + * + * Example usage: `Link` + */ +export let base: '' | `/${string}`; + +/** + * An absolute path that matches [`config.kit.paths.assets`](https://kit.svelte.dev/docs/configuration#paths). + * + * > If a value for `config.kit.paths.assets` is specified, it will be replaced with `'/_svelte_kit_assets'` during `vite dev` or `vite preview`, since the assets don't yet live at their eventual URL. + */ +export let assets: '' | `https://${string}` | `http://${string}` | '/_svelte_kit_assets'; + +/** + * Populate a route ID with params to resolve a pathname. + * @example + * ```js + * resolveRoute( + * `/blog/[slug]/[...somethingElse]`, + * { + * slug: 'hello-world', + * somethingElse: 'something/else' + * } + * ); // `/blog/hello-world/something/else` + * ``` + */ +export function resolveRoute(id: string, params: Record): string; diff --git a/packages/kit/src/types/ambient-private.d.ts b/packages/kit/src/types/ambient-private.d.ts index 843cc94d342b..544c9a73b78a 100644 --- a/packages/kit/src/types/ambient-private.d.ts +++ b/packages/kit/src/types/ambient-private.d.ts @@ -1,11 +1,18 @@ -declare global { - const __SVELTEKIT_ADAPTER_NAME__: string; - const __SVELTEKIT_APP_VERSION_FILE__: string; - const __SVELTEKIT_APP_VERSION_POLL_INTERVAL__: number; - const __SVELTEKIT_DEV__: boolean; - const __SVELTEKIT_EMBEDDED__: boolean; - var Bun: object; - var Deno: object; +/** Internal version of $app/environment */ +declare module '__sveltekit/environment' { + export const building: boolean; + export const prerendering: boolean; + export const version: string; + export function set_building(): void; + export function set_prerendering(): void; } -export {}; +/** Internal version of $app/paths */ +declare module '__sveltekit/paths' { + export let base: '' | `/${string}`; + export let assets: '' | `https://${string}` | `http://${string}` | '/_svelte_kit_assets'; + export let relative: boolean; + export function reset(): void; + export function override(paths: { base: string; assets: string }): void; + export function set_assets(path: string): void; +} diff --git a/packages/kit/src/types/ambient.d.ts b/packages/kit/src/types/ambient.d.ts index 2c8b7427f763..00730946b980 100644 --- a/packages/kit/src/types/ambient.d.ts +++ b/packages/kit/src/types/ambient.d.ts @@ -79,41 +79,3 @@ declare module '$service-worker' { */ export const version: string; } - -/** Internal version of $app/environment */ -declare module '__sveltekit/environment' { - /** - * SvelteKit analyses your app during the `build` step by running it. During this process, `building` is `true`. This also applies during prerendering. - */ - export const building: boolean; - /** - * True during prerendering, false otherwise. - */ - export const prerendering: boolean; - /** - * The value of `config.kit.version.name`. - */ - export const version: string; - export function set_building(): void; - export function set_prerendering(): void; -} - -/** Internal version of $app/paths */ -declare module '__sveltekit/paths' { - /** - * A string that matches [`config.kit.paths.base`](https://kit.svelte.dev/docs/configuration#paths). - * - * Example usage: `Link` - */ - export let base: '' | `/${string}`; - /** - * An absolute path that matches [`config.kit.paths.assets`](https://kit.svelte.dev/docs/configuration#paths). - * - * > If a value for `config.kit.paths.assets` is specified, it will be replaced with `'/_svelte_kit_assets'` during `vite dev` or `vite preview`, since the assets don't yet live at their eventual URL. - */ - export let assets: '' | `https://${string}` | `http://${string}` | '/_svelte_kit_assets'; - export let relative: boolean; - export function reset(): void; - export function override(paths: { base: string; assets: string }): void; - export function set_assets(path: string): void; -} diff --git a/packages/kit/src/types/global-private.d.ts b/packages/kit/src/types/global-private.d.ts new file mode 100644 index 000000000000..843cc94d342b --- /dev/null +++ b/packages/kit/src/types/global-private.d.ts @@ -0,0 +1,11 @@ +declare global { + const __SVELTEKIT_ADAPTER_NAME__: string; + const __SVELTEKIT_APP_VERSION_FILE__: string; + const __SVELTEKIT_APP_VERSION_POLL_INTERVAL__: number; + const __SVELTEKIT_DEV__: boolean; + const __SVELTEKIT_EMBEDDED__: boolean; + var Bun: object; + var Deno: object; +} + +export {}; diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index a983b4433561..acb9442b783d 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1892,15 +1892,25 @@ declare module '@sveltejs/kit/vite' { } declare module '$app/environment' { - export { building, version } from '__sveltekit/environment'; /** * `true` if the app is running in the browser. */ export const browser: boolean; + /** * Whether the dev server is running. This is not guaranteed to correspond to `NODE_ENV` or `MODE`. */ export const dev: boolean; + + /** + * SvelteKit analyses your app during the `build` step by running it. During this process, `building` is `true`. This also applies during prerendering. + */ + export const building: boolean; + + /** + * The value of `config.kit.version.name`. + */ + export const version: string; } declare module '$app/forms' { @@ -2067,7 +2077,20 @@ declare module '$app/navigation' { } declare module '$app/paths' { - export { base, assets } from '__sveltekit/paths'; + /** + * A string that matches [`config.kit.paths.base`](https://kit.svelte.dev/docs/configuration#paths). + * + * Example usage: `Link` + */ + export let base: '' | `/${string}`; + + /** + * An absolute path that matches [`config.kit.paths.assets`](https://kit.svelte.dev/docs/configuration#paths). + * + * > If a value for `config.kit.paths.assets` is specified, it will be replaced with `'/_svelte_kit_assets'` during `vite dev` or `vite preview`, since the assets don't yet live at their eventual URL. + */ + export let assets: '' | `https://${string}` | `http://${string}` | '/_svelte_kit_assets'; + /** * Populate a route ID with params to resolve a pathname. * @example @@ -2080,7 +2103,7 @@ declare module '$app/paths' { * } * ); // `/blog/hello-world/something/else` * ``` - * */ + */ export function resolveRoute(id: string, params: Record): string; } @@ -2198,42 +2221,4 @@ declare module '$service-worker' { export const version: string; } -/** Internal version of $app/environment */ -declare module '__sveltekit/environment' { - /** - * SvelteKit analyses your app during the `build` step by running it. During this process, `building` is `true`. This also applies during prerendering. - */ - export const building: boolean; - /** - * True during prerendering, false otherwise. - */ - export const prerendering: boolean; - /** - * The value of `config.kit.version.name`. - */ - export const version: string; - export function set_building(): void; - export function set_prerendering(): void; -} - -/** Internal version of $app/paths */ -declare module '__sveltekit/paths' { - /** - * A string that matches [`config.kit.paths.base`](https://kit.svelte.dev/docs/configuration#paths). - * - * Example usage: `Link` - */ - export let base: '' | `/${string}`; - /** - * An absolute path that matches [`config.kit.paths.assets`](https://kit.svelte.dev/docs/configuration#paths). - * - * > If a value for `config.kit.paths.assets` is specified, it will be replaced with `'/_svelte_kit_assets'` during `vite dev` or `vite preview`, since the assets don't yet live at their eventual URL. - */ - export let assets: '' | `https://${string}` | `http://${string}` | '/_svelte_kit_assets'; - export let relative: boolean; - export function reset(): void; - export function override(paths: { base: string; assets: string }): void; - export function set_assets(path: string): void; -} - //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/sites/kit.svelte.dev/scripts/types/index.js b/sites/kit.svelte.dev/scripts/types/index.js index 838360d66e44..85f100bf202d 100644 --- a/sites/kit.svelte.dev/scripts/types/index.js +++ b/sites/kit.svelte.dev/scripts/types/index.js @@ -310,22 +310,6 @@ for (const file of await readdir(dir)) { } } -// need to do some unfortunate finagling here, hopefully we can remove this one day -const app_paths = modules.find((module) => module.name === '$app/paths'); -const app_environment = modules.find((module) => module.name === '$app/environment'); -const __sveltekit_paths = modules.find((module) => module.name === '__sveltekit/paths'); -const __sveltekit_environment = modules.find((module) => module.name === '__sveltekit/environment'); - -app_paths?.exports.push( - __sveltekit_paths.exports.find((e) => e.name === 'assets'), - __sveltekit_paths.exports.find((e) => e.name === 'base') -); - -app_environment?.exports.push( - __sveltekit_environment.exports.find((e) => e.name === 'building'), - __sveltekit_environment.exports.find((e) => e.name === 'version') -); - modules.sort((a, b) => (a.name < b.name ? -1 : 1)); mkdirp('src/lib/generated');