svelte-effect-runtime 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markup.js","names":[],"sources":["../../../modules/svelte-effect-runtime/internal/markup.ts"],"sourcesContent":["import MagicString, { type SourceMap } from \"magic-string\";\nimport { parse, type AST } from \"svelte/compiler\";\nimport ts from \"typescript\";\nimport type { EffectPreprocessOptions } from \"../preprocess.ts\";\n\nconst DEFAULT_RUNTIME_MODULE_ID = \"svelte-effect-runtime\";\nconst DEFAULT_EFFECT_MODULE_ID = \"effect\";\nconst DEFAULT_SVELTE_MODULE_ID = \"svelte\";\nconst MARKUP_HELPER_PREFIX = \"__svelteEffectRuntimeMarkup\";\n\ninterface TransformEffectMarkupOptions extends EffectPreprocessOptions {\n filename: string;\n}\n\ninterface TransformEffectMarkupResult {\n code: string;\n map: SourceMap;\n}\n\ninterface ExcludedRange {\n start: number;\n end: number;\n}\n\ninterface Replacement {\n start: number;\n end: number;\n text: string;\n}\n\ninterface MarkupCandidate {\n expressionText: string;\n placeholder: string;\n start: number;\n end: number;\n}\n\ninterface WrappedExpression {\n expression: ts.Expression;\n offset: number;\n sourceFile: ts.SourceFile;\n}\n\nexport function transformEffectMarkup(\n content: string,\n options: TransformEffectMarkupOptions,\n): TransformEffectMarkupResult {\n const sanitized = sanitizeEffectMarkup(\n content,\n options.filename,\n );\n\n if (sanitized.candidates.length === 0) {\n const identity = new MagicString(content);\n return {\n code: content,\n map: identity.generateMap({\n hires: true,\n includeContent: true,\n source: options.filename,\n }),\n };\n }\n\n const replacements = collectMarkupReplacements(\n create_parse_safe_markup_source(sanitized.code),\n sanitized.candidates,\n options.filename,\n );\n\n const magicString = new MagicString(content);\n\n for (const replacement of replacements) {\n magicString.overwrite(replacement.start, replacement.end, replacement.text);\n }\n\n injectMarkupHelpers(magicString, content, options);\n\n return {\n code: magicString.toString(),\n map: magicString.generateMap({\n hires: true,\n includeContent: true,\n source: options.filename,\n }),\n };\n}\n\nfunction create_parse_safe_markup_source(content: string): string {\n const excluded_ranges = findExcludedRanges(content);\n\n if (excluded_ranges.length === 0) {\n return content;\n }\n\n let result = \"\";\n let cursor = 0;\n\n for (const range of excluded_ranges) {\n result += content.slice(cursor, range.start);\n result += mask_excluded_text(content.slice(range.start, range.end));\n cursor = range.end;\n }\n\n result += content.slice(cursor);\n return result;\n}\n\nfunction mask_excluded_text(text: string): string {\n let result = \"\";\n\n for (const character of text) {\n result += character === \"\\n\" || character === \"\\r\" ? character : \" \";\n }\n\n return result;\n}\n\nfunction sanitizeEffectMarkup(\n content: string,\n filename: string,\n): { code: string; candidates: MarkupCandidate[] } {\n const excludedRanges = findExcludedRanges(content);\n const candidates: MarkupCandidate[] = [];\n const magicString = new MagicString(content);\n let helperIndex = 0;\n\n for (let index = 0; index < content.length; index += 1) {\n if (content[index] !== \"{\") {\n continue;\n }\n\n const range = findExcludedRangeAt(excludedRanges, index);\n\n if (range) {\n index = range.end - 1;\n continue;\n }\n\n const closingIndex = findClosingBrace(content, index + 1);\n\n if (closingIndex === -1) {\n continue;\n }\n\n const inner = content.slice(index + 1, closingIndex);\n const candidate = getCandidateForBraceTag(\n index,\n closingIndex,\n inner,\n filename,\n helperIndex,\n );\n\n if (candidate) {\n helperIndex += 1;\n candidates.push(candidate);\n magicString.overwrite(\n candidate.start,\n candidate.end,\n candidate.placeholder,\n );\n }\n\n index = closingIndex;\n }\n\n return {\n code: magicString.toString(),\n candidates,\n };\n}\n\nfunction collectMarkupReplacements(\n sanitizedContent: string,\n candidates: readonly MarkupCandidate[],\n filename: string,\n): Replacement[] {\n const ast = parse(sanitizedContent, {\n filename,\n modern: true,\n });\n const candidatesByPlaceholder = new Map(\n candidates.map((candidate) => [candidate.placeholder, candidate]),\n );\n const replacements: Replacement[] = [];\n const matchedPlaceholders = new Set<string>();\n\n visitFragment(ast.fragment, candidatesByPlaceholder, matchedPlaceholders, (\n candidate,\n kind,\n ) => {\n replacements.push(makeAstReplacement(candidate, kind, filename));\n });\n\n const unmatched = candidates.filter((candidate) =>\n !matchedPlaceholders.has(candidate.placeholder)\n );\n\n if (unmatched.length > 0) {\n throw new Error(\n `${filename}: failed to classify some markup Effect expressions.\\n` +\n unmatched.map((candidate) =>\n `Problematic expression:\\n${candidate.expressionText}`\n ).join(\"\\n\\n\"),\n );\n }\n\n return replacements.sort((left, right) => left.start - right.start);\n}\n\nfunction getCandidateForBraceTag(\n openBraceIndex: number,\n closeBraceIndex: number,\n inner: string,\n filename: string,\n helperIndex: number,\n): MarkupCandidate | undefined {\n const trimmed = inner.trimStart();\n const leadingWhitespaceLength = inner.length - trimmed.length;\n\n if (!containsYieldStarText(trimmed)) {\n return undefined;\n }\n\n if (trimmed.startsWith(\"@const \")) {\n const initializerRange = findConstInitializerRange(\n trimmed.slice(\"@const \".length),\n filename,\n );\n\n return initializerRange\n ? makeMarkupCandidate(\n openBraceIndex + 1 + leadingWhitespaceLength + \"@const \".length +\n initializerRange.start,\n openBraceIndex + 1 + leadingWhitespaceLength + \"@const \".length +\n initializerRange.end,\n trimmed.slice(\"@const \".length + initializerRange.start,\n \"@const \".length + initializerRange.end),\n helperIndex,\n )\n : undefined;\n }\n\n if (trimmed.startsWith(\"#if \")) {\n return makeMarkupCandidate(\n openBraceIndex + 1 + leadingWhitespaceLength + \"#if \".length,\n closeBraceIndex,\n trimmed.slice(\"#if \".length),\n helperIndex,\n );\n }\n\n if (trimmed.startsWith(\":else if \")) {\n return makeMarkupCandidate(\n openBraceIndex + 1 + leadingWhitespaceLength + \":else if \".length,\n closeBraceIndex,\n trimmed.slice(\":else if \".length),\n helperIndex,\n );\n }\n\n if (trimmed.startsWith(\"#each \")) {\n const eachHeader = trimmed.slice(\"#each \".length);\n const asIndex = findTopLevelKeyword(eachHeader, \" as \");\n\n if (asIndex === -1) {\n return undefined;\n }\n\n const listExpression = eachHeader.slice(0, asIndex);\n\n return makeMarkupCandidate(\n openBraceIndex + 1 + leadingWhitespaceLength + \"#each \".length,\n openBraceIndex + 1 + leadingWhitespaceLength + \"#each \".length +\n listExpression.length,\n listExpression,\n helperIndex,\n );\n }\n\n if (trimmed.startsWith(\"#await \")) {\n const awaitHeader = trimmed.slice(\"#await \".length);\n const boundary = findAwaitBoundary(awaitHeader);\n const expressionText = boundary === -1\n ? awaitHeader\n : awaitHeader.slice(0, boundary);\n\n return makeMarkupCandidate(\n openBraceIndex + 1 + leadingWhitespaceLength + \"#await \".length,\n openBraceIndex + 1 + leadingWhitespaceLength + \"#await \".length +\n expressionText.length,\n expressionText,\n helperIndex,\n );\n }\n\n if (trimmed.startsWith(\"@html \")) {\n return makeMarkupCandidate(\n openBraceIndex + 1 + leadingWhitespaceLength + \"@html \".length,\n closeBraceIndex,\n trimmed.slice(\"@html \".length),\n helperIndex,\n );\n }\n\n if (trimmed.startsWith(\"@render \")) {\n throw new Error(\n `${filename}: {@render ...} cannot depend on yield* in markup right now.\\nMove the Effect code into <script effect> or a helper function instead.\\n\\nProblematic tag:\\n{${inner}}`,\n );\n }\n\n if (trimmed.startsWith(\"@attach \")) {\n return makeMarkupCandidate(\n openBraceIndex + 1 + leadingWhitespaceLength + \"@attach \".length,\n closeBraceIndex,\n trimmed.slice(\"@attach \".length),\n helperIndex,\n );\n }\n\n if (trimmed.startsWith(\"#key \")) {\n return makeMarkupCandidate(\n openBraceIndex + 1 + leadingWhitespaceLength + \"#key \".length,\n closeBraceIndex,\n trimmed.slice(\"#key \".length),\n helperIndex,\n );\n }\n\n if (\n trimmed.startsWith(\"/\") || trimmed.startsWith(\":then\") ||\n trimmed.startsWith(\":catch\") || trimmed === \":else\"\n ) {\n return undefined;\n }\n\n if (trimmed.startsWith(\"...\")) {\n return makeMarkupCandidate(\n openBraceIndex + 1 + leadingWhitespaceLength + \"...\".length,\n closeBraceIndex,\n trimmed.slice(\"...\".length),\n helperIndex,\n );\n }\n\n return makeMarkupCandidate(\n openBraceIndex + 1,\n closeBraceIndex,\n inner,\n helperIndex,\n );\n}\n\nfunction makeMarkupCandidate(\n start: number,\n end: number,\n expressionText: string,\n helperIndex: number,\n): MarkupCandidate {\n const placeholder = `${MARKUP_HELPER_PREFIX}Placeholder${helperIndex}`;\n\n return {\n expressionText,\n placeholder,\n start,\n end,\n };\n}\n\nfunction makeAstReplacement(\n candidate: MarkupCandidate,\n kind: \"plain\" | \"each\" | \"await\" | \"event\",\n filename: string,\n): Replacement {\n if (kind === \"event\") {\n return {\n start: candidate.start,\n end: candidate.end,\n text: transformEventExpression(candidate.expressionText.trim(), filename),\n };\n }\n\n const helperId = `${MARKUP_HELPER_PREFIX}${candidate.placeholder}`;\n const deps = collectFreeIdentifiers(candidate.expressionText, filename);\n const depsText = deps.length === 0 ? \"[]\" : `[${deps.join(\", \")}]`;\n const trimmedExpression = candidate.expressionText.trim();\n\n const replacementText = kind === \"await\"\n ? `${MARKUP_HELPER_PREFIX}Promise(\"${helperId}\", ${depsText}, function* () { return (${trimmedExpression}); })`\n : `${MARKUP_HELPER_PREFIX}Value(\"${helperId}\", ${depsText}, function* () { return (${trimmedExpression}); }, ${\n kind === \"each\" ? \"[]\" : \"undefined\"\n })`;\n\n return {\n start: candidate.start,\n end: candidate.end,\n text: replacementText,\n };\n}\n\nfunction visitFragment(\n fragment: AST.Fragment,\n candidatesByPlaceholder: ReadonlyMap<string, MarkupCandidate>,\n matchedPlaceholders: Set<string>,\n onReplacement: (\n candidate: MarkupCandidate,\n kind: \"plain\" | \"each\" | \"await\" | \"event\",\n ) => void,\n): void {\n for (const node of fragment.nodes) {\n visitNode(node, candidatesByPlaceholder, matchedPlaceholders, onReplacement);\n }\n}\n\nfunction visitNode(\n node: AST.Fragment[\"nodes\"][number],\n candidatesByPlaceholder: ReadonlyMap<string, MarkupCandidate>,\n matchedPlaceholders: Set<string>,\n onReplacement: (\n candidate: MarkupCandidate,\n kind: \"plain\" | \"each\" | \"await\" | \"event\",\n ) => void,\n): void {\n switch (node.type) {\n case \"ExpressionTag\":\n case \"HtmlTag\":\n case \"AttachTag\":\n emitReplacementForExpression(\n node.expression,\n \"plain\",\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n return;\n\n case \"ConstTag\":\n emitReplacementForExpression(\n node.declaration.declarations[0]?.init,\n \"plain\",\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n return;\n\n case \"IfBlock\":\n emitReplacementForExpression(\n node.test,\n \"plain\",\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n visitFragment(\n node.consequent,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n if (node.alternate) {\n visitFragment(\n node.alternate,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n }\n return;\n\n case \"EachBlock\":\n emitReplacementForExpression(\n node.expression,\n \"each\",\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n visitFragment(\n node.body,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n if (node.fallback) {\n visitFragment(\n node.fallback,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n }\n return;\n\n case \"AwaitBlock\":\n emitReplacementForExpression(\n node.expression,\n \"await\",\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n if (node.pending) {\n visitFragment(\n node.pending,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n }\n if (node.then) {\n visitFragment(\n node.then,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n }\n if (node.catch) {\n visitFragment(\n node.catch,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n }\n return;\n\n case \"KeyBlock\":\n emitReplacementForExpression(\n node.expression,\n \"plain\",\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n visitFragment(\n node.fragment,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\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 for (const attribute of node.attributes) {\n visitAttribute(\n attribute,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n }\n visitFragment(\n node.fragment,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n return;\n\n default:\n return;\n }\n}\n\nfunction visitAttribute(\n attribute: AST.BaseElement[\"attributes\"][number],\n candidatesByPlaceholder: ReadonlyMap<string, MarkupCandidate>,\n matchedPlaceholders: Set<string>,\n onReplacement: (\n candidate: MarkupCandidate,\n kind: \"plain\" | \"each\" | \"await\" | \"event\",\n ) => void,\n): void {\n switch (attribute.type) {\n case \"Attribute\": {\n const kind = isEventAttribute(attribute.name) ? \"event\" : \"plain\";\n visitAttributeValue(\n attribute.value,\n kind,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n return;\n }\n\n case \"OnDirective\":\n emitReplacementForExpression(\n attribute.expression,\n \"event\",\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n return;\n\n case \"SpreadAttribute\":\n case \"AnimateDirective\":\n case \"BindDirective\":\n case \"ClassDirective\":\n case \"TransitionDirective\":\n case \"UseDirective\":\n emitReplacementForExpression(\n attribute.expression,\n \"plain\",\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n return;\n\n case \"StyleDirective\":\n visitAttributeValue(\n attribute.value,\n \"plain\",\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n return;\n\n case \"LetDirective\":\n emitReplacementForExpression(\n attribute.expression,\n \"plain\",\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n return;\n\n default:\n return;\n }\n}\n\nfunction visitAttributeValue(\n value:\n | true\n | AST.ExpressionTag\n | Array<AST.Text | AST.ExpressionTag>,\n kind: \"plain\" | \"each\" | \"await\" | \"event\",\n candidatesByPlaceholder: ReadonlyMap<string, MarkupCandidate>,\n matchedPlaceholders: Set<string>,\n onReplacement: (\n candidate: MarkupCandidate,\n kind: \"plain\" | \"each\" | \"await\" | \"event\",\n ) => void,\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 emitReplacementForExpression(\n part.expression,\n kind,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n }\n }\n return;\n }\n\n emitReplacementForExpression(\n value.expression,\n kind,\n candidatesByPlaceholder,\n matchedPlaceholders,\n onReplacement,\n );\n}\n\nfunction emitReplacementForExpression(\n expression: { type: string; name?: string } | null | undefined,\n kind: \"plain\" | \"each\" | \"await\" | \"event\",\n candidatesByPlaceholder: ReadonlyMap<string, MarkupCandidate>,\n matchedPlaceholders: Set<string>,\n onReplacement: (\n candidate: MarkupCandidate,\n kind: \"plain\" | \"each\" | \"await\" | \"event\",\n ) => void,\n): void {\n if (!expression || expression.type !== \"Identifier\" || !expression.name) {\n return;\n }\n\n const candidate = candidatesByPlaceholder.get(expression.name);\n\n if (!candidate || matchedPlaceholders.has(candidate.placeholder)) {\n return;\n }\n\n matchedPlaceholders.add(candidate.placeholder);\n onReplacement(candidate, kind);\n}\n\nfunction findConstInitializerRange(\n declarationText: string,\n filename: string,\n): { start: number; end: number } | undefined {\n const sourceFile = ts.createSourceFile(\n filename,\n `const ${declarationText};`,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n const statement = sourceFile.statements[0];\n\n if (!statement || !ts.isVariableStatement(statement)) {\n return undefined;\n }\n\n const declaration = statement.declarationList.declarations[0];\n\n if (!declaration?.initializer) {\n return undefined;\n }\n\n return {\n start: declaration.initializer.getStart(sourceFile) - \"const \".length,\n end: declaration.initializer.end - \"const \".length,\n };\n}\n\nfunction transformEventExpression(\n expressionText: string,\n filename: string,\n): string {\n const wrapped = parseWrappedExpression(expressionText, filename);\n const expression = unwrapParentheses(wrapped.expression);\n\n if (ts.isArrowFunction(expression)) {\n const signatureText = sliceWrappedNode(\n expressionText,\n wrapped,\n expression.getStart(wrapped.sourceFile),\n expression.equalsGreaterThanToken.end,\n );\n\n if (ts.isBlock(expression.body)) {\n return `${signatureText} ${\n makeInlineEventBlock(\n sliceWrappedNode(\n expressionText,\n wrapped,\n expression.body.getStart(wrapped.sourceFile) + 1,\n expression.body.end - 1,\n ),\n )\n }`;\n }\n\n return `${signatureText} ${\n makeInlineEventExpressionBody(\n sliceWrappedNode(\n expressionText,\n wrapped,\n expression.body.getStart(wrapped.sourceFile),\n expression.body.end,\n ),\n )\n }`;\n }\n\n if (ts.isFunctionExpression(expression)) {\n const signatureText = sliceWrappedNode(\n expressionText,\n wrapped,\n expression.getStart(wrapped.sourceFile),\n expression.body.getStart(wrapped.sourceFile),\n );\n const bodyText = sliceWrappedNode(\n expressionText,\n wrapped,\n expression.body.getStart(wrapped.sourceFile) + 1,\n expression.body.end - 1,\n );\n\n return `${signatureText}${makeInlineEventBlock(bodyText)}`;\n }\n\n return `() => ${makeInlineEventExpressionBody(expressionText)}`;\n}\n\nfunction makeInlineEventBlock(bodyText: string): string {\n const normalizedBody = bodyText.trim();\n\n if (normalizedBody.length === 0) {\n return `{ void ${MARKUP_HELPER_PREFIX}Run(function* () {}); }`;\n }\n\n return [\n \"{\",\n ` void ${MARKUP_HELPER_PREFIX}Run(function* () {`,\n indentBlock(normalizedBody, \" \"),\n \" });\",\n \"}\",\n ].join(\"\\n\");\n}\n\nfunction makeInlineEventExpressionBody(expressionText: string): string {\n return [\n \"{\",\n ` void ${MARKUP_HELPER_PREFIX}Run(function* () {`,\n ` return (${expressionText.trim()});`,\n \" });\",\n \"}\",\n ].join(\"\\n\");\n}\n\nfunction parseWrappedExpression(\n expressionText: string,\n filename: string,\n): WrappedExpression {\n const prefix = \"function* __svelteEffectRuntimeMarkupWrapper(){ return (\";\n const sourceFile = ts.createSourceFile(\n filename,\n `${prefix}${expressionText}); }`,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n const functionDeclaration = sourceFile.statements[0];\n\n if (\n !functionDeclaration || !ts.isFunctionDeclaration(functionDeclaration) ||\n !functionDeclaration.body\n ) {\n throw new Error(\n `${filename}: could not parse markup Effect expression:\\n${expressionText}`,\n );\n }\n\n const returnStatement = functionDeclaration.body.statements[0];\n\n if (\n !returnStatement || !ts.isReturnStatement(returnStatement) ||\n !returnStatement.expression\n ) {\n throw new Error(\n `${filename}: could not locate markup Effect expression:\\n${expressionText}`,\n );\n }\n\n return {\n expression: returnStatement.expression,\n offset: prefix.length,\n sourceFile,\n };\n}\n\nfunction unwrapParentheses(expression: ts.Expression): ts.Expression {\n let current = expression;\n\n while (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n }\n\n return current;\n}\n\nfunction sliceWrappedNode(\n expressionText: string,\n wrapped: WrappedExpression,\n start: number,\n end: number,\n): string {\n return expressionText.slice(start - wrapped.offset, end - wrapped.offset);\n}\n\nfunction collectFreeIdentifiers(\n expressionText: string,\n filename: string,\n): string[] {\n const wrapped = parseWrappedExpression(expressionText, filename);\n const identifiers: string[] = [];\n const seen = new Set<string>();\n const scopes: Array<Set<string>> = [new Set()];\n\n function isDeclaredLocally(identifier: string): boolean {\n return scopes.some((scope) => scope.has(identifier));\n }\n\n function visit(node: ts.Node): void {\n if (\n ts.isFunctionExpression(node) || ts.isArrowFunction(node) ||\n ts.isFunctionDeclaration(node)\n ) {\n if (!node.body) {\n return;\n }\n\n const nextScope = new Set<string>();\n\n if (node.name) {\n nextScope.add(node.name.text);\n }\n\n for (const parameter of node.parameters) {\n declareInto(nextScope, parameter.name);\n }\n\n scopes.unshift(nextScope);\n\n if (ts.isBlock(node.body)) {\n for (const statement of node.body.statements) {\n statement.forEachChild(visit);\n }\n } else {\n node.body.forEachChild(visit);\n }\n\n scopes.shift();\n return;\n }\n\n if (ts.isIdentifier(node)) {\n if (node.text === \"yield\" || node.text === \"undefined\") {\n return;\n }\n\n if (shouldSkipIdentifier(node)) {\n return;\n }\n\n if (!isDeclaredLocally(node.text) && !seen.has(node.text)) {\n seen.add(node.text);\n identifiers.push(node.text);\n }\n }\n\n if (ts.isVariableDeclaration(node)) {\n if (node.initializer) {\n node.initializer.forEachChild(visit);\n }\n return;\n }\n\n node.forEachChild(visit);\n }\n\n function declareInto(scope: Set<string>, name: ts.BindingName): void {\n if (ts.isIdentifier(name)) {\n scope.add(name.text);\n return;\n }\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n declareInto(scope, element.name);\n }\n }\n\n visit(unwrapParentheses(wrapped.expression));\n return identifiers;\n}\n\nfunction shouldSkipIdentifier(node: ts.Identifier): boolean {\n const parent = node.parent;\n\n return ts.isPropertyAccessExpression(parent) && parent.name === node ||\n ts.isPropertyAssignment(parent) && parent.name === node ||\n ts.isShorthandPropertyAssignment(parent) &&\n parent.objectAssignmentInitializer === node ||\n ts.isBindingElement(parent) && parent.propertyName === node ||\n ts.isImportSpecifier(parent) ||\n ts.isExportSpecifier(parent) ||\n ts.isLabeledStatement(parent) && parent.label === node;\n}\n\nfunction containsYieldStarText(text: string): boolean {\n return /\\byield\\s*\\*/.test(text);\n}\n\nfunction findExcludedRanges(content: string): ExcludedRange[] {\n const ranges: ExcludedRange[] = [];\n const patterns = [\n /<script\\b[\\s\\S]*?<\\/script\\s*>/gi,\n /<style\\b[\\s\\S]*?<\\/style\\s*>/gi,\n /<!--[\\s\\S]*?-->/g,\n ];\n\n for (const pattern of patterns) {\n for (const match of content.matchAll(pattern)) {\n if (match.index === undefined) {\n continue;\n }\n\n ranges.push({\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n }\n\n return ranges.sort((left, right) => left.start - right.start);\n}\n\nfunction findExcludedRangeAt(\n ranges: ExcludedRange[],\n index: number,\n): ExcludedRange | undefined {\n return ranges.find((range) => range.start <= index && index < range.end);\n}\n\nfunction findClosingBrace(content: string, start: number): number {\n let braceDepth = 0;\n let bracketDepth = 0;\n let parenDepth = 0;\n let quote: \"'\" | '\"' | \"`\" | undefined;\n let templateBraceDepth = 0;\n\n for (let index = start; index < content.length; index += 1) {\n const character = content[index];\n const nextCharacter = content[index + 1];\n\n if (quote === \"'\") {\n if (character === \"\\\\\" && nextCharacter) {\n index += 1;\n continue;\n }\n\n if (character === \"'\") {\n quote = undefined;\n }\n\n continue;\n }\n\n if (quote === '\"') {\n if (character === \"\\\\\" && nextCharacter) {\n index += 1;\n continue;\n }\n\n if (character === '\"') {\n quote = undefined;\n }\n\n continue;\n }\n\n if (quote === \"`\") {\n if (character === \"\\\\\" && nextCharacter) {\n index += 1;\n continue;\n }\n\n if (character === \"$\" && nextCharacter === \"{\") {\n templateBraceDepth += 1;\n braceDepth += 1;\n index += 1;\n continue;\n }\n\n if (character === \"}\" && templateBraceDepth > 0) {\n templateBraceDepth -= 1;\n braceDepth -= 1;\n continue;\n }\n\n if (character === \"`\" && templateBraceDepth === 0) {\n quote = undefined;\n }\n\n continue;\n }\n\n if (character === \"'\" || character === '\"' || character === \"`\") {\n quote = character;\n continue;\n }\n\n if (character === \"/\" && nextCharacter === \"/\") {\n index += 2;\n\n while (index < content.length && content[index] !== \"\\n\") {\n index += 1;\n }\n\n continue;\n }\n\n if (character === \"/\" && nextCharacter === \"*\") {\n index += 2;\n\n while (\n index < content.length &&\n !(content[index] === \"*\" && content[index + 1] === \"/\")\n ) {\n index += 1;\n }\n\n index += 1;\n continue;\n }\n\n if (character === \"(\") {\n parenDepth += 1;\n continue;\n }\n\n if (character === \")\") {\n parenDepth -= 1;\n continue;\n }\n\n if (character === \"[\") {\n bracketDepth += 1;\n continue;\n }\n\n if (character === \"]\") {\n bracketDepth -= 1;\n continue;\n }\n\n if (character === \"{\") {\n braceDepth += 1;\n continue;\n }\n\n if (character === \"}\") {\n if (braceDepth === 0 && parenDepth === 0 && bracketDepth === 0) {\n return index;\n }\n\n braceDepth -= 1;\n }\n }\n\n return -1;\n}\n\nfunction findTopLevelKeyword(text: string, keyword: string): number {\n let braceDepth = 0;\n let bracketDepth = 0;\n let parenDepth = 0;\n let quote: \"'\" | '\"' | \"`\" | undefined;\n\n for (let index = 0; index <= text.length - keyword.length; index += 1) {\n const character = text[index];\n const nextCharacter = text[index + 1];\n\n if (quote) {\n if (character === \"\\\\\" && nextCharacter) {\n index += 1;\n continue;\n }\n\n if (character === quote) {\n quote = undefined;\n }\n\n continue;\n }\n\n if (character === \"'\" || character === '\"' || character === \"`\") {\n quote = character;\n continue;\n }\n\n if (character === \"(\") {\n parenDepth += 1;\n continue;\n }\n\n if (character === \")\") {\n parenDepth -= 1;\n continue;\n }\n\n if (character === \"[\") {\n bracketDepth += 1;\n continue;\n }\n\n if (character === \"]\") {\n bracketDepth -= 1;\n continue;\n }\n\n if (character === \"{\") {\n braceDepth += 1;\n continue;\n }\n\n if (character === \"}\") {\n braceDepth -= 1;\n continue;\n }\n\n if (\n braceDepth === 0 && bracketDepth === 0 && parenDepth === 0 &&\n text.startsWith(keyword, index)\n ) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction findAwaitBoundary(text: string): number {\n const thenIndex = findTopLevelKeyword(text, \" then \");\n const catchIndex = findTopLevelKeyword(text, \" catch \");\n\n if (thenIndex === -1) {\n return catchIndex;\n }\n\n if (catchIndex === -1) {\n return thenIndex;\n }\n\n return Math.min(thenIndex, catchIndex);\n}\n\n\nfunction isEventAttribute(name: string): boolean {\n return name.startsWith(\"on:\") ||\n /^on[a-z]/.test(name);\n}\n\nfunction injectMarkupHelpers(\n magicString: MagicString,\n content: string,\n options: TransformEffectMarkupOptions,\n): void {\n const helperBlock = makeMarkupHelperBlock(options);\n const scriptTagMatch = findInstanceScriptTag(content);\n\n if (!scriptTagMatch) {\n magicString.prepend(`<script>\\n${helperBlock}\\n</script>\\n\\n`);\n return;\n }\n\n magicString.appendLeft(scriptTagMatch.end, `\\n${helperBlock}\\n`);\n}\n\nfunction findInstanceScriptTag(content: string): ExcludedRange | 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) {\n continue;\n }\n\n const attributes = match[1] ?? \"\";\n\n if (\n /\\bcontext\\s*=\\s*[\"']module[\"']/.test(attributes) ||\n /\\bmodule\\b/.test(attributes)\n ) {\n continue;\n }\n\n const openTag = match[0].indexOf(\">\") + 1;\n\n return {\n start: match.index + openTag,\n end: match.index + match[0].length - \"</script>\".length,\n };\n }\n\n return undefined;\n}\n\nfunction makeMarkupHelperBlock(\n options: TransformEffectMarkupOptions,\n): string {\n const runtimeModuleId = options.runtimeModuleId ?? DEFAULT_RUNTIME_MODULE_ID;\n const effectModuleId = options.effectModuleId ?? DEFAULT_EFFECT_MODULE_ID;\n const svelteModuleId = options.svelteModuleId ?? DEFAULT_SVELTE_MODULE_ID;\n\n return [\n `import { Effect as ${MARKUP_HELPER_PREFIX}Effect } from \"${effectModuleId}\";`,\n `import { onDestroy as ${MARKUP_HELPER_PREFIX}OnDestroy } from \"${svelteModuleId}\";`,\n `import { getEffectRuntimeOrThrow as ${MARKUP_HELPER_PREFIX}GetRuntime, registerHotDispose as ${MARKUP_HELPER_PREFIX}RegisterHotDispose, runComponentEffect as ${MARKUP_HELPER_PREFIX}RunComponentEffect, runInlineEffect as ${MARKUP_HELPER_PREFIX}RunInlineEffect } from \"${runtimeModuleId}\";`,\n \"\",\n `const ${MARKUP_HELPER_PREFIX}Values = Object.create(null);`,\n `const ${MARKUP_HELPER_PREFIX}Promises = Object.create(null);`,\n `const ${MARKUP_HELPER_PREFIX}Cleanups = new Map();`,\n `const ${MARKUP_HELPER_PREFIX}ObjectIds = new WeakMap();`,\n `const ${MARKUP_HELPER_PREFIX}PendingStarts = new Set();`,\n `const ${MARKUP_HELPER_PREFIX}Runtime = typeof window === \"undefined\" ? undefined : ${MARKUP_HELPER_PREFIX}GetRuntime();`,\n `let ${MARKUP_HELPER_PREFIX}Version = $state(0);`,\n `let ${MARKUP_HELPER_PREFIX}NextObjectId = 1;`,\n \"\",\n `function ${MARKUP_HELPER_PREFIX}Hash(value) {`,\n ` if (value === null) {`,\n ` return \"null\";`,\n \" }\",\n \"\",\n ` if (value === undefined) {`,\n ` return \"undefined\";`,\n \" }\",\n \"\",\n ` const type = typeof value;`,\n \"\",\n ` if (type === \"string\") {`,\n ` return \\`string:\\${value}\\`;`,\n \" }\",\n \"\",\n ` if (type === \"number\") {`,\n ` return \\`number:\\${Object.is(value, -0) ? \"-0\" : String(value)}\\`;`,\n \" }\",\n \"\",\n ` if (type === \"bigint\") {`,\n ` return \\`bigint:\\${value.toString()}\\`;`,\n \" }\",\n \"\",\n ` if (type === \"boolean\") {`,\n ` return value ? \"boolean:true\" : \"boolean:false\";`,\n \" }\",\n \"\",\n ` if (type === \"symbol\") {`,\n ` return \\`symbol:\\${String(value)}\\`;`,\n \" }\",\n \"\",\n ` let objectId = ${MARKUP_HELPER_PREFIX}ObjectIds.get(value);`,\n \"\",\n ` if (objectId === undefined) {`,\n ` objectId = ${MARKUP_HELPER_PREFIX}NextObjectId;`,\n ` ${MARKUP_HELPER_PREFIX}NextObjectId += 1;`,\n ` ${MARKUP_HELPER_PREFIX}ObjectIds.set(value, objectId);`,\n \" }\",\n \"\",\n ` return \\`object:\\${objectId}\\`;`,\n \"}\",\n \"\",\n `function ${MARKUP_HELPER_PREFIX}DepsKey(deps) {`,\n ` return deps.map(${MARKUP_HELPER_PREFIX}Hash).join(\"|\");`,\n \"}\",\n \"\",\n `function ${MARKUP_HELPER_PREFIX}Value(id, deps, factory, fallback) {`,\n ` if (typeof window === \"undefined\") {`,\n ` return fallback;`,\n \" }\",\n \"\",\n ` ${MARKUP_HELPER_PREFIX}Version;`,\n \"\",\n ` const cacheKey = \\`\\${id}::\\${${MARKUP_HELPER_PREFIX}DepsKey(deps)}\\`;`,\n \"\",\n ` if (!${MARKUP_HELPER_PREFIX}Cleanups.has(cacheKey)) {`,\n ` if (!${MARKUP_HELPER_PREFIX}PendingStarts.has(cacheKey)) {`,\n ` ${MARKUP_HELPER_PREFIX}PendingStarts.add(cacheKey);`,\n ` queueMicrotask(() => {`,\n ` ${MARKUP_HELPER_PREFIX}PendingStarts.delete(cacheKey);`,\n \"\",\n ` if (${MARKUP_HELPER_PREFIX}Cleanups.has(cacheKey)) {`,\n \" return;\",\n \" }\",\n \"\",\n ` ${MARKUP_HELPER_PREFIX}Cleanups.set(`,\n \" cacheKey,\",\n ` ${MARKUP_HELPER_PREFIX}RunComponentEffect(`,\n ` ${MARKUP_HELPER_PREFIX}Runtime,`,\n ` ${MARKUP_HELPER_PREFIX}Effect.gen(function* () {`,\n ` ${MARKUP_HELPER_PREFIX}Values[cacheKey] = yield* ${MARKUP_HELPER_PREFIX}Effect.gen(factory);`,\n ` ${MARKUP_HELPER_PREFIX}Version += 1;`,\n \" }),\",\n \" ),\",\n \" );\",\n \" });\",\n \" }\",\n \" }\",\n \"\",\n ` return Object.prototype.hasOwnProperty.call(${MARKUP_HELPER_PREFIX}Values, cacheKey)`,\n ` ? ${MARKUP_HELPER_PREFIX}Values[cacheKey]`,\n \" : fallback;\",\n \"}\",\n \"\",\n `function ${MARKUP_HELPER_PREFIX}Promise(id, deps, factory) {`,\n ` if (typeof window === \"undefined\") {`,\n ` return Promise.resolve(undefined);`,\n \" }\",\n \"\",\n ` const cacheKey = \\`\\${id}::\\${${MARKUP_HELPER_PREFIX}DepsKey(deps)}\\`;`,\n \"\",\n ` if (!Object.prototype.hasOwnProperty.call(${MARKUP_HELPER_PREFIX}Promises, cacheKey)) {`,\n ` ${MARKUP_HELPER_PREFIX}Promises[cacheKey] = new Promise((resolve, reject) => {`,\n ` queueMicrotask(() => {`,\n ` ${MARKUP_HELPER_PREFIX}RunInlineEffect(`,\n ` ${MARKUP_HELPER_PREFIX}Runtime,`,\n ` ${MARKUP_HELPER_PREFIX}Effect.gen(factory),`,\n ` ).then(resolve, reject);`,\n \" });\",\n ` }).catch((error) => {`,\n ` delete ${MARKUP_HELPER_PREFIX}Promises[cacheKey];`,\n \" throw error;\",\n \" });\",\n \" }\",\n \"\",\n ` return ${MARKUP_HELPER_PREFIX}Promises[cacheKey];`,\n \"}\",\n \"\",\n `function ${MARKUP_HELPER_PREFIX}Run(factory) {`,\n ` if (typeof window === \"undefined\") {`,\n \" return Promise.resolve(undefined);\",\n \" }\",\n \"\",\n ` return ${MARKUP_HELPER_PREFIX}RunInlineEffect(`,\n ` ${MARKUP_HELPER_PREFIX}Runtime,`,\n ` ${MARKUP_HELPER_PREFIX}Effect.gen(factory),`,\n \" );\",\n \"}\",\n \"\",\n `function ${MARKUP_HELPER_PREFIX}CleanupAll() {`,\n ` for (const cleanup of ${MARKUP_HELPER_PREFIX}Cleanups.values()) {`,\n \" cleanup();\",\n \" }\",\n \"\",\n ` ${MARKUP_HELPER_PREFIX}Cleanups.clear();`,\n \"}\",\n \"\",\n `${MARKUP_HELPER_PREFIX}OnDestroy(${MARKUP_HELPER_PREFIX}CleanupAll);`,\n `${MARKUP_HELPER_PREFIX}RegisterHotDispose(import.meta, ${MARKUP_HELPER_PREFIX}CleanupAll);`,\n ].join(\"\\n\");\n}\n\nfunction indentBlock(text: string, indent: string): string {\n return text.split(\"\\n\").map((line) =>\n line.length > 0 ? `${indent}${line}` : line\n ).join(\"\\n\");\n}\n"],"mappings":"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D;AAEH;EAEF,KAAK;AACH,gCACE,KAAK,YACL,QACA,yBACA,qBACA,cACD;AACD,iBACE,KAAK,MACL,yBACA,qBACA,cACD;AACD,OAAI,KAAK,SACP,eACE,KAAK,UACL,yBACA,qBACA,cACD;AAEH;EAEF,KAAK;AACH,gCACE,KAAK,YACL,SACA,yBACA,qBACA,cACD;AACD,OAAI,KAAK,QACP,eACE,KAAK,SACL,yBACA,qBACA,cACD;AAEH,OAAI,KAAK,KACP,eACE,KAAK,MACL,yBACA,qBACA,cACD;AAEH,OAAI,KAAK,MACP,eACE,KAAK,OACL,yBACA,qBACA,cACD;AAEH;EAEF,KAAK;AACH,gCACE,KAAK,YACL,SACA,yBACA,qBACA,cACD;AACD,iBACE,KAAK,UACL,yBACA,qBACA,cACD;AACD;EAEF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;AACH,QAAK,MAAM,aAAa,KAAK,WAC3B,gBACE,WACA,yBACA,qBACA,cACD;AAEH,iBACE,KAAK,UACL,yBACA,qBACA,cACD;AACD;EAEF,QACE;;;AAIN,SAAS,eACP,WACA,yBACA,qBACA,eAIM;AACN,SAAQ,UAAU,MAAlB;EACE,KAAK,aAAa;GAChB,MAAM,OAAO,iBAAiB,UAAU,KAAK,GAAG,UAAU;AAC1D,uBACE,UAAU,OACV,MACA,yBACA,qBACA,cACD;AACD;;EAGF,KAAK;AACH,gCACE,UAAU,YACV,SACA,yBACA,qBACA,cACD;AACD;EAEF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;AACH,gCACE,UAAU,YACV,SACA,yBACA,qBACA,cACD;AACD;EAEF,KAAK;AACH,uBACE,UAAU,OACV,SACA,yBACA,qBACA,cACD;AACD;EAEF,KAAK;AACH,gCACE,UAAU,YACV,SACA,yBACA,qBACA,cACD;AACD;EAEF,QACE;;;AAIN,SAAS,oBACP,OAIA,MACA,yBACA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"}
@@ -0,0 +1,36 @@
1
+ type AnyCallable = (...args: Array<unknown>) => unknown;
2
+ type Decode_remote_payload = <ErrorType = unknown>(encoded: string) => ErrorType;
3
+ interface Remote_request_dependencies {
4
+ readonly app?: {
5
+ readonly decoders?: Record<string, unknown>;
6
+ readonly hooks?: {
7
+ readonly transport?: Record<string, unknown>;
8
+ };
9
+ };
10
+ readonly app_dir: string;
11
+ readonly apply_refreshes?: (value: string) => void;
12
+ readonly base: string;
13
+ readonly get_remote_request_headers: () => HeadersInit;
14
+ readonly remote_request: (url: string, headers: HeadersInit) => Promise<string>;
15
+ readonly stringify_remote_arg: (value: unknown, transport: unknown, sort?: boolean) => string;
16
+ }
17
+ type Query_adapter_mode = "query" | "query_batch" | "prerender";
18
+ type Form_request_dependencies = Remote_request_dependencies & {
19
+ readonly app: {
20
+ readonly decoders?: Record<string, unknown>;
21
+ readonly encoders?: Record<string, unknown>;
22
+ };
23
+ readonly app_dir: string;
24
+ readonly apply_refreshes: (value: string) => void;
25
+ readonly base: string;
26
+ readonly binary_form_content_type: string;
27
+ readonly goto: (url: string, options?: unknown, code?: number) => void;
28
+ readonly invalidate_all: () => Promise<void> | void;
29
+ readonly serialize_binary_form: (data: unknown, meta: Record<string, unknown>) => {
30
+ readonly blob: Blob;
31
+ };
32
+ };
33
+ export declare function create_remote_query_adapter(native_query_factory: (id: string) => AnyCallable, decode_payload: Decode_remote_payload, dependencies?: Remote_request_dependencies, mode?: Query_adapter_mode): (id: string) => AnyCallable;
34
+ export declare function create_remote_command_adapter(native_command_factory: (id: string) => AnyCallable, decode_payload: Decode_remote_payload, dependencies?: Remote_request_dependencies): (id: string) => AnyCallable;
35
+ export declare function create_remote_form_adapter(native_form_factory: (id: string) => Record<string, unknown>, decode_payload: Decode_remote_payload, dependencies: Form_request_dependencies): (id: string) => Record<string, unknown>;
36
+ export {};
@@ -0,0 +1,454 @@
1
+ import { REMOTE_ERROR_DECODER, create_remote_domain_error, create_remote_http_error, create_remote_transport_error, create_remote_validation_error, is_remote_validation_issue, is_serialized_remote_failure_envelope } from "./remote-shared.js";
2
+ import { create_remote_effect_from_promise } from "../client.js";
3
+ import * as Effect from "effect/Effect";
4
+ import { tick } from "svelte";
5
+ //#region internal/remote-client.ts
6
+ function log_remote_client_step(step, details) {
7
+ console.log("[svelte-effect-runtime][remote-client]", step, details ?? {});
8
+ }
9
+ function define_hidden_property(value, key, property) {
10
+ Object.defineProperty(value, key, {
11
+ value: property,
12
+ enumerable: false
13
+ });
14
+ return value;
15
+ }
16
+ function define_remote_error_decoder(value, decode_payload) {
17
+ return define_hidden_property(value, REMOTE_ERROR_DECODER, decode_payload);
18
+ }
19
+ function is_http_error_like(value) {
20
+ return Boolean(value && typeof value === "object" && typeof value.status === "number");
21
+ }
22
+ function is_redirect_like(value) {
23
+ return Boolean(value && typeof value === "object" && typeof value.location === "string" && typeof value.status === "number");
24
+ }
25
+ function get_error_status(value) {
26
+ return is_http_error_like(value) ? value.status ?? 500 : 500;
27
+ }
28
+ function decode_remote_error(error, decode_payload) {
29
+ log_remote_client_step("decode_remote_error:start", { error });
30
+ if (is_http_error_like(error)) {
31
+ const body = error.body;
32
+ if (is_serialized_remote_failure_envelope(body)) try {
33
+ return create_remote_domain_error(decode_payload(body.encoded), get_error_status(error));
34
+ } catch (cause) {
35
+ return create_remote_transport_error(cause, body);
36
+ }
37
+ if (get_error_status(error) === 400) return create_remote_validation_error([], {
38
+ body,
39
+ status: 400
40
+ });
41
+ return create_remote_http_error(error, {
42
+ body,
43
+ status: get_error_status(error)
44
+ });
45
+ }
46
+ const decoded = create_remote_http_error(error);
47
+ log_remote_client_step("decode_remote_error:http_error", { decoded });
48
+ return decoded;
49
+ }
50
+ function create_effect_call(create_promise, decode_payload) {
51
+ return create_remote_effect_from_promise(() => {
52
+ log_remote_client_step("create_effect_call:start");
53
+ return create_promise();
54
+ }, (error) => decode_remote_error(error, decode_payload));
55
+ }
56
+ function create_decoded_native_callable(native, decode_payload) {
57
+ const wrapped = ((...args) => {
58
+ const result = native(...args);
59
+ if (result && (typeof result === "object" || typeof result === "function")) define_remote_error_decoder(result, decode_payload);
60
+ return result;
61
+ });
62
+ define_hidden_property(wrapped, "native", native);
63
+ define_remote_error_decoder(wrapped, decode_payload);
64
+ return wrapped;
65
+ }
66
+ function get_transport(dependencies) {
67
+ return dependencies?.app?.hooks?.transport ?? {};
68
+ }
69
+ function stringify_remote_payload(arg, dependencies, sort = true) {
70
+ if (arg === void 0) return "";
71
+ return dependencies.stringify_remote_arg(arg, get_transport(dependencies), sort);
72
+ }
73
+ async function execute_query_request(id, arg, decode_payload, dependencies) {
74
+ const payload = stringify_remote_payload(arg, dependencies);
75
+ const url = `${dependencies.base}/${dependencies.app_dir}/remote/${id}${payload ? `?payload=${payload}` : ""}`;
76
+ return decode_payload(await dependencies.remote_request(url, dependencies.get_remote_request_headers()));
77
+ }
78
+ async function execute_query_batch_request(id, arg, decode_payload, dependencies) {
79
+ const payload = stringify_remote_payload(arg, dependencies);
80
+ const response = await fetch(`${dependencies.base}/${dependencies.app_dir}/remote/${id}`, {
81
+ method: "POST",
82
+ body: JSON.stringify({ payloads: [payload] }),
83
+ headers: {
84
+ "Content-Type": "application/json",
85
+ ...dependencies.get_remote_request_headers()
86
+ }
87
+ });
88
+ if (!response.ok) throw new Error("Failed to execute batch query");
89
+ const result = await response.json();
90
+ if (result.type === "error") throw {
91
+ body: result.error,
92
+ status: result.status ?? 500
93
+ };
94
+ if (result.type === "redirect") throw {
95
+ location: result.location,
96
+ status: 307
97
+ };
98
+ const first = decode_payload(result.result ?? "")[0];
99
+ if (!first) throw new Error("Batch query returned no entries.");
100
+ if (first.type === "error") throw {
101
+ body: first.error,
102
+ status: first.status ?? 500
103
+ };
104
+ return first.data;
105
+ }
106
+ async function execute_prerender_request(id, arg, decode_payload, dependencies) {
107
+ const payload = stringify_remote_payload(arg, dependencies);
108
+ const url = `${dependencies.base}/${dependencies.app_dir}/remote/${id}${payload ? `/${payload}` : ""}`;
109
+ return decode_payload(await dependencies.remote_request(url, dependencies.get_remote_request_headers()));
110
+ }
111
+ function create_query_request(mode, id, arg, decode_payload, dependencies, native_with_decoder) {
112
+ if (!dependencies || !native_with_decoder) return Promise.resolve(native_with_decoder?.(arg));
113
+ switch (mode) {
114
+ case "query": return execute_query_request(id, arg, decode_payload, dependencies);
115
+ case "query_batch": return execute_query_batch_request(id, arg, decode_payload, dependencies);
116
+ case "prerender": return execute_prerender_request(id, arg, decode_payload, dependencies);
117
+ }
118
+ }
119
+ async function execute_command_request(id, arg, decode_payload, dependencies) {
120
+ const response = await fetch(`${dependencies.base}/${dependencies.app_dir}/remote/${id}`, {
121
+ method: "POST",
122
+ body: JSON.stringify({
123
+ payload: stringify_remote_payload(arg, dependencies, false),
124
+ refreshes: []
125
+ }),
126
+ headers: {
127
+ "Content-Type": "application/json",
128
+ ...dependencies.get_remote_request_headers()
129
+ }
130
+ });
131
+ if (!response.ok) throw new Error("Failed to execute remote command");
132
+ const result = await response.json();
133
+ if (result.type === "error") throw {
134
+ body: result.error,
135
+ status: result.status ?? 500
136
+ };
137
+ if (result.type === "redirect") throw new Error("Redirects are not allowed in commands. Return a result instead and use goto on the client.");
138
+ if (result.refreshes) dependencies.apply_refreshes?.(result.refreshes);
139
+ return decode_payload(result.result ?? "");
140
+ }
141
+ function create_remote_query_adapter(native_query_factory, decode_payload, dependencies, mode = "query") {
142
+ return (id) => {
143
+ const native_with_decoder = create_decoded_native_callable(native_query_factory(id), decode_payload);
144
+ const wrapped = ((arg) => create_effect_call(() => create_query_request(mode, id, arg, decode_payload, dependencies, native_with_decoder), decode_payload));
145
+ define_hidden_property(wrapped, "native", native_with_decoder);
146
+ return wrapped;
147
+ };
148
+ }
149
+ function create_remote_command_adapter(native_command_factory, decode_payload, dependencies) {
150
+ return (id) => {
151
+ const native = native_command_factory(id);
152
+ const native_with_decoder = create_decoded_native_callable(native, decode_payload);
153
+ let local_pending = 0;
154
+ const wrapped = ((arg) => create_effect_call(async () => {
155
+ local_pending += 1;
156
+ try {
157
+ if (!dependencies) return await Promise.resolve(native_with_decoder(arg));
158
+ return await execute_command_request(id, arg, decode_payload, dependencies);
159
+ } finally {
160
+ local_pending -= 1;
161
+ }
162
+ }, decode_payload));
163
+ define_hidden_property(wrapped, "native", native_with_decoder);
164
+ Object.defineProperty(wrapped, "pending", { get: () => (native.pending ?? 0) + local_pending });
165
+ return wrapped;
166
+ };
167
+ }
168
+ function normalize_form_issues(issues) {
169
+ if (!Array.isArray(issues)) return [];
170
+ return issues.flatMap((issue) => is_remote_validation_issue(issue) ? [{
171
+ message: issue.message,
172
+ path: [...issue.path]
173
+ }] : []);
174
+ }
175
+ function get_root_form_issues(native) {
176
+ return normalize_form_issues(native.fields?.allIssues);
177
+ }
178
+ function get_attachment(value) {
179
+ for (const symbol of Object.getOwnPropertySymbols(value)) {
180
+ const candidate = value[symbol];
181
+ if (typeof candidate === "function") return candidate;
182
+ }
183
+ throw new Error("Failed to find the Svelte attachment for the remote form enhancement.");
184
+ }
185
+ function build_form_field_name(path) {
186
+ let name = "";
187
+ for (const segment of path) {
188
+ if (typeof segment === "number") {
189
+ name += `[${segment}]`;
190
+ continue;
191
+ }
192
+ name += name === "" ? segment : `.${segment}`;
193
+ }
194
+ return name;
195
+ }
196
+ function append_hidden_input(form, name, value) {
197
+ const input = document.createElement("input");
198
+ input.type = "hidden";
199
+ input.name = name;
200
+ input.value = value;
201
+ form.append(input);
202
+ }
203
+ function append_file_input(form, name, value) {
204
+ const input = document.createElement("input");
205
+ input.type = "file";
206
+ input.name = name;
207
+ if (typeof DataTransfer === "function") {
208
+ const transfer = new DataTransfer();
209
+ transfer.items.add(value);
210
+ try {
211
+ input.files = transfer.files;
212
+ } catch {}
213
+ }
214
+ if (input.files?.length) {
215
+ form.append(input);
216
+ return;
217
+ }
218
+ append_hidden_input(form, name, value.name);
219
+ }
220
+ function append_form_value(form, value, path) {
221
+ if (value === void 0) return;
222
+ if (value instanceof File) {
223
+ append_file_input(form, build_form_field_name(path), value);
224
+ return;
225
+ }
226
+ if (Array.isArray(value)) {
227
+ value.forEach((entry, index) => {
228
+ append_form_value(form, entry, [...path, index]);
229
+ });
230
+ return;
231
+ }
232
+ if (value && typeof value === "object") {
233
+ for (const [key, entry] of Object.entries(value)) append_form_value(form, entry, [...path, key]);
234
+ return;
235
+ }
236
+ const base_name = build_form_field_name(path);
237
+ if (typeof value === "number") {
238
+ append_hidden_input(form, `n:${base_name}`, String(value));
239
+ return;
240
+ }
241
+ if (typeof value === "boolean") {
242
+ append_hidden_input(form, `b:${base_name}`, value ? "on" : "");
243
+ return;
244
+ }
245
+ append_hidden_input(form, base_name, value === null ? "" : String(value));
246
+ }
247
+ function apply_input_to_fields(fields, input) {
248
+ if (!fields || typeof fields !== "object") return;
249
+ const maybe_field = fields;
250
+ if (typeof maybe_field.set === "function") {
251
+ maybe_field.set(input);
252
+ return;
253
+ }
254
+ if (!input || typeof input !== "object") return;
255
+ for (const [key, value] of Object.entries(input)) apply_input_to_fields(fields[key], value);
256
+ }
257
+ function is_submitter_like(value) {
258
+ return Boolean(value && typeof value === "object" && typeof value.click === "function");
259
+ }
260
+ function get_submitter(form) {
261
+ const submitter = form.querySelector("button:not([type]), [type='submit']");
262
+ return is_submitter_like(submitter) ? submitter : void 0;
263
+ }
264
+ function request_form_submit(form) {
265
+ const submitter = get_submitter(form);
266
+ log_remote_client_step("request_form_submit", {
267
+ action: form.action,
268
+ has_submitter: Boolean(submitter),
269
+ submitter
270
+ });
271
+ if (typeof SubmitEvent === "function") {
272
+ form.dispatchEvent(new SubmitEvent("submit", {
273
+ bubbles: true,
274
+ cancelable: true,
275
+ submitter
276
+ }));
277
+ return;
278
+ }
279
+ const event = new Event("submit", {
280
+ bubbles: true,
281
+ cancelable: true
282
+ });
283
+ Object.defineProperty(event, "submitter", {
284
+ configurable: true,
285
+ value: submitter
286
+ });
287
+ form.dispatchEvent(event);
288
+ }
289
+ async function wait_for_pending_settle(native) {
290
+ await tick();
291
+ while ((native.pending ?? 0) > 0) await new Promise((resolve) => setTimeout(resolve, 0));
292
+ await tick();
293
+ }
294
+ async function submit_attached_form(form, element, input) {
295
+ log_remote_client_step("submit_attached_form:start", {
296
+ action: element.action,
297
+ input
298
+ });
299
+ if (input !== void 0) apply_input_to_fields(form.native.fields, input);
300
+ await tick();
301
+ request_form_submit(element);
302
+ await wait_for_pending_settle(form.native);
303
+ const issues = get_root_form_issues(form.native);
304
+ log_remote_client_step("submit_attached_form:after_submit", {
305
+ issues,
306
+ pending: form.native.pending ?? 0,
307
+ result: form.native.result
308
+ });
309
+ if (issues.length > 0) return Effect.fail(create_remote_validation_error(issues, {
310
+ body: issues,
311
+ status: 400
312
+ }));
313
+ return Effect.succeed(form.native.result);
314
+ }
315
+ function create_form_submit_effect(form, input, decode_payload, attached_form_tracker, _dependencies) {
316
+ return Effect.async((resume) => {
317
+ log_remote_client_step("create_form_submit_effect:start", {
318
+ action: form.native.action,
319
+ input,
320
+ attached: Boolean(attached_form_tracker.current)
321
+ });
322
+ if (typeof document === "undefined") {
323
+ resume(Effect.fail(create_remote_http_error(/* @__PURE__ */ new Error("Programmatic remote form submission requires a DOM."))));
324
+ return;
325
+ }
326
+ let settled = false;
327
+ let dispose_attachment;
328
+ const temp_form = document.createElement("form");
329
+ temp_form.method = "POST";
330
+ temp_form.action = form.native.action;
331
+ temp_form.hidden = true;
332
+ document.body.append(temp_form);
333
+ const cleanup = () => {
334
+ if (typeof dispose_attachment === "function") dispose_attachment();
335
+ temp_form.remove();
336
+ };
337
+ const finish = (effect) => {
338
+ if (settled) return;
339
+ settled = true;
340
+ cleanup();
341
+ resume(effect);
342
+ };
343
+ try {
344
+ const attached_form = attached_form_tracker.current;
345
+ if (attached_form) {
346
+ log_remote_client_step("create_form_submit_effect:attached_form_branch", { action: attached_form.action });
347
+ submit_attached_form(form, attached_form, input).then(finish, (error) => {
348
+ finish(Effect.fail(decode_remote_error(error, decode_payload)));
349
+ });
350
+ return;
351
+ }
352
+ log_remote_client_step("create_form_submit_effect:detached_fallback_branch", { action: form.native.action });
353
+ dispose_attachment = get_attachment(form.native.enhance(async ({ submit }) => {
354
+ try {
355
+ log_remote_client_step("create_form_submit_effect:fallback_submit:start", { action: form.native.action });
356
+ await submit();
357
+ const issues = get_root_form_issues(form.native);
358
+ log_remote_client_step("create_form_submit_effect:fallback_submit:after", {
359
+ issues,
360
+ result: form.native.result
361
+ });
362
+ if (issues.length > 0) {
363
+ finish(Effect.fail(create_remote_validation_error(issues, {
364
+ body: issues,
365
+ status: 400
366
+ })));
367
+ return;
368
+ }
369
+ finish(Effect.succeed(form.native.result));
370
+ } catch (error) {
371
+ if (is_redirect_like(error)) {
372
+ finish(Effect.die(error));
373
+ return;
374
+ }
375
+ finish(Effect.fail(decode_remote_error(error, decode_payload)));
376
+ }
377
+ }))(temp_form);
378
+ if (input && typeof input === "object") append_form_value(temp_form, input, []);
379
+ const submitter = document.createElement("button");
380
+ submitter.type = "submit";
381
+ temp_form.append(submitter);
382
+ if (typeof temp_form.requestSubmit === "function") temp_form.requestSubmit(submitter);
383
+ else submitter.click();
384
+ } catch (error) {
385
+ log_remote_client_step("create_form_submit_effect:error", { error });
386
+ finish(Effect.fail(decode_remote_error(error, decode_payload)));
387
+ }
388
+ });
389
+ }
390
+ function wrap_native_form(native, decode_payload, dependencies) {
391
+ const attached_form_tracker = { current: null };
392
+ const wrapped_symbol_properties = /* @__PURE__ */ new Map();
393
+ return new Proxy({}, {
394
+ get(_target, property, receiver) {
395
+ if (property === "native") return native;
396
+ if (property === "submit") return (input) => create_form_submit_effect(receiver, input, decode_payload, attached_form_tracker, dependencies);
397
+ if (typeof property === "symbol") {
398
+ if (wrapped_symbol_properties.has(property)) return wrapped_symbol_properties.get(property);
399
+ const native_value = Reflect.get(native, property, native);
400
+ if (typeof native_value === "function") {
401
+ const wrapped_attachment = (element) => {
402
+ log_remote_client_step("wrap_native_form:attach", {
403
+ action: element.action,
404
+ native_action: native.action
405
+ });
406
+ attached_form_tracker.current = element;
407
+ const cleanup = native_value.call(native, element);
408
+ return () => {
409
+ log_remote_client_step("wrap_native_form:detach", { action: element.action });
410
+ if (attached_form_tracker.current === element) attached_form_tracker.current = null;
411
+ if (typeof cleanup === "function") cleanup();
412
+ };
413
+ };
414
+ wrapped_symbol_properties.set(property, wrapped_attachment);
415
+ return wrapped_attachment;
416
+ }
417
+ }
418
+ if (property === "for") {
419
+ const native_for = Reflect.get(native, property, native);
420
+ if (typeof native_for === "function") return (key) => wrap_native_form(native_for.call(native, key), decode_payload, dependencies);
421
+ }
422
+ return Reflect.get(native, property, native);
423
+ },
424
+ has(_target, property) {
425
+ if (property === "native" || property === "submit" || property === "for") return true;
426
+ return Reflect.has(native, property);
427
+ },
428
+ ownKeys() {
429
+ return Reflect.ownKeys(native);
430
+ },
431
+ getOwnPropertyDescriptor(_target, property) {
432
+ if (property === "native" || property === "submit" || property === "for") return {
433
+ configurable: true,
434
+ enumerable: false,
435
+ writable: false
436
+ };
437
+ const descriptor = Reflect.getOwnPropertyDescriptor(native, property);
438
+ if (!descriptor) return descriptor;
439
+ return {
440
+ ...descriptor,
441
+ configurable: true
442
+ };
443
+ }
444
+ });
445
+ }
446
+ function create_remote_form_adapter(native_form_factory, decode_payload, dependencies) {
447
+ return (id) => {
448
+ return wrap_native_form(native_form_factory(id), decode_payload, dependencies);
449
+ };
450
+ }
451
+ //#endregion
452
+ export { create_remote_command_adapter, create_remote_form_adapter, create_remote_query_adapter };
453
+
454
+ //# sourceMappingURL=remote-client.js.map