@effect-app/infra 0.7.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/.eslintrc.cjs +11 -0
- package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-314902b6271c341511f7398a50469024 +0 -0
- package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-3f072cc7afa09b6adaead0527ab9df83 +0 -0
- package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-74c3c295c110fc861b6a4c673afc3e24 +0 -0
- package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-bf6dae8cb9ea9740ceb39aefaf12716c +0 -0
- package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-cf9d1486029526079a5f68f2041dea02 +0 -0
- package/.jest-cache/haste-map-4ca41cc04e60c616a19cbb483cbf487b-e2f1f4b6d87214e3c49442fed31f310c-b4710ed9fb3d0757c4bf23045c585670 +0 -0
- package/.jest-cache/haste-map-4ca41cc04e60c616a19cbb483cbf487b-e2f1f4b6d87214e3c49442fed31f310c-ee17e5395bb1b7b36a4e2e22a6ae1449 +0 -0
- package/.jest-cache/haste-map-7dc16d7fae8c072843ed1c69eae73100-a8a4225b317477b49bca31f54559afb3-c16136699bb7f463be85273162b447c3 +0 -0
- package/.jest-cache/haste-map-9aa1e395a82e108eb49698982c574272-e2f1f4b6d87214e3c49442fed31f310c-f7435f46fc41ac5a13d06a49cae9a650 +0 -0
- package/.jest-cache/haste-map-9d206b45d610536c9ec65eec263c6964-a8a4225b317477b49bca31f54559afb3-3510506a330b44f1ae629033aac8fbb3 +0 -0
- package/.jest-cache/haste-map-a00ab30d0d656f9d3990958a54b9ccfd-87603b0fc921b26b622a5859b4c92bed-17b550b450b18840c25861aa6e835f0c +0 -0
- package/.jest-cache/haste-map-a00ab30d0d656f9d3990958a54b9ccfd-87603b0fc921b26b622a5859b4c92bed-4dc31290b1efc98335eb4c89167d75c3 +0 -0
- package/.jest-cache/haste-map-ab843cb0ffbadfd0deea4adb182c7ecd-87603b0fc921b26b622a5859b4c92bed-997106edf4bbc31567a378146180e45e +0 -0
- package/.jest-cache/haste-map-ab843cb0ffbadfd0deea4adb182c7ecd-87603b0fc921b26b622a5859b4c92bed-f0cd25414f9ed16c446940ca3aa23c1b +0 -0
- package/.jest-cache/haste-map-cf17f2edf0e949eebfdfca561816457c-e7a7ff05756c055cb63be97ba8537525-2cac07d09e6384e2d37c49714edad0ba +0 -0
- package/.jest-cache/haste-map-cf17f2edf0e949eebfdfca561816457c-e7a7ff05756c055cb63be97ba8537525-d7967c2976c5feac7161c964f0aa442f +0 -0
- package/.jest-cache/haste-map-fb1a173276d25bbff02f815600059283-938122bdc1c8836874b6585d7acb2e99-f705929cca05ce95ceaa6d520b560ce8 +0 -0
- package/.prettierignore +6 -0
- package/_cjs/_global.cjs +6 -0
- package/_cjs/_global.cjs.map +1 -0
- package/_cjs/_global.ext.cjs +6 -0
- package/_cjs/_global.ext.cjs.map +1 -0
- package/_cjs/_global.schema.cjs +5 -0
- package/_cjs/_global.schema.cjs.map +1 -0
- package/_cjs/errors.cjs +82 -0
- package/_cjs/errors.cjs.map +1 -0
- package/_cjs/ext.cjs +4 -0
- package/_cjs/ext.cjs.map +1 -0
- package/_cjs/index.cjs +6 -0
- package/_cjs/index.cjs.map +1 -0
- package/_cjs/lib/RequestContext.cjs +70 -0
- package/_cjs/lib/RequestContext.cjs.map +1 -0
- package/_cjs/lib/api/authorization.jwt.cjs +44 -0
- package/_cjs/lib/api/authorization.jwt.cjs.map +1 -0
- package/_cjs/lib/api/defaultErrorHandler.cjs +45 -0
- package/_cjs/lib/api/defaultErrorHandler.cjs.map +1 -0
- package/_cjs/lib/api/reportError.cjs +64 -0
- package/_cjs/lib/api/reportError.cjs.map +1 -0
- package/_cjs/lib/api/routing.cjs +262 -0
- package/_cjs/lib/api/routing.cjs.map +1 -0
- package/_cjs/lib/api/setupRequest.cjs +35 -0
- package/_cjs/lib/api/setupRequest.cjs.map +1 -0
- package/_cjs/lib/api/util.cjs +17 -0
- package/_cjs/lib/api/util.cjs.map +1 -0
- package/_cjs/lib/api/writeDocs.cjs +31 -0
- package/_cjs/lib/api/writeDocs.cjs.map +1 -0
- package/_cjs/lib/errorReporter.cjs +72 -0
- package/_cjs/lib/errorReporter.cjs.map +1 -0
- package/_cjs/lib/ext/Array.cjs +30 -0
- package/_cjs/lib/ext/Array.cjs.map +1 -0
- package/_cjs/lib/fileUtil.cjs +36 -0
- package/_cjs/lib/fileUtil.cjs.map +1 -0
- package/_cjs/lib/filter/types/errors.cjs +6 -0
- package/_cjs/lib/filter/types/errors.cjs.map +1 -0
- package/_cjs/lib/filter/types/fields.cjs +6 -0
- package/_cjs/lib/filter/types/fields.cjs.map +1 -0
- package/_cjs/lib/filter/types/index.cjs +61 -0
- package/_cjs/lib/filter/types/index.cjs.map +1 -0
- package/_cjs/lib/filter/types/path/common.cjs +6 -0
- package/_cjs/lib/filter/types/path/common.cjs.map +1 -0
- package/_cjs/lib/filter/types/path/eager.cjs +6 -0
- package/_cjs/lib/filter/types/path/eager.cjs.map +1 -0
- package/_cjs/lib/filter/types/path/index.cjs +8 -0
- package/_cjs/lib/filter/types/path/index.cjs.map +1 -0
- package/_cjs/lib/filter/types/utils.cjs +6 -0
- package/_cjs/lib/filter/types/utils.cjs.map +1 -0
- package/_cjs/lib/filter/types/validator.cjs +6 -0
- package/_cjs/lib/filter/types/validator.cjs.map +1 -0
- package/_cjs/lib/filter.cjs +238 -0
- package/_cjs/lib/filter.cjs.map +1 -0
- package/_cjs/lib/instrument.cjs +20 -0
- package/_cjs/lib/instrument.cjs.map +1 -0
- package/_cjs/lib/rateLimit.cjs +88 -0
- package/_cjs/lib/rateLimit.cjs.map +1 -0
- package/_cjs/services/CUPS/service.cjs +15 -0
- package/_cjs/services/CUPS/service.cjs.map +1 -0
- package/_cjs/services/CUPS.cjs +113 -0
- package/_cjs/services/CUPS.cjs.map +1 -0
- package/_cjs/services/Cache.cjs +39 -0
- package/_cjs/services/Cache.cjs.map +1 -0
- package/_cjs/services/Emailer/Sendgrid.cjs +112 -0
- package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -0
- package/_cjs/services/Emailer/fake.cjs +24 -0
- package/_cjs/services/Emailer/fake.cjs.map +1 -0
- package/_cjs/services/Emailer/service.cjs +12 -0
- package/_cjs/services/Emailer/service.cjs.map +1 -0
- package/_cjs/services/Emailer.cjs +17 -0
- package/_cjs/services/Emailer.cjs.map +1 -0
- package/_cjs/services/Repository.cjs +247 -0
- package/_cjs/services/Repository.cjs.map +1 -0
- package/_cjs/services/ServiceBus.cjs +69 -0
- package/_cjs/services/ServiceBus.cjs.map +1 -0
- package/_cjs/services/Store/Cosmos.cjs +324 -0
- package/_cjs/services/Store/Cosmos.cjs.map +1 -0
- package/_cjs/services/Store/Cosmos.test.cjs +59 -0
- package/_cjs/services/Store/Cosmos.test.cjs.map +1 -0
- package/_cjs/services/Store/Disk.cjs +62 -0
- package/_cjs/services/Store/Disk.cjs.map +1 -0
- package/_cjs/services/Store/Memory.cjs +70 -0
- package/_cjs/services/Store/Memory.cjs.map +1 -0
- package/_cjs/services/Store/Redis.cjs +72 -0
- package/_cjs/services/Store/Redis.cjs.map +1 -0
- package/_cjs/services/Store/codeFilter.test.cjs +61 -0
- package/_cjs/services/Store/codeFilter.test.cjs.map +1 -0
- package/_cjs/services/Store/index.cjs +72 -0
- package/_cjs/services/Store/index.cjs.map +1 -0
- package/_cjs/services/Store/service.cjs +72 -0
- package/_cjs/services/Store/service.cjs.map +1 -0
- package/_cjs/services/Store/utils.cjs +78 -0
- package/_cjs/services/Store/utils.cjs.map +1 -0
- package/_cjs/services/Store.cjs +17 -0
- package/_cjs/services/Store.cjs.map +1 -0
- package/_cjs/services/memQueue.cjs +32 -0
- package/_cjs/services/memQueue.cjs.map +1 -0
- package/_cjs/test.arbs.cjs +32 -0
- package/_cjs/test.arbs.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs +14 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs +29 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs +32 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs +266 -0
- package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs +31 -0
- package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs +67 -0
- package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs +44 -0
- package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs +33 -0
- package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/definition.cjs +13 -0
- package/_cjs/vendor/Cache/Cache/definition.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/operations/make.cjs +20 -0
- package/_cjs/vendor/Cache/Cache/operations/make.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs +23 -0
- package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/operations.cjs +28 -0
- package/_cjs/vendor/Cache/Cache/operations.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache.cjs +28 -0
- package/_cjs/vendor/Cache/Cache.cjs.map +1 -0
- package/_cjs/vendor/Cache/CacheStats/definition.cjs +13 -0
- package/_cjs/vendor/Cache/CacheStats/definition.cjs.map +1 -0
- package/_cjs/vendor/Cache/CacheStats.cjs +17 -0
- package/_cjs/vendor/Cache/CacheStats.cjs.map +1 -0
- package/_cjs/vendor/Cache/EntryStats/definition.cjs +11 -0
- package/_cjs/vendor/Cache/EntryStats/definition.cjs.map +1 -0
- package/_cjs/vendor/Cache/EntryStats.cjs +17 -0
- package/_cjs/vendor/Cache/EntryStats.cjs.map +1 -0
- package/_cjs/vendor/Cache/Lookup/definition.cjs +6 -0
- package/_cjs/vendor/Cache/Lookup/definition.cjs.map +1 -0
- package/_cjs/vendor/Cache/Lookup.cjs +17 -0
- package/_cjs/vendor/Cache/Lookup.cjs.map +1 -0
- package/_cjs/vendor/Cache/index.cjs +17 -0
- package/_cjs/vendor/Cache/index.cjs.map +1 -0
- package/_src/_global.ext.ts +34 -0
- package/_src/_global.schema.ts +10 -0
- package/_src/_global.ts +14 -0
- package/_src/errors.ts +50 -0
- package/_src/ext.ts +1 -0
- package/_src/index.ts +0 -0
- package/_src/lib/RequestContext.ts +132 -0
- package/_src/lib/api/authorization.jwt.ts +52 -0
- package/_src/lib/api/defaultErrorHandler.ts +92 -0
- package/_src/lib/api/reportError.ts +50 -0
- package/_src/lib/api/routing.ts +623 -0
- package/_src/lib/api/setupRequest.ts +22 -0
- package/_src/lib/api/util.ts +14 -0
- package/_src/lib/api/writeDocs.ts +26 -0
- package/_src/lib/errorReporter.ts +63 -0
- package/_src/lib/ext/Array.ts +32 -0
- package/_src/lib/fileUtil.ts +56 -0
- package/_src/lib/filter/types/errors.ts +47 -0
- package/_src/lib/filter/types/fields.ts +50 -0
- package/_src/lib/filter/types/index.ts +5 -0
- package/_src/lib/filter/types/path/common.ts +404 -0
- package/_src/lib/filter/types/path/eager.ts +146 -0
- package/_src/lib/filter/types/path/index.ts +14 -0
- package/_src/lib/filter/types/utils.ts +106 -0
- package/_src/lib/filter/types/validator.ts +46 -0
- package/_src/lib/filter.ts +323 -0
- package/_src/lib/instrument.ts +9 -0
- package/_src/lib/rateLimit.ts +126 -0
- package/_src/services/CUPS/service.ts +16 -0
- package/_src/services/CUPS.ts +105 -0
- package/_src/services/Cache.ts +45 -0
- package/_src/services/Emailer/Sendgrid.ts +123 -0
- package/_src/services/Emailer/fake.ts +14 -0
- package/_src/services/Emailer/service.ts +33 -0
- package/_src/services/Emailer.ts +1 -0
- package/_src/services/Repository.ts +513 -0
- package/_src/services/ServiceBus.ts +111 -0
- package/_src/services/Store/Cosmos.test.ts +91 -0
- package/_src/services/Store/Cosmos.ts +545 -0
- package/_src/services/Store/Disk.ts +81 -0
- package/_src/services/Store/Memory.ts +77 -0
- package/_src/services/Store/Redis.ts +92 -0
- package/_src/services/Store/codeFilter.test.ts +74 -0
- package/_src/services/Store/index.test.ts.bak +112 -0
- package/_src/services/Store/index.ts +62 -0
- package/_src/services/Store/service.ts +174 -0
- package/_src/services/Store/utils.ts +126 -0
- package/_src/services/Store.ts +1 -0
- package/_src/services/memQueue.ts +30 -0
- package/_src/test.arbs.ts +27 -0
- package/_src/vendor/Cache/Cache/_internal/AtomicBoolean.ts +7 -0
- package/_src/vendor/Cache/Cache/_internal/AtomicNumber.ts +28 -0
- package/_src/vendor/Cache/Cache/_internal/AtomicReference.ts +30 -0
- package/_src/vendor/Cache/Cache/_internal/CacheInternal.ts +293 -0
- package/_src/vendor/Cache/Cache/_internal/CacheState.ts +56 -0
- package/_src/vendor/Cache/Cache/_internal/KeySet.ts +58 -0
- package/_src/vendor/Cache/Cache/_internal/MapKey.ts +43 -0
- package/_src/vendor/Cache/Cache/_internal/MapValue.ts +39 -0
- package/_src/vendor/Cache/Cache/definition.ts +112 -0
- package/_src/vendor/Cache/Cache/operations/make.ts +17 -0
- package/_src/vendor/Cache/Cache/operations/makeWith.ts +32 -0
- package/_src/vendor/Cache/Cache/operations.ts +4 -0
- package/_src/vendor/Cache/Cache.ts +4 -0
- package/_src/vendor/Cache/CacheStats/definition.ts +23 -0
- package/_src/vendor/Cache/CacheStats.ts +3 -0
- package/_src/vendor/Cache/EntryStats/definition.ts +19 -0
- package/_src/vendor/Cache/EntryStats.ts +3 -0
- package/_src/vendor/Cache/Lookup/definition.ts +15 -0
- package/_src/vendor/Cache/Lookup.ts +3 -0
- package/_src/vendor/Cache/global.ts.bak +23 -0
- package/_src/vendor/Cache/index.ts +4 -0
- package/dist/_global.d.ts +10 -0
- package/dist/_global.d.ts.map +1 -0
- package/dist/_global.ext.d.ts +34 -0
- package/dist/_global.ext.d.ts.map +1 -0
- package/dist/_global.ext.js +2 -0
- package/dist/_global.js +12 -0
- package/dist/_global.schema.d.ts +6 -0
- package/dist/_global.schema.d.ts.map +1 -0
- package/dist/_global.schema.js +9 -0
- package/dist/errors.d.ts +41 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +51 -0
- package/dist/ext.d.ts +2 -0
- package/dist/ext.d.ts.map +1 -0
- package/dist/ext.js +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/lib/RequestContext.d.ts +122 -0
- package/dist/lib/RequestContext.d.ts.map +1 -0
- package/dist/lib/RequestContext.js +52 -0
- package/dist/lib/api/authorization.jwt.d.ts +7 -0
- package/dist/lib/api/authorization.jwt.d.ts.map +1 -0
- package/dist/lib/api/authorization.jwt.js +32 -0
- package/dist/lib/api/defaultErrorHandler.d.ts +8 -0
- package/dist/lib/api/defaultErrorHandler.d.ts.map +1 -0
- package/dist/lib/api/defaultErrorHandler.js +37 -0
- package/dist/lib/api/reportError.d.ts +32 -0
- package/dist/lib/api/reportError.d.ts.map +1 -0
- package/dist/lib/api/reportError.js +44 -0
- package/dist/lib/api/routing.d.ts +100 -0
- package/dist/lib/api/routing.d.ts.map +1 -0
- package/dist/lib/api/routing.js +248 -0
- package/dist/lib/api/setupRequest.d.ts +13 -0
- package/dist/lib/api/setupRequest.d.ts.map +1 -0
- package/dist/lib/api/setupRequest.js +25 -0
- package/dist/lib/api/util.d.ts +3 -0
- package/dist/lib/api/util.d.ts.map +1 -0
- package/dist/lib/api/util.js +14 -0
- package/dist/lib/api/writeDocs.d.ts +3 -0
- package/dist/lib/api/writeDocs.d.ts.map +1 -0
- package/dist/lib/api/writeDocs.js +23 -0
- package/dist/lib/errorReporter.d.ts +8 -0
- package/dist/lib/errorReporter.d.ts.map +1 -0
- package/dist/lib/errorReporter.js +45 -0
- package/dist/lib/ext/Array.d.ts +19 -0
- package/dist/lib/ext/Array.d.ts.map +1 -0
- package/dist/lib/ext/Array.js +21 -0
- package/dist/lib/fileUtil.d.ts +22 -0
- package/dist/lib/fileUtil.d.ts.map +1 -0
- package/dist/lib/fileUtil.js +23 -0
- package/dist/lib/filter/types/errors.d.ts +30 -0
- package/dist/lib/filter/types/errors.d.ts.map +1 -0
- package/dist/lib/filter/types/errors.js +2 -0
- package/dist/lib/filter/types/fields.d.ts +29 -0
- package/dist/lib/filter/types/fields.d.ts.map +1 -0
- package/dist/lib/filter/types/fields.js +2 -0
- package/dist/lib/filter/types/index.d.ts +6 -0
- package/dist/lib/filter/types/index.d.ts.map +1 -0
- package/dist/lib/filter/types/index.js +6 -0
- package/dist/lib/filter/types/path/common.d.ts +316 -0
- package/dist/lib/filter/types/path/common.d.ts.map +1 -0
- package/dist/lib/filter/types/path/common.js +2 -0
- package/dist/lib/filter/types/path/eager.d.ts +95 -0
- package/dist/lib/filter/types/path/eager.d.ts.map +1 -0
- package/dist/lib/filter/types/path/eager.js +2 -0
- package/dist/lib/filter/types/path/index.d.ts +4 -0
- package/dist/lib/filter/types/path/index.d.ts.map +1 -0
- package/dist/lib/filter/types/path/index.js +4 -0
- package/dist/lib/filter/types/utils.d.ts +68 -0
- package/dist/lib/filter/types/utils.d.ts.map +1 -0
- package/dist/lib/filter/types/utils.js +2 -0
- package/dist/lib/filter/types/validator.d.ts +30 -0
- package/dist/lib/filter/types/validator.d.ts.map +1 -0
- package/dist/lib/filter/types/validator.js +2 -0
- package/dist/lib/filter.d.ts +133 -0
- package/dist/lib/filter.d.ts.map +1 -0
- package/dist/lib/filter.js +171 -0
- package/dist/lib/instrument.d.ts +7 -0
- package/dist/lib/instrument.d.ts.map +1 -0
- package/dist/lib/instrument.js +12 -0
- package/dist/lib/rateLimit.d.ts +43 -0
- package/dist/lib/rateLimit.d.ts.map +1 -0
- package/dist/lib/rateLimit.js +76 -0
- package/dist/services/CUPS/service.d.ts +19 -0
- package/dist/services/CUPS/service.d.ts.map +1 -0
- package/dist/services/CUPS/service.js +5 -0
- package/dist/services/CUPS.d.ts +10 -0
- package/dist/services/CUPS.d.ts.map +1 -0
- package/dist/services/CUPS.js +89 -0
- package/dist/services/Cache.d.ts +28 -0
- package/dist/services/Cache.d.ts.map +1 -0
- package/dist/services/Cache.js +28 -0
- package/dist/services/Emailer/Sendgrid.d.ts +180 -0
- package/dist/services/Emailer/Sendgrid.d.ts.map +1 -0
- package/dist/services/Emailer/Sendgrid.js +102 -0
- package/dist/services/Emailer/fake.d.ts +7 -0
- package/dist/services/Emailer/fake.d.ts.map +1 -0
- package/dist/services/Emailer/fake.js +15 -0
- package/dist/services/Emailer/service.d.ts +41 -0
- package/dist/services/Emailer/service.d.ts.map +1 -0
- package/dist/services/Emailer/service.js +3 -0
- package/dist/services/Emailer.d.ts +2 -0
- package/dist/services/Emailer.d.ts.map +1 -0
- package/dist/services/Emailer.js +2 -0
- package/dist/services/Repository.d.ts +300 -0
- package/dist/services/Repository.d.ts.map +1 -0
- package/dist/services/Repository.js +193 -0
- package/dist/services/ServiceBus.d.ts +26 -0
- package/dist/services/ServiceBus.d.ts.map +1 -0
- package/dist/services/ServiceBus.js +53 -0
- package/dist/services/Store/Cosmos.d.ts +56 -0
- package/dist/services/Store/Cosmos.d.ts.map +1 -0
- package/dist/services/Store/Cosmos.js +321 -0
- package/dist/services/Store/Cosmos.test.d.ts.map +1 -0
- package/dist/services/Store/Disk.d.ts +14 -0
- package/dist/services/Store/Disk.d.ts.map +1 -0
- package/dist/services/Store/Disk.js +52 -0
- package/dist/services/Store/Memory.d.ts +17 -0
- package/dist/services/Store/Memory.d.ts.map +1 -0
- package/dist/services/Store/Memory.js +60 -0
- package/dist/services/Store/Redis.d.ts +12 -0
- package/dist/services/Store/Redis.d.ts.map +1 -0
- package/dist/services/Store/Redis.js +59 -0
- package/dist/services/Store/codeFilter.test.d.ts.map +1 -0
- package/dist/services/Store/index.d.ts +10 -0
- package/dist/services/Store/index.d.ts.map +1 -0
- package/dist/services/Store/index.js +52 -0
- package/dist/services/Store/service.d.ts +113 -0
- package/dist/services/Store/service.d.ts.map +1 -0
- package/dist/services/Store/service.js +63 -0
- package/dist/services/Store/utils.d.ts +14 -0
- package/dist/services/Store/utils.d.ts.map +1 -0
- package/dist/services/Store/utils.js +103 -0
- package/dist/services/Store.d.ts +2 -0
- package/dist/services/Store.d.ts.map +1 -0
- package/dist/services/Store.js +2 -0
- package/dist/services/memQueue.d.ts +18 -0
- package/dist/services/memQueue.d.ts.map +1 -0
- package/dist/services/memQueue.js +24 -0
- package/dist/test.arbs.d.ts +13 -0
- package/dist/test.arbs.d.ts.map +1 -0
- package/dist/test.arbs.js +22 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts +5 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.js +7 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts +8 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicNumber.js +22 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts +10 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicReference.js +25 -0
- package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts +51 -0
- package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/CacheInternal.js +253 -0
- package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts +33 -0
- package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/CacheState.js +21 -0
- package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts +20 -0
- package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/KeySet.js +61 -0
- package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts +24 -0
- package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/MapKey.js +37 -0
- package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts +32 -0
- package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/MapValue.js +24 -0
- package/dist/vendor/Cache/Cache/definition.d.ts +100 -0
- package/dist/vendor/Cache/Cache/definition.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/definition.js +5 -0
- package/dist/vendor/Cache/Cache/operations/make.d.ts +12 -0
- package/dist/vendor/Cache/Cache/operations/make.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/operations/make.js +12 -0
- package/dist/vendor/Cache/Cache/operations/makeWith.d.ts +14 -0
- package/dist/vendor/Cache/Cache/operations/makeWith.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/operations/makeWith.js +15 -0
- package/dist/vendor/Cache/Cache/operations.d.ts +3 -0
- package/dist/vendor/Cache/Cache/operations.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/operations.js +4 -0
- package/dist/vendor/Cache/Cache.d.ts +3 -0
- package/dist/vendor/Cache/Cache.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache.js +4 -0
- package/dist/vendor/Cache/CacheStats/definition.d.ts +19 -0
- package/dist/vendor/Cache/CacheStats/definition.d.ts.map +1 -0
- package/dist/vendor/Cache/CacheStats/definition.js +6 -0
- package/dist/vendor/Cache/CacheStats.d.ts +2 -0
- package/dist/vendor/Cache/CacheStats.d.ts.map +1 -0
- package/dist/vendor/Cache/CacheStats.js +3 -0
- package/dist/vendor/Cache/EntryStats/definition.d.ts +17 -0
- package/dist/vendor/Cache/EntryStats/definition.d.ts.map +1 -0
- package/dist/vendor/Cache/EntryStats/definition.js +4 -0
- package/dist/vendor/Cache/EntryStats.d.ts +2 -0
- package/dist/vendor/Cache/EntryStats.d.ts.map +1 -0
- package/dist/vendor/Cache/EntryStats.js +3 -0
- package/dist/vendor/Cache/Lookup/definition.d.ts +17 -0
- package/dist/vendor/Cache/Lookup/definition.d.ts.map +1 -0
- package/dist/vendor/Cache/Lookup/definition.js +2 -0
- package/dist/vendor/Cache/Lookup.d.ts +2 -0
- package/dist/vendor/Cache/Lookup.d.ts.map +1 -0
- package/dist/vendor/Cache/Lookup.js +3 -0
- package/dist/vendor/Cache/index.d.ts +5 -0
- package/dist/vendor/Cache/index.d.ts.map +1 -0
- package/dist/vendor/Cache/index.js +5 -0
- package/package.json +756 -0
- package/tsconfig.json +107 -0
- package/tsconfig.json.bak +47 -0
- package/tsplus.config.json +6 -0
- package/types/modules.d.ts +1 -0
- package/vitest.config.ts +5 -0
- package/wallaby.cjs +1 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
// Update = Must return updated items
|
|
2
|
+
// Modify = Must `set` updated items, and can return anything.
|
|
3
|
+
import type { InvalidStateError, OptimisticConcurrencyException } from "../errors.js"
|
|
4
|
+
import { NotFoundError } from "../errors.js"
|
|
5
|
+
import type { RequestContext } from "../lib/RequestContext.js"
|
|
6
|
+
import { ContextMap} from "../services/Store.js";
|
|
7
|
+
import type { Filter } from "../services/Store.js"
|
|
8
|
+
import type { FixEnv, PureLogT} from "@effect-app/prelude/_ext/Pure";
|
|
9
|
+
import { Pure } from "@effect-app/prelude/_ext/Pure"
|
|
10
|
+
import type { ParserEnv } from "@effect-app/schema/custom/Parser"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @tsplus type Repository
|
|
14
|
+
*/
|
|
15
|
+
export interface Repository<T extends { id: Id }, PM extends { id: string }, Evt, Id extends string, ItemType extends string> {
|
|
16
|
+
itemType: ItemType
|
|
17
|
+
find: (id: Id) => Effect<ContextMap | RequestContext, never, Opt<T>>
|
|
18
|
+
all: Effect<ContextMap, never, Chunk<T>>
|
|
19
|
+
save: (
|
|
20
|
+
items: Iterable<T>,
|
|
21
|
+
events?: Iterable<Evt>
|
|
22
|
+
) => Effect<ContextMap | RequestContext, InvalidStateError | OptimisticConcurrencyException, void>
|
|
23
|
+
utils: {
|
|
24
|
+
mapReverse: (
|
|
25
|
+
pm: PM,
|
|
26
|
+
setEtag: (id: string, eTag: string | undefined) => void
|
|
27
|
+
) => unknown, // TODO
|
|
28
|
+
parse: (a: unknown, env?: ParserEnv | undefined) => T,
|
|
29
|
+
all: Effect<never, never, Chunk<PM>>,
|
|
30
|
+
filter: (filter: Filter<PM>, cursor?: { limit?: number, skip?: number}) => Effect<never, never, Chunk<PM>>
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface PureDSL<S, S2, W> {
|
|
35
|
+
get: ReturnType<typeof Pure.get<S>>, set: typeof Pure.set<S2>, log: (...w: W[]) => PureLogT<W>
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const AnyPureDSL: PureDSL<any, any, any> = { get: Pure.get(), set: Pure.set, log: (...evt: any[]) => Pure.logMany(evt) }
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @tsplus fluent Repository get
|
|
42
|
+
*/
|
|
43
|
+
export function get<
|
|
44
|
+
Id extends string,
|
|
45
|
+
T extends { id: Id },
|
|
46
|
+
PM extends { id: string },
|
|
47
|
+
Evt,
|
|
48
|
+
ItemType extends string
|
|
49
|
+
>(
|
|
50
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
51
|
+
id: Id
|
|
52
|
+
) {
|
|
53
|
+
return self.find(id).flatMap(_ => _.encaseInEffect(() => new NotFoundError(self.itemType, id)))
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @tsplus fluent Repository filter
|
|
58
|
+
*/
|
|
59
|
+
export function filter<
|
|
60
|
+
Id extends string,
|
|
61
|
+
T extends { id: Id },
|
|
62
|
+
PM extends { id: string },
|
|
63
|
+
Evt,
|
|
64
|
+
ItemType extends string,
|
|
65
|
+
>(self: Repository<T, PM, Evt, Id, ItemType>, filter: Predicate<T>) {
|
|
66
|
+
return self.all.map(_ => _.filter(filter))
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @tsplus fluent Repository filterAll
|
|
71
|
+
*/
|
|
72
|
+
export function filterAll<
|
|
73
|
+
Id extends string,
|
|
74
|
+
T extends { id: Id },
|
|
75
|
+
PM extends { id: string },
|
|
76
|
+
Evt,
|
|
77
|
+
ItemType extends string,
|
|
78
|
+
S extends T,
|
|
79
|
+
>(self: Repository<T, PM, Evt, Id, ItemType>, map: (items: Chunk<T>) => Chunk<S>) {
|
|
80
|
+
return self.all.map(map)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @tsplus fluent Repository collect
|
|
86
|
+
*/
|
|
87
|
+
export function collect<
|
|
88
|
+
Id extends string,
|
|
89
|
+
T extends { id: Id },
|
|
90
|
+
PM extends { id: string },
|
|
91
|
+
Evt,
|
|
92
|
+
ItemType extends string,
|
|
93
|
+
S extends T,
|
|
94
|
+
>(self: Repository<T, PM, Evt, Id, ItemType>, collect: (item: T) => Opt<S>) {
|
|
95
|
+
return self.all.map(_ => _.filterMap(collect))
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @tsplus getter Repository log
|
|
100
|
+
*/
|
|
101
|
+
export function log<
|
|
102
|
+
Id extends string,
|
|
103
|
+
T extends { id: Id },
|
|
104
|
+
PM extends { id: string },
|
|
105
|
+
Evt,
|
|
106
|
+
ItemType extends string
|
|
107
|
+
>(_: Repository<T, PM, Evt, Id, ItemType>) {
|
|
108
|
+
return (evt: Evt) => AnyPureDSL.log(evt)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* TODO: project inside the db.
|
|
113
|
+
* @tsplus fluent Repository projectEffect
|
|
114
|
+
*/
|
|
115
|
+
export function projectEffect<
|
|
116
|
+
Id extends string,
|
|
117
|
+
T extends { id: Id },
|
|
118
|
+
PM extends { id: string },
|
|
119
|
+
Evt,
|
|
120
|
+
ItemType extends string,
|
|
121
|
+
S,
|
|
122
|
+
R,
|
|
123
|
+
E
|
|
124
|
+
>(
|
|
125
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
126
|
+
map: Effect<R, E, { filter?: Filter<PM>; collect: (t: PM) => Opt<S>; limit?: number; skip?: number }>
|
|
127
|
+
) {
|
|
128
|
+
// TODO: a projection that gets sent to the db instead.
|
|
129
|
+
return map.flatMap(f =>
|
|
130
|
+
(f.filter ? self.utils.filter(f.filter, { limit: f.limit, skip: f.skip}) : self.utils.all)
|
|
131
|
+
.map(_ => _.filterMap(f.collect))
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* TODO: project inside the db.
|
|
137
|
+
* @tsplus fluent Repository project
|
|
138
|
+
*/
|
|
139
|
+
export function project<
|
|
140
|
+
Id extends string,
|
|
141
|
+
T extends { id: Id },
|
|
142
|
+
PM extends { id: string },
|
|
143
|
+
Evt,
|
|
144
|
+
ItemType extends string,
|
|
145
|
+
S,
|
|
146
|
+
>(
|
|
147
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
148
|
+
map: { filter?: Filter<PM>; collect: (t: PM) => Opt<S>; limit?: number; skip?: number }
|
|
149
|
+
) {
|
|
150
|
+
return self.projectEffect(Effect(map))
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* @tsplus fluent Repository queryEffect
|
|
156
|
+
*/
|
|
157
|
+
export function queryEffect<
|
|
158
|
+
Id extends string,
|
|
159
|
+
T extends { id: Id },
|
|
160
|
+
PM extends { id: string },
|
|
161
|
+
Evt,
|
|
162
|
+
ItemType extends string,
|
|
163
|
+
R,
|
|
164
|
+
E,
|
|
165
|
+
S,
|
|
166
|
+
>(
|
|
167
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
168
|
+
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
169
|
+
map: Effect<R, E, { filter?: Filter<PM>; collect: (t: T) => Opt<S>; limit?: number; skip?: number }>
|
|
170
|
+
) {
|
|
171
|
+
return map.flatMap(f =>
|
|
172
|
+
(f.filter ? self.utils.filter(f.filter, { limit: f.limit, skip: f.skip}) : self.utils.all)
|
|
173
|
+
.flatMap(items =>
|
|
174
|
+
Do($ => {
|
|
175
|
+
const { set } = $(Effect.service(ContextMap))
|
|
176
|
+
return items.map(_ => self.utils.mapReverse(_, set))
|
|
177
|
+
})
|
|
178
|
+
)
|
|
179
|
+
.map(_ => _.map(_ => self.utils.parse(_)))
|
|
180
|
+
.map(_ => _.filterMap(f.collect))
|
|
181
|
+
)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* @tsplus fluent Repository queryOneEffect
|
|
186
|
+
*/
|
|
187
|
+
export function queryOneEffect<
|
|
188
|
+
Id extends string,
|
|
189
|
+
T extends { id: Id },
|
|
190
|
+
PM extends { id: string },
|
|
191
|
+
Evt,
|
|
192
|
+
ItemType extends string,
|
|
193
|
+
R,
|
|
194
|
+
E,
|
|
195
|
+
S,
|
|
196
|
+
>(
|
|
197
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
198
|
+
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
199
|
+
map: Effect<R, E, { filter?: Filter<PM>; collect: (t: T) => Opt<S> }>
|
|
200
|
+
) {
|
|
201
|
+
return map.flatMap(f =>
|
|
202
|
+
(f.filter ? self.utils.filter(f.filter, { limit: 1 }) : self.utils.all)
|
|
203
|
+
.flatMap(items =>
|
|
204
|
+
Do($ => {
|
|
205
|
+
const { set } = $(Effect.service(ContextMap))
|
|
206
|
+
return items.map(_ => self.utils.mapReverse(_, set))
|
|
207
|
+
})
|
|
208
|
+
)
|
|
209
|
+
.map(_ => _.map(_ => self.utils.parse(_)))
|
|
210
|
+
.flatMap(_ => _.filterMap(f.collect).toNonEmptyArray.encaseInEffect(() => new NotFoundError(self.itemType, JSON.stringify(f.filter))).map(_ => _[0]))
|
|
211
|
+
)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* @tsplus fluent Repository query
|
|
216
|
+
*/
|
|
217
|
+
export function query<
|
|
218
|
+
Id extends string,
|
|
219
|
+
T extends { id: Id },
|
|
220
|
+
PM extends { id: string },
|
|
221
|
+
Evt,
|
|
222
|
+
ItemType extends string,
|
|
223
|
+
S,
|
|
224
|
+
>(
|
|
225
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
226
|
+
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
227
|
+
map: { filter?: Filter<PM>; collect: (t: T) => Opt<S>; limit?: number; skip?: number }
|
|
228
|
+
) {
|
|
229
|
+
return self.queryEffect(Effect(map))
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* @tsplus fluent Repository queryOne
|
|
234
|
+
*/
|
|
235
|
+
export function queryOne<
|
|
236
|
+
Id extends string,
|
|
237
|
+
T extends { id: Id },
|
|
238
|
+
PM extends { id: string },
|
|
239
|
+
Evt,
|
|
240
|
+
ItemType extends string,
|
|
241
|
+
S,
|
|
242
|
+
>(
|
|
243
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
244
|
+
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
245
|
+
map: { filter?: Filter<PM>; collect: (t: T) => Opt<S> }
|
|
246
|
+
) {
|
|
247
|
+
return self.queryOneEffect(Effect(map))
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* @tsplus fluent Repository queryAndSavePureEffect
|
|
252
|
+
*/
|
|
253
|
+
export function queryAndSavePureEffect<
|
|
254
|
+
Id extends string,
|
|
255
|
+
T extends { id: Id },
|
|
256
|
+
PM extends { id: string },
|
|
257
|
+
Evt,
|
|
258
|
+
ItemType extends string,
|
|
259
|
+
R,
|
|
260
|
+
E,
|
|
261
|
+
S extends T = T,
|
|
262
|
+
>(
|
|
263
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
264
|
+
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
265
|
+
map: Effect<R, E, { filter: Filter<PM>; collect: (t: T) => Opt<S>; limit?: number; skip?: number }>
|
|
266
|
+
) {
|
|
267
|
+
return <R2, A, E2, S2 extends T>(pure: Effect<FixEnv<R2, Evt, Chunk<S>, Iterable<S2>>, E2, A>) =>
|
|
268
|
+
queryEffect(self, map)
|
|
269
|
+
.flatMap(_ => self.saveManyWithPure_(_, pure))
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* @tsplus fluent Repository queryAndSavePure
|
|
274
|
+
*/
|
|
275
|
+
export function queryAndSavePure<
|
|
276
|
+
Id extends string,
|
|
277
|
+
T extends { id: Id },
|
|
278
|
+
PM extends { id: string },
|
|
279
|
+
Evt,
|
|
280
|
+
ItemType extends string,
|
|
281
|
+
S extends T = T,
|
|
282
|
+
>(
|
|
283
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
284
|
+
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
285
|
+
map: { filter: Filter<PM>; collect: (t: T) => Opt<S>; limit?: number; skip?: number }
|
|
286
|
+
) {
|
|
287
|
+
return self.queryAndSavePureEffect(Effect(map))
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* @tsplus getter Repository saveManyWithPure
|
|
292
|
+
*/
|
|
293
|
+
export function saveManyWithPure<
|
|
294
|
+
Id extends string,
|
|
295
|
+
T extends { id: Id },
|
|
296
|
+
PM extends { id: string },
|
|
297
|
+
Evt,
|
|
298
|
+
ItemType extends string
|
|
299
|
+
>(self: Repository<T, PM, Evt, Id, ItemType>) {
|
|
300
|
+
return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<FixEnv<R, Evt, Chunk<S1>, Iterable<S2>>, E, A>) =>
|
|
301
|
+
(items: Iterable<S1>) => saveManyWithPure_(self, items, pure)
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* @tsplus fluent Repository byIdAndSaveWithPure
|
|
306
|
+
*/
|
|
307
|
+
export function byIdAndSaveWithPure<
|
|
308
|
+
Id extends string,
|
|
309
|
+
T extends { id: Id },
|
|
310
|
+
PM extends { id: string },
|
|
311
|
+
Evt,
|
|
312
|
+
ItemType extends string
|
|
313
|
+
>(self: Repository<T, PM, Evt, Id, ItemType>, id: Id) {
|
|
314
|
+
return <R, A, E, S2 extends T>(pure: Effect<FixEnv<R, Evt, T, S2>, E, A>) => get(self, id).flatMap(item => saveWithPure_(self, item, pure))
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* NOTE: it's not as composable, only useful when the request is simple, and only this part needs request args.
|
|
319
|
+
* @tsplus getter Repository handleByIdAndSaveWithPure
|
|
320
|
+
*/
|
|
321
|
+
export function handleByIdAndSaveWithPure<
|
|
322
|
+
Id extends string,
|
|
323
|
+
T extends { id: Id },
|
|
324
|
+
PM extends { id: string },
|
|
325
|
+
Evt,
|
|
326
|
+
ItemType extends string,
|
|
327
|
+
>(self: Repository<T, PM, Evt, Id, ItemType>) {
|
|
328
|
+
return <Req extends { id: Id }, Context, R, A, E, S2 extends T>(pure: (req: Req, ctx: Context) => Effect<FixEnv<R, Evt, T, S2>, E, A>) => (req: Req, ctx: Context) => byIdAndSaveWithPure(self, req.id)(pure(req, ctx))
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* @tsplus fluent Repository saveManyWithPure_
|
|
333
|
+
*/
|
|
334
|
+
export function saveManyWithPure_<
|
|
335
|
+
Id extends string,
|
|
336
|
+
R,
|
|
337
|
+
T extends { id: Id },
|
|
338
|
+
PM extends { id: string },
|
|
339
|
+
A,
|
|
340
|
+
E,
|
|
341
|
+
Evt,
|
|
342
|
+
S1 extends T,
|
|
343
|
+
S2 extends T,
|
|
344
|
+
ItemType extends string
|
|
345
|
+
>(
|
|
346
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
347
|
+
items: Iterable<S1>,
|
|
348
|
+
pure: Effect<FixEnv<R, Evt, Chunk<S1>, Iterable<S2>>, E, A>
|
|
349
|
+
) {
|
|
350
|
+
return saveAllWithEffectInt(
|
|
351
|
+
self,
|
|
352
|
+
pure.runTerm(items.toChunk)
|
|
353
|
+
)
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* @tsplus fluent Repository saveWithPure_
|
|
358
|
+
*/
|
|
359
|
+
export function saveWithPure_<
|
|
360
|
+
Id extends string,
|
|
361
|
+
R,
|
|
362
|
+
T extends { id: Id },
|
|
363
|
+
PM extends { id: string },
|
|
364
|
+
A,
|
|
365
|
+
E,
|
|
366
|
+
Evt,
|
|
367
|
+
S1 extends T,
|
|
368
|
+
S2 extends T,
|
|
369
|
+
ItemType extends string
|
|
370
|
+
>(
|
|
371
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
372
|
+
item: S1,
|
|
373
|
+
pure: Effect<FixEnv<R, Evt, S1, S2>, E, A>
|
|
374
|
+
) {
|
|
375
|
+
return saveAllWithEffectInt(
|
|
376
|
+
self,
|
|
377
|
+
pure.runTerm(item)
|
|
378
|
+
.map(([item, events, a]) => [[item], events, a])
|
|
379
|
+
)
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
function saveAllWithEffectInt<
|
|
383
|
+
Id extends string,
|
|
384
|
+
T extends { id: Id },
|
|
385
|
+
PM extends { id: string },
|
|
386
|
+
P extends T,
|
|
387
|
+
Evt,
|
|
388
|
+
ItemType extends string,
|
|
389
|
+
R,
|
|
390
|
+
E,
|
|
391
|
+
A
|
|
392
|
+
>(
|
|
393
|
+
self: Repository<T, PM, Evt, Id, ItemType>,
|
|
394
|
+
gen: Effect<R, E, readonly [Iterable<P>, Iterable<Evt>, A]>
|
|
395
|
+
) {
|
|
396
|
+
return gen
|
|
397
|
+
.flatMap(
|
|
398
|
+
([items, events, a]) =>
|
|
399
|
+
self.save(items, events)
|
|
400
|
+
.map(() => a)
|
|
401
|
+
)
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const anyDSL = makeDSL<any, any, any>()
|
|
405
|
+
|
|
406
|
+
export type AllDSL<T, Evt> =
|
|
407
|
+
(<R, A, E, S1 extends T, S2 extends T>(pure: (dsl: PureDSL<Chunk<S1>, Iterable<S2>, Evt>) => Effect<R, E, A>) => Effect<FixEnv<R, Evt, Chunk<S1>, Iterable<S2>>, E, A>)
|
|
408
|
+
& AllDSLExt<T, Evt>
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* @tsplus type DSLExt
|
|
413
|
+
*/
|
|
414
|
+
export interface AllDSLExt<T, Evt> {
|
|
415
|
+
modify: <R, E, A, S1 extends T, S2 extends T>(pure: (items: Chunk<S1>, dsl: PureDSL<Chunk<S1>, Iterable<S2>, Evt>) => Effect<R, E, A>) => Effect<FixEnv<R, Evt, Chunk<S1>, Iterable<S2>>, E, A>;
|
|
416
|
+
update: <R, E, S1 extends T, S2 extends T>(pure: (items: Chunk<S1>, log: (...evt: Evt[]) => PureLogT<Evt>) => Effect<R, E, Iterable<S2>>) => Effect<FixEnv<R, Evt, Chunk<S1>, Iterable<S2>>, E, Iterable<S2>>;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
export function makeAllDSL<T, Evt>() {
|
|
420
|
+
const dsl: AllDSL<T, Evt> = anyDSL
|
|
421
|
+
return dsl
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
export type OneDSL<T, Evt> =
|
|
425
|
+
(<R, A, E, S1 extends T, S2 extends T>(pure: (dsl: PureDSL<S1, S2, Evt>) => Effect<FixEnv<R, Evt, S1, S2>, E, A>) => Effect<FixEnv<R, Evt, S1, S2>, E, A>)
|
|
426
|
+
& OneDSLExt<T, Evt>
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* @tsplus type DSLExt
|
|
431
|
+
*/
|
|
432
|
+
export interface OneDSLExt<T, Evt> {
|
|
433
|
+
modify: <R, E, A, S1 extends T, S2 extends T>(pure: (items: S1, dsl: PureDSL<S1, S2, Evt>) => Effect<FixEnv<R, Evt, S1, S2>, E, A>) => Effect<FixEnv<R, Evt, S1, S2> | PureEnvEnv<Evt, S1, S1>, E, A>;
|
|
434
|
+
update: <R, E, S1 extends T, S2 extends T>(pure: (items: S1, log: (...evt: Evt[]) => PureLogT<Evt>) => Effect<FixEnv<R, Evt, S1, S2>, E, S2>) => Effect<FixEnv<R, Evt, S1, S2>, E, S2>;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* @tsplus fluent DSLExt updateWith
|
|
439
|
+
*/
|
|
440
|
+
export function updateWithOne<T, Evt, S1 extends T, S2 extends T>(self: OneDSL<T, Evt>, upd: (item: S1) => S2) {
|
|
441
|
+
return self.update((_: S1) => Effect(upd(_)))
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* @tsplus fluent DSLExt updateWith
|
|
446
|
+
*/
|
|
447
|
+
export function updateWith<T, Evt, S1 extends T, S2 extends T>(self: AllDSL<T, Evt>, upd: (item: Chunk<S1>) => Iterable<S2>) {
|
|
448
|
+
return self.update((_: Chunk<S1>) => Effect(upd(_)))
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
export function makeOneDSL<T, Evt>(): OneDSL<T, Evt> {
|
|
452
|
+
return anyDSL
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
export function makeDSL<S1, S2, Evt>() {
|
|
456
|
+
const dsl: PureDSL<S1, S2, Evt> = AnyPureDSL
|
|
457
|
+
|
|
458
|
+
function modify<
|
|
459
|
+
R,
|
|
460
|
+
E,
|
|
461
|
+
A
|
|
462
|
+
>(
|
|
463
|
+
pure: (
|
|
464
|
+
items: S1,
|
|
465
|
+
dsl: PureDSL<S1, S2, Evt>
|
|
466
|
+
) => Effect<R, E, A>
|
|
467
|
+
): Effect<FixEnv<R, Evt, S1, S2>, E, A> {
|
|
468
|
+
return dsl.get.flatMap(items => pure(items, dsl)) as any
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
function update<
|
|
472
|
+
R,
|
|
473
|
+
E
|
|
474
|
+
>(
|
|
475
|
+
pure: (
|
|
476
|
+
items: S1,
|
|
477
|
+
log: (...evt: Evt[]) => PureLogT<Evt>
|
|
478
|
+
) => Effect<R, E, S2>
|
|
479
|
+
): Effect<FixEnv<R, Evt, S1, S2>, E, S2> {
|
|
480
|
+
return dsl.get.flatMap(items => pure(items, dsl.log).tap(dsl.set)) as any
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
function withDSL<
|
|
484
|
+
R,
|
|
485
|
+
A,
|
|
486
|
+
E
|
|
487
|
+
>(
|
|
488
|
+
pure: (dsl: PureDSL<S1, S2, Evt>) => Effect<R, E, A>
|
|
489
|
+
): Effect<FixEnv<R, Evt, S1, S2>, E, A> {
|
|
490
|
+
return pure(AnyPureDSL) as any
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
return Object.assign(
|
|
494
|
+
withDSL, {
|
|
495
|
+
modify,
|
|
496
|
+
update,
|
|
497
|
+
}
|
|
498
|
+
)
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
export interface DSLExt<S1, S2, Evt> extends ReturnType<typeof makeDSL<S1, S2, Evt>> { }
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
export function ifAny<T, R, E, A>(fn: (items: NonEmptyReadonlyArray<T>) => Effect<R, E, A>) {
|
|
505
|
+
return (items: Iterable<T>) => Effect(items.toNonEmptyArray).flatMapOpt(fn)
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* @tsplus fluent Iterable ifAny
|
|
510
|
+
*/
|
|
511
|
+
export function ifAny_<T, R, E, A>(items: Iterable<T>, fn: (items: NonEmptyReadonlyArray<T>) => Effect<R, E, A>) {
|
|
512
|
+
return Effect(items.toNonEmptyArray).flatMapOpt(fn)
|
|
513
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
OperationOptionsBase,
|
|
3
|
+
ProcessErrorArgs,
|
|
4
|
+
ServiceBusMessage,
|
|
5
|
+
ServiceBusMessageBatch,
|
|
6
|
+
ServiceBusReceivedMessage,
|
|
7
|
+
ServiceBusReceiver,
|
|
8
|
+
ServiceBusSender
|
|
9
|
+
} from "@azure/service-bus"
|
|
10
|
+
import { ServiceBusClient } from "@azure/service-bus"
|
|
11
|
+
|
|
12
|
+
function makeClient(url: string) {
|
|
13
|
+
return Effect(() => new ServiceBusClient(url)).acquireRelease(
|
|
14
|
+
client => Effect.promise(() => client.close())
|
|
15
|
+
)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const Client = Tag<ServiceBusClient>()
|
|
19
|
+
export const LiveServiceBusClient = (url: string) => makeClient(url).toScopedLayer(Client)
|
|
20
|
+
|
|
21
|
+
function makeSender(queueName: string) {
|
|
22
|
+
return Effect.gen(function*($) {
|
|
23
|
+
const serviceBusClient = yield* $(Client.access)
|
|
24
|
+
|
|
25
|
+
return yield* $(
|
|
26
|
+
Effect(() => serviceBusClient.createSender(queueName)).acquireRelease(
|
|
27
|
+
subscription => Effect.promise(() => subscription.close())
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
export const Sender = Tag<ServiceBusSender>()
|
|
33
|
+
|
|
34
|
+
export function LiveSender(queueName: string) {
|
|
35
|
+
return makeSender(queueName).toScopedLayer(Sender)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function makeReceiver(queueName: string) {
|
|
39
|
+
return Effect.gen(function*($) {
|
|
40
|
+
const serviceBusClient = yield* $(Client.access)
|
|
41
|
+
|
|
42
|
+
return yield* $(
|
|
43
|
+
Effect(() => serviceBusClient.createReceiver(queueName)).acquireRelease(
|
|
44
|
+
r => Effect.promise(() => r.close())
|
|
45
|
+
)
|
|
46
|
+
)
|
|
47
|
+
})
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const Receiver = Tag<ServiceBusReceiver>()
|
|
51
|
+
export function LiveReceiver(queueName: string) {
|
|
52
|
+
return makeReceiver(queueName).toScopedLayer(Receiver)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function sendMessages(
|
|
56
|
+
messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
|
|
57
|
+
options?: OperationOptionsBase
|
|
58
|
+
) {
|
|
59
|
+
return Effect.gen(function*($) {
|
|
60
|
+
const s = yield* $(Sender.access)
|
|
61
|
+
return yield* $(Effect.promise(() => s.sendMessages(messages, options)))
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function subscribe<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>) {
|
|
66
|
+
return Effect.gen(function*($) {
|
|
67
|
+
const r = yield* $(Receiver.access)
|
|
68
|
+
|
|
69
|
+
const env = yield* $(Effect.environment<RMsg | RErr>())
|
|
70
|
+
|
|
71
|
+
yield* $(
|
|
72
|
+
Effect(() =>
|
|
73
|
+
r.subscribe({
|
|
74
|
+
processError: err =>
|
|
75
|
+
hndlr.processError(err)
|
|
76
|
+
.provideEnvironment(env)
|
|
77
|
+
.unsafeRunPromise
|
|
78
|
+
.catch(console.error),
|
|
79
|
+
processMessage: msg =>
|
|
80
|
+
hndlr.processMessage(msg)
|
|
81
|
+
.provideEnvironment(env)
|
|
82
|
+
.unsafeRunPromise
|
|
83
|
+
// DO NOT CATCH ERRORS here as they should return to the queue!
|
|
84
|
+
})
|
|
85
|
+
).acquireRelease(
|
|
86
|
+
subscription => Effect.promise(() => subscription.close())
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const SubscribeTag = Tag<Effect.Success<ReturnType<typeof subscribe>>>()
|
|
93
|
+
|
|
94
|
+
export function Subscription<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>) {
|
|
95
|
+
return subscribe(hndlr).toScopedLayer(SubscribeTag)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface MessageHandlers<RMsg, RErr> {
|
|
99
|
+
/**
|
|
100
|
+
* Handler that processes messages from service bus.
|
|
101
|
+
*
|
|
102
|
+
* @param message - A message received from Service Bus.
|
|
103
|
+
*/
|
|
104
|
+
processMessage(message: ServiceBusReceivedMessage): Effect<RMsg, never, void>
|
|
105
|
+
/**
|
|
106
|
+
* Handler that processes errors that occur during receiving.
|
|
107
|
+
* @param args - The error and additional context to indicate where
|
|
108
|
+
* the error originated.
|
|
109
|
+
*/
|
|
110
|
+
processError(args: ProcessErrorArgs): Effect<RErr, never, void>
|
|
111
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { StoreWhereFilter, Where } from "@effect-app/infra/services/Store"
|
|
2
|
+
import { expect, test } from "vitest"
|
|
3
|
+
import { makeFilters } from "../../lib/filter.js"
|
|
4
|
+
import { buildWhereCosmosQuery } from "./Cosmos.js"
|
|
5
|
+
|
|
6
|
+
const f_ = makeFilters<Something>()
|
|
7
|
+
export type SomethingWhereFilter = typeof f_
|
|
8
|
+
|
|
9
|
+
export function makeSomethingFilter_(filter: (f: SomethingWhereFilter) => StoreWhereFilter) {
|
|
10
|
+
return filter(f_)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function somethingsWhere(
|
|
14
|
+
makeWhere: (
|
|
15
|
+
f: SomethingWhereFilter
|
|
16
|
+
) => Where | [Where, ...Where[]],
|
|
17
|
+
mode?: "or" | "and"
|
|
18
|
+
) {
|
|
19
|
+
return makeSomethingFilter_(f => {
|
|
20
|
+
const m = makeWhere ? makeWhere(f) : []
|
|
21
|
+
return ({
|
|
22
|
+
mode,
|
|
23
|
+
where: (Array.isArray(m) ? m as unknown as [Where, ...Where[]] : [m]) as readonly [Where, ...Where[]]
|
|
24
|
+
})
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
type SomethingElse = {
|
|
29
|
+
a: string
|
|
30
|
+
b: number
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
type Something = {
|
|
34
|
+
a: number
|
|
35
|
+
id: string
|
|
36
|
+
b: string
|
|
37
|
+
c: readonly string[]
|
|
38
|
+
d: readonly SomethingElse[]
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
test("works", () => {
|
|
42
|
+
expect(buildWhereCosmosQuery(
|
|
43
|
+
somethingsWhere(_ => _("b", _ => "b2")),
|
|
44
|
+
"Somethings",
|
|
45
|
+
"importedMarkerId",
|
|
46
|
+
undefined,
|
|
47
|
+
10
|
|
48
|
+
)).toEqual({
|
|
49
|
+
"parameters": [
|
|
50
|
+
{
|
|
51
|
+
"name": "@id",
|
|
52
|
+
"value": "importedMarkerId"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "@v0",
|
|
56
|
+
"value": "b2"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"query": `
|
|
60
|
+
SELECT f
|
|
61
|
+
FROM Somethings AS f
|
|
62
|
+
|
|
63
|
+
WHERE f.id != @id AND LOWER(f.b) = LOWER(@v0)
|
|
64
|
+
OFFSET 0 LIMIT 10`
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
expect(buildWhereCosmosQuery(
|
|
68
|
+
somethingsWhere(_ => _("d.-1.a", _ => _.$isnt("a2"))),
|
|
69
|
+
"Somethings",
|
|
70
|
+
"importedMarkerId",
|
|
71
|
+
undefined,
|
|
72
|
+
10
|
|
73
|
+
)).toEqual({
|
|
74
|
+
"parameters": [
|
|
75
|
+
{
|
|
76
|
+
"name": "@id",
|
|
77
|
+
"value": "importedMarkerId"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "@v0",
|
|
81
|
+
"value": "a2"
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"query": `
|
|
85
|
+
SELECT f
|
|
86
|
+
FROM Somethings AS f
|
|
87
|
+
JOIN d IN f.d
|
|
88
|
+
WHERE f.id != @id AND LOWER(d.a) <> LOWER(@v0)
|
|
89
|
+
OFFSET 0 LIMIT 10`
|
|
90
|
+
})
|
|
91
|
+
})
|