summaryrefslogtreecommitdiff
path: root/src/runtime.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime.ts')
-rw-r--r--src/runtime.ts98
1 files changed, 44 insertions, 54 deletions
diff --git a/src/runtime.ts b/src/runtime.ts
index c12fb3e14..62bbdb09c 100644
--- a/src/runtime.ts
+++ b/src/runtime.ts
@@ -3,6 +3,7 @@ import type { AstroConfig, RuntimeMode } from './@types/astro';
import type { LogOptions } from './logger';
import type { CompileError } from './parser/utils/error.js';
import { debug, info } from './logger.js';
+import { searchForPage } from './search.js';
import { existsSync } from 'fs';
import { loadConfiguration, logger as snowpackLogger, startServer as startSnowpackServer } from 'snowpack';
@@ -25,9 +26,10 @@ type LoadResultSuccess = {
contentType?: string | false;
};
type LoadResultNotFound = { statusCode: 404; error: Error };
+type LoadResultRedirect = { statusCode: 301 | 302; location: string; };
type LoadResultError = { statusCode: 500 } & ({ type: 'parse-error'; error: CompileError } | { type: 'unknown'; error: Error });
-export type LoadResult = LoadResultSuccess | LoadResultNotFound | LoadResultError;
+export type LoadResult = LoadResultSuccess | LoadResultNotFound | LoadResultRedirect | LoadResultError;
// Disable snowpack from writing to stdout/err.
snowpackLogger.level = 'silent';
@@ -38,15 +40,12 @@ async function load(config: RuntimeConfig, rawPathname: string | undefined): Pro
const { astroRoot } = config.astroConfig;
const fullurl = new URL(rawPathname || '/', 'https://example.org/');
+
const reqPath = decodeURI(fullurl.pathname);
- const selectedPage = reqPath.substr(1) || 'index';
info(logging, 'access', reqPath);
- const selectedPageLoc = new URL(`./pages/${selectedPage}.astro`, astroRoot);
- const selectedPageMdLoc = new URL(`./pages/${selectedPage}.md`, astroRoot);
-
- // Non-Astro pages (file resources)
- if (!existsSync(selectedPageLoc) && !existsSync(selectedPageMdLoc)) {
+ const searchResult = searchForPage(fullurl, astroRoot);
+ if(searchResult.statusCode === 404) {
try {
const result = await frontendSnowpack.loadUrl(reqPath);
@@ -66,61 +65,52 @@ async function load(config: RuntimeConfig, rawPathname: string | undefined): Pro
}
}
- for (const url of [`/_astro/pages/${selectedPage}.astro.js`, `/_astro/pages/${selectedPage}.md.js`]) {
- try {
- const mod = await backendSnowpackRuntime.importModule(url);
- debug(logging, 'resolve', `${reqPath} -> ${url}`);
- let html = (await mod.exports.__renderPage({
- request: {
- host: fullurl.hostname,
- path: fullurl.pathname,
- href: fullurl.toString(),
- },
- children: [],
- props: {},
- })) as string;
-
- // inject styles
- // TODO: handle this in compiler
- const styleTags = Array.isArray(mod.css) && mod.css.length ? mod.css.reduce((markup, href) => `${markup}\n<link rel="stylesheet" type="text/css" href="${href}" />`, '') : ``;
- if (html.indexOf('</head>') !== -1) {
- html = html.replace('</head>', `${styleTags}</head>`);
- } else {
- html = styleTags + html;
- }
+ if(searchResult.statusCode === 301) {
+ return { statusCode: 301, location: searchResult.pathname };
+ }
- return {
- statusCode: 200,
- contents: html,
- };
- } catch (err) {
- // if this is a 404, try the next URL (will be caught at the end)
- const notFoundError = err.toString().startsWith('Error: Not Found');
- if (notFoundError) {
- continue;
- }
+ const snowpackURL = searchResult.location.snowpackURL;
+
+ try {
+ const mod = await backendSnowpackRuntime.importModule(snowpackURL);
+ debug(logging, 'resolve', `${reqPath} -> ${snowpackURL}`);
+ let html = (await mod.exports.__renderPage({
+ request: {
+ host: fullurl.hostname,
+ path: fullurl.pathname,
+ href: fullurl.toString(),
+ },
+ children: [],
+ props: {},
+ })) as string;
+
+ // inject styles
+ // TODO: handle this in compiler
+ const styleTags = Array.isArray(mod.css) && mod.css.length ? mod.css.reduce((markup, href) => `${markup}\n<link rel="stylesheet" type="text/css" href="${href}" />`, '') : ``;
+ if (html.indexOf('</head>') !== -1) {
+ html = html.replace('</head>', `${styleTags}</head>`);
+ } else {
+ html = styleTags + html;
+ }
- if (err.code === 'parse-error') {
- return {
- statusCode: 500,
- type: 'parse-error',
- error: err,
- };
- }
+ return {
+ statusCode: 200,
+ contents: html,
+ };
+ } catch (err) {
+ if (err.code === 'parse-error') {
return {
statusCode: 500,
- type: 'unknown',
+ type: 'parse-error',
error: err,
};
}
+ return {
+ statusCode: 500,
+ type: 'unknown',
+ error: err,
+ };
}
-
- // couldnā€˜t find match; 404
- return {
- statusCode: 404,
- type: 'unknown',
- error: new Error(`Could not locate ${selectedPage}`),
- };
}
export interface AstroRuntime {