@effect-app/infra 4.0.0-beta.99 → 4.0.1
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 +2901 -0
- package/_check.sh +1 -1
- package/dist/CUPS.d.ts +28 -9
- package/dist/CUPS.d.ts.map +1 -1
- package/dist/CUPS.js +35 -14
- package/dist/ClusterCosmos.d.ts +67 -0
- package/dist/ClusterCosmos.d.ts.map +1 -0
- package/dist/ClusterCosmos.js +588 -0
- package/dist/ClusterServiceBus.d.ts +67 -0
- package/dist/ClusterServiceBus.d.ts.map +1 -0
- package/dist/ClusterServiceBus.js +84 -0
- package/dist/{api/ContextProvider.d.ts → ContextProvider.d.ts} +7 -4
- package/dist/ContextProvider.d.ts.map +1 -0
- package/dist/ContextProvider.js +40 -0
- package/dist/Emailer/Sendgrid.d.ts +110 -146
- package/dist/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/Emailer/Sendgrid.js +24 -19
- package/dist/Emailer/fake.d.ts +1 -1
- package/dist/Emailer/fake.d.ts.map +1 -1
- package/dist/Emailer/fake.js +4 -4
- package/dist/MainFiberSet.d.ts +11 -7
- package/dist/MainFiberSet.d.ts.map +1 -1
- package/dist/MainFiberSet.js +22 -6
- package/dist/QueueMaker/errors.d.ts +3 -1
- package/dist/QueueMaker/errors.d.ts.map +1 -1
- package/dist/QueueMaker/errors.js +4 -2
- package/dist/{adapters/SQL → SQL}/Model.d.ts +34 -45
- package/dist/SQL/Model.d.ts.map +1 -0
- package/dist/SQL/Model.js +469 -0
- package/dist/SQL.d.ts.map +1 -0
- package/dist/{adapters/SQL.js → SQL.js} +1 -1
- package/dist/Store/Cosmos/query.d.ts +16 -4
- package/dist/Store/Cosmos/query.d.ts.map +1 -1
- package/dist/Store/Cosmos/query.js +240 -44
- package/dist/Store/Cosmos.d.ts +2 -2
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +394 -320
- package/dist/Store/Disk.d.ts +4 -4
- package/dist/Store/Disk.d.ts.map +1 -1
- package/dist/Store/Disk.js +91 -39
- package/dist/Store/Memory.d.ts +7 -10
- package/dist/Store/Memory.d.ts.map +1 -1
- package/dist/Store/Memory.js +347 -78
- package/dist/Store/SQL/Pg.d.ts +2 -2
- package/dist/Store/SQL/Pg.d.ts.map +1 -1
- package/dist/Store/SQL/Pg.js +230 -155
- package/dist/Store/SQL/query.d.ts +19 -3
- package/dist/Store/SQL/query.d.ts.map +1 -1
- package/dist/Store/SQL/query.js +308 -14
- package/dist/Store/SQL.d.ts +22 -5
- package/dist/Store/SQL.d.ts.map +1 -1
- package/dist/Store/SQL.js +370 -99
- package/dist/Store/codeFilter.d.ts +5 -5
- package/dist/Store/codeFilter.d.ts.map +1 -1
- package/dist/Store/codeFilter.js +72 -23
- package/dist/Store/index.d.ts +6 -4
- package/dist/Store/index.d.ts.map +1 -1
- package/dist/Store/index.js +9 -6
- package/dist/Store/jsonDocument.d.ts +67 -0
- package/dist/Store/jsonDocument.d.ts.map +1 -0
- package/dist/Store/jsonDocument.js +107 -0
- package/dist/Store/utils.d.ts +21 -2
- package/dist/Store/utils.d.ts.map +1 -1
- package/dist/Store/utils.js +253 -10
- package/dist/WorkflowEngineCosmos.d.ts +30 -0
- package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
- package/dist/WorkflowEngineCosmos.js +542 -0
- package/dist/WorkflowEngineSqlite.d.ts +24 -0
- package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
- package/dist/WorkflowEngineSqlite.js +550 -0
- package/dist/arbs.d.ts +6 -3
- package/dist/arbs.d.ts.map +1 -1
- package/dist/arbs.js +20 -4
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +5 -0
- package/dist/cosmos-client.d.ts +40 -0
- package/dist/cosmos-client.d.ts.map +1 -0
- package/dist/cosmos-client.js +41 -0
- package/dist/errorReporter.d.ts +6 -4
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +23 -27
- package/dist/fileUtil.d.ts +1 -1
- package/dist/fileUtil.d.ts.map +1 -1
- package/dist/fileUtil.js +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/internal/RequestContextMiddleware.d.ts +5 -0
- package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
- package/dist/internal/RequestContextMiddleware.js +45 -0
- package/dist/internal/auth.d.ts +53 -0
- package/dist/internal/auth.d.ts.map +1 -0
- package/dist/internal/auth.js +180 -0
- package/dist/internal/events.d.ts +11 -0
- package/dist/internal/events.d.ts.map +1 -0
- package/dist/internal/events.js +49 -0
- package/dist/{api/internal → internal}/health.d.ts +1 -1
- package/dist/internal/health.d.ts.map +1 -0
- package/dist/internal/health.js +5 -0
- package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +10 -2
- package/dist/layerUtils.d.ts.map +1 -0
- package/dist/layerUtils.js +17 -0
- package/dist/logger/jsonLogger.d.ts +1 -1
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +5 -3
- package/dist/logger/logFmtLogger.d.ts +1 -1
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +3 -3
- package/dist/logger/shared.d.ts +2 -2
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +6 -6
- package/dist/logger.d.ts.map +1 -1
- package/dist/middlewares.d.ts.map +1 -0
- package/dist/{api/middlewares.js → middlewares.js} +1 -1
- package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +2 -1
- package/dist/mongo-client.d.ts.map +1 -0
- package/dist/mongo-client.js +15 -0
- package/dist/otel.d.ts +75 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +84 -0
- package/dist/rateLimit.d.ts +11 -3
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +7 -12
- package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +4 -1
- package/dist/redis-client.d.ts.map +1 -0
- package/dist/redis-client.js +98 -0
- package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
- package/dist/reportError.d.ts.map +1 -0
- package/dist/reportError.js +28 -0
- package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +2 -1
- package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
- package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
- package/dist/{api/routing → routing}/middleware/middleware.d.ts +11 -6
- package/dist/routing/middleware/middleware.d.ts.map +1 -0
- package/dist/routing/middleware/middleware.js +152 -0
- package/dist/{api/routing → routing}/middleware.d.ts +0 -1
- package/dist/routing/middleware.d.ts.map +1 -0
- package/dist/{api/routing → routing}/middleware.js +1 -2
- package/dist/routing/schema/jwt.d.ts.map +1 -0
- package/dist/routing/schema/jwt.js +12 -0
- package/dist/routing/tsort.d.ts.map +1 -0
- package/dist/routing/tsort.js +51 -0
- package/dist/{api/routing → routing}/utils.d.ts +3 -3
- package/dist/routing/utils.d.ts.map +1 -0
- package/dist/routing/utils.js +45 -0
- package/dist/routing.d.ts +182 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +257 -0
- package/dist/test.d.ts +2 -2
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +5 -5
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +14 -0
- package/docs/cluster-storage.md +26 -0
- package/docs/workflow-engine.md +262 -0
- package/examples/query.ts +23 -19
- package/package.json +36 -364
- package/src/CUPS.ts +53 -14
- package/src/ClusterCosmos.ts +1170 -0
- package/src/ClusterServiceBus.ts +244 -0
- package/src/{api/ContextProvider.ts → ContextProvider.ts} +10 -7
- package/src/Emailer/Sendgrid.ts +83 -60
- package/src/Emailer/fake.ts +4 -4
- package/src/MainFiberSet.ts +31 -12
- package/src/QueueMaker/errors.ts +3 -1
- package/src/{adapters/SQL → SQL}/Model.ts +48 -47
- package/src/SQL.ts +1 -0
- package/src/Store/Cosmos/query.ts +277 -57
- package/src/Store/Cosmos.ts +597 -512
- package/src/Store/Disk.ts +145 -71
- package/src/Store/Memory.ts +419 -115
- package/src/Store/SQL/Pg.ts +352 -269
- package/src/Store/SQL/query.ts +368 -22
- package/src/Store/SQL.ts +742 -294
- package/src/Store/codeFilter.ts +79 -29
- package/src/Store/index.ts +18 -13
- package/src/Store/jsonDocument.ts +143 -0
- package/src/Store/utils.ts +307 -30
- package/src/WorkflowEngineCosmos.ts +749 -0
- package/src/WorkflowEngineSqlite.ts +813 -0
- package/src/arbs.ts +25 -5
- package/src/cosmos-client.ts +72 -0
- package/src/errorReporter.ts +70 -78
- package/src/fileUtil.ts +1 -1
- package/src/index.ts +2 -1
- package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
- package/src/internal/auth.ts +272 -0
- package/src/{api/internal → internal}/events.ts +18 -9
- package/src/{api/layerUtils.ts → layerUtils.ts} +7 -3
- package/src/logger/jsonLogger.ts +5 -3
- package/src/logger/logFmtLogger.ts +3 -3
- package/src/logger/shared.ts +6 -5
- package/src/middlewares.ts +10 -0
- package/src/{adapters/mongo-client.ts → mongo-client.ts} +3 -1
- package/src/otel.ts +177 -0
- package/src/rateLimit.ts +35 -24
- package/src/{adapters/redis-client.ts → redis-client.ts} +6 -2
- package/src/{api/reportError.ts → reportError.ts} +3 -2
- package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +2 -1
- package/src/{api/routing → routing}/middleware/middleware.ts +75 -50
- package/src/routing/middleware.ts +4 -0
- package/src/{api/routing → routing}/schema/jwt.ts +2 -2
- package/src/{api/routing → routing}/utils.ts +2 -1
- package/src/routing.ts +827 -0
- package/src/test.ts +6 -6
- package/src/vitest.ts +1 -1
- package/test/arbs-magnitude.test.ts +33 -0
- package/test/arbs.test.ts +41 -0
- package/test/auth.test.ts +101 -0
- package/test/cluster-cosmos.test.ts +634 -0
- package/test/cluster-servicebus.test.ts +180 -0
- package/test/cluster-sqlite.test.ts +207 -0
- package/test/contextProvider.test.ts +11 -8
- package/test/controller.test.ts +23 -28
- package/test/cosmos-container-throughput.test.ts +80 -0
- package/test/cosmos-query.test.ts +368 -0
- package/test/dist/arbs-magnitude.test.d.ts.map +1 -0
- package/test/dist/arbs.test.d.ts.map +1 -0
- package/test/dist/auth.test.d.ts.map +1 -0
- package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
- package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
- package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
- package/test/dist/contextProvider.test.d.ts.map +1 -1
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/cosmos-container-throughput.test.d.ts.map +1 -0
- package/test/dist/cosmos-query.test.d.ts.map +1 -0
- package/test/dist/fixtures.d.ts +17 -9
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +8 -3
- package/test/dist/json-lower.test.d.ts.map +1 -0
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/dist/rawQuery.test.d.ts.map +1 -1
- package/test/dist/repository-ext.test.d.ts.map +1 -0
- package/test/dist/repository-legacy-document.test.d.ts.map +1 -0
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/router-generator.test.d.ts.map +1 -0
- package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
- package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
- package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
- package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
- package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
- package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
- package/test/fixtures.ts +7 -2
- package/test/json-lower.test.ts +129 -0
- package/test/layerUtils.test.ts +2 -2
- package/test/query.test.ts +1232 -42
- package/test/rawQuery.test.ts +432 -7
- package/test/repository-ext.test.ts +456 -0
- package/test/repository-legacy-document.test.ts +394 -0
- package/test/requires.test.ts +7 -3
- package/test/router-generator.test.ts +187 -0
- package/test/routing-interruptibility.test.ts +66 -0
- package/test/rpc-context-map-streaming.test.ts +265 -0
- package/test/rpc-e2e-invalidation.test.ts +421 -0
- package/test/rpc-multi-middleware.test.ts +17 -11
- package/test/rpc-stream-fullstack.test.ts +307 -0
- package/test/sql-store.test.ts +1202 -47
- package/test/validateSample.test.ts +70 -42
- package/test/workflow-engine-cosmos.test.ts +345 -0
- package/test/workflow-engine-sqlite.test.ts +297 -0
- package/tsconfig.examples.json +1 -1
- package/tsconfig.json +9 -1
- package/tsconfig.src.json +35 -35
- package/tsconfig.test.json +2 -2
- package/dist/Emailer/service.d.ts +0 -55
- package/dist/Emailer/service.d.ts.map +0 -1
- package/dist/Emailer/service.js +0 -6
- package/dist/Emailer.d.ts +0 -2
- package/dist/Emailer.d.ts.map +0 -1
- package/dist/Emailer.js +0 -2
- package/dist/Model/Repository/ext.d.ts +0 -41
- package/dist/Model/Repository/ext.d.ts.map +0 -1
- package/dist/Model/Repository/ext.js +0 -65
- package/dist/Model/Repository/internal/internal.d.ts +0 -59
- package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
- package/dist/Model/Repository/internal/internal.js +0 -320
- package/dist/Model/Repository/legacy.d.ts +0 -19
- package/dist/Model/Repository/legacy.d.ts.map +0 -1
- package/dist/Model/Repository/legacy.js +0 -2
- package/dist/Model/Repository/makeRepo.d.ts +0 -49
- package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
- package/dist/Model/Repository/makeRepo.js +0 -24
- package/dist/Model/Repository/service.d.ts +0 -89
- package/dist/Model/Repository/service.d.ts.map +0 -1
- package/dist/Model/Repository/service.js +0 -2
- package/dist/Model/Repository/validation.d.ts +0 -43
- package/dist/Model/Repository/validation.d.ts.map +0 -1
- package/dist/Model/Repository/validation.js +0 -32
- package/dist/Model/Repository.d.ts +0 -6
- package/dist/Model/Repository.d.ts.map +0 -1
- package/dist/Model/Repository.js +0 -6
- package/dist/Model/dsl.d.ts +0 -32
- package/dist/Model/dsl.d.ts.map +0 -1
- package/dist/Model/dsl.js +0 -44
- package/dist/Model/filter/filterApi.d.ts +0 -30
- package/dist/Model/filter/filterApi.d.ts.map +0 -1
- package/dist/Model/filter/filterApi.js +0 -2
- package/dist/Model/filter/types/errors.d.ts +0 -29
- package/dist/Model/filter/types/errors.d.ts.map +0 -1
- package/dist/Model/filter/types/errors.js +0 -2
- package/dist/Model/filter/types/fields.d.ts +0 -15
- package/dist/Model/filter/types/fields.d.ts.map +0 -1
- package/dist/Model/filter/types/fields.js +0 -2
- package/dist/Model/filter/types/path/common.d.ts +0 -316
- package/dist/Model/filter/types/path/common.d.ts.map +0 -1
- package/dist/Model/filter/types/path/common.js +0 -2
- package/dist/Model/filter/types/path/eager.d.ts +0 -95
- package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
- package/dist/Model/filter/types/path/eager.js +0 -31
- package/dist/Model/filter/types/path/index.d.ts +0 -4
- package/dist/Model/filter/types/path/index.d.ts.map +0 -1
- package/dist/Model/filter/types/path/index.js +0 -3
- package/dist/Model/filter/types/utils.d.ts +0 -79
- package/dist/Model/filter/types/utils.d.ts.map +0 -1
- package/dist/Model/filter/types/utils.js +0 -2
- package/dist/Model/filter/types/validator.d.ts +0 -30
- package/dist/Model/filter/types/validator.d.ts.map +0 -1
- package/dist/Model/filter/types/validator.js +0 -2
- package/dist/Model/filter/types.d.ts +0 -5
- package/dist/Model/filter/types.d.ts.map +0 -1
- package/dist/Model/filter/types.js +0 -7
- package/dist/Model/query/dsl.d.ts +0 -248
- package/dist/Model/query/dsl.d.ts.map +0 -1
- package/dist/Model/query/dsl.js +0 -104
- package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
- package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
- package/dist/Model/query/new-kid-interpreter.js +0 -165
- package/dist/Model/query.d.ts +0 -15
- package/dist/Model/query.d.ts.map +0 -1
- package/dist/Model/query.js +0 -3
- package/dist/Model.d.ts +0 -4
- package/dist/Model.d.ts.map +0 -1
- package/dist/Model.js +0 -4
- package/dist/Operations.d.ts +0 -55
- package/dist/Operations.d.ts.map +0 -1
- package/dist/Operations.js +0 -102
- package/dist/OperationsRepo.d.ts +0 -41
- package/dist/OperationsRepo.d.ts.map +0 -1
- package/dist/OperationsRepo.js +0 -14
- package/dist/QueueMaker/SQLQueue.d.ts +0 -14
- package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
- package/dist/QueueMaker/SQLQueue.js +0 -132
- package/dist/QueueMaker/memQueue.d.ts +0 -11
- package/dist/QueueMaker/memQueue.d.ts.map +0 -1
- package/dist/QueueMaker/memQueue.js +0 -76
- package/dist/QueueMaker/sbqueue.d.ts +0 -12
- package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
- package/dist/QueueMaker/sbqueue.js +0 -91
- package/dist/QueueMaker/service.d.ts +0 -11
- package/dist/QueueMaker/service.d.ts.map +0 -1
- package/dist/QueueMaker/service.js +0 -4
- package/dist/RequestContext.d.ts +0 -68
- package/dist/RequestContext.d.ts.map +0 -1
- package/dist/RequestContext.js +0 -49
- package/dist/RequestFiberSet.d.ts +0 -36
- package/dist/RequestFiberSet.d.ts.map +0 -1
- package/dist/RequestFiberSet.js +0 -78
- package/dist/Store/ContextMapContainer.d.ts +0 -25
- package/dist/Store/ContextMapContainer.d.ts.map +0 -1
- package/dist/Store/ContextMapContainer.js +0 -77
- package/dist/Store/service.d.ts +0 -111
- package/dist/Store/service.d.ts.map +0 -1
- package/dist/Store/service.js +0 -79
- package/dist/Store.d.ts +0 -2
- package/dist/Store.d.ts.map +0 -1
- package/dist/Store.js +0 -2
- package/dist/adapters/SQL/Model.d.ts.map +0 -1
- package/dist/adapters/SQL/Model.js +0 -478
- package/dist/adapters/SQL.d.ts.map +0 -1
- package/dist/adapters/ServiceBus.d.ts +0 -58
- package/dist/adapters/ServiceBus.d.ts.map +0 -1
- package/dist/adapters/ServiceBus.js +0 -99
- package/dist/adapters/cosmos-client.d.ts +0 -14
- package/dist/adapters/cosmos-client.d.ts.map +0 -1
- package/dist/adapters/cosmos-client.js +0 -9
- package/dist/adapters/index.d.ts +0 -2
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -2
- package/dist/adapters/logger.d.ts +0 -9
- package/dist/adapters/logger.d.ts.map +0 -1
- package/dist/adapters/logger.js +0 -3
- package/dist/adapters/memQueue.d.ts +0 -13
- package/dist/adapters/memQueue.d.ts.map +0 -1
- package/dist/adapters/memQueue.js +0 -20
- package/dist/adapters/mongo-client.d.ts.map +0 -1
- package/dist/adapters/mongo-client.js +0 -13
- package/dist/adapters/redis-client.d.ts.map +0 -1
- package/dist/adapters/redis-client.js +0 -94
- package/dist/api/ContextProvider.d.ts.map +0 -1
- package/dist/api/ContextProvider.js +0 -38
- package/dist/api/codec.d.ts.map +0 -1
- package/dist/api/codec.js +0 -5
- package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
- package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
- package/dist/api/internal/RequestContextMiddleware.js +0 -35
- package/dist/api/internal/auth.d.ts +0 -15
- package/dist/api/internal/auth.d.ts.map +0 -1
- package/dist/api/internal/auth.js +0 -47
- package/dist/api/internal/events.d.ts +0 -9
- package/dist/api/internal/events.d.ts.map +0 -1
- package/dist/api/internal/events.js +0 -42
- package/dist/api/internal/health.d.ts.map +0 -1
- package/dist/api/internal/health.js +0 -5
- package/dist/api/layerUtils.d.ts.map +0 -1
- package/dist/api/layerUtils.js +0 -16
- package/dist/api/middlewares.d.ts.map +0 -1
- package/dist/api/reportError.d.ts.map +0 -1
- package/dist/api/reportError.js +0 -27
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
- package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
- package/dist/api/routing/middleware/middleware.js +0 -130
- package/dist/api/routing/middleware.d.ts.map +0 -1
- package/dist/api/routing/schema/jwt.d.ts.map +0 -1
- package/dist/api/routing/schema/jwt.js +0 -12
- package/dist/api/routing/tsort.d.ts.map +0 -1
- package/dist/api/routing/tsort.js +0 -51
- package/dist/api/routing/utils.d.ts.map +0 -1
- package/dist/api/routing/utils.js +0 -44
- package/dist/api/routing.d.ts +0 -134
- package/dist/api/routing.d.ts.map +0 -1
- package/dist/api/routing.js +0 -167
- package/dist/api/setupRequest.d.ts +0 -15
- package/dist/api/setupRequest.d.ts.map +0 -1
- package/dist/api/setupRequest.js +0 -49
- package/dist/api/util.d.ts.map +0 -1
- package/dist/api/util.js +0 -14
- package/eslint.config.mjs +0 -24
- package/src/Emailer/service.ts +0 -52
- package/src/Emailer.ts +0 -1
- package/src/Model/Repository/ext.ts +0 -283
- package/src/Model/Repository/internal/internal.ts +0 -580
- package/src/Model/Repository/legacy.ts +0 -27
- package/src/Model/Repository/makeRepo.ts +0 -139
- package/src/Model/Repository/service.ts +0 -627
- package/src/Model/Repository/validation.ts +0 -31
- package/src/Model/Repository.ts +0 -5
- package/src/Model/dsl.ts +0 -128
- package/src/Model/filter/filterApi.ts +0 -60
- package/src/Model/filter/types/errors.ts +0 -47
- package/src/Model/filter/types/fields.ts +0 -50
- package/src/Model/filter/types/path/common.ts +0 -404
- package/src/Model/filter/types/path/eager.ts +0 -298
- package/src/Model/filter/types/path/index.ts +0 -4
- package/src/Model/filter/types/utils.ts +0 -128
- package/src/Model/filter/types/validator.ts +0 -46
- package/src/Model/filter/types.ts +0 -6
- package/src/Model/query/dsl.ts +0 -2110
- package/src/Model/query/new-kid-interpreter.ts +0 -210
- package/src/Model/query.ts +0 -13
- package/src/Model.ts +0 -3
- package/src/Operations.ts +0 -235
- package/src/OperationsRepo.ts +0 -16
- package/src/QueueMaker/SQLQueue.ts +0 -190
- package/src/QueueMaker/memQueue.ts +0 -130
- package/src/QueueMaker/sbqueue.ts +0 -137
- package/src/QueueMaker/service.ts +0 -17
- package/src/RequestContext.ts +0 -63
- package/src/RequestFiberSet.ts +0 -105
- package/src/Store/ContextMapContainer.ts +0 -116
- package/src/Store/index.test.ts.bak +0 -112
- package/src/Store/service.ts +0 -193
- package/src/Store.ts +0 -1
- package/src/adapters/SQL.ts +0 -1
- package/src/adapters/ServiceBus.ts +0 -209
- package/src/adapters/cosmos-client.ts +0 -16
- package/src/adapters/index.ts +0 -0
- package/src/adapters/logger.ts +0 -3
- package/src/adapters/memQueue.ts +0 -21
- package/src/api/internal/auth.ts +0 -68
- package/src/api/middlewares.ts +0 -10
- package/src/api/routing/middleware.ts +0 -6
- package/src/api/routing.ts +0 -598
- package/src/api/setupRequest.ts +0 -104
- package/test/dist/date-query.test.d.ts.map +0 -1
- package/tsconfig.json.bak +0 -12
- /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
- /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
- /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
- /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
- /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
- /package/dist/{api/util.d.ts → util.d.ts} +0 -0
- /package/src/{api/codec.ts → codec.ts} +0 -0
- /package/src/{api/internal → internal}/health.ts +0 -0
- /package/src/{api/routing → routing}/tsort.ts +0 -0
- /package/src/{api/util.ts → util.ts} +0 -0
package/src/Store/codeFilter.ts
CHANGED
|
@@ -1,60 +1,109 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import type {
|
|
6
|
-
import
|
|
7
|
-
import type { Filter } from "
|
|
8
|
-
import {
|
|
3
|
+
import * as Array from "effect-app/Array"
|
|
4
|
+
import type { FilterR, FilterResult } from "effect-app/Model/filter/filterApi"
|
|
5
|
+
import type { FieldValues } from "effect-app/Model/filter/types"
|
|
6
|
+
import * as Option from "effect-app/Option"
|
|
7
|
+
import type { Filter } from "effect-app/Store"
|
|
8
|
+
import { absurd } from "effect/Function"
|
|
9
|
+
import { compare, get, greaterThan, greaterThanExclusive, lowerThan, lowerThanExclusive, toJsonQueryValue } from "./utils.ts"
|
|
9
10
|
|
|
10
|
-
const vAsArr = (v:
|
|
11
|
+
const vAsArr = (v: unknown) => toJsonQueryValue(v) as any[]
|
|
12
|
+
|
|
13
|
+
const mapEntries = (value: unknown): readonly [unknown, unknown][] => {
|
|
14
|
+
const json = toJsonQueryValue(value)
|
|
15
|
+
if (!Array.isArray(json)) return []
|
|
16
|
+
return json.filter((entry): entry is [unknown, unknown] => Array.isArray(entry) && entry.length >= 2)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const pairEq = (entry: readonly [unknown, unknown], pair: unknown) => {
|
|
20
|
+
const json = toJsonQueryValue(pair)
|
|
21
|
+
return Array.isArray(json) && json.length >= 2 && compare(entry[0], json[0]) && compare(entry[1], json[1])
|
|
22
|
+
}
|
|
11
23
|
|
|
12
24
|
const filterStatement = (x: any, p: FilterR) => {
|
|
13
|
-
const k = get(x, p.path)
|
|
25
|
+
const k = toJsonQueryValue(get(x, p.path))
|
|
26
|
+
const v = toJsonQueryValue(p.value)
|
|
14
27
|
switch (p.op) {
|
|
15
28
|
case "in":
|
|
16
|
-
return
|
|
29
|
+
return (v as unknown[]).includes(k)
|
|
17
30
|
case "notIn":
|
|
18
|
-
return !
|
|
31
|
+
return !(v as unknown[]).includes(k)
|
|
19
32
|
case "lt":
|
|
20
|
-
return lowerThan(k,
|
|
33
|
+
return lowerThan(k as any, v as any)
|
|
21
34
|
case "lte":
|
|
22
|
-
return lowerThanExclusive(k,
|
|
35
|
+
return lowerThanExclusive(k as any, v as any)
|
|
23
36
|
case "gt":
|
|
24
|
-
return greaterThan(k,
|
|
37
|
+
return greaterThan(k as any, v as any)
|
|
25
38
|
case "gte":
|
|
26
|
-
return greaterThanExclusive(k,
|
|
39
|
+
return greaterThanExclusive(k as any, v as any)
|
|
27
40
|
case "includes":
|
|
28
|
-
return (k as Array<
|
|
41
|
+
return (k as Array<unknown>).includes(v)
|
|
29
42
|
case "notIncludes":
|
|
30
|
-
return !(k as Array<
|
|
43
|
+
return !(k as Array<unknown>).includes(v)
|
|
31
44
|
case "includes-any":
|
|
32
|
-
return (vAsArr(p.value)).some((_) => (k as Array<
|
|
45
|
+
return (vAsArr(p.value)).some((_) => (k as Array<unknown>)?.includes(_))
|
|
33
46
|
case "notIncludes-any":
|
|
34
|
-
return !(vAsArr(p.value)).some((_) => (k as Array<
|
|
47
|
+
return !(vAsArr(p.value)).some((_) => (k as Array<unknown>)?.includes(_))
|
|
35
48
|
case "includes-all":
|
|
36
|
-
return (vAsArr(p.value)).every((_) => (k as Array<
|
|
49
|
+
return (vAsArr(p.value)).every((_) => (k as Array<unknown>)?.includes(_))
|
|
37
50
|
case "notIncludes-all":
|
|
38
|
-
return !(vAsArr(p.value)).every((_) => (k as Array<
|
|
51
|
+
return !(vAsArr(p.value)).every((_) => (k as Array<unknown>)?.includes(_))
|
|
52
|
+
case "hasKey":
|
|
53
|
+
return mapEntries(k).some(([key]) => compare(key, v))
|
|
54
|
+
case "notHasKey":
|
|
55
|
+
return !mapEntries(k).some(([key]) => compare(key, v))
|
|
56
|
+
case "hasValue":
|
|
57
|
+
return mapEntries(k).some(([, val]) => compare(val, v))
|
|
58
|
+
case "notHasValue":
|
|
59
|
+
return !mapEntries(k).some(([, val]) => compare(val, v))
|
|
60
|
+
case "hasKeyValue":
|
|
61
|
+
return mapEntries(k).some((entry) => pairEq(entry, v))
|
|
62
|
+
case "notHasKeyValue":
|
|
63
|
+
return !mapEntries(k).some((entry) => pairEq(entry, v))
|
|
64
|
+
case "hasKey-any":
|
|
65
|
+
return vAsArr(p.value).some((key) => mapEntries(k).some(([k0]) => compare(k0, key)))
|
|
66
|
+
case "notHasKey-any":
|
|
67
|
+
return !vAsArr(p.value).some((key) => mapEntries(k).some(([k0]) => compare(k0, key)))
|
|
68
|
+
case "hasKey-all":
|
|
69
|
+
return vAsArr(p.value).every((key) => mapEntries(k).some(([k0]) => compare(k0, key)))
|
|
70
|
+
case "notHasKey-all":
|
|
71
|
+
return !vAsArr(p.value).every((key) => mapEntries(k).some(([k0]) => compare(k0, key)))
|
|
72
|
+
case "hasValue-any":
|
|
73
|
+
return vAsArr(p.value).some((val) => mapEntries(k).some(([, v0]) => compare(v0, val)))
|
|
74
|
+
case "notHasValue-any":
|
|
75
|
+
return !vAsArr(p.value).some((val) => mapEntries(k).some(([, v0]) => compare(v0, val)))
|
|
76
|
+
case "hasValue-all":
|
|
77
|
+
return vAsArr(p.value).every((val) => mapEntries(k).some(([, v0]) => compare(v0, val)))
|
|
78
|
+
case "notHasValue-all":
|
|
79
|
+
return !vAsArr(p.value).every((val) => mapEntries(k).some(([, v0]) => compare(v0, val)))
|
|
80
|
+
case "hasKeyValue-any":
|
|
81
|
+
return vAsArr(p.value).some((pair) => mapEntries(k).some((entry) => pairEq(entry, pair)))
|
|
82
|
+
case "notHasKeyValue-any":
|
|
83
|
+
return !vAsArr(p.value).some((pair) => mapEntries(k).some((entry) => pairEq(entry, pair)))
|
|
84
|
+
case "hasKeyValue-all":
|
|
85
|
+
return vAsArr(p.value).every((pair) => mapEntries(k).some((entry) => pairEq(entry, pair)))
|
|
86
|
+
case "notHasKeyValue-all":
|
|
87
|
+
return !vAsArr(p.value).every((pair) => mapEntries(k).some((entry) => pairEq(entry, pair)))
|
|
39
88
|
case "contains":
|
|
40
|
-
return (k as string).toLowerCase().includes(
|
|
89
|
+
return (k as string).toLowerCase().includes((v as string).toLowerCase())
|
|
41
90
|
case "endsWith":
|
|
42
|
-
return (k as string).toLowerCase().endsWith(
|
|
91
|
+
return (k as string).toLowerCase().endsWith((v as string).toLowerCase())
|
|
43
92
|
case "startsWith":
|
|
44
|
-
return (k as string).toLowerCase().startsWith(
|
|
93
|
+
return (k as string).toLowerCase().startsWith((v as string).toLowerCase())
|
|
45
94
|
case "notContains":
|
|
46
|
-
return !(k as string).toLowerCase().includes(
|
|
95
|
+
return !(k as string).toLowerCase().includes((v as string).toLowerCase())
|
|
47
96
|
case "notEndsWith":
|
|
48
|
-
return !(k as string).toLowerCase().endsWith(
|
|
97
|
+
return !(k as string).toLowerCase().endsWith((v as string).toLowerCase())
|
|
49
98
|
case "notStartsWith":
|
|
50
|
-
return !(k as string).toLowerCase().startsWith(
|
|
99
|
+
return !(k as string).toLowerCase().startsWith((v as string).toLowerCase())
|
|
51
100
|
case "neq":
|
|
52
|
-
return !compare(k,
|
|
101
|
+
return !compare(k, v)
|
|
53
102
|
case "eq":
|
|
54
103
|
case undefined:
|
|
55
|
-
return compare(k,
|
|
104
|
+
return compare(k, v)
|
|
56
105
|
default: {
|
|
57
|
-
return
|
|
106
|
+
return absurd(p.op)
|
|
58
107
|
}
|
|
59
108
|
}
|
|
60
109
|
}
|
|
@@ -186,6 +235,7 @@ export const codeFilter3_ = <E>(state: readonly FilterResult[], sut: E): boolean
|
|
|
186
235
|
const statements: any[] = [] // must be defined here to be used by eval.
|
|
187
236
|
// always put everything inside a root scope.
|
|
188
237
|
const s = codeFilter3__([{ t: "where-scope", result: state, relation: "some" }], sut, statements, null, false)
|
|
238
|
+
// oxlint-disable-next-line no-eval
|
|
189
239
|
return eval(s)
|
|
190
240
|
}
|
|
191
241
|
|
package/src/Store/index.ts
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
import type {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
2
|
+
import * as Effect from "effect-app/Effect"
|
|
3
|
+
import * as Layer from "effect-app/Layer"
|
|
4
|
+
import { RepositoryRegistryLive } from "effect-app/Model"
|
|
5
|
+
import type { StorageConfig } from "effect-app/Store"
|
|
6
|
+
import * as Redacted from "effect/Redacted"
|
|
7
|
+
import type { SqlClient } from "effect/sql"
|
|
8
|
+
import { CosmosStoreLayer } from "./Cosmos.ts"
|
|
9
|
+
import { DiskStoreLayer } from "./Disk.ts"
|
|
10
|
+
import { MemoryStoreLive } from "./Memory.ts"
|
|
11
|
+
// import { RedisStoreLayer } from "./Redis.ts"
|
|
12
|
+
import { SQLiteStoreLayer } from "./SQL.ts"
|
|
13
|
+
import { PgStoreLayer } from "./SQL/Pg.ts"
|
|
10
14
|
|
|
11
|
-
export function StoreMakerLayer(
|
|
15
|
+
export function StoreMakerLayer(
|
|
16
|
+
cfg: StorageConfig,
|
|
17
|
+
options?: { makeSqlClientLayer?: (namespace: string) => Layer.Layer<SqlClient.SqlClient> }
|
|
18
|
+
) {
|
|
12
19
|
return Effect
|
|
13
20
|
.sync(() => {
|
|
14
21
|
const storageUrl = Redacted.value(cfg.url)
|
|
@@ -23,7 +30,7 @@ export function StoreMakerLayer(cfg: StorageConfig) {
|
|
|
23
30
|
}
|
|
24
31
|
if (storageUrl.startsWith("sqlite://")) {
|
|
25
32
|
console.log("Using SQLite store")
|
|
26
|
-
return SQLiteStoreLayer(cfg)
|
|
33
|
+
return SQLiteStoreLayer(cfg, options)
|
|
27
34
|
}
|
|
28
35
|
if (storageUrl.startsWith("pg://")) {
|
|
29
36
|
console.log("Using PostgreSQL store")
|
|
@@ -37,7 +44,5 @@ export function StoreMakerLayer(cfg: StorageConfig) {
|
|
|
37
44
|
console.log("Using Cosmos DB store")
|
|
38
45
|
return CosmosStoreLayer(cfg)
|
|
39
46
|
})
|
|
40
|
-
.pipe(Layer.unwrap)
|
|
47
|
+
.pipe(Layer.unwrap, Layer.merge(RepositoryRegistryLive))
|
|
41
48
|
}
|
|
42
|
-
|
|
43
|
-
export * from "./service.js"
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { FieldValues } from "effect-app/Model/filter/types"
|
|
2
|
+
import * as Option from "effect-app/Option"
|
|
3
|
+
import * as S from "effect-app/Schema"
|
|
4
|
+
import type { PersistenceModelType, StoreConfig } from "effect-app/Store"
|
|
5
|
+
import * as Result from "effect/Result"
|
|
6
|
+
import { toJsonQueryValue } from "./utils.ts"
|
|
7
|
+
|
|
8
|
+
export interface JsonDocumentCodec<E extends FieldValues> {
|
|
9
|
+
readonly encode: (doc: PersistenceModelType<E>) => PersistenceModelType<E>
|
|
10
|
+
readonly decode: (doc: PersistenceModelType<E>) => PersistenceModelType<E>
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The store *read* boundary decode: a stored JSON document in, either the
|
|
15
|
+
* Encoded document or the `S.SchemaError` saying why it is not one.
|
|
16
|
+
*
|
|
17
|
+
* Synchronous on purpose: it runs once per document over whole result sets, so
|
|
18
|
+
* it must not allocate an Effect per row. Adapters lift the `Result` into their
|
|
19
|
+
* Effect channel once per operation (see {@link decodeStoredMany}).
|
|
20
|
+
*/
|
|
21
|
+
export type StoredDecode<E extends FieldValues> = (
|
|
22
|
+
doc: PersistenceModelType<E>
|
|
23
|
+
) => Result.Result<PersistenceModelType<E>, S.SchemaError>
|
|
24
|
+
|
|
25
|
+
const splitEtag = <E extends FieldValues>(doc: PersistenceModelType<E>) => {
|
|
26
|
+
const { _etag, ...rest } = doc
|
|
27
|
+
return { rest: rest as E, _etag }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const joinEtag = <E extends FieldValues>(
|
|
31
|
+
rest: E,
|
|
32
|
+
_etag: string | undefined
|
|
33
|
+
): PersistenceModelType<E> => (_etag === undefined ? rest : { ...rest, _etag })
|
|
34
|
+
|
|
35
|
+
/** JSON document ↔ Encoded document codec for a store's domain schema. */
|
|
36
|
+
const jsonCodec = <E extends FieldValues>(schema: S.Top) => S.toCodecJson(S.toEncoded(schema)) as S.Codec<E, S.Json>
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Encoded document ↔ JSON document. Prefer `Schema.toCodecJson(toEncoded(schema))`
|
|
40
|
+
* when the store has a schema; otherwise lower Date/Map/Set structurally.
|
|
41
|
+
*
|
|
42
|
+
* Both directions are **strict**: they run the whole-document codec, so a
|
|
43
|
+
* document that does not match the Encoded shape fails loudly rather than being
|
|
44
|
+
* read back half-decoded.
|
|
45
|
+
*
|
|
46
|
+
* This is the **write** path codec: `encode` on the way to the database, and
|
|
47
|
+
* `decode` to hand the just-written document back. The read path uses
|
|
48
|
+
* {@link makeStoredDecode}, which applies `jitM` first and reports a document it
|
|
49
|
+
* does not repair as a typed `S.SchemaError` instead of throwing.
|
|
50
|
+
*
|
|
51
|
+
* `_etag` is infrastructure metadata rather than part of the domain document,
|
|
52
|
+
* so it is split off before the codec runs and re-attached afterwards.
|
|
53
|
+
*/
|
|
54
|
+
export const makeJsonDocumentCodec = <E extends FieldValues>(schema?: S.Top): JsonDocumentCodec<E> => {
|
|
55
|
+
if (schema) {
|
|
56
|
+
const codec = jsonCodec<E>(schema)
|
|
57
|
+
return {
|
|
58
|
+
encode: (doc) => {
|
|
59
|
+
const { rest, _etag } = splitEtag(doc)
|
|
60
|
+
return joinEtag(S.encodeSync(codec)(rest) as E, _etag)
|
|
61
|
+
},
|
|
62
|
+
decode: (doc) => {
|
|
63
|
+
const { rest, _etag } = splitEtag(doc)
|
|
64
|
+
return joinEtag(S.decodeSync(codec)(rest as S.Json), _etag)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
encode: (doc) => toJsonQueryValue(doc) as PersistenceModelType<E>,
|
|
70
|
+
decode: (doc) => doc
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The store *read* boundary: apply `jitM` to the raw JSON document - after the
|
|
76
|
+
* adapter merged `defaultValues` into it - and only then decode JSON→Encoded
|
|
77
|
+
* with the strict `Schema.toCodecJson(Schema.toEncoded(schema))` codec.
|
|
78
|
+
*
|
|
79
|
+
* This is the one place a legacy-shaped document can be repaired, and why
|
|
80
|
+
* `jitM` can fix things no schema decode could - an explicit `null` where a
|
|
81
|
+
* `Date` is expected, a key added after the document was written. It runs
|
|
82
|
+
* before any schema decode sees the document.
|
|
83
|
+
*
|
|
84
|
+
* Nothing here is lenient: a document `jitM` does not repair still fails. It
|
|
85
|
+
* fails as a typed `S.SchemaError` in a `Result` (via `S.decodeUnknownResult`)
|
|
86
|
+
* rather than by throwing, so adapters can turn it into `Effect.fail` and
|
|
87
|
+
* callers - `Repository.validateSample` in particular - can inspect it per
|
|
88
|
+
* document instead of losing the whole run to a defect.
|
|
89
|
+
*
|
|
90
|
+
* `_etag` is infrastructure metadata rather than part of the domain document,
|
|
91
|
+
* so it is split off first and `jitM` never sees it.
|
|
92
|
+
*/
|
|
93
|
+
export const makeStoredDecode = <E extends FieldValues>(
|
|
94
|
+
schema: StoreConfig<E>["schema"],
|
|
95
|
+
jitM: StoreConfig<E>["jitM"]
|
|
96
|
+
): StoredDecode<E> => {
|
|
97
|
+
if (schema === undefined) {
|
|
98
|
+
// schemaless store: the stored document is already the Encoded document,
|
|
99
|
+
// so there is nothing to decode - only `jitM` to apply.
|
|
100
|
+
if (jitM === undefined) return Result.succeed
|
|
101
|
+
return (doc) => {
|
|
102
|
+
const { rest, _etag } = splitEtag(doc)
|
|
103
|
+
return Result.succeed(joinEtag(jitM(rest) as unknown as E, _etag))
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const decode = S.decodeUnknownResult(jsonCodec<E>(schema))
|
|
107
|
+
return (doc) => {
|
|
108
|
+
const { rest, _etag } = splitEtag(doc)
|
|
109
|
+
// adapters type the stored document as the Encoded persistence model, but
|
|
110
|
+
// at this point it is still the raw JSON document that `jitM` is written
|
|
111
|
+
// against - and `jitM` returns JSON, which is what the codec consumes.
|
|
112
|
+
const json = jitM === undefined ? rest : jitM(rest) as unknown as E
|
|
113
|
+
return Result.map(decode(json), (decoded) => joinEtag(decoded, _etag))
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Decode a whole result set, failing fast on the first bad document.
|
|
119
|
+
*
|
|
120
|
+
* One synchronous loop and one `Result` for the batch: no Effect per document,
|
|
121
|
+
* and no allocation beyond the decoded array (plus a `Result` wrapper) on the
|
|
122
|
+
* happy path. Adapters lift the returned `Result` with `Effect.fromResult`
|
|
123
|
+
* once, at the end.
|
|
124
|
+
*/
|
|
125
|
+
export const decodeStoredMany = <A, B>(
|
|
126
|
+
docs: readonly A[],
|
|
127
|
+
decode: (doc: A) => Result.Result<B, S.SchemaError>
|
|
128
|
+
): Result.Result<B[], S.SchemaError> => {
|
|
129
|
+
const decoded: B[] = []
|
|
130
|
+
for (const doc of docs) {
|
|
131
|
+
const result = decode(doc)
|
|
132
|
+
if (Result.isFailure(result)) return Result.fail(result.failure)
|
|
133
|
+
decoded.push(result.success)
|
|
134
|
+
}
|
|
135
|
+
return Result.succeed(decoded)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Decode an optional stored document; `None` short-circuits without decoding. */
|
|
139
|
+
export const decodeStoredOption = <A, B>(
|
|
140
|
+
doc: Option.Option<A>,
|
|
141
|
+
decode: (doc: A) => Result.Result<B, S.SchemaError>
|
|
142
|
+
): Result.Result<Option.Option<B>, S.SchemaError> =>
|
|
143
|
+
Option.isNone(doc) ? Result.succeed(Option.none()) : Result.map(decode(doc.value), Option.some)
|