astro 1.6.13 → 1.6.15

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 (59) hide show
  1. package/dist/@types/astro.d.ts +18 -2
  2. package/dist/core/app/index.js +4 -3
  3. package/dist/core/build/graph.d.ts +1 -1
  4. package/dist/core/build/graph.js +5 -3
  5. package/dist/core/build/vite-plugin-ssr.js +5 -1
  6. package/dist/core/compile/compile.d.ts +2 -1
  7. package/dist/core/compile/compile.js +2 -0
  8. package/dist/core/constants.js +1 -1
  9. package/dist/core/create-vite.js +4 -2
  10. package/dist/core/dev/dev.js +1 -1
  11. package/dist/core/errors/dev/utils.js +1 -1
  12. package/dist/core/messages.js +2 -2
  13. package/dist/core/render/context.d.ts +2 -1
  14. package/dist/core/render/core.js +1 -0
  15. package/dist/core/render/dev/head.d.ts +3 -0
  16. package/dist/core/render/dev/head.js +26 -0
  17. package/dist/core/render/dev/index.d.ts +1 -25
  18. package/dist/core/render/dev/index.js +5 -2
  19. package/dist/core/render/result.d.ts +1 -0
  20. package/dist/core/render/result.js +23 -33
  21. package/dist/jsx/babel.js +2 -1
  22. package/dist/runtime/server/astro-component.d.ts +2 -0
  23. package/dist/runtime/server/astro-component.js +20 -0
  24. package/dist/runtime/server/index.d.ts +3 -4
  25. package/dist/runtime/server/index.js +10 -8
  26. package/dist/runtime/server/jsx.js +3 -3
  27. package/dist/runtime/server/render/any.js +9 -3
  28. package/dist/runtime/server/render/astro/factory.d.ts +13 -0
  29. package/dist/runtime/server/render/astro/factory.js +31 -0
  30. package/dist/runtime/server/render/astro/head-and-content.d.ts +10 -0
  31. package/dist/runtime/server/render/astro/head-and-content.js +15 -0
  32. package/dist/runtime/server/render/astro/index.d.ts +6 -0
  33. package/dist/runtime/server/render/astro/index.js +19 -0
  34. package/dist/runtime/server/render/astro/instance.d.ts +18 -0
  35. package/dist/runtime/server/render/astro/instance.js +62 -0
  36. package/dist/runtime/server/render/astro/render-template.d.ts +16 -0
  37. package/dist/runtime/server/render/astro/render-template.js +65 -0
  38. package/dist/runtime/server/render/component.d.ts +4 -2
  39. package/dist/runtime/server/render/component.js +52 -41
  40. package/dist/runtime/server/render/head.d.ts +3 -2
  41. package/dist/runtime/server/render/head.js +21 -4
  42. package/dist/runtime/server/render/index.d.ts +4 -7
  43. package/dist/runtime/server/render/index.js +13 -4
  44. package/dist/runtime/server/render/page.js +32 -6
  45. package/dist/runtime/server/render/stylesheet.d.ts +7 -0
  46. package/dist/runtime/server/render/stylesheet.js +30 -0
  47. package/dist/vite-plugin-astro/index.d.ts +3 -1
  48. package/dist/vite-plugin-astro/index.js +8 -2
  49. package/dist/vite-plugin-astro/metadata.d.ts +3 -0
  50. package/dist/vite-plugin-astro/metadata.js +10 -0
  51. package/dist/vite-plugin-astro/types.d.ts +2 -0
  52. package/dist/vite-plugin-head-propagation/index.d.ts +11 -0
  53. package/dist/vite-plugin-head-propagation/index.js +42 -0
  54. package/dist/vite-plugin-load-fallback/index.js +1 -1
  55. package/dist/vite-plugin-markdown/index.js +2 -1
  56. package/dist/vite-plugin-markdown-legacy/index.js +4 -2
  57. package/package.json +5 -5
  58. package/dist/runtime/server/render/astro.d.ts +0 -18
  59. package/dist/runtime/server/render/astro.js +0 -105
@@ -10,7 +10,7 @@ import type { SerializedSSRManifest } from '../core/app/types';
10
10
  import type { PageBuildData } from '../core/build/types';
11
11
  import type { AstroConfigSchema } from '../core/config';
12
12
  import type { AstroCookies } from '../core/cookies';
13
- import type { AstroComponentFactory } from '../runtime/server';
13
+ import type { AstroComponentFactory, AstroComponentInstance } from '../runtime/server';
14
14
  import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from './../core/constants.js';
15
15
  export type { MarkdownHeading, MarkdownMetadata, MarkdownRenderingResult, RehypePlugins, RemarkPlugins, ShikiConfig, } from '@astrojs/markdown-remark';
16
16
  export type { SSRManifest } from '../core/app/types';
@@ -392,6 +392,8 @@ export interface AstroUserConfig {
392
392
  * @description
393
393
  * The base path to deploy to. Astro will build your pages and assets using this path as the root. Currently, this has no effect during development.
394
394
  *
395
+ * You can access this value in your app via `import.meta.env.BASE_URL`.
396
+ *
395
397
  * ```js
396
398
  * {
397
399
  * base: '/docs'
@@ -1074,7 +1076,7 @@ interface AstroSharedContext<Props extends Record<string, any> = Record<string,
1074
1076
  /**
1075
1077
  * Redirect to another page (**SSR Only**).
1076
1078
  */
1077
- redirect(path: string, status?: 301 | 302 | 308): Response;
1079
+ redirect(path: string, status?: 301 | 302 | 303 | 307 | 308): Response;
1078
1080
  }
1079
1081
  export interface APIContext<Props extends Record<string, any> = Record<string, any>> extends AstroSharedContext<Props> {
1080
1082
  site: URL | undefined;
@@ -1265,10 +1267,24 @@ export interface SSRMetadata {
1265
1267
  hasDirectives: Set<string>;
1266
1268
  hasRenderedHead: boolean;
1267
1269
  }
1270
+ /**
1271
+ * A hint on whether the Astro runtime needs to wait on a component to render head
1272
+ * content. The meanings:
1273
+ *
1274
+ * - __none__ (default) The component does not propagation head content.
1275
+ * - __self__ The component appends head content.
1276
+ * - __in-tree__ Another component within this component's dependency tree appends head content.
1277
+ *
1278
+ * These are used within the runtime to know whether or not a component should be waited on.
1279
+ */
1280
+ export declare type PropagationHint = 'none' | 'self' | 'in-tree';
1268
1281
  export interface SSRResult {
1269
1282
  styles: Set<SSRElement>;
1270
1283
  scripts: Set<SSRElement>;
1271
1284
  links: Set<SSRElement>;
1285
+ propagation: Map<string, PropagationHint>;
1286
+ propagators: Map<AstroComponentFactory, AstroComponentInstance>;
1287
+ extraHead: Array<any>;
1272
1288
  cookies: AstroCookies | undefined;
1273
1289
  createAstro(Astro: AstroGlobalPartial, props: Record<string, any>, slots: Record<string, any> | null): AstroGlobal;
1274
1290
  resolve: (s: string) => Promise<string>;
@@ -165,7 +165,7 @@ _baseWithoutTrailingSlash = new WeakMap();
165
165
  _renderPage = new WeakSet();
166
166
  renderPage_fn = async function(request, routeData, mod, status = 200) {
167
167
  const url = new URL(request.url);
168
- const manifest = __privateGet(this, _manifest);
168
+ const pathname = "/" + this.removeBase(url.pathname);
169
169
  const info = __privateGet(this, _routeDataToRouteInfo).get(routeData);
170
170
  const links = createLinkStylesheetElementSet(info.links);
171
171
  let scripts = /* @__PURE__ */ new Set();
@@ -185,7 +185,7 @@ renderPage_fn = async function(request, routeData, mod, status = 200) {
185
185
  const ctx = createRenderContext({
186
186
  request,
187
187
  origin: url.origin,
188
- pathname: url.pathname,
188
+ pathname,
189
189
  scripts,
190
190
  links,
191
191
  route: routeData,
@@ -204,11 +204,12 @@ renderPage_fn = async function(request, routeData, mod, status = 200) {
204
204
  _callEndpoint = new WeakSet();
205
205
  callEndpoint_fn = async function(request, routeData, mod, status = 200) {
206
206
  const url = new URL(request.url);
207
+ const pathname = "/" + this.removeBase(url.pathname);
207
208
  const handler = mod;
208
209
  const ctx = createRenderContext({
209
210
  request,
210
211
  origin: url.origin,
211
- pathname: url.pathname,
212
+ pathname,
212
213
  route: routeData,
213
214
  status
214
215
  });
@@ -1,7 +1,7 @@
1
1
  import type { GetModuleInfo, ModuleInfo } from 'rollup';
2
2
  export declare function walkParentInfos(id: string, ctx: {
3
3
  getModuleInfo: GetModuleInfo;
4
- }, depth?: number, seen?: Set<string>, childId?: string): Generator<[ModuleInfo, number, number], void, unknown>;
4
+ }, depth?: number, order?: number, seen?: Set<string>, childId?: string): Generator<[ModuleInfo, number, number], void, unknown>;
5
5
  export declare function moduleIsTopLevelPage(info: ModuleInfo): boolean;
6
6
  export declare function getTopLevelPages(id: string, ctx: {
7
7
  getModuleInfo: GetModuleInfo;
@@ -1,9 +1,11 @@
1
1
  import { resolvedPagesVirtualModuleId } from "../app/index.js";
2
- function* walkParentInfos(id, ctx, depth = 0, seen = /* @__PURE__ */ new Set(), childId = "") {
2
+ function* walkParentInfos(id, ctx, depth = 0, order = 0, seen = /* @__PURE__ */ new Set(), childId = "") {
3
3
  seen.add(id);
4
4
  const info = ctx.getModuleInfo(id);
5
5
  if (info) {
6
- let order = childId ? info.importedIds.indexOf(childId) : 0;
6
+ if (childId) {
7
+ order += info.importedIds.indexOf(childId);
8
+ }
7
9
  yield [info, depth, order];
8
10
  }
9
11
  const importers = ((info == null ? void 0 : info.importers) || []).concat((info == null ? void 0 : info.dynamicImporters) || []);
@@ -11,7 +13,7 @@ function* walkParentInfos(id, ctx, depth = 0, seen = /* @__PURE__ */ new Set(),
11
13
  if (seen.has(imp)) {
12
14
  continue;
13
15
  }
14
- yield* walkParentInfos(imp, ctx, ++depth, seen, id);
16
+ yield* walkParentInfos(imp, ctx, ++depth, order, seen, id);
15
17
  }
16
18
  }
17
19
  function moduleIsTopLevelPage(info) {
@@ -117,7 +117,11 @@ function buildManifest(opts, internals, staticFiles) {
117
117
  );
118
118
  }
119
119
  if (settings.scripts.some((script) => script.stage === "page")) {
120
- scripts.push({ type: "external", value: entryModules[PAGE_SCRIPT_ID] });
120
+ const src = entryModules[PAGE_SCRIPT_ID];
121
+ scripts.push({
122
+ type: "external",
123
+ value: joinBase(src)
124
+ });
121
125
  }
122
126
  const links = sortedCSS(pageData).map((pth) => joinBase(pth));
123
127
  routes.push({
@@ -5,10 +5,11 @@ export interface CompileProps {
5
5
  astroConfig: AstroConfig;
6
6
  viteConfig: ResolvedConfig;
7
7
  filename: string;
8
+ id: string | undefined;
8
9
  source: string;
9
10
  }
10
11
  export interface CompileResult extends TransformResult {
11
12
  cssDeps: Set<string>;
12
13
  source: string;
13
14
  }
14
- export declare function compile({ astroConfig, viteConfig, filename, source, }: CompileProps): Promise<CompileResult>;
15
+ export declare function compile({ astroConfig, viteConfig, filename, id: moduleId, source, }: CompileProps): Promise<CompileResult>;
@@ -7,6 +7,7 @@ async function compile({
7
7
  astroConfig,
8
8
  viteConfig,
9
9
  filename,
10
+ id: moduleId,
10
11
  source
11
12
  }) {
12
13
  var _a;
@@ -15,6 +16,7 @@ async function compile({
15
16
  let transformResult;
16
17
  try {
17
18
  transformResult = await transform(source, {
19
+ moduleId,
18
20
  pathname: filename,
19
21
  projectRoot: astroConfig.root.toString(),
20
22
  site: (_a = astroConfig.site) == null ? void 0 : _a.toString(),
@@ -1,4 +1,4 @@
1
- const ASTRO_VERSION = "1.6.13";
1
+ const ASTRO_VERSION = "1.6.15";
2
2
  const SUPPORTED_MARKDOWN_FILE_EXTENSIONS = [
3
3
  ".markdown",
4
4
  ".mdown",
@@ -7,6 +7,7 @@ import { vitePluginAstroServer } from "../vite-plugin-astro-server/index.js";
7
7
  import astroVitePlugin from "../vite-plugin-astro/index.js";
8
8
  import configAliasVitePlugin from "../vite-plugin-config-alias/index.js";
9
9
  import envVitePlugin from "../vite-plugin-env/index.js";
10
+ import astroHeadPropagationPlugin from "../vite-plugin-head-propagation/index.js";
10
11
  import htmlVitePlugin from "../vite-plugin-html/index.js";
11
12
  import astroIntegrationsContainerPlugin from "../vite-plugin-integrations-container/index.js";
12
13
  import jsxVitePlugin from "../vite-plugin-jsx/index.js";
@@ -59,7 +60,7 @@ async function createVite(commandConfig, { settings, logging, mode, fs = nodeFs
59
60
  appType: "custom",
60
61
  optimizeDeps: {
61
62
  entries: ["src/**/*"],
62
- exclude: ["node-fetch"]
63
+ exclude: ["astro", "node-fetch"]
63
64
  },
64
65
  plugins: [
65
66
  configAliasVitePlugin({ settings }),
@@ -73,7 +74,8 @@ async function createVite(commandConfig, { settings, logging, mode, fs = nodeFs
73
74
  jsxVitePlugin({ settings, logging }),
74
75
  astroPostprocessVitePlugin({ settings }),
75
76
  astroIntegrationsContainerPlugin({ settings, logging }),
76
- astroScriptsPageSSRPlugin({ settings })
77
+ astroScriptsPageSSRPlugin({ settings }),
78
+ astroHeadPropagationPlugin({ settings })
77
79
  ],
78
80
  publicDir: fileURLToPath(settings.config.publicDir),
79
81
  root: fileURLToPath(settings.config.root),
@@ -30,7 +30,7 @@ async function dev(settings, options) {
30
30
  isRestart: options.isRestart
31
31
  })
32
32
  );
33
- const currentVersion = "1.6.13";
33
+ const currentVersion = "1.6.15";
34
34
  if (currentVersion.includes("-")) {
35
35
  warn(options.logging, null, msg.prerelease({ currentVersion }));
36
36
  }
@@ -10,7 +10,7 @@ const incompatiblePackages = {
10
10
  };
11
11
  const incompatPackageExp = new RegExp(`(${Object.keys(incompatiblePackages).join("|")})`);
12
12
  function collectErrorMetadata(e, rootFolder) {
13
- const err = AggregateError.is(e) ? e.errors : [e];
13
+ const err = AggregateError.is(e) || Array.isArray(e.errors) ? e.errors : [e];
14
14
  err.forEach((error) => {
15
15
  var _a;
16
16
  if (error.stack) {
@@ -47,7 +47,7 @@ function serverStart({
47
47
  site,
48
48
  isRestart = false
49
49
  }) {
50
- const version = "1.6.13";
50
+ const version = "1.6.15";
51
51
  const rootPath = site ? site.pathname : "/";
52
52
  const localPrefix = `${dim("\u2503")} Local `;
53
53
  const networkPrefix = `${dim("\u2503")} Network `;
@@ -263,7 +263,7 @@ function printHelp({
263
263
  message.push(
264
264
  linebreak(),
265
265
  ` ${bgGreen(black(` ${commandName} `))} ${green(
266
- `v${"1.6.13"}`
266
+ `v${"1.6.15"}`
267
267
  )} ${headline}`
268
268
  );
269
269
  }
@@ -1,4 +1,4 @@
1
- import type { RouteData, SSRElement } from '../../@types/astro';
1
+ import type { RouteData, SSRElement, SSRResult } from '../../@types/astro';
2
2
  /**
3
3
  * The RenderContext represents the parts of rendering that are specific to one request.
4
4
  */
@@ -10,6 +10,7 @@ export interface RenderContext {
10
10
  scripts?: Set<SSRElement>;
11
11
  links?: Set<SSRElement>;
12
12
  styles?: Set<SSRElement>;
13
+ propagation?: SSRResult['propagation'];
13
14
  route?: RouteData;
14
15
  status?: number;
15
16
  }
@@ -66,6 +66,7 @@ async function renderPage(mod, ctx, env) {
66
66
  params,
67
67
  props: pageProps,
68
68
  pathname: ctx.pathname,
69
+ propagation: ctx.propagation,
69
70
  resolve: env.resolve,
70
71
  renderers: env.renderers,
71
72
  request: ctx.request,
@@ -0,0 +1,3 @@
1
+ import type { SSRResult } from '../../../@types/astro';
2
+ import type { ModuleLoader } from '../../module-loader/index';
3
+ export declare function getPropagationMap(filePath: URL, loader: ModuleLoader): Promise<SSRResult['propagation']>;
@@ -0,0 +1,26 @@
1
+ import { getAstroMetadata } from "../../../vite-plugin-astro/index.js";
2
+ import { viteID } from "../../util.js";
3
+ import { crawlGraph } from "./vite.js";
4
+ async function getPropagationMap(filePath, loader) {
5
+ const map = /* @__PURE__ */ new Map();
6
+ const rootID = viteID(filePath);
7
+ addInjection(map, loader.getModuleInfo(rootID));
8
+ for await (const moduleNode of crawlGraph(loader, rootID, true)) {
9
+ const id = moduleNode.id;
10
+ if (id) {
11
+ addInjection(map, loader.getModuleInfo(id));
12
+ }
13
+ }
14
+ return map;
15
+ }
16
+ function addInjection(map, modInfo) {
17
+ if (modInfo) {
18
+ const astro = getAstroMetadata(modInfo);
19
+ if (astro && astro.propagation) {
20
+ map.set(modInfo.id, astro.propagation);
21
+ }
22
+ }
23
+ }
24
+ export {
25
+ getPropagationMap
26
+ };
@@ -1,32 +1,8 @@
1
- import type { AstroSettings, ComponentInstance, RouteData, RuntimeMode, SSRLoadedRenderer } from '../../../@types/astro';
2
- import { LogOptions } from '../../logger/core.js';
1
+ import type { AstroSettings, ComponentInstance, RouteData, SSRLoadedRenderer } from '../../../@types/astro';
3
2
  import type { ModuleLoader } from '../../module-loader/index';
4
- import { RouteCache } from '../route-cache.js';
5
3
  import type { DevelopmentEnvironment } from './environment';
6
4
  export { createDevelopmentEnvironment } from './environment.js';
7
5
  export type { DevelopmentEnvironment };
8
- export interface SSROptionsOld {
9
- /** an instance of the AstroSettings */
10
- settings: AstroSettings;
11
- /** location of file on disk */
12
- filePath: URL;
13
- /** logging options */
14
- logging: LogOptions;
15
- /** "development" or "production" */
16
- mode: RuntimeMode;
17
- /** production website */
18
- origin: string;
19
- /** the web request (needed for dynamic routes) */
20
- pathname: string;
21
- /** optional, in case we need to render something outside of a dev server */
22
- route?: RouteData;
23
- /** pass in route cache because SSR can’t manage cache-busting */
24
- routeCache: RouteCache;
25
- /** Module loader (Vite) */
26
- loader: ModuleLoader;
27
- /** Request */
28
- request: Request;
29
- }
30
6
  export interface SSROptions {
31
7
  /** The environment instance */
32
8
  env: DevelopmentEnvironment;
@@ -6,6 +6,7 @@ import { isPage, resolveIdToUrl } from "../../util.js";
6
6
  import { createRenderContext, renderPage as coreRenderPage } from "../index.js";
7
7
  import { filterFoundRenderers, loadRenderer } from "../renderer.js";
8
8
  import { getStylesForURL } from "./css.js";
9
+ import { getPropagationMap } from "./head.js";
9
10
  import { getScriptsForURL } from "./scripts.js";
10
11
  import { createDevelopmentEnvironment } from "./environment.js";
11
12
  async function loadRenderers(moduleLoader, settings) {
@@ -81,12 +82,13 @@ async function getScriptsAndStyles({ env, filePath }) {
81
82
  children: content
82
83
  });
83
84
  });
84
- return { scripts, styles, links };
85
+ const propagationMap = await getPropagationMap(filePath, env.loader);
86
+ return { scripts, styles, links, propagationMap };
85
87
  }
86
88
  async function renderPage(options) {
87
89
  const [renderers, mod] = options.preload;
88
90
  options.env.renderers = renderers;
89
- const { scripts, links, styles } = await getScriptsAndStyles({
91
+ const { scripts, links, styles, propagationMap } = await getScriptsAndStyles({
90
92
  env: options.env,
91
93
  filePath: options.filePath
92
94
  });
@@ -97,6 +99,7 @@ async function renderPage(options) {
97
99
  scripts,
98
100
  links,
99
101
  styles,
102
+ propagation: propagationMap,
100
103
  route: options.route
101
104
  });
102
105
  return await coreRenderPage(mod, ctx, options.env);
@@ -17,6 +17,7 @@ export interface CreateResultArgs {
17
17
  links?: Set<SSRElement>;
18
18
  scripts?: Set<SSRElement>;
19
19
  styles?: Set<SSRElement>;
20
+ propagation?: SSRResult['propagation'];
20
21
  request: Request;
21
22
  status: number;
22
23
  }
@@ -16,7 +16,7 @@ var __privateSet = (obj, member, value, setter) => {
16
16
  setter ? setter.call(obj, value) : member.set(obj, value);
17
17
  return value;
18
18
  };
19
- var _cache, _result, _slots, _loggingOpts;
19
+ var _result, _slots, _loggingOpts;
20
20
  import { bold } from "kleur/colors";
21
21
  import { renderSlot, stringifyChunk } from "../../runtime/server/index.js";
22
22
  import { renderJSX } from "../../runtime/server/jsx.js";
@@ -44,7 +44,6 @@ function getFunctionExpression(slot) {
44
44
  }
45
45
  class Slots {
46
46
  constructor(result, slots, logging) {
47
- __privateAdd(this, _cache, /* @__PURE__ */ new Map());
48
47
  __privateAdd(this, _result, void 0);
49
48
  __privateAdd(this, _slots, void 0);
50
49
  __privateAdd(this, _loggingOpts, void 0);
@@ -74,46 +73,34 @@ class Slots {
74
73
  return Boolean(__privateGet(this, _slots)[name]);
75
74
  }
76
75
  async render(name, args = []) {
77
- const cacheable = args.length === 0;
78
- if (!__privateGet(this, _slots))
79
- return void 0;
80
- if (cacheable && __privateGet(this, _cache).has(name)) {
81
- const result = __privateGet(this, _cache).get(name);
82
- return result;
83
- }
84
- if (!this.has(name))
85
- return void 0;
86
- if (!cacheable) {
76
+ if (!__privateGet(this, _slots) || !this.has(name))
77
+ return;
78
+ if (!Array.isArray(args)) {
79
+ warn(
80
+ __privateGet(this, _loggingOpts),
81
+ "Astro.slots.render",
82
+ `Expected second parameter to be an array, received a ${typeof args}. If you're trying to pass an array as a single argument and getting unexpected results, make sure you're passing your array as a item of an array. Ex: Astro.slots.render('default', [["Hello", "World"]])`
83
+ );
84
+ } else if (args.length > 0) {
87
85
  const component = await __privateGet(this, _slots)[name]();
88
- if (!Array.isArray(args)) {
89
- warn(
90
- __privateGet(this, _loggingOpts),
91
- "Astro.slots.render",
92
- `Expected second parameter to be an array, received a ${typeof args}. If you're trying to pass an array as a single argument and getting unexpected results, make sure you're passing your array as a item of an array. Ex: Astro.slots.render('default', [["Hello", "World"]])`
86
+ const expression = getFunctionExpression(component);
87
+ if (expression) {
88
+ const slot = expression(...args);
89
+ return await renderSlot(__privateGet(this, _result), slot).then(
90
+ (res) => res != null ? String(res) : res
91
+ );
92
+ }
93
+ if (typeof component === "function") {
94
+ return await renderJSX(__privateGet(this, _result), component(...args)).then(
95
+ (res) => res != null ? String(res) : res
93
96
  );
94
- } else {
95
- const expression = getFunctionExpression(component);
96
- if (expression) {
97
- const slot = expression(...args);
98
- return await renderSlot(__privateGet(this, _result), slot).then(
99
- (res) => res != null ? String(res) : res
100
- );
101
- }
102
- if (typeof component === "function") {
103
- return await renderJSX(__privateGet(this, _result), component(...args)).then(
104
- (res) => res != null ? String(res) : res
105
- );
106
- }
107
97
  }
108
98
  }
109
99
  const content = await renderSlot(__privateGet(this, _result), __privateGet(this, _slots)[name]);
110
100
  const outHTML = stringifyChunk(__privateGet(this, _result), content);
111
- if (cacheable)
112
- __privateGet(this, _cache).set(name, outHTML);
113
101
  return outHTML;
114
102
  }
115
103
  }
116
- _cache = new WeakMap();
117
104
  _result = new WeakMap();
118
105
  _slots = new WeakMap();
119
106
  _loggingOpts = new WeakMap();
@@ -138,6 +125,9 @@ function createResult(args) {
138
125
  styles: args.styles ?? /* @__PURE__ */ new Set(),
139
126
  scripts: args.scripts ?? /* @__PURE__ */ new Set(),
140
127
  links: args.links ?? /* @__PURE__ */ new Set(),
128
+ propagation: args.propagation ?? /* @__PURE__ */ new Map(),
129
+ propagators: /* @__PURE__ */ new Map(),
130
+ extraHead: [],
141
131
  cookies,
142
132
  createAstro(astroGlobal, props, slots) {
143
133
  const astroSlots = new Slots(result, slots, args.logging);
package/dist/jsx/babel.js CHANGED
@@ -122,7 +122,8 @@ function astroJSX() {
122
122
  state.file.metadata.astro = {
123
123
  clientOnlyComponents: [],
124
124
  hydratedComponents: [],
125
- scripts: []
125
+ scripts: [],
126
+ propagation: "none"
126
127
  };
127
128
  }
128
129
  path.node.body.splice(
@@ -0,0 +1,2 @@
1
+ import type { AstroComponentFactory } from './render/index.js';
2
+ export declare function createComponent(arg1: AstroComponentFactory, moduleId: string): AstroComponentFactory;
@@ -0,0 +1,20 @@
1
+ function baseCreateComponent(cb, moduleId) {
2
+ cb.isAstroComponentFactory = true;
3
+ cb.moduleId = moduleId;
4
+ return cb;
5
+ }
6
+ function createComponentWithOptions(opts) {
7
+ const cb = baseCreateComponent(opts.factory, opts.moduleId);
8
+ cb.propagation = opts.propagation;
9
+ return cb;
10
+ }
11
+ function createComponent(arg1, moduleId) {
12
+ if (typeof arg1 === "function") {
13
+ return baseCreateComponent(arg1, moduleId);
14
+ } else {
15
+ return createComponentWithOptions(arg1);
16
+ }
17
+ }
18
+ export {
19
+ createComponent
20
+ };
@@ -1,11 +1,10 @@
1
+ export { createComponent } from './astro-component.js';
1
2
  export { createAstro } from './astro-global.js';
2
3
  export { renderEndpoint } from './endpoint.js';
3
4
  export { escapeHTML, HTMLBytes, HTMLString, markHTMLString, unescapeHTML } from './escape.js';
4
5
  export { renderJSX } from './jsx.js';
5
- 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';
6
- export type { AstroComponentFactory, RenderInstruction } from './render/index.js';
7
- import type { AstroComponentFactory } from './render/index.js';
8
- export declare function createComponent(cb: AstroComponentFactory): AstroComponentFactory;
6
+ export { addAttribute, createHeadAndContent, defineScriptVars, Fragment, maybeRenderHead, renderAstroTemplateResult as renderAstroComponent, renderComponent, renderComponentToIterable, Renderer as Renderer, renderHead, renderHTMLElement, renderPage, renderSlot, renderTemplate as render, renderTemplate, renderToString, renderUniqueStylesheet, stringifyChunk, voidElementNames, } from './render/index.js';
7
+ export type { AstroComponentFactory, AstroComponentInstance, RenderInstruction, } from './render/index.js';
9
8
  export declare function mergeSlots(...slotted: unknown[]): Record<string, () => any>;
10
9
  /** @internal Assosciate JSX components with a specific renderer (see /src/vite-plugin-jsx/tag.ts) */
11
10
  export declare function __astro_tag_component__(Component: unknown, rendererName: string): void;
@@ -1,14 +1,17 @@
1
+ import { createComponent } from "./astro-component.js";
1
2
  import { createAstro } from "./astro-global.js";
2
3
  import { renderEndpoint } from "./endpoint.js";
3
4
  import { escapeHTML, HTMLBytes, HTMLString, markHTMLString, unescapeHTML } from "./escape.js";
4
5
  import { renderJSX } from "./jsx.js";
5
6
  import {
6
7
  addAttribute,
8
+ createHeadAndContent,
7
9
  defineScriptVars,
8
10
  Fragment,
9
11
  maybeRenderHead,
10
- renderAstroComponent,
12
+ renderAstroTemplateResult,
11
13
  renderComponent,
14
+ renderComponentToIterable,
12
15
  Renderer,
13
16
  renderHead,
14
17
  renderHTMLElement,
@@ -17,16 +20,12 @@ import {
17
20
  renderTemplate,
18
21
  renderTemplate as renderTemplate2,
19
22
  renderToString,
23
+ renderUniqueStylesheet,
20
24
  stringifyChunk,
21
25
  voidElementNames
22
26
  } from "./render/index.js";
23
27
  import { markHTMLString as markHTMLString2 } from "./escape.js";
24
- import { Renderer as Renderer2 } from "./render/index.js";
25
- import { addAttribute as addAttribute2 } from "./render/index.js";
26
- function createComponent(cb) {
27
- cb.isAstroComponentFactory = true;
28
- return cb;
29
- }
28
+ import { addAttribute as addAttribute2, Renderer as Renderer2 } from "./render/index.js";
30
29
  function mergeSlots(...slotted) {
31
30
  const slots = {};
32
31
  for (const slot of slotted) {
@@ -88,6 +87,7 @@ export {
88
87
  addAttribute,
89
88
  createAstro,
90
89
  createComponent,
90
+ createHeadAndContent,
91
91
  defineScriptVars,
92
92
  defineStyleVars,
93
93
  escapeHTML,
@@ -95,8 +95,9 @@ export {
95
95
  maybeRenderHead,
96
96
  mergeSlots,
97
97
  renderTemplate as render,
98
- renderAstroComponent,
98
+ renderAstroTemplateResult as renderAstroComponent,
99
99
  renderComponent,
100
+ renderComponentToIterable,
100
101
  renderEndpoint,
101
102
  renderHTMLElement,
102
103
  renderHead,
@@ -105,6 +106,7 @@ export {
105
106
  renderSlot,
106
107
  renderTemplate2 as renderTemplate,
107
108
  renderToString,
109
+ renderUniqueStylesheet,
108
110
  spreadAttributes,
109
111
  stringifyChunk,
110
112
  unescapeHTML,
@@ -3,7 +3,7 @@ import {
3
3
  escapeHTML,
4
4
  HTMLString,
5
5
  markHTMLString,
6
- renderComponent,
6
+ renderComponentToIterable,
7
7
  renderToString,
8
8
  spreadAttributes,
9
9
  voidElementNames
@@ -159,7 +159,7 @@ Did you forget to import the component or is it possible there is a typo?`);
159
159
  props[Skip.symbol] = skip;
160
160
  let output;
161
161
  if (vnode.type === ClientOnlyPlaceholder && vnode.props["client:only"]) {
162
- output = await renderComponent(
162
+ output = await renderComponentToIterable(
163
163
  result,
164
164
  vnode.props["client:display-name"] ?? "",
165
165
  null,
@@ -167,7 +167,7 @@ Did you forget to import the component or is it possible there is a typo?`);
167
167
  slots
168
168
  );
169
169
  } else {
170
- output = await renderComponent(
170
+ output = await renderComponentToIterable(
171
171
  result,
172
172
  typeof vnode.type === "function" ? vnode.type.name : vnode.type,
173
173
  vnode.type,
@@ -1,5 +1,9 @@
1
1
  import { escapeHTML, isHTMLString, markHTMLString } from "../escape.js";
2
- import { AstroComponent, renderAstroComponent } from "./astro.js";
2
+ import {
3
+ isAstroComponentInstance,
4
+ isRenderTemplateResult,
5
+ renderAstroTemplateResult
6
+ } from "./astro/index.js";
3
7
  import { SlotString } from "./slot.js";
4
8
  async function* renderChild(child) {
5
9
  child = await child;
@@ -19,8 +23,10 @@ async function* renderChild(child) {
19
23
  } else if (typeof child === "string") {
20
24
  yield markHTMLString(escapeHTML(child));
21
25
  } else if (!child && child !== 0) {
22
- } else if (child instanceof AstroComponent || Object.prototype.toString.call(child) === "[object AstroComponent]") {
23
- yield* renderAstroComponent(child);
26
+ } else if (isRenderTemplateResult(child)) {
27
+ yield* renderAstroTemplateResult(child);
28
+ } else if (isAstroComponentInstance(child)) {
29
+ yield* child.render();
24
30
  } else if (ArrayBuffer.isView(child)) {
25
31
  yield child;
26
32
  } else if (typeof child === "object" && (Symbol.asyncIterator in child || Symbol.iterator in child)) {
@@ -0,0 +1,13 @@
1
+ import type { PropagationHint, SSRResult } from '../../../../@types/astro';
2
+ import type { HeadAndContent } from './head-and-content';
3
+ import type { RenderTemplateResult } from './render-template';
4
+ export declare type AstroFactoryReturnValue = RenderTemplateResult | Response | HeadAndContent;
5
+ export interface AstroComponentFactory {
6
+ (result: any, props: any, slots: any): AstroFactoryReturnValue;
7
+ isAstroComponentFactory?: boolean;
8
+ moduleId: string | undefined;
9
+ propagation?: PropagationHint;
10
+ }
11
+ export declare function isAstroComponentFactory(obj: any): obj is AstroComponentFactory;
12
+ export declare function renderToString(result: SSRResult, componentFactory: AstroComponentFactory, props: any, children: any): Promise<string>;
13
+ export declare function isAPropagatingComponent(result: SSRResult, factory: AstroComponentFactory): boolean;