@effect-app/infra 2.7.1 → 2.8.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 +13 -0
- package/_cjs/{services/CUPS.cjs → CUPS.cjs} +1 -1
- package/_cjs/CUPS.cjs.map +1 -0
- package/_cjs/{services/Emailer → Emailer}/Sendgrid.cjs +1 -1
- package/_cjs/Emailer/Sendgrid.cjs.map +1 -0
- package/_cjs/{services/Emailer → Emailer}/fake.cjs +1 -1
- package/_cjs/Emailer/fake.cjs.map +1 -0
- package/_cjs/Emailer/service.cjs.map +1 -0
- package/_cjs/Emailer.cjs.map +1 -0
- package/_cjs/{services/MainFiberSet.cjs → MainFiberSet.cjs} +1 -1
- package/_cjs/MainFiberSet.cjs.map +1 -0
- package/_cjs/{services → Model}/Repository/ext.cjs +1 -1
- package/_cjs/Model/Repository/ext.cjs.map +1 -0
- package/_cjs/{services → Model}/Repository/legacy.cjs +2 -3
- package/_cjs/Model/Repository/legacy.cjs.map +1 -0
- package/_cjs/{services/RepositoryBase.cjs → Model/Repository/makeRepo.cjs} +10 -12
- package/_cjs/Model/Repository/makeRepo.cjs.map +1 -0
- package/_cjs/Model/Repository/service.cjs.map +1 -0
- package/_cjs/{services → Model}/Repository.cjs +12 -10
- package/_cjs/Model/Repository.cjs.map +1 -0
- package/_cjs/Model/dsl.cjs.map +1 -0
- package/_cjs/Model/filter/filterApi.cjs +6 -0
- package/_cjs/Model/filter/filterApi.cjs.map +1 -0
- package/_cjs/Model/filter/types/errors.cjs.map +1 -0
- package/_cjs/Model/filter/types/fields.cjs.map +1 -0
- package/_cjs/Model/filter/types/path/common.cjs.map +1 -0
- package/_cjs/Model/filter/types/path/eager.cjs.map +1 -0
- package/_cjs/Model/filter/types/path/index.cjs.map +1 -0
- package/_cjs/Model/filter/types/utils.cjs.map +1 -0
- package/_cjs/Model/filter/types/validator.cjs.map +1 -0
- package/_cjs/Model/filter/types.cjs.map +1 -0
- package/_cjs/Model/query/dsl.cjs.map +1 -0
- package/_cjs/Model/query/new-kid-interpreter.cjs.map +1 -0
- package/_cjs/Model/query.cjs.map +1 -0
- package/_cjs/Model.cjs +23 -2
- package/_cjs/Model.cjs.map +1 -1
- package/_cjs/{services/Operations.cjs → Operations.cjs} +3 -3
- package/_cjs/Operations.cjs.map +1 -0
- package/_cjs/{services/OperationsRepo.cjs → OperationsRepo.cjs} +2 -2
- package/_cjs/OperationsRepo.cjs.map +1 -0
- package/_cjs/{services/QueueMaker → QueueMaker}/SQLQueue.cjs +3 -3
- package/_cjs/QueueMaker/SQLQueue.cjs.map +1 -0
- package/_cjs/QueueMaker/errors.cjs.map +1 -0
- package/_cjs/{services/QueueMaker → QueueMaker}/memQueue.cjs +2 -2
- package/_cjs/QueueMaker/memQueue.cjs.map +1 -0
- package/_cjs/{services/QueueMaker → QueueMaker}/sbqueue.cjs +2 -2
- package/_cjs/QueueMaker/sbqueue.cjs.map +1 -0
- package/_cjs/{services/QueueMaker → QueueMaker}/service.cjs +1 -1
- package/_cjs/QueueMaker/service.cjs.map +1 -0
- package/_cjs/{services/RequestFiberSet.cjs → RequestFiberSet.cjs} +2 -2
- package/_cjs/RequestFiberSet.cjs.map +1 -0
- package/_cjs/Store/ContextMapContainer.cjs.map +1 -0
- package/_cjs/{services/Store → Store}/Cosmos/query.cjs +1 -1
- package/_cjs/Store/Cosmos/query.cjs.map +1 -0
- package/_cjs/{services/Store → Store}/Cosmos.cjs +2 -2
- package/_cjs/Store/Cosmos.cjs.map +1 -0
- package/_cjs/{services/Store → Store}/Disk.cjs +1 -1
- package/_cjs/Store/Disk.cjs.map +1 -0
- package/_cjs/{services/Store → Store}/Memory.cjs +1 -1
- package/_cjs/Store/Memory.cjs.map +1 -0
- package/_cjs/Store/codeFilter.cjs.map +1 -0
- package/_cjs/Store/index.cjs.map +1 -0
- package/_cjs/Store/service.cjs.map +1 -0
- package/_cjs/{services/Store → Store}/utils.cjs +1 -1
- package/_cjs/Store/utils.cjs.map +1 -0
- package/_cjs/Store.cjs.map +1 -0
- package/_cjs/adapters/SQL/Model.cjs.map +1 -0
- package/_cjs/adapters/SQL.cjs.map +1 -0
- package/_cjs/adapters/ServiceBus.cjs.map +1 -0
- package/_cjs/adapters/cosmos-client.cjs.map +1 -0
- package/_cjs/adapters/index.cjs.map +1 -0
- package/_cjs/adapters/logger.cjs.map +1 -0
- package/_cjs/adapters/memQueue.cjs.map +1 -0
- package/_cjs/adapters/mongo-client.cjs.map +1 -0
- package/_cjs/adapters/redis-client.cjs.map +1 -0
- package/_cjs/api/setupRequest.cjs +2 -2
- package/_cjs/arbs.cjs.map +1 -0
- package/_cjs/logger/shared.cjs +1 -1
- package/_cjs/logger/shared.cjs.map +1 -1
- package/_cjs/test.cjs +1 -1
- package/dist/CUPS.d.ts.map +1 -0
- package/dist/CUPS.js +116 -0
- package/dist/Emailer/Sendgrid.d.ts.map +1 -0
- package/dist/Emailer/Sendgrid.js +99 -0
- package/dist/Emailer/fake.d.ts.map +1 -0
- package/dist/Emailer/fake.js +18 -0
- package/dist/{services/Emailer → Emailer}/service.d.ts +1 -1
- package/dist/Emailer/service.d.ts.map +1 -0
- package/dist/{services/Emailer → Emailer}/service.js +1 -1
- package/dist/Emailer.d.ts.map +1 -0
- package/dist/{services/Emailer.js → Emailer.js} +1 -1
- package/dist/MainFiberSet.d.ts.map +1 -0
- package/dist/MainFiberSet.js +54 -0
- package/dist/{services → Model}/Repository/ext.d.ts +12 -12
- package/dist/Model/Repository/ext.d.ts.map +1 -0
- package/dist/Model/Repository/ext.js +61 -0
- package/dist/{services → Model}/Repository/legacy.d.ts +54 -54
- package/dist/Model/Repository/legacy.d.ts.map +1 -0
- package/dist/Model/Repository/legacy.js +123 -0
- package/dist/{services/RepositoryBase.d.ts → Model/Repository/makeRepo.d.ts} +22 -22
- package/dist/Model/Repository/makeRepo.d.ts.map +1 -0
- package/dist/Model/Repository/makeRepo.js +254 -0
- package/dist/{services → Model}/Repository/service.d.ts +8 -8
- package/dist/Model/Repository/service.d.ts.map +1 -0
- package/dist/{services → Model}/Repository/service.js +1 -1
- package/dist/{services → Model}/Repository.d.ts +1 -1
- package/dist/Model/Repository.d.ts.map +1 -0
- package/dist/Model/Repository.js +5 -0
- package/dist/Model/dsl.d.ts.map +1 -0
- package/dist/Model/dsl.js +46 -0
- package/dist/{services/Store/filterApi/query.d.ts → Model/filter/filterApi.d.ts} +1 -1
- package/dist/Model/filter/filterApi.d.ts.map +1 -0
- package/dist/Model/filter/filterApi.js +2 -0
- package/dist/Model/filter/types/errors.d.ts.map +1 -0
- package/dist/{filter → Model/filter}/types/errors.js +1 -1
- package/dist/Model/filter/types/fields.d.ts.map +1 -0
- package/dist/{filter → Model/filter}/types/fields.js +1 -1
- package/dist/Model/filter/types/path/common.d.ts.map +1 -0
- package/dist/{filter → Model/filter}/types/path/common.js +1 -1
- package/dist/Model/filter/types/path/eager.d.ts.map +1 -0
- package/dist/{filter → Model/filter}/types/path/eager.js +1 -1
- package/dist/Model/filter/types/path/index.d.ts.map +1 -0
- package/dist/{filter → Model/filter}/types/path/index.js +1 -1
- package/dist/Model/filter/types/utils.d.ts.map +1 -0
- package/dist/{filter → Model/filter}/types/utils.js +1 -1
- package/dist/Model/filter/types/validator.d.ts.map +1 -0
- package/dist/{filter → Model/filter}/types/validator.js +1 -1
- package/dist/Model/filter/types.d.ts.map +1 -0
- package/dist/{filter → Model/filter}/types.js +1 -1
- package/dist/{services → Model}/query/dsl.d.ts +6 -6
- package/dist/Model/query/dsl.d.ts.map +1 -0
- package/dist/Model/query/dsl.js +95 -0
- package/dist/{services → Model}/query/new-kid-interpreter.d.ts +4 -4
- package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -0
- package/dist/Model/query/new-kid-interpreter.js +133 -0
- package/dist/Model/query.d.ts.map +1 -0
- package/dist/{services → Model}/query.js +1 -1
- package/dist/Model.d.ts +3 -1
- package/dist/Model.d.ts.map +1 -1
- package/dist/Model.js +4 -2
- package/dist/{services/Operations.d.ts → Operations.d.ts} +3 -3
- package/dist/Operations.d.ts.map +1 -0
- package/dist/Operations.js +102 -0
- package/dist/{services/OperationsRepo.d.ts → OperationsRepo.d.ts} +1 -1
- package/dist/OperationsRepo.d.ts.map +1 -0
- package/dist/OperationsRepo.js +14 -0
- package/dist/QueueMaker/SQLQueue.d.ts.map +1 -0
- package/dist/QueueMaker/SQLQueue.js +136 -0
- package/dist/QueueMaker/errors.d.ts.map +1 -0
- package/dist/QueueMaker/errors.js +20 -0
- package/dist/QueueMaker/memQueue.d.ts.map +1 -0
- package/dist/QueueMaker/memQueue.js +78 -0
- package/dist/QueueMaker/sbqueue.d.ts.map +1 -0
- package/dist/QueueMaker/sbqueue.js +102 -0
- package/dist/{services/QueueMaker → QueueMaker}/service.d.ts +1 -1
- package/dist/QueueMaker/service.d.ts.map +1 -0
- package/dist/QueueMaker/service.js +4 -0
- package/dist/RequestFiberSet.d.ts.map +1 -0
- package/dist/RequestFiberSet.js +79 -0
- package/dist/Store/ContextMapContainer.d.ts.map +1 -0
- package/dist/{services/Store → Store}/ContextMapContainer.js +1 -1
- package/dist/{services/Store → Store}/Cosmos/query.d.ts +1 -1
- package/dist/Store/Cosmos/query.d.ts.map +1 -0
- package/dist/Store/Cosmos/query.js +164 -0
- package/dist/Store/Cosmos.d.ts.map +1 -0
- package/dist/Store/Cosmos.js +258 -0
- package/dist/Store/Disk.d.ts.map +1 -0
- package/dist/Store/Disk.js +109 -0
- package/dist/Store/Memory.d.ts.map +1 -0
- package/dist/Store/Memory.js +170 -0
- package/dist/{services/Store → Store}/codeFilter.d.ts +1 -1
- package/dist/Store/codeFilter.d.ts.map +1 -0
- package/dist/Store/codeFilter.js +117 -0
- package/dist/Store/index.d.ts.map +1 -0
- package/dist/Store/index.js +28 -0
- package/dist/{services/Store → Store}/service.d.ts +5 -5
- package/dist/Store/service.d.ts.map +1 -0
- package/dist/{services/Store → Store}/service.js +1 -1
- package/dist/{services/Store → Store}/utils.d.ts +1 -1
- package/dist/Store/utils.d.ts.map +1 -0
- package/dist/Store/utils.js +44 -0
- package/dist/Store.d.ts.map +1 -0
- package/dist/{services/Store.js → Store.js} +1 -1
- package/dist/{services/adapters → adapters}/SQL/Model.d.ts +23 -23
- package/dist/adapters/SQL/Model.d.ts.map +1 -0
- package/dist/adapters/SQL/Model.js +508 -0
- package/dist/adapters/SQL.d.ts.map +1 -0
- package/dist/{services/adapters → adapters}/SQL.js +1 -1
- package/dist/adapters/ServiceBus.d.ts.map +1 -0
- package/dist/adapters/ServiceBus.js +73 -0
- package/dist/adapters/cosmos-client.d.ts.map +1 -0
- package/dist/adapters/cosmos-client.js +8 -0
- package/dist/{services/adapters → adapters}/index.d.ts.map +1 -1
- package/dist/{services/adapters → adapters}/index.js +1 -1
- package/dist/adapters/logger.d.ts.map +1 -0
- package/dist/{services/adapters → adapters}/logger.js +1 -1
- package/dist/adapters/memQueue.d.ts.map +1 -0
- package/dist/adapters/memQueue.js +24 -0
- package/dist/adapters/mongo-client.d.ts.map +1 -0
- package/dist/adapters/mongo-client.js +12 -0
- package/dist/adapters/redis-client.d.ts.map +1 -0
- package/dist/adapters/redis-client.js +93 -0
- package/dist/api/setupRequest.js +3 -3
- package/dist/arbs.d.ts.map +1 -0
- package/dist/arbs.js +21 -0
- package/dist/logger/shared.js +2 -2
- package/dist/test.d.ts +1 -1
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +3 -3
- package/examples/query.ts +3 -3
- package/package.json +352 -362
- package/src/{services/CUPS.ts → CUPS.ts} +1 -1
- package/src/{services/Emailer → Emailer}/Sendgrid.ts +1 -1
- package/src/{services/Emailer → Emailer}/fake.ts +1 -1
- package/src/{services/MainFiberSet.ts → MainFiberSet.ts} +1 -1
- package/src/{services → Model}/Repository/ext.ts +23 -11
- package/src/{services → Model}/Repository/legacy.ts +76 -49
- package/src/{services/RepositoryBase.ts → Model/Repository/makeRepo.ts} +40 -38
- package/src/{services → Model}/Repository/service.ts +9 -8
- package/src/{services → Model}/Repository.ts +1 -1
- package/src/{services → Model}/query/dsl.ts +24 -6
- package/src/{services → Model}/query/new-kid-interpreter.ts +3 -3
- package/src/Model.ts +3 -1
- package/src/{services/Operations.ts → Operations.ts} +3 -3
- package/src/{services/OperationsRepo.ts → OperationsRepo.ts} +1 -1
- package/src/{services/QueueMaker → QueueMaker}/SQLQueue.ts +4 -4
- package/src/{services/QueueMaker → QueueMaker}/memQueue.ts +2 -2
- package/src/{services/QueueMaker → QueueMaker}/sbqueue.ts +2 -2
- package/src/{services/QueueMaker → QueueMaker}/service.ts +1 -1
- package/src/{services/RequestFiberSet.ts → RequestFiberSet.ts} +2 -2
- package/src/{services/Store → Store}/Cosmos/query.ts +2 -2
- package/src/{services/Store → Store}/Cosmos.ts +2 -2
- package/src/{services/Store → Store}/Disk.ts +1 -1
- package/src/{services/Store → Store}/Memory.ts +1 -1
- package/src/{services/Store → Store}/codeFilter.ts +1 -1
- package/src/{services/Store → Store}/service.ts +4 -4
- package/src/{services/Store → Store}/utils.ts +1 -1
- package/src/api/setupRequest.ts +2 -2
- package/src/logger/shared.ts +1 -1
- package/src/test.ts +2 -2
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/query.test.ts +32 -5
- package/_cjs/_ext/Array.cjs +0 -22
- package/_cjs/_ext/Array.cjs.map +0 -1
- package/_cjs/filter/types/errors.cjs.map +0 -1
- package/_cjs/filter/types/fields.cjs.map +0 -1
- package/_cjs/filter/types/path/common.cjs.map +0 -1
- package/_cjs/filter/types/path/eager.cjs.map +0 -1
- package/_cjs/filter/types/path/index.cjs.map +0 -1
- package/_cjs/filter/types/utils.cjs.map +0 -1
- package/_cjs/filter/types/validator.cjs.map +0 -1
- package/_cjs/filter/types.cjs.map +0 -1
- package/_cjs/services/CUPS.cjs.map +0 -1
- package/_cjs/services/Emailer/Sendgrid.cjs.map +0 -1
- package/_cjs/services/Emailer/fake.cjs.map +0 -1
- package/_cjs/services/Emailer/service.cjs.map +0 -1
- package/_cjs/services/Emailer.cjs.map +0 -1
- package/_cjs/services/MainFiberSet.cjs.map +0 -1
- package/_cjs/services/Operations.cjs.map +0 -1
- package/_cjs/services/OperationsRepo.cjs.map +0 -1
- package/_cjs/services/QueueMaker/SQLQueue.cjs.map +0 -1
- package/_cjs/services/QueueMaker/errors.cjs.map +0 -1
- package/_cjs/services/QueueMaker/memQueue.cjs.map +0 -1
- package/_cjs/services/QueueMaker/sbqueue.cjs.map +0 -1
- package/_cjs/services/QueueMaker/service.cjs.map +0 -1
- package/_cjs/services/Repository/dsl.cjs.map +0 -1
- package/_cjs/services/Repository/ext.cjs.map +0 -1
- package/_cjs/services/Repository/legacy.cjs.map +0 -1
- package/_cjs/services/Repository/service.cjs.map +0 -1
- package/_cjs/services/Repository.cjs.map +0 -1
- package/_cjs/services/RepositoryBase.cjs.map +0 -1
- package/_cjs/services/RequestFiberSet.cjs.map +0 -1
- package/_cjs/services/Store/ContextMapContainer.cjs.map +0 -1
- package/_cjs/services/Store/Cosmos/query.cjs.map +0 -1
- package/_cjs/services/Store/Cosmos.cjs.map +0 -1
- package/_cjs/services/Store/Disk.cjs.map +0 -1
- package/_cjs/services/Store/Memory.cjs.map +0 -1
- package/_cjs/services/Store/codeFilter.cjs.map +0 -1
- package/_cjs/services/Store/filterApi/query.cjs +0 -6
- package/_cjs/services/Store/filterApi/query.cjs.map +0 -1
- package/_cjs/services/Store/index.cjs.map +0 -1
- package/_cjs/services/Store/service.cjs.map +0 -1
- package/_cjs/services/Store/utils.cjs.map +0 -1
- package/_cjs/services/Store.cjs.map +0 -1
- package/_cjs/services/adapters/SQL/Model.cjs.map +0 -1
- package/_cjs/services/adapters/SQL.cjs.map +0 -1
- package/_cjs/services/adapters/ServiceBus.cjs.map +0 -1
- package/_cjs/services/adapters/cosmos-client.cjs.map +0 -1
- package/_cjs/services/adapters/index.cjs.map +0 -1
- package/_cjs/services/adapters/logger.cjs.map +0 -1
- package/_cjs/services/adapters/memQueue.cjs.map +0 -1
- package/_cjs/services/adapters/mongo-client.cjs.map +0 -1
- package/_cjs/services/adapters/redis-client.cjs.map +0 -1
- package/_cjs/services/query/dsl.cjs.map +0 -1
- package/_cjs/services/query/new-kid-interpreter.cjs.map +0 -1
- package/_cjs/services/query.cjs.map +0 -1
- package/_cjs/test/arbs.cjs.map +0 -1
- package/dist/_ext/Array.d.ts +0 -13
- package/dist/_ext/Array.d.ts.map +0 -1
- package/dist/_ext/Array.js +0 -15
- package/dist/filter/types/errors.d.ts.map +0 -1
- package/dist/filter/types/fields.d.ts.map +0 -1
- package/dist/filter/types/path/common.d.ts.map +0 -1
- package/dist/filter/types/path/eager.d.ts.map +0 -1
- package/dist/filter/types/path/index.d.ts.map +0 -1
- package/dist/filter/types/utils.d.ts.map +0 -1
- package/dist/filter/types/validator.d.ts.map +0 -1
- package/dist/filter/types.d.ts.map +0 -1
- package/dist/services/CUPS.d.ts.map +0 -1
- package/dist/services/CUPS.js +0 -116
- package/dist/services/Emailer/Sendgrid.d.ts.map +0 -1
- package/dist/services/Emailer/Sendgrid.js +0 -99
- package/dist/services/Emailer/fake.d.ts.map +0 -1
- package/dist/services/Emailer/fake.js +0 -18
- package/dist/services/Emailer/service.d.ts.map +0 -1
- package/dist/services/Emailer.d.ts.map +0 -1
- package/dist/services/MainFiberSet.d.ts.map +0 -1
- package/dist/services/MainFiberSet.js +0 -54
- package/dist/services/Operations.d.ts.map +0 -1
- package/dist/services/Operations.js +0 -102
- package/dist/services/OperationsRepo.d.ts.map +0 -1
- package/dist/services/OperationsRepo.js +0 -14
- package/dist/services/QueueMaker/SQLQueue.d.ts.map +0 -1
- package/dist/services/QueueMaker/SQLQueue.js +0 -136
- package/dist/services/QueueMaker/errors.d.ts.map +0 -1
- package/dist/services/QueueMaker/errors.js +0 -20
- package/dist/services/QueueMaker/memQueue.d.ts.map +0 -1
- package/dist/services/QueueMaker/memQueue.js +0 -78
- package/dist/services/QueueMaker/sbqueue.d.ts.map +0 -1
- package/dist/services/QueueMaker/sbqueue.js +0 -102
- package/dist/services/QueueMaker/service.d.ts.map +0 -1
- package/dist/services/QueueMaker/service.js +0 -4
- package/dist/services/Repository/dsl.d.ts.map +0 -1
- package/dist/services/Repository/dsl.js +0 -46
- package/dist/services/Repository/ext.d.ts.map +0 -1
- package/dist/services/Repository/ext.js +0 -61
- package/dist/services/Repository/legacy.d.ts.map +0 -1
- package/dist/services/Repository/legacy.js +0 -124
- package/dist/services/Repository/service.d.ts.map +0 -1
- package/dist/services/Repository.d.ts.map +0 -1
- package/dist/services/Repository.js +0 -5
- package/dist/services/RepositoryBase.d.ts.map +0 -1
- package/dist/services/RepositoryBase.js +0 -256
- package/dist/services/RequestFiberSet.d.ts.map +0 -1
- package/dist/services/RequestFiberSet.js +0 -79
- package/dist/services/Store/ContextMapContainer.d.ts.map +0 -1
- package/dist/services/Store/Cosmos/query.d.ts.map +0 -1
- package/dist/services/Store/Cosmos/query.js +0 -164
- package/dist/services/Store/Cosmos.d.ts.map +0 -1
- package/dist/services/Store/Cosmos.js +0 -258
- package/dist/services/Store/Disk.d.ts.map +0 -1
- package/dist/services/Store/Disk.js +0 -109
- package/dist/services/Store/Memory.d.ts.map +0 -1
- package/dist/services/Store/Memory.js +0 -170
- package/dist/services/Store/codeFilter.d.ts.map +0 -1
- package/dist/services/Store/codeFilter.js +0 -117
- package/dist/services/Store/filterApi/query.d.ts.map +0 -1
- package/dist/services/Store/filterApi/query.js +0 -2
- package/dist/services/Store/index.d.ts.map +0 -1
- package/dist/services/Store/index.js +0 -28
- package/dist/services/Store/service.d.ts.map +0 -1
- package/dist/services/Store/utils.d.ts.map +0 -1
- package/dist/services/Store/utils.js +0 -44
- package/dist/services/Store.d.ts.map +0 -1
- package/dist/services/adapters/SQL/Model.d.ts.map +0 -1
- package/dist/services/adapters/SQL/Model.js +0 -508
- package/dist/services/adapters/SQL.d.ts.map +0 -1
- package/dist/services/adapters/ServiceBus.d.ts.map +0 -1
- package/dist/services/adapters/ServiceBus.js +0 -73
- package/dist/services/adapters/cosmos-client.d.ts.map +0 -1
- package/dist/services/adapters/cosmos-client.js +0 -8
- package/dist/services/adapters/logger.d.ts.map +0 -1
- package/dist/services/adapters/memQueue.d.ts.map +0 -1
- package/dist/services/adapters/memQueue.js +0 -24
- package/dist/services/adapters/mongo-client.d.ts.map +0 -1
- package/dist/services/adapters/mongo-client.js +0 -12
- package/dist/services/adapters/redis-client.d.ts.map +0 -1
- package/dist/services/adapters/redis-client.js +0 -93
- package/dist/services/query/dsl.d.ts.map +0 -1
- package/dist/services/query/dsl.js +0 -95
- package/dist/services/query/new-kid-interpreter.d.ts.map +0 -1
- package/dist/services/query/new-kid-interpreter.js +0 -133
- package/dist/services/query.d.ts.map +0 -1
- package/dist/test/arbs.d.ts.map +0 -1
- package/dist/test/arbs.js +0 -21
- package/src/_ext/Array.ts +0 -22
- /package/_cjs/{services/Emailer → Emailer}/service.cjs +0 -0
- /package/_cjs/{services/Emailer.cjs → Emailer.cjs} +0 -0
- /package/_cjs/{services → Model}/Repository/service.cjs +0 -0
- /package/_cjs/{services/Repository → Model}/dsl.cjs +0 -0
- /package/_cjs/{filter → Model/filter}/types/errors.cjs +0 -0
- /package/_cjs/{filter → Model/filter}/types/fields.cjs +0 -0
- /package/_cjs/{filter → Model/filter}/types/path/common.cjs +0 -0
- /package/_cjs/{filter → Model/filter}/types/path/eager.cjs +0 -0
- /package/_cjs/{filter → Model/filter}/types/path/index.cjs +0 -0
- /package/_cjs/{filter → Model/filter}/types/utils.cjs +0 -0
- /package/_cjs/{filter → Model/filter}/types/validator.cjs +0 -0
- /package/_cjs/{filter → Model/filter}/types.cjs +0 -0
- /package/_cjs/{services → Model}/query/dsl.cjs +0 -0
- /package/_cjs/{services → Model}/query/new-kid-interpreter.cjs +0 -0
- /package/_cjs/{services → Model}/query.cjs +0 -0
- /package/_cjs/{services/QueueMaker → QueueMaker}/errors.cjs +0 -0
- /package/_cjs/{services/Store → Store}/ContextMapContainer.cjs +0 -0
- /package/_cjs/{services/Store → Store}/codeFilter.cjs +0 -0
- /package/_cjs/{services/Store → Store}/index.cjs +0 -0
- /package/_cjs/{services/Store → Store}/service.cjs +0 -0
- /package/_cjs/{services/Store.cjs → Store.cjs} +0 -0
- /package/_cjs/{services/adapters → adapters}/SQL/Model.cjs +0 -0
- /package/_cjs/{services/adapters → adapters}/SQL.cjs +0 -0
- /package/_cjs/{services/adapters → adapters}/ServiceBus.cjs +0 -0
- /package/_cjs/{services/adapters → adapters}/cosmos-client.cjs +0 -0
- /package/_cjs/{services/adapters → adapters}/index.cjs +0 -0
- /package/_cjs/{services/adapters → adapters}/logger.cjs +0 -0
- /package/_cjs/{services/adapters → adapters}/memQueue.cjs +0 -0
- /package/_cjs/{services/adapters → adapters}/mongo-client.cjs +0 -0
- /package/_cjs/{services/adapters → adapters}/redis-client.cjs +0 -0
- /package/_cjs/{test/arbs.cjs → arbs.cjs} +0 -0
- /package/dist/{services/CUPS.d.ts → CUPS.d.ts} +0 -0
- /package/dist/{services/Emailer → Emailer}/Sendgrid.d.ts +0 -0
- /package/dist/{services/Emailer → Emailer}/fake.d.ts +0 -0
- /package/dist/{services/Emailer.d.ts → Emailer.d.ts} +0 -0
- /package/dist/{services/MainFiberSet.d.ts → MainFiberSet.d.ts} +0 -0
- /package/dist/{services/Repository → Model}/dsl.d.ts +0 -0
- /package/dist/{filter → Model/filter}/types/errors.d.ts +0 -0
- /package/dist/{filter → Model/filter}/types/fields.d.ts +0 -0
- /package/dist/{filter → Model/filter}/types/path/common.d.ts +0 -0
- /package/dist/{filter → Model/filter}/types/path/eager.d.ts +0 -0
- /package/dist/{filter → Model/filter}/types/path/index.d.ts +0 -0
- /package/dist/{filter → Model/filter}/types/utils.d.ts +0 -0
- /package/dist/{filter → Model/filter}/types/validator.d.ts +0 -0
- /package/dist/{filter → Model/filter}/types.d.ts +0 -0
- /package/dist/{services → Model}/query.d.ts +0 -0
- /package/dist/{services/QueueMaker → QueueMaker}/SQLQueue.d.ts +0 -0
- /package/dist/{services/QueueMaker → QueueMaker}/errors.d.ts +0 -0
- /package/dist/{services/QueueMaker → QueueMaker}/memQueue.d.ts +0 -0
- /package/dist/{services/QueueMaker → QueueMaker}/sbqueue.d.ts +0 -0
- /package/dist/{services/RequestFiberSet.d.ts → RequestFiberSet.d.ts} +0 -0
- /package/dist/{services/Store → Store}/ContextMapContainer.d.ts +0 -0
- /package/dist/{services/Store → Store}/Cosmos.d.ts +0 -0
- /package/dist/{services/Store → Store}/Disk.d.ts +0 -0
- /package/dist/{services/Store → Store}/Memory.d.ts +0 -0
- /package/dist/{services/Store → Store}/index.d.ts +0 -0
- /package/dist/{services/Store.d.ts → Store.d.ts} +0 -0
- /package/dist/{services/adapters → adapters}/SQL.d.ts +0 -0
- /package/dist/{services/adapters → adapters}/ServiceBus.d.ts +0 -0
- /package/dist/{services/adapters → adapters}/cosmos-client.d.ts +0 -0
- /package/dist/{services/adapters → adapters}/index.d.ts +0 -0
- /package/dist/{services/adapters → adapters}/logger.d.ts +0 -0
- /package/dist/{services/adapters → adapters}/memQueue.d.ts +0 -0
- /package/dist/{services/adapters → adapters}/mongo-client.d.ts +0 -0
- /package/dist/{services/adapters → adapters}/redis-client.d.ts +0 -0
- /package/dist/{test/arbs.d.ts → arbs.d.ts} +0 -0
- /package/src/{services/Emailer → Emailer}/service.ts +0 -0
- /package/src/{services/Emailer.ts → Emailer.ts} +0 -0
- /package/src/{services/Repository → Model}/dsl.ts +0 -0
- /package/src/{services/Store/filterApi/query.ts → Model/filter/filterApi.ts} +0 -0
- /package/src/{filter → Model/filter}/types/errors.ts +0 -0
- /package/src/{filter → Model/filter}/types/fields.ts +0 -0
- /package/src/{filter → Model/filter}/types/path/common.ts +0 -0
- /package/src/{filter → Model/filter}/types/path/eager.ts +0 -0
- /package/src/{filter → Model/filter}/types/path/index.ts +0 -0
- /package/src/{filter → Model/filter}/types/utils.ts +0 -0
- /package/src/{filter → Model/filter}/types/validator.ts +0 -0
- /package/src/{filter → Model/filter}/types.ts +0 -0
- /package/src/{services → Model}/query.ts +0 -0
- /package/src/{services/QueueMaker → QueueMaker}/errors.ts +0 -0
- /package/src/{services/Store → Store}/ContextMapContainer.ts +0 -0
- /package/src/{services/Store → Store}/index.test.ts.bak +0 -0
- /package/src/{services/Store → Store}/index.ts +0 -0
- /package/src/{services/Store.ts → Store.ts} +0 -0
- /package/src/{services/adapters → adapters}/SQL/Model.ts +0 -0
- /package/src/{services/adapters → adapters}/SQL.ts +0 -0
- /package/src/{services/adapters → adapters}/ServiceBus.ts +0 -0
- /package/src/{services/adapters → adapters}/cosmos-client.ts +0 -0
- /package/src/{services/adapters → adapters}/index.ts +0 -0
- /package/src/{services/adapters → adapters}/logger.ts +0 -0
- /package/src/{services/adapters → adapters}/memQueue.ts +0 -0
- /package/src/{services/adapters → adapters}/mongo-client.ts +0 -0
- /package/src/{services/adapters → adapters}/redis-client.ts +0 -0
- /package/src/{test/arbs.ts → arbs.ts} +0 -0
package/dist/CUPS.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { tempFile } from "@effect-app/infra/fileUtil";
|
|
2
|
+
import cp from "child_process";
|
|
3
|
+
import { Config, Effect, Layer, Predicate } from "effect-app";
|
|
4
|
+
import { NonEmptyString255 } from "effect-app/Schema";
|
|
5
|
+
import { pretty } from "effect-app/utils";
|
|
6
|
+
import fs from "fs";
|
|
7
|
+
import os from "os";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import util from "util";
|
|
10
|
+
import { InfraLogger } from "./logger.js";
|
|
11
|
+
export const PrinterId = NonEmptyString255;
|
|
12
|
+
const exec_ = util.promisify(cp.exec);
|
|
13
|
+
const exec = (command) => Effect.andThen(InfraLogger.logDebug(`Executing: ${command}`), Effect.tap(Effect
|
|
14
|
+
.tryPromise(() => exec_(command)), (r) => (InfraLogger.logDebug(`Executed`).pipe(Effect.annotateLogs("result", pretty(r))))));
|
|
15
|
+
function printFile(printer, options) {
|
|
16
|
+
return (filePath) => printFile_(filePath, printer, options);
|
|
17
|
+
}
|
|
18
|
+
function printFile_(filePath, printer, options) {
|
|
19
|
+
return exec(["lp", ...buildPrintArgs(filePath, printer, options)].join(" "));
|
|
20
|
+
}
|
|
21
|
+
function* buildPrintArgs(filePath, printer, options) {
|
|
22
|
+
if (printer) {
|
|
23
|
+
if (printer.url) {
|
|
24
|
+
yield `-h ${printer.url.host}`;
|
|
25
|
+
if (printer.url.username) {
|
|
26
|
+
yield `-U ${printer.url.username}`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
yield `-d "${printer.id}"`;
|
|
30
|
+
for (const o of options) {
|
|
31
|
+
yield `-o ${o}`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
yield `"${filePath}"`;
|
|
35
|
+
}
|
|
36
|
+
export const prepareTempDir = Effect.sync(() => {
|
|
37
|
+
// TODO
|
|
38
|
+
try {
|
|
39
|
+
fs.mkdirSync(path.join(os.tmpdir(), "effect-ts-app"));
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (`${err}`.includes("EEXIST")) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
const makeTempFile = tempFile("effect-ts-app");
|
|
49
|
+
export const makePrintJobTempFile = makeTempFile("print-job");
|
|
50
|
+
export const makePrintJobTempFileArrayBuffer = (buffer, options) => makePrintJobTempFile(Buffer.from(buffer), options);
|
|
51
|
+
function printBuffer(printer, options) {
|
|
52
|
+
return (buffer) => makePrintJobTempFileArrayBuffer(buffer)
|
|
53
|
+
.pipe(Effect.flatMap(printFile(printer, options)), Effect.scoped);
|
|
54
|
+
}
|
|
55
|
+
function getAvailablePrinters(host) {
|
|
56
|
+
return Effect.gen(function* () {
|
|
57
|
+
const { stdout } = yield* exec(["lpstat", ...buildListArgs({ host }), "-s"].join(" "));
|
|
58
|
+
return [...stdout.matchAll(/device for (\w+):/g)]
|
|
59
|
+
.map((_) => _[1])
|
|
60
|
+
.filter(Predicate.isNotNullable)
|
|
61
|
+
.map((_) => NonEmptyString255(_));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function* buildListArgs(config) {
|
|
65
|
+
if (config?.host) {
|
|
66
|
+
yield `-h ${config.host}`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export const CUPSConfig = Config.all({
|
|
70
|
+
server: Config
|
|
71
|
+
.string("server")
|
|
72
|
+
.pipe(Config.map((s) => new URL(s)), Config.option, Config.nested("cups"))
|
|
73
|
+
});
|
|
74
|
+
export class CUPS extends Effect.Service()("effect-app/CUPS", {
|
|
75
|
+
effect: Effect.gen(function* () {
|
|
76
|
+
const config = yield* CUPSConfig;
|
|
77
|
+
function print(buffer, printerId, ...options) {
|
|
78
|
+
const _print = printBuffer({
|
|
79
|
+
id: printerId,
|
|
80
|
+
url: config.server.value
|
|
81
|
+
}, options);
|
|
82
|
+
return _print(buffer);
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
print,
|
|
86
|
+
printFile: (filePath, printerId, ...options) => printFile({
|
|
87
|
+
id: printerId,
|
|
88
|
+
url: config.server.value
|
|
89
|
+
}, options)(filePath),
|
|
90
|
+
getAvailablePrinters: getAvailablePrinters(config.server.value?.host)
|
|
91
|
+
};
|
|
92
|
+
})
|
|
93
|
+
}) {
|
|
94
|
+
static Fake = Layer.effect(this, Effect.sync(() => {
|
|
95
|
+
return this.make({
|
|
96
|
+
print: (buffer, printerId, ...options) => InfraLogger
|
|
97
|
+
.logInfo("Printing to fake printer")
|
|
98
|
+
.pipe(Effect.zipRight(Effect.sync(() => ({ stdout: "fake", stderr: "" }))), Effect
|
|
99
|
+
.annotateLogs({
|
|
100
|
+
printerId,
|
|
101
|
+
"options": pretty(options),
|
|
102
|
+
"bufferSize": buffer.byteLength.toString()
|
|
103
|
+
})),
|
|
104
|
+
printFile: (filePath, printerId, ...options) => InfraLogger
|
|
105
|
+
.logInfo("Printing to fake printer")
|
|
106
|
+
.pipe(Effect.zipRight(Effect.sync(() => ({ stdout: "fake", stderr: "" }))), Effect
|
|
107
|
+
.annotateLogs({
|
|
108
|
+
printerId,
|
|
109
|
+
filePath,
|
|
110
|
+
"options": pretty(options)
|
|
111
|
+
})),
|
|
112
|
+
getAvailablePrinters: Effect.sync(() => [])
|
|
113
|
+
});
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ1VQUy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DVVBTLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ25CLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQTtBQUNuQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFDdkIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFekMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFBO0FBRzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3JDLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBZSxFQUFFLEVBQUUsQ0FDL0IsTUFBTSxDQUFDLE9BQU8sQ0FDWixXQUFXLENBQUMsUUFBUSxDQUFDLGNBQWMsT0FBTyxFQUFFLENBQUMsRUFDN0MsTUFBTSxDQUFDLEdBQUcsQ0FDUixNQUFNO0tBQ0gsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUNuQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sendgrid.d.ts","sourceRoot":"","sources":["../../src/Emailer/Sendgrid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4CAA4C,CAAA;AAM3E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAwB,cAAc,EAAE,MAAM,cAAc,CAAA;AA8ClF;;GAEG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,uDAE9C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,OAAO,SAWpC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOnB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,WAO1C"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import sgMail from "@sendgrid/mail";
|
|
2
|
+
import { Array, Effect, Equivalence, Secret } from "effect-app";
|
|
3
|
+
import { dropUndefinedT } from "effect-app/utils";
|
|
4
|
+
import { inspect } from "util";
|
|
5
|
+
import { InfraLogger } from "../logger.js";
|
|
6
|
+
import { Emailer } from "./service.js";
|
|
7
|
+
const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPrefix }) => Effect.sync(() => {
|
|
8
|
+
sgMail.setApiKey(Secret.value(apiKey));
|
|
9
|
+
return Emailer.of({
|
|
10
|
+
sendMail(msg_) {
|
|
11
|
+
return Effect.gen(function* () {
|
|
12
|
+
const msg = dropUndefinedT({
|
|
13
|
+
...msg_,
|
|
14
|
+
from: msg_.from ?? defaultFrom,
|
|
15
|
+
replyTo: msg_.replyTo ?? (msg_.from ? undefined : defaultReplyTo)
|
|
16
|
+
});
|
|
17
|
+
const render = renderMessage(!realMail);
|
|
18
|
+
const renderedMsg_ = render(msg);
|
|
19
|
+
const renderedMsg = { ...renderedMsg_, subject: `${subjectPrefix}${renderedMsg_.subject}` };
|
|
20
|
+
yield* InfraLogger.logDebug("Sending email").pipe(Effect.annotateLogs("msg", inspect(renderedMsg, false, 5)));
|
|
21
|
+
const ret = yield* Effect.async((cb) => void sgMail.send(renderedMsg, false, (err, result) => err
|
|
22
|
+
? cb(Effect.fail(err))
|
|
23
|
+
: cb(Effect.sync(() => result))));
|
|
24
|
+
// const event = {
|
|
25
|
+
// name: "EmailSent",
|
|
26
|
+
// properties: {
|
|
27
|
+
// templateId: msg.templateId
|
|
28
|
+
// }
|
|
29
|
+
// }
|
|
30
|
+
// yield* InfraLogger.logDebug("Tracking email event").annotateLogs("event", event.$$.pretty)
|
|
31
|
+
// const { trackEvent } = yield* AiContextService
|
|
32
|
+
// trackEvent(event)
|
|
33
|
+
return ret;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
/**
|
|
39
|
+
* @tsplus static Emailer.Ops SendgridLayer
|
|
40
|
+
*/
|
|
41
|
+
export function Sendgrid(config) {
|
|
42
|
+
return Emailer.toLayer(makeSendgrid(config));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @hidden
|
|
46
|
+
*/
|
|
47
|
+
export function renderMessage(forceFake) {
|
|
48
|
+
let i = 0;
|
|
49
|
+
const makeId = () => i++;
|
|
50
|
+
return forceFake
|
|
51
|
+
? (msg) => dropUndefinedT({
|
|
52
|
+
...msg,
|
|
53
|
+
to: msg.to && renderFake(msg.to, makeId),
|
|
54
|
+
cc: msg.cc && renderFake(msg.cc, makeId),
|
|
55
|
+
bcc: msg.bcc && renderFake(msg.bcc, makeId)
|
|
56
|
+
})
|
|
57
|
+
: (msg) => dropUndefinedT({
|
|
58
|
+
...msg,
|
|
59
|
+
to: msg.to && renderFakeIfTest(msg.to, makeId),
|
|
60
|
+
cc: msg.cc && renderFakeIfTest(msg.cc, makeId),
|
|
61
|
+
bcc: msg.bcc && renderFakeIfTest(msg.bcc, makeId)
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* @hidden
|
|
66
|
+
*/
|
|
67
|
+
export function isTestAddress(to) {
|
|
68
|
+
return ((typeof to === "string" && to.toLowerCase().endsWith(".test"))
|
|
69
|
+
|| (typeof to === "object"
|
|
70
|
+
&& "email" in to
|
|
71
|
+
&& to.email.toLowerCase().endsWith(".test")));
|
|
72
|
+
}
|
|
73
|
+
function renderFake(addr, makeId) {
|
|
74
|
+
return {
|
|
75
|
+
name: renderMailData(addr),
|
|
76
|
+
email: `test+${makeId()}@nomizz.com`
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const eq = Equivalence.mapInput(Equivalence.string, (to) => typeof to === "string" ? to.toLowerCase() : to.email.toLowerCase());
|
|
80
|
+
// TODO: should just not add any already added email address
|
|
81
|
+
// https://stackoverflow.com/a/53603076/11595834
|
|
82
|
+
function renderFakeIfTest(addr, makeId) {
|
|
83
|
+
return Array.isArray(addr)
|
|
84
|
+
? Array.dedupeWith(addr
|
|
85
|
+
.map((x) => (isTestAddress(x) ? renderFake(x, makeId) : x)), eq)
|
|
86
|
+
: isTestAddress(addr)
|
|
87
|
+
? renderFake(addr, makeId)
|
|
88
|
+
: addr;
|
|
89
|
+
}
|
|
90
|
+
function renderMailData(md) {
|
|
91
|
+
if (Array.isArray(md)) {
|
|
92
|
+
return md.map(renderMailData).join(", ");
|
|
93
|
+
}
|
|
94
|
+
if (typeof md === "string") {
|
|
95
|
+
return md;
|
|
96
|
+
}
|
|
97
|
+
return md.email;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VuZGdyaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvRW1haWxlci9TZW5kZ3JpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQU0sTUFBTSxnQkFBZ0IsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUd0QyxNQUFNLFlBQVksR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBa0IsRUFBRSxFQUFFLENBQ3hHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ2YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFFdEMsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2hCLFFBQVEsQ0FBQyxJQUEwQjtZQUNqQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUN6QixNQUFNLEdBQUcsR0FBYSxjQUFjLENBQUM7b0JBQ25DLEdBQUcsSUFBSTtvQkFDUCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXO29CQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO2lCQUNsRSxDQUFDLENBQUE7Z0JBQ0YsTUFBTSxNQUFNLEdB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake.d.ts","sourceRoot":"","sources":["../../src/Emailer/fake.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AActC;;GAEG;AACH,eAAO,MAAM,YAAY,qDAA4B,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Effect } from "effect-app";
|
|
2
|
+
import { pretty } from "effect-app/utils";
|
|
3
|
+
import { InfraLogger } from "../logger.js";
|
|
4
|
+
import { Emailer } from "./service.js";
|
|
5
|
+
const makeFake = InfraLogger
|
|
6
|
+
.logInfo("FAKE Emailer Service enabled")
|
|
7
|
+
.pipe(Effect.map(() => Emailer.of({
|
|
8
|
+
sendMail(msg) {
|
|
9
|
+
return InfraLogger
|
|
10
|
+
.logDebug(`Fake send mail`)
|
|
11
|
+
.pipe(Effect.annotateLogs("msg", pretty(msg)));
|
|
12
|
+
}
|
|
13
|
+
})));
|
|
14
|
+
/**
|
|
15
|
+
* @tsplus static Emailer.Ops Fake
|
|
16
|
+
*/
|
|
17
|
+
export const FakeSendgrid = Emailer.toLayer(makeFake);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFrZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9FbWFpbGVyL2Zha2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNuQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXRDLE1BQU0sUUFBUSxHQUFHLFdBQVc7S0FDekIsT0FBTyxDQUFDLDhCQUE4QixDQUFDO0tBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUNwQixPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ1QsUUFBUSxDQUFDLEdBQUc7UUFDVixPQUFPLFdBQVc7YUFDZixRQUFRLENBQUMsZ0JBQWdCLENBQUM7YUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbEQsQ0FBQztDQUNGLENBQUMsQ0FDSCxDQUFDLENBQUE7QUFFSjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBIn0=
|
|
@@ -18,7 +18,7 @@ declare const Emailer_base: (abstract new (service: {
|
|
|
18
18
|
} & {
|
|
19
19
|
use: <X>(body: (_: {
|
|
20
20
|
sendMail: (msg: EmailMsgOptionalFrom) => Effect<void, Error | ResponseError>;
|
|
21
|
-
}) => X) => X extends Effect.Effect<infer A_1, infer E_1, infer R_3> ? Effect.Effect<A_1, E_1,
|
|
21
|
+
}) => X) => X extends Effect.Effect<infer A_1, infer E_1, infer R_3> ? Effect.Effect<A_1, E_1, Emailer | R_3> : Effect.Effect<X, never, Emailer>;
|
|
22
22
|
};
|
|
23
23
|
/**
|
|
24
24
|
* @tsplus type Emailer
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/Emailer/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,qBAAqB,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAA;AAC1F,OAAO,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;;cAOrD,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,aAAa,CAAC;;cAAlE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,aAAa,CAAC;;cAAlE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,aAAa,CAAC;;;;;;;;;kBAAlE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,aAAa,CAAC;;;AAL9E;;;GAGG;AACH,qBAAa,OAAQ,SAAQ,YAEzB;CAAG;AAEP,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,EAAE,KAAK,GAAG;QAAE,IAAI,CAAC,EAAE,iBAAiB,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAA;IACnE,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,KAAK,GAAG;QAAE,IAAI,CAAC,EAAE,iBAAiB,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAA;IAC/D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAA;CACtB;AACD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAA;AAC9C,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhE,MAAM,MAAM,oBAAoB,GAC5B,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,GACtB,CACA;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAA;CAAE,CAC/G,GACC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA"}
|
|
@@ -5,4 +5,4 @@ import { Context } from "effect-app";
|
|
|
5
5
|
*/
|
|
6
6
|
export class Emailer extends Context.TagId("effect-app/Emailer")() {
|
|
7
7
|
}
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9FbWFpbGVyL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLE9BQU8sRUFBd0QsTUFBTSxZQUFZLENBQUE7QUFHMUY7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLE9BQVEsU0FBUSxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBRTVEO0NBQUcifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Emailer.d.ts","sourceRoot":"","sources":["../src/Emailer.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export * from "./Emailer/service.js";
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW1haWxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9FbWFpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsc0JBQXNCLENBQUEifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MainFiberSet.d.ts","sourceRoot":"","sources":["../src/MainFiberSet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAY,KAAK,EAAE,MAAM,YAAY,CAAA;;;;uBAyCxC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;qBAhChC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;qBAElC,SAAS,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;;;;uBA8BzC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;qBAhChC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;qBAElC,SAAS,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;;;;uBA8BzC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;qBAhChC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;qBAElC,SAAS,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;2BA8BzC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;yBAhChC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;yBAElC,SAAS,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;;;AAiDrE;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,iBAAuD;IACvF,MAAM,CAAC,QAAQ,CAAC,IAAI,0CAAuB;IAC3C,MAAM,CAAC,QAAQ,CAAC,QAAQ,mCAA0F;IAClH,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAI,CAAC,EAAE,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,0EAAiC;IACvF,MAAM,CAAC,QAAQ,CAAC,gBAAgB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,6EAA8C;CACjH"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Context, Effect, Fiber, FiberSet, Layer } from "effect-app";
|
|
2
|
+
import { InfraLogger } from "./logger.js";
|
|
3
|
+
import { reportNonInterruptedFailureCause } from "./QueueMaker/errors.js";
|
|
4
|
+
import { setRootParentSpan } from "./RequestFiberSet.js";
|
|
5
|
+
const make = Effect.gen(function* () {
|
|
6
|
+
const set = yield* FiberSet.make();
|
|
7
|
+
const add = (...fibers) => Effect.sync(() => fibers.forEach((_) => FiberSet.unsafeAdd(set, _)));
|
|
8
|
+
const addAll = (fibers) => Effect.sync(() => fibers.forEach((_) => FiberSet.unsafeAdd(set, _)));
|
|
9
|
+
const join = FiberSet.size(set).pipe(Effect.andThen((count) => InfraLogger.logDebug(`Joining ${count} current fibers on the MainFiberSet`)), Effect.andThen(FiberSet.join(set)));
|
|
10
|
+
const run = FiberSet.run(set);
|
|
11
|
+
// const waitUntilEmpty = Effect.gen(function*() {
|
|
12
|
+
// const currentSize = yield* FiberSet.size(set)
|
|
13
|
+
// if (currentSize === 0) {
|
|
14
|
+
// return
|
|
15
|
+
// }
|
|
16
|
+
// yield* InfraLogger.logInfo("Waiting MainFiberSet to be empty: " + currentSize)
|
|
17
|
+
// while ((yield* FiberSet.size(set)) > 0) yield* Effect.sleep("250 millis")
|
|
18
|
+
// yield* InfraLogger.logDebug("MainFiberSet is empty")
|
|
19
|
+
// })
|
|
20
|
+
// TODO: loop and interrupt all fibers in the set continuously?
|
|
21
|
+
const interrupt = Fiber.interruptAll(set);
|
|
22
|
+
/**
|
|
23
|
+
* Forks the effect into a new fiber attached to the MainFiberSet scope. Because the
|
|
24
|
+
* new fiber isn't attached to the parent, when the fiber executing the
|
|
25
|
+
* returned effect terminates, the forked fiber will continue running.
|
|
26
|
+
* The fiber will be interrupted when the MainFiberSet scope is closed.
|
|
27
|
+
*
|
|
28
|
+
* The parent span is set to the root span of the current fiber.
|
|
29
|
+
* Reports and then swallows errors.
|
|
30
|
+
*/
|
|
31
|
+
function forkDaemonReport(self) {
|
|
32
|
+
return self.pipe(Effect.asVoid, Effect.catchAllCause(reportNonInterruptedFailureCause({})), setRootParentSpan, Effect.uninterruptible, run);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
interrupt,
|
|
36
|
+
join,
|
|
37
|
+
forkDaemonReport,
|
|
38
|
+
run,
|
|
39
|
+
add,
|
|
40
|
+
addAll
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* Whenever you fork long running (e.g worker) fibers via e.g `Effect.forkScoped` or `Effect.forkDaemon`
|
|
45
|
+
* you should register these long running fibers in a FiberSet, and join them at the end of your main program.
|
|
46
|
+
* This way any errors will blow up the main program instead of fibers dying unknowingly.
|
|
47
|
+
*/
|
|
48
|
+
export class MainFiberSet extends Context.TagMakeId("MainFiberSet", make)() {
|
|
49
|
+
static Live = this.toLayerScoped();
|
|
50
|
+
static JoinLive = this.pipe(Effect.andThen((_) => _.join), Layer.effectDiscard, Layer.provide(this.Live));
|
|
51
|
+
static run = (self) => this.use((_) => _.run(self));
|
|
52
|
+
static forkDaemonReport = (self) => this.use((_) => _.forkDaemonReport(self));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFpbkZpYmVyU2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL01haW5GaWJlclNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUdwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRXhELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQy9CLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQWtCLENBQUE7SUFDbEQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE1BQTBDLEVBQUUsRUFBRSxDQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN0RSxNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQW1ELEVBQUUsRUFBRSxDQUNyRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN0RSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDbEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUsscUNBQXFDLENBQUMsQ0FBQyxFQUN0RyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDbkMsQ0FBQTtJQUNELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7SUFFN0Isa0RBQWtEO0lBQ2xELGtEQUFrRDtJQUNsRCw2QkFBNkI7SUFDN0IsYUFBYTtJQUNiLE1BQU07SUFDTixtRkFBbUY7SUFDbkYsOEVBQThFO0lBQzlFLHlEQUF5RDtJQUN6RCxLQUFLO0lBRUwsK0RBQStEO0lBQy9ELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7SUFFekM7Ozs7Ozs7O09BUUc7SUFDSCxTQUFTLGdCQUFnQixDQUFVLElBQXFCO1FBQ3RELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FDZCxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDMUQsaUJBQWlCLEVBQ2pCLE1BQU0sQ0FBQyxlQUFlLEVBQ3RCLEdBQUcsQ0FDSixDQUFBO0lBQ0gsQ0FBQztJQUNELE9BQU87UUFDTCxTQUFTO1FBQ1QsSUFBSTtRQUNKLGdCQUFnQjtRQUNoQixHQUFHO1FBQ0gsR0FBRztRQUNILE1BQU07S0FDUCxDQUFBO0FBQ0gsQ0FBQyxDQUFDLENBQUE7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsRUFBZ0I7SUFDdkYsTUFBTSxDQUFVLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDM0MsTUFBTSxDQUFVLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDbEgsTUFBTSxDQUFVLEdBQUcsR0FBRyxDQUFPLElBQXlCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUN2RixNQUFNLENBQVUsZ0JBQWdCLEdBQUcsQ0FBVSxJQUFxQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQSJ9
|
|
@@ -6,41 +6,41 @@ import type { Query, QueryEnd, QueryWhere } from "../query.js";
|
|
|
6
6
|
import type { Repository } from "./service.js";
|
|
7
7
|
export declare const extendRepo: <T, Encoded extends {
|
|
8
8
|
id: string;
|
|
9
|
-
}, Evt, ItemType extends string, IdKey extends keyof T,
|
|
9
|
+
}, Evt, ItemType extends string, IdKey extends keyof T, RSchema, RPublish>(repo: Repository<T, Encoded, Evt, ItemType, IdKey, RSchema, RPublish>) => Repository<T, Encoded, Evt, ItemType, IdKey, RSchema, RPublish> & {
|
|
10
10
|
request: (id: T[IdKey]) => Effect.Effect<T, NotFoundError<ItemType>, never>;
|
|
11
|
-
get: (id: T[IdKey]) => Effect.Effect<T, NotFoundError<ItemType>,
|
|
11
|
+
get: (id: T[IdKey]) => Effect.Effect<T, NotFoundError<ItemType>, RSchema>;
|
|
12
12
|
log: (evt: Evt) => import("effect-app/Pure").PureLogT<any>;
|
|
13
|
-
removeById: (id: T[IdKey]) => Effect.Effect<void, NotFoundError<ItemType>,
|
|
14
|
-
save: (items_0: T, ...items: T[]) => Effect<void,
|
|
15
|
-
saveWithEvents: (events: Iterable<Evt>) => (items_0: T, ...items: T[]) => Effect<void,
|
|
13
|
+
removeById: (id: T[IdKey]) => Effect.Effect<void, NotFoundError<ItemType>, RSchema | RPublish>;
|
|
14
|
+
save: (items_0: T, ...items: T[]) => Effect<void, OptimisticConcurrencyException | InvalidStateError, RSchema | RPublish>;
|
|
15
|
+
saveWithEvents: (events: Iterable<Evt>) => (items_0: T, ...items: T[]) => Effect<void, OptimisticConcurrencyException | InvalidStateError, RSchema | RPublish>;
|
|
16
16
|
queryAndSavePure: {
|
|
17
17
|
<A, E2, R2, T2 extends T>(q: (q: Query<Encoded>) => QueryEnd<Encoded, "one">, pure: Effect<A, E2, FixEnv<R2, Evt, T, T2>>): Effect.Effect<A, InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E2, Exclude<R2, {
|
|
18
18
|
env: PureEnv<Evt, T, T2>;
|
|
19
19
|
}>>;
|
|
20
|
-
<A, E2_1, R2_1, T2_1 extends T>(q: (q: Query<Encoded>) => Query<Encoded> | QueryWhere<Encoded> | QueryEnd<Encoded, "many">, pure: Effect<A, E2_1, FixEnv<R2_1, Evt, readonly T[], readonly T2_1[]>>): Effect.Effect<A, InvalidStateError | OptimisticConcurrencyException | E2_1, Exclude<R2_1, {
|
|
20
|
+
<A, E2_1, R2_1, T2_1 extends T>(q: (q: Query<Encoded>) => Query<Encoded> | QueryWhere<Encoded> | QueryEnd<Encoded, "many">, pure: Effect<A, E2_1, FixEnv<R2_1, Evt, readonly T[], readonly T2_1[]>>): Effect.Effect<A, InvalidStateError | OptimisticConcurrencyException | E2_1, RSchema | RPublish | Exclude<R2_1, {
|
|
21
21
|
env: PureEnv<Evt, readonly T[], readonly T2_1[]>;
|
|
22
22
|
}>>;
|
|
23
|
-
<A, E2_2, R2_2, T2_2 extends T>(q: (q: Query<Encoded>) => Query<Encoded> | QueryWhere<Encoded> | QueryEnd<Encoded, "many">, pure: Effect<A, E2_2, FixEnv<R2_2, Evt, readonly T[], readonly T2_2[]>>, batch: "batched" | number): Effect.Effect<A[], InvalidStateError | OptimisticConcurrencyException | E2_2, Exclude<R2_2, {
|
|
23
|
+
<A, E2_2, R2_2, T2_2 extends T>(q: (q: Query<Encoded>) => Query<Encoded> | QueryWhere<Encoded> | QueryEnd<Encoded, "many">, pure: Effect<A, E2_2, FixEnv<R2_2, Evt, readonly T[], readonly T2_2[]>>, batch: "batched" | number): Effect.Effect<A[], InvalidStateError | OptimisticConcurrencyException | E2_2, RSchema | RPublish | Exclude<R2_2, {
|
|
24
24
|
env: PureEnv<Evt, readonly T[], readonly T2_2[]>;
|
|
25
25
|
}>>;
|
|
26
26
|
};
|
|
27
27
|
saveManyWithPure: {
|
|
28
|
-
<
|
|
28
|
+
<R, A, E, S1 extends T, S2 extends T>(items: Iterable<S1>, pure: Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>): Effect.Effect<A, InvalidStateError | OptimisticConcurrencyException | E, RSchema | RPublish | Exclude<R, {
|
|
29
29
|
env: PureEnv<Evt, readonly S1[], readonly S2[]>;
|
|
30
30
|
}>>;
|
|
31
|
-
<
|
|
31
|
+
<R, A_1, E_1, S1_1 extends T, S2_1 extends T>(items: Iterable<S1_1>, pure: Effect<A_1, E_1, FixEnv<R, Evt, readonly S1_1[], readonly S2_1[]>>, batch: "batched" | number): Effect.Effect<A_1[], InvalidStateError | OptimisticConcurrencyException | E_1, RSchema | RPublish | Exclude<R, {
|
|
32
32
|
env: PureEnv<Evt, readonly S1_1[], readonly S2_1[]>;
|
|
33
33
|
}>>;
|
|
34
34
|
};
|
|
35
|
-
byIdAndSaveWithPure: <
|
|
35
|
+
byIdAndSaveWithPure: <R, A_2, E_2, S2_2 extends T>(id: T[IdKey], pure: Effect<A_2, E_2, FixEnv<R, Evt, T, S2_2>>) => Effect<A_2, InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E_2, RSchema | RPublish | Exclude<R, {
|
|
36
36
|
env: PureEnv<Evt, T, S2_2>;
|
|
37
37
|
}>>;
|
|
38
|
-
saveWithPure: <
|
|
38
|
+
saveWithPure: <R, A_3, E_3, S1_2 extends T, S2_3 extends T>(item: S1_2, pure: Effect<A_3, E_3, FixEnv<R, Evt, S1_2, S2_3>>) => Effect.Effect<A_3, OptimisticConcurrencyException | InvalidStateError | E_3, RSchema | RPublish | Exclude<R, {
|
|
39
39
|
env: PureEnv<Evt, S1_2, S2_3>;
|
|
40
40
|
}>>;
|
|
41
41
|
};
|
|
42
42
|
export interface ExtendedRepository<T, Encoded extends {
|
|
43
43
|
id: string;
|
|
44
|
-
}, Evt, ItemType extends string, IdKey extends keyof T,
|
|
44
|
+
}, Evt, ItemType extends string, IdKey extends keyof T, RSchema, RPublish> extends ReturnType<typeof extendRepo<T, Encoded, Evt, ItemType, IdKey, RSchema, RPublish>> {
|
|
45
45
|
}
|
|
46
46
|
//# sourceMappingURL=ext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ext.d.ts","sourceRoot":"","sources":["../../../src/Model/Repository/ext.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Array, Effect, Exit, Option, Request, RequestResolver } from "effect-app";
|
|
2
|
+
import { NotFoundError } from "effect-app/client";
|
|
3
|
+
import { runTerm } from "effect-app/Pure";
|
|
4
|
+
import { AnyPureDSL } from "../dsl.js";
|
|
5
|
+
import * as Q from "../query.js";
|
|
6
|
+
export const extendRepo = (repo) => {
|
|
7
|
+
const get = (id) => Effect.flatMap(repo.find(id), (_) => Effect.mapError(_, () => new NotFoundError({ type: repo.itemType, id })));
|
|
8
|
+
function saveManyWithPure_(items, pure) {
|
|
9
|
+
return saveAllWithEffectInt(runTerm(pure, [...items]));
|
|
10
|
+
}
|
|
11
|
+
function saveWithPure_(item, pure) {
|
|
12
|
+
return saveAllWithEffectInt(runTerm(pure, item)
|
|
13
|
+
.pipe(Effect
|
|
14
|
+
.map(([item, events, a]) => [[item], events, a])));
|
|
15
|
+
}
|
|
16
|
+
function saveAllWithEffectInt(gen) {
|
|
17
|
+
return Effect.flatMap(gen, ([items, events, a]) => repo.saveAndPublish(items, events).pipe(Effect.map(() => a)));
|
|
18
|
+
}
|
|
19
|
+
function saveManyWithPureBatched_(items, pure, batchSize = 100) {
|
|
20
|
+
return Effect.forEach(Array.chunk_(items, batchSize), (batch) => saveAllWithEffectInt(runTerm(pure, batch)));
|
|
21
|
+
}
|
|
22
|
+
const queryAndSavePure = (q, pure, batch) => repo.query(q).pipe(Effect.andThen((_) => Array.isArray(_)
|
|
23
|
+
? batch === undefined
|
|
24
|
+
? saveManyWithPure_(_, pure)
|
|
25
|
+
: saveManyWithPureBatched_(_, pure, batch === "batched" ? 100 : batch)
|
|
26
|
+
: saveWithPure_(_, pure)));
|
|
27
|
+
const saveManyWithPure = (items, pure, batch) => batch
|
|
28
|
+
? Effect.forEach(Array.chunk_(items, batch === "batched" ? 100 : batch), (batch) => saveAllWithEffectInt(runTerm(pure, batch)))
|
|
29
|
+
: saveAllWithEffectInt(runTerm(pure, [...items]));
|
|
30
|
+
const byIdAndSaveWithPure = (id, pure) => get(id).pipe(Effect.flatMap((item) => saveWithPure_(item, pure)));
|
|
31
|
+
const _request = Request.tagged(`Get${repo.itemType}`);
|
|
32
|
+
const requestResolver = RequestResolver
|
|
33
|
+
.makeBatched((requests) => repo.query(Q.where("id", "in", requests.map((_) => _.id)))
|
|
34
|
+
// TODO
|
|
35
|
+
.pipe(Effect.andThen((items) => Effect.forEach(requests, (r) => Request.complete(r, Array
|
|
36
|
+
.findFirst(items, (_) => _[repo.idKey] === r.id)
|
|
37
|
+
.pipe(Option.match({
|
|
38
|
+
onNone: () => Exit.fail(new NotFoundError({ type: repo.itemType, id: r.id })),
|
|
39
|
+
onSome: Exit.succeed
|
|
40
|
+
}))), { discard: true })), Effect
|
|
41
|
+
.catchAllCause((cause) => Effect.forEach(requests, Request.complete(Exit.failCause(cause)), { discard: true }))))
|
|
42
|
+
.pipe(RequestResolver.batchN(20));
|
|
43
|
+
const exts = {
|
|
44
|
+
request: (id) => Effect.request(_request({ id }), requestResolver),
|
|
45
|
+
get,
|
|
46
|
+
log: (evt) => AnyPureDSL.log(evt),
|
|
47
|
+
removeById: (id) => Effect.andThen(get(id), (_) => repo.removeAndPublish([_])),
|
|
48
|
+
save: (...items) => repo.saveAndPublish(items),
|
|
49
|
+
saveWithEvents: (events) => (...items) => repo.saveAndPublish(items, events),
|
|
50
|
+
queryAndSavePure,
|
|
51
|
+
saveManyWithPure,
|
|
52
|
+
byIdAndSaveWithPure,
|
|
53
|
+
saveWithPure: (item, pure) => saveAllWithEffectInt(runTerm(pure, item)
|
|
54
|
+
.pipe(Effect.map(([item, events, a]) => [[item], events, a])))
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
...repo,
|
|
58
|
+
...exts
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL01vZGVsL1JlcG9zaXRvcnkvZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVsRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFdEMsT0FBTyxLQUFLLENBQUMsTUFBTSxhQUFhLENBQUE7QUFHaEMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBU3hCLElBQXFFLEVBQ3JFLEVBQUU7SUFDRixNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQVksRUFBRSxFQUFFLENBQzNCLE1BQU0sQ0FBQyxPQUFPLENBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFDYixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxhQUFhLENBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQzFGLENBQUE7SUFDSCxTQUFTLGlCQUFpQixDQU94QixLQUFtQixFQUNuQixJQUFnRTtRQUVoRSxPQUFPLG9CQUFvQixDQUN6QixPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUMxQixDQUFBO0lBQ0gsQ0FBQztJQUVELFNBQVMsYUFBYSxDQU9wQixJQUFRLEVBQ1IsSUFBMEM7UUFFMUMsT0FBTyxvQkFBb0IsQ0FDekIsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7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
|