@procedures/client 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/README.md +832 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/adapters/http/client/index.d.ts +11 -0
- package/dist/adapters/http/client/index.d.ts.map +1 -0
- package/dist/adapters/http/client/index.js +18 -0
- package/dist/adapters/http/client/index.js.map +1 -0
- package/dist/adapters/http/client/transport.d.ts +72 -0
- package/dist/adapters/http/client/transport.d.ts.map +1 -0
- package/dist/adapters/http/client/transport.js +282 -0
- package/dist/adapters/http/client/transport.js.map +1 -0
- package/dist/adapters/http/client/types.d.ts +27 -0
- package/dist/adapters/http/client/types.d.ts.map +1 -0
- package/dist/adapters/http/client/types.js +8 -0
- package/dist/adapters/http/client/types.js.map +1 -0
- package/dist/adapters/http/index.d.ts +7 -0
- package/dist/adapters/http/index.d.ts.map +1 -0
- package/dist/adapters/http/index.js +7 -0
- package/dist/adapters/http/index.js.map +1 -0
- package/dist/adapters/http/server/index.d.ts +9 -0
- package/dist/adapters/http/server/index.d.ts.map +1 -0
- package/dist/adapters/http/server/index.js +10 -0
- package/dist/adapters/http/server/index.js.map +1 -0
- package/dist/adapters/http/server/strategies.d.ts +39 -0
- package/dist/adapters/http/server/strategies.d.ts.map +1 -0
- package/dist/adapters/http/server/strategies.js +90 -0
- package/dist/adapters/http/server/strategies.js.map +1 -0
- package/dist/adapters/http/server/transport.d.ts +66 -0
- package/dist/adapters/http/server/transport.d.ts.map +1 -0
- package/dist/adapters/http/server/transport.js +561 -0
- package/dist/adapters/http/server/transport.js.map +1 -0
- package/dist/adapters/http/server/types.d.ts +71 -0
- package/dist/adapters/http/server/types.d.ts.map +1 -0
- package/dist/adapters/http/server/types.js +7 -0
- package/dist/adapters/http/server/types.js.map +1 -0
- package/dist/adapters/http/shared/constants.d.ts +95 -0
- package/dist/adapters/http/shared/constants.d.ts.map +1 -0
- package/dist/adapters/http/shared/constants.js +102 -0
- package/dist/adapters/http/shared/constants.js.map +1 -0
- package/dist/adapters/http/shared/errors.d.ts +78 -0
- package/dist/adapters/http/shared/errors.d.ts.map +1 -0
- package/dist/adapters/http/shared/errors.js +151 -0
- package/dist/adapters/http/shared/errors.js.map +1 -0
- package/dist/adapters/http/shared/headers.d.ts +122 -0
- package/dist/adapters/http/shared/headers.d.ts.map +1 -0
- package/dist/adapters/http/shared/headers.js +216 -0
- package/dist/adapters/http/shared/headers.js.map +1 -0
- package/dist/adapters/http/shared/index.d.ts +12 -0
- package/dist/adapters/http/shared/index.d.ts.map +1 -0
- package/dist/adapters/http/shared/index.js +17 -0
- package/dist/adapters/http/shared/index.js.map +1 -0
- package/dist/adapters/http/shared/status-codes.d.ts +92 -0
- package/dist/adapters/http/shared/status-codes.d.ts.map +1 -0
- package/dist/adapters/http/shared/status-codes.js +189 -0
- package/dist/adapters/http/shared/status-codes.js.map +1 -0
- package/dist/adapters/http/shared/strategies.d.ts +90 -0
- package/dist/adapters/http/shared/strategies.d.ts.map +1 -0
- package/dist/adapters/http/shared/strategies.js +180 -0
- package/dist/adapters/http/shared/strategies.js.map +1 -0
- package/dist/adapters/local/client/index.d.ts +8 -0
- package/dist/adapters/local/client/index.d.ts.map +1 -0
- package/dist/adapters/local/client/index.js +8 -0
- package/dist/adapters/local/client/index.js.map +1 -0
- package/dist/adapters/local/client/transport.d.ts +81 -0
- package/dist/adapters/local/client/transport.d.ts.map +1 -0
- package/dist/adapters/local/client/transport.js +172 -0
- package/dist/adapters/local/client/transport.js.map +1 -0
- package/dist/adapters/local/client/types.d.ts +39 -0
- package/dist/adapters/local/client/types.d.ts.map +1 -0
- package/dist/adapters/local/client/types.js +13 -0
- package/dist/adapters/local/client/types.js.map +1 -0
- package/dist/adapters/metadata.d.ts +10 -0
- package/dist/adapters/metadata.d.ts.map +1 -0
- package/dist/adapters/metadata.js +19 -0
- package/dist/adapters/metadata.js.map +1 -0
- package/dist/adapters/mock/client/builder.d.ts +35 -0
- package/dist/adapters/mock/client/builder.d.ts.map +1 -0
- package/dist/adapters/mock/client/builder.js +58 -0
- package/dist/adapters/mock/client/builder.js.map +1 -0
- package/dist/adapters/mock/client/index.d.ts +9 -0
- package/dist/adapters/mock/client/index.d.ts.map +1 -0
- package/dist/adapters/mock/client/index.js +10 -0
- package/dist/adapters/mock/client/index.js.map +1 -0
- package/dist/adapters/mock/client/transport.d.ts +149 -0
- package/dist/adapters/mock/client/transport.d.ts.map +1 -0
- package/dist/adapters/mock/client/transport.js +289 -0
- package/dist/adapters/mock/client/transport.js.map +1 -0
- package/dist/adapters/mock/client/types.d.ts +86 -0
- package/dist/adapters/mock/client/types.d.ts.map +1 -0
- package/dist/adapters/mock/client/types.js +7 -0
- package/dist/adapters/mock/client/types.js.map +1 -0
- package/dist/adapters/websocket/client/index.d.ts +9 -0
- package/dist/adapters/websocket/client/index.d.ts.map +1 -0
- package/dist/adapters/websocket/client/index.js +9 -0
- package/dist/adapters/websocket/client/index.js.map +1 -0
- package/dist/adapters/websocket/client/transport.d.ts +106 -0
- package/dist/adapters/websocket/client/transport.d.ts.map +1 -0
- package/dist/adapters/websocket/client/transport.js +647 -0
- package/dist/adapters/websocket/client/transport.js.map +1 -0
- package/dist/adapters/websocket/client/types.d.ts +192 -0
- package/dist/adapters/websocket/client/types.d.ts.map +1 -0
- package/dist/adapters/websocket/client/types.js +17 -0
- package/dist/adapters/websocket/client/types.js.map +1 -0
- package/dist/adapters/websocket/index.d.ts +8 -0
- package/dist/adapters/websocket/index.d.ts.map +1 -0
- package/dist/adapters/websocket/index.js +8 -0
- package/dist/adapters/websocket/index.js.map +1 -0
- package/dist/adapters/websocket/server/index.d.ts +8 -0
- package/dist/adapters/websocket/server/index.d.ts.map +1 -0
- package/dist/adapters/websocket/server/index.js +8 -0
- package/dist/adapters/websocket/server/index.js.map +1 -0
- package/dist/adapters/websocket/server/transport.d.ts +112 -0
- package/dist/adapters/websocket/server/transport.d.ts.map +1 -0
- package/dist/adapters/websocket/server/transport.js +619 -0
- package/dist/adapters/websocket/server/transport.js.map +1 -0
- package/dist/adapters/websocket/server/types.d.ts +140 -0
- package/dist/adapters/websocket/server/types.d.ts.map +1 -0
- package/dist/adapters/websocket/server/types.js +7 -0
- package/dist/adapters/websocket/server/types.js.map +1 -0
- package/dist/browser.d.ts +48 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +86 -0
- package/dist/browser.js.map +1 -0
- package/dist/client/batch-executor.d.ts +160 -0
- package/dist/client/batch-executor.d.ts.map +1 -0
- package/dist/client/batch-executor.js +397 -0
- package/dist/client/batch-executor.js.map +1 -0
- package/dist/client/call-types.d.ts +271 -0
- package/dist/client/call-types.d.ts.map +1 -0
- package/dist/client/call-types.js +208 -0
- package/dist/client/call-types.js.map +1 -0
- package/dist/client/client.d.ts +517 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +990 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/consumption.d.ts +191 -0
- package/dist/client/consumption.d.ts.map +1 -0
- package/dist/client/consumption.js +98 -0
- package/dist/client/consumption.js.map +1 -0
- package/dist/client/context.d.ts +116 -0
- package/dist/client/context.d.ts.map +1 -0
- package/dist/client/context.js +111 -0
- package/dist/client/context.js.map +1 -0
- package/dist/client/errors/codes.d.ts +71 -0
- package/dist/client/errors/codes.d.ts.map +1 -0
- package/dist/client/errors/codes.js +81 -0
- package/dist/client/errors/codes.js.map +1 -0
- package/dist/client/errors/factory.d.ts +102 -0
- package/dist/client/errors/factory.d.ts.map +1 -0
- package/dist/client/errors/factory.js +210 -0
- package/dist/client/errors/factory.js.map +1 -0
- package/dist/client/errors/http-errors.d.ts +47 -0
- package/dist/client/errors/http-errors.d.ts.map +1 -0
- package/dist/client/errors/http-errors.js +548 -0
- package/dist/client/errors/http-errors.js.map +1 -0
- package/dist/client/errors/http-status.d.ts +73 -0
- package/dist/client/errors/http-status.d.ts.map +1 -0
- package/dist/client/errors/http-status.js +79 -0
- package/dist/client/errors/http-status.js.map +1 -0
- package/dist/client/errors/index.d.ts +36 -0
- package/dist/client/errors/index.d.ts.map +1 -0
- package/dist/client/errors/index.js +40 -0
- package/dist/client/errors/index.js.map +1 -0
- package/dist/client/errors/registry.d.ts +38 -0
- package/dist/client/errors/registry.d.ts.map +1 -0
- package/dist/client/errors/registry.js +535 -0
- package/dist/client/errors/registry.js.map +1 -0
- package/dist/client/errors/types.d.ts +112 -0
- package/dist/client/errors/types.d.ts.map +1 -0
- package/dist/client/errors/types.js +45 -0
- package/dist/client/errors/types.js.map +1 -0
- package/dist/client/index.d.ts +44 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +36 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/middleware/auth.d.ts +90 -0
- package/dist/client/middleware/auth.d.ts.map +1 -0
- package/dist/client/middleware/auth.js +98 -0
- package/dist/client/middleware/auth.js.map +1 -0
- package/dist/client/middleware/batching.d.ts +102 -0
- package/dist/client/middleware/batching.d.ts.map +1 -0
- package/dist/client/middleware/batching.js +245 -0
- package/dist/client/middleware/batching.js.map +1 -0
- package/dist/client/middleware/cache.d.ts +124 -0
- package/dist/client/middleware/cache.d.ts.map +1 -0
- package/dist/client/middleware/cache.js +208 -0
- package/dist/client/middleware/cache.js.map +1 -0
- package/dist/client/middleware/circuit-breaker.d.ts +113 -0
- package/dist/client/middleware/circuit-breaker.d.ts.map +1 -0
- package/dist/client/middleware/circuit-breaker.js +236 -0
- package/dist/client/middleware/circuit-breaker.js.map +1 -0
- package/dist/client/middleware/contexts.d.ts +199 -0
- package/dist/client/middleware/contexts.d.ts.map +1 -0
- package/dist/client/middleware/contexts.js +74 -0
- package/dist/client/middleware/contexts.js.map +1 -0
- package/dist/client/middleware/items.d.ts +37 -0
- package/dist/client/middleware/items.d.ts.map +1 -0
- package/dist/client/middleware/items.js +100 -0
- package/dist/client/middleware/items.js.map +1 -0
- package/dist/client/middleware/lru.d.ts +32 -0
- package/dist/client/middleware/lru.d.ts.map +1 -0
- package/dist/client/middleware/lru.js +62 -0
- package/dist/client/middleware/lru.js.map +1 -0
- package/dist/client/middleware/pagination.d.ts +114 -0
- package/dist/client/middleware/pagination.d.ts.map +1 -0
- package/dist/client/middleware/pagination.js +148 -0
- package/dist/client/middleware/pagination.js.map +1 -0
- package/dist/client/middleware/rate-limit.d.ts +105 -0
- package/dist/client/middleware/rate-limit.d.ts.map +1 -0
- package/dist/client/middleware/rate-limit.js +222 -0
- package/dist/client/middleware/rate-limit.js.map +1 -0
- package/dist/client/middleware/retry.d.ts +100 -0
- package/dist/client/middleware/retry.d.ts.map +1 -0
- package/dist/client/middleware/retry.js +150 -0
- package/dist/client/middleware/retry.js.map +1 -0
- package/dist/client/middleware/timeout.d.ts +91 -0
- package/dist/client/middleware/timeout.d.ts.map +1 -0
- package/dist/client/middleware/timeout.js +253 -0
- package/dist/client/middleware/timeout.js.map +1 -0
- package/dist/client/middleware/tracing.d.ts +118 -0
- package/dist/client/middleware/tracing.d.ts.map +1 -0
- package/dist/client/middleware/tracing.js +152 -0
- package/dist/client/middleware/tracing.js.map +1 -0
- package/dist/client/route-resolver.d.ts +181 -0
- package/dist/client/route-resolver.d.ts.map +1 -0
- package/dist/client/route-resolver.js +300 -0
- package/dist/client/route-resolver.js.map +1 -0
- package/dist/client/typed-method.d.ts +29 -0
- package/dist/client/typed-method.d.ts.map +1 -0
- package/dist/client/typed-method.js +36 -0
- package/dist/client/typed-method.js.map +1 -0
- package/dist/client/typed.d.ts +102 -0
- package/dist/client/typed.d.ts.map +1 -0
- package/dist/client/typed.js +52 -0
- package/dist/client/typed.js.map +1 -0
- package/dist/client/types.d.ts +296 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +26 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/validation/index.d.ts +34 -0
- package/dist/client/validation/index.d.ts.map +1 -0
- package/dist/client/validation/index.js +36 -0
- package/dist/client/validation/index.js.map +1 -0
- package/dist/client/validation/middleware.d.ts +82 -0
- package/dist/client/validation/middleware.d.ts.map +1 -0
- package/dist/client/validation/middleware.js +138 -0
- package/dist/client/validation/middleware.js.map +1 -0
- package/dist/client/validation/types.d.ts +118 -0
- package/dist/client/validation/types.d.ts.map +1 -0
- package/dist/client/validation/types.js +59 -0
- package/dist/client/validation/types.js.map +1 -0
- package/dist/collections/async/async-queue.d.ts +144 -0
- package/dist/collections/async/async-queue.d.ts.map +1 -0
- package/dist/collections/async/async-queue.js +347 -0
- package/dist/collections/async/async-queue.js.map +1 -0
- package/dist/collections/async/channels.d.ts +188 -0
- package/dist/collections/async/channels.d.ts.map +1 -0
- package/dist/collections/async/channels.js +312 -0
- package/dist/collections/async/channels.js.map +1 -0
- package/dist/collections/behaviors/bounded.d.ts +79 -0
- package/dist/collections/behaviors/bounded.d.ts.map +1 -0
- package/dist/collections/behaviors/bounded.js +384 -0
- package/dist/collections/behaviors/bounded.js.map +1 -0
- package/dist/collections/behaviors/evented.d.ts +154 -0
- package/dist/collections/behaviors/evented.d.ts.map +1 -0
- package/dist/collections/behaviors/evented.js +299 -0
- package/dist/collections/behaviors/evented.js.map +1 -0
- package/dist/collections/behaviors/lru.d.ts +84 -0
- package/dist/collections/behaviors/lru.d.ts.map +1 -0
- package/dist/collections/behaviors/lru.js +330 -0
- package/dist/collections/behaviors/lru.js.map +1 -0
- package/dist/collections/behaviors/readonly.d.ts +73 -0
- package/dist/collections/behaviors/readonly.d.ts.map +1 -0
- package/dist/collections/behaviors/readonly.js +158 -0
- package/dist/collections/behaviors/readonly.js.map +1 -0
- package/dist/collections/behaviors/safe.d.ts +163 -0
- package/dist/collections/behaviors/safe.d.ts.map +1 -0
- package/dist/collections/behaviors/safe.js +172 -0
- package/dist/collections/behaviors/safe.js.map +1 -0
- package/dist/collections/behaviors/synchronized.d.ts +88 -0
- package/dist/collections/behaviors/synchronized.d.ts.map +1 -0
- package/dist/collections/behaviors/synchronized.js +294 -0
- package/dist/collections/behaviors/synchronized.js.map +1 -0
- package/dist/collections/behaviors/ttl.d.ts +118 -0
- package/dist/collections/behaviors/ttl.d.ts.map +1 -0
- package/dist/collections/behaviors/ttl.js +338 -0
- package/dist/collections/behaviors/ttl.js.map +1 -0
- package/dist/collections/core/effects.d.ts +176 -0
- package/dist/collections/core/effects.d.ts.map +1 -0
- package/dist/collections/core/effects.js +180 -0
- package/dist/collections/core/effects.js.map +1 -0
- package/dist/collections/core/events.d.ts +192 -0
- package/dist/collections/core/events.d.ts.map +1 -0
- package/dist/collections/core/events.js +291 -0
- package/dist/collections/core/events.js.map +1 -0
- package/dist/collections/core/middleware.d.ts +231 -0
- package/dist/collections/core/middleware.d.ts.map +1 -0
- package/dist/collections/core/middleware.js +161 -0
- package/dist/collections/core/middleware.js.map +1 -0
- package/dist/collections/core/policies.d.ts +220 -0
- package/dist/collections/core/policies.d.ts.map +1 -0
- package/dist/collections/core/policies.js +48 -0
- package/dist/collections/core/policies.js.map +1 -0
- package/dist/collections/core/traits.d.ts +142 -0
- package/dist/collections/core/traits.d.ts.map +1 -0
- package/dist/collections/core/traits.js +8 -0
- package/dist/collections/core/traits.js.map +1 -0
- package/dist/collections/examples.d.ts +13 -0
- package/dist/collections/examples.d.ts.map +1 -0
- package/dist/collections/examples.js +302 -0
- package/dist/collections/examples.js.map +1 -0
- package/dist/collections/fx/collectors.d.ts +190 -0
- package/dist/collections/fx/collectors.d.ts.map +1 -0
- package/dist/collections/fx/collectors.js +369 -0
- package/dist/collections/fx/collectors.js.map +1 -0
- package/dist/collections/fx/iter.d.ts +166 -0
- package/dist/collections/fx/iter.d.ts.map +1 -0
- package/dist/collections/fx/iter.js +421 -0
- package/dist/collections/fx/iter.js.map +1 -0
- package/dist/collections/impl/array-deque.d.ts +107 -0
- package/dist/collections/impl/array-deque.d.ts.map +1 -0
- package/dist/collections/impl/array-deque.js +381 -0
- package/dist/collections/impl/array-deque.js.map +1 -0
- package/dist/collections/impl/array-list.d.ts +101 -0
- package/dist/collections/impl/array-list.d.ts.map +1 -0
- package/dist/collections/impl/array-list.js +387 -0
- package/dist/collections/impl/array-list.js.map +1 -0
- package/dist/collections/impl/hash-map.d.ts +141 -0
- package/dist/collections/impl/hash-map.d.ts.map +1 -0
- package/dist/collections/impl/hash-map.js +450 -0
- package/dist/collections/impl/hash-map.js.map +1 -0
- package/dist/collections/impl/hash-set.d.ts +125 -0
- package/dist/collections/impl/hash-set.d.ts.map +1 -0
- package/dist/collections/impl/hash-set.js +264 -0
- package/dist/collections/impl/hash-set.js.map +1 -0
- package/dist/collections/impl/linked-hash-map.d.ts +141 -0
- package/dist/collections/impl/linked-hash-map.d.ts.map +1 -0
- package/dist/collections/impl/linked-hash-map.js +472 -0
- package/dist/collections/impl/linked-hash-map.js.map +1 -0
- package/dist/collections/impl/linked-list.d.ts +109 -0
- package/dist/collections/impl/linked-list.d.ts.map +1 -0
- package/dist/collections/impl/linked-list.js +491 -0
- package/dist/collections/impl/linked-list.js.map +1 -0
- package/dist/collections/impl/priority-queue.d.ts +134 -0
- package/dist/collections/impl/priority-queue.d.ts.map +1 -0
- package/dist/collections/impl/priority-queue.js +336 -0
- package/dist/collections/impl/priority-queue.js.map +1 -0
- package/dist/collections/impl/tree-map.d.ts +146 -0
- package/dist/collections/impl/tree-map.d.ts.map +1 -0
- package/dist/collections/impl/tree-map.js +781 -0
- package/dist/collections/impl/tree-map.js.map +1 -0
- package/dist/collections/impl/tree-set.d.ts +112 -0
- package/dist/collections/impl/tree-set.d.ts.map +1 -0
- package/dist/collections/impl/tree-set.js +374 -0
- package/dist/collections/impl/tree-set.js.map +1 -0
- package/dist/collections/index.d.ts +105 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +135 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/interfaces/collection.d.ts +119 -0
- package/dist/collections/interfaces/collection.d.ts.map +1 -0
- package/dist/collections/interfaces/collection.js +8 -0
- package/dist/collections/interfaces/collection.js.map +1 -0
- package/dist/collections/interfaces/list.d.ts +247 -0
- package/dist/collections/interfaces/list.d.ts.map +1 -0
- package/dist/collections/interfaces/list.js +8 -0
- package/dist/collections/interfaces/list.js.map +1 -0
- package/dist/collections/interfaces/map.d.ts +344 -0
- package/dist/collections/interfaces/map.d.ts.map +1 -0
- package/dist/collections/interfaces/map.js +8 -0
- package/dist/collections/interfaces/map.js.map +1 -0
- package/dist/collections/interfaces/queue.d.ts +304 -0
- package/dist/collections/interfaces/queue.d.ts.map +1 -0
- package/dist/collections/interfaces/queue.js +8 -0
- package/dist/collections/interfaces/queue.js.map +1 -0
- package/dist/collections/interfaces/set.d.ts +137 -0
- package/dist/collections/interfaces/set.d.ts.map +1 -0
- package/dist/collections/interfaces/set.js +8 -0
- package/dist/collections/interfaces/set.js.map +1 -0
- package/dist/collections/storage/api.d.ts +109 -0
- package/dist/collections/storage/api.d.ts.map +1 -0
- package/dist/collections/storage/api.js +182 -0
- package/dist/collections/storage/api.js.map +1 -0
- package/dist/collections/storage/hybrid.d.ts +164 -0
- package/dist/collections/storage/hybrid.d.ts.map +1 -0
- package/dist/collections/storage/hybrid.js +416 -0
- package/dist/collections/storage/hybrid.js.map +1 -0
- package/dist/collections/storage/index.d.ts +16 -0
- package/dist/collections/storage/index.d.ts.map +1 -0
- package/dist/collections/storage/index.js +13 -0
- package/dist/collections/storage/index.js.map +1 -0
- package/dist/collections/storage/interface.d.ts +141 -0
- package/dist/collections/storage/interface.d.ts.map +1 -0
- package/dist/collections/storage/interface.js +23 -0
- package/dist/collections/storage/interface.js.map +1 -0
- package/dist/collections/storage/memory.d.ts +68 -0
- package/dist/collections/storage/memory.d.ts.map +1 -0
- package/dist/collections/storage/memory.js +154 -0
- package/dist/collections/storage/memory.js.map +1 -0
- package/dist/collections/utils/defaults.d.ts +135 -0
- package/dist/collections/utils/defaults.d.ts.map +1 -0
- package/dist/collections/utils/defaults.js +322 -0
- package/dist/collections/utils/defaults.js.map +1 -0
- package/dist/collections/utils/factories.d.ts +144 -0
- package/dist/collections/utils/factories.d.ts.map +1 -0
- package/dist/collections/utils/factories.js +293 -0
- package/dist/collections/utils/factories.js.map +1 -0
- package/dist/collections/utils/helpers.d.ts +137 -0
- package/dist/collections/utils/helpers.d.ts.map +1 -0
- package/dist/collections/utils/helpers.js +221 -0
- package/dist/collections/utils/helpers.js.map +1 -0
- package/dist/collections.d.ts +12 -0
- package/dist/collections.d.ts.map +1 -0
- package/dist/collections.js +10 -0
- package/dist/collections.js.map +1 -0
- package/dist/components/define.d.ts +134 -0
- package/dist/components/define.d.ts.map +1 -0
- package/dist/components/define.js +486 -0
- package/dist/components/define.js.map +1 -0
- package/dist/components/index.d.ts +39 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +38 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/types.d.ts +264 -0
- package/dist/components/types.d.ts.map +1 -0
- package/dist/components/types.js +46 -0
- package/dist/components/types.js.map +1 -0
- package/dist/events/bus.d.ts +193 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +511 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/index.d.ts +34 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +36 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +242 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +8 -0
- package/dist/events/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/compose.d.ts +88 -0
- package/dist/middleware/compose.d.ts.map +1 -0
- package/dist/middleware/compose.js +108 -0
- package/dist/middleware/compose.js.map +1 -0
- package/dist/middleware/index.d.ts +12 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +11 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/types.d.ts +112 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +14 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/procedures/cli/announce.d.ts +67 -0
- package/dist/procedures/cli/announce.d.ts.map +1 -0
- package/dist/procedures/cli/announce.js +392 -0
- package/dist/procedures/cli/announce.js.map +1 -0
- package/dist/procedures/cli/discover.d.ts +66 -0
- package/dist/procedures/cli/discover.d.ts.map +1 -0
- package/dist/procedures/cli/discover.js +310 -0
- package/dist/procedures/cli/discover.js.map +1 -0
- package/dist/procedures/cli/index.d.ts +13 -0
- package/dist/procedures/cli/index.d.ts.map +1 -0
- package/dist/procedures/cli/index.js +201 -0
- package/dist/procedures/cli/index.js.map +1 -0
- package/dist/procedures/cli/init.d.ts +17 -0
- package/dist/procedures/cli/init.d.ts.map +1 -0
- package/dist/procedures/cli/init.js +336 -0
- package/dist/procedures/cli/init.js.map +1 -0
- package/dist/procedures/collection/index.d.ts +10 -0
- package/dist/procedures/collection/index.d.ts.map +1 -0
- package/dist/procedures/collection/index.js +10 -0
- package/dist/procedures/collection/index.js.map +1 -0
- package/dist/procedures/collection/procedures.d.ts +21 -0
- package/dist/procedures/collection/procedures.d.ts.map +1 -0
- package/dist/procedures/collection/procedures.js +198 -0
- package/dist/procedures/collection/procedures.js.map +1 -0
- package/dist/procedures/collection/schemas.d.ts +131 -0
- package/dist/procedures/collection/schemas.d.ts.map +1 -0
- package/dist/procedures/collection/schemas.js +422 -0
- package/dist/procedures/collection/schemas.js.map +1 -0
- package/dist/procedures/collection/storage.d.ts +53 -0
- package/dist/procedures/collection/storage.d.ts.map +1 -0
- package/dist/procedures/collection/storage.js +2 -0
- package/dist/procedures/collection/storage.js.map +1 -0
- package/dist/procedures/core/array.d.ts +276 -0
- package/dist/procedures/core/array.d.ts.map +1 -0
- package/dist/procedures/core/array.js +637 -0
- package/dist/procedures/core/array.js.map +1 -0
- package/dist/procedures/core/comparison.d.ts +85 -0
- package/dist/procedures/core/comparison.d.ts.map +1 -0
- package/dist/procedures/core/comparison.js +156 -0
- package/dist/procedures/core/comparison.js.map +1 -0
- package/dist/procedures/core/index.d.ts +261 -0
- package/dist/procedures/core/index.d.ts.map +1 -0
- package/dist/procedures/core/index.js +585 -0
- package/dist/procedures/core/index.js.map +1 -0
- package/dist/procedures/core/logic.d.ts +144 -0
- package/dist/procedures/core/logic.d.ts.map +1 -0
- package/dist/procedures/core/logic.js +169 -0
- package/dist/procedures/core/logic.js.map +1 -0
- package/dist/procedures/core/math.d.ts +139 -0
- package/dist/procedures/core/math.d.ts.map +1 -0
- package/dist/procedures/core/math.js +273 -0
- package/dist/procedures/core/math.js.map +1 -0
- package/dist/procedures/core/meta.d.ts +111 -0
- package/dist/procedures/core/meta.d.ts.map +1 -0
- package/dist/procedures/core/meta.js +239 -0
- package/dist/procedures/core/meta.js.map +1 -0
- package/dist/procedures/core/object.d.ts +109 -0
- package/dist/procedures/core/object.d.ts.map +1 -0
- package/dist/procedures/core/object.js +270 -0
- package/dist/procedures/core/object.js.map +1 -0
- package/dist/procedures/core/operands.d.ts +51 -0
- package/dist/procedures/core/operands.d.ts.map +1 -0
- package/dist/procedures/core/operands.js +90 -0
- package/dist/procedures/core/operands.js.map +1 -0
- package/dist/procedures/core/outputs.d.ts +28 -0
- package/dist/procedures/core/outputs.d.ts.map +1 -0
- package/dist/procedures/core/outputs.js +42 -0
- package/dist/procedures/core/outputs.js.map +1 -0
- package/dist/procedures/core/results.d.ts +202 -0
- package/dist/procedures/core/results.d.ts.map +1 -0
- package/dist/procedures/core/results.js +106 -0
- package/dist/procedures/core/results.js.map +1 -0
- package/dist/procedures/core/schemas.d.ts +48 -0
- package/dist/procedures/core/schemas.d.ts.map +1 -0
- package/dist/procedures/core/schemas.js +102 -0
- package/dist/procedures/core/schemas.js.map +1 -0
- package/dist/procedures/core/string.d.ts +138 -0
- package/dist/procedures/core/string.d.ts.map +1 -0
- package/dist/procedures/core/string.js +268 -0
- package/dist/procedures/core/string.js.map +1 -0
- package/dist/procedures/core/type.d.ts +101 -0
- package/dist/procedures/core/type.d.ts.map +1 -0
- package/dist/procedures/core/type.js +208 -0
- package/dist/procedures/core/type.js.map +1 -0
- package/dist/procedures/define-procedure.d.ts +187 -0
- package/dist/procedures/define-procedure.d.ts.map +1 -0
- package/dist/procedures/define-procedure.js +356 -0
- package/dist/procedures/define-procedure.js.map +1 -0
- package/dist/procedures/define.d.ts +228 -0
- package/dist/procedures/define.d.ts.map +1 -0
- package/dist/procedures/define.js +300 -0
- package/dist/procedures/define.js.map +1 -0
- package/dist/procedures/discovery.d.ts +57 -0
- package/dist/procedures/discovery.d.ts.map +1 -0
- package/dist/procedures/discovery.js +68 -0
- package/dist/procedures/discovery.js.map +1 -0
- package/dist/procedures/index.d.ts +24 -0
- package/dist/procedures/index.d.ts.map +1 -0
- package/dist/procedures/index.js +69 -0
- package/dist/procedures/index.js.map +1 -0
- package/dist/procedures/interceptors.d.ts +82 -0
- package/dist/procedures/interceptors.d.ts.map +1 -0
- package/dist/procedures/interceptors.js +193 -0
- package/dist/procedures/interceptors.js.map +1 -0
- package/dist/procedures/invoke.d.ts +127 -0
- package/dist/procedures/invoke.d.ts.map +1 -0
- package/dist/procedures/invoke.js +277 -0
- package/dist/procedures/invoke.js.map +1 -0
- package/dist/procedures/module.d.ts +49 -0
- package/dist/procedures/module.d.ts.map +1 -0
- package/dist/procedures/module.js +93 -0
- package/dist/procedures/module.js.map +1 -0
- package/dist/procedures/policy.d.ts +70 -0
- package/dist/procedures/policy.d.ts.map +1 -0
- package/dist/procedures/policy.js +138 -0
- package/dist/procedures/policy.js.map +1 -0
- package/dist/procedures/ref.d.ts +606 -0
- package/dist/procedures/ref.d.ts.map +1 -0
- package/dist/procedures/ref.js +895 -0
- package/dist/procedures/ref.js.map +1 -0
- package/dist/procedures/registry.d.ts +208 -0
- package/dist/procedures/registry.d.ts.map +1 -0
- package/dist/procedures/registry.js +402 -0
- package/dist/procedures/registry.js.map +1 -0
- package/dist/procedures/schema.d.ts +126 -0
- package/dist/procedures/schema.d.ts.map +1 -0
- package/dist/procedures/schema.js +108 -0
- package/dist/procedures/schema.js.map +1 -0
- package/dist/procedures/storage/adapter.d.ts +148 -0
- package/dist/procedures/storage/adapter.d.ts.map +1 -0
- package/dist/procedures/storage/adapter.js +214 -0
- package/dist/procedures/storage/adapter.js.map +1 -0
- package/dist/procedures/storage/api.d.ts +125 -0
- package/dist/procedures/storage/api.d.ts.map +1 -0
- package/dist/procedures/storage/api.js +220 -0
- package/dist/procedures/storage/api.js.map +1 -0
- package/dist/procedures/storage/factory.d.ts +134 -0
- package/dist/procedures/storage/factory.d.ts.map +1 -0
- package/dist/procedures/storage/factory.js +166 -0
- package/dist/procedures/storage/factory.js.map +1 -0
- package/dist/procedures/storage/hybrid.d.ts +193 -0
- package/dist/procedures/storage/hybrid.d.ts.map +1 -0
- package/dist/procedures/storage/hybrid.js +519 -0
- package/dist/procedures/storage/hybrid.js.map +1 -0
- package/dist/procedures/storage/index.d.ts +17 -0
- package/dist/procedures/storage/index.d.ts.map +1 -0
- package/dist/procedures/storage/index.js +17 -0
- package/dist/procedures/storage/index.js.map +1 -0
- package/dist/procedures/storage/procedures.d.ts +39 -0
- package/dist/procedures/storage/procedures.d.ts.map +1 -0
- package/dist/procedures/storage/procedures.js +261 -0
- package/dist/procedures/storage/procedures.js.map +1 -0
- package/dist/procedures/storage/serialization.d.ts +123 -0
- package/dist/procedures/storage/serialization.d.ts.map +1 -0
- package/dist/procedures/storage/serialization.js +216 -0
- package/dist/procedures/storage/serialization.js.map +1 -0
- package/dist/procedures/storage/synced-registry.d.ts +246 -0
- package/dist/procedures/storage/synced-registry.d.ts.map +1 -0
- package/dist/procedures/storage/synced-registry.js +575 -0
- package/dist/procedures/storage/synced-registry.js.map +1 -0
- package/dist/procedures/storage/types.d.ts +130 -0
- package/dist/procedures/storage/types.d.ts.map +1 -0
- package/dist/procedures/storage/types.js +8 -0
- package/dist/procedures/storage/types.js.map +1 -0
- package/dist/procedures/types.d.ts +370 -0
- package/dist/procedures/types.d.ts.map +1 -0
- package/dist/procedures/types.js +23 -0
- package/dist/procedures/types.js.map +1 -0
- package/dist/server/browser-guard.d.ts +69 -0
- package/dist/server/browser-guard.d.ts.map +1 -0
- package/dist/server/browser-guard.js +103 -0
- package/dist/server/browser-guard.js.map +1 -0
- package/dist/server/host-policy.d.ts +59 -0
- package/dist/server/host-policy.d.ts.map +1 -0
- package/dist/server/host-policy.js +82 -0
- package/dist/server/host-policy.js.map +1 -0
- package/dist/server/index.d.ts +46 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +42 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/method.d.ts +24 -0
- package/dist/server/method.d.ts.map +1 -0
- package/dist/server/method.js +29 -0
- package/dist/server/method.js.map +1 -0
- package/dist/server/procedure-server.d.ts +212 -0
- package/dist/server/procedure-server.d.ts.map +1 -0
- package/dist/server/procedure-server.js +323 -0
- package/dist/server/procedure-server.js.map +1 -0
- package/dist/server/server.d.ts +161 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +279 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/types.d.ts +106 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +29 -0
- package/dist/server/types.js.map +1 -0
- package/package.json +115 -3
- package/src/adapters/http/client/index.ts +51 -0
- package/src/adapters/http/client/transport.ts +338 -0
- package/src/adapters/http/client/types.ts +33 -0
- package/src/adapters/http/index.ts +7 -0
- package/src/adapters/http/server/index.ts +14 -0
- package/src/adapters/http/server/strategies.ts +105 -0
- package/src/adapters/http/server/transport.ts +622 -0
- package/src/adapters/http/server/types.ts +81 -0
- package/src/adapters/http/shared/constants.ts +108 -0
- package/src/adapters/http/shared/errors.ts +199 -0
- package/src/adapters/http/shared/headers.ts +291 -0
- package/src/adapters/http/shared/index.ts +21 -0
- package/src/adapters/http/shared/status-codes.ts +212 -0
- package/src/adapters/http/shared/strategies.ts +255 -0
- package/src/adapters/local/client/index.ts +11 -0
- package/src/adapters/local/client/transport.ts +188 -0
- package/src/adapters/local/client/types.ts +50 -0
- package/src/adapters/metadata.ts +17 -0
- package/src/adapters/mock/client/builder.ts +64 -0
- package/src/adapters/mock/client/index.ts +19 -0
- package/src/adapters/mock/client/transport.ts +352 -0
- package/src/adapters/mock/client/types.ts +99 -0
- package/src/adapters/websocket/client/index.ts +18 -0
- package/src/adapters/websocket/client/transport.ts +733 -0
- package/src/adapters/websocket/client/types.ts +235 -0
- package/src/adapters/websocket/index.ts +24 -0
- package/src/adapters/websocket/server/index.ts +18 -0
- package/src/adapters/websocket/server/transport.ts +705 -0
- package/src/adapters/websocket/server/types.ts +169 -0
- package/src/browser.ts +373 -0
- package/src/client/batch-executor.ts +514 -0
- package/src/client/call-types.ts +491 -0
- package/src/client/client.ts +1202 -0
- package/src/client/consumption.ts +288 -0
- package/src/client/context.ts +228 -0
- package/src/client/errors/README.md +279 -0
- package/src/client/errors/codes.ts +88 -0
- package/src/client/errors/factory.ts +263 -0
- package/src/client/errors/http-errors.ts +601 -0
- package/src/client/errors/http-status.ts +82 -0
- package/src/client/errors/index.ts +72 -0
- package/src/client/errors/registry.ts +595 -0
- package/src/client/errors/types.ts +139 -0
- package/src/client/index.ts +124 -0
- package/src/client/middleware/auth.ts +132 -0
- package/src/client/middleware/cache.ts +316 -0
- package/src/client/middleware/circuit-breaker.ts +339 -0
- package/src/client/middleware/contexts.ts +319 -0
- package/src/client/middleware/items.ts +114 -0
- package/src/client/middleware/lru.ts +66 -0
- package/src/client/middleware/pagination.ts +213 -0
- package/src/client/middleware/rate-limit.ts +315 -0
- package/src/client/middleware/retry.ts +236 -0
- package/src/client/middleware/timeout.ts +308 -0
- package/src/client/middleware/tracing.ts +191 -0
- package/src/client/route-resolver.ts +407 -0
- package/src/client/typed-method.ts +65 -0
- package/src/client/typed.ts +140 -0
- package/src/client/types.ts +361 -0
- package/src/client/validation/index.ts +56 -0
- package/src/client/validation/middleware.ts +254 -0
- package/src/client/validation/types.ts +162 -0
- package/src/events/bus.ts +594 -0
- package/src/events/index.ts +67 -0
- package/src/events/types.ts +263 -0
- package/src/index.ts +33 -0
- package/src/middleware/compose.ts +159 -0
- package/src/middleware/index.ts +28 -0
- package/src/middleware/types.ts +166 -0
- package/src/procedures/cli/announce.ts +470 -0
- package/src/procedures/cli/discover.ts +390 -0
- package/src/procedures/cli/index.ts +229 -0
- package/src/procedures/cli/init.ts +370 -0
- package/src/procedures/collection/index.ts +51 -0
- package/src/procedures/collection/procedures.ts +245 -0
- package/src/procedures/collection/schemas.ts +550 -0
- package/src/procedures/collection/storage.ts +53 -0
- package/src/procedures/core/array.ts +1024 -0
- package/src/procedures/core/comparison.ts +263 -0
- package/src/procedures/core/index.ts +895 -0
- package/src/procedures/core/logic.ts +225 -0
- package/src/procedures/core/math.ts +469 -0
- package/src/procedures/core/meta.ts +384 -0
- package/src/procedures/core/object.ts +427 -0
- package/src/procedures/core/operands.ts +119 -0
- package/src/procedures/core/outputs.ts +48 -0
- package/src/procedures/core/results.ts +296 -0
- package/src/procedures/core/schemas.ts +123 -0
- package/src/procedures/core/string.ts +458 -0
- package/src/procedures/core/type.ts +344 -0
- package/src/procedures/define-procedure.ts +531 -0
- package/src/procedures/define.ts +387 -0
- package/src/procedures/discovery.ts +76 -0
- package/src/procedures/index.ts +228 -0
- package/src/procedures/interceptors.ts +272 -0
- package/src/procedures/invoke.ts +413 -0
- package/src/procedures/module.ts +107 -0
- package/src/procedures/policy.ts +171 -0
- package/src/procedures/ref.ts +1305 -0
- package/src/procedures/registry.ts +473 -0
- package/src/procedures/schema.ts +225 -0
- package/src/procedures/types.ts +485 -0
- package/src/server/browser-guard.ts +147 -0
- package/src/server/host-policy.ts +121 -0
- package/src/server/index.ts +70 -0
- package/src/server/method.ts +33 -0
- package/src/server/procedure-server.ts +417 -0
- package/src/server/server.ts +364 -0
- package/src/server/types.ts +147 -0
|
@@ -0,0 +1,895 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Procedure Reference System
|
|
3
|
+
*
|
|
4
|
+
* Enables procedures-as-data: procedures can be passed as inputs to other procedures,
|
|
5
|
+
* composed declaratively via JSON, or imperatively via TypeScript.
|
|
6
|
+
*
|
|
7
|
+
* Key concepts:
|
|
8
|
+
* - PROCEDURE_SYMBOL: Symbol tag to identify procedure references in JSON/objects
|
|
9
|
+
* - ProcedureRef: A reference to a procedure with pre-bound input
|
|
10
|
+
* - $when: Controls when a procedure reference is executed during hydration
|
|
11
|
+
* - $name: Names the result of a chain step, for `$ref`
|
|
12
|
+
* - $ref: Reads a name of the scope (a chain step, `$last`, `item`, `acc`, `index`, `input`)
|
|
13
|
+
* - $literal: Gives a value without hydration
|
|
14
|
+
* - hydrateInput: Walks input tree and executes nested procedure references
|
|
15
|
+
* - executeRef: Helper for procedures to execute deferred refs
|
|
16
|
+
* - proc(): Factory function to create procedure references
|
|
17
|
+
*
|
|
18
|
+
* ## Execution Control with $when
|
|
19
|
+
*
|
|
20
|
+
* The `$when` field controls when a procedure reference is executed:
|
|
21
|
+
* - `"$immediate"` (or absent): Execute during hydration (default)
|
|
22
|
+
* - `"$never"`: Never execute during hydration, pass as pure data (with its whole subtree)
|
|
23
|
+
* - `"$parent"`: Defer to parent procedure (pass as data)
|
|
24
|
+
* - `"someName"`: Defer to the runner that gives this name in its `contextStack`
|
|
25
|
+
* (`dag.traverse` gives "dag.traverse", `core.catch` gives "catch")
|
|
26
|
+
*
|
|
27
|
+
* A deferred ref is data at every depth: hydration of the input that holds it does not run it.
|
|
28
|
+
* The procedure that receives it runs it later (deep dive CORE-11).
|
|
29
|
+
*
|
|
30
|
+
* ## Raw input
|
|
31
|
+
*
|
|
32
|
+
* A procedure that takes its input raw (control flow, the `runs-refs` and `raw-input` tags) gets
|
|
33
|
+
* the refs of its input unchanged: it runs them itself. Such an input carries the scope of the
|
|
34
|
+
* caller (`withScope`), so nested control flow can read the names of an outer chain.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* // Declarative (JSON) with execution control
|
|
39
|
+
* const pipelineJson = {
|
|
40
|
+
* $name: "traversal",
|
|
41
|
+
* $proc: ["dag", "traverse"],
|
|
42
|
+
* input: {
|
|
43
|
+
* visit: {
|
|
44
|
+
* $proc: ["git", "add"],
|
|
45
|
+
* input: { all: true },
|
|
46
|
+
* $when: "traversal", // Defer to traversal context
|
|
47
|
+
* },
|
|
48
|
+
* },
|
|
49
|
+
* };
|
|
50
|
+
*
|
|
51
|
+
* // The inner $proc is NOT executed during hydration.
|
|
52
|
+
* // dag.traverse receives it as data and executes per-node.
|
|
53
|
+
* await client.exec(pipelineJson);
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
// =============================================================================
|
|
57
|
+
// Procedure Reference Constants
|
|
58
|
+
// =============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Symbol used to tag objects as procedure references.
|
|
61
|
+
* This allows procedure references to be identified during input hydration.
|
|
62
|
+
*/
|
|
63
|
+
export const PROCEDURE_SYMBOL = Symbol.for("@mark/procedure");
|
|
64
|
+
/**
|
|
65
|
+
* JSON key used to identify procedure references in serialized form.
|
|
66
|
+
*/
|
|
67
|
+
export const PROCEDURE_JSON_KEY = "$proc";
|
|
68
|
+
/**
|
|
69
|
+
* JSON key used to control when a procedure reference is executed.
|
|
70
|
+
*/
|
|
71
|
+
export const PROCEDURE_WHEN_KEY = "$when";
|
|
72
|
+
/**
|
|
73
|
+
* JSON key that names the result of a chain step: a later step reads it with `{ $ref: "<name>" }`.
|
|
74
|
+
*/
|
|
75
|
+
export const PROCEDURE_NAME_KEY = "$name";
|
|
76
|
+
/**
|
|
77
|
+
* JSON key used to reference outputs from named stages.
|
|
78
|
+
*/
|
|
79
|
+
export const OUTPUT_REF_KEY = "$ref";
|
|
80
|
+
/**
|
|
81
|
+
* JSON key of a literal. Hydration gives the value of `{ $literal: value }` and does not look
|
|
82
|
+
* inside it, so a `$proc` or a `$ref` in the value stays data (for example a JSON Schema `$ref`).
|
|
83
|
+
*/
|
|
84
|
+
export const LITERAL_KEY = "$literal";
|
|
85
|
+
// =============================================================================
|
|
86
|
+
// Execution Timing Constants
|
|
87
|
+
// =============================================================================
|
|
88
|
+
/**
|
|
89
|
+
* Execute immediately during hydration (default behavior).
|
|
90
|
+
*/
|
|
91
|
+
export const WHEN_IMMEDIATE = "$immediate";
|
|
92
|
+
/**
|
|
93
|
+
* Never execute during hydration - pass as pure data.
|
|
94
|
+
*/
|
|
95
|
+
export const WHEN_NEVER = "$never";
|
|
96
|
+
/**
|
|
97
|
+
* Defer to parent procedure - pass as data for parent to execute.
|
|
98
|
+
*/
|
|
99
|
+
export const WHEN_PARENT = "$parent";
|
|
100
|
+
/**
|
|
101
|
+
* Create a new RefScope with optional parent.
|
|
102
|
+
*/
|
|
103
|
+
export function createRefScope(parent, name) {
|
|
104
|
+
return {
|
|
105
|
+
outputs: new Map(),
|
|
106
|
+
parent,
|
|
107
|
+
name,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get a value by path from an object.
|
|
112
|
+
* Supports dot-separated paths like "foo.bar.baz".
|
|
113
|
+
* Only the own properties are read, so a path such as "a.constructor" gives undefined.
|
|
114
|
+
*/
|
|
115
|
+
export function getPath(obj, path) {
|
|
116
|
+
let value = obj;
|
|
117
|
+
for (const key of path) {
|
|
118
|
+
if (value && typeof value === "object" && Object.hasOwn(value, key)) {
|
|
119
|
+
value = value[key];
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Look up an output reference in a scope and its parents.
|
|
129
|
+
*
|
|
130
|
+
* The first segment is a name: the innermost scope with that name gives the value. `$last` is the
|
|
131
|
+
* last result of the innermost scope that has one. The other segments read fields of the value.
|
|
132
|
+
* `found` is false when no scope has the name. A missing field is `found` with the value undefined.
|
|
133
|
+
*/
|
|
134
|
+
export function lookupOutputRef(refPath, scope) {
|
|
135
|
+
const [first, ...rest] = refPath.split(".");
|
|
136
|
+
for (let current = scope; current; current = current.parent) {
|
|
137
|
+
if (first === "$last") {
|
|
138
|
+
if (Object.hasOwn(current, "last"))
|
|
139
|
+
return { found: true, value: getPath(current.last, rest) };
|
|
140
|
+
}
|
|
141
|
+
else if (current.outputs.has(first)) {
|
|
142
|
+
return { found: true, value: getPath(current.outputs.get(first), rest) };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return { found: false };
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Resolve an output reference within a scope.
|
|
149
|
+
*
|
|
150
|
+
* @param refPath - The reference path (e.g., "stageName.value" or "$last.value")
|
|
151
|
+
* @param scope - The current scope to resolve within
|
|
152
|
+
* @returns The resolved value, or undefined if not found
|
|
153
|
+
*/
|
|
154
|
+
export function resolveOutputRef(refPath, scope) {
|
|
155
|
+
return lookupOutputRef(refPath, scope).value;
|
|
156
|
+
}
|
|
157
|
+
// =============================================================================
|
|
158
|
+
// Scope of a raw input
|
|
159
|
+
// =============================================================================
|
|
160
|
+
const SCOPE_KEY = Symbol.for("@mark/ref-scope");
|
|
161
|
+
/**
|
|
162
|
+
* This function gives a copy of a raw input that carries a scope. A procedure that takes its input
|
|
163
|
+
* raw (control flow) reads the scope with `scopeOf()` and makes it the parent of its own scope.
|
|
164
|
+
* Thus the operands of a nested control-flow procedure can read the names of the outer chain.
|
|
165
|
+
* The scope is a property that is not enumerable: JSON and the transports do not see it.
|
|
166
|
+
*/
|
|
167
|
+
export function withScope(input, scope) {
|
|
168
|
+
if (!scope || !isPlainObject(input))
|
|
169
|
+
return input;
|
|
170
|
+
const copy = { ...input };
|
|
171
|
+
Object.defineProperty(copy, SCOPE_KEY, { value: scope, enumerable: false });
|
|
172
|
+
return copy;
|
|
173
|
+
}
|
|
174
|
+
/** The scope that a raw input carries (see `withScope()`), or undefined. */
|
|
175
|
+
export function scopeOf(input) {
|
|
176
|
+
if (typeof input !== "object" || input === null)
|
|
177
|
+
return undefined;
|
|
178
|
+
return input[SCOPE_KEY];
|
|
179
|
+
}
|
|
180
|
+
// =============================================================================
|
|
181
|
+
// Plain data
|
|
182
|
+
// =============================================================================
|
|
183
|
+
/** True for a plain object: an object literal, or an object with a null prototype. */
|
|
184
|
+
export function isPlainObject(value) {
|
|
185
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
186
|
+
return false;
|
|
187
|
+
const prototype = Object.getPrototypeOf(value);
|
|
188
|
+
return prototype === Object.prototype || prototype === null;
|
|
189
|
+
}
|
|
190
|
+
/** True for `{ $literal: value }`: a plain object whose only key is `$literal`. */
|
|
191
|
+
export function isLiteral(value) {
|
|
192
|
+
if (!isPlainObject(value))
|
|
193
|
+
return false;
|
|
194
|
+
const keys = Object.keys(value);
|
|
195
|
+
return keys.length === 1 && keys[0] === LITERAL_KEY;
|
|
196
|
+
}
|
|
197
|
+
// =============================================================================
|
|
198
|
+
// Type Guards
|
|
199
|
+
// =============================================================================
|
|
200
|
+
/**
|
|
201
|
+
* Check if a value is a procedure reference (runtime form with Symbol).
|
|
202
|
+
*/
|
|
203
|
+
export function isProcedureRef(value) {
|
|
204
|
+
return (typeof value === "object" &&
|
|
205
|
+
value !== null &&
|
|
206
|
+
PROCEDURE_SYMBOL in value &&
|
|
207
|
+
value[PROCEDURE_SYMBOL] === true);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Check if a value is a JSON procedure reference (serialized form with $proc key).
|
|
211
|
+
*/
|
|
212
|
+
export function isProcedureRefJson(value) {
|
|
213
|
+
return (typeof value === "object" &&
|
|
214
|
+
value !== null &&
|
|
215
|
+
PROCEDURE_JSON_KEY in value &&
|
|
216
|
+
Array.isArray(value[PROCEDURE_JSON_KEY]));
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Check if a value is any form of procedure reference.
|
|
220
|
+
*/
|
|
221
|
+
export function isAnyProcedureRef(value) {
|
|
222
|
+
return isProcedureRef(value) || isProcedureRefJson(value);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Check if a value is an output reference ($ref).
|
|
226
|
+
*/
|
|
227
|
+
export function isOutputRef(value) {
|
|
228
|
+
return (typeof value === "object" &&
|
|
229
|
+
value !== null &&
|
|
230
|
+
OUTPUT_REF_KEY in value &&
|
|
231
|
+
typeof value[OUTPUT_REF_KEY] === "string");
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get the $when value from a procedure reference.
|
|
235
|
+
* Returns "$immediate" if not specified.
|
|
236
|
+
*/
|
|
237
|
+
export function getRefWhen(ref) {
|
|
238
|
+
if (isProcedureRef(ref)) {
|
|
239
|
+
return ref.$when ?? WHEN_IMMEDIATE;
|
|
240
|
+
}
|
|
241
|
+
return ref.$when ?? WHEN_IMMEDIATE;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Get the $name value from a procedure reference, if any.
|
|
245
|
+
*/
|
|
246
|
+
export function getRefName(ref) {
|
|
247
|
+
if (isProcedureRef(ref)) {
|
|
248
|
+
return ref.$name;
|
|
249
|
+
}
|
|
250
|
+
return ref.$name;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Check if a procedure reference should be executed in the given context.
|
|
254
|
+
*
|
|
255
|
+
* @param ref - The procedure reference to check
|
|
256
|
+
* @param contextStack - Stack of named contexts (innermost first)
|
|
257
|
+
* @param isParentContext - Whether we're checking from a parent procedure
|
|
258
|
+
* @returns true if the ref should be executed now
|
|
259
|
+
*/
|
|
260
|
+
export function shouldExecuteRef(ref, contextStack, isParentContext = false) {
|
|
261
|
+
const when = getRefWhen(ref);
|
|
262
|
+
// $immediate: always execute during hydration
|
|
263
|
+
if (when === WHEN_IMMEDIATE) {
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
// $never: never execute during hydration
|
|
267
|
+
if (when === WHEN_NEVER) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
// $parent: execute only when called from parent procedure
|
|
271
|
+
if (when === WHEN_PARENT) {
|
|
272
|
+
return isParentContext;
|
|
273
|
+
}
|
|
274
|
+
// Named context: execute only when inside that named context
|
|
275
|
+
// The ref should execute when we're currently inside the named context
|
|
276
|
+
return contextStack.includes(when);
|
|
277
|
+
}
|
|
278
|
+
// =============================================================================
|
|
279
|
+
// Procedure Reference Builder
|
|
280
|
+
// =============================================================================
|
|
281
|
+
/**
|
|
282
|
+
* Builder for creating procedure references with a fluent API.
|
|
283
|
+
*/
|
|
284
|
+
export class ProcedureRefBuilder {
|
|
285
|
+
_path;
|
|
286
|
+
_input = {};
|
|
287
|
+
_name;
|
|
288
|
+
_when;
|
|
289
|
+
constructor(path) {
|
|
290
|
+
this._path = path;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Set the input for this procedure reference.
|
|
294
|
+
*/
|
|
295
|
+
input(input) {
|
|
296
|
+
const builder = this;
|
|
297
|
+
builder._input = input;
|
|
298
|
+
return builder;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Name this execution context (for nested refs to target with $when).
|
|
302
|
+
*/
|
|
303
|
+
name(name) {
|
|
304
|
+
this._name = name;
|
|
305
|
+
return this;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Set when this reference should be executed.
|
|
309
|
+
* @param when - "$immediate", "$never", "$parent", or a named context
|
|
310
|
+
*/
|
|
311
|
+
when(when) {
|
|
312
|
+
this._when = when;
|
|
313
|
+
return this;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Shorthand for .when("$never") - pass as pure data.
|
|
317
|
+
*/
|
|
318
|
+
defer() {
|
|
319
|
+
this._when = WHEN_NEVER;
|
|
320
|
+
return this;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Shorthand for .when("$parent") - defer to parent procedure.
|
|
324
|
+
*/
|
|
325
|
+
deferToParent() {
|
|
326
|
+
this._when = WHEN_PARENT;
|
|
327
|
+
return this;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Build the procedure reference object.
|
|
331
|
+
*/
|
|
332
|
+
build() {
|
|
333
|
+
const ref = {
|
|
334
|
+
[PROCEDURE_SYMBOL]: true,
|
|
335
|
+
path: this._path,
|
|
336
|
+
input: this._input,
|
|
337
|
+
};
|
|
338
|
+
if (this._name) {
|
|
339
|
+
ref.$name = this._name;
|
|
340
|
+
}
|
|
341
|
+
if (this._when) {
|
|
342
|
+
ref.$when = this._when;
|
|
343
|
+
}
|
|
344
|
+
return ref;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Convert to JSON-serializable form.
|
|
348
|
+
*/
|
|
349
|
+
toJson() {
|
|
350
|
+
const json = {
|
|
351
|
+
$proc: this._path,
|
|
352
|
+
input: this._input,
|
|
353
|
+
};
|
|
354
|
+
if (this._name) {
|
|
355
|
+
json.$name = this._name;
|
|
356
|
+
}
|
|
357
|
+
if (this._when) {
|
|
358
|
+
json.$when = this._when;
|
|
359
|
+
}
|
|
360
|
+
return json;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Alias for build() - makes the builder callable in expression contexts.
|
|
364
|
+
*/
|
|
365
|
+
get ref() {
|
|
366
|
+
return this.build();
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Create a procedure reference.
|
|
371
|
+
*
|
|
372
|
+
* @param path - Path to the procedure
|
|
373
|
+
* @returns Builder for the procedure reference
|
|
374
|
+
*
|
|
375
|
+
* @example
|
|
376
|
+
* ```typescript
|
|
377
|
+
* // Simple reference
|
|
378
|
+
* const addRef = proc(["git", "add"]).input({ all: true }).build();
|
|
379
|
+
*
|
|
380
|
+
* // Nested references (procedures as inputs)
|
|
381
|
+
* const pipeline = proc(["client", "chain"]).input({
|
|
382
|
+
* steps: [
|
|
383
|
+
* proc(["git", "add"]).input({ all: true }).ref,
|
|
384
|
+
* proc(["git", "commit"]).input({ message: "auto" }).ref,
|
|
385
|
+
* ],
|
|
386
|
+
* }).build();
|
|
387
|
+
* ```
|
|
388
|
+
*/
|
|
389
|
+
export function proc(path) {
|
|
390
|
+
return new ProcedureRefBuilder(path);
|
|
391
|
+
}
|
|
392
|
+
// =============================================================================
|
|
393
|
+
// JSON Conversion
|
|
394
|
+
// =============================================================================
|
|
395
|
+
/** The `$name` and `$when` fields of a reference, for a copy in the other form. */
|
|
396
|
+
function refFields(ref) {
|
|
397
|
+
return {
|
|
398
|
+
...(ref.$name !== undefined ? { $name: ref.$name } : {}),
|
|
399
|
+
...(ref.$when !== undefined ? { $when: ref.$when } : {}),
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Convert a procedure reference from JSON form to runtime form.
|
|
404
|
+
* The `$name` and `$when` fields stay (deep dive CORE-11: before, they were dropped).
|
|
405
|
+
*/
|
|
406
|
+
export function fromJson(json) {
|
|
407
|
+
return {
|
|
408
|
+
[PROCEDURE_SYMBOL]: true,
|
|
409
|
+
path: json.$proc,
|
|
410
|
+
input: json.input,
|
|
411
|
+
...refFields(json),
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Convert a procedure reference from runtime form to JSON form.
|
|
416
|
+
* The `$name` and `$when` fields stay.
|
|
417
|
+
*/
|
|
418
|
+
export function toJson(ref) {
|
|
419
|
+
return {
|
|
420
|
+
$proc: ref.path,
|
|
421
|
+
input: ref.input,
|
|
422
|
+
...refFields(ref),
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Normalize any procedure reference to runtime form.
|
|
427
|
+
*/
|
|
428
|
+
export function normalizeRef(ref) {
|
|
429
|
+
if (isProcedureRef(ref)) {
|
|
430
|
+
return ref;
|
|
431
|
+
}
|
|
432
|
+
return fromJson(ref);
|
|
433
|
+
}
|
|
434
|
+
/** The observers of `observeHydration()`: they get the events of every hydration. */
|
|
435
|
+
const hydrationObservers = new Set();
|
|
436
|
+
/**
|
|
437
|
+
* This function adds an observer of every hydration in this process (or worker), and gives the
|
|
438
|
+
* function that removes it. A host that does not call `hydrateInput` itself (the Composer of
|
|
439
|
+
* the site runs `client.exec()`) uses it for its trace. The observer gets the events of all
|
|
440
|
+
* concurrent hydrations: use it where one program runs at a time. For the events of one program,
|
|
441
|
+
* give `onRef` to that program: `client.exec(ref, input, { onRef })` (docs review DOC-10).
|
|
442
|
+
*/
|
|
443
|
+
export function observeHydration(observer) {
|
|
444
|
+
hydrationObservers.add(observer);
|
|
445
|
+
return () => {
|
|
446
|
+
hydrationObservers.delete(observer);
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
/** The maximum nesting of plain data in an input. A deeper input is an error, not a stack overflow. */
|
|
450
|
+
export const MAX_DATA_DEPTH = 1000;
|
|
451
|
+
/**
|
|
452
|
+
* Hydrate an input tree by executing any nested procedure references.
|
|
453
|
+
*
|
|
454
|
+
* Walks the input object tree and replaces any ProcedureRef or ProcedureRefJson
|
|
455
|
+
* objects with the result of executing that procedure, respecting $when timing.
|
|
456
|
+
*
|
|
457
|
+
* The rules:
|
|
458
|
+
* - A ref with `$when: "$immediate"` (the default) runs. A ref whose procedure takes its input
|
|
459
|
+
* raw (see `HydrateOptions.rawInput`) gets its input unchanged, with the scope attached.
|
|
460
|
+
* - A ref with `$when: "$never"` stays as it is, with its whole subtree.
|
|
461
|
+
* - A ref with `$when: "$parent"` or `$when: "<name>"` stays data for its runner. Its procedure
|
|
462
|
+
* gets that ref later. The immediate refs of its input run now, unless the procedure takes its
|
|
463
|
+
* input raw. A named ref runs now only when `contextStack` has the name.
|
|
464
|
+
* - A `$ref` object gives a value from the scope. `{ $literal: value }` gives the value unchanged.
|
|
465
|
+
* - An array whose items are all refs that run now, outside the input of a ref, runs as one
|
|
466
|
+
* `client.chain`. An array with a deferred ref is a list.
|
|
467
|
+
* - Values that are not plain data (`Date`, `Map`, typed arrays, class instances) stay unchanged.
|
|
468
|
+
* A subtree without refs stays the same object.
|
|
469
|
+
*
|
|
470
|
+
* @param input - The input object potentially containing procedure references
|
|
471
|
+
* @param executor - Function to execute procedure references
|
|
472
|
+
* @param options - Hydration options
|
|
473
|
+
* @returns The hydrated input with executed procedure refs replaced by their results
|
|
474
|
+
*
|
|
475
|
+
* @example
|
|
476
|
+
* ```typescript
|
|
477
|
+
* const input = {
|
|
478
|
+
* visit: proc(["git", "add"]).input({ all: true }).build(),
|
|
479
|
+
* config: { nested: true },
|
|
480
|
+
* };
|
|
481
|
+
*
|
|
482
|
+
* const hydrated = await hydrateInput(input, async (path, input) => {
|
|
483
|
+
* return await client.call({ path, input });
|
|
484
|
+
* });
|
|
485
|
+
*
|
|
486
|
+
* // hydrated.visit is now the result of executing git.add
|
|
487
|
+
* ```
|
|
488
|
+
*/
|
|
489
|
+
export async function hydrateInput(input, executor, options = {}) {
|
|
490
|
+
const ctx = {
|
|
491
|
+
executor,
|
|
492
|
+
maxDepth: options.maxDepth ?? 10,
|
|
493
|
+
parallel: options.parallel ?? false,
|
|
494
|
+
contextStack: options.contextStack ?? [],
|
|
495
|
+
scope: options.scope,
|
|
496
|
+
rawInput: options.rawInput ?? isControlFlowPath,
|
|
497
|
+
skipImplicitChain: false,
|
|
498
|
+
deferred: false,
|
|
499
|
+
onRef: options.onRef,
|
|
500
|
+
};
|
|
501
|
+
return hydrateValue(input, ctx, 0, undefined, 0);
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* The path and the input of the root call of a program: the call that `client.exec()` starts.
|
|
505
|
+
* `exec()` and the body of a procedure that `procedure.define` made both use this function, so
|
|
506
|
+
* the same program gives the same result in both (docs review DOC-3: before, a defined body
|
|
507
|
+
* hydrated its root call as a nested ref).
|
|
508
|
+
*
|
|
509
|
+
* The rules of the root call:
|
|
510
|
+
* - A `$when` on the root call does not apply: the caller starts the root call now.
|
|
511
|
+
* - A procedure that takes its input raw (`rawInput`) gets its input unchanged, with the scope
|
|
512
|
+
* attached, and runs its operands itself.
|
|
513
|
+
* - Another procedure gets its input hydrated as a root: a list of calls that run now is an
|
|
514
|
+
* implicit chain, and the nested refs run.
|
|
515
|
+
*
|
|
516
|
+
* The caller then starts the call with the path and the input.
|
|
517
|
+
*/
|
|
518
|
+
export async function prepareRootCall(ref, executor, options = {}) {
|
|
519
|
+
const root = normalizeRef(ref);
|
|
520
|
+
const rawInput = options.rawInput ?? isControlFlowPath;
|
|
521
|
+
if (rawInput(root.path)) {
|
|
522
|
+
return { path: root.path, input: withScope(root.input, options.scope) };
|
|
523
|
+
}
|
|
524
|
+
const input = await hydrateInput(root.input, executor, { rawInput, onRef: options.onRef, scope: options.scope });
|
|
525
|
+
return { path: root.path, input };
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* This function tells the observers that a ref runs now. The consumer is the nearest ref
|
|
529
|
+
* around the ref. An observer that throws does not change the hydration.
|
|
530
|
+
*/
|
|
531
|
+
function notifyRef(ctx, ref, path, ancestors) {
|
|
532
|
+
if (!ctx.onRef && hydrationObservers.size === 0)
|
|
533
|
+
return;
|
|
534
|
+
let consumer;
|
|
535
|
+
for (let current = ancestors; current; current = current.up) {
|
|
536
|
+
if (isAnyProcedureRef(current.value)) {
|
|
537
|
+
consumer = current.value;
|
|
538
|
+
break;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
const event = { path, ref, consumer };
|
|
542
|
+
for (const observer of ctx.onRef ? [ctx.onRef, ...hydrationObservers] : hydrationObservers) {
|
|
543
|
+
try {
|
|
544
|
+
observer(event);
|
|
545
|
+
}
|
|
546
|
+
catch {
|
|
547
|
+
// A trace must not change the program
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
/** The values of `fn` for each item: one after the other, or at the same time. */
|
|
552
|
+
async function eachValue(items, fn, parallel) {
|
|
553
|
+
if (parallel)
|
|
554
|
+
return Promise.all(items.map(fn));
|
|
555
|
+
const results = [];
|
|
556
|
+
for (const item of items)
|
|
557
|
+
results.push(await fn(item));
|
|
558
|
+
return results;
|
|
559
|
+
}
|
|
560
|
+
/** This function resolves a `$ref` in the scope of the hydration. */
|
|
561
|
+
function resolveRefValue(value, ctx) {
|
|
562
|
+
// No scope: the object is data (for example a JSON Schema reference), or a later scope binds it
|
|
563
|
+
if (!ctx.scope)
|
|
564
|
+
return value;
|
|
565
|
+
const { found, value: resolved } = lookupOutputRef(value.$ref, ctx.scope);
|
|
566
|
+
if (found)
|
|
567
|
+
return resolved;
|
|
568
|
+
// Inside a deferred ref, the runner can bind the name later
|
|
569
|
+
if (ctx.deferred)
|
|
570
|
+
return value;
|
|
571
|
+
const name = value.$ref.split(".")[0];
|
|
572
|
+
throw new Error(`Unknown $ref name "${name}" in "${value.$ref}": no step, item or input has this name here. ` +
|
|
573
|
+
`For a literal $ref object, write { "$literal": { "$ref": ... } }.`);
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Internal recursive hydration function.
|
|
577
|
+
*
|
|
578
|
+
* `refDepth` counts the refs around the value. `dataDepth` counts all levels.
|
|
579
|
+
*/
|
|
580
|
+
async function hydrateValue(value, ctx, refDepth, ancestors, dataDepth) {
|
|
581
|
+
// Handle null/undefined/primitives
|
|
582
|
+
if (value === null || typeof value !== "object") {
|
|
583
|
+
return value;
|
|
584
|
+
}
|
|
585
|
+
if (dataDepth > MAX_DATA_DEPTH) {
|
|
586
|
+
throw new Error(`Hydration failed: the input has more than ${MAX_DATA_DEPTH} levels of nesting`);
|
|
587
|
+
}
|
|
588
|
+
for (let current = ancestors; current; current = current.up) {
|
|
589
|
+
if (current.value === value) {
|
|
590
|
+
throw new Error("Hydration failed: the input is cyclic (an object contains itself)");
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
// { $literal: value } gives the value without hydration
|
|
594
|
+
if (isLiteral(value)) {
|
|
595
|
+
return value.$literal;
|
|
596
|
+
}
|
|
597
|
+
// Check if this is an output reference ($ref)
|
|
598
|
+
if (isOutputRef(value)) {
|
|
599
|
+
return resolveRefValue(value, ctx);
|
|
600
|
+
}
|
|
601
|
+
// Check if this is a procedure reference ($proc)
|
|
602
|
+
if (isAnyProcedureRef(value)) {
|
|
603
|
+
return hydrateRef(value, ctx, refDepth, ancestors, dataDepth);
|
|
604
|
+
}
|
|
605
|
+
const inner = { value, up: ancestors };
|
|
606
|
+
// Handle arrays
|
|
607
|
+
if (Array.isArray(value)) {
|
|
608
|
+
// An array of procedure refs that all run now is an implicit chain. A deferred ref ($never,
|
|
609
|
+
// $parent, a context name that the runner did not give) is data, so a list with one is a list
|
|
610
|
+
// (docs review DOC-1: before, a list of only $never refs ran as a chain). Inside an implicit
|
|
611
|
+
// chain, the steps do not make another one.
|
|
612
|
+
if (!ctx.skipImplicitChain &&
|
|
613
|
+
value.length > 0 &&
|
|
614
|
+
value.every((item) => isAnyProcedureRef(item) && shouldExecuteRef(item, ctx.contextStack, false))) {
|
|
615
|
+
// client.chain runs the steps in order: they reach it raw. (Before, hydration ran the steps
|
|
616
|
+
// all at once, and client.chain got their results: deep dive, architecture review 3.4.)
|
|
617
|
+
const implicitChain = { $proc: ["client", "chain"], input: { steps: value } };
|
|
618
|
+
return hydrateRef(implicitChain, { ...ctx, skipImplicitChain: true }, refDepth, ancestors, dataDepth);
|
|
619
|
+
}
|
|
620
|
+
const items = await eachValue(value, (item) => hydrateValue(item, ctx, refDepth, inner, dataDepth + 1), ctx.parallel);
|
|
621
|
+
return (items.every((item, index) => item === value[index]) ? value : items);
|
|
622
|
+
}
|
|
623
|
+
// Values that are not plain data (Date, Map, typed arrays, class instances) stay unchanged
|
|
624
|
+
if (!isPlainObject(value)) {
|
|
625
|
+
return value;
|
|
626
|
+
}
|
|
627
|
+
// Handle plain objects
|
|
628
|
+
const entries = Object.entries(value);
|
|
629
|
+
const values = await eachValue(entries, ([, val]) => hydrateValue(val, ctx, refDepth, inner, dataDepth + 1), ctx.parallel);
|
|
630
|
+
if (values.every((val, index) => val === entries[index][1])) {
|
|
631
|
+
return value;
|
|
632
|
+
}
|
|
633
|
+
// Object.fromEntries makes own properties, also for a key such as "__proto__"
|
|
634
|
+
return Object.fromEntries(entries.map(([key], index) => [key, values[index]]));
|
|
635
|
+
}
|
|
636
|
+
/** This function hydrates one procedure ref: it runs the ref, or it keeps the ref as data. */
|
|
637
|
+
async function hydrateRef(value, ctx, refDepth, ancestors, dataDepth) {
|
|
638
|
+
const when = getRefWhen(value);
|
|
639
|
+
// $never: pure data, with its whole subtree (deep dive CORE-11: before, its input was hydrated)
|
|
640
|
+
if (when === WHEN_NEVER) {
|
|
641
|
+
return value;
|
|
642
|
+
}
|
|
643
|
+
if (refDepth >= ctx.maxDepth) {
|
|
644
|
+
throw new Error(`Hydration depth exceeded maximum of ${ctx.maxDepth}`);
|
|
645
|
+
}
|
|
646
|
+
const ref = normalizeRef(value);
|
|
647
|
+
const raw = ctx.rawInput(ref.path);
|
|
648
|
+
const inner = { value, up: ancestors };
|
|
649
|
+
// The input of a ref is never an implicit chain
|
|
650
|
+
const inputCtx = (deferred) => ({ ...ctx, skipImplicitChain: true, deferred });
|
|
651
|
+
// A ref that waits for its runner ($parent, or a name that the runner did not give) is data.
|
|
652
|
+
// Its own $name is not a context here: hydration of its input does not run refs that wait for
|
|
653
|
+
// it, at any depth (deep dive CORE-11: before, this depended on the depth of the ref).
|
|
654
|
+
if (!shouldExecuteRef(value, ctx.contextStack, false)) {
|
|
655
|
+
if (raw)
|
|
656
|
+
return value;
|
|
657
|
+
const input = await hydrateValue(ref.input, inputCtx(true), refDepth + 1, inner, dataDepth + 1);
|
|
658
|
+
return input === ref.input ? value : { ...value, input };
|
|
659
|
+
}
|
|
660
|
+
// A procedure that takes its input raw gets it unchanged, with the scope of the caller
|
|
661
|
+
if (raw) {
|
|
662
|
+
notifyRef(ctx, value, ref.path, ancestors);
|
|
663
|
+
return ctx.executor(ref.path, withScope(ref.input, ctx.scope));
|
|
664
|
+
}
|
|
665
|
+
const input = await hydrateValue(ref.input, inputCtx(false), refDepth + 1, inner, dataDepth + 1);
|
|
666
|
+
notifyRef(ctx, value, ref.path, ancestors);
|
|
667
|
+
return ctx.executor(ref.path, input);
|
|
668
|
+
}
|
|
669
|
+
// =============================================================================
|
|
670
|
+
// Control-Flow Procedures
|
|
671
|
+
// =============================================================================
|
|
672
|
+
/**
|
|
673
|
+
* Last path segments of the core control-flow procedures (registered under `["client", ...]`).
|
|
674
|
+
*
|
|
675
|
+
* These procedures MUST receive their operand refs RAW so their handlers can execute
|
|
676
|
+
* them with correct ordering, laziness, short-circuiting, and error scoping. If `exec()`
|
|
677
|
+
* eagerly hydrated their inputs, the operands would run up-front (voiding conditional/
|
|
678
|
+
* tryCatch short-circuiting) and an all-refs array would be hijacked into an implicit
|
|
679
|
+
* chain that clobbers `steps` — the outer handler then throws `steps is not iterable`.
|
|
680
|
+
* See documentation/BUGS-2026-07.md (C2, H2, H3, M35).
|
|
681
|
+
*/
|
|
682
|
+
export const CONTROL_FLOW_PROCEDURES = new Set([
|
|
683
|
+
"chain",
|
|
684
|
+
"parallel",
|
|
685
|
+
"conditional",
|
|
686
|
+
"tryCatch",
|
|
687
|
+
"and",
|
|
688
|
+
"or",
|
|
689
|
+
"map",
|
|
690
|
+
"reduce",
|
|
691
|
+
]);
|
|
692
|
+
/**
|
|
693
|
+
* Whether a procedure path is one of the core control-flow procedures (`client.chain`,
|
|
694
|
+
* `client.map` and the others). The whole path must match: a user procedure `foo.map` is not
|
|
695
|
+
* control flow (deep dive CORE-5: before, only the last segment was compared).
|
|
696
|
+
*/
|
|
697
|
+
export function isControlFlowPath(path) {
|
|
698
|
+
return path.length === 2 && path[0] === "client" && CONTROL_FLOW_PROCEDURES.has(path[1]);
|
|
699
|
+
}
|
|
700
|
+
/**
|
|
701
|
+
* The tag of a procedure that runs procedure refs from its input (for example `dag.traverse`).
|
|
702
|
+
* A server with an `expose` rule lets such a procedure call only the exposed procedures.
|
|
703
|
+
* Hydration gives such a procedure its input raw.
|
|
704
|
+
*/
|
|
705
|
+
export const RUNS_REFS_TAG = "runs-refs";
|
|
706
|
+
/**
|
|
707
|
+
* The tag of a procedure that takes refs as data and does not run them (for example
|
|
708
|
+
* `client.export`, which writes a ref as JSON). Hydration gives such a procedure its input raw.
|
|
709
|
+
*/
|
|
710
|
+
export const RAW_INPUT_TAG = "raw-input";
|
|
711
|
+
const DATA_DRIVEN_HANDLERS = new WeakSet();
|
|
712
|
+
/**
|
|
713
|
+
* This function marks a procedure whose behavior comes from data, for example a procedure
|
|
714
|
+
* that `procedure.define` made from an aggregation. The mark is on the handler function: the
|
|
715
|
+
* registry stores a copy of each procedure, but the copy has the same handler. The mark is not
|
|
716
|
+
* in the metadata, because the caller of `procedure.define` gives the metadata.
|
|
717
|
+
*/
|
|
718
|
+
export function markDataDriven(procedure) {
|
|
719
|
+
if (typeof procedure.handler === "function")
|
|
720
|
+
DATA_DRIVEN_HANDLERS.add(procedure.handler);
|
|
721
|
+
return procedure;
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* A data-driven procedure runs procedure refs that come from its input or from data: the
|
|
725
|
+
* control-flow procedures, the procedures with the `runs-refs` tag and the procedures that
|
|
726
|
+
* `procedure.define` made. The caller of such a procedure chooses what it calls.
|
|
727
|
+
*/
|
|
728
|
+
export function isDataDriven(procedure) {
|
|
729
|
+
return (isControlFlowPath(procedure.path) ||
|
|
730
|
+
(procedure.metadata?.tags?.includes(RUNS_REFS_TAG) ?? false) ||
|
|
731
|
+
(typeof procedure.handler === "function" && DATA_DRIVEN_HANDLERS.has(procedure.handler)));
|
|
732
|
+
}
|
|
733
|
+
/**
|
|
734
|
+
* A procedure that takes its input raw: the control-flow procedures and the procedures with the
|
|
735
|
+
* `runs-refs` or `raw-input` tag. `exec()` and hydration do not run the refs of such an input.
|
|
736
|
+
* A procedure that `procedure.define` made takes ordinary input: its body is the data-driven part.
|
|
737
|
+
*/
|
|
738
|
+
export function takesRawInput(procedure) {
|
|
739
|
+
const tags = procedure.metadata?.tags;
|
|
740
|
+
return (isControlFlowPath(procedure.path) ||
|
|
741
|
+
(tags?.includes(RUNS_REFS_TAG) ?? false) ||
|
|
742
|
+
(tags?.includes(RAW_INPUT_TAG) ?? false));
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
745
|
+
* The raw-input rule of a registry, for `HydrateOptions.rawInput`. The procedure at the path
|
|
746
|
+
* decides (deep dive CORE-5). A path that the registry does not have uses the control-flow paths.
|
|
747
|
+
*/
|
|
748
|
+
export function rawInputRule(registry) {
|
|
749
|
+
return (path) => {
|
|
750
|
+
const procedure = registry?.get(path);
|
|
751
|
+
return procedure ? takesRawInput(procedure) : isControlFlowPath(path);
|
|
752
|
+
};
|
|
753
|
+
}
|
|
754
|
+
// =============================================================================
|
|
755
|
+
// Deferred Ref Execution
|
|
756
|
+
// =============================================================================
|
|
757
|
+
/**
|
|
758
|
+
* Execute a deferred procedure reference.
|
|
759
|
+
*
|
|
760
|
+
* This is a helper for procedures that receive deferred refs (via $when)
|
|
761
|
+
* and need to execute them with additional context.
|
|
762
|
+
*
|
|
763
|
+
* @param ref - The procedure reference to execute
|
|
764
|
+
* @param executor - Function to execute the procedure
|
|
765
|
+
* @param additionalInput - Additional input to merge (e.g., cwd for dag.traverse)
|
|
766
|
+
* @param options - Hydration options for the input of the ref (for example the runner's `contextStack`)
|
|
767
|
+
* @returns The result of executing the procedure
|
|
768
|
+
*
|
|
769
|
+
* @example
|
|
770
|
+
* ```typescript
|
|
771
|
+
* // In dag.traverse, execute a deferred ref with cwd
|
|
772
|
+
* const result = await executeRef(
|
|
773
|
+
* input.visit,
|
|
774
|
+
* (path, input) => ctx.client.call(path, input),
|
|
775
|
+
* { cwd: node.repoPath }
|
|
776
|
+
* );
|
|
777
|
+
* ```
|
|
778
|
+
*/
|
|
779
|
+
export async function executeRef(ref, executor, additionalInput, options = {}) {
|
|
780
|
+
const normalized = normalizeRef(ref);
|
|
781
|
+
const baseInput = typeof normalized.input === "object" ? normalized.input : {};
|
|
782
|
+
// Merge additional input
|
|
783
|
+
const mergedInput = {
|
|
784
|
+
...baseInput,
|
|
785
|
+
...additionalInput,
|
|
786
|
+
};
|
|
787
|
+
const raw = (options.rawInput ?? isControlFlowPath)(normalized.path);
|
|
788
|
+
if (raw) {
|
|
789
|
+
return executor(normalized.path, withScope(mergedInput, options.scope));
|
|
790
|
+
}
|
|
791
|
+
// Hydrate the merged input (execute any nested $immediate refs)
|
|
792
|
+
const hydratedInput = await hydrateInput(mergedInput, executor, options);
|
|
793
|
+
return executor(normalized.path, hydratedInput);
|
|
794
|
+
}
|
|
795
|
+
// =============================================================================
|
|
796
|
+
// Template Extraction
|
|
797
|
+
// =============================================================================
|
|
798
|
+
/**
|
|
799
|
+
* Extract a JSON template from a procedure reference.
|
|
800
|
+
* Useful for serializing imperative procedure compositions.
|
|
801
|
+
* The `$name` and `$when` fields stay. A `$literal` stays as it is.
|
|
802
|
+
*
|
|
803
|
+
* @param ref - Procedure reference to extract template from
|
|
804
|
+
* @returns JSON-serializable template
|
|
805
|
+
*/
|
|
806
|
+
export function extractTemplate(ref) {
|
|
807
|
+
return extractTemplateValue(ref);
|
|
808
|
+
}
|
|
809
|
+
/**
|
|
810
|
+
* Internal recursive template extraction.
|
|
811
|
+
*/
|
|
812
|
+
function extractTemplateValue(value) {
|
|
813
|
+
if (value === null || value === undefined) {
|
|
814
|
+
return value;
|
|
815
|
+
}
|
|
816
|
+
if (typeof value !== "object") {
|
|
817
|
+
return value;
|
|
818
|
+
}
|
|
819
|
+
if (isLiteral(value)) {
|
|
820
|
+
return value;
|
|
821
|
+
}
|
|
822
|
+
// Convert procedure refs to JSON form (runtime form, or already JSON form)
|
|
823
|
+
if (isAnyProcedureRef(value)) {
|
|
824
|
+
const ref = normalizeRef(value);
|
|
825
|
+
return {
|
|
826
|
+
$proc: ref.path,
|
|
827
|
+
input: extractTemplateValue(ref.input),
|
|
828
|
+
...refFields(ref),
|
|
829
|
+
};
|
|
830
|
+
}
|
|
831
|
+
// Handle arrays
|
|
832
|
+
if (Array.isArray(value)) {
|
|
833
|
+
return value.map(extractTemplateValue);
|
|
834
|
+
}
|
|
835
|
+
// Handle plain objects
|
|
836
|
+
const obj = value;
|
|
837
|
+
return Object.fromEntries(Object.entries(obj).map(([key, val]) => [key, extractTemplateValue(val)]));
|
|
838
|
+
}
|
|
839
|
+
// =============================================================================
|
|
840
|
+
// Parse JSON with Procedure Refs
|
|
841
|
+
// =============================================================================
|
|
842
|
+
/**
|
|
843
|
+
* Parse JSON string and convert $proc objects to runtime ProcedureRef objects.
|
|
844
|
+
* The `$name` and `$when` fields stay. A `$literal` stays as it is.
|
|
845
|
+
*
|
|
846
|
+
* @param json - JSON string potentially containing procedure references
|
|
847
|
+
* @returns Parsed object with ProcedureRef objects
|
|
848
|
+
*/
|
|
849
|
+
export function parseProcedureJson(json) {
|
|
850
|
+
const parsed = JSON.parse(json);
|
|
851
|
+
return convertJsonToRefs(parsed);
|
|
852
|
+
}
|
|
853
|
+
/**
|
|
854
|
+
* Convert parsed JSON to runtime procedure refs.
|
|
855
|
+
*/
|
|
856
|
+
function convertJsonToRefs(value) {
|
|
857
|
+
if (value === null || value === undefined) {
|
|
858
|
+
return value;
|
|
859
|
+
}
|
|
860
|
+
if (typeof value !== "object") {
|
|
861
|
+
return value;
|
|
862
|
+
}
|
|
863
|
+
if (isLiteral(value)) {
|
|
864
|
+
return value;
|
|
865
|
+
}
|
|
866
|
+
// Convert $proc objects to ProcedureRef
|
|
867
|
+
if (isProcedureRefJson(value)) {
|
|
868
|
+
return {
|
|
869
|
+
[PROCEDURE_SYMBOL]: true,
|
|
870
|
+
path: value.$proc,
|
|
871
|
+
input: convertJsonToRefs(value.input),
|
|
872
|
+
...refFields(value),
|
|
873
|
+
};
|
|
874
|
+
}
|
|
875
|
+
// Handle arrays
|
|
876
|
+
if (Array.isArray(value)) {
|
|
877
|
+
return value.map(convertJsonToRefs);
|
|
878
|
+
}
|
|
879
|
+
// Handle plain objects
|
|
880
|
+
const obj = value;
|
|
881
|
+
return Object.fromEntries(Object.entries(obj).map(([key, val]) => [key, convertJsonToRefs(val)]));
|
|
882
|
+
}
|
|
883
|
+
/**
|
|
884
|
+
* Stringify an object with procedure refs to JSON.
|
|
885
|
+
* Converts ProcedureRef objects to $proc JSON form.
|
|
886
|
+
*
|
|
887
|
+
* @param value - Object potentially containing ProcedureRef objects
|
|
888
|
+
* @param space - Indentation (passed to JSON.stringify)
|
|
889
|
+
* @returns JSON string
|
|
890
|
+
*/
|
|
891
|
+
export function stringifyProcedureJson(value, space) {
|
|
892
|
+
const converted = extractTemplateValue(value);
|
|
893
|
+
return JSON.stringify(converted, null, space);
|
|
894
|
+
}
|
|
895
|
+
//# sourceMappingURL=ref.js.map
|