diff --git a/packages/kit/package.json b/packages/kit/package.json index ddae5c52ed29..7e3e64b53321 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -93,20 +93,43 @@ "generate:types": "node scripts/generate-dts.js" }, "imports": { + "#app/env": { + "types": "./src/runtime/app/env/client.js", + "workerd": "./src/runtime/app/env/server.js", + "browser": "./src/runtime/app/env/client.js", + "default": "./src/runtime/app/env/server.js" + }, + "#app/env/public": { + "workerd": "./src/runtime/app/env/public/server.js", + "browser": "./src/runtime/app/env/public/client.js", + "default": "./src/runtime/app/env/public/server.js" + }, + "#app/env/server": { + "workerd": "./src/runtime/app/env/server.js", + "browser": "./src/runtime/invalid-import.js", + "default": "./src/runtime/app/env/server.js" + }, + "#app/forms": { + "types": "./src/runtime/app/forms/client.js", + "workerd": "./src/runtime/app/forms/server.js", + "browser": "./src/runtime/app/forms/client.js", + "default": "./src/runtime/app/forms/server.js" + }, "#app/internal/transport": { "default": "./src/runtime/app/internal/transport.js" }, + "#app/navigation": { + "types": "./src/runtime/app/navigation/client.js", + "workerd": "./src/runtime/app/navigation/server.js", + "browser": "./src/runtime/app/navigation/client.js", + "default": "./src/runtime/app/navigation/server.js" + }, "#app/paths": { "types": "./src/runtime/app/paths/internal.d.ts", "workerd": "./src/runtime/app/paths/server.js", "browser": "./src/runtime/app/paths/client.js", "default": "./src/runtime/app/paths/server.js" }, - "#app/env/public": { - "workerd": "./src/runtime/app/env/public/server.js", - "browser": "./src/runtime/app/env/public/client.js", - "default": "./src/runtime/app/env/public/server.js" - }, "#internal": { "workerd": "./src/exports/internal/server/index.js", "browser": "./src/exports/internal/client.js", diff --git a/packages/kit/scripts/generate-dts.js b/packages/kit/scripts/generate-dts.js index 89f6214ee465..c12113a94a40 100644 --- a/packages/kit/scripts/generate-dts.js +++ b/packages/kit/scripts/generate-dts.js @@ -10,7 +10,7 @@ await createBundle({ '@sveltejs/kit/node': 'src/exports/node/index.js', '@sveltejs/kit/params': 'src/exports/params/public.d.ts', '@sveltejs/kit/vite': 'src/exports/vite/public.d.ts', - '$app/env': 'src/runtime/app/env/types.d.ts', + '$app/env': 'src/runtime/app/env/client.js', '$app/forms': 'src/runtime/app/forms/public.d.ts', '$app/navigation': 'src/runtime/app/navigation/public.d.ts', '$app/paths': 'src/runtime/app/paths/public.d.ts', diff --git a/packages/kit/src/core/env.js b/packages/kit/src/core/env.js index 8b27400b4ab1..372a1aeb525d 100644 --- a/packages/kit/src/core/env.js +++ b/packages/kit/src/core/env.js @@ -39,8 +39,10 @@ export async function load_explicit_env(vite, kit, file, root, mode) { logLevel: 'silent', mode, define: { - __SVELTEKIT_PAYLOAD__: 'undefined', // coming in through static import in env/internal.js but will end up unused - __SVELTEKIT_APP_VERSION__: JSON.stringify(kit.version.name) // needed by $app/env + // these are needed by $app/env + __SVELTEKIT_APP_VERSION__: JSON.stringify(kit.version.name), + __SVELTEKIT_DEV__: mode === 'development', + __SVELTEKIT_PAYLOAD__: 'undefined' // coming in through static import in env/internal.js but will end up unused }, resolve: { alias: [ @@ -55,8 +57,8 @@ export async function load_explicit_env(vite, kit, file, root, mode) { const runner = get_runner(vite, server); - /** @type {typeof import('../runtime/app/env/internal.js')} */ ( - await runner.import(`${runtime_directory}/app/env/internal.js`) + /** @type {typeof import('../runtime/app/env/server.js')} */ ( + await runner.import(`${runtime_directory}/app/env/server.js`) ).set_building(); try { diff --git a/packages/kit/src/core/sync/write_server.js b/packages/kit/src/core/sync/write_server.js index 5ae7105a6a26..8c49b4408b37 100644 --- a/packages/kit/src/core/sync/write_server.js +++ b/packages/kit/src/core/sync/write_server.js @@ -23,7 +23,7 @@ const server_template = ({ has_service_worker, template }) => ` -import { set_building, set_prerendering } from '$app/env/internal'; +import { set_building, set_prerendering } from '$app/env/server'; import { set_assets } from '$app/paths/internal/server'; import { set_fix_stack_trace, set_manifest, set_read_implementation, log_response } from '__sveltekit/server'; import error from '../shared/error-template.js'; diff --git a/packages/kit/src/exports/vite/module_ids.js b/packages/kit/src/exports/vite/module_ids.js index a297a0b220be..065df4df902e 100644 --- a/packages/kit/src/exports/vite/module_ids.js +++ b/packages/kit/src/exports/vite/module_ids.js @@ -16,5 +16,5 @@ export const app_server = posixify( ); export const app_env_private = posixify( - fileURLToPath(new URL('../../runtime/app/env/private.js', import.meta.url)) + fileURLToPath(new URL('../../runtime/app/env/private/index.js', import.meta.url)) ); diff --git a/packages/kit/src/runtime/app/env/types.d.ts b/packages/kit/src/runtime/app/env/client.js similarity index 60% rename from packages/kit/src/runtime/app/env/types.d.ts rename to packages/kit/src/runtime/app/env/client.js index fb52b3170080..b3aca49b0ef5 100644 --- a/packages/kit/src/runtime/app/env/types.d.ts +++ b/packages/kit/src/runtime/app/env/client.js @@ -1,19 +1,24 @@ +import { payload } from '../../client/payload.js'; + /** * `true` if the app is running in the browser. + * @type {boolean} */ -export const browser: boolean; +export const browser = true; /** * Whether the dev server is running. This is not guaranteed to correspond to `NODE_ENV` or `MODE`. + * @type {boolean} */ -export const dev: boolean; +export const dev = __SVELTEKIT_DEV__; /** * SvelteKit analyses your app during the `build` step by running it. During this process, `building` is `true`. This also applies during prerendering. + * @type {boolean} */ -export const building: boolean; +export const building = false; /** * The value of `config.version.name`. */ -export const version: string; +export const version = payload.version; diff --git a/packages/kit/src/runtime/app/env/index.js b/packages/kit/src/runtime/app/env/index.js index 87a7b3521a10..8392a0e4932f 100644 --- a/packages/kit/src/runtime/app/env/index.js +++ b/packages/kit/src/runtime/app/env/index.js @@ -1,2 +1 @@ -export { BROWSER as browser, DEV as dev } from 'esm-env'; -export { building, version } from './internal.js'; +export { browser, dev, building, version } from '#app/env'; diff --git a/packages/kit/src/runtime/app/env/private.js b/packages/kit/src/runtime/app/env/private/index.js similarity index 100% rename from packages/kit/src/runtime/app/env/private.js rename to packages/kit/src/runtime/app/env/private/index.js diff --git a/packages/kit/src/runtime/app/env/internal.js b/packages/kit/src/runtime/app/env/server.js similarity index 52% rename from packages/kit/src/runtime/app/env/internal.js rename to packages/kit/src/runtime/app/env/server.js index ec8fa432a666..62f7ff4385c9 100644 --- a/packages/kit/src/runtime/app/env/internal.js +++ b/packages/kit/src/runtime/app/env/server.js @@ -1,8 +1,8 @@ -import { BROWSER } from 'esm-env'; -import { payload } from '../../client/payload.js'; - -export const version = BROWSER ? payload.version : __SVELTEKIT_APP_VERSION__; +export const browser = false; +export const dev = __SVELTEKIT_DEV__; +export const version = __SVELTEKIT_APP_VERSION__; export let building = false; + export let prerendering = false; export function set_building() { diff --git a/packages/kit/src/runtime/app/env/standard-schema.d.ts b/packages/kit/src/runtime/app/env/standard-schema.d.ts deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/runtime/app/forms/client.js b/packages/kit/src/runtime/app/forms/client.js new file mode 100644 index 000000000000..b8e7b14f110c --- /dev/null +++ b/packages/kit/src/runtime/app/forms/client.js @@ -0,0 +1,231 @@ +/** @import { ActionResult, SubmitFunction } from './types.js' */ +import { DEV } from 'esm-env'; +import { noop } from '../../../utils/functions.js'; +import { refreshAll } from '../navigation/index.js'; +import { + applyAction, + apply_action_navigation, + handle_error, + is_current_location +} from '../../client/client.js'; +import { notify_version } from '../../client/state.svelte.js'; +import { deserialize } from './shared.js'; + +export { applyAction, deserialize }; + +/** + * Shallow clone an element, so that we can access e.g. `form.action` without worrying + * that someone has added an `` (https://github.com/sveltejs/kit/issues/7593) + * @template {HTMLElement} T + * @param {T} element + * @returns {T} + */ +function clone(element) { + return /** @type {T} */ (HTMLElement.prototype.cloneNode.call(element)); +} + +/** + * This action enhances a `