@sveltejs/kit
Version:
SvelteKit is the fastest way to build Svelte apps
79 lines (61 loc) • 2.28 kB
JavaScript
import { base, assets, relative, initial_base } from './internal/server.js';
import { resolve_route, find_route } from '../../../utils/routing.js';
import { decode_pathname } from '../../../utils/url.js';
import { try_get_request_store } from '@sveltejs/kit/internal/server';
import { manifest } from '__sveltekit/server';
import { get_hooks } from '__SERVER__/internal.js';
/** @type {import('./client.js').asset} */
export function asset(file) {
// @ts-expect-error we use the `resolve` mechanism, but with the 'wrong' input
return assets && assets !== base ? assets + file : resolve(file);
}
/** @type {import('./client.js').resolve} */
export function resolve(id, params) {
if (!id.startsWith('/')) {
throw new Error(
`Cannot use \`resolve(...)\` with a non-absolute pathname or route ID (got "${id}"). ` +
'`resolve` is only for internal pathnames and route IDs; external URLs should be used directly.'
);
}
const resolved = resolve_route(id, /** @type {Record<string, string>} */ (params));
if (relative) {
const store = try_get_request_store();
if (store && !store.state.prerendering?.fallback) {
const after_base = store.event.url.pathname.slice(initial_base.length);
const segments = after_base.split('/').slice(2);
const prefix = segments.map(() => '..').join('/') || '.';
return prefix + resolved;
}
}
return base + resolved;
}
/** @type {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;
}
export { base, assets, resolve as resolveRoute };