dotdo 0.0.1 → 0.0.2
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 +1 -1
- package/README.md +446 -315
- package/dist/ai/index.js +19 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/template-literals.js +852 -0
- package/dist/ai/template-literals.js.map +1 -0
- package/dist/api/analytics/router.js +601 -0
- package/dist/api/analytics/router.js.map +1 -0
- package/dist/api/index.js +158 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/middleware/auth-federation.js +573 -0
- package/dist/api/middleware/auth-federation.js.map +1 -0
- package/dist/api/middleware/auth.js +544 -0
- package/dist/api/middleware/auth.js.map +1 -0
- package/dist/api/middleware/error-handling.js +176 -0
- package/dist/api/middleware/error-handling.js.map +1 -0
- package/dist/api/middleware/request-id.js +21 -0
- package/dist/api/middleware/request-id.js.map +1 -0
- package/dist/api/pages.js +1180 -0
- package/dist/api/pages.js.map +1 -0
- package/dist/api/routes/api.js +612 -0
- package/dist/api/routes/api.js.map +1 -0
- package/dist/api/routes/browsers.js +471 -0
- package/dist/api/routes/browsers.js.map +1 -0
- package/dist/api/routes/do.js +188 -0
- package/dist/api/routes/do.js.map +1 -0
- package/dist/api/routes/mcp.js +459 -0
- package/dist/api/routes/mcp.js.map +1 -0
- package/dist/api/routes/obs.js +445 -0
- package/dist/api/routes/obs.js.map +1 -0
- package/dist/api/routes/openapi.js +794 -0
- package/dist/api/routes/openapi.js.map +1 -0
- package/dist/api/routes/rpc.js +1103 -0
- package/dist/api/routes/rpc.js.map +1 -0
- package/dist/api/routes/sandboxes.js +389 -0
- package/dist/api/routes/sandboxes.js.map +1 -0
- package/dist/api/test-do.js +38 -0
- package/dist/api/test-do.js.map +1 -0
- package/dist/api/types.js +11 -0
- package/dist/api/types.js.map +1 -0
- package/dist/cli/bin.js +2 -0
- package/dist/cli/main.js +52342 -0
- package/dist/db/actions.js +212 -0
- package/dist/db/actions.js.map +1 -0
- package/dist/db/auth.js +506 -0
- package/dist/db/auth.js.map +1 -0
- package/dist/db/branches.js +65 -0
- package/dist/db/branches.js.map +1 -0
- package/dist/db/clickhouse.js +1074 -0
- package/dist/db/clickhouse.js.map +1 -0
- package/dist/db/dlq.js +39 -0
- package/dist/db/dlq.js.map +1 -0
- package/dist/db/events.js +28 -0
- package/dist/db/events.js.map +1 -0
- package/dist/db/exec.js +64 -0
- package/dist/db/exec.js.map +1 -0
- package/dist/db/files.js +85 -0
- package/dist/db/files.js.map +1 -0
- package/dist/db/flags.js +24 -0
- package/dist/db/flags.js.map +1 -0
- package/dist/db/git.js +116 -0
- package/dist/db/git.js.map +1 -0
- package/dist/db/iceberg/inverted-index.js +862 -0
- package/dist/db/iceberg/inverted-index.js.map +1 -0
- package/dist/db/iceberg/puffin.js +878 -0
- package/dist/db/iceberg/puffin.js.map +1 -0
- package/dist/db/iceberg/search-manifest.js +422 -0
- package/dist/db/iceberg/search-manifest.js.map +1 -0
- package/dist/db/iceberg/types.js +8 -0
- package/dist/db/iceberg/types.js.map +1 -0
- package/dist/db/index.js +121 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/integrations.js +368 -0
- package/dist/db/integrations.js.map +1 -0
- package/dist/db/json-indexes.js +332 -0
- package/dist/db/json-indexes.js.map +1 -0
- package/dist/db/linked-accounts.js +287 -0
- package/dist/db/linked-accounts.js.map +1 -0
- package/dist/db/nouns.js +183 -0
- package/dist/db/nouns.js.map +1 -0
- package/dist/db/objects.js +170 -0
- package/dist/db/objects.js.map +1 -0
- package/dist/db/primitives/dag-scheduler/index.js +869 -0
- package/dist/db/primitives/dag-scheduler/index.js.map +1 -0
- package/dist/db/primitives/exactly-once-context.js +237 -0
- package/dist/db/primitives/exactly-once-context.js.map +1 -0
- package/dist/db/primitives/index.js +62 -0
- package/dist/db/primitives/index.js.map +1 -0
- package/dist/db/primitives/keyed-router.js +145 -0
- package/dist/db/primitives/keyed-router.js.map +1 -0
- package/dist/db/primitives/observability.js +162 -0
- package/dist/db/primitives/observability.js.map +1 -0
- package/dist/db/primitives/schema-evolution.js +643 -0
- package/dist/db/primitives/schema-evolution.js.map +1 -0
- package/dist/db/primitives/stateful-operator/index.js +770 -0
- package/dist/db/primitives/stateful-operator/index.js.map +1 -0
- package/dist/db/primitives/temporal-store.js +306 -0
- package/dist/db/primitives/temporal-store.js.map +1 -0
- package/dist/db/primitives/typed-column-store.js +1229 -0
- package/dist/db/primitives/typed-column-store.js.map +1 -0
- package/dist/db/primitives/utils/duration.js +162 -0
- package/dist/db/primitives/utils/duration.js.map +1 -0
- package/dist/db/primitives/utils/murmur3.js +118 -0
- package/dist/db/primitives/utils/murmur3.js.map +1 -0
- package/dist/db/primitives/watermark-service.js +136 -0
- package/dist/db/primitives/watermark-service.js.map +1 -0
- package/dist/db/primitives/window-manager.js +764 -0
- package/dist/db/primitives/window-manager.js.map +1 -0
- package/dist/db/relationships.js +66 -0
- package/dist/db/relationships.js.map +1 -0
- package/dist/db/schema-minimal.js +61 -0
- package/dist/db/schema-minimal.js.map +1 -0
- package/dist/db/search.js +28 -0
- package/dist/db/search.js.map +1 -0
- package/dist/db/stores.js +1665 -0
- package/dist/db/stores.js.map +1 -0
- package/dist/db/things.js +297 -0
- package/dist/db/things.js.map +1 -0
- package/dist/db/vault.js +171 -0
- package/dist/db/vault.js.map +1 -0
- package/dist/db/verbs.js +102 -0
- package/dist/db/verbs.js.map +1 -0
- package/dist/do/base.js +48 -0
- package/dist/do/base.js.map +1 -0
- package/dist/do/bash.js +35 -0
- package/dist/do/bash.js.map +1 -0
- package/dist/do/fs.js +25 -0
- package/dist/do/fs.js.map +1 -0
- package/dist/do/full.js +61 -0
- package/dist/do/full.js.map +1 -0
- package/dist/do/git.js +28 -0
- package/dist/do/git.js.map +1 -0
- package/dist/do/index.js +52 -0
- package/dist/do/index.js.map +1 -0
- package/dist/do/tiny.js +31 -0
- package/dist/do/tiny.js.map +1 -0
- package/dist/lib/DOAuth.js +261 -0
- package/dist/lib/DOAuth.js.map +1 -0
- package/dist/lib/DODispatcher.js +72 -0
- package/dist/lib/DODispatcher.js.map +1 -0
- package/dist/lib/Modifier.js +189 -0
- package/dist/lib/Modifier.js.map +1 -0
- package/dist/lib/StateStorage.js +403 -0
- package/dist/lib/StateStorage.js.map +1 -0
- package/dist/lib/TypeRegistry.js +122 -0
- package/dist/lib/TypeRegistry.js.map +1 -0
- package/dist/lib/agent/tools/bash.js +336 -0
- package/dist/lib/agent/tools/bash.js.map +1 -0
- package/dist/lib/agent/tools/edit.js +157 -0
- package/dist/lib/agent/tools/edit.js.map +1 -0
- package/dist/lib/agent/tools/glob.js +137 -0
- package/dist/lib/agent/tools/glob.js.map +1 -0
- package/dist/lib/agent/tools/grep.js +315 -0
- package/dist/lib/agent/tools/grep.js.map +1 -0
- package/dist/lib/agent/tools/index.js +71 -0
- package/dist/lib/agent/tools/index.js.map +1 -0
- package/dist/lib/agent/tools/read.js +212 -0
- package/dist/lib/agent/tools/read.js.map +1 -0
- package/dist/lib/agent/tools/types.js +197 -0
- package/dist/lib/agent/tools/types.js.map +1 -0
- package/dist/lib/agent/tools/write.js +159 -0
- package/dist/lib/agent/tools/write.js.map +1 -0
- package/dist/lib/ai/gateway.js +247 -0
- package/dist/lib/ai/gateway.js.map +1 -0
- package/dist/lib/ai/tool-loop-agent.js +591 -0
- package/dist/lib/ai/tool-loop-agent.js.map +1 -0
- package/dist/lib/auto-wiring.js +439 -0
- package/dist/lib/auto-wiring.js.map +1 -0
- package/dist/lib/browse/browserbase.js +163 -0
- package/dist/lib/browse/browserbase.js.map +1 -0
- package/dist/lib/browse/cloudflare.js +144 -0
- package/dist/lib/browse/cloudflare.js.map +1 -0
- package/dist/lib/browse/index.js +62 -0
- package/dist/lib/browse/index.js.map +1 -0
- package/dist/lib/browse/types.js +13 -0
- package/dist/lib/browse/types.js.map +1 -0
- package/dist/lib/cache/index.js +37 -0
- package/dist/lib/cache/index.js.map +1 -0
- package/dist/lib/cache/visibility.js +638 -0
- package/dist/lib/cache/visibility.js.map +1 -0
- package/dist/lib/capabilities.js +268 -0
- package/dist/lib/capabilities.js.map +1 -0
- package/dist/lib/channels/base.js +106 -0
- package/dist/lib/channels/base.js.map +1 -0
- package/dist/lib/channels/discord.js +94 -0
- package/dist/lib/channels/discord.js.map +1 -0
- package/dist/lib/channels/email.js +204 -0
- package/dist/lib/channels/email.js.map +1 -0
- package/dist/lib/channels/index.js +90 -0
- package/dist/lib/channels/index.js.map +1 -0
- package/dist/lib/channels/mdxui-chat.js +95 -0
- package/dist/lib/channels/mdxui-chat.js.map +1 -0
- package/dist/lib/channels/slack-blockkit.js +121 -0
- package/dist/lib/channels/slack-blockkit.js.map +1 -0
- package/dist/lib/channels/types.js +7 -0
- package/dist/lib/channels/types.js.map +1 -0
- package/dist/lib/cloudflare/ai.js +654 -0
- package/dist/lib/cloudflare/ai.js.map +1 -0
- package/dist/lib/cloudflare/index.js +88 -0
- package/dist/lib/cloudflare/index.js.map +1 -0
- package/dist/lib/cloudflare/kv.js +342 -0
- package/dist/lib/cloudflare/kv.js.map +1 -0
- package/dist/lib/cloudflare/queues.js +434 -0
- package/dist/lib/cloudflare/queues.js.map +1 -0
- package/dist/lib/cloudflare/r2.js +604 -0
- package/dist/lib/cloudflare/r2.js.map +1 -0
- package/dist/lib/cloudflare/vectorize.js +494 -0
- package/dist/lib/cloudflare/vectorize.js.map +1 -0
- package/dist/lib/cloudflare/workflows.js +569 -0
- package/dist/lib/cloudflare/workflows.js.map +1 -0
- package/dist/lib/colo/caching.js +196 -0
- package/dist/lib/colo/caching.js.map +1 -0
- package/dist/lib/colo/detection.js +194 -0
- package/dist/lib/colo/detection.js.map +1 -0
- package/dist/lib/colo/external-data.js +219 -0
- package/dist/lib/colo/external-data.js.map +1 -0
- package/dist/lib/colo/globe-data.js +179 -0
- package/dist/lib/colo/globe-data.js.map +1 -0
- package/dist/lib/colo/index.js +16 -0
- package/dist/lib/colo/index.js.map +1 -0
- package/dist/lib/decorators.js +37 -0
- package/dist/lib/decorators.js.map +1 -0
- package/dist/lib/discovery.js +81 -0
- package/dist/lib/discovery.js.map +1 -0
- package/dist/lib/executors/AgenticFunctionExecutor.js +619 -0
- package/dist/lib/executors/AgenticFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/BaseFunctionExecutor.js +328 -0
- package/dist/lib/executors/BaseFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/CascadeExecutor.js +418 -0
- package/dist/lib/executors/CascadeExecutor.js.map +1 -0
- package/dist/lib/executors/CodeFunctionExecutor.js +904 -0
- package/dist/lib/executors/CodeFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/GenerativeFunctionExecutor.js +904 -0
- package/dist/lib/executors/GenerativeFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/HumanFunctionExecutor.js +884 -0
- package/dist/lib/executors/HumanFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/ParallelStepExecutor.js +308 -0
- package/dist/lib/executors/ParallelStepExecutor.js.map +1 -0
- package/dist/lib/executors/types.js +12 -0
- package/dist/lib/executors/types.js.map +1 -0
- package/dist/lib/experiments.js +89 -0
- package/dist/lib/experiments.js.map +1 -0
- package/dist/lib/flags/store.js +262 -0
- package/dist/lib/flags/store.js.map +1 -0
- package/dist/lib/functions/FunctionComposition.js +467 -0
- package/dist/lib/functions/FunctionComposition.js.map +1 -0
- package/dist/lib/functions/FunctionMiddleware.js +457 -0
- package/dist/lib/functions/FunctionMiddleware.js.map +1 -0
- package/dist/lib/functions/FunctionRegistry.js +426 -0
- package/dist/lib/functions/FunctionRegistry.js.map +1 -0
- package/dist/lib/functions/createFunction.js +1048 -0
- package/dist/lib/functions/createFunction.js.map +1 -0
- package/dist/lib/humans/index.js +68 -0
- package/dist/lib/humans/index.js.map +1 -0
- package/dist/lib/humans/templates.js +117 -0
- package/dist/lib/humans/templates.js.map +1 -0
- package/dist/lib/identity.js +98 -0
- package/dist/lib/identity.js.map +1 -0
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/logging/error-logger.js +163 -0
- package/dist/lib/logging/error-logger.js.map +1 -0
- package/dist/lib/logging/index.js +160 -0
- package/dist/lib/logging/index.js.map +1 -0
- package/dist/lib/mixins/bash.js +825 -0
- package/dist/lib/mixins/bash.js.map +1 -0
- package/dist/lib/mixins/fs.js +648 -0
- package/dist/lib/mixins/fs.js.map +1 -0
- package/dist/lib/mixins/git.js +1011 -0
- package/dist/lib/mixins/git.js.map +1 -0
- package/dist/lib/mixins/index.js +29 -0
- package/dist/lib/mixins/index.js.map +1 -0
- package/dist/lib/mixins/npm.js +662 -0
- package/dist/lib/mixins/npm.js.map +1 -0
- package/dist/lib/noun-id.js +278 -0
- package/dist/lib/noun-id.js.map +1 -0
- package/dist/lib/rate-limit/sliding-window.js +148 -0
- package/dist/lib/rate-limit/sliding-window.js.map +1 -0
- package/dist/lib/rate-limit.js +110 -0
- package/dist/lib/rate-limit.js.map +1 -0
- package/dist/lib/rpc/bindings.js +548 -0
- package/dist/lib/rpc/bindings.js.map +1 -0
- package/dist/lib/rpc/index.js +64 -0
- package/dist/lib/rpc/index.js.map +1 -0
- package/dist/lib/safe-stringify.js +223 -0
- package/dist/lib/safe-stringify.js.map +1 -0
- package/dist/lib/sandbox/miniflare-sandbox.js +1007 -0
- package/dist/lib/sandbox/miniflare-sandbox.js.map +1 -0
- package/dist/lib/sqids.js +110 -0
- package/dist/lib/sqids.js.map +1 -0
- package/dist/lib/sql/adapters/index.js +10 -0
- package/dist/lib/sql/adapters/index.js.map +1 -0
- package/dist/lib/sql/adapters/node-sql-parser.js +552 -0
- package/dist/lib/sql/adapters/node-sql-parser.js.map +1 -0
- package/dist/lib/sql/adapters/pgsql-parser.js +1189 -0
- package/dist/lib/sql/adapters/pgsql-parser.js.map +1 -0
- package/dist/lib/sql/index.js +277 -0
- package/dist/lib/sql/index.js.map +1 -0
- package/dist/lib/sql/types.js +56 -0
- package/dist/lib/sql/types.js.map +1 -0
- package/dist/lib/type-classifier.js +126 -0
- package/dist/lib/type-classifier.js.map +1 -0
- package/dist/lib/utils/html.js +47 -0
- package/dist/lib/utils/html.js.map +1 -0
- package/dist/lib/validation.js +48 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/vault/store.js +411 -0
- package/dist/lib/vault/store.js.map +1 -0
- package/dist/metrics/hunch.js +739 -0
- package/dist/metrics/hunch.js.map +1 -0
- package/dist/objects/API.js +302 -0
- package/dist/objects/API.js.map +1 -0
- package/dist/objects/Agent.js +179 -0
- package/dist/objects/Agent.js.map +1 -0
- package/dist/objects/AgenticFunctionExecutor.js +8 -0
- package/dist/objects/AgenticFunctionExecutor.js.map +1 -0
- package/dist/objects/App.js +83 -0
- package/dist/objects/App.js.map +1 -0
- package/dist/objects/Browser.js +884 -0
- package/dist/objects/Browser.js.map +1 -0
- package/dist/objects/Business.js +107 -0
- package/dist/objects/Business.js.map +1 -0
- package/dist/objects/CLI.js +221 -0
- package/dist/objects/CLI.js.map +1 -0
- package/dist/objects/CodeFunctionExecutor.js +8 -0
- package/dist/objects/CodeFunctionExecutor.js.map +1 -0
- package/dist/objects/Collection.js +161 -0
- package/dist/objects/Collection.js.map +1 -0
- package/dist/objects/DO.js +41 -0
- package/dist/objects/DO.js.map +1 -0
- package/dist/objects/DOBase.js +2309 -0
- package/dist/objects/DOBase.js.map +1 -0
- package/dist/objects/DOFull.js +1676 -0
- package/dist/objects/DOFull.js.map +1 -0
- package/dist/objects/DOTiny.js +207 -0
- package/dist/objects/DOTiny.js.map +1 -0
- package/dist/objects/Directory.js +199 -0
- package/dist/objects/Directory.js.map +1 -0
- package/dist/objects/Entity.js +413 -0
- package/dist/objects/Entity.js.map +1 -0
- package/dist/objects/Function.js +116 -0
- package/dist/objects/Function.js.map +1 -0
- package/dist/objects/Human.js +231 -0
- package/dist/objects/Human.js.map +1 -0
- package/dist/objects/HumanFunctionExecutor.js +8 -0
- package/dist/objects/HumanFunctionExecutor.js.map +1 -0
- package/dist/objects/IcebergMetadataDO.js +938 -0
- package/dist/objects/IcebergMetadataDO.js.map +1 -0
- package/dist/objects/IntegrationsDO.js +1174 -0
- package/dist/objects/IntegrationsDO.js.map +1 -0
- package/dist/objects/ObservabilityBroadcaster.js +149 -0
- package/dist/objects/ObservabilityBroadcaster.js.map +1 -0
- package/dist/objects/Package.js +154 -0
- package/dist/objects/Package.js.map +1 -0
- package/dist/objects/Product.js +193 -0
- package/dist/objects/Product.js.map +1 -0
- package/dist/objects/SDK.js +152 -0
- package/dist/objects/SDK.js.map +1 -0
- package/dist/objects/SaaS.js +235 -0
- package/dist/objects/SaaS.js.map +1 -0
- package/dist/objects/SandboxDO.js +759 -0
- package/dist/objects/SandboxDO.js.map +1 -0
- package/dist/objects/Service.js +337 -0
- package/dist/objects/Service.js.map +1 -0
- package/dist/objects/Site.js +80 -0
- package/dist/objects/Site.js.map +1 -0
- package/dist/objects/Startup.js +479 -0
- package/dist/objects/Startup.js.map +1 -0
- package/dist/objects/ThingsDO.js +170 -0
- package/dist/objects/ThingsDO.js.map +1 -0
- package/dist/objects/VectorShardDO.js +648 -0
- package/dist/objects/VectorShardDO.js.map +1 -0
- package/dist/objects/Worker.js +144 -0
- package/dist/objects/Worker.js.map +1 -0
- package/dist/objects/Workflow.js +196 -0
- package/dist/objects/Workflow.js.map +1 -0
- package/dist/objects/WorkflowFactory.js +313 -0
- package/dist/objects/WorkflowFactory.js.map +1 -0
- package/dist/objects/WorkflowRuntime.js +863 -0
- package/dist/objects/WorkflowRuntime.js.map +1 -0
- package/dist/objects/circuit-breaker-bulkhead.js +178 -0
- package/dist/objects/circuit-breaker-bulkhead.js.map +1 -0
- package/dist/objects/createFunction.js +934 -0
- package/dist/objects/createFunction.js.map +1 -0
- package/dist/objects/index.js +80 -0
- package/dist/objects/index.js.map +1 -0
- package/dist/objects/lifecycle/Branch.js +275 -0
- package/dist/objects/lifecycle/Branch.js.map +1 -0
- package/dist/objects/lifecycle/Clone.js +1499 -0
- package/dist/objects/lifecycle/Clone.js.map +1 -0
- package/dist/objects/lifecycle/Compact.js +237 -0
- package/dist/objects/lifecycle/Compact.js.map +1 -0
- package/dist/objects/lifecycle/Promote.js +476 -0
- package/dist/objects/lifecycle/Promote.js.map +1 -0
- package/dist/objects/lifecycle/Shard.js +560 -0
- package/dist/objects/lifecycle/Shard.js.map +1 -0
- package/dist/objects/lifecycle/index.js +15 -0
- package/dist/objects/lifecycle/index.js.map +1 -0
- package/dist/objects/lifecycle/types.js +33 -0
- package/dist/objects/lifecycle/types.js.map +1 -0
- package/dist/objects/mixins/infrastructure.js +171 -0
- package/dist/objects/mixins/infrastructure.js.map +1 -0
- package/dist/objects/modules/StoresModule.js +153 -0
- package/dist/objects/modules/StoresModule.js.map +1 -0
- package/dist/objects/persistence/checkpoint-manager.js +606 -0
- package/dist/objects/persistence/checkpoint-manager.js.map +1 -0
- package/dist/objects/persistence/index.js +72 -0
- package/dist/objects/persistence/index.js.map +1 -0
- package/dist/objects/persistence/migration-runner.js +562 -0
- package/dist/objects/persistence/migration-runner.js.map +1 -0
- package/dist/objects/persistence/replication-manager.js +501 -0
- package/dist/objects/persistence/replication-manager.js.map +1 -0
- package/dist/objects/persistence/tiered-storage-manager.js +595 -0
- package/dist/objects/persistence/tiered-storage-manager.js.map +1 -0
- package/dist/objects/persistence/types.js +14 -0
- package/dist/objects/persistence/types.js.map +1 -0
- package/dist/objects/persistence/wal-manager.js +653 -0
- package/dist/objects/persistence/wal-manager.js.map +1 -0
- package/dist/objects/presets/index.js +20 -0
- package/dist/objects/presets/index.js.map +1 -0
- package/dist/objects/presets/primitives.js +188 -0
- package/dist/objects/presets/primitives.js.map +1 -0
- package/dist/objects/primitives/alarm-adapter.js +141 -0
- package/dist/objects/primitives/alarm-adapter.js.map +1 -0
- package/dist/objects/primitives/index.js +337 -0
- package/dist/objects/primitives/index.js.map +1 -0
- package/dist/objects/primitives/storage-adapter.js +182 -0
- package/dist/objects/primitives/storage-adapter.js.map +1 -0
- package/dist/objects/primitives/with-primitives.js +102 -0
- package/dist/objects/primitives/with-primitives.js.map +1 -0
- package/dist/objects/services/StoreManager.js +227 -0
- package/dist/objects/services/StoreManager.js.map +1 -0
- package/dist/objects/services/index.js +13 -0
- package/dist/objects/services/index.js.map +1 -0
- package/dist/objects/transport/auth-layer.js +1451 -0
- package/dist/objects/transport/auth-layer.js.map +1 -0
- package/dist/objects/transport/capnweb-target.js +355 -0
- package/dist/objects/transport/capnweb-target.js.map +1 -0
- package/dist/objects/transport/chain.js +441 -0
- package/dist/objects/transport/chain.js.map +1 -0
- package/dist/objects/transport/handler.js +58 -0
- package/dist/objects/transport/handler.js.map +1 -0
- package/dist/objects/transport/index.js +53 -0
- package/dist/objects/transport/index.js.map +1 -0
- package/dist/objects/transport/mcp-server.js +690 -0
- package/dist/objects/transport/mcp-server.js.map +1 -0
- package/dist/objects/transport/rest-autowire.js +1507 -0
- package/dist/objects/transport/rest-autowire.js.map +1 -0
- package/dist/objects/transport/rest-router.js +440 -0
- package/dist/objects/transport/rest-router.js.map +1 -0
- package/dist/objects/transport/rpc-server.js +1536 -0
- package/dist/objects/transport/rpc-server.js.map +1 -0
- package/dist/objects/transport/shared.js +575 -0
- package/dist/objects/transport/shared.js.map +1 -0
- package/dist/objects/transport/sync-engine.js +291 -0
- package/dist/objects/transport/sync-engine.js.map +1 -0
- package/dist/objects/transport/types.js +8 -0
- package/dist/objects/transport/types.js.map +1 -0
- package/dist/primitives/bashx/src/ast/analyze.js +1472 -0
- package/dist/primitives/bashx/src/ast/analyze.js.map +1 -0
- package/dist/primitives/bashx/src/ast/parser.js +1488 -0
- package/dist/primitives/bashx/src/ast/parser.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/crypto.js +1954 -0
- package/dist/primitives/bashx/src/do/commands/crypto.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/data-processing.js +1812 -0
- package/dist/primitives/bashx/src/do/commands/data-processing.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/extended-utils.js +804 -0
- package/dist/primitives/bashx/src/do/commands/extended-utils.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/math-control.js +1122 -0
- package/dist/primitives/bashx/src/do/commands/math-control.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/posix-utils.js +1015 -0
- package/dist/primitives/bashx/src/do/commands/posix-utils.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/system-utils.js +687 -0
- package/dist/primitives/bashx/src/do/commands/system-utils.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/test-command.js +523 -0
- package/dist/primitives/bashx/src/do/commands/test-command.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/text-processing.js +1550 -0
- package/dist/primitives/bashx/src/do/commands/text-processing.js.map +1 -0
- package/dist/primitives/bashx/src/do/container-executor.js +429 -0
- package/dist/primitives/bashx/src/do/container-executor.js.map +1 -0
- package/dist/primitives/bashx/src/do/index.js +668 -0
- package/dist/primitives/bashx/src/do/index.js.map +1 -0
- package/dist/primitives/bashx/src/do/tiered-executor.js +2647 -0
- package/dist/primitives/bashx/src/do/tiered-executor.js.map +1 -0
- package/dist/primitives/bashx/src/do/worker.js +352 -0
- package/dist/primitives/bashx/src/do/worker.js.map +1 -0
- package/dist/primitives/bashx/src/types.js +10 -0
- package/dist/primitives/bashx/src/types.js.map +1 -0
- package/dist/primitives/fsx/core/backend.js +480 -0
- package/dist/primitives/fsx/core/backend.js.map +1 -0
- package/dist/primitives/fsx/core/constants.js +140 -0
- package/dist/primitives/fsx/core/constants.js.map +1 -0
- package/dist/primitives/fsx/core/fsx.js +1184 -0
- package/dist/primitives/fsx/core/fsx.js.map +1 -0
- package/dist/primitives/fsx/core/glob/glob.js +438 -0
- package/dist/primitives/fsx/core/glob/glob.js.map +1 -0
- package/dist/primitives/fsx/core/glob/index.js +8 -0
- package/dist/primitives/fsx/core/glob/index.js.map +1 -0
- package/dist/primitives/fsx/core/glob/match.js +392 -0
- package/dist/primitives/fsx/core/glob/match.js.map +1 -0
- package/dist/primitives/fsx/core/types.js +307 -0
- package/dist/primitives/fsx/core/types.js.map +1 -0
- package/dist/sandbox/index.js +258 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sdk/capnweb-compat.js +42 -0
- package/dist/sdk/capnweb-compat.js.map +1 -0
- package/dist/sdk/client.js +20 -0
- package/dist/sdk/client.js.map +1 -0
- package/dist/sdk/index.js +17 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/snippets/artifacts-config.js +241 -0
- package/dist/snippets/artifacts-config.js.map +1 -0
- package/dist/snippets/artifacts-ingest.js +832 -0
- package/dist/snippets/artifacts-ingest.js.map +1 -0
- package/dist/snippets/artifacts-serve.js +1035 -0
- package/dist/snippets/artifacts-serve.js.map +1 -0
- package/dist/snippets/artifacts-types.js +161 -0
- package/dist/snippets/artifacts-types.js.map +1 -0
- package/dist/snippets/cache-probe.js +376 -0
- package/dist/snippets/cache-probe.js.map +1 -0
- package/dist/snippets/cache.js +10 -0
- package/dist/snippets/cache.js.map +1 -0
- package/dist/snippets/events.js +469 -0
- package/dist/snippets/events.js.map +1 -0
- package/dist/snippets/index.js +7 -0
- package/dist/snippets/index.js.map +1 -0
- package/dist/snippets/proxy.js +495 -0
- package/dist/snippets/proxy.js.map +1 -0
- package/dist/snippets/search.js +1759 -0
- package/dist/snippets/search.js.map +1 -0
- package/dist/streams/index.js +30 -0
- package/dist/streams/index.js.map +1 -0
- package/dist/streams/observability.js +68 -0
- package/dist/streams/observability.js.map +1 -0
- package/dist/types/AI.js +92 -0
- package/dist/types/AI.js.map +1 -0
- package/dist/types/AIFunction.js +171 -0
- package/dist/types/AIFunction.js.map +1 -0
- package/dist/types/BrowseVerb.js +89 -0
- package/dist/types/BrowseVerb.js.map +1 -0
- package/dist/types/Browser.js +31 -0
- package/dist/types/Browser.js.map +1 -0
- package/dist/types/Chaos.js +15 -0
- package/dist/types/Chaos.js.map +1 -0
- package/dist/types/CloudflareBindings.js +109 -0
- package/dist/types/CloudflareBindings.js.map +1 -0
- package/dist/types/Collection.js +50 -0
- package/dist/types/Collection.js.map +1 -0
- package/dist/types/DO.js +2 -0
- package/dist/types/DO.js.map +1 -0
- package/dist/types/DOLocation.js +63 -0
- package/dist/types/DOLocation.js.map +1 -0
- package/dist/types/EventHandler.js +57 -0
- package/dist/types/EventHandler.js.map +1 -0
- package/dist/types/Experiment.js +33 -0
- package/dist/types/Experiment.js.map +1 -0
- package/dist/types/Flag.js +57 -0
- package/dist/types/Flag.js.map +1 -0
- package/dist/types/Lifecycle.js +13 -0
- package/dist/types/Lifecycle.js.map +1 -0
- package/dist/types/Location.js +169 -0
- package/dist/types/Location.js.map +1 -0
- package/dist/types/Noun.js +66 -0
- package/dist/types/Noun.js.map +1 -0
- package/dist/types/SessionEvent.js +194 -0
- package/dist/types/SessionEvent.js.map +1 -0
- package/dist/types/Thing.js +55 -0
- package/dist/types/Thing.js.map +1 -0
- package/dist/types/ThingDO.js +153 -0
- package/dist/types/ThingDO.js.map +1 -0
- package/dist/types/Things.js +2 -0
- package/dist/types/Things.js.map +1 -0
- package/dist/types/Verb.js +119 -0
- package/dist/types/Verb.js.map +1 -0
- package/dist/types/WorkflowContext.js +70 -0
- package/dist/types/WorkflowContext.js.map +1 -0
- package/dist/types/analytics-api.js +13 -0
- package/dist/types/analytics-api.js.map +1 -0
- package/dist/types/capabilities.js +135 -0
- package/dist/types/capabilities.js.map +1 -0
- package/dist/types/drizzle.js +12 -0
- package/dist/types/drizzle.js.map +1 -0
- package/dist/types/event.js +201 -0
- package/dist/types/event.js.map +1 -0
- package/dist/types/fn.js +12 -0
- package/dist/types/fn.js.map +1 -0
- package/dist/types/iceberg.js +48 -0
- package/dist/types/iceberg.js.map +1 -0
- package/dist/types/ids.js +170 -0
- package/dist/types/ids.js.map +1 -0
- package/dist/types/index.js +41 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/introspect.js +54 -0
- package/dist/types/introspect.js.map +1 -0
- package/dist/types/observability.js +124 -0
- package/dist/types/observability.js.map +1 -0
- package/dist/types/sync-protocol.js +175 -0
- package/dist/types/sync-protocol.js.map +1 -0
- package/dist/types/vector.js +13 -0
- package/dist/types/vector.js.map +1 -0
- package/dist/workflows/ScheduleManager.js +473 -0
- package/dist/workflows/ScheduleManager.js.map +1 -0
- package/dist/workflows/StepDOBridge.js +149 -0
- package/dist/workflows/StepDOBridge.js.map +1 -0
- package/dist/workflows/StepResultStorage.js +232 -0
- package/dist/workflows/StepResultStorage.js.map +1 -0
- package/dist/workflows/WaitForEventManager.js +461 -0
- package/dist/workflows/WaitForEventManager.js.map +1 -0
- package/dist/workflows/analyzer.js +332 -0
- package/dist/workflows/analyzer.js.map +1 -0
- package/dist/workflows/compat/activity-router.js +484 -0
- package/dist/workflows/compat/activity-router.js.map +1 -0
- package/dist/workflows/compat/backends/cloudflare-workflows.js +431 -0
- package/dist/workflows/compat/backends/cloudflare-workflows.js.map +1 -0
- package/dist/workflows/compat/backends/index.js +14 -0
- package/dist/workflows/compat/backends/index.js.map +1 -0
- package/dist/workflows/compat/errors/index.js +375 -0
- package/dist/workflows/compat/errors/index.js.map +1 -0
- package/dist/workflows/compat/index.js +79 -0
- package/dist/workflows/compat/index.js.map +1 -0
- package/dist/workflows/compat/inngest/index.js +989 -0
- package/dist/workflows/compat/inngest/index.js.map +1 -0
- package/dist/workflows/compat/qstash/index.js +1263 -0
- package/dist/workflows/compat/qstash/index.js.map +1 -0
- package/dist/workflows/compat/temporal/activities.js +739 -0
- package/dist/workflows/compat/temporal/activities.js.map +1 -0
- package/dist/workflows/compat/temporal/child-workflows.js +154 -0
- package/dist/workflows/compat/temporal/child-workflows.js.map +1 -0
- package/dist/workflows/compat/temporal/client.js +381 -0
- package/dist/workflows/compat/temporal/client.js.map +1 -0
- package/dist/workflows/compat/temporal/context.js +309 -0
- package/dist/workflows/compat/temporal/context.js.map +1 -0
- package/dist/workflows/compat/temporal/determinism.js +216 -0
- package/dist/workflows/compat/temporal/determinism.js.map +1 -0
- package/dist/workflows/compat/temporal/errors.js +128 -0
- package/dist/workflows/compat/temporal/errors.js.map +1 -0
- package/dist/workflows/compat/temporal/index.js +2464 -0
- package/dist/workflows/compat/temporal/index.js.map +1 -0
- package/dist/workflows/compat/temporal/saga.js +504 -0
- package/dist/workflows/compat/temporal/saga.js.map +1 -0
- package/dist/workflows/compat/temporal/signals.js +364 -0
- package/dist/workflows/compat/temporal/signals.js.map +1 -0
- package/dist/workflows/compat/temporal/storage.js +271 -0
- package/dist/workflows/compat/temporal/storage.js.map +1 -0
- package/dist/workflows/compat/temporal/timers.js +347 -0
- package/dist/workflows/compat/temporal/timers.js.map +1 -0
- package/dist/workflows/compat/temporal/types.js +7 -0
- package/dist/workflows/compat/temporal/types.js.map +1 -0
- package/dist/workflows/compat/temporal/unified-primitives.js +339 -0
- package/dist/workflows/compat/temporal/unified-primitives.js.map +1 -0
- package/dist/workflows/compat/trigger/index.js +468 -0
- package/dist/workflows/compat/trigger/index.js.map +1 -0
- package/dist/workflows/compat/utils/index.js +69 -0
- package/dist/workflows/compat/utils/index.js.map +1 -0
- package/dist/workflows/context/correlation-capability.js +266 -0
- package/dist/workflows/context/correlation-capability.js.map +1 -0
- package/dist/workflows/context/correlation.js +484 -0
- package/dist/workflows/context/correlation.js.map +1 -0
- package/dist/workflows/context/experiment.js +289 -0
- package/dist/workflows/context/experiment.js.map +1 -0
- package/dist/workflows/context/flag.js +244 -0
- package/dist/workflows/context/flag.js.map +1 -0
- package/dist/workflows/context/foundation.js +648 -0
- package/dist/workflows/context/foundation.js.map +1 -0
- package/dist/workflows/context/human-base.js +106 -0
- package/dist/workflows/context/human-base.js.map +1 -0
- package/dist/workflows/context/human.js +368 -0
- package/dist/workflows/context/human.js.map +1 -0
- package/dist/workflows/context/measure.js +354 -0
- package/dist/workflows/context/measure.js.map +1 -0
- package/dist/workflows/context/rate-limit.js +358 -0
- package/dist/workflows/context/rate-limit.js.map +1 -0
- package/dist/workflows/context/user.js +117 -0
- package/dist/workflows/context/user.js.map +1 -0
- package/dist/workflows/context/vault.js +360 -0
- package/dist/workflows/context/vault.js.map +1 -0
- package/dist/workflows/data/entity-events/entity-events.js +489 -0
- package/dist/workflows/data/entity-events/entity-events.js.map +1 -0
- package/dist/workflows/data/experiment/index.js +599 -0
- package/dist/workflows/data/experiment/index.js.map +1 -0
- package/dist/workflows/data/goal/context.js +558 -0
- package/dist/workflows/data/goal/context.js.map +1 -0
- package/dist/workflows/data/goal/index.js +32 -0
- package/dist/workflows/data/goal/index.js.map +1 -0
- package/dist/workflows/data/measure/index.js +840 -0
- package/dist/workflows/data/measure/index.js.map +1 -0
- package/dist/workflows/data/stream/index.js +1215 -0
- package/dist/workflows/data/stream/index.js.map +1 -0
- package/dist/workflows/data/track/context.js +883 -0
- package/dist/workflows/data/track/context.js.map +1 -0
- package/dist/workflows/data/track/index.js +15 -0
- package/dist/workflows/data/track/index.js.map +1 -0
- package/dist/workflows/data/view/context.js +864 -0
- package/dist/workflows/data/view/context.js.map +1 -0
- package/dist/workflows/domain.js +93 -0
- package/dist/workflows/domain.js.map +1 -0
- package/dist/workflows/flag.js +176 -0
- package/dist/workflows/flag.js.map +1 -0
- package/dist/workflows/flags.js +217 -0
- package/dist/workflows/flags.js.map +1 -0
- package/dist/workflows/hash.js +209 -0
- package/dist/workflows/hash.js.map +1 -0
- package/dist/workflows/index.js +50 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/on.js +378 -0
- package/dist/workflows/on.js.map +1 -0
- package/dist/workflows/pipeline-promise.js +481 -0
- package/dist/workflows/pipeline-promise.js.map +1 -0
- package/dist/workflows/pipeline-types.js +20 -0
- package/dist/workflows/pipeline-types.js.map +1 -0
- package/dist/workflows/proxy.js +76 -0
- package/dist/workflows/proxy.js.map +1 -0
- package/dist/workflows/runtime.js +310 -0
- package/dist/workflows/runtime.js.map +1 -0
- package/dist/workflows/schedule-builder.js +327 -0
- package/dist/workflows/schedule-builder.js.map +1 -0
- package/dist/workflows/visibility/index.js +148 -0
- package/dist/workflows/visibility/index.js.map +1 -0
- package/dist/workflows/visibility/query-parser.js +150 -0
- package/dist/workflows/visibility/query-parser.js.map +1 -0
- package/dist/workflows/visibility/store.js +223 -0
- package/dist/workflows/visibility/store.js.map +1 -0
- package/dist/workflows/visibility/types.js +30 -0
- package/dist/workflows/visibility/types.js.map +1 -0
- package/dist/workflows/workflow.js +53 -0
- package/dist/workflows/workflow.js.map +1 -0
- package/package.json +279 -46
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Path Indexing Module
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for creating, managing, and syncing JSON path indexes
|
|
5
|
+
* on Things and Relationships tables.
|
|
6
|
+
*
|
|
7
|
+
* SQLite supports expression indexes which can index json_extract() results:
|
|
8
|
+
* CREATE INDEX idx ON things(json_extract(data, '$.field'))
|
|
9
|
+
*
|
|
10
|
+
* This module provides:
|
|
11
|
+
* - createJsonIndex: Create a single JSON path index
|
|
12
|
+
* - dropJsonIndex: Remove a JSON path index
|
|
13
|
+
* - listJsonIndexes: List all JSON path indexes on a table
|
|
14
|
+
* - syncNounIndexes: Sync indexes based on Noun schema
|
|
15
|
+
* - getIndexName: Generate consistent index names
|
|
16
|
+
* - validateIndexPath: Validate JSON path for safety
|
|
17
|
+
*
|
|
18
|
+
* @see dotdo-p2r1z for issue details
|
|
19
|
+
*/
|
|
20
|
+
import { sql } from 'drizzle-orm';
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// CONSTANTS
|
|
23
|
+
// ============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* Valid tables for JSON indexing
|
|
26
|
+
*/
|
|
27
|
+
const VALID_TABLES = ['things', 'relationships'];
|
|
28
|
+
/**
|
|
29
|
+
* Regex for valid JSON paths:
|
|
30
|
+
* - Must start with letter or underscore
|
|
31
|
+
* - Can contain alphanumeric, underscore
|
|
32
|
+
* - Dots allowed for nesting (but not leading, trailing, or consecutive)
|
|
33
|
+
*/
|
|
34
|
+
const VALID_JSON_PATH_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)*$/;
|
|
35
|
+
/**
|
|
36
|
+
* Prefix for all JSON path indexes to distinguish from regular indexes
|
|
37
|
+
*/
|
|
38
|
+
const INDEX_PREFIX = 'idx_';
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// UTILITIES
|
|
41
|
+
// ============================================================================
|
|
42
|
+
/**
|
|
43
|
+
* Generate consistent index name for a JSON path.
|
|
44
|
+
*
|
|
45
|
+
* Format: idx_{table}_data_{path} or idx_{table}_type{id}_data_{path}
|
|
46
|
+
*
|
|
47
|
+
* @param table - Table name ('things' or 'relationships')
|
|
48
|
+
* @param path - JSON path (e.g., 'status', 'config.enabled')
|
|
49
|
+
* @param typeId - Optional type ID for partial index
|
|
50
|
+
* @returns Generated index name
|
|
51
|
+
*/
|
|
52
|
+
export function getIndexName(table, path, typeId) {
|
|
53
|
+
// Convert path dots to underscores for valid SQL identifier
|
|
54
|
+
const safePath = path.replace(/\./g, '_');
|
|
55
|
+
if (typeId !== undefined) {
|
|
56
|
+
return `${INDEX_PREFIX}${table}_type${typeId}_data_${safePath}`;
|
|
57
|
+
}
|
|
58
|
+
return `${INDEX_PREFIX}${table}_data_${safePath}`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Parse index name back to components.
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
64
|
+
function parseIndexName(name) {
|
|
65
|
+
// Pattern: idx_{table}_data_{path} or idx_{table}_type{id}_data_{path}
|
|
66
|
+
// or idx_{table}_verb_{verb}_data_{path}
|
|
67
|
+
const typeMatch = name.match(/^idx_(\w+)_type(\d+)_data_(.+)$/);
|
|
68
|
+
if (typeMatch) {
|
|
69
|
+
return {
|
|
70
|
+
table: typeMatch[1],
|
|
71
|
+
typeId: parseInt(typeMatch[2], 10),
|
|
72
|
+
path: typeMatch[3].replace(/_/g, '.'),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const verbMatch = name.match(/^idx_(\w+)_verb_(\w+)_data_(.+)$/);
|
|
76
|
+
if (verbMatch) {
|
|
77
|
+
return {
|
|
78
|
+
table: verbMatch[1],
|
|
79
|
+
verbFilter: verbMatch[2],
|
|
80
|
+
path: verbMatch[3].replace(/_/g, '.'),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const simpleMatch = name.match(/^idx_(\w+)_data_(.+)$/);
|
|
84
|
+
if (simpleMatch) {
|
|
85
|
+
return {
|
|
86
|
+
table: simpleMatch[1],
|
|
87
|
+
path: simpleMatch[2].replace(/_/g, '.'),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Validate JSON path for safety (prevent SQL injection).
|
|
94
|
+
*
|
|
95
|
+
* @param path - JSON path to validate
|
|
96
|
+
* @throws Error if path is invalid
|
|
97
|
+
*/
|
|
98
|
+
export function validateIndexPath(path) {
|
|
99
|
+
if (!path || typeof path !== 'string') {
|
|
100
|
+
throw new Error('Invalid JSON path: path is required');
|
|
101
|
+
}
|
|
102
|
+
if (!VALID_JSON_PATH_REGEX.test(path)) {
|
|
103
|
+
throw new Error(`Invalid JSON path: '${path}'. Path must contain only alphanumeric characters, underscores, and dots for nesting.`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Validate table name.
|
|
108
|
+
* @internal
|
|
109
|
+
*/
|
|
110
|
+
function validateTable(table) {
|
|
111
|
+
if (!VALID_TABLES.includes(table)) {
|
|
112
|
+
throw new Error(`Invalid table: '${table}'. Must be 'things' or 'relationships'.`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Build SQLite JSON path string.
|
|
117
|
+
* @internal
|
|
118
|
+
*/
|
|
119
|
+
function buildJsonPath(path) {
|
|
120
|
+
return `$.${path}`;
|
|
121
|
+
}
|
|
122
|
+
// ============================================================================
|
|
123
|
+
// INDEX OPERATIONS
|
|
124
|
+
// ============================================================================
|
|
125
|
+
/**
|
|
126
|
+
* Create a JSON path index on a table.
|
|
127
|
+
*
|
|
128
|
+
* Creates an expression index using json_extract():
|
|
129
|
+
* CREATE INDEX IF NOT EXISTS idx_things_data_status
|
|
130
|
+
* ON things(type, json_extract(data, '$.status'))
|
|
131
|
+
* WHERE type = 1;
|
|
132
|
+
*
|
|
133
|
+
* @param db - Drizzle database instance
|
|
134
|
+
* @param options - Index options
|
|
135
|
+
*/
|
|
136
|
+
export async function createJsonIndex(db, options) {
|
|
137
|
+
// Validate inputs
|
|
138
|
+
validateTable(options.table);
|
|
139
|
+
validateIndexPath(options.path);
|
|
140
|
+
const indexName = options.typeId !== undefined
|
|
141
|
+
? getIndexName(options.table, options.path, options.typeId)
|
|
142
|
+
: options.verbFilter
|
|
143
|
+
? `${INDEX_PREFIX}${options.table}_verb_${options.verbFilter}_data_${options.path.replace(/\./g, '_')}`
|
|
144
|
+
: getIndexName(options.table, options.path);
|
|
145
|
+
const jsonPath = buildJsonPath(options.path);
|
|
146
|
+
// Build CREATE INDEX statement
|
|
147
|
+
let indexSql;
|
|
148
|
+
if (options.table === 'things') {
|
|
149
|
+
if (options.typeId !== undefined) {
|
|
150
|
+
// Partial index filtered by type - include type in index for composite filtering
|
|
151
|
+
indexSql = `CREATE INDEX IF NOT EXISTS ${indexName} ON things(type, json_extract(data, '${jsonPath}')) WHERE type = ${options.typeId}`;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Full index on all rows
|
|
155
|
+
indexSql = `CREATE INDEX IF NOT EXISTS ${indexName} ON things(json_extract(data, '${jsonPath}'))`;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// relationships table
|
|
160
|
+
if (options.verbFilter) {
|
|
161
|
+
// Partial index filtered by verb
|
|
162
|
+
indexSql = `CREATE INDEX IF NOT EXISTS ${indexName} ON relationships(verb, json_extract(data, '${jsonPath}')) WHERE verb = '${options.verbFilter}'`;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
// Full index on all rows
|
|
166
|
+
indexSql = `CREATE INDEX IF NOT EXISTS ${indexName} ON relationships(json_extract(data, '${jsonPath}'))`;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Execute the SQL
|
|
170
|
+
// Handle both Drizzle and raw sqlite3 database objects
|
|
171
|
+
// First try to get the underlying connection via $client (Drizzle pattern)
|
|
172
|
+
const connection = db.$client || db;
|
|
173
|
+
if (typeof connection.exec === 'function') {
|
|
174
|
+
// better-sqlite3 Database object
|
|
175
|
+
connection.exec(indexSql);
|
|
176
|
+
}
|
|
177
|
+
else if (typeof connection.run === 'function') {
|
|
178
|
+
// Some other sqlite driver
|
|
179
|
+
connection.run(indexSql);
|
|
180
|
+
}
|
|
181
|
+
else if (typeof db.run === 'function') {
|
|
182
|
+
// Drizzle's run method
|
|
183
|
+
await db.run(sql.raw(indexSql));
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
throw new Error('Unsupported database type for createJsonIndex');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Drop a JSON path index from a table.
|
|
191
|
+
*
|
|
192
|
+
* @param db - Drizzle database instance
|
|
193
|
+
* @param options - Index options (path and typeId used to determine index name)
|
|
194
|
+
*/
|
|
195
|
+
export async function dropJsonIndex(db, options) {
|
|
196
|
+
validateTable(options.table);
|
|
197
|
+
validateIndexPath(options.path);
|
|
198
|
+
const indexName = getIndexName(options.table, options.path, options.typeId);
|
|
199
|
+
const dropSql = `DROP INDEX IF EXISTS ${indexName}`;
|
|
200
|
+
// Execute the SQL
|
|
201
|
+
const connection = db.$client || db;
|
|
202
|
+
if (typeof connection.exec === 'function') {
|
|
203
|
+
connection.exec(dropSql);
|
|
204
|
+
}
|
|
205
|
+
else if (typeof connection.run === 'function') {
|
|
206
|
+
connection.run(dropSql);
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
await db.run(sql.raw(dropSql));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* List all JSON path indexes on a table.
|
|
214
|
+
*
|
|
215
|
+
* Queries sqlite_master for indexes matching our naming convention.
|
|
216
|
+
*
|
|
217
|
+
* @param db - Drizzle database instance
|
|
218
|
+
* @param table - Table name
|
|
219
|
+
* @returns Array of JSON index info
|
|
220
|
+
*/
|
|
221
|
+
export async function listJsonIndexes(db, table) {
|
|
222
|
+
validateTable(table);
|
|
223
|
+
// Query sqlite_master for indexes on the table
|
|
224
|
+
// Pattern matches: idx_{table}_data_*, idx_{table}_type*_data_*, idx_{table}_verb_*_data_*
|
|
225
|
+
const querySql = `SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = '${table}' AND name LIKE 'idx_${table}%data_%'`;
|
|
226
|
+
let rows;
|
|
227
|
+
// Execute the query
|
|
228
|
+
const connection = db.$client || db;
|
|
229
|
+
if (typeof connection.prepare === 'function') {
|
|
230
|
+
// better-sqlite3
|
|
231
|
+
const stmt = connection.prepare(querySql);
|
|
232
|
+
rows = stmt.all();
|
|
233
|
+
}
|
|
234
|
+
else if (typeof connection.all === 'function') {
|
|
235
|
+
// D1 or other async sqlite
|
|
236
|
+
rows = await connection.all(querySql);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
// Drizzle
|
|
240
|
+
const result = await db.all(sql.raw(querySql));
|
|
241
|
+
rows = result;
|
|
242
|
+
}
|
|
243
|
+
// Parse index names back to JsonIndexInfo
|
|
244
|
+
const indexes = [];
|
|
245
|
+
for (const row of rows) {
|
|
246
|
+
const parsed = parseIndexName(row.name);
|
|
247
|
+
if (parsed && parsed.table === table) {
|
|
248
|
+
indexes.push({
|
|
249
|
+
name: row.name,
|
|
250
|
+
path: parsed.path,
|
|
251
|
+
table: table,
|
|
252
|
+
typeId: parsed.typeId,
|
|
253
|
+
verbFilter: parsed.verbFilter,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return indexes;
|
|
258
|
+
}
|
|
259
|
+
// ============================================================================
|
|
260
|
+
// NOUN SYNC
|
|
261
|
+
// ============================================================================
|
|
262
|
+
/**
|
|
263
|
+
* Parse schema definition to check if field should be indexed.
|
|
264
|
+
* @internal
|
|
265
|
+
*/
|
|
266
|
+
function shouldIndex(definition) {
|
|
267
|
+
if (typeof definition === 'string') {
|
|
268
|
+
// Support shorthand: '#string' (hash prefix = indexed)
|
|
269
|
+
return definition.startsWith('#');
|
|
270
|
+
}
|
|
271
|
+
return definition.index === true;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Extract field path from schema key.
|
|
275
|
+
* For nested paths like 'config.enabled', returns as-is.
|
|
276
|
+
* @internal
|
|
277
|
+
*/
|
|
278
|
+
function getFieldPath(key) {
|
|
279
|
+
return key;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Sync JSON path indexes based on Noun schema.
|
|
283
|
+
*
|
|
284
|
+
* Creates indexes for fields marked with index: true.
|
|
285
|
+
* Drops indexes for fields no longer marked as indexed.
|
|
286
|
+
*
|
|
287
|
+
* @param db - Drizzle database instance
|
|
288
|
+
* @param options - Sync options
|
|
289
|
+
*/
|
|
290
|
+
export async function syncNounIndexes(db, options) {
|
|
291
|
+
const { typeId, schema } = options;
|
|
292
|
+
// Get current indexes for this type
|
|
293
|
+
const existingIndexes = await listJsonIndexes(db, 'things');
|
|
294
|
+
const typeIndexes = existingIndexes.filter((idx) => idx.typeId === typeId);
|
|
295
|
+
const existingPaths = new Set(typeIndexes.map((idx) => idx.path));
|
|
296
|
+
// Determine which paths should be indexed
|
|
297
|
+
const desiredPaths = new Set();
|
|
298
|
+
for (const [key, definition] of Object.entries(schema)) {
|
|
299
|
+
if (shouldIndex(definition)) {
|
|
300
|
+
const path = getFieldPath(key);
|
|
301
|
+
try {
|
|
302
|
+
validateIndexPath(path);
|
|
303
|
+
desiredPaths.add(path);
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
// Invalid path - skip
|
|
307
|
+
console.warn(`Skipping invalid index path: ${path}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Create missing indexes
|
|
312
|
+
for (const path of desiredPaths) {
|
|
313
|
+
if (!existingPaths.has(path)) {
|
|
314
|
+
await createJsonIndex(db, {
|
|
315
|
+
table: 'things',
|
|
316
|
+
path,
|
|
317
|
+
typeId,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Drop obsolete indexes
|
|
322
|
+
for (const path of existingPaths) {
|
|
323
|
+
if (!desiredPaths.has(path)) {
|
|
324
|
+
await dropJsonIndex(db, {
|
|
325
|
+
table: 'things',
|
|
326
|
+
path,
|
|
327
|
+
typeId,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=json-indexes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-indexes.js","sourceRoot":"","sources":["../../db/json-indexes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { eq, and } from 'drizzle-orm';
|
|
3
|
+
import { linkedAccounts } from './auth';
|
|
4
|
+
// ============================================================================
|
|
5
|
+
// LINKED ACCOUNTS - Query helpers and type validation
|
|
6
|
+
// ============================================================================
|
|
7
|
+
//
|
|
8
|
+
// This module provides:
|
|
9
|
+
// 1. Zod schemas for runtime validation of metadata and provider data
|
|
10
|
+
// 2. Query helper functions for common operations
|
|
11
|
+
// 3. Type-safe builders for linked account queries
|
|
12
|
+
//
|
|
13
|
+
// Usage:
|
|
14
|
+
// import { getLinkedAccount, LinkedAccountMetadataSchema } from './linked-accounts'
|
|
15
|
+
//
|
|
16
|
+
// // Query helper
|
|
17
|
+
// const account = await getLinkedAccount(db, userId, 'github')
|
|
18
|
+
//
|
|
19
|
+
// // Validate metadata
|
|
20
|
+
// const result = LinkedAccountMetadataSchema.safeParse(metadata)
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// ZOD SCHEMAS FOR VALIDATION
|
|
24
|
+
// ============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Valid linked account status values
|
|
27
|
+
*/
|
|
28
|
+
export const LinkedAccountStatusSchema = z.enum(['active', 'pending', 'expired', 'revoked']);
|
|
29
|
+
/**
|
|
30
|
+
* Base metadata schema - common fields across all provider types.
|
|
31
|
+
* This is intentionally flexible to support various integration types.
|
|
32
|
+
*/
|
|
33
|
+
export const LinkedAccountMetadataBaseSchema = z.object({
|
|
34
|
+
/** OAuth scopes granted to this connection */
|
|
35
|
+
scopes: z.array(z.string()).optional(),
|
|
36
|
+
/** Type of token (bearer, api_key, etc.) */
|
|
37
|
+
tokenType: z.string().optional(),
|
|
38
|
+
/** When the integration was first installed/connected */
|
|
39
|
+
installedAt: z.string().datetime().optional(),
|
|
40
|
+
/** Webhook ID if applicable */
|
|
41
|
+
webhookId: z.string().optional(),
|
|
42
|
+
/** Display name from the provider */
|
|
43
|
+
displayName: z.string().optional(),
|
|
44
|
+
/** Email from the provider */
|
|
45
|
+
email: z.string().email().optional(),
|
|
46
|
+
/** Avatar URL from the provider */
|
|
47
|
+
avatarUrl: z.string().url().optional(),
|
|
48
|
+
/** Profile URL on the provider platform */
|
|
49
|
+
profileUrl: z.string().url().optional(),
|
|
50
|
+
});
|
|
51
|
+
/**
|
|
52
|
+
* GitHub-specific metadata schema
|
|
53
|
+
*/
|
|
54
|
+
export const GitHubMetadataSchema = LinkedAccountMetadataBaseSchema.extend({
|
|
55
|
+
/** GitHub username */
|
|
56
|
+
login: z.string().optional(),
|
|
57
|
+
/** GitHub user ID */
|
|
58
|
+
githubId: z.number().optional(),
|
|
59
|
+
/** List of organizations the user belongs to */
|
|
60
|
+
organizations: z.array(z.string()).optional(),
|
|
61
|
+
/** GitHub App installation ID (for GitHub Apps) */
|
|
62
|
+
installationId: z.number().optional(),
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* Slack-specific metadata schema
|
|
66
|
+
*/
|
|
67
|
+
export const SlackMetadataSchema = LinkedAccountMetadataBaseSchema.extend({
|
|
68
|
+
/** Slack workspace ID */
|
|
69
|
+
teamId: z.string().optional(),
|
|
70
|
+
/** Slack workspace name */
|
|
71
|
+
teamName: z.string().optional(),
|
|
72
|
+
/** Slack user ID */
|
|
73
|
+
slackUserId: z.string().optional(),
|
|
74
|
+
/** Bot user ID (for bot tokens) */
|
|
75
|
+
botUserId: z.string().optional(),
|
|
76
|
+
/** Incoming webhook URL */
|
|
77
|
+
incomingWebhookUrl: z.string().url().optional(),
|
|
78
|
+
});
|
|
79
|
+
/**
|
|
80
|
+
* Generic metadata schema - allows additional properties beyond base fields.
|
|
81
|
+
* Use this when you don't know the specific provider type.
|
|
82
|
+
*/
|
|
83
|
+
export const LinkedAccountMetadataSchema = LinkedAccountMetadataBaseSchema.passthrough();
|
|
84
|
+
/**
|
|
85
|
+
* Provider-specific metadata schemas map
|
|
86
|
+
*/
|
|
87
|
+
export const ProviderMetadataSchemas = {
|
|
88
|
+
github: GitHubMetadataSchema,
|
|
89
|
+
slack: SlackMetadataSchema,
|
|
90
|
+
// Add more provider-specific schemas as needed
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Get the appropriate metadata schema for a provider type
|
|
94
|
+
*/
|
|
95
|
+
export function getMetadataSchemaForProvider(provider) {
|
|
96
|
+
const providerKey = provider.toLowerCase().replace(/-oauth|-api|-app$/, '');
|
|
97
|
+
if (providerKey in ProviderMetadataSchemas) {
|
|
98
|
+
return ProviderMetadataSchemas[providerKey];
|
|
99
|
+
}
|
|
100
|
+
return LinkedAccountMetadataSchema;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Schema for creating a new linked account (input validation)
|
|
104
|
+
*/
|
|
105
|
+
export const NewLinkedAccountSchema = z.object({
|
|
106
|
+
id: z.string().min(1),
|
|
107
|
+
identityId: z.string().min(1),
|
|
108
|
+
type: z.string().min(1),
|
|
109
|
+
provider: z.string().min(1),
|
|
110
|
+
providerAccountId: z.string().min(1),
|
|
111
|
+
vaultRef: z.string().optional().nullable(),
|
|
112
|
+
status: LinkedAccountStatusSchema.default('active'),
|
|
113
|
+
expiresAt: z.date().optional().nullable(),
|
|
114
|
+
metadata: LinkedAccountMetadataSchema.optional().nullable(),
|
|
115
|
+
createdAt: z.date(),
|
|
116
|
+
updatedAt: z.date(),
|
|
117
|
+
});
|
|
118
|
+
// ============================================================================
|
|
119
|
+
// VALIDATION HELPERS
|
|
120
|
+
// ============================================================================
|
|
121
|
+
/**
|
|
122
|
+
* Validate metadata for a linked account.
|
|
123
|
+
* Returns the validated metadata or throws a ZodError.
|
|
124
|
+
*
|
|
125
|
+
* @param metadata - The metadata object to validate
|
|
126
|
+
* @param provider - Optional provider name for provider-specific validation
|
|
127
|
+
* @returns Validated metadata object
|
|
128
|
+
*/
|
|
129
|
+
export function validateMetadata(metadata, provider) {
|
|
130
|
+
const schema = provider ? getMetadataSchemaForProvider(provider) : LinkedAccountMetadataSchema;
|
|
131
|
+
return schema.parse(metadata);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Safely validate metadata without throwing.
|
|
135
|
+
*
|
|
136
|
+
* @param metadata - The metadata object to validate
|
|
137
|
+
* @param provider - Optional provider name for provider-specific validation
|
|
138
|
+
* @returns Zod safe parse result
|
|
139
|
+
*/
|
|
140
|
+
export function safeValidateMetadata(metadata, provider) {
|
|
141
|
+
const schema = provider ? getMetadataSchemaForProvider(provider) : LinkedAccountMetadataSchema;
|
|
142
|
+
return schema.safeParse(metadata);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Validate a new linked account object.
|
|
146
|
+
*
|
|
147
|
+
* @param account - The account object to validate
|
|
148
|
+
* @returns Validated account object
|
|
149
|
+
*/
|
|
150
|
+
export function validateNewLinkedAccount(account) {
|
|
151
|
+
return NewLinkedAccountSchema.parse(account);
|
|
152
|
+
}
|
|
153
|
+
// ============================================================================
|
|
154
|
+
// QUERY HELPERS
|
|
155
|
+
// ============================================================================
|
|
156
|
+
/**
|
|
157
|
+
* Get a single linked account by identity ID and provider.
|
|
158
|
+
* Uses the composite index on (identityId, provider) for efficient lookup.
|
|
159
|
+
*
|
|
160
|
+
* @param db - Drizzle database instance
|
|
161
|
+
* @param identityId - The identity ID to look up
|
|
162
|
+
* @param provider - The provider name (e.g., 'github', 'slack')
|
|
163
|
+
* @returns The linked account or undefined if not found
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```ts
|
|
167
|
+
* const githubAccount = await getLinkedAccount(db, 'identity-123', 'github')
|
|
168
|
+
* if (githubAccount) {
|
|
169
|
+
* console.log(`Connected as ${githubAccount.providerAccountId}`)
|
|
170
|
+
* }
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
export async function getLinkedAccount(db, identityId, provider) {
|
|
174
|
+
const results = await db
|
|
175
|
+
.select()
|
|
176
|
+
.from(linkedAccounts)
|
|
177
|
+
.where(and(eq(linkedAccounts.identityId, identityId), eq(linkedAccounts.provider, provider)));
|
|
178
|
+
return results[0];
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get all linked accounts for an identity.
|
|
182
|
+
* Uses the identity index for efficient lookup.
|
|
183
|
+
*
|
|
184
|
+
* @param db - Drizzle database instance
|
|
185
|
+
* @param identityId - The identity ID to look up
|
|
186
|
+
* @returns Array of linked accounts for the identity
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```ts
|
|
190
|
+
* const accounts = await getLinkedAccountsByIdentity(db, 'identity-123')
|
|
191
|
+
* console.log(`User has ${accounts.length} connected accounts`)
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
export async function getLinkedAccountsByIdentity(db, identityId) {
|
|
195
|
+
return db
|
|
196
|
+
.select()
|
|
197
|
+
.from(linkedAccounts)
|
|
198
|
+
.where(eq(linkedAccounts.identityId, identityId));
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Alias for getLinkedAccountsByIdentity for backward compatibility.
|
|
202
|
+
* @deprecated Use getLinkedAccountsByIdentity instead
|
|
203
|
+
*/
|
|
204
|
+
export const getLinkedAccountsByUser = getLinkedAccountsByIdentity;
|
|
205
|
+
/**
|
|
206
|
+
* Get all linked accounts for a specific provider.
|
|
207
|
+
* Uses the provider index for efficient lookup.
|
|
208
|
+
*
|
|
209
|
+
* @param db - Drizzle database instance
|
|
210
|
+
* @param provider - The provider name (e.g., 'github', 'slack')
|
|
211
|
+
* @returns Array of linked accounts for the provider
|
|
212
|
+
*
|
|
213
|
+
* @example
|
|
214
|
+
* ```ts
|
|
215
|
+
* const githubAccounts = await getLinkedAccountsByProvider(db, 'github')
|
|
216
|
+
* console.log(`${githubAccounts.length} users have connected GitHub`)
|
|
217
|
+
* ```
|
|
218
|
+
*/
|
|
219
|
+
export async function getLinkedAccountsByProvider(db, provider) {
|
|
220
|
+
return db
|
|
221
|
+
.select()
|
|
222
|
+
.from(linkedAccounts)
|
|
223
|
+
.where(eq(linkedAccounts.provider, provider));
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get all linked accounts by integration type.
|
|
227
|
+
* Uses the type index for efficient lookup.
|
|
228
|
+
*
|
|
229
|
+
* @param db - Drizzle database instance
|
|
230
|
+
* @param type - The integration type (e.g., 'github', 'slack', 'vcs:github')
|
|
231
|
+
* @returns Array of linked accounts for the type
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```ts
|
|
235
|
+
* const vcsAccounts = await getLinkedAccountsByType(db, 'vcs:github')
|
|
236
|
+
* ```
|
|
237
|
+
*/
|
|
238
|
+
export async function getLinkedAccountsByType(db, type) {
|
|
239
|
+
return db
|
|
240
|
+
.select()
|
|
241
|
+
.from(linkedAccounts)
|
|
242
|
+
.where(eq(linkedAccounts.type, type));
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get all active linked accounts for an identity.
|
|
246
|
+
* Filters by status = 'active'.
|
|
247
|
+
*
|
|
248
|
+
* @param db - Drizzle database instance
|
|
249
|
+
* @param identityId - The identity ID to look up
|
|
250
|
+
* @returns Array of active linked accounts
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* ```ts
|
|
254
|
+
* const activeAccounts = await getActiveLinkedAccounts(db, 'identity-123')
|
|
255
|
+
* ```
|
|
256
|
+
*/
|
|
257
|
+
export async function getActiveLinkedAccounts(db, identityId) {
|
|
258
|
+
return db
|
|
259
|
+
.select()
|
|
260
|
+
.from(linkedAccounts)
|
|
261
|
+
.where(and(eq(linkedAccounts.identityId, identityId), eq(linkedAccounts.status, 'active')));
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Check if an identity has a specific provider connected.
|
|
265
|
+
*
|
|
266
|
+
* @param db - Drizzle database instance
|
|
267
|
+
* @param identityId - The identity ID to check
|
|
268
|
+
* @param provider - The provider to check for
|
|
269
|
+
* @returns Boolean indicating if the provider is connected
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
* ```ts
|
|
273
|
+
* const hasGithub = await hasLinkedProvider(db, 'identity-123', 'github')
|
|
274
|
+
* if (!hasGithub) {
|
|
275
|
+
* // Prompt user to connect GitHub
|
|
276
|
+
* }
|
|
277
|
+
* ```
|
|
278
|
+
*/
|
|
279
|
+
export async function hasLinkedProvider(db, identityId, provider) {
|
|
280
|
+
const account = await getLinkedAccount(db, identityId, provider);
|
|
281
|
+
return account !== undefined;
|
|
282
|
+
}
|
|
283
|
+
// ============================================================================
|
|
284
|
+
// EXPORT THE SCHEMA TABLE FOR CONVENIENCE
|
|
285
|
+
// ============================================================================
|
|
286
|
+
export { linkedAccounts };
|
|
287
|
+
//# sourceMappingURL=linked-accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linked-accounts.js","sourceRoot":"","sources":["../../db/linked-accounts.ts"],"names":[],"mappings":"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"}
|