@abide/abide 0.57.1 → 0.100.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/CHANGELOG.md +3 -1773
- package/bin/abide.ts +788 -204
- package/package.json +30 -152
- package/scaffold/src/server/app.ts +6 -0
- package/scaffold/src/shared/.gitkeep +0 -0
- package/scaffold/src/ui/app.html +8 -0
- package/scaffold/src/ui/pages/page.abide +13 -0
- package/src/compiler/CHARACTER_REFERENCES.ts +2242 -0
- package/src/compiler/CheckerAnswer.ts +62 -0
- package/src/compiler/Cursor.ts +367 -0
- package/src/compiler/Finding.ts +2 -0
- package/src/compiler/Lowering.ts +648 -0
- package/src/compiler/PositionTable.ts +125 -0
- package/src/compiler/REACTIVE_MEMBERS.ts +36 -0
- package/src/compiler/SHARED_NAMES.ts +45 -0
- package/src/compiler/SPECIFIERS.ts +16 -0
- package/src/compiler/ShadowMap.ts +144 -0
- package/src/compiler/TemplateNode.ts +176 -0
- package/src/compiler/TypeSession.ts +1079 -0
- package/src/compiler/VOID_ELEMENTS.ts +22 -0
- package/src/compiler/aliasedSymbol.ts +15 -0
- package/src/compiler/ambientReadsIn.ts +152 -0
- package/src/compiler/argsDefaultsIn.ts +173 -0
- package/src/compiler/argsSchemaOf.ts +230 -0
- package/src/compiler/checkApp.ts +117 -0
- package/src/compiler/checkedShadow.ts +182 -0
- package/src/compiler/classifyRead.ts +577 -0
- package/src/compiler/classifyTemplate.ts +501 -0
- package/src/compiler/compileApp.ts +559 -0
- package/src/compiler/compiledEntry.ts +141 -0
- package/src/compiler/componentGraph.ts +139 -0
- package/src/compiler/declaredExports.ts +645 -0
- package/src/compiler/decodeCharacterReferences.ts +111 -0
- package/src/compiler/emitClient.ts +1343 -0
- package/src/compiler/emitComponent.ts +162 -0
- package/src/compiler/emitSource.ts +91 -0
- package/src/compiler/formatDiagnosis.ts +19 -0
- package/src/compiler/handlersUnder.ts +109 -0
- package/src/compiler/index.ts +15 -0
- package/src/compiler/invocationProps.ts +67 -0
- package/src/compiler/isNamedAlone.ts +9 -0
- package/src/compiler/lineOf.ts +38 -0
- package/src/compiler/parseAbide.ts +1341 -0
- package/src/compiler/projectShadow.ts +643 -0
- package/src/compiler/reactiveOptions.ts +82 -0
- package/src/compiler/reactiveTypes.ts +222 -0
- package/src/compiler/readSources.ts +100 -0
- package/src/compiler/readsIn.ts +1023 -0
- package/src/compiler/renderMarkup.ts +781 -0
- package/src/compiler/scaffold.ts +105 -0
- package/src/compiler/scopeStyles.ts +309 -0
- package/src/compiler/serveLanguage.ts +405 -0
- package/src/compiler/shareScope.ts +51 -0
- package/src/compiler/sharedModuleWrites.ts +88 -0
- package/src/compiler/splitImports.ts +387 -0
- package/src/compiler/templateWarnings.ts +128 -0
- package/src/compiler/tokenize.ts +317 -0
- package/src/compiler/trackingWarnings.ts +279 -0
- package/src/compiler/writeDefaultProject.ts +42 -0
- package/src/server/BRIDGE_VERSION.ts +3 -0
- package/src/server/CLIENT_BUILD.ts +56 -0
- package/src/server/DEFAULT_PORT.ts +6 -0
- package/src/server/DOCUMENT_HEADERS.ts +11 -0
- package/src/server/Inbox.ts +36 -0
- package/src/server/LogPanel.ts +239 -0
- package/src/server/MCP_PROTOCOL_VERSION.ts +3 -0
- package/src/server/SETTLE_MILLISECONDS.ts +7 -0
- package/src/server/VIRTUAL_DIRECTORY.ts +6 -0
- package/src/server/answerFailure.ts +91 -0
- package/src/server/answerRequest.ts +560 -0
- package/src/server/answerRpc.ts +537 -0
- package/src/server/answerSocket.ts +537 -0
- package/src/server/answerValue.ts +375 -0
- package/src/server/appDirectories.ts +9 -0
- package/src/server/appKit.ts +204 -0
- package/src/server/appPlugins.ts +26 -0
- package/src/server/argsFor.ts +40 -0
- package/src/server/assistant.ts +163 -0
- package/src/server/banner.ts +43 -0
- package/src/server/bridgeRelay.ts +249 -0
- package/src/server/buildDirectory.ts +10 -0
- package/src/server/callerOf.ts +60 -0
- package/src/server/claudeApi.ts +224 -0
- package/src/server/claudeCode.ts +187 -0
- package/src/server/clientBuildOptions.ts +49 -0
- package/src/server/coerceArgs.ts +110 -0
- package/src/server/commands.ts +442 -0
- package/src/server/componentImports.ts +56 -0
- package/src/server/componentModules.d.ts +9 -0
- package/src/server/compressAnswer.ts +66 -0
- package/src/server/config.ts +192 -0
- package/src/server/configFields.ts +92 -0
- package/src/server/createApp.ts +428 -0
- package/src/server/crossingOrigin.ts +49 -0
- package/src/server/csp.ts +77 -0
- package/src/server/devWorker.ts +613 -0
- package/src/server/faultPolicy.ts +59 -0
- package/src/server/fenceServer.ts +48 -0
- package/src/server/generatedSurfaces.ts +430 -0
- package/src/server/hooks.ts +190 -0
- package/src/server/index.ts +87 -0
- package/src/server/installServer.ts +47 -0
- package/src/server/launcherOptions.ts +62 -0
- package/src/server/launcherPage.ts +156 -0
- package/src/server/manifestOf.ts +114 -0
- package/src/server/muxUpgrade.ts +72 -0
- package/src/server/namesUnder.ts +15 -0
- package/src/server/nativeMenu.ts +296 -0
- package/src/server/negotiateEncoding.ts +39 -0
- package/src/server/plainAnswer.ts +19 -0
- package/src/server/prefers.ts +25 -0
- package/src/server/principal.ts +261 -0
- package/src/server/qualitiesOf.ts +22 -0
- package/src/server/randomToken.ts +9 -0
- package/src/server/reachable.ts +31 -0
- package/src/server/refuseAddressCollision.ts +30 -0
- package/src/server/remote.ts +242 -0
- package/src/server/render.ts +464 -0
- package/src/server/renderComponent.ts +33 -0
- package/src/server/reportHealth.ts +46 -0
- package/src/server/requestScope.ts +435 -0
- package/src/server/responseHelpers.ts +75 -0
- package/src/server/runCompiled.ts +44 -0
- package/src/server/runDesktop.ts +572 -0
- package/src/server/seedBuffer.ts +293 -0
- package/src/server/serveBuild.ts +198 -0
- package/src/server/serveDev.ts +499 -0
- package/src/server/shell.ts +506 -0
- package/src/server/surfaceOf.ts +47 -0
- package/src/server/testBuild.ts +237 -0
- package/src/server/trace.ts +151 -0
- package/src/server/versionOf.ts +109 -0
- package/src/server/withoutTrailingSlash.ts +4 -0
- package/src/shared/ADDRESSES.ts +69 -0
- package/src/shared/ANCHORS.ts +54 -0
- package/src/shared/Attributes.ts +339 -0
- package/src/shared/BOOLEAN_ATTRIBUTES.ts +41 -0
- package/src/shared/CHILDREN.ts +11 -0
- package/src/shared/CURRENT_ROUTER.ts +25 -0
- package/src/shared/CopyOptions.ts +19 -0
- package/src/shared/DEBUG_META.ts +6 -0
- package/src/shared/EARLY_CALLS.ts +8 -0
- package/src/shared/FAILURE_STATUS_TEXT.ts +48 -0
- package/src/shared/Failed.ts +146 -0
- package/src/shared/GLOBAL_GETS.ts +7 -0
- package/src/shared/Issues.ts +49 -0
- package/src/shared/JsonValue.ts +18 -0
- package/src/shared/LOAD_SIGNAL.ts +10 -0
- package/src/shared/MOUNT_META.ts +6 -0
- package/src/shared/Middleware.ts +34 -0
- package/src/shared/NAVIGATION_HEADER.ts +7 -0
- package/src/shared/PRINCIPAL_HEADER.ts +6 -0
- package/src/shared/RPC_SERVER.ts +67 -0
- package/src/shared/Raw.ts +90 -0
- package/src/shared/Schema.ts +229 -0
- package/src/shared/UNEXPECTED.ts +11 -0
- package/src/shared/URL_ATTRIBUTES.ts +19 -0
- package/src/shared/VERSION_HEADER.ts +6 -0
- package/src/shared/WORK.ts +37 -0
- package/src/shared/anchorMarkup.ts +15 -0
- package/src/shared/answerOf.ts +141 -0
- package/src/shared/applyPatch.ts +173 -0
- package/src/shared/armAnchor.ts +17 -0
- package/src/shared/attributeText.ts +50 -0
- package/src/shared/boundValue.ts +58 -0
- package/src/shared/cookies.ts +271 -0
- package/src/shared/csp.ts +55 -0
- package/src/shared/decodedOrKept.ts +14 -0
- package/src/shared/escapeText.ts +103 -0
- package/src/shared/framing.ts +131 -0
- package/src/shared/headKeyOf.ts +34 -0
- package/src/shared/health.ts +51 -0
- package/src/shared/index.ts +117 -0
- package/src/shared/isEventName.ts +10 -0
- package/src/shared/isRecord.ts +4 -0
- package/src/shared/issuesOf.ts +18 -0
- package/src/shared/jsonSchema.ts +50 -0
- package/src/shared/listOf.ts +20 -0
- package/src/shared/log.ts +284 -0
- package/src/shared/matchRoute.ts +99 -0
- package/src/shared/menuItem.ts +80 -0
- package/src/shared/mount.ts +45 -0
- package/src/shared/muxFrames.ts +35 -0
- package/src/shared/navigate.ts +26 -0
- package/src/shared/note.ts +24 -0
- package/src/shared/numberFromText.ts +10 -0
- package/src/shared/online.ts +19 -0
- package/src/shared/paint.ts +4 -0
- package/src/shared/principal.ts +145 -0
- package/src/shared/principalRotated.ts +47 -0
- package/src/shared/propCell.ts +99 -0
- package/src/shared/props.ts +24 -0
- package/src/shared/putOwn.ts +24 -0
- package/src/shared/queryText.ts +18 -0
- package/src/shared/reactive/CELL.ts +8 -0
- package/src/shared/reactive/Cursor.ts +223 -0
- package/src/shared/reactive/ENTRY_LIVES.ts +7 -0
- package/src/shared/reactive/Expiry.ts +103 -0
- package/src/shared/reactive/FOLLOWED.ts +8 -0
- package/src/shared/reactive/KEYED_BRAND.ts +8 -0
- package/src/shared/reactive/Keyed.ts +423 -0
- package/src/shared/reactive/MUTATION.ts +5 -0
- package/src/shared/reactive/NO_INITIAL.ts +6 -0
- package/src/shared/reactive/NotLanded.ts +21 -0
- package/src/shared/reactive/PATCHES.ts +11 -0
- package/src/shared/reactive/PATCH_SINKS.ts +26 -0
- package/src/shared/reactive/REACTIVE_BRAND.ts +9 -0
- package/src/shared/reactive/RESHAPING.ts +13 -0
- package/src/shared/reactive/Reactive.ts +4480 -0
- package/src/shared/reactive/SELECTION_MEMBERS.ts +12 -0
- package/src/shared/reactive/STREAMING.ts +5 -0
- package/src/shared/reactive/argsContract.ts +97 -0
- package/src/shared/reactive/byOf.ts +18 -0
- package/src/shared/reactive/callLoad.ts +200 -0
- package/src/shared/reactive/canonicalKey.ts +95 -0
- package/src/shared/reactive/chunksOfStream.ts +51 -0
- package/src/shared/reactive/index.ts +542 -0
- package/src/shared/reactive/isReactive.ts +19 -0
- package/src/shared/reactive/isThenable.ts +14 -0
- package/src/shared/reactive/matchesPattern.ts +16 -0
- package/src/shared/reactive/pairReactive.ts +41 -0
- package/src/shared/reactive/parameterDefaults.ts +356 -0
- package/src/shared/reactive/recordWrites.ts +472 -0
- package/src/shared/reactive/scoped.ts +157 -0
- package/src/shared/reactive/scoping.ts +64 -0
- package/src/shared/reactive/share.ts +91 -0
- package/src/shared/reactive/structural.ts +62 -0
- package/src/shared/reactive/tracking.ts +418 -0
- package/src/shared/reactive/watch.ts +310 -0
- package/src/shared/refuse.ts +224 -0
- package/src/shared/route.ts +29 -0
- package/src/shared/routePattern.ts +146 -0
- package/src/shared/rpc.ts +496 -0
- package/src/shared/rpcRequest.ts +73 -0
- package/src/shared/safeUrl.ts +68 -0
- package/src/shared/seededDocument.ts +36 -0
- package/src/shared/setUpLevels.ts +53 -0
- package/src/shared/slotValue.ts +34 -0
- package/src/shared/spread.ts +79 -0
- package/src/shared/takeEarlyCall.ts +86 -0
- package/src/shared/url.ts +140 -0
- package/src/shared/validateJson.ts +578 -0
- package/src/shared/versionInEtag.ts +14 -0
- package/src/shared/writePath.ts +95 -0
- package/src/ui/ArmRegion.ts +185 -0
- package/src/ui/LAYER_NAMES.ts +30 -0
- package/src/ui/List.ts +273 -0
- package/src/ui/Mismatch.ts +32 -0
- package/src/ui/RawRun.ts +99 -0
- package/src/ui/Router.ts +698 -0
- package/src/ui/Scope.ts +115 -0
- package/src/ui/TryRegion.ts +278 -0
- package/src/ui/adoptWalk.ts +126 -0
- package/src/ui/applyHead.ts +146 -0
- package/src/ui/bindElement.ts +44 -0
- package/src/ui/bindProperty.ts +79 -0
- package/src/ui/bindSpread.ts +44 -0
- package/src/ui/escapeless.ts +14 -0
- package/src/ui/index.ts +64 -0
- package/src/ui/leave.ts +35 -0
- package/src/ui/listenForRoutes.ts +92 -0
- package/src/ui/measureLayer.ts +34 -0
- package/src/ui/menuBridge.ts +19 -0
- package/src/ui/moveNode.ts +34 -0
- package/src/ui/parseMarkup.ts +35 -0
- package/src/ui/reconcile.ts +368 -0
- package/src/ui/regions.ts +137 -0
- package/src/ui/reportMenu.ts +57 -0
- package/src/ui/routing.ts +18 -0
- package/src/ui/rowKeyOf.ts +19 -0
- package/src/ui/rows.ts +99 -0
- package/src/ui/setAttribute.ts +37 -0
- package/src/ui/setClass.ts +27 -0
- package/src/ui/setMarkup.ts +20 -0
- package/src/ui/setStyleProperty.ts +30 -0
- package/src/ui/setText.ts +28 -0
- package/src/ui/socketWire.ts +258 -0
- package/src/ui/wire.ts +141 -0
- package/AGENTS.md +0 -446
- package/README.md +0 -249
- package/src/abideLsp.ts +0 -251
- package/src/abideModules.d.ts +0 -8
- package/src/abideResolverPlugin.ts +0 -1101
- package/src/appEntry.ts +0 -161
- package/src/assets/app.html +0 -12
- package/src/build.ts +0 -189
- package/src/buildCli.ts +0 -125
- package/src/buildDisconnected.ts +0 -117
- package/src/bundleApp.ts +0 -146
- package/src/bundleDisconnectedEntry.ts +0 -14
- package/src/checkAbide.ts +0 -145
- package/src/cliEntry.ts +0 -25
- package/src/clientBuildPlugins.ts +0 -33
- package/src/clientEntry.ts +0 -17
- package/src/compile.ts +0 -61
- package/src/controlServerWorker.ts +0 -433
- package/src/devEntry.ts +0 -381
- package/src/discoveryEntry.ts +0 -82
- package/src/initAgent.ts +0 -50
- package/src/lib/bundle/BundleMenu.ts +0 -12
- package/src/lib/bundle/BundleMenuItem.ts +0 -25
- package/src/lib/bundle/BundleWindow.ts +0 -37
- package/src/lib/bundle/WEBVIEW_BUILD_REVISION.ts +0 -9
- package/src/lib/bundle/WEBVIEW_VERSION.ts +0 -7
- package/src/lib/bundle/bindConnectedFlag.ts +0 -29
- package/src/lib/bundle/bindRequestNavigate.ts +0 -34
- package/src/lib/bundle/buildWebviewLib.ts +0 -111
- package/src/lib/bundle/bundled.ts +0 -35
- package/src/lib/bundle/disconnected.abide +0 -265
- package/src/lib/bundle/disconnected.css +0 -9
- package/src/lib/bundle/ensureWebviewLib.ts +0 -20
- package/src/lib/bundle/exitWithParent.ts +0 -30
- package/src/lib/bundle/infoPlist.ts +0 -52
- package/src/lib/bundle/installDownloads.ts +0 -34
- package/src/lib/bundle/installMacMenu.ts +0 -49
- package/src/lib/bundle/listenLocalControlServer.ts +0 -19
- package/src/lib/bundle/native/abideMenu.mm +0 -422
- package/src/lib/bundle/native/webview.h +0 -4557
- package/src/lib/bundle/onMenu.ts +0 -42
- package/src/lib/bundle/openWebview.ts +0 -104
- package/src/lib/bundle/pngToIcns.ts +0 -47
- package/src/lib/bundle/probeAbideServer.ts +0 -57
- package/src/lib/bundle/resolveServerBinary.ts +0 -12
- package/src/lib/bundle/resolveWebviewLib.ts +0 -53
- package/src/lib/bundle/serverBinaryFilename.ts +0 -8
- package/src/lib/bundle/signMacApp.ts +0 -37
- package/src/lib/bundle/spawnEmbeddedServer.ts +0 -73
- package/src/lib/bundle/stableLocalPort.ts +0 -19
- package/src/lib/bundle/waitForServer.ts +0 -28
- package/src/lib/bundle/webviewCachePath.ts +0 -23
- package/src/lib/bundle/webviewLibName.ts +0 -11
- package/src/lib/cli/completeCli.ts +0 -38
- package/src/lib/cli/connectToServer.ts +0 -23
- package/src/lib/cli/createClient.ts +0 -108
- package/src/lib/cli/dispatchCommand.ts +0 -72
- package/src/lib/cli/loadEnvFromBinaryDir.ts +0 -15
- package/src/lib/cli/parseArgvForRpc.ts +0 -131
- package/src/lib/cli/printCommandHelp.ts +0 -43
- package/src/lib/cli/printSessionHelp.ts +0 -28
- package/src/lib/cli/printSessionStatus.ts +0 -21
- package/src/lib/cli/printTopLevelHelp.ts +0 -83
- package/src/lib/cli/printTrimmed.ts +0 -8
- package/src/lib/cli/printValue.ts +0 -10
- package/src/lib/cli/renderCliCompletions.ts +0 -56
- package/src/lib/cli/resolveCliTarget.ts +0 -47
- package/src/lib/cli/runCli.ts +0 -188
- package/src/lib/cli/runSession.ts +0 -107
- package/src/lib/cli/startLocalInstance.ts +0 -14
- package/src/lib/cli/tokenizeArgvFlags.ts +0 -86
- package/src/lib/cli/tokenizeLine.ts +0 -51
- package/src/lib/cli/types/CliManifest.ts +0 -11
- package/src/lib/cli/types/CliManifestEntry.ts +0 -17
- package/src/lib/cli/types/CliTarget.ts +0 -13
- package/src/lib/mcp/annotationsForMethod.ts +0 -29
- package/src/lib/mcp/buildPrompts.ts +0 -25
- package/src/lib/mcp/createMcpResourceServer.ts +0 -113
- package/src/lib/mcp/createMcpServer.ts +0 -56
- package/src/lib/mcp/dispatchMcpRequest.ts +0 -159
- package/src/lib/mcp/mcpResourceServerSlot.ts +0 -13
- package/src/lib/mcp/mcpSurface.ts +0 -57
- package/src/lib/mcp/mcpTools.ts +0 -196
- package/src/lib/mcp/renderPrompt.ts +0 -25
- package/src/lib/mcp/toolResultFromResponse.ts +0 -100
- package/src/lib/mcp/types/JsonRpcRequest.ts +0 -12
- package/src/lib/mcp/types/JsonRpcResponse.ts +0 -20
- package/src/lib/mcp/types/McpResourceContents.ts +0 -10
- package/src/lib/mcp/types/McpResourceDescriptor.ts +0 -6
- package/src/lib/mcp/types/McpResourceServer.ts +0 -12
- package/src/lib/mcp/types/McpServer.ts +0 -9
- package/src/lib/mcp/types/McpServerOptions.ts +0 -16
- package/src/lib/mcp/types/McpSurface.ts +0 -15
- package/src/lib/mcp/types/PromptDescriptor.ts +0 -5
- package/src/lib/mcp/types/PromptMessage.ts +0 -2
- package/src/lib/mcp/types/ToolDescriptor.ts +0 -7
- package/src/lib/mcp/types/ToolResult.ts +0 -2
- package/src/lib/server/AppModule.ts +0 -47
- package/src/lib/server/DELETE.ts +0 -10
- package/src/lib/server/GET.ts +0 -10
- package/src/lib/server/HEAD.ts +0 -10
- package/src/lib/server/PATCH.ts +0 -10
- package/src/lib/server/POST.ts +0 -10
- package/src/lib/server/PUT.ts +0 -10
- package/src/lib/server/agent.ts +0 -86
- package/src/lib/server/appDataDir.ts +0 -16
- package/src/lib/server/cli/buildEnvContent.ts +0 -19
- package/src/lib/server/cli/createTarGz.ts +0 -77
- package/src/lib/server/cli/handleCliDownload.ts +0 -152
- package/src/lib/server/cli/handleCliInstall.ts +0 -37
- package/src/lib/server/cli/installScript.ts +0 -31
- package/src/lib/server/cli/maxSourceMtime.ts +0 -26
- package/src/lib/server/cookies.ts +0 -30
- package/src/lib/server/env.ts +0 -51
- package/src/lib/server/error.ts +0 -110
- package/src/lib/server/json.ts +0 -57
- package/src/lib/server/jsonl.ts +0 -47
- package/src/lib/server/prompts/definePrompt.ts +0 -21
- package/src/lib/server/prompts/promptRegistry.ts +0 -9
- package/src/lib/server/prompts/registerPrompt.ts +0 -6
- package/src/lib/server/prompts/renderPromptTemplate.ts +0 -17
- package/src/lib/server/prompts/types/Prompt.ts +0 -14
- package/src/lib/server/prompts/types/PromptOptions.ts +0 -12
- package/src/lib/server/prompts/types/PromptRegistryEntry.ts +0 -13
- package/src/lib/server/prompts/types/PromptRoutes.ts +0 -10
- package/src/lib/server/redirect.ts +0 -43
- package/src/lib/server/render.ts +0 -70
- package/src/lib/server/request.ts +0 -19
- package/src/lib/server/rpc/defineRpc.ts +0 -271
- package/src/lib/server/rpc/dispatchRpcInProcess.ts +0 -46
- package/src/lib/server/rpc/findRpcByCommandName.ts +0 -18
- package/src/lib/server/rpc/parseArgs.ts +0 -244
- package/src/lib/server/rpc/readBodyWithinLimit.ts +0 -47
- package/src/lib/server/rpc/registerRpc.ts +0 -6
- package/src/lib/server/rpc/resolveRpcJsonSchema.ts +0 -28
- package/src/lib/server/rpc/rpcRegistry.ts +0 -11
- package/src/lib/server/rpc/runWithRpcTimeout.ts +0 -58
- package/src/lib/server/rpc/types/RemoteHandler.ts +0 -31
- package/src/lib/server/rpc/types/RemoteRoutes.ts +0 -13
- package/src/lib/server/rpc/types/RpcHelper.ts +0 -185
- package/src/lib/server/rpc/types/RpcRegistryEntry.ts +0 -50
- package/src/lib/server/rpc/types/TypedError.ts +0 -18
- package/src/lib/server/rpc/types/TypedResponse.ts +0 -18
- package/src/lib/server/rpc/unprocessed.ts +0 -13
- package/src/lib/server/rpc/validationError.ts +0 -17
- package/src/lib/server/runtime/DEFAULT_PORT.ts +0 -6
- package/src/lib/server/runtime/DEV_READY_MESSAGE.ts +0 -6
- package/src/lib/server/runtime/DEV_REBUILD_MESSAGE.ts +0 -4
- package/src/lib/server/runtime/DEV_RELOAD_CLIENT_SCRIPT.ts +0 -92
- package/src/lib/server/runtime/SSR_SWAP_SCRIPT.ts +0 -19
- package/src/lib/server/runtime/STATUS_TEXT.ts +0 -22
- package/src/lib/server/runtime/STREAMED_HTML_HEADER.ts +0 -13
- package/src/lib/server/runtime/acceptsGzip.ts +0 -33
- package/src/lib/server/runtime/amendBroadcaster.ts +0 -53
- package/src/lib/server/runtime/buildCacheSnapshot.ts +0 -63
- package/src/lib/server/runtime/buildHealthPayload.ts +0 -34
- package/src/lib/server/runtime/buildInFlightSnapshot.ts +0 -35
- package/src/lib/server/runtime/buildInspectorSurface.ts +0 -47
- package/src/lib/server/runtime/buildOpenApiSpec.ts +0 -150
- package/src/lib/server/runtime/buildPreloadManifest.ts +0 -153
- package/src/lib/server/runtime/cacheControlForAsset.ts +0 -22
- package/src/lib/server/runtime/cacheStalenessBroadcaster.ts +0 -33
- package/src/lib/server/runtime/containsTraversal.ts +0 -41
- package/src/lib/server/runtime/createAppAssetServer.ts +0 -100
- package/src/lib/server/runtime/createAppRouteResolver.ts +0 -145
- package/src/lib/server/runtime/createAssetHeaderCache.ts +0 -31
- package/src/lib/server/runtime/createPlumbingRouter.ts +0 -212
- package/src/lib/server/runtime/createPublicAssetServer.ts +0 -76
- package/src/lib/server/runtime/createRouteDispatcher.ts +0 -121
- package/src/lib/server/runtime/createServer.ts +0 -605
- package/src/lib/server/runtime/createUiPageRenderer.ts +0 -489
- package/src/lib/server/runtime/crossOriginForbidden.ts +0 -17
- package/src/lib/server/runtime/crossOriginGate.ts +0 -29
- package/src/lib/server/runtime/devClientFingerprint.ts +0 -103
- package/src/lib/server/runtime/devReloadResponse.ts +0 -41
- package/src/lib/server/runtime/disableIdleTimeoutForStream.ts +0 -27
- package/src/lib/server/runtime/envSchemaStore.ts +0 -15
- package/src/lib/server/runtime/finalizeResponse.ts +0 -42
- package/src/lib/server/runtime/findOpenPort.ts +0 -21
- package/src/lib/server/runtime/flushingGzipStream.ts +0 -62
- package/src/lib/server/runtime/getActiveServer.ts +0 -6
- package/src/lib/server/runtime/globToPathSet.ts +0 -29
- package/src/lib/server/runtime/gzipResponse.ts +0 -57
- package/src/lib/server/runtime/inFlightRequests.ts +0 -13
- package/src/lib/server/runtime/inProcessServer.ts +0 -20
- package/src/lib/server/runtime/installAmbientScopeStore.ts +0 -54
- package/src/lib/server/runtime/internalErrorResponse.ts +0 -28
- package/src/lib/server/runtime/isCrossOriginRequest.ts +0 -23
- package/src/lib/server/runtime/listenOnOpenPort.ts +0 -36
- package/src/lib/server/runtime/logExposedSurfaces.ts +0 -156
- package/src/lib/server/runtime/maybeMountInspector.ts +0 -104
- package/src/lib/server/runtime/mimeForExtension.ts +0 -14
- package/src/lib/server/runtime/pageRenderSlot.ts +0 -15
- package/src/lib/server/runtime/pageUrlFromStore.ts +0 -15
- package/src/lib/server/runtime/parseIdleTimeout.ts +0 -10
- package/src/lib/server/runtime/parsePort.ts +0 -11
- package/src/lib/server/runtime/pathStore.ts +0 -15
- package/src/lib/server/runtime/registryManifests.ts +0 -66
- package/src/lib/server/runtime/renderCellBarrierStore.ts +0 -15
- package/src/lib/server/runtime/requestContext.ts +0 -5
- package/src/lib/server/runtime/resolvePageSnapshot.ts +0 -25
- package/src/lib/server/runtime/respondWithEmbeddedAsset.ts +0 -18
- package/src/lib/server/runtime/runWithRequestScope.ts +0 -165
- package/src/lib/server/runtime/serializeCacheSnapshot.ts +0 -31
- package/src/lib/server/runtime/serverSlot.ts +0 -13
- package/src/lib/server/runtime/setActiveServer.ts +0 -6
- package/src/lib/server/runtime/snapshotEntryFromCache.ts +0 -121
- package/src/lib/server/runtime/streamCacheResolutions.ts +0 -44
- package/src/lib/server/runtime/streamFromIterator.ts +0 -124
- package/src/lib/server/runtime/textResponse.ts +0 -23
- package/src/lib/server/runtime/typedErrorResponse.ts +0 -26
- package/src/lib/server/runtime/types/Assets.ts +0 -6
- package/src/lib/server/runtime/types/DevReloadStamp.ts +0 -14
- package/src/lib/server/runtime/types/InspectorCacheEntry.ts +0 -24
- package/src/lib/server/runtime/types/InspectorCacheSnapshot.ts +0 -11
- package/src/lib/server/runtime/types/InspectorContext.ts +0 -34
- package/src/lib/server/runtime/types/InspectorInFlightRequest.ts +0 -20
- package/src/lib/server/runtime/types/InspectorInFlightSnapshot.ts +0 -10
- package/src/lib/server/runtime/types/InspectorPrompt.ts +0 -15
- package/src/lib/server/runtime/types/InspectorRpc.ts +0 -27
- package/src/lib/server/runtime/types/InspectorSocket.ts +0 -17
- package/src/lib/server/runtime/types/InspectorSurface.ts +0 -16
- package/src/lib/server/runtime/types/RequestStore.ts +0 -125
- package/src/lib/server/runtime/warnUnguardedMcp.ts +0 -43
- package/src/lib/server/runtime/withResponseDefaults.ts +0 -29
- package/src/lib/server/server.ts +0 -33
- package/src/lib/server/socket.ts +0 -32
- package/src/lib/server/sockets/amendFamilyEntry.ts +0 -39
- package/src/lib/server/sockets/createSocketDispatcher.ts +0 -397
- package/src/lib/server/sockets/defineSocket.ts +0 -225
- package/src/lib/server/sockets/lookupSocket.ts +0 -6
- package/src/lib/server/sockets/registerSocket.ts +0 -18
- package/src/lib/server/sockets/socketOperations.ts +0 -36
- package/src/lib/server/sockets/socketRegistry.ts +0 -9
- package/src/lib/server/sockets/types/SocketOperation.ts +0 -22
- package/src/lib/server/sockets/types/SocketOptions.ts +0 -26
- package/src/lib/server/sockets/types/SocketRegistryEntry.ts +0 -19
- package/src/lib/server/sockets/types/SocketRoutes.ts +0 -10
- package/src/lib/server/sse.ts +0 -58
- package/src/lib/shared/ABIDE_PACKAGE_NAME.ts +0 -7
- package/src/lib/shared/ABIDE_VERSION.ts +0 -9
- package/src/lib/shared/AMEND_TOPIC_PREFIX.ts +0 -9
- package/src/lib/shared/ASYNC_CELL.ts +0 -5
- package/src/lib/shared/CACHE_CONTROL_VALUES.ts +0 -16
- package/src/lib/shared/CACHE_STALENESS_SOCKET.ts +0 -8
- package/src/lib/shared/CLI_PATH.ts +0 -7
- package/src/lib/shared/DEFER.ts +0 -8
- package/src/lib/shared/DEV_REBUILD_PATH.ts +0 -6
- package/src/lib/shared/DEV_RELOAD_PATH.ts +0 -6
- package/src/lib/shared/HEALTH_PATH.ts +0 -7
- package/src/lib/shared/HTTP_METHODS.ts +0 -6
- package/src/lib/shared/HttpError.ts +0 -30
- package/src/lib/shared/IDENTITY_PATH.ts +0 -6
- package/src/lib/shared/INSPECTOR_PATH.ts +0 -7
- package/src/lib/shared/MCP_PATH.ts +0 -6
- package/src/lib/shared/NAV_HEADER.ts +0 -8
- package/src/lib/shared/OFFLINE_HEADER.ts +0 -8
- package/src/lib/shared/PROXIED_SERVER_SUBDIRS.ts +0 -15
- package/src/lib/shared/REF_JSON_HEADER.ts +0 -9
- package/src/lib/shared/REF_JSON_TAGS.ts +0 -43
- package/src/lib/shared/REMOTE_FUNCTION.ts +0 -8
- package/src/lib/shared/REPLAYABLE_METHODS.ts +0 -12
- package/src/lib/shared/RESERVED_SOCKET_PREFIX.ts +0 -8
- package/src/lib/shared/RPC_ARGS_TYPE.ts +0 -7
- package/src/lib/shared/RPC_SHIM_GLOBALS.ts +0 -9
- package/src/lib/shared/SEEDS.ts +0 -33
- package/src/lib/shared/SOCKETS_PATH.ts +0 -7
- package/src/lib/shared/SOCKET_SEED.ts +0 -12
- package/src/lib/shared/SSR_SCRIPT_ID.ts +0 -11
- package/src/lib/shared/STREAMING_CONTENT_TYPES.ts +0 -12
- package/src/lib/shared/SocketDisconnectedError.ts +0 -13
- package/src/lib/shared/TEXT_PLAIN.ts +0 -7
- package/src/lib/shared/abideImportName.ts +0 -44
- package/src/lib/shared/abideLog.ts +0 -38
- package/src/lib/shared/activeCacheStore.ts +0 -12
- package/src/lib/shared/activePage.ts +0 -12
- package/src/lib/shared/amend.ts +0 -48
- package/src/lib/shared/amendBroadcastSlot.ts +0 -19
- package/src/lib/shared/appDataDir.ts +0 -34
- package/src/lib/shared/appNameSlot.ts +0 -10
- package/src/lib/shared/applyAmendLocally.ts +0 -20
- package/src/lib/shared/applyCacheStalenessLocally.ts +0 -18
- package/src/lib/shared/assertExhaustive.ts +0 -14
- package/src/lib/shared/attachRpcSelectorMethods.ts +0 -44
- package/src/lib/shared/attachSocketSelectorMethods.ts +0 -34
- package/src/lib/shared/augmentModule.ts +0 -18
- package/src/lib/shared/basePath.ts +0 -11
- package/src/lib/shared/basePathFromAppUrl.ts +0 -20
- package/src/lib/shared/baseSlot.ts +0 -9
- package/src/lib/shared/binaryDirEnvPath.ts +0 -12
- package/src/lib/shared/bodyValueForKind.ts +0 -34
- package/src/lib/shared/browserClientFlags.ts +0 -10
- package/src/lib/shared/buildArtifact.ts +0 -20
- package/src/lib/shared/buildRpcProxy.ts +0 -39
- package/src/lib/shared/buildRpcRequest.ts +0 -81
- package/src/lib/shared/buildSocketOverChannel.ts +0 -102
- package/src/lib/shared/bundleGraphFromMetafile.ts +0 -68
- package/src/lib/shared/bundleLayout.ts +0 -36
- package/src/lib/shared/cache.ts +0 -1584
- package/src/lib/shared/cacheEntryFromSnapshot.ts +0 -77
- package/src/lib/shared/cacheManagedSlot.ts +0 -10
- package/src/lib/shared/cacheReaderSocketSlot.ts +0 -11
- package/src/lib/shared/cacheStalenessSlot.ts +0 -21
- package/src/lib/shared/cacheStoreSlot.ts +0 -12
- package/src/lib/shared/cacheStores.ts +0 -10
- package/src/lib/shared/canonicalJson.ts +0 -86
- package/src/lib/shared/carriesBodyArgs.ts +0 -13
- package/src/lib/shared/changeAffectsClient.ts +0 -40
- package/src/lib/shared/clearLastConnection.ts +0 -7
- package/src/lib/shared/commandNameForUrl.ts +0 -17
- package/src/lib/shared/contentBodyKind.ts +0 -27
- package/src/lib/shared/contentTypeOf.ts +0 -6
- package/src/lib/shared/createCacheStore.ts +0 -147
- package/src/lib/shared/createChannelLog.ts +0 -146
- package/src/lib/shared/createLifecycleChannel.ts +0 -62
- package/src/lib/shared/createLivenessWatch.ts +0 -118
- package/src/lib/shared/createPushIterator.ts +0 -132
- package/src/lib/shared/createReachable.ts +0 -78
- package/src/lib/shared/createRemoteFunction.ts +0 -210
- package/src/lib/shared/createResolverSlot.ts +0 -30
- package/src/lib/shared/createRpcServerProgram.ts +0 -1007
- package/src/lib/shared/createSocketSubRegistry.ts +0 -112
- package/src/lib/shared/createSubscriber.ts +0 -55
- package/src/lib/shared/createTraceContext.ts +0 -21
- package/src/lib/shared/dataDirEnvPath.ts +0 -12
- package/src/lib/shared/debugGate.ts +0 -90
- package/src/lib/shared/decodeRefJson.ts +0 -112
- package/src/lib/shared/decodeResponse.ts +0 -54
- package/src/lib/shared/decodeWireBody.ts +0 -35
- package/src/lib/shared/detectRpcMethod.ts +0 -24
- package/src/lib/shared/detectTarget.ts +0 -27
- package/src/lib/shared/docSnapshotsSlot.ts +0 -13
- package/src/lib/shared/done.ts +0 -20
- package/src/lib/shared/emitLogRecord.ts +0 -217
- package/src/lib/shared/encodeRefJson.ts +0 -108
- package/src/lib/shared/encodeSeedValue.ts +0 -24
- package/src/lib/shared/encodeWireBody.ts +0 -18
- package/src/lib/shared/escapeHtml.ts +0 -15
- package/src/lib/shared/escapeRegex.ts +0 -9
- package/src/lib/shared/exeSuffix.ts +0 -9
- package/src/lib/shared/exitOnBuildFailure.ts +0 -18
- package/src/lib/shared/extraForwardHeaders.ts +0 -16
- package/src/lib/shared/fieldErrorsFromIssues.ts +0 -27
- package/src/lib/shared/fileName.ts +0 -9
- package/src/lib/shared/fileStem.ts +0 -11
- package/src/lib/shared/findExportCallSite.ts +0 -233
- package/src/lib/shared/formatTraceparent.ts +0 -6
- package/src/lib/shared/forwardHeaders.ts +0 -44
- package/src/lib/shared/generateDeclarations.ts +0 -72
- package/src/lib/shared/getRemoteMeta.ts +0 -5
- package/src/lib/shared/hasSeedableRequest.ts +0 -25
- package/src/lib/shared/health.ts +0 -179
- package/src/lib/shared/healthReadSlot.ts +0 -11
- package/src/lib/shared/healthSeedSlot.ts +0 -12
- package/src/lib/shared/html.ts +0 -19
- package/src/lib/shared/httpErrorFor.ts +0 -26
- package/src/lib/shared/hydrationWindow.ts +0 -53
- package/src/lib/shared/importNamesToStrip.ts +0 -13
- package/src/lib/shared/invalidate.ts +0 -39
- package/src/lib/shared/invalidateEvent.ts +0 -11
- package/src/lib/shared/invalidateTripwire.ts +0 -40
- package/src/lib/shared/isAbideHealthPayload.ts +0 -11
- package/src/lib/shared/isAsciiWhitespace.ts +0 -5
- package/src/lib/shared/isAsyncCell.ts +0 -11
- package/src/lib/shared/isAsyncIterable.ts +0 -8
- package/src/lib/shared/isCompileTarget.ts +0 -21
- package/src/lib/shared/isDebugEnabled.ts +0 -19
- package/src/lib/shared/isDebugNegated.ts +0 -17
- package/src/lib/shared/isIdentPart.ts +0 -9
- package/src/lib/shared/isIdentStart.ts +0 -8
- package/src/lib/shared/isLayoutFile.ts +0 -12
- package/src/lib/shared/isModuleNotFound.ts +0 -18
- package/src/lib/shared/isReadOnlyMethod.ts +0 -14
- package/src/lib/shared/isReplayableMethod.ts +0 -7
- package/src/lib/shared/isStreamingResponse.ts +0 -12
- package/src/lib/shared/isSubscribable.ts +0 -15
- package/src/lib/shared/isThenable.ts +0 -9
- package/src/lib/shared/jsonSchemaForPromptArguments.ts +0 -29
- package/src/lib/shared/jsonSchemaForSchema.ts +0 -39
- package/src/lib/shared/jsonSchemaForType.ts +0 -245
- package/src/lib/shared/jsonlErrorFrame.ts +0 -24
- package/src/lib/shared/keyForRemoteCall.ts +0 -30
- package/src/lib/shared/keyMatchesPrefix.ts +0 -9
- package/src/lib/shared/keyPrefixForRemote.ts +0 -12
- package/src/lib/shared/lastConnectionPath.ts +0 -7
- package/src/lib/shared/layoutChainForRoute.ts +0 -22
- package/src/lib/shared/lenientDecode.ts +0 -15
- package/src/lib/shared/loadEnvFile.ts +0 -17
- package/src/lib/shared/loadEnvFromDataDir.ts +0 -14
- package/src/lib/shared/loadProjectTsConfig.ts +0 -28
- package/src/lib/shared/log.ts +0 -24
- package/src/lib/shared/logClosingRecord.ts +0 -28
- package/src/lib/shared/logTapSlot.ts +0 -13
- package/src/lib/shared/manifestModule.ts +0 -39
- package/src/lib/shared/markFrameworkSourcesIgnored.ts +0 -47
- package/src/lib/shared/matchRoute.ts +0 -165
- package/src/lib/shared/matcherFromEnvelope.ts +0 -31
- package/src/lib/shared/memoizeByKey.ts +0 -32
- package/src/lib/shared/messageFromError.ts +0 -6
- package/src/lib/shared/normalizePathname.ts +0 -11
- package/src/lib/shared/normalizeTarget.ts +0 -10
- package/src/lib/shared/online.ts +0 -51
- package/src/lib/shared/page.ts +0 -30
- package/src/lib/shared/pageSlot.ts +0 -17
- package/src/lib/shared/pageUrlForFile.ts +0 -14
- package/src/lib/shared/parseBoundedEnvInt.ts +0 -20
- package/src/lib/shared/parseEnv.ts +0 -41
- package/src/lib/shared/parsePromptMarkdown.ts +0 -35
- package/src/lib/shared/parseRouteSegments.ts +0 -31
- package/src/lib/shared/parseTraceparent.ts +0 -26
- package/src/lib/shared/peek.ts +0 -46
- package/src/lib/shared/pending.ts +0 -36
- package/src/lib/shared/pendingAsyncCellsSlot.ts +0 -13
- package/src/lib/shared/prepareRemoteExport.ts +0 -40
- package/src/lib/shared/prepareRpcModule.ts +0 -240
- package/src/lib/shared/prepareSocketModule.ts +0 -46
- package/src/lib/shared/probeRegistries.ts +0 -68
- package/src/lib/shared/producerKey.ts +0 -32
- package/src/lib/shared/programNameForPackage.ts +0 -16
- package/src/lib/shared/promptNameForFile.ts +0 -10
- package/src/lib/shared/queryStringFromArgs.ts +0 -38
- package/src/lib/shared/randomHexId.ts +0 -14
- package/src/lib/shared/reachable.ts +0 -99
- package/src/lib/shared/readEnvFile.ts +0 -15
- package/src/lib/shared/readLastConnection.ts +0 -18
- package/src/lib/shared/readPackageJson.ts +0 -9
- package/src/lib/shared/recordRemoteMeta.ts +0 -5
- package/src/lib/shared/refresh.ts +0 -39
- package/src/lib/shared/refreshing.ts +0 -37
- package/src/lib/shared/remoteMetaStore.ts +0 -16
- package/src/lib/shared/requestScopeSlot.ts +0 -13
- package/src/lib/shared/resolveClientFlags.ts +0 -20
- package/src/lib/shared/resolvedCellsSlot.ts +0 -13
- package/src/lib/shared/responseBodyKind.ts +0 -35
- package/src/lib/shared/responseErrorText.ts +0 -9
- package/src/lib/shared/reviveWireField.ts +0 -49
- package/src/lib/shared/reviveWireOutput.ts +0 -36
- package/src/lib/shared/routeParamsShape.ts +0 -20
- package/src/lib/shared/rpcErrorRegistry.ts +0 -69
- package/src/lib/shared/rpcServerForRoot.ts +0 -25
- package/src/lib/shared/rpcTimeoutSlot.ts +0 -9
- package/src/lib/shared/rpcUrlForFile.ts +0 -19
- package/src/lib/shared/runningAsStandaloneBinary.ts +0 -13
- package/src/lib/shared/safeJsonForScript.ts +0 -17
- package/src/lib/shared/scanPages.ts +0 -25
- package/src/lib/shared/selectorMatcher.ts +0 -55
- package/src/lib/shared/selectorPrefix.ts +0 -32
- package/src/lib/shared/serializeEnv.ts +0 -30
- package/src/lib/shared/serializeSelector.ts +0 -69
- package/src/lib/shared/setAppName.ts +0 -5
- package/src/lib/shared/setOwnProperty.ts +0 -19
- package/src/lib/shared/setsIntersect.ts +0 -15
- package/src/lib/shared/sharedCacheStore.ts +0 -14
- package/src/lib/shared/sharedCacheStoreSlot.ts +0 -10
- package/src/lib/shared/skipNonCode.ts +0 -230
- package/src/lib/shared/snapshotShippable.ts +0 -23
- package/src/lib/shared/snippet.ts +0 -30
- package/src/lib/shared/socketNameForFile.ts +0 -11
- package/src/lib/shared/socketTailsSlot.ts +0 -13
- package/src/lib/shared/socketTapSlot.ts +0 -12
- package/src/lib/shared/sseErrorFrame.ts +0 -29
- package/src/lib/shared/streamResponse.ts +0 -180
- package/src/lib/shared/streamedCellsSlot.ts +0 -14
- package/src/lib/shared/stripImport.ts +0 -29
- package/src/lib/shared/subscribableFromResponse.ts +0 -51
- package/src/lib/shared/subscribableProbes.ts +0 -111
- package/src/lib/shared/tailProbeSlot.ts +0 -23
- package/src/lib/shared/toTagSet.ts +0 -4
- package/src/lib/shared/trace.ts +0 -16
- package/src/lib/shared/types/AmendApply.ts +0 -15
- package/src/lib/shared/types/AsyncComputed.ts +0 -20
- package/src/lib/shared/types/AsyncState.ts +0 -13
- package/src/lib/shared/types/CacheEntry.ts +0 -100
- package/src/lib/shared/types/CacheInvalidation.ts +0 -9
- package/src/lib/shared/types/CacheOnContext.ts +0 -15
- package/src/lib/shared/types/CacheOptions.ts +0 -53
- package/src/lib/shared/types/CachePolicy.ts +0 -31
- package/src/lib/shared/types/CacheReaderHook.ts +0 -11
- package/src/lib/shared/types/CacheSelector.ts +0 -17
- package/src/lib/shared/types/CacheSnapshotEntry.ts +0 -32
- package/src/lib/shared/types/CacheStalenessApply.ts +0 -13
- package/src/lib/shared/types/CacheStalenessFrame.ts +0 -24
- package/src/lib/shared/types/CacheStats.ts +0 -13
- package/src/lib/shared/types/CacheStore.ts +0 -45
- package/src/lib/shared/types/ChannelLog.ts +0 -13
- package/src/lib/shared/types/ClientFlags.ts +0 -13
- package/src/lib/shared/types/CompileTarget.ts +0 -6
- package/src/lib/shared/types/DebugGate.ts +0 -10
- package/src/lib/shared/types/DocSnapshots.ts +0 -12
- package/src/lib/shared/types/ErrorJsonSchemas.ts +0 -8
- package/src/lib/shared/types/ErrorSpec.ts +0 -11
- package/src/lib/shared/types/FrameworkLog.ts +0 -13
- package/src/lib/shared/types/HttpMethod.ts +0 -3
- package/src/lib/shared/types/InputCoercion.ts +0 -17
- package/src/lib/shared/types/LastConnection.ts +0 -9
- package/src/lib/shared/types/Log.ts +0 -13
- package/src/lib/shared/types/LogRecord.ts +0 -42
- package/src/lib/shared/types/LogVoice.ts +0 -7
- package/src/lib/shared/types/NamedAsyncIterable.ts +0 -26
- package/src/lib/shared/types/OutputWirePlan.ts +0 -17
- package/src/lib/shared/types/PageSnapshot.ts +0 -14
- package/src/lib/shared/types/PagesScan.ts +0 -7
- package/src/lib/shared/types/PendingAsyncCells.ts +0 -10
- package/src/lib/shared/types/PromptArgument.ts +0 -12
- package/src/lib/shared/types/RawRemoteFunction.ts +0 -20
- package/src/lib/shared/types/RemoteCallable.ts +0 -40
- package/src/lib/shared/types/RemoteFunction.ts +0 -116
- package/src/lib/shared/types/ReplayableMethod.ts +0 -7
- package/src/lib/shared/types/RequestScopeInfo.ts +0 -16
- package/src/lib/shared/types/ResolvedCells.ts +0 -11
- package/src/lib/shared/types/ResolverSlot.ts +0 -13
- package/src/lib/shared/types/ReturnBody.ts +0 -15
- package/src/lib/shared/types/RpcBuildStamps.ts +0 -32
- package/src/lib/shared/types/RpcError.ts +0 -26
- package/src/lib/shared/types/RpcErrorGuard.ts +0 -35
- package/src/lib/shared/types/RpcInvoker.ts +0 -6
- package/src/lib/shared/types/RpcOptions.ts +0 -22
- package/src/lib/shared/types/Socket.ts +0 -54
- package/src/lib/shared/types/SocketChannel.ts +0 -17
- package/src/lib/shared/types/SocketClientFrame.ts +0 -19
- package/src/lib/shared/types/SocketServerFrame.ts +0 -24
- package/src/lib/shared/types/SocketSubCallbacks.ts +0 -13
- package/src/lib/shared/types/SocketTails.ts +0 -13
- package/src/lib/shared/types/SourceMap.ts +0 -14
- package/src/lib/shared/types/SsrBootState.ts +0 -27
- package/src/lib/shared/types/SsrPayload.ts +0 -36
- package/src/lib/shared/types/StandardSchemaV1.ts +0 -56
- package/src/lib/shared/types/StreamPolicy.ts +0 -11
- package/src/lib/shared/types/StreamedCells.ts +0 -19
- package/src/lib/shared/types/StreamedResolution.ts +0 -28
- package/src/lib/shared/types/TailHooks.ts +0 -13
- package/src/lib/shared/types/TraceContext.ts +0 -17
- package/src/lib/shared/types/ValidationErrorData.ts +0 -20
- package/src/lib/shared/types/WireKind.ts +0 -11
- package/src/lib/shared/url.ts +0 -141
- package/src/lib/shared/validationHttpError.ts +0 -33
- package/src/lib/shared/warmSeedKey.ts +0 -16
- package/src/lib/shared/wireJsonReplacer.ts +0 -30
- package/src/lib/shared/withBase.ts +0 -10
- package/src/lib/shared/withBaseUrl.ts +0 -17
- package/src/lib/shared/withCacheManaged.ts +0 -18
- package/src/lib/shared/withJsonSchema.ts +0 -21
- package/src/lib/shared/writeDts.ts +0 -19
- package/src/lib/shared/writeHealthDts.ts +0 -36
- package/src/lib/shared/writeLastConnection.ts +0 -13
- package/src/lib/shared/writePublicAssetsDts.ts +0 -27
- package/src/lib/shared/writeRoutesDts.ts +0 -41
- package/src/lib/shared/writeRpcDts.ts +0 -60
- package/src/lib/shared/writeTestRpcDts.ts +0 -45
- package/src/lib/shared/writeTestSocketsDts.ts +0 -34
- package/src/lib/test/assertAgentFrameConformance.ts +0 -73
- package/src/lib/test/createScriptedSurface.ts +0 -45
- package/src/lib/test/createTestApp.ts +0 -242
- package/src/lib/test/createTestSocketChannel.ts +0 -85
- package/src/lib/ui/README.md +0 -86
- package/src/lib/ui/activePendingCells.ts +0 -14
- package/src/lib/ui/amendReaderHook.ts +0 -125
- package/src/lib/ui/compile/ABIDE_SEMANTIC_TOKENS_LEGEND.ts +0 -79
- package/src/lib/ui/compile/AbideCompileError.ts +0 -16
- package/src/lib/ui/compile/BLOCK_KEYWORDS.ts +0 -21
- package/src/lib/ui/compile/SSR_ESCAPE.ts +0 -40
- package/src/lib/ui/compile/TS_PRINTER.ts +0 -7
- package/src/lib/ui/compile/UI_RUNTIME_IMPORTS.ts +0 -86
- package/src/lib/ui/compile/VOID_TAGS.ts +0 -22
- package/src/lib/ui/compile/abideUiPlugin.ts +0 -109
- package/src/lib/ui/compile/analyzeComponent.ts +0 -222
- package/src/lib/ui/compile/asOutlet.ts +0 -30
- package/src/lib/ui/compile/assertTranspiles.ts +0 -19
- package/src/lib/ui/compile/assetModulesFile.ts +0 -32
- package/src/lib/ui/compile/assignmentTargetNames.ts +0 -54
- package/src/lib/ui/compile/asyncInterpolationFields.ts +0 -152
- package/src/lib/ui/compile/asyncValuePositionError.ts +0 -21
- package/src/lib/ui/compile/asyncValuePositionInterpolations.ts +0 -64
- package/src/lib/ui/compile/attrLiftPosition.ts +0 -18
- package/src/lib/ui/compile/awaitPlan.ts +0 -60
- package/src/lib/ui/compile/awaitSubjectExpr.ts +0 -23
- package/src/lib/ui/compile/bindListenEvent.ts +0 -18
- package/src/lib/ui/compile/cachedShadowProgram.ts +0 -39
- package/src/lib/ui/compile/cachedSourceFile.ts +0 -40
- package/src/lib/ui/compile/catchBinding.ts +0 -10
- package/src/lib/ui/compile/classStyleMergePlan.ts +0 -108
- package/src/lib/ui/compile/classifyInterpolationType.ts +0 -46
- package/src/lib/ui/compile/collectAbideDiagnostics.ts +0 -166
- package/src/lib/ui/compile/compileComponent.ts +0 -46
- package/src/lib/ui/compile/compileModule.ts +0 -306
- package/src/lib/ui/compile/compileSSR.ts +0 -119
- package/src/lib/ui/compile/compileShadow.ts +0 -1326
- package/src/lib/ui/compile/componentOrdinals.ts +0 -39
- package/src/lib/ui/compile/composeProps.ts +0 -64
- package/src/lib/ui/compile/createShadowLanguageService.ts +0 -348
- package/src/lib/ui/compile/createShadowProgram.ts +0 -127
- package/src/lib/ui/compile/createShadowScope.ts +0 -42
- package/src/lib/ui/compile/declaredNames.ts +0 -36
- package/src/lib/ui/compile/decodeHtmlEntities.ts +0 -53
- package/src/lib/ui/compile/destructureBindingNames.ts +0 -38
- package/src/lib/ui/compile/desugarSignals.ts +0 -1113
- package/src/lib/ui/compile/eachPlan.ts +0 -61
- package/src/lib/ui/compile/elementPlan.ts +0 -55
- package/src/lib/ui/compile/encodeSemanticTokens.ts +0 -60
- package/src/lib/ui/compile/expressionIsPrefixEvaluable.ts +0 -19
- package/src/lib/ui/compile/generateBuild.ts +0 -903
- package/src/lib/ui/compile/generateSSR.ts +0 -967
- package/src/lib/ui/compile/groupBindParts.ts +0 -28
- package/src/lib/ui/compile/hasTopLevelAwait.ts +0 -28
- package/src/lib/ui/compile/hoistCells.ts +0 -120
- package/src/lib/ui/compile/hoistableAwaits.ts +0 -183
- package/src/lib/ui/compile/hoistableChildRenders.ts +0 -112
- package/src/lib/ui/compile/identifierReferencePattern.ts +0 -13
- package/src/lib/ui/compile/ifPlan.ts +0 -36
- package/src/lib/ui/compile/interpolatedTemplateLiteral.ts +0 -27
- package/src/lib/ui/compile/interpolationClassifierForRoot.ts +0 -32
- package/src/lib/ui/compile/isAnchorPositioned.ts +0 -19
- package/src/lib/ui/compile/isControlFlow.ts +0 -20
- package/src/lib/ui/compile/isFunctionScopeBoundary.ts +0 -20
- package/src/lib/ui/compile/isPlainIdentifier.ts +0 -7
- package/src/lib/ui/compile/isSpuriousAsyncReadDiagnostic.ts +0 -215
- package/src/lib/ui/compile/isTextLeaf.ts +0 -16
- package/src/lib/ui/compile/isWhitespaceText.ts +0 -19
- package/src/lib/ui/compile/liftAsyncSubExpressions.ts +0 -166
- package/src/lib/ui/compile/liftScriptSeed.ts +0 -47
- package/src/lib/ui/compile/loadShadowTsConfig.ts +0 -31
- package/src/lib/ui/compile/lowerAsyncInterpolations.ts +0 -92
- package/src/lib/ui/compile/lowerCompoundAssignment.ts +0 -49
- package/src/lib/ui/compile/lowerContext.ts +0 -167
- package/src/lib/ui/compile/lowerDocAccess.ts +0 -302
- package/src/lib/ui/compile/lowerScript.ts +0 -190
- package/src/lib/ui/compile/lowerUpdateExpression.ts +0 -32
- package/src/lib/ui/compile/makeVarNamer.ts +0 -10
- package/src/lib/ui/compile/nearestProjectRoot.ts +0 -16
- package/src/lib/ui/compile/nodeAtShadowOffset.ts +0 -28
- package/src/lib/ui/compile/offsetToLineColumn.ts +0 -16
- package/src/lib/ui/compile/offsetToPosition.ts +0 -9
- package/src/lib/ui/compile/pagePropsType.ts +0 -23
- package/src/lib/ui/compile/parseTemplate.ts +0 -25
- package/src/lib/ui/compile/parseTemplateRecovering.ts +0 -1385
- package/src/lib/ui/compile/prepareNestedScript.ts +0 -62
- package/src/lib/ui/compile/reactiveBinding.ts +0 -47
- package/src/lib/ui/compile/referencedIdentifiers.ts +0 -35
- package/src/lib/ui/compile/remapShadowDiagnostic.ts +0 -30
- package/src/lib/ui/compile/renameSignalRefs.ts +0 -425
- package/src/lib/ui/compile/resolveAbideImports.ts +0 -29
- package/src/lib/ui/compile/resolveBranches.ts +0 -21
- package/src/lib/ui/compile/resolveReactiveExport.ts +0 -92
- package/src/lib/ui/compile/scopeAttr.ts +0 -9
- package/src/lib/ui/compile/scopeCss.ts +0 -138
- package/src/lib/ui/compile/seedTypeClassifierForRoot.ts +0 -60
- package/src/lib/ui/compile/shadowInterpolationClassifier.ts +0 -47
- package/src/lib/ui/compile/shadowNaming.ts +0 -11
- package/src/lib/ui/compile/signalCallee.ts +0 -24
- package/src/lib/ui/compile/skeletonContext.ts +0 -133
- package/src/lib/ui/compile/skeletonable.ts +0 -68
- package/src/lib/ui/compile/snippetPlan.ts +0 -28
- package/src/lib/ui/compile/sourceFileOptionsSignature.ts +0 -20
- package/src/lib/ui/compile/sourceToShadowOffset.ts +0 -24
- package/src/lib/ui/compile/spreadExcludedNames.ts +0 -27
- package/src/lib/ui/compile/staticAttr.ts +0 -11
- package/src/lib/ui/compile/staticAttrValue.ts +0 -13
- package/src/lib/ui/compile/staticTextPart.ts +0 -12
- package/src/lib/ui/compile/stripEffects.ts +0 -48
- package/src/lib/ui/compile/structuralHeadTokens.ts +0 -107
- package/src/lib/ui/compile/switchPlan.ts +0 -28
- package/src/lib/ui/compile/templateAnchorAdapter.ts +0 -61
- package/src/lib/ui/compile/templateElementAdapter.ts +0 -44
- package/src/lib/ui/compile/templateSemanticTokens.ts +0 -21
- package/src/lib/ui/compile/templateStartOffset.ts +0 -15
- package/src/lib/ui/compile/tryPlan.ts +0 -37
- package/src/lib/ui/compile/types/AbideDiagnostic.ts +0 -14
- package/src/lib/ui/compile/types/AnalyzedComponent.ts +0 -42
- package/src/lib/ui/compile/types/AsyncInterpolationField.ts +0 -19
- package/src/lib/ui/compile/types/Binding.ts +0 -24
- package/src/lib/ui/compile/types/CompiledShadow.ts +0 -27
- package/src/lib/ui/compile/types/ElementPlan.ts +0 -43
- package/src/lib/ui/compile/types/InterpolationClassifier.ts +0 -12
- package/src/lib/ui/compile/types/InterpolationKind.ts +0 -7
- package/src/lib/ui/compile/types/ParseDiagnostic.ts +0 -8
- package/src/lib/ui/compile/types/SeedTypeClassifier.ts +0 -15
- package/src/lib/ui/compile/types/SemanticToken.ts +0 -11
- package/src/lib/ui/compile/types/ShadowKind.ts +0 -9
- package/src/lib/ui/compile/types/ShadowScope.ts +0 -19
- package/src/lib/ui/compile/types/SkeletonContext.ts +0 -21
- package/src/lib/ui/compile/types/TemplateAttr.ts +0 -34
- package/src/lib/ui/compile/types/TemplateNode.ts +0 -137
- package/src/lib/ui/compile/types/TextPart.ts +0 -8
- package/src/lib/ui/compile/types/ValuePositionInterpolation.ts +0 -13
- package/src/lib/ui/compile/unwrapParens.ts +0 -10
- package/src/lib/ui/compile/walkAnchorOrder.ts +0 -57
- package/src/lib/ui/compile/walkElementOrder.ts +0 -60
- package/src/lib/ui/compile/withBindings.ts +0 -45
- package/src/lib/ui/compile/wrapReactionCellSources.ts +0 -121
- package/src/lib/ui/compile/wrapReactiveSeeds.ts +0 -44
- package/src/lib/ui/compile/wrapSeed.ts +0 -28
- package/src/lib/ui/compile/writtenTemplateNames.ts +0 -84
- package/src/lib/ui/computed.ts +0 -75
- package/src/lib/ui/createScope.ts +0 -157
- package/src/lib/ui/dom/MATHML_NAMESPACE.ts +0 -6
- package/src/lib/ui/dom/SVG_NAMESPACE.ts +0 -8
- package/src/lib/ui/dom/anchorCursor.ts +0 -25
- package/src/lib/ui/dom/anchoredBranch.ts +0 -153
- package/src/lib/ui/dom/appendSnippet.ts +0 -75
- package/src/lib/ui/dom/appendStatic.ts +0 -26
- package/src/lib/ui/dom/appendText.ts +0 -160
- package/src/lib/ui/dom/appendTextAt.ts +0 -39
- package/src/lib/ui/dom/assertClaimedText.ts +0 -30
- package/src/lib/ui/dom/attach.ts +0 -25
- package/src/lib/ui/dom/attr.ts +0 -57
- package/src/lib/ui/dom/awaitBlock.ts +0 -314
- package/src/lib/ui/dom/awaitSubject.ts +0 -118
- package/src/lib/ui/dom/bindProp.ts +0 -22
- package/src/lib/ui/dom/bindSelectValue.ts +0 -48
- package/src/lib/ui/dom/bindableProp.ts +0 -47
- package/src/lib/ui/dom/buildDetachedRange.ts +0 -31
- package/src/lib/ui/dom/cellPending.ts +0 -24
- package/src/lib/ui/dom/claimText.ts +0 -38
- package/src/lib/ui/dom/clearBetween.ts +0 -16
- package/src/lib/ui/dom/cloneStatic.ts +0 -38
- package/src/lib/ui/dom/commentData.ts +0 -14
- package/src/lib/ui/dom/depthZeroNodes.ts +0 -34
- package/src/lib/ui/dom/discardAndRebuild.ts +0 -23
- package/src/lib/ui/dom/discardBoundary.ts +0 -46
- package/src/lib/ui/dom/disposeRange.ts +0 -18
- package/src/lib/ui/dom/domAnchorAdapter.ts +0 -29
- package/src/lib/ui/dom/domElementAdapter.ts +0 -20
- package/src/lib/ui/dom/each.ts +0 -253
- package/src/lib/ui/dom/eachAsync.ts +0 -188
- package/src/lib/ui/dom/effectiveChildNamespace.ts +0 -13
- package/src/lib/ui/dom/enterNamespace.ts +0 -20
- package/src/lib/ui/dom/fillBefore.ts +0 -42
- package/src/lib/ui/dom/fillBoundary.ts +0 -38
- package/src/lib/ui/dom/fillRange.ts +0 -30
- package/src/lib/ui/dom/foreignWrapperTag.ts +0 -22
- package/src/lib/ui/dom/hydrate.ts +0 -34
- package/src/lib/ui/dom/inheritedNamespace.ts +0 -19
- package/src/lib/ui/dom/isComment.ts +0 -6
- package/src/lib/ui/dom/isElement.ts +0 -6
- package/src/lib/ui/dom/markerDepthDelta.ts +0 -19
- package/src/lib/ui/dom/matchingRangeClose.ts +0 -29
- package/src/lib/ui/dom/mergeProps.ts +0 -32
- package/src/lib/ui/dom/mount.ts +0 -30
- package/src/lib/ui/dom/mountChild.ts +0 -94
- package/src/lib/ui/dom/mountRange.ts +0 -45
- package/src/lib/ui/dom/mountSlot.ts +0 -38
- package/src/lib/ui/dom/mountSwappableRange.ts +0 -122
- package/src/lib/ui/dom/moveRange.ts +0 -19
- package/src/lib/ui/dom/mutateDocContainer.ts +0 -65
- package/src/lib/ui/dom/on.ts +0 -33
- package/src/lib/ui/dom/openMarker.ts +0 -22
- package/src/lib/ui/dom/outlet.ts +0 -63
- package/src/lib/ui/dom/parseRawNodes.ts +0 -17
- package/src/lib/ui/dom/readCall.ts +0 -29
- package/src/lib/ui/dom/readCell.ts +0 -55
- package/src/lib/ui/dom/readTextOrSuspend.ts +0 -21
- package/src/lib/ui/dom/removeRange.ts +0 -18
- package/src/lib/ui/dom/replaceRange.ts +0 -24
- package/src/lib/ui/dom/restProps.ts +0 -32
- package/src/lib/ui/dom/skeleton.ts +0 -153
- package/src/lib/ui/dom/spreadAttrs.ts +0 -95
- package/src/lib/ui/dom/spreadProps.ts +0 -31
- package/src/lib/ui/dom/switchBlock.ts +0 -80
- package/src/lib/ui/dom/templateFor.ts +0 -28
- package/src/lib/ui/dom/tryBlock.ts +0 -263
- package/src/lib/ui/dom/types/EachRow.ts +0 -21
- package/src/lib/ui/dom/types/SkeletonHoles.ts +0 -10
- package/src/lib/ui/dom/types/SwitchCase.ts +0 -11
- package/src/lib/ui/dom/when.ts +0 -58
- package/src/lib/ui/dom/withScope.ts +0 -37
- package/src/lib/ui/dom/withSuspense.ts +0 -22
- package/src/lib/ui/dom/writeCell.ts +0 -22
- package/src/lib/ui/effect.ts +0 -24
- package/src/lib/ui/enterScope.ts +0 -18
- package/src/lib/ui/exitScope.ts +0 -8
- package/src/lib/ui/finalizeStreamedChildren.ts +0 -89
- package/src/lib/ui/flight.ts +0 -56
- package/src/lib/ui/html.ts +0 -39
- package/src/lib/ui/isolateCellBarrier.ts +0 -17
- package/src/lib/ui/linked.ts +0 -125
- package/src/lib/ui/navigate.ts +0 -77
- package/src/lib/ui/probeNavigation.ts +0 -33
- package/src/lib/ui/props.ts +0 -17
- package/src/lib/ui/remoteProxy.ts +0 -256
- package/src/lib/ui/renderChain.ts +0 -113
- package/src/lib/ui/renderToStream.ts +0 -128
- package/src/lib/ui/resumeSeedScript.ts +0 -27
- package/src/lib/ui/router.ts +0 -649
- package/src/lib/ui/runtime/AsyncCellError.ts +0 -21
- package/src/lib/ui/runtime/BRANCH_SEGMENT.ts +0 -24
- package/src/lib/ui/runtime/CELL_SEED.ts +0 -12
- package/src/lib/ui/runtime/CHILD_PRESENT.ts +0 -8
- package/src/lib/ui/runtime/CURRENT_BOUNDARY.ts +0 -11
- package/src/lib/ui/runtime/CURRENT_PATH.ts +0 -29
- package/src/lib/ui/runtime/CURRENT_SCOPE.ts +0 -23
- package/src/lib/ui/runtime/DOC_SEED.ts +0 -10
- package/src/lib/ui/runtime/HOLE_ATTRIBUTE.ts +0 -9
- package/src/lib/ui/runtime/NODE_STATE.ts +0 -22
- package/src/lib/ui/runtime/OUTLET_MARKER.ts +0 -10
- package/src/lib/ui/runtime/OUTLET_TAG.ts +0 -7
- package/src/lib/ui/runtime/OWNER.ts +0 -8
- package/src/lib/ui/runtime/PENDING_OUTLET.ts +0 -8
- package/src/lib/ui/runtime/RANGE_MARKER.ts +0 -16
- package/src/lib/ui/runtime/REACTIVE_CONTEXT.ts +0 -20
- package/src/lib/ui/runtime/RENDER.ts +0 -35
- package/src/lib/ui/runtime/REQUEST_SUPERSEDED.ts +0 -8
- package/src/lib/ui/runtime/RESUME.ts +0 -21
- package/src/lib/ui/runtime/SEED_MARKS.ts +0 -14
- package/src/lib/ui/runtime/STREAMED_CELLS.ts +0 -57
- package/src/lib/ui/runtime/SuspenseSignal.ts +0 -24
- package/src/lib/ui/runtime/abortNode.ts +0 -22
- package/src/lib/ui/runtime/ambientPathBacking.ts +0 -32
- package/src/lib/ui/runtime/ambientScopeBacking.ts +0 -26
- package/src/lib/ui/runtime/applyPatchToTree.ts +0 -54
- package/src/lib/ui/runtime/batch.ts +0 -22
- package/src/lib/ui/runtime/blockId.ts +0 -31
- package/src/lib/ui/runtime/boundaryFor.ts +0 -11
- package/src/lib/ui/runtime/cellBarrierBacking.ts +0 -30
- package/src/lib/ui/runtime/claimChild.ts +0 -8
- package/src/lib/ui/runtime/claimExpected.ts +0 -27
- package/src/lib/ui/runtime/claimMarker.ts +0 -13
- package/src/lib/ui/runtime/claimRun.ts +0 -22
- package/src/lib/ui/runtime/clientPage.ts +0 -116
- package/src/lib/ui/runtime/consumeSeed.ts +0 -38
- package/src/lib/ui/runtime/createAsyncCell.ts +0 -358
- package/src/lib/ui/runtime/createComputedNode.ts +0 -19
- package/src/lib/ui/runtime/createDoc.ts +0 -334
- package/src/lib/ui/runtime/createEffectNode.ts +0 -81
- package/src/lib/ui/runtime/createSignalNode.ts +0 -19
- package/src/lib/ui/runtime/currentAbortSignal.ts +0 -26
- package/src/lib/ui/runtime/detachLink.ts +0 -21
- package/src/lib/ui/runtime/endTracking.ts +0 -24
- package/src/lib/ui/runtime/enterRenderPass.ts +0 -13
- package/src/lib/ui/runtime/escapeKey.ts +0 -19
- package/src/lib/ui/runtime/exitRenderPass.ts +0 -7
- package/src/lib/ui/runtime/flushEffects.ts +0 -91
- package/src/lib/ui/runtime/generationGuard.ts +0 -40
- package/src/lib/ui/runtime/historyEntries.ts +0 -151
- package/src/lib/ui/runtime/inScope.ts +0 -19
- package/src/lib/ui/runtime/isAsyncFunction.ts +0 -14
- package/src/lib/ui/runtime/nextBlockId.ts +0 -12
- package/src/lib/ui/runtime/parkCursor.ts +0 -10
- package/src/lib/ui/runtime/pathSegments.ts +0 -10
- package/src/lib/ui/runtime/reactiveAbortState.ts +0 -15
- package/src/lib/ui/runtime/readNode.ts +0 -38
- package/src/lib/ui/runtime/renderPath.ts +0 -16
- package/src/lib/ui/runtime/reportHydrationDivergence.ts +0 -30
- package/src/lib/ui/runtime/routeBareSeed.ts +0 -28
- package/src/lib/ui/runtime/runHydrationPass.ts +0 -69
- package/src/lib/ui/runtime/runNode.ts +0 -75
- package/src/lib/ui/runtime/runtimePath.ts +0 -9
- package/src/lib/ui/runtime/scope.ts +0 -46
- package/src/lib/ui/runtime/scopeGroup.ts +0 -40
- package/src/lib/ui/runtime/toTeardown.ts +0 -38
- package/src/lib/ui/runtime/track.ts +0 -60
- package/src/lib/ui/runtime/trigger.ts +0 -74
- package/src/lib/ui/runtime/types/AbideHistoryState.ts +0 -9
- package/src/lib/ui/runtime/types/Boundary.ts +0 -9
- package/src/lib/ui/runtime/types/Cell.ts +0 -7
- package/src/lib/ui/runtime/types/Computed.ts +0 -3
- package/src/lib/ui/runtime/types/Doc.ts +0 -24
- package/src/lib/ui/runtime/types/EffectResult.ts +0 -10
- package/src/lib/ui/runtime/types/HydrationCursor.ts +0 -8
- package/src/lib/ui/runtime/types/NavVerdict.ts +0 -9
- package/src/lib/ui/runtime/types/Patch.ts +0 -11
- package/src/lib/ui/runtime/types/PathWalk.ts +0 -10
- package/src/lib/ui/runtime/types/ReactiveLink.ts +0 -21
- package/src/lib/ui/runtime/types/ReactiveNode.ts +0 -33
- package/src/lib/ui/runtime/types/RenderContext.ts +0 -10
- package/src/lib/ui/runtime/types/Route.ts +0 -9
- package/src/lib/ui/runtime/types/RouteLoader.ts +0 -7
- package/src/lib/ui/runtime/types/SsrRender.ts +0 -34
- package/src/lib/ui/runtime/types/State.ts +0 -3
- package/src/lib/ui/runtime/types/Teardown.ts +0 -5
- package/src/lib/ui/runtime/types/UiComponent.ts +0 -24
- package/src/lib/ui/runtime/types/UiProps.ts +0 -12
- package/src/lib/ui/runtime/unescapeKey.ts +0 -12
- package/src/lib/ui/runtime/unlinkDeps.ts +0 -28
- package/src/lib/ui/runtime/untrack.ts +0 -20
- package/src/lib/ui/runtime/updateIfNecessary.ts +0 -40
- package/src/lib/ui/runtime/walkPath.ts +0 -41
- package/src/lib/ui/runtime/withOptionalPath.ts +0 -8
- package/src/lib/ui/runtime/withPath.ts +0 -16
- package/src/lib/ui/runtime/withPathFrom.ts +0 -20
- package/src/lib/ui/runtime/withoutHydration.ts +0 -22
- package/src/lib/ui/runtime/writeNode.ts +0 -16
- package/src/lib/ui/scope.ts +0 -20
- package/src/lib/ui/seedBootState.ts +0 -53
- package/src/lib/ui/seedStreamedResolution.ts +0 -56
- package/src/lib/ui/settleAsyncCells.ts +0 -51
- package/src/lib/ui/socketChannel.ts +0 -156
- package/src/lib/ui/socketProxy.ts +0 -47
- package/src/lib/ui/startClient.ts +0 -156
- package/src/lib/ui/state.ts +0 -77
- package/src/lib/ui/subscribeCacheStaleness.ts +0 -85
- package/src/lib/ui/trackedComputed.ts +0 -68
- package/src/lib/ui/tryEncodeResume.ts +0 -11
- package/src/lib/ui/types/Layouts.ts +0 -9
- package/src/lib/ui/types/Pages.ts +0 -8
- package/src/lib/ui/types/Scope.ts +0 -68
- package/src/lib/ui/watch.ts +0 -150
- package/src/preload.ts +0 -19
- package/src/scaffold.ts +0 -153
- package/src/serverBuildPlugins.ts +0 -25
- package/src/serverEntry.ts +0 -138
- package/src/zodCjsPlugin.ts +0 -51
- package/template/.zed/settings.json +0 -10
- package/template/CLAUDE.md +0 -22
- package/template/bunfig.toml +0 -4
- package/template/package.json +0 -21
- package/template/src/app.ts +0 -28
- package/template/src/bundle/icon.png +0 -0
- package/template/src/cli/banner.txt +0 -3
- package/template/src/cli/footer.txt +0 -1
- package/template/src/server/config.ts +0 -17
- package/template/src/server/rpc/getHello.ts +0 -38
- package/template/src/ui/app.css +0 -21
- package/template/src/ui/app.html +0 -24
- package/template/src/ui/pages/about/page.abide +0 -7
- package/template/src/ui/pages/layout.abide +0 -19
- package/template/src/ui/pages/page.abide +0 -19
- package/template/test/app.test.ts +0 -30
- package/template/tsconfig.json +0 -18
- package/tsconfig.app.json +0 -17
|
@@ -1,1326 +0,0 @@
|
|
|
1
|
-
import ts from 'typescript'
|
|
2
|
-
import { ABIDE_PACKAGE_NAME } from '../../shared/ABIDE_PACKAGE_NAME.ts'
|
|
3
|
-
import { attrLiftPosition } from './attrLiftPosition.ts'
|
|
4
|
-
import { hasTopLevelAwait } from './hasTopLevelAwait.ts'
|
|
5
|
-
import { isFunctionScopeBoundary } from './isFunctionScopeBoundary.ts'
|
|
6
|
-
import { isWhitespaceText } from './isWhitespaceText.ts'
|
|
7
|
-
import {
|
|
8
|
-
type LiftPosition,
|
|
9
|
-
type LiftSpan,
|
|
10
|
-
liftAsyncSubExpressions,
|
|
11
|
-
} from './liftAsyncSubExpressions.ts'
|
|
12
|
-
import { parseTemplate } from './parseTemplate.ts'
|
|
13
|
-
import {
|
|
14
|
-
NESTED_REACTIVE_BINDINGS,
|
|
15
|
-
type ReactiveImportBindings,
|
|
16
|
-
reactiveImportBindings,
|
|
17
|
-
resolveReactiveExport,
|
|
18
|
-
} from './resolveReactiveExport.ts'
|
|
19
|
-
import { signalCallee } from './signalCallee.ts'
|
|
20
|
-
import { LEADING_SCRIPT } from './templateStartOffset.ts'
|
|
21
|
-
import type { CompiledShadow, ShadowDiagnostic, ShadowMapping } from './types/CompiledShadow.ts'
|
|
22
|
-
import type { InterpolationClassifier } from './types/InterpolationClassifier.ts'
|
|
23
|
-
import type { TemplateNode } from './types/TemplateNode.ts'
|
|
24
|
-
|
|
25
|
-
/*
|
|
26
|
-
Framework callables the `.abide` loader injects into a component's scope. `snippet`
|
|
27
|
-
and `scope` keep their real published types via imports so author calls type-check —
|
|
28
|
-
`scope()` is the internal lowering host (a captured handle `const s = scope()` + its
|
|
29
|
-
capability calls type-check against the real `Scope`; generated code targets it too).
|
|
30
|
-
`state`/`linked`/`computed`/`effect` are the imported reactive surface; when the author
|
|
31
|
-
imports one its own binding provides the type, so the ambient fallback for that name is
|
|
32
|
-
OMITTED (see `shadowPreamble`) to avoid a duplicate identifier. Otherwise
|
|
33
|
-
`state`/`linked`/`computed` are declared ambiently and `effect` is imported as a fallback
|
|
34
|
-
for a bare/nested use the top-level rewrite doesn't project (unused when projected — fine,
|
|
35
|
-
the shadow disables noUnusedLocals). `props` is the prop reader — destructured
|
|
36
|
-
(`const { a = 1 } = props<Shape>()`); a required import (`abide/ui/props`), so the shadow
|
|
37
|
-
declares it only when imported, returning the file's contextual shape (route params or
|
|
38
|
-
`Record<string, any>`) intersected with its own type argument — additive, so declared props
|
|
39
|
-
like `children: Snippet` layer on top instead of re-spelling the route shape.
|
|
40
|
-
*/
|
|
41
|
-
function shadowPreamble(importedReactives: ReadonlySet<string>): string {
|
|
42
|
-
/* Omit the ambient fallback for a primitive the author imports — its own binding is
|
|
43
|
-
the type, and a second declaration would be a duplicate-identifier error. */
|
|
44
|
-
const lines = [
|
|
45
|
-
importedReactives.has('effect')
|
|
46
|
-
? undefined
|
|
47
|
-
: `import { effect } from '${ABIDE_PACKAGE_NAME}/ui/effect'`,
|
|
48
|
-
`import { snippet } from '${ABIDE_PACKAGE_NAME}/shared/snippet'`,
|
|
49
|
-
`import { scope } from '${ABIDE_PACKAGE_NAME}/ui/currentScope'`,
|
|
50
|
-
importedReactives.has('state')
|
|
51
|
-
? undefined
|
|
52
|
-
: 'declare function state<T>(initial?: T, transform?: (next: T, previous: T) => T): { value: T }',
|
|
53
|
-
importedReactives.has('linked')
|
|
54
|
-
? undefined
|
|
55
|
-
: 'declare function linked<T>(seed: () => T, transform?: (next: T, previous: T) => T): { value: T }',
|
|
56
|
-
importedReactives.has('computed')
|
|
57
|
-
? undefined
|
|
58
|
-
: 'declare function computed<T>(compute: () => T): { readonly value: T }',
|
|
59
|
-
/* `effect` is defined either way — the preamble import or the author's own import. */
|
|
60
|
-
'void [effect, snippet, scope]',
|
|
61
|
-
]
|
|
62
|
-
return `${lines.filter((line) => line !== undefined).join('\n')}\n`
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/*
|
|
66
|
-
Compiles a `.abide` component into its type-checking shadow — a synthetic TS
|
|
67
|
-
module that reconstructs the author scope with value types and references every
|
|
68
|
-
template expression in a checkable position (see ADR-0010). The shadow is never
|
|
69
|
-
executed; it exists only so `tsc`/the language service can type-check template
|
|
70
|
-
expressions and child-component props, with diagnostics mapped back through the
|
|
71
|
-
returned segments.
|
|
72
|
-
|
|
73
|
-
The script's signal surface is rewritten to value types:
|
|
74
|
-
let count = state(0) → let count = (0)
|
|
75
|
-
const total = computed(() => …) → const total = (() => …)()
|
|
76
|
-
const { a } = props<{ a: T }>() → `__Props = { a: T }` + the verbatim destructure
|
|
77
|
-
Everything else (functions, plain consts, imports) is emitted verbatim, so
|
|
78
|
-
expressions inside it (e.g. a computed's compute body) are checked and mapped too.
|
|
79
|
-
*/
|
|
80
|
-
export function compileShadow(
|
|
81
|
-
source: string,
|
|
82
|
-
propsType = 'Record<string, any>',
|
|
83
|
-
classify?: InterpolationClassifier,
|
|
84
|
-
): CompiledShadow {
|
|
85
|
-
const leadingScript = source.match(LEADING_SCRIPT)
|
|
86
|
-
const scriptBody = leadingScript?.[1] ?? ''
|
|
87
|
-
/* Body starts just past the opening `<script …>`; template just past `</script>`. */
|
|
88
|
-
const scriptStart = leadingScript ? source.indexOf('>', leadingScript.index) + 1 : 0
|
|
89
|
-
const templateStart = leadingScript ? (leadingScript.index ?? 0) + leadingScript[0].length : 0
|
|
90
|
-
|
|
91
|
-
const {
|
|
92
|
-
imports,
|
|
93
|
-
types,
|
|
94
|
-
scope,
|
|
95
|
-
propsShapes,
|
|
96
|
-
diagnostics,
|
|
97
|
-
importedReactives,
|
|
98
|
-
propsLocalName,
|
|
99
|
-
watchLocalName,
|
|
100
|
-
pendingCellNames,
|
|
101
|
-
} = analyzeScript(scriptBody, scriptStart, classify)
|
|
102
|
-
/* Built AFTER the script analysis so the `pendingCellNames` set (the `$$cellValuePending`
|
|
103
|
-
cells) can ride onto the builder — the `{#await}` emit reads it to strip a bare
|
|
104
|
-
pending-cell subject's pending `undefined` off its resolved binding (ADR-0047 fidelity). */
|
|
105
|
-
const builder = createBuilder(classify, pendingCellNames)
|
|
106
|
-
builder.raw(shadowPreamble(importedReactives))
|
|
107
|
-
/* Every `computed`/`linked` scope line reads through this: it invokes the seed thunk and
|
|
108
|
-
unwraps a promise/stream to the value a BARE cell read peeks (ADR-0019/0032) — so an async
|
|
109
|
-
`computed(await …)` / stream `computed(src)` type-checks as its resolved value, and a sync
|
|
110
|
-
seed keeps its return type (`Awaited` is identity on a non-thenable). Reserved `$$` name so
|
|
111
|
-
it can never collide with an author binding; `declare`-only, so it carries no runtime. */
|
|
112
|
-
builder.raw(
|
|
113
|
-
'declare function $$cellValue<R>(seed: () => R): R extends AsyncIterable<infer F> ? F : Awaited<R>\n',
|
|
114
|
-
)
|
|
115
|
-
/* The STREAMING sibling (ADR-0042): a no-`await` async `computed`/`linked` cell reads
|
|
116
|
-
`undefined`-while-pending, so its shadow type is the resolved value UNIONED with `undefined` —
|
|
117
|
-
the author must guard it (`?.`/`??`), exactly the runtime. A BLOCKING (`await`) cell uses
|
|
118
|
-
`$$cellValue` above (resolved `T`, never pending — its render region suspends). Selected in
|
|
119
|
-
`scopeLineFor` by the syntactic blocking bit. Unconditional (a named cell can occur with no
|
|
120
|
-
classifier), matching `$$cellValue`. */
|
|
121
|
-
builder.raw(
|
|
122
|
-
'declare function $$cellValuePending<R>(seed: () => R): (R extends AsyncIterable<infer F> ? F : Awaited<R>) | undefined\n',
|
|
123
|
-
)
|
|
124
|
-
/* `{#await <pendingCell>}` awaits the CELL (ADR-0047 `$$awaitSubject`) — it shows pending then
|
|
125
|
-
binds the RESOLVED value, never the pending `undefined`. So a bare pending-cell subject's
|
|
126
|
-
resolved/`:then` binding must drop the `| undefined` the `$$cellValuePending` peek carries;
|
|
127
|
-
`$$awaitCell` strips exactly `undefined` (`Exclude`, so a genuine `null` in the value survives).
|
|
128
|
-
Emitted only when a pending cell exists (else the `{#await}` emit never references it). */
|
|
129
|
-
if (pendingCellNames.size > 0) {
|
|
130
|
-
builder.raw('declare function $$awaitCell<V>(v: V): Exclude<V, undefined>\n')
|
|
131
|
-
}
|
|
132
|
-
/* The peek helpers the async-interpolation wrap targets (ADR-0032): `$$peek` unwraps a promise
|
|
133
|
-
sub-expression to its resolved value (`undefined` while pending) and `$$peekStream` reads an
|
|
134
|
-
async iterable's latest frame, so `getFoo()?.name`/`{#if getFoo()}` type-check against the
|
|
135
|
-
RESOLVED value the runtime peeks — not the raw `Promise`. Emitted only when a classifier is
|
|
136
|
-
present (the wrap is type-directed); their names carry the reserved `$$` prefix an author
|
|
137
|
-
binding can never take, so they cannot collide with user code. */
|
|
138
|
-
if (classify !== undefined) {
|
|
139
|
-
builder.raw('declare function $$peek<T>(v: T): Awaited<T> | undefined\n')
|
|
140
|
-
builder.raw(
|
|
141
|
-
'declare function $$peekStream<S>(v: S): (S extends AsyncIterable<infer F> ? F : unknown) | undefined\n',
|
|
142
|
-
)
|
|
143
|
-
}
|
|
144
|
-
/* `props` is a required import (`abide/ui/props`). The shadow owns its type so the
|
|
145
|
-
return is file-contextual — the route param shape (page/layout) or `Record<string,
|
|
146
|
-
any>` (component), intersected with the author's annotation `T` so declared props
|
|
147
|
-
(notably `children: Snippet`) are ADDITIVE and route params never need re-spelling.
|
|
148
|
-
Emitted only when imported: a missing import surfaces as "Cannot find name 'props'"
|
|
149
|
-
(or the author's local alias), so `abide check` flags it. Declared under the LOCAL
|
|
150
|
-
binding name (alias-safe, like `state`/`effect`) — a `props as p` import must get a
|
|
151
|
-
`p` declare, or `p()` reads as undefined once the import below is stripped. */
|
|
152
|
-
if (propsLocalName !== undefined) {
|
|
153
|
-
builder.raw(`declare function ${propsLocalName}<T = {}>(): (${propsType}) & T\n`)
|
|
154
|
-
}
|
|
155
|
-
/* `watch` is re-typed with a trailing value-source overload: the real overloads
|
|
156
|
-
(`State`/socket/rpc/thunk) intersected with `<T>(source: T, handler: (value: T) => void)`.
|
|
157
|
-
A `watch(cell, handler)` source is projected to the cell's VALUE type (like every read),
|
|
158
|
-
so it never matches the real `State<T>` overload — the value-source form catches it and
|
|
159
|
-
types `handler`'s parameter as that value. Ordered after the real overloads (intersection
|
|
160
|
-
left-to-right), so a socket/rpc source still resolves to its specific frame/return type.
|
|
161
|
-
The real type is referenced through `typeof import(...)` (no value import to keep live), and
|
|
162
|
-
the binding uses the author's local alias — or the `watch` fallback for a bare/nested use
|
|
163
|
-
that isn't author-imported. */
|
|
164
|
-
const watchSpecifier = `${ABIDE_PACKAGE_NAME}/ui/watch`
|
|
165
|
-
builder.raw(
|
|
166
|
-
`declare const ${watchLocalName ?? 'watch'}: typeof import('${watchSpecifier}').watch & (<__WatchT>(source: __WatchT, handler: (value: __WatchT) => void) => () => void)\n`,
|
|
167
|
-
)
|
|
168
|
-
const propsSpecifier = `${ABIDE_PACKAGE_NAME}/ui/props`
|
|
169
|
-
for (const line of imports) {
|
|
170
|
-
/* The `props`/`watch` imports are replaced by the contextual declarations above;
|
|
171
|
-
emitting one too would be a duplicate-identifier error. Matched by EXACT specifier
|
|
172
|
-
(either quote style, not a loose suffix match) so an unrelated user module merely
|
|
173
|
-
named `.../ui/props` (or `.../ui/watch`) survives verbatim. */
|
|
174
|
-
if (
|
|
175
|
-
line.text.includes(`from '${propsSpecifier}'`) ||
|
|
176
|
-
line.text.includes(`from "${propsSpecifier}"`) ||
|
|
177
|
-
line.text.includes(`from '${watchSpecifier}'`) ||
|
|
178
|
-
line.text.includes(`from "${watchSpecifier}"`)
|
|
179
|
-
) {
|
|
180
|
-
continue
|
|
181
|
-
}
|
|
182
|
-
builder.flush(line)
|
|
183
|
-
}
|
|
184
|
-
/* Component-local `type`/`interface` declarations are hoisted to module scope —
|
|
185
|
-
above `__Props` so prop annotations referencing them resolve, and still visible
|
|
186
|
-
inside the function body where the rest of the scope and template expressions use
|
|
187
|
-
them. (Emitting them as in-function scope lines would hide them from `__Props`.) */
|
|
188
|
-
for (const line of types) {
|
|
189
|
-
builder.flush(line)
|
|
190
|
-
}
|
|
191
|
-
/* The author's scope (value consts, functions, reactive projections, the `props()`
|
|
192
|
-
destructure) is hoisted to module scope — above `__Props` — for the same reason the
|
|
193
|
-
types are: a prop annotation can then reference a value const by `typeof`
|
|
194
|
-
(`size: keyof typeof sizes`), which fails when the const sits in the function body and
|
|
195
|
-
`__Props` at module scope can't see it. Narrowing is unaffected: a template's guard and
|
|
196
|
-
read are both in the render function below, so control-flow narrowing flows regardless
|
|
197
|
-
of where the binding is declared, and reactive projections are never rebound (writes go
|
|
198
|
-
through `.value`), so they narrow like consts even into nested handlers. */
|
|
199
|
-
for (const line of scope) {
|
|
200
|
-
builder.flush(line)
|
|
201
|
-
}
|
|
202
|
-
/* `__Props` is the parent-facing prop shape: each `props<Shape>()` destructure
|
|
203
|
-
contributes its whole `Shape` (intersected if there's more than one), or an empty
|
|
204
|
-
object for a component that reads no props. */
|
|
205
|
-
builder.raw(
|
|
206
|
-
propsShapes.length > 0
|
|
207
|
-
? `type __Props = ${propsShapes.join(' & ')}\n`
|
|
208
|
-
: `interface __Props {}\n`,
|
|
209
|
-
)
|
|
210
|
-
/* `__props` (not `props`) so the destructuring `props()` sugar resolves to the
|
|
211
|
-
declared function, not this parameter. async so `await` blocks are legal; never
|
|
212
|
-
executed, so the return is void. */
|
|
213
|
-
builder.raw('export default async function (__props: __Props): Promise<void> {\n')
|
|
214
|
-
/* Reference props so an all-optional bag with no reads doesn't read as unused. */
|
|
215
|
-
builder.raw('void __props;\n')
|
|
216
|
-
const templateNodes = parseTemplate(source.slice(templateStart), templateStart).nodes
|
|
217
|
-
/* Nested `<script>` blocks inline into the synchronous `build()` too, so a top-level
|
|
218
|
-
await in one is the same build-breaker — flag it, mapped via the node's body offset. */
|
|
219
|
-
collectNestedScriptAwaitDiagnostics(templateNodes, diagnostics)
|
|
220
|
-
/* Emit the DOM-typed attachment aliases only when an element `attach` uses them: they
|
|
221
|
-
reference `HTMLElementTagNameMap`/`Element`, so a template with no element attach never
|
|
222
|
-
forces DOM lib into its shadow. `__ElementFor` maps a tag to its element interface
|
|
223
|
-
(HTML-first; unknown/custom tags fall back to `Element`); `__Attachment` sources its
|
|
224
|
-
return type from the real `attach` runtime signature so it never drifts. */
|
|
225
|
-
if (hasElementAttach(templateNodes)) {
|
|
226
|
-
builder.raw(
|
|
227
|
-
'type __ElementFor<T extends string> = T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : T extends keyof SVGElementTagNameMap ? SVGElementTagNameMap[T] : T extends keyof MathMLElementTagNameMap ? MathMLElementTagNameMap[T] : Element;\n',
|
|
228
|
-
)
|
|
229
|
-
builder.raw(
|
|
230
|
-
`type __Attachment<E extends Element> = (node: E) => ReturnType<Parameters<typeof import('${ABIDE_PACKAGE_NAME}/ui/dom/attach').attach>[1]>;\n`,
|
|
231
|
-
)
|
|
232
|
-
}
|
|
233
|
-
emitNodes(templateNodes, builder)
|
|
234
|
-
builder.raw('}\n')
|
|
235
|
-
return { ...builder.result(), diagnostics }
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/* The shadow text builder: `raw` appends synthesised scaffolding (no mapping),
|
|
239
|
-
`expr` appends an inline parenthesised source span `(code)` and records its
|
|
240
|
-
segment, `stmt` wraps one as a standalone statement, `flush` appends a
|
|
241
|
-
pre-assembled scope line carrying its own embedded segments. */
|
|
242
|
-
type Builder = {
|
|
243
|
-
raw: (text: string) => void
|
|
244
|
-
/* Appends `text` verbatim and maps it back to source, WITHOUT the `expr`
|
|
245
|
-
parens — for binding names and other spans that must stay bare TS syntax
|
|
246
|
-
(`for (const NAME of …)`). `text` must equal the source at `sourceLoc`. */
|
|
247
|
-
mapped: (text: string, sourceLoc: number | undefined) => void
|
|
248
|
-
expr: (code: string, sourceLoc: number | undefined) => void
|
|
249
|
-
stmt: (code: string, sourceLoc: number | undefined) => void
|
|
250
|
-
/* Like `expr`/`stmt` but for a template interpolation: async (sub)expressions are wrapped in a
|
|
251
|
-
peek helper (`$$peek`/`$$peekStream`) so their RESOLVED type composes (ADR-0032). Every source
|
|
252
|
-
span still maps 1:1 — the inserted wrapper chars are unmapped — so diagnostics land precisely.
|
|
253
|
-
With no classifier (or no async sub-expression) these are byte-identical to `expr`/`stmt`. */
|
|
254
|
-
asyncExpr: (code: string, sourceLoc: number | undefined, position: LiftPosition) => void
|
|
255
|
-
asyncStmt: (code: string, sourceLoc: number | undefined, position: LiftPosition) => void
|
|
256
|
-
flush: (line: ScopeLine) => void
|
|
257
|
-
/* A fresh shadow-local binding name (`__<base>_<n>`) — for synthesised bindings
|
|
258
|
-
like an await's resolved value, kept distinct so nested blocks never collide. */
|
|
259
|
-
unique: (base: string) => string
|
|
260
|
-
/* The `$$cellValuePending` (STREAMING) cells declared in the leading script — a bare
|
|
261
|
-
`{#await <name>}` over one strips the pending `undefined` off its resolved binding. */
|
|
262
|
-
pendingCellNames: ReadonlySet<string>
|
|
263
|
-
result: () => CompiledShadow
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/* A reconstructed scope statement plus the segments embedded inside it (the parts
|
|
267
|
-
emitted verbatim from the original script), offset-relative to the line start. */
|
|
268
|
-
type ScopeLine = { text: string; segments: ShadowMapping[] }
|
|
269
|
-
|
|
270
|
-
function createBuilder(
|
|
271
|
-
classify?: InterpolationClassifier,
|
|
272
|
-
pendingCellNames: ReadonlySet<string> = new Set(),
|
|
273
|
-
): Builder {
|
|
274
|
-
let code = ''
|
|
275
|
-
let uniqueCounter = 0
|
|
276
|
-
const mappings: ShadowMapping[] = []
|
|
277
|
-
/* The non-blocking async (sub)expression spans in one interpolation — the peek-wrap targets.
|
|
278
|
-
A leading `await` (blocking) stays verbatim: `await X` already resolves in the async shadow
|
|
279
|
-
render fn. Fail-open: no classifier, an unparseable field, or the D4a `AsyncIterable`-in-`each`
|
|
280
|
-
throw all yield no spans, so the emit is verbatim (`collectValuePositionDiagnostics` still
|
|
281
|
-
reports the D4a error separately). */
|
|
282
|
-
const peekSpans = (exprCode: string, sourceLoc: number, position: LiftPosition) => {
|
|
283
|
-
if (classify === undefined) {
|
|
284
|
-
return []
|
|
285
|
-
}
|
|
286
|
-
try {
|
|
287
|
-
let counter = 0
|
|
288
|
-
const result = liftAsyncSubExpressions(
|
|
289
|
-
exprCode,
|
|
290
|
-
sourceLoc,
|
|
291
|
-
classify,
|
|
292
|
-
() => `__v${counter++}`,
|
|
293
|
-
position,
|
|
294
|
-
)
|
|
295
|
-
return result.spans.filter((span) => !span.blocking)
|
|
296
|
-
} catch {
|
|
297
|
-
return []
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
/* Appends `exprCode` mapped 1:1 to source, but wraps each async span in its peek helper — the
|
|
301
|
-
wrapper chars are unmapped, every original char keeps its true source offset. */
|
|
302
|
-
const emitPeeked = (exprCode: string, sourceLoc: number, position: LiftPosition): void => {
|
|
303
|
-
const spans = peekSpans(exprCode, sourceLoc, position)
|
|
304
|
-
if (spans.length === 0) {
|
|
305
|
-
builder.mapped(exprCode, sourceLoc)
|
|
306
|
-
return
|
|
307
|
-
}
|
|
308
|
-
let cursor = 0
|
|
309
|
-
for (const span of spans) {
|
|
310
|
-
if (span.start > cursor) {
|
|
311
|
-
builder.mapped(exprCode.slice(cursor, span.start), sourceLoc + cursor)
|
|
312
|
-
}
|
|
313
|
-
builder.raw(span.kind === 'asyncIterable' ? '$$peekStream(' : '$$peek(')
|
|
314
|
-
builder.mapped(exprCode.slice(span.start, span.end), sourceLoc + span.start)
|
|
315
|
-
builder.raw(')')
|
|
316
|
-
cursor = span.end
|
|
317
|
-
}
|
|
318
|
-
if (cursor < exprCode.length) {
|
|
319
|
-
builder.mapped(exprCode.slice(cursor), sourceLoc + cursor)
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
const builder: Builder = {
|
|
323
|
-
pendingCellNames,
|
|
324
|
-
unique(base) {
|
|
325
|
-
return `__${base}_${uniqueCounter++}`
|
|
326
|
-
},
|
|
327
|
-
raw(text) {
|
|
328
|
-
code += text
|
|
329
|
-
},
|
|
330
|
-
mapped(text, sourceLoc) {
|
|
331
|
-
if (sourceLoc !== undefined) {
|
|
332
|
-
mappings.push({
|
|
333
|
-
shadowStart: code.length,
|
|
334
|
-
sourceStart: sourceLoc,
|
|
335
|
-
length: text.length,
|
|
336
|
-
})
|
|
337
|
-
}
|
|
338
|
-
code += text
|
|
339
|
-
},
|
|
340
|
-
expr(exprCode, sourceLoc) {
|
|
341
|
-
code += '('
|
|
342
|
-
if (sourceLoc !== undefined) {
|
|
343
|
-
mappings.push({
|
|
344
|
-
shadowStart: code.length,
|
|
345
|
-
sourceStart: sourceLoc,
|
|
346
|
-
length: exprCode.length,
|
|
347
|
-
})
|
|
348
|
-
}
|
|
349
|
-
code += `${exprCode})`
|
|
350
|
-
},
|
|
351
|
-
stmt(exprCode, sourceLoc) {
|
|
352
|
-
code += ';'
|
|
353
|
-
builder.expr(exprCode, sourceLoc)
|
|
354
|
-
code += ';\n'
|
|
355
|
-
},
|
|
356
|
-
asyncExpr(exprCode, sourceLoc, position) {
|
|
357
|
-
/* No source offset ⇒ can't map or classify — emit verbatim, like `expr`. */
|
|
358
|
-
if (sourceLoc === undefined) {
|
|
359
|
-
code += `(${exprCode})`
|
|
360
|
-
return
|
|
361
|
-
}
|
|
362
|
-
code += '('
|
|
363
|
-
emitPeeked(exprCode, sourceLoc, position)
|
|
364
|
-
code += ')'
|
|
365
|
-
},
|
|
366
|
-
asyncStmt(exprCode, sourceLoc, position) {
|
|
367
|
-
code += ';'
|
|
368
|
-
builder.asyncExpr(exprCode, sourceLoc, position)
|
|
369
|
-
code += ';\n'
|
|
370
|
-
},
|
|
371
|
-
flush(line) {
|
|
372
|
-
const base = code.length
|
|
373
|
-
for (const segment of line.segments) {
|
|
374
|
-
mappings.push({ ...segment, shadowStart: base + segment.shadowStart })
|
|
375
|
-
}
|
|
376
|
-
code += `${line.text}\n`
|
|
377
|
-
},
|
|
378
|
-
result: () => ({ code, mappings }),
|
|
379
|
-
}
|
|
380
|
-
return builder
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
type ScriptAnalysis = {
|
|
384
|
-
imports: ScopeLine[]
|
|
385
|
-
types: ScopeLine[]
|
|
386
|
-
scope: ScopeLine[]
|
|
387
|
-
propsShapes: string[]
|
|
388
|
-
diagnostics: ShadowDiagnostic[]
|
|
389
|
-
/* The reactive primitives the author imports (`state`/`effect`), so the preamble
|
|
390
|
-
omits the ambient fallback for each and avoids a duplicate-identifier error. */
|
|
391
|
-
importedReactives: Set<string>
|
|
392
|
-
/* The LOCAL binding name the author's `props` import is bound to (alias-safe — `props`
|
|
393
|
-
for the canonical import, `p` for `props as p`), or undefined when not imported. The
|
|
394
|
-
`declare function` for `props` must target this name, not the canonical `'props'`. */
|
|
395
|
-
propsLocalName: string | undefined
|
|
396
|
-
/* The LOCAL binding name the author's `watch` import is bound to (alias-safe), or undefined
|
|
397
|
-
when not imported. The shadow re-types `watch` under this name with a value-source
|
|
398
|
-
overload so the `watch(cell, handler)` form type-checks (the cell is projected to its
|
|
399
|
-
value, so the real State/socket/rpc overloads never match it). */
|
|
400
|
-
watchLocalName: string | undefined
|
|
401
|
-
/* The STREAMING (`$$cellValuePending`) cell names — a bare `{#await <name>}` over one awaits
|
|
402
|
-
the cell and strips its pending `undefined` for the resolved binding (ADR-0047). */
|
|
403
|
-
pendingCellNames: Set<string>
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
/* Pushes a diagnostic for every author binding whose name starts with the reserved `$$`
|
|
407
|
-
prefix — variable/function/class declarations, parameters, and destructuring leaves.
|
|
408
|
-
Read structurally off the parsed script; the message points at the offending name. */
|
|
409
|
-
function collectReservedNameDiagnostics(
|
|
410
|
-
file: ts.SourceFile,
|
|
411
|
-
scriptStart: number,
|
|
412
|
-
diagnostics: ShadowDiagnostic[],
|
|
413
|
-
): void {
|
|
414
|
-
const flag = (name: ts.Node | undefined): void => {
|
|
415
|
-
if (name !== undefined && ts.isIdentifier(name) && name.text.startsWith('$$')) {
|
|
416
|
-
diagnostics.push({
|
|
417
|
-
start: scriptStart + name.getStart(file),
|
|
418
|
-
length: name.getEnd() - name.getStart(file),
|
|
419
|
-
message: `\`${name.text}\` is reserved — the \`$$\` prefix is the compiler's injected runtime namespace; rename this binding.`,
|
|
420
|
-
})
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
const visit = (node: ts.Node): void => {
|
|
424
|
-
if (
|
|
425
|
-
ts.isVariableDeclaration(node) ||
|
|
426
|
-
ts.isFunctionDeclaration(node) ||
|
|
427
|
-
ts.isClassDeclaration(node) ||
|
|
428
|
-
ts.isParameter(node) ||
|
|
429
|
-
ts.isBindingElement(node)
|
|
430
|
-
) {
|
|
431
|
-
flag(node.name)
|
|
432
|
-
}
|
|
433
|
-
ts.forEachChild(node, visit)
|
|
434
|
-
}
|
|
435
|
-
visit(file)
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
/* Pushes a diagnostic for every `await` sitting at the script's top level — outside any
|
|
439
|
-
nested function. The generated `build()` runs the leading script synchronously, so a
|
|
440
|
-
top-level await transpiles to `await` in a non-async function and breaks the bundle; the
|
|
441
|
-
shadow's render fn is async, so `tsc` alone never flags it (a check/runtime parity gap).
|
|
442
|
-
Stops descending at function boundaries — their own async-ness is the author's concern —
|
|
443
|
-
and catches both `await expr` and `for await (… of …)`, flagging the `await` keyword. A
|
|
444
|
-
`computed`/`linked` SEED argument is exempt: `wrapSeed` (desugarSignals) lowers a top-level
|
|
445
|
-
`await` there into an async thunk (`computed(await load())` → `async () => await load()`), so
|
|
446
|
-
its await runs off the sync build — flagging it would be a false positive. */
|
|
447
|
-
function collectTopLevelAwaitDiagnostics(
|
|
448
|
-
file: ts.SourceFile,
|
|
449
|
-
scriptStart: number,
|
|
450
|
-
diagnostics: ShadowDiagnostic[],
|
|
451
|
-
bindings: ReactiveImportBindings,
|
|
452
|
-
): void {
|
|
453
|
-
const message =
|
|
454
|
-
'top-level `await` is not allowed in a `<script>` — the component build runs synchronously. Use `{#await expr}…{:then value}…{/await}` markup for blocking data, or `await` inside an async event handler.'
|
|
455
|
-
const visit = (node: ts.Node): void => {
|
|
456
|
-
/* A nested function introduces its own (possibly async) scope; its awaits are legal. */
|
|
457
|
-
if (isFunctionScopeBoundary(node)) {
|
|
458
|
-
return
|
|
459
|
-
}
|
|
460
|
-
/* A `computed`/`linked` seed becomes an async thunk (`wrapSeed`), so an await in it is
|
|
461
|
-
legal — visit the callee and any trailing args, but skip the seed (`arguments[0]`). */
|
|
462
|
-
if (ts.isCallExpression(node) && node.arguments.length > 0) {
|
|
463
|
-
const callee = resolveReactiveExport(node.expression, bindings)
|
|
464
|
-
if (callee === 'computed' || callee === 'linked') {
|
|
465
|
-
visit(node.expression)
|
|
466
|
-
for (let index = 1; index < node.arguments.length; index++) {
|
|
467
|
-
const argument = node.arguments[index]
|
|
468
|
-
if (argument !== undefined) {
|
|
469
|
-
visit(argument)
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
return
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
/* The `await` keyword token: the AwaitExpression's first child, or a `for await`'s
|
|
476
|
-
await modifier. */
|
|
477
|
-
const keyword = ts.isAwaitExpression(node)
|
|
478
|
-
? node.getChildAt(0, file)
|
|
479
|
-
: ts.isForOfStatement(node)
|
|
480
|
-
? node.awaitModifier
|
|
481
|
-
: undefined
|
|
482
|
-
if (keyword !== undefined) {
|
|
483
|
-
diagnostics.push({
|
|
484
|
-
start: scriptStart + keyword.getStart(file),
|
|
485
|
-
length: keyword.getEnd() - keyword.getStart(file),
|
|
486
|
-
message,
|
|
487
|
-
})
|
|
488
|
-
}
|
|
489
|
-
ts.forEachChild(node, visit)
|
|
490
|
-
}
|
|
491
|
-
visit(file)
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
/* Recursively visits every nested `<script>` in the template and flags a top-level await in
|
|
495
|
-
its body — the same trap as the leading script (it inlines into the sync `build()`), mapped
|
|
496
|
-
through the node's body offset (`loc`). Walks `children` on every node kind that carries
|
|
497
|
-
them, so a script buried in an `{#if}`/`{#for}`/`{#await}` branch is still reached. */
|
|
498
|
-
function collectNestedScriptAwaitDiagnostics(
|
|
499
|
-
nodes: TemplateNode[],
|
|
500
|
-
diagnostics: ShadowDiagnostic[],
|
|
501
|
-
): void {
|
|
502
|
-
for (const node of nodes) {
|
|
503
|
-
if (node === undefined) {
|
|
504
|
-
continue
|
|
505
|
-
}
|
|
506
|
-
if (node.kind === 'script' && node.loc !== undefined) {
|
|
507
|
-
const file = ts.createSourceFile('nested.ts', node.code, ts.ScriptTarget.Latest, true)
|
|
508
|
-
/* A nested script inherits the surface by canonical name (no imports of its own). */
|
|
509
|
-
collectTopLevelAwaitDiagnostics(file, node.loc, diagnostics, NESTED_REACTIVE_BINDINGS)
|
|
510
|
-
}
|
|
511
|
-
if ('children' in node) {
|
|
512
|
-
collectNestedScriptAwaitDiagnostics(node.children, diagnostics)
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
/* Walks the leading `<script>` and produces the shadow's module imports, the
|
|
518
|
-
module-scope type declarations, the value-typed scope lines, and the `props<Shape>()`
|
|
519
|
-
prop shapes. `scriptStart` is the body's absolute offset in the source, so verbatim
|
|
520
|
-
spans map back exactly. */
|
|
521
|
-
function analyzeScript(
|
|
522
|
-
scriptBody: string,
|
|
523
|
-
scriptStart: number,
|
|
524
|
-
classify?: InterpolationClassifier,
|
|
525
|
-
): ScriptAnalysis {
|
|
526
|
-
const imports: ScopeLine[] = []
|
|
527
|
-
const types: ScopeLine[] = []
|
|
528
|
-
const scope: ScopeLine[] = []
|
|
529
|
-
const propsShapes: string[] = []
|
|
530
|
-
const diagnostics: ShadowDiagnostic[] = []
|
|
531
|
-
const pendingCellNames = new Set<string>()
|
|
532
|
-
if (scriptBody.trim() === '') {
|
|
533
|
-
return {
|
|
534
|
-
imports,
|
|
535
|
-
types,
|
|
536
|
-
scope,
|
|
537
|
-
propsShapes,
|
|
538
|
-
diagnostics,
|
|
539
|
-
importedReactives: new Set(),
|
|
540
|
-
propsLocalName: undefined,
|
|
541
|
-
watchLocalName: undefined,
|
|
542
|
-
pendingCellNames,
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
const file = ts.createSourceFile('script.ts', scriptBody, ts.ScriptTarget.Latest, true)
|
|
546
|
-
/* The author's reactive import bindings (alias-safe) — recognition source for
|
|
547
|
-
`state`/`state.linked`/`state.computed`/`effect`, and the set of imported primitives
|
|
548
|
-
the preamble omits its ambient fallback for. */
|
|
549
|
-
const bindings = reactiveImportBindings(file)
|
|
550
|
-
const importedReactives = new Set(bindings.direct.values())
|
|
551
|
-
/* The local name bound to `props` (alias-safe): the key whose value is the canonical
|
|
552
|
-
`'props'`. At most one — a file imports `props` from one specifier. */
|
|
553
|
-
let propsLocalName: string | undefined
|
|
554
|
-
let watchLocalName: string | undefined
|
|
555
|
-
for (const [local, canonical] of bindings.direct) {
|
|
556
|
-
if (canonical === 'props') {
|
|
557
|
-
propsLocalName = local
|
|
558
|
-
}
|
|
559
|
-
if (canonical === 'watch') {
|
|
560
|
-
watchLocalName = local
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
/* The `$$` prefix is reserved for the compiler's injected runtime (`$$each`, `$$model`,
|
|
564
|
-
`$$scope`, …), so an author binding may not start with it — that's the contract that
|
|
565
|
-
lets a user freely name a variable after any helper. Flag every such declaration. */
|
|
566
|
-
collectReservedNameDiagnostics(file, scriptStart, diagnostics)
|
|
567
|
-
/* The leading script runs in the synchronous `build()`, so a top-level await breaks the
|
|
568
|
-
bundle — catch it here with a legible message instead of an opaque transpile error. */
|
|
569
|
-
collectTopLevelAwaitDiagnostics(file, scriptStart, diagnostics, bindings)
|
|
570
|
-
/* A verbatim span: original text + the segment mapping it back, relative to the
|
|
571
|
-
line start (the caller rebases shadowStart onto the running shadow length). */
|
|
572
|
-
const span = (node: ts.Node, prefixLength: number): ScopeLine['segments'][number] => ({
|
|
573
|
-
shadowStart: prefixLength,
|
|
574
|
-
sourceStart: scriptStart + node.getStart(file),
|
|
575
|
-
length: node.getEnd() - node.getStart(file),
|
|
576
|
-
})
|
|
577
|
-
const verbatim = (node: ts.Node): string => scriptBody.slice(node.getStart(file), node.getEnd())
|
|
578
|
-
|
|
579
|
-
for (const statement of file.statements) {
|
|
580
|
-
if (ts.isImportDeclaration(statement)) {
|
|
581
|
-
/* Emit verbatim with a span so hover/go-to resolve on the imported names.
|
|
582
|
-
`abide/ui/state` / `abide/ui/effect` are ordinary author imports now — the
|
|
583
|
-
preamble drops its ambient fallback for whichever names are imported. */
|
|
584
|
-
imports.push({ text: verbatim(statement), segments: [span(statement, 0)] })
|
|
585
|
-
continue
|
|
586
|
-
}
|
|
587
|
-
if (ts.isTypeAliasDeclaration(statement) || ts.isInterfaceDeclaration(statement)) {
|
|
588
|
-
/* Hoist to module scope (verbatim, mapped) so prop annotations resolve them. */
|
|
589
|
-
types.push({ text: verbatim(statement), segments: [span(statement, 0)] })
|
|
590
|
-
continue
|
|
591
|
-
}
|
|
592
|
-
const reactive = reactiveDeclarations(statement, bindings)
|
|
593
|
-
if (reactive === undefined) {
|
|
594
|
-
/* Plain statement (function, const, expression) — emit verbatim, mapped. */
|
|
595
|
-
scope.push({ text: verbatim(statement), segments: [span(statement, 0)] })
|
|
596
|
-
continue
|
|
597
|
-
}
|
|
598
|
-
for (const declaration of reactive) {
|
|
599
|
-
scope.push(
|
|
600
|
-
scopeLineFor(
|
|
601
|
-
declaration,
|
|
602
|
-
propsShapes,
|
|
603
|
-
verbatim,
|
|
604
|
-
span,
|
|
605
|
-
bindings,
|
|
606
|
-
classify,
|
|
607
|
-
pendingCellNames,
|
|
608
|
-
),
|
|
609
|
-
)
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
return {
|
|
613
|
-
imports,
|
|
614
|
-
types,
|
|
615
|
-
scope,
|
|
616
|
-
propsShapes,
|
|
617
|
-
diagnostics,
|
|
618
|
-
importedReactives,
|
|
619
|
-
propsLocalName,
|
|
620
|
-
watchLocalName,
|
|
621
|
-
pendingCellNames,
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
/* Value-projects a nested control-flow `<script>` body the way `analyzeScript`
|
|
626
|
-
projects the leading script's scope: reactive declarations become their value
|
|
627
|
-
type, every other statement stays verbatim. Returns the projected source text
|
|
628
|
-
(unmapped — nested scripts carry no source offset yet), so a branch's markup
|
|
629
|
-
reads a nested signal as its value type instead of the raw `State`/`Computed`. */
|
|
630
|
-
function projectNestedScript(code: string): string {
|
|
631
|
-
const file = ts.createSourceFile('nested.ts', code, ts.ScriptTarget.Latest, true)
|
|
632
|
-
/* A nested script can't import — it inherits the module-scope surface by canonical name. */
|
|
633
|
-
const bindings = NESTED_REACTIVE_BINDINGS
|
|
634
|
-
const verbatim = (node: ts.Node): string => code.slice(node.getStart(file), node.getEnd())
|
|
635
|
-
/* No mapping: a zero-length segment the caller drops. */
|
|
636
|
-
const span = (): ShadowMapping => ({ shadowStart: 0, sourceStart: 0, length: 0 })
|
|
637
|
-
return file.statements
|
|
638
|
-
.flatMap((statement) => {
|
|
639
|
-
const reactive = reactiveDeclarations(statement, bindings)
|
|
640
|
-
if (reactive === undefined) {
|
|
641
|
-
return [verbatim(statement)]
|
|
642
|
-
}
|
|
643
|
-
return reactive.map(
|
|
644
|
-
(declaration) => scopeLineFor(declaration, [], verbatim, span, bindings).text,
|
|
645
|
-
)
|
|
646
|
-
})
|
|
647
|
-
.join('\n')
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
/* The `state`/`computed`/`linked`/`props()` declarations in a variable statement, or
|
|
651
|
-
undefined if it isn't one declaring them (so the caller emits it verbatim). A statement
|
|
652
|
-
mixing reactive and plain declarations is rare; treated as all-verbatim. */
|
|
653
|
-
function reactiveDeclarations(
|
|
654
|
-
statement: ts.Statement,
|
|
655
|
-
bindings: ReactiveImportBindings,
|
|
656
|
-
): ts.VariableDeclaration[] | undefined {
|
|
657
|
-
if (!ts.isVariableStatement(statement)) {
|
|
658
|
-
return undefined
|
|
659
|
-
}
|
|
660
|
-
const declarations = statement.declarationList.declarations
|
|
661
|
-
const reactive = declarations.filter(
|
|
662
|
-
(declaration) => signalCallee(declaration, bindings) !== undefined,
|
|
663
|
-
)
|
|
664
|
-
return reactive.length === declarations.length && reactive.length > 0 ? reactive : undefined
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
/* Builds one scope line for a reactive declaration, projecting it to its value
|
|
668
|
-
type. A `props()` destructure contributes its whole shape (pushed into `propsShapes`). */
|
|
669
|
-
/* Splits a SEED's source text so each buried async sub-expression is wrapped in its shadow peek
|
|
670
|
-
helper (`$$peek`/`$$peekStream`) — the script-seed twin of the builder's `emitPeeked` (ADR-0032),
|
|
671
|
-
but returning a mapped `{ text, segments }` for a scope line rather than driving the builder. So a
|
|
672
|
-
bare `state.linked(getSession()?.x ?? [])` shadow-types via `$$peek(getSession())?.x ?? []` (the
|
|
673
|
-
RESOLVED value, `?.`/`??` compose) instead of erroring on `Promise.x` — mirroring exactly what the
|
|
674
|
-
`desugarSignals` lift builds. Fail-open: no classifier, a thunk seed (the walk stops at function
|
|
675
|
-
boundaries — matching the build, which also leaves a `() => …` seed unlifted), or an unparseable
|
|
676
|
-
span → the seed emits verbatim as one span. Every original char keeps its true source offset; the
|
|
677
|
-
inserted wrapper chars are unmapped, so diagnostics land precisely. */
|
|
678
|
-
function peekWrappedSeed(
|
|
679
|
-
seedText: string,
|
|
680
|
-
sourceStart: number,
|
|
681
|
-
prefixLength: number,
|
|
682
|
-
classify: InterpolationClassifier | undefined,
|
|
683
|
-
): { text: string; segments: ShadowMapping[] } {
|
|
684
|
-
const verbatimResult = {
|
|
685
|
-
text: seedText,
|
|
686
|
-
segments: [{ shadowStart: prefixLength, sourceStart, length: seedText.length }],
|
|
687
|
-
}
|
|
688
|
-
if (classify === undefined) {
|
|
689
|
-
return verbatimResult
|
|
690
|
-
}
|
|
691
|
-
let spans: LiftSpan[]
|
|
692
|
-
try {
|
|
693
|
-
let counter = 0
|
|
694
|
-
spans = liftAsyncSubExpressions(
|
|
695
|
-
seedText,
|
|
696
|
-
sourceStart,
|
|
697
|
-
classify,
|
|
698
|
-
() => `__v${counter++}`,
|
|
699
|
-
'content',
|
|
700
|
-
).spans.filter((span) => !span.blocking)
|
|
701
|
-
} catch {
|
|
702
|
-
return verbatimResult
|
|
703
|
-
}
|
|
704
|
-
if (spans.length === 0) {
|
|
705
|
-
return verbatimResult
|
|
706
|
-
}
|
|
707
|
-
/* A single span covering the WHOLE seed is the whole-seed case (`computed(getRates())`): the
|
|
708
|
-
`$$cellValue`/`$$cellValuePending` wrapper the caller already applies unwraps it, so peek-
|
|
709
|
-
wrapping it here would double-unwrap (`T` → `T | undefined`). Skip it — only PROPER sub-
|
|
710
|
-
expressions wrap, matching `liftScriptSeed`'s identical whole-seed skip on the build side. */
|
|
711
|
-
const only = spans.length === 1 ? spans[0] : undefined
|
|
712
|
-
if (only !== undefined && seedText.slice(only.start, only.end).trim() === seedText.trim()) {
|
|
713
|
-
return verbatimResult
|
|
714
|
-
}
|
|
715
|
-
let text = ''
|
|
716
|
-
const segments: ShadowMapping[] = []
|
|
717
|
-
const pushMapped = (chunk: string, chunkSource: number): void => {
|
|
718
|
-
segments.push({
|
|
719
|
-
shadowStart: prefixLength + text.length,
|
|
720
|
-
sourceStart: chunkSource,
|
|
721
|
-
length: chunk.length,
|
|
722
|
-
})
|
|
723
|
-
text += chunk
|
|
724
|
-
}
|
|
725
|
-
let cursor = 0
|
|
726
|
-
for (const span of spans) {
|
|
727
|
-
if (span.start > cursor) {
|
|
728
|
-
pushMapped(seedText.slice(cursor, span.start), sourceStart + cursor)
|
|
729
|
-
}
|
|
730
|
-
text += span.kind === 'asyncIterable' ? '$$peekStream(' : '$$peek('
|
|
731
|
-
pushMapped(seedText.slice(span.start, span.end), sourceStart + span.start)
|
|
732
|
-
text += ')'
|
|
733
|
-
cursor = span.end
|
|
734
|
-
}
|
|
735
|
-
if (cursor < seedText.length) {
|
|
736
|
-
pushMapped(seedText.slice(cursor), sourceStart + cursor)
|
|
737
|
-
}
|
|
738
|
-
return { text, segments }
|
|
739
|
-
}
|
|
740
|
-
|
|
741
|
-
function scopeLineFor(
|
|
742
|
-
declaration: ts.VariableDeclaration,
|
|
743
|
-
propsShapes: string[],
|
|
744
|
-
verbatim: (node: ts.Node) => string,
|
|
745
|
-
span: (node: ts.Node, prefixLength: number) => ShadowMapping,
|
|
746
|
-
bindings: ReactiveImportBindings,
|
|
747
|
-
classify?: InterpolationClassifier,
|
|
748
|
-
/* Collects the names that project through `$$cellValuePending` (STREAMING cells) so the
|
|
749
|
-
`{#await}` emit can strip their pending `undefined`. Absent for nested scripts. */
|
|
750
|
-
pendingCellNames?: Set<string>,
|
|
751
|
-
): ScopeLine {
|
|
752
|
-
const name = ts.isIdentifier(declaration.name) ? declaration.name.text : '_'
|
|
753
|
-
const call = declaration.initializer as ts.CallExpression
|
|
754
|
-
/* The CANONICAL primitive drives value-projection — resolved purely from the import
|
|
755
|
-
binding (so an aliased `s(0)` / `state.computed(...)` projects correctly).
|
|
756
|
-
`verbatim(call.expression)` below keeps the AUTHOR's text for the trailing hover ref. */
|
|
757
|
-
const callee = resolveReactiveExport(call.expression, bindings)
|
|
758
|
-
if (callee === 'props') {
|
|
759
|
-
/* The parent-facing prop shape. Like `state`/`computed` below, it comes from the
|
|
760
|
-
generic (`const {…} = props<Shape>()`) OR the destructure's binding annotation
|
|
761
|
-
(`const {…}: Shape = props()`) — either TS-idiomatic form resolves through the
|
|
762
|
-
shadow's own imports, so an imported/aliased type just works, no inline gotcha.
|
|
763
|
-
Default `Record<string, any>`; the destructure then projects verbatim so each
|
|
764
|
-
binding inherits its value type. */
|
|
765
|
-
const shape = call.typeArguments?.[0] ?? declaration.type
|
|
766
|
-
propsShapes.push(shape === undefined ? 'Record<string, any>' : verbatim(shape))
|
|
767
|
-
/* `let`, not `const`: a prop the component writes back through a two-way `bind:prop`
|
|
768
|
-
(`value += 1`, or forwarding it to another `bind:`) is a legal reassignment, so the
|
|
769
|
-
destructure must not read as a `const`. Bindability is dynamic (decided by what the
|
|
770
|
-
parent passed), so the shadow can't single out which props are written — it relaxes
|
|
771
|
-
the whole destructure, matching the runtime's usage-inferred upgrade. */
|
|
772
|
-
return { text: `let ${verbatim(declaration)};`, segments: [span(declaration, 4)] }
|
|
773
|
-
}
|
|
774
|
-
/* The rewrite drops the callee from the line, so hovering `state`/`computed`/
|
|
775
|
-
`linked` at its call site has nothing to resolve. Append the callee as a
|
|
776
|
-
trailing reference statement (`…; state;`), mapped back to its source span,
|
|
777
|
-
so it resolves to the same primitive the destructure does. */
|
|
778
|
-
const withCalleeRef = (line: ScopeLine): ScopeLine => ({
|
|
779
|
-
text: `${line.text} ${verbatim(call.expression)};`,
|
|
780
|
-
segments: [...line.segments, span(call.expression, line.text.length + 1)],
|
|
781
|
-
})
|
|
782
|
-
if (callee === 'state') {
|
|
783
|
-
/* state<T>(initial): T is the value type — carry it onto the `let` so an
|
|
784
|
-
explicit annotation isn't lost to `any`/`any[]` inference of the initial. The
|
|
785
|
-
type comes from the generic (`state<T>(v)`), else the binding annotation
|
|
786
|
-
(`let x: T = state(v)`) — either form pins the cell type, so a narrow/`any`
|
|
787
|
-
inference of the initial (`state([])` → `any[]`) can't leak. */
|
|
788
|
-
const typeNode = call.typeArguments?.[0] ?? declaration.type
|
|
789
|
-
const annotation = typeNode === undefined ? '' : `: ${verbatim(typeNode)}`
|
|
790
|
-
const init = call.arguments[0]
|
|
791
|
-
/* A literal `undefined` initial is the no-arg form spelled out (`state<T>(undefined)`):
|
|
792
|
-
the value is `T | undefined`, never `= (undefined)` checked against a non-optional
|
|
793
|
-
`T` — which would spuriously flag "undefined not assignable to T". */
|
|
794
|
-
const initIsUndefined =
|
|
795
|
-
init !== undefined && ts.isIdentifier(init) && init.text === 'undefined'
|
|
796
|
-
if (init === undefined || initIsUndefined) {
|
|
797
|
-
/* No initial (`state<T>()` / `state<T>(undefined)`): the value is `T | undefined`.
|
|
798
|
-
A definite-assignment assertion (`!`) gives that union without a use-before-
|
|
799
|
-
assign false-positive AND without control-flow narrowing it to just `undefined`
|
|
800
|
-
(an `= undefined` initializer, never reassigned in the shadow, would make
|
|
801
|
-
a guard like `x !== undefined` collapse to `never`). Unguarded access is
|
|
802
|
-
then correctly flagged possibly-undefined; a guard narrows cleanly. */
|
|
803
|
-
const valueType = annotation === '' ? ': unknown' : `${annotation} | undefined`
|
|
804
|
-
/* map the binding name (offset 4, past `let `) so hover/go-to resolve on it */
|
|
805
|
-
return withCalleeRef({
|
|
806
|
-
text: `let ${name}!${valueType};`,
|
|
807
|
-
segments: [span(declaration.name, 4)],
|
|
808
|
-
})
|
|
809
|
-
}
|
|
810
|
-
const prefix = `let ${name}${annotation} = (`
|
|
811
|
-
/* Peek-wrap a buried async sub-expression in the initial too (the `desugarSignals` lift
|
|
812
|
-
runs on `state` seeds), so `state(getSession()?.x ?? [])` type-checks. */
|
|
813
|
-
const seed = seedPeekWrap(init, verbatim, span, prefix.length, classify)
|
|
814
|
-
return withCalleeRef({
|
|
815
|
-
text: `${prefix}${seed.text});`,
|
|
816
|
-
segments: [span(declaration.name, 4), ...seed.segments],
|
|
817
|
-
})
|
|
818
|
-
}
|
|
819
|
-
/* computed<T>(compute) / linked<T>(seed) — the only callees left: T is the value
|
|
820
|
-
type — the call's first arg is a thunk, so invoking it yields the value. The type
|
|
821
|
-
comes from the generic (`computed<T>(fn)`), else the binding annotation
|
|
822
|
-
(`let x: T = state.computed(fn)`) — same fallback as `state` above, so a binding
|
|
823
|
-
annotation isn't dropped and `abide check` doesn't emit `never`-inference false
|
|
824
|
-
positives on the thunk's return. */
|
|
825
|
-
const typeNode = call.typeArguments?.[0] ?? declaration.type
|
|
826
|
-
const annotation = typeNode === undefined ? '' : `: ${verbatim(typeNode)}`
|
|
827
|
-
const fn = call.arguments[0]
|
|
828
|
-
/* `linked` is a writable `State<T>` at runtime (it reseeds AND accepts `.value =`
|
|
829
|
-
writes), so project it as `let`; `computed` is genuinely read-only, so `const`. */
|
|
830
|
-
const keyword = callee === 'linked' ? 'let' : 'const'
|
|
831
|
-
/* binding-name map offset = past the keyword + space (`let ` = 4, `const ` = 6) */
|
|
832
|
-
const keywordOffset = keyword.length + 1
|
|
833
|
-
if (fn === undefined) {
|
|
834
|
-
return withCalleeRef({
|
|
835
|
-
text: `${keyword} ${name} = undefined;`,
|
|
836
|
-
segments: [span(declaration.name, keywordOffset)],
|
|
837
|
-
})
|
|
838
|
-
}
|
|
839
|
-
/* Mirror `wrapSeed` (desugarSignals): a bare (non-thunk) seed is normalised to `() => (seed)`,
|
|
840
|
-
made ASYNC when it carries a top-level `await` — so `computed(await load())` projects as a
|
|
841
|
-
legal async thunk instead of a raw top-level await (`(await load())()` — a build-breaker that
|
|
842
|
-
also mis-called the resolved value). A literal thunk passes through unchanged. `$$cellValue`
|
|
843
|
-
then invokes it and unwraps a promise/stream to the value a bare read peeks, so an async or
|
|
844
|
-
stream seed types as its RESOLVED value (`Promise<T>` → `T`) rather than the raw promise. */
|
|
845
|
-
const fnIsThunk = ts.isArrowFunction(fn) || ts.isFunctionExpression(fn)
|
|
846
|
-
const wrapPrefix = fnIsThunk ? '' : seedIsAsync(fn) ? 'async () => (' : '() => ('
|
|
847
|
-
const wrapSuffix = fnIsThunk ? '' : ')'
|
|
848
|
-
/* ADR-0042/0043: a STREAMING cell reads `undefined`-while-pending → `$$cellValuePending`
|
|
849
|
-
(resolved `T | undefined`). Two seed shapes stream: a no-`await` async thunk (`async () =>
|
|
850
|
-
x`), and a bare call/identifier whose type resolves to a promise/stream — the latter is what
|
|
851
|
-
desugarSignals routes to `trackedComputed(…, streaming)` (`isPromiseComputed` /
|
|
852
|
-
`isEagerStreamComputed`), so the shadow must agree or a `state.computed(getFoo())` reads as
|
|
853
|
-
non-optional `T` while the runtime peeks `undefined`. A BLOCKING (`await`) cell suspends its
|
|
854
|
-
region so it is always resolved, and a genuinely sync seed is never pending → `$$cellValue`
|
|
855
|
-
(resolved `T`). The bare-seed arm needs the warm classifier; fail-open keeps `$$cellValue`. */
|
|
856
|
-
const streamingSeed =
|
|
857
|
-
(seedIsAsync(fn) && !seedIsBlocking(fn)) || bareSeedStreams(fn, span, verbatim, classify)
|
|
858
|
-
const helper = streamingSeed ? '$$cellValuePending' : '$$cellValue'
|
|
859
|
-
/* Record the pending cell so `{#await <name>}` strips its pending `undefined` (ADR-0047). */
|
|
860
|
-
if (streamingSeed && ts.isIdentifier(declaration.name)) {
|
|
861
|
-
pendingCellNames?.add(name)
|
|
862
|
-
}
|
|
863
|
-
const prefix = `${keyword} ${name}${annotation} = ${helper}(${wrapPrefix}`
|
|
864
|
-
/* Peek-wrap any buried async sub-expression in the seed (ADR-0032, script side) so a bare
|
|
865
|
-
`getSession()?.x ?? []` types as its resolved value — matching the `desugarSignals` lift.
|
|
866
|
-
A whole-seed async call / a thunk seed yields no wrap (verbatim), exactly as the build. */
|
|
867
|
-
const seed = seedPeekWrap(fn, verbatim, span, prefix.length, classify)
|
|
868
|
-
return withCalleeRef({
|
|
869
|
-
text: `${prefix}${seed.text}${wrapSuffix});`,
|
|
870
|
-
segments: [span(declaration.name, keywordOffset), ...seed.segments],
|
|
871
|
-
})
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
/* The seed peek-wrap as a scope line contributes it: a bare CALL or IDENTIFIER seed (the whole-seed
|
|
875
|
-
/ probe case — `getRates()`, `chat.done()`) stays verbatim so the `$$cellValue` wrapper unwraps it
|
|
876
|
-
and no probe receiver is lifted, mirroring `desugarSignals`'s bare-seed skip; every other seed
|
|
877
|
-
descends into `peekWrappedSeed`. */
|
|
878
|
-
function seedPeekWrap(
|
|
879
|
-
seed: ts.Expression,
|
|
880
|
-
verbatim: (node: ts.Node) => string,
|
|
881
|
-
span: (node: ts.Node, prefixLength: number) => ShadowMapping,
|
|
882
|
-
prefixLength: number,
|
|
883
|
-
classify: InterpolationClassifier | undefined,
|
|
884
|
-
): { text: string; segments: ShadowMapping[] } {
|
|
885
|
-
if (ts.isCallExpression(seed) || ts.isIdentifier(seed)) {
|
|
886
|
-
return { text: verbatim(seed), segments: [span(seed, prefixLength)] }
|
|
887
|
-
}
|
|
888
|
-
return peekWrappedSeed(verbatim(seed), span(seed, 0).sourceStart, prefixLength, classify)
|
|
889
|
-
}
|
|
890
|
-
|
|
891
|
-
/* True for a `computed`/`linked` seed that `wrapSeed` (desugarSignals) turns into an ASYNC thunk —
|
|
892
|
-
a thunk the author wrote `async`, or a bare seed carrying a top-level `await` (`computed(await
|
|
893
|
-
x)`). The shadow must agree so it unwraps the promise to the resolved value AND so the top-level
|
|
894
|
-
await scan spares the seed. Stops at function boundaries — an inner `async` callback is its own
|
|
895
|
-
scope, mirroring `hasTopLevelAwait`. */
|
|
896
|
-
function seedIsAsync(seed: ts.Expression): boolean {
|
|
897
|
-
if (ts.isArrowFunction(seed) || ts.isFunctionExpression(seed)) {
|
|
898
|
-
return (
|
|
899
|
-
ts
|
|
900
|
-
.getModifiers(seed)
|
|
901
|
-
?.some((modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword) ?? false
|
|
902
|
-
)
|
|
903
|
-
}
|
|
904
|
-
return hasTopLevelAwait(seed)
|
|
905
|
-
}
|
|
906
|
-
|
|
907
|
-
/* True for a BLOCKING async cell (ADR-0042 D6): an async thunk whose BODY has a top-level `await`
|
|
908
|
-
(`computed(async () => await X)`), or a bare seed carrying a top-level `await` (`computed(await
|
|
909
|
-
X)` — wrapSeed makes it an async thunk over that await). An async thunk with NO await
|
|
910
|
-
(`computed(async () => getFoo())`) is STREAMING, not blocking. Shares `hasTopLevelAwait` with
|
|
911
|
-
desugarSignals' `isBlockingSeed` so the shadow type (`$$cellValue` vs `$$cellValuePending`) agrees
|
|
912
|
-
with the runtime's blocking flag — the "one predicate" ADR-0042 D5 requires. */
|
|
913
|
-
function seedIsBlocking(seed: ts.Expression): boolean {
|
|
914
|
-
if (ts.isArrowFunction(seed) || ts.isFunctionExpression(seed)) {
|
|
915
|
-
return seedIsAsync(seed) && hasTopLevelAwait(seed.body)
|
|
916
|
-
}
|
|
917
|
-
return hasTopLevelAwait(seed)
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
/* True for a bare (non-thunk, no-`await`) call/identifier seed whose checker type resolves to a
|
|
921
|
-
promise or async iterable — the STREAMING cell desugarSignals routes to `trackedComputed(…,
|
|
922
|
-
streaming)` (`isPromiseComputed` / `isEagerStreamComputed`). Such a cell peeks `undefined` while
|
|
923
|
-
pending, so its shadow type must be `$$cellValuePending` (resolved `T | undefined`), matching the
|
|
924
|
-
`async () => x` streaming form. Restricted to a bare CALL/IDENTIFIER seed — the whole-seed shape,
|
|
925
|
-
mirroring desugarSignals' bare-seed routing; a compound seed's buried async sub-expression is
|
|
926
|
-
peek-wrapped separately. Needs the warm classifier — absent (or on a resolution throw) it returns
|
|
927
|
-
false, keeping today's `$$cellValue`. */
|
|
928
|
-
function bareSeedStreams(
|
|
929
|
-
seed: ts.Expression,
|
|
930
|
-
span: (node: ts.Node, prefixLength: number) => ShadowMapping,
|
|
931
|
-
verbatim: (node: ts.Node) => string,
|
|
932
|
-
classify: InterpolationClassifier | undefined,
|
|
933
|
-
): boolean {
|
|
934
|
-
if (classify === undefined || (!ts.isCallExpression(seed) && !ts.isIdentifier(seed))) {
|
|
935
|
-
return false
|
|
936
|
-
}
|
|
937
|
-
try {
|
|
938
|
-
const kind = classify(span(seed, 0).sourceStart, verbatim(seed))
|
|
939
|
-
return kind === 'promise' || kind === 'asyncIterable'
|
|
940
|
-
} catch {
|
|
941
|
-
return false
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
/* Whether any ELEMENT in the tree carries an `attach` — gates emitting the DOM-typed
|
|
946
|
-
attachment aliases. All nested content (block bodies, await/switch branches, snippet
|
|
947
|
-
bodies) routes through `children`, so a recursive `children` walk is complete. */
|
|
948
|
-
function hasElementAttach(nodes: TemplateNode[]): boolean {
|
|
949
|
-
for (const node of nodes) {
|
|
950
|
-
if (node === undefined) {
|
|
951
|
-
continue
|
|
952
|
-
}
|
|
953
|
-
if (node.kind === 'element') {
|
|
954
|
-
for (const attr of node.attrs) {
|
|
955
|
-
if (attr.kind === 'attach') {
|
|
956
|
-
return true
|
|
957
|
-
}
|
|
958
|
-
}
|
|
959
|
-
}
|
|
960
|
-
if ('children' in node && node.children !== undefined && hasElementAttach(node.children)) {
|
|
961
|
-
return true
|
|
962
|
-
}
|
|
963
|
-
}
|
|
964
|
-
return false
|
|
965
|
-
}
|
|
966
|
-
|
|
967
|
-
/* Emits a sibling list — each node standalone via `emitNode`. */
|
|
968
|
-
function emitNodes(nodes: TemplateNode[], builder: Builder): void {
|
|
969
|
-
for (const node of nodes) {
|
|
970
|
-
if (node !== undefined) {
|
|
971
|
-
emitNode(node, builder)
|
|
972
|
-
}
|
|
973
|
-
}
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
/* Emits a template node's expressions into the shadow's render body. Control flow
|
|
977
|
-
introduces its binding so children type-check against it; every expression is
|
|
978
|
-
referenced in a statement so a type error surfaces and maps. */
|
|
979
|
-
function emitNode(node: TemplateNode, builder: Builder): void {
|
|
980
|
-
switch (node.kind) {
|
|
981
|
-
case 'text':
|
|
982
|
-
for (const part of node.parts) {
|
|
983
|
-
if (part.kind === 'expression') {
|
|
984
|
-
builder.asyncStmt(part.code, part.loc, 'content')
|
|
985
|
-
}
|
|
986
|
-
}
|
|
987
|
-
return
|
|
988
|
-
case 'element':
|
|
989
|
-
for (const attr of node.attrs) {
|
|
990
|
-
if (attr.kind === 'attach') {
|
|
991
|
-
/* `attach={code}` types its callback's `node` param from the element's tag
|
|
992
|
-
(via `__ElementFor`) and checks the whole value is an attachment: an inline
|
|
993
|
-
arrow's `node` reads the specific DOM interface, and a non-function value is
|
|
994
|
-
rejected. Same IIFE-parameter contextual-typing trick the component-prop
|
|
995
|
-
path uses; the leading `;` guards an unterminated preceding statement. */
|
|
996
|
-
builder.raw(
|
|
997
|
-
`;((__attach: __Attachment<__ElementFor<${JSON.stringify(node.tag)}>>) => {})(`,
|
|
998
|
-
)
|
|
999
|
-
builder.expr(attr.code, attr.loc)
|
|
1000
|
-
builder.raw(');\n')
|
|
1001
|
-
} else if (attr.kind === 'interpolated') {
|
|
1002
|
-
/* An interpolated value checks each `{expr}` part on its own offset. */
|
|
1003
|
-
for (const part of attr.parts) {
|
|
1004
|
-
if (part.kind === 'expression') {
|
|
1005
|
-
builder.asyncStmt(part.code, part.loc, 'attribute')
|
|
1006
|
-
}
|
|
1007
|
-
}
|
|
1008
|
-
} else if (attr.kind !== 'static') {
|
|
1009
|
-
/* Every other dynamic attribute checks its single `code`. `attrLiftPosition` —
|
|
1010
|
-
the shared gate the runtime front-end lifts through — decides whether the
|
|
1011
|
-
value is async-liftable: only `name={code}` peek-wraps (its promise/stream
|
|
1012
|
-
sub-expressions project to their resolved type), while a directive
|
|
1013
|
-
(`on*`/`bind:`/`class:`/`style:`/`{...}`) checks its code verbatim, matching
|
|
1014
|
-
that the runtime never injects a cell for it. */
|
|
1015
|
-
const position = attrLiftPosition(attr)
|
|
1016
|
-
if (position !== undefined) {
|
|
1017
|
-
builder.asyncStmt(attr.code, attr.loc, position)
|
|
1018
|
-
} else {
|
|
1019
|
-
builder.stmt(attr.code, attr.loc)
|
|
1020
|
-
}
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
emitNodes(node.children, builder)
|
|
1024
|
-
return
|
|
1025
|
-
case 'component': {
|
|
1026
|
-
/* The imported tag resolves (via the shadow host) to the child's
|
|
1027
|
-
`(props: Props) => …` default, so `Parameters<typeof Child>[0]` is its prop
|
|
1028
|
-
shape. `bind:` / `class:` / `style:` / `attach` and `{...spread}` are
|
|
1029
|
-
framework directives (not part of the declared shape), so they are checked
|
|
1030
|
-
leniently — each value against its own declared key type — never flagged as
|
|
1031
|
-
excess. `on*` callbacks ARE ordinary declared props on a component (abide does
|
|
1032
|
-
not auto-forward events to the DOM), so they go through the completeness check
|
|
1033
|
-
with the rest — otherwise a required `onsave`/`oncancel` reads as missing even
|
|
1034
|
-
when passed, and an undeclared handler slips by unflagged. */
|
|
1035
|
-
const handled = (prop: { name: string; spread?: boolean }): boolean =>
|
|
1036
|
-
prop.spread === true ||
|
|
1037
|
-
prop.name.startsWith('bind:') ||
|
|
1038
|
-
prop.name.startsWith('class:') ||
|
|
1039
|
-
prop.name.startsWith('style:') ||
|
|
1040
|
-
prop.name === 'attach'
|
|
1041
|
-
const hasSpread = node.props.some((prop) => prop.spread)
|
|
1042
|
-
/* Default slot content (`<Card>…</Card>`) lowers to a `children` Snippet prop at
|
|
1043
|
-
runtime (see generateBuild.slotPart), so the completeness check must treat
|
|
1044
|
-
`children` as supplied when it's present (handled below). Mirror the runtime's
|
|
1045
|
-
predicate: any child that isn't whitespace-only text is renderable slot content
|
|
1046
|
-
— an empty/whitespace slot sets no `children` layer, so it doesn't count. */
|
|
1047
|
-
const hasSlotContent = node.children.some((child) => !isWhitespaceText(child))
|
|
1048
|
-
for (const prop of node.props.filter(handled)) {
|
|
1049
|
-
/* Lead with a defensive `;`: an IIFE/object-literal arg starts with `(` or
|
|
1050
|
-
`{`, so without it a preceding scope statement left unterminated (a script
|
|
1051
|
-
ending in a call with no trailing semicolon, e.g. `effect(() => …)`)
|
|
1052
|
-
merges across the newline into `effect(…)(…)` — a spurious "not callable". */
|
|
1053
|
-
if (prop.spread) {
|
|
1054
|
-
/* A `{...expr}` spread contributes a SUBSET of the props (required ones
|
|
1055
|
-
may come from another spread/explicit prop), so check it against
|
|
1056
|
-
`Partial<Props>` — every key it does carry must match, without
|
|
1057
|
-
demanding completeness. */
|
|
1058
|
-
builder.raw(`;((__spread: Partial<Parameters<typeof ${node.name}>[0]>) => {})(`)
|
|
1059
|
-
} else {
|
|
1060
|
-
builder.raw(
|
|
1061
|
-
`;((__prop: Parameters<typeof ${node.name}>[0][${JSON.stringify(prop.name)}]) => {})(`,
|
|
1062
|
-
)
|
|
1063
|
-
}
|
|
1064
|
-
builder.expr(prop.code, prop.loc)
|
|
1065
|
-
builder.raw(');\n')
|
|
1066
|
-
}
|
|
1067
|
-
/* The plain data props as one object-literal argument typed to the child's whole
|
|
1068
|
-
prop shape: a missing required prop errors on the literal (anchored at the tag
|
|
1069
|
-
via the mapped `{`), an unknown prop errors on its key, a wrong type on its
|
|
1070
|
-
value. Skipped when a spread is present — a spread may supply required props,
|
|
1071
|
-
so completeness can't be demanded; the data props fall back to lenient per-key
|
|
1072
|
-
checks instead. */
|
|
1073
|
-
const dataProps = node.props.filter((prop) => !handled(prop))
|
|
1074
|
-
if (hasSpread) {
|
|
1075
|
-
for (const prop of dataProps) {
|
|
1076
|
-
builder.raw(
|
|
1077
|
-
`;((__prop: Parameters<typeof ${node.name}>[0][${JSON.stringify(prop.name)}]) => {})(`,
|
|
1078
|
-
)
|
|
1079
|
-
builder.expr(prop.code, prop.loc)
|
|
1080
|
-
builder.raw(');\n')
|
|
1081
|
-
}
|
|
1082
|
-
} else {
|
|
1083
|
-
/* With slot content the child's `children` prop is supplied by the slot, so
|
|
1084
|
-
check completeness against the shape with `children` made OPTIONAL rather
|
|
1085
|
-
than removed — dropping it via a bare `Omit` collapses a children-only
|
|
1086
|
-
shape to `{}`, a weak type that then lets excess props slip by. `Omit` +
|
|
1087
|
-
`Partial<Pick<…>>` keeps every other prop required and `children` as a
|
|
1088
|
-
known-optional key (a no-op `Partial<{}>` when the child declares none), so
|
|
1089
|
-
completeness and excess-prop checks both stay intact. The explicit
|
|
1090
|
-
`children={…}` attribute is dropped from the literal — the slot's key wins
|
|
1091
|
-
(`composeProps`), and leaving it in would read as excess. */
|
|
1092
|
-
const propsShape = `Parameters<typeof ${node.name}>[0]`
|
|
1093
|
-
const completenessType = hasSlotContent
|
|
1094
|
-
? `Omit<${propsShape}, 'children'> & Partial<Pick<${propsShape}, Extract<keyof ${propsShape}, 'children'>>>`
|
|
1095
|
-
: propsShape
|
|
1096
|
-
const literalProps = hasSlotContent
|
|
1097
|
-
? dataProps.filter((prop) => prop.name !== 'children')
|
|
1098
|
-
: dataProps
|
|
1099
|
-
builder.raw(`;((__c: ${completenessType}): void => { void __c })({`)
|
|
1100
|
-
/* A zero-length anchor right after `{`, pointing at the tag: a missing-
|
|
1101
|
-
required-prop error spans the literal from `{`, so it overlaps this and
|
|
1102
|
-
maps to the tag (an empty span trivially satisfies the source-text ==
|
|
1103
|
-
shadow-text invariant). */
|
|
1104
|
-
builder.mapped('', node.loc)
|
|
1105
|
-
builder.raw('\n')
|
|
1106
|
-
for (const prop of literalProps) {
|
|
1107
|
-
/* The key mapped to its source name (excess-prop errors land on the key);
|
|
1108
|
-
the value verbatim-mapped (wrong-type errors land on the value).
|
|
1109
|
-
Hyphenated names (`aria-label`, `data-*`) aren't valid identifiers, so
|
|
1110
|
-
they're wrapped in raw quotes — a string-literal key the parser accepts.
|
|
1111
|
-
The quotes are unmapped; an excess-prop error on the literal starts at the
|
|
1112
|
-
opening quote and overlaps the mapped name, clamping back onto it. */
|
|
1113
|
-
const needsQuoting = !/^[A-Za-z_$][\w$]*$/.test(prop.name)
|
|
1114
|
-
if (needsQuoting) {
|
|
1115
|
-
builder.raw('"')
|
|
1116
|
-
}
|
|
1117
|
-
if (prop.nameLoc !== undefined) {
|
|
1118
|
-
builder.mapped(prop.name, prop.nameLoc)
|
|
1119
|
-
} else {
|
|
1120
|
-
builder.raw(prop.name)
|
|
1121
|
-
}
|
|
1122
|
-
if (needsQuoting) {
|
|
1123
|
-
builder.raw('"')
|
|
1124
|
-
}
|
|
1125
|
-
builder.raw(': ')
|
|
1126
|
-
builder.expr(prop.code, prop.loc)
|
|
1127
|
-
builder.raw(',\n')
|
|
1128
|
-
}
|
|
1129
|
-
builder.raw('});\n')
|
|
1130
|
-
}
|
|
1131
|
-
emitNodes(node.children, builder)
|
|
1132
|
-
return
|
|
1133
|
-
}
|
|
1134
|
-
case 'if': {
|
|
1135
|
-
/* The optional `<template else>` is a match-less `case` CHILD (the runtime
|
|
1136
|
-
pairs it the same way — see `generateIf`); the rest are the then-content.
|
|
1137
|
-
Emitting it as a real `else` gives its body the condition's NEGATIVE
|
|
1138
|
-
narrowing — emitting it inside the `if` block (as a plain child) instead
|
|
1139
|
-
gave it the positive narrowing, so a literal-union compare read as a
|
|
1140
|
-
"no overlap" and a typeof-narrowed branch saw the wrong member. */
|
|
1141
|
-
const branches = node.children.filter(
|
|
1142
|
-
(child): child is Extract<TemplateNode, { kind: 'case' }> => child.kind === 'case',
|
|
1143
|
-
)
|
|
1144
|
-
const thenChildren = node.children.filter((child) => child.kind !== 'case')
|
|
1145
|
-
builder.raw('if ')
|
|
1146
|
-
builder.asyncExpr(node.condition, node.loc, 'if')
|
|
1147
|
-
builder.raw(' {\n')
|
|
1148
|
-
emitNodes(thenChildren, builder)
|
|
1149
|
-
builder.raw('}')
|
|
1150
|
-
/* `elseif` → a real `else if` so its body inherits the prior conditions' negative
|
|
1151
|
-
narrowing plus its own positive; `else` → the trailing block. */
|
|
1152
|
-
for (const branch of branches) {
|
|
1153
|
-
if (branch.condition !== undefined) {
|
|
1154
|
-
builder.raw(' else if ')
|
|
1155
|
-
builder.asyncExpr(branch.condition, branch.loc, 'if')
|
|
1156
|
-
builder.raw(' {\n')
|
|
1157
|
-
} else {
|
|
1158
|
-
builder.raw(' else {\n')
|
|
1159
|
-
}
|
|
1160
|
-
emitNodes(branch.children, builder)
|
|
1161
|
-
builder.raw('}')
|
|
1162
|
-
}
|
|
1163
|
-
builder.raw('\n')
|
|
1164
|
-
return
|
|
1165
|
-
}
|
|
1166
|
-
case 'each':
|
|
1167
|
-
/* `for await` over an async each's AsyncIterable, plain `for…of` otherwise —
|
|
1168
|
-
so the item binds to the element type under either iteration protocol. The
|
|
1169
|
-
binding name is `mapped` (not `raw`) so hover/highlighting land on it. */
|
|
1170
|
-
builder.raw(node.async ? 'for await (const ' : 'for (const ')
|
|
1171
|
-
builder.mapped(node.as, node.asLoc)
|
|
1172
|
-
builder.raw(' of ')
|
|
1173
|
-
builder.expr(node.items, node.loc)
|
|
1174
|
-
builder.raw(') {\n')
|
|
1175
|
-
if (node.key !== undefined) {
|
|
1176
|
-
builder.raw('void ')
|
|
1177
|
-
builder.expr(node.key, node.keyLoc)
|
|
1178
|
-
builder.raw(';\n')
|
|
1179
|
-
}
|
|
1180
|
-
/* `index="i"` binds the row's position — always a number (the row ordinal,
|
|
1181
|
-
or an async stream's arrival count). Declare it so body references check. */
|
|
1182
|
-
if (node.index !== undefined) {
|
|
1183
|
-
builder.raw('const ')
|
|
1184
|
-
builder.mapped(node.index, node.indexLoc)
|
|
1185
|
-
builder.raw(': number = 0;\n')
|
|
1186
|
-
}
|
|
1187
|
-
emitNodes(node.children, builder)
|
|
1188
|
-
builder.raw('}\n')
|
|
1189
|
-
return
|
|
1190
|
-
case 'await': {
|
|
1191
|
-
/* Resolve once into a shadow-local; `then` binds it (carrying the awaited
|
|
1192
|
-
type so resolved-content props are checked), `catch` binds the error as
|
|
1193
|
-
`any` (statically unknowable), `finally` binds nothing. Blocking: the
|
|
1194
|
-
non-branch children are the resolved content, bound to `as`. Streaming:
|
|
1195
|
-
they're the pending content, checked without the resolved value. */
|
|
1196
|
-
const resolved = builder.unique('awaited')
|
|
1197
|
-
builder.raw('{\n')
|
|
1198
|
-
/* A bare `{#await <pendingCell>}` awaits the CELL (ADR-0047 `$$awaitSubject`): it shows
|
|
1199
|
-
pending then binds the RESOLVED value, never the pending `undefined` the
|
|
1200
|
-
`$$cellValuePending` peek carries. So strip that `undefined` with `$$awaitCell` — the
|
|
1201
|
-
resolved/`:then` bindings all derive from `resolved`, so one strip covers every one.
|
|
1202
|
-
Only a whole-subject bare pending-cell reference qualifies (mirrors the runtime
|
|
1203
|
-
`awaitSubjectExpr` classification); any other subject (a plain promise, a blocking
|
|
1204
|
-
cell, a compound expression) stays a plain `await`. */
|
|
1205
|
-
const subjectIsPendingCell = builder.pendingCellNames.has(node.promise.trim())
|
|
1206
|
-
builder.raw(`const ${resolved} = ${subjectIsPendingCell ? '$$awaitCell(' : 'await '}`)
|
|
1207
|
-
builder.expr(node.promise, node.loc)
|
|
1208
|
-
builder.raw(`${subjectIsPendingCell ? ')' : ''};\nvoid ${resolved};\n`)
|
|
1209
|
-
const pending = node.children.filter((child) => child.kind !== 'branch')
|
|
1210
|
-
const branches = node.children.filter((child) => child.kind === 'branch')
|
|
1211
|
-
if (node.blocking && node.as !== undefined) {
|
|
1212
|
-
builder.raw('{\nconst ')
|
|
1213
|
-
builder.mapped(node.as, node.asLoc)
|
|
1214
|
-
builder.raw(` = ${resolved};\n`)
|
|
1215
|
-
emitNodes(pending, builder)
|
|
1216
|
-
builder.raw('}\n')
|
|
1217
|
-
} else {
|
|
1218
|
-
emitNodes(pending, builder)
|
|
1219
|
-
}
|
|
1220
|
-
for (const branch of branches) {
|
|
1221
|
-
if (branch.kind !== 'branch') {
|
|
1222
|
-
continue
|
|
1223
|
-
}
|
|
1224
|
-
builder.raw('{\n')
|
|
1225
|
-
if (branch.branch === 'then' && branch.as !== undefined) {
|
|
1226
|
-
builder.raw('const ')
|
|
1227
|
-
builder.mapped(branch.as, branch.asLoc)
|
|
1228
|
-
builder.raw(` = ${resolved};\n`)
|
|
1229
|
-
} else if (branch.branch === 'catch' && branch.as !== undefined) {
|
|
1230
|
-
builder.raw('const ')
|
|
1231
|
-
builder.mapped(branch.as, branch.asLoc)
|
|
1232
|
-
/* `unknown`, not `any` — a `catch` error is statically unknowable, and this
|
|
1233
|
-
matches what strict-mode plain TS gives a real `catch (err)`
|
|
1234
|
-
(`useUnknownInCatchVariables`), so the author must narrow before dereferencing
|
|
1235
|
-
(`err instanceof Error ? … : …`) exactly as outside a template (ADR-0042 fidelity). */
|
|
1236
|
-
builder.raw(' = undefined as unknown;\n')
|
|
1237
|
-
}
|
|
1238
|
-
emitNodes(branch.children, builder)
|
|
1239
|
-
builder.raw('}\n')
|
|
1240
|
-
}
|
|
1241
|
-
builder.raw('}\n')
|
|
1242
|
-
return
|
|
1243
|
-
}
|
|
1244
|
-
case 'switch':
|
|
1245
|
-
/* A real `switch` so a discriminant subject narrows into each case body;
|
|
1246
|
-
non-case children (whitespace between cases) carry nothing and are
|
|
1247
|
-
skipped. `break` keeps cases independent under `noFallthroughCasesInSwitch`. */
|
|
1248
|
-
builder.raw('switch (')
|
|
1249
|
-
builder.asyncExpr(node.subject, node.loc, 'switch')
|
|
1250
|
-
builder.raw(') {\n')
|
|
1251
|
-
for (const child of node.children) {
|
|
1252
|
-
if (child.kind !== 'case') {
|
|
1253
|
-
continue
|
|
1254
|
-
}
|
|
1255
|
-
if (child.match !== undefined) {
|
|
1256
|
-
builder.raw('case ')
|
|
1257
|
-
builder.expr(child.match, child.loc)
|
|
1258
|
-
builder.raw(': {\n')
|
|
1259
|
-
} else {
|
|
1260
|
-
builder.raw('default: {\n')
|
|
1261
|
-
}
|
|
1262
|
-
emitNodes(child.children, builder)
|
|
1263
|
-
builder.raw('break;\n}\n')
|
|
1264
|
-
}
|
|
1265
|
-
builder.raw('}\n')
|
|
1266
|
-
return
|
|
1267
|
-
case 'case':
|
|
1268
|
-
/* Reached only for a stray case outside a switch/if (none today); a `switch`
|
|
1269
|
-
emits its own cases and the `if` handler consumes its `else` child. */
|
|
1270
|
-
if (node.match !== undefined) {
|
|
1271
|
-
builder.stmt(node.match, node.loc)
|
|
1272
|
-
}
|
|
1273
|
-
emitNodes(node.children, builder)
|
|
1274
|
-
return
|
|
1275
|
-
case 'branch':
|
|
1276
|
-
/* Reached for a `{#try}`'s `catch`/`finally`: the `try` handler emits its
|
|
1277
|
-
children directly (guarded content + these branch nodes), so a `{:catch err}`
|
|
1278
|
-
binds its error here as `any` (statically unknowable). The `await`/`if`/`switch`
|
|
1279
|
-
handlers consume their own branches inline and never route through this case. */
|
|
1280
|
-
builder.raw('{\n')
|
|
1281
|
-
if (node.as !== undefined) {
|
|
1282
|
-
/* `unknown`, not `any` — see the await-`catch` binding above (matches strict TS's
|
|
1283
|
-
`catch (err)`, forcing the author to narrow). */
|
|
1284
|
-
builder.raw(`const ${node.as} = undefined as unknown;\n`)
|
|
1285
|
-
}
|
|
1286
|
-
emitNodes(node.children, builder)
|
|
1287
|
-
builder.raw('}\n')
|
|
1288
|
-
return
|
|
1289
|
-
case 'try':
|
|
1290
|
-
builder.raw('{\n')
|
|
1291
|
-
emitNodes(node.children, builder)
|
|
1292
|
-
builder.raw('}\n')
|
|
1293
|
-
return
|
|
1294
|
-
case 'snippet':
|
|
1295
|
-
/* `args={…}` is the parameter list; `mapped` (not `raw`) so hover/highlighting
|
|
1296
|
-
land on the binding. `loc` is the `args` expression's offset (see
|
|
1297
|
-
toSnippetOrTemplate). The name is a static attribute with no tracked offset. */
|
|
1298
|
-
builder.raw(`const ${node.name} = (`)
|
|
1299
|
-
if (node.params !== undefined) {
|
|
1300
|
-
builder.mapped(node.params, node.loc)
|
|
1301
|
-
}
|
|
1302
|
-
/* Wrap the body in `snippet(() => …)` so the shadow types the snippet as
|
|
1303
|
-
`(args) => SnippetValue` — mirroring the runtime lowering (which returns
|
|
1304
|
-
`$$snippet(($host) => …)`) so a snippet passed to a `Snippet`-typed prop
|
|
1305
|
-
type-checks instead of reading as `() => void`. */
|
|
1306
|
-
builder.raw(') => snippet(() => {\n')
|
|
1307
|
-
emitNodes(node.children, builder)
|
|
1308
|
-
builder.raw('});\n')
|
|
1309
|
-
return
|
|
1310
|
-
case 'script':
|
|
1311
|
-
/* A scoped reactive `<script>`: value-project its reactive declarations to
|
|
1312
|
-
their value types (`computed(…)` → the computed value, `state(…)` → the
|
|
1313
|
-
initial) exactly as the leading script's scope lines are, so the branch's
|
|
1314
|
-
markup type-checks a nested signal as its value — matching the runtime,
|
|
1315
|
-
which derefs nested-script signals through the rest of the branch. Emitted
|
|
1316
|
-
INLINE in the current block, not a nested `{…}`, so its bindings reach the
|
|
1317
|
-
branch's later siblings (a nested if/each); a wrapping block trapped them,
|
|
1318
|
-
surfacing "Cannot find name". Leading `;` guards a preceding semicolon-less
|
|
1319
|
-
call from merging in (see the component case). Not yet position-mapped. */
|
|
1320
|
-
builder.raw(`;\n${projectNestedScript(node.code)}\n`)
|
|
1321
|
-
return
|
|
1322
|
-
case 'style':
|
|
1323
|
-
/* CSS, not TypeScript — nothing for the shadow to type-check. */
|
|
1324
|
-
return
|
|
1325
|
-
}
|
|
1326
|
-
}
|