svelte-effect-runtime 2.4.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dist/chunks/{client-CtxuIuC8.js → client-Cj2X9lY-.js} +11 -23
- package/.dist/chunks/client-Cj2X9lY-.js.map +1 -0
- package/.dist/chunks/{dispatcher-8B6Ol80H.js → dispatcher-BVkm8qbG.js} +33 -13
- package/.dist/chunks/dispatcher-BVkm8qbG.js.map +1 -0
- package/.dist/chunks/{preprocess-Cn4JH9OO.js → preprocess-DseI9Doo.js} +206 -73
- package/.dist/chunks/preprocess-DseI9Doo.js.map +1 -0
- package/.dist/chunks/transform-BDfspL1K.js +59 -0
- package/.dist/chunks/transform-BDfspL1K.js.map +1 -0
- package/.dist/chunks/{transform-s9gKPYu5.js → transform-Cx5bjmP6.js} +267 -48
- package/.dist/chunks/transform-Cx5bjmP6.js.map +1 -0
- package/.dist/dispatcher.js +1 -1
- package/.dist/error.d.ts +23 -0
- package/.dist/internal/generators.js +1 -1
- package/.dist/internal/remote-client.js +1 -1
- package/.dist/markup/promise.js +1 -1
- package/.dist/markup/run.js +1 -1
- package/.dist/markup/transform/apply.d.ts +8 -2
- package/.dist/markup/transform/emit.d.ts +2 -2
- package/.dist/markup/transform/types.d.ts +9 -1
- package/.dist/markup/transform.js +1 -1
- package/.dist/markup/value.d.ts +1 -1
- package/.dist/markup/value.js +1 -1
- package/.dist/markup/value.js.map +1 -1
- package/.dist/mod.d.ts +1 -1
- package/.dist/mod.js +1 -1
- package/.dist/mod.js.map +1 -1
- package/.dist/preprocess/imports.d.ts +20 -1
- package/.dist/preprocess/index.d.ts +5 -1
- package/.dist/preprocess/runtime-block.d.ts +11 -1
- package/.dist/preprocess/types.d.ts +27 -0
- package/.dist/preprocess.js +2 -2
- package/.dist/remote/client/command.d.ts +5 -1
- package/.dist/remote/client/effect.d.ts +1 -1
- package/.dist/remote/client/failures.d.ts +3 -3
- package/.dist/remote/client/form-enhance.d.ts +1 -1
- package/.dist/remote/client/form.d.ts +1 -1
- package/.dist/remote/client/query.d.ts +12 -5
- package/.dist/remote/client/responses.d.ts +2 -2
- package/.dist/remote/client/types.d.ts +55 -11
- package/.dist/remote/client.js +1 -1
- package/.dist/runtime/preprocess.d.ts +1 -0
- package/.dist/runtime/preprocess.js +5 -29
- package/.dist/runtime/preprocess.js.map +1 -1
- package/.dist/runtime/transform.d.ts +35 -0
- package/.dist/server/effects.d.ts +3 -3
- package/.dist/server/factories.d.ts +10 -38
- package/.dist/server/index.d.ts +1 -1
- package/.dist/server/invalid.d.ts +1 -1
- package/.dist/server/schema.d.ts +1 -1
- package/.dist/server/types.d.ts +51 -31
- package/.dist/server/wrappers.d.ts +4 -6
- package/.dist/server.d.ts +1 -1
- package/.dist/server.js +8 -15
- package/.dist/server.js.map +1 -1
- package/.dist/vite.js +5 -9
- package/.dist/vite.js.map +1 -1
- package/package.json +1 -1
- package/.dist/chunks/client-CtxuIuC8.js.map +0 -1
- package/.dist/chunks/dispatcher-8B6Ol80H.js.map +0 -1
- package/.dist/chunks/preprocess-Cn4JH9OO.js.map +0 -1
- 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-
|
|
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.
|
|
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
|
|
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
|
-
|
|
101
|
-
|
|
62
|
+
` const ${bindings.dispatcher_value} = ${bindings.dispatcher}();`,
|
|
63
|
+
` const ${bindings.program} = ${bindings.effect}.gen(function* () {`,
|
|
102
64
|
body,
|
|
103
65
|
" });",
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
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}
|
|
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
|
-
|
|
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
|
|
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([
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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-
|
|
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,59 @@
|
|
|
1
|
+
import { t as transform_markup_effect } from "./transform-Cx5bjmP6.js";
|
|
2
|
+
import { t as transform_script_effect } from "./preprocess-DseI9Doo.js";
|
|
3
|
+
//#region src/runtime/transform.ts
|
|
4
|
+
/**
|
|
5
|
+
* Lowers SER syntax in a complete Svelte component without using Svelte's
|
|
6
|
+
* preprocessor adapter API.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const result = transform_svelte_effect(
|
|
11
|
+
* "<script effect>const value = yield* load()<\/script>",
|
|
12
|
+
* "App.svelte",
|
|
13
|
+
* );
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @since 2.5.0
|
|
17
|
+
* @param content - Full Svelte component source to lower before Svelte parses
|
|
18
|
+
* it.
|
|
19
|
+
* @param filename - Component filename used in generated cache identifiers and
|
|
20
|
+
* diagnostics.
|
|
21
|
+
* @returns The transformed component source.
|
|
22
|
+
*/
|
|
23
|
+
function transform_svelte_effect(content, filename = "unknown.svelte") {
|
|
24
|
+
const script = find_script(content);
|
|
25
|
+
let combined = content;
|
|
26
|
+
if (script?.has_effect) {
|
|
27
|
+
const result = transform_script_effect(script.text, filename, { emit_types: script.is_typescript });
|
|
28
|
+
combined = content.slice(0, script.effect_attr_start) + content.slice(script.effect_attr_end, script.open_end) + result.code + content.slice(script.close_start);
|
|
29
|
+
}
|
|
30
|
+
return { code: transform_markup_effect(combined, filename).code };
|
|
31
|
+
}
|
|
32
|
+
function find_script(content) {
|
|
33
|
+
for (const match of content.matchAll(/<script\b([^>]*)>([\s\S]*?)<\/script\s*>/gi)) {
|
|
34
|
+
if (match.index === void 0 || /\bmodule\b/.test(match[1] ?? "")) continue;
|
|
35
|
+
const attrs = match[1] ?? "";
|
|
36
|
+
const effect_match = /\s+effect(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?/.exec(attrs);
|
|
37
|
+
const open_end = match.index + match[0].indexOf(">") + 1;
|
|
38
|
+
const attr_start = effect_match?.index ?? attrs.length;
|
|
39
|
+
const attr_end = attr_start + (effect_match?.[0].length ?? 0);
|
|
40
|
+
return {
|
|
41
|
+
text: match[2],
|
|
42
|
+
open_end,
|
|
43
|
+
close_start: match.index + match[0].lastIndexOf("<"),
|
|
44
|
+
has_effect: effect_match !== null,
|
|
45
|
+
effect_attr_start: match.index + 7 + attr_start,
|
|
46
|
+
effect_attr_end: match.index + 7 + attr_end,
|
|
47
|
+
is_typescript: has_typescript_lang(attrs)
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function has_typescript_lang(attrs) {
|
|
52
|
+
const lang_match = /\blang\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/i.exec(attrs);
|
|
53
|
+
const lang = (lang_match?.[1] ?? lang_match?.[2] ?? lang_match?.[3] ?? "").toLowerCase();
|
|
54
|
+
return lang === "ts" || lang === "typescript";
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { transform_svelte_effect as t };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=transform-BDfspL1K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform-BDfspL1K.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"}
|