eclipsa 0.1.0 → 0.2.0-alpha.0

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 (62) hide show
  1. package/action-LXy_7T1f.mjs +4086 -0
  2. package/action-LXy_7T1f.mjs.map +1 -0
  3. package/client-DDoDNYqH.mjs +104 -0
  4. package/client-DDoDNYqH.mjs.map +1 -0
  5. package/component-CIul6R1i.d.mts +10 -0
  6. package/core/client/mod.d.mts +2 -0
  7. package/core/client/mod.mjs +4 -0
  8. package/core/dev-client/mod.d.mts +33 -0
  9. package/core/dev-client/mod.mjs +78 -0
  10. package/core/dev-client/mod.mjs.map +1 -0
  11. package/core/internal.d.mts +2 -0
  12. package/core/internal.mjs +2 -0
  13. package/core/prod-client/mod.d.mts +18 -0
  14. package/core/prod-client/mod.mjs +43 -0
  15. package/core/prod-client/mod.mjs.map +1 -0
  16. package/internal-CKAmxezZ.d.mts +534 -0
  17. package/jsx/jsx-dev-runtime.d.mts +17 -0
  18. package/jsx/jsx-dev-runtime.mjs +2 -0
  19. package/jsx/jsx-runtime.d.mts +2 -0
  20. package/jsx/jsx-runtime.mjs +1 -0
  21. package/jsx/mod.d.mts +7 -0
  22. package/jsx/mod.mjs +7 -0
  23. package/jsx/mod.mjs.map +1 -0
  24. package/jsx-dev-runtime-CY60yQJY.mjs +28 -0
  25. package/jsx-dev-runtime-CY60yQJY.mjs.map +1 -0
  26. package/jsx-runtime-BSRqCWNF.d.mts +1 -0
  27. package/mod-CGP_OpcY.d.mts +25 -0
  28. package/mod.d.mts +114 -0
  29. package/mod.mjs +251 -0
  30. package/mod.mjs.map +1 -0
  31. package/package.json +66 -3
  32. package/resume-hmr-BRDojQNp.mjs +6 -0
  33. package/resume-hmr-BRDojQNp.mjs.map +1 -0
  34. package/router-shared-Y6ck-Mcm.mjs +103 -0
  35. package/router-shared-Y6ck-Mcm.mjs.map +1 -0
  36. package/snapshot-BbvDaNMJ.mjs +139 -0
  37. package/snapshot-BbvDaNMJ.mjs.map +1 -0
  38. package/types-DFdkOqSj.d.mts +35 -0
  39. package/vite/mod.d.mts +13 -0
  40. package/vite/mod.mjs +11488 -0
  41. package/vite/mod.mjs.map +1 -0
  42. package/core/component.ts +0 -7
  43. package/core/dev-client/mod.ts +0 -17
  44. package/core/dev-client/renderer.ts +0 -5
  45. package/core/dev-client/types.ts +0 -3
  46. package/core/mod.ts +0 -4
  47. package/core/signal.ts +0 -20
  48. package/core/types.ts +0 -6
  49. package/deno.json +0 -23
  50. package/jsx/jsx-dev-runtime.ts +0 -19
  51. package/jsx/jsx-runtime.ts +0 -1
  52. package/jsx/mod.ts +0 -34
  53. package/jsx/shared.ts +0 -1
  54. package/jsx/types.ts +0 -23
  55. package/mod.ts +0 -2
  56. package/transformers/dev-client/mod.ts +0 -39
  57. package/transformers/dev-ssr/mod.ts +0 -52
  58. package/transformers/utils/jsx.ts +0 -77
  59. package/utils/node-connect.ts +0 -55
  60. package/vite/dev-app/mod.ts +0 -88
  61. package/vite/mod.ts +0 -76
  62. package/vite/utils/routing.ts +0 -26
package/mod.d.mts ADDED
@@ -0,0 +1,114 @@
1
+ import { t as JSX } from "./types-DFdkOqSj.mjs";
2
+ import { i as component$, n as Component, r as EURL, t as $ } from "./component-CIul6R1i.mjs";
3
+ import { $ as ACTION_CONTENT_TYPE, $t as serializeValue, At as MetadataContext, B as LoaderHandle, Bt as resolveRouteMetadata, Ct as hasAction, Dt as RESUME_FINAL_STATE_ELEMENT_ID, Et as validator, Ft as RouteMetadataResolver, G as executeLoader, Gt as SerializedReference, H as LoaderMiddleware, Ht as SerializeValueOptions, It as RouteMetadataValue, J as loader$, Jt as SerializedValue, K as hasLoader, Kt as SerializedSet, Lt as TwitterMetadata, Mt as ROUTE_METADATA_HEAD_ATTR, Nt as RouteMetadata, Ot as ResumePayload, Pt as RouteMetadataExport, Q as resolvePendingLoaders, Qt as serializeJSONScriptContent, Rt as composeRouteMetadata, St as getNormalizedActionInput, Tt as registerAction, U as __eclipsaLoader, Ut as SerializedMap, V as LoaderHandler, Vt as DeserializeValueOptions, W as consumePendingSsrLoaderIds, Wt as SerializedObject, X as primeLoaderState, Xt as escapeJSONScriptText, Y as markPendingSsrLoader, Yt as deserializeValue, Z as registerLoader, Zt as parseSerializedJSON, _t as __eclipsaAction, at as ActionHandler, bt as executeActionSubmission, ct as ActionSubmission, dt as InferStandardSchemaOutput, en as LinkPrefetchMode, et as ACTION_FORM_ATTR, ft as OpaqueDomRef, gt as StandardSchemaV1, ht as StandardSchemaResult, it as ActionHandle, jt as OpenGraphMetadata, kt as RuntimeContainer, lt as ActionValidatorMiddleware, mt as StandardSchemaIssue, nn as NavigateOptions, nt as ActionFactory, ot as ActionMiddleware, pt as OpaqueSignalRef, q as isPendingSsrLoaderError, qt as SerializedUndefined, rn as RouteParams, rt as ActionFormProps, st as ActionOpaqueRef, tn as Navigate, tt as ACTION_FORM_FIELD, ut as InferStandardSchemaInput, vt as action$, wt as primeActionState, xt as getActionFormSubmissionId, yt as executeAction, z as LoaderFactory, zt as renderRouteMetadataHead } from "./internal-CKAmxezZ.mjs";
4
+ import { Context } from "hono";
5
+ import { MiddlewareHandler } from "hono/types";
6
+
7
+ //#region core/route-middleware.d.ts
8
+ type RouteMiddleware = MiddlewareHandler<any>;
9
+ //#endregion
10
+ //#region core/router.d.ts
11
+ interface LinkProps extends Record<string, unknown> {
12
+ children?: JSX.Element | JSX.Element[];
13
+ href: string;
14
+ prefetch?: LinkPrefetchMode | boolean;
15
+ replace?: boolean;
16
+ }
17
+ declare const Link: Component<LinkProps>;
18
+ declare const useNavigate: () => Navigate;
19
+ declare const useRouteParams: () => RouteParams;
20
+ declare const notFound: () => never;
21
+ //#endregion
22
+ //#region core/resume.d.ts
23
+ declare const resumeContainer: (source?: Document | HTMLElement) => Promise<void>;
24
+ //#endregion
25
+ //#region core/signal.d.ts
26
+ interface Signal<T> {
27
+ value: T;
28
+ }
29
+ interface SignalFactory {
30
+ <T>(value: T): Signal<T>;
31
+ <T>(value?: T | undefined): Signal<T | undefined>;
32
+ computed<T>(value: () => T | Promise<T>): Signal<T>;
33
+ }
34
+ type WatchDependency<T = unknown> = Signal<T> | (() => T);
35
+ declare const signal: SignalFactory;
36
+ declare const useSignal: SignalFactory;
37
+ declare const effect: (fn: () => void) => void;
38
+ declare const onCleanup: (fn: () => void) => void;
39
+ declare const onMount: (fn: () => void) => void;
40
+ declare const onVisible: (fn: () => void) => void;
41
+ declare const useWatch: (fn: () => void, dependencies?: WatchDependency[]) => void;
42
+ declare const useComputed$: <T>(fn: () => T | Promise<T>) => Signal<T>;
43
+ //#endregion
44
+ //#region core/snapshot.d.ts
45
+ interface SignalReader {
46
+ read(): unknown;
47
+ }
48
+ declare const withSignalSnapshot: <T>(values: unknown[] | null, fn: () => T) => {
49
+ result: T;
50
+ values: unknown[];
51
+ };
52
+ declare const consumeSnapshotValue: <T>(fallback: T) => T;
53
+ declare const registerSnapshotSignal: (reader: SignalReader) => void;
54
+ //#endregion
55
+ //#region core/ssr.d.ts
56
+ interface SSRRenderResult {
57
+ html: string;
58
+ payload: ResumePayload;
59
+ }
60
+ interface SSRStreamChunk {
61
+ boundaryId: string;
62
+ html: string;
63
+ payload: ResumePayload;
64
+ }
65
+ interface SSRStreamRenderResult extends SSRRenderResult {
66
+ chunks: AsyncIterable<SSRStreamChunk>;
67
+ }
68
+ declare const renderSSR: (render: () => JSX.Element | JSX.Element[], options?: {
69
+ symbols?: Record<string, string>;
70
+ }) => SSRRenderResult;
71
+ declare const renderSSRAsync: (render: () => JSX.Element | JSX.Element[], options?: {
72
+ context?: Context<any>;
73
+ prepare?: (container: RuntimeContainer) => void | Promise<void>;
74
+ resolvePendingLoaders?: (container: RuntimeContainer) => void | Promise<boolean>;
75
+ symbols?: Record<string, string>;
76
+ }) => Promise<SSRRenderResult>;
77
+ declare const renderSSRStream: (render: () => JSX.Element | JSX.Element[], options?: {
78
+ context?: Context<any>;
79
+ prepare?: (container: RuntimeContainer) => void | Promise<void>;
80
+ resolvePendingLoaders?: (container: RuntimeContainer) => void | Promise<boolean>;
81
+ symbols?: Record<string, string>;
82
+ }) => Promise<SSRStreamRenderResult>;
83
+ declare const serializeResumePayload: (payload: ResumePayload) => string;
84
+ declare const getStreamingResumeBootstrapScriptContent: () => string;
85
+ //#endregion
86
+ //#region core/suspense.d.ts
87
+ declare const PENDING_SIGNAL_ERROR_KEY: unique symbol;
88
+ interface SuspenseProps {
89
+ children?: JSX.Element | JSX.Element[] | (() => JSX.Element | JSX.Element[]);
90
+ fallback?: JSX.Element | JSX.Element[];
91
+ }
92
+ interface PendingSignalError {
93
+ [PENDING_SIGNAL_ERROR_KEY]: true;
94
+ promise: Promise<unknown>;
95
+ }
96
+ declare const Suspense: (props: SuspenseProps) => JSX.Element;
97
+ declare const createPendingSignalError: (promise: Promise<unknown>) => PendingSignalError;
98
+ declare const isPendingSignalError: (value: unknown) => value is PendingSignalError;
99
+ declare const isSuspenseType: (value: unknown) => value is typeof Suspense;
100
+ //#endregion
101
+ //#region core/types.d.ts
102
+ interface SSRRootProps {
103
+ children: JSX.Element[] | JSX.Element;
104
+ head: JSX.Element;
105
+ }
106
+ //#endregion
107
+ //#region core/flow/mod.d.ts
108
+ declare const For: <T>(props: {
109
+ arr: T[];
110
+ fn: (e: T, i: number) => JSX.Element;
111
+ }) => JSX.Element;
112
+ //#endregion
113
+ export { $, ACTION_CONTENT_TYPE, ACTION_FORM_ATTR, ACTION_FORM_FIELD, ActionFactory, ActionFormProps, ActionHandle, ActionHandler, ActionMiddleware, ActionOpaqueRef, ActionSubmission, ActionValidatorMiddleware, Component, DeserializeValueOptions, EURL, For, InferStandardSchemaInput, InferStandardSchemaOutput, JSX, Link, type LinkPrefetchMode, type LinkProps, LoaderFactory, LoaderHandle, LoaderHandler, LoaderMiddleware, MetadataContext, type Navigate, type NavigateOptions, OpaqueDomRef, OpaqueSignalRef, OpenGraphMetadata, PendingSignalError, RESUME_FINAL_STATE_ELEMENT_ID, ROUTE_METADATA_HEAD_ATTR, RouteMetadata, RouteMetadataExport, RouteMetadataResolver, RouteMetadataValue, RouteMiddleware, SSRRenderResult, SSRRootProps, SSRStreamChunk, SSRStreamRenderResult, SerializeValueOptions, SerializedMap, SerializedObject, SerializedReference, SerializedSet, SerializedUndefined, SerializedValue, Signal, StandardSchemaIssue, StandardSchemaResult, StandardSchemaV1, Suspense, SuspenseProps, TwitterMetadata, WatchDependency, __eclipsaAction, __eclipsaLoader, action$, component$, composeRouteMetadata, consumePendingSsrLoaderIds, consumeSnapshotValue, createPendingSignalError, deserializeValue, effect, escapeJSONScriptText, executeAction, executeActionSubmission, executeLoader, getActionFormSubmissionId, getNormalizedActionInput, getStreamingResumeBootstrapScriptContent, hasAction, hasLoader, isPendingSignalError, isPendingSsrLoaderError, isSuspenseType, loader$, markPendingSsrLoader, notFound, onCleanup, onMount, onVisible, parseSerializedJSON, primeActionState, primeLoaderState, registerAction, registerLoader, registerSnapshotSignal, renderRouteMetadataHead, renderSSR, renderSSRAsync, renderSSRStream, resolvePendingLoaders, resolveRouteMetadata, resumeContainer, serializeJSONScriptContent, serializeResumePayload, serializeValue, signal, useComputed$, useNavigate, useRouteParams, useSignal, useWatch, validator, withSignalSnapshot };
114
+ //# sourceMappingURL=mod.d.mts.map
package/mod.mjs ADDED
@@ -0,0 +1,251 @@
1
+ import { At as registerLoader, Bt as serializeValue, Ct as executeLoader, E as createResumeContainer, Et as loader$, F as primeRouteModules, Ft as isSuspenseType, G as useRuntimeRouteParams, H as toResumePayload, Ht as component$, It as deserializeValue, L as registerResumeContainer, Lt as escapeJSONScriptText, M as getStreamingResumeBootstrapScriptContent$1, Mt as Suspense, N as installResumeListeners, Nt as createPendingSignalError, Ot as markPendingSsrLoader, P as notFound$1, Pt as isPendingSignalError, Rt as parseSerializedJSON, St as consumePendingSsrLoaderIds, Tt as isPendingSsrLoaderError, U as toResumePayloadSubset, V as restoreRegisteredRpcHandles, Vt as $, W as useRuntimeNavigate, a as action$, c as getActionFormSubmissionId, d as primeActionState, f as registerAction, g as applyResumeHmrUpdateToRegisteredContainers, i as __eclipsaAction, jt as resolvePendingLoaders, k as getResumePayloadScriptContent, kt as primeLoaderState, l as getNormalizedActionInput, m as RESUME_FINAL_STATE_ELEMENT_ID, n as ACTION_FORM_ATTR, o as executeAction, p as validator, q as withRuntimeContainer, r as ACTION_FORM_FIELD, s as executeActionSubmission, t as ACTION_CONTENT_TYPE, u as hasAction, v as beginAsyncSSRContainer, wt as hasLoader, x as collectPendingSuspenseBoundaryIds, xt as __eclipsaLoader, y as beginSSRContainer, zt as serializeJSONScriptContent } from "./action-LXy_7T1f.mjs";
2
+ import { c as composeRouteMetadata, l as renderRouteMetadataHead, n as ROUTE_MANIFEST_ELEMENT_ID, o as ROUTE_REPLACE_ATTR, r as ROUTE_PREFETCH_ATTR, s as ROUTE_METADATA_HEAD_ATTR, t as ROUTE_LINK_ATTR, u as resolveRouteMetadata } from "./router-shared-Y6ck-Mcm.mjs";
3
+ import { t as RESUME_HMR_EVENT } from "./resume-hmr-BRDojQNp.mjs";
4
+ import { a as onCleanup, c as signal, d as useWatch, i as effect, l as useComputed$, n as registerSnapshotSignal, o as onMount, r as withSignalSnapshot, s as onVisible, t as consumeSnapshotValue, u as useSignal } from "./snapshot-BbvDaNMJ.mjs";
5
+ import { renderToString } from "./jsx/mod.mjs";
6
+ //#region core/router.tsx
7
+ const normalizeLinkPrefetchMode = (prefetch) => {
8
+ if (prefetch === void 0) return;
9
+ if (prefetch === true) return "intent";
10
+ if (prefetch === false) return "none";
11
+ return prefetch;
12
+ };
13
+ const appendClientChildren = (parent, value) => {
14
+ let resolved = value;
15
+ while (typeof resolved === "function") resolved = resolved();
16
+ if (Array.isArray(resolved)) {
17
+ for (const entry of resolved) appendClientChildren(parent, entry);
18
+ return;
19
+ }
20
+ if (resolved === null || resolved === void 0 || resolved === false) return;
21
+ if (resolved instanceof Node) {
22
+ parent.appendChild(resolved);
23
+ return;
24
+ }
25
+ parent.appendChild(document.createTextNode(String(resolved)));
26
+ };
27
+ const createClientLinkNode = (props) => {
28
+ const anchor = document.createElement("a");
29
+ anchor.setAttribute(ROUTE_LINK_ATTR, "");
30
+ const prefetchMode = normalizeLinkPrefetchMode(props.prefetch);
31
+ if (props.replace) anchor.setAttribute(ROUTE_REPLACE_ATTR, "true");
32
+ if (prefetchMode) anchor.setAttribute(ROUTE_PREFETCH_ATTR, prefetchMode);
33
+ for (const [name, value] of Object.entries(props)) {
34
+ if (name === "children" || name === "prefetch" || name === "replace" || value === false || value === void 0 || value === null) continue;
35
+ if (name === "class") {
36
+ anchor.className = String(value);
37
+ continue;
38
+ }
39
+ if (name === "style" && value && typeof value === "object") {
40
+ anchor.setAttribute("style", Object.entries(value).map(([styleName, styleValue]) => `${styleName}: ${styleValue}`).join("; "));
41
+ continue;
42
+ }
43
+ if (value === true) {
44
+ anchor.setAttribute(name, "");
45
+ continue;
46
+ }
47
+ anchor.setAttribute(name, String(value));
48
+ }
49
+ appendClientChildren(anchor, props.children);
50
+ return anchor;
51
+ };
52
+ const Link = component$((props) => {
53
+ if (typeof document !== "undefined") return createClientLinkNode(props);
54
+ const prefetchMode = normalizeLinkPrefetchMode(props.prefetch);
55
+ const nextProps = {
56
+ ...props,
57
+ [ROUTE_LINK_ATTR]: ""
58
+ };
59
+ if (prefetchMode) nextProps[ROUTE_PREFETCH_ATTR] = prefetchMode;
60
+ if (props.replace) nextProps[ROUTE_REPLACE_ATTR] = "true";
61
+ delete nextProps.prefetch;
62
+ delete nextProps.replace;
63
+ return {
64
+ isStatic: true,
65
+ props: nextProps,
66
+ type: "a"
67
+ };
68
+ });
69
+ const useNavigate = () => useRuntimeNavigate();
70
+ const useRouteParams = () => useRuntimeRouteParams();
71
+ const notFound = () => notFound$1();
72
+ //#endregion
73
+ //#region core/resume.ts
74
+ const getResumePayload = (doc) => {
75
+ const elem = doc.getElementById("eclipsa-resume-final") ?? doc.getElementById("eclipsa-resume");
76
+ if (!elem?.textContent) return null;
77
+ return JSON.parse(elem.textContent);
78
+ };
79
+ const getRouteManifest = (doc) => {
80
+ const elem = doc.getElementById(ROUTE_MANIFEST_ELEMENT_ID);
81
+ if (!elem?.textContent) return [];
82
+ return JSON.parse(elem.textContent);
83
+ };
84
+ const initResumeHmr = (hot) => {
85
+ if (!hot) return;
86
+ hot.on(RESUME_HMR_EVENT, async (payload) => {
87
+ if (await applyResumeHmrUpdateToRegisteredContainers(payload) === "reload") location.reload();
88
+ });
89
+ };
90
+ initResumeHmr(import.meta.hot);
91
+ const resumeContainer = async (source = document) => {
92
+ const doc = source instanceof Document ? source : source.ownerDocument;
93
+ const root = source instanceof Document ? doc.body : source;
94
+ const payload = getResumePayload(doc);
95
+ if (!payload) return;
96
+ const container = createResumeContainer(root, payload, { routeManifest: getRouteManifest(doc) });
97
+ await primeRouteModules(container);
98
+ restoreRegisteredRpcHandles(container);
99
+ registerResumeContainer(container);
100
+ root.setAttribute("data-e-resume", "resumed");
101
+ installResumeListeners(container);
102
+ };
103
+ //#endregion
104
+ //#region core/ssr.ts
105
+ const collectRenderedComponentIdsFromHtml = (html) => {
106
+ const ids = /* @__PURE__ */ new Set();
107
+ for (const match of html.matchAll(/<!--ec:c:([^:]+):start-->/g)) {
108
+ const id = match[1];
109
+ if (id) ids.add(id);
110
+ }
111
+ return ids;
112
+ };
113
+ const createStreamingResumePayload = (container, renderedComponentIds) => toResumePayloadSubset(container, ["$root", ...renderedComponentIds]);
114
+ const renderSSR = (render, options) => {
115
+ const { container, result } = beginSSRContainer(options?.symbols ?? {}, render);
116
+ return {
117
+ html: withRuntimeContainer(container, () => renderToString(result)),
118
+ payload: toResumePayload(container)
119
+ };
120
+ };
121
+ const renderSSRAsync = async (render, options) => {
122
+ const asyncSignalSnapshotCache = /* @__PURE__ */ new Map();
123
+ const seededLoaderStates = /* @__PURE__ */ new Map();
124
+ for (let attempt = 0; attempt < 10; attempt += 1) {
125
+ const { container, result } = await beginAsyncSSRContainer(options?.symbols ?? {}, render, async (runtimeContainer) => {
126
+ for (const [id, snapshot] of seededLoaderStates) runtimeContainer.loaderStates.set(id, {
127
+ data: snapshot.data,
128
+ error: snapshot.error,
129
+ loaded: snapshot.loaded
130
+ });
131
+ await options?.prepare?.(runtimeContainer);
132
+ }, { asyncSignalSnapshotCache });
133
+ try {
134
+ const html = withRuntimeContainer(container, () => renderToString(result));
135
+ if (container.pendingSuspensePromises.size > 0) {
136
+ await Promise.allSettled([...container.pendingSuspensePromises]);
137
+ continue;
138
+ }
139
+ asyncSignalSnapshotCache.clear();
140
+ return {
141
+ html,
142
+ payload: toResumePayload(container)
143
+ };
144
+ } catch (error) {
145
+ const { isPendingSsrLoaderError, resolvePendingLoaders } = await import("./action-LXy_7T1f.mjs").then((n) => n.Dt);
146
+ if (!isPendingSsrLoaderError(error)) throw error;
147
+ if (!(options?.resolvePendingLoaders ? await options.resolvePendingLoaders(container) : options?.context ? await resolvePendingLoaders(container, options.context) : false)) throw error;
148
+ seededLoaderStates.clear();
149
+ for (const [id, snapshot] of container.loaderStates) seededLoaderStates.set(id, {
150
+ data: snapshot.data,
151
+ error: snapshot.error,
152
+ loaded: snapshot.loaded
153
+ });
154
+ }
155
+ }
156
+ throw new Error("SSR loader resolution did not converge.");
157
+ };
158
+ const extractBoundaryHtml = (html, boundaryId) => {
159
+ const startToken = `<!--ec:c:${boundaryId}:start-->`;
160
+ const endToken = `<!--ec:c:${boundaryId}:end-->`;
161
+ const startIndex = html.indexOf(startToken);
162
+ if (startIndex < 0) return null;
163
+ const endIndex = html.indexOf(endToken, startIndex + startToken.length);
164
+ if (endIndex < 0) return null;
165
+ return html.slice(startIndex + startToken.length, endIndex);
166
+ };
167
+ const renderStreamingAttempt = async (render, options, seededLoaderStates, asyncSignalSnapshotCache) => {
168
+ for (let attempt = 0; attempt < 10; attempt += 1) {
169
+ const { container, result } = await beginAsyncSSRContainer(options.symbols ?? {}, render, async (runtimeContainer) => {
170
+ for (const [id, snapshot] of seededLoaderStates) runtimeContainer.loaderStates.set(id, {
171
+ data: snapshot.data,
172
+ error: snapshot.error,
173
+ loaded: snapshot.loaded
174
+ });
175
+ await options.prepare?.(runtimeContainer);
176
+ }, { asyncSignalSnapshotCache });
177
+ try {
178
+ const html = withRuntimeContainer(container, () => renderToString(result));
179
+ return {
180
+ container,
181
+ html,
182
+ payload: createStreamingResumePayload(container, collectRenderedComponentIdsFromHtml(html)),
183
+ pendingBoundaryIds: collectPendingSuspenseBoundaryIds(container)
184
+ };
185
+ } catch (error) {
186
+ const { isPendingSsrLoaderError, resolvePendingLoaders } = await import("./action-LXy_7T1f.mjs").then((n) => n.Dt);
187
+ if (!isPendingSsrLoaderError(error)) throw error;
188
+ if (!(options.resolvePendingLoaders ? await options.resolvePendingLoaders(container) : options.context ? await resolvePendingLoaders(container, options.context) : false)) throw error;
189
+ seededLoaderStates.clear();
190
+ for (const [id, snapshot] of container.loaderStates) seededLoaderStates.set(id, {
191
+ data: snapshot.data,
192
+ error: snapshot.error,
193
+ loaded: snapshot.loaded
194
+ });
195
+ }
196
+ }
197
+ throw new Error("SSR loader resolution did not converge.");
198
+ };
199
+ const renderSSRStream = async (render, options) => {
200
+ const asyncSignalSnapshotCache = /* @__PURE__ */ new Map();
201
+ const seededLoaderStates = /* @__PURE__ */ new Map();
202
+ const initial = await renderStreamingAttempt(render, options ?? {}, seededLoaderStates, asyncSignalSnapshotCache);
203
+ if (initial.pendingBoundaryIds.length === 0) {
204
+ asyncSignalSnapshotCache.clear();
205
+ return {
206
+ chunks: (async function* () {})(),
207
+ html: initial.html,
208
+ payload: initial.payload
209
+ };
210
+ }
211
+ return {
212
+ chunks: (async function* () {
213
+ let current = initial;
214
+ try {
215
+ while (current.pendingBoundaryIds.length > 0) {
216
+ await Promise.race(current.pendingBoundaryIds.map((boundaryId) => current.container.components.get(boundaryId)?.suspensePromise?.then(() => boundaryId, () => boundaryId) ?? Promise.resolve(boundaryId)));
217
+ const next = await renderStreamingAttempt(render, options ?? {}, seededLoaderStates, asyncSignalSnapshotCache);
218
+ const nextPending = new Set(next.pendingBoundaryIds);
219
+ const completedIds = current.pendingBoundaryIds.filter((boundaryId) => !nextPending.has(boundaryId)).sort((left, right) => left.split(".").length - right.split(".").length);
220
+ for (const boundaryId of completedIds) {
221
+ const boundaryHtml = extractBoundaryHtml(next.html, boundaryId);
222
+ if (boundaryHtml === null) continue;
223
+ yield {
224
+ boundaryId,
225
+ html: boundaryHtml,
226
+ payload: next.payload
227
+ };
228
+ }
229
+ current = next;
230
+ }
231
+ } finally {
232
+ asyncSignalSnapshotCache.clear();
233
+ }
234
+ })(),
235
+ html: initial.html,
236
+ payload: initial.payload
237
+ };
238
+ };
239
+ const serializeResumePayload = (payload) => getResumePayloadScriptContent(payload);
240
+ const getStreamingResumeBootstrapScriptContent = () => getStreamingResumeBootstrapScriptContent$1();
241
+ //#endregion
242
+ //#region core/flow/mod.ts
243
+ const For = (props) => {
244
+ const result = [];
245
+ for (let i = 0; i < props.arr.length; i++) result.push(props.fn(props.arr[i], i));
246
+ return result;
247
+ };
248
+ //#endregion
249
+ export { $, ACTION_CONTENT_TYPE, ACTION_FORM_ATTR, ACTION_FORM_FIELD, For, Link, RESUME_FINAL_STATE_ELEMENT_ID, ROUTE_METADATA_HEAD_ATTR, Suspense, __eclipsaAction, __eclipsaLoader, action$, component$, composeRouteMetadata, consumePendingSsrLoaderIds, consumeSnapshotValue, createPendingSignalError, deserializeValue, effect, escapeJSONScriptText, executeAction, executeActionSubmission, executeLoader, getActionFormSubmissionId, getNormalizedActionInput, getStreamingResumeBootstrapScriptContent, hasAction, hasLoader, isPendingSignalError, isPendingSsrLoaderError, isSuspenseType, loader$, markPendingSsrLoader, notFound, onCleanup, onMount, onVisible, parseSerializedJSON, primeActionState, primeLoaderState, registerAction, registerLoader, registerSnapshotSignal, renderRouteMetadataHead, renderSSR, renderSSRAsync, renderSSRStream, resolvePendingLoaders, resolveRouteMetadata, resumeContainer, serializeJSONScriptContent, serializeResumePayload, serializeValue, signal, useComputed$, useNavigate, useRouteParams, useSignal, useWatch, validator, withSignalSnapshot };
250
+
251
+ //# sourceMappingURL=mod.mjs.map
package/mod.mjs.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.mjs","names":["throwRouteNotFound","getStreamingResumeBootstrapScriptContentFromRuntime"],"sources":["../core/router.tsx","../core/resume.ts","../core/ssr.ts","../core/flow/mod.ts"],"sourcesContent":["import type { JSX } from '../jsx/types.ts'\nimport { component$ } from './component.ts'\nimport {\n ROUTE_LINK_ATTR,\n ROUTE_PREFETCH_ATTR,\n ROUTE_REPLACE_ATTR,\n type LinkPrefetchMode,\n type Navigate,\n type RouteParams,\n} from './router-shared.ts'\nimport {\n notFound as throwRouteNotFound,\n useRuntimeNavigate,\n useRuntimeRouteParams,\n} from './runtime.ts'\n\nexport interface LinkProps extends Record<string, unknown> {\n children?: JSX.Element | JSX.Element[]\n href: string\n prefetch?: LinkPrefetchMode | boolean\n replace?: boolean\n}\n\nconst normalizeLinkPrefetchMode = (\n prefetch: LinkProps['prefetch'],\n): LinkPrefetchMode | undefined => {\n if (prefetch === undefined) {\n return undefined\n }\n if (prefetch === true) {\n return 'intent'\n }\n if (prefetch === false) {\n return 'none'\n }\n return prefetch\n}\n\nconst appendClientChildren = (parent: Element, value: unknown) => {\n let resolved = value\n while (typeof resolved === 'function') {\n resolved = resolved()\n }\n\n if (Array.isArray(resolved)) {\n for (const entry of resolved) {\n appendClientChildren(parent, entry)\n }\n return\n }\n if (resolved === null || resolved === undefined || resolved === false) {\n return\n }\n if (resolved instanceof Node) {\n parent.appendChild(resolved)\n return\n }\n\n parent.appendChild(document.createTextNode(String(resolved)))\n}\n\nconst createClientLinkNode = (props: LinkProps) => {\n const anchor = document.createElement('a')\n anchor.setAttribute(ROUTE_LINK_ATTR, '')\n const prefetchMode = normalizeLinkPrefetchMode(props.prefetch)\n\n if (props.replace) {\n anchor.setAttribute(ROUTE_REPLACE_ATTR, 'true')\n }\n if (prefetchMode) {\n anchor.setAttribute(ROUTE_PREFETCH_ATTR, prefetchMode)\n }\n\n for (const [name, value] of Object.entries(props)) {\n if (\n name === 'children' ||\n name === 'prefetch' ||\n name === 'replace' ||\n value === false ||\n value === undefined ||\n value === null\n ) {\n continue\n }\n if (name === 'class') {\n anchor.className = String(value)\n continue\n }\n if (name === 'style' && value && typeof value === 'object') {\n anchor.setAttribute(\n 'style',\n Object.entries(value as Record<string, unknown>)\n .map(([styleName, styleValue]) => `${styleName}: ${styleValue}`)\n .join('; '),\n )\n continue\n }\n if (value === true) {\n anchor.setAttribute(name, '')\n continue\n }\n anchor.setAttribute(name, String(value))\n }\n\n appendClientChildren(anchor, props.children)\n return anchor\n}\n\nexport const Link = component$((props: LinkProps) => {\n if (typeof document !== 'undefined') {\n return createClientLinkNode(props) as unknown as JSX.Element\n }\n\n const prefetchMode = normalizeLinkPrefetchMode(props.prefetch)\n const nextProps: Record<string, unknown> = {\n ...props,\n [ROUTE_LINK_ATTR]: '',\n }\n\n if (prefetchMode) {\n nextProps[ROUTE_PREFETCH_ATTR] = prefetchMode\n }\n if (props.replace) {\n nextProps[ROUTE_REPLACE_ATTR] = 'true'\n }\n delete nextProps.prefetch\n delete nextProps.replace\n\n return {\n isStatic: true,\n props: nextProps,\n type: 'a',\n } satisfies JSX.Element\n})\n\nexport const useNavigate = (): Navigate => useRuntimeNavigate()\n\nexport const useRouteParams = (): RouteParams => useRuntimeRouteParams()\n\nexport const notFound = (): never => throwRouteNotFound()\n","import {\n applyResumeHmrUpdateToRegisteredContainers,\n createResumeContainer,\n RESUME_FINAL_STATE_ELEMENT_ID,\n installResumeListeners,\n primeRouteModules,\n RESUME_STATE_ELEMENT_ID,\n restoreRegisteredRpcHandles,\n registerResumeContainer,\n type ResumePayload,\n} from './runtime.ts'\nimport { RESUME_HMR_EVENT, type ResumeHmrUpdatePayload } from './resume-hmr.ts'\nimport { ROUTE_MANIFEST_ELEMENT_ID, type RouteManifest } from './router-shared.ts'\n\ninterface ViteHotContext {\n on(event: string, listener: (data: ResumeHmrUpdatePayload) => void | Promise<void>): void\n}\n\nconst getResumePayload = (doc: Document): ResumePayload | null => {\n const elem =\n doc.getElementById(RESUME_FINAL_STATE_ELEMENT_ID) ?? doc.getElementById(RESUME_STATE_ELEMENT_ID)\n if (!elem?.textContent) {\n return null\n }\n\n return JSON.parse(elem.textContent) as ResumePayload\n}\n\nconst getRouteManifest = (doc: Document): RouteManifest => {\n const elem = doc.getElementById(ROUTE_MANIFEST_ELEMENT_ID)\n if (!elem?.textContent) {\n return []\n }\n\n return JSON.parse(elem.textContent) as RouteManifest\n}\n\nconst initResumeHmr = (hot: ViteHotContext | undefined) => {\n if (!hot) {\n return\n }\n\n hot.on(RESUME_HMR_EVENT, async (payload) => {\n const result = await applyResumeHmrUpdateToRegisteredContainers(payload)\n if (result === 'reload') {\n location.reload()\n }\n })\n}\n\ninitResumeHmr((import.meta as ImportMeta & { hot?: ViteHotContext }).hot)\n\nexport const resumeContainer = async (source: Document | HTMLElement = document) => {\n const doc = source instanceof Document ? source : source.ownerDocument\n const root = source instanceof Document ? doc.body : source\n const payload = getResumePayload(doc)\n\n if (!payload) {\n return\n }\n\n const container = createResumeContainer(root, payload, {\n routeManifest: getRouteManifest(doc),\n })\n await primeRouteModules(container)\n restoreRegisteredRpcHandles(container)\n registerResumeContainer(container)\n root.setAttribute('data-e-resume', 'resumed')\n installResumeListeners(container)\n}\n","import type { Context } from 'hono'\nimport type { JSX } from '../jsx/types.ts'\nimport { renderToString } from '../jsx/mod.ts'\nimport {\n beginAsyncSSRContainer,\n beginSSRContainer,\n collectPendingSuspenseBoundaryIds,\n getResumePayloadScriptContent,\n getStreamingResumeBootstrapScriptContent as getStreamingResumeBootstrapScriptContentFromRuntime,\n renderResolvedSuspenseBoundaryToString,\n toResumePayload,\n toResumePayloadSubset,\n type ResumePayload,\n type RuntimeContainer,\n withRuntimeContainer,\n} from './runtime.ts'\n\nexport interface SSRRenderResult {\n html: string\n payload: ResumePayload\n}\n\nexport interface SSRStreamChunk {\n boundaryId: string\n html: string\n payload: ResumePayload\n}\n\nexport interface SSRStreamRenderResult extends SSRRenderResult {\n chunks: AsyncIterable<SSRStreamChunk>\n}\n\nconst collectRenderedComponentIdsFromHtml = (html: string) => {\n const ids = new Set<string>()\n const pattern = /<!--ec:c:([^:]+):start-->/g\n for (const match of html.matchAll(pattern)) {\n const id = match[1]\n if (id) {\n ids.add(id)\n }\n }\n return ids\n}\n\nconst createStreamingResumePayload = (\n container: RuntimeContainer,\n renderedComponentIds: Set<string>,\n): ResumePayload => toResumePayloadSubset(container, ['$root', ...renderedComponentIds])\n\nexport const renderSSR = (\n render: () => JSX.Element | JSX.Element[],\n options?: {\n symbols?: Record<string, string>\n },\n): SSRRenderResult => {\n const { container, result } = beginSSRContainer(options?.symbols ?? {}, render)\n return {\n html: withRuntimeContainer(container, () => renderToString(result)),\n payload: toResumePayload(container),\n }\n}\n\nexport const renderSSRAsync = async (\n render: () => JSX.Element | JSX.Element[],\n options?: {\n context?: Context<any>\n prepare?: (container: RuntimeContainer) => void | Promise<void>\n resolvePendingLoaders?: (container: RuntimeContainer) => void | Promise<boolean>\n symbols?: Record<string, string>\n },\n): Promise<SSRRenderResult> => {\n const asyncSignalSnapshotCache = new Map<string, unknown>()\n const seededLoaderStates = new Map<string, { data: unknown; error: unknown; loaded: boolean }>()\n\n for (let attempt = 0; attempt < 10; attempt += 1) {\n const { container, result } = await beginAsyncSSRContainer(\n options?.symbols ?? {},\n render,\n async (runtimeContainer) => {\n for (const [id, snapshot] of seededLoaderStates) {\n runtimeContainer.loaderStates.set(id, {\n data: snapshot.data,\n error: snapshot.error,\n loaded: snapshot.loaded,\n })\n }\n await options?.prepare?.(runtimeContainer)\n },\n {\n asyncSignalSnapshotCache,\n },\n )\n\n try {\n const html = withRuntimeContainer(container, () => renderToString(result))\n if (container.pendingSuspensePromises.size > 0) {\n await Promise.allSettled([...container.pendingSuspensePromises])\n continue\n }\n asyncSignalSnapshotCache.clear()\n return {\n html,\n payload: toResumePayload(container),\n }\n } catch (error) {\n const { isPendingSsrLoaderError, resolvePendingLoaders } = await import('./loader.ts')\n if (!isPendingSsrLoaderError(error)) {\n throw error\n }\n const resolved = options?.resolvePendingLoaders\n ? await options.resolvePendingLoaders(container)\n : options?.context\n ? await resolvePendingLoaders(container, options.context)\n : false\n if (!resolved) {\n throw error\n }\n seededLoaderStates.clear()\n for (const [id, snapshot] of container.loaderStates) {\n seededLoaderStates.set(id, {\n data: snapshot.data,\n error: snapshot.error,\n loaded: snapshot.loaded,\n })\n }\n }\n }\n\n throw new Error('SSR loader resolution did not converge.')\n}\n\nconst extractBoundaryHtml = (html: string, boundaryId: string) => {\n const startToken = `<!--ec:c:${boundaryId}:start-->`\n const endToken = `<!--ec:c:${boundaryId}:end-->`\n const startIndex = html.indexOf(startToken)\n if (startIndex < 0) {\n return null\n }\n const endIndex = html.indexOf(endToken, startIndex + startToken.length)\n if (endIndex < 0) {\n return null\n }\n return html.slice(startIndex + startToken.length, endIndex)\n}\n\nconst renderStreamingAttempt = async (\n render: () => JSX.Element | JSX.Element[],\n options: {\n context?: Context<any>\n prepare?: (container: RuntimeContainer) => void | Promise<void>\n resolvePendingLoaders?: (container: RuntimeContainer) => void | Promise<boolean>\n symbols?: Record<string, string>\n },\n seededLoaderStates: Map<string, { data: unknown; error: unknown; loaded: boolean }>,\n asyncSignalSnapshotCache: Map<string, unknown>,\n): Promise<{\n container: RuntimeContainer\n html: string\n payload: ResumePayload\n pendingBoundaryIds: string[]\n}> => {\n for (let attempt = 0; attempt < 10; attempt += 1) {\n const { container, result } = await beginAsyncSSRContainer(\n options.symbols ?? {},\n render,\n async (runtimeContainer) => {\n for (const [id, snapshot] of seededLoaderStates) {\n runtimeContainer.loaderStates.set(id, {\n data: snapshot.data,\n error: snapshot.error,\n loaded: snapshot.loaded,\n })\n }\n await options.prepare?.(runtimeContainer)\n },\n {\n asyncSignalSnapshotCache,\n },\n )\n\n try {\n const html = withRuntimeContainer(container, () => renderToString(result))\n const renderedComponentIds = collectRenderedComponentIdsFromHtml(html)\n return {\n container,\n html,\n payload: createStreamingResumePayload(container, renderedComponentIds),\n pendingBoundaryIds: collectPendingSuspenseBoundaryIds(container),\n }\n } catch (error) {\n const { isPendingSsrLoaderError, resolvePendingLoaders } = await import('./loader.ts')\n if (!isPendingSsrLoaderError(error)) {\n throw error\n }\n const resolved = options.resolvePendingLoaders\n ? await options.resolvePendingLoaders(container)\n : options.context\n ? await resolvePendingLoaders(container, options.context)\n : false\n if (!resolved) {\n throw error\n }\n seededLoaderStates.clear()\n for (const [id, snapshot] of container.loaderStates) {\n seededLoaderStates.set(id, {\n data: snapshot.data,\n error: snapshot.error,\n loaded: snapshot.loaded,\n })\n }\n }\n }\n\n throw new Error('SSR loader resolution did not converge.')\n}\n\nexport const renderSSRStream = async (\n render: () => JSX.Element | JSX.Element[],\n options?: {\n context?: Context<any>\n prepare?: (container: RuntimeContainer) => void | Promise<void>\n resolvePendingLoaders?: (container: RuntimeContainer) => void | Promise<boolean>\n symbols?: Record<string, string>\n },\n): Promise<SSRStreamRenderResult> => {\n const asyncSignalSnapshotCache = new Map<string, unknown>()\n const seededLoaderStates = new Map<string, { data: unknown; error: unknown; loaded: boolean }>()\n const initial = await renderStreamingAttempt(\n render,\n options ?? {},\n seededLoaderStates,\n asyncSignalSnapshotCache,\n )\n\n if (initial.pendingBoundaryIds.length === 0) {\n asyncSignalSnapshotCache.clear()\n return {\n chunks: (async function* () {})(),\n html: initial.html,\n payload: initial.payload,\n }\n }\n\n const chunks = (async function* () {\n let current = initial\n\n try {\n while (current.pendingBoundaryIds.length > 0) {\n await Promise.race(\n current.pendingBoundaryIds.map(\n (boundaryId) =>\n current.container.components.get(boundaryId)?.suspensePromise?.then(\n () => boundaryId,\n () => boundaryId,\n ) ?? Promise.resolve(boundaryId),\n ),\n )\n\n const next = await renderStreamingAttempt(\n render,\n options ?? {},\n seededLoaderStates,\n asyncSignalSnapshotCache,\n )\n\n const nextPending = new Set(next.pendingBoundaryIds)\n const completedIds = current.pendingBoundaryIds\n .filter((boundaryId) => !nextPending.has(boundaryId))\n .sort((left, right) => left.split('.').length - right.split('.').length)\n\n for (const boundaryId of completedIds) {\n const boundaryHtml = extractBoundaryHtml(next.html, boundaryId)\n if (boundaryHtml === null) {\n continue\n }\n yield {\n boundaryId,\n html: boundaryHtml,\n payload: next.payload,\n }\n }\n\n current = next\n }\n } finally {\n asyncSignalSnapshotCache.clear()\n }\n })()\n\n return {\n chunks,\n html: initial.html,\n payload: initial.payload,\n }\n}\n\nexport const serializeResumePayload = (payload: ResumePayload) =>\n getResumePayloadScriptContent(payload)\n\nexport const getStreamingResumeBootstrapScriptContent = () =>\n getStreamingResumeBootstrapScriptContentFromRuntime()\n","import type { JSX } from '../../jsx/jsx-runtime.ts'\n\nexport const For = <T>(props: { arr: T[]; fn: (e: T, i: number) => JSX.Element }) => {\n const result: JSX.Element[] = []\n for (let i = 0; i < props.arr.length; i++) {\n result.push(props.fn(props.arr[i], i))\n }\n return result as unknown as JSX.Element\n}\n"],"mappings":";;;;;;AAuBA,MAAM,6BACJ,aACiC;AACjC,KAAI,aAAa,KAAA,EACf;AAEF,KAAI,aAAa,KACf,QAAO;AAET,KAAI,aAAa,MACf,QAAO;AAET,QAAO;;AAGT,MAAM,wBAAwB,QAAiB,UAAmB;CAChE,IAAI,WAAW;AACf,QAAO,OAAO,aAAa,WACzB,YAAW,UAAU;AAGvB,KAAI,MAAM,QAAQ,SAAS,EAAE;AAC3B,OAAK,MAAM,SAAS,SAClB,sBAAqB,QAAQ,MAAM;AAErC;;AAEF,KAAI,aAAa,QAAQ,aAAa,KAAA,KAAa,aAAa,MAC9D;AAEF,KAAI,oBAAoB,MAAM;AAC5B,SAAO,YAAY,SAAS;AAC5B;;AAGF,QAAO,YAAY,SAAS,eAAe,OAAO,SAAS,CAAC,CAAC;;AAG/D,MAAM,wBAAwB,UAAqB;CACjD,MAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,QAAO,aAAa,iBAAiB,GAAG;CACxC,MAAM,eAAe,0BAA0B,MAAM,SAAS;AAE9D,KAAI,MAAM,QACR,QAAO,aAAa,oBAAoB,OAAO;AAEjD,KAAI,aACF,QAAO,aAAa,qBAAqB,aAAa;AAGxD,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,EAAE;AACjD,MACE,SAAS,cACT,SAAS,cACT,SAAS,aACT,UAAU,SACV,UAAU,KAAA,KACV,UAAU,KAEV;AAEF,MAAI,SAAS,SAAS;AACpB,UAAO,YAAY,OAAO,MAAM;AAChC;;AAEF,MAAI,SAAS,WAAW,SAAS,OAAO,UAAU,UAAU;AAC1D,UAAO,aACL,SACA,OAAO,QAAQ,MAAiC,CAC7C,KAAK,CAAC,WAAW,gBAAgB,GAAG,UAAU,IAAI,aAAa,CAC/D,KAAK,KAAK,CACd;AACD;;AAEF,MAAI,UAAU,MAAM;AAClB,UAAO,aAAa,MAAM,GAAG;AAC7B;;AAEF,SAAO,aAAa,MAAM,OAAO,MAAM,CAAC;;AAG1C,sBAAqB,QAAQ,MAAM,SAAS;AAC5C,QAAO;;AAGT,MAAa,OAAO,YAAY,UAAqB;AACnD,KAAI,OAAO,aAAa,YACtB,QAAO,qBAAqB,MAAM;CAGpC,MAAM,eAAe,0BAA0B,MAAM,SAAS;CAC9D,MAAM,YAAqC;EACzC,GAAG;GACF,kBAAkB;EACpB;AAED,KAAI,aACF,WAAU,uBAAuB;AAEnC,KAAI,MAAM,QACR,WAAU,sBAAsB;AAElC,QAAO,UAAU;AACjB,QAAO,UAAU;AAEjB,QAAO;EACL,UAAU;EACV,OAAO;EACP,MAAM;EACP;EACD;AAEF,MAAa,oBAA8B,oBAAoB;AAE/D,MAAa,uBAAoC,uBAAuB;AAExE,MAAa,iBAAwBA,YAAoB;;;ACzHzD,MAAM,oBAAoB,QAAwC;CAChE,MAAM,OACJ,IAAI,eAAA,uBAA6C,IAAI,IAAI,eAAA,iBAAuC;AAClG,KAAI,CAAC,MAAM,YACT,QAAO;AAGT,QAAO,KAAK,MAAM,KAAK,YAAY;;AAGrC,MAAM,oBAAoB,QAAiC;CACzD,MAAM,OAAO,IAAI,eAAe,0BAA0B;AAC1D,KAAI,CAAC,MAAM,YACT,QAAO,EAAE;AAGX,QAAO,KAAK,MAAM,KAAK,YAAY;;AAGrC,MAAM,iBAAiB,QAAoC;AACzD,KAAI,CAAC,IACH;AAGF,KAAI,GAAG,kBAAkB,OAAO,YAAY;AAE1C,MADe,MAAM,2CAA2C,QAAQ,KACzD,SACb,UAAS,QAAQ;GAEnB;;AAGJ,cAAe,OAAO,KAA+C,IAAI;AAEzE,MAAa,kBAAkB,OAAO,SAAiC,aAAa;CAClF,MAAM,MAAM,kBAAkB,WAAW,SAAS,OAAO;CACzD,MAAM,OAAO,kBAAkB,WAAW,IAAI,OAAO;CACrD,MAAM,UAAU,iBAAiB,IAAI;AAErC,KAAI,CAAC,QACH;CAGF,MAAM,YAAY,sBAAsB,MAAM,SAAS,EACrD,eAAe,iBAAiB,IAAI,EACrC,CAAC;AACF,OAAM,kBAAkB,UAAU;AAClC,6BAA4B,UAAU;AACtC,yBAAwB,UAAU;AAClC,MAAK,aAAa,iBAAiB,UAAU;AAC7C,wBAAuB,UAAU;;;;ACpCnC,MAAM,uCAAuC,SAAiB;CAC5D,MAAM,sBAAM,IAAI,KAAa;AAE7B,MAAK,MAAM,SAAS,KAAK,SADT,6BAC0B,EAAE;EAC1C,MAAM,KAAK,MAAM;AACjB,MAAI,GACF,KAAI,IAAI,GAAG;;AAGf,QAAO;;AAGT,MAAM,gCACJ,WACA,yBACkB,sBAAsB,WAAW,CAAC,SAAS,GAAG,qBAAqB,CAAC;AAExF,MAAa,aACX,QACA,YAGoB;CACpB,MAAM,EAAE,WAAW,WAAW,kBAAkB,SAAS,WAAW,EAAE,EAAE,OAAO;AAC/E,QAAO;EACL,MAAM,qBAAqB,iBAAiB,eAAe,OAAO,CAAC;EACnE,SAAS,gBAAgB,UAAU;EACpC;;AAGH,MAAa,iBAAiB,OAC5B,QACA,YAM6B;CAC7B,MAAM,2CAA2B,IAAI,KAAsB;CAC3D,MAAM,qCAAqB,IAAI,KAAiE;AAEhG,MAAK,IAAI,UAAU,GAAG,UAAU,IAAI,WAAW,GAAG;EAChD,MAAM,EAAE,WAAW,WAAW,MAAM,uBAClC,SAAS,WAAW,EAAE,EACtB,QACA,OAAO,qBAAqB;AAC1B,QAAK,MAAM,CAAC,IAAI,aAAa,mBAC3B,kBAAiB,aAAa,IAAI,IAAI;IACpC,MAAM,SAAS;IACf,OAAO,SAAS;IAChB,QAAQ,SAAS;IAClB,CAAC;AAEJ,SAAM,SAAS,UAAU,iBAAiB;KAE5C,EACE,0BACD,CACF;AAED,MAAI;GACF,MAAM,OAAO,qBAAqB,iBAAiB,eAAe,OAAO,CAAC;AAC1E,OAAI,UAAU,wBAAwB,OAAO,GAAG;AAC9C,UAAM,QAAQ,WAAW,CAAC,GAAG,UAAU,wBAAwB,CAAC;AAChE;;AAEF,4BAAyB,OAAO;AAChC,UAAO;IACL;IACA,SAAS,gBAAgB,UAAU;IACpC;WACM,OAAO;GACd,MAAM,EAAE,yBAAyB,0BAA0B,MAAM,OAAO,yBAAA,MAAA,MAAA,EAAA,GAAA;AACxE,OAAI,CAAC,wBAAwB,MAAM,CACjC,OAAM;AAOR,OAAI,EALa,SAAS,wBACtB,MAAM,QAAQ,sBAAsB,UAAU,GAC9C,SAAS,UACP,MAAM,sBAAsB,WAAW,QAAQ,QAAQ,GACvD,OAEJ,OAAM;AAER,sBAAmB,OAAO;AAC1B,QAAK,MAAM,CAAC,IAAI,aAAa,UAAU,aACrC,oBAAmB,IAAI,IAAI;IACzB,MAAM,SAAS;IACf,OAAO,SAAS;IAChB,QAAQ,SAAS;IAClB,CAAC;;;AAKR,OAAM,IAAI,MAAM,0CAA0C;;AAG5D,MAAM,uBAAuB,MAAc,eAAuB;CAChE,MAAM,aAAa,YAAY,WAAW;CAC1C,MAAM,WAAW,YAAY,WAAW;CACxC,MAAM,aAAa,KAAK,QAAQ,WAAW;AAC3C,KAAI,aAAa,EACf,QAAO;CAET,MAAM,WAAW,KAAK,QAAQ,UAAU,aAAa,WAAW,OAAO;AACvE,KAAI,WAAW,EACb,QAAO;AAET,QAAO,KAAK,MAAM,aAAa,WAAW,QAAQ,SAAS;;AAG7D,MAAM,yBAAyB,OAC7B,QACA,SAMA,oBACA,6BAMI;AACJ,MAAK,IAAI,UAAU,GAAG,UAAU,IAAI,WAAW,GAAG;EAChD,MAAM,EAAE,WAAW,WAAW,MAAM,uBAClC,QAAQ,WAAW,EAAE,EACrB,QACA,OAAO,qBAAqB;AAC1B,QAAK,MAAM,CAAC,IAAI,aAAa,mBAC3B,kBAAiB,aAAa,IAAI,IAAI;IACpC,MAAM,SAAS;IACf,OAAO,SAAS;IAChB,QAAQ,SAAS;IAClB,CAAC;AAEJ,SAAM,QAAQ,UAAU,iBAAiB;KAE3C,EACE,0BACD,CACF;AAED,MAAI;GACF,MAAM,OAAO,qBAAqB,iBAAiB,eAAe,OAAO,CAAC;AAE1E,UAAO;IACL;IACA;IACA,SAAS,6BAA6B,WAJX,oCAAoC,KAAK,CAIE;IACtE,oBAAoB,kCAAkC,UAAU;IACjE;WACM,OAAO;GACd,MAAM,EAAE,yBAAyB,0BAA0B,MAAM,OAAO,yBAAA,MAAA,MAAA,EAAA,GAAA;AACxE,OAAI,CAAC,wBAAwB,MAAM,CACjC,OAAM;AAOR,OAAI,EALa,QAAQ,wBACrB,MAAM,QAAQ,sBAAsB,UAAU,GAC9C,QAAQ,UACN,MAAM,sBAAsB,WAAW,QAAQ,QAAQ,GACvD,OAEJ,OAAM;AAER,sBAAmB,OAAO;AAC1B,QAAK,MAAM,CAAC,IAAI,aAAa,UAAU,aACrC,oBAAmB,IAAI,IAAI;IACzB,MAAM,SAAS;IACf,OAAO,SAAS;IAChB,QAAQ,SAAS;IAClB,CAAC;;;AAKR,OAAM,IAAI,MAAM,0CAA0C;;AAG5D,MAAa,kBAAkB,OAC7B,QACA,YAMmC;CACnC,MAAM,2CAA2B,IAAI,KAAsB;CAC3D,MAAM,qCAAqB,IAAI,KAAiE;CAChG,MAAM,UAAU,MAAM,uBACpB,QACA,WAAW,EAAE,EACb,oBACA,yBACD;AAED,KAAI,QAAQ,mBAAmB,WAAW,GAAG;AAC3C,2BAAyB,OAAO;AAChC,SAAO;GACL,SAAS,mBAAmB,KAAK;GACjC,MAAM,QAAQ;GACd,SAAS,QAAQ;GAClB;;AAiDH,QAAO;EACL,SA/Cc,mBAAmB;GACjC,IAAI,UAAU;AAEd,OAAI;AACF,WAAO,QAAQ,mBAAmB,SAAS,GAAG;AAC5C,WAAM,QAAQ,KACZ,QAAQ,mBAAmB,KACxB,eACC,QAAQ,UAAU,WAAW,IAAI,WAAW,EAAE,iBAAiB,WACvD,kBACA,WACP,IAAI,QAAQ,QAAQ,WAAW,CACnC,CACF;KAED,MAAM,OAAO,MAAM,uBACjB,QACA,WAAW,EAAE,EACb,oBACA,yBACD;KAED,MAAM,cAAc,IAAI,IAAI,KAAK,mBAAmB;KACpD,MAAM,eAAe,QAAQ,mBAC1B,QAAQ,eAAe,CAAC,YAAY,IAAI,WAAW,CAAC,CACpD,MAAM,MAAM,UAAU,KAAK,MAAM,IAAI,CAAC,SAAS,MAAM,MAAM,IAAI,CAAC,OAAO;AAE1E,UAAK,MAAM,cAAc,cAAc;MACrC,MAAM,eAAe,oBAAoB,KAAK,MAAM,WAAW;AAC/D,UAAI,iBAAiB,KACnB;AAEF,YAAM;OACJ;OACA,MAAM;OACN,SAAS,KAAK;OACf;;AAGH,eAAU;;aAEJ;AACR,6BAAyB,OAAO;;MAEhC;EAIF,MAAM,QAAQ;EACd,SAAS,QAAQ;EAClB;;AAGH,MAAa,0BAA0B,YACrC,8BAA8B,QAAQ;AAExC,MAAa,iDACXC,4CAAqD;;;AC1SvD,MAAa,OAAU,UAA8D;CACnF,MAAM,SAAwB,EAAE;AAChC,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,IAAI,QAAQ,IACpC,QAAO,KAAK,MAAM,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;AAExC,QAAO"}
package/package.json CHANGED
@@ -1,4 +1,67 @@
1
1
  {
2
- "name": "eclipsa",
3
- "version": "0.1.0"
4
- }
2
+ "name": "eclipsa",
3
+ "version": "0.2.0-alpha.0",
4
+ "homepage": "https://github.com/pnsk-lab/eclipsa",
5
+ "bugs": {
6
+ "url": "https://github.com/pnsk-lab/eclipsa/issues"
7
+ },
8
+ "license": "none",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/pnsk-lab/eclipsa.git",
12
+ "directory": "packages/eclipsa"
13
+ },
14
+ "type": "module",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./mod.d.mts",
18
+ "import": "./mod.mjs"
19
+ },
20
+ "./vite": {
21
+ "types": "./vite/mod.d.mts",
22
+ "import": "./vite/mod.mjs"
23
+ },
24
+ "./jsx-runtime": {
25
+ "types": "./jsx/jsx-runtime.d.mts",
26
+ "import": "./jsx/jsx-runtime.mjs"
27
+ },
28
+ "./jsx-dev-runtime": {
29
+ "types": "./jsx/jsx-dev-runtime.d.mts",
30
+ "import": "./jsx/jsx-dev-runtime.mjs"
31
+ },
32
+ "./jsx": {
33
+ "types": "./jsx/mod.d.mts",
34
+ "import": "./jsx/mod.mjs"
35
+ },
36
+ "./internal": {
37
+ "types": "./core/internal.d.mts",
38
+ "import": "./core/internal.mjs"
39
+ },
40
+ "./client": {
41
+ "types": "./core/client/mod.d.mts",
42
+ "import": "./core/client/mod.mjs"
43
+ },
44
+ "./dev-client": {
45
+ "types": "./core/dev-client/mod.d.mts",
46
+ "import": "./core/dev-client/mod.mjs"
47
+ },
48
+ "./prod-client": {
49
+ "types": "./core/prod-client/mod.d.mts",
50
+ "import": "./core/prod-client/mod.mjs"
51
+ }
52
+ },
53
+ "dependencies": {
54
+ "@babel/core": "^7.25.8",
55
+ "@babel/plugin-syntax-jsx": "^7.25.7",
56
+ "@babel/plugin-transform-react-jsx": "^7.25.7",
57
+ "@babel/traverse": "^7.25.7",
58
+ "@babel/types": "^7.25.8",
59
+ "babel-plugin-jsx-dom-expressions": "^0.39.2",
60
+ "fast-glob": "^3.3.2",
61
+ "hono": "^4.6.4"
62
+ },
63
+ "peerDependencies": {
64
+ "vite": "*"
65
+ },
66
+ "private": false
67
+ }
@@ -0,0 +1,6 @@
1
+ //#region core/resume-hmr.ts
2
+ const RESUME_HMR_EVENT = "eclipsa:resume-update";
3
+ //#endregion
4
+ export { RESUME_HMR_EVENT as t };
5
+
6
+ //# sourceMappingURL=resume-hmr-BRDojQNp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-hmr-BRDojQNp.mjs","names":[],"sources":["../core/resume-hmr.ts"],"sourcesContent":["export const RESUME_HMR_EVENT = 'eclipsa:resume-update'\n\nexport interface ResumeHmrUpdatePayload {\n fileUrl: string\n fullReload: boolean\n rerenderComponentSymbols: string[]\n rerenderOwnerSymbols: string[]\n symbolUrlReplacements: Record<string, string>\n}\n"],"mappings":";AAAA,MAAa,mBAAmB"}
@@ -0,0 +1,103 @@
1
+ import { i as jsxDEV } from "./jsx-dev-runtime-CY60yQJY.mjs";
2
+ //#region core/metadata.ts
3
+ const ROUTE_METADATA_HEAD_ATTR = "data-e-metadata";
4
+ const mergeDefined = (parent, child) => {
5
+ if (!parent) return child;
6
+ if (!child) return parent;
7
+ return Object.fromEntries([...new Set([...Object.keys(parent), ...Object.keys(child)])].flatMap((key) => {
8
+ const value = child[key];
9
+ return value === void 0 ? [[key, parent[key]]] : [[key, value]];
10
+ }));
11
+ };
12
+ const mergeRouteMetadata = (parent, child) => {
13
+ if (!parent) return child;
14
+ if (!child) return parent;
15
+ return {
16
+ canonical: child.canonical ?? parent.canonical,
17
+ description: child.description ?? parent.description,
18
+ openGraph: mergeDefined(parent.openGraph, child.openGraph),
19
+ title: child.title ?? parent.title,
20
+ twitter: mergeDefined(parent.twitter, child.twitter)
21
+ };
22
+ };
23
+ const resolveRouteMetadata = (value, ctx) => {
24
+ if (!value) return null;
25
+ return (typeof value === "function" ? value(ctx) : value) ?? null;
26
+ };
27
+ const composeRouteMetadata = (values, ctx) => values.reduce((current, value) => mergeRouteMetadata(current, resolveRouteMetadata(value, ctx)), null);
28
+ const renderRouteMetadataHead = (metadata) => {
29
+ if (!metadata) return [];
30
+ const elements = [];
31
+ if (metadata.title) elements.push(jsxDEV("title", {
32
+ [ROUTE_METADATA_HEAD_ATTR]: "",
33
+ children: metadata.title
34
+ }, null, true, {}));
35
+ if (metadata.description) elements.push(jsxDEV("meta", {
36
+ [ROUTE_METADATA_HEAD_ATTR]: "",
37
+ content: metadata.description,
38
+ name: "description"
39
+ }, null, true, {}));
40
+ if (metadata.canonical) elements.push(jsxDEV("link", {
41
+ [ROUTE_METADATA_HEAD_ATTR]: "",
42
+ href: metadata.canonical,
43
+ rel: "canonical"
44
+ }, null, true, {}));
45
+ if (metadata.openGraph?.title) elements.push(jsxDEV("meta", {
46
+ [ROUTE_METADATA_HEAD_ATTR]: "",
47
+ content: metadata.openGraph.title,
48
+ property: "og:title"
49
+ }, null, true, {}));
50
+ if (metadata.openGraph?.description) elements.push(jsxDEV("meta", {
51
+ [ROUTE_METADATA_HEAD_ATTR]: "",
52
+ content: metadata.openGraph.description,
53
+ property: "og:description"
54
+ }, null, true, {}));
55
+ if (metadata.openGraph?.type) elements.push(jsxDEV("meta", {
56
+ [ROUTE_METADATA_HEAD_ATTR]: "",
57
+ content: metadata.openGraph.type,
58
+ property: "og:type"
59
+ }, null, true, {}));
60
+ if (metadata.openGraph?.url) elements.push(jsxDEV("meta", {
61
+ [ROUTE_METADATA_HEAD_ATTR]: "",
62
+ content: metadata.openGraph.url,
63
+ property: "og:url"
64
+ }, null, true, {}));
65
+ for (const image of metadata.openGraph?.images ?? []) elements.push(jsxDEV("meta", {
66
+ [ROUTE_METADATA_HEAD_ATTR]: "",
67
+ content: image,
68
+ property: "og:image"
69
+ }, image, true, {}));
70
+ if (metadata.twitter?.card) elements.push(jsxDEV("meta", {
71
+ [ROUTE_METADATA_HEAD_ATTR]: "",
72
+ content: metadata.twitter.card,
73
+ name: "twitter:card"
74
+ }, null, true, {}));
75
+ if (metadata.twitter?.title) elements.push(jsxDEV("meta", {
76
+ [ROUTE_METADATA_HEAD_ATTR]: "",
77
+ content: metadata.twitter.title,
78
+ name: "twitter:title"
79
+ }, null, true, {}));
80
+ if (metadata.twitter?.description) elements.push(jsxDEV("meta", {
81
+ [ROUTE_METADATA_HEAD_ATTR]: "",
82
+ content: metadata.twitter.description,
83
+ name: "twitter:description"
84
+ }, null, true, {}));
85
+ for (const image of metadata.twitter?.images ?? []) elements.push(jsxDEV("meta", {
86
+ [ROUTE_METADATA_HEAD_ATTR]: "",
87
+ content: image,
88
+ name: "twitter:image"
89
+ }, image, true, {}));
90
+ return elements;
91
+ };
92
+ //#endregion
93
+ //#region core/router-shared.ts
94
+ const ROUTE_LINK_ATTR = "data-e-link";
95
+ const ROUTE_MANIFEST_ELEMENT_ID = "eclipsa-route-manifest";
96
+ const ROUTE_PREFETCH_ATTR = "data-e-link-prefetch";
97
+ const ROUTE_PREFLIGHT_ENDPOINT = "/__eclipsa/route-preflight";
98
+ const ROUTE_PREFLIGHT_REQUEST_HEADER = "x-eclipsa-route-preflight";
99
+ const ROUTE_REPLACE_ATTR = "data-e-link-replace";
100
+ //#endregion
101
+ export { ROUTE_PREFLIGHT_REQUEST_HEADER as a, composeRouteMetadata as c, ROUTE_PREFLIGHT_ENDPOINT as i, renderRouteMetadataHead as l, ROUTE_MANIFEST_ELEMENT_ID as n, ROUTE_REPLACE_ATTR as o, ROUTE_PREFETCH_ATTR as r, ROUTE_METADATA_HEAD_ATTR as s, ROUTE_LINK_ATTR as t, resolveRouteMetadata as u };
102
+
103
+ //# sourceMappingURL=router-shared-Y6ck-Mcm.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-shared-Y6ck-Mcm.mjs","names":[],"sources":["../core/metadata.ts","../core/router-shared.ts"],"sourcesContent":["import { jsxDEV } from '../jsx/jsx-dev-runtime.ts'\nimport type { JSX } from '../jsx/jsx-runtime.ts'\nimport type { RouteParams } from './router-shared.ts'\n\nexport const ROUTE_METADATA_HEAD_ATTR = 'data-e-metadata'\n\nexport interface MetadataContext {\n params: RouteParams\n url: URL\n}\n\nexport interface OpenGraphMetadata {\n description?: string\n images?: string[]\n title?: string\n type?: string\n url?: string\n}\n\nexport interface TwitterMetadata {\n card?: string\n description?: string\n images?: string[]\n title?: string\n}\n\nexport interface RouteMetadata {\n canonical?: string\n description?: string\n openGraph?: OpenGraphMetadata\n title?: string\n twitter?: TwitterMetadata\n}\n\nexport type RouteMetadataValue = RouteMetadata | null | undefined\nexport type RouteMetadataResolver = (ctx: MetadataContext) => RouteMetadataValue\nexport type RouteMetadataExport = RouteMetadataValue | RouteMetadataResolver\n\nconst mergeDefined = <T extends object>(parent: T | undefined, child: T | undefined) => {\n if (!parent) {\n return child\n }\n if (!child) {\n return parent\n }\n return Object.fromEntries(\n [...new Set([...Object.keys(parent), ...Object.keys(child)])].flatMap((key) => {\n const value = (child as Record<string, unknown>)[key]\n return value === undefined\n ? [[key, (parent as Record<string, unknown>)[key]]]\n : [[key, value]]\n }),\n ) as T\n}\n\nconst mergeRouteMetadata = (parent: RouteMetadata | null, child: RouteMetadata | null) => {\n if (!parent) {\n return child\n }\n if (!child) {\n return parent\n }\n\n return {\n canonical: child.canonical ?? parent.canonical,\n description: child.description ?? parent.description,\n openGraph: mergeDefined(parent.openGraph, child.openGraph),\n title: child.title ?? parent.title,\n twitter: mergeDefined(parent.twitter, child.twitter),\n } satisfies RouteMetadata\n}\n\nexport const resolveRouteMetadata = (\n value: RouteMetadataExport,\n ctx: MetadataContext,\n): RouteMetadata | null => {\n if (!value) {\n return null\n }\n const resolved = typeof value === 'function' ? value(ctx) : value\n return resolved ?? null\n}\n\nexport const composeRouteMetadata = (\n values: RouteMetadataExport[],\n ctx: MetadataContext,\n): RouteMetadata | null =>\n values.reduce<RouteMetadata | null>(\n (current, value) => mergeRouteMetadata(current, resolveRouteMetadata(value, ctx)),\n null,\n )\n\nexport const renderRouteMetadataHead = (metadata: RouteMetadata | null): JSX.Element[] => {\n if (!metadata) {\n return []\n }\n\n const elements: JSX.Element[] = []\n\n if (metadata.title) {\n elements.push(\n jsxDEV(\n 'title',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n children: metadata.title,\n },\n null,\n true,\n {},\n ),\n )\n }\n\n if (metadata.description) {\n elements.push(\n jsxDEV(\n 'meta',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n content: metadata.description,\n name: 'description',\n },\n null,\n true,\n {},\n ),\n )\n }\n\n if (metadata.canonical) {\n elements.push(\n jsxDEV(\n 'link',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n href: metadata.canonical,\n rel: 'canonical',\n },\n null,\n true,\n {},\n ),\n )\n }\n\n if (metadata.openGraph?.title) {\n elements.push(\n jsxDEV(\n 'meta',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n content: metadata.openGraph.title,\n property: 'og:title',\n },\n null,\n true,\n {},\n ),\n )\n }\n if (metadata.openGraph?.description) {\n elements.push(\n jsxDEV(\n 'meta',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n content: metadata.openGraph.description,\n property: 'og:description',\n },\n null,\n true,\n {},\n ),\n )\n }\n if (metadata.openGraph?.type) {\n elements.push(\n jsxDEV(\n 'meta',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n content: metadata.openGraph.type,\n property: 'og:type',\n },\n null,\n true,\n {},\n ),\n )\n }\n if (metadata.openGraph?.url) {\n elements.push(\n jsxDEV(\n 'meta',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n content: metadata.openGraph.url,\n property: 'og:url',\n },\n null,\n true,\n {},\n ),\n )\n }\n for (const image of metadata.openGraph?.images ?? []) {\n elements.push(\n jsxDEV(\n 'meta',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n content: image,\n property: 'og:image',\n },\n image,\n true,\n {},\n ),\n )\n }\n\n if (metadata.twitter?.card) {\n elements.push(\n jsxDEV(\n 'meta',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n content: metadata.twitter.card,\n name: 'twitter:card',\n },\n null,\n true,\n {},\n ),\n )\n }\n if (metadata.twitter?.title) {\n elements.push(\n jsxDEV(\n 'meta',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n content: metadata.twitter.title,\n name: 'twitter:title',\n },\n null,\n true,\n {},\n ),\n )\n }\n if (metadata.twitter?.description) {\n elements.push(\n jsxDEV(\n 'meta',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n content: metadata.twitter.description,\n name: 'twitter:description',\n },\n null,\n true,\n {},\n ),\n )\n }\n for (const image of metadata.twitter?.images ?? []) {\n elements.push(\n jsxDEV(\n 'meta',\n {\n [ROUTE_METADATA_HEAD_ATTR]: '',\n content: image,\n name: 'twitter:image',\n },\n image,\n true,\n {},\n ),\n )\n }\n\n return elements\n}\n","export const ROUTE_LINK_ATTR = 'data-e-link'\nexport const ROUTE_MANIFEST_ELEMENT_ID = 'eclipsa-route-manifest'\nexport const ROUTE_PREFETCH_ATTR = 'data-e-link-prefetch'\nexport const ROUTE_PREFLIGHT_ENDPOINT = '/__eclipsa/route-preflight'\nexport const ROUTE_PREFLIGHT_REQUEST_HEADER = 'x-eclipsa-route-preflight'\nexport const ROUTE_REPLACE_ATTR = 'data-e-link-replace'\n\nexport interface NavigateOptions {\n replace?: boolean\n}\n\nexport interface Navigate {\n (href: string, options?: NavigateOptions): Promise<void>\n readonly isNavigating: boolean\n}\n\nexport type LinkPrefetchMode = 'focus' | 'hover' | 'intent' | 'none'\n\nexport type RouteParams = Record<string, string | string[] | undefined>\n\nexport interface RoutePathSegment {\n kind: 'static' | 'required' | 'optional' | 'rest'\n value: string\n}\n\nexport interface RouteModuleManifest {\n error: string | null\n hasMiddleware: boolean\n layouts: string[]\n loading: string | null\n notFound: string | null\n page: string | null\n routePath: string\n segments: RoutePathSegment[]\n server: string | null\n}\n\nexport type RouteManifest = RouteModuleManifest[]\n"],"mappings":"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"}