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,662 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* withNpm Mixin - NPM Package Management Capability
|
|
3
|
+
*
|
|
4
|
+
* Adds $.npm to the WorkflowContext with package management operations:
|
|
5
|
+
* - resolve, install, list, lockfile
|
|
6
|
+
* - run (requires withBash)
|
|
7
|
+
* - pack
|
|
8
|
+
*
|
|
9
|
+
* Uses the npm registry API for package resolution and provides
|
|
10
|
+
* filesystem-backed package management via $.fs.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { withNpm, withFs } from 'dotdo/mixins'
|
|
15
|
+
* import { DO } from 'dotdo'
|
|
16
|
+
*
|
|
17
|
+
* // Basic usage with filesystem
|
|
18
|
+
* class MyDO extends withNpm(withFs(DO)) {
|
|
19
|
+
* async setup() {
|
|
20
|
+
* // Install lodash
|
|
21
|
+
* await this.$.npm.install('lodash', '4.17.21')
|
|
22
|
+
*
|
|
23
|
+
* // List installed packages
|
|
24
|
+
* const packages = await this.$.npm.list()
|
|
25
|
+
* console.log(packages)
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* // With bash capability for npm run scripts
|
|
30
|
+
* class BuildDO extends withNpm(withBash(withFs(DO))) {
|
|
31
|
+
* async build() {
|
|
32
|
+
* await this.$.npm.install() // Install all deps from package.json
|
|
33
|
+
* const result = await this.$.npm.run('build')
|
|
34
|
+
* return result.exitCode === 0
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @module lib/mixins/npm
|
|
40
|
+
*/
|
|
41
|
+
/**
|
|
42
|
+
* Parse a version string into its components.
|
|
43
|
+
*/
|
|
44
|
+
function parseSemVer(version) {
|
|
45
|
+
const match = version.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9.-]+))?/);
|
|
46
|
+
if (!match)
|
|
47
|
+
return null;
|
|
48
|
+
return {
|
|
49
|
+
major: parseInt(match[1], 10),
|
|
50
|
+
minor: parseInt(match[2], 10),
|
|
51
|
+
patch: parseInt(match[3], 10),
|
|
52
|
+
prerelease: match[4]?.split('.'),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Compare two semantic versions.
|
|
57
|
+
* Returns -1 if a < b, 0 if a === b, 1 if a > b.
|
|
58
|
+
*/
|
|
59
|
+
function compareSemVer(a, b) {
|
|
60
|
+
const parsedA = parseSemVer(a);
|
|
61
|
+
const parsedB = parseSemVer(b);
|
|
62
|
+
if (!parsedA || !parsedB)
|
|
63
|
+
return 0;
|
|
64
|
+
if (parsedA.major !== parsedB.major)
|
|
65
|
+
return parsedA.major - parsedB.major;
|
|
66
|
+
if (parsedA.minor !== parsedB.minor)
|
|
67
|
+
return parsedA.minor - parsedB.minor;
|
|
68
|
+
if (parsedA.patch !== parsedB.patch)
|
|
69
|
+
return parsedA.patch - parsedB.patch;
|
|
70
|
+
// Prerelease versions have lower precedence
|
|
71
|
+
if (parsedA.prerelease && !parsedB.prerelease)
|
|
72
|
+
return -1;
|
|
73
|
+
if (!parsedA.prerelease && parsedB.prerelease)
|
|
74
|
+
return 1;
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if a version satisfies a semver range.
|
|
79
|
+
* Supports: exact, ^, ~, >=, >, <=, <, *, latest
|
|
80
|
+
*/
|
|
81
|
+
function satisfies(version, range) {
|
|
82
|
+
const parsed = parseSemVer(version);
|
|
83
|
+
if (!parsed)
|
|
84
|
+
return false;
|
|
85
|
+
// Handle special cases
|
|
86
|
+
if (range === '*' || range === 'latest' || range === '')
|
|
87
|
+
return true;
|
|
88
|
+
// Handle exact version
|
|
89
|
+
if (/^\d+\.\d+\.\d+/.test(range)) {
|
|
90
|
+
const rangeVersion = parseSemVer(range);
|
|
91
|
+
return rangeVersion !== null && compareSemVer(version, range) === 0;
|
|
92
|
+
}
|
|
93
|
+
// Handle caret (^) - compatible with version
|
|
94
|
+
if (range.startsWith('^')) {
|
|
95
|
+
const rangeVersion = parseSemVer(range.slice(1));
|
|
96
|
+
if (!rangeVersion)
|
|
97
|
+
return false;
|
|
98
|
+
if (rangeVersion.major === 0) {
|
|
99
|
+
// ^0.x.y means >=0.x.y <0.(x+1).0 for 0.x.y
|
|
100
|
+
if (rangeVersion.minor === 0) {
|
|
101
|
+
return parsed.major === 0 && parsed.minor === 0 && parsed.patch >= rangeVersion.patch;
|
|
102
|
+
}
|
|
103
|
+
return parsed.major === 0 && parsed.minor === rangeVersion.minor && parsed.patch >= rangeVersion.patch;
|
|
104
|
+
}
|
|
105
|
+
return parsed.major === rangeVersion.major &&
|
|
106
|
+
(parsed.minor > rangeVersion.minor ||
|
|
107
|
+
(parsed.minor === rangeVersion.minor && parsed.patch >= rangeVersion.patch));
|
|
108
|
+
}
|
|
109
|
+
// Handle tilde (~) - approximately equivalent
|
|
110
|
+
if (range.startsWith('~')) {
|
|
111
|
+
const rangeVersion = parseSemVer(range.slice(1));
|
|
112
|
+
if (!rangeVersion)
|
|
113
|
+
return false;
|
|
114
|
+
return parsed.major === rangeVersion.major &&
|
|
115
|
+
parsed.minor === rangeVersion.minor &&
|
|
116
|
+
parsed.patch >= rangeVersion.patch;
|
|
117
|
+
}
|
|
118
|
+
// Handle >= operator
|
|
119
|
+
if (range.startsWith('>=')) {
|
|
120
|
+
return compareSemVer(version, range.slice(2).trim()) >= 0;
|
|
121
|
+
}
|
|
122
|
+
// Handle > operator
|
|
123
|
+
if (range.startsWith('>') && !range.startsWith('>=')) {
|
|
124
|
+
return compareSemVer(version, range.slice(1).trim()) > 0;
|
|
125
|
+
}
|
|
126
|
+
// Handle <= operator
|
|
127
|
+
if (range.startsWith('<=')) {
|
|
128
|
+
return compareSemVer(version, range.slice(2).trim()) <= 0;
|
|
129
|
+
}
|
|
130
|
+
// Handle < operator
|
|
131
|
+
if (range.startsWith('<') && !range.startsWith('<=')) {
|
|
132
|
+
return compareSemVer(version, range.slice(1).trim()) < 0;
|
|
133
|
+
}
|
|
134
|
+
// Default: exact match
|
|
135
|
+
return compareSemVer(version, range) === 0;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Find the maximum version that satisfies a range.
|
|
139
|
+
*/
|
|
140
|
+
function maxSatisfying(versions, range) {
|
|
141
|
+
// Filter valid versions and sort descending
|
|
142
|
+
const validVersions = versions
|
|
143
|
+
.filter(v => parseSemVer(v) !== null && !parseSemVer(v)?.prerelease)
|
|
144
|
+
.sort((a, b) => -compareSemVer(a, b));
|
|
145
|
+
// Handle 'latest' tag
|
|
146
|
+
if (range === 'latest' || range === '*') {
|
|
147
|
+
return validVersions[0] || null;
|
|
148
|
+
}
|
|
149
|
+
// Find the first (highest) version that satisfies
|
|
150
|
+
for (const version of validVersions) {
|
|
151
|
+
if (satisfies(version, range)) {
|
|
152
|
+
return version;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
// ============================================================================
|
|
158
|
+
// REGISTRY FETCHER
|
|
159
|
+
// ============================================================================
|
|
160
|
+
/**
|
|
161
|
+
* Default npm registry URL
|
|
162
|
+
*/
|
|
163
|
+
const DEFAULT_REGISTRY = 'https://registry.npmjs.org';
|
|
164
|
+
/**
|
|
165
|
+
* Create a registry fetcher that fetches package metadata from npm registry.
|
|
166
|
+
*/
|
|
167
|
+
function createRegistryFetcher(registry = DEFAULT_REGISTRY) {
|
|
168
|
+
const cache = new Map();
|
|
169
|
+
async function fetchPackageMetadata(name) {
|
|
170
|
+
const cacheKey = `${registry}/${name}`;
|
|
171
|
+
if (cache.has(cacheKey)) {
|
|
172
|
+
return cache.get(cacheKey);
|
|
173
|
+
}
|
|
174
|
+
const promise = fetch(`${registry}/${encodeURIComponent(name)}`, {
|
|
175
|
+
headers: {
|
|
176
|
+
Accept: 'application/json',
|
|
177
|
+
},
|
|
178
|
+
}).then((res) => {
|
|
179
|
+
if (!res.ok) {
|
|
180
|
+
throw new Error(`Package not found: ${name}`);
|
|
181
|
+
}
|
|
182
|
+
return res.json();
|
|
183
|
+
});
|
|
184
|
+
cache.set(cacheKey, promise);
|
|
185
|
+
return promise;
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
async getPackageVersions(name) {
|
|
189
|
+
const metadata = await fetchPackageMetadata(name);
|
|
190
|
+
return Object.keys(metadata.versions || {});
|
|
191
|
+
},
|
|
192
|
+
async getPackageInfo(name, version) {
|
|
193
|
+
const metadata = await fetchPackageMetadata(name);
|
|
194
|
+
const versionData = metadata.versions?.[version];
|
|
195
|
+
if (!versionData) {
|
|
196
|
+
throw new Error(`Version ${version} not found for package ${name}`);
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
name: versionData.name,
|
|
200
|
+
version: versionData.version,
|
|
201
|
+
dependencies: versionData.dependencies,
|
|
202
|
+
devDependencies: versionData.devDependencies,
|
|
203
|
+
peerDependencies: versionData.peerDependencies,
|
|
204
|
+
optionalDependencies: versionData.optionalDependencies,
|
|
205
|
+
dist: versionData.dist,
|
|
206
|
+
};
|
|
207
|
+
},
|
|
208
|
+
async getLatestVersion(name) {
|
|
209
|
+
const metadata = await fetchPackageMetadata(name);
|
|
210
|
+
const latest = metadata['dist-tags']?.latest;
|
|
211
|
+
if (!latest) {
|
|
212
|
+
const versions = Object.keys(metadata.versions || {});
|
|
213
|
+
return maxSatisfying(versions, '*') || versions[0] || '';
|
|
214
|
+
}
|
|
215
|
+
return latest;
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// ============================================================================
|
|
220
|
+
// TARBALL CREATION
|
|
221
|
+
// ============================================================================
|
|
222
|
+
/**
|
|
223
|
+
* Create a tar header block (512 bytes)
|
|
224
|
+
*/
|
|
225
|
+
function createTarHeader(name, size, mode = 0o644) {
|
|
226
|
+
const header = new Uint8Array(512);
|
|
227
|
+
const encoder = new TextEncoder();
|
|
228
|
+
// Name (100 bytes)
|
|
229
|
+
const nameBytes = encoder.encode(name.slice(0, 99));
|
|
230
|
+
header.set(nameBytes, 0);
|
|
231
|
+
// Mode (8 bytes, octal)
|
|
232
|
+
const modeStr = mode.toString(8).padStart(7, '0') + '\0';
|
|
233
|
+
header.set(encoder.encode(modeStr), 100);
|
|
234
|
+
// UID (8 bytes, octal)
|
|
235
|
+
header.set(encoder.encode('0000000\0'), 108);
|
|
236
|
+
// GID (8 bytes, octal)
|
|
237
|
+
header.set(encoder.encode('0000000\0'), 116);
|
|
238
|
+
// Size (12 bytes, octal)
|
|
239
|
+
const sizeStr = size.toString(8).padStart(11, '0') + '\0';
|
|
240
|
+
header.set(encoder.encode(sizeStr), 124);
|
|
241
|
+
// Mtime (12 bytes, octal)
|
|
242
|
+
const mtime = Math.floor(Date.now() / 1000).toString(8).padStart(11, '0') + '\0';
|
|
243
|
+
header.set(encoder.encode(mtime), 136);
|
|
244
|
+
// Checksum placeholder (8 spaces)
|
|
245
|
+
header.set(encoder.encode(' '), 148);
|
|
246
|
+
// Type flag (1 byte) - '0' for regular file
|
|
247
|
+
header[156] = 0x30;
|
|
248
|
+
// USTAR indicator
|
|
249
|
+
header.set(encoder.encode('ustar'), 257);
|
|
250
|
+
header[262] = 0x00;
|
|
251
|
+
// Version
|
|
252
|
+
header.set(encoder.encode('00'), 263);
|
|
253
|
+
// Calculate checksum
|
|
254
|
+
let checksum = 0;
|
|
255
|
+
for (let i = 0; i < 512; i++) {
|
|
256
|
+
checksum += header[i];
|
|
257
|
+
}
|
|
258
|
+
const checksumStr = checksum.toString(8).padStart(6, '0') + '\0 ';
|
|
259
|
+
header.set(encoder.encode(checksumStr), 148);
|
|
260
|
+
return header;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Create a simple tarball from files.
|
|
264
|
+
*/
|
|
265
|
+
async function createTarball(files) {
|
|
266
|
+
const blocks = [];
|
|
267
|
+
for (const file of files) {
|
|
268
|
+
// Add header
|
|
269
|
+
const header = createTarHeader(file.path, file.content.length);
|
|
270
|
+
blocks.push(header);
|
|
271
|
+
// Add content
|
|
272
|
+
blocks.push(file.content);
|
|
273
|
+
// Pad to 512-byte boundary
|
|
274
|
+
const padding = 512 - (file.content.length % 512);
|
|
275
|
+
if (padding < 512) {
|
|
276
|
+
blocks.push(new Uint8Array(padding));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Add two empty blocks at end
|
|
280
|
+
blocks.push(new Uint8Array(1024));
|
|
281
|
+
// Calculate total size
|
|
282
|
+
const totalSize = blocks.reduce((sum, block) => sum + block.length, 0);
|
|
283
|
+
const result = new Uint8Array(totalSize);
|
|
284
|
+
let offset = 0;
|
|
285
|
+
for (const block of blocks) {
|
|
286
|
+
result.set(block, offset);
|
|
287
|
+
offset += block.length;
|
|
288
|
+
}
|
|
289
|
+
// Gzip compress using CompressionStream
|
|
290
|
+
const stream = new Blob([result]).stream();
|
|
291
|
+
const compressedStream = stream.pipeThrough(new CompressionStream('gzip'));
|
|
292
|
+
const compressedBlob = await new Response(compressedStream).blob();
|
|
293
|
+
return new Uint8Array(await compressedBlob.arrayBuffer());
|
|
294
|
+
}
|
|
295
|
+
// ============================================================================
|
|
296
|
+
// NPM MODULE IMPLEMENTATION
|
|
297
|
+
// ============================================================================
|
|
298
|
+
/**
|
|
299
|
+
* NpmModule provides npm-like package management operations.
|
|
300
|
+
*
|
|
301
|
+
* Uses $.fs for storage and optionally $.bash for running scripts.
|
|
302
|
+
*/
|
|
303
|
+
export class NpmModule {
|
|
304
|
+
fs;
|
|
305
|
+
bash;
|
|
306
|
+
registryFetcher;
|
|
307
|
+
constructor(fs, options) {
|
|
308
|
+
this.fs = fs;
|
|
309
|
+
this.bash = options?.bash;
|
|
310
|
+
this.registryFetcher = createRegistryFetcher(options?.registry);
|
|
311
|
+
}
|
|
312
|
+
async resolve(name, range) {
|
|
313
|
+
// Handle 'latest' tag specially
|
|
314
|
+
if (range === 'latest' || range === '') {
|
|
315
|
+
return this.registryFetcher.getLatestVersion(name);
|
|
316
|
+
}
|
|
317
|
+
const versions = await this.registryFetcher.getPackageVersions(name);
|
|
318
|
+
const resolved = maxSatisfying(versions, range);
|
|
319
|
+
if (!resolved) {
|
|
320
|
+
throw new Error(`No version of ${name} satisfies range ${range}`);
|
|
321
|
+
}
|
|
322
|
+
return resolved;
|
|
323
|
+
}
|
|
324
|
+
async install(name, version) {
|
|
325
|
+
const result = {
|
|
326
|
+
added: [],
|
|
327
|
+
removed: [],
|
|
328
|
+
updated: [],
|
|
329
|
+
};
|
|
330
|
+
// Ensure node_modules exists
|
|
331
|
+
const nodeModulesExists = await this.fs.exists('/node_modules');
|
|
332
|
+
if (!nodeModulesExists) {
|
|
333
|
+
await this.fs.mkdir('/node_modules', { recursive: true });
|
|
334
|
+
}
|
|
335
|
+
if (name) {
|
|
336
|
+
// Install specific package
|
|
337
|
+
const resolvedVersion = version || (await this.resolve(name, 'latest'));
|
|
338
|
+
const pkgInfo = await this.registryFetcher.getPackageInfo(name, resolvedVersion);
|
|
339
|
+
// Check if already installed
|
|
340
|
+
const pkgJsonPath = `/node_modules/${name}/package.json`;
|
|
341
|
+
const alreadyInstalled = await this.fs.exists(pkgJsonPath);
|
|
342
|
+
if (alreadyInstalled) {
|
|
343
|
+
const existingPkg = JSON.parse(await this.fs.read(pkgJsonPath));
|
|
344
|
+
if (existingPkg.version !== resolvedVersion) {
|
|
345
|
+
result.updated.push({
|
|
346
|
+
name,
|
|
347
|
+
from: existingPkg.version || 'unknown',
|
|
348
|
+
to: resolvedVersion,
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
// Already at correct version
|
|
353
|
+
return result;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
result.added.push({ name, version: resolvedVersion });
|
|
358
|
+
}
|
|
359
|
+
// Create package directory
|
|
360
|
+
await this.fs.mkdir(`/node_modules/${name}`, { recursive: true });
|
|
361
|
+
// Write package.json
|
|
362
|
+
await this.fs.write(pkgJsonPath, JSON.stringify({
|
|
363
|
+
name: pkgInfo.name,
|
|
364
|
+
version: pkgInfo.version,
|
|
365
|
+
dependencies: pkgInfo.dependencies,
|
|
366
|
+
}, null, 2));
|
|
367
|
+
// Note: Full tarball extraction would require downloading and extracting
|
|
368
|
+
// For now, we create the package.json which is sufficient for list() and lockfile()
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
// Install all from package.json
|
|
372
|
+
const packageJsonExists = await this.fs.exists('/package.json');
|
|
373
|
+
if (!packageJsonExists) {
|
|
374
|
+
throw new Error('No package.json found');
|
|
375
|
+
}
|
|
376
|
+
const packageJson = JSON.parse(await this.fs.read('/package.json'));
|
|
377
|
+
const allDeps = {
|
|
378
|
+
...packageJson.dependencies,
|
|
379
|
+
...packageJson.devDependencies,
|
|
380
|
+
};
|
|
381
|
+
for (const [depName, depRange] of Object.entries(allDeps)) {
|
|
382
|
+
const subResult = await this.install(depName, await this.resolve(depName, depRange));
|
|
383
|
+
result.added.push(...subResult.added);
|
|
384
|
+
result.updated.push(...subResult.updated);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// Update package-lock.json
|
|
388
|
+
await this.updateLockfile();
|
|
389
|
+
return result;
|
|
390
|
+
}
|
|
391
|
+
async list() {
|
|
392
|
+
const packages = [];
|
|
393
|
+
const nodeModulesExists = await this.fs.exists('/node_modules');
|
|
394
|
+
if (!nodeModulesExists) {
|
|
395
|
+
return packages;
|
|
396
|
+
}
|
|
397
|
+
const entries = await this.fs.list('/node_modules');
|
|
398
|
+
for (const entry of entries) {
|
|
399
|
+
if (entry.isDirectory && !entry.name.startsWith('.')) {
|
|
400
|
+
// Handle scoped packages (@org/pkg)
|
|
401
|
+
if (entry.name.startsWith('@')) {
|
|
402
|
+
const scopedEntries = await this.fs.list(`/node_modules/${entry.name}`);
|
|
403
|
+
for (const scopedEntry of scopedEntries) {
|
|
404
|
+
if (scopedEntry.isDirectory) {
|
|
405
|
+
const pkgJsonPath = `/node_modules/${entry.name}/${scopedEntry.name}/package.json`;
|
|
406
|
+
if (await this.fs.exists(pkgJsonPath)) {
|
|
407
|
+
try {
|
|
408
|
+
const pkgJson = JSON.parse(await this.fs.read(pkgJsonPath));
|
|
409
|
+
packages.push({
|
|
410
|
+
name: `${entry.name}/${scopedEntry.name}`,
|
|
411
|
+
version: pkgJson.version || 'unknown',
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
catch {
|
|
415
|
+
// Skip invalid package.json
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
const pkgJsonPath = `/node_modules/${entry.name}/package.json`;
|
|
423
|
+
if (await this.fs.exists(pkgJsonPath)) {
|
|
424
|
+
try {
|
|
425
|
+
const pkgJson = JSON.parse(await this.fs.read(pkgJsonPath));
|
|
426
|
+
packages.push({
|
|
427
|
+
name: entry.name,
|
|
428
|
+
version: pkgJson.version || 'unknown',
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
// Skip invalid package.json
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return packages;
|
|
439
|
+
}
|
|
440
|
+
async lockfile() {
|
|
441
|
+
const lockfilePath = '/package-lock.json';
|
|
442
|
+
const exists = await this.fs.exists(lockfilePath);
|
|
443
|
+
if (exists) {
|
|
444
|
+
const content = await this.fs.read(lockfilePath);
|
|
445
|
+
return JSON.parse(content);
|
|
446
|
+
}
|
|
447
|
+
// Generate lockfile from current state
|
|
448
|
+
return this.generateLockfile();
|
|
449
|
+
}
|
|
450
|
+
async run(script) {
|
|
451
|
+
if (!this.bash) {
|
|
452
|
+
throw new Error('withNpm.run() requires withBash capability. Apply withBash mixin to use npm scripts.');
|
|
453
|
+
}
|
|
454
|
+
// Read package.json to get scripts
|
|
455
|
+
const packageJsonExists = await this.fs.exists('/package.json');
|
|
456
|
+
if (!packageJsonExists) {
|
|
457
|
+
throw new Error('No package.json found');
|
|
458
|
+
}
|
|
459
|
+
const packageJson = JSON.parse(await this.fs.read('/package.json'));
|
|
460
|
+
const scriptCommand = packageJson.scripts?.[script];
|
|
461
|
+
if (!scriptCommand) {
|
|
462
|
+
throw new Error(`Script "${script}" not found in package.json`);
|
|
463
|
+
}
|
|
464
|
+
// Execute the script using bash capability
|
|
465
|
+
return this.bash.run(scriptCommand);
|
|
466
|
+
}
|
|
467
|
+
async pack(dir = '/') {
|
|
468
|
+
// Read package.json from the directory
|
|
469
|
+
const pkgJsonPath = dir === '/' ? '/package.json' : `${dir}/package.json`;
|
|
470
|
+
const pkgJsonExists = await this.fs.exists(pkgJsonPath);
|
|
471
|
+
if (!pkgJsonExists) {
|
|
472
|
+
throw new Error(`No package.json found in ${dir}`);
|
|
473
|
+
}
|
|
474
|
+
// Collect files to include
|
|
475
|
+
const files = [];
|
|
476
|
+
// Helper to recursively collect files
|
|
477
|
+
const collectFiles = async (currentDir, prefix) => {
|
|
478
|
+
const entries = await this.fs.list(currentDir);
|
|
479
|
+
for (const entry of entries) {
|
|
480
|
+
const fullPath = currentDir === '/' ? `/${entry.name}` : `${currentDir}/${entry.name}`;
|
|
481
|
+
const tarPath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
482
|
+
// Skip node_modules and common excludes
|
|
483
|
+
if (entry.name === 'node_modules' || entry.name === '.git') {
|
|
484
|
+
continue;
|
|
485
|
+
}
|
|
486
|
+
if (entry.isDirectory) {
|
|
487
|
+
await collectFiles(fullPath, tarPath);
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
const content = await this.fs.read(fullPath);
|
|
491
|
+
files.push({
|
|
492
|
+
path: `package/${tarPath}`,
|
|
493
|
+
content: new TextEncoder().encode(content),
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
};
|
|
498
|
+
await collectFiles(dir, '');
|
|
499
|
+
// Create tarball
|
|
500
|
+
return createTarball(files);
|
|
501
|
+
}
|
|
502
|
+
// ========================================================================
|
|
503
|
+
// Private Methods
|
|
504
|
+
// ========================================================================
|
|
505
|
+
async updateLockfile() {
|
|
506
|
+
const lockfile = await this.generateLockfile();
|
|
507
|
+
await this.fs.write('/package-lock.json', JSON.stringify(lockfile, null, 2));
|
|
508
|
+
}
|
|
509
|
+
async generateLockfile() {
|
|
510
|
+
const packages = {};
|
|
511
|
+
// Get root package.json
|
|
512
|
+
const packageJsonExists = await this.fs.exists('/package.json');
|
|
513
|
+
let rootPackage = {};
|
|
514
|
+
if (packageJsonExists) {
|
|
515
|
+
rootPackage = JSON.parse(await this.fs.read('/package.json'));
|
|
516
|
+
}
|
|
517
|
+
// Add root package entry
|
|
518
|
+
packages[''] = {
|
|
519
|
+
version: rootPackage.version || '0.0.0',
|
|
520
|
+
dependencies: rootPackage.dependencies,
|
|
521
|
+
};
|
|
522
|
+
// Add installed packages
|
|
523
|
+
const installed = await this.list();
|
|
524
|
+
for (const pkg of installed) {
|
|
525
|
+
const pkgJsonPath = `/node_modules/${pkg.name}/package.json`;
|
|
526
|
+
if (await this.fs.exists(pkgJsonPath)) {
|
|
527
|
+
const pkgJson = JSON.parse(await this.fs.read(pkgJsonPath));
|
|
528
|
+
packages[`node_modules/${pkg.name}`] = {
|
|
529
|
+
version: pkg.version,
|
|
530
|
+
dependencies: pkgJson.dependencies,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
return {
|
|
535
|
+
name: rootPackage.name,
|
|
536
|
+
version: rootPackage.version,
|
|
537
|
+
lockfileVersion: 3,
|
|
538
|
+
requires: true,
|
|
539
|
+
packages,
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
// ============================================================================
|
|
544
|
+
// MIXIN IMPLEMENTATION
|
|
545
|
+
// ============================================================================
|
|
546
|
+
// Symbol for caching the npm module instance
|
|
547
|
+
const NPM_MODULE_CACHE = Symbol('npmModuleCache');
|
|
548
|
+
/**
|
|
549
|
+
* Adds npm package management capability to a DO class.
|
|
550
|
+
*
|
|
551
|
+
* **Requires**: withFs capability (throws error if not present)
|
|
552
|
+
* **Optional**: withBash capability (required for $.npm.run())
|
|
553
|
+
*
|
|
554
|
+
* @param Base - The base DO class (must have withFs applied)
|
|
555
|
+
* @param options - Optional configuration
|
|
556
|
+
* @returns Extended class with npm capability
|
|
557
|
+
*
|
|
558
|
+
* @example Basic usage
|
|
559
|
+
* ```typescript
|
|
560
|
+
* import { withNpm, withFs } from 'dotdo/mixins'
|
|
561
|
+
* import { DO } from 'dotdo'
|
|
562
|
+
*
|
|
563
|
+
* class MyDO extends withNpm(withFs(DO)) {
|
|
564
|
+
* async install() {
|
|
565
|
+
* await this.$.npm.install('lodash', '4.17.21')
|
|
566
|
+
* }
|
|
567
|
+
* }
|
|
568
|
+
* ```
|
|
569
|
+
*
|
|
570
|
+
* @example With bash for scripts
|
|
571
|
+
* ```typescript
|
|
572
|
+
* import { withNpm, withBash, withFs } from 'dotdo/mixins'
|
|
573
|
+
* import { DO } from 'dotdo'
|
|
574
|
+
*
|
|
575
|
+
* class BuildDO extends withNpm(withBash(withFs(DO))) {
|
|
576
|
+
* async build() {
|
|
577
|
+
* await this.$.npm.install()
|
|
578
|
+
* const result = await this.$.npm.run('build')
|
|
579
|
+
* return result.exitCode === 0
|
|
580
|
+
* }
|
|
581
|
+
* }
|
|
582
|
+
* ```
|
|
583
|
+
*/
|
|
584
|
+
export function withNpm(Base, options) {
|
|
585
|
+
return class WithNpm extends Base {
|
|
586
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
587
|
+
static capabilities = [...(Base.capabilities || []), 'npm'];
|
|
588
|
+
/**
|
|
589
|
+
* Check if this DO class has a specific capability
|
|
590
|
+
*/
|
|
591
|
+
hasCapability(name) {
|
|
592
|
+
if (name === 'npm')
|
|
593
|
+
return true;
|
|
594
|
+
// Check if parent class has the hasCapability method
|
|
595
|
+
const baseProto = Base.prototype;
|
|
596
|
+
if (baseProto && typeof baseProto.hasCapability === 'function') {
|
|
597
|
+
return baseProto.hasCapability.call(this, name);
|
|
598
|
+
}
|
|
599
|
+
return false;
|
|
600
|
+
}
|
|
601
|
+
// Cache for the npm module instance
|
|
602
|
+
[NPM_MODULE_CACHE];
|
|
603
|
+
/**
|
|
604
|
+
* Lazy-loaded NpmModule
|
|
605
|
+
*/
|
|
606
|
+
get npmModule() {
|
|
607
|
+
if (!this[NPM_MODULE_CACHE]) {
|
|
608
|
+
// Get fs capability from $
|
|
609
|
+
const fs = this.$.fs;
|
|
610
|
+
if (!fs) {
|
|
611
|
+
throw new Error('withNpm requires withFs capability. Apply withFs mixin first.');
|
|
612
|
+
}
|
|
613
|
+
// Get optional bash capability
|
|
614
|
+
const bash = this.$.bash;
|
|
615
|
+
this[NPM_MODULE_CACHE] = new NpmModule(fs, {
|
|
616
|
+
bash: bash?.run ? { run: (script) => bash.run(script) } : undefined,
|
|
617
|
+
registry: options?.registry,
|
|
618
|
+
});
|
|
619
|
+
}
|
|
620
|
+
return this[NPM_MODULE_CACHE];
|
|
621
|
+
}
|
|
622
|
+
// TypeScript requires any[] for mixin constructors (TS2545)
|
|
623
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
624
|
+
constructor(...args) {
|
|
625
|
+
super(...args);
|
|
626
|
+
// Verify fs capability is available
|
|
627
|
+
const fs = this.$.fs;
|
|
628
|
+
if (!fs) {
|
|
629
|
+
throw new Error('withNpm requires withFs capability. Apply withFs mixin first.');
|
|
630
|
+
}
|
|
631
|
+
// Extend $ to include npm capability
|
|
632
|
+
const originalContext = this.$;
|
|
633
|
+
const self = this;
|
|
634
|
+
// Create a new proxy that extends the original $ with npm
|
|
635
|
+
this.$ = new Proxy(originalContext, {
|
|
636
|
+
get(target, prop) {
|
|
637
|
+
if (prop === 'npm') {
|
|
638
|
+
return self.npmModule;
|
|
639
|
+
}
|
|
640
|
+
// Forward to original context
|
|
641
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
642
|
+
const value = target[prop];
|
|
643
|
+
if (typeof value === 'function') {
|
|
644
|
+
// Only bind if it has a bind method (not a Proxy or capability object)
|
|
645
|
+
if (typeof value.bind === 'function') {
|
|
646
|
+
// Don't bind capability functions that have custom properties
|
|
647
|
+
// (like $.bash which is both callable AND has .exec, .run, etc.)
|
|
648
|
+
const customProps = Object.getOwnPropertyNames(value).filter((p) => p !== 'length' && p !== 'name' && p !== 'prototype');
|
|
649
|
+
if (customProps.length > 0) {
|
|
650
|
+
// This is a capability object with methods, return as-is
|
|
651
|
+
return value;
|
|
652
|
+
}
|
|
653
|
+
return value.bind(target);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
return value;
|
|
657
|
+
},
|
|
658
|
+
});
|
|
659
|
+
}
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
//# sourceMappingURL=npm.js.map
|