svelte-effect-runtime 2.4.1 → 2.5.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 (61) hide show
  1. package/.dist/chunks/{client-CtxuIuC8.js → client-Cj2X9lY-.js} +11 -23
  2. package/.dist/chunks/client-Cj2X9lY-.js.map +1 -0
  3. package/.dist/chunks/{dispatcher-8B6Ol80H.js → dispatcher-BVkm8qbG.js} +33 -13
  4. package/.dist/chunks/dispatcher-BVkm8qbG.js.map +1 -0
  5. package/.dist/chunks/{preprocess-Cn4JH9OO.js → preprocess-DseI9Doo.js} +206 -73
  6. package/.dist/chunks/preprocess-DseI9Doo.js.map +1 -0
  7. package/.dist/chunks/transform-BotzDlj3.js +72 -0
  8. package/.dist/chunks/transform-BotzDlj3.js.map +1 -0
  9. package/.dist/chunks/{transform-s9gKPYu5.js → transform-Cx5bjmP6.js} +267 -48
  10. package/.dist/chunks/transform-Cx5bjmP6.js.map +1 -0
  11. package/.dist/dispatcher.js +1 -1
  12. package/.dist/error.d.ts +23 -0
  13. package/.dist/internal/generators.js +1 -1
  14. package/.dist/internal/remote-client.js +1 -1
  15. package/.dist/markup/promise.js +1 -1
  16. package/.dist/markup/run.js +1 -1
  17. package/.dist/markup/transform/apply.d.ts +8 -2
  18. package/.dist/markup/transform/emit.d.ts +2 -2
  19. package/.dist/markup/transform/types.d.ts +9 -1
  20. package/.dist/markup/transform.js +1 -1
  21. package/.dist/markup/value.d.ts +1 -1
  22. package/.dist/markup/value.js +1 -1
  23. package/.dist/markup/value.js.map +1 -1
  24. package/.dist/mod.d.ts +1 -1
  25. package/.dist/mod.js +1 -1
  26. package/.dist/mod.js.map +1 -1
  27. package/.dist/preprocess/imports.d.ts +20 -1
  28. package/.dist/preprocess/index.d.ts +5 -1
  29. package/.dist/preprocess/runtime-block.d.ts +11 -1
  30. package/.dist/preprocess/types.d.ts +27 -0
  31. package/.dist/preprocess.js +2 -2
  32. package/.dist/remote/client/command.d.ts +5 -1
  33. package/.dist/remote/client/effect.d.ts +1 -1
  34. package/.dist/remote/client/failures.d.ts +3 -3
  35. package/.dist/remote/client/form-enhance.d.ts +1 -1
  36. package/.dist/remote/client/form.d.ts +1 -1
  37. package/.dist/remote/client/query.d.ts +12 -5
  38. package/.dist/remote/client/responses.d.ts +2 -2
  39. package/.dist/remote/client/types.d.ts +55 -11
  40. package/.dist/remote/client.js +1 -1
  41. package/.dist/runtime/preprocess.d.ts +1 -0
  42. package/.dist/runtime/preprocess.js +5 -29
  43. package/.dist/runtime/preprocess.js.map +1 -1
  44. package/.dist/runtime/transform.d.ts +35 -0
  45. package/.dist/server/effects.d.ts +3 -3
  46. package/.dist/server/factories.d.ts +10 -38
  47. package/.dist/server/index.d.ts +1 -1
  48. package/.dist/server/invalid.d.ts +1 -1
  49. package/.dist/server/schema.d.ts +1 -1
  50. package/.dist/server/types.d.ts +51 -31
  51. package/.dist/server/wrappers.d.ts +4 -6
  52. package/.dist/server.d.ts +1 -1
  53. package/.dist/server.js +8 -15
  54. package/.dist/server.js.map +1 -1
  55. package/.dist/vite.js +6 -10
  56. package/.dist/vite.js.map +1 -1
  57. package/package.json +1 -1
  58. package/.dist/chunks/client-CtxuIuC8.js.map +0 -1
  59. package/.dist/chunks/dispatcher-8B6Ol80H.js.map +0 -1
  60. package/.dist/chunks/preprocess-Cn4JH9OO.js.map +0 -1
  61. package/.dist/chunks/transform-s9gKPYu5.js.map +0 -1
@@ -1,47 +1,7 @@
1
- import { a as find_yield_star_node, c as AsyncEffectInSyncRuneError, i as extract_binding_names, l as AwaitInEffectWorkError, n as collect_yield_star_nodes, o as is_yield_star_expression, r as contains_top_level_await, s as collect_free_identifiers } from "./transform-s9gKPYu5.js";
1
+ import { a as find_yield_star_node, c as AsyncEffectInSyncRuneError, d as collect_top_level_binding_names, f as has_local_import_binding, i as extract_binding_names, l as AwaitInEffectWorkError, n as collect_yield_star_nodes, o as is_yield_star_expression, p as make_imports, r as contains_top_level_await, s as collect_free_identifiers, u as PreprocessError } from "./transform-Cx5bjmP6.js";
2
2
  import { contains_top_level_yield_star } from "../detect.js";
3
3
  import MagicString from "magic-string";
4
4
  import ts from "typescript";
5
- //#region src/preprocess/imports.ts
6
- /**
7
- * Builds the import statements injected by the script preprocessor.
8
- *
9
- * @since 2.0.0
10
- * @param has_effect_import - Whether the user already imports `Effect`.
11
- * @param has_dispatcher_import - Whether the user already imports
12
- * `get_dispatcher`.
13
- * @param has_untrack_import - Whether the user already imports `untrack`.
14
- * @returns Newline-separated import statements to inject.
15
- */
16
- function make_imports(has_effect_import, has_dispatcher_import, has_untrack_import) {
17
- return [
18
- !has_dispatcher_import && `import { get_dispatcher } from "svelte-effect-runtime/internal/generators";`,
19
- !has_untrack_import && `import { untrack } from "svelte";`,
20
- !has_effect_import && `import { Effect } from "effect";`
21
- ].filter(Boolean).join("\n");
22
- }
23
- /**
24
- * Checks whether a source file imports a local binding from a module.
25
- *
26
- * @since 2.0.0
27
- * @param source_file - Parsed TypeScript source file to inspect.
28
- * @param module_name - Module specifier to match.
29
- * @param local_name - Local binding name to look for.
30
- * @returns Whether that binding is already locally available.
31
- */
32
- function has_local_import_binding(source_file, module_name, local_name) {
33
- return source_file.statements.some((stmt) => {
34
- if (!ts.isImportDeclaration(stmt) || !ts.isStringLiteral(stmt.moduleSpecifier) || stmt.moduleSpecifier.text !== module_name) return false;
35
- const clause = stmt.importClause;
36
- if (!clause) return false;
37
- if (clause.name?.text === local_name) return true;
38
- const named_bindings = clause.namedBindings;
39
- if (!named_bindings) return false;
40
- if (ts.isNamespaceImport(named_bindings)) return named_bindings.name.text === local_name;
41
- return named_bindings.elements.some((element) => element.name.text === local_name);
42
- });
43
- }
44
- //#endregion
45
5
  //#region src/preprocess/source.ts
46
6
  /**
47
7
  * Creates a source map from transformed script back to the original block.
@@ -83,13 +43,15 @@ function slice_start(content, node) {
83
43
  //#endregion
84
44
  //#region src/preprocess/runtime-block.ts
85
45
  /**
86
- * Builds the runtime blocks appended to lowered script effect code.
46
+ * Builds the runtime blocks appended to lowered script effect code with
47
+ * explicit runtime import bindings.
87
48
  *
88
- * @since 2.0.0
49
+ * @since 2.4.2
89
50
  * @param blocks - Effect bodies and dependency reads to emit.
51
+ * @param bindings - Runtime binding names available in the generated code.
90
52
  * @returns Full `$effect` blocks that fork generated `Effect.gen` programs.
91
53
  */
92
- function make_runtime_block(blocks) {
54
+ function make_runtime_block_with_bindings(blocks, bindings) {
93
55
  const merged_block = merge_effect_blocks(blocks);
94
56
  const dep_reads = merged_block.deps.map((dep) => ` ${dep};`);
95
57
  const body = merged_block.statements.map((statement) => ` ${statement}`).join("\n");
@@ -97,13 +59,13 @@ function make_runtime_block(blocks) {
97
59
  "",
98
60
  "$effect(() => {",
99
61
  ...dep_reads,
100
- " const __SER___dispatcher = get_dispatcher();",
101
- " const __SER___program = Effect.gen(function* () {",
62
+ ` const ${bindings.dispatcher_value} = ${bindings.dispatcher}();`,
63
+ ` const ${bindings.program} = ${bindings.effect}.gen(function* () {`,
102
64
  body,
103
65
  " });",
104
- " const __SER___cancel = untrack(() => __SER___dispatcher.fork(__SER___program));",
105
- " import.meta.hot?.dispose(__SER___cancel);",
106
- " return __SER___cancel;",
66
+ ` const ${bindings.cancel} = ${bindings.untrack}(() => ${bindings.dispatcher_value}.fork(${bindings.program}));`,
67
+ ` import.meta.hot?.dispose(${bindings.cancel});`,
68
+ ` return ${bindings.cancel};`,
107
69
  "});",
108
70
  ""
109
71
  ].join("\n");
@@ -218,6 +180,7 @@ function lower_statement(stmt, content, context) {
218
180
  }
219
181
  function lower_variable_statement(stmt, content, context) {
220
182
  const temps = [];
183
+ const type_helpers = [];
221
184
  const rewritten_decls = [];
222
185
  const statements = [];
223
186
  const deps = [];
@@ -226,6 +189,17 @@ function lower_variable_statement(stmt, content, context) {
226
189
  let has_bare_yield = false;
227
190
  for (const decl of decl_list.declarations) {
228
191
  if (!decl.initializer || !contains_top_level_yield_star(decl.initializer)) {
192
+ if (contains_top_level_yield_star(decl.name)) {
193
+ has_bare_yield = true;
194
+ const binding_text = slice(content, decl.name).trim();
195
+ const initializer_text = decl.initializer ? slice(content, decl.initializer).trim() : "undefined";
196
+ const names = extract_binding_names(decl.name);
197
+ const statement = `(${binding_text} = ${initializer_text});`;
198
+ temps.push(...names.map((name) => make_unknown_temp(name, context)));
199
+ statements.push(statement);
200
+ deps.push(...collect_deps(statement, names));
201
+ continue;
202
+ }
229
203
  rewritten_decls.push(slice(content, decl).trim());
230
204
  continue;
231
205
  }
@@ -234,37 +208,56 @@ function lower_variable_statement(stmt, content, context) {
234
208
  const original_name = binding_text;
235
209
  if (is_yield_star_expression(decl.initializer)) {
236
210
  const temp_name = context.next_temp_name(original_name);
237
- temps.push({ name: temp_name });
211
+ const yield_text = extract_yield_star_full_text(decl.initializer, content);
212
+ const type_helper = make_yield_type_helper(yield_text, original_name, context);
213
+ if (type_helper) {
214
+ type_helpers.push(type_helper.declaration);
215
+ temps.push({
216
+ name: temp_name,
217
+ type: type_helper.type
218
+ });
219
+ } else temps.push({ name: temp_name });
238
220
  has_bare_yield = true;
239
221
  rewritten_decls.push(`${original_name} = $derived(${temp_name})`);
240
- const yield_text = extract_yield_star_full_text(decl.initializer, content);
241
222
  statements.push(`${temp_name} = ${yield_text};`);
242
223
  deps.push(...collect_deps(yield_text));
243
224
  } else {
244
225
  const state_rune = get_state_rune_initializer(decl.initializer, content);
245
226
  if (state_rune) {
227
+ const state_type = extract_yield_star_full_text(decl.initializer, content) === state_rune.value_text ? make_yield_type_helper(state_rune.value_text, original_name, context) : void 0;
228
+ if (state_type) type_helpers.push(state_type.declaration);
246
229
  has_bare_yield = true;
247
- rewritten_decls.push(`${original_name} = ${state_rune.rune_name}(undefined)`);
230
+ rewritten_decls.push(`${original_name} = ${make_state_placeholder(state_rune.rune_name, state_type?.type, context)}`);
248
231
  statements.push(`${original_name} = ${state_rune.value_text};`);
249
232
  deps.push(...collect_deps(state_rune.value_text));
250
233
  continue;
251
234
  }
252
235
  const lowered = lower_expression_yields(decl.initializer, content, original_name, context);
253
236
  temps.push(...lowered.temps);
237
+ type_helpers.push(...lowered.type_helpers ?? []);
254
238
  for (const block of lowered.effect_blocks) {
255
239
  statements.push(...block.statements);
256
240
  deps.push(...block.deps);
257
241
  }
258
242
  const rewritten_expr = rewrite_state_rune_as_derived(lowered.rewritten_expr);
259
- rewritten_decls.push(`${original_name} = ${rewritten_expr}`);
243
+ const final_expr = should_wrap_complex_initializer_as_derived(decl.initializer, content) ? `$derived(${rewritten_expr})` : rewritten_expr;
244
+ if (final_expr !== rewritten_expr) has_bare_yield = true;
245
+ rewritten_decls.push(`${original_name} = ${final_expr}`);
260
246
  }
261
247
  } else {
262
248
  has_bare_yield = true;
263
249
  const temp_name = context.next_temp_name("destructure");
264
250
  const names = extract_binding_names(decl.name);
265
- temps.push({ name: temp_name });
266
- temps.push(...names.map((name) => ({ name })));
267
251
  const yield_text = extract_yield_star_full_text(decl.initializer, content);
252
+ const type_helper = make_yield_type_helper(yield_text, "destructure", context);
253
+ if (type_helper) {
254
+ type_helpers.push(type_helper.declaration);
255
+ temps.push({
256
+ name: temp_name,
257
+ type: type_helper.type
258
+ });
259
+ } else temps.push({ name: temp_name });
260
+ temps.push(...names.map((name) => make_unknown_temp(name, context)));
268
261
  statements.push(`${temp_name} = ${yield_text};`);
269
262
  statements.push(`(${binding_text} = ${temp_name});`);
270
263
  deps.push(...collect_deps(yield_text));
@@ -272,6 +265,7 @@ function lower_variable_statement(stmt, content, context) {
272
265
  }
273
266
  return {
274
267
  temps,
268
+ type_helpers,
275
269
  rewritten_text: rewritten_decls.length === 0 ? "" : `${has_bare_yield ? "let" : kind} ${rewritten_decls.join(", ")};`,
276
270
  effect_blocks: statements.length === 0 ? [] : [make_effect_block(statements, deps)],
277
271
  range: {
@@ -303,14 +297,29 @@ function lower_expression_statement(stmt, content, context) {
303
297
  }
304
298
  };
305
299
  }
306
- if (ts.isBinaryExpression(expr) && expr.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
300
+ if (ts.isBinaryExpression(expr) && is_assignment_operator(expr)) {
307
301
  const target = slice(content, expr.left).trim();
308
- const yield_text = extract_yield_star_full_text(expr, content);
309
302
  const target_names = collect_assignment_target_names(expr.left);
303
+ if (expr.operatorToken.kind === ts.SyntaxKind.EqualsToken && is_yield_star_expression(expr.right)) {
304
+ const yield_text = extract_yield_star_full_text(expr.right, content);
305
+ return {
306
+ temps: [],
307
+ rewritten_text: "",
308
+ effect_blocks: [make_effect_block([`${target} = ${yield_text};`], collect_deps(yield_text, target_names))],
309
+ range: {
310
+ start: stmt.getStart(),
311
+ end: stmt.end
312
+ }
313
+ };
314
+ }
315
+ const lowered = lower_expression_yields(expr.right, content, make_temp_hint(target), context);
316
+ const temp_names = lowered.temps.map((temp) => temp.name);
317
+ const statement = `${target} ${slice(content, expr.operatorToken).trim()} ${lowered.rewritten_expr};`;
310
318
  return {
311
- temps: [],
319
+ temps: lowered.temps,
320
+ type_helpers: lowered.type_helpers,
312
321
  rewritten_text: "",
313
- effect_blocks: [make_effect_block([`${target} = ${yield_text};`], collect_deps(yield_text, target_names))],
322
+ effect_blocks: [make_effect_block([...lowered.effect_blocks.flatMap((block) => block.statements), statement], [...lowered.effect_blocks.flatMap((block) => block.deps), ...collect_deps(lowered.rewritten_expr, [...target_names, ...temp_names])])],
314
323
  range: {
315
324
  start: stmt.getStart(),
316
325
  end: stmt.end
@@ -318,8 +327,9 @@ function lower_expression_statement(stmt, content, context) {
318
327
  };
319
328
  }
320
329
  const lowered = lower_expression_yields(expr, content, "call", context);
321
- return {
330
+ if (is_top_level_rune_call(expr)) return {
322
331
  temps: lowered.temps,
332
+ type_helpers: lowered.type_helpers,
323
333
  rewritten_text: lowered.rewritten_expr + ";",
324
334
  effect_blocks: lowered.effect_blocks,
325
335
  range: {
@@ -327,16 +337,35 @@ function lower_expression_statement(stmt, content, context) {
327
337
  end: stmt.end
328
338
  }
329
339
  };
340
+ const temp_names = lowered.temps.map((temp) => temp.name);
341
+ return {
342
+ temps: lowered.temps,
343
+ type_helpers: lowered.type_helpers,
344
+ rewritten_text: "",
345
+ effect_blocks: [make_effect_block([...lowered.effect_blocks.flatMap((block) => block.statements), lowered.rewritten_expr + ";"], [...lowered.effect_blocks.flatMap((block) => block.deps), ...collect_deps(lowered.rewritten_expr, temp_names)])],
346
+ range: {
347
+ start: stmt.getStart(),
348
+ end: stmt.end
349
+ }
350
+ };
330
351
  }
331
352
  function lower_expression_yields(expr, content, hint, context) {
332
353
  const replacements = [];
333
354
  const temps = [];
355
+ const type_helpers = [];
334
356
  const statements = [];
335
357
  const deps = [];
336
358
  collect_yield_star_nodes(expr, (node) => {
337
359
  const temp_name = context.next_temp_name(hint);
338
360
  const yield_text = slice_start(content, node).trim();
339
- temps.push({ name: temp_name });
361
+ const type_helper = make_yield_type_helper(yield_text, hint, context);
362
+ if (type_helper) {
363
+ type_helpers.push(type_helper.declaration);
364
+ temps.push({
365
+ name: temp_name,
366
+ type: type_helper.type
367
+ });
368
+ } else temps.push({ name: temp_name });
340
369
  statements.push(`${temp_name} = ${yield_text};`);
341
370
  deps.push(...collect_deps(yield_text));
342
371
  replacements.push({
@@ -347,6 +376,7 @@ function lower_expression_yields(expr, content, hint, context) {
347
376
  });
348
377
  if (replacements.length === 0) return {
349
378
  temps,
379
+ type_helpers,
350
380
  rewritten_expr: slice(content, expr).trim(),
351
381
  effect_blocks: []
352
382
  };
@@ -356,15 +386,54 @@ function lower_expression_yields(expr, content, hint, context) {
356
386
  for (const replacement of replacements) text = text.slice(0, replacement.start - offset_in_expr) + replacement.text + text.slice(replacement.end - offset_in_expr);
357
387
  return {
358
388
  temps,
389
+ type_helpers,
359
390
  rewritten_expr: text.trim(),
360
391
  effect_blocks: [make_effect_block(statements, deps)]
361
392
  };
362
393
  }
394
+ function make_yield_type_helper(yield_text, hint, context) {
395
+ if (!context.emit_types) return;
396
+ const helper_name = context.next_type_helper_name(hint);
397
+ return {
398
+ declaration: `function ${helper_name}() { return (${strip_yield_star(yield_text)}); }`,
399
+ type: `${context.effect_name}.Success<ReturnType<typeof ${helper_name}>> | undefined`
400
+ };
401
+ }
402
+ function make_unknown_temp(name, context) {
403
+ return {
404
+ name,
405
+ type: context.emit_types ? "unknown" : void 0
406
+ };
407
+ }
408
+ function make_state_placeholder(rune_name, type, context) {
409
+ if (type) return `${rune_name}<${type}>(undefined)`;
410
+ if (context.emit_types) return `${rune_name}<unknown>(undefined)`;
411
+ return `${rune_name}(undefined)`;
412
+ }
413
+ function strip_yield_star(yield_text) {
414
+ return yield_text.replace(/^yield\*\s*/, "");
415
+ }
363
416
  function rewrite_state_rune_as_derived(expression) {
364
417
  const state_call = expression.match(/^\$state(?:\.raw)?\(([\s\S]*)\)$/);
365
418
  if (!state_call) return expression;
366
419
  return `$derived(${state_call[1]})`;
367
420
  }
421
+ function should_wrap_complex_initializer_as_derived(expr, content) {
422
+ const text = slice(content, expr).trim();
423
+ return !/^\$derived(?:\.by)?\(/.test(text) && !/^\$inspect(?:\.trace)?\(/.test(text);
424
+ }
425
+ function is_assignment_operator(expr) {
426
+ return expr.operatorToken.kind >= ts.SyntaxKind.FirstAssignment && expr.operatorToken.kind <= ts.SyntaxKind.LastAssignment;
427
+ }
428
+ function is_top_level_rune_call(expr) {
429
+ if (!ts.isCallExpression(expr)) return false;
430
+ const callee = expr.expression;
431
+ if (ts.isIdentifier(callee)) return callee.text.startsWith("$");
432
+ return ts.isPropertyAccessExpression(callee) && ts.isIdentifier(callee.expression) && callee.expression.text.startsWith("$");
433
+ }
434
+ function make_temp_hint(target) {
435
+ return target.match(/[A-Za-z_$][\w$]*$/)?.[0] ?? "assignment";
436
+ }
368
437
  function extract_yield_star_full_text(expr, content) {
369
438
  let found;
370
439
  find_yield_star_node(expr, (node) => {
@@ -413,35 +482,58 @@ function collect_assignment_target_names(node) {
413
482
  * @since 2.0.0
414
483
  * @param content - The raw `<script effect>` body content.
415
484
  * @param filename - The source filename, used in error messages.
485
+ * @param options - Optional transform settings for generated script code.
416
486
  * @returns The transformed code and any block references.
417
487
  */
418
- function transform_script_effect(content, filename) {
488
+ function transform_script_effect(content, filename, options = {}) {
419
489
  let temp_counter = 0;
420
490
  const source_file = ts.createSourceFile(filename, content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
421
491
  const magic = new MagicString(content);
422
492
  const effect_blocks = [];
423
493
  const block_refs = [];
494
+ const top_level_binding_names = collect_top_level_binding_names(source_file);
495
+ const top_level_binding_names_set = new Set(top_level_binding_names);
496
+ const name_allocator = make_name_allocator(top_level_binding_names);
497
+ const emit_types = options.emit_types ?? true;
424
498
  let has_effect = false;
425
- const context = { next_temp_name(hint) {
426
- const suffix = temp_counter === 0 ? "" : `_${temp_counter}`;
427
- const name = hint ? `__SER___${hint}${suffix}` : `__SER___${temp_counter}`;
428
- temp_counter += 1;
429
- return name;
430
- } };
431
499
  /** Phase 1: detect imports already provided by the user. */
432
500
  const has_effect_import = has_local_import_binding(source_file, "effect", "Effect");
433
501
  const has_dispatcher_import = has_local_import_binding(source_file, "svelte-effect-runtime/internal/generators", "get_dispatcher");
434
502
  const has_untrack_import = has_local_import_binding(source_file, "svelte", "untrack");
503
+ const reserve_runtime_import = (name) => top_level_binding_names_set.has(name) ? name_allocator.reserve(make_generated_name(name, "")) : name_allocator.reserve(name);
504
+ const runtime_bindings = {
505
+ cancel: name_allocator.reserve("__SER___cancel"),
506
+ dispatcher: has_dispatcher_import ? "get_dispatcher" : reserve_runtime_import("get_dispatcher"),
507
+ dispatcher_value: name_allocator.reserve("__SER___dispatcher"),
508
+ effect: has_effect_import ? "Effect" : reserve_runtime_import("Effect"),
509
+ program: name_allocator.reserve("__SER___program"),
510
+ untrack: has_untrack_import ? "untrack" : reserve_runtime_import("untrack")
511
+ };
512
+ const context = {
513
+ effect_name: runtime_bindings.effect,
514
+ emit_types,
515
+ next_temp_name(hint) {
516
+ const suffix = temp_counter === 0 ? "" : `_${temp_counter}`;
517
+ const name = make_generated_name(hint ?? String(temp_counter), suffix);
518
+ temp_counter += 1;
519
+ return name_allocator.reserve(name);
520
+ },
521
+ next_type_helper_name(hint) {
522
+ return name_allocator.reserve(make_generated_name(`type_${hint ?? "effect"}`, ""));
523
+ }
524
+ };
435
525
  /** Phase 2: lower every top-level statement that contains `yield*`. */
436
526
  for (const stmt of source_file.statements) {
437
527
  validate_rune_yield_usage(stmt, content, filename);
528
+ validate_script_yield_boundaries(stmt, content, filename);
438
529
  if (!contains_top_level_yield_star(stmt)) continue;
439
530
  if (contains_top_level_await(stmt)) throw new AwaitInEffectWorkError(filename, slice(content, stmt));
440
531
  has_effect = true;
441
532
  const lowered = lower_statement(stmt, content, context);
442
533
  magic.overwrite(lowered.range.start, lowered.range.end, lowered.rewritten_text);
443
- if (lowered.temps.length > 0) {
444
- const prefix = lowered.temps.map((temp) => `let ${temp.name} = $state(undefined);`).join("\n");
534
+ if (lowered.temps.length > 0 || lowered.type_helpers?.length) {
535
+ const temp_declarations = lowered.temps.map((temp) => temp.type ? `let ${temp.name} = $state<${temp.type}>(undefined);` : `let ${temp.name} = $state(undefined);`);
536
+ const prefix = [...lowered.type_helpers ?? [], ...temp_declarations].join("\n");
445
537
  magic.appendLeft(lowered.range.start, prefix + "\n");
446
538
  }
447
539
  effect_blocks.push(...lowered.effect_blocks);
@@ -457,12 +549,12 @@ function transform_script_effect(content, filename) {
457
549
  };
458
550
  }
459
551
  /** Phase 3: inject runtime imports after the last user import. */
460
- const imports = make_imports(has_effect_import, has_dispatcher_import, has_untrack_import);
552
+ const imports = make_imports(has_effect_import, has_dispatcher_import, has_untrack_import, runtime_bindings);
461
553
  const last_import = [...source_file.statements].reverse().find(ts.isImportDeclaration);
462
554
  if (last_import) magic.appendRight(last_import.end, "\n" + imports);
463
555
  else magic.prepend(imports + "\n");
464
556
  /** Phase 4: append the runtime program and lifecycle wiring. */
465
- const runtime_block = make_runtime_block(effect_blocks);
557
+ const runtime_block = make_runtime_block_with_bindings(effect_blocks, runtime_bindings);
466
558
  magic.append("\n" + runtime_block);
467
559
  block_refs.push({
468
560
  id: filename,
@@ -474,7 +566,48 @@ function transform_script_effect(content, filename) {
474
566
  map: create_source_map(magic, filename)
475
567
  };
476
568
  }
569
+ function validate_script_yield_boundaries(stmt, content, filename) {
570
+ const bad_member = find_class_member_with_yield_star(stmt);
571
+ if (!bad_member) return;
572
+ throw new PreprocessError([
573
+ `[ASYNC_EFFECT_IN_CLASS_MEMBER]: ${filename}: yield* cannot be used inside class members.`,
574
+ `Class fields and methods are not component top-level reactive work. Move the Effect work into a script effect statement before assigning it to the class instance.`,
575
+ "",
576
+ "Problematic member:",
577
+ slice(content, bad_member)
578
+ ].join("\n"), filename);
579
+ }
580
+ function find_class_member_with_yield_star(stmt) {
581
+ let found;
582
+ function visit(node) {
583
+ if (found) return;
584
+ if (ts.isPropertyDeclaration(node) && node.initializer && contains_top_level_yield_star(node.initializer)) {
585
+ found = node;
586
+ return;
587
+ }
588
+ node.forEachChild(visit);
589
+ }
590
+ visit(stmt);
591
+ return found;
592
+ }
593
+ function make_name_allocator(initial_names) {
594
+ const used_names = new Set(initial_names);
595
+ return { reserve(name) {
596
+ let candidate = name;
597
+ let suffix = 1;
598
+ while (used_names.has(candidate)) {
599
+ candidate = `${name}_${suffix}`;
600
+ suffix += 1;
601
+ }
602
+ used_names.add(candidate);
603
+ return candidate;
604
+ } };
605
+ }
606
+ function make_generated_name(hint, suffix) {
607
+ const normalized_hint = hint.replace(/[^A-Za-z0-9_$]/g, "_");
608
+ return `__SER___${/^[A-Za-z_$]/.test(normalized_hint) ? normalized_hint : `temp_${normalized_hint}`}${suffix}`;
609
+ }
477
610
  //#endregion
478
611
  export { transform_script_effect as t };
479
612
 
480
- //# sourceMappingURL=preprocess-Cn4JH9OO.js.map
613
+ //# sourceMappingURL=preprocess-DseI9Doo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess-DseI9Doo.js","names":[],"sources":["../../../modules/svelte-effect-runtime/src/preprocess/source.ts","../../../modules/svelte-effect-runtime/src/preprocess/runtime-block.ts","../../../modules/svelte-effect-runtime/src/preprocess/runes.ts","../../../modules/svelte-effect-runtime/src/preprocess/lower.ts","../../../modules/svelte-effect-runtime/src/preprocess/index.ts"],"sourcesContent":["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 type { EffectBlock, RuntimeImportBindings } from \"./types.ts\";\n\n/**\n * Builds the runtime blocks appended to lowered script effect code.\n *\n * @since 2.0.0\n * @param blocks - Effect bodies and dependency reads to emit.\n * @returns Full `$effect` blocks that fork generated `Effect.gen` programs.\n */\nexport function make_runtime_block(blocks: EffectBlock[]): string {\n const bindings: RuntimeImportBindings = {\n cancel: \"__SER___cancel\",\n dispatcher: \"get_dispatcher\",\n dispatcher_value: \"__SER___dispatcher\",\n effect: \"Effect\",\n program: \"__SER___program\",\n untrack: \"untrack\",\n };\n\n return make_runtime_block_with_bindings(blocks, bindings);\n}\n\n/**\n * Builds the runtime blocks appended to lowered script effect code with\n * explicit runtime import bindings.\n *\n * @since 2.4.2\n * @param blocks - Effect bodies and dependency reads to emit.\n * @param bindings - Runtime binding names available in the generated code.\n * @returns Full `$effect` blocks that fork generated `Effect.gen` programs.\n */\nexport function make_runtime_block_with_bindings(\n blocks: EffectBlock[],\n bindings: RuntimeImportBindings,\n): string {\n const merged_block = merge_effect_blocks(blocks);\n const dep_reads = merged_block.deps.map((dep) => ` ${dep};`);\n\n const body = merged_block.statements\n .map((statement) => ` ${statement}`)\n .join(\"\\n\");\n\n return [\n \"\",\n \"$effect(() => {\",\n ...dep_reads,\n ` const ${bindings.dispatcher_value} = ${bindings.dispatcher}();`,\n ` const ${bindings.program} = ${bindings.effect}.gen(function* () {`,\n body,\n \" });\",\n ` const ${bindings.cancel} = ${bindings.untrack}(() => ${bindings.dispatcher_value}.fork(${bindings.program}));`,\n ` import.meta.hot?.dispose(${bindings.cancel});`,\n ` return ${bindings.cancel};`,\n \"});\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction merge_effect_blocks(blocks: EffectBlock[]): EffectBlock {\n const statements = blocks.flatMap((block) => block.statements);\n const deps = blocks.flatMap((block) => block.deps);\n\n return {\n statements,\n deps: [...new Set(deps)],\n };\n}\n","import { contains_top_level_yield_star } from \"$/detect.ts\";\nimport { AsyncEffectInSyncRuneError } from \"$/error.ts\";\nimport { slice } from \"./source.ts\";\n\nimport ts from \"typescript\";\n\nconst ASYNC_EXPRESSION_RUNES = new Set([\n \"$derived\",\n \"$inspect\",\n \"$state\",\n \"$state.raw\",\n]);\n\nconst CALLBACK_RUNES = new Set([\n \"$derived.by\",\n \"$effect\",\n \"$effect.pre\",\n \"$effect.root\",\n]);\n\n/**\n * Validates that `yield*` only appears in rune positions the script-effect\n * transform can lower without changing the rune's normal Svelte contract.\n *\n * @since 2.0.0\n * @param node - AST node to scan.\n * @param content - Original script source used for diagnostics.\n * @param filename - Source filename used for diagnostics.\n * @returns Nothing.\n */\nexport function validate_rune_yield_usage(\n node: ts.Node,\n content: string,\n filename: string,\n): void {\n visit_rune_yield_usage(node, content, filename);\n}\n\n/**\n * Identifies `$state(...)` and `$state.raw(...)` initializer calls.\n *\n * @since 2.0.0\n * @param expr - Expression to classify.\n * @param content - Original script source used to preserve argument text.\n * @returns State rune details when the expression is a state initializer.\n */\nexport function get_state_rune_initializer(\n expr: ts.Expression,\n content: string,\n): { rune_name: \"$state\" | \"$state.raw\"; value_text: string } | undefined {\n if (!ts.isCallExpression(expr)) {\n return undefined;\n }\n\n const rune_name = get_rune_name(expr.expression);\n\n if (rune_name !== \"$state\" && rune_name !== \"$state.raw\") {\n return undefined;\n }\n\n const first_arg = expr.arguments[0];\n\n if (!first_arg) {\n return undefined;\n }\n\n return {\n rune_name,\n value_text: slice(content, first_arg).trim(),\n };\n}\n\nfunction visit_rune_yield_usage(\n node: ts.Node,\n content: string,\n filename: string,\n): void {\n if (ts.isCallExpression(node)) {\n validate_call_expression(node, content, filename);\n }\n\n node.forEachChild((child) => {\n visit_rune_yield_usage(child, content, filename);\n });\n}\n\nfunction validate_call_expression(\n call: ts.CallExpression,\n content: string,\n filename: string,\n): void {\n const rune_name = get_rune_name(call.expression);\n\n if (!rune_name) {\n return;\n }\n\n if (\n !ASYNC_EXPRESSION_RUNES.has(rune_name) &&\n contains_top_level_yield_star(call)\n ) {\n throw new AsyncEffectInSyncRuneError(\n rune_name,\n slice(content, call),\n filename,\n );\n }\n\n if (!CALLBACK_RUNES.has(rune_name)) {\n return;\n }\n\n const callback = call.arguments[0];\n\n if (!callback || !callback_has_top_level_yield_star(callback)) {\n return;\n }\n\n throw new AsyncEffectInSyncRuneError(\n rune_name,\n slice(content, call),\n filename,\n );\n}\n\nfunction callback_has_top_level_yield_star(node: ts.Expression): boolean {\n if (\n (ts.isArrowFunction(node) ||\n ts.isFunctionExpression(node)) &&\n node.body !== undefined\n ) {\n return contains_top_level_yield_star(node.body);\n }\n\n return contains_top_level_yield_star(node);\n}\n\nfunction get_rune_name(expr: ts.Expression): string | undefined {\n if (ts.isIdentifier(expr) && is_rune_root(expr.text)) {\n return expr.text;\n }\n\n if (!ts.isPropertyAccessExpression(expr)) {\n return undefined;\n }\n\n const root_name = get_rune_name(expr.expression);\n\n if (!root_name) {\n return undefined;\n }\n\n return `${root_name}.${expr.name.text}`;\n}\n\nfunction is_rune_root(name: string): boolean {\n return (\n name === \"$bindable\" ||\n name === \"$derived\" ||\n name === \"$effect\" ||\n name === \"$host\" ||\n name === \"$inspect\" ||\n name === \"$props\" ||\n name === \"$state\"\n );\n}\n","import { collect_free_identifiers } from \"$/markup/transform/expressions.ts\";\nimport { contains_top_level_yield_star } from \"$/detect.ts\";\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 { get_state_rune_initializer } from \"./runes.ts\";\nimport { slice, slice_start } from \"./source.ts\";\nimport type {\n EffectBlock,\n LoweredExpression,\n LoweredStatement,\n ScriptLoweringContext,\n TempBinding,\n} from \"./types.ts\";\n\nimport ts from \"typescript\";\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_blocks: [make_effect_block([text], collect_deps(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 type_helpers: string[] = [];\n const rewritten_decls: string[] = [];\n const statements: string[] = [];\n const deps: 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 if (contains_top_level_yield_star(decl.name)) {\n has_bare_yield = true;\n\n const binding_text = slice(content, decl.name).trim();\n const initializer_text = decl.initializer\n ? slice(content, decl.initializer).trim()\n : \"undefined\";\n const names = extract_binding_names(decl.name);\n const statement = `(${binding_text} = ${initializer_text});`;\n\n temps.push(...names.map((name) => make_unknown_temp(name, context)));\n statements.push(statement);\n deps.push(...collect_deps(statement, names));\n\n continue;\n }\n\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 const yield_text = extract_yield_star_full_text(\n decl.initializer,\n content,\n );\n const type_helper = make_yield_type_helper(\n yield_text,\n original_name,\n context,\n );\n\n if (type_helper) {\n type_helpers.push(type_helper.declaration);\n temps.push({ name: temp_name, type: type_helper.type });\n } else {\n temps.push({ name: temp_name });\n }\n\n has_bare_yield = true;\n rewritten_decls.push(`${original_name} = $derived(${temp_name})`);\n\n statements.push(`${temp_name} = ${yield_text};`);\n deps.push(...collect_deps(yield_text));\n } else {\n const state_rune = get_state_rune_initializer(\n decl.initializer,\n content,\n );\n\n if (state_rune) {\n const direct_yield_text = extract_yield_star_full_text(\n decl.initializer,\n content,\n );\n const state_type = direct_yield_text === state_rune.value_text\n ? make_yield_type_helper(\n state_rune.value_text,\n original_name,\n context,\n )\n : undefined;\n\n if (state_type) {\n type_helpers.push(state_type.declaration);\n }\n\n has_bare_yield = true;\n rewritten_decls.push(\n `${original_name} = ${\n make_state_placeholder(\n state_rune.rune_name,\n state_type?.type,\n context,\n )\n }`,\n );\n statements.push(`${original_name} = ${state_rune.value_text};`);\n deps.push(...collect_deps(state_rune.value_text));\n continue;\n }\n\n const lowered = lower_expression_yields(\n decl.initializer,\n content,\n original_name,\n context,\n );\n\n temps.push(...lowered.temps);\n type_helpers.push(...(lowered.type_helpers ?? []));\n for (const block of lowered.effect_blocks) {\n statements.push(...block.statements);\n deps.push(...block.deps);\n }\n\n const rewritten_expr = rewrite_state_rune_as_derived(\n lowered.rewritten_expr,\n );\n const final_expr = should_wrap_complex_initializer_as_derived(\n decl.initializer,\n content,\n )\n ? `$derived(${rewritten_expr})`\n : rewritten_expr;\n\n if (final_expr !== rewritten_expr) {\n has_bare_yield = true;\n }\n\n rewritten_decls.push(`${original_name} = ${final_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 const yield_text = extract_yield_star_full_text(\n decl.initializer,\n content,\n );\n const type_helper = make_yield_type_helper(\n yield_text,\n \"destructure\",\n context,\n );\n\n if (type_helper) {\n type_helpers.push(type_helper.declaration);\n temps.push({ name: temp_name, type: type_helper.type });\n } else {\n temps.push({ name: temp_name });\n }\n\n temps.push(...names.map((name) => make_unknown_temp(name, context)));\n\n statements.push(`${temp_name} = ${yield_text};`);\n statements.push(`(${binding_text} = ${temp_name});`);\n deps.push(...collect_deps(yield_text));\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 type_helpers,\n rewritten_text,\n effect_blocks: statements.length === 0\n ? []\n : [make_effect_block(statements, deps)],\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_blocks: [],\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_blocks: [make_effect_block([text + \";\"], collect_deps(text))],\n range: { start: stmt.getFullStart(), end: stmt.end },\n };\n }\n\n if (ts.isBinaryExpression(expr) && is_assignment_operator(expr)) {\n const target = slice(content, expr.left).trim();\n const target_names = collect_assignment_target_names(expr.left);\n\n if (\n expr.operatorToken.kind === ts.SyntaxKind.EqualsToken &&\n is_yield_star_expression(expr.right)\n ) {\n const yield_text = extract_yield_star_full_text(expr.right, content);\n\n return {\n temps: [],\n rewritten_text: \"\",\n effect_blocks: [\n make_effect_block(\n [`${target} = ${yield_text};`],\n collect_deps(yield_text, target_names),\n ),\n ],\n range: { start: stmt.getStart(), end: stmt.end },\n };\n }\n\n const lowered = lower_expression_yields(\n expr.right,\n content,\n make_temp_hint(target),\n context,\n );\n const temp_names = lowered.temps.map((temp) => temp.name);\n const statement = `${target} ${\n slice(content, expr.operatorToken).trim()\n } ${lowered.rewritten_expr};`;\n\n return {\n temps: lowered.temps,\n type_helpers: lowered.type_helpers,\n rewritten_text: \"\",\n effect_blocks: [\n make_effect_block(\n [\n ...lowered.effect_blocks.flatMap((block) => block.statements),\n statement,\n ],\n [\n ...lowered.effect_blocks.flatMap((block) => block.deps),\n ...collect_deps(lowered.rewritten_expr, [\n ...target_names,\n ...temp_names,\n ]),\n ],\n ),\n ],\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 if (is_top_level_rune_call(expr)) {\n return {\n temps: lowered.temps,\n type_helpers: lowered.type_helpers,\n rewritten_text: lowered.rewritten_expr + \";\",\n effect_blocks: lowered.effect_blocks,\n range: { start: stmt.getStart(), end: stmt.end },\n };\n }\n\n const temp_names = lowered.temps.map((temp) => temp.name);\n\n return {\n temps: lowered.temps,\n type_helpers: lowered.type_helpers,\n rewritten_text: \"\",\n effect_blocks: [\n make_effect_block(\n [\n ...lowered.effect_blocks.flatMap((block) => block.statements),\n lowered.rewritten_expr + \";\",\n ],\n [\n ...lowered.effect_blocks.flatMap((block) => block.deps),\n ...collect_deps(lowered.rewritten_expr, temp_names),\n ],\n ),\n ],\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 type_helpers: string[] = [];\n const statements: string[] = [];\n const deps: 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 const type_helper = make_yield_type_helper(yield_text, hint, context);\n\n if (type_helper) {\n type_helpers.push(type_helper.declaration);\n temps.push({ name: temp_name, type: type_helper.type });\n } else {\n temps.push({ name: temp_name });\n }\n\n statements.push(`${temp_name} = ${yield_text};`);\n deps.push(...collect_deps(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 type_helpers,\n rewritten_expr: slice(content, expr).trim(),\n effect_blocks: [],\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 type_helpers,\n rewritten_expr: text.trim(),\n effect_blocks: [make_effect_block(statements, deps)],\n };\n}\n\nfunction make_yield_type_helper(\n yield_text: string,\n hint: string,\n context: ScriptLoweringContext,\n): { declaration: string; type: string } | undefined {\n if (!context.emit_types) {\n return undefined;\n }\n\n const helper_name = context.next_type_helper_name(hint);\n const effect_text = strip_yield_star(yield_text);\n\n return {\n declaration: `function ${helper_name}() { return (${effect_text}); }`,\n type:\n `${context.effect_name}.Success<ReturnType<typeof ${helper_name}>> | undefined`,\n };\n}\n\nfunction make_unknown_temp(\n name: string,\n context: ScriptLoweringContext,\n): TempBinding {\n return {\n name,\n type: context.emit_types ? \"unknown\" : undefined,\n };\n}\n\nfunction make_state_placeholder(\n rune_name: string,\n type: string | undefined,\n context: ScriptLoweringContext,\n): string {\n if (type) {\n return `${rune_name}<${type}>(undefined)`;\n }\n\n if (context.emit_types) {\n return `${rune_name}<unknown>(undefined)`;\n }\n\n return `${rune_name}(undefined)`;\n}\n\nfunction strip_yield_star(yield_text: string): string {\n return yield_text.replace(/^yield\\*\\s*/, \"\");\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 should_wrap_complex_initializer_as_derived(\n expr: ts.Expression,\n content: string,\n): boolean {\n const text = slice(content, expr).trim();\n\n return !/^\\$derived(?:\\.by)?\\(/.test(text) &&\n !/^\\$inspect(?:\\.trace)?\\(/.test(text);\n}\n\nfunction is_assignment_operator(expr: ts.BinaryExpression): boolean {\n return expr.operatorToken.kind >= ts.SyntaxKind.FirstAssignment &&\n expr.operatorToken.kind <= ts.SyntaxKind.LastAssignment;\n}\n\nfunction is_top_level_rune_call(expr: ts.Expression): boolean {\n if (!ts.isCallExpression(expr)) {\n return false;\n }\n\n const callee = expr.expression;\n\n if (ts.isIdentifier(callee)) {\n return callee.text.startsWith(\"$\");\n }\n\n return ts.isPropertyAccessExpression(callee) &&\n ts.isIdentifier(callee.expression) &&\n callee.expression.text.startsWith(\"$\");\n}\n\nfunction make_temp_hint(target: string): string {\n const match = target.match(/[A-Za-z_$][\\w$]*$/);\n\n return match?.[0] ?? \"assignment\";\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\nfunction make_effect_block(\n statements: string[],\n deps: string[],\n): EffectBlock {\n return {\n statements,\n deps: [...new Set(deps)],\n };\n}\n\nfunction collect_deps(\n expr_text: string,\n excluded_names: readonly string[] = [],\n): string[] {\n const excluded = new Set(excluded_names);\n\n return collect_free_identifiers(expr_text).filter(\n (identifier) =>\n !identifier.startsWith(\"__SER___\") && !excluded.has(identifier),\n );\n}\n\nfunction collect_assignment_target_names(node: ts.Node): string[] {\n if (ts.isIdentifier(node)) {\n return [node.text];\n }\n\n if (ts.isParenthesizedExpression(node)) {\n return collect_assignment_target_names(node.expression);\n }\n\n if (\n ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node)\n ) {\n return collect_assignment_target_names(node.expression);\n }\n\n if (ts.isObjectLiteralExpression(node)) {\n return node.properties.flatMap((property) => {\n if (ts.isShorthandPropertyAssignment(property)) {\n return [property.name.text];\n }\n\n if (ts.isPropertyAssignment(property)) {\n return collect_assignment_target_names(property.initializer);\n }\n\n if (ts.isSpreadAssignment(property)) {\n return collect_assignment_target_names(property.expression);\n }\n\n return [];\n });\n }\n\n if (ts.isArrayLiteralExpression(node)) {\n return node.elements.flatMap((element) =>\n ts.isSpreadElement(element)\n ? collect_assignment_target_names(element.expression)\n : collect_assignment_target_names(element)\n );\n }\n\n return [];\n}\n","import { contains_top_level_yield_star } from \"$/detect.ts\";\nimport {\n collect_top_level_binding_names,\n has_local_import_binding,\n make_imports,\n} from \"./imports.ts\";\nimport { create_source_map, slice } from \"./source.ts\";\nimport { AwaitInEffectWorkError, PreprocessError } from \"$/error.ts\";\nimport { make_runtime_block_with_bindings } from \"./runtime-block.ts\";\nimport { contains_top_level_await } from \"./ast.ts\";\nimport { lower_statement } from \"./lower.ts\";\nimport { validate_rune_yield_usage } from \"./runes.ts\";\nimport type {\n BlockRef,\n EffectBlock,\n RuntimeImportBindings,\n ScriptLoweringContext,\n ScriptTransformResult,\n} from \"./types.ts\";\n\nimport MagicString from \"magic-string\";\nimport ts from \"typescript\";\n\nexport type { BlockRef, ScriptTransformResult } from \"./types.ts\";\n\ninterface ScriptTransformOptions {\n emit_types?: boolean;\n}\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 a dependency-tracked `$effect` block.\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 * @param options - Optional transform settings for generated script code.\n * @returns The transformed code and any block references.\n */\nexport function transform_script_effect(\n content: string,\n filename: string,\n options: ScriptTransformOptions = {},\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_blocks: EffectBlock[] = [];\n const block_refs: BlockRef[] = [];\n const top_level_binding_names = collect_top_level_binding_names(source_file);\n const top_level_binding_names_set = new Set(top_level_binding_names);\n const name_allocator = make_name_allocator(top_level_binding_names);\n const emit_types = options.emit_types ?? true;\n\n let has_effect = false;\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_dispatcher_import = has_local_import_binding(\n source_file,\n \"svelte-effect-runtime/internal/generators\",\n \"get_dispatcher\",\n );\n\n const has_untrack_import = has_local_import_binding(\n source_file,\n \"svelte\",\n \"untrack\",\n );\n\n const reserve_runtime_import = (name: string) =>\n top_level_binding_names_set.has(name)\n ? name_allocator.reserve(make_generated_name(name, \"\"))\n : name_allocator.reserve(name);\n\n const runtime_bindings: RuntimeImportBindings = {\n cancel: name_allocator.reserve(\"__SER___cancel\"),\n dispatcher: has_dispatcher_import\n ? \"get_dispatcher\"\n : reserve_runtime_import(\"get_dispatcher\"),\n dispatcher_value: name_allocator.reserve(\"__SER___dispatcher\"),\n effect: has_effect_import ? \"Effect\" : reserve_runtime_import(\"Effect\"),\n program: name_allocator.reserve(\"__SER___program\"),\n untrack: has_untrack_import ? \"untrack\" : reserve_runtime_import(\"untrack\"),\n };\n\n const context: ScriptLoweringContext = {\n effect_name: runtime_bindings.effect,\n emit_types,\n next_temp_name(hint?: string) {\n const suffix = temp_counter === 0 ? \"\" : `_${temp_counter}`;\n const name = make_generated_name(hint ?? String(temp_counter), suffix);\n\n temp_counter += 1;\n\n return name_allocator.reserve(name);\n },\n next_type_helper_name(hint?: string) {\n return name_allocator.reserve(\n make_generated_name(`type_${hint ?? \"effect\"}`, \"\"),\n );\n },\n };\n\n /** Phase 2: lower every top-level statement that contains `yield*`. */\n for (const stmt of source_file.statements) {\n validate_rune_yield_usage(stmt, content, filename);\n validate_script_yield_boundaries(stmt, content, filename);\n\n const has_top_level_yield_star = contains_top_level_yield_star(stmt);\n\n if (!has_top_level_yield_star) {\n continue;\n }\n\n if (contains_top_level_await(stmt)) {\n const text = slice(content, stmt);\n throw new AwaitInEffectWorkError(filename, text);\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 || lowered.type_helpers?.length) {\n const temp_declarations = lowered.temps.map((temp) =>\n temp.type\n ? `let ${temp.name} = $state<${temp.type}>(undefined);`\n : `let ${temp.name} = $state(undefined);`\n );\n\n const prefix = [\n ...(lowered.type_helpers ?? []),\n ...temp_declarations,\n ].join(\"\\n\");\n\n magic.appendLeft(lowered.range.start, prefix + \"\\n\");\n }\n\n effect_blocks.push(...lowered.effect_blocks);\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_dispatcher_import,\n has_untrack_import,\n runtime_bindings,\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_with_bindings(\n effect_blocks,\n runtime_bindings,\n );\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\nfunction validate_script_yield_boundaries(\n stmt: ts.Statement,\n content: string,\n filename: string,\n): void {\n const bad_member = find_class_member_with_yield_star(stmt);\n\n if (!bad_member) {\n return;\n }\n\n throw new PreprocessError(\n [\n `[ASYNC_EFFECT_IN_CLASS_MEMBER]: ${filename}: yield* cannot be used inside class members.`,\n `Class fields and methods are not component top-level reactive work. Move the Effect work into a script effect statement before assigning it to the class instance.`,\n \"\",\n \"Problematic member:\",\n slice(content, bad_member),\n ].join(\"\\n\"),\n filename,\n );\n}\n\nfunction find_class_member_with_yield_star(\n stmt: ts.Statement,\n): ts.Node | undefined {\n let found: ts.Node | undefined;\n\n function visit(node: ts.Node): void {\n if (found) {\n return;\n }\n\n if (\n ts.isPropertyDeclaration(node) &&\n node.initializer &&\n contains_top_level_yield_star(node.initializer)\n ) {\n found = node;\n return;\n }\n\n node.forEachChild(visit);\n }\n\n visit(stmt);\n\n return found;\n}\n\nfunction make_name_allocator(initial_names: readonly string[]): {\n reserve(name: string): string;\n} {\n const used_names = new Set(initial_names);\n\n return {\n reserve(name: string): string {\n let candidate = name;\n let suffix = 1;\n\n while (used_names.has(candidate)) {\n candidate = `${name}_${suffix}`;\n suffix += 1;\n }\n\n used_names.add(candidate);\n\n return candidate;\n },\n };\n}\n\nfunction make_generated_name(hint: string, suffix: string): string {\n const normalized_hint = hint.replace(/[^A-Za-z0-9_$]/g, \"_\");\n const safe_hint = /^[A-Za-z_$]/.test(normalized_hint)\n ? normalized_hint\n : `temp_${normalized_hint}`;\n\n return `__SER___${safe_hint}${suffix}`;\n}\n"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { t as transform_markup_effect } from "./transform-Cx5bjmP6.js";
2
+ import { t as transform_script_effect } from "./preprocess-DseI9Doo.js";
3
+ //#region \0rolldown/runtime.js
4
+ var __defProp = Object.defineProperty;
5
+ var __exportAll = (all, no_symbols) => {
6
+ let target = {};
7
+ for (var name in all) __defProp(target, name, {
8
+ get: all[name],
9
+ enumerable: true
10
+ });
11
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
12
+ return target;
13
+ };
14
+ //#endregion
15
+ //#region src/runtime/transform.ts
16
+ var transform_exports = /* @__PURE__ */ __exportAll({ transform_svelte_effect: () => transform_svelte_effect });
17
+ /**
18
+ * Lowers SER syntax in a complete Svelte component without using Svelte's
19
+ * preprocessor adapter API.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const result = transform_svelte_effect(
24
+ * "<script effect>const value = yield* load()<\/script>",
25
+ * "App.svelte",
26
+ * );
27
+ * ```
28
+ *
29
+ * @since 2.5.0
30
+ * @param content - Full Svelte component source to lower before Svelte parses
31
+ * it.
32
+ * @param filename - Component filename used in generated cache identifiers and
33
+ * diagnostics.
34
+ * @returns The transformed component source.
35
+ */
36
+ function transform_svelte_effect(content, filename = "unknown.svelte") {
37
+ const script = find_script(content);
38
+ let combined = content;
39
+ if (script?.has_effect) {
40
+ const result = transform_script_effect(script.text, filename, { emit_types: script.is_typescript });
41
+ combined = content.slice(0, script.effect_attr_start) + content.slice(script.effect_attr_end, script.open_end) + result.code + content.slice(script.close_start);
42
+ }
43
+ return { code: transform_markup_effect(combined, filename).code };
44
+ }
45
+ function find_script(content) {
46
+ for (const match of content.matchAll(/<script\b([^>]*)>([\s\S]*?)<\/script\s*>/gi)) {
47
+ if (match.index === void 0 || /\bmodule\b/.test(match[1] ?? "")) continue;
48
+ const attrs = match[1] ?? "";
49
+ const effect_match = /\s+effect(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?/.exec(attrs);
50
+ const open_end = match.index + match[0].indexOf(">") + 1;
51
+ const attr_start = effect_match?.index ?? attrs.length;
52
+ const attr_end = attr_start + (effect_match?.[0].length ?? 0);
53
+ return {
54
+ text: match[2],
55
+ open_end,
56
+ close_start: match.index + match[0].lastIndexOf("<"),
57
+ has_effect: effect_match !== null,
58
+ effect_attr_start: match.index + 7 + attr_start,
59
+ effect_attr_end: match.index + 7 + attr_end,
60
+ is_typescript: has_typescript_lang(attrs)
61
+ };
62
+ }
63
+ }
64
+ function has_typescript_lang(attrs) {
65
+ const lang_match = /\blang\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/i.exec(attrs);
66
+ const lang = (lang_match?.[1] ?? lang_match?.[2] ?? lang_match?.[3] ?? "").toLowerCase();
67
+ return lang === "ts" || lang === "typescript";
68
+ }
69
+ //#endregion
70
+ export { transform_svelte_effect as n, transform_exports as t };
71
+
72
+ //# sourceMappingURL=transform-BotzDlj3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-BotzDlj3.js","names":[],"sources":["../../../modules/svelte-effect-runtime/src/runtime/transform.ts"],"sourcesContent":["import { transform_markup_effect } from \"$/markup/transform.ts\";\nimport { transform_script_effect } from \"$/preprocess.ts\";\n\n/**\n * Result returned by the direct whole-file Svelte transform.\n *\n * @example\n * ```ts\n * const result = transform_svelte_effect(\"<p>{yield* load()}</p>\", \"App.svelte\");\n * result.code;\n * ```\n *\n * @since 2.5.0\n */\nexport interface SvelteTransformResult {\n /** Transformed Svelte source. */\n code: string;\n}\n\n/**\n * Lowers SER syntax in a complete Svelte component without using Svelte's\n * preprocessor adapter API.\n *\n * @example\n * ```ts\n * const result = transform_svelte_effect(\n * \"<script effect>const value = yield* load()</script>\",\n * \"App.svelte\",\n * );\n * ```\n *\n * @since 2.5.0\n * @param content - Full Svelte component source to lower before Svelte parses\n * it.\n * @param filename - Component filename used in generated cache identifiers and\n * diagnostics.\n * @returns The transformed component source.\n */\nexport function transform_svelte_effect(\n content: string,\n filename = \"unknown.svelte\",\n): SvelteTransformResult {\n const script = find_script(content);\n\n let combined = content;\n\n if (script?.has_effect) {\n const result = transform_script_effect(script.text, filename, {\n emit_types: script.is_typescript,\n });\n\n combined = content.slice(0, script.effect_attr_start) +\n content.slice(script.effect_attr_end, script.open_end) +\n result.code +\n content.slice(script.close_start);\n }\n\n const result = transform_markup_effect(combined, filename);\n\n return { code: result.code };\n}\n\nfunction find_script(content: string):\n | {\n text: string;\n open_end: number;\n close_start: number;\n has_effect: boolean;\n effect_attr_start: number;\n effect_attr_end: number;\n is_typescript: boolean;\n }\n | undefined {\n const pattern = /<script\\b([^>]*)>([\\s\\S]*?)<\\/script\\s*>/gi;\n\n for (const match of content.matchAll(pattern)) {\n if (match.index === undefined || /\\bmodule\\b/.test(match[1] ?? \"\")) {\n continue;\n }\n\n const attrs = match[1] ?? \"\";\n const effect_match = /\\s+effect(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+))?/\n .exec(attrs);\n const open_end = match.index + match[0].indexOf(\">\") + 1;\n const attr_start = effect_match?.index ?? attrs.length;\n const attr_end = attr_start + (effect_match?.[0].length ?? 0);\n\n return {\n text: match[2],\n open_end,\n close_start: match.index + match[0].lastIndexOf(\"<\"),\n has_effect: effect_match !== null,\n effect_attr_start: match.index + \"<script\".length + attr_start,\n effect_attr_end: match.index + \"<script\".length + attr_end,\n is_typescript: has_typescript_lang(attrs),\n };\n }\n\n return undefined;\n}\n\nfunction has_typescript_lang(attrs: string): boolean {\n const lang_match = /\\blang\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]+))/i.exec(\n attrs,\n );\n const lang = (lang_match?.[1] ?? lang_match?.[2] ?? lang_match?.[3] ?? \"\")\n .toLowerCase();\n\n return lang === \"ts\" || lang === \"typescript\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,SAAgB,wBACd,SACA,WAAW,kBACY;CACvB,MAAM,SAAS,YAAY,OAAO;CAElC,IAAI,WAAW;CAEf,IAAI,QAAQ,YAAY;EACtB,MAAM,SAAS,wBAAwB,OAAO,MAAM,UAAU,EAC5D,YAAY,OAAO,cACrB,CAAC;EAED,WAAW,QAAQ,MAAM,GAAG,OAAO,iBAAiB,IAClD,QAAQ,MAAM,OAAO,iBAAiB,OAAO,QAAQ,IACrD,OAAO,OACP,QAAQ,MAAM,OAAO,WAAW;CACpC;CAIA,OAAO,EAAE,MAFM,wBAAwB,UAAU,QAE7B,EAAE,KAAK;AAC7B;AAEA,SAAS,YAAY,SAUP;CAGZ,KAAK,MAAM,SAAS,QAAQ,SAAS,4CAAO,GAAG;EAC7C,IAAI,MAAM,UAAU,KAAA,KAAa,aAAa,KAAK,MAAM,MAAM,EAAE,GAC/D;EAGF,MAAM,QAAQ,MAAM,MAAM;EAC1B,MAAM,eAAe,mDAClB,KAAK,KAAK;EACb,MAAM,WAAW,MAAM,QAAQ,MAAM,GAAG,QAAQ,GAAG,IAAI;EACvD,MAAM,aAAa,cAAc,SAAS,MAAM;EAChD,MAAM,WAAW,cAAc,eAAe,GAAG,UAAU;EAE3D,OAAO;GACL,MAAM,MAAM;GACZ;GACA,aAAa,MAAM,QAAQ,MAAM,GAAG,YAAY,GAAG;GACnD,YAAY,iBAAiB;GAC7B,mBAAmB,MAAM,QAAQ,IAAmB;GACpD,iBAAiB,MAAM,QAAQ,IAAmB;GAClD,eAAe,oBAAoB,KAAK;EAC1C;CACF;AAGF;AAEA,SAAS,oBAAoB,OAAwB;CACnD,MAAM,aAAa,kDAAkD,KACnE,KACF;CACA,MAAM,QAAQ,aAAa,MAAM,aAAa,MAAM,aAAa,MAAM,IACpE,YAAY;CAEf,OAAO,SAAS,QAAQ,SAAS;AACnC"}