svelte-effect-runtime 1.6.2 → 2.0.0-beta.1

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 (174) hide show
  1. package/.dist/chunks/client-BeOE81fW.js +577 -0
  2. package/.dist/chunks/client-BeOE81fW.js.map +1 -0
  3. package/.dist/chunks/descriptors-CU2g4U_i.js +36 -0
  4. package/.dist/chunks/descriptors-CU2g4U_i.js.map +1 -0
  5. package/.dist/chunks/dispatcher-BSg2-ttN.js +339 -0
  6. package/.dist/chunks/dispatcher-BSg2-ttN.js.map +1 -0
  7. package/.dist/chunks/preprocess-BZyUYWY7.js +430 -0
  8. package/.dist/chunks/preprocess-BZyUYWY7.js.map +1 -0
  9. package/.dist/chunks/transform-BtlxgJrg.js +836 -0
  10. package/.dist/chunks/transform-BtlxgJrg.js.map +1 -0
  11. package/.dist/detect.d.ts +34 -0
  12. package/.dist/detect.js +56 -0
  13. package/.dist/detect.js.map +1 -0
  14. package/.dist/dispatcher/deps.d.ts +14 -0
  15. package/.dist/dispatcher/fibers.d.ts +52 -0
  16. package/.dist/dispatcher/index.d.ts +138 -0
  17. package/.dist/dispatcher/types.d.ts +63 -0
  18. package/.dist/dispatcher.d.ts +2 -0
  19. package/.dist/dispatcher.js +2 -0
  20. package/.dist/error.d.ts +77 -0
  21. package/.dist/generators.d.ts +16 -0
  22. package/.dist/internal/descriptors.d.ts +17 -0
  23. package/.dist/internal/generators.d.ts +6 -0
  24. package/.dist/internal/generators.js +5 -0
  25. package/.dist/internal/remote-client.d.ts +6 -0
  26. package/.dist/internal/remote-client.js +2 -0
  27. package/.dist/internal/remote-server.d.ts +6 -0
  28. package/.dist/internal/remote-server.js +2 -0
  29. package/.dist/markup/promise.d.ts +15 -0
  30. package/.dist/markup/promise.js +26 -0
  31. package/.dist/markup/promise.js.map +1 -0
  32. package/.dist/markup/run.d.ts +12 -0
  33. package/.dist/markup/run.js +21 -0
  34. package/.dist/markup/run.js.map +1 -0
  35. package/.dist/markup/transform/apply.d.ts +6 -0
  36. package/.dist/markup/transform/classify.d.ts +15 -0
  37. package/.dist/markup/transform/constants.d.ts +5 -0
  38. package/.dist/markup/transform/emit.d.ts +12 -0
  39. package/.dist/markup/transform/expressions.d.ts +39 -0
  40. package/.dist/markup/transform/index.d.ts +19 -0
  41. package/.dist/markup/transform/scan.d.ts +8 -0
  42. package/.dist/markup/transform/types.d.ts +64 -0
  43. package/.dist/markup/transform.d.ts +1 -0
  44. package/.dist/markup/transform.js +2 -0
  45. package/.dist/markup/value.d.ts +20 -0
  46. package/.dist/markup/value.js +32 -0
  47. package/.dist/markup/value.js.map +1 -0
  48. package/.dist/mod.d.ts +186 -0
  49. package/.dist/mod.js +190 -0
  50. package/.dist/mod.js.map +1 -0
  51. package/.dist/preprocess/ast.d.ts +51 -0
  52. package/.dist/preprocess/imports.d.ts +22 -0
  53. package/.dist/preprocess/index.d.ts +21 -0
  54. package/.dist/preprocess/lower.d.ts +12 -0
  55. package/.dist/preprocess/runtime-block.d.ts +8 -0
  56. package/.dist/preprocess/source.d.ts +29 -0
  57. package/.dist/preprocess/types.d.ts +70 -0
  58. package/.dist/preprocess.d.ts +2 -0
  59. package/.dist/preprocess.js +3 -0
  60. package/.dist/remote/client/command.d.ts +17 -0
  61. package/.dist/remote/client/effect.d.ts +15 -0
  62. package/.dist/remote/client/failures.d.ts +57 -0
  63. package/.dist/remote/client/form-data.d.ts +8 -0
  64. package/.dist/remote/client/form-enhance.d.ts +9 -0
  65. package/.dist/remote/client/form-transport.d.ts +20 -0
  66. package/.dist/remote/client/form.d.ts +21 -0
  67. package/.dist/remote/client/index.d.ts +4 -0
  68. package/.dist/remote/client/query-result.d.ts +14 -0
  69. package/.dist/remote/client/query.d.ts +57 -0
  70. package/.dist/remote/client/responses.d.ts +28 -0
  71. package/.dist/remote/client/types.d.ts +83 -0
  72. package/.dist/remote/client/utils.d.ts +11 -0
  73. package/.dist/remote/client.d.ts +2 -0
  74. package/.dist/remote/client.js +2 -0
  75. package/.dist/remote/server.d.ts +66 -0
  76. package/.dist/remote/server.js +104 -0
  77. package/.dist/remote/server.js.map +1 -0
  78. package/.dist/remote/shared.d.ts +202 -0
  79. package/.dist/remote/shared.js +161 -0
  80. package/.dist/remote/shared.js.map +1 -0
  81. package/.dist/runtime/preprocess.d.ts +38 -0
  82. package/.dist/runtime/preprocess.js +54 -0
  83. package/.dist/runtime/preprocess.js.map +1 -0
  84. package/.dist/server/effects.d.ts +49 -0
  85. package/.dist/server/factories.d.ts +97 -0
  86. package/.dist/server/index.d.ts +3 -0
  87. package/.dist/server/invalid.d.ts +9 -0
  88. package/.dist/server/runtime.d.ts +66 -0
  89. package/.dist/server/schema.d.ts +42 -0
  90. package/.dist/server/types.d.ts +271 -0
  91. package/.dist/server/wrappers.d.ts +45 -0
  92. package/.dist/server.d.ts +2 -0
  93. package/.dist/server.js +527 -0
  94. package/.dist/server.js.map +1 -0
  95. package/.dist/vite.d.ts +42 -0
  96. package/.dist/vite.js +118 -0
  97. package/.dist/vite.js.map +1 -0
  98. package/README.md +2 -0
  99. package/package.json +66 -101
  100. package/dist/chunks/client-vV6UAwoP.js +0 -199
  101. package/dist/chunks/client-vV6UAwoP.js.map +0 -1
  102. package/dist/chunks/effect-Crj3S8Cg.js +0 -51
  103. package/dist/chunks/effect-Crj3S8Cg.js.map +0 -1
  104. package/dist/chunks/effect-compat-BhW0YPIs.js +0 -103
  105. package/dist/chunks/effect-compat-BhW0YPIs.js.map +0 -1
  106. package/dist/chunks/magic-string.es-BnGH-5YR.js +0 -1013
  107. package/dist/chunks/magic-string.es-BnGH-5YR.js.map +0 -1
  108. package/dist/chunks/markup-CkPUZIJt.js +0 -13390
  109. package/dist/chunks/markup-CkPUZIJt.js.map +0 -1
  110. package/dist/chunks/preprocess-BFePqOC6.js +0 -49
  111. package/dist/chunks/preprocess-BFePqOC6.js.map +0 -1
  112. package/dist/chunks/server-Dea1CJuY.js +0 -704
  113. package/dist/chunks/server-Dea1CJuY.js.map +0 -1
  114. package/dist/chunks/v3-D0c0MKPf.js +0 -1
  115. package/dist/chunks/v4-MMhHmzIG.js +0 -1
  116. package/dist/chunks/vite-BlUTKv2u.js +0 -152
  117. package/dist/chunks/vite-BlUTKv2u.js.map +0 -1
  118. package/dist/client.d.ts +0 -1
  119. package/dist/client.js +0 -2
  120. package/dist/effect.d.ts +0 -1
  121. package/dist/effect.js +0 -2
  122. package/dist/internal/app-server-shim.d.ts +0 -8
  123. package/dist/internal/effect-compat.d.ts +0 -21
  124. package/dist/internal/markup.d.ts +0 -11
  125. package/dist/internal/markup.js +0 -2
  126. package/dist/internal/remote-client.d.ts +0 -36
  127. package/dist/internal/remote-client.js +0 -527
  128. package/dist/internal/remote-client.js.map +0 -1
  129. package/dist/internal/remote-shared.d.ts +0 -186
  130. package/dist/internal/remote-shared.js +0 -122
  131. package/dist/internal/remote-shared.js.map +0 -1
  132. package/dist/internal/transform.d.ts +0 -18
  133. package/dist/internal/transform.js +0 -418
  134. package/dist/internal/transform.js.map +0 -1
  135. package/dist/language-server.d.ts +0 -9
  136. package/dist/language-server.js +0 -4
  137. package/dist/mod.d.ts +0 -22
  138. package/dist/mod.js +0 -3
  139. package/dist/preprocess.d.ts +0 -29
  140. package/dist/preprocess.js +0 -20
  141. package/dist/preprocess.js.map +0 -1
  142. package/dist/root-node.d.ts +0 -1
  143. package/dist/root-node.js +0 -63
  144. package/dist/root-node.js.map +0 -1
  145. package/dist/server.d.ts +0 -81
  146. package/dist/server.js +0 -85
  147. package/dist/server.js.map +0 -1
  148. package/dist/v3/client.d.ts +0 -117
  149. package/dist/v3/effect.d.ts +0 -17
  150. package/dist/v3/mod.d.ts +0 -27
  151. package/dist/v3/preprocess.d.ts +0 -28
  152. package/dist/v3/root-node.d.ts +0 -59
  153. package/dist/v3/server.d.ts +0 -297
  154. package/dist/v3/vite.d.ts +0 -46
  155. package/dist/v4/client.d.ts +0 -2
  156. package/dist/v4/effect.d.ts +0 -24
  157. package/dist/v4/effect.js +0 -19
  158. package/dist/v4/effect.js.map +0 -1
  159. package/dist/v4/mod.d.ts +0 -27
  160. package/dist/v4/mod.js +0 -3
  161. package/dist/v4/preprocess.d.ts +0 -34
  162. package/dist/v4/preprocess.js +0 -32
  163. package/dist/v4/preprocess.js.map +0 -1
  164. package/dist/v4/root-node.d.ts +0 -59
  165. package/dist/v4/root-node.js +0 -4
  166. package/dist/v4/server.d.ts +0 -340
  167. package/dist/v4/server.js +0 -71
  168. package/dist/v4/server.js.map +0 -1
  169. package/dist/v4/vite.d.ts +0 -34
  170. package/dist/v4/vite.js +0 -31
  171. package/dist/v4/vite.js.map +0 -1
  172. package/dist/vite.d.ts +0 -31
  173. package/dist/vite.js +0 -24
  174. package/dist/vite.js.map +0 -1
@@ -0,0 +1,430 @@
1
+ import { n as TopLevelAwaitError } from "./transform-BtlxgJrg.js";
2
+ import { contains_top_level_yield_star } from "../detect.js";
3
+ import MagicString from "magic-string";
4
+ import ts from "typescript";
5
+ //#region src/preprocess/ast.ts
6
+ /**
7
+ * Checks whether a node is a `yield*` binary expression.
8
+ *
9
+ * @since 2.0.0
10
+ * @param node - TypeScript AST node to check.
11
+ * @returns Whether the node represents `yield * operand`.
12
+ */
13
+ function is_yield_star_expression(node) {
14
+ return ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.AsteriskToken && ts.isIdentifier(node.left) && node.left.text === "yield";
15
+ }
16
+ /**
17
+ * Checks whether a node owns its own yield semantics.
18
+ *
19
+ * @since 2.0.0
20
+ * @param node - TypeScript AST node to check.
21
+ * @returns Whether traversal should stop at this function boundary.
22
+ */
23
+ function is_function_boundary_node(node) {
24
+ return ts.isArrowFunction(node) || ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node) || ts.isMethodDeclaration(node) || ts.isGetAccessorDeclaration(node) || ts.isSetAccessorDeclaration(node);
25
+ }
26
+ /**
27
+ * Returns `true` if the node tree contains a top-level `await`.
28
+ *
29
+ * @since 2.0.0
30
+ * @param node - Root node to search.
31
+ * @returns Whether a top-level await expression was found.
32
+ */
33
+ function contains_top_level_await(node) {
34
+ if (ts.isAwaitExpression(node)) return true;
35
+ return node.getChildren().some((child) => !is_function_boundary_node(child) && contains_top_level_await(child));
36
+ }
37
+ /**
38
+ * Collects top-level `yield*` nodes under an expression.
39
+ *
40
+ * @since 2.0.0
41
+ * @param node - Root node to search.
42
+ * @param on_found - Callback invoked for each matching yield node.
43
+ * @returns Nothing.
44
+ */
45
+ function collect_yield_star_nodes(node, on_found) {
46
+ if (is_function_boundary_node(node)) return;
47
+ if (is_yield_star_expression(node)) {
48
+ on_found(node);
49
+ return;
50
+ }
51
+ node.forEachChild((child) => {
52
+ collect_yield_star_nodes(child, on_found);
53
+ });
54
+ }
55
+ /**
56
+ * Finds the first top-level `yield*` expression below a node.
57
+ *
58
+ * @since 2.0.0
59
+ * @param node - Root node to search.
60
+ * @param on_found - Callback invoked with the first matching node.
61
+ * @returns Nothing.
62
+ */
63
+ function find_yield_star_node(node, on_found) {
64
+ if (is_function_boundary_node(node)) return;
65
+ if (is_yield_star_expression(node)) {
66
+ on_found(node);
67
+ return;
68
+ }
69
+ node.forEachChild((child) => {
70
+ find_yield_star_node(child, on_found);
71
+ });
72
+ }
73
+ /**
74
+ * Extracts identifier names from a TypeScript binding name.
75
+ *
76
+ * @since 2.0.0
77
+ * @param name - Binding name node to flatten.
78
+ * @returns Identifier names from identifiers and destructuring patterns.
79
+ */
80
+ function extract_binding_names(name) {
81
+ if (ts.isIdentifier(name)) return [name.text];
82
+ const result = [];
83
+ for (const element of name.elements) {
84
+ if (ts.isOmittedExpression(element)) continue;
85
+ result.push(...extract_binding_names(element.name));
86
+ }
87
+ return result;
88
+ }
89
+ //#endregion
90
+ //#region src/preprocess/imports.ts
91
+ /**
92
+ * Builds the import statements injected by the script preprocessor.
93
+ *
94
+ * @since 2.0.0
95
+ * @param has_effect_import - Whether the user already imports `Effect`.
96
+ * @param has_onmount_import - Whether the user already imports `onMount`.
97
+ * @param has_dispatcher_import - Whether the user already imports
98
+ * `get_dispatcher`.
99
+ * @returns Newline-separated import statements to inject.
100
+ */
101
+ function make_imports(has_effect_import, has_onmount_import, has_dispatcher_import) {
102
+ return [
103
+ !has_onmount_import && `import { onMount } from "svelte";`,
104
+ !has_effect_import && `import { Effect } from "effect";`,
105
+ !has_dispatcher_import && `import { get_dispatcher } from "svelte-effect-runtime/internal/generators";`
106
+ ].filter(Boolean).join("\n");
107
+ }
108
+ /**
109
+ * Checks whether a source file imports a local binding from a module.
110
+ *
111
+ * @since 2.0.0
112
+ * @param source_file - Parsed TypeScript source file to inspect.
113
+ * @param module_name - Module specifier to match.
114
+ * @param local_name - Local binding name to look for.
115
+ * @returns Whether that binding is already locally available.
116
+ */
117
+ function has_local_import_binding(source_file, module_name, local_name) {
118
+ return source_file.statements.some((stmt) => {
119
+ if (!ts.isImportDeclaration(stmt) || !ts.isStringLiteral(stmt.moduleSpecifier) || stmt.moduleSpecifier.text !== module_name) return false;
120
+ const clause = stmt.importClause;
121
+ if (!clause) return false;
122
+ if (clause.name?.text === local_name) return true;
123
+ const named_bindings = clause.namedBindings;
124
+ if (!named_bindings) return false;
125
+ if (ts.isNamespaceImport(named_bindings)) return named_bindings.name.text === local_name;
126
+ return named_bindings.elements.some((element) => element.name.text === local_name);
127
+ });
128
+ }
129
+ //#endregion
130
+ //#region src/preprocess/source.ts
131
+ /**
132
+ * Creates a source map from transformed script back to the original block.
133
+ *
134
+ * @since 2.0.0
135
+ * @param magic - MagicString instance holding the transformed source.
136
+ * @param filename - Source filename used for the source map entry.
137
+ * @returns A plain source map object.
138
+ */
139
+ function create_source_map(magic, filename) {
140
+ return magic.generateMap({
141
+ hires: true,
142
+ includeContent: true,
143
+ source: filename
144
+ });
145
+ }
146
+ /**
147
+ * Slices a substring matching a node's full source range.
148
+ *
149
+ * @since 2.0.0
150
+ * @param content - Original source text.
151
+ * @param node - AST node whose full range should be extracted.
152
+ * @returns Source text including leading trivia.
153
+ */
154
+ function slice(content, node) {
155
+ return content.slice(node.getFullStart(), node.end);
156
+ }
157
+ /**
158
+ * Slices a substring matching a node's source range without leading trivia.
159
+ *
160
+ * @since 2.0.0
161
+ * @param content - Original source text.
162
+ * @param node - AST node whose non-trivia range should be extracted.
163
+ * @returns Source text excluding leading trivia.
164
+ */
165
+ function slice_start(content, node) {
166
+ return content.slice(node.getStart(), node.end);
167
+ }
168
+ //#endregion
169
+ //#region src/preprocess/lower.ts
170
+ /**
171
+ * Delegates a statement to the correct lowerer based on syntax kind.
172
+ *
173
+ * @since 2.0.0
174
+ * @param stmt - Statement to lower.
175
+ * @param content - Original source text.
176
+ * @param context - Lowering services for this transform pass.
177
+ * @returns Lowered statement descriptor.
178
+ */
179
+ function lower_statement(stmt, content, context) {
180
+ if (ts.isExpressionStatement(stmt)) return lower_expression_statement(stmt, content, context);
181
+ if (ts.isVariableStatement(stmt)) return lower_variable_statement(stmt, content, context);
182
+ return {
183
+ temps: [],
184
+ rewritten_text: "",
185
+ effect_assignments: [slice(content, stmt)],
186
+ range: {
187
+ start: stmt.getFullStart(),
188
+ end: stmt.end
189
+ }
190
+ };
191
+ }
192
+ function lower_variable_statement(stmt, content, context) {
193
+ const temps = [];
194
+ const rewritten_decls = [];
195
+ const assignments = [];
196
+ const decl_list = stmt.declarationList;
197
+ const kind = (decl_list.flags & ts.NodeFlags.Let) !== 0 ? "let" : "const";
198
+ let has_bare_yield = false;
199
+ for (const decl of decl_list.declarations) {
200
+ if (!decl.initializer || !contains_top_level_yield_star(decl.initializer)) {
201
+ rewritten_decls.push(slice(content, decl).trim());
202
+ continue;
203
+ }
204
+ const binding_text = slice(content, decl.name).trim();
205
+ if (ts.isIdentifier(decl.name)) {
206
+ const original_name = binding_text;
207
+ if (is_yield_star_expression(decl.initializer)) {
208
+ const temp_name = context.next_temp_name(original_name);
209
+ temps.push({ name: temp_name });
210
+ has_bare_yield = true;
211
+ rewritten_decls.push(`${original_name} = $derived(${temp_name})`);
212
+ const yield_text = extract_yield_star_full_text(decl.initializer, content);
213
+ assignments.push(`${temp_name} = ${yield_text};`);
214
+ } else {
215
+ const lowered = lower_expression_yields(decl.initializer, content, original_name, context);
216
+ temps.push(...lowered.temps);
217
+ assignments.push(...lowered.effect_assignments);
218
+ const rewritten_expr = rewrite_state_rune_as_derived(lowered.rewritten_expr);
219
+ rewritten_decls.push(`${original_name} = ${rewritten_expr}`);
220
+ }
221
+ } else {
222
+ has_bare_yield = true;
223
+ const temp_name = context.next_temp_name("destructure");
224
+ const names = extract_binding_names(decl.name);
225
+ temps.push({ name: temp_name });
226
+ temps.push(...names.map((name) => ({ name })));
227
+ const yield_text = extract_yield_star_full_text(decl.initializer, content);
228
+ assignments.push(`${temp_name} = ${yield_text};`);
229
+ assignments.push(`(${binding_text} = ${temp_name});`);
230
+ }
231
+ }
232
+ return {
233
+ temps,
234
+ rewritten_text: rewritten_decls.length === 0 ? "" : `${has_bare_yield ? "let" : kind} ${rewritten_decls.join(", ")};`,
235
+ effect_assignments: assignments,
236
+ range: {
237
+ start: stmt.getStart(),
238
+ end: stmt.end
239
+ }
240
+ };
241
+ }
242
+ function lower_expression_statement(stmt, content, context) {
243
+ const expr = stmt.expression;
244
+ if (!contains_top_level_yield_star(expr)) return {
245
+ temps: [],
246
+ rewritten_text: slice(content, stmt).trim(),
247
+ effect_assignments: [],
248
+ range: {
249
+ start: stmt.getStart(),
250
+ end: stmt.end
251
+ }
252
+ };
253
+ if (is_yield_star_expression(expr)) return {
254
+ temps: [],
255
+ rewritten_text: "",
256
+ effect_assignments: [slice(content, expr).trim() + ";"],
257
+ range: {
258
+ start: stmt.getFullStart(),
259
+ end: stmt.end
260
+ }
261
+ };
262
+ if (ts.isBinaryExpression(expr) && expr.operatorToken.kind === ts.SyntaxKind.EqualsToken) return {
263
+ temps: [],
264
+ rewritten_text: "",
265
+ effect_assignments: [`${slice(content, expr.left).trim()} = ${extract_yield_star_full_text(expr, content)};`],
266
+ range: {
267
+ start: stmt.getStart(),
268
+ end: stmt.end
269
+ }
270
+ };
271
+ const lowered = lower_expression_yields(expr, content, "call", context);
272
+ return {
273
+ temps: lowered.temps,
274
+ rewritten_text: lowered.rewritten_expr + ";",
275
+ effect_assignments: lowered.effect_assignments,
276
+ range: {
277
+ start: stmt.getStart(),
278
+ end: stmt.end
279
+ }
280
+ };
281
+ }
282
+ function lower_expression_yields(expr, content, hint, context) {
283
+ const replacements = [];
284
+ const temps = [];
285
+ const effect_assignments = [];
286
+ collect_yield_star_nodes(expr, (node) => {
287
+ const temp_name = context.next_temp_name(hint);
288
+ const yield_text = slice_start(content, node).trim();
289
+ temps.push({ name: temp_name });
290
+ effect_assignments.push(`${temp_name} = ${yield_text};`);
291
+ replacements.push({
292
+ start: node.getStart(),
293
+ end: node.end,
294
+ text: temp_name
295
+ });
296
+ });
297
+ if (replacements.length === 0) return {
298
+ temps,
299
+ rewritten_expr: slice(content, expr).trim(),
300
+ effect_assignments
301
+ };
302
+ replacements.sort((a, b) => b.start - a.start);
303
+ let text = slice(content, expr);
304
+ const offset_in_expr = expr.getFullStart();
305
+ for (const replacement of replacements) text = text.slice(0, replacement.start - offset_in_expr) + replacement.text + text.slice(replacement.end - offset_in_expr);
306
+ return {
307
+ temps,
308
+ rewritten_expr: text.trim(),
309
+ effect_assignments
310
+ };
311
+ }
312
+ function rewrite_state_rune_as_derived(expression) {
313
+ const state_call = expression.match(/^\$state(?:\.raw)?\(([\s\S]*)\)$/);
314
+ if (!state_call) return expression;
315
+ return `$derived(${state_call[1]})`;
316
+ }
317
+ function extract_yield_star_full_text(expr, content) {
318
+ let found;
319
+ find_yield_star_node(expr, (node) => {
320
+ found = slice_start(content, node).trim();
321
+ });
322
+ return found ?? "undefined";
323
+ }
324
+ //#endregion
325
+ //#region src/preprocess/runtime-block.ts
326
+ /**
327
+ * Builds the runtime block appended to lowered script effect code.
328
+ *
329
+ * @since 2.0.0
330
+ * @param assignments - Effect-body assignment strings.
331
+ * @returns Full `Effect.gen` plus `onMount` block.
332
+ */
333
+ function make_runtime_block(assignments) {
334
+ return [
335
+ "",
336
+ "const __SER__program = Effect.gen(function* () {",
337
+ assignments.map((assignment) => ` ${assignment}`).join("\n"),
338
+ "});",
339
+ "",
340
+ "onMount(() => {",
341
+ " const __SER__dispatcher = get_dispatcher();",
342
+ " const __SER__cancel = __SER__dispatcher.fork(__SER__program);",
343
+ " import.meta.hot?.dispose(__SER__cancel);",
344
+ " return __SER__cancel;",
345
+ "});",
346
+ ""
347
+ ].join("\n");
348
+ }
349
+ //#endregion
350
+ //#region src/preprocess/index.ts
351
+ /**
352
+ * Transforms a `<script effect>` body by extracting top-level `yield*`
353
+ * expressions into `$state` temp bindings and wrapping the lowered
354
+ * assignments in an `Effect.gen` block that runs on mount.
355
+ *
356
+ * @example
357
+ * ```ts
358
+ * const result = transform_script_effect(
359
+ * `let user = $state(yield* getUser(id));`,
360
+ * "App.svelte",
361
+ * );
362
+ * ```
363
+ *
364
+ * @since 2.0.0
365
+ * @param content - The raw `<script effect>` body content.
366
+ * @param filename - The source filename, used in error messages.
367
+ * @returns The transformed code and any block references.
368
+ */
369
+ function transform_script_effect(content, filename) {
370
+ let temp_counter = 0;
371
+ const source_file = ts.createSourceFile(filename, content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
372
+ const magic = new MagicString(content);
373
+ const effect_assignments = [];
374
+ const block_refs = [];
375
+ let has_effect = false;
376
+ const context = { next_temp_name(hint) {
377
+ const suffix = temp_counter === 0 ? "" : `_${temp_counter}`;
378
+ const name = hint ? `__SER__${hint}${suffix}` : `__SER__${temp_counter}`;
379
+ temp_counter += 1;
380
+ return name;
381
+ } };
382
+ /** Phase 1: detect imports already provided by the user. */
383
+ const has_effect_import = has_local_import_binding(source_file, "effect", "Effect");
384
+ const has_onmount_import = has_local_import_binding(source_file, "svelte", "onMount");
385
+ const has_dispatcher_import = has_local_import_binding(source_file, "svelte-effect-runtime/internal/generators", "get_dispatcher");
386
+ /** Phase 2: lower every top-level statement that contains `yield*`. */
387
+ for (const stmt of source_file.statements) {
388
+ if (contains_top_level_await(stmt)) throw new TopLevelAwaitError(filename, slice(content, stmt));
389
+ if (!contains_top_level_yield_star(stmt)) continue;
390
+ has_effect = true;
391
+ const lowered = lower_statement(stmt, content, context);
392
+ magic.overwrite(lowered.range.start, lowered.range.end, lowered.rewritten_text);
393
+ if (lowered.temps.length > 0) {
394
+ const prefix = lowered.temps.map((temp) => `let ${temp.name} = $state(undefined);`).join("\n");
395
+ magic.appendLeft(lowered.range.start, prefix + "\n");
396
+ }
397
+ effect_assignments.push(...lowered.effect_assignments);
398
+ }
399
+ if (!has_effect) {
400
+ block_refs.push({
401
+ id: filename,
402
+ kind: "script"
403
+ });
404
+ return {
405
+ code: content,
406
+ blocks: block_refs
407
+ };
408
+ }
409
+ /** Phase 3: inject runtime imports after the last user import. */
410
+ const imports = make_imports(has_effect_import, has_onmount_import, has_dispatcher_import);
411
+ const last_import = [...source_file.statements].reverse().find(ts.isImportDeclaration);
412
+ if (last_import) magic.appendRight(last_import.end, "\n" + imports);
413
+ else magic.prepend(imports + "\n");
414
+ /** Phase 4: append the runtime program and lifecycle wiring. */
415
+ const runtime_block = make_runtime_block(effect_assignments);
416
+ magic.append("\n" + runtime_block);
417
+ block_refs.push({
418
+ id: filename,
419
+ kind: "script"
420
+ });
421
+ return {
422
+ code: magic.toString(),
423
+ blocks: block_refs,
424
+ map: create_source_map(magic, filename)
425
+ };
426
+ }
427
+ //#endregion
428
+ export { transform_script_effect as t };
429
+
430
+ //# sourceMappingURL=preprocess-BZyUYWY7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess-BZyUYWY7.js","names":[],"sources":["../../../modules/svelte-effect-runtime/src/preprocess/ast.ts","../../../modules/svelte-effect-runtime/src/preprocess/imports.ts","../../../modules/svelte-effect-runtime/src/preprocess/source.ts","../../../modules/svelte-effect-runtime/src/preprocess/lower.ts","../../../modules/svelte-effect-runtime/src/preprocess/runtime-block.ts","../../../modules/svelte-effect-runtime/src/preprocess/index.ts"],"sourcesContent":["import ts from \"typescript\";\n\n/**\n * Checks whether a node is a `yield*` binary expression.\n *\n * @since 2.0.0\n * @param node - TypeScript AST node to check.\n * @returns Whether the node represents `yield * operand`.\n */\nexport function is_yield_star_expression(node: ts.Node): boolean {\n return (\n ts.isBinaryExpression(node) &&\n node.operatorToken.kind === ts.SyntaxKind.AsteriskToken &&\n ts.isIdentifier(node.left) &&\n node.left.text === \"yield\"\n );\n}\n\n/**\n * Checks whether a node owns its own yield semantics.\n *\n * @since 2.0.0\n * @param node - TypeScript AST node to check.\n * @returns Whether traversal should stop at this function boundary.\n */\nexport function is_function_boundary_node(node: ts.Node): boolean {\n return (\n ts.isArrowFunction(node) ||\n ts.isFunctionDeclaration(node) ||\n ts.isFunctionExpression(node) ||\n ts.isMethodDeclaration(node) ||\n ts.isGetAccessorDeclaration(node) ||\n ts.isSetAccessorDeclaration(node)\n );\n}\n\n/**\n * Returns `true` if the node tree contains a top-level `await`.\n *\n * @since 2.0.0\n * @param node - Root node to search.\n * @returns Whether a top-level await expression was found.\n */\nexport function contains_top_level_await(node: ts.Node): boolean {\n if (ts.isAwaitExpression(node)) {\n return true;\n }\n\n return node.getChildren().some(\n (child) =>\n !is_function_boundary_node(child) && contains_top_level_await(child),\n );\n}\n\n/**\n * Collects top-level `yield*` nodes under an expression.\n *\n * @since 2.0.0\n * @param node - Root node to search.\n * @param on_found - Callback invoked for each matching yield node.\n * @returns Nothing.\n */\nexport function collect_yield_star_nodes(\n node: ts.Node,\n on_found: (node: ts.Node) => void,\n): void {\n if (is_function_boundary_node(node)) {\n return;\n }\n\n if (is_yield_star_expression(node)) {\n on_found(node);\n return;\n }\n\n node.forEachChild((child) => {\n collect_yield_star_nodes(child, on_found);\n });\n}\n\n/**\n * Finds the first top-level `yield*` expression below a node.\n *\n * @since 2.0.0\n * @param node - Root node to search.\n * @param on_found - Callback invoked with the first matching node.\n * @returns Nothing.\n */\nexport function find_yield_star_node(\n node: ts.Node,\n on_found: (node: ts.Node) => void,\n): void {\n if (is_function_boundary_node(node)) {\n return;\n }\n\n if (is_yield_star_expression(node)) {\n on_found(node);\n return;\n }\n\n node.forEachChild((child) => {\n find_yield_star_node(child, on_found);\n });\n}\n\n/**\n * Extracts identifier names from a TypeScript binding name.\n *\n * @since 2.0.0\n * @param name - Binding name node to flatten.\n * @returns Identifier names from identifiers and destructuring patterns.\n */\nexport function extract_binding_names(name: ts.BindingName): string[] {\n if (ts.isIdentifier(name)) {\n return [name.text];\n }\n\n const result: string[] = [];\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n result.push(...extract_binding_names(element.name));\n }\n\n return result;\n}\n","import ts from \"typescript\";\n\n/**\n * Builds the import statements injected by the script preprocessor.\n *\n * @since 2.0.0\n * @param has_effect_import - Whether the user already imports `Effect`.\n * @param has_onmount_import - Whether the user already imports `onMount`.\n * @param has_dispatcher_import - Whether the user already imports\n * `get_dispatcher`.\n * @returns Newline-separated import statements to inject.\n */\nexport function make_imports(\n has_effect_import: boolean,\n has_onmount_import: boolean,\n has_dispatcher_import: boolean,\n): string {\n return [\n !has_onmount_import && `import { onMount } from \"svelte\";`,\n !has_effect_import && `import { Effect } from \"effect\";`,\n !has_dispatcher_import &&\n `import { get_dispatcher } from \"svelte-effect-runtime/internal/generators\";`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\n/**\n * Checks whether a source file imports a local binding from a module.\n *\n * @since 2.0.0\n * @param source_file - Parsed TypeScript source file to inspect.\n * @param module_name - Module specifier to match.\n * @param local_name - Local binding name to look for.\n * @returns Whether that binding is already locally available.\n */\nexport function has_local_import_binding(\n source_file: ts.SourceFile,\n module_name: string,\n local_name: string,\n): boolean {\n return source_file.statements.some((stmt) => {\n if (\n !ts.isImportDeclaration(stmt) ||\n !ts.isStringLiteral(stmt.moduleSpecifier) ||\n stmt.moduleSpecifier.text !== module_name\n ) {\n return false;\n }\n\n const clause = stmt.importClause;\n\n if (!clause) {\n return false;\n }\n\n if (clause.name?.text === local_name) {\n return true;\n }\n\n const named_bindings = clause.namedBindings;\n\n if (!named_bindings) {\n return false;\n }\n\n if (ts.isNamespaceImport(named_bindings)) {\n return named_bindings.name.text === local_name;\n }\n\n return named_bindings.elements.some(\n (element) => element.name.text === local_name,\n );\n });\n}\n","import type MagicString from \"magic-string\";\nimport type ts from \"typescript\";\n\n/**\n * Creates a source map from transformed script back to the original block.\n *\n * @since 2.0.0\n * @param magic - MagicString instance holding the transformed source.\n * @param filename - Source filename used for the source map entry.\n * @returns A plain source map object.\n */\nexport function create_source_map(\n magic: MagicString,\n filename: string,\n): Record<string, unknown> {\n const map = magic.generateMap({\n hires: true,\n includeContent: true,\n source: filename,\n });\n\n return map as unknown as Record<string, unknown>;\n}\n\n/**\n * Slices a substring matching a node's full source range.\n *\n * @since 2.0.0\n * @param content - Original source text.\n * @param node - AST node whose full range should be extracted.\n * @returns Source text including leading trivia.\n */\nexport function slice(content: string, node: ts.Node): string {\n return content.slice(node.getFullStart(), node.end);\n}\n\n/**\n * Slices a substring matching a node's source range without leading trivia.\n *\n * @since 2.0.0\n * @param content - Original source text.\n * @param node - AST node whose non-trivia range should be extracted.\n * @returns Source text excluding leading trivia.\n */\nexport function slice_start(content: string, node: ts.Node): string {\n return content.slice(node.getStart(), node.end);\n}\n","import { contains_top_level_yield_star } from \"$/detect.ts\";\nimport ts from \"typescript\";\n\nimport {\n collect_yield_star_nodes,\n extract_binding_names,\n find_yield_star_node,\n is_yield_star_expression,\n} from \"./ast.ts\";\nimport { slice, slice_start } from \"./source.ts\";\nimport type {\n LoweredExpression,\n LoweredStatement,\n ScriptLoweringContext,\n TempBinding,\n} from \"./types.ts\";\n\n/**\n * Delegates a statement to the correct lowerer based on syntax kind.\n *\n * @since 2.0.0\n * @param stmt - Statement to lower.\n * @param content - Original source text.\n * @param context - Lowering services for this transform pass.\n * @returns Lowered statement descriptor.\n */\nexport function lower_statement(\n stmt: ts.Statement,\n content: string,\n context: ScriptLoweringContext,\n): LoweredStatement {\n if (ts.isExpressionStatement(stmt)) {\n return lower_expression_statement(stmt, content, context);\n }\n\n if (ts.isVariableStatement(stmt)) {\n return lower_variable_statement(stmt, content, context);\n }\n\n const text = slice(content, stmt);\n\n return {\n temps: [],\n rewritten_text: \"\",\n effect_assignments: [text],\n range: { start: stmt.getFullStart(), end: stmt.end },\n };\n}\n\nfunction lower_variable_statement(\n stmt: ts.VariableStatement,\n content: string,\n context: ScriptLoweringContext,\n): LoweredStatement {\n const temps: TempBinding[] = [];\n const rewritten_decls: string[] = [];\n const assignments: string[] = [];\n\n const decl_list = stmt.declarationList;\n const kind = (decl_list.flags & ts.NodeFlags.Let) !== 0 ? \"let\" : \"const\";\n let has_bare_yield = false;\n\n for (const decl of decl_list.declarations) {\n if (!decl.initializer || !contains_top_level_yield_star(decl.initializer)) {\n rewritten_decls.push(slice(content, decl).trim());\n continue;\n }\n\n const binding_text = slice(content, decl.name).trim();\n\n if (ts.isIdentifier(decl.name)) {\n const original_name = binding_text;\n\n if (is_yield_star_expression(decl.initializer)) {\n const temp_name = context.next_temp_name(original_name);\n\n temps.push({ name: temp_name });\n has_bare_yield = true;\n rewritten_decls.push(`${original_name} = $derived(${temp_name})`);\n\n const yield_text = extract_yield_star_full_text(\n decl.initializer,\n content,\n );\n\n assignments.push(`${temp_name} = ${yield_text};`);\n } else {\n const lowered = lower_expression_yields(\n decl.initializer,\n content,\n original_name,\n context,\n );\n\n temps.push(...lowered.temps);\n assignments.push(...lowered.effect_assignments);\n\n const rewritten_expr = rewrite_state_rune_as_derived(\n lowered.rewritten_expr,\n );\n\n rewritten_decls.push(`${original_name} = ${rewritten_expr}`);\n }\n } else {\n has_bare_yield = true;\n\n const temp_name = context.next_temp_name(\"destructure\");\n const names = extract_binding_names(decl.name);\n\n temps.push({ name: temp_name });\n temps.push(...names.map((name) => ({ name })));\n\n const yield_text = extract_yield_star_full_text(\n decl.initializer,\n content,\n );\n\n assignments.push(`${temp_name} = ${yield_text};`);\n assignments.push(`(${binding_text} = ${temp_name});`);\n }\n }\n\n const rewritten_text = rewritten_decls.length === 0\n ? \"\"\n : `${has_bare_yield ? \"let\" : kind} ${rewritten_decls.join(\", \")};`;\n\n return {\n temps,\n rewritten_text,\n effect_assignments: assignments,\n range: { start: stmt.getStart(), end: stmt.end },\n };\n}\n\nfunction lower_expression_statement(\n stmt: ts.ExpressionStatement,\n content: string,\n context: ScriptLoweringContext,\n): LoweredStatement {\n const expr = stmt.expression;\n\n if (!contains_top_level_yield_star(expr)) {\n return {\n temps: [],\n rewritten_text: slice(content, stmt).trim(),\n effect_assignments: [],\n range: { start: stmt.getStart(), end: stmt.end },\n };\n }\n\n if (is_yield_star_expression(expr)) {\n const text = slice(content, expr).trim();\n\n return {\n temps: [],\n rewritten_text: \"\",\n effect_assignments: [text + \";\"],\n range: { start: stmt.getFullStart(), end: stmt.end },\n };\n }\n\n if (\n ts.isBinaryExpression(expr) &&\n expr.operatorToken.kind === ts.SyntaxKind.EqualsToken\n ) {\n const target = slice(content, expr.left).trim();\n const yield_text = extract_yield_star_full_text(expr, content);\n\n return {\n temps: [],\n rewritten_text: \"\",\n effect_assignments: [`${target} = ${yield_text};`],\n range: { start: stmt.getStart(), end: stmt.end },\n };\n }\n\n const lowered = lower_expression_yields(\n expr,\n content,\n \"call\",\n context,\n );\n\n return {\n temps: lowered.temps,\n rewritten_text: lowered.rewritten_expr + \";\",\n effect_assignments: lowered.effect_assignments,\n range: { start: stmt.getStart(), end: stmt.end },\n };\n}\n\nfunction lower_expression_yields(\n expr: ts.Expression,\n content: string,\n hint: string,\n context: ScriptLoweringContext,\n): LoweredExpression {\n const replacements: Array<{\n start: number;\n end: number;\n text: string;\n }> = [];\n\n const temps: TempBinding[] = [];\n const effect_assignments: string[] = [];\n\n collect_yield_star_nodes(expr, (node) => {\n const temp_name = context.next_temp_name(hint);\n const yield_text = slice_start(content, node).trim();\n\n temps.push({ name: temp_name });\n effect_assignments.push(`${temp_name} = ${yield_text};`);\n replacements.push({\n start: node.getStart(),\n end: node.end,\n text: temp_name,\n });\n });\n\n if (replacements.length === 0) {\n return {\n temps,\n rewritten_expr: slice(content, expr).trim(),\n effect_assignments,\n };\n }\n\n replacements.sort((a, b) => b.start - a.start);\n\n let text = slice(content, expr);\n\n const offset_in_expr = expr.getFullStart();\n\n for (const replacement of replacements) {\n text = text.slice(0, replacement.start - offset_in_expr) +\n replacement.text +\n text.slice(replacement.end - offset_in_expr);\n }\n\n return {\n temps,\n rewritten_expr: text.trim(),\n effect_assignments,\n };\n}\n\nfunction rewrite_state_rune_as_derived(expression: string): string {\n const state_call = expression.match(/^\\$state(?:\\.raw)?\\(([\\s\\S]*)\\)$/);\n\n if (!state_call) {\n return expression;\n }\n\n return `$derived(${state_call[1]})`;\n}\n\nfunction extract_yield_star_full_text(\n expr: ts.Expression,\n content: string,\n): string {\n let found: string | undefined;\n\n find_yield_star_node(expr, (node) => {\n found = slice_start(content, node).trim();\n });\n\n return found ?? \"undefined\";\n}\n","/**\n * Builds the runtime block appended to lowered script effect code.\n *\n * @since 2.0.0\n * @param assignments - Effect-body assignment strings.\n * @returns Full `Effect.gen` plus `onMount` block.\n */\nexport function make_runtime_block(assignments: string[]): string {\n const body = assignments\n .map((assignment) => ` ${assignment}`)\n .join(\"\\n\");\n\n return [\n \"\",\n \"const __SER__program = Effect.gen(function* () {\",\n body,\n \"});\",\n \"\",\n \"onMount(() => {\",\n \" const __SER__dispatcher = get_dispatcher();\",\n \" const __SER__cancel = __SER__dispatcher.fork(__SER__program);\",\n \" import.meta.hot?.dispose(__SER__cancel);\",\n \" return __SER__cancel;\",\n \"});\",\n \"\",\n ].join(\"\\n\");\n}\n","import { contains_top_level_yield_star } from \"$/detect.ts\";\nimport { TopLevelAwaitError } from \"$/error.ts\";\n\nimport MagicString from \"magic-string\";\nimport ts from \"typescript\";\n\nimport { contains_top_level_await } from \"./ast.ts\";\nimport { has_local_import_binding, make_imports } from \"./imports.ts\";\nimport { lower_statement } from \"./lower.ts\";\nimport { make_runtime_block } from \"./runtime-block.ts\";\nimport { create_source_map, slice } from \"./source.ts\";\nimport type { BlockRef, ScriptTransformResult } from \"./types.ts\";\n\nexport type { BlockRef, ScriptTransformResult } from \"./types.ts\";\n\n/**\n * Transforms a `<script effect>` body by extracting top-level `yield*`\n * expressions into `$state` temp bindings and wrapping the lowered\n * assignments in an `Effect.gen` block that runs on mount.\n *\n * @example\n * ```ts\n * const result = transform_script_effect(\n * `let user = $state(yield* getUser(id));`,\n * \"App.svelte\",\n * );\n * ```\n *\n * @since 2.0.0\n * @param content - The raw `<script effect>` body content.\n * @param filename - The source filename, used in error messages.\n * @returns The transformed code and any block references.\n */\nexport function transform_script_effect(\n content: string,\n filename: string,\n): ScriptTransformResult {\n let temp_counter = 0;\n\n const source_file = ts.createSourceFile(\n filename,\n content,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n\n const magic = new MagicString(content);\n const effect_assignments: string[] = [];\n const block_refs: BlockRef[] = [];\n\n let has_effect = false;\n\n const context = {\n next_temp_name(hint?: string) {\n const suffix = temp_counter === 0 ? \"\" : `_${temp_counter}`;\n const name = hint ? `__SER__${hint}${suffix}` : `__SER__${temp_counter}`;\n\n temp_counter += 1;\n\n return name;\n },\n };\n\n /** Phase 1: detect imports already provided by the user. */\n const has_effect_import = has_local_import_binding(\n source_file,\n \"effect\",\n \"Effect\",\n );\n\n const has_onmount_import = has_local_import_binding(\n source_file,\n \"svelte\",\n \"onMount\",\n );\n\n const has_dispatcher_import = has_local_import_binding(\n source_file,\n \"svelte-effect-runtime/internal/generators\",\n \"get_dispatcher\",\n );\n\n /** Phase 2: lower every top-level statement that contains `yield*`. */\n for (const stmt of source_file.statements) {\n if (contains_top_level_await(stmt)) {\n const text = slice(content, stmt);\n throw new TopLevelAwaitError(filename, text);\n }\n\n if (!contains_top_level_yield_star(stmt)) {\n continue;\n }\n\n has_effect = true;\n const lowered = lower_statement(stmt, content, context);\n\n magic.overwrite(\n lowered.range.start,\n lowered.range.end,\n lowered.rewritten_text,\n );\n\n if (lowered.temps.length > 0) {\n const prefix = lowered.temps\n .map((temp) => `let ${temp.name} = $state(undefined);`)\n .join(\"\\n\");\n\n magic.appendLeft(lowered.range.start, prefix + \"\\n\");\n }\n\n effect_assignments.push(...lowered.effect_assignments);\n }\n\n if (!has_effect) {\n block_refs.push({ id: filename, kind: \"script\" });\n\n return { code: content, blocks: block_refs };\n }\n\n /** Phase 3: inject runtime imports after the last user import. */\n const imports = make_imports(\n has_effect_import,\n has_onmount_import,\n has_dispatcher_import,\n );\n\n const last_import = [...source_file.statements]\n .reverse()\n .find(ts.isImportDeclaration);\n\n if (last_import) {\n magic.appendRight(last_import.end, \"\\n\" + imports);\n } else {\n magic.prepend(imports + \"\\n\");\n }\n\n /** Phase 4: append the runtime program and lifecycle wiring. */\n const runtime_block = make_runtime_block(effect_assignments);\n magic.append(\"\\n\" + runtime_block);\n\n block_refs.push({ id: filename, kind: \"script\" });\n\n return {\n code: magic.toString(),\n blocks: block_refs,\n map: create_source_map(magic, filename),\n };\n}\n"],"mappings":"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"}