@flightdev/core 0.6.7

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 (187) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +541 -0
  3. package/dist/actions/index.d.ts +743 -0
  4. package/dist/actions/index.js +3 -0
  5. package/dist/actions/index.js.map +1 -0
  6. package/dist/adapters/index.d.ts +502 -0
  7. package/dist/adapters/index.js +3 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/cache/index.d.ts +191 -0
  10. package/dist/cache/index.js +3 -0
  11. package/dist/cache/index.js.map +1 -0
  12. package/dist/chunk-62HISNA3.js +354 -0
  13. package/dist/chunk-62HISNA3.js.map +1 -0
  14. package/dist/chunk-63LWTEDQ.js +341 -0
  15. package/dist/chunk-63LWTEDQ.js.map +1 -0
  16. package/dist/chunk-63SCEXD7.js +3 -0
  17. package/dist/chunk-63SCEXD7.js.map +1 -0
  18. package/dist/chunk-72MYOTUB.js +667 -0
  19. package/dist/chunk-72MYOTUB.js.map +1 -0
  20. package/dist/chunk-7CNW24MQ.js +257 -0
  21. package/dist/chunk-7CNW24MQ.js.map +1 -0
  22. package/dist/chunk-7WIEAUJT.js +300 -0
  23. package/dist/chunk-7WIEAUJT.js.map +1 -0
  24. package/dist/chunk-7ZZF4ULK.js +259 -0
  25. package/dist/chunk-7ZZF4ULK.js.map +1 -0
  26. package/dist/chunk-AE3JTS73.js +222 -0
  27. package/dist/chunk-AE3JTS73.js.map +1 -0
  28. package/dist/chunk-AP5NLUSB.js +258 -0
  29. package/dist/chunk-AP5NLUSB.js.map +1 -0
  30. package/dist/chunk-C37YQQI7.js +221 -0
  31. package/dist/chunk-C37YQQI7.js.map +1 -0
  32. package/dist/chunk-DCLVXFVH.js +225 -0
  33. package/dist/chunk-DCLVXFVH.js.map +1 -0
  34. package/dist/chunk-DZMWWDFD.js +223 -0
  35. package/dist/chunk-DZMWWDFD.js.map +1 -0
  36. package/dist/chunk-GCQZ4FHI.js +245 -0
  37. package/dist/chunk-GCQZ4FHI.js.map +1 -0
  38. package/dist/chunk-IPP44XY6.js +47 -0
  39. package/dist/chunk-IPP44XY6.js.map +1 -0
  40. package/dist/chunk-IW7FTQQX.js +267 -0
  41. package/dist/chunk-IW7FTQQX.js.map +1 -0
  42. package/dist/chunk-JX4YSCBH.js +428 -0
  43. package/dist/chunk-JX4YSCBH.js.map +1 -0
  44. package/dist/chunk-KX6UYWWR.js +229 -0
  45. package/dist/chunk-KX6UYWWR.js.map +1 -0
  46. package/dist/chunk-LWVETFJV.js +46 -0
  47. package/dist/chunk-LWVETFJV.js.map +1 -0
  48. package/dist/chunk-MCL2MCA2.js +285 -0
  49. package/dist/chunk-MCL2MCA2.js.map +1 -0
  50. package/dist/chunk-MZXCF35B.js +205 -0
  51. package/dist/chunk-MZXCF35B.js.map +1 -0
  52. package/dist/chunk-NCGPUFWV.js +96 -0
  53. package/dist/chunk-NCGPUFWV.js.map +1 -0
  54. package/dist/chunk-OEJMIE2Q.js +351 -0
  55. package/dist/chunk-OEJMIE2Q.js.map +1 -0
  56. package/dist/chunk-OYF2OAKS.js +394 -0
  57. package/dist/chunk-OYF2OAKS.js.map +1 -0
  58. package/dist/chunk-P6S43FYZ.js +316 -0
  59. package/dist/chunk-P6S43FYZ.js.map +1 -0
  60. package/dist/chunk-PL37KFRJ.js +3 -0
  61. package/dist/chunk-PL37KFRJ.js.map +1 -0
  62. package/dist/chunk-Q7BS5QC5.js +197 -0
  63. package/dist/chunk-Q7BS5QC5.js.map +1 -0
  64. package/dist/chunk-SDYPG3JD.js +288 -0
  65. package/dist/chunk-SDYPG3JD.js.map +1 -0
  66. package/dist/chunk-SUG56SZO.js +256 -0
  67. package/dist/chunk-SUG56SZO.js.map +1 -0
  68. package/dist/chunk-UVH5XJRP.js +164 -0
  69. package/dist/chunk-UVH5XJRP.js.map +1 -0
  70. package/dist/chunk-WZIJKCL3.js +282 -0
  71. package/dist/chunk-WZIJKCL3.js.map +1 -0
  72. package/dist/chunk-Y22AMGTM.js +3 -0
  73. package/dist/chunk-Y22AMGTM.js.map +1 -0
  74. package/dist/chunk-Z7G23XWU.js +200 -0
  75. package/dist/chunk-Z7G23XWU.js.map +1 -0
  76. package/dist/chunk-ZJU5M4IB.js +125 -0
  77. package/dist/chunk-ZJU5M4IB.js.map +1 -0
  78. package/dist/chunk-ZVC3ZWLM.js +52 -0
  79. package/dist/chunk-ZVC3ZWLM.js.map +1 -0
  80. package/dist/chunk-ZZZML7Y3.js +310 -0
  81. package/dist/chunk-ZZZML7Y3.js.map +1 -0
  82. package/dist/client.d.ts +25 -0
  83. package/dist/client.js +16 -0
  84. package/dist/client.js.map +1 -0
  85. package/dist/config/index.d.ts +170 -0
  86. package/dist/config/index.js +3 -0
  87. package/dist/config/index.js.map +1 -0
  88. package/dist/errors/index.d.ts +267 -0
  89. package/dist/errors/index.js +4 -0
  90. package/dist/errors/index.js.map +1 -0
  91. package/dist/file-router/index.d.ts +184 -0
  92. package/dist/file-router/index.js +3 -0
  93. package/dist/file-router/index.js.map +1 -0
  94. package/dist/file-router/streaming-hints.d.ts +129 -0
  95. package/dist/file-router/streaming-hints.js +3 -0
  96. package/dist/file-router/streaming-hints.js.map +1 -0
  97. package/dist/handlers/index.d.ts +59 -0
  98. package/dist/handlers/index.js +3 -0
  99. package/dist/handlers/index.js.map +1 -0
  100. package/dist/index.d.ts +588 -0
  101. package/dist/index.js +886 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/islands/index.d.ts +234 -0
  104. package/dist/islands/index.js +3 -0
  105. package/dist/islands/index.js.map +1 -0
  106. package/dist/middleware/index.d.ts +305 -0
  107. package/dist/middleware/index.js +3 -0
  108. package/dist/middleware/index.js.map +1 -0
  109. package/dist/react/index.d.ts +73 -0
  110. package/dist/react/index.js +52 -0
  111. package/dist/react/index.js.map +1 -0
  112. package/dist/render/index.d.ts +131 -0
  113. package/dist/render/index.js +3 -0
  114. package/dist/render/index.js.map +1 -0
  115. package/dist/router/index.d.ts +65 -0
  116. package/dist/router/index.js +3 -0
  117. package/dist/router/index.js.map +1 -0
  118. package/dist/rsc/adapters/index.d.ts +8 -0
  119. package/dist/rsc/adapters/index.js +7 -0
  120. package/dist/rsc/adapters/index.js.map +1 -0
  121. package/dist/rsc/adapters/preact.d.ts +97 -0
  122. package/dist/rsc/adapters/preact.js +3 -0
  123. package/dist/rsc/adapters/preact.js.map +1 -0
  124. package/dist/rsc/adapters/react.d.ts +82 -0
  125. package/dist/rsc/adapters/react.js +3 -0
  126. package/dist/rsc/adapters/react.js.map +1 -0
  127. package/dist/rsc/adapters/solid.d.ts +84 -0
  128. package/dist/rsc/adapters/solid.js +3 -0
  129. package/dist/rsc/adapters/solid.js.map +1 -0
  130. package/dist/rsc/adapters/vue.d.ts +80 -0
  131. package/dist/rsc/adapters/vue.js +3 -0
  132. package/dist/rsc/adapters/vue.js.map +1 -0
  133. package/dist/rsc/boundaries.d.ts +182 -0
  134. package/dist/rsc/boundaries.js +3 -0
  135. package/dist/rsc/boundaries.js.map +1 -0
  136. package/dist/rsc/context.d.ts +201 -0
  137. package/dist/rsc/context.js +3 -0
  138. package/dist/rsc/context.js.map +1 -0
  139. package/dist/rsc/index.d.ts +232 -0
  140. package/dist/rsc/index.js +15 -0
  141. package/dist/rsc/index.js.map +1 -0
  142. package/dist/rsc/legacy.d.ts +155 -0
  143. package/dist/rsc/legacy.js +3 -0
  144. package/dist/rsc/legacy.js.map +1 -0
  145. package/dist/rsc/payload.d.ts +262 -0
  146. package/dist/rsc/payload.js +3 -0
  147. package/dist/rsc/payload.js.map +1 -0
  148. package/dist/rsc/plugins/esbuild.d.ts +124 -0
  149. package/dist/rsc/plugins/esbuild.js +4 -0
  150. package/dist/rsc/plugins/esbuild.js.map +1 -0
  151. package/dist/rsc/plugins/index.d.ts +4 -0
  152. package/dist/rsc/plugins/index.js +6 -0
  153. package/dist/rsc/plugins/index.js.map +1 -0
  154. package/dist/rsc/plugins/rollup.d.ts +103 -0
  155. package/dist/rsc/plugins/rollup.js +4 -0
  156. package/dist/rsc/plugins/rollup.js.map +1 -0
  157. package/dist/rsc/renderer.d.ts +162 -0
  158. package/dist/rsc/renderer.js +5 -0
  159. package/dist/rsc/renderer.js.map +1 -0
  160. package/dist/rsc/stream.d.ts +129 -0
  161. package/dist/rsc/stream.js +3 -0
  162. package/dist/rsc/stream.js.map +1 -0
  163. package/dist/rsc/vite-plugin.d.ts +78 -0
  164. package/dist/rsc/vite-plugin.js +4 -0
  165. package/dist/rsc/vite-plugin.js.map +1 -0
  166. package/dist/server/index.d.ts +135 -0
  167. package/dist/server/index.js +6 -0
  168. package/dist/server/index.js.map +1 -0
  169. package/dist/streaming/adapters/index.d.ts +223 -0
  170. package/dist/streaming/adapters/index.js +3 -0
  171. package/dist/streaming/adapters/index.js.map +1 -0
  172. package/dist/streaming/conditional.d.ts +130 -0
  173. package/dist/streaming/conditional.js +3 -0
  174. package/dist/streaming/conditional.js.map +1 -0
  175. package/dist/streaming/index.d.ts +177 -0
  176. package/dist/streaming/index.js +3 -0
  177. package/dist/streaming/index.js.map +1 -0
  178. package/dist/streaming/observability.d.ts +201 -0
  179. package/dist/streaming/observability.js +4 -0
  180. package/dist/streaming/observability.js.map +1 -0
  181. package/dist/streaming/priority.d.ts +103 -0
  182. package/dist/streaming/priority.js +3 -0
  183. package/dist/streaming/priority.js.map +1 -0
  184. package/dist/utils/index.d.ts +42 -0
  185. package/dist/utils/index.js +4 -0
  186. package/dist/utils/index.js.map +1 -0
  187. package/package.json +228 -0
@@ -0,0 +1,229 @@
1
+ // src/rsc/adapters/preact.ts
2
+ var CLIENT_REFERENCE = /* @__PURE__ */ Symbol.for("flight.client.reference");
3
+ function createPreactAdapter(deps) {
4
+ const { preact, renderToString } = deps || {};
5
+ return {
6
+ name: "preact",
7
+ isElement(value) {
8
+ if (preact?.isValidElement) {
9
+ return preact.isValidElement(value);
10
+ }
11
+ return typeof value === "object" && value !== null && "type" in value && "props" in value;
12
+ },
13
+ getElementType(element) {
14
+ const vnode = element;
15
+ const type = vnode.type;
16
+ if (type === null) {
17
+ const props = vnode.props;
18
+ if (typeof props === "string" || typeof props === "number") {
19
+ return { kind: "text", value: String(props) };
20
+ }
21
+ return { kind: "null" };
22
+ }
23
+ if (typeof type === "string") {
24
+ return { kind: "host", tag: type };
25
+ }
26
+ if (type === preact?.Fragment) {
27
+ return { kind: "fragment" };
28
+ }
29
+ if (typeof type === "function") {
30
+ const fn = type;
31
+ if (preact?.Component && type.prototype instanceof preact.Component) {
32
+ return {
33
+ kind: "component",
34
+ fn: (props) => {
35
+ const Component = type;
36
+ const instance = new Component(props);
37
+ return instance.render();
38
+ },
39
+ name: fn.displayName || fn.name || "PreactComponent"
40
+ };
41
+ }
42
+ return {
43
+ kind: "component",
44
+ fn,
45
+ name: fn.displayName || fn.name || "Component"
46
+ };
47
+ }
48
+ return { kind: "null" };
49
+ },
50
+ getProps(element) {
51
+ return element.props || {};
52
+ },
53
+ getChildren(element) {
54
+ const props = element.props;
55
+ const children = props?.children;
56
+ if (children === void 0 || children === null) {
57
+ return [];
58
+ }
59
+ if (Array.isArray(children)) {
60
+ return children.flat();
61
+ }
62
+ return [children];
63
+ },
64
+ getKey(element) {
65
+ const key = element.key;
66
+ return key !== null ? key : void 0;
67
+ },
68
+ isClientBoundary(component) {
69
+ if (typeof component !== "function") return false;
70
+ const comp = component;
71
+ if (comp.__flight_client === true) return true;
72
+ if (comp.$$typeof === CLIENT_REFERENCE) return true;
73
+ return false;
74
+ },
75
+ createElement(component, props) {
76
+ if (preact?.h) {
77
+ return preact.h(component, props);
78
+ }
79
+ return {
80
+ type: component,
81
+ props,
82
+ key: null,
83
+ ref: null
84
+ };
85
+ },
86
+ async renderToString(element) {
87
+ if (renderToString) {
88
+ return renderToString(element);
89
+ }
90
+ throw new Error(
91
+ "renderToString not provided. Pass preact-render-to-string when creating the adapter: createPreactAdapter({ preact, renderToString })"
92
+ );
93
+ }
94
+ };
95
+ }
96
+ function createPreactConsumer(deps, options = {}) {
97
+ const { preact } = deps;
98
+ const { registry = /* @__PURE__ */ new Map() } = options;
99
+ return {
100
+ /**
101
+ * Register a client component
102
+ */
103
+ register(id, loader) {
104
+ registry.set(id, loader);
105
+ },
106
+ /**
107
+ * Convert Flight elements to Preact VNodes
108
+ */
109
+ toPreactElement(element) {
110
+ switch (element.$$type) {
111
+ case "null":
112
+ return null;
113
+ case "text":
114
+ return element.value;
115
+ case "host": {
116
+ const children = element.children.map((c) => this.toPreactElement(c));
117
+ return preact.h(
118
+ element.tag,
119
+ { ...element.props, key: element.key },
120
+ ...children
121
+ );
122
+ }
123
+ case "fragment": {
124
+ const children = element.children.map((c) => this.toPreactElement(c));
125
+ return preact.h(preact.Fragment, null, ...children);
126
+ }
127
+ case "suspense": {
128
+ const children = element.children.map((c) => this.toPreactElement(c));
129
+ return preact.h(preact.Fragment, null, ...children);
130
+ }
131
+ case "client": {
132
+ const loader = registry.get(element.ref);
133
+ if (!loader) {
134
+ console.warn(`[Flight] Client component not registered: ${element.ref}`);
135
+ if (element.ssr) {
136
+ return preact.h("div", {
137
+ dangerouslySetInnerHTML: { __html: element.ssr }
138
+ });
139
+ }
140
+ return null;
141
+ }
142
+ const LazyWrapper = (props) => {
143
+ const loadedRef = { current: null };
144
+ loader().then((mod) => {
145
+ loadedRef.current = mod.default ?? mod;
146
+ });
147
+ if (loadedRef.current) {
148
+ return preact.h(loadedRef.current, props);
149
+ }
150
+ if (element.ssr) {
151
+ return preact.h("div", {
152
+ dangerouslySetInnerHTML: { __html: element.ssr }
153
+ });
154
+ }
155
+ return preact.h("div", { "data-flight-loading": element.ref });
156
+ };
157
+ return preact.h(LazyWrapper, {});
158
+ }
159
+ case "lazy": {
160
+ if (element.fallback) {
161
+ return this.toPreactElement(element.fallback);
162
+ }
163
+ return preact.h("div", { "data-flight-pending": element.id });
164
+ }
165
+ default:
166
+ return null;
167
+ }
168
+ },
169
+ /**
170
+ * Hydrate Flight payload into DOM
171
+ */
172
+ hydrate(chunks, container, hydrateFn) {
173
+ const rootChunk = chunks.find((c) => c.type === "S" && c.id === "root");
174
+ if (!rootChunk || rootChunk.type !== "S") {
175
+ throw new Error("[Flight] No root chunk found");
176
+ }
177
+ for (const chunk of chunks) {
178
+ if (chunk.type === "C") {
179
+ if (!registry.has(chunk.id)) {
180
+ registry.set(chunk.id, () => import(
181
+ /* webpackIgnore: true */
182
+ chunk.module
183
+ ));
184
+ }
185
+ }
186
+ }
187
+ const element = this.toPreactElement(rootChunk.tree);
188
+ if (hydrateFn) {
189
+ hydrateFn(element, container);
190
+ } else {
191
+ const { render } = deps?.preact || {};
192
+ if (render) {
193
+ render(element, container);
194
+ } else {
195
+ throw new Error("[Flight] No hydrate or render function provided");
196
+ }
197
+ }
198
+ }
199
+ };
200
+ }
201
+ function markAsPreactClientComponent(component, moduleId, exportName = "default") {
202
+ const marked = component;
203
+ marked.$$typeof = CLIENT_REFERENCE;
204
+ marked.__flight_client = true;
205
+ marked.__flight_module = moduleId;
206
+ marked.__flight_export = exportName;
207
+ return marked;
208
+ }
209
+ function lazy(loader) {
210
+ let Component = null;
211
+ let promise = null;
212
+ const LazyComponent = ((props) => {
213
+ if (Component) {
214
+ return Component(props);
215
+ }
216
+ if (!promise) {
217
+ promise = loader().then((mod) => {
218
+ Component = mod.default;
219
+ return mod;
220
+ });
221
+ }
222
+ throw promise;
223
+ });
224
+ return LazyComponent;
225
+ }
226
+
227
+ export { createPreactAdapter, createPreactConsumer, lazy, markAsPreactClientComponent };
228
+ //# sourceMappingURL=chunk-KX6UYWWR.js.map
229
+ //# sourceMappingURL=chunk-KX6UYWWR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rsc/adapters/preact.ts"],"names":[],"mappings":"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","file":"chunk-KX6UYWWR.js","sourcesContent":["/**\r\n * @flightdev/core - Preact UI Adapter\r\n * \r\n * Adapter for using Preact with Flight Server Components.\r\n * Enables Flight to render Preact components without tight coupling.\r\n * \r\n * Philosophy: Zero lock-in - Preact is optional, user decides.\r\n * \r\n * @module @flightdev/core/rsc/adapters/preact\r\n */\r\n\r\nimport type { UIAdapter, ElementTypeInfo } from '../renderer.js';\r\n\r\n// ============================================================================\r\n// Preact Symbols\r\n// ============================================================================\r\n\r\n// Flight reference symbols\r\nconst CLIENT_REFERENCE = Symbol.for('flight.client.reference');\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Minimal Preact VNode interface\r\n */\r\ninterface PreactVNode {\r\n type: unknown;\r\n props: Record<string, unknown>;\r\n key: string | number | null;\r\n ref: unknown;\r\n __?: unknown; // parent\r\n __k?: unknown[]; // children\r\n __b?: number; // depth\r\n __e?: unknown; // dom\r\n __c?: unknown; // component\r\n}\r\n\r\n/**\r\n * Preact dependencies (user provides these)\r\n */\r\nexport interface PreactDependencies {\r\n /** preact module */\r\n preact: {\r\n h: (type: unknown, props?: unknown, ...children: unknown[]) => PreactVNode;\r\n Fragment?: unknown;\r\n Component?: unknown;\r\n isValidElement?: (value: unknown) => boolean;\r\n cloneElement?: (vnode: PreactVNode, props?: unknown) => PreactVNode;\r\n };\r\n /** preact-render-to-string module (optional - for SSR) */\r\n renderToString?: (vnode: PreactVNode) => string;\r\n /** preact/hooks module (optional) */\r\n hooks?: {\r\n useState: <T>(initial: T) => [T, (v: T) => void];\r\n useEffect: (fn: () => void | (() => void), deps?: unknown[]) => void;\r\n useMemo: <T>(fn: () => T, deps: unknown[]) => T;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Adapter Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Create Preact UI Adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createPreactAdapter } from '@flightdev/core/rsc/adapters/preact';\r\n * import * as preact from 'preact';\r\n * import renderToString from 'preact-render-to-string';\r\n * \r\n * const adapter = createPreactAdapter({\r\n * preact,\r\n * renderToString,\r\n * });\r\n * \r\n * const renderer = createRenderer(adapter);\r\n * ```\r\n */\r\nexport function createPreactAdapter(deps?: PreactDependencies): UIAdapter {\r\n const { preact, renderToString } = deps || {};\r\n\r\n return {\r\n name: 'preact',\r\n\r\n isElement(value: unknown): boolean {\r\n if (preact?.isValidElement) {\r\n return preact.isValidElement(value);\r\n }\r\n // Fallback: check for VNode structure\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n 'type' in value &&\r\n 'props' in value\r\n );\r\n },\r\n\r\n getElementType(element: unknown): ElementTypeInfo {\r\n const vnode = element as PreactVNode;\r\n const type = vnode.type;\r\n\r\n // Null type (text or null node)\r\n if (type === null) {\r\n const props = vnode.props;\r\n if (typeof props === 'string' || typeof props === 'number') {\r\n return { kind: 'text', value: String(props) };\r\n }\r\n return { kind: 'null' };\r\n }\r\n\r\n // String = host element (div, span, etc.)\r\n if (typeof type === 'string') {\r\n return { kind: 'host', tag: type };\r\n }\r\n\r\n // Fragment\r\n if (type === preact?.Fragment) {\r\n return { kind: 'fragment' };\r\n }\r\n\r\n // Function component\r\n if (typeof type === 'function') {\r\n const fn = type as ((props: Record<string, unknown>) => unknown) & {\r\n displayName?: string;\r\n name?: string;\r\n };\r\n\r\n // Check for class component (extends Component)\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\r\n if (preact?.Component && type.prototype instanceof (preact.Component as unknown as Function)) {\r\n return {\r\n kind: 'component',\r\n fn: (props) => {\r\n // Class components need instantiation\r\n const Component = type as new (props: unknown) => { render: () => unknown };\r\n const instance = new Component(props);\r\n return instance.render();\r\n },\r\n name: fn.displayName || fn.name || 'PreactComponent',\r\n };\r\n }\r\n\r\n return {\r\n kind: 'component',\r\n fn,\r\n name: fn.displayName || fn.name || 'Component'\r\n };\r\n }\r\n\r\n return { kind: 'null' };\r\n },\r\n\r\n getProps(element: unknown): Record<string, unknown> {\r\n return (element as PreactVNode).props || {};\r\n },\r\n\r\n getChildren(element: unknown): unknown[] {\r\n const props = (element as PreactVNode).props;\r\n const children = props?.children;\r\n\r\n if (children === undefined || children === null) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(children)) {\r\n return children.flat();\r\n }\r\n\r\n return [children];\r\n },\r\n\r\n getKey(element: unknown): string | number | undefined {\r\n const key = (element as PreactVNode).key;\r\n return key !== null ? key : undefined;\r\n },\r\n\r\n isClientBoundary(component: unknown): boolean {\r\n if (typeof component !== 'function') return false;\r\n\r\n const comp = component as {\r\n $$typeof?: symbol;\r\n __flight_client?: boolean;\r\n };\r\n\r\n // Check for Flight client marker\r\n if (comp.__flight_client === true) return true;\r\n\r\n // Check for client reference symbol\r\n if (comp.$$typeof === CLIENT_REFERENCE) return true;\r\n\r\n return false;\r\n },\r\n\r\n createElement(\r\n component: (props: Record<string, unknown>) => unknown,\r\n props: Record<string, unknown>\r\n ): unknown {\r\n // Create a Preact VNode using h() if available\r\n if (preact?.h) {\r\n return preact.h(component, props);\r\n }\r\n\r\n // Fallback: create VNode structure directly\r\n return {\r\n type: component,\r\n props,\r\n key: null,\r\n ref: null,\r\n } as PreactVNode;\r\n },\r\n\r\n async renderToString(element: unknown): Promise<string> {\r\n if (renderToString) {\r\n return renderToString(element as PreactVNode);\r\n }\r\n throw new Error(\r\n 'renderToString not provided. Pass preact-render-to-string when creating the adapter: ' +\r\n 'createPreactAdapter({ preact, renderToString })'\r\n );\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Preact Client Consumer\r\n// ============================================================================\r\n\r\n/**\r\n * Options for Preact consumer\r\n */\r\nexport interface PreactConsumerOptions {\r\n /** Registry of client components */\r\n registry?: Map<string, () => Promise<unknown>>;\r\n}\r\n\r\n/**\r\n * Create a Preact client-side consumer for Flight payloads\r\n */\r\nexport function createPreactConsumer(\r\n deps: PreactDependencies,\r\n options: PreactConsumerOptions = {}\r\n) {\r\n const { preact } = deps;\r\n const { registry = new Map() } = options;\r\n\r\n return {\r\n /**\r\n * Register a client component\r\n */\r\n register(id: string, loader: () => Promise<unknown>): void {\r\n registry.set(id, loader);\r\n },\r\n\r\n /**\r\n * Convert Flight elements to Preact VNodes\r\n */\r\n toPreactElement(element: import('../payload.js').FlightElement): unknown {\r\n switch (element.$$type) {\r\n case 'null':\r\n return null;\r\n\r\n case 'text':\r\n return element.value;\r\n\r\n case 'host': {\r\n const children = element.children.map(c => this.toPreactElement(c));\r\n return preact.h(\r\n element.tag,\r\n { ...element.props, key: element.key },\r\n ...children\r\n );\r\n }\r\n\r\n case 'fragment': {\r\n const children = element.children.map(c => this.toPreactElement(c));\r\n return preact.h(preact.Fragment!, null, ...children);\r\n }\r\n\r\n case 'suspense': {\r\n // Preact doesn't have built-in Suspense, use fragment\r\n const children = element.children.map(c => this.toPreactElement(c));\r\n return preact.h(preact.Fragment!, null, ...children);\r\n }\r\n\r\n case 'client': {\r\n const loader = registry.get(element.ref);\r\n if (!loader) {\r\n console.warn(`[Flight] Client component not registered: ${element.ref}`);\r\n if (element.ssr) {\r\n return preact.h('div', {\r\n dangerouslySetInnerHTML: { __html: element.ssr }\r\n });\r\n }\r\n return null;\r\n }\r\n\r\n // Create lazy loading wrapper\r\n // Preact doesn't have React.lazy, so we create a simple async loader\r\n const LazyWrapper = (props: Record<string, unknown>) => {\r\n // This is a simplified version - in production use @preact/signals\r\n // or a state management solution\r\n const loadedRef = { current: null as unknown };\r\n\r\n loader().then((mod: { default?: unknown }) => {\r\n loadedRef.current = mod.default ?? mod;\r\n });\r\n\r\n if (loadedRef.current) {\r\n return preact.h(loadedRef.current as string, props);\r\n }\r\n\r\n // Return SSR placeholder\r\n if (element.ssr) {\r\n return preact.h('div', {\r\n dangerouslySetInnerHTML: { __html: element.ssr }\r\n });\r\n }\r\n\r\n return preact.h('div', { 'data-flight-loading': element.ref });\r\n };\r\n\r\n return preact.h(LazyWrapper, {});\r\n }\r\n\r\n case 'lazy': {\r\n if (element.fallback) {\r\n return this.toPreactElement(element.fallback);\r\n }\r\n return preact.h('div', { 'data-flight-pending': element.id });\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n },\r\n\r\n /**\r\n * Hydrate Flight payload into DOM\r\n */\r\n hydrate(\r\n chunks: import('../payload.js').FlightChunk[],\r\n container: Element,\r\n hydrateFn?: (vnode: unknown, container: Element) => void\r\n ): void {\r\n const rootChunk = chunks.find(c => c.type === 'S' && c.id === 'root');\r\n if (!rootChunk || rootChunk.type !== 'S') {\r\n throw new Error('[Flight] No root chunk found');\r\n }\r\n\r\n // Register client components\r\n for (const chunk of chunks) {\r\n if (chunk.type === 'C') {\r\n if (!registry.has(chunk.id)) {\r\n registry.set(chunk.id, () => import(/* webpackIgnore: true */ chunk.module));\r\n }\r\n }\r\n }\r\n\r\n const element = this.toPreactElement(rootChunk.tree);\r\n\r\n if (hydrateFn) {\r\n hydrateFn(element, container);\r\n } else {\r\n // Fallback: use preact.render (not ideal for SSR)\r\n const { render } = deps?.preact as { render?: (vnode: unknown, container: Element) => void } || {};\r\n if (render) {\r\n render(element, container);\r\n } else {\r\n throw new Error('[Flight] No hydrate or render function provided');\r\n }\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Types\r\n// ============================================================================\r\n\r\n/**\r\n * Type helper for Preact Server Component\r\n */\r\nexport type PreactServerComponent<P = Record<string, unknown>> = (\r\n props: P,\r\n ctx: import('../context.js').ServerContext\r\n) => Promise<PreactVNode> | PreactVNode;\r\n\r\n/**\r\n * Mark a Preact component as a client component\r\n */\r\nexport function markAsPreactClientComponent<T extends (...args: unknown[]) => unknown>(\r\n component: T,\r\n moduleId: string,\r\n exportName = 'default'\r\n): T {\r\n const marked = component as T & {\r\n $$typeof: symbol;\r\n __flight_client: boolean;\r\n __flight_module: string;\r\n __flight_export: string;\r\n };\r\n\r\n marked.$$typeof = CLIENT_REFERENCE;\r\n marked.__flight_client = true;\r\n marked.__flight_module = moduleId;\r\n marked.__flight_export = exportName;\r\n\r\n return marked;\r\n}\r\n\r\n/**\r\n * Create a lazy-loading component for Preact\r\n */\r\nexport function lazy<T extends (...args: unknown[]) => unknown>(\r\n loader: () => Promise<{ default: T }>\r\n): T {\r\n let Component: T | null = null;\r\n let promise: Promise<{ default: T }> | null = null;\r\n\r\n const LazyComponent = ((props: unknown) => {\r\n if (Component) {\r\n return Component(props);\r\n }\r\n\r\n if (!promise) {\r\n promise = loader().then(mod => {\r\n Component = mod.default;\r\n return mod;\r\n });\r\n }\r\n\r\n throw promise; // Suspense-style\r\n }) as T;\r\n\r\n return LazyComponent;\r\n}\r\n"]}
@@ -0,0 +1,46 @@
1
+ // src/utils/env.ts
2
+ function isProduction() {
3
+ if (typeof globalThis !== "undefined" && "process" in globalThis) {
4
+ const proc = globalThis.process;
5
+ return proc?.env?.NODE_ENV === "production";
6
+ }
7
+ if (typeof import.meta !== "undefined" && "env" in import.meta) {
8
+ const env = import.meta.env;
9
+ return env?.MODE === "production" || env?.PROD === true;
10
+ }
11
+ return false;
12
+ }
13
+ function isDevelopment() {
14
+ if (typeof globalThis !== "undefined" && "process" in globalThis) {
15
+ const proc = globalThis.process;
16
+ return proc?.env?.NODE_ENV === "development";
17
+ }
18
+ if (typeof import.meta !== "undefined" && "env" in import.meta) {
19
+ const env = import.meta.env;
20
+ return env?.MODE === "development" || env?.DEV === true;
21
+ }
22
+ return true;
23
+ }
24
+ function isTest() {
25
+ if (typeof globalThis !== "undefined" && "process" in globalThis) {
26
+ const proc = globalThis.process;
27
+ return proc?.env?.NODE_ENV === "test";
28
+ }
29
+ return false;
30
+ }
31
+ function isServer() {
32
+ return typeof window === "undefined";
33
+ }
34
+ function isBrowser() {
35
+ return typeof window !== "undefined";
36
+ }
37
+ function getEnvironment() {
38
+ if (isProduction()) return "production";
39
+ if (isDevelopment()) return "development";
40
+ if (isTest()) return "test";
41
+ return "unknown";
42
+ }
43
+
44
+ export { getEnvironment, isBrowser, isDevelopment, isProduction, isServer, isTest };
45
+ //# sourceMappingURL=chunk-LWVETFJV.js.map
46
+ //# sourceMappingURL=chunk-LWVETFJV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/env.ts"],"names":[],"mappings":";AAmBO,SAAS,YAAA,GAAwB;AAEpC,EAAA,IAAI,OAAO,UAAA,KAAe,WAAA,IAAe,SAAA,IAAa,UAAA,EAAY;AAC9D,IAAA,MAAM,OAAQ,UAAA,CAA6D,OAAA;AAC3E,IAAA,OAAO,IAAA,EAAM,KAAK,QAAA,KAAa,YAAA;AAAA,EACnC;AAEA,EAAA,IAAI,OAAO,MAAA,CAAA,IAAA,KAAgB,WAAA,IAAe,KAAA,IAAS,MAAA,CAAA,IAAA,EAAa;AAC5D,IAAA,MAAM,MAAO,MAAA,CAAA,IAAA,CAA4D,GAAA;AACzE,IAAA,OAAO,GAAA,EAAK,IAAA,KAAS,YAAA,IAAgB,GAAA,EAAK,IAAA,KAAS,IAAA;AAAA,EACvD;AACA,EAAA,OAAO,KAAA;AACX;AAUO,SAAS,aAAA,GAAyB;AAErC,EAAA,IAAI,OAAO,UAAA,KAAe,WAAA,IAAe,SAAA,IAAa,UAAA,EAAY;AAC9D,IAAA,MAAM,OAAQ,UAAA,CAA6D,OAAA;AAC3E,IAAA,OAAO,IAAA,EAAM,KAAK,QAAA,KAAa,aAAA;AAAA,EACnC;AAEA,EAAA,IAAI,OAAO,MAAA,CAAA,IAAA,KAAgB,WAAA,IAAe,KAAA,IAAS,MAAA,CAAA,IAAA,EAAa;AAC5D,IAAA,MAAM,MAAO,MAAA,CAAA,IAAA,CAA2D,GAAA;AACxE,IAAA,OAAO,GAAA,EAAK,IAAA,KAAS,aAAA,IAAiB,GAAA,EAAK,GAAA,KAAQ,IAAA;AAAA,EACvD;AAEA,EAAA,OAAO,IAAA;AACX;AAKO,SAAS,MAAA,GAAkB;AAC9B,EAAA,IAAI,OAAO,UAAA,KAAe,WAAA,IAAe,SAAA,IAAa,UAAA,EAAY;AAC9D,IAAA,MAAM,OAAQ,UAAA,CAA6D,OAAA;AAC3E,IAAA,OAAO,IAAA,EAAM,KAAK,QAAA,KAAa,MAAA;AAAA,EACnC;AACA,EAAA,OAAO,KAAA;AACX;AAKO,SAAS,QAAA,GAAoB;AAChC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA;AAC7B;AAKO,SAAS,SAAA,GAAqB;AACjC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA;AAC7B;AAKO,SAAS,cAAA,GAAoE;AAChF,EAAA,IAAI,YAAA,IAAgB,OAAO,YAAA;AAC3B,EAAA,IAAI,aAAA,IAAiB,OAAO,aAAA;AAC5B,EAAA,IAAI,MAAA,IAAU,OAAO,MAAA;AACrB,EAAA,OAAO,SAAA;AACX","file":"chunk-LWVETFJV.js","sourcesContent":["/**\r\n * @flightdev/core - Environment Utilities\r\n * \r\n * Environment detection utilities that work across Node.js, browsers, and edge runtimes.\r\n * No hardcoded values - detects environment dynamically.\r\n */\r\n\r\n// ============================================================================\r\n// Environment Detection\r\n// ============================================================================\r\n\r\n/**\r\n * Check if running in production environment.\r\n * \r\n * Detection order:\r\n * 1. Node.js process.env.NODE_ENV\r\n * 2. Vite/modern bundlers import.meta.env.MODE or import.meta.env.PROD\r\n * 3. Default: false (not production)\r\n */\r\nexport function isProduction(): boolean {\r\n // Check for Node.js environment via globalThis (universal)\r\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\r\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\r\n return proc?.env?.NODE_ENV === 'production';\r\n }\r\n // Check for import.meta.env (Vite, modern bundlers)\r\n if (typeof import.meta !== 'undefined' && 'env' in import.meta) {\r\n const env = (import.meta as { env?: { MODE?: string; PROD?: boolean } }).env;\r\n return env?.MODE === 'production' || env?.PROD === true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if running in development environment.\r\n * \r\n * Detection order:\r\n * 1. Node.js process.env.NODE_ENV\r\n * 2. Vite/modern bundlers import.meta.env.MODE or import.meta.env.DEV\r\n * 3. Default: true (assume development if unknown)\r\n */\r\nexport function isDevelopment(): boolean {\r\n // Check for Node.js environment via globalThis (universal)\r\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\r\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\r\n return proc?.env?.NODE_ENV === 'development';\r\n }\r\n // Check for import.meta.env (Vite, modern bundlers)\r\n if (typeof import.meta !== 'undefined' && 'env' in import.meta) {\r\n const env = (import.meta as { env?: { MODE?: string; DEV?: boolean } }).env;\r\n return env?.MODE === 'development' || env?.DEV === true;\r\n }\r\n // Default to development if we can't detect\r\n return true;\r\n}\r\n\r\n/**\r\n * Check if running in test environment.\r\n */\r\nexport function isTest(): boolean {\r\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\r\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\r\n return proc?.env?.NODE_ENV === 'test';\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if running on the server (not browser).\r\n */\r\nexport function isServer(): boolean {\r\n return typeof window === 'undefined';\r\n}\r\n\r\n/**\r\n * Check if running in the browser.\r\n */\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined';\r\n}\r\n\r\n/**\r\n * Get the current environment name.\r\n */\r\nexport function getEnvironment(): 'production' | 'development' | 'test' | 'unknown' {\r\n if (isProduction()) return 'production';\r\n if (isDevelopment()) return 'development';\r\n if (isTest()) return 'test';\r\n return 'unknown';\r\n}\r\n"]}
@@ -0,0 +1,285 @@
1
+ import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-AP5NLUSB.js';
2
+
3
+ // src/rsc/plugins/esbuild.ts
4
+ function flightRSCEsbuild(options = {}) {
5
+ const {
6
+ include = /\.(tsx?|jsx?)$/,
7
+ exclude = /node_modules/,
8
+ actionsEndpoint = "/_flight/action",
9
+ manifestDir = ".flight",
10
+ ssr = false,
11
+ dev = false
12
+ } = options;
13
+ const state = {
14
+ clientModules: /* @__PURE__ */ new Map(),
15
+ serverActions: /* @__PURE__ */ new Map()};
16
+ return {
17
+ name: "flight-rsc",
18
+ setup(build) {
19
+ const outdir = build.initialOptions.outdir || "dist";
20
+ build.onStart(() => {
21
+ state.clientModules.clear();
22
+ state.serverActions.clear();
23
+ });
24
+ build.onLoad({ filter: include }, async (args) => {
25
+ if (exclude.test(args.path)) {
26
+ return null;
27
+ }
28
+ const fs = await import('fs/promises');
29
+ const code = await fs.readFile(args.path, "utf-8");
30
+ const analysis = analyzeModule(code, args.path);
31
+ const moduleId = createModuleId(args.path);
32
+ if (analysis.fileDirective === "client") {
33
+ state.clientModules.set(args.path, {
34
+ id: moduleId,
35
+ file: args.path,
36
+ exports: analysis.clientComponents
37
+ });
38
+ }
39
+ if (analysis.fileDirective === "server" || analysis.serverActions.length > 0) {
40
+ state.serverActions.set(args.path, {
41
+ id: moduleId,
42
+ file: args.path,
43
+ exports: analysis.serverActions
44
+ });
45
+ }
46
+ if (ssr) {
47
+ if (hasUseClientDirective(code)) {
48
+ return {
49
+ contents: transformClientForSSR(code, moduleId),
50
+ loader: getLoader(args.path)
51
+ };
52
+ }
53
+ } else {
54
+ if (hasUseServerDirective(code)) {
55
+ return {
56
+ contents: transformServerForClient(code, moduleId, actionsEndpoint),
57
+ loader: getLoader(args.path)
58
+ };
59
+ }
60
+ const inlineActions = detectInlineServerActions(code);
61
+ if (inlineActions.length > 0) {
62
+ return {
63
+ contents: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),
64
+ loader: getLoader(args.path)
65
+ };
66
+ }
67
+ }
68
+ return null;
69
+ });
70
+ build.onEnd(async () => {
71
+ const fs = await import('fs/promises');
72
+ const path = await import('path');
73
+ const manifestPath = path.join(outdir, manifestDir);
74
+ await fs.mkdir(manifestPath, { recursive: true });
75
+ if (state.clientModules.size > 0) {
76
+ const clientManifest = Object.fromEntries(state.clientModules);
77
+ await fs.writeFile(
78
+ path.join(manifestPath, "client-manifest.json"),
79
+ JSON.stringify(clientManifest, null, 2)
80
+ );
81
+ }
82
+ if (state.serverActions.size > 0) {
83
+ const serverManifest = Object.fromEntries(state.serverActions);
84
+ await fs.writeFile(
85
+ path.join(manifestPath, "server-manifest.json"),
86
+ JSON.stringify(serverManifest, null, 2)
87
+ );
88
+ }
89
+ if (dev) {
90
+ console.log(`[Flight RSC] Client modules: ${state.clientModules.size}`);
91
+ console.log(`[Flight RSC] Server actions: ${state.serverActions.size}`);
92
+ }
93
+ });
94
+ }
95
+ };
96
+ }
97
+ function transformClientForSSR(code, moduleId) {
98
+ const exports$1 = extractExportNames(code);
99
+ let transformed = `
100
+ // Flight RSC: Client Component Reference (esbuild)
101
+ // Original module: ${moduleId}
102
+
103
+ const __flight_module_id = ${JSON.stringify(moduleId)};
104
+
105
+ `;
106
+ for (const exportName of exports$1) {
107
+ if (exportName === "default") {
108
+ transformed += `
109
+ const __flight_default = Object.assign(
110
+ function() {
111
+ throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);
112
+ },
113
+ {
114
+ $$typeof: Symbol.for('flight.client.reference'),
115
+ $$id: __flight_module_id + '#default',
116
+ $$async: false,
117
+ __flight_client: true,
118
+ __flight_module: __flight_module_id,
119
+ __flight_export: 'default',
120
+ }
121
+ );
122
+ export default __flight_default;
123
+ `;
124
+ } else {
125
+ transformed += `
126
+ export const ${exportName} = Object.assign(
127
+ function() {
128
+ throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);
129
+ },
130
+ {
131
+ $$typeof: Symbol.for('flight.client.reference'),
132
+ $$id: __flight_module_id + '#${exportName}',
133
+ $$async: false,
134
+ __flight_client: true,
135
+ __flight_module: __flight_module_id,
136
+ __flight_export: '${exportName}',
137
+ }
138
+ );
139
+ `;
140
+ }
141
+ }
142
+ return transformed;
143
+ }
144
+ function transformServerForClient(code, moduleId, endpoint) {
145
+ const exports$1 = extractExportNames(code);
146
+ let transformed = `
147
+ // Flight RSC: Server Actions RPC Proxies (esbuild)
148
+ // Original module: ${moduleId}
149
+
150
+ const __flight_endpoint = ${JSON.stringify(endpoint)};
151
+ const __flight_module_id = ${JSON.stringify(moduleId)};
152
+
153
+ async function __flight_rpc(actionId, args) {
154
+ const response = await fetch(__flight_endpoint, {
155
+ method: 'POST',
156
+ headers: {
157
+ 'Content-Type': 'application/json',
158
+ 'X-Flight-Action': actionId,
159
+ },
160
+ body: JSON.stringify({ actionId, args }),
161
+ });
162
+
163
+ if (!response.ok) {
164
+ const error = await response.json().catch(() => ({ message: 'Server action failed' }));
165
+ throw new Error(error.message || 'Server action failed');
166
+ }
167
+
168
+ return response.json();
169
+ }
170
+
171
+ `;
172
+ for (const exportName of exports$1) {
173
+ const actionId = `${moduleId}#${exportName}`;
174
+ if (exportName === "default") {
175
+ transformed += `
176
+ export default async function(...args) {
177
+ return __flight_rpc(${JSON.stringify(actionId)}, args);
178
+ }
179
+ `;
180
+ } else {
181
+ transformed += `
182
+ export async function ${exportName}(...args) {
183
+ return __flight_rpc(${JSON.stringify(actionId)}, args);
184
+ }
185
+ `;
186
+ }
187
+ }
188
+ return transformed;
189
+ }
190
+ function transformInlineActions(code, moduleId, actions, endpoint) {
191
+ let transformed = code;
192
+ const rpcHelper = `
193
+ // Flight RSC: Inline Server Action Helpers
194
+ const __flight_endpoint_inline = ${JSON.stringify(endpoint)};
195
+ async function __flight_rpc_inline(actionId, args) {
196
+ const response = await fetch(__flight_endpoint_inline, {
197
+ method: 'POST',
198
+ headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },
199
+ body: JSON.stringify({ actionId, args }),
200
+ });
201
+ if (!response.ok) throw new Error('Server action failed');
202
+ return response.json();
203
+ }
204
+ `;
205
+ const lastImportMatch = code.match(/^import\s.+$/gm);
206
+ if (lastImportMatch) {
207
+ const lastImport = lastImportMatch[lastImportMatch.length - 1] || "";
208
+ const insertPos = code.indexOf(lastImport) + lastImport.length;
209
+ transformed = code.slice(0, insertPos) + "\n" + rpcHelper + code.slice(insertPos);
210
+ } else {
211
+ transformed = rpcHelper + code;
212
+ }
213
+ for (const actionName of actions) {
214
+ const actionId = `${moduleId}#${actionName}`;
215
+ const patterns = [
216
+ // async function name() { 'use server'; ... }
217
+ new RegExp(
218
+ `async\\s+function\\s+${actionName}\\s*\\([^)]*\\)\\s*\\{[\\s\\S]*?['"]use server['"][\\s\\S]*?\\}`,
219
+ "g"
220
+ ),
221
+ // const name = async () => { 'use server'; ... }
222
+ new RegExp(
223
+ `const\\s+${actionName}\\s*=\\s*async\\s*\\([^)]*\\)\\s*=>\\s*\\{[\\s\\S]*?['"]use server['"][\\s\\S]*?\\}`,
224
+ "g"
225
+ )
226
+ ];
227
+ for (const pattern of patterns) {
228
+ transformed = transformed.replace(
229
+ pattern,
230
+ `async function ${actionName}(...args) { return __flight_rpc_inline(${JSON.stringify(actionId)}, args); }`
231
+ );
232
+ }
233
+ }
234
+ return transformed;
235
+ }
236
+ function createModuleId(filePath) {
237
+ let id = filePath.replace(/\\/g, "/");
238
+ const prefixes = ["/src/", "src/"];
239
+ for (const prefix of prefixes) {
240
+ const idx = id.indexOf(prefix);
241
+ if (idx !== -1) {
242
+ id = id.slice(idx + prefix.length);
243
+ break;
244
+ }
245
+ }
246
+ if (!id.startsWith("/")) {
247
+ id = "/" + id;
248
+ }
249
+ return id;
250
+ }
251
+ function getLoader(filePath) {
252
+ if (filePath.endsWith(".tsx")) return "tsx";
253
+ if (filePath.endsWith(".ts")) return "ts";
254
+ if (filePath.endsWith(".jsx")) return "jsx";
255
+ return "js";
256
+ }
257
+ function extractExportNames(code) {
258
+ const exports$1 = [];
259
+ if (/export\s+default\s+/.test(code)) {
260
+ exports$1.push("default");
261
+ }
262
+ const namedPattern = /export\s+(?:async\s+)?(?:function|const|let|var|class)\s+(\w+)/g;
263
+ let match;
264
+ while ((match = namedPattern.exec(code)) !== null) {
265
+ if (match[1] && match[1] !== "default") {
266
+ exports$1.push(match[1]);
267
+ }
268
+ }
269
+ const bracketPattern = /export\s*\{\s*([^}]+)\s*\}/g;
270
+ while ((match = bracketPattern.exec(code)) !== null) {
271
+ if (match[1]) {
272
+ const names = match[1].split(",").map((n) => {
273
+ const parts = n.trim().split(/\s+as\s+/);
274
+ return parts[parts.length - 1]?.trim() || "";
275
+ });
276
+ exports$1.push(...names.filter((n) => n && n !== "default"));
277
+ }
278
+ }
279
+ return [...new Set(exports$1)];
280
+ }
281
+ var esbuild_default = flightRSCEsbuild;
282
+
283
+ export { esbuild_default, flightRSCEsbuild };
284
+ //# sourceMappingURL=chunk-MCL2MCA2.js.map
285
+ //# sourceMappingURL=chunk-MCL2MCA2.js.map