astro 1.5.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/astro-jsx.d.ts +8 -6
  2. package/config.d.ts +1 -1
  3. package/dist/core/add/index.js +1 -1
  4. package/dist/core/app/index.js +45 -43
  5. package/dist/core/build/common.js +2 -1
  6. package/dist/core/build/generate.js +14 -30
  7. package/dist/core/build/static-build.js +1 -1
  8. package/dist/core/config/schema.js +12 -1
  9. package/dist/core/config/tsconfig.js +5 -6
  10. package/dist/core/constants.js +1 -1
  11. package/dist/core/dev/index.js +1 -1
  12. package/dist/core/endpoint/dev/index.d.ts +2 -1
  13. package/dist/core/endpoint/dev/index.js +13 -9
  14. package/dist/core/endpoint/index.d.ts +4 -3
  15. package/dist/core/endpoint/index.js +16 -8
  16. package/dist/core/messages.js +2 -2
  17. package/dist/core/render/context.d.ts +20 -0
  18. package/dist/core/render/context.js +15 -0
  19. package/dist/core/render/core.d.ts +4 -24
  20. package/dist/core/render/core.js +26 -47
  21. package/dist/core/render/dev/environment.d.ts +9 -0
  22. package/dist/core/render/dev/environment.js +30 -0
  23. package/dist/core/render/dev/index.d.ts +22 -5
  24. package/dist/core/render/dev/index.js +38 -69
  25. package/dist/core/render/dev/resolve.d.ts +2 -0
  26. package/dist/core/render/dev/resolve.js +14 -0
  27. package/dist/core/render/environment.d.ts +29 -0
  28. package/dist/core/render/environment.js +21 -0
  29. package/dist/core/render/index.d.ts +6 -0
  30. package/dist/core/render/index.js +13 -0
  31. package/dist/core/render/renderer.d.ts +9 -0
  32. package/dist/core/render/renderer.js +23 -0
  33. package/dist/core/render/result.js +1 -1
  34. package/dist/core/routing/manifest/create.js +14 -5
  35. package/dist/core/routing/manifest/generator.js +8 -3
  36. package/dist/jsx/component.d.ts +1 -0
  37. package/dist/jsx/component.js +10 -0
  38. package/dist/jsx/index.d.ts +2 -0
  39. package/dist/jsx/index.js +6 -0
  40. package/dist/jsx-runtime/index.js +1 -1
  41. package/dist/runtime/server/index.d.ts +1 -0
  42. package/dist/runtime/server/index.js +2 -0
  43. package/dist/vite-plugin-astro-server/index.js +47 -60
  44. package/env.d.ts +1 -1
  45. package/package.json +5 -2
@@ -1,4 +1,4 @@
1
- import { Fragment, renderPage } from "../../runtime/server/index.js";
1
+ import { Fragment, renderPage as runtimeRenderPage } from "../../runtime/server/index.js";
2
2
  import { attachToResponse } from "../cookies/index.js";
3
3
  import { getParams } from "../routing/params.js";
4
4
  import { createResult } from "./result.js";
@@ -33,63 +33,42 @@ async function getParamsAndProps(opts) {
33
33
  }
34
34
  return [params, pageProps];
35
35
  }
36
- async function render(opts) {
37
- const {
38
- adapterName,
39
- links,
40
- styles,
41
- logging,
42
- origin,
43
- markdown,
44
- mod,
45
- mode,
46
- pathname,
47
- scripts,
48
- renderers,
49
- request,
50
- resolve,
51
- route,
52
- routeCache,
53
- site,
54
- ssr,
55
- streaming,
56
- status = 200
57
- } = opts;
36
+ async function renderPage(mod, ctx, env) {
58
37
  const paramsAndPropsRes = await getParamsAndProps({
59
- logging,
38
+ logging: env.logging,
60
39
  mod,
61
- route,
62
- routeCache,
63
- pathname,
64
- ssr
40
+ route: ctx.route,
41
+ routeCache: env.routeCache,
42
+ pathname: ctx.pathname,
43
+ ssr: env.ssr
65
44
  });
66
45
  if (paramsAndPropsRes === 0 /* NoMatchingStaticPath */) {
67
46
  throw new Error(
68
- `[getStaticPath] route pattern matched, but no matching static path found. (${pathname})`
47
+ `[getStaticPath] route pattern matched, but no matching static path found. (${ctx.pathname})`
69
48
  );
70
49
  }
71
50
  const [params, pageProps] = paramsAndPropsRes;
72
- const Component = await mod.default;
51
+ const Component = mod.default;
73
52
  if (!Component)
74
53
  throw new Error(`Expected an exported Astro component but received typeof ${typeof Component}`);
75
54
  const result = createResult({
76
- adapterName,
77
- links,
78
- styles,
79
- logging,
80
- markdown,
81
- mode,
82
- origin,
55
+ adapterName: env.adapterName,
56
+ links: ctx.links,
57
+ styles: ctx.styles,
58
+ logging: env.logging,
59
+ markdown: env.markdown,
60
+ mode: env.mode,
61
+ origin: ctx.origin,
83
62
  params,
84
63
  props: pageProps,
85
- pathname,
86
- resolve,
87
- renderers,
88
- request,
89
- site,
90
- scripts,
91
- ssr,
92
- status
64
+ pathname: ctx.pathname,
65
+ resolve: env.resolve,
66
+ renderers: env.renderers,
67
+ request: ctx.request,
68
+ site: env.site,
69
+ scripts: ctx.scripts,
70
+ ssr: env.ssr,
71
+ status: ctx.status ?? 200
93
72
  });
94
73
  if (typeof mod.components === "object") {
95
74
  Object.assign(pageProps, { components: mod.components });
@@ -99,7 +78,7 @@ async function render(opts) {
99
78
  components: Object.assign((pageProps == null ? void 0 : pageProps.components) ?? {}, { Fragment })
100
79
  });
101
80
  }
102
- const response = await renderPage(result, Component, pageProps, null, streaming);
81
+ const response = await runtimeRenderPage(result, Component, pageProps, null, env.streaming);
103
82
  if (result.cookies) {
104
83
  attachToResponse(response, result.cookies);
105
84
  }
@@ -108,5 +87,5 @@ async function render(opts) {
108
87
  export {
109
88
  GetParamsAndPropsError,
110
89
  getParamsAndProps,
111
- render
90
+ renderPage
112
91
  };
@@ -0,0 +1,9 @@
1
+ import type { ViteDevServer } from 'vite';
2
+ import type { AstroSettings } from '../../../@types/astro';
3
+ import type { LogOptions } from '../../logger/core.js';
4
+ import type { Environment } from '../index';
5
+ export declare type DevelopmentEnvironment = Environment & {
6
+ settings: AstroSettings;
7
+ viteServer: ViteDevServer;
8
+ };
9
+ export declare function createDevelopmentEnvironment(settings: AstroSettings, logging: LogOptions, viteServer: ViteDevServer): DevelopmentEnvironment;
@@ -0,0 +1,30 @@
1
+ import { createEnvironment } from "../index.js";
2
+ import { RouteCache } from "../route-cache.js";
3
+ import { createResolve } from "./resolve.js";
4
+ function createDevelopmentEnvironment(settings, logging, viteServer) {
5
+ var _a;
6
+ const mode = "development";
7
+ let env = createEnvironment({
8
+ adapterName: (_a = settings.adapter) == null ? void 0 : _a.name,
9
+ logging,
10
+ markdown: {
11
+ ...settings.config.markdown,
12
+ isAstroFlavoredMd: settings.config.legacy.astroFlavoredMarkdown
13
+ },
14
+ mode,
15
+ renderers: [],
16
+ resolve: createResolve(viteServer),
17
+ routeCache: new RouteCache(logging, mode),
18
+ site: settings.config.site,
19
+ ssr: settings.config.output === "server",
20
+ streaming: true
21
+ });
22
+ return {
23
+ ...env,
24
+ viteServer,
25
+ settings
26
+ };
27
+ }
28
+ export {
29
+ createDevelopmentEnvironment
30
+ };
@@ -2,7 +2,10 @@ import type { ViteDevServer } from 'vite';
2
2
  import type { AstroSettings, ComponentInstance, RouteData, RuntimeMode, SSRLoadedRenderer } from '../../../@types/astro';
3
3
  import { LogOptions } from '../../logger/core.js';
4
4
  import { RouteCache } from '../route-cache.js';
5
- export interface SSROptions {
5
+ import type { DevelopmentEnvironment } from './environment';
6
+ export { createDevelopmentEnvironment } from './environment.js';
7
+ export type { DevelopmentEnvironment };
8
+ export interface SSROptionsOld {
6
9
  /** an instance of the AstroSettings */
7
10
  settings: AstroSettings;
8
11
  /** location of file on disk */
@@ -24,9 +27,23 @@ export interface SSROptions {
24
27
  /** Request */
25
28
  request: Request;
26
29
  }
30
+ export interface SSROptions {
31
+ /** The environment instance */
32
+ env: DevelopmentEnvironment;
33
+ /** location of file on disk */
34
+ filePath: URL;
35
+ /** production website */
36
+ origin: string;
37
+ /** the web request (needed for dynamic routes) */
38
+ pathname: string;
39
+ /** The renderers and instance */
40
+ preload: ComponentPreload;
41
+ /** Request */
42
+ request: Request;
43
+ /** optional, in case we need to render something outside of a dev server */
44
+ route?: RouteData;
45
+ }
27
46
  export declare type ComponentPreload = [SSRLoadedRenderer[], ComponentInstance];
28
47
  export declare function loadRenderers(viteServer: ViteDevServer, settings: AstroSettings): Promise<SSRLoadedRenderer[]>;
29
- export declare function preload({ settings, filePath, viteServer, }: Pick<SSROptions, 'settings' | 'filePath' | 'viteServer'>): Promise<ComponentPreload>;
30
- /** use Vite to SSR */
31
- export declare function render(renderers: SSRLoadedRenderer[], mod: ComponentInstance, ssrOpts: SSROptions): Promise<Response>;
32
- export declare function ssr(preloadedComponent: ComponentPreload, ssrOpts: SSROptions): Promise<Response>;
48
+ export declare function preload({ env, filePath, }: Pick<SSROptions, 'env' | 'filePath'>): Promise<ComponentPreload>;
49
+ export declare function renderPage(options: SSROptions): Promise<Response>;
@@ -1,50 +1,35 @@
1
1
  import { fileURLToPath } from "url";
2
2
  import { PAGE_SCRIPT_ID } from "../../../vite-plugin-scripts/index.js";
3
3
  import { isPage, resolveIdToUrl } from "../../util.js";
4
- import { render as coreRender } from "../core.js";
4
+ import { createRenderContext, renderPage as coreRenderPage } from "../index.js";
5
+ import { filterFoundRenderers, loadRenderer } from "../renderer.js";
5
6
  import { collectMdMetadata } from "../util.js";
6
7
  import { getStylesForURL } from "./css.js";
7
8
  import { getScriptsForURL } from "./scripts.js";
8
- const svelteStylesRE = /svelte\?svelte&type=style/;
9
- async function loadRenderer(viteServer, renderer) {
10
- const mod = await viteServer.ssrLoadModule(renderer.serverEntrypoint);
11
- return { ...renderer, ssr: mod.default };
12
- }
9
+ import { createDevelopmentEnvironment } from "./environment.js";
13
10
  async function loadRenderers(viteServer, settings) {
14
- return Promise.all(settings.renderers.map((r) => loadRenderer(viteServer, r)));
11
+ const loader = (entry) => viteServer.ssrLoadModule(entry);
12
+ const renderers = await Promise.all(settings.renderers.map((r) => loadRenderer(r, loader)));
13
+ return filterFoundRenderers(renderers);
15
14
  }
16
15
  async function preload({
17
- settings,
18
- filePath,
19
- viteServer
16
+ env,
17
+ filePath
20
18
  }) {
21
- const renderers = await loadRenderers(viteServer, settings);
22
- const mod = await viteServer.ssrLoadModule(fileURLToPath(filePath));
23
- if (viteServer.config.mode === "development" || !(mod == null ? void 0 : mod.$$metadata)) {
19
+ const renderers = await loadRenderers(env.viteServer, env.settings);
20
+ const mod = await env.viteServer.ssrLoadModule(fileURLToPath(filePath));
21
+ if (env.viteServer.config.mode === "development" || !(mod == null ? void 0 : mod.$$metadata)) {
24
22
  return [renderers, mod];
25
23
  }
26
- const modGraph = await viteServer.moduleGraph.getModuleByUrl(fileURLToPath(filePath));
24
+ const modGraph = await env.viteServer.moduleGraph.getModuleByUrl(fileURLToPath(filePath));
27
25
  if (modGraph) {
28
- await collectMdMetadata(mod.$$metadata, modGraph, viteServer);
26
+ await collectMdMetadata(mod.$$metadata, modGraph, env.viteServer);
29
27
  }
30
28
  return [renderers, mod];
31
29
  }
32
- async function render(renderers, mod, ssrOpts) {
33
- var _a;
34
- const {
35
- settings,
36
- filePath,
37
- logging,
38
- mode,
39
- origin,
40
- pathname,
41
- request,
42
- route,
43
- routeCache,
44
- viteServer
45
- } = ssrOpts;
46
- const scripts = await getScriptsForURL(filePath, viteServer);
47
- if (isPage(filePath, settings) && mode === "development") {
30
+ async function getScriptsAndStyles({ env, filePath }) {
31
+ const scripts = await getScriptsForURL(filePath, env.viteServer);
32
+ if (isPage(filePath, env.settings) && env.mode === "development") {
48
33
  scripts.add({
49
34
  props: { type: "module", src: "/@vite/client" },
50
35
  children: ""
@@ -52,25 +37,25 @@ async function render(renderers, mod, ssrOpts) {
52
37
  scripts.add({
53
38
  props: {
54
39
  type: "module",
55
- src: await resolveIdToUrl(viteServer, "astro/runtime/client/hmr.js")
40
+ src: await resolveIdToUrl(env.viteServer, "astro/runtime/client/hmr.js")
56
41
  },
57
42
  children: ""
58
43
  });
59
44
  }
60
- for (const script of settings.scripts) {
45
+ for (const script of env.settings.scripts) {
61
46
  if (script.stage === "head-inline") {
62
47
  scripts.add({
63
48
  props: {},
64
49
  children: script.content
65
50
  });
66
- } else if (script.stage === "page" && isPage(filePath, settings)) {
51
+ } else if (script.stage === "page" && isPage(filePath, env.settings)) {
67
52
  scripts.add({
68
53
  props: { type: "module", src: `/@id/${PAGE_SCRIPT_ID}` },
69
54
  children: ""
70
55
  });
71
56
  }
72
57
  }
73
- const { urls: styleUrls, stylesMap } = await getStylesForURL(filePath, viteServer, mode);
58
+ const { urls: styleUrls, stylesMap } = await getStylesForURL(filePath, env.viteServer, env.mode);
74
59
  let links = /* @__PURE__ */ new Set();
75
60
  [...styleUrls].forEach((href) => {
76
61
  links.add({
@@ -95,45 +80,29 @@ async function render(renderers, mod, ssrOpts) {
95
80
  children: content
96
81
  });
97
82
  });
98
- let response = await coreRender({
99
- adapterName: (_a = settings.config.adapter) == null ? void 0 : _a.name,
83
+ return { scripts, styles, links };
84
+ }
85
+ async function renderPage(options) {
86
+ const [renderers, mod] = options.preload;
87
+ options.env.renderers = renderers;
88
+ const { scripts, links, styles } = await getScriptsAndStyles({
89
+ env: options.env,
90
+ filePath: options.filePath
91
+ });
92
+ const ctx = createRenderContext({
93
+ request: options.request,
94
+ origin: options.origin,
95
+ pathname: options.pathname,
96
+ scripts,
100
97
  links,
101
98
  styles,
102
- logging,
103
- markdown: {
104
- ...settings.config.markdown,
105
- isAstroFlavoredMd: settings.config.legacy.astroFlavoredMarkdown
106
- },
107
- mod,
108
- mode,
109
- origin,
110
- pathname,
111
- scripts,
112
- async resolve(s) {
113
- const url = await resolveIdToUrl(viteServer, s);
114
- if (url.startsWith("/@fs") && url.endsWith(".jsx")) {
115
- return url.slice(0, -4);
116
- } else {
117
- return url;
118
- }
119
- },
120
- renderers,
121
- request,
122
- route,
123
- routeCache,
124
- site: settings.config.site ? new URL(settings.config.base, settings.config.site).toString() : void 0,
125
- ssr: settings.config.output === "server",
126
- streaming: true
99
+ route: options.route
127
100
  });
128
- return response;
129
- }
130
- async function ssr(preloadedComponent, ssrOpts) {
131
- const [renderers, mod] = preloadedComponent;
132
- return await render(renderers, mod, ssrOpts);
101
+ return await coreRenderPage(mod, ctx, options.env);
133
102
  }
134
103
  export {
104
+ createDevelopmentEnvironment,
135
105
  loadRenderers,
136
106
  preload,
137
- render,
138
- ssr
107
+ renderPage
139
108
  };
@@ -0,0 +1,2 @@
1
+ import type { ViteDevServer } from 'vite';
2
+ export declare function createResolve(viteServer: ViteDevServer): (s: string) => Promise<string>;
@@ -0,0 +1,14 @@
1
+ import { resolveIdToUrl } from "../../util.js";
2
+ function createResolve(viteServer) {
3
+ return async function(s) {
4
+ const url = await resolveIdToUrl(viteServer, s);
5
+ if (url.startsWith("/@fs") && url.endsWith(".jsx")) {
6
+ return url.slice(0, -4);
7
+ } else {
8
+ return url;
9
+ }
10
+ };
11
+ }
12
+ export {
13
+ createResolve
14
+ };
@@ -0,0 +1,29 @@
1
+ import type { MarkdownRenderingOptions } from '@astrojs/markdown-remark';
2
+ import type { RuntimeMode, SSRLoadedRenderer } from '../../@types/astro';
3
+ import type { LogOptions } from '../logger/core.js';
4
+ import { RouteCache } from './route-cache.js';
5
+ /**
6
+ * An environment represents the static parts of rendering that do not change
7
+ * between requests. These are mostly known when the server first starts up and do not change.
8
+ * Thus they can be created once and passed through to renderPage on each request.
9
+ */
10
+ export interface Environment {
11
+ adapterName?: string;
12
+ /** logging options */
13
+ logging: LogOptions;
14
+ markdown: MarkdownRenderingOptions;
15
+ /** "development" or "production" */
16
+ mode: RuntimeMode;
17
+ renderers: SSRLoadedRenderer[];
18
+ resolve: (s: string) => Promise<string>;
19
+ routeCache: RouteCache;
20
+ site?: string;
21
+ ssr: boolean;
22
+ streaming: boolean;
23
+ }
24
+ export declare type CreateEnvironmentArgs = Environment;
25
+ export declare function createEnvironment(options: CreateEnvironmentArgs): Environment;
26
+ export declare type CreateBasicEnvironmentArgs = Partial<Environment> & {
27
+ logging: CreateEnvironmentArgs['logging'];
28
+ };
29
+ export declare function createBasicEnvironment(options: CreateBasicEnvironmentArgs): Environment;
@@ -0,0 +1,21 @@
1
+ import { RouteCache } from "./route-cache.js";
2
+ function createEnvironment(options) {
3
+ return options;
4
+ }
5
+ function createBasicEnvironment(options) {
6
+ const mode = options.mode ?? "development";
7
+ return createEnvironment({
8
+ ...options,
9
+ markdown: options.markdown ?? {},
10
+ mode,
11
+ renderers: options.renderers ?? [],
12
+ resolve: options.resolve ?? ((s) => Promise.resolve(s)),
13
+ routeCache: new RouteCache(options.logging, mode),
14
+ ssr: options.ssr ?? true,
15
+ streaming: options.streaming ?? true
16
+ });
17
+ }
18
+ export {
19
+ createBasicEnvironment,
20
+ createEnvironment
21
+ };
@@ -0,0 +1,6 @@
1
+ export type { RenderContext } from './context';
2
+ export { createRenderContext } from './context.js';
3
+ export { getParamsAndProps, GetParamsAndPropsError, renderPage } from './core.js';
4
+ export type { Environment } from './environment';
5
+ export { createBasicEnvironment, createEnvironment } from './environment.js';
6
+ export { loadRenderer } from './renderer.js';
@@ -0,0 +1,13 @@
1
+ import { createRenderContext } from "./context.js";
2
+ import { getParamsAndProps, GetParamsAndPropsError, renderPage } from "./core.js";
3
+ import { createBasicEnvironment, createEnvironment } from "./environment.js";
4
+ import { loadRenderer } from "./renderer.js";
5
+ export {
6
+ GetParamsAndPropsError,
7
+ createBasicEnvironment,
8
+ createEnvironment,
9
+ createRenderContext,
10
+ getParamsAndProps,
11
+ loadRenderer,
12
+ renderPage
13
+ };
@@ -0,0 +1,9 @@
1
+ import type { AstroRenderer, SSRLoadedRenderer } from '../../@types/astro';
2
+ export declare type RendererServerEntrypointModule = {
3
+ default: SSRLoadedRenderer['ssr'];
4
+ };
5
+ export declare type MaybeRendererServerEntrypointModule = Partial<RendererServerEntrypointModule>;
6
+ export declare type RendererLoader = (entryPoint: string) => Promise<MaybeRendererServerEntrypointModule>;
7
+ export declare function loadRenderer(renderer: AstroRenderer, loader: RendererLoader): Promise<SSRLoadedRenderer | undefined>;
8
+ export declare function filterFoundRenderers(renderers: Array<SSRLoadedRenderer | undefined>): SSRLoadedRenderer[];
9
+ export declare function createLoadedRenderer(renderer: AstroRenderer, mod: RendererServerEntrypointModule): SSRLoadedRenderer;
@@ -0,0 +1,23 @@
1
+ async function loadRenderer(renderer, loader) {
2
+ const mod = await loader(renderer.serverEntrypoint);
3
+ if (typeof mod.default !== "undefined") {
4
+ return createLoadedRenderer(renderer, mod);
5
+ }
6
+ return void 0;
7
+ }
8
+ function filterFoundRenderers(renderers) {
9
+ return renderers.filter((renderer) => {
10
+ return !!renderer;
11
+ });
12
+ }
13
+ function createLoadedRenderer(renderer, mod) {
14
+ return {
15
+ ...renderer,
16
+ ssr: mod.default
17
+ };
18
+ }
19
+ export {
20
+ createLoadedRenderer,
21
+ filterFoundRenderers,
22
+ loadRenderer
23
+ };
@@ -116,7 +116,7 @@ _slots = new WeakMap();
116
116
  _loggingOpts = new WeakMap();
117
117
  let renderMarkdown = null;
118
118
  function createResult(args) {
119
- const { markdown, params, pathname, props: pageProps, renderers, request, resolve } = args;
119
+ const { markdown, params, pathname, renderers, request, resolve } = args;
120
120
  const url = new URL(request.url);
121
121
  const headers = new Headers();
122
122
  headers.set("Content-Type", "text/html");
@@ -36,10 +36,19 @@ function getParts(part, file) {
36
36
  }
37
37
  function getPattern(segments, addTrailingSlash) {
38
38
  const pathname = segments.map((segment) => {
39
- return segment[0].spread ? "(?:\\/(.*?))?" : "\\/" + segment.map((part) => {
40
- if (part)
41
- return part.dynamic ? "([^/]+?)" : part.content.normalize().replace(/\?/g, "%3F").replace(/#/g, "%23").replace(/%5B/g, "[").replace(/%5D/g, "]").replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
42
- }).join("");
39
+ if (segment.length === 1 && segment[0].spread) {
40
+ return "(?:\\/(.*?))?";
41
+ } else {
42
+ return "\\/" + segment.map((part) => {
43
+ if (part.spread) {
44
+ return "(.*?)";
45
+ } else if (part.dynamic) {
46
+ return "([^/]+?)";
47
+ } else {
48
+ return part.content.normalize().replace(/\?/g, "%3F").replace(/#/g, "%23").replace(/%5B/g, "[").replace(/%5D/g, "]").replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
49
+ }
50
+ }).join("");
51
+ }
43
52
  }).join("");
44
53
  const trailing = addTrailingSlash && segments.length ? getTrailingSlashPattern(addTrailingSlash) : "$";
45
54
  return new RegExp(`^${pathname || "\\/"}${trailing}`);
@@ -71,7 +80,7 @@ function validateSegment(segment, file = "") {
71
80
  if (countOccurrences("[", segment) !== countOccurrences("]", segment)) {
72
81
  throw new Error(`Invalid route ${file} \u2014 brackets are unbalanced`);
73
82
  }
74
- if (/.+\[\.\.\.[^\]]+\]/.test(segment) || /\[\.\.\.[^\]]+\].+/.test(segment)) {
83
+ if ((/.+\[\.\.\.[^\]]+\]/.test(segment) || /\[\.\.\.[^\]]+\].+/.test(segment)) && file.endsWith(".astro")) {
75
84
  throw new Error(`Invalid route ${file} \u2014 rest parameter must be a standalone segment`);
76
85
  }
77
86
  }
@@ -1,9 +1,14 @@
1
1
  import { compile } from "path-to-regexp";
2
2
  function getRouteGenerator(segments, addTrailingSlash) {
3
3
  const template = segments.map((segment) => {
4
- return segment[0].spread ? `/:${segment[0].content.slice(3)}(.*)?` : "/" + segment.map((part) => {
5
- if (part)
6
- return part.dynamic ? `:${part.content}` : part.content.normalize().replace(/\?/g, "%3F").replace(/#/g, "%23").replace(/%5B/g, "[").replace(/%5D/g, "]").replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4
+ return "/" + segment.map((part) => {
5
+ if (part.spread) {
6
+ return `:${part.content.slice(3)}(.*)?`;
7
+ } else if (part.dynamic) {
8
+ return `:${part.content}`;
9
+ } else {
10
+ return part.content.normalize().replace(/\?/g, "%3F").replace(/#/g, "%23").replace(/%5B/g, "[").replace(/%5D/g, "]").replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
11
+ }
7
12
  }).join("");
8
13
  }).join("");
9
14
  let trailing = "";
@@ -0,0 +1 @@
1
+ export declare function createAstroJSXComponent(factory: (...args: any[]) => any): (...args: any[]) => any;
@@ -0,0 +1,10 @@
1
+ import { __astro_tag_component__ } from "../runtime/server/index.js";
2
+ import renderer from "./renderer.js";
3
+ const ASTRO_JSX_RENDERER_NAME = renderer.name;
4
+ function createAstroJSXComponent(factory) {
5
+ __astro_tag_component__(factory, ASTRO_JSX_RENDERER_NAME);
6
+ return factory;
7
+ }
8
+ export {
9
+ createAstroJSXComponent
10
+ };
@@ -0,0 +1,2 @@
1
+ export { createAstroJSXComponent } from './component.js';
2
+ export { default as renderer } from './renderer.js';
@@ -0,0 +1,6 @@
1
+ import { createAstroJSXComponent } from "./component.js";
2
+ import { default as default2 } from "./renderer.js";
3
+ export {
4
+ createAstroJSXComponent,
5
+ default2 as renderer
6
+ };
@@ -1,7 +1,7 @@
1
1
  import { Fragment, markHTMLString, Renderer } from "../runtime/server/index.js";
2
2
  const AstroJSX = "astro:jsx";
3
3
  const Empty = Symbol("empty");
4
- const toSlotName = (str) => str.trim().replace(/[-_]([a-z])/g, (_, w) => w.toUpperCase());
4
+ const toSlotName = (slotAttr) => slotAttr;
5
5
  function isVNode(vnode) {
6
6
  return vnode && typeof vnode === "object" && vnode[AstroJSX];
7
7
  }
@@ -1,6 +1,7 @@
1
1
  export { createAstro } from './astro-global.js';
2
2
  export { renderEndpoint } from './endpoint.js';
3
3
  export { escapeHTML, HTMLBytes, HTMLString, markHTMLString, unescapeHTML } from './escape.js';
4
+ export { renderJSX } from './jsx.js';
4
5
  export type { Metadata } from './metadata';
5
6
  export { createMetadata } from './metadata.js';
6
7
  export { addAttribute, defineScriptVars, Fragment, maybeRenderHead, renderAstroComponent, renderComponent, Renderer as Renderer, renderHead, renderHTMLElement, renderPage, renderSlot, renderTemplate as render, renderTemplate, renderToString, stringifyChunk, voidElementNames, } from './render/index.js';
@@ -1,6 +1,7 @@
1
1
  import { createAstro } from "./astro-global.js";
2
2
  import { renderEndpoint } from "./endpoint.js";
3
3
  import { escapeHTML, HTMLBytes, HTMLString, markHTMLString, unescapeHTML } from "./escape.js";
4
+ import { renderJSX } from "./jsx.js";
4
5
  import { createMetadata } from "./metadata.js";
5
6
  import {
6
7
  addAttribute,
@@ -101,6 +102,7 @@ export {
101
102
  renderEndpoint,
102
103
  renderHTMLElement,
103
104
  renderHead,
105
+ renderJSX,
104
106
  renderPage,
105
107
  renderSlot,
106
108
  renderTemplate2 as renderTemplate,