svelte-effect-runtime 4.0.0 → 4.1.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-DbwVAMWm.js +530 -0
- package/.dist/chunks/client-DbwVAMWm.js.map +1 -0
- package/.dist/chunks/compiler-Dpyu4Owd.js +412 -0
- package/.dist/chunks/compiler-Dpyu4Owd.js.map +1 -0
- package/.dist/chunks/descriptors-q909VWyR.js +216 -0
- package/.dist/chunks/descriptors-q909VWyR.js.map +1 -0
- package/.dist/chunks/diagnostics-DLwwrBWb.js +359 -0
- package/.dist/chunks/diagnostics-DLwwrBWb.js.map +1 -0
- package/.dist/chunks/dispatcher-CTWINW5I.js +534 -0
- package/.dist/chunks/dispatcher-CTWINW5I.js.map +1 -0
- package/.dist/chunks/dispatcher-pZPzarul.js +23 -0
- package/.dist/chunks/dispatcher-pZPzarul.js.map +1 -0
- package/.dist/chunks/{errors-IJjsUwrE.js → errors-qhcbUH6o.js} +56 -44
- package/.dist/chunks/errors-qhcbUH6o.js.map +1 -0
- package/.dist/chunks/live-BW7xZKjb.js +146 -0
- package/.dist/chunks/live-BW7xZKjb.js.map +1 -0
- package/.dist/chunks/live-CHK0RrZu.js +10 -0
- package/.dist/chunks/live-CHK0RrZu.js.map +1 -0
- package/.dist/chunks/{remote-client-CVI4t66c.js → remote-client-mkQAfP1G.js} +29 -23
- package/.dist/chunks/remote-client-mkQAfP1G.js.map +1 -0
- package/.dist/chunks/{runtime-GBQz32DZ.js → runtime-CPosEhGl.js} +3 -27
- package/.dist/chunks/runtime-CPosEhGl.js.map +1 -0
- package/.dist/chunks/{server-D1LcDnZE.js → server-yQrNoiCR.js} +15 -84
- package/.dist/chunks/server-yQrNoiCR.js.map +1 -0
- package/.dist/chunks/source-scan-cSawCvsg.js +1059 -0
- package/.dist/chunks/source-scan-cSawCvsg.js.map +1 -0
- package/.dist/chunks/{transform-jNUr65K9.js → transform-D7TTlPpK.js} +245 -371
- package/.dist/chunks/transform-D7TTlPpK.js.map +1 -0
- package/.dist/compiler/markup-identifiers.d.ts +2 -0
- package/.dist/compiler/remote-client.d.ts +1 -19
- package/.dist/compiler/source-scan.d.ts +11 -108
- package/.dist/compiler/sveltekit-remote-bridge.d.ts +3 -0
- package/.dist/compiler.d.ts +6 -0
- package/.dist/compiler.js +1 -1
- package/.dist/detect.d.ts +0 -31
- package/.dist/detect.js +0 -39
- package/.dist/detect.js.map +1 -1
- package/.dist/diagnostics.d.ts +0 -16
- package/.dist/dispatcher/deps.d.ts +3 -14
- package/.dist/dispatcher/fibers.d.ts +5 -46
- package/.dist/dispatcher/index.d.ts +42 -135
- package/.dist/dispatcher/scope.d.ts +36 -0
- package/.dist/dispatcher/types.d.ts +0 -151
- package/.dist/dispatcher.d.ts +2 -1
- package/.dist/dispatcher.js +2 -2
- package/.dist/errors.d.ts +44 -42
- package/.dist/generated/dispatcher.d.ts +6 -51
- package/.dist/generators.d.ts +2 -12
- package/.dist/internal/descriptors.d.ts +0 -16
- package/.dist/internal/generators.js +14 -9
- package/.dist/internal/generators.js.map +1 -1
- package/.dist/internal/live.d.ts +9 -0
- package/.dist/internal/remote-client.js +2 -2
- package/.dist/internal/remote-server.js +2 -2
- package/.dist/internal/schema.d.ts +0 -54
- package/.dist/live.d.ts +9 -26
- package/.dist/markup/event-attributes.d.ts +0 -32
- package/.dist/markup/promise.d.ts +1 -23
- package/.dist/markup/promise.js +2 -18
- package/.dist/markup/promise.js.map +1 -1
- package/.dist/markup/run.d.ts +1 -10
- package/.dist/markup/run.js +2 -11
- package/.dist/markup/run.js.map +1 -1
- package/.dist/markup/transform/apply.d.ts +5 -4
- package/.dist/markup/transform/classify.d.ts +2 -11
- package/.dist/markup/transform/constants.d.ts +2 -1
- package/.dist/markup/transform/effect-bindings.d.ts +2 -26
- package/.dist/markup/transform/effect-callbacks.d.ts +0 -20
- package/.dist/markup/transform/emit.d.ts +2 -11
- package/.dist/markup/transform/expressions.d.ts +0 -35
- package/.dist/markup/transform/scan.d.ts +3 -22
- package/.dist/markup/transform/types.d.ts +15 -127
- package/.dist/markup/transform.js +1 -1
- package/.dist/markup/value.d.ts +1 -18
- package/.dist/markup/value.js +2 -19
- package/.dist/markup/value.js.map +1 -1
- package/.dist/mod.d.ts +3 -8
- package/.dist/mod.js +5 -5
- package/.dist/mod.js.map +1 -1
- package/.dist/remote/cause-codec.d.ts +3 -37
- package/.dist/remote/client/command.d.ts +3 -17
- package/.dist/remote/client/form-data.d.ts +0 -7
- package/.dist/remote/client/form-enhance.d.ts +0 -7
- package/.dist/remote/client/form-transport.d.ts +14 -20
- package/.dist/remote/client/form.d.ts +4 -24
- package/.dist/remote/client/index.d.ts +2 -1
- package/.dist/remote/client/prerender.d.ts +6 -0
- package/.dist/remote/client/query-result.d.ts +2 -14
- package/.dist/remote/client/query.d.ts +8 -48
- package/.dist/remote/client/responses.d.ts +3 -27
- package/.dist/remote/client/types.d.ts +16 -110
- package/.dist/remote/client/utils.d.ts +0 -8
- package/.dist/remote/client.d.ts +2 -2
- package/.dist/remote/client.js +2 -2
- package/.dist/remote/effect.d.ts +6 -0
- package/.dist/remote/failures.d.ts +4 -0
- package/.dist/remote/query-update.d.ts +2 -0
- package/.dist/remote/resource.d.ts +25 -0
- package/.dist/remote/server.d.ts +5 -50
- package/.dist/remote/server.js +2 -2
- package/.dist/remote/shared.d.ts +6 -145
- package/.dist/remote/shared.js +6 -127
- package/.dist/remote/shared.js.map +1 -1
- package/.dist/runtime/transform.js +26 -31
- package/.dist/runtime/transform.js.map +1 -1
- package/.dist/script-transform/ast.d.ts +0 -46
- package/.dist/script-transform/imports.d.ts +3 -39
- package/.dist/script-transform/index.d.ts +2 -0
- package/.dist/script-transform/lower.d.ts +0 -9
- package/.dist/script-transform/runes.d.ts +0 -10
- package/.dist/script-transform/runtime-block.d.ts +0 -17
- package/.dist/script-transform/source.d.ts +0 -24
- package/.dist/script-transform/types.d.ts +9 -126
- package/.dist/server/effects.d.ts +4 -53
- package/.dist/server/factories.d.ts +7 -7
- package/.dist/server/index.d.ts +1 -1
- package/.dist/server/invalid.d.ts +0 -7
- package/.dist/server/live-snapshot.d.ts +5 -0
- package/.dist/server/remote-handler-context.d.ts +5 -0
- package/.dist/server/runtime.d.ts +6 -24
- package/.dist/server/schema.d.ts +0 -14
- package/.dist/server/transport.d.ts +2 -0
- package/.dist/server/types.d.ts +49 -26
- package/.dist/server/wrappers.d.ts +3 -40
- package/.dist/server.d.ts +1 -1
- package/.dist/server.js +200 -215
- package/.dist/server.js.map +1 -1
- package/.dist/yieldable.d.ts +1 -35
- package/package.json +2 -2
- package/.dist/chunks/client-DcZUV4rR.js +0 -653
- package/.dist/chunks/client-DcZUV4rR.js.map +0 -1
- package/.dist/chunks/compiler-BBPNyXmQ.js +0 -460
- package/.dist/chunks/compiler-BBPNyXmQ.js.map +0 -1
- package/.dist/chunks/dispatcher-DOx8iC6r.js +0 -505
- package/.dist/chunks/dispatcher-DOx8iC6r.js.map +0 -1
- package/.dist/chunks/dispatcher-H-Ia0Os4.js +0 -47
- package/.dist/chunks/dispatcher-H-Ia0Os4.js.map +0 -1
- package/.dist/chunks/errors-IJjsUwrE.js.map +0 -1
- package/.dist/chunks/live-BXAKre_4.js +0 -104
- package/.dist/chunks/live-BXAKre_4.js.map +0 -1
- package/.dist/chunks/remote-client-CVI4t66c.js.map +0 -1
- package/.dist/chunks/runtime-GBQz32DZ.js.map +0 -1
- package/.dist/chunks/schema-D9pct6Y5.js +0 -89
- package/.dist/chunks/schema-D9pct6Y5.js.map +0 -1
- package/.dist/chunks/server-D1LcDnZE.js.map +0 -1
- package/.dist/chunks/source-scan-C4PsggID.js +0 -341
- package/.dist/chunks/source-scan-C4PsggID.js.map +0 -1
- package/.dist/chunks/transform-jNUr65K9.js.map +0 -1
- package/.dist/remote/client/effect.d.ts +0 -29
- package/.dist/remote/client/failures.d.ts +0 -42
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { t as scan_svelte_effect_source } from "./source-scan-cSawCvsg.js";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
//#region src/diagnostics.ts
|
|
4
|
+
const effect_member_names = [
|
|
5
|
+
"all",
|
|
6
|
+
"fail",
|
|
7
|
+
"gen",
|
|
8
|
+
"log",
|
|
9
|
+
"promise",
|
|
10
|
+
"runFork",
|
|
11
|
+
"runPromise",
|
|
12
|
+
"runSync",
|
|
13
|
+
"succeed",
|
|
14
|
+
"sync",
|
|
15
|
+
"try",
|
|
16
|
+
"tryPromise",
|
|
17
|
+
"void"
|
|
18
|
+
];
|
|
19
|
+
const effect_member_name_set = new Set(effect_member_names);
|
|
20
|
+
const effect_runner_names = /* @__PURE__ */ new Set([
|
|
21
|
+
"runFork",
|
|
22
|
+
"runPromise",
|
|
23
|
+
"runSync"
|
|
24
|
+
]);
|
|
25
|
+
const effect_gen_name = /* @__PURE__ */ new Set(["gen"]);
|
|
26
|
+
function find_svelte_effect_diagnostics(code, filename) {
|
|
27
|
+
const scan = scan_svelte_effect_source(code, filename);
|
|
28
|
+
const effect_binding_paths = find_effect_binding_paths(scan.scripts);
|
|
29
|
+
const line_starts = make_line_starts(code);
|
|
30
|
+
return scan.markup_expressions.flatMap((expression) => make_expression_diagnostics(filename, effect_binding_paths, expression, line_starts));
|
|
31
|
+
}
|
|
32
|
+
function find_effect_binding_paths(scripts) {
|
|
33
|
+
const seen_paths = /* @__PURE__ */ new Set(["Effect"]);
|
|
34
|
+
const root_names = /* @__PURE__ */ new Set(["Effect"]);
|
|
35
|
+
for (const script of scripts) {
|
|
36
|
+
const source_file = ts.createSourceFile("diagnostics-script.ts", script.text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
37
|
+
for (const statement of source_file.statements) for (const binding_path of get_effect_import_binding_paths(statement)) {
|
|
38
|
+
const key = binding_path.join(".");
|
|
39
|
+
if (seen_paths.has(key)) continue;
|
|
40
|
+
seen_paths.add(key);
|
|
41
|
+
root_names.add(binding_path[0]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
paths: seen_paths,
|
|
46
|
+
root_names: [...root_names]
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function get_effect_import_binding_paths(statement) {
|
|
50
|
+
if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier) || !statement.importClause || statement.importClause.isTypeOnly) return [];
|
|
51
|
+
const module_name = statement.moduleSpecifier.text;
|
|
52
|
+
const named_bindings = statement.importClause.namedBindings;
|
|
53
|
+
if (!named_bindings) return [];
|
|
54
|
+
if (module_name === "effect" && ts.isNamedImports(named_bindings)) return named_bindings.elements.flatMap((specifier) => {
|
|
55
|
+
const imported_name = specifier.propertyName?.text ?? specifier.name.text;
|
|
56
|
+
return !specifier.isTypeOnly && imported_name === "Effect" ? [[specifier.name.text]] : [];
|
|
57
|
+
});
|
|
58
|
+
if (module_name === "effect" && ts.isNamespaceImport(named_bindings)) return [[named_bindings.name.text, "Effect"]];
|
|
59
|
+
if (module_name === "effect/Effect" && ts.isNamespaceImport(named_bindings)) return [[named_bindings.name.text]];
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
function make_expression_diagnostics(filename, effect_binding_paths, expression, line_starts) {
|
|
63
|
+
const attribute_name = expression.attribute_name;
|
|
64
|
+
const expression_text = expression.expression_text;
|
|
65
|
+
const is_event_attribute = attribute_name !== void 0 && attribute_name.startsWith("on");
|
|
66
|
+
const is_attribute = attribute_name !== void 0;
|
|
67
|
+
const parsed_expression = parse_markup_expression(expression_text, effect_binding_paths);
|
|
68
|
+
if (!parsed_expression) return [];
|
|
69
|
+
const is_callback = is_callback_expression(parsed_expression);
|
|
70
|
+
const has_yield_star = is_callback ? contains_callback_yield_star(parsed_expression) : contains_yield_star(parsed_expression);
|
|
71
|
+
const is_hidden_event_yield = is_event_attribute && is_callback && has_yield_star;
|
|
72
|
+
if (!contains_effect_reference(parsed_expression, effect_binding_paths) && !is_hidden_event_yield) return [];
|
|
73
|
+
if (!contains_unyielded_effect_reference(parsed_expression, effect_binding_paths) && !is_hidden_event_yield) return [];
|
|
74
|
+
const loc = get_line_column(line_starts, expression.open);
|
|
75
|
+
if (is_hidden_event_yield) return [make_diagnostic(loc, make_hidden_event_yield_warning(filename, attribute_name, expression_text))];
|
|
76
|
+
if (contains_effect_runner(parsed_expression, effect_binding_paths)) return [make_diagnostic(loc, make_explicit_runner_warning(filename, attribute_name, expression_text))];
|
|
77
|
+
if (is_bare_effect_gen(parsed_expression, effect_binding_paths)) return [make_diagnostic(loc, make_bare_effect_gen_warning(filename, attribute_name, expression_text))];
|
|
78
|
+
if (is_event_attribute && is_callback) return [make_diagnostic(loc, make_event_callback_returns_effect_warning(filename, attribute_name, expression_text))];
|
|
79
|
+
if (is_event_attribute) return [make_diagnostic(loc, make_event_attribute_effect_warning(filename, attribute_name, expression_text))];
|
|
80
|
+
if (is_attribute) return [make_diagnostic(loc, make_attribute_effect_warning(filename, attribute_name, expression_text))];
|
|
81
|
+
return [make_diagnostic(loc, make_sync_markup_effect_warning(filename, expression_text))];
|
|
82
|
+
}
|
|
83
|
+
function make_diagnostic(loc, message) {
|
|
84
|
+
return {
|
|
85
|
+
message,
|
|
86
|
+
line: loc.line,
|
|
87
|
+
column: loc.column
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function make_hidden_event_yield_warning(filename, attribute_name, expression_text) {
|
|
91
|
+
return [
|
|
92
|
+
`[svelte-effect-runtime] Detected yield* hidden inside an event callback.`,
|
|
93
|
+
`${filename}: ${attribute_name}={${expression_text}}`,
|
|
94
|
+
`SER can only lower yield* at the event attribute boundary.`,
|
|
95
|
+
`Write the event expression directly, for example: ${attribute_name}={yield* save()}`
|
|
96
|
+
].join("\n");
|
|
97
|
+
}
|
|
98
|
+
function make_explicit_runner_warning(filename, attribute_name, expression_text) {
|
|
99
|
+
return [
|
|
100
|
+
`[svelte-effect-runtime] Detected an explicit Effect runner inside Svelte markup.`,
|
|
101
|
+
`${filename}: ${attribute_name ? `${attribute_name}={${expression_text}}` : `{${expression_text}}`}`,
|
|
102
|
+
`Explicit runners bypass SER cancellation and error handling for markup effects.`,
|
|
103
|
+
`Prefer yield* so SER can manage the Effect lifecycle.`
|
|
104
|
+
].join("\n");
|
|
105
|
+
}
|
|
106
|
+
function make_bare_effect_gen_warning(filename, attribute_name, expression_text) {
|
|
107
|
+
const location = attribute_name ? `${attribute_name}={${expression_text}}` : `{${expression_text}}`;
|
|
108
|
+
const fixed = attribute_name ? `${attribute_name}={yield* ${expression_text}(function* () { ... })}` : `{yield* ${expression_text}(function* () { ... })}`;
|
|
109
|
+
return [
|
|
110
|
+
`[svelte-effect-runtime] Detected Effect.gen used as a value instead of an Effect program.`,
|
|
111
|
+
`${filename}: ${location}`,
|
|
112
|
+
`${expression_text} is a constructor, not the result of running a generator.`,
|
|
113
|
+
`Use: ${fixed}`
|
|
114
|
+
].join("\n");
|
|
115
|
+
}
|
|
116
|
+
function make_event_callback_returns_effect_warning(filename, attribute_name, expression_text) {
|
|
117
|
+
return [
|
|
118
|
+
`[svelte-effect-runtime] Detected an event callback that returns an Effect but does not run it.`,
|
|
119
|
+
`${filename}: ${attribute_name}={${expression_text}}`,
|
|
120
|
+
`Svelte will call the callback and receive an Effect value, but SER will not manage it from inside the callback.`,
|
|
121
|
+
`Use yield* at the event attribute boundary or explicitly run the Effect if you really want to bypass SER.`
|
|
122
|
+
].join("\n");
|
|
123
|
+
}
|
|
124
|
+
function make_event_attribute_effect_warning(filename, attribute_name, expression_text) {
|
|
125
|
+
const fixed = `${attribute_name}={yield* ${expression_text}}`;
|
|
126
|
+
return [
|
|
127
|
+
`[svelte-effect-runtime] Detected an event attribute that looks like an Effect but is not written with yield*.`,
|
|
128
|
+
`${filename}: ${attribute_name}={${expression_text}}`,
|
|
129
|
+
`If you are trying to use Effect in this event handler, use yield* at the beginning.`,
|
|
130
|
+
`Use: ${fixed}`
|
|
131
|
+
].join("\n");
|
|
132
|
+
}
|
|
133
|
+
function make_attribute_effect_warning(filename, attribute_name, expression_text) {
|
|
134
|
+
const fixed = `${attribute_name}={yield* ${expression_text}}`;
|
|
135
|
+
return [
|
|
136
|
+
`[svelte-effect-runtime] Detected an attribute value that looks like an Effect but is not written with yield*.`,
|
|
137
|
+
`${filename}: ${attribute_name}={${expression_text}}`,
|
|
138
|
+
`Svelte attributes need the resolved Effect value, not the Effect object itself.`,
|
|
139
|
+
`Use: ${fixed}`
|
|
140
|
+
].join("\n");
|
|
141
|
+
}
|
|
142
|
+
function make_sync_markup_effect_warning(filename, expression_text) {
|
|
143
|
+
return [
|
|
144
|
+
`[svelte-effect-runtime] Detected a markup expression that creates an Effect but is not written with yield*.`,
|
|
145
|
+
`${filename}: {${expression_text}}`,
|
|
146
|
+
`This expression will produce an Effect value, not its result.`,
|
|
147
|
+
`Use yield* where Svelte expects the resolved value.`
|
|
148
|
+
].join("\n");
|
|
149
|
+
}
|
|
150
|
+
function parse_markup_expression(expression_text, effect_binding_paths) {
|
|
151
|
+
const has_binding_candidate = effect_binding_paths.root_names.some((root_name) => expression_text.includes(root_name));
|
|
152
|
+
const has_member_candidate = effect_member_names.some((member_name) => expression_text.includes(member_name));
|
|
153
|
+
const has_yield_candidate = /\byield\s*\*/.test(expression_text);
|
|
154
|
+
if ((!has_binding_candidate || !has_member_candidate) && !has_yield_candidate) return;
|
|
155
|
+
const normalized = normalize_markup_expression(expression_text);
|
|
156
|
+
if (normalized.kind === "declaration") {
|
|
157
|
+
const source_file = ts.createSourceFile("diagnostics-declaration.ts", `${normalized.text};`, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
158
|
+
return {
|
|
159
|
+
source_file,
|
|
160
|
+
root_expression: unwrap_parentheses(source_file.statements.find(ts.isVariableStatement)?.declarationList.declarations[0]?.initializer),
|
|
161
|
+
is_direct_expression: false
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const source_file = ts.createSourceFile("diagnostics-expression.ts", `function* __SER___diagnostic() { return (${normalized.text}); }`, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
165
|
+
const return_statement = source_file.statements.find(ts.isFunctionDeclaration)?.body?.statements.find(ts.isReturnStatement);
|
|
166
|
+
return {
|
|
167
|
+
source_file,
|
|
168
|
+
root_expression: unwrap_parentheses(return_statement?.expression),
|
|
169
|
+
is_direct_expression: normalized.is_direct_expression
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function normalize_markup_expression(expression_text) {
|
|
173
|
+
const trimmed = expression_text.trim();
|
|
174
|
+
if (/^@const\s+/.test(trimmed)) return {
|
|
175
|
+
kind: "declaration",
|
|
176
|
+
text: trimmed.slice(1),
|
|
177
|
+
is_direct_expression: false
|
|
178
|
+
};
|
|
179
|
+
if (/^(?:const|let)\s+/.test(trimmed)) return {
|
|
180
|
+
kind: "declaration",
|
|
181
|
+
text: trimmed,
|
|
182
|
+
is_direct_expression: false
|
|
183
|
+
};
|
|
184
|
+
const prefix = find_markup_expression_prefix(trimmed);
|
|
185
|
+
let text = prefix ? trimmed.slice(prefix.length) : trimmed;
|
|
186
|
+
if (prefix?.kind === "each") {
|
|
187
|
+
const boundary = [...text.matchAll(/\s+as\s+/g)].at(-1)?.index ?? -1;
|
|
188
|
+
text = boundary === -1 ? text : text.slice(0, boundary);
|
|
189
|
+
}
|
|
190
|
+
if (prefix?.kind === "await") text = slice_before_await_context(text);
|
|
191
|
+
return {
|
|
192
|
+
kind: "expression",
|
|
193
|
+
text: text.trim(),
|
|
194
|
+
is_direct_expression: prefix === void 0
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function find_markup_expression_prefix(expression_text) {
|
|
198
|
+
for (const prefix of [
|
|
199
|
+
{
|
|
200
|
+
kind: "else_if",
|
|
201
|
+
pattern: /^:else\s+if\s+/
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
kind: "attach",
|
|
205
|
+
pattern: /^@attach\s+/
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
kind: "render",
|
|
209
|
+
pattern: /^@render\s+/
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
kind: "debug",
|
|
213
|
+
pattern: /^@debug\s+/
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
kind: "html",
|
|
217
|
+
pattern: /^@html\s+/
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
kind: "await",
|
|
221
|
+
pattern: /^#await\s+/
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
kind: "each",
|
|
225
|
+
pattern: /^#each\s+/
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
kind: "key",
|
|
229
|
+
pattern: /^#key\s+/
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
kind: "if",
|
|
233
|
+
pattern: /^#if\s+/
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
kind: "spread",
|
|
237
|
+
pattern: /^\.\.\./
|
|
238
|
+
}
|
|
239
|
+
]) {
|
|
240
|
+
const match = prefix.pattern.exec(expression_text);
|
|
241
|
+
if (match) return {
|
|
242
|
+
kind: prefix.kind,
|
|
243
|
+
length: match[0].length
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function slice_before_await_context(expression_text) {
|
|
248
|
+
const return_statement = ts.createSourceFile("diagnostics-await.ts", `function* __SER___await() { return (${expression_text}); }`, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS).statements.find(ts.isFunctionDeclaration)?.body?.statements.find(ts.isReturnStatement);
|
|
249
|
+
const root_expression = unwrap_parentheses(return_statement?.expression);
|
|
250
|
+
const boundary = root_expression ? root_expression.end - 36 : -1;
|
|
251
|
+
const remainder = boundary === -1 ? "" : expression_text.slice(boundary).trimStart();
|
|
252
|
+
if (!/^(?:then|catch)(?:\s|$)/.test(remainder)) return expression_text;
|
|
253
|
+
return expression_text.slice(0, boundary);
|
|
254
|
+
}
|
|
255
|
+
function contains_effect_reference(parsed_expression, effect_binding_paths) {
|
|
256
|
+
return some_node(parsed_expression.source_file, (node) => is_effect_member(node, effect_binding_paths, effect_member_name_set));
|
|
257
|
+
}
|
|
258
|
+
function contains_effect_runner(parsed_expression, effect_binding_paths) {
|
|
259
|
+
return some_node(parsed_expression.source_file, (node) => is_effect_member(node, effect_binding_paths, effect_runner_names));
|
|
260
|
+
}
|
|
261
|
+
function contains_unyielded_effect_reference(parsed_expression, effect_binding_paths) {
|
|
262
|
+
return some_node(parsed_expression.source_file, (node) => is_effect_member(node, effect_binding_paths, effect_member_name_set) && !has_yield_star_ancestor(node));
|
|
263
|
+
}
|
|
264
|
+
function is_bare_effect_gen(parsed_expression, effect_binding_paths) {
|
|
265
|
+
const root_expression = parsed_expression.root_expression;
|
|
266
|
+
return parsed_expression.is_direct_expression && root_expression !== void 0 && is_effect_member(root_expression, effect_binding_paths, effect_gen_name);
|
|
267
|
+
}
|
|
268
|
+
function contains_yield_star(parsed_expression) {
|
|
269
|
+
return some_node(parsed_expression.source_file, is_yield_star_expression);
|
|
270
|
+
}
|
|
271
|
+
function contains_callback_yield_star(parsed_expression) {
|
|
272
|
+
const callback = parsed_expression.root_expression;
|
|
273
|
+
let matched = false;
|
|
274
|
+
if (!callback || !ts.isArrowFunction(callback) && !ts.isFunctionExpression(callback)) return false;
|
|
275
|
+
function visit(node) {
|
|
276
|
+
if (matched || node !== callback && ts.isFunctionLike(node)) return;
|
|
277
|
+
if (is_yield_star_expression(node)) {
|
|
278
|
+
matched = true;
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
ts.forEachChild(node, visit);
|
|
282
|
+
}
|
|
283
|
+
visit(callback.body);
|
|
284
|
+
return matched;
|
|
285
|
+
}
|
|
286
|
+
function is_callback_expression(parsed_expression) {
|
|
287
|
+
const root_expression = parsed_expression.root_expression;
|
|
288
|
+
return parsed_expression.is_direct_expression && root_expression !== void 0 && (ts.isArrowFunction(root_expression) || ts.isFunctionExpression(root_expression));
|
|
289
|
+
}
|
|
290
|
+
function is_effect_member(node, effect_binding_paths, member_names) {
|
|
291
|
+
const access_path = get_static_access_path(node);
|
|
292
|
+
if (!access_path || access_path.length < 2) return false;
|
|
293
|
+
const member_name = access_path[access_path.length - 1];
|
|
294
|
+
const owner_path = access_path.slice(0, -1);
|
|
295
|
+
if (member_name === void 0) return false;
|
|
296
|
+
return member_names.has(member_name) && effect_binding_paths.paths.has(owner_path.join("."));
|
|
297
|
+
}
|
|
298
|
+
function get_static_access_path(node) {
|
|
299
|
+
if (ts.isParenthesizedExpression(node)) return get_static_access_path(node.expression);
|
|
300
|
+
if (ts.isIdentifier(node)) return [node.text];
|
|
301
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
302
|
+
const owner_path = get_static_access_path(node.expression);
|
|
303
|
+
return owner_path ? [...owner_path, node.name.text] : void 0;
|
|
304
|
+
}
|
|
305
|
+
if (ts.isElementAccessExpression(node) && node.argumentExpression && (ts.isStringLiteral(node.argumentExpression) || ts.isNoSubstitutionTemplateLiteral(node.argumentExpression))) {
|
|
306
|
+
const owner_path = get_static_access_path(node.expression);
|
|
307
|
+
return owner_path ? [...owner_path, node.argumentExpression.text] : void 0;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function some_node(node, predicate) {
|
|
311
|
+
let matched = false;
|
|
312
|
+
if (predicate(node)) return true;
|
|
313
|
+
ts.forEachChild(node, (child) => {
|
|
314
|
+
matched ||= some_node(child, predicate);
|
|
315
|
+
});
|
|
316
|
+
return matched;
|
|
317
|
+
}
|
|
318
|
+
function is_yield_star_expression(node) {
|
|
319
|
+
return ts.isYieldExpression(node) && node.asteriskToken !== void 0 || ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.AsteriskToken && ts.isIdentifier(node.left) && node.left.text === "yield";
|
|
320
|
+
}
|
|
321
|
+
function has_yield_star_ancestor(node) {
|
|
322
|
+
let current = node.parent;
|
|
323
|
+
while (current) {
|
|
324
|
+
if (is_yield_star_expression(current)) return true;
|
|
325
|
+
current = current.parent;
|
|
326
|
+
}
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
function unwrap_parentheses(expression) {
|
|
330
|
+
let current = expression;
|
|
331
|
+
while (current && ts.isParenthesizedExpression(current)) current = current.expression;
|
|
332
|
+
return current;
|
|
333
|
+
}
|
|
334
|
+
function get_line_column(line_starts, position) {
|
|
335
|
+
let low = 0;
|
|
336
|
+
let high = line_starts.length - 1;
|
|
337
|
+
while (low <= high) {
|
|
338
|
+
const mid = Math.floor((low + high) / 2);
|
|
339
|
+
if (line_starts[mid] <= position) low = mid + 1;
|
|
340
|
+
else high = mid - 1;
|
|
341
|
+
}
|
|
342
|
+
const line_index = Math.max(0, high);
|
|
343
|
+
return {
|
|
344
|
+
line: line_index + 1,
|
|
345
|
+
column: position - line_starts[line_index]
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
function make_line_starts(code) {
|
|
349
|
+
const line_starts = [0];
|
|
350
|
+
for (let i = 0; i < code.length; i += 1) {
|
|
351
|
+
if (code[i] !== "\n") continue;
|
|
352
|
+
line_starts.push(i + 1);
|
|
353
|
+
}
|
|
354
|
+
return line_starts;
|
|
355
|
+
}
|
|
356
|
+
//#endregion
|
|
357
|
+
export { find_svelte_effect_diagnostics };
|
|
358
|
+
|
|
359
|
+
//# sourceMappingURL=diagnostics-DLwwrBWb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics-DLwwrBWb.js","names":[],"sources":["../../../modules/svelte-effect-runtime/src/diagnostics.ts"],"sourcesContent":["import type { MarkupBraceExpression, ScriptRegion } from \"$/compiler/source-scan.ts\";\nimport { scan_svelte_effect_source } from \"$/compiler/source-scan.ts\";\n\nimport ts from \"typescript\";\n\n/**\n * Warning diagnostic produced by the SER Vite diagnostics plugin.\n */\ninterface Diagnostic {\n\tmessage: string;\n\tline: number;\n\tcolumn: number;\n}\n\ninterface SourceLocation {\n\tline: number;\n\tcolumn: number;\n}\n\ninterface ParsedMarkupExpression {\n\tsource_file: ts.SourceFile;\n\troot_expression: ts.Expression | undefined;\n\tis_direct_expression: boolean;\n}\n\ninterface EffectBindings {\n\tpaths: ReadonlySet<string>;\n\troot_names: readonly string[];\n}\n\ninterface NormalizedMarkupExpression {\n\tkind: \"declaration\" | \"expression\";\n\ttext: string;\n\tis_direct_expression: boolean;\n}\n\nconst effect_member_names = [\n\t\"all\",\n\t\"fail\",\n\t\"gen\",\n\t\"log\",\n\t\"promise\",\n\t\"runFork\",\n\t\"runPromise\",\n\t\"runSync\",\n\t\"succeed\",\n\t\"sync\",\n\t\"try\",\n\t\"tryPromise\",\n\t\"void\",\n] as const;\nconst effect_member_name_set = new Set<string>(effect_member_names);\nconst effect_runner_names = new Set([\"runFork\", \"runPromise\", \"runSync\"]);\nconst effect_gen_name = new Set([\"gen\"]);\n\nexport function find_svelte_effect_diagnostics(\n\tcode: string,\n\tfilename: string,\n): Array<{ message: string; line: number; column: number }> {\n\tconst scan = scan_svelte_effect_source(code, filename);\n\tconst effect_binding_paths = find_effect_binding_paths(scan.scripts);\n\tconst line_starts = make_line_starts(code);\n\n\treturn scan.markup_expressions.flatMap((expression) =>\n\t\tmake_expression_diagnostics(filename, effect_binding_paths, expression, line_starts),\n\t);\n}\n\nfunction find_effect_binding_paths(scripts: readonly ScriptRegion[]): EffectBindings {\n\tconst seen_paths = new Set([\"Effect\"]);\n\tconst root_names = new Set([\"Effect\"]);\n\n\tfor (const script of scripts) {\n\t\tconst source_file = ts.createSourceFile(\n\t\t\t\"diagnostics-script.ts\",\n\t\t\tscript.text,\n\t\t\tts.ScriptTarget.Latest,\n\t\t\ttrue,\n\t\t\tts.ScriptKind.TS,\n\t\t);\n\n\t\tfor (const statement of source_file.statements) {\n\t\t\tfor (const binding_path of get_effect_import_binding_paths(statement)) {\n\t\t\t\tconst key = binding_path.join(\".\");\n\n\t\t\t\tif (seen_paths.has(key)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tseen_paths.add(key);\n\t\t\t\troot_names.add(binding_path[0]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { paths: seen_paths, root_names: [...root_names] };\n}\n\nfunction get_effect_import_binding_paths(statement: ts.Statement): string[][] {\n\tif (\n\t\t!ts.isImportDeclaration(statement) ||\n\t\t!ts.isStringLiteral(statement.moduleSpecifier) ||\n\t\t!statement.importClause ||\n\t\tstatement.importClause.isTypeOnly\n\t) {\n\t\treturn [];\n\t}\n\n\tconst module_name = statement.moduleSpecifier.text;\n\tconst named_bindings = statement.importClause.namedBindings;\n\n\tif (!named_bindings) {\n\t\treturn [];\n\t}\n\n\tif (module_name === \"effect\" && ts.isNamedImports(named_bindings)) {\n\t\treturn named_bindings.elements.flatMap((specifier) => {\n\t\t\tconst imported_name = specifier.propertyName?.text ?? specifier.name.text;\n\n\t\t\treturn !specifier.isTypeOnly && imported_name === \"Effect\"\n\t\t\t\t? [[specifier.name.text]]\n\t\t\t\t: [];\n\t\t});\n\t}\n\n\tif (module_name === \"effect\" && ts.isNamespaceImport(named_bindings)) {\n\t\treturn [[named_bindings.name.text, \"Effect\"]];\n\t}\n\n\tif (module_name === \"effect/Effect\" && ts.isNamespaceImport(named_bindings)) {\n\t\treturn [[named_bindings.name.text]];\n\t}\n\n\treturn [];\n}\n\nfunction make_expression_diagnostics(\n\tfilename: string,\n\teffect_binding_paths: EffectBindings,\n\texpression: MarkupBraceExpression,\n\tline_starts: number[],\n): Diagnostic[] {\n\tconst attribute_name = expression.attribute_name;\n\tconst expression_text = expression.expression_text;\n\tconst is_event_attribute = attribute_name !== undefined && attribute_name.startsWith(\"on\");\n\tconst is_attribute = attribute_name !== undefined;\n\tconst parsed_expression = parse_markup_expression(expression_text, effect_binding_paths);\n\n\tif (!parsed_expression) {\n\t\treturn [];\n\t}\n\n\tconst is_callback = is_callback_expression(parsed_expression);\n\tconst has_yield_star = is_callback\n\t\t? contains_callback_yield_star(parsed_expression)\n\t\t: contains_yield_star(parsed_expression);\n\tconst is_hidden_event_yield = is_event_attribute && is_callback && has_yield_star;\n\tconst has_effect_reference = contains_effect_reference(parsed_expression, effect_binding_paths);\n\n\tif (!has_effect_reference && !is_hidden_event_yield) {\n\t\treturn [];\n\t}\n\n\tif (\n\t\t!contains_unyielded_effect_reference(parsed_expression, effect_binding_paths) &&\n\t\t!is_hidden_event_yield\n\t) {\n\t\treturn [];\n\t}\n\n\tconst loc = get_line_column(line_starts, expression.open);\n\n\tif (is_hidden_event_yield) {\n\t\treturn [\n\t\t\tmake_diagnostic(\n\t\t\t\tloc,\n\t\t\t\tmake_hidden_event_yield_warning(filename, attribute_name, expression_text),\n\t\t\t),\n\t\t];\n\t}\n\n\tif (contains_effect_runner(parsed_expression, effect_binding_paths)) {\n\t\treturn [\n\t\t\tmake_diagnostic(\n\t\t\t\tloc,\n\t\t\t\tmake_explicit_runner_warning(filename, attribute_name, expression_text),\n\t\t\t),\n\t\t];\n\t}\n\n\tif (is_bare_effect_gen(parsed_expression, effect_binding_paths)) {\n\t\treturn [\n\t\t\tmake_diagnostic(\n\t\t\t\tloc,\n\t\t\t\tmake_bare_effect_gen_warning(filename, attribute_name, expression_text),\n\t\t\t),\n\t\t];\n\t}\n\n\tif (is_event_attribute && is_callback) {\n\t\treturn [\n\t\t\tmake_diagnostic(\n\t\t\t\tloc,\n\t\t\t\tmake_event_callback_returns_effect_warning(\n\t\t\t\t\tfilename,\n\t\t\t\t\tattribute_name,\n\t\t\t\t\texpression_text,\n\t\t\t\t),\n\t\t\t),\n\t\t];\n\t}\n\n\tif (is_event_attribute) {\n\t\treturn [\n\t\t\tmake_diagnostic(\n\t\t\t\tloc,\n\t\t\t\tmake_event_attribute_effect_warning(filename, attribute_name, expression_text),\n\t\t\t),\n\t\t];\n\t}\n\n\tif (is_attribute) {\n\t\treturn [\n\t\t\tmake_diagnostic(\n\t\t\t\tloc,\n\t\t\t\tmake_attribute_effect_warning(filename, attribute_name, expression_text),\n\t\t\t),\n\t\t];\n\t}\n\n\treturn [make_diagnostic(loc, make_sync_markup_effect_warning(filename, expression_text))];\n}\n\nfunction make_diagnostic(loc: { line: number; column: number }, message: string): Diagnostic {\n\treturn {\n\t\tmessage,\n\t\tline: loc.line,\n\t\tcolumn: loc.column,\n\t};\n}\n\nfunction make_hidden_event_yield_warning(\n\tfilename: string,\n\tattribute_name: string,\n\texpression_text: string,\n): string {\n\treturn [\n\t\t`[svelte-effect-runtime] Detected yield* hidden inside an event callback.`,\n\t\t`${filename}: ${attribute_name}={${expression_text}}`,\n\t\t`SER can only lower yield* at the event attribute boundary.`,\n\t\t`Write the event expression directly, for example: ${attribute_name}={yield* save()}`,\n\t].join(\"\\n\");\n}\n\nfunction make_explicit_runner_warning(\n\tfilename: string,\n\tattribute_name: string | undefined,\n\texpression_text: string,\n): string {\n\tconst location = attribute_name\n\t\t? `${attribute_name}={${expression_text}}`\n\t\t: `{${expression_text}}`;\n\n\treturn [\n\t\t`[svelte-effect-runtime] Detected an explicit Effect runner inside Svelte markup.`,\n\t\t`${filename}: ${location}`,\n\t\t`Explicit runners bypass SER cancellation and error handling for markup effects.`,\n\t\t`Prefer yield* so SER can manage the Effect lifecycle.`,\n\t].join(\"\\n\");\n}\n\nfunction make_bare_effect_gen_warning(\n\tfilename: string,\n\tattribute_name: string | undefined,\n\texpression_text: string,\n): string {\n\tconst location = attribute_name\n\t\t? `${attribute_name}={${expression_text}}`\n\t\t: `{${expression_text}}`;\n\tconst fixed = attribute_name\n\t\t? `${attribute_name}={yield* ${expression_text}(function* () { ... })}`\n\t\t: `{yield* ${expression_text}(function* () { ... })}`;\n\n\treturn [\n\t\t`[svelte-effect-runtime] Detected Effect.gen used as a value instead of an Effect program.`,\n\t\t`${filename}: ${location}`,\n\t\t`${expression_text} is a constructor, not the result of running a generator.`,\n\t\t`Use: ${fixed}`,\n\t].join(\"\\n\");\n}\n\nfunction make_event_callback_returns_effect_warning(\n\tfilename: string,\n\tattribute_name: string,\n\texpression_text: string,\n): string {\n\treturn [\n\t\t`[svelte-effect-runtime] Detected an event callback that returns an Effect but does not run it.`,\n\t\t`${filename}: ${attribute_name}={${expression_text}}`,\n\t\t`Svelte will call the callback and receive an Effect value, but SER will not manage it from inside the callback.`,\n\t\t`Use yield* at the event attribute boundary or explicitly run the Effect if you really want to bypass SER.`,\n\t].join(\"\\n\");\n}\n\nfunction make_event_attribute_effect_warning(\n\tfilename: string,\n\tattribute_name: string,\n\texpression_text: string,\n): string {\n\tconst fixed = `${attribute_name}={yield* ${expression_text}}`;\n\n\treturn [\n\t\t`[svelte-effect-runtime] Detected an event attribute that looks like an Effect but is not written with yield*.`,\n\t\t`${filename}: ${attribute_name}={${expression_text}}`,\n\t\t`If you are trying to use Effect in this event handler, use yield* at the beginning.`,\n\t\t`Use: ${fixed}`,\n\t].join(\"\\n\");\n}\n\nfunction make_attribute_effect_warning(\n\tfilename: string,\n\tattribute_name: string,\n\texpression_text: string,\n): string {\n\tconst fixed = `${attribute_name}={yield* ${expression_text}}`;\n\n\treturn [\n\t\t`[svelte-effect-runtime] Detected an attribute value that looks like an Effect but is not written with yield*.`,\n\t\t`${filename}: ${attribute_name}={${expression_text}}`,\n\t\t`Svelte attributes need the resolved Effect value, not the Effect object itself.`,\n\t\t`Use: ${fixed}`,\n\t].join(\"\\n\");\n}\n\nfunction make_sync_markup_effect_warning(filename: string, expression_text: string): string {\n\treturn [\n\t\t`[svelte-effect-runtime] Detected a markup expression that creates an Effect but is not written with yield*.`,\n\t\t`${filename}: {${expression_text}}`,\n\t\t`This expression will produce an Effect value, not its result.`,\n\t\t`Use yield* where Svelte expects the resolved value.`,\n\t].join(\"\\n\");\n}\n\nfunction parse_markup_expression(\n\texpression_text: string,\n\teffect_binding_paths: EffectBindings,\n): ParsedMarkupExpression | undefined {\n\tconst has_binding_candidate = effect_binding_paths.root_names.some((root_name) =>\n\t\texpression_text.includes(root_name),\n\t);\n\tconst has_member_candidate = effect_member_names.some((member_name) =>\n\t\texpression_text.includes(member_name),\n\t);\n\tconst has_yield_candidate = /\\byield\\s*\\*/.test(expression_text);\n\n\tif ((!has_binding_candidate || !has_member_candidate) && !has_yield_candidate) {\n\t\treturn undefined;\n\t}\n\n\tconst normalized = normalize_markup_expression(expression_text);\n\n\tif (normalized.kind === \"declaration\") {\n\t\tconst source_file = ts.createSourceFile(\n\t\t\t\"diagnostics-declaration.ts\",\n\t\t\t`${normalized.text};`,\n\t\t\tts.ScriptTarget.Latest,\n\t\t\ttrue,\n\t\t\tts.ScriptKind.TS,\n\t\t);\n\t\tconst variable_statement = source_file.statements.find(ts.isVariableStatement);\n\t\tconst root_expression = unwrap_parentheses(\n\t\t\tvariable_statement?.declarationList.declarations[0]?.initializer,\n\t\t);\n\n\t\treturn {\n\t\t\tsource_file,\n\t\t\troot_expression,\n\t\t\tis_direct_expression: false,\n\t\t};\n\t}\n\n\tconst source_file = ts.createSourceFile(\n\t\t\"diagnostics-expression.ts\",\n\t\t`function* __SER___diagnostic() { return (${normalized.text}); }`,\n\t\tts.ScriptTarget.Latest,\n\t\ttrue,\n\t\tts.ScriptKind.TS,\n\t);\n\tconst wrapper = source_file.statements.find(ts.isFunctionDeclaration);\n\tconst return_statement = wrapper?.body?.statements.find(ts.isReturnStatement);\n\tconst root_expression = unwrap_parentheses(return_statement?.expression);\n\n\treturn {\n\t\tsource_file,\n\t\troot_expression,\n\t\tis_direct_expression: normalized.is_direct_expression,\n\t};\n}\n\nfunction normalize_markup_expression(expression_text: string): NormalizedMarkupExpression {\n\tconst trimmed = expression_text.trim();\n\n\tif (/^@const\\s+/.test(trimmed)) {\n\t\treturn {\n\t\t\tkind: \"declaration\",\n\t\t\ttext: trimmed.slice(1),\n\t\t\tis_direct_expression: false,\n\t\t};\n\t}\n\n\tif (/^(?:const|let)\\s+/.test(trimmed)) {\n\t\treturn {\n\t\t\tkind: \"declaration\",\n\t\t\ttext: trimmed,\n\t\t\tis_direct_expression: false,\n\t\t};\n\t}\n\n\tconst prefix = find_markup_expression_prefix(trimmed);\n\tlet text = prefix ? trimmed.slice(prefix.length) : trimmed;\n\n\tif (prefix?.kind === \"each\") {\n\t\tconst boundaries = [...text.matchAll(/\\s+as\\s+/g)];\n\t\tconst boundary = boundaries.at(-1)?.index ?? -1;\n\n\t\ttext = boundary === -1 ? text : text.slice(0, boundary);\n\t}\n\n\tif (prefix?.kind === \"await\") {\n\t\ttext = slice_before_await_context(text);\n\t}\n\n\treturn {\n\t\tkind: \"expression\",\n\t\ttext: text.trim(),\n\t\tis_direct_expression: prefix === undefined,\n\t};\n}\n\nfunction find_markup_expression_prefix(\n\texpression_text: string,\n): { kind: string; length: number } | undefined {\n\tconst prefixes: Array<{ kind: string; pattern: RegExp }> = [\n\t\t{ kind: \"else_if\", pattern: /^:else\\s+if\\s+/ },\n\t\t{ kind: \"attach\", pattern: /^@attach\\s+/ },\n\t\t{ kind: \"render\", pattern: /^@render\\s+/ },\n\t\t{ kind: \"debug\", pattern: /^@debug\\s+/ },\n\t\t{ kind: \"html\", pattern: /^@html\\s+/ },\n\t\t{ kind: \"await\", pattern: /^#await\\s+/ },\n\t\t{ kind: \"each\", pattern: /^#each\\s+/ },\n\t\t{ kind: \"key\", pattern: /^#key\\s+/ },\n\t\t{ kind: \"if\", pattern: /^#if\\s+/ },\n\t\t{ kind: \"spread\", pattern: /^\\.\\.\\./ },\n\t];\n\n\tfor (const prefix of prefixes) {\n\t\tconst match = prefix.pattern.exec(expression_text);\n\n\t\tif (match) {\n\t\t\treturn { kind: prefix.kind, length: match[0].length };\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nfunction slice_before_await_context(expression_text: string): string {\n\tconst wrapper_prefix = \"function* __SER___await() { return (\";\n\tconst source_file = ts.createSourceFile(\n\t\t\"diagnostics-await.ts\",\n\t\t`${wrapper_prefix}${expression_text}); }`,\n\t\tts.ScriptTarget.Latest,\n\t\ttrue,\n\t\tts.ScriptKind.TS,\n\t);\n\tconst wrapper = source_file.statements.find(ts.isFunctionDeclaration);\n\tconst return_statement = wrapper?.body?.statements.find(ts.isReturnStatement);\n\tconst root_expression = unwrap_parentheses(return_statement?.expression);\n\tconst boundary = root_expression ? root_expression.end - wrapper_prefix.length : -1;\n\tconst remainder = boundary === -1 ? \"\" : expression_text.slice(boundary).trimStart();\n\n\tif (!/^(?:then|catch)(?:\\s|$)/.test(remainder)) {\n\t\treturn expression_text;\n\t}\n\n\treturn expression_text.slice(0, boundary);\n}\n\nfunction contains_effect_reference(\n\tparsed_expression: ParsedMarkupExpression,\n\teffect_binding_paths: EffectBindings,\n): boolean {\n\treturn some_node(parsed_expression.source_file, (node) =>\n\t\tis_effect_member(node, effect_binding_paths, effect_member_name_set),\n\t);\n}\n\nfunction contains_effect_runner(\n\tparsed_expression: ParsedMarkupExpression,\n\teffect_binding_paths: EffectBindings,\n): boolean {\n\treturn some_node(parsed_expression.source_file, (node) =>\n\t\tis_effect_member(node, effect_binding_paths, effect_runner_names),\n\t);\n}\n\nfunction contains_unyielded_effect_reference(\n\tparsed_expression: ParsedMarkupExpression,\n\teffect_binding_paths: EffectBindings,\n): boolean {\n\treturn some_node(\n\t\tparsed_expression.source_file,\n\t\t(node) =>\n\t\t\tis_effect_member(node, effect_binding_paths, effect_member_name_set) &&\n\t\t\t!has_yield_star_ancestor(node),\n\t);\n}\n\nfunction is_bare_effect_gen(\n\tparsed_expression: ParsedMarkupExpression,\n\teffect_binding_paths: EffectBindings,\n): boolean {\n\tconst root_expression = parsed_expression.root_expression;\n\n\treturn (\n\t\tparsed_expression.is_direct_expression &&\n\t\troot_expression !== undefined &&\n\t\tis_effect_member(root_expression, effect_binding_paths, effect_gen_name)\n\t);\n}\n\nfunction contains_yield_star(parsed_expression: ParsedMarkupExpression): boolean {\n\treturn some_node(parsed_expression.source_file, is_yield_star_expression);\n}\n\nfunction contains_callback_yield_star(parsed_expression: ParsedMarkupExpression): boolean {\n\tconst callback = parsed_expression.root_expression;\n\tlet matched = false;\n\n\tif (!callback || (!ts.isArrowFunction(callback) && !ts.isFunctionExpression(callback))) {\n\t\treturn false;\n\t}\n\n\tfunction visit(node: ts.Node): void {\n\t\tif (matched || (node !== callback && ts.isFunctionLike(node))) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (is_yield_star_expression(node)) {\n\t\t\tmatched = true;\n\n\t\t\treturn;\n\t\t}\n\n\t\tts.forEachChild(node, visit);\n\t}\n\n\tvisit(callback.body);\n\n\treturn matched;\n}\n\nfunction is_callback_expression(parsed_expression: ParsedMarkupExpression): boolean {\n\tconst root_expression = parsed_expression.root_expression;\n\n\treturn (\n\t\tparsed_expression.is_direct_expression &&\n\t\troot_expression !== undefined &&\n\t\t(ts.isArrowFunction(root_expression) || ts.isFunctionExpression(root_expression))\n\t);\n}\n\nfunction is_effect_member(\n\tnode: ts.Node,\n\teffect_binding_paths: EffectBindings,\n\tmember_names: ReadonlySet<string>,\n): boolean {\n\tconst access_path = get_static_access_path(node);\n\n\tif (!access_path || access_path.length < 2) {\n\t\treturn false;\n\t}\n\n\tconst member_name = access_path[access_path.length - 1];\n\tconst owner_path = access_path.slice(0, -1);\n\n\tif (member_name === undefined) {\n\t\treturn false;\n\t}\n\n\treturn member_names.has(member_name) && effect_binding_paths.paths.has(owner_path.join(\".\"));\n}\n\nfunction get_static_access_path(node: ts.Node): string[] | undefined {\n\tif (ts.isParenthesizedExpression(node)) {\n\t\treturn get_static_access_path(node.expression);\n\t}\n\n\tif (ts.isIdentifier(node)) {\n\t\treturn [node.text];\n\t}\n\n\tif (ts.isPropertyAccessExpression(node)) {\n\t\tconst owner_path = get_static_access_path(node.expression);\n\n\t\treturn owner_path ? [...owner_path, node.name.text] : undefined;\n\t}\n\n\tif (\n\t\tts.isElementAccessExpression(node) &&\n\t\tnode.argumentExpression &&\n\t\t(ts.isStringLiteral(node.argumentExpression) ||\n\t\t\tts.isNoSubstitutionTemplateLiteral(node.argumentExpression))\n\t) {\n\t\tconst owner_path = get_static_access_path(node.expression);\n\n\t\treturn owner_path ? [...owner_path, node.argumentExpression.text] : undefined;\n\t}\n\n\treturn undefined;\n}\n\nfunction some_node(node: ts.Node, predicate: (node: ts.Node) => boolean): boolean {\n\tlet matched = false;\n\n\tif (predicate(node)) {\n\t\treturn true;\n\t}\n\n\tts.forEachChild(node, (child) => {\n\t\tmatched ||= some_node(child, predicate);\n\t});\n\n\treturn matched;\n}\n\nfunction is_yield_star_expression(node: ts.Node): boolean {\n\treturn (\n\t\t(ts.isYieldExpression(node) && node.asteriskToken !== undefined) ||\n\t\t(ts.isBinaryExpression(node) &&\n\t\t\tnode.operatorToken.kind === ts.SyntaxKind.AsteriskToken &&\n\t\t\tts.isIdentifier(node.left) &&\n\t\t\tnode.left.text === \"yield\")\n\t);\n}\n\nfunction has_yield_star_ancestor(node: ts.Node): boolean {\n\tlet current = node.parent;\n\n\twhile (current) {\n\t\tif (is_yield_star_expression(current)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tcurrent = current.parent;\n\t}\n\n\treturn false;\n}\n\nfunction unwrap_parentheses(expression: ts.Expression | undefined): ts.Expression | undefined {\n\tlet current = expression;\n\n\twhile (current && ts.isParenthesizedExpression(current)) {\n\t\tcurrent = current.expression;\n\t}\n\n\treturn current;\n}\n\nfunction get_line_column(line_starts: number[], position: number): SourceLocation {\n\tlet low = 0;\n\tlet high = line_starts.length - 1;\n\n\twhile (low <= high) {\n\t\tconst mid = Math.floor((low + high) / 2);\n\n\t\tif (line_starts[mid] <= position) {\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\thigh = mid - 1;\n\t\t}\n\t}\n\n\tconst line_index = Math.max(0, high);\n\tconst line = line_index + 1;\n\tconst column = position - line_starts[line_index];\n\n\treturn { line, column };\n}\n\nfunction make_line_starts(code: string): number[] {\n\tconst line_starts = [0];\n\n\tfor (let i = 0; i < code.length; i += 1) {\n\t\tif (code[i] !== \"\\n\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tline_starts.push(i + 1);\n\t}\n\n\treturn line_starts;\n}\n"],"mappings":"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"}
|