svelte-effect-runtime 2.3.1 → 2.4.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-LYwZZXy7.js → client-CfkB_G4o.js} +3 -3
- package/.dist/chunks/{client-LYwZZXy7.js.map → client-CfkB_G4o.js.map} +1 -1
- package/.dist/chunks/{descriptors-CU2g4U_i.js → descriptors-OS4VfJuW.js} +1 -1
- package/.dist/chunks/{descriptors-CU2g4U_i.js.map → descriptors-OS4VfJuW.js.map} +1 -1
- package/.dist/chunks/{dispatcher-g0HYqHOK.js → dispatcher-8B6Ol80H.js} +1 -1
- package/.dist/chunks/{dispatcher-g0HYqHOK.js.map → dispatcher-8B6Ol80H.js.map} +1 -1
- package/.dist/chunks/{preprocess-33aQ41uE.js → preprocess-Cn4JH9OO.js} +36 -15
- package/.dist/chunks/preprocess-Cn4JH9OO.js.map +1 -0
- package/.dist/chunks/{transform-B4g76Ur4.js → transform-s9gKPYu5.js} +424 -29
- package/.dist/chunks/transform-s9gKPYu5.js.map +1 -0
- package/.dist/detect.js.map +1 -1
- package/.dist/dispatcher.js +1 -1
- 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/promise.js.map +1 -1
- package/.dist/markup/run.js +1 -1
- package/.dist/markup/run.js.map +1 -1
- package/.dist/markup/transform/constants.d.ts +3 -3
- package/.dist/markup/transform/effect-bindings.d.ts +41 -0
- package/.dist/markup/transform/effect-callbacks.d.ts +26 -0
- package/.dist/markup/transform/emit.d.ts +4 -1
- package/.dist/markup/transform.js +1 -1
- package/.dist/markup/value.js +1 -1
- package/.dist/markup/value.js.map +1 -1
- package/.dist/mod.js +1 -1
- package/.dist/mod.js.map +1 -1
- package/.dist/preprocess/imports.d.ts +2 -1
- package/.dist/preprocess.js +2 -2
- package/.dist/remote/client.js +1 -1
- package/.dist/remote/server.js.map +1 -1
- package/.dist/remote/shared.js.map +1 -1
- package/.dist/runtime/preprocess.js +2 -2
- package/.dist/runtime/preprocess.js.map +1 -1
- package/.dist/server/factories.d.ts +10 -1
- package/.dist/server/types.d.ts +10 -1
- package/.dist/server.js +1 -1
- package/.dist/server.js.map +1 -1
- package/.dist/vite.js +5 -5
- package/.dist/vite.js.map +1 -1
- package/package.json +6 -3
- package/.dist/chunks/preprocess-33aQ41uE.js.map +0 -1
- package/.dist/chunks/transform-B4g76Ur4.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transform-B4g76Ur4.js","names":["is_yield_star_expression"],"sources":["../../../modules/svelte-effect-runtime/src/markup/transform/constants.ts","../../../modules/svelte-effect-runtime/src/markup/transform/apply.ts","../../../modules/svelte-effect-runtime/src/markup/transform/classify.ts","../../../modules/svelte-effect-runtime/src/error.ts","../../../modules/svelte-effect-runtime/src/markup/transform/expressions.ts","../../../modules/svelte-effect-runtime/src/markup/transform/emit.ts","../../../modules/svelte-effect-runtime/src/preprocess/ast.ts","../../../modules/svelte-effect-runtime/src/markup/transform/scan.ts","../../../modules/svelte-effect-runtime/src/markup/transform/index.ts"],"sourcesContent":["export const HELPERS = {\n value: \"__ser_markup_value\",\n promise: \"__ser_markup_promise\",\n run: \"__ser_markup_run\",\n} as const;\n","import type MagicString from \"magic-string\";\n\nimport { HELPERS } from \"./constants.ts\";\nimport type {\n HelperDeclaration,\n Insertion,\n MarkupRelocation,\n PendingRelocation,\n Replacement,\n} from \"./types.ts\";\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\nexport function blank_script_blocks(content: string): string {\n return content.replace(\n /<script\\b[^>]*>[\\s\\S]*?<\\/script\\s*>/gi,\n (match) => {\n const lines = match.split(\"\\n\");\n return lines.map((l) => \" \".repeat(l.length)).join(\"\\n\");\n },\n );\n}\n\nexport function inject_helpers(\n magic: MagicString,\n content: string,\n helpers: HelperDeclaration[] = [],\n): Insertion | undefined {\n if (content.includes(HELPERS.value)) {\n return undefined;\n }\n\n const helper_segments: Array<{\n text: string;\n relocation?: PendingRelocation;\n }> = [\n `import { value as ${HELPERS.value} } from \"svelte-effect-runtime/internal/generators\";`,\n `import { promise as ${HELPERS.promise} } from \"svelte-effect-runtime/internal/generators\";`,\n `import { run as ${HELPERS.run} } from \"svelte-effect-runtime/internal/generators\";`,\n ...helpers,\n ].map((helper) =>\n typeof helper === \"string\" ? { text: helper } : helper\n );\n\n const helper_block = helper_segments.map((segment) => segment.text).join(\n \"\\n\",\n );\n\n const script_tag = find_instance_script_tag(content);\n\n if (script_tag) {\n const text = `\\n${helper_block}\\n`;\n\n magic.appendLeft(script_tag.end, text);\n\n return {\n start: script_tag.end,\n text,\n relocations: make_insertion_relocations(helper_segments, \"\\n\"),\n };\n } else {\n const text = `<script>\\n${helper_block}\\n</script>\\n\\n`;\n\n magic.prepend(text);\n\n return {\n start: 0,\n text,\n relocations: make_insertion_relocations(helper_segments, \"<script>\\n\"),\n };\n }\n}\n\nexport function create_relocations(\n replacements: Replacement[],\n helper_insertion: Insertion | undefined,\n): MarkupRelocation[] {\n const edits = [\n helper_insertion && {\n start: helper_insertion.start,\n removedLength: 0,\n insertedLength: helper_insertion.text.length,\n },\n ...replacements.map((replacement) => ({\n start: replacement.start,\n removedLength: replacement.end - replacement.start,\n insertedLength: replacement.text.length,\n })),\n ].filter(Boolean) as Array<{\n start: number;\n removedLength: number;\n insertedLength: number;\n }>;\n\n const replacement_relocations = replacements.flatMap((replacement) => {\n if (!replacement.relocation) {\n return [];\n }\n\n const delta_before = edits\n .filter((edit) => edit.start < replacement.start)\n .reduce(\n (total, edit) => total + edit.insertedLength - edit.removedLength,\n 0,\n );\n const generated_start = replacement.start + delta_before;\n\n return [{\n originalStart: replacement.relocation.originalStart,\n originalEnd: replacement.relocation.originalEnd,\n generatedStart: generated_start +\n replacement.relocation.generatedStartInReplacement,\n generatedEnd: generated_start +\n replacement.relocation.generatedEndInReplacement,\n }];\n });\n\n const helper_relocations = helper_insertion?.relocations?.map(\n (relocation) => ({\n originalStart: relocation.originalStart,\n originalEnd: relocation.originalEnd,\n generatedStart: helper_insertion.start +\n relocation.generatedStartInReplacement,\n generatedEnd: helper_insertion.start +\n relocation.generatedEndInReplacement,\n }),\n ) ?? [];\n\n return [\n ...replacement_relocations,\n ...helper_relocations,\n ];\n}\n\nfunction make_insertion_relocations(\n segments: Array<{\n text: string;\n relocation?: PendingRelocation;\n }>,\n prefix: string,\n): PendingRelocation[] {\n const relocations: PendingRelocation[] = [];\n let offset = prefix.length;\n\n for (const segment of segments) {\n if (segment.relocation) {\n relocations.push({\n originalStart: segment.relocation.originalStart,\n originalEnd: segment.relocation.originalEnd,\n generatedStartInReplacement: offset +\n segment.relocation.generatedStartInReplacement,\n generatedEndInReplacement: offset +\n segment.relocation.generatedEndInReplacement,\n });\n }\n\n offset += segment.text.length + 1;\n }\n\n return relocations;\n}\n\nfunction find_instance_script_tag(\n content: string,\n): { start: number; end: number } | 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) continue;\n\n const attrs = match[1] ?? \"\";\n if (\n /\\bcontext\\s*=\\s*[\"']module[\"']/.test(attrs) ||\n /\\bmodule\\b/.test(attrs)\n ) {\n continue;\n }\n\n const open_end = match[0].indexOf(\">\") + 1;\n return {\n start: match.index + open_end,\n end: match.index + match[0].length - \"</script>\".length,\n };\n }\n\n return undefined;\n}\n","import type { AST } from \"svelte/compiler\";\n\nimport type { MarkupCandidate, TagKind } from \"./types.ts\";\n\n/**\n * Matches sanitized placeholders back to their Svelte AST context.\n *\n * @since 2.0.0\n * @param ast - Parsed Svelte AST for the sanitized component markup.\n * @param candidates - Placeholder candidates produced by the scanner.\n * @returns Candidates paired with the markup context that determines how they\n * should be emitted.\n */\nexport function classify_candidates(\n ast: AST.Root,\n candidates: MarkupCandidate[],\n): Array<{ candidate: MarkupCandidate; kind: TagKind }> {\n const by_placeholder = new Map(\n candidates.map((candidate) => [candidate.placeholder, candidate]),\n );\n\n const classified: Array<{ candidate: MarkupCandidate; kind: TagKind }> = [];\n const matched = new Set<string>();\n\n walk_ast(ast.fragment, by_placeholder, matched, classified);\n\n return classified;\n}\n\nfunction walk_ast(\n fragment: AST.Fragment,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n for (const node of fragment.nodes) {\n visit_ast_node(node, candidates, matched, classified);\n }\n}\n\nfunction visit_ast_node(\n node: AST.Fragment[\"nodes\"][number],\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n switch (node.type) {\n case \"ExpressionTag\":\n classify_expression(\n node.expression,\n \"plain\",\n candidates,\n matched,\n classified,\n );\n return;\n\n case \"IfBlock\":\n classify_expression(node.test, \"plain\", candidates, matched, classified);\n walk_ast(node.consequent, candidates, matched, classified);\n if (node.alternate) {\n walk_ast(node.alternate, candidates, matched, classified);\n }\n return;\n\n case \"EachBlock\":\n classify_expression(\n node.expression,\n \"each\",\n candidates,\n matched,\n classified,\n );\n walk_ast(node.body, candidates, matched, classified);\n if (node.fallback) {\n walk_ast(node.fallback, candidates, matched, classified);\n }\n return;\n\n case \"AwaitBlock\":\n classify_expression(\n node.expression,\n \"await\",\n candidates,\n matched,\n classified,\n );\n if (node.pending) {\n walk_ast(node.pending, candidates, matched, classified);\n }\n if (node.then) walk_ast(node.then, candidates, matched, classified);\n if (node.catch) walk_ast(node.catch, candidates, matched, classified);\n return;\n\n case \"RenderTag\":\n classify_expression(\n node.expression,\n \"render\",\n candidates,\n matched,\n classified,\n );\n return;\n\n case \"HtmlTag\":\n classify_expression(\n node.expression,\n \"plain\",\n candidates,\n matched,\n classified,\n );\n return;\n\n case \"DebugTag\":\n classify_debug_tag(node, candidates, matched, classified);\n return;\n\n case \"ConstTag\":\n case \"DeclarationTag\":\n classify_declaration_tag(node, candidates, matched, classified);\n return;\n\n case \"KeyBlock\":\n classify_expression(\n node.expression,\n \"plain\",\n candidates,\n matched,\n classified,\n );\n walk_ast(node.fragment, candidates, matched, classified);\n return;\n\n case \"RegularElement\":\n case \"Component\":\n case \"TitleElement\":\n case \"SlotElement\":\n case \"SvelteBody\":\n case \"SvelteBoundary\":\n case \"SvelteComponent\":\n case \"SvelteDocument\":\n case \"SvelteElement\":\n case \"SvelteFragment\":\n case \"SvelteHead\":\n case \"SvelteSelf\":\n case \"SvelteWindow\":\n visit_element_attributes(node, candidates, matched, classified);\n walk_ast(node.fragment, candidates, matched, classified);\n return;\n\n default:\n return;\n }\n}\n\nfunction classify_debug_tag(\n node: Extract<AST.Fragment[\"nodes\"][number], { type: \"DebugTag\" }>,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n const idents = node.identifiers;\n\n if (!idents || idents.length === 0) {\n return;\n }\n\n for (const ident of idents) {\n classify_expression(ident, \"plain\", candidates, matched, classified);\n }\n}\n\nfunction classify_declaration_tag(\n node: Extract<\n AST.Fragment[\"nodes\"][number],\n { type: \"ConstTag\" | \"DeclarationTag\" }\n >,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n for (const decl of node.declaration.declarations) {\n if (!decl.init) {\n continue;\n }\n\n classify_expression(decl.init, \"plain\", candidates, matched, classified);\n }\n}\n\ninterface ElementLikeNode {\n attributes: Array<{\n type: string;\n name?: string;\n value?: unknown;\n expression?: unknown;\n }>;\n fragment: AST.Fragment;\n}\n\nfunction visit_element_attributes(\n node: ElementLikeNode,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n for (const attr of node.attributes) {\n if (\n attr.type === \"Attribute\" &&\n attr.name &&\n is_event_attribute_name(attr.name)\n ) {\n visit_attribute_value(\n attr.value as\n | true\n | AST.ExpressionTag\n | Array<AST.Text | AST.ExpressionTag>,\n \"event\",\n candidates,\n matched,\n classified,\n );\n continue;\n }\n\n if (attr.type === \"OnDirective\" && attr.expression) {\n classify_expression(\n attr.expression as ExpressionLike,\n \"event\",\n candidates,\n matched,\n classified,\n );\n continue;\n }\n }\n}\n\nfunction is_event_attribute_name(name: string): boolean {\n return name.startsWith(\"on:\") || /^on[a-z]/.test(name);\n}\n\nfunction visit_attribute_value(\n value: true | AST.ExpressionTag | Array<AST.Text | AST.ExpressionTag>,\n kind: TagKind,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n if (value === true) {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const part of value) {\n if (part.type === \"ExpressionTag\") {\n classify_expression(\n part.expression,\n kind,\n candidates,\n matched,\n classified,\n );\n }\n }\n return;\n }\n\n classify_expression(\n value.expression,\n kind,\n candidates,\n matched,\n classified,\n );\n}\n\ntype ExpressionLike = {\n type: string;\n name?: string;\n callee?: { type: string; name?: string };\n};\n\nfunction classify_expression(\n expression: ExpressionLike | null | undefined,\n kind: TagKind,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n if (!expression) {\n return;\n }\n\n const found_candidates = find_candidates(expression, candidates);\n\n for (const candidate of found_candidates) {\n if (matched.has(candidate.placeholder)) {\n continue;\n }\n\n matched.add(candidate.placeholder);\n classified.push({ candidate, kind });\n }\n}\n\nfunction find_candidates(\n expression: ExpressionLike,\n candidates: Map<string, MarkupCandidate>,\n): MarkupCandidate[] {\n const found: MarkupCandidate[] = [];\n const seen_nodes = new Set<unknown>();\n const seen_placeholders = new Set<string>();\n\n visit_expression_value(\n expression,\n candidates,\n seen_nodes,\n seen_placeholders,\n found,\n );\n\n return found;\n}\n\nfunction visit_expression_value(\n value: unknown,\n candidates: Map<string, MarkupCandidate>,\n seen_nodes: Set<unknown>,\n seen_placeholders: Set<string>,\n found: MarkupCandidate[],\n): void {\n if (Array.isArray(value)) {\n for (const item of value) {\n visit_expression_value(\n item,\n candidates,\n seen_nodes,\n seen_placeholders,\n found,\n );\n }\n\n return;\n }\n\n if (!is_record(value) || seen_nodes.has(value)) {\n return;\n }\n\n seen_nodes.add(value);\n\n if (value.type === \"Identifier\" && typeof value.name === \"string\") {\n const candidate = candidates.get(value.name);\n\n if (candidate && !seen_placeholders.has(candidate.placeholder)) {\n seen_placeholders.add(candidate.placeholder);\n found.push(candidate);\n }\n }\n\n for (const child of Object.values(value)) {\n visit_expression_value(\n child,\n candidates,\n seen_nodes,\n seen_placeholders,\n found,\n );\n }\n}\n\nfunction is_record(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","/**\n * Formats a runtime-owned error message with a stable screaming-case code.\n *\n * @example\n * ```ts\n * throw new Error(make_error_message(\"DISPATCHER_DISPOSED\", \"Dispatcher has been disposed\"));\n * ```\n *\n * @since 2.0.0\n * @param code - Stable screaming-case identifier for the error category.\n * @param message - Human-readable error message without the leading code.\n * @returns The complete error message prefixed with the stable code.\n */\nexport function make_error_message(code: string, message: string): string {\n return `[${code}]: ${message}`;\n}\n\n/**\n * Base error class for all preprocessor errors emitted during script and\n * markup transformation. Carries the source filename so error messages can\n * reference the affected file.\n *\n * @since 2.0.0\n */\nexport class PreprocessError extends Error {\n /**\n * The source filename that triggered this error.\n *\n * @since 2.0.0\n */\n readonly filename: string;\n\n constructor(message: string, filename: string) {\n super(message);\n this.name = \"PreprocessError\";\n this.filename = filename;\n }\n}\n\n/**\n * Thrown when a statement mixes JavaScript `await` with Effect `yield*` work\n * that must be lowered into an `Effect.gen` program.\n *\n * @since 2.0.0\n */\nexport class AwaitInEffectWorkError extends PreprocessError {\n /**\n * The full text of the problematic statement containing mixed async work.\n *\n * @since 2.0.0\n */\n readonly statement_text: string;\n\n constructor(filename: string, statement_text: string) {\n super(\n [\n make_error_message(\n \"AWAIT_IN_EFFECT_WORK\",\n `${filename}: await cannot be mixed with yield* in Effect work.`,\n ),\n `Top-level await is supported as ordinary Svelte async rendering, but statements lowered into Effect.gen must use yield* for async Effect work.`,\n \"\",\n `Problematic statement:`,\n statement_text,\n ].join(\"\\n\"),\n filename,\n );\n this.name = \"AwaitInEffectWorkError\";\n this.statement_text = statement_text;\n }\n}\n\n/**\n * Thrown when async Effect work appears inside a Svelte rune position that\n * must stay synchronous.\n *\n * @since 2.0.0\n */\nexport class AsyncEffectInSyncRuneError extends PreprocessError {\n /**\n * The name of the rune that contained async Effect work.\n *\n * @since 2.0.0\n */\n readonly rune_name: string;\n\n /**\n * The full text of the expression that triggered the error.\n *\n * @since 2.0.0\n */\n readonly expression_text: string;\n\n constructor(rune_name: string, expression_text: string, filename: string) {\n super(\n [\n make_error_message(\n \"ASYNC_EFFECT_IN_SYNC_RUNE\",\n `${filename}: yield* cannot be used inside ${rune_name}().`,\n ),\n `${rune_name}() must stay synchronous. Do not put async Effect work inside this rune.`,\n \"\",\n `Problematic expression:`,\n expression_text,\n ].join(\"\\n\"),\n filename,\n );\n this.name = \"AsyncEffectInSyncRuneError\";\n this.rune_name = rune_name;\n this.expression_text = expression_text;\n }\n}\n\n/**\n * Thrown when async Effect work appears inside a non-generator callback nested\n * in a markup event handler.\n *\n * @example\n * ```ts\n * throw new AsyncEffectInEventCallbackError(\n * \"Component.svelte\",\n * \"Effect.try(() => yield* save())\",\n * );\n * ```\n *\n * @since 2.0.0\n */\nexport class AsyncEffectInEventCallbackError extends PreprocessError {\n /**\n * The full text of the problematic event handler body.\n *\n * @since 2.0.0\n */\n readonly expression_text: string;\n\n constructor(filename: string, expression_text: string) {\n super(\n [\n make_error_message(\n \"ASYNC_EFFECT_IN_EVENT_CALLBACK\",\n `${filename}: yield* cannot be used inside a nested non-generator callback in a markup event handler.`,\n ),\n `Move the yield* to the event handler body. Effect.try and Effect.sync callbacks are plain synchronous JavaScript; do not call Effect-returning functions inside them.`,\n \"\",\n `Run the remote Effect directly:`,\n ` onclick={yield* UpvotePost(id)}`,\n \"\",\n `Recover from remote failures by composing the Effect value:`,\n ` onclick={yield* UpvotePost(id).pipe(Effect.catch(() => Effect.void))}`,\n \"\",\n `Problematic expression:`,\n expression_text,\n ].join(\"\\n\"),\n filename,\n );\n this.name = \"AsyncEffectInEventCallbackError\";\n this.expression_text = expression_text;\n }\n}\n\n/**\n * Thrown when an event handler callback contains the old raw `yield*`\n * shorthand. Effectful event handlers must put `yield*` directly in the event\n * attribute so the callback boundary is generated by the markup runtime.\n *\n * @example\n * ```ts\n * throw new YieldStarInEventCallbackError(\n * \"Component.svelte\",\n * \"() => yield* save()\",\n * );\n * ```\n *\n * @since 2.0.0\n * @param filename - Svelte component filename used to identify where the\n * invalid event handler callback was found.\n * @param expression_text - Original event handler callback text that contained\n * `yield*` and should be rewritten as a direct event Effect expression.\n */\nexport class YieldStarInEventCallbackError extends PreprocessError {\n /**\n * The full text of the problematic event handler callback.\n *\n * @since 2.0.0\n */\n readonly expression_text: string;\n\n constructor(filename: string, expression_text: string) {\n super(\n [\n make_error_message(\n \"ASYNC_EFFECT_IN_EVENT_HANDLER_CALLBACK\",\n `${filename}: yield* in markup event handlers must be written directly as the event attribute value.`,\n ),\n `SER generates the event callback for effectful event handlers; do not put yield* inside a JavaScript callback.`,\n \"\",\n `Use this form:`,\n ` onclick={yield* UpvotePost(id)}`,\n \"\",\n `Instead of this form:`,\n ` onclick={() => yield* UpvotePost(id)}`,\n \"\",\n `Problematic expression:`,\n expression_text,\n ].join(\"\\n\"),\n filename,\n );\n this.name = \"YieldStarInEventCallbackError\";\n this.expression_text = expression_text;\n }\n}\n","import ts from \"typescript\";\n\n/**\n * Strips an event handler arrow function down to its executable body.\n *\n * @since 2.0.0\n * @param expr - Event handler expression text from the original markup.\n * @returns Handler parameters, body text, and body offsets inside `expr`.\n */\nexport function strip_arrow_function(\n expr: string,\n): { params: string; body: string; body_start: number; body_end: number } {\n const arrow_idx = expr.indexOf(\"=>\");\n\n if (arrow_idx === -1) {\n return { params: \"()\", body: expr, body_start: 0, body_end: expr.length };\n }\n\n const params = expr.slice(0, arrow_idx).trim();\n const raw_body = expr.slice(arrow_idx + 2);\n const leading_ws = raw_body.length - raw_body.trimStart().length;\n let body_start = arrow_idx + 2 + leading_ws;\n let body_end = expr.length - (raw_body.length - raw_body.trimEnd().length);\n let body = expr.slice(body_start, body_end);\n\n if (body.startsWith(\"{\") && body.endsWith(\"}\")) {\n body_start += 1;\n body_end -= 1;\n body = body.slice(1, -1);\n }\n\n const body_leading_ws = body.length - body.trimStart().length;\n const body_trailing_ws = body.length - body.trimEnd().length;\n\n body_start += body_leading_ws;\n body_end -= body_trailing_ws;\n body = body.trim();\n\n if (body.endsWith(\";\")) {\n body = body.slice(0, -1);\n body_end -= 1;\n }\n\n return { params, body, body_start, body_end };\n}\n\n/**\n * Returns whether an expression is a callback function.\n *\n * @since 2.0.0\n * @param expr - Expression text from a markup attribute or expression tag.\n * @returns Whether the expression parses as an arrow or function expression.\n */\nexport function is_callback_function_expression(expr: string): boolean {\n const wrapped = `const __ser_callback = ${expr};`;\n const sf = ts.createSourceFile(\n \"callback.ts\",\n wrapped,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n const stmt = sf.statements[0];\n\n if (!ts.isVariableStatement(stmt)) {\n return false;\n }\n\n const initializer = stmt.declarationList.declarations[0]?.initializer;\n\n return initializer !== undefined &&\n (ts.isArrowFunction(initializer) ||\n ts.isFunctionExpression(initializer));\n}\n\n/**\n * Classifies `yield*` placement inside an event handler body.\n *\n * @example\n * ```ts\n * analyze_event_body_yield_star(\"yield* save()\");\n * ```\n *\n * @since 2.0.0\n * @param body - Event handler body text after the outer arrow has been\n * stripped.\n * @returns Whether the body has top-level yield* expressions and whether any\n * yield* appears inside a nested non-generator callback.\n */\nexport function analyze_event_body_yield_star(body: string): {\n has_top_level_yield_star: boolean;\n has_nested_invalid_yield_star: boolean;\n} {\n const wrapped = `function* __ser_event() { ${body}; }`;\n const sf = ts.createSourceFile(\n \"event.ts\",\n wrapped,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n const stmt = sf.statements[0];\n\n if (!ts.isFunctionDeclaration(stmt) || !stmt.body) {\n return {\n has_top_level_yield_star: false,\n has_nested_invalid_yield_star: /\\byield\\s*\\*/.test(body),\n };\n }\n\n const result = {\n has_top_level_yield_star: false,\n has_nested_invalid_yield_star: false,\n };\n\n visit_event_body(stmt.body, \"top_level\", result);\n\n return result;\n}\n\n/**\n * Collects free identifiers that must be captured as reactive dependencies.\n *\n * @since 2.0.0\n * @param expr_text - Markup expression text to inspect.\n * @returns Identifier names referenced by the expression.\n */\nexport function collect_free_identifiers(expr_text: string): string[] {\n const wrapped = `function* __w() { return (${expr_text}); }`;\n let sf: ts.SourceFile;\n\n try {\n sf = ts.createSourceFile(\n \"expr.ts\",\n wrapped,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n } catch {\n return [];\n }\n\n const fn = sf.statements[0];\n\n if (!ts.isFunctionDeclaration(fn) || !fn.body) {\n return [];\n }\n\n const ids: string[] = [];\n const seen = new Set<string>();\n\n visit_ids(fn.body, seen, ids);\n\n return ids;\n}\n\nfunction visit_ids(\n node: ts.Node,\n seen: Set<string>,\n ids: string[],\n): void {\n if (\n ts.isArrowFunction(node) ||\n ts.isFunctionExpression(node) ||\n ts.isFunctionDeclaration(node)\n ) {\n return;\n }\n\n if (ts.isIdentifier(node)) {\n if (\n node.text === \"yield\" ||\n node.text === \"undefined\" ||\n node.text === \"null\" ||\n node.text === \"true\" ||\n node.text === \"false\" ||\n node.text === \"this\"\n ) {\n return;\n }\n\n if (is_property_access_name(node)) {\n return;\n }\n\n if (!seen.has(node.text)) {\n seen.add(node.text);\n ids.push(node.text);\n }\n return;\n }\n\n node.forEachChild((child) => visit_ids(child, seen, ids));\n}\n\ntype EventYieldContext = \"top_level\" | \"nested_generator\" | \"nested_invalid\";\n\ninterface EventYieldAnalysis {\n has_top_level_yield_star: boolean;\n has_nested_invalid_yield_star: boolean;\n}\n\nfunction visit_event_body(\n node: ts.Node,\n context: EventYieldContext,\n result: EventYieldAnalysis,\n): void {\n if (is_yield_star_expression(node)) {\n if (context === \"top_level\") {\n result.has_top_level_yield_star = true;\n } else if (context === \"nested_invalid\") {\n result.has_nested_invalid_yield_star = true;\n }\n\n node.forEachChild((child) => visit_event_body(child, context, result));\n return;\n }\n\n if (is_nested_function_boundary(node)) {\n const next_context = is_generator_function_boundary(node)\n ? \"nested_generator\"\n : \"nested_invalid\";\n\n node.forEachChild((child) => visit_event_body(child, next_context, result));\n return;\n }\n\n node.forEachChild((child) => visit_event_body(child, context, result));\n}\n\nfunction is_nested_function_boundary(node: ts.Node): boolean {\n return (\n ts.isArrowFunction(node) ||\n ts.isFunctionExpression(node) ||\n ts.isFunctionDeclaration(node) ||\n ts.isMethodDeclaration(node) ||\n ts.isGetAccessorDeclaration(node) ||\n ts.isSetAccessorDeclaration(node)\n );\n}\n\nfunction is_generator_function_boundary(node: ts.Node): boolean {\n return (\n (ts.isFunctionExpression(node) || ts.isFunctionDeclaration(node) ||\n ts.isMethodDeclaration(node)) &&\n node.asteriskToken !== undefined\n );\n}\n\nfunction is_yield_star_expression(node: ts.Node): boolean {\n if (ts.isYieldExpression(node)) {\n return node.asteriskToken !== undefined;\n }\n\n return (\n ts.isBinaryExpression(node) &&\n node.operatorToken.kind === ts.SyntaxKind.AsteriskToken &&\n ts.isIdentifier(node.left) &&\n node.left.text === \"yield\"\n );\n}\n\nfunction is_property_access_name(node: ts.Identifier): boolean {\n const parent = node.parent;\n\n return (\n (ts.isPropertyAccessExpression(parent) && parent.name === node) ||\n (ts.isPropertyAssignment(parent) && parent.name === node) ||\n (ts.isBindingElement(parent) && parent.propertyName === node) ||\n ts.isImportSpecifier(parent) ||\n ts.isExportSpecifier(parent)\n );\n}\n","import {\n AsyncEffectInEventCallbackError,\n YieldStarInEventCallbackError,\n} from \"$/error.ts\";\nimport { HELPERS } from \"./constants.ts\";\nimport {\n analyze_event_body_yield_star,\n collect_free_identifiers,\n is_callback_function_expression,\n} from \"./expressions.ts\";\nimport type {\n HelperDeclaration,\n MarkupCandidate,\n PendingRelocation,\n Replacement,\n TagKind,\n} from \"./types.ts\";\n\n/**\n * Emits source edits for classified markup Effect expressions.\n *\n * @since 2.0.0\n * @param classified - Candidates paired with their Svelte markup context.\n * @returns Replacements ready to apply to the original component source.\n */\nexport function emit_replacements(\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): Replacement[] {\n return classified.map(({ candidate, kind }) =>\n emit_replacement(candidate, kind)\n );\n}\n\nfunction emit_replacement(\n candidate: MarkupCandidate,\n kind: TagKind,\n): Replacement {\n const id = make_cache_id(candidate);\n const id_text = JSON.stringify(id);\n const helper_name = make_helper_name(candidate);\n\n let replacement_text: string;\n let helpers: HelperDeclaration[];\n let relocation: PendingRelocation | undefined;\n\n if (kind === \"await\") {\n const effect = make_effect_helper(candidate, helper_name);\n\n replacement_text = emit_promise_expression(id_text, effect);\n helpers = [effect.helper];\n } else if (kind === \"render\") {\n const effect = make_effect_helper(candidate, helper_name);\n\n replacement_text = emit_render_expression(id_text, effect);\n helpers = [effect.helper];\n } else if (kind === \"each\") {\n const effect = make_effect_helper(candidate, helper_name);\n\n replacement_text = emit_each_expression(id_text, effect);\n helpers = [effect.helper];\n } else if (kind === \"event\") {\n const event = make_event_handler(candidate);\n\n replacement_text = event.text;\n helpers = [];\n relocation = make_relocation(candidate, replacement_text, {\n originalStart: 0,\n originalEnd: candidate.expr_text.length,\n generatedText: candidate.expr_text,\n });\n } else {\n const effect = make_effect_helper(candidate, helper_name);\n\n replacement_text = emit_each_expression(id_text, effect);\n helpers = [effect.helper];\n }\n\n return {\n start: candidate.start,\n end: candidate.end,\n text: replacement_text,\n helpers,\n relocation,\n };\n}\n\nfunction make_event_handler(candidate: MarkupCandidate): { text: string } {\n if (is_callback_function_expression(candidate.expr_text)) {\n throw new YieldStarInEventCallbackError(\n candidate.filename,\n candidate.expr_text,\n );\n }\n\n const analysis = analyze_event_body_yield_star(candidate.expr_text);\n\n if (analysis.has_nested_invalid_yield_star) {\n throw new AsyncEffectInEventCallbackError(\n candidate.filename,\n candidate.expr_text,\n );\n }\n\n return {\n text:\n `(event) => { void ${HELPERS.run}(function* () { ${candidate.expr_text}; }); }`,\n };\n}\n\nfunction emit_promise_expression(\n id_text: string,\n effect: EffectHelper,\n): string {\n return `${HELPERS.promise}(${id_text}, ${effect.deps_text}, () => ${effect.call})`;\n}\n\nfunction emit_render_expression(\n id_text: string,\n effect: EffectHelper,\n): string {\n return `(await ${emit_promise_expression(id_text, effect)})()`;\n}\n\nfunction emit_each_expression(\n id_text: string,\n effect: EffectHelper,\n): string {\n return `await ${emit_promise_expression(id_text, effect)}`;\n}\n\ninterface EffectHelper {\n helper: HelperDeclaration;\n call: string;\n deps_text: string;\n}\n\nfunction make_effect_helper(\n candidate: MarkupCandidate,\n helper_name: string,\n): EffectHelper {\n const deps = collect_free_identifiers(candidate.expr_text);\n const params_text = deps.join(\", \");\n const args_text = deps.join(\", \");\n const deps_text = deps.length === 0 ? \"[]\" : `[${args_text}]`;\n const call = `${helper_name}(${args_text})`;\n const text =\n `function* ${helper_name}(${params_text}) { return (${candidate.expr_text}); }`;\n const generated_start = text.indexOf(candidate.expr_text);\n\n return {\n call,\n deps_text,\n helper: {\n text,\n relocation: {\n originalStart: candidate.start,\n originalEnd: candidate.end,\n generatedStartInReplacement: generated_start,\n generatedEndInReplacement: generated_start +\n candidate.expr_text.length,\n },\n },\n };\n}\n\nfunction make_cache_id(candidate: MarkupCandidate): string {\n return `${candidate.filename}:${candidate.start}:${candidate.end}`;\n}\n\nfunction make_helper_name(candidate: MarkupCandidate): string {\n return `__ser_markup_effect_${candidate.start}_${candidate.end}`;\n}\n\nfunction make_relocation(\n candidate: MarkupCandidate,\n replacement_text: string,\n inner: {\n originalStart: number;\n originalEnd: number;\n generatedText: string;\n },\n): PendingRelocation | undefined {\n const generated_start = replacement_text.indexOf(inner.generatedText);\n\n if (generated_start === -1) {\n return undefined;\n }\n\n return {\n originalStart: candidate.start + inner.originalStart,\n originalEnd: candidate.start + inner.originalEnd,\n generatedStartInReplacement: generated_start,\n generatedEndInReplacement: generated_start + inner.generatedText.length,\n };\n}\n","import ts from \"typescript\";\n\n/**\n * Checks whether a node is a `yield*` binary expression.\n *\n * @since 2.0.0\n * @param node - TypeScript AST node to check.\n * @returns Whether the node represents `yield * operand`.\n */\nexport function is_yield_star_expression(node: ts.Node): boolean {\n return (\n ts.isBinaryExpression(node) &&\n node.operatorToken.kind === ts.SyntaxKind.AsteriskToken &&\n ts.isIdentifier(node.left) &&\n node.left.text === \"yield\"\n );\n}\n\n/**\n * Checks whether a node owns its own yield semantics.\n *\n * @since 2.0.0\n * @param node - TypeScript AST node to check.\n * @returns Whether traversal should stop at this function boundary.\n */\nexport function is_function_boundary_node(node: ts.Node): boolean {\n return (\n ts.isArrowFunction(node) ||\n ts.isFunctionDeclaration(node) ||\n ts.isFunctionExpression(node) ||\n ts.isMethodDeclaration(node) ||\n ts.isGetAccessorDeclaration(node) ||\n ts.isSetAccessorDeclaration(node)\n );\n}\n\n/**\n * Returns `true` if the node tree contains a top-level `await`.\n *\n * @since 2.0.0\n * @param node - Root node to search.\n * @returns Whether a top-level await expression was found.\n */\nexport function contains_top_level_await(node: ts.Node): boolean {\n if (ts.isAwaitExpression(node)) {\n return true;\n }\n\n return node.getChildren().some(\n (child) =>\n !is_function_boundary_node(child) && contains_top_level_await(child),\n );\n}\n\n/**\n * Collects top-level `yield*` nodes under an expression.\n *\n * @since 2.0.0\n * @param node - Root node to search.\n * @param on_found - Callback invoked for each matching yield node.\n * @returns Nothing.\n */\nexport function collect_yield_star_nodes(\n node: ts.Node,\n on_found: (node: ts.Node) => void,\n): void {\n if (is_function_boundary_node(node)) {\n return;\n }\n\n if (is_yield_star_expression(node)) {\n on_found(node);\n return;\n }\n\n node.forEachChild((child) => {\n collect_yield_star_nodes(child, on_found);\n });\n}\n\n/**\n * Finds the first top-level `yield*` expression below a node.\n *\n * @since 2.0.0\n * @param node - Root node to search.\n * @param on_found - Callback invoked with the first matching node.\n * @returns Nothing.\n */\nexport function find_yield_star_node(\n node: ts.Node,\n on_found: (node: ts.Node) => void,\n): void {\n if (is_function_boundary_node(node)) {\n return;\n }\n\n if (is_yield_star_expression(node)) {\n on_found(node);\n return;\n }\n\n node.forEachChild((child) => {\n find_yield_star_node(child, on_found);\n });\n}\n\n/**\n * Extracts identifier names from a TypeScript binding name.\n *\n * @since 2.0.0\n * @param name - Binding name node to flatten.\n * @returns Identifier names from identifiers and destructuring patterns.\n */\nexport function extract_binding_names(name: ts.BindingName): string[] {\n if (ts.isIdentifier(name)) {\n return [name.text];\n }\n\n const result: string[] = [];\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n result.push(...extract_binding_names(element.name));\n }\n\n return result;\n}\n","import { collect_yield_star_nodes } from \"$/preprocess/ast.ts\";\nimport { contains_top_level_yield_star } from \"$/detect.ts\";\nimport MagicString from \"magic-string\";\nimport ts from \"typescript\";\n\nimport {\n analyze_event_body_yield_star,\n strip_arrow_function,\n} from \"./expressions.ts\";\nimport type { MarkupCandidate, TagKind } from \"./types.ts\";\n\ninterface SanitizeResult {\n code: string;\n candidates: MarkupCandidate[];\n}\n\ninterface DeclarationYieldExpression {\n start: number;\n end: number;\n expr_text: string;\n}\n\nexport function sanitize_markup(\n content: string,\n filename: string,\n): SanitizeResult {\n const candidates: MarkupCandidate[] = [];\n const magic = new MagicString(content);\n let helper_index = 0;\n let cursor = 0;\n\n while (cursor < content.length) {\n const open = content.indexOf(\"{\", cursor);\n if (open === -1) break;\n\n /** Skip braces inside <script> and <style> blocks. */\n if (is_inside_excluded_block(content, open)) {\n cursor = open + 1;\n continue;\n }\n\n /** Find the matching closing brace. */\n const close = find_closing_brace(content, open + 1);\n if (close === -1) {\n cursor = open + 1;\n continue;\n }\n\n const inner = content.slice(open + 1, close);\n\n const trimmed = inner.trimStart();\n const leading_ws = inner.length - trimmed.length;\n\n const tag_info = get_tag_info(trimmed);\n\n const declaration_yields = collect_declaration_yield_expressions(\n content,\n open,\n leading_ws,\n trimmed,\n );\n\n if (declaration_yields.length > 0) {\n for (const declaration_yield of declaration_yields) {\n const placeholder = `__ser_markup_placeholder_${helper_index}`;\n helper_index += 1;\n\n candidates.push({\n placeholder,\n start: declaration_yield.start,\n end: declaration_yield.end,\n expr_text: declaration_yield.expr_text,\n filename,\n key: \"plain\",\n });\n\n magic.overwrite(\n declaration_yield.start,\n declaration_yield.end,\n placeholder,\n );\n }\n\n cursor = close + 1;\n continue;\n }\n\n let expr_body = trimmed.slice(tag_info.prefix_length);\n\n /** For @const, only use the RHS after `=` as the expression body. */\n const equal_idx = tag_info.kind === \"plain\" && trimmed.startsWith(\"@const \")\n ? expr_body.indexOf(\"=\")\n : -1;\n\n /** Check if this is a callback handler containing yield*. */\n const is_event_callback = is_event_callback_expression(inner);\n\n /** Determine if this brace contains yield* that needs lowering. */\n const event_yield = is_event_callback\n ? analyze_event_yield(inner)\n : undefined;\n const has_yield = event_yield?.has_top_level_yield_star ??\n contains_yield_star_in_text(expr_body);\n\n if (!has_yield) {\n cursor = close + 1;\n continue;\n }\n\n /** The expression starts after the tag prefix. For @const, after the `=`. */\n let extra_prefix = 0;\n\n if (equal_idx !== -1) {\n const after_eq_raw = expr_body.slice(equal_idx + 1);\n expr_body = after_eq_raw.trimStart();\n extra_prefix = equal_idx + 1 + (after_eq_raw.length - expr_body.length);\n }\n\n const expr_start = open + 1 + leading_ws + tag_info.prefix_length +\n extra_prefix;\n\n /** For each/await, the expression ends before ` as ` or ` then `/` catch `. */\n let expr_end = close;\n\n const key = tag_info.kind;\n\n if (key === \"each\") {\n const as_idx = expr_body.lastIndexOf(\" as \");\n if (as_idx !== -1) expr_end = expr_start + as_idx;\n }\n\n if (key === \"await\") {\n const then_idx = expr_body.indexOf(\" then \");\n const catch_idx = expr_body.indexOf(\" catch \");\n const boundary = Math.min(\n then_idx === -1 ? Infinity : then_idx,\n catch_idx === -1 ? Infinity : catch_idx,\n );\n if (boundary !== Infinity) expr_end = expr_start + boundary;\n }\n\n const expr_text = content.slice(expr_start, expr_end).trim();\n\n if (expr_text.length === 0) {\n cursor = close + 1;\n continue;\n }\n\n /** Create a placeholder and replace the expression (preserving tag prefixes). */\n const placeholder = `__ser_markup_placeholder_${helper_index}`;\n helper_index += 1;\n\n candidates.push({\n placeholder,\n start: expr_start,\n end: expr_end,\n expr_text,\n filename,\n key,\n });\n\n magic.overwrite(\n expr_start,\n expr_end,\n key === \"render\" ? `${placeholder}()` : placeholder,\n );\n\n cursor = close + 1;\n }\n\n return { code: magic.toString(), candidates };\n}\n\nfunction is_inside_excluded_block(content: string, pos: number): boolean {\n const script = find_tag_end(content, \"script\", pos);\n const style = find_tag_end(content, \"style\", pos);\n\n return (\n (script !== undefined && pos < script.end && pos > script.start) ||\n (style !== undefined && pos < style.end && pos > style.start)\n );\n}\n\nfunction find_tag_end(\n content: string,\n tag: string,\n after_pos: number,\n): { start: number; end: number } | undefined {\n const pattern = new RegExp(\n `<${tag}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/${tag}\\\\s*>`,\n \"gi\",\n );\n\n for (const match of content.matchAll(pattern)) {\n if (match.index === undefined) continue;\n const end_pos = match.index + match[0].length;\n if (match.index <= after_pos && after_pos < end_pos) {\n return { start: match.index, end: end_pos };\n }\n }\n\n return undefined;\n}\n\n/** Brace matching helpers for extracting complete markup expressions. */\n\nfunction find_closing_brace(content: string, start: number): number {\n let depth = 0;\n\n for (let i = start; i < content.length; i += 1) {\n const ch = content[i];\n\n if (ch === \"{\" && content[i - 1] !== \"$\") {\n depth += 1;\n } else if (ch === \"}\") {\n if (depth === 0) return i;\n depth -= 1;\n } else if (ch === \"'\" || ch === '\"' || ch === \"`\") {\n i = skip_string(content, i, ch);\n if (i === -1) return -1;\n } else if (ch === \"/\" && content[i + 1] === \"/\") {\n i = skip_line_comment(content, i);\n } else if (ch === \"/\" && content[i + 1] === \"*\") {\n i = skip_block_comment(content, i);\n if (i === -1) return -1;\n }\n }\n\n return -1;\n}\n\nfunction skip_string(content: string, start: number, quote: string): number {\n for (let i = start + 1; i < content.length; i += 1) {\n if (content[i] === \"\\\\\") {\n i += 1;\n continue;\n }\n if (content[i] === quote) return i;\n }\n return -1;\n}\n\nfunction skip_line_comment(content: string, start: number): number {\n for (let i = start + 2; i < content.length; i += 1) {\n if (content[i] === \"\\n\") return i;\n }\n return content.length;\n}\n\nfunction skip_block_comment(content: string, start: number): number {\n for (let i = start + 2; i < content.length; i += 1) {\n if (content[i] === \"*\" && content[i + 1] === \"/\") return i + 1;\n }\n return -1;\n}\n\ninterface TagInfo {\n kind: TagKind;\n prefix_length: number;\n}\n\nfunction get_tag_info(trimmed: string): TagInfo {\n if (trimmed.startsWith(\"#each \")) {\n return { kind: \"each\", prefix_length: \"#each \".length };\n }\n if (trimmed.startsWith(\"#await \")) {\n return { kind: \"await\", prefix_length: \"#await \".length };\n }\n if (trimmed.startsWith(\"@render \")) {\n return { kind: \"render\", prefix_length: \"@render \".length };\n }\n\n /** Strip prefix-only tags — the expression starts after the tag keyword. */\n if (trimmed.startsWith(\"#if \")) {\n return { kind: \"plain\", prefix_length: \"#if \".length };\n }\n if (trimmed.startsWith(\":else if \")) {\n return { kind: \"plain\", prefix_length: \":else if \".length };\n }\n if (trimmed.startsWith(\"#key \")) {\n return { kind: \"plain\", prefix_length: \"#key \".length };\n }\n if (trimmed.startsWith(\"@const \")) {\n return { kind: \"plain\", prefix_length: \"@const \".length };\n }\n if (trimmed.startsWith(\"@html \")) {\n return { kind: \"plain\", prefix_length: \"@html \".length };\n }\n if (trimmed.startsWith(\"@debug \")) {\n return { kind: \"plain\", prefix_length: \"@debug \".length };\n }\n\n return { kind: \"plain\", prefix_length: 0 };\n}\n\nfunction collect_declaration_yield_expressions(\n content: string,\n open: number,\n leading_ws: number,\n trimmed: string,\n): DeclarationYieldExpression[] {\n if (!is_declaration_tag_text(trimmed)) {\n return [];\n }\n\n const source_file = ts.createSourceFile(\n \"declaration-tag.ts\",\n `${trimmed};`,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n\n const stmt = source_file.statements[0];\n\n if (!stmt || !ts.isVariableStatement(stmt)) {\n return [];\n }\n\n const tag_start = open + 1 + leading_ws;\n\n return stmt.declarationList.declarations.flatMap((decl) => {\n const initializer = decl.initializer;\n\n if (!initializer || !contains_top_level_yield_star(initializer)) {\n return [];\n }\n\n const expressions: DeclarationYieldExpression[] = [];\n\n collect_yield_star_nodes(initializer, (yield_node) => {\n const start = tag_start + yield_node.getStart(source_file);\n const end = tag_start + yield_node.end;\n const expr_text = content.slice(start, end).trim();\n\n expressions.push({\n start,\n end,\n expr_text,\n });\n });\n\n return expressions;\n });\n}\n\nfunction is_declaration_tag_text(trimmed: string): boolean {\n return /^(?:const|let)\\s/.test(trimmed);\n}\n\nfunction is_event_callback_expression(inner: string): boolean {\n const trimmed = inner.trimStart();\n\n return /^(?:async\\s+)?(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>/.test(trimmed) ||\n /^(?:async\\s+)?function\\b/.test(trimmed);\n}\n\nfunction analyze_event_yield(\n inner: string,\n): {\n has_top_level_yield_star: boolean;\n} {\n const event = strip_arrow_function(inner);\n const analysis = analyze_event_body_yield_star(event.body);\n\n return {\n has_top_level_yield_star: analysis.has_top_level_yield_star ||\n analysis.has_nested_invalid_yield_star ||\n /\\byield\\s*\\*/.test(event.body),\n };\n}\n\nfunction contains_yield_star_in_text(text: string): boolean {\n if (!/\\byield\\s*\\*/.test(text)) return false;\n\n try {\n const sf = ts.createSourceFile(\n \"expr.ts\",\n `const x = ${text};`,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n const stmt = sf.statements[0];\n if (!ts.isVariableStatement(stmt)) return false;\n const decl = stmt.declarationList.declarations[0];\n if (!decl?.initializer) return false;\n return contains_top_level_yield_star(decl.initializer);\n } catch {\n return true;\n }\n}\n\n/** Free identifier collection helpers for generated closures. */\n","import { type AST, parse } from \"svelte/compiler\";\n\nimport MagicString from \"magic-string\";\n\nimport {\n blank_script_blocks,\n create_relocations,\n create_source_map,\n inject_helpers,\n} from \"./apply.ts\";\nimport { classify_candidates } from \"./classify.ts\";\nimport { emit_replacements } from \"./emit.ts\";\nimport { sanitize_markup } from \"./scan.ts\";\nimport type { MarkupTransformResult } from \"./types.ts\";\n\nexport type { MarkupRelocation, MarkupTransformResult } from \"./types.ts\";\n\n/**\n * Transforms Svelte markup containing `{yield* expr}` brace expressions\n * into calls to the markup runtime helpers (`value`, `promise`, `run`).\n *\n * Strategy: first find all brace expressions containing `yield*` via\n * character scanning, replace them with placeholder identifiers, then\n * parse the sanitized markup with Svelte's AST to determine the correct\n * context for each placeholder (plain expression, #each, #await, event\n * handler, etc.).\n *\n * @since 2.0.0\n * @param content - The raw `.svelte` file content.\n * @param filename - The source filename, used in error messages.\n * @returns The transformed markup and a flag indicating whether yield* was\n * found.\n */\nexport function transform_markup_effect(\n content: string,\n filename: string,\n): MarkupTransformResult {\n if (!/\\byield\\s*\\*/.test(content)) {\n return { code: content, has_yield: false };\n }\n\n /** Find all brace expressions containing yield* and replace with placeholders. */\n const work = sanitize_markup(content, filename);\n\n if (work.candidates.length === 0) {\n return { code: content, has_yield: false };\n }\n\n /** Parse the sanitized markup with Svelte's AST. Strip <script> blocks\n * first so TypeScript syntax (import type, etc.) doesn't break the parser. */\n const clean = blank_script_blocks(work.code);\n const ast = parse(clean, { filename, modern: true }) as AST.Root;\n\n /** Match placeholders to their AST context and build replacements. */\n const classified = classify_candidates(\n ast,\n work.candidates,\n );\n const replacements = emit_replacements(classified);\n const helpers = replacements.flatMap((replacement) =>\n replacement.helpers ?? []\n );\n\n const magic = new MagicString(content);\n\n replacements.sort((a, b) => b.start - a.start);\n\n for (const r of replacements) {\n magic.overwrite(r.start, r.end, r.text);\n }\n\n const helper_insertion = inject_helpers(magic, content, helpers);\n const relocations = create_relocations(replacements, helper_insertion);\n\n return {\n code: magic.toString(),\n has_yield: true,\n map: create_source_map(magic, filename),\n relocations,\n };\n}\n"],"mappings":"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"}
|