Refactor routing in App component to enhance navigation and improve error handling by integrating dynamic routes and updating the NotFound route.

This commit is contained in:
becarta
2025-05-23 12:43:00 +02:00
parent f40db0f5c9
commit a544759a3b
11127 changed files with 1647032 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
import type { Plugin as VitePlugin } from 'vite';
import type { AstroSettings } from '../@types/astro.js';
import type { Logger } from '../core/logger/core.js';
export interface AstroPluginScannerOptions {
settings: AstroSettings;
logger: Logger;
}
export default function astroScannerPlugin({ settings, logger, }: AstroPluginScannerOptions): VitePlugin;

73
node_modules/astro/dist/vite-plugin-scanner/index.js generated vendored Normal file
View File

@@ -0,0 +1,73 @@
import { extname } from "node:path";
import { bold } from "kleur/colors";
import { normalizePath } from "vite";
import { isEndpoint, isPage, isServerLikeOutput } from "../core/util.js";
import { rootRelativePath } from "../core/viteUtils.js";
import { runHookRouteSetup } from "../integrations/hooks.js";
import { getPrerenderDefault } from "../prerender/utils.js";
import { scan } from "./scan.js";
const KNOWN_FILE_EXTENSIONS = [".astro", ".js", ".ts"];
function astroScannerPlugin({
settings,
logger
}) {
return {
name: "astro:scanner",
enforce: "post",
async transform(code, id, options) {
if (!options?.ssr) return;
const filename = normalizePath(id);
let fileURL;
try {
fileURL = new URL(`file://${filename}`);
} catch {
return;
}
const fileIsPage = isPage(fileURL, settings);
const fileIsEndpoint = isEndpoint(fileURL, settings);
if (!(fileIsPage || fileIsEndpoint)) return;
const pageOptions = await getPageOptions(code, id, fileURL, settings, logger);
if (!pageOptions.prerender && isServerLikeOutput(settings.config) && code.includes("getStaticPaths") && // this should only be valid for `.astro`, `.js` and `.ts` files
KNOWN_FILE_EXTENSIONS.includes(extname(filename))) {
logger.warn(
"router",
`getStaticPaths() ignored in dynamic page ${bold(
rootRelativePath(settings.config.root, fileURL, true)
)}. Add \`export const prerender = true;\` to prerender the page as static HTML during the build process.`
);
}
const { meta = {} } = this.getModuleInfo(id) ?? {};
return {
code,
map: null,
meta: {
...meta,
astro: {
...meta.astro ?? { hydratedComponents: [], clientOnlyComponents: [], scripts: [] },
pageOptions
}
}
};
}
};
}
async function getPageOptions(code, id, fileURL, settings, logger) {
const fileUrlStr = fileURL.toString();
const injectedRoute = settings.resolvedInjectedRoutes.find(
(route2) => route2.resolvedEntryPoint && fileUrlStr === route2.resolvedEntryPoint.toString()
);
const pageOptions = injectedRoute?.prerender != null ? { prerender: injectedRoute.prerender } : await scan(code, id, settings);
const route = {
component: rootRelativePath(settings.config.root, fileURL, false),
prerender: pageOptions.prerender
};
await runHookRouteSetup({ route, settings, logger });
pageOptions.prerender = route.prerender;
if (typeof pageOptions.prerender === "undefined") {
pageOptions.prerender = getPrerenderDefault(settings.config);
}
return pageOptions;
}
export {
astroScannerPlugin as default
};

View File

@@ -0,0 +1,3 @@
import type { AstroSettings } from '../@types/astro.js';
import type { PageOptions } from '../vite-plugin-astro/types.js';
export declare function scan(code: string, id: string, settings?: AstroSettings): Promise<PageOptions>;

58
node_modules/astro/dist/vite-plugin-scanner/scan.js generated vendored Normal file
View File

@@ -0,0 +1,58 @@
import * as eslexer from "es-module-lexer";
import { AstroError, AstroErrorData } from "../core/errors/index.js";
const BOOLEAN_EXPORTS = /* @__PURE__ */ new Set(["prerender"]);
function includesExport(code) {
for (const name of BOOLEAN_EXPORTS) {
if (code.includes(name)) return true;
}
return false;
}
function isQuoted(value) {
return (value[0] === '"' || value[0] === "'") && value[value.length - 1] === value[0];
}
function isTruthy(value) {
if (isQuoted(value)) {
value = value.slice(1, -1);
}
return value === "true" || value === "1";
}
function isFalsy(value) {
if (isQuoted(value)) {
value = value.slice(1, -1);
}
return value === "false" || value === "0";
}
let didInit = false;
async function scan(code, id, settings) {
if (!includesExport(code)) return {};
if (!didInit) {
await eslexer.init;
didInit = true;
}
const [, exports] = eslexer.parse(code, id);
let pageOptions = {};
for (const _export of exports) {
const { n: name, le: endOfLocalName } = _export;
if (BOOLEAN_EXPORTS.has(name)) {
const prefix = code.slice(0, endOfLocalName).split("export").pop().trim().replace("prerender", "").trim();
const suffix = code.slice(endOfLocalName).trim().replace(/=/, "").trim().split(/[;\n\r]/)[0].trim();
if (prefix !== "const" || !(isTruthy(suffix) || isFalsy(suffix))) {
throw new AstroError({
...AstroErrorData.InvalidPrerenderExport,
message: AstroErrorData.InvalidPrerenderExport.message(
prefix,
suffix,
settings?.config.output === "hybrid"
),
location: { file: id }
});
} else {
pageOptions[name] = isTruthy(suffix);
}
}
}
return pageOptions;
}
export {
scan
};