UNPKG

@sveltejs/kit

Version:

SvelteKit is the fastest way to build Svelte apps

100 lines (79 loc) • 2.75 kB
import { base, assets, relative } from './internal/server.js'; import { resolve_route, find_route } from '../../../utils/routing.js'; import { decode_pathname } from '../../../utils/url.js'; import { add_data_suffix } from '../../../pathname.js'; import { try_get_request_store } from '@sveltejs/kit/internal/server'; import { manifest } from '../../server/internal.js'; import { get_hooks } from '<sveltekit:generated>/server.js'; import { DEV } from 'esm-env'; import * as e from '../../../messages/shared-errors.js'; import * as w from '../../../messages/shared-warnings.js'; export { base, assets, app_dir } from './internal/server.js'; /** @type {typeof import('./client.js').asset} */ export function asset(file) { // TODO 4.0 remove this if (file[0] === '/') { if (DEV) { w.asset_leading_slash({ path: file, fixed: file.slice(1) }); } file = file.slice(1); } return assets !== base ? `${assets}/${file}` : resolve(file); } /** @type {typeof import('./client.js').resolve} */ export function resolve(id, params) { let resolved; if (id[0] === '/') { // route ID if (id.includes('[') && !params) { e.resolve_params_missing({ id }); } resolved = resolve_route(id, params ?? {}); } else { resolved = '/' + id; } if (relative) { const store = try_get_request_store(); if (store && !store.state.prerendering?.fallback) { // the relative path depth must reflect the URL the browser is actually at, which // for a data request includes the `__data.json` suffix that was stripped during routing const pathname = store.event.isDataRequest ? add_data_suffix(store.event.url.pathname) : store.event.url.pathname; const after_base = pathname.slice(base.length); const segments = after_base.split('/').slice(2); const prefix = segments.map(() => '..').join('/') || '.'; return prefix + resolved; } } return base + resolved; } /** @type {typeof import('./client.js').match} */ export async function match(url) { const store = try_get_request_store(); if (typeof url === 'string') { const origin = store?.event.url.origin ?? 'a://a'; url = new URL(url, origin); } const { reroute } = await get_hooks(); let resolved_path; try { resolved_path = decode_pathname( (await reroute?.({ url: new URL(url), fetch: store?.event.fetch ?? fetch })) ?? url.pathname ); } catch { return null; } if (base && resolved_path.startsWith(base)) { resolved_path = resolved_path.slice(base.length) || '/'; } const matchers = await manifest.matchers(); const result = find_route(resolved_path, manifest.routes, matchers); if (result) { return { id: /** @type {import('$app/types').RouteId} */ (result.route.id), params: result.params }; } return null; }