@xdelivered/emberflow 0.2.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/LICENSE +21 -0
- package/README.md +153 -0
- package/bin/commands.test.ts +185 -0
- package/bin/commands.ts +306 -0
- package/bin/emberflow.mjs +38 -0
- package/bin/init.test.ts +165 -0
- package/bin/init.ts +297 -0
- package/bin/runtime.mjs +105 -0
- package/bin/runtime.test.ts +167 -0
- package/bin/skillTargets.test.ts +108 -0
- package/bin/skillTargets.ts +36 -0
- package/bin/skillTemplates.test.ts +37 -0
- package/bin/tsconfig.json +23 -0
- package/dist/bin/commands.d.ts +24 -0
- package/dist/bin/commands.js +252 -0
- package/dist/bin/init.d.ts +17 -0
- package/dist/bin/init.js +241 -0
- package/dist/bin/runtime.d.mts +39 -0
- package/dist/bin/runtime.mjs +96 -0
- package/dist/bin/skillTargets.d.ts +13 -0
- package/dist/bin/skillTargets.js +22 -0
- package/dist/server/agents/claudeAdapter.d.ts +8 -0
- package/dist/server/agents/claudeAdapter.js +190 -0
- package/dist/server/agents/claudeParse.d.ts +2 -0
- package/dist/server/agents/claudeParse.js +162 -0
- package/dist/server/agents/codexAdapter.d.ts +13 -0
- package/dist/server/agents/codexAdapter.js +174 -0
- package/dist/server/agents/codexParse.d.ts +2 -0
- package/dist/server/agents/codexParse.js +74 -0
- package/dist/server/agents/detect.d.ts +23 -0
- package/dist/server/agents/detect.js +35 -0
- package/dist/server/agents/gitScope.d.ts +24 -0
- package/dist/server/agents/gitScope.js +95 -0
- package/dist/server/agents/modelRejectionHint.d.ts +8 -0
- package/dist/server/agents/modelRejectionHint.js +12 -0
- package/dist/server/agents/prompt.d.ts +79 -0
- package/dist/server/agents/prompt.js +364 -0
- package/dist/server/agents/runManager.d.ts +90 -0
- package/dist/server/agents/runManager.js +259 -0
- package/dist/server/agents/types.d.ts +15 -0
- package/dist/server/agents/types.js +1 -0
- package/dist/server/apiStore.d.ts +60 -0
- package/dist/server/apiStore.js +249 -0
- package/dist/server/auth/enforce.d.ts +1 -0
- package/dist/server/auth/enforce.js +6 -0
- package/dist/server/auth/types.d.ts +1 -0
- package/dist/server/auth/types.js +1 -0
- package/dist/server/auth/verifiers.d.ts +1 -0
- package/dist/server/auth/verifiers.js +4 -0
- package/dist/server/authAttach.d.ts +19 -0
- package/dist/server/authAttach.js +79 -0
- package/dist/server/cli.d.ts +7 -0
- package/dist/server/cli.js +804 -0
- package/dist/server/client.d.ts +130 -0
- package/dist/server/client.js +247 -0
- package/dist/server/environments.d.ts +103 -0
- package/dist/server/environments.js +486 -0
- package/dist/server/flowStore.d.ts +37 -0
- package/dist/server/flowStore.js +117 -0
- package/dist/server/httpOperations.d.ts +32 -0
- package/dist/server/httpOperations.js +62 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +1022 -0
- package/dist/server/infrastructure.d.ts +51 -0
- package/dist/server/infrastructure.js +116 -0
- package/dist/server/login.d.ts +21 -0
- package/dist/server/login.js +44 -0
- package/dist/server/mcp.d.ts +1 -0
- package/dist/server/mcp.js +182 -0
- package/dist/server/migrateFlows.d.ts +8 -0
- package/dist/server/migrateFlows.js +25 -0
- package/dist/server/mockHandler.d.ts +15 -0
- package/dist/server/mockHandler.js +35 -0
- package/dist/server/nodesPayload.d.ts +14 -0
- package/dist/server/nodesPayload.js +14 -0
- package/dist/server/normalizeFlow.d.ts +21 -0
- package/dist/server/normalizeFlow.js +48 -0
- package/dist/server/openBrowser.d.ts +8 -0
- package/dist/server/openBrowser.js +16 -0
- package/dist/server/operationResult.d.ts +12 -0
- package/dist/server/operationResult.js +26 -0
- package/dist/server/pathGuard.d.ts +1 -0
- package/dist/server/pathGuard.js +16 -0
- package/dist/server/pathSafety.d.ts +20 -0
- package/dist/server/pathSafety.js +35 -0
- package/dist/server/projectConfig.d.ts +47 -0
- package/dist/server/projectConfig.js +61 -0
- package/dist/server/projectMode.d.ts +26 -0
- package/dist/server/projectMode.js +44 -0
- package/dist/server/redact.d.ts +6 -0
- package/dist/server/redact.js +37 -0
- package/dist/server/runRegistry.d.ts +84 -0
- package/dist/server/runRegistry.js +200 -0
- package/dist/server/runtime/RuntimeAdapter.d.ts +22 -0
- package/dist/server/runtime/RuntimeAdapter.js +1 -0
- package/dist/server/runtime/expressAdapter.d.ts +19 -0
- package/dist/server/runtime/expressAdapter.js +56 -0
- package/dist/server/scenarioTest.d.ts +14 -0
- package/dist/server/scenarioTest.js +66 -0
- package/dist/server/subflowRunner.d.ts +32 -0
- package/dist/server/subflowRunner.js +72 -0
- package/dist/server/testRunner.d.ts +70 -0
- package/dist/server/testRunner.js +151 -0
- package/dist/src/config.d.ts +3 -0
- package/dist/src/config.js +2 -0
- package/dist/src/engine/authVerify.d.ts +33 -0
- package/dist/src/engine/authVerify.js +63 -0
- package/dist/src/engine/diagnostics.d.ts +62 -0
- package/dist/src/engine/diagnostics.js +148 -0
- package/dist/src/engine/executor.d.ts +151 -0
- package/dist/src/engine/executor.js +684 -0
- package/dist/src/engine/httpError.d.ts +7 -0
- package/dist/src/engine/httpError.js +14 -0
- package/dist/src/engine/index.d.ts +11 -0
- package/dist/src/engine/index.js +11 -0
- package/dist/src/engine/output.d.ts +11 -0
- package/dist/src/engine/output.js +20 -0
- package/dist/src/engine/publish.d.ts +30 -0
- package/dist/src/engine/publish.js +95 -0
- package/dist/src/engine/registry.d.ts +34 -0
- package/dist/src/engine/registry.js +67 -0
- package/dist/src/engine/scenarios.d.ts +12 -0
- package/dist/src/engine/scenarios.js +19 -0
- package/dist/src/engine/schemaCheck.d.ts +4 -0
- package/dist/src/engine/schemaCheck.js +34 -0
- package/dist/src/engine/trace.d.ts +12 -0
- package/dist/src/engine/trace.js +12 -0
- package/dist/src/engine/types.d.ts +308 -0
- package/dist/src/engine/types.js +1 -0
- package/dist/src/engine/validation.d.ts +26 -0
- package/dist/src/engine/validation.js +318 -0
- package/dist/src/flows/anomaly-flows.d.ts +23 -0
- package/dist/src/flows/anomaly-flows.js +151 -0
- package/dist/src/flows/city-sweep-flow.d.ts +10 -0
- package/dist/src/flows/city-sweep-flow.js +127 -0
- package/dist/src/flows/login-flow.d.ts +13 -0
- package/dist/src/flows/login-flow.js +145 -0
- package/dist/src/flows/pradar-flows.d.ts +5 -0
- package/dist/src/flows/pradar-flows.js +375 -0
- package/dist/src/flows/weather-flow.d.ts +12 -0
- package/dist/src/flows/weather-flow.js +150 -0
- package/dist/src/lib/pathParams.d.ts +3 -0
- package/dist/src/lib/pathParams.js +6 -0
- package/dist/src/nodes/anomaly.d.ts +2 -0
- package/dist/src/nodes/anomaly.js +556 -0
- package/dist/src/nodes/flow-control.d.ts +7 -0
- package/dist/src/nodes/flow-control.js +270 -0
- package/dist/src/nodes/index.d.ts +3 -0
- package/dist/src/nodes/index.js +20 -0
- package/dist/src/nodes/login.d.ts +7 -0
- package/dist/src/nodes/login.js +158 -0
- package/dist/src/nodes/loops.d.ts +11 -0
- package/dist/src/nodes/loops.js +60 -0
- package/dist/src/nodes/pradar/index.d.ts +7 -0
- package/dist/src/nodes/pradar/index.js +9 -0
- package/dist/src/nodes/pradar/logic.d.ts +189 -0
- package/dist/src/nodes/pradar/logic.js +370 -0
- package/dist/src/nodes/pradar/nodes.d.ts +42 -0
- package/dist/src/nodes/pradar/nodes.js +801 -0
- package/dist/src/nodes/requireAuth.d.ts +20 -0
- package/dist/src/nodes/requireAuth.js +48 -0
- package/dist/src/nodes/response.d.ts +8 -0
- package/dist/src/nodes/response.js +33 -0
- package/dist/src/nodes/weather.d.ts +33 -0
- package/dist/src/nodes/weather.js +260 -0
- package/package.json +92 -0
- package/server/agentRoute.test.ts +157 -0
- package/server/agents/__fixtures__/fake-claude-writer.mjs +23 -0
- package/server/agents/__fixtures__/fake-claude.mjs +55 -0
- package/server/agents/__fixtures__/fake-codex-writer.mjs +27 -0
- package/server/agents/__fixtures__/fake-codex.mjs +52 -0
- package/server/agents/__fixtures__/fake-version-empty.mjs +3 -0
- package/server/agents/__fixtures__/fake-version-fail.mjs +4 -0
- package/server/agents/__fixtures__/fake-version-garbage.mjs +4 -0
- package/server/agents/__fixtures__/fake-version-good.mjs +4 -0
- package/server/agents/__fixtures__/fake-version-hang.mjs +3 -0
- package/server/agents/claudeAdapter.test.ts +127 -0
- package/server/agents/claudeAdapter.ts +212 -0
- package/server/agents/claudeParse.ts +193 -0
- package/server/agents/codexAdapter.test.ts +125 -0
- package/server/agents/codexAdapter.ts +198 -0
- package/server/agents/codexParse.test.ts +58 -0
- package/server/agents/codexParse.ts +126 -0
- package/server/agents/detect.test.ts +65 -0
- package/server/agents/detect.ts +43 -0
- package/server/agents/gitScope.test.ts +129 -0
- package/server/agents/gitScope.ts +110 -0
- package/server/agents/modelRejectionHint.test.ts +30 -0
- package/server/agents/modelRejectionHint.ts +14 -0
- package/server/agents/prompt.test.ts +613 -0
- package/server/agents/prompt.ts +527 -0
- package/server/agents/runManager.test.ts +251 -0
- package/server/agents/runManager.ts +286 -0
- package/server/agents/types.ts +17 -0
- package/server/apiMount.test.ts +591 -0
- package/server/apiStore.test.ts +324 -0
- package/server/apiStore.ts +241 -0
- package/server/auth/enforce.test.ts +61 -0
- package/server/auth/enforce.ts +6 -0
- package/server/auth/types.ts +5 -0
- package/server/auth/verifiers.test.ts +37 -0
- package/server/auth/verifiers.ts +9 -0
- package/server/authAttach.test.ts +175 -0
- package/server/authAttach.ts +99 -0
- package/server/cli.ts +847 -0
- package/server/cliAuth.test.ts +229 -0
- package/server/cliCreate.test.ts +131 -0
- package/server/cliDoctor.test.ts +326 -0
- package/server/cliTest.test.ts +735 -0
- package/server/client.ts +314 -0
- package/server/demoProject.test.ts +29 -0
- package/server/diagnosticsRoute.test.ts +169 -0
- package/server/environments.test.ts +620 -0
- package/server/environments.ts +603 -0
- package/server/environmentsRoute.test.ts +385 -0
- package/server/errorWorkflow.test.ts +205 -0
- package/server/flowStore.test.ts +84 -0
- package/server/flowStore.ts +125 -0
- package/server/httpOperations.test.ts +377 -0
- package/server/httpOperations.ts +96 -0
- package/server/index.ts +1111 -0
- package/server/infrastructure.test.ts +154 -0
- package/server/infrastructure.ts +161 -0
- package/server/infrastructureRoute.test.ts +105 -0
- package/server/login.test.ts +153 -0
- package/server/login.ts +67 -0
- package/server/mcp.ts +278 -0
- package/server/migrateFlows.test.ts +55 -0
- package/server/migrateFlows.ts +23 -0
- package/server/mockHandler.test.ts +138 -0
- package/server/mockHandler.ts +52 -0
- package/server/mockRun.test.ts +367 -0
- package/server/mockServe.test.ts +467 -0
- package/server/nodesPayload.test.ts +29 -0
- package/server/nodesPayload.ts +26 -0
- package/server/normalizeFlow.test.ts +80 -0
- package/server/normalizeFlow.ts +59 -0
- package/server/openBrowser.test.ts +20 -0
- package/server/openBrowser.ts +22 -0
- package/server/operationResult.test.ts +67 -0
- package/server/operationResult.ts +27 -0
- package/server/pathGuard.test.ts +19 -0
- package/server/pathGuard.ts +12 -0
- package/server/pathSafety.test.ts +38 -0
- package/server/pathSafety.ts +33 -0
- package/server/projectConfig.test.ts +67 -0
- package/server/projectConfig.ts +101 -0
- package/server/projectMode.test.ts +106 -0
- package/server/projectMode.ts +59 -0
- package/server/redact.test.ts +88 -0
- package/server/redact.ts +35 -0
- package/server/redactEgress.test.ts +281 -0
- package/server/runRegistry.ts +270 -0
- package/server/runsAuth.test.ts +119 -0
- package/server/runtime/RuntimeAdapter.ts +24 -0
- package/server/runtime/expressAdapter.test.ts +38 -0
- package/server/runtime/expressAdapter.ts +70 -0
- package/server/scenarioTest.test.ts +148 -0
- package/server/scenarioTest.ts +88 -0
- package/server/setupStatus.test.ts +127 -0
- package/server/subflowRunner.ts +104 -0
- package/server/testRunner.ts +216 -0
- package/server/tsconfig.json +20 -0
- package/server/workflowTestRoute.test.ts +297 -0
- package/src/App.tsx +233 -0
- package/src/components/AgentConsole.tsx +461 -0
- package/src/components/BranchRulesEditor.tsx +156 -0
- package/src/components/CreateModal.tsx +275 -0
- package/src/components/Dock.tsx +487 -0
- package/src/components/EnvironmentDialog.tsx +569 -0
- package/src/components/EnvironmentPicker.tsx +357 -0
- package/src/components/EnvironmentsDialog.tsx +144 -0
- package/src/components/ExecutionPager.tsx +67 -0
- package/src/components/InfraPanel.test.tsx +103 -0
- package/src/components/InfraPanel.tsx +171 -0
- package/src/components/Inspector.tsx +1182 -0
- package/src/components/Json.tsx +50 -0
- package/src/components/JsonModal.tsx +52 -0
- package/src/components/LogMessage.tsx +61 -0
- package/src/components/NodeRunModal.tsx +213 -0
- package/src/components/RunLogPanel.tsx +397 -0
- package/src/components/RunbookView.tsx +1085 -0
- package/src/components/Scenarios.tsx +476 -0
- package/src/components/SettingsDialog.tsx +229 -0
- package/src/components/Sidebar.tsx +436 -0
- package/src/components/StatusBar.tsx +302 -0
- package/src/components/Toolbar.tsx +663 -0
- package/src/components/WelcomeDialog.test.tsx +107 -0
- package/src/components/WelcomeDialog.tsx +412 -0
- package/src/components/agentMarkdown.test.tsx +91 -0
- package/src/components/agentMarkdown.tsx +158 -0
- package/src/components/ui/badge.tsx +31 -0
- package/src/components/ui/button.tsx +46 -0
- package/src/components/ui/combobox.tsx +114 -0
- package/src/components/ui/command.tsx +82 -0
- package/src/components/ui/dialog.tsx +73 -0
- package/src/components/ui/input.tsx +20 -0
- package/src/components/ui/popover.tsx +32 -0
- package/src/components/ui/resizable.tsx +44 -0
- package/src/components/ui/tabs.tsx +36 -0
- package/src/config.ts +4 -0
- package/src/engine/authVerify.ts +81 -0
- package/src/engine/diagnostics.test.ts +437 -0
- package/src/engine/diagnostics.ts +211 -0
- package/src/engine/executor.test.ts +1339 -0
- package/src/engine/executor.ts +840 -0
- package/src/engine/httpError.test.ts +12 -0
- package/src/engine/httpError.ts +16 -0
- package/src/engine/index.ts +11 -0
- package/src/engine/output.ts +21 -0
- package/src/engine/publish.test.ts +176 -0
- package/src/engine/publish.ts +127 -0
- package/src/engine/registry.test.ts +64 -0
- package/src/engine/registry.ts +80 -0
- package/src/engine/scenarios.test.ts +55 -0
- package/src/engine/scenarios.ts +29 -0
- package/src/engine/schemaCheck.test.ts +21 -0
- package/src/engine/schemaCheck.ts +35 -0
- package/src/engine/trace.test.ts +19 -0
- package/src/engine/trace.ts +23 -0
- package/src/engine/types.test.ts +22 -0
- package/src/engine/types.ts +316 -0
- package/src/engine/validation.test.ts +314 -0
- package/src/engine/validation.ts +354 -0
- package/src/flows/anomaly-flows.test.ts +81 -0
- package/src/flows/anomaly-flows.ts +202 -0
- package/src/flows/city-sweep-flow.ts +131 -0
- package/src/flows/flows.test.ts +30 -0
- package/src/flows/login-flow.ts +150 -0
- package/src/flows/pradar-flows.test.ts +204 -0
- package/src/flows/pradar-flows.ts +419 -0
- package/src/flows/weather-flow.ts +154 -0
- package/src/globals.css +147 -0
- package/src/lib/pathParams.test.ts +24 -0
- package/src/lib/pathParams.ts +6 -0
- package/src/lib/registerLens.test.ts +79 -0
- package/src/lib/registerLens.ts +59 -0
- package/src/lib/runbookModel.test.ts +61 -0
- package/src/lib/runbookModel.ts +290 -0
- package/src/lib/runbookProjection.test.ts +417 -0
- package/src/lib/runbookProjection.ts +254 -0
- package/src/lib/useTailAnchor.ts +53 -0
- package/src/lib/utils.ts +7 -0
- package/src/main.tsx +13 -0
- package/src/nodes/anomaly.test.ts +98 -0
- package/src/nodes/anomaly.ts +637 -0
- package/src/nodes/effects-scan.test.ts +44 -0
- package/src/nodes/flow-control.test.ts +280 -0
- package/src/nodes/flow-control.ts +305 -0
- package/src/nodes/index.ts +22 -0
- package/src/nodes/login.test.ts +81 -0
- package/src/nodes/login.ts +186 -0
- package/src/nodes/loops.ts +69 -0
- package/src/nodes/pradar/index.ts +11 -0
- package/src/nodes/pradar/logic.test.ts +288 -0
- package/src/nodes/pradar/logic.ts +582 -0
- package/src/nodes/pradar/nodes.test.ts +146 -0
- package/src/nodes/pradar/nodes.ts +955 -0
- package/src/nodes/requireAuth.test.ts +75 -0
- package/src/nodes/requireAuth.ts +55 -0
- package/src/nodes/response.test.ts +33 -0
- package/src/nodes/response.ts +39 -0
- package/src/nodes/traceDetail.test.ts +39 -0
- package/src/nodes/weather.test.ts +65 -0
- package/src/nodes/weather.ts +306 -0
- package/src/store/agentClient.test.ts +103 -0
- package/src/store/agentClient.ts +131 -0
- package/src/store/apiTree.test.ts +17 -0
- package/src/store/apiTree.ts +73 -0
- package/src/store/builderStore.test.ts +1234 -0
- package/src/store/builderStore.ts +1879 -0
- package/src/store/infraClient.ts +63 -0
- package/src/store/nodeMeta.test.ts +24 -0
- package/src/store/nodeMeta.ts +21 -0
- package/src/store/persistence.test.ts +15 -0
- package/src/store/persistence.ts +54 -0
- package/src/store/serverRunner.ts +381 -0
- package/src/store/setupClient.ts +57 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- package/studio-dist/assets/index-DNJwW-hM.css +1 -0
- package/studio-dist/assets/index-O26dKRjW.js +65 -0
- package/studio-dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/studio-dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/studio-dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/studio-dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/studio-dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/studio-dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/studio-dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/studio-dist/favicon.svg +1 -0
- package/studio-dist/icons.svg +24 -0
- package/studio-dist/index.html +14 -0
- package/templates/skills/emberflow-basics/SKILL.md +316 -0
- package/templates/skills/emberflow-model-process/SKILL.md +209 -0
- package/templates/skills/emberflow-new-workflow/SKILL.md +211 -0
- package/templates/skills/emberflow-review-workflow/SKILL.md +148 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Re-exports the shared, browser-safe implementation from src/engine/authVerify.ts
|
|
2
|
+
// so server-side auth enforcement and the requireAuth node (bundled into the
|
|
3
|
+
// studio browser build) share one implementation instead of two diverging copies.
|
|
4
|
+
export {
|
|
5
|
+
bearerVerifier,
|
|
6
|
+
apiKeyVerifier,
|
|
7
|
+
VerifierRegistry,
|
|
8
|
+
createDefaultVerifierRegistry,
|
|
9
|
+
} from '../../src/engine';
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { attachCredential, captureCredential } from './authAttach';
|
|
3
|
+
import type { EnvAuth } from './environments';
|
|
4
|
+
|
|
5
|
+
describe('attachCredential', () => {
|
|
6
|
+
it('sets a cookie on empty headers', () => {
|
|
7
|
+
const attach: EnvAuth['attach'] = { as: 'cookie', name: 'session', secretRef: 'S' };
|
|
8
|
+
const result = attachCredential({}, attach, 'abc');
|
|
9
|
+
expect(result).toEqual({ cookie: 'session=abc' });
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('appends a cookie to an existing Cookie header', () => {
|
|
13
|
+
const attach: EnvAuth['attach'] = { as: 'cookie', name: 'session', secretRef: 'S' };
|
|
14
|
+
const result = attachCredential({ cookie: 'x=1' }, attach, 'abc');
|
|
15
|
+
expect(result).toEqual({ cookie: 'x=1; session=abc' });
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('sets a header', () => {
|
|
19
|
+
const attach: EnvAuth['attach'] = { as: 'header', name: 'Authorization', secretRef: 'S' };
|
|
20
|
+
const result = attachCredential({}, attach, 'Bearer abc');
|
|
21
|
+
expect(result).toEqual({ authorization: 'Bearer abc' });
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('returns headers unchanged when the target header is already present', () => {
|
|
25
|
+
const attach: EnvAuth['attach'] = { as: 'header', name: 'Authorization', secretRef: 'S' };
|
|
26
|
+
const headers = { authorization: 'Bearer explicit' };
|
|
27
|
+
const result = attachCredential(headers, attach, 'Bearer abc');
|
|
28
|
+
expect(result).toBe(headers);
|
|
29
|
+
expect(result).toEqual({ authorization: 'Bearer explicit' });
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('returns headers unchanged when the target header is already present under different casing', () => {
|
|
33
|
+
const attach: EnvAuth['attach'] = { as: 'header', name: 'Authorization', secretRef: 'x' };
|
|
34
|
+
const headers = { Authorization: 'Bearer caller' };
|
|
35
|
+
const result = attachCredential(headers, attach, 'injected');
|
|
36
|
+
expect(result).toBe(headers);
|
|
37
|
+
expect(result).toEqual({ Authorization: 'Bearer caller' });
|
|
38
|
+
expect(Object.prototype.hasOwnProperty.call(result, 'authorization')).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('returns headers unchanged when the target cookie name is already present', () => {
|
|
42
|
+
const attach: EnvAuth['attach'] = { as: 'cookie', name: 'session', secretRef: 'S' };
|
|
43
|
+
const headers = { cookie: 'session=explicit' };
|
|
44
|
+
const result = attachCredential(headers, attach, 'abc');
|
|
45
|
+
expect(result).toBe(headers);
|
|
46
|
+
expect(result).toEqual({ cookie: 'session=explicit' });
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('returns a new headers object (does not mutate input) when attaching', () => {
|
|
50
|
+
const attach: EnvAuth['attach'] = { as: 'header', name: 'Authorization', secretRef: 'S' };
|
|
51
|
+
const headers = {};
|
|
52
|
+
const result = attachCredential(headers, attach, 'Bearer abc');
|
|
53
|
+
expect(result).not.toBe(headers);
|
|
54
|
+
expect(headers).toEqual({});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('prepends the prefix to a header value', () => {
|
|
58
|
+
const attach: EnvAuth['attach'] = { as: 'header', name: 'Authorization', secretRef: 'S', prefix: 'Bearer ' };
|
|
59
|
+
const result = attachCredential({}, attach, 'tok123');
|
|
60
|
+
expect(result).toEqual({ authorization: 'Bearer tok123' });
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('prepends the prefix to a cookie value', () => {
|
|
64
|
+
const attach: EnvAuth['attach'] = { as: 'cookie', name: 'session', secretRef: 'S', prefix: 'Basic ' };
|
|
65
|
+
const result = attachCredential({}, attach, 'tok123');
|
|
66
|
+
expect(result).toEqual({ cookie: 'session=Basic tok123' });
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('returns headers unchanged when the target header is already present, even with a prefix configured', () => {
|
|
70
|
+
const attach: EnvAuth['attach'] = { as: 'header', name: 'Authorization', secretRef: 'S', prefix: 'Bearer ' };
|
|
71
|
+
const headers = { authorization: 'Bearer explicit' };
|
|
72
|
+
const result = attachCredential(headers, attach, 'tok123');
|
|
73
|
+
expect(result).toBe(headers);
|
|
74
|
+
expect(result).toEqual({ authorization: 'Bearer explicit' });
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('behaves identically to no-prefix behavior when prefix is absent', () => {
|
|
78
|
+
const attach: EnvAuth['attach'] = { as: 'header', name: 'Authorization', secretRef: 'S' };
|
|
79
|
+
const result = attachCredential({}, attach, 'tok123');
|
|
80
|
+
expect(result).toEqual({ authorization: 'tok123' });
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe('captureCredential', () => {
|
|
85
|
+
function makeRes(headersInit: Record<string, string>, body: unknown): { headers: Headers; json: () => Promise<any> } {
|
|
86
|
+
return {
|
|
87
|
+
headers: new Headers(headersInit),
|
|
88
|
+
json: async () => body,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
it('captures a named cookie value from set-cookie', async () => {
|
|
93
|
+
const res = makeRes({ 'set-cookie': 'session=abc; Path=/; HttpOnly' }, {});
|
|
94
|
+
const capture: NonNullable<EnvAuth['login']>['capture'] = { from: 'set-cookie', cookieName: 'session' };
|
|
95
|
+
const value = await captureCredential(res, capture);
|
|
96
|
+
expect(value).toBe('abc');
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('captures the whole cookie pair when cookieName is omitted', async () => {
|
|
100
|
+
const res = makeRes({ 'set-cookie': 'session=abc; Path=/; HttpOnly' }, {});
|
|
101
|
+
const capture: NonNullable<EnvAuth['login']>['capture'] = { from: 'set-cookie' };
|
|
102
|
+
const value = await captureCredential(res, capture);
|
|
103
|
+
expect(value).toBe('session=abc');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('captures a value from a json dot-path', async () => {
|
|
107
|
+
const res = makeRes({}, { token: 'tok-123' });
|
|
108
|
+
const capture: NonNullable<EnvAuth['login']>['capture'] = { from: 'json', path: 'token' };
|
|
109
|
+
const value = await captureCredential(res, capture);
|
|
110
|
+
expect(value).toBe('tok-123');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('captures a value from a nested json dot-path', async () => {
|
|
114
|
+
const res = makeRes({}, { data: { token: 'tok-nested' } });
|
|
115
|
+
const capture: NonNullable<EnvAuth['login']>['capture'] = { from: 'json', path: 'data.token' };
|
|
116
|
+
const value = await captureCredential(res, capture);
|
|
117
|
+
expect(value).toBe('tok-nested');
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('captures a header value', async () => {
|
|
121
|
+
const res = makeRes({ 'x-auth-token': 'tok-header' }, {});
|
|
122
|
+
const capture: NonNullable<EnvAuth['login']>['capture'] = { from: 'header', name: 'x-auth-token' };
|
|
123
|
+
const value = await captureCredential(res, capture);
|
|
124
|
+
expect(value).toBe('tok-header');
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('returns null when the set-cookie header is missing', async () => {
|
|
128
|
+
const res = makeRes({}, {});
|
|
129
|
+
const capture: NonNullable<EnvAuth['login']>['capture'] = { from: 'set-cookie', cookieName: 'session' };
|
|
130
|
+
const value = await captureCredential(res, capture);
|
|
131
|
+
expect(value).toBeNull();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('selects the named cookie line from multiple getSetCookie() lines', async () => {
|
|
135
|
+
const res = {
|
|
136
|
+
headers: {
|
|
137
|
+
getSetCookie: () => ['other=1; Path=/', 'better-auth.session_token=zzz; HttpOnly', 'trailing=x'],
|
|
138
|
+
get: () => null,
|
|
139
|
+
} as unknown as Headers,
|
|
140
|
+
json: async () => ({}),
|
|
141
|
+
};
|
|
142
|
+
const capture: NonNullable<EnvAuth['login']>['capture'] = {
|
|
143
|
+
from: 'set-cookie',
|
|
144
|
+
cookieName: 'better-auth.session_token',
|
|
145
|
+
};
|
|
146
|
+
const value = await captureCredential(res, capture);
|
|
147
|
+
expect(value).toBe('zzz');
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('falls back to the single comma-joined get(set-cookie) when getSetCookie is unavailable', async () => {
|
|
151
|
+
const res = {
|
|
152
|
+
headers: {
|
|
153
|
+
get: (name: string) => (name === 'set-cookie' ? 'session=abc; Path=/; HttpOnly' : null),
|
|
154
|
+
} as unknown as Headers,
|
|
155
|
+
json: async () => ({}),
|
|
156
|
+
};
|
|
157
|
+
const capture: NonNullable<EnvAuth['login']>['capture'] = { from: 'set-cookie', cookieName: 'session' };
|
|
158
|
+
const value = await captureCredential(res, capture);
|
|
159
|
+
expect(value).toBe('abc');
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('returns null when the json path is not found', async () => {
|
|
163
|
+
const res = makeRes({}, { other: 'x' });
|
|
164
|
+
const capture: NonNullable<EnvAuth['login']>['capture'] = { from: 'json', path: 'token' };
|
|
165
|
+
const value = await captureCredential(res, capture);
|
|
166
|
+
expect(value).toBeNull();
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('returns null when the header is missing', async () => {
|
|
170
|
+
const res = makeRes({}, {});
|
|
171
|
+
const capture: NonNullable<EnvAuth['login']>['capture'] = { from: 'header', name: 'x-auth-token' };
|
|
172
|
+
const value = await captureCredential(res, capture);
|
|
173
|
+
expect(value).toBeNull();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { EnvAuth } from './environments';
|
|
2
|
+
|
|
3
|
+
type LoginCapture = NonNullable<EnvAuth['login']>['capture'];
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Attaches a captured credential value onto a headers object for a run.
|
|
7
|
+
* Pure and non-mutating: returns a NEW headers object.
|
|
8
|
+
* Additive + non-destructive — if the target header/cookie-name is already
|
|
9
|
+
* present, the input is returned unchanged (caller-explicit wins).
|
|
10
|
+
*/
|
|
11
|
+
export function attachCredential(
|
|
12
|
+
headers: Record<string, unknown>,
|
|
13
|
+
attach: EnvAuth['attach'],
|
|
14
|
+
value: string,
|
|
15
|
+
): Record<string, unknown> {
|
|
16
|
+
const attachedValue = attach.prefix ? `${attach.prefix}${value}` : value;
|
|
17
|
+
|
|
18
|
+
if (attach.as === 'cookie') {
|
|
19
|
+
const existingCookie = typeof headers['cookie'] === 'string' ? (headers['cookie'] as string) : undefined;
|
|
20
|
+
if (existingCookie !== undefined && hasCookieName(existingCookie, attach.name)) {
|
|
21
|
+
return headers;
|
|
22
|
+
}
|
|
23
|
+
const nextCookie = existingCookie
|
|
24
|
+
? `${existingCookie}; ${attach.name}=${attachedValue}`
|
|
25
|
+
: `${attach.name}=${attachedValue}`;
|
|
26
|
+
return { ...headers, cookie: nextCookie };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const headerKey = attach.name.toLowerCase();
|
|
30
|
+
const existing = Object.keys(headers).find((k) => k.toLowerCase() === headerKey);
|
|
31
|
+
if (existing !== undefined) {
|
|
32
|
+
return headers;
|
|
33
|
+
}
|
|
34
|
+
return { ...headers, [headerKey]: attachedValue };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function hasCookieName(cookieHeader: string, name: string): boolean {
|
|
38
|
+
return cookieHeader
|
|
39
|
+
.split(';')
|
|
40
|
+
.map((pair) => pair.trim().split('=')[0])
|
|
41
|
+
.some((cookieName) => cookieName === name);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Extracts a captured credential value from a login response.
|
|
46
|
+
* Pure with respect to its inputs (no I/O of its own) — the caller performs
|
|
47
|
+
* the actual fetch and passes in the response-like object.
|
|
48
|
+
*/
|
|
49
|
+
export async function captureCredential(
|
|
50
|
+
res: { headers: Headers; json: () => Promise<any> },
|
|
51
|
+
capture: LoginCapture,
|
|
52
|
+
): Promise<string | null> {
|
|
53
|
+
if (capture.from === 'set-cookie') {
|
|
54
|
+
const single = res.headers.get('set-cookie');
|
|
55
|
+
const lines = res.headers.getSetCookie?.() ?? (single ? [single] : []);
|
|
56
|
+
if (lines.length === 0) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (!capture.cookieName) {
|
|
61
|
+
const firstPair = lines[0]?.split(';')[0]?.trim();
|
|
62
|
+
return firstPair || null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
for (const line of lines) {
|
|
66
|
+
const firstPair = line.split(';')[0]?.trim();
|
|
67
|
+
if (!firstPair) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const [cookieName, ...rest] = firstPair.split('=');
|
|
71
|
+
if (cookieName === capture.cookieName) {
|
|
72
|
+
return rest.join('=');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (capture.from === 'json') {
|
|
79
|
+
const body = await res.json();
|
|
80
|
+
return readDotPath(body, capture.path);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return res.headers.get(capture.name);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function readDotPath(body: unknown, path: string): string | null {
|
|
87
|
+
const segments = path.split('.');
|
|
88
|
+
let current: unknown = body;
|
|
89
|
+
for (const segment of segments) {
|
|
90
|
+
if (current === null || typeof current !== 'object') {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
current = (current as Record<string, unknown>)[segment];
|
|
94
|
+
}
|
|
95
|
+
if (current === undefined || current === null) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
return String(current);
|
|
99
|
+
}
|