@effect-app/infra 4.0.0-beta.24 → 4.0.0-beta.240
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 +1811 -0
- package/_check.sh +1 -1
- package/dist/CUPS.d.ts +12 -7
- package/dist/CUPS.d.ts.map +1 -1
- package/dist/CUPS.js +16 -12
- package/dist/Emailer/Sendgrid.d.ts +15 -15
- package/dist/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/Emailer/Sendgrid.js +21 -17
- package/dist/Emailer/fake.d.ts +1 -1
- package/dist/Emailer/fake.js +3 -3
- package/dist/Emailer/service.d.ts +13 -4
- package/dist/Emailer/service.d.ts.map +1 -1
- package/dist/Emailer/service.js +4 -3
- package/dist/Emailer.d.ts +1 -1
- package/dist/MainFiberSet.d.ts +12 -9
- package/dist/MainFiberSet.d.ts.map +1 -1
- package/dist/MainFiberSet.js +10 -6
- package/dist/Model/Repository/Registry.d.ts +21 -0
- package/dist/Model/Repository/Registry.d.ts.map +1 -0
- package/dist/Model/Repository/Registry.js +18 -0
- package/dist/Model/Repository/ext.d.ts +35 -16
- package/dist/Model/Repository/ext.d.ts.map +1 -1
- package/dist/Model/Repository/ext.js +60 -3
- package/dist/Model/Repository/internal/internal.d.ts +9 -6
- package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
- package/dist/Model/Repository/internal/internal.js +141 -59
- package/dist/Model/Repository/legacy.d.ts +4 -2
- package/dist/Model/Repository/legacy.d.ts.map +1 -1
- package/dist/Model/Repository/makeRepo.d.ts +10 -6
- package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
- package/dist/Model/Repository/makeRepo.js +5 -2
- package/dist/Model/Repository/service.d.ts +32 -24
- package/dist/Model/Repository/service.d.ts.map +1 -1
- package/dist/Model/Repository/validation.d.ts +47 -18
- package/dist/Model/Repository/validation.d.ts.map +1 -1
- package/dist/Model/Repository/validation.js +6 -6
- package/dist/Model/Repository.d.ts +2 -1
- package/dist/Model/Repository.d.ts.map +1 -1
- package/dist/Model/Repository.js +2 -1
- package/dist/Model/dsl.d.ts +6 -5
- package/dist/Model/dsl.d.ts.map +1 -1
- package/dist/Model/dsl.js +2 -3
- package/dist/Model/filter/filterApi.d.ts +5 -5
- package/dist/Model/filter/filterApi.d.ts.map +1 -1
- package/dist/Model/filter/types/errors.d.ts +1 -1
- package/dist/Model/filter/types/fields.d.ts +1 -1
- package/dist/Model/filter/types/path/common.d.ts +1 -1
- package/dist/Model/filter/types/path/eager.d.ts +1 -1
- package/dist/Model/filter/types/path/eager.d.ts.map +1 -1
- package/dist/Model/filter/types/path/eager.js +1 -1
- package/dist/Model/filter/types/path/index.d.ts +1 -1
- package/dist/Model/filter/types/utils.d.ts +1 -1
- package/dist/Model/filter/types/validator.d.ts +1 -1
- package/dist/Model/filter/types.d.ts +5 -5
- package/dist/Model/query/dsl.d.ts +216 -18
- package/dist/Model/query/dsl.d.ts.map +1 -1
- package/dist/Model/query/dsl.js +240 -5
- package/dist/Model/query/new-kid-interpreter.d.ts +116 -8
- package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -1
- package/dist/Model/query/new-kid-interpreter.js +177 -6
- package/dist/Model/query.d.ts +1 -1
- package/dist/Model.d.ts +2 -1
- package/dist/Model.d.ts.map +1 -1
- package/dist/Model.js +2 -1
- package/dist/QueueMaker/SQLQueue.d.ts +7 -8
- package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
- package/dist/QueueMaker/SQLQueue.js +135 -117
- package/dist/QueueMaker/errors.d.ts +5 -3
- package/dist/QueueMaker/errors.d.ts.map +1 -1
- package/dist/QueueMaker/errors.js +4 -2
- package/dist/QueueMaker/memQueue.d.ts +9 -5
- package/dist/QueueMaker/memQueue.d.ts.map +1 -1
- package/dist/QueueMaker/memQueue.js +81 -65
- package/dist/QueueMaker/sbqueue.d.ts +8 -4
- package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/QueueMaker/sbqueue.js +57 -55
- package/dist/QueueMaker/service.d.ts +4 -2
- package/dist/QueueMaker/service.d.ts.map +1 -1
- package/dist/QueueMaker/service.js +1 -1
- package/dist/RequestContext.d.ts +75 -35
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/RequestContext.js +14 -14
- package/dist/RequestFiberSet.d.ts +10 -7
- package/dist/RequestFiberSet.d.ts.map +1 -1
- package/dist/RequestFiberSet.js +12 -7
- package/dist/Store/ContextMapContainer.d.ts +22 -3
- package/dist/Store/ContextMapContainer.d.ts.map +1 -1
- package/dist/Store/ContextMapContainer.js +18 -4
- package/dist/Store/Cosmos/query.d.ts +13 -2
- package/dist/Store/Cosmos/query.d.ts.map +1 -1
- package/dist/Store/Cosmos/query.js +179 -41
- package/dist/Store/Cosmos.d.ts +2 -2
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +343 -244
- package/dist/Store/Disk.d.ts +3 -3
- package/dist/Store/Disk.d.ts.map +1 -1
- package/dist/Store/Disk.js +76 -36
- package/dist/Store/Memory.d.ts +7 -4
- package/dist/Store/Memory.d.ts.map +1 -1
- package/dist/Store/Memory.js +327 -62
- package/dist/Store/SQL/Pg.d.ts +4 -0
- package/dist/Store/SQL/Pg.d.ts.map +1 -0
- package/dist/Store/SQL/Pg.js +233 -0
- package/dist/Store/SQL/query.d.ts +49 -0
- package/dist/Store/SQL/query.d.ts.map +1 -0
- package/dist/Store/SQL/query.js +527 -0
- package/dist/Store/SQL.d.ts +21 -0
- package/dist/Store/SQL.d.ts.map +1 -0
- package/dist/Store/SQL.js +450 -0
- package/dist/Store/codeFilter.d.ts +2 -2
- package/dist/Store/codeFilter.d.ts.map +1 -1
- package/dist/Store/codeFilter.js +6 -3
- package/dist/Store/index.d.ts +6 -3
- package/dist/Store/index.d.ts.map +1 -1
- package/dist/Store/index.js +18 -4
- package/dist/Store/service.d.ts +39 -9
- package/dist/Store/service.d.ts.map +1 -1
- package/dist/Store/service.js +31 -7
- package/dist/Store/utils.d.ts +3 -2
- package/dist/Store/utils.d.ts.map +1 -1
- package/dist/Store/utils.js +5 -5
- package/dist/Store.d.ts +1 -1
- package/dist/adapters/SQL/Model.d.ts +32 -43
- package/dist/adapters/SQL/Model.d.ts.map +1 -1
- package/dist/adapters/SQL/Model.js +30 -39
- package/dist/adapters/SQL.d.ts +1 -1
- package/dist/adapters/ServiceBus.d.ts +14 -11
- package/dist/adapters/ServiceBus.d.ts.map +1 -1
- package/dist/adapters/ServiceBus.js +30 -21
- package/dist/adapters/cosmos-client.d.ts +5 -3
- package/dist/adapters/cosmos-client.d.ts.map +1 -1
- package/dist/adapters/cosmos-client.js +6 -4
- package/dist/adapters/index.d.ts +8 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +8 -2
- package/dist/adapters/logger.d.ts +1 -1
- package/dist/adapters/logger.d.ts.map +1 -1
- package/dist/adapters/memQueue.d.ts +5 -3
- package/dist/adapters/memQueue.d.ts.map +1 -1
- package/dist/adapters/memQueue.js +6 -5
- package/dist/adapters/mongo-client.d.ts +4 -3
- package/dist/adapters/mongo-client.d.ts.map +1 -1
- package/dist/adapters/mongo-client.js +5 -3
- package/dist/adapters/redis-client.d.ts +6 -3
- package/dist/adapters/redis-client.d.ts.map +1 -1
- package/dist/adapters/redis-client.js +7 -3
- package/dist/api/ContextProvider.d.ts +12 -9
- package/dist/api/ContextProvider.d.ts.map +1 -1
- package/dist/api/ContextProvider.js +9 -7
- package/dist/api/codec.d.ts +1 -1
- package/dist/api/internal/RequestContextMiddleware.d.ts +3 -3
- package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
- package/dist/api/internal/RequestContextMiddleware.js +18 -7
- package/dist/api/internal/auth.d.ts +45 -7
- package/dist/api/internal/auth.d.ts.map +1 -1
- package/dist/api/internal/auth.js +162 -29
- package/dist/api/internal/events.d.ts +6 -4
- package/dist/api/internal/events.d.ts.map +1 -1
- package/dist/api/internal/events.js +18 -11
- package/dist/api/internal/health.d.ts +1 -1
- package/dist/api/layerUtils.d.ts +15 -7
- package/dist/api/layerUtils.d.ts.map +1 -1
- package/dist/api/layerUtils.js +7 -6
- package/dist/api/middlewares.d.ts +1 -1
- package/dist/api/reportError.d.ts +2 -2
- package/dist/api/reportError.d.ts.map +1 -1
- package/dist/api/reportError.js +3 -2
- package/dist/api/routing/middleware/RouterMiddleware.d.ts +5 -4
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.d.ts +42 -3
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.js +53 -17
- package/dist/api/routing/middleware.d.ts +3 -4
- package/dist/api/routing/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware.js +1 -2
- package/dist/api/routing/schema/jwt.d.ts +1 -1
- package/dist/api/routing/schema/jwt.d.ts.map +1 -1
- package/dist/api/routing/schema/jwt.js +3 -2
- package/dist/api/routing/tsort.d.ts +1 -1
- package/dist/api/routing/tsort.d.ts.map +1 -1
- package/dist/api/routing/utils.d.ts +4 -4
- package/dist/api/routing/utils.d.ts.map +1 -1
- package/dist/api/routing/utils.js +3 -2
- package/dist/api/routing.d.ts +84 -38
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +115 -45
- package/dist/api/setupRequest.d.ts +13 -6
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +37 -11
- package/dist/api/util.d.ts +1 -1
- package/dist/arbs.d.ts +2 -2
- package/dist/arbs.d.ts.map +1 -1
- package/dist/arbs.js +5 -3
- package/dist/errorReporter.d.ts +7 -5
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +22 -26
- package/dist/errors.d.ts +1 -1
- package/dist/fileUtil.d.ts +2 -2
- package/dist/fileUtil.d.ts.map +1 -1
- package/dist/fileUtil.js +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/logger/jsonLogger.d.ts +2 -2
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +4 -2
- package/dist/logger/logFmtLogger.d.ts +2 -2
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +2 -2
- package/dist/logger/shared.d.ts +2 -2
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +3 -3
- package/dist/logger.d.ts +2 -2
- package/dist/logger.d.ts.map +1 -1
- package/dist/otel.d.ts +75 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +65 -0
- package/dist/rateLimit.d.ts +12 -4
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +7 -12
- package/dist/test.d.ts +3 -3
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +2 -2
- package/dist/vitest.d.ts +1 -1
- package/examples/query.ts +46 -38
- package/package.json +46 -37
- package/src/CUPS.ts +15 -11
- package/src/Emailer/Sendgrid.ts +65 -57
- package/src/Emailer/fake.ts +2 -2
- package/src/Emailer/service.ts +13 -3
- package/src/MainFiberSet.ts +12 -10
- package/src/Model/Repository/Registry.ts +34 -0
- package/src/Model/Repository/ext.ts +103 -11
- package/src/Model/Repository/internal/internal.ts +266 -151
- package/src/Model/Repository/legacy.ts +3 -1
- package/src/Model/Repository/makeRepo.ts +15 -10
- package/src/Model/Repository/service.ts +35 -23
- package/src/Model/Repository/validation.ts +5 -5
- package/src/Model/Repository.ts +1 -0
- package/src/Model/dsl.ts +5 -4
- package/src/Model/filter/types/path/eager.ts +1 -2
- package/src/Model/filter/types.ts +4 -4
- package/src/Model/query/dsl.ts +456 -20
- package/src/Model/query/new-kid-interpreter.ts +281 -7
- package/src/Model.ts +1 -0
- package/src/QueueMaker/SQLQueue.ts +150 -153
- package/src/QueueMaker/errors.ts +3 -1
- package/src/QueueMaker/memQueue.ts +111 -105
- package/src/QueueMaker/sbqueue.ts +76 -88
- package/src/QueueMaker/service.ts +3 -1
- package/src/RequestContext.ts +15 -16
- package/src/RequestFiberSet.ts +12 -7
- package/src/Store/ContextMapContainer.ts +46 -3
- package/src/Store/Cosmos/query.ts +214 -50
- package/src/Store/Cosmos.ts +491 -350
- package/src/Store/Disk.ts +106 -66
- package/src/Store/Memory.ts +365 -91
- package/src/Store/SQL/Pg.ts +364 -0
- package/src/Store/SQL/query.ts +603 -0
- package/src/Store/SQL.ts +736 -0
- package/src/Store/codeFilter.ts +5 -2
- package/src/Store/index.ts +20 -3
- package/src/Store/service.ts +60 -11
- package/src/Store/utils.ts +25 -23
- package/src/adapters/SQL/Model.ts +42 -41
- package/src/adapters/ServiceBus.ts +131 -121
- package/src/adapters/cosmos-client.ts +5 -3
- package/src/adapters/index.ts +7 -0
- package/src/adapters/memQueue.ts +5 -4
- package/src/adapters/mongo-client.ts +4 -2
- package/src/adapters/redis-client.ts +6 -2
- package/src/api/ContextProvider.ts +19 -16
- package/src/api/internal/RequestContextMiddleware.ts +24 -6
- package/src/api/internal/auth.ts +248 -44
- package/src/api/internal/events.ts +21 -12
- package/src/api/layerUtils.ts +13 -9
- package/src/api/reportError.ts +2 -1
- package/src/api/routing/middleware/RouterMiddleware.ts +5 -4
- package/src/api/routing/middleware/middleware.ts +60 -15
- package/src/api/routing/middleware.ts +2 -4
- package/src/api/routing/schema/jwt.ts +2 -1
- package/src/api/routing/utils.ts +2 -1
- package/src/api/routing.ts +309 -139
- package/src/api/setupRequest.ts +63 -12
- package/src/arbs.ts +5 -3
- package/src/errorReporter.ts +65 -75
- package/src/fileUtil.ts +1 -1
- package/src/logger/jsonLogger.ts +3 -1
- package/src/logger/logFmtLogger.ts +1 -1
- package/src/logger/shared.ts +3 -2
- package/src/otel.ts +152 -0
- package/src/rateLimit.ts +34 -23
- package/src/test.ts +2 -2
- package/test/auth.test.ts +101 -0
- package/test/contextProvider.test.ts +14 -11
- package/test/controller.test.ts +25 -29
- package/test/cosmos-query.test.ts +159 -0
- package/test/dist/auth.test.d.ts.map +1 -0
- package/test/dist/contextProvider.test.d.ts.map +1 -1
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/cosmos-query.test.d.ts.map +1 -0
- package/test/dist/date-query.test.d.ts.map +1 -0
- package/test/dist/fixtures.d.ts +30 -12
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +17 -10
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/dist/rawQuery.test.d.ts.map +1 -1
- package/test/dist/repository-ext.test.d.ts.map +1 -0
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/router-generator.test.d.ts.map +1 -0
- package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
- package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
- package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
- package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
- package/test/dist/sql-store.test.d.ts.map +1 -0
- package/test/fixtures.ts +16 -9
- package/test/layerUtils.test.ts +1 -1
- package/test/query.test.ts +901 -38
- package/test/rawQuery.test.ts +338 -20
- package/test/repository-ext.test.ts +62 -0
- package/test/requires.test.ts +10 -5
- package/test/router-generator.test.ts +187 -0
- package/test/routing-interruptibility.test.ts +66 -0
- package/test/rpc-context-map-streaming.test.ts +262 -0
- package/test/rpc-e2e-invalidation.test.ts +256 -0
- package/test/rpc-multi-middleware.test.ts +84 -9
- package/test/rpc-stream-fullstack.test.ts +304 -0
- package/test/sql-store.test.ts +1711 -0
- package/test/validateSample.test.ts +17 -12
- package/tsconfig.examples.json +1 -1
- package/tsconfig.json +2 -1
- package/tsconfig.json.bak +2 -2
- package/tsconfig.src.json +35 -35
- package/tsconfig.test.json +2 -2
- package/dist/Operations.d.ts +0 -55
- package/dist/Operations.d.ts.map +0 -1
- package/dist/Operations.js +0 -102
- package/dist/OperationsRepo.d.ts +0 -41
- package/dist/OperationsRepo.d.ts.map +0 -1
- package/dist/OperationsRepo.js +0 -14
- package/eslint.config.mjs +0 -24
- package/src/Operations.ts +0 -235
- package/src/OperationsRepo.ts +0 -16
package/package.json
CHANGED
|
@@ -1,54 +1,52 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.240",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@faker-js/faker": "^8.4.1",
|
|
8
8
|
"change-case": "^5.4.4",
|
|
9
9
|
"cross-fetch": "^4.1.0",
|
|
10
|
-
"
|
|
11
|
-
"
|
|
10
|
+
"fast-check": "~4.7.0",
|
|
11
|
+
"jose": "^6.2.3",
|
|
12
12
|
"path-parser": "^6.1.0",
|
|
13
13
|
"proper-lockfile": "^4.1.2",
|
|
14
|
-
"pure-rand": "
|
|
14
|
+
"pure-rand": "8.4.0",
|
|
15
15
|
"query-string": "^9.3.1",
|
|
16
|
-
"effect-app": "4.0.0-beta.
|
|
16
|
+
"effect-app": "4.0.0-beta.240"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@azure/cosmos": "^4.9.
|
|
19
|
+
"@azure/cosmos": "^4.9.3",
|
|
20
20
|
"@azure/service-bus": "^7.9.5",
|
|
21
|
-
"@
|
|
22
|
-
"@sentry/
|
|
23
|
-
"@
|
|
24
|
-
"@types/
|
|
21
|
+
"@effect/sql-sqlite-node": "4.0.0-beta.68",
|
|
22
|
+
"@sentry/node": "10.51.0",
|
|
23
|
+
"@sentry/opentelemetry": "10.51.0",
|
|
24
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
25
|
+
"@types/node": "25.6.0",
|
|
25
26
|
"@types/proper-lockfile": "^4.1.4",
|
|
26
27
|
"@types/redis": "^2.8.32",
|
|
27
28
|
"@types/redlock": "^4.0.8",
|
|
28
|
-
"
|
|
29
|
-
"jwks-rsa": "2.1.4",
|
|
29
|
+
"better-sqlite3": "^12.9.0",
|
|
30
30
|
"jwt-decode": "^4.0.0",
|
|
31
|
-
"mongodb": "7.
|
|
31
|
+
"mongodb": "7.2.0",
|
|
32
32
|
"redis": "^3.1.2",
|
|
33
33
|
"redlock": "^4.2.0",
|
|
34
34
|
"strip-ansi": "^7.2.0",
|
|
35
|
-
"typescript": "~
|
|
36
|
-
"vitest": "^4.
|
|
37
|
-
"@effect-app/eslint-shared-config": "0.5.7-beta.2"
|
|
35
|
+
"typescript": "~6.0.3",
|
|
36
|
+
"vitest": "^4.1.5"
|
|
38
37
|
},
|
|
39
38
|
"peerDependencies": {
|
|
40
|
-
"@azure/cosmos": "^4.9.
|
|
39
|
+
"@azure/cosmos": "^4.9.3",
|
|
41
40
|
"@azure/service-bus": "^7.9.5",
|
|
42
|
-
"@effect/vitest": "^4.0.0-beta.
|
|
41
|
+
"@effect/vitest": "^4.0.0-beta.68",
|
|
43
42
|
"@sendgrid/helpers": "^8.0.0",
|
|
44
43
|
"@sendgrid/mail": "^8.1.6",
|
|
45
|
-
"@sentry/node": "10.
|
|
46
|
-
"@sentry/opentelemetry": "10.
|
|
44
|
+
"@sentry/node": "10.51.0",
|
|
45
|
+
"@sentry/opentelemetry": "10.51.0",
|
|
46
|
+
"effect": "^4.0.0-beta.68",
|
|
47
47
|
"jwt-decode": "^4.0.0",
|
|
48
48
|
"redis": "^3.1.2",
|
|
49
|
-
"redlock": "^4.2.0"
|
|
50
|
-
"effect": "^4.0.0-beta.36",
|
|
51
|
-
"express": "^5.2.1"
|
|
49
|
+
"redlock": "^4.2.0"
|
|
52
50
|
},
|
|
53
51
|
"typesVersions": {
|
|
54
52
|
"*": {
|
|
@@ -94,6 +92,10 @@
|
|
|
94
92
|
"types": "./dist/Model/Repository.d.ts",
|
|
95
93
|
"default": "./dist/Model/Repository.js"
|
|
96
94
|
},
|
|
95
|
+
"./Model/Repository/Registry": {
|
|
96
|
+
"types": "./dist/Model/Repository/Registry.d.ts",
|
|
97
|
+
"default": "./dist/Model/Repository/Registry.js"
|
|
98
|
+
},
|
|
97
99
|
"./Model/Repository/ext": {
|
|
98
100
|
"types": "./dist/Model/Repository/ext.d.ts",
|
|
99
101
|
"default": "./dist/Model/Repository/ext.js"
|
|
@@ -166,14 +168,6 @@
|
|
|
166
168
|
"types": "./dist/Model/query/new-kid-interpreter.d.ts",
|
|
167
169
|
"default": "./dist/Model/query/new-kid-interpreter.js"
|
|
168
170
|
},
|
|
169
|
-
"./Operations": {
|
|
170
|
-
"types": "./dist/Operations.d.ts",
|
|
171
|
-
"default": "./dist/Operations.js"
|
|
172
|
-
},
|
|
173
|
-
"./OperationsRepo": {
|
|
174
|
-
"types": "./dist/OperationsRepo.d.ts",
|
|
175
|
-
"default": "./dist/OperationsRepo.js"
|
|
176
|
-
},
|
|
177
171
|
"./QueueMaker/SQLQueue": {
|
|
178
172
|
"types": "./dist/QueueMaker/SQLQueue.d.ts",
|
|
179
173
|
"default": "./dist/QueueMaker/SQLQueue.js"
|
|
@@ -226,6 +220,18 @@
|
|
|
226
220
|
"types": "./dist/Store/Memory.d.ts",
|
|
227
221
|
"default": "./dist/Store/Memory.js"
|
|
228
222
|
},
|
|
223
|
+
"./Store/SQL": {
|
|
224
|
+
"types": "./dist/Store/SQL.d.ts",
|
|
225
|
+
"default": "./dist/Store/SQL.js"
|
|
226
|
+
},
|
|
227
|
+
"./Store/SQL/Pg": {
|
|
228
|
+
"types": "./dist/Store/SQL/Pg.d.ts",
|
|
229
|
+
"default": "./dist/Store/SQL/Pg.js"
|
|
230
|
+
},
|
|
231
|
+
"./Store/SQL/query": {
|
|
232
|
+
"types": "./dist/Store/SQL/query.d.ts",
|
|
233
|
+
"default": "./dist/Store/SQL/query.js"
|
|
234
|
+
},
|
|
229
235
|
"./Store/codeFilter": {
|
|
230
236
|
"types": "./dist/Store/codeFilter.d.ts",
|
|
231
237
|
"default": "./dist/Store/codeFilter.js"
|
|
@@ -366,6 +372,10 @@
|
|
|
366
372
|
"types": "./dist/logger/shared.d.ts",
|
|
367
373
|
"default": "./dist/logger/shared.js"
|
|
368
374
|
},
|
|
375
|
+
"./otel": {
|
|
376
|
+
"types": "./dist/otel.d.ts",
|
|
377
|
+
"default": "./dist/otel.js"
|
|
378
|
+
},
|
|
369
379
|
"./rateLimit": {
|
|
370
380
|
"types": "./dist/rateLimit.d.ts",
|
|
371
381
|
"default": "./dist/rateLimit.js"
|
|
@@ -384,18 +394,17 @@
|
|
|
384
394
|
"scripts": {
|
|
385
395
|
"watch": "pnpm build:tsc -w",
|
|
386
396
|
"build:tsc": "pnpm clean-dist && effect-app-cli packagejson pnpm check",
|
|
387
|
-
"check": "
|
|
397
|
+
"check": "tsgo --build",
|
|
388
398
|
"build": "pnpm build:tsc",
|
|
389
|
-
"watch2": "pnpm clean-dist && NODE_OPTIONS=--max-old-space-size=6144
|
|
399
|
+
"watch2": "pnpm clean-dist && NODE_OPTIONS=--max-old-space-size=6144 tsgo -w",
|
|
390
400
|
"clean": "rm -rf dist",
|
|
391
401
|
"clean-dist": "sh ../../scripts/clean-dist.sh",
|
|
392
402
|
"circular": "pnpm circular:src && pnpm circular:dist",
|
|
393
403
|
"circular:src": "madge --circular --ts-config ./tsconfig.json --extensions ts ./src",
|
|
394
404
|
"circular:dist": "madge --circular --extensions js ./dist",
|
|
395
|
-
"compile": "NODE_OPTIONS=--max-old-space-size=6144
|
|
396
|
-
"lint": "
|
|
397
|
-
"lint
|
|
398
|
-
"lint-fix": "pnpm lint --fix",
|
|
405
|
+
"compile": "NODE_OPTIONS=--max-old-space-size=6144 tsgo --noEmit",
|
|
406
|
+
"lint": "oxlint --quiet --type-aware ./src && pnpm exec dprint check --config ../../dprint.jsonc .",
|
|
407
|
+
"lint-fix": "oxlint --quiet --type-aware --fix ./src && pnpm exec dprint fmt --config ../../dprint.jsonc .",
|
|
399
408
|
"test": "vitest",
|
|
400
409
|
"test:run": "pnpm run test run --passWithNoTests",
|
|
401
410
|
"testsuite": "pnpm lint && pnpm circular && pnpm run test:run",
|
package/src/CUPS.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { type FileOptions, tempFile } from "@effect-app/infra/fileUtil"
|
|
2
2
|
import cp from "child_process"
|
|
3
|
-
import
|
|
3
|
+
import * as Config from "effect-app/Config"
|
|
4
|
+
import * as Context from "effect-app/Context"
|
|
5
|
+
import * as Effect from "effect-app/Effect"
|
|
6
|
+
import * as Layer from "effect-app/Layer"
|
|
7
|
+
import * as Option from "effect-app/Option"
|
|
8
|
+
import * as S from "effect-app/Schema"
|
|
4
9
|
import { pretty } from "effect-app/utils"
|
|
10
|
+
import * as Predicate from "effect/Predicate"
|
|
5
11
|
import fs from "fs"
|
|
6
12
|
import os from "os"
|
|
7
13
|
import path from "path"
|
|
@@ -74,15 +80,13 @@ function printBuffer(printer: PrinterConfig, options: string[]) {
|
|
|
74
80
|
)
|
|
75
81
|
}
|
|
76
82
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
})
|
|
85
|
-
}
|
|
83
|
+
const getAvailablePrinters = Effect.fnUntraced(function*(host?: string) {
|
|
84
|
+
const { stdout } = yield* exec(["lpstat", ...buildListArgs({ host }), "-s"].join(" "))
|
|
85
|
+
return [...stdout.matchAll(/device for (\w+):/g)]
|
|
86
|
+
.map((_) => _[1])
|
|
87
|
+
.filter(Predicate.isNotNullish)
|
|
88
|
+
.map((_) => S.NonEmptyString255(_))
|
|
89
|
+
})
|
|
86
90
|
|
|
87
91
|
function* buildListArgs(config?: { host?: string | undefined }) {
|
|
88
92
|
if (config?.host) {
|
|
@@ -100,7 +104,7 @@ export const CUPSConfig = Config.all({
|
|
|
100
104
|
)
|
|
101
105
|
})
|
|
102
106
|
|
|
103
|
-
export class CUPS extends
|
|
107
|
+
export class CUPS extends Context.Service<CUPS>()("effect-app/CUPS", {
|
|
104
108
|
make: Effect.gen(function*() {
|
|
105
109
|
const config = yield* CUPSConfig
|
|
106
110
|
const serverUrl = Option.getOrUndefined(config.server)
|
package/src/Emailer/Sendgrid.ts
CHANGED
|
@@ -1,63 +1,70 @@
|
|
|
1
1
|
import type { EmailData } from "@sendgrid/helpers/classes/email-address.js"
|
|
2
2
|
import type { MailContent } from "@sendgrid/helpers/classes/mail.js"
|
|
3
3
|
import sgMail from "@sendgrid/mail"
|
|
4
|
-
import
|
|
4
|
+
import * as Array from "effect-app/Array"
|
|
5
|
+
import * as Effect from "effect-app/Effect"
|
|
5
6
|
import { dropUndefinedT } from "effect-app/utils"
|
|
7
|
+
import * as Equivalence from "effect/Equivalence"
|
|
8
|
+
import * as Redacted from "effect/Redacted"
|
|
6
9
|
import { inspect } from "util"
|
|
7
10
|
import { InfraLogger } from "../logger.js"
|
|
8
11
|
import { Emailer, type EmailMsg, type EmailMsgOptionalFrom, type SendgridConfig, SendMailError } from "./service.js"
|
|
9
12
|
|
|
10
|
-
const makeSendgrid = (
|
|
13
|
+
const makeSendgrid = (
|
|
14
|
+
{ apiKey, defaultFrom, defaultReplyTo, fakeMailAddress, realMail, subjectPrefix }: SendgridConfig
|
|
15
|
+
) =>
|
|
11
16
|
Effect.sync(() => {
|
|
12
17
|
sgMail.setApiKey(Redacted.value(apiKey))
|
|
13
18
|
|
|
14
19
|
return Emailer.of({
|
|
15
|
-
sendMail: Effect.fn("
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
sendMail: Effect.fn("Emailer.sendMail", { attributes: { "messaging.system": "sendgrid" } })(
|
|
21
|
+
function*(msg_: EmailMsgOptionalFrom) {
|
|
22
|
+
const msg: EmailMsg = dropUndefinedT({
|
|
23
|
+
...msg_,
|
|
24
|
+
from: msg_.from ?? defaultFrom,
|
|
25
|
+
replyTo: msg_.replyTo ?? (msg_.from ? undefined : defaultReplyTo)
|
|
26
|
+
})
|
|
27
|
+
const render = renderMessage(!realMail, fakeMailAddress)
|
|
22
28
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
const renderedMsg_ = render(msg)
|
|
30
|
+
const renderedMsg = {
|
|
31
|
+
...renderedMsg_ as Omit<typeof renderedMsg_, "content">,
|
|
32
|
+
subject: `${subjectPrefix}${renderedMsg_.subject}`,
|
|
33
|
+
..."content" in renderedMsg_
|
|
34
|
+
? { content: [...renderedMsg_.content] as [MailContent, ...MailContent[]] }
|
|
35
|
+
: {}
|
|
36
|
+
}
|
|
37
|
+
yield* InfraLogger.logDebug("Sending email").pipe(Effect.annotateLogs("msg", inspect(renderedMsg, false, 5)))
|
|
32
38
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
39
|
+
const ret = yield* Effect
|
|
40
|
+
.callback<
|
|
41
|
+
[sgMail.ClientResponse, Record<string, unknown>],
|
|
42
|
+
Error | sgMail.ResponseError
|
|
43
|
+
>(
|
|
44
|
+
(resume) =>
|
|
45
|
+
void sgMail.send(
|
|
46
|
+
renderedMsg as any, // sue me
|
|
47
|
+
msg.isMultiple ?? true,
|
|
48
|
+
(err, result) =>
|
|
49
|
+
err
|
|
50
|
+
? resume(Effect.fail(err))
|
|
51
|
+
: resume(Effect.sync(() => result))
|
|
52
|
+
)
|
|
53
|
+
)
|
|
54
|
+
.pipe(Effect.mapError((raw) => new SendMailError({ raw })))
|
|
49
55
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
// const event = {
|
|
57
|
+
// name: "EmailSent",
|
|
58
|
+
// properties: {
|
|
59
|
+
// templateId: msg.templateId
|
|
60
|
+
// }
|
|
61
|
+
// }
|
|
62
|
+
// yield* InfraLogger.logDebug("Tracking email event").annotateLogs("event", event.$$.pretty)
|
|
63
|
+
// const { trackEvent } = yield* AiContextService
|
|
64
|
+
// trackEvent(event)
|
|
65
|
+
return ret
|
|
66
|
+
}
|
|
67
|
+
)
|
|
61
68
|
})
|
|
62
69
|
})
|
|
63
70
|
|
|
@@ -68,23 +75,24 @@ export function Sendgrid(config: SendgridConfig) {
|
|
|
68
75
|
/**
|
|
69
76
|
* @hidden
|
|
70
77
|
*/
|
|
71
|
-
export function renderMessage(forceFake: boolean) {
|
|
78
|
+
export function renderMessage(forceFake: boolean, fakeMailAddress: string) {
|
|
72
79
|
let i = 0
|
|
73
80
|
const makeId = () => i++
|
|
81
|
+
const makeFakeEmail = () => fakeMailAddress.replace("{i}", String(makeId()))
|
|
74
82
|
return forceFake
|
|
75
83
|
? (msg: EmailMsg) =>
|
|
76
84
|
dropUndefinedT({
|
|
77
85
|
...msg,
|
|
78
|
-
to: msg.to && renderFake(msg.to,
|
|
79
|
-
cc: msg.cc && renderFake(msg.cc,
|
|
80
|
-
bcc: msg.bcc && renderFake(msg.bcc,
|
|
86
|
+
to: msg.to && renderFake(msg.to, makeFakeEmail),
|
|
87
|
+
cc: msg.cc && renderFake(msg.cc, makeFakeEmail),
|
|
88
|
+
bcc: msg.bcc && renderFake(msg.bcc, makeFakeEmail)
|
|
81
89
|
})
|
|
82
90
|
: (msg: EmailMsg) =>
|
|
83
91
|
dropUndefinedT({
|
|
84
92
|
...msg,
|
|
85
|
-
to: msg.to && renderFakeIfTest(msg.to,
|
|
86
|
-
cc: msg.cc && renderFakeIfTest(msg.cc,
|
|
87
|
-
bcc: msg.bcc && renderFakeIfTest(msg.bcc,
|
|
93
|
+
to: msg.to && renderFakeIfTest(msg.to, makeFakeEmail),
|
|
94
|
+
cc: msg.cc && renderFakeIfTest(msg.cc, makeFakeEmail),
|
|
95
|
+
bcc: msg.bcc && renderFakeIfTest(msg.bcc, makeFakeEmail)
|
|
88
96
|
})
|
|
89
97
|
}
|
|
90
98
|
|
|
@@ -100,10 +108,10 @@ export function isTestAddress(to: EmailData) {
|
|
|
100
108
|
)
|
|
101
109
|
}
|
|
102
110
|
|
|
103
|
-
function renderFake(addr: EmailData | readonly EmailData[],
|
|
111
|
+
function renderFake(addr: EmailData | readonly EmailData[], makeEmail: () => string) {
|
|
104
112
|
return {
|
|
105
113
|
name: renderMailData(addr),
|
|
106
|
-
email:
|
|
114
|
+
email: makeEmail()
|
|
107
115
|
}
|
|
108
116
|
}
|
|
109
117
|
const eq = Equivalence.mapInput(
|
|
@@ -117,14 +125,14 @@ function isEmailDataArray(md: EmailData | readonly EmailData[]): md is readonly
|
|
|
117
125
|
|
|
118
126
|
// TODO: should just not add any already added email address
|
|
119
127
|
// https://stackoverflow.com/a/53603076/11595834
|
|
120
|
-
function renderFakeIfTest(addr: EmailData | readonly EmailData[],
|
|
128
|
+
function renderFakeIfTest(addr: EmailData | readonly EmailData[], makeEmail: () => string) {
|
|
121
129
|
if (isEmailDataArray(addr)) {
|
|
122
130
|
return Array.dedupeWith(
|
|
123
|
-
addr.map((x) => (isTestAddress(x) ? renderFake(x,
|
|
131
|
+
addr.map((x) => (isTestAddress(x) ? renderFake(x, makeEmail) : x)),
|
|
124
132
|
eq
|
|
125
133
|
)
|
|
126
134
|
}
|
|
127
|
-
return isTestAddress(addr) ? renderFake(addr,
|
|
135
|
+
return isTestAddress(addr) ? renderFake(addr, makeEmail) : addr
|
|
128
136
|
}
|
|
129
137
|
|
|
130
138
|
function renderMailData(md: EmailData | readonly EmailData[]): string {
|
package/src/Emailer/fake.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as Effect from "effect-app/Effect"
|
|
2
2
|
import { pretty } from "effect-app/utils"
|
|
3
3
|
import { InfraLogger } from "../logger.js"
|
|
4
4
|
import { Emailer } from "./service.js"
|
|
@@ -7,7 +7,7 @@ const makeFake = InfraLogger
|
|
|
7
7
|
.logInfo("FAKE Emailer Service enabled")
|
|
8
8
|
.pipe(Effect.map(() =>
|
|
9
9
|
Emailer.of({
|
|
10
|
-
sendMail: Effect.fn("
|
|
10
|
+
sendMail: Effect.fn("Emailer.sendMail", { attributes: { "messaging.system": "fake" } })((msg) =>
|
|
11
11
|
InfraLogger
|
|
12
12
|
.logDebug(`Fake send mail`)
|
|
13
13
|
.pipe(Effect.annotateLogs("msg", pretty(msg)))
|
package/src/Emailer/service.ts
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import type { MailContent, MailData } from "@sendgrid/helpers/classes/mail.js"
|
|
2
2
|
import type { ResponseError } from "@sendgrid/mail"
|
|
3
|
-
import
|
|
3
|
+
import type { NonEmptyReadonlyArray } from "effect-app/Array"
|
|
4
|
+
import * as Context from "effect-app/Context"
|
|
5
|
+
import type * as Effect from "effect-app/Effect"
|
|
4
6
|
import type { Email } from "effect-app/Schema"
|
|
7
|
+
import * as Data from "effect/Data"
|
|
8
|
+
import type * as Redacted from "effect/Redacted"
|
|
5
9
|
|
|
6
10
|
export class SendMailError extends Data.TaggedError("SendMailError")<{
|
|
7
11
|
readonly raw: Error | ResponseError
|
|
8
12
|
}> {}
|
|
9
13
|
|
|
10
|
-
export class Emailer extends
|
|
14
|
+
export class Emailer extends Context.Opaque<Emailer, {
|
|
11
15
|
sendMail: (msg: EmailMsgOptionalFrom) => Effect.Effect<void, SendMailError>
|
|
12
16
|
}>()("effect-app/Emailer") {}
|
|
13
17
|
|
|
@@ -21,7 +25,13 @@ export interface SendgridConfig {
|
|
|
21
25
|
subjectPrefix: string
|
|
22
26
|
realMail: boolean
|
|
23
27
|
defaultFrom: EmailData
|
|
24
|
-
apiKey: Redacted.Redacted
|
|
28
|
+
apiKey: Redacted.Redacted
|
|
29
|
+
/**
|
|
30
|
+
* Email address used for fake/test recipients. Use `{i}` as a placeholder for an auto-incrementing index to ensure uniqueness.
|
|
31
|
+
*
|
|
32
|
+
* @example "test+{i}@example.com"
|
|
33
|
+
*/
|
|
34
|
+
fakeMailAddress: string
|
|
25
35
|
}
|
|
26
36
|
export type EmailTemplateMsg = MailData & { templateId: string }
|
|
27
37
|
|
package/src/MainFiberSet.ts
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import * as Context from "effect-app/Context"
|
|
2
|
+
import * as Effect from "effect-app/Effect"
|
|
3
|
+
import * as Layer from "effect-app/Layer"
|
|
4
|
+
import * as Fiber from "effect/Fiber"
|
|
5
|
+
import * as FiberSet from "effect/FiberSet"
|
|
6
|
+
|
|
3
7
|
import { InfraLogger } from "./logger.js"
|
|
4
8
|
import { reportNonInterruptedFailureCause } from "./QueueMaker/errors.js"
|
|
5
9
|
import { setRootParentSpan } from "./RequestFiberSet.js"
|
|
6
10
|
|
|
7
11
|
const make = Effect.gen(function*() {
|
|
8
12
|
const set = yield* FiberSet.make<unknown, never>()
|
|
9
|
-
const add = (...fibers: Fiber.Fiber<never
|
|
10
|
-
|
|
11
|
-
const addAll = (fibers: readonly Fiber.Fiber<never, never>[]) =>
|
|
13
|
+
const add = (...fibers: Fiber.Fiber<never>[]) => Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
|
|
14
|
+
const addAll = (fibers: readonly Fiber.Fiber<never>[]) =>
|
|
12
15
|
Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
|
|
13
16
|
const join = FiberSet.size(set).pipe(
|
|
14
17
|
Effect.andThen((count) => InfraLogger.logDebug(`Joining ${count} current fibers on the MainFiberSet`)),
|
|
@@ -62,15 +65,14 @@ const make = Effect.gen(function*() {
|
|
|
62
65
|
* you should register these long running fibers in a FiberSet, and join them at the end of your main program.
|
|
63
66
|
* This way any errors will blow up the main program instead of fibers dying unknowingly.
|
|
64
67
|
*/
|
|
65
|
-
export class MainFiberSet extends
|
|
68
|
+
export class MainFiberSet extends Context.Service<MainFiberSet>()("MainFiberSet", { make }) {
|
|
66
69
|
static readonly Live = Layer.effect(this, this.make)
|
|
67
|
-
static readonly JoinLive = this.
|
|
70
|
+
static readonly JoinLive = this.pipe(
|
|
68
71
|
Effect.andThen((_) => _.join),
|
|
69
72
|
Layer.effectDiscard,
|
|
70
73
|
Layer.provide(this.Live)
|
|
71
74
|
)
|
|
72
|
-
static readonly run = <A, R>(self: Effect.Effect<A, never, R>) =>
|
|
73
|
-
this.asEffect().pipe(Effect.andThen((_) => _.run(self)))
|
|
75
|
+
static readonly run = <A, R>(self: Effect.Effect<A, never, R>) => this.pipe(Effect.andThen((_) => _.run(self)))
|
|
74
76
|
static readonly forkDaemonReport = <A, E, R>(self: Effect.Effect<A, E, R>) =>
|
|
75
|
-
this.
|
|
77
|
+
this.pipe(Effect.andThen((_) => _.forkDaemonReport(self)))
|
|
76
78
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as Context from "effect-app/Context"
|
|
2
|
+
import * as Effect from "effect-app/Effect"
|
|
3
|
+
|
|
4
|
+
export interface RegisteredRepository {
|
|
5
|
+
readonly seedNamespace: (namespace: string) => Effect.Effect<void>
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const make = Effect.sync(() => {
|
|
9
|
+
const repos = new Map<string, RegisteredRepository>()
|
|
10
|
+
return {
|
|
11
|
+
register(modelName: string, repo: RegisteredRepository) {
|
|
12
|
+
repos.set(modelName, repo)
|
|
13
|
+
},
|
|
14
|
+
seedNamespace: (namespace: string) =>
|
|
15
|
+
Effect.suspend(() =>
|
|
16
|
+
Effect.forEach(
|
|
17
|
+
repos.values(),
|
|
18
|
+
(r) => r.seedNamespace(namespace),
|
|
19
|
+
{ concurrency: "unbounded", discard: true }
|
|
20
|
+
)
|
|
21
|
+
),
|
|
22
|
+
get entries(): ReadonlyMap<string, RegisteredRepository> {
|
|
23
|
+
return repos
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
export class RepositoryRegistry extends Context.Opaque<RepositoryRegistry, {
|
|
29
|
+
readonly register: (modelName: string, repo: RegisteredRepository) => void
|
|
30
|
+
readonly seedNamespace: (namespace: string) => Effect.Effect<void>
|
|
31
|
+
readonly entries: ReadonlyMap<string, RegisteredRepository>
|
|
32
|
+
}>()("effect-app/RepositoryRegistry", { make }) {}
|
|
33
|
+
|
|
34
|
+
export const RepositoryRegistryLive = RepositoryRegistry.toLayer(RepositoryRegistry.make)
|