mirror of
https://github.com/withastro/astro.git
synced 2025-03-10 23:01:26 -05:00
Merge branch 'main' into next
This commit is contained in:
commit
7fa6f782cd
47 changed files with 483 additions and 235 deletions
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
'astro': patch
|
||||
---
|
||||
|
||||
Fixes an issue where component styles were not correctly included in rendered MDX
|
10
biome.json
10
biome.json
|
@ -61,6 +61,16 @@
|
|||
"lineWidth": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"include": ["*.test.js"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"suspicious": {
|
||||
"noFocusedTests": "error"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ import { builtinModules } from 'node:module';
|
|||
import tseslint from 'typescript-eslint';
|
||||
|
||||
// plugins
|
||||
import noOnlyTestsEslint from 'eslint-plugin-no-only-tests';
|
||||
import regexpEslint from 'eslint-plugin-regexp';
|
||||
const typescriptEslint = tseslint.plugin;
|
||||
|
||||
|
@ -47,7 +46,6 @@ export default [
|
|||
},
|
||||
plugins: {
|
||||
'@typescript-eslint': typescriptEslint,
|
||||
'no-only-tests': noOnlyTestsEslint,
|
||||
regexp: regexpEslint,
|
||||
},
|
||||
rules: {
|
||||
|
@ -62,7 +60,6 @@ export default [
|
|||
ignoreRestSiblings: true,
|
||||
},
|
||||
],
|
||||
'no-only-tests/no-only-tests': 'error',
|
||||
'@typescript-eslint/no-shadow': 'error',
|
||||
'no-console': 'warn',
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
"astro": "astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"@astrojs/solid-js": "^4.4.1",
|
||||
"@astrojs/solid-js": "^4.4.2",
|
||||
"astro": "^5.0.0-beta.1",
|
||||
"solid-js": "^1.8.22"
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
"astro": "astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"@astrojs/svelte": "^5.7.0",
|
||||
"@astrojs/svelte": "^5.7.1",
|
||||
"astro": "^5.0.0-beta.1",
|
||||
"svelte": "^4.2.19"
|
||||
}
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
"astro": "astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"@astrojs/vue": "^4.5.0",
|
||||
"@astrojs/vue": "^4.5.1",
|
||||
"astro": "^5.0.0-beta.1",
|
||||
"vue": "^3.4.38"
|
||||
"vue": "^3.5.3"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
"astro": "astro"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@astrojs/tailwind": "^5.1.0",
|
||||
"@astrojs/tailwind": "^5.1.1",
|
||||
"@astrojs/node": "^9.0.0-alpha.1",
|
||||
"astro": "^5.0.0-beta.1"
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@astrojs/mdx": "^4.0.0-beta.1",
|
||||
"@astrojs/tailwind": "^5.1.0",
|
||||
"@astrojs/tailwind": "^5.1.1",
|
||||
"@types/canvas-confetti": "^1.6.4",
|
||||
"astro": "^5.0.0-beta.1",
|
||||
"autoprefixer": "^10.4.20",
|
||||
|
|
|
@ -59,7 +59,6 @@
|
|||
"@types/node": "^18.17.8",
|
||||
"esbuild": "^0.21.5",
|
||||
"eslint": "^9.10.0",
|
||||
"eslint-plugin-no-only-tests": "^3.3.0",
|
||||
"eslint-plugin-regexp": "^2.6.0",
|
||||
"globby": "^14.0.2",
|
||||
"only-allow": "^1.2.1",
|
||||
|
|
|
@ -215,6 +215,34 @@
|
|||
|
||||
- [#11974](https://github.com/withastro/astro/pull/11974) [`60211de`](https://github.com/withastro/astro/commit/60211defbfb2992ba17d1369e71c146d8928b09a) Thanks [@ascorbic](https://github.com/ascorbic)! - Exports the `RenderResult` type
|
||||
|
||||
## 4.15.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#12034](https://github.com/withastro/astro/pull/12034) [`5b3ddfa`](https://github.com/withastro/astro/commit/5b3ddfadcb2d09b6cbd9cd42641f30ca565d0f58) Thanks [@ematipico](https://github.com/ematipico)! - Fixes an issue where the middleware wasn't called when a project uses `404.astro`.
|
||||
|
||||
- [#12042](https://github.com/withastro/astro/pull/12042) [`243ecb6`](https://github.com/withastro/astro/commit/243ecb6d6146dc483b4726d0e76142fb25e56243) Thanks [@ematipico](https://github.com/ematipico)! - Fixes a problem in the Container API, where a polyfill wasn't correctly applied. This caused an issue in some environments where `crypto` isn't supported.
|
||||
|
||||
- [#12038](https://github.com/withastro/astro/pull/12038) [`26ea5e8`](https://github.com/withastro/astro/commit/26ea5e814ab8c973e683fff62389fda28c180940) Thanks [@ascorbic](https://github.com/ascorbic)! - Resolves image paths in content layer with initial slash as project-relative
|
||||
|
||||
When using the `image()` schema helper, previously paths with an initial slash were treated as public URLs. This was to match the behavior of markdown images. However this is a change from before, where paths with an initial slash were treated as project-relative. This change restores the previous behavior, so that paths with an initial slash are treated as project-relative.
|
||||
|
||||
## 4.15.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#12014](https://github.com/withastro/astro/pull/12014) [`53cb41e`](https://github.com/withastro/astro/commit/53cb41e30ea5768bf33d9f6be608fb57d31b7b9e) Thanks [@ascorbic](https://github.com/ascorbic)! - Fixes an issue where component styles were not correctly included in rendered MDX
|
||||
|
||||
- [#12031](https://github.com/withastro/astro/pull/12031) [`8c0cae6`](https://github.com/withastro/astro/commit/8c0cae6d1bd70b332286d83d0f01cfce5272fbbe) Thanks [@ematipico](https://github.com/ematipico)! - Fixes a bug where the rewrite via `next(/*..*/)` inside a middleware didn't compute the new `APIContext.params`
|
||||
|
||||
- [#12026](https://github.com/withastro/astro/pull/12026) [`40e7a1b`](https://github.com/withastro/astro/commit/40e7a1b05d9e5ea3fcda176c9663bbcff86edb63) Thanks [@bluwy](https://github.com/bluwy)! - Initializes the Markdown processor only when there's `.md` files
|
||||
|
||||
- [#12028](https://github.com/withastro/astro/pull/12028) [`d3bd673`](https://github.com/withastro/astro/commit/d3bd673392e63720e241d6a002a131a3564c169c) Thanks [@bluwy](https://github.com/bluwy)! - Handles route collision detection only if it matches `getStaticPaths`
|
||||
|
||||
- [#12027](https://github.com/withastro/astro/pull/12027) [`dd3b753`](https://github.com/withastro/astro/commit/dd3b753aba6400558671d85214e27b8e4fb1654b) Thanks [@fviolette](https://github.com/fviolette)! - Add `selected` to the list of boolean attributes
|
||||
|
||||
- [#12001](https://github.com/withastro/astro/pull/12001) [`9be3e1b`](https://github.com/withastro/astro/commit/9be3e1bba789af96d8b21d9c8eca8542cfb4ff77) Thanks [@uwej711](https://github.com/uwej711)! - Remove dependency on path-to-regexp
|
||||
|
||||
## 4.15.7
|
||||
|
||||
### Patch Changes
|
||||
|
|
|
@ -126,8 +126,8 @@
|
|||
"@astrojs/internal-helpers": "workspace:*",
|
||||
"@astrojs/markdown-remark": "workspace:*",
|
||||
"@astrojs/telemetry": "workspace:*",
|
||||
"@babel/types": "^7.25.4",
|
||||
"@oslojs/encoding": "^0.4.1",
|
||||
"@babel/types": "^7.25.6",
|
||||
"@oslojs/encoding": "^1.0.0",
|
||||
"@rollup/pluginutils": "^5.1.0",
|
||||
"@types/cookie": "^0.6.0",
|
||||
"acorn": "^8.12.1",
|
||||
|
@ -165,7 +165,6 @@
|
|||
"ora": "^8.1.0",
|
||||
"p-limit": "^6.1.0",
|
||||
"p-queue": "^8.0.1",
|
||||
"path-to-regexp": "6.2.2",
|
||||
"preferred-pm": "^4.0.0",
|
||||
"prompts": "^2.4.2",
|
||||
"rehype": "^13.0.1",
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import './polyfill.js';
|
||||
import { posix } from 'node:path';
|
||||
import { getDefaultClientDirectives } from '../core/client-directive/index.js';
|
||||
import { ASTRO_CONFIG_DEFAULTS } from '../core/config/schema.js';
|
||||
|
@ -5,13 +6,14 @@ import { validateConfig } from '../core/config/validate.js';
|
|||
import { createKey } from '../core/encryption.js';
|
||||
import { Logger } from '../core/logger/core.js';
|
||||
import { nodeLogDestination } from '../core/logger/node.js';
|
||||
import { NOOP_MIDDLEWARE_FN } from '../core/middleware/noop-middleware.js';
|
||||
import { removeLeadingForwardSlash } from '../core/path.js';
|
||||
import { RenderContext } from '../core/render-context.js';
|
||||
import { getParts, validateSegment } from '../core/routing/manifest/create.js';
|
||||
import { getPattern } from '../core/routing/manifest/pattern.js';
|
||||
import type { AstroComponentFactory } from '../runtime/server/index.js';
|
||||
import type { ComponentInstance } from '../types/astro.js';
|
||||
import type { MiddlewareHandler, Props } from '../types/public/common.js';
|
||||
import type { AstroMiddlewareInstance, MiddlewareHandler, Props } from '../types/public/common.js';
|
||||
import type { AstroConfig, AstroUserConfig } from '../types/public/config.js';
|
||||
import type {
|
||||
NamedSSRLoadedRendererValue,
|
||||
|
@ -121,9 +123,11 @@ function createManifest(
|
|||
renderers?: SSRLoadedRenderer[],
|
||||
middleware?: MiddlewareHandler,
|
||||
): SSRManifest {
|
||||
const defaultMiddleware: MiddlewareHandler = (_, next) => {
|
||||
return next();
|
||||
};
|
||||
function middlewareInstance(): AstroMiddlewareInstance {
|
||||
return {
|
||||
onRequest: middleware ?? NOOP_MIDDLEWARE_FN,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
hrefRoot: import.meta.url,
|
||||
|
@ -142,7 +146,7 @@ function createManifest(
|
|||
inlinedScripts: manifest?.inlinedScripts ?? new Map(),
|
||||
i18n: manifest?.i18n,
|
||||
checkOrigin: false,
|
||||
middleware: manifest?.middleware ?? middleware ?? defaultMiddleware,
|
||||
middleware: manifest?.middleware ?? middlewareInstance,
|
||||
envGetSecretEnabled: false,
|
||||
key: createKey(),
|
||||
};
|
||||
|
@ -488,11 +492,10 @@ export class experimental_AstroContainer {
|
|||
params: options.params,
|
||||
type: routeType,
|
||||
});
|
||||
const renderContext = RenderContext.create({
|
||||
const renderContext = await RenderContext.create({
|
||||
pipeline: this.#pipeline,
|
||||
routeData,
|
||||
status: 200,
|
||||
middleware: this.#pipeline.middleware,
|
||||
request,
|
||||
pathname: url.pathname,
|
||||
locals: options?.locals ?? {},
|
||||
|
|
|
@ -84,7 +84,7 @@ export class ContainerPipeline extends Pipeline {
|
|||
return Promise.resolve(componentInstance);
|
||||
},
|
||||
renderers: this.manifest.renderers,
|
||||
onRequest: this.manifest.middleware,
|
||||
onRequest: this.resolvedMiddleware,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
3
packages/astro/src/container/polyfill.ts
Normal file
3
packages/astro/src/container/polyfill.ts
Normal file
|
@ -0,0 +1,3 @@
|
|||
import { applyPolyfills } from '../core/app/node.js';
|
||||
|
||||
applyPolyfills();
|
|
@ -1,4 +1,5 @@
|
|||
import { decodeKey } from '../encryption.js';
|
||||
import { NOOP_MIDDLEWARE_FN } from '../middleware/noop-middleware.js';
|
||||
import { deserializeRouteData } from '../routing/manifest/serialization.js';
|
||||
import type { RouteInfo, SSRManifest, SerializedSSRManifest } from './types.js';
|
||||
|
||||
|
@ -23,8 +24,8 @@ export function deserializeManifest(serializedManifest: SerializedSSRManifest):
|
|||
|
||||
return {
|
||||
// in case user middleware exists, this no-op middleware will be reassigned (see plugin-ssr.ts)
|
||||
middleware(_, next) {
|
||||
return next();
|
||||
middleware() {
|
||||
return { onRequest: NOOP_MIDDLEWARE_FN };
|
||||
},
|
||||
...serializedManifest,
|
||||
assets,
|
||||
|
|
|
@ -12,7 +12,7 @@ import { getSetCookiesFromResponse } from '../cookies/index.js';
|
|||
import { AstroError, AstroErrorData } from '../errors/index.js';
|
||||
import { consoleLogDestination } from '../logger/console.js';
|
||||
import { AstroIntegrationLogger, Logger } from '../logger/core.js';
|
||||
import { sequence } from '../middleware/index.js';
|
||||
import { NOOP_MIDDLEWARE_FN } from '../middleware/noop-middleware.js';
|
||||
import {
|
||||
appendForwardSlash,
|
||||
joinPaths,
|
||||
|
@ -23,7 +23,6 @@ import { RenderContext } from '../render-context.js';
|
|||
import { createAssetLink } from '../render/ssr-element.js';
|
||||
import { createDefaultRoutes, injectDefaultRoutes } from '../routing/default.js';
|
||||
import { matchRoute } from '../routing/match.js';
|
||||
import { createOriginCheckMiddleware } from './middlewares.js';
|
||||
import { AppPipeline } from './pipeline.js';
|
||||
|
||||
export { deserializeManifest } from './common.js';
|
||||
|
@ -112,13 +111,6 @@ export class App {
|
|||
* @private
|
||||
*/
|
||||
#createPipeline(manifestData: ManifestData, streaming = false) {
|
||||
if (this.#manifest.checkOrigin) {
|
||||
this.#manifest.middleware = sequence(
|
||||
createOriginCheckMiddleware(),
|
||||
this.#manifest.middleware,
|
||||
);
|
||||
}
|
||||
|
||||
return AppPipeline.create(manifestData, {
|
||||
logger: this.#logger,
|
||||
manifest: this.#manifest,
|
||||
|
@ -293,7 +285,7 @@ export class App {
|
|||
// Load route module. We also catch its error here if it fails on initialization
|
||||
const mod = await this.#pipeline.getModuleForRoute(routeData);
|
||||
|
||||
const renderContext = RenderContext.create({
|
||||
const renderContext = await RenderContext.create({
|
||||
pipeline: this.#pipeline,
|
||||
locals,
|
||||
pathname,
|
||||
|
@ -389,10 +381,10 @@ export class App {
|
|||
}
|
||||
const mod = await this.#pipeline.getModuleForRoute(errorRouteData);
|
||||
try {
|
||||
const renderContext = RenderContext.create({
|
||||
const renderContext = await RenderContext.create({
|
||||
locals,
|
||||
pipeline: this.#pipeline,
|
||||
middleware: skipMiddleware ? (_, next) => next() : undefined,
|
||||
middleware: skipMiddleware ? NOOP_MIDDLEWARE_FN : undefined,
|
||||
pathname: this.#getPathnameFromRequest(request),
|
||||
request,
|
||||
routeData: errorRouteData,
|
||||
|
|
|
@ -85,11 +85,7 @@ export class AppPipeline extends Pipeline {
|
|||
return module.page();
|
||||
}
|
||||
|
||||
async tryRewrite(
|
||||
payload: RewritePayload,
|
||||
request: Request,
|
||||
_sourceRoute: RouteData,
|
||||
): Promise<TryRewriteResult> {
|
||||
async tryRewrite(payload: RewritePayload, request: Request): Promise<TryRewriteResult> {
|
||||
const { newUrl, pathname, routeData } = findRouteToRewrite({
|
||||
payload,
|
||||
request,
|
||||
|
|
|
@ -1,13 +1,8 @@
|
|||
import type { RoutingStrategies } from '../../i18n/utils.js';
|
||||
import type { ComponentInstance, SerializedRouteData } from '../../types/astro.js';
|
||||
import type { MiddlewareHandler } from '../../types/public/common.js';
|
||||
import type { AstroMiddlewareInstance } from '../../types/public/common.js';
|
||||
import type { Locales } from '../../types/public/config.js';
|
||||
import type {
|
||||
RouteData,
|
||||
SSRComponentMetadata,
|
||||
SSRLoadedRenderer,
|
||||
SSRResult,
|
||||
} from '../../types/public/internal.js';
|
||||
import type { RouteData, SSRComponentMetadata, SSRLoadedRenderer, SSRResult } from '../../types/public/internal.js';
|
||||
import type { SinglePageBuiltModule } from '../build/types.js';
|
||||
|
||||
export type ComponentPath = string;
|
||||
|
@ -67,7 +62,7 @@ export type SSRManifest = {
|
|||
serverIslandNameMap?: Map<string, string>;
|
||||
key: Promise<CryptoKey>;
|
||||
i18n: SSRManifestI18n | undefined;
|
||||
middleware: MiddlewareHandler;
|
||||
middleware: () => Promise<AstroMiddlewareInstance> | AstroMiddlewareInstance;
|
||||
checkOrigin: boolean;
|
||||
envGetSecretEnabled: boolean;
|
||||
};
|
||||
|
|
|
@ -88,13 +88,8 @@ export abstract class Pipeline {
|
|||
*
|
||||
* @param {RewritePayload} rewritePayload The payload provided by the user
|
||||
* @param {Request} request The original request
|
||||
* @param {RouteData} sourceRoute The original `RouteData`
|
||||
*/
|
||||
abstract tryRewrite(
|
||||
rewritePayload: RewritePayload,
|
||||
request: Request,
|
||||
sourceRoute: RouteData,
|
||||
): Promise<TryRewriteResult>;
|
||||
abstract tryRewrite(rewritePayload: RewritePayload, request: Request): Promise<TryRewriteResult>;
|
||||
|
||||
/**
|
||||
* Tells the pipeline how to retrieve a component give a `RouteData`
|
||||
|
|
|
@ -417,7 +417,12 @@ async function generatePath(
|
|||
logger,
|
||||
isPrerendered: true,
|
||||
});
|
||||
const renderContext = RenderContext.create({ pipeline, pathname, request, routeData: route });
|
||||
const renderContext = await RenderContext.create({
|
||||
pipeline,
|
||||
pathname,
|
||||
request,
|
||||
routeData: route,
|
||||
});
|
||||
|
||||
let body: string | Uint8Array;
|
||||
let response: Response;
|
||||
|
@ -530,7 +535,11 @@ function createBuildManifest(
|
|||
componentMetadata: internals.componentMetadata,
|
||||
i18n: i18nManifest,
|
||||
buildFormat: settings.config.build.format,
|
||||
middleware,
|
||||
middleware() {
|
||||
return {
|
||||
onRequest: middleware,
|
||||
};
|
||||
},
|
||||
checkOrigin: settings.config.security?.checkOrigin ?? false,
|
||||
key,
|
||||
envGetSecretEnabled: false,
|
||||
|
|
|
@ -86,6 +86,10 @@ export class BuildPipeline extends Pipeline {
|
|||
);
|
||||
}
|
||||
|
||||
getRoutes(): RouteData[] {
|
||||
return this.options.manifest.routes;
|
||||
}
|
||||
|
||||
static create({
|
||||
internals,
|
||||
manifest,
|
||||
|
@ -127,7 +131,11 @@ export class BuildPipeline extends Pipeline {
|
|||
const renderers = await import(renderersEntryUrl.toString());
|
||||
|
||||
const middleware = await import(new URL('middleware.mjs', baseDirectory).toString())
|
||||
.then((mod) => mod.onRequest)
|
||||
.then((mod) => {
|
||||
return function () {
|
||||
return { onRequest: mod.onRequest };
|
||||
};
|
||||
})
|
||||
// middleware.mjs is not emitted if there is no user middleware
|
||||
// in which case the import fails with ERR_MODULE_NOT_FOUND, and we fall back to a no-op middleware
|
||||
.catch(() => manifest.middleware);
|
||||
|
@ -259,11 +267,7 @@ export class BuildPipeline extends Pipeline {
|
|||
return module.page();
|
||||
}
|
||||
|
||||
async tryRewrite(
|
||||
payload: RewritePayload,
|
||||
request: Request,
|
||||
_sourceRoute: RouteData,
|
||||
): Promise<TryRewriteResult> {
|
||||
async tryRewrite(payload: RewritePayload, request: Request): Promise<TryRewriteResult> {
|
||||
const { routeData, pathname, newUrl } = findRouteToRewrite({
|
||||
payload,
|
||||
request,
|
||||
|
|
|
@ -180,7 +180,7 @@ function generateSSRCode(settings: AstroSettings, adapter: AstroAdapter, middlew
|
|||
` pageMap,`,
|
||||
` serverIslandMap,`,
|
||||
` renderers,`,
|
||||
` middleware`,
|
||||
` middleware: ${edgeMiddleware ? 'undefined' : `() => import("${middlewareId}")`}`,
|
||||
`});`,
|
||||
`const _args = ${adapter.args ? JSON.stringify(adapter.args, null, 4) : 'undefined'};`,
|
||||
adapter.exports
|
||||
|
|
3
packages/astro/src/core/middleware/noop-middleware.ts
Normal file
3
packages/astro/src/core/middleware/noop-middleware.ts
Normal file
|
@ -0,0 +1,3 @@
|
|||
import type { MiddlewareHandler } from '../../@types/astro.js';
|
||||
|
||||
export const NOOP_MIDDLEWARE_FN: MiddlewareHandler = (_, next) => next();
|
|
@ -1,6 +1,8 @@
|
|||
import type { MiddlewareHandler, RewritePayload } from '../../types/public/common.js';
|
||||
import type { APIContext } from '../../types/public/context.js';
|
||||
import { AstroCookies } from '../cookies/cookies.js';
|
||||
import { apiContextRoutesSymbol } from '../render-context.js';
|
||||
import { type Pipeline, getParams } from '../render/index.js';
|
||||
import { defineMiddleware } from './index.js';
|
||||
|
||||
// From SvelteKit: https://github.com/sveltejs/kit/blob/master/packages/kit/src/exports/hooks/sequence.js
|
||||
|
@ -16,7 +18,6 @@ export function sequence(...handlers: MiddlewareHandler[]): MiddlewareHandler {
|
|||
return next();
|
||||
});
|
||||
}
|
||||
|
||||
return defineMiddleware((context, next) => {
|
||||
/**
|
||||
* This variable is used to carry the rerouting payload across middleware functions.
|
||||
|
@ -29,7 +30,7 @@ export function sequence(...handlers: MiddlewareHandler[]): MiddlewareHandler {
|
|||
// @ts-expect-error
|
||||
// SAFETY: Usually `next` always returns something in user land, but in `sequence` we are actually
|
||||
// doing a loop over all the `next` functions, and eventually we call the last `next` that returns the `Response`.
|
||||
const result = handle(handleContext, async (payload: RewritePayload) => {
|
||||
const result = handle(handleContext, async (payload?: RewritePayload) => {
|
||||
if (i < length - 1) {
|
||||
if (payload) {
|
||||
let newRequest;
|
||||
|
@ -43,10 +44,16 @@ export function sequence(...handlers: MiddlewareHandler[]): MiddlewareHandler {
|
|||
handleContext.request,
|
||||
);
|
||||
}
|
||||
const pipeline: Pipeline = Reflect.get(handleContext, apiContextRoutesSymbol);
|
||||
const { routeData, pathname } = await pipeline.tryRewrite(
|
||||
payload,
|
||||
handleContext.request,
|
||||
);
|
||||
carriedPayload = payload;
|
||||
handleContext.request = newRequest;
|
||||
handleContext.url = new URL(newRequest.url);
|
||||
handleContext.cookies = new AstroCookies(newRequest);
|
||||
handleContext.params = getParams(routeData, pathname);
|
||||
}
|
||||
return applyHandle(i + 1, handleContext);
|
||||
} else {
|
||||
|
|
|
@ -29,14 +29,13 @@ import { sequence } from './middleware/index.js';
|
|||
import { renderRedirect } from './redirects/render.js';
|
||||
import { type Pipeline, Slots, getParams, getProps } from './render/index.js';
|
||||
|
||||
export const apiContextRoutesSymbol = Symbol.for('context.routes');
|
||||
|
||||
/**
|
||||
* Each request is rendered using a `RenderContext`.
|
||||
* It contains data unique to each request. It is responsible for executing middleware, calling endpoints, and rendering the page by gathering necessary data from a `Pipeline`.
|
||||
*/
|
||||
export class RenderContext {
|
||||
// The first route that this instance of the context attempts to render
|
||||
originalRoute: RouteData;
|
||||
|
||||
private constructor(
|
||||
readonly pipeline: Pipeline,
|
||||
public locals: App.Locals,
|
||||
|
@ -49,9 +48,7 @@ export class RenderContext {
|
|||
public params = getParams(routeData, pathname),
|
||||
protected url = new URL(request.url),
|
||||
public props: Props = {},
|
||||
) {
|
||||
this.originalRoute = routeData;
|
||||
}
|
||||
) {}
|
||||
|
||||
/**
|
||||
* A flag that tells the render content if the rewriting was triggered
|
||||
|
@ -62,7 +59,7 @@ export class RenderContext {
|
|||
*/
|
||||
counter = 0;
|
||||
|
||||
static create({
|
||||
static async create({
|
||||
locals = {},
|
||||
middleware,
|
||||
pathname,
|
||||
|
@ -72,11 +69,14 @@ export class RenderContext {
|
|||
status = 200,
|
||||
props,
|
||||
}: Pick<RenderContext, 'pathname' | 'pipeline' | 'request' | 'routeData'> &
|
||||
Partial<Pick<RenderContext, 'locals' | 'middleware' | 'status' | 'props'>>): RenderContext {
|
||||
Partial<
|
||||
Pick<RenderContext, 'locals' | 'middleware' | 'status' | 'props'>
|
||||
>): Promise<RenderContext> {
|
||||
const pipelineMiddleware = await pipeline.getMiddleware();
|
||||
return new RenderContext(
|
||||
pipeline,
|
||||
locals,
|
||||
sequence(...pipeline.internalMiddleware, middleware ?? pipeline.middleware),
|
||||
sequence(...pipeline.internalMiddleware, middleware ?? pipelineMiddleware),
|
||||
pathname,
|
||||
request,
|
||||
routeData,
|
||||
|
@ -133,14 +133,24 @@ export class RenderContext {
|
|||
if (payload) {
|
||||
pipeline.logger.debug('router', 'Called rewriting to:', payload);
|
||||
// we intentionally let the error bubble up
|
||||
const { routeData, componentInstance: newComponent } = await pipeline.tryRewrite(
|
||||
payload,
|
||||
this.request,
|
||||
this.originalRoute,
|
||||
);
|
||||
const {
|
||||
routeData,
|
||||
componentInstance: newComponent,
|
||||
pathname,
|
||||
newUrl,
|
||||
} = await pipeline.tryRewrite(payload, this.request);
|
||||
this.routeData = routeData;
|
||||
componentInstance = newComponent;
|
||||
if (payload instanceof Request) {
|
||||
this.request = payload;
|
||||
} else {
|
||||
this.request = this.#copyRequest(newUrl, this.request);
|
||||
}
|
||||
this.isRewriting = true;
|
||||
this.url = new URL(this.request.url);
|
||||
this.cookies = new AstroCookies(this.request);
|
||||
this.params = getParams(routeData, pathname);
|
||||
this.pathname = pathname;
|
||||
this.status = 200;
|
||||
}
|
||||
let response: Response;
|
||||
|
@ -214,6 +224,7 @@ export class RenderContext {
|
|||
const context = this.createActionAPIContext();
|
||||
const redirect = (path: string, status = 302) =>
|
||||
new Response(null, { status, headers: { Location: path } });
|
||||
Reflect.set(context, apiContextRoutesSymbol, this.pipeline);
|
||||
|
||||
return Object.assign(context, {
|
||||
props,
|
||||
|
@ -228,7 +239,6 @@ export class RenderContext {
|
|||
const { routeData, componentInstance, newUrl, pathname } = await this.pipeline.tryRewrite(
|
||||
reroutePayload,
|
||||
this.request,
|
||||
this.originalRoute,
|
||||
);
|
||||
this.routeData = routeData;
|
||||
if (reroutePayload instanceof Request) {
|
||||
|
|
|
@ -36,12 +36,6 @@ export async function getProps(opts: GetParamsAndPropsOptions): Promise<Props> {
|
|||
return {};
|
||||
}
|
||||
|
||||
// This is a dynamic route, start getting the params
|
||||
const params = getParams(route, pathname);
|
||||
if (mod) {
|
||||
validatePrerenderEndpointCollision(route, mod, params);
|
||||
}
|
||||
|
||||
// During build, the route cache should already be populated.
|
||||
// During development, the route cache is filled on-demand and may be empty.
|
||||
const staticPaths = await callGetStaticPaths({
|
||||
|
@ -53,6 +47,7 @@ export async function getProps(opts: GetParamsAndPropsOptions): Promise<Props> {
|
|||
base,
|
||||
});
|
||||
|
||||
const params = getParams(route, pathname);
|
||||
const matchedStaticPath = findPathItemByKey(staticPaths, params, route, logger);
|
||||
if (!matchedStaticPath && (serverLike ? route.prerender : true)) {
|
||||
throw new AstroError({
|
||||
|
@ -62,6 +57,10 @@ export async function getProps(opts: GetParamsAndPropsOptions): Promise<Props> {
|
|||
});
|
||||
}
|
||||
|
||||
if (mod) {
|
||||
validatePrerenderEndpointCollision(route, mod, params);
|
||||
}
|
||||
|
||||
const props: Props = matchedStaticPath?.props ? { ...matchedStaticPath.props } : {};
|
||||
|
||||
return props;
|
||||
|
|
|
@ -1,15 +1,12 @@
|
|||
import { compile } from 'path-to-regexp';
|
||||
import type { AstroConfig } from '../../../types/public/config.js';
|
||||
import type { RoutePart } from '../../../types/public/internal.js';
|
||||
import type { AstroConfig } from "../../../types/public/config.js";
|
||||
import type { RoutePart } from "../../../types/public/internal.js";
|
||||
|
||||
/**
|
||||
* Sanitizes the parameters object by normalizing string values and replacing certain characters with their URL-encoded equivalents.
|
||||
* @param {Record<string, string | number | undefined>} params - The parameters object to be sanitized.
|
||||
* @returns {Record<string, string | number | undefined>} The sanitized parameters object.
|
||||
* @param {Record<string, string | number>} params - The parameters object to be sanitized.
|
||||
* @returns {Record<string, string | number>} The sanitized parameters object.
|
||||
*/
|
||||
function sanitizeParams(
|
||||
params: Record<string, string | number | undefined>,
|
||||
): Record<string, string | number | undefined> {
|
||||
function sanitizeParams(params: Record<string, string | number>): Record<string, string | number> {
|
||||
return Object.fromEntries(
|
||||
Object.entries(params).map(([key, value]) => {
|
||||
if (typeof value === 'string') {
|
||||
|
@ -20,49 +17,49 @@ function sanitizeParams(
|
|||
);
|
||||
}
|
||||
|
||||
function getParameter(part: RoutePart, params: Record<string, string | number>): string | number {
|
||||
if (part.spread) {
|
||||
return params[part.content.slice(3)] || '';
|
||||
}
|
||||
|
||||
if (part.dynamic) {
|
||||
if (!params[part.content]) {
|
||||
throw new TypeError(`Missing parameter: ${part.content}`);
|
||||
}
|
||||
|
||||
return params[part.content];
|
||||
}
|
||||
|
||||
return part.content
|
||||
.normalize()
|
||||
.replace(/\?/g, '%3F')
|
||||
.replace(/#/g, '%23')
|
||||
.replace(/%5B/g, '[')
|
||||
.replace(/%5D/g, ']');
|
||||
}
|
||||
|
||||
function getSegment(segment: RoutePart[], params: Record<string, string | number>): string {
|
||||
const segmentPath = segment.map((part) => getParameter(part, params)).join('');
|
||||
|
||||
return segmentPath ? '/' + segmentPath : '';
|
||||
}
|
||||
|
||||
export function getRouteGenerator(
|
||||
segments: RoutePart[][],
|
||||
addTrailingSlash: AstroConfig['trailingSlash'],
|
||||
) {
|
||||
const template = segments
|
||||
.map((segment) => {
|
||||
return (
|
||||
'/' +
|
||||
segment
|
||||
.map((part) => {
|
||||
if (part.spread) {
|
||||
return `:${part.content.slice(3)}(.*)?`;
|
||||
} else if (part.dynamic) {
|
||||
return `:${part.content}`;
|
||||
} else {
|
||||
return part.content
|
||||
.normalize()
|
||||
.replace(/\?/g, '%3F')
|
||||
.replace(/#/g, '%23')
|
||||
.replace(/%5B/g, '[')
|
||||
.replace(/%5D/g, ']')
|
||||
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
}
|
||||
})
|
||||
.join('')
|
||||
);
|
||||
})
|
||||
.join('');
|
||||
|
||||
// Unless trailingSlash config is set to 'always', don't automatically append it.
|
||||
let trailing: '/' | '' = '';
|
||||
if (addTrailingSlash === 'always' && segments.length) {
|
||||
trailing = '/';
|
||||
}
|
||||
const toPath = compile(template + trailing);
|
||||
return (params: Record<string, string | number | undefined>): string => {
|
||||
return (params: Record<string, string | number>): string => {
|
||||
const sanitizedParams = sanitizeParams(params);
|
||||
const path = toPath(sanitizedParams);
|
||||
|
||||
// When generating an index from a rest parameter route, `path-to-regexp` will return an
|
||||
// empty string instead "/". This causes an inconsistency with static indexes that may result
|
||||
// in the incorrect routes being rendered.
|
||||
// To fix this, we return "/" when the path is empty.
|
||||
// Unless trailingSlash config is set to 'always', don't automatically append it.
|
||||
let trailing: '/' | '' = '';
|
||||
if (addTrailingSlash === 'always' && segments.length) {
|
||||
trailing = '/';
|
||||
}
|
||||
|
||||
const path =
|
||||
segments.map((segment) => getSegment(segment, sanitizedParams)).join('') + trailing;
|
||||
|
||||
return path || '/';
|
||||
};
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import { HTMLString, markHTMLString } from '../escape.js';
|
|||
export const voidElementNames =
|
||||
/^(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/i;
|
||||
const htmlBooleanAttributes =
|
||||
/^(?:allowfullscreen|async|autofocus|autoplay|controls|default|defer|disabled|disablepictureinpicture|disableremoteplayback|formnovalidate|hidden|loop|nomodule|novalidate|open|playsinline|readonly|required|reversed|scoped|seamless|itemscope)$/i;
|
||||
/^(?:allowfullscreen|async|autofocus|autoplay|controls|default|defer|disabled|disablepictureinpicture|disableremoteplayback|formnovalidate|hidden|loop|nomodule|novalidate|open|playsinline|readonly|required|reversed|scoped|seamless|selected|itemscope)$/i;
|
||||
|
||||
const AMPERSAND_REGEX = /&/g;
|
||||
const DOUBLE_QUOTE_REGEX = /"/g;
|
||||
|
|
|
@ -110,6 +110,12 @@ export type MiddlewareHandler = (
|
|||
next: MiddlewareNext,
|
||||
) => Promise<Response> | Response | Promise<void> | void;
|
||||
|
||||
// NOTE: when updating this file with other functions,
|
||||
// remember to update `plugin-page.ts` too, to add that function as a no-op function.
|
||||
export type AstroMiddlewareInstance = {
|
||||
onRequest?: MiddlewareHandler;
|
||||
};
|
||||
|
||||
/**
|
||||
* Infers the shape of the `params` property returned by `getStaticPaths()`.
|
||||
*
|
||||
|
|
|
@ -193,11 +193,7 @@ export class DevPipeline extends Pipeline {
|
|||
}
|
||||
}
|
||||
|
||||
async tryRewrite(
|
||||
payload: RewritePayload,
|
||||
request: Request,
|
||||
_sourceRoute: RouteData,
|
||||
): Promise<TryRewriteResult> {
|
||||
async tryRewrite(payload: RewritePayload, request: Request): Promise<TryRewriteResult> {
|
||||
if (!this.manifestData) {
|
||||
throw new Error('Missing manifest data. This is an internal error, please file an issue.');
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import { getViteErrorPayload } from '../core/errors/dev/index.js';
|
|||
import { AstroError, AstroErrorData } from '../core/errors/index.js';
|
||||
import { patchOverlay } from '../core/errors/overlay.js';
|
||||
import type { Logger } from '../core/logger/core.js';
|
||||
import { NOOP_MIDDLEWARE_FN } from '../core/middleware/noop-middleware.js';
|
||||
import { createViteLoader } from '../core/module-loader/index.js';
|
||||
import { injectDefaultDevRoutes } from '../core/routing/dev-default.js';
|
||||
import { createRouteManifest } from '../core/routing/index.js';
|
||||
|
@ -162,8 +163,10 @@ export function createDevelopmentManifest(settings: AstroSettings): SSRManifest
|
|||
checkOrigin: settings.config.security?.checkOrigin ?? false,
|
||||
envGetSecretEnabled: false,
|
||||
key: createKey(),
|
||||
middleware(_, next) {
|
||||
return next();
|
||||
middleware() {
|
||||
return {
|
||||
onRequest: NOOP_MIDDLEWARE_FN,
|
||||
};
|
||||
},
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import type http from 'node:http';
|
||||
import {
|
||||
DEFAULT_404_COMPONENT,
|
||||
REROUTE_DIRECTIVE_HEADER,
|
||||
REWRITE_DIRECTIVE_HEADER_KEY,
|
||||
clientLocalsSymbol,
|
||||
|
@ -194,13 +195,16 @@ export async function handleRoute({
|
|||
|
||||
mod = preloadedComponent;
|
||||
|
||||
const isPrerendered404 = matchedRoute.route.route === '/404' && matchedRoute.route.prerender;
|
||||
const isDefaultPrerendered404 =
|
||||
matchedRoute.route.route === '/404' &&
|
||||
matchedRoute.route.prerender &&
|
||||
matchedRoute.route.component === DEFAULT_404_COMPONENT;
|
||||
|
||||
renderContext = RenderContext.create({
|
||||
renderContext = await RenderContext.create({
|
||||
locals,
|
||||
pipeline,
|
||||
pathname,
|
||||
middleware: isPrerendered404 ? undefined : middleware,
|
||||
middleware: isDefaultPrerendered404 ? undefined : middleware,
|
||||
request,
|
||||
routeData: route,
|
||||
});
|
||||
|
|
|
@ -31,14 +31,11 @@ const astroErrorModulePath = normalizePath(
|
|||
);
|
||||
|
||||
export default function markdown({ settings, logger }: AstroPluginOptions): Plugin {
|
||||
let processor: MarkdownProcessor | undefined;
|
||||
let processor: Promise<MarkdownProcessor> | undefined;
|
||||
|
||||
return {
|
||||
enforce: 'pre',
|
||||
name: 'astro:markdown',
|
||||
async buildStart() {
|
||||
processor = await createMarkdownProcessor(settings.config.markdown);
|
||||
},
|
||||
buildEnd() {
|
||||
processor = undefined;
|
||||
},
|
||||
|
@ -61,15 +58,12 @@ export default function markdown({ settings, logger }: AstroPluginOptions): Plug
|
|||
|
||||
const fileURL = pathToFileURL(fileId);
|
||||
|
||||
// `processor` is initialized in `buildStart`, and removed in `buildEnd`. `load`
|
||||
// should be called in between those two lifecycles, so this error should never happen
|
||||
// Lazily initialize the Markdown processor
|
||||
if (!processor) {
|
||||
return this.error(
|
||||
'MDX processor is not initialized. This is an internal error. Please file an issue.',
|
||||
);
|
||||
processor = createMarkdownProcessor(settings.config.markdown);
|
||||
}
|
||||
|
||||
const renderResult = await processor.render(raw.content, {
|
||||
const renderResult = await (await processor).render(raw.content, {
|
||||
// @ts-expect-error passing internal prop
|
||||
fileURL,
|
||||
frontmatter: raw.data,
|
||||
|
|
|
@ -49,5 +49,10 @@ describe('Dynamic endpoint collision', () => {
|
|||
const res = await fixture.fetch('/api/catch/one').then((r) => r.text());
|
||||
assert.equal(res, '{"slug":"one"}');
|
||||
});
|
||||
|
||||
it('returns 404 when user visits dynamic endpoint that has collision but not specified in getStaticPaths', async () => {
|
||||
const res = await fixture.fetch('/api/safe');
|
||||
assert.equal(res.status, 404);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
14
packages/astro/test/fixtures/dynamic-endpoint-collision/src/pages/api/safe/[...slug].ts
vendored
Normal file
14
packages/astro/test/fixtures/dynamic-endpoint-collision/src/pages/api/safe/[...slug].ts
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
import type { APIRoute } from 'astro';
|
||||
|
||||
// No undefined so should not error
|
||||
const slugs = ['one'];
|
||||
|
||||
export const GET: APIRoute = ({ params }) => {
|
||||
return Response.json({
|
||||
slug: params.slug || 'index',
|
||||
});
|
||||
};
|
||||
|
||||
export function getStaticPaths() {
|
||||
return slugs.map((u) => ({ params: { slug: u } }));
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
import { sequence } from 'astro:middleware';
|
||||
import {defineMiddleware} from "astro/middleware";
|
||||
|
||||
let contextReroute = false;
|
||||
|
||||
|
@ -22,16 +23,23 @@ export const second = async (context, next) => {
|
|||
if (context.url.pathname.includes('/auth/params')) {
|
||||
return next('/?foo=bar');
|
||||
}
|
||||
|
||||
if (context.url.pathname.includes('/auth/astro-params')) {
|
||||
return next('/auth/1234');
|
||||
}
|
||||
}
|
||||
return next();
|
||||
};
|
||||
|
||||
export const third = async (context, next) => {
|
||||
export const third = defineMiddleware(async (context, next) => {
|
||||
// just making sure that we are testing the change in context coming from `next()`
|
||||
if (context.url.pathname.startsWith('/') && contextReroute === false) {
|
||||
context.locals.auth = 'Third function called';
|
||||
}
|
||||
if (context.params?.id === '1234') {
|
||||
context.locals.auth = 'Params changed'
|
||||
}
|
||||
return next();
|
||||
};
|
||||
});
|
||||
|
||||
export const onRequest = sequence(first, second, third);
|
||||
|
|
23
packages/astro/test/fixtures/reroute/src/pages/auth/[id].astro
vendored
Normal file
23
packages/astro/test/fixtures/reroute/src/pages/auth/[id].astro
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
|
||||
export function getStaticPaths( ) {
|
||||
return [{
|
||||
params: {
|
||||
id: "1234"
|
||||
}
|
||||
}]
|
||||
}
|
||||
|
||||
const { id } = Astro.params;
|
||||
const auth = Astro.locals.auth;
|
||||
---
|
||||
<html>
|
||||
<head>
|
||||
<title>Index with params</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Index with params</h1>
|
||||
<p id="params">Param: {id}</p>
|
||||
<p id="locals">Locals: {auth}</p>
|
||||
</body>
|
||||
</html>
|
3
packages/astro/test/fixtures/reroute/src/pages/auth/astro-params.astro
vendored
Normal file
3
packages/astro/test/fixtures/reroute/src/pages/auth/astro-params.astro
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
|
||||
---
|
|
@ -1,4 +1,6 @@
|
|||
---
|
||||
const { id } = Astro.params;
|
||||
const auth = Astro.locals.auth;
|
||||
---
|
||||
<html>
|
||||
<head>
|
||||
|
@ -6,5 +8,7 @@
|
|||
</head>
|
||||
<body>
|
||||
<h1>Index with params</h1>
|
||||
<p id="params">Param: {id}</p>
|
||||
<p id="locals">Locals: {auth}</p>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -53,9 +53,9 @@ describe('Dev server manual routing', () => {
|
|||
assert.equal(text.includes('Hola.'), true);
|
||||
});
|
||||
|
||||
it('should not redirect prerendered 404 routes in dev', async () => {
|
||||
it('should call the middleware for 404.astro pages', async () => {
|
||||
const response = await fixture.fetch('/redirect-me');
|
||||
assert.equal(response.status, 404);
|
||||
assert.equal(response.status, 200);
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -388,6 +388,15 @@ describe('Middleware', () => {
|
|||
|
||||
assert.match($('h1').text(), /Index/);
|
||||
});
|
||||
|
||||
it('should render correctly compute the new params next("/auth/1234")', async () => {
|
||||
const html = await fixture.fetch('/auth/astro-params').then((res) => res.text());
|
||||
const $ = cheerioLoad(html);
|
||||
|
||||
assert.match($('h1').text(), /Index with params/);
|
||||
assert.match($('#params').text(), /Param: 1234/);
|
||||
assert.match($('#locals').text(), /Locals: Params changed/);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Middleware with custom 404.astro and 500.astro', () => {
|
||||
|
|
|
@ -103,7 +103,7 @@ describe('core/render', () => {
|
|||
component: 'src/pages/index.astro',
|
||||
params: {},
|
||||
};
|
||||
const renderContext = RenderContext.create({ pipeline, request, routeData });
|
||||
const renderContext = await RenderContext.create({ pipeline, request, routeData });
|
||||
const response = await renderContext.render(PageModule);
|
||||
|
||||
const html = await response.text();
|
||||
|
@ -184,7 +184,7 @@ describe('core/render', () => {
|
|||
component: 'src/pages/index.astro',
|
||||
params: {},
|
||||
};
|
||||
const renderContext = RenderContext.create({ pipeline, request, routeData });
|
||||
const renderContext = await RenderContext.create({ pipeline, request, routeData });
|
||||
const response = await renderContext.render(PageModule);
|
||||
|
||||
const html = await response.text();
|
||||
|
@ -232,7 +232,7 @@ describe('core/render', () => {
|
|||
component: 'src/pages/index.astro',
|
||||
params: {},
|
||||
};
|
||||
const renderContext = RenderContext.create({ pipeline, request, routeData });
|
||||
const renderContext = await RenderContext.create({ pipeline, request, routeData });
|
||||
const response = await renderContext.render(PageModule);
|
||||
|
||||
const html = await response.text();
|
||||
|
|
152
packages/astro/test/units/routing/generator.test.js
Normal file
152
packages/astro/test/units/routing/generator.test.js
Normal file
|
@ -0,0 +1,152 @@
|
|||
import * as assert from 'node:assert/strict';
|
||||
import { describe, it } from 'node:test';
|
||||
|
||||
import { getRouteGenerator } from '../../../dist/core/routing/manifest/generator.js';
|
||||
|
||||
describe('routing - generator', () => {
|
||||
[
|
||||
{
|
||||
routeData: [],
|
||||
trailingSlash: 'never',
|
||||
params: {},
|
||||
path: '/',
|
||||
},
|
||||
{
|
||||
routeData: [],
|
||||
trailingSlash: 'always',
|
||||
params: {},
|
||||
path: '/',
|
||||
},
|
||||
{
|
||||
routeData: [[{ spread: false, content: 'test', dynamic: false }]],
|
||||
trailingSlash: 'never',
|
||||
params: {},
|
||||
path: '/test',
|
||||
},
|
||||
{
|
||||
routeData: [[{ spread: false, content: 'test', dynamic: false }]],
|
||||
trailingSlash: 'always',
|
||||
params: {},
|
||||
path: '/test/',
|
||||
},
|
||||
{
|
||||
routeData: [[{ spread: false, content: 'test', dynamic: false }]],
|
||||
trailingSlash: 'always',
|
||||
params: { foo: 'bar' },
|
||||
path: '/test/',
|
||||
},
|
||||
{
|
||||
routeData: [[{ spread: false, content: 'foo', dynamic: true }]],
|
||||
trailingSlash: 'always',
|
||||
params: { foo: 'bar' },
|
||||
path: '/bar/',
|
||||
},
|
||||
{
|
||||
routeData: [[{ spread: false, content: 'foo', dynamic: true }]],
|
||||
trailingSlash: 'never',
|
||||
params: { foo: 'bar' },
|
||||
path: '/bar',
|
||||
},
|
||||
{
|
||||
routeData: [[{ spread: true, content: '...foo', dynamic: true }]],
|
||||
trailingSlash: 'never',
|
||||
params: {},
|
||||
path: '/',
|
||||
},
|
||||
{
|
||||
routeData: [
|
||||
[
|
||||
{ spread: true, content: '...foo', dynamic: true },
|
||||
{ spread: false, content: '-', dynamic: false },
|
||||
{ spread: true, content: '...bar', dynamic: true },
|
||||
],
|
||||
],
|
||||
trailingSlash: 'never',
|
||||
params: { foo: 'one', bar: 'two' },
|
||||
path: '/one-two',
|
||||
},
|
||||
{
|
||||
routeData: [
|
||||
[
|
||||
{ spread: true, content: '...foo', dynamic: true },
|
||||
{ spread: false, content: '-', dynamic: false },
|
||||
{ spread: true, content: '...bar', dynamic: true },
|
||||
],
|
||||
],
|
||||
trailingSlash: 'never',
|
||||
params: {},
|
||||
path: '/-',
|
||||
},
|
||||
{
|
||||
routeData: [
|
||||
[{ spread: true, content: '...foo', dynamic: true }],
|
||||
[{ spread: true, content: '...bar', dynamic: true }],
|
||||
],
|
||||
trailingSlash: 'never',
|
||||
params: { foo: 'one' },
|
||||
path: '/one',
|
||||
},
|
||||
{
|
||||
routeData: [
|
||||
[{ spread: false, content: 'fix', dynamic: false }],
|
||||
[{ spread: true, content: '...foo', dynamic: true }],
|
||||
[{ spread: true, content: '...bar', dynamic: true }],
|
||||
],
|
||||
trailingSlash: 'never',
|
||||
params: { foo: 'one' },
|
||||
path: '/fix/one',
|
||||
},
|
||||
{
|
||||
routeData: [
|
||||
[{ spread: false, content: 'fix', dynamic: false }],
|
||||
[{ spread: true, content: '...foo', dynamic: true }],
|
||||
[{ spread: true, content: '...bar', dynamic: true }],
|
||||
],
|
||||
trailingSlash: 'always',
|
||||
params: { foo: 'one' },
|
||||
path: '/fix/one/',
|
||||
},
|
||||
{
|
||||
routeData: [
|
||||
[{ spread: false, content: 'fix', dynamic: false }],
|
||||
[{ spread: true, content: '...foo', dynamic: true }],
|
||||
[{ spread: true, content: '...bar', dynamic: true }],
|
||||
],
|
||||
trailingSlash: 'never',
|
||||
params: { foo: 'one', bar: 'two' },
|
||||
path: '/fix/one/two',
|
||||
},
|
||||
{
|
||||
routeData: [
|
||||
[{ spread: false, content: 'fix', dynamic: false }],
|
||||
[{ spread: true, content: '...foo', dynamic: true }],
|
||||
[{ spread: true, content: '...bar', dynamic: true }],
|
||||
],
|
||||
trailingSlash: 'never',
|
||||
params: { foo: 'one&two' },
|
||||
path: '/fix/one&two',
|
||||
},
|
||||
{
|
||||
routeData: [
|
||||
[{ spread: false, content: 'fix', dynamic: false }],
|
||||
[{ spread: false, content: 'page', dynamic: true }],
|
||||
],
|
||||
trailingSlash: 'never',
|
||||
params: { page: 1 },
|
||||
path: '/fix/1',
|
||||
},
|
||||
].forEach(({ routeData, trailingSlash, params, path }) => {
|
||||
it(`generates ${path}`, () => {
|
||||
const generator = getRouteGenerator(routeData, trailingSlash);
|
||||
assert.equal(generator(params), path);
|
||||
});
|
||||
});
|
||||
|
||||
it('should throw an error when a dynamic parameter is missing', () => {
|
||||
const generator = getRouteGenerator(
|
||||
[[{ spread: false, content: 'foo', dynamic: true }]],
|
||||
'never',
|
||||
);
|
||||
assert.throws(() => generator({}), TypeError);
|
||||
});
|
||||
});
|
|
@ -10,6 +10,7 @@ import { createBaseSettings } from '../../dist/core/config/settings.js';
|
|||
import { createContainer } from '../../dist/core/dev/container.js';
|
||||
import { Logger } from '../../dist/core/logger/core.js';
|
||||
import { nodeLogDestination } from '../../dist/core/logger/node.js';
|
||||
import { NOOP_MIDDLEWARE_FN } from '../../dist/core/middleware/noop-middleware.js';
|
||||
import { Pipeline } from '../../dist/core/render/index.js';
|
||||
import { RouteCache } from '../../dist/core/render/route-cache.js';
|
||||
import { unixify } from './correct-path.js';
|
||||
|
@ -207,6 +208,9 @@ export function createBasicPipeline(options = {}) {
|
|||
);
|
||||
pipeline.headElements = () => ({ scripts: new Set(), styles: new Set(), links: new Set() });
|
||||
pipeline.componentMetadata = () => new Map();
|
||||
pipeline.getMiddleware = () => {
|
||||
return NOOP_MIDDLEWARE_FN;
|
||||
};
|
||||
return pipeline;
|
||||
}
|
||||
|
||||
|
|
|
@ -38,6 +38,12 @@
|
|||
- astro@5.0.0-alpha.0
|
||||
- @astrojs/markdown-remark@6.0.0-alpha.0
|
||||
|
||||
## 3.1.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#12026](https://github.com/withastro/astro/pull/12026) [`40e7a1b`](https://github.com/withastro/astro/commit/40e7a1b05d9e5ea3fcda176c9663bbcff86edb63) Thanks [@bluwy](https://github.com/bluwy)! - Initializes the MDX processor only when there's `.mdx` files
|
||||
|
||||
## 3.1.6
|
||||
|
||||
### Patch Changes
|
||||
|
|
|
@ -8,6 +8,7 @@ import { parseFrontmatter } from './utils.js';
|
|||
|
||||
export function vitePluginMdx(mdxOptions: MdxOptions): Plugin {
|
||||
let processor: ReturnType<typeof createMdxProcessor> | undefined;
|
||||
let sourcemapEnabled: boolean;
|
||||
|
||||
return {
|
||||
name: '@mdx-js/rollup',
|
||||
|
@ -16,13 +17,7 @@ export function vitePluginMdx(mdxOptions: MdxOptions): Plugin {
|
|||
processor = undefined;
|
||||
},
|
||||
configResolved(resolved) {
|
||||
// `mdxOptions` should be populated at this point, but `astro sync` doesn't call `astro:config:done` :(
|
||||
// Workaround this for now by skipping here. `astro sync` shouldn't call the `transform()` hook here anyways.
|
||||
if (Object.keys(mdxOptions).length === 0) return;
|
||||
|
||||
processor = createMdxProcessor(mdxOptions, {
|
||||
sourcemap: !!resolved.build.sourcemap,
|
||||
});
|
||||
sourcemapEnabled = !!resolved.build.sourcemap;
|
||||
|
||||
// HACK: Remove the `astro:jsx` plugin if defined as we handle the JSX transformation ourselves
|
||||
const jsxPluginIndex = resolved.plugins.findIndex((p) => p.name === 'astro:jsx');
|
||||
|
@ -56,12 +51,9 @@ export function vitePluginMdx(mdxOptions: MdxOptions): Plugin {
|
|||
},
|
||||
});
|
||||
|
||||
// `processor` is initialized in `configResolved`, and removed in `buildEnd`. `transform`
|
||||
// should be called in between those two lifecycle, so this error should never happen
|
||||
// Lazily initialize the MDX processor
|
||||
if (!processor) {
|
||||
return this.error(
|
||||
'MDX processor is not initialized. This is an internal error. Please file an issue.',
|
||||
);
|
||||
processor = createMdxProcessor(mdxOptions, { sourcemap: sourcemapEnabled });
|
||||
}
|
||||
|
||||
try {
|
||||
|
|
101
pnpm-lock.yaml
generated
101
pnpm-lock.yaml
generated
|
@ -33,9 +33,6 @@ importers:
|
|||
eslint:
|
||||
specifier: ^9.10.0
|
||||
version: 9.10.0(jiti@1.21.0)
|
||||
eslint-plugin-no-only-tests:
|
||||
specifier: ^3.3.0
|
||||
version: 3.3.0
|
||||
eslint-plugin-regexp:
|
||||
specifier: ^2.6.0
|
||||
version: 2.6.0(eslint@9.10.0(jiti@1.21.0))
|
||||
|
@ -264,7 +261,7 @@ importers:
|
|||
examples/framework-solid:
|
||||
dependencies:
|
||||
'@astrojs/solid-js':
|
||||
specifier: ^4.4.1
|
||||
specifier: ^4.4.2
|
||||
version: link:../../packages/integrations/solid
|
||||
astro:
|
||||
specifier: ^5.0.0-beta.1
|
||||
|
@ -276,7 +273,7 @@ importers:
|
|||
examples/framework-svelte:
|
||||
dependencies:
|
||||
'@astrojs/svelte':
|
||||
specifier: ^5.7.0
|
||||
specifier: ^5.7.1
|
||||
version: link:../../packages/integrations/svelte
|
||||
astro:
|
||||
specifier: ^5.0.0-beta.1
|
||||
|
@ -288,13 +285,13 @@ importers:
|
|||
examples/framework-vue:
|
||||
dependencies:
|
||||
'@astrojs/vue':
|
||||
specifier: ^4.5.0
|
||||
specifier: ^4.5.1
|
||||
version: link:../../packages/integrations/vue
|
||||
astro:
|
||||
specifier: ^5.0.0-beta.1
|
||||
version: link:../../packages/astro
|
||||
vue:
|
||||
specifier: ^3.4.38
|
||||
specifier: ^3.5.3
|
||||
version: 3.5.3(typescript@5.5.4)
|
||||
|
||||
examples/hackernews:
|
||||
|
@ -424,7 +421,7 @@ importers:
|
|||
specifier: ^9.0.0-alpha.1
|
||||
version: 9.0.0-alpha.1(astro@packages+astro)
|
||||
'@astrojs/tailwind':
|
||||
specifier: ^5.1.0
|
||||
specifier: ^5.1.1
|
||||
version: link:../../packages/integrations/tailwind
|
||||
astro:
|
||||
specifier: ^5.0.0-beta.1
|
||||
|
@ -508,7 +505,7 @@ importers:
|
|||
specifier: ^4.0.0-beta.1
|
||||
version: link:../../packages/integrations/mdx
|
||||
'@astrojs/tailwind':
|
||||
specifier: ^5.1.0
|
||||
specifier: ^5.1.1
|
||||
version: link:../../packages/integrations/tailwind
|
||||
'@types/canvas-confetti':
|
||||
specifier: ^1.6.4
|
||||
|
@ -553,11 +550,11 @@ importers:
|
|||
specifier: workspace:*
|
||||
version: link:../telemetry
|
||||
'@babel/types':
|
||||
specifier: ^7.25.4
|
||||
version: 7.25.4
|
||||
specifier: ^7.25.6
|
||||
version: 7.25.6
|
||||
'@oslojs/encoding':
|
||||
specifier: ^0.4.1
|
||||
version: 0.4.1
|
||||
specifier: ^1.0.0
|
||||
version: 1.0.0
|
||||
'@rollup/pluginutils':
|
||||
specifier: ^5.1.0
|
||||
version: 5.1.0(rollup@4.21.2)
|
||||
|
@ -669,9 +666,6 @@ importers:
|
|||
p-queue:
|
||||
specifier: ^8.0.1
|
||||
version: 8.0.1
|
||||
path-to-regexp:
|
||||
specifier: 6.2.2
|
||||
version: 6.2.2
|
||||
preferred-pm:
|
||||
specifier: ^4.0.0
|
||||
version: 4.0.0
|
||||
|
@ -5858,8 +5852,8 @@ packages:
|
|||
resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
||||
'@babel/types@7.25.4':
|
||||
resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==}
|
||||
'@babel/types@7.25.6':
|
||||
resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
||||
'@biomejs/biome@1.8.3':
|
||||
|
@ -6734,8 +6728,8 @@ packages:
|
|||
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
'@oslojs/encoding@0.4.1':
|
||||
resolution: {integrity: sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==}
|
||||
'@oslojs/encoding@1.0.0':
|
||||
resolution: {integrity: sha512-dyIB0SdZgMm5BhGwdSp8rMxEFIopLKxDG1vxIBaiogyom6ZqH2aXPb6DEC2WzOOWKdPSq1cxdNeRx2wAn1Z+ZQ==}
|
||||
|
||||
'@pkgjs/parseargs@0.11.0':
|
||||
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
||||
|
@ -8136,10 +8130,6 @@ packages:
|
|||
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
eslint-plugin-no-only-tests@3.3.0:
|
||||
resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==}
|
||||
engines: {node: '>=5.0.0'}
|
||||
|
||||
eslint-plugin-regexp@2.6.0:
|
||||
resolution: {integrity: sha512-FCL851+kislsTEQEMioAlpDuK5+E5vs0hi1bF8cFlPlHcEjeRhuAzEsGikXRreE+0j4WhW2uO54MqTjXtYOi3A==}
|
||||
engines: {node: ^18 || >=20}
|
||||
|
@ -9493,9 +9483,6 @@ packages:
|
|||
resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==}
|
||||
engines: {node: '>=16 || 14 >=14.17'}
|
||||
|
||||
path-to-regexp@6.2.2:
|
||||
resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==}
|
||||
|
||||
path-type@4.0.0:
|
||||
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
|
||||
engines: {node: '>=8'}
|
||||
|
@ -11244,7 +11231,7 @@ snapshots:
|
|||
'@babel/parser': 7.25.4
|
||||
'@babel/template': 7.25.0
|
||||
'@babel/traverse': 7.25.4
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
convert-source-map: 2.0.0
|
||||
debug: 4.3.7
|
||||
gensync: 1.0.0-beta.2
|
||||
|
@ -11255,14 +11242,14 @@ snapshots:
|
|||
|
||||
'@babel/generator@7.25.5':
|
||||
dependencies:
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
'@jridgewell/gen-mapping': 0.3.5
|
||||
'@jridgewell/trace-mapping': 0.3.25
|
||||
jsesc: 2.5.2
|
||||
|
||||
'@babel/helper-annotate-as-pure@7.24.7':
|
||||
dependencies:
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@babel/helper-compilation-targets@7.25.2':
|
||||
dependencies:
|
||||
|
@ -11289,32 +11276,32 @@ snapshots:
|
|||
|
||||
'@babel/helper-environment-visitor@7.24.7':
|
||||
dependencies:
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@babel/helper-function-name@7.24.7':
|
||||
dependencies:
|
||||
'@babel/template': 7.25.0
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@babel/helper-member-expression-to-functions@7.24.7':
|
||||
dependencies:
|
||||
'@babel/traverse': 7.25.4
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@babel/helper-module-imports@7.18.6':
|
||||
dependencies:
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@babel/helper-module-imports@7.22.15':
|
||||
dependencies:
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@babel/helper-module-imports@7.24.7':
|
||||
dependencies:
|
||||
'@babel/traverse': 7.25.4
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
|
@ -11330,7 +11317,7 @@ snapshots:
|
|||
|
||||
'@babel/helper-optimise-call-expression@7.24.7':
|
||||
dependencies:
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@babel/helper-plugin-utils@7.24.8': {}
|
||||
|
||||
|
@ -11346,20 +11333,20 @@ snapshots:
|
|||
'@babel/helper-simple-access@7.24.7':
|
||||
dependencies:
|
||||
'@babel/traverse': 7.25.4
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@babel/helper-skip-transparent-expression-wrappers@7.24.7':
|
||||
dependencies:
|
||||
'@babel/traverse': 7.25.4
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@babel/helper-split-export-declaration@7.24.7':
|
||||
dependencies:
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@babel/helper-string-parser@7.24.8': {}
|
||||
|
||||
|
@ -11370,7 +11357,7 @@ snapshots:
|
|||
'@babel/helpers@7.25.0':
|
||||
dependencies:
|
||||
'@babel/template': 7.25.0
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@babel/highlight@7.24.7':
|
||||
dependencies:
|
||||
|
@ -11381,7 +11368,7 @@ snapshots:
|
|||
|
||||
'@babel/parser@7.25.4':
|
||||
dependencies:
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@babel/plugin-proposal-decorators@7.24.1(@babel/core@7.25.2)':
|
||||
dependencies:
|
||||
|
@ -11441,7 +11428,7 @@ snapshots:
|
|||
'@babel/helper-module-imports': 7.24.7
|
||||
'@babel/helper-plugin-utils': 7.24.8
|
||||
'@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2)
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
|
@ -11463,7 +11450,7 @@ snapshots:
|
|||
dependencies:
|
||||
'@babel/code-frame': 7.24.7
|
||||
'@babel/parser': 7.25.4
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@babel/traverse@7.25.4':
|
||||
dependencies:
|
||||
|
@ -11471,13 +11458,13 @@ snapshots:
|
|||
'@babel/generator': 7.25.5
|
||||
'@babel/parser': 7.25.4
|
||||
'@babel/template': 7.25.0
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
debug: 4.3.7
|
||||
globals: 11.12.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@babel/types@7.25.4':
|
||||
'@babel/types@7.25.6':
|
||||
dependencies:
|
||||
'@babel/helper-string-parser': 7.24.8
|
||||
'@babel/helper-validator-identifier': 7.24.7
|
||||
|
@ -12346,7 +12333,7 @@ snapshots:
|
|||
'@nodelib/fs.scandir': 2.1.5
|
||||
fastq: 1.17.1
|
||||
|
||||
'@oslojs/encoding@0.4.1': {}
|
||||
'@oslojs/encoding@1.0.0': {}
|
||||
|
||||
'@pkgjs/parseargs@0.11.0':
|
||||
optional: true
|
||||
|
@ -12519,23 +12506,23 @@ snapshots:
|
|||
'@types/babel__core@7.20.5':
|
||||
dependencies:
|
||||
'@babel/parser': 7.25.4
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
'@types/babel__generator': 7.6.8
|
||||
'@types/babel__template': 7.4.4
|
||||
'@types/babel__traverse': 7.20.6
|
||||
|
||||
'@types/babel__generator@7.6.8':
|
||||
dependencies:
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@types/babel__template@7.4.4':
|
||||
dependencies:
|
||||
'@babel/parser': 7.25.4
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@types/babel__traverse@7.20.6':
|
||||
dependencies:
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
|
||||
'@types/body-parser@1.19.5':
|
||||
dependencies:
|
||||
|
@ -12986,7 +12973,7 @@ snapshots:
|
|||
'@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2)
|
||||
'@babel/template': 7.25.0
|
||||
'@babel/traverse': 7.25.4
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
'@vue/babel-helper-vue-transform-on': 1.2.2
|
||||
'@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.25.2)
|
||||
camelcase: 6.3.0
|
||||
|
@ -13250,7 +13237,7 @@ snapshots:
|
|||
'@babel/core': 7.25.2
|
||||
'@babel/helper-module-imports': 7.18.6
|
||||
'@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2)
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
html-entities: 2.3.3
|
||||
validate-html-nesting: 1.2.2
|
||||
|
||||
|
@ -13789,8 +13776,6 @@ snapshots:
|
|||
|
||||
escape-string-regexp@5.0.0: {}
|
||||
|
||||
eslint-plugin-no-only-tests@3.3.0: {}
|
||||
|
||||
eslint-plugin-regexp@2.6.0(eslint@9.10.0(jiti@1.21.0)):
|
||||
dependencies:
|
||||
'@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.0))
|
||||
|
@ -14740,7 +14725,7 @@ snapshots:
|
|||
magicast@0.3.5:
|
||||
dependencies:
|
||||
'@babel/parser': 7.25.4
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
source-map-js: 1.2.0
|
||||
|
||||
manage-path@2.0.0: {}
|
||||
|
@ -15575,8 +15560,6 @@ snapshots:
|
|||
lru-cache: 10.2.0
|
||||
minipass: 7.1.2
|
||||
|
||||
path-to-regexp@6.2.2: {}
|
||||
|
||||
path-type@4.0.0: {}
|
||||
|
||||
path-type@5.0.0: {}
|
||||
|
@ -16403,7 +16386,7 @@ snapshots:
|
|||
dependencies:
|
||||
'@babel/generator': 7.25.5
|
||||
'@babel/helper-module-imports': 7.24.7
|
||||
'@babel/types': 7.25.4
|
||||
'@babel/types': 7.25.6
|
||||
solid-js: 1.8.22
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
|
Loading…
Add table
Reference in a new issue