From 9a16d91a0fb70efcf0e51e1c6b766145d8480825 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Tue, 8 Mar 2022 13:33:40 -0600 Subject: [PATCH 01/22] WIP: return 404 for unmatched getStaticPaths route --- packages/astro/src/core/render/core.ts | 12 ++++++++---- packages/astro/src/core/render/dev/index.ts | 9 +++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/astro/src/core/render/core.ts b/packages/astro/src/core/render/core.ts index 9e837b3a3350..0b0abddfd858 100644 --- a/packages/astro/src/core/render/core.ts +++ b/packages/astro/src/core/render/core.ts @@ -6,6 +6,8 @@ import { getParams } from '../routing/index.js'; import { createResult } from './result.js'; import { findPathItemByKey, RouteCache, callGetStaticPaths } from './route-cache.js'; import { warn } from '../logger.js'; +import { NotFoundError } from '../dev/util.js'; + interface GetParamsAndPropsOptions { mod: ComponentInstance; @@ -38,11 +40,13 @@ async function getParamsAndProps(opts: GetParamsAndPropsOptions): Promise<[Param } const matchedStaticPath = findPathItemByKey(routeCacheEntry.staticPaths, params); if (!matchedStaticPath) { - throw new Error(`[getStaticPaths] route pattern matched, but no matching static path found. (${pathname})`); + warn(logging, 'getStaticPaths', `route pattern matched, but no matching static path found. (${pathname})`); + throw new NotFoundError(); + } else { + // This is written this way for performance; instead of spreading the props + // which is O(n), create a new object that extends props. + pageProps = Object.create(matchedStaticPath.props || Object.prototype); } - // This is written this way for performance; instead of spreading the props - // which is O(n), create a new object that extends props. - pageProps = Object.create(matchedStaticPath.props || Object.prototype); } else { pageProps = {}; } diff --git a/packages/astro/src/core/render/dev/index.ts b/packages/astro/src/core/render/dev/index.ts index 0a59f8157d26..962ee321bdad 100644 --- a/packages/astro/src/core/render/dev/index.ts +++ b/packages/astro/src/core/render/dev/index.ts @@ -10,6 +10,8 @@ import { errorHandler } from './error.js'; import { getHmrScript } from './hmr.js'; import { render as coreRender } from '../core.js'; import { createModuleScriptElementWithSrcSet } from '../ssr-element.js'; +import { notFoundTemplate } from '../../../template/4xx.js'; +import { NotFoundError } from '../../dev/util.js'; interface SSROptions { /** an instance of the AstroConfig */ @@ -178,6 +180,13 @@ export async function ssr(ssrOpts: SSROptions): Promise { const [renderers, mod] = await preload(ssrOpts); return await render(renderers, mod, ssrOpts); // note(drew): without "await", errors won’t get caught by errorHandler() } catch (e: unknown) { + if (e instanceof NotFoundError) { + const relPages = ssrOpts.astroConfig.pages.href.replace(ssrOpts.astroConfig.projectRoot.href, ''); + // TODO: find out how to get user 404.astro page from manifest + // If found, return ssr(THE_404_PAGE)? + // Otherwise, return built-in 404 response 👇 + return notFoundTemplate(ssrOpts.pathname, 'Not Found') + } await errorHandler(e, { viteServer: ssrOpts.viteServer, filePath: ssrOpts.filePath }); throw e; } From 18adf0ef0883df31d9b0755b899c3df1b1cc8c44 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 10:51:14 -0500 Subject: [PATCH 02/22] feat: regex on static paths to 404 in dev --- .../astro/src/core/routing/manifest/create.ts | 56 +++++++++---------- .../src/vite-plugin-astro-server/index.ts | 46 ++++++++++++--- 2 files changed, 66 insertions(+), 36 deletions(-) diff --git a/packages/astro/src/core/routing/manifest/create.ts b/packages/astro/src/core/routing/manifest/create.ts index 1e0a6f3bc063..831ea0fe3e5e 100644 --- a/packages/astro/src/core/routing/manifest/create.ts +++ b/packages/astro/src/core/routing/manifest/create.ts @@ -61,20 +61,20 @@ function getPattern(segments: Part[][], addTrailingSlash: AstroConfig['devOption return segment[0].spread ? '(?:\\/(.*?))?' : '\\/' + - segment - .map((part) => { - if (part) - return part.dynamic - ? '([^/]+?)' - : part.content - .normalize() - .replace(/\?/g, '%3F') - .replace(/#/g, '%23') - .replace(/%5B/g, '[') - .replace(/%5D/g, ']') - .replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - }) - .join(''); + segment + .map((part) => { + if (part) + return part.dynamic + ? `(?<${part.content}>[^/]+?)` + : part.content + .normalize() + .replace(/\?/g, '%3F') + .replace(/#/g, '%23') + .replace(/%5B/g, '[') + .replace(/%5D/g, ']') + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + }) + .join(''); }) .join(''); @@ -98,20 +98,20 @@ function getGenerator(segments: Part[][], addTrailingSlash: AstroConfig['devOpti return segment[0].spread ? `/:${segment[0].content.substr(3)}(.*)?` : '/' + - segment - .map((part) => { - if (part) - return part.dynamic - ? `:${part.content}` - : part.content - .normalize() - .replace(/\?/g, '%3F') - .replace(/#/g, '%23') - .replace(/%5B/g, '[') - .replace(/%5D/g, ']') - .replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - }) - .join(''); + segment + .map((part) => { + if (part) + return part.dynamic + ? `:${part.content}` + : part.content + .normalize() + .replace(/\?/g, '%3F') + .replace(/#/g, '%23') + .replace(/%5B/g, '[') + .replace(/%5D/g, ']') + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + }) + .join(''); }) .join(''); diff --git a/packages/astro/src/vite-plugin-astro-server/index.ts b/packages/astro/src/vite-plugin-astro-server/index.ts index ff6825e8fb80..5602b541f4b7 100644 --- a/packages/astro/src/vite-plugin-astro-server/index.ts +++ b/packages/astro/src/vite-plugin-astro-server/index.ts @@ -63,6 +63,11 @@ async function handle500Response(viteServer: vite.ViteDevServer, origin: string, writeHtmlResponse(res, 500, transformedHtml); } +function getCustom404Route(config: AstroConfig, manifest: ManifestData) { + const relPages = config.pages.href.replace(config.projectRoot.href, ''); + return manifest.routes.find((r) => r.component === relPages + '404.astro'); +} + /** The main logic to route dev server requests to pages in Astro. */ async function handleRequest( routeCache: RouteCache, @@ -79,6 +84,12 @@ async function handleRequest( const origin = `${viteServer.config.server.https ? 'https' : 'http'}://${req.headers.host}`; const pathname = decodeURI(new URL(origin + req.url).pathname); const rootRelativeUrl = pathname.substring(devRoot.length - 1); + + function handle404() { + info(logging, 'astro', msg.req({ url: pathname, statusCode: 404 })); + handle404Response(origin, config, req, res); + } + try { if (!pathname.startsWith(devRoot)) { info(logging, 'serve', msg.req({ url: pathname, statusCode: 404 })); @@ -88,16 +99,35 @@ async function handleRequest( // If that fails, switch the response to a 404 response. let route = matchRoute(rootRelativeUrl, manifest); const statusCode = route ? 200 : 404; - // If no match found, lookup a custom 404 page to render, if one exists. + if (!route) { - const relPages = config.pages.href.replace(config.projectRoot.href, ''); - route = manifest.routes.find((r) => r.component === relPages + '404.astro'); + const custom404 = getCustom404Route(config, manifest); + if (custom404) { + route = custom404; + } else { + handle404(); + return; + } } - // If still no match is found, respond with a generic 404 page. - if (!route) { - info(logging, 'serve', msg.req({ url: pathname, statusCode: 404 })); - handle404Response(origin, config, req, res); - return; + const cachedRouteInfo = routeCache.get(route) + if (cachedRouteInfo?.staticPaths) { + const match = rootRelativeUrl.match(route.pattern) + const groups = match?.groups || {} + + const { keyed, ...staticPaths } = cachedRouteInfo.staticPaths + + const isMatchingStaticPath = Object.values(staticPaths).some(staticPath => { + return Object.entries(groups).every(([param, value]) => staticPath.params[param] === value) + }) + if (!isMatchingStaticPath) { + const custom404 = getCustom404Route(config, manifest); + if (custom404) { + route = custom404; + } else { + handle404(); + return; + } + } } // Route successfully matched! Render it. const html = await ssr({ From 93e23f12911e36e9578b8aa7a75b8ce1b4bf01f1 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 10:52:29 -0500 Subject: [PATCH 03/22] Revert "WIP: return 404 for unmatched getStaticPaths route" This reverts commit 9c395a2586ca40d44c3ab18edc7ffbc1c4660ed8. --- packages/astro/src/core/render/core.ts | 12 ++++-------- packages/astro/src/core/render/dev/index.ts | 9 --------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/packages/astro/src/core/render/core.ts b/packages/astro/src/core/render/core.ts index 0b0abddfd858..9e837b3a3350 100644 --- a/packages/astro/src/core/render/core.ts +++ b/packages/astro/src/core/render/core.ts @@ -6,8 +6,6 @@ import { getParams } from '../routing/index.js'; import { createResult } from './result.js'; import { findPathItemByKey, RouteCache, callGetStaticPaths } from './route-cache.js'; import { warn } from '../logger.js'; -import { NotFoundError } from '../dev/util.js'; - interface GetParamsAndPropsOptions { mod: ComponentInstance; @@ -40,13 +38,11 @@ async function getParamsAndProps(opts: GetParamsAndPropsOptions): Promise<[Param } const matchedStaticPath = findPathItemByKey(routeCacheEntry.staticPaths, params); if (!matchedStaticPath) { - warn(logging, 'getStaticPaths', `route pattern matched, but no matching static path found. (${pathname})`); - throw new NotFoundError(); - } else { - // This is written this way for performance; instead of spreading the props - // which is O(n), create a new object that extends props. - pageProps = Object.create(matchedStaticPath.props || Object.prototype); + throw new Error(`[getStaticPaths] route pattern matched, but no matching static path found. (${pathname})`); } + // This is written this way for performance; instead of spreading the props + // which is O(n), create a new object that extends props. + pageProps = Object.create(matchedStaticPath.props || Object.prototype); } else { pageProps = {}; } diff --git a/packages/astro/src/core/render/dev/index.ts b/packages/astro/src/core/render/dev/index.ts index 962ee321bdad..0a59f8157d26 100644 --- a/packages/astro/src/core/render/dev/index.ts +++ b/packages/astro/src/core/render/dev/index.ts @@ -10,8 +10,6 @@ import { errorHandler } from './error.js'; import { getHmrScript } from './hmr.js'; import { render as coreRender } from '../core.js'; import { createModuleScriptElementWithSrcSet } from '../ssr-element.js'; -import { notFoundTemplate } from '../../../template/4xx.js'; -import { NotFoundError } from '../../dev/util.js'; interface SSROptions { /** an instance of the AstroConfig */ @@ -180,13 +178,6 @@ export async function ssr(ssrOpts: SSROptions): Promise { const [renderers, mod] = await preload(ssrOpts); return await render(renderers, mod, ssrOpts); // note(drew): without "await", errors won’t get caught by errorHandler() } catch (e: unknown) { - if (e instanceof NotFoundError) { - const relPages = ssrOpts.astroConfig.pages.href.replace(ssrOpts.astroConfig.projectRoot.href, ''); - // TODO: find out how to get user 404.astro page from manifest - // If found, return ssr(THE_404_PAGE)? - // Otherwise, return built-in 404 response 👇 - return notFoundTemplate(ssrOpts.pathname, 'Not Found') - } await errorHandler(e, { viteServer: ssrOpts.viteServer, filePath: ssrOpts.filePath }); throw e; } From 66b0a860cd8fc5482e510b031fdaf4c296651960 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 13:52:29 -0500 Subject: [PATCH 04/22] feat: call getParamsAndProps pre-ssr to catch errs --- packages/astro/src/core/render/core.ts | 4 +- packages/astro/src/core/render/dev/index.ts | 6 +-- .../src/vite-plugin-astro-server/index.ts | 39 ++++++++++++++++--- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/packages/astro/src/core/render/core.ts b/packages/astro/src/core/render/core.ts index 9e837b3a3350..572033bcdbd3 100644 --- a/packages/astro/src/core/render/core.ts +++ b/packages/astro/src/core/render/core.ts @@ -15,7 +15,7 @@ interface GetParamsAndPropsOptions { logging: LogOptions; } -async function getParamsAndProps(opts: GetParamsAndPropsOptions): Promise<[Params, Props]> { +export async function getParamsAndProps(opts: GetParamsAndPropsOptions): Promise<[Params, Props]> { const { logging, mod, route, routeCache, pathname } = opts; // Handle dynamic routes let params: Params = {}; @@ -38,7 +38,7 @@ async function getParamsAndProps(opts: GetParamsAndPropsOptions): Promise<[Param } const matchedStaticPath = findPathItemByKey(routeCacheEntry.staticPaths, params); if (!matchedStaticPath) { - throw new Error(`[getStaticPaths] route pattern matched, but no matching static path found. (${pathname})`); + throw new Error(`Route pattern matched, but no matching static path found. (${pathname})`); } // This is written this way for performance; instead of spreading the props // which is O(n), create a new object that extends props. diff --git a/packages/astro/src/core/render/dev/index.ts b/packages/astro/src/core/render/dev/index.ts index 0a59f8157d26..c3bf8cb5f2a9 100644 --- a/packages/astro/src/core/render/dev/index.ts +++ b/packages/astro/src/core/render/dev/index.ts @@ -36,7 +36,7 @@ export type ComponentPreload = [Renderer[], ComponentInstance]; const svelteStylesRE = /svelte\?svelte&type=style/; -export async function preload({ astroConfig, filePath, viteServer }: SSROptions): Promise { +export async function preload({ astroConfig, filePath, viteServer }: Pick): Promise { // Important: This needs to happen first, in case a renderer provides polyfills. const renderers = await resolveRenderers(viteServer, astroConfig); // Load the module from the Vite SSR Runtime. @@ -173,9 +173,9 @@ export async function render(renderers: Renderer[], mod: ComponentInstance, ssrO return content; } -export async function ssr(ssrOpts: SSROptions): Promise { +export async function ssr(preloadedComponent: ComponentPreload, ssrOpts: SSROptions): Promise { try { - const [renderers, mod] = await preload(ssrOpts); + const [renderers, mod] = preloadedComponent; return await render(renderers, mod, ssrOpts); // note(drew): without "await", errors won’t get caught by errorHandler() } catch (e: unknown) { await errorHandler(e, { viteServer: ssrOpts.viteServer, filePath: ssrOpts.filePath }); diff --git a/packages/astro/src/vite-plugin-astro-server/index.ts b/packages/astro/src/vite-plugin-astro-server/index.ts index 5602b541f4b7..6fc24254dcdb 100644 --- a/packages/astro/src/vite-plugin-astro-server/index.ts +++ b/packages/astro/src/vite-plugin-astro-server/index.ts @@ -1,11 +1,12 @@ import type * as vite from 'vite'; import type http from 'http'; import type { AstroConfig, ManifestData } from '../@types/astro'; -import { info, error, LogOptions } from '../core/logger.js'; +import { info, warn, error, LogOptions } from '../core/logger.js'; +import { getParamsAndProps } from '../core/render/core.js'; import { createRouteManifest, matchRoute } from '../core/routing/index.js'; import stripAnsi from 'strip-ansi'; import { createSafeError } from '../core/util.js'; -import { ssr } from '../core/render/dev/index.js'; +import { ssr, preload } from '../core/render/dev/index.js'; import * as msg from '../core/messages.js'; import notFoundTemplate, { subpathNotUsedTemplate } from '../template/4xx.js'; @@ -130,16 +131,42 @@ async function handleRequest( } } // Route successfully matched! Render it. - const html = await ssr({ + const filePath = new URL(`./${route.component}`, config.projectRoot); + const preloadedComponent = await preload({ astroConfig: config, filePath, viteServer }) + const [, mod] = preloadedComponent + try { + // attempt to get static paths + // if this fails, we have a bad URL match! + await getParamsAndProps({ + mod, + route, + routeCache, + pathname, + logging, + }) + } catch (_err: any) { + if (_err instanceof Error) { + warn(logging, 'getStaticPaths', _err.message) + const custom404 = getCustom404Route(config, manifest); + if (custom404) { + route = custom404; + } else { + handle404(); + return; + } + } + } + + const html = await ssr(preloadedComponent, { astroConfig: config, - filePath: new URL(`./${route.component}`, config.projectRoot), + filePath, logging, mode: 'development', origin, pathname: rootRelativeUrl, route, - routeCache: routeCache, - viteServer: viteServer, + routeCache, + viteServer, }); writeHtmlResponse(res, statusCode, html); } catch (_err: any) { From 016def86409580bc15585b3955b852f49e4fc61f Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 14:13:16 -0500 Subject: [PATCH 05/22] fix: remove unused cache regex check --- .../src/vite-plugin-astro-server/index.ts | 32 +++++-------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/packages/astro/src/vite-plugin-astro-server/index.ts b/packages/astro/src/vite-plugin-astro-server/index.ts index 6fc24254dcdb..fc18dd8af8e1 100644 --- a/packages/astro/src/vite-plugin-astro-server/index.ts +++ b/packages/astro/src/vite-plugin-astro-server/index.ts @@ -110,31 +110,13 @@ async function handleRequest( return; } } - const cachedRouteInfo = routeCache.get(route) - if (cachedRouteInfo?.staticPaths) { - const match = rootRelativeUrl.match(route.pattern) - const groups = match?.groups || {} - const { keyed, ...staticPaths } = cachedRouteInfo.staticPaths - - const isMatchingStaticPath = Object.values(staticPaths).some(staticPath => { - return Object.entries(groups).every(([param, value]) => staticPath.params[param] === value) - }) - if (!isMatchingStaticPath) { - const custom404 = getCustom404Route(config, manifest); - if (custom404) { - route = custom404; - } else { - handle404(); - return; - } - } - } - // Route successfully matched! Render it. - const filePath = new URL(`./${route.component}`, config.projectRoot); - const preloadedComponent = await preload({ astroConfig: config, filePath, viteServer }) - const [, mod] = preloadedComponent + // Note: may re-assign filePath to custom 404 on error + let filePath = new URL(`./${route.component}`, config.projectRoot); + // Note: may re-assign preloaded component to custom 404 on error + let preloadedComponent = await preload({ astroConfig: config, filePath, viteServer }); try { + const [, mod] = preloadedComponent; // attempt to get static paths // if this fails, we have a bad URL match! await getParamsAndProps({ @@ -143,13 +125,15 @@ async function handleRequest( routeCache, pathname, logging, - }) + }); } catch (_err: any) { if (_err instanceof Error) { warn(logging, 'getStaticPaths', _err.message) const custom404 = getCustom404Route(config, manifest); if (custom404) { route = custom404; + filePath = new URL(`./${route.component}`, config.projectRoot); + preloadedComponent = await preload({ astroConfig: config, filePath, viteServer }); } else { handle404(); return; From 56c1ce2c9d28698c72d41e107df06802f24c235b Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 14:14:14 -0500 Subject: [PATCH 06/22] fix: revert getPattern changes --- packages/astro/src/core/routing/manifest/create.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/core/routing/manifest/create.ts b/packages/astro/src/core/routing/manifest/create.ts index 831ea0fe3e5e..fadd45862b9c 100644 --- a/packages/astro/src/core/routing/manifest/create.ts +++ b/packages/astro/src/core/routing/manifest/create.ts @@ -65,7 +65,7 @@ function getPattern(segments: Part[][], addTrailingSlash: AstroConfig['devOption .map((part) => { if (part) return part.dynamic - ? `(?<${part.content}>[^/]+?)` + ? '([^/]+?)' : part.content .normalize() .replace(/\?/g, '%3F') From d4716fa5b857002a89041cd56ddf965e8e4fec75 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 14:55:46 -0500 Subject: [PATCH 07/22] fix: remove unused preload props --- packages/astro/src/core/build/page-data.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/packages/astro/src/core/build/page-data.ts b/packages/astro/src/core/build/page-data.ts index f2d73717971b..53c1b15d0452 100644 --- a/packages/astro/src/core/build/page-data.ts +++ b/packages/astro/src/core/build/page-data.ts @@ -44,12 +44,6 @@ export async function collectPagesData(opts: CollectPagesDataOptions): Promise { @@ -106,12 +100,6 @@ export async function collectPagesData(opts: CollectPagesDataOptions): Promise Date: Wed, 9 Mar 2022 15:11:14 -0500 Subject: [PATCH 08/22] fix: log 404 for custom 404 pages --- .../src/vite-plugin-astro-server/index.ts | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/astro/src/vite-plugin-astro-server/index.ts b/packages/astro/src/vite-plugin-astro-server/index.ts index fc18dd8af8e1..5a6676d45974 100644 --- a/packages/astro/src/vite-plugin-astro-server/index.ts +++ b/packages/astro/src/vite-plugin-astro-server/index.ts @@ -69,6 +69,10 @@ function getCustom404Route(config: AstroConfig, manifest: ManifestData) { return manifest.routes.find((r) => r.component === relPages + '404.astro'); } +function log404(logging: LogOptions, pathname: string) { + info(logging, 'astro', msg.req({ url: pathname, statusCode: 404 })); +} + /** The main logic to route dev server requests to pages in Astro. */ async function handleRequest( routeCache: RouteCache, @@ -86,14 +90,9 @@ async function handleRequest( const pathname = decodeURI(new URL(origin + req.url).pathname); const rootRelativeUrl = pathname.substring(devRoot.length - 1); - function handle404() { - info(logging, 'astro', msg.req({ url: pathname, statusCode: 404 })); - handle404Response(origin, config, req, res); - } - try { if (!pathname.startsWith(devRoot)) { - info(logging, 'serve', msg.req({ url: pathname, statusCode: 404 })); + log404(logging, pathname); return handle404Response(origin, config, req, res); } // Attempt to match the URL to a valid page route. @@ -102,12 +101,12 @@ async function handleRequest( const statusCode = route ? 200 : 404; if (!route) { + log404(logging, pathname); const custom404 = getCustom404Route(config, manifest); if (custom404) { route = custom404; } else { - handle404(); - return; + return handle404Response(origin, config, req, res); } } @@ -128,15 +127,15 @@ async function handleRequest( }); } catch (_err: any) { if (_err instanceof Error) { - warn(logging, 'getStaticPaths', _err.message) + warn(logging, 'getStaticPaths', _err.message); + log404(logging, pathname); const custom404 = getCustom404Route(config, manifest); if (custom404) { route = custom404; filePath = new URL(`./${route.component}`, config.projectRoot); preloadedComponent = await preload({ astroConfig: config, filePath, viteServer }); } else { - handle404(); - return; + return handle404Response(origin, config, req, res); } } } From 7b35dd9de70745d06fba170664a3b2531e5e83f9 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 17:39:56 -0500 Subject: [PATCH 09/22] refactor: rename fixture for clarity --- .../pages/{[...test].astro => [...calledTwiceTest].astro} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename packages/astro/test/fixtures/astro-get-static-paths/src/pages/{[...test].astro => [...calledTwiceTest].astro} (63%) diff --git a/packages/astro/test/fixtures/astro-get-static-paths/src/pages/[...test].astro b/packages/astro/test/fixtures/astro-get-static-paths/src/pages/[...calledTwiceTest].astro similarity index 63% rename from packages/astro/test/fixtures/astro-get-static-paths/src/pages/[...test].astro rename to packages/astro/test/fixtures/astro-get-static-paths/src/pages/[...calledTwiceTest].astro index 438a31454385..19800e1ae479 100644 --- a/packages/astro/test/fixtures/astro-get-static-paths/src/pages/[...test].astro +++ b/packages/astro/test/fixtures/astro-get-static-paths/src/pages/[...calledTwiceTest].astro @@ -5,9 +5,9 @@ export function getStaticPaths({ paginate }) { } globalThis.isCalledOnce = true; return [ - {params: {test: 'a'}}, - {params: {test: 'b'}}, - {params: {test: 'c'}}, + {params: {calledTwiceTest: 'a'}}, + {params: {calledTwiceTest: 'b'}}, + {params: {calledTwiceTest: 'c'}}, ]; } const { params } = Astro.request; @@ -15,7 +15,7 @@ const { params } = Astro.request; - Page {params.test} + Page {params.calledTwiceTest} From 76dd486e3cf6622cb0216d4417bddd540710cb43 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 17:40:08 -0500 Subject: [PATCH 10/22] feat: add getStaticPaths status code tests --- .../astro/test/astro-get-static-paths.test.js | 60 +++++++++++++++---- .../src/pages/pizza/[...pizza].astro | 22 +++++++ .../src/pages/pizza/[cheese]-[topping].astro | 21 +++++++ 3 files changed, 92 insertions(+), 11 deletions(-) create mode 100644 packages/astro/test/fixtures/astro-get-static-paths/src/pages/pizza/[...pizza].astro create mode 100644 packages/astro/test/fixtures/astro-get-static-paths/src/pages/pizza/[cheese]-[topping].astro diff --git a/packages/astro/test/astro-get-static-paths.test.js b/packages/astro/test/astro-get-static-paths.test.js index 13f1aa4ac7b0..f0c8f8af9475 100644 --- a/packages/astro/test/astro-get-static-paths.test.js +++ b/packages/astro/test/astro-get-static-paths.test.js @@ -4,19 +4,57 @@ import { loadFixture } from './test-utils.js'; describe('getStaticPaths()', () => { let fixture; - before(async () => { - fixture = await loadFixture({ - projectRoot: './fixtures/astro-get-static-paths/', - buildOptions: { - site: 'https://mysite.dev/blog/', - sitemap: false, - }, + describe('number of build calls', () => { + before(async () => { + fixture = await loadFixture({ + projectRoot: './fixtures/astro-get-static-paths/', + buildOptions: { + site: 'https://mysite.dev/blog/', + sitemap: false, + }, + }); + await fixture.build(); + }); + it('is only once during build', () => { + // useless expect; if build() throws in setup then this test fails + expect(true).to.equal(true); }); - await fixture.build(); }); - it('is only called once during build', () => { - // useless expect; if build() throws in setup then this test fails - expect(true).to.equal(true); + describe('dynamic', () => { + let fixture; + let devServer; + + before(async () => { + fixture = await loadFixture({ projectRoot: './fixtures/astro-get-static-paths/' }); + devServer = await fixture.startDevServer(); + }); + + after(async () => { + devServer && devServer.stop(); + }); + describe('[plain]', () => { + it('resolves 200 on matching static path', async () => { + const res = await fixture.fetch('/pizza/provolone-sausage'); + expect(res.status).to.equal(200); + }); + + it('resolves 404 on bad static path', async () => { + const res = await fixture.fetch('/pizza/provolone-pineapple'); + expect(res.status).to.equal(404); + }); + }); + + describe('[...spread]', () => { + it('resolves 200 on matching static path', async () => { + const res = await fixture.fetch('/pizza/grimaldis/new-york'); + expect(res.status).to.equal(200); + }); + + it('resolves 404 on bad static path', async () => { + const res = await fixture.fetch('/pizza/pizza-hut'); + expect(res.status).to.equal(404); + }); + }); }); }); diff --git a/packages/astro/test/fixtures/astro-get-static-paths/src/pages/pizza/[...pizza].astro b/packages/astro/test/fixtures/astro-get-static-paths/src/pages/pizza/[...pizza].astro new file mode 100644 index 000000000000..02ef8ef47870 --- /dev/null +++ b/packages/astro/test/fixtures/astro-get-static-paths/src/pages/pizza/[...pizza].astro @@ -0,0 +1,22 @@ +--- +export function getStaticPaths() { + return [{ + params: { pizza: 'papa-johns' }, + }, { + params: { pizza: 'dominos' }, + }, { + params: { pizza: 'grimaldis/new-york' }, + }] +} +const { pizza } = Astro.request.params +--- + + + + + {pizza ?? 'The landing page'} + + +

Welcome to {pizza ?? 'The landing page'}

+ + \ No newline at end of file diff --git a/packages/astro/test/fixtures/astro-get-static-paths/src/pages/pizza/[cheese]-[topping].astro b/packages/astro/test/fixtures/astro-get-static-paths/src/pages/pizza/[cheese]-[topping].astro new file mode 100644 index 000000000000..353805c5cd4e --- /dev/null +++ b/packages/astro/test/fixtures/astro-get-static-paths/src/pages/pizza/[cheese]-[topping].astro @@ -0,0 +1,21 @@ +--- +export function getStaticPaths() { + return [{ + params: { cheese: 'mozzarella', topping: 'pepperoni' }, + }, { + params: { cheese: 'provolone', topping: 'sausage' }, + }] +} +const { cheese, topping } = Astro.request.params +--- + + + + + {cheese} + + +

🍕 It's pizza time

+

{cheese}-{topping}

+ + \ No newline at end of file From 24a5d1338893dfcfecc59a48e14299ba7d226b59 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 17:59:30 -0500 Subject: [PATCH 11/22] fix: pas rootRelativeUrl to handle subpaths --- packages/astro/src/vite-plugin-astro-server/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/vite-plugin-astro-server/index.ts b/packages/astro/src/vite-plugin-astro-server/index.ts index 5a6676d45974..ae6668fb6e43 100644 --- a/packages/astro/src/vite-plugin-astro-server/index.ts +++ b/packages/astro/src/vite-plugin-astro-server/index.ts @@ -122,7 +122,7 @@ async function handleRequest( mod, route, routeCache, - pathname, + pathname: rootRelativeUrl, logging, }); } catch (_err: any) { From 120c323d200581ca65ddf9e4d173c9d68fc6c9d7 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 17:59:43 -0500 Subject: [PATCH 12/22] fix: update dev-routing tests from 500 -> 404 --- packages/astro/test/dev-routing.test.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/astro/test/dev-routing.test.js b/packages/astro/test/dev-routing.test.js index f30ff1abfdcc..487df4c38060 100644 --- a/packages/astro/test/dev-routing.test.js +++ b/packages/astro/test/dev-routing.test.js @@ -38,9 +38,9 @@ describe('Development Routing', () => { expect(response.status).to.equal(200); }); - it('500 when loading invalid dynamic route', async () => { + it('404 when loading invalid dynamic route', async () => { const response = await fixture.fetch('/2'); - expect(response.status).to.equal(500); + expect(response.status).to.equal(404); }); }); @@ -74,9 +74,9 @@ describe('Development Routing', () => { expect(response.status).to.equal(200); }); - it('500 when loading invalid dynamic route', async () => { + it('404 when loading invalid dynamic route', async () => { const response = await fixture.fetch('/2'); - expect(response.status).to.equal(500); + expect(response.status).to.equal(404); }); }); @@ -120,9 +120,9 @@ describe('Development Routing', () => { expect(response.status).to.equal(200); }); - it('500 when loading invalid dynamic route', async () => { + it('404 when loading invalid dynamic route', async () => { const response = await fixture.fetch('/blog/2/'); - expect(response.status).to.equal(500); + expect(response.status).to.equal(404); }); }); From 3b3ccc95c08e380e1bdf93894eced961919613be Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 18:09:49 -0500 Subject: [PATCH 13/22] refactor: make error handling more explicit --- packages/astro/src/core/render/core.ts | 15 +++++-- .../src/vite-plugin-astro-server/index.ts | 45 +++++++++---------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/packages/astro/src/core/render/core.ts b/packages/astro/src/core/render/core.ts index 572033bcdbd3..1e6fe7e0b3b4 100644 --- a/packages/astro/src/core/render/core.ts +++ b/packages/astro/src/core/render/core.ts @@ -15,7 +15,11 @@ interface GetParamsAndPropsOptions { logging: LogOptions; } -export async function getParamsAndProps(opts: GetParamsAndPropsOptions): Promise<[Params, Props]> { +export enum GetParamsAndPropsError { + NoMatchingStaticPath, +} + +export async function getParamsAndProps(opts: GetParamsAndPropsOptions): Promise<[Params, Props] | GetParamsAndPropsError> { const { logging, mod, route, routeCache, pathname } = opts; // Handle dynamic routes let params: Params = {}; @@ -38,7 +42,7 @@ export async function getParamsAndProps(opts: GetParamsAndPropsOptions): Promise } const matchedStaticPath = findPathItemByKey(routeCacheEntry.staticPaths, params); if (!matchedStaticPath) { - throw new Error(`Route pattern matched, but no matching static path found. (${pathname})`); + return GetParamsAndPropsError.NoMatchingStaticPath; } // This is written this way for performance; instead of spreading the props // which is O(n), create a new object that extends props. @@ -68,7 +72,7 @@ interface RenderOptions { export async function render(opts: RenderOptions): Promise { const { legacyBuild, links, logging, origin, markdownRender, mod, pathname, scripts, renderers, resolve, route, routeCache, site } = opts; - const [params, pageProps] = await getParamsAndProps({ + const paramsAndPropsRes = await getParamsAndProps({ logging, mod, route, @@ -76,6 +80,11 @@ export async function render(opts: RenderOptions): Promise { pathname, }); + if (paramsAndPropsRes === GetParamsAndPropsError.NoMatchingStaticPath) { + throw new Error(`[getStaticPath] route pattern matched, but no matching static path found. (${pathname})`); + } + const [params, pageProps] = paramsAndPropsRes; + // For endpoints, render the content immediately without injecting scripts or styles if (route?.type === 'endpoint') { return renderEndpoint(mod as any as EndpointHandler, params); diff --git a/packages/astro/src/vite-plugin-astro-server/index.ts b/packages/astro/src/vite-plugin-astro-server/index.ts index ae6668fb6e43..2f1babdf7a5d 100644 --- a/packages/astro/src/vite-plugin-astro-server/index.ts +++ b/packages/astro/src/vite-plugin-astro-server/index.ts @@ -2,7 +2,7 @@ import type * as vite from 'vite'; import type http from 'http'; import type { AstroConfig, ManifestData } from '../@types/astro'; import { info, warn, error, LogOptions } from '../core/logger.js'; -import { getParamsAndProps } from '../core/render/core.js'; +import { getParamsAndProps, GetParamsAndPropsError } from '../core/render/core.js'; import { createRouteManifest, matchRoute } from '../core/routing/index.js'; import stripAnsi from 'strip-ansi'; import { createSafeError } from '../core/util.js'; @@ -114,29 +114,26 @@ async function handleRequest( let filePath = new URL(`./${route.component}`, config.projectRoot); // Note: may re-assign preloaded component to custom 404 on error let preloadedComponent = await preload({ astroConfig: config, filePath, viteServer }); - try { - const [, mod] = preloadedComponent; - // attempt to get static paths - // if this fails, we have a bad URL match! - await getParamsAndProps({ - mod, - route, - routeCache, - pathname: rootRelativeUrl, - logging, - }); - } catch (_err: any) { - if (_err instanceof Error) { - warn(logging, 'getStaticPaths', _err.message); - log404(logging, pathname); - const custom404 = getCustom404Route(config, manifest); - if (custom404) { - route = custom404; - filePath = new URL(`./${route.component}`, config.projectRoot); - preloadedComponent = await preload({ astroConfig: config, filePath, viteServer }); - } else { - return handle404Response(origin, config, req, res); - } + const [, mod] = preloadedComponent; + // attempt to get static paths + // if this fails, we have a bad URL match! + const paramsAndPropsRes = await getParamsAndProps({ + mod, + route, + routeCache, + pathname: rootRelativeUrl, + logging, + }); + if (paramsAndPropsRes === GetParamsAndPropsError.NoMatchingStaticPath) { + warn(logging, 'getStaticPaths', `Route pattern matched, but no matching static path found. (${pathname})`); + log404(logging, pathname); + const custom404 = getCustom404Route(config, manifest); + if (custom404) { + route = custom404; + filePath = new URL(`./${route.component}`, config.projectRoot); + preloadedComponent = await preload({ astroConfig: config, filePath, viteServer }); + } else { + return handle404Response(origin, config, req, res); } } From 678ed2ae7e9167bd94a5b49694dca25165a20188 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 18:19:10 -0500 Subject: [PATCH 14/22] lint: use typescript no shadow to fix enum issue --- .eslintrc.cjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 911c0eab3a94..c55d0d05da78 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -14,8 +14,9 @@ module.exports = { '@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/no-this-alias': 'off', 'no-console': 'warn', - 'no-shadow': 'error', 'prefer-const': 'off', + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': ['error'], // 'require-jsdoc': 'error', // re-enable this to enforce JSDoc for all functions }, }; From e7df85116e7b12e07539afc19c62e8b738bdb3e8 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 18:32:14 -0500 Subject: [PATCH 15/22] chore: add changeset --- .changeset/young-rules-draw.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/young-rules-draw.md diff --git a/.changeset/young-rules-draw.md b/.changeset/young-rules-draw.md new file mode 100644 index 000000000000..dad5cfc351b4 --- /dev/null +++ b/.changeset/young-rules-draw.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fix - show 404 for bad static paths with console message, rather than a 500 From 384e3739fcfeb5ffe532ac0191718fe2157178c5 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 18:42:47 -0500 Subject: [PATCH 16/22] refactor: clarify test names --- packages/astro/test/astro-get-static-paths.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/astro/test/astro-get-static-paths.test.js b/packages/astro/test/astro-get-static-paths.test.js index f0c8f8af9475..974a10632656 100644 --- a/packages/astro/test/astro-get-static-paths.test.js +++ b/packages/astro/test/astro-get-static-paths.test.js @@ -21,7 +21,7 @@ describe('getStaticPaths()', () => { }); }); - describe('dynamic', () => { + describe('dynamic routes', () => { let fixture; let devServer; @@ -33,7 +33,7 @@ describe('getStaticPaths()', () => { after(async () => { devServer && devServer.stop(); }); - describe('[plain]', () => { + describe('without spread on dynamic params', () => { it('resolves 200 on matching static path', async () => { const res = await fixture.fetch('/pizza/provolone-sausage'); expect(res.status).to.equal(200); @@ -45,7 +45,7 @@ describe('getStaticPaths()', () => { }); }); - describe('[...spread]', () => { + describe('with spread on dynamic params', () => { it('resolves 200 on matching static path', async () => { const res = await fixture.fetch('/pizza/grimaldis/new-york'); expect(res.status).to.equal(200); From d1a571620e8cad5793919e5d9e120a32c8a1c6fe Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 18:51:13 -0500 Subject: [PATCH 17/22] refactor: remove variable reassignment --- .../src/vite-plugin-astro-server/index.ts | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/astro/src/vite-plugin-astro-server/index.ts b/packages/astro/src/vite-plugin-astro-server/index.ts index 2f1babdf7a5d..6b011740c118 100644 --- a/packages/astro/src/vite-plugin-astro-server/index.ts +++ b/packages/astro/src/vite-plugin-astro-server/index.ts @@ -110,10 +110,8 @@ async function handleRequest( } } - // Note: may re-assign filePath to custom 404 on error - let filePath = new URL(`./${route.component}`, config.projectRoot); - // Note: may re-assign preloaded component to custom 404 on error - let preloadedComponent = await preload({ astroConfig: config, filePath, viteServer }); + const filePath = new URL(`./${route.component}`, config.projectRoot); + const preloadedComponent = await preload({ astroConfig: config, filePath, viteServer }); const [, mod] = preloadedComponent; // attempt to get static paths // if this fails, we have a bad URL match! @@ -127,11 +125,22 @@ async function handleRequest( if (paramsAndPropsRes === GetParamsAndPropsError.NoMatchingStaticPath) { warn(logging, 'getStaticPaths', `Route pattern matched, but no matching static path found. (${pathname})`); log404(logging, pathname); - const custom404 = getCustom404Route(config, manifest); - if (custom404) { - route = custom404; - filePath = new URL(`./${route.component}`, config.projectRoot); - preloadedComponent = await preload({ astroConfig: config, filePath, viteServer }); + const routeCustom404 = getCustom404Route(config, manifest); + if (routeCustom404) { + const filePathCustom404 = new URL(`./${routeCustom404.component}`, config.projectRoot); + const preloadedCompCustom404 = await preload({ astroConfig: config, filePath: filePathCustom404, viteServer }); + const html = await ssr(preloadedCompCustom404, { + astroConfig: config, + filePath: filePathCustom404, + logging, + mode: 'development', + origin, + pathname: rootRelativeUrl, + route: routeCustom404, + routeCache, + viteServer, + }); + return writeHtmlResponse(res, statusCode, html); } else { return handle404Response(origin, config, req, res); } From 693d60b1e34c48c27aab6e48f5b7e82fc38bf12b Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Wed, 9 Mar 2022 19:09:52 -0500 Subject: [PATCH 18/22] fix: update dev-routing tests 500 > 404 --- packages/astro/test/dev-routing.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/astro/test/dev-routing.test.js b/packages/astro/test/dev-routing.test.js index 487df4c38060..9e1721c2fd14 100644 --- a/packages/astro/test/dev-routing.test.js +++ b/packages/astro/test/dev-routing.test.js @@ -166,9 +166,9 @@ describe('Development Routing', () => { expect(response.status).to.equal(200); }); - it('500 when loading invalid dynamic route', async () => { + it('404 when loading invalid dynamic route', async () => { const response = await fixture.fetch('/blog/2/'); - expect(response.status).to.equal(500); + expect(response.status).to.equal(404); }); }); From d6cdb5f0cdd7b163b108635595909465bff85dbc Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Thu, 10 Mar 2022 11:21:59 -0500 Subject: [PATCH 19/22] refactor: update test file structure --- .../astro/test/astro-get-static-paths.test.js | 89 +++++++++---------- 1 file changed, 41 insertions(+), 48 deletions(-) diff --git a/packages/astro/test/astro-get-static-paths.test.js b/packages/astro/test/astro-get-static-paths.test.js index 974a10632656..159e6b255777 100644 --- a/packages/astro/test/astro-get-static-paths.test.js +++ b/packages/astro/test/astro-get-static-paths.test.js @@ -1,60 +1,53 @@ import { expect } from 'chai'; import { loadFixture } from './test-utils.js'; -describe('getStaticPaths()', () => { +describe('getStaticPaths - build calls', () => { + before(async () => { + const fixture = await loadFixture({ + projectRoot: './fixtures/astro-get-static-paths/', + buildOptions: { + site: 'https://mysite.dev/blog/', + sitemap: false, + }, + }); + await fixture.build(); + }); + it('is only called once during build', () => { + // useless expect; if build() throws in setup then this test fails + expect(true).to.equal(true); + }); +}) + +describe('getStaticPaths - 404 behavior', () => { let fixture; + let devServer; - describe('number of build calls', () => { - before(async () => { - fixture = await loadFixture({ - projectRoot: './fixtures/astro-get-static-paths/', - buildOptions: { - site: 'https://mysite.dev/blog/', - sitemap: false, - }, - }); - await fixture.build(); - }); - it('is only once during build', () => { - // useless expect; if build() throws in setup then this test fails - expect(true).to.equal(true); - }); + before(async () => { + fixture = await loadFixture({ projectRoot: './fixtures/astro-get-static-paths/' }); + devServer = await fixture.startDevServer(); }); - describe('dynamic routes', () => { - let fixture; - let devServer; + after(async () => { + devServer && devServer.stop(); + }); - before(async () => { - fixture = await loadFixture({ projectRoot: './fixtures/astro-get-static-paths/' }); - devServer = await fixture.startDevServer(); - }); + it('resolves 200 on matching static path - named params', async () => { + const res = await fixture.fetch('/pizza/provolone-sausage'); + expect(res.status).to.equal(200); + }); - after(async () => { - devServer && devServer.stop(); - }); - describe('without spread on dynamic params', () => { - it('resolves 200 on matching static path', async () => { - const res = await fixture.fetch('/pizza/provolone-sausage'); - expect(res.status).to.equal(200); - }); - - it('resolves 404 on bad static path', async () => { - const res = await fixture.fetch('/pizza/provolone-pineapple'); - expect(res.status).to.equal(404); - }); - }); + it('resolves 404 on pattern match without static path - named params', async () => { + const res = await fixture.fetch('/pizza/provolone-pineapple'); + expect(res.status).to.equal(404); + }); - describe('with spread on dynamic params', () => { - it('resolves 200 on matching static path', async () => { - const res = await fixture.fetch('/pizza/grimaldis/new-york'); - expect(res.status).to.equal(200); - }); + it('resolves 200 on matching static path - rest params', async () => { + const res = await fixture.fetch('/pizza/grimaldis/new-york'); + expect(res.status).to.equal(200); + }); - it('resolves 404 on bad static path', async () => { - const res = await fixture.fetch('/pizza/pizza-hut'); - expect(res.status).to.equal(404); - }); - }); + it('resolves 404 on pattern match without static path - rest params', async () => { + const res = await fixture.fetch('/pizza/pizza-hut'); + expect(res.status).to.equal(404); }); -}); +}) From 42229e667179be9d4fc644e78675870b988eee68 Mon Sep 17 00:00:00 2001 From: Ben Holmes Date: Thu, 10 Mar 2022 11:57:29 -0500 Subject: [PATCH 20/22] Fix: revert to old logging Co-authored-by: Nate Moore --- packages/astro/src/vite-plugin-astro-server/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/vite-plugin-astro-server/index.ts b/packages/astro/src/vite-plugin-astro-server/index.ts index 6b011740c118..33baeed71c7c 100644 --- a/packages/astro/src/vite-plugin-astro-server/index.ts +++ b/packages/astro/src/vite-plugin-astro-server/index.ts @@ -70,7 +70,7 @@ function getCustom404Route(config: AstroConfig, manifest: ManifestData) { } function log404(logging: LogOptions, pathname: string) { - info(logging, 'astro', msg.req({ url: pathname, statusCode: 404 })); + info(logging, 'serve', msg.req({ url: pathname, statusCode: 404 })); } /** The main logic to route dev server requests to pages in Astro. */ From bf63126808afd5a9f83e3ef7fdfb189752475f0f Mon Sep 17 00:00:00 2001 From: Ben Holmes Date: Thu, 10 Mar 2022 11:57:56 -0500 Subject: [PATCH 21/22] Chore: use `const enum` instead Co-authored-by: Nate Moore --- packages/astro/src/core/render/core.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/core/render/core.ts b/packages/astro/src/core/render/core.ts index 1e6fe7e0b3b4..32493ead19f4 100644 --- a/packages/astro/src/core/render/core.ts +++ b/packages/astro/src/core/render/core.ts @@ -15,7 +15,7 @@ interface GetParamsAndPropsOptions { logging: LogOptions; } -export enum GetParamsAndPropsError { +export const enum GetParamsAndPropsError { NoMatchingStaticPath, } From 951ec46e7677e931ac4665a45d0561f445ad0d07 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Thu, 10 Mar 2022 12:04:42 -0500 Subject: [PATCH 22/22] chore: format --- .../astro/src/core/routing/manifest/create.ts | 56 +++++++++---------- .../astro/test/astro-get-static-paths.test.js | 4 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/packages/astro/src/core/routing/manifest/create.ts b/packages/astro/src/core/routing/manifest/create.ts index fadd45862b9c..1e0a6f3bc063 100644 --- a/packages/astro/src/core/routing/manifest/create.ts +++ b/packages/astro/src/core/routing/manifest/create.ts @@ -61,20 +61,20 @@ function getPattern(segments: Part[][], addTrailingSlash: AstroConfig['devOption return segment[0].spread ? '(?:\\/(.*?))?' : '\\/' + - segment - .map((part) => { - if (part) - return part.dynamic - ? '([^/]+?)' - : part.content - .normalize() - .replace(/\?/g, '%3F') - .replace(/#/g, '%23') - .replace(/%5B/g, '[') - .replace(/%5D/g, ']') - .replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - }) - .join(''); + segment + .map((part) => { + if (part) + return part.dynamic + ? '([^/]+?)' + : part.content + .normalize() + .replace(/\?/g, '%3F') + .replace(/#/g, '%23') + .replace(/%5B/g, '[') + .replace(/%5D/g, ']') + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + }) + .join(''); }) .join(''); @@ -98,20 +98,20 @@ function getGenerator(segments: Part[][], addTrailingSlash: AstroConfig['devOpti return segment[0].spread ? `/:${segment[0].content.substr(3)}(.*)?` : '/' + - segment - .map((part) => { - if (part) - return part.dynamic - ? `:${part.content}` - : part.content - .normalize() - .replace(/\?/g, '%3F') - .replace(/#/g, '%23') - .replace(/%5B/g, '[') - .replace(/%5D/g, ']') - .replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - }) - .join(''); + segment + .map((part) => { + if (part) + return part.dynamic + ? `:${part.content}` + : part.content + .normalize() + .replace(/\?/g, '%3F') + .replace(/#/g, '%23') + .replace(/%5B/g, '[') + .replace(/%5D/g, ']') + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + }) + .join(''); }) .join(''); diff --git a/packages/astro/test/astro-get-static-paths.test.js b/packages/astro/test/astro-get-static-paths.test.js index 159e6b255777..cc46dfcd587b 100644 --- a/packages/astro/test/astro-get-static-paths.test.js +++ b/packages/astro/test/astro-get-static-paths.test.js @@ -16,7 +16,7 @@ describe('getStaticPaths - build calls', () => { // useless expect; if build() throws in setup then this test fails expect(true).to.equal(true); }); -}) +}); describe('getStaticPaths - 404 behavior', () => { let fixture; @@ -50,4 +50,4 @@ describe('getStaticPaths - 404 behavior', () => { const res = await fixture.fetch('/pizza/pizza-hut'); expect(res.status).to.equal(404); }); -}) +});