astro 2.10.11 → 2.10.13

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.
package/client-base.d.ts CHANGED
@@ -53,6 +53,7 @@ declare module 'astro:assets' {
53
53
  | import('./dist/assets/types.js').UnresolvedImageTransform
54
54
  ) => Promise<import('./dist/assets/types.js').GetImageResult>;
55
55
  getConfiguredImageService: typeof import('./dist/assets/index.js').getConfiguredImageService;
56
+ imageConfig: import('./dist/@types/astro').AstroConfig['image'];
56
57
  Image: typeof import('./components/Image.astro').default;
57
58
  };
58
59
 
@@ -69,7 +70,7 @@ declare module 'astro:assets' {
69
70
  export type RemoteImageProps = Simplify<
70
71
  import('./dist/assets/types.js').RemoteImageProps<ImgAttributes>
71
72
  >;
72
- export const { getImage, getConfiguredImageService, Image }: AstroAssets;
73
+ export const { getImage, getConfiguredImageService, imageConfig, Image }: AstroAssets;
73
74
  }
74
75
 
75
76
  declare module 'astro:transitions' {
@@ -20,22 +20,21 @@ const { fallback = 'animate' } = Astro.props as Props;
20
20
  type Events = 'astro:load' | 'astro:beforeload';
21
21
 
22
22
  const persistState = (state: State) => history.replaceState(state, '');
23
+ const supportsViewTransitions = !!document.startViewTransition;
24
+ const transitionEnabledOnThisPage = () =>
25
+ !!document.querySelector('[name="astro-view-transitions-enabled"]');
26
+ const triggerEvent = (name: Events) => document.dispatchEvent(new Event(name));
27
+ const onload = () => triggerEvent('astro:load');
28
+ const PERSIST_ATTR = 'data-astro-transition-persist';
23
29
 
24
30
  // The History API does not tell you if navigation is forward or back, so
25
31
  // you can figure it using an index. On pushState the index is incremented so you
26
32
  // can use that to determine popstate if going forward or back.
27
33
  let currentHistoryIndex = history.state?.index || 0;
28
- if (!history.state) {
34
+ if (!history.state && transitionEnabledOnThisPage()) {
29
35
  persistState({ index: currentHistoryIndex, scrollY: 0 });
30
36
  }
31
37
 
32
- const supportsViewTransitions = !!document.startViewTransition;
33
- const transitionEnabledOnThisPage = () =>
34
- !!document.querySelector('[name="astro-view-transitions-enabled"]');
35
- const triggerEvent = (name: Events) => document.dispatchEvent(new Event(name));
36
- const onload = () => triggerEvent('astro:load');
37
- const PERSIST_ATTR = 'data-astro-transition-persist';
38
-
39
38
  const throttle = (cb: (...args: any[]) => any, delay: number) => {
40
39
  let wait = false;
41
40
  // During the waiting time additional events are lost.
@@ -165,14 +164,21 @@ const { fallback = 'animate' } = Astro.props as Props;
165
164
  }
166
165
  }
167
166
 
167
+ // Simulate scroll behavior of Safari and
168
+ // Chromium based browsers (Chrome, Edge, Opera, ...)
169
+ scrollTo({ left: 0, top: 0, behavior: 'instant' });
170
+
168
171
  if (state?.scrollY === 0 && location.hash) {
169
172
  const id = decodeURIComponent(location.hash.slice(1));
170
- state.scrollY = document.getElementById(id)?.offsetTop || 0;
171
- }
172
- if (state?.scrollY != null) {
173
- scrollTo(0, state.scrollY);
174
- // Overwrite erroneous updates by the scroll handler during transition
175
- persistState(state);
173
+ const elem = document.getElementById(id);
174
+ // prefer scrollIntoView() over scrollTo() because it takes scroll-padding into account
175
+ if (elem) {
176
+ state.scrollY = elem.offsetTop;
177
+ persistState(state); // first guess, later updated by scroll handler
178
+ elem.scrollIntoView(); // for Firefox, this should better be {behavior: 'instant'}
179
+ }
180
+ } else if (state && state.scrollY !== 0) {
181
+ scrollTo(0, state.scrollY); // usings default scrollBehavior
176
182
  }
177
183
 
178
184
  triggerEvent('astro:beforeload');
@@ -274,34 +280,59 @@ const { fallback = 'animate' } = Astro.props as Props;
274
280
  // that is going to another page within the same origin. Basically it determines
275
281
  // same-origin navigation, but omits special key combos for new tabs, etc.
276
282
  if (
277
- link &&
278
- link instanceof HTMLAnchorElement &&
279
- link.href &&
280
- (!link.target || link.target === '_self') &&
281
- link.origin === location.origin &&
282
- !(
283
- // Same page means same path and same query params
284
- (location.pathname === link.pathname && location.search === link.search)
285
- ) &&
286
- ev.button === 0 && // left clicks only
287
- !ev.metaKey && // new tab (mac)
288
- !ev.ctrlKey && // new tab (windows)
289
- !ev.altKey && // download
290
- !ev.shiftKey &&
291
- !ev.defaultPrevented &&
292
- transitionEnabledOnThisPage()
293
- ) {
294
- ev.preventDefault();
295
- navigate('forward', link.href, { index: ++currentHistoryIndex, scrollY: 0 });
296
- const newState: State = { index: currentHistoryIndex, scrollY };
297
- persistState({ index: currentHistoryIndex - 1, scrollY });
298
- history.pushState(newState, '', link.href);
283
+ !link ||
284
+ !(link instanceof HTMLAnchorElement) ||
285
+ !link.href ||
286
+ (link.target && link.target !== '_self') ||
287
+ link.origin !== location.origin ||
288
+ ev.button !== 0 || // left clicks only
289
+ ev.metaKey || // new tab (mac)
290
+ ev.ctrlKey || // new tab (windows)
291
+ ev.altKey || // download
292
+ ev.shiftKey || // new window
293
+ ev.defaultPrevented ||
294
+ !transitionEnabledOnThisPage()
295
+ )
296
+ // No page transitions in these cases,
297
+ // Let the browser standard action handle this
298
+ return;
299
+
300
+ // We do not need to handle same page links because there are no page transitions
301
+ // Same page means same path and same query params (but different hash)
302
+ if (location.pathname === link.pathname && location.search === link.search) {
303
+ if (link.hash) {
304
+ // The browser default action will handle navigations with hash fragments
305
+ return;
306
+ } else {
307
+ // Special case: self link without hash
308
+ // If handed to the browser it will reload the page
309
+ // But we want to handle it like any other same page navigation
310
+ // So we scroll to the top of the page but do not start page transitions
311
+ ev.preventDefault();
312
+ persistState({ ...history.state, scrollY });
313
+ scrollTo({ left: 0, top: 0, behavior: 'instant' });
314
+ if (location.hash) {
315
+ // last target was different
316
+ const newState: State = { index: ++currentHistoryIndex, scrollY: 0 };
317
+ history.pushState(newState, '', link.href);
318
+ }
319
+ return;
320
+ }
299
321
  }
322
+
323
+ // these are the cases we will handle: same origin, different page
324
+ ev.preventDefault();
325
+ navigate('forward', link.href, { index: ++currentHistoryIndex, scrollY: 0 });
326
+ const newState: State = { index: currentHistoryIndex, scrollY };
327
+ persistState({ index: currentHistoryIndex - 1, scrollY });
328
+ history.pushState(newState, '', link.href);
300
329
  });
330
+
301
331
  addEventListener('popstate', (ev) => {
302
- if (!transitionEnabledOnThisPage()) {
332
+ if (!transitionEnabledOnThisPage() && ev.state) {
303
333
  // The current page doesn't haven't View Transitions,
304
334
  // respect that with a full page reload
335
+ // -- but only for transition managed by us (ev.state is set)
305
336
  location.reload();
306
337
  return;
307
338
  }
@@ -53,12 +53,9 @@ declare module 'astro:content' {
53
53
 
54
54
  type BaseSchemaWithoutEffects =
55
55
  | import('astro/zod').AnyZodObject
56
- | import('astro/zod').ZodUnion<import('astro/zod').AnyZodObject[]>
56
+ | import('astro/zod').ZodUnion<[BaseSchemaWithoutEffects, ...BaseSchemaWithoutEffects[]]>
57
57
  | import('astro/zod').ZodDiscriminatedUnion<string, import('astro/zod').AnyZodObject[]>
58
- | import('astro/zod').ZodIntersection<
59
- import('astro/zod').AnyZodObject,
60
- import('astro/zod').AnyZodObject
61
- >;
58
+ | import('astro/zod').ZodIntersection<BaseSchemaWithoutEffects, BaseSchemaWithoutEffects>;
62
59
 
63
60
  type BaseSchema =
64
61
  | BaseSchemaWithoutEffects
@@ -142,7 +142,10 @@ function getDataEntryId({
142
142
  collection
143
143
  }) {
144
144
  const relativePath = getRelativeEntryPath(entry, collection, contentDir);
145
- const withoutFileExt = relativePath.replace(new RegExp(path.extname(relativePath) + "$"), "");
145
+ const withoutFileExt = normalizePath(relativePath).replace(
146
+ new RegExp(path.extname(relativePath) + "$"),
147
+ ""
148
+ );
146
149
  return withoutFileExt;
147
150
  }
148
151
  function getContentEntryIdAndSlug({
@@ -375,7 +375,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
375
375
  legacy?: {} | undefined;
376
376
  }>;
377
377
  export type AstroConfigType = z.infer<typeof AstroConfigSchema>;
378
- export declare function createRelativeSchema(cmd: string, fileProtocolRoot: string): z.ZodEffects<z.ZodObject<{
378
+ export declare function createRelativeSchema(cmd: string, fileProtocolRoot: string): z.ZodEffects<z.ZodEffects<z.ZodObject<{
379
379
  output: z.ZodDefault<z.ZodOptional<z.ZodUnion<[z.ZodLiteral<"static">, z.ZodLiteral<"server">, z.ZodLiteral<"hybrid">]>>>;
380
380
  redirects: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodObject<{
381
381
  status: z.ZodUnion<[z.ZodLiteral<300>, z.ZodLiteral<301>, z.ZodLiteral<302>, z.ZodLiteral<303>, z.ZodLiteral<304>, z.ZodLiteral<307>, z.ZodLiteral<308>]>;
@@ -893,4 +893,149 @@ export declare function createRelativeSchema(cmd: string, fileProtocolRoot: stri
893
893
  optimizeHoistedScript?: boolean | undefined;
894
894
  } | undefined;
895
895
  legacy?: {} | undefined;
896
+ }>, {
897
+ site?: string | undefined;
898
+ adapter?: {
899
+ name: string;
900
+ hooks: {};
901
+ } | undefined;
902
+ output: "server" | "static" | "hybrid";
903
+ server: {
904
+ headers?: OutgoingHttpHeaders | undefined;
905
+ host: string | boolean;
906
+ port: number;
907
+ open: boolean;
908
+ streaming: boolean;
909
+ };
910
+ redirects: Record<string, string | {
911
+ status: 300 | 301 | 302 | 303 | 304 | 307 | 308;
912
+ destination: string;
913
+ }>;
914
+ root: import("url").URL;
915
+ srcDir: import("url").URL;
916
+ publicDir: import("url").URL;
917
+ outDir: import("url").URL;
918
+ cacheDir: import("url").URL;
919
+ compressHTML: boolean;
920
+ base: string;
921
+ trailingSlash: "ignore" | "always" | "never";
922
+ scopedStyleStrategy: "where" | "class";
923
+ integrations: {
924
+ name: string;
925
+ hooks: {};
926
+ }[];
927
+ build: {
928
+ assetsPrefix?: string | undefined;
929
+ format: "file" | "directory";
930
+ client: import("url").URL;
931
+ server: import("url").URL;
932
+ assets: string;
933
+ serverEntry: string;
934
+ redirects: boolean;
935
+ inlineStylesheets: "always" | "never" | "auto";
936
+ split: boolean;
937
+ excludeMiddleware: boolean;
938
+ };
939
+ image: {
940
+ service: {
941
+ entrypoint: string;
942
+ config: Record<string, any>;
943
+ };
944
+ domains: string[];
945
+ remotePatterns: {
946
+ port?: string | undefined;
947
+ protocol?: string | undefined;
948
+ hostname?: string | undefined;
949
+ pathname?: string | undefined;
950
+ }[];
951
+ };
952
+ markdown: {
953
+ drafts: boolean;
954
+ syntaxHighlight: false | "shiki" | "prism";
955
+ shikiConfig: {
956
+ langs: ILanguageRegistration[];
957
+ theme: string | import("shiki").IShikiTheme;
958
+ wrap: boolean | null;
959
+ };
960
+ remarkPlugins: (string | [string, any] | RemarkPlugin | [RemarkPlugin, any])[];
961
+ rehypePlugins: (string | [string, any] | RehypePlugin | [RehypePlugin, any])[];
962
+ remarkRehype: RemarkRehype;
963
+ gfm: boolean;
964
+ smartypants: boolean;
965
+ };
966
+ vite: ViteUserConfig;
967
+ experimental: {
968
+ assets: boolean;
969
+ viewTransitions: boolean;
970
+ optimizeHoistedScript: boolean;
971
+ };
972
+ legacy: {};
973
+ }, {
974
+ output?: "server" | "static" | "hybrid" | undefined;
975
+ server?: unknown;
976
+ redirects?: Record<string, string | {
977
+ status: 300 | 301 | 302 | 303 | 304 | 307 | 308;
978
+ destination: string;
979
+ }> | undefined;
980
+ root?: string | undefined;
981
+ srcDir?: string | undefined;
982
+ publicDir?: string | undefined;
983
+ outDir?: string | undefined;
984
+ cacheDir?: string | undefined;
985
+ site?: string | undefined;
986
+ compressHTML?: boolean | undefined;
987
+ base?: string | undefined;
988
+ trailingSlash?: "ignore" | "always" | "never" | undefined;
989
+ scopedStyleStrategy?: "where" | "class" | undefined;
990
+ adapter?: {
991
+ hooks?: {} | undefined;
992
+ name: string;
993
+ } | undefined;
994
+ integrations?: unknown;
995
+ build?: {
996
+ format?: "file" | "directory" | undefined;
997
+ client?: string | undefined;
998
+ server?: string | undefined;
999
+ assets?: string | undefined;
1000
+ serverEntry?: string | undefined;
1001
+ redirects?: boolean | undefined;
1002
+ inlineStylesheets?: "always" | "never" | "auto" | undefined;
1003
+ split?: boolean | undefined;
1004
+ excludeMiddleware?: boolean | undefined;
1005
+ assetsPrefix?: string | undefined;
1006
+ } | undefined;
1007
+ image?: {
1008
+ domains?: string[] | undefined;
1009
+ remotePatterns?: {
1010
+ port?: string | undefined;
1011
+ protocol?: string | undefined;
1012
+ hostname?: string | undefined;
1013
+ pathname?: string | undefined;
1014
+ }[] | undefined;
1015
+ service: {
1016
+ config?: Record<string, any> | undefined;
1017
+ entrypoint: string;
1018
+ };
1019
+ } | undefined;
1020
+ markdown?: {
1021
+ drafts?: boolean | undefined;
1022
+ syntaxHighlight?: false | "shiki" | "prism" | undefined;
1023
+ shikiConfig?: {
1024
+ langs?: ILanguageRegistration[] | undefined;
1025
+ theme?: string | import("shiki").IShikiTheme | undefined;
1026
+ wrap?: boolean | null | undefined;
1027
+ } | undefined;
1028
+ remarkPlugins?: (string | [string, any] | RemarkPlugin | [RemarkPlugin, any])[] | undefined;
1029
+ rehypePlugins?: (string | [string, any] | RehypePlugin | [RehypePlugin, any])[] | undefined;
1030
+ remarkRehype?: RemarkRehype | undefined;
1031
+ gfm?: boolean | undefined;
1032
+ smartypants?: boolean | undefined;
1033
+ } | undefined;
1034
+ vite?: ViteUserConfig | undefined;
1035
+ experimental?: {
1036
+ assets?: boolean | undefined;
1037
+ viewTransitions?: boolean | undefined;
1038
+ optimizeHoistedScript?: boolean | undefined;
1039
+ } | undefined;
1040
+ legacy?: {} | undefined;
896
1041
  }>;
@@ -245,6 +245,8 @@ A future version of Astro will stop using the site pathname when producing <link
245
245
  config.base = prependForwardSlash(appendForwardSlash(trimmedBase));
246
246
  }
247
247
  return config;
248
+ }).refine((obj) => !obj.outDir.toString().startsWith(obj.publicDir.toString()), {
249
+ message: "`outDir` must not be placed inside `publicDir` to prevent an infinite loop. Please adjust the directory configuration and try again"
248
250
  });
249
251
  return AstroConfigRelativeSchema;
250
252
  }
@@ -1,4 +1,4 @@
1
- const ASTRO_VERSION = "2.10.11";
1
+ const ASTRO_VERSION = "2.10.13";
2
2
  const SUPPORTED_MARKDOWN_FILE_EXTENSIONS = [
3
3
  ".markdown",
4
4
  ".mdown",
@@ -23,7 +23,7 @@ async function dev(inlineConfig) {
23
23
  base: restart.container.settings.config.base
24
24
  })
25
25
  );
26
- const currentVersion = "2.10.11";
26
+ const currentVersion = "2.10.13";
27
27
  if (currentVersion.includes("-")) {
28
28
  warn(logging, null, msg.prerelease({ currentVersion }));
29
29
  }
@@ -47,7 +47,7 @@ function serverStart({
47
47
  base,
48
48
  isRestart = false
49
49
  }) {
50
- const version = "2.10.11";
50
+ const version = "2.10.13";
51
51
  const localPrefix = `${dim("\u2503")} Local `;
52
52
  const networkPrefix = `${dim("\u2503")} Network `;
53
53
  const emptyPrefix = " ".repeat(11);
@@ -233,7 +233,7 @@ function printHelp({
233
233
  message.push(
234
234
  linebreak(),
235
235
  ` ${bgGreen(black(` ${commandName} `))} ${green(
236
- `v${"2.10.11"}`
236
+ `v${"2.10.13"}`
237
237
  )} ${headline}`
238
238
  );
239
239
  }
@@ -2,6 +2,7 @@ import { escapeHTML, isHTMLString, markHTMLString } from "../escape.js";
2
2
  import { isAstroComponentInstance, isRenderTemplateResult } from "./astro/index.js";
3
3
  import { isRenderInstance } from "./common.js";
4
4
  import { SlotString } from "./slot.js";
5
+ import { renderToBufferDestination } from "./util.js";
5
6
  async function renderChild(destination, child) {
6
7
  child = await child;
7
8
  if (child instanceof SlotString) {
@@ -9,8 +10,13 @@ async function renderChild(destination, child) {
9
10
  } else if (isHTMLString(child)) {
10
11
  destination.write(child);
11
12
  } else if (Array.isArray(child)) {
12
- for (const c of child) {
13
- await renderChild(destination, c);
13
+ const childRenders = child.map((c) => {
14
+ return renderToBufferDestination((bufferDestination) => {
15
+ return renderChild(bufferDestination, c);
16
+ });
17
+ });
18
+ for (const childRender of childRenders) {
19
+ await childRender.renderToFinalDestination(destination);
14
20
  }
15
21
  } else if (typeof child === "function") {
16
22
  await renderChild(destination, child());
@@ -2,6 +2,7 @@ var _a;
2
2
  import { markHTMLString } from "../../escape.js";
3
3
  import { isPromise } from "../../util.js";
4
4
  import { renderChild } from "../any.js";
5
+ import { renderToBufferDestination } from "../util.js";
5
6
  const renderTemplateResultSym = Symbol.for("astro.renderTemplateResult");
6
7
  class RenderTemplateResult {
7
8
  constructor(htmlParts, expressions) {
@@ -21,12 +22,19 @@ class RenderTemplateResult {
21
22
  });
22
23
  }
23
24
  async render(destination) {
25
+ const expRenders = this.expressions.map((exp) => {
26
+ return renderToBufferDestination((bufferDestination) => {
27
+ if (exp || exp === 0) {
28
+ return renderChild(bufferDestination, exp);
29
+ }
30
+ });
31
+ });
24
32
  for (let i = 0; i < this.htmlParts.length; i++) {
25
33
  const html = this.htmlParts[i];
26
- const exp = this.expressions[i];
34
+ const expRender = expRenders[i];
27
35
  destination.write(markHTMLString(html));
28
- if (exp || exp === 0) {
29
- await renderChild(destination, exp);
36
+ if (expRender) {
37
+ await expRender.renderToFinalDestination(destination);
30
38
  }
31
39
  }
32
40
  }
@@ -18,8 +18,9 @@ export interface RenderDestination {
18
18
  write(chunk: RenderDestinationChunk): void;
19
19
  }
20
20
  export interface RenderInstance {
21
- render(destination: RenderDestination): Promise<void> | void;
21
+ render: RenderFunction;
22
22
  }
23
+ export type RenderFunction = (destination: RenderDestination) => Promise<void> | void;
23
24
  export declare const Fragment: unique symbol;
24
25
  export declare const Renderer: unique symbol;
25
26
  export declare const encoder: TextEncoder;
@@ -322,19 +322,9 @@ async function renderHTMLComponent(result, Component, _props, slots = {}) {
322
322
  }
323
323
  function renderAstroComponent(result, displayName, Component, props, slots = {}) {
324
324
  const instance = createAstroComponentInstance(result, displayName, Component, props, slots);
325
- const bufferChunks = [];
326
- const bufferDestination = {
327
- write: (chunk) => bufferChunks.push(chunk)
328
- };
329
- const renderPromise = instance.render(bufferDestination);
330
325
  return {
331
326
  async render(destination) {
332
- for (const chunk of bufferChunks) {
333
- destination.write(chunk);
334
- }
335
- bufferChunks.length = 0;
336
- bufferDestination.write = (chunk) => destination.write(chunk);
337
- await renderPromise;
327
+ await instance.render(destination);
338
328
  }
339
329
  };
340
330
  }
@@ -1,4 +1,5 @@
1
1
  import type { SSRElement } from '../../../@types/astro';
2
+ import type { RenderFunction } from './common.js';
2
3
  export declare const voidElementNames: RegExp;
3
4
  export declare const toAttributeString: (value: any, shouldEscape?: boolean) => any;
4
5
  export declare function defineScriptVars(vars: Record<any, any>): any;
@@ -6,3 +7,25 @@ export declare function formatList(values: string[]): string;
6
7
  export declare function addAttribute(value: any, key: string, shouldEscape?: boolean): any;
7
8
  export declare function internalSpreadAttributes(values: Record<any, any>, shouldEscape?: boolean): any;
8
9
  export declare function renderElement(name: string, { props: _props, children }: SSRElement, shouldEscape?: boolean): string;
10
+ /**
11
+ * Executes the `bufferRenderFunction` to prerender it into a buffer destination, and return a promise
12
+ * with an object containing the `renderToFinalDestination` function to flush the buffer to the final
13
+ * destination.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * // Render components in parallel ahead of time
18
+ * const finalRenders = [ComponentA, ComponentB].map((comp) => {
19
+ * return renderToBufferDestination(async (bufferDestination) => {
20
+ * await renderComponentToDestination(bufferDestination);
21
+ * });
22
+ * });
23
+ * // Render array of components serially
24
+ * for (const finalRender of finalRenders) {
25
+ * await finalRender.renderToFinalDestination(finalDestination);
26
+ * }
27
+ * ```
28
+ */
29
+ export declare function renderToBufferDestination(bufferRenderFunction: RenderFunction): {
30
+ renderToFinalDestination: RenderFunction;
31
+ };
@@ -103,12 +103,29 @@ function renderElement(name, { props: _props, children = "" }, shouldEscape = tr
103
103
  }
104
104
  return `<${name}${internalSpreadAttributes(props, shouldEscape)}>${children}</${name}>`;
105
105
  }
106
+ function renderToBufferDestination(bufferRenderFunction) {
107
+ const bufferChunks = [];
108
+ const bufferDestination = {
109
+ write: (chunk) => bufferChunks.push(chunk)
110
+ };
111
+ const renderPromise = bufferRenderFunction(bufferDestination);
112
+ return {
113
+ async renderToFinalDestination(destination) {
114
+ for (const chunk of bufferChunks) {
115
+ destination.write(chunk);
116
+ }
117
+ bufferDestination.write = (chunk) => destination.write(chunk);
118
+ await renderPromise;
119
+ }
120
+ };
121
+ }
106
122
  export {
107
123
  addAttribute,
108
124
  defineScriptVars,
109
125
  formatList,
110
126
  internalSpreadAttributes,
111
127
  renderElement,
128
+ renderToBufferDestination,
112
129
  toAttributeString,
113
130
  voidElementNames
114
131
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "astro",
3
- "version": "2.10.11",
3
+ "version": "2.10.13",
4
4
  "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.",
5
5
  "type": "module",
6
6
  "author": "withastro",