@effect-app/infra 4.0.0-beta.19 → 4.0.0-beta.190

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.
Files changed (300) hide show
  1. package/CHANGELOG.md +1277 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +15 -7
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +10 -12
  6. package/dist/Emailer/Sendgrid.d.ts +14 -14
  7. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  8. package/dist/Emailer/Sendgrid.js +16 -15
  9. package/dist/Emailer/fake.d.ts +1 -1
  10. package/dist/Emailer/service.d.ts +9 -3
  11. package/dist/Emailer/service.d.ts.map +1 -1
  12. package/dist/Emailer/service.js +3 -3
  13. package/dist/Emailer.d.ts +1 -1
  14. package/dist/MainFiberSet.d.ts +5 -5
  15. package/dist/MainFiberSet.d.ts.map +1 -1
  16. package/dist/MainFiberSet.js +3 -3
  17. package/dist/Model/Repository/Registry.d.ts +20 -0
  18. package/dist/Model/Repository/Registry.d.ts.map +1 -0
  19. package/dist/Model/Repository/Registry.js +17 -0
  20. package/dist/Model/Repository/ext.d.ts +33 -15
  21. package/dist/Model/Repository/ext.d.ts.map +1 -1
  22. package/dist/Model/Repository/ext.js +54 -2
  23. package/dist/Model/Repository/internal/internal.d.ts +6 -6
  24. package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
  25. package/dist/Model/Repository/internal/internal.js +43 -32
  26. package/dist/Model/Repository/legacy.d.ts +1 -1
  27. package/dist/Model/Repository/makeRepo.d.ts +7 -6
  28. package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
  29. package/dist/Model/Repository/makeRepo.js +5 -1
  30. package/dist/Model/Repository/service.d.ts +28 -23
  31. package/dist/Model/Repository/service.d.ts.map +1 -1
  32. package/dist/Model/Repository/validation.d.ts +142 -17
  33. package/dist/Model/Repository/validation.d.ts.map +1 -1
  34. package/dist/Model/Repository/validation.js +5 -5
  35. package/dist/Model/Repository.d.ts +2 -1
  36. package/dist/Model/Repository.d.ts.map +1 -1
  37. package/dist/Model/Repository.js +2 -1
  38. package/dist/Model/dsl.d.ts +4 -4
  39. package/dist/Model/dsl.d.ts.map +1 -1
  40. package/dist/Model/filter/filterApi.d.ts +5 -5
  41. package/dist/Model/filter/filterApi.d.ts.map +1 -1
  42. package/dist/Model/filter/types/errors.d.ts +1 -1
  43. package/dist/Model/filter/types/fields.d.ts +1 -1
  44. package/dist/Model/filter/types/path/common.d.ts +1 -1
  45. package/dist/Model/filter/types/path/eager.d.ts +1 -1
  46. package/dist/Model/filter/types/path/eager.d.ts.map +1 -1
  47. package/dist/Model/filter/types/path/index.d.ts +1 -1
  48. package/dist/Model/filter/types/utils.d.ts +1 -1
  49. package/dist/Model/filter/types/validator.d.ts +1 -1
  50. package/dist/Model/filter/types.d.ts +1 -1
  51. package/dist/Model/query/dsl.d.ts +1 -1
  52. package/dist/Model/query/dsl.d.ts.map +1 -1
  53. package/dist/Model/query/new-kid-interpreter.d.ts +6 -6
  54. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -1
  55. package/dist/Model/query/new-kid-interpreter.js +3 -3
  56. package/dist/Model/query.d.ts +1 -1
  57. package/dist/Model.d.ts +2 -1
  58. package/dist/Model.d.ts.map +1 -1
  59. package/dist/Model.js +2 -1
  60. package/dist/Operations.d.ts +6 -6
  61. package/dist/Operations.d.ts.map +1 -1
  62. package/dist/Operations.js +56 -59
  63. package/dist/OperationsRepo.d.ts +11 -29
  64. package/dist/OperationsRepo.d.ts.map +1 -1
  65. package/dist/OperationsRepo.js +3 -3
  66. package/dist/QueueMaker/SQLQueue.d.ts +5 -7
  67. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  68. package/dist/QueueMaker/SQLQueue.js +105 -114
  69. package/dist/QueueMaker/errors.d.ts +2 -2
  70. package/dist/QueueMaker/errors.d.ts.map +1 -1
  71. package/dist/QueueMaker/memQueue.d.ts +7 -4
  72. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  73. package/dist/QueueMaker/memQueue.js +51 -62
  74. package/dist/QueueMaker/sbqueue.d.ts +6 -3
  75. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  76. package/dist/QueueMaker/sbqueue.js +37 -53
  77. package/dist/QueueMaker/service.d.ts +1 -1
  78. package/dist/RequestContext.d.ts +114 -26
  79. package/dist/RequestContext.d.ts.map +1 -1
  80. package/dist/RequestContext.js +7 -7
  81. package/dist/RequestFiberSet.d.ts +7 -7
  82. package/dist/RequestFiberSet.d.ts.map +1 -1
  83. package/dist/RequestFiberSet.js +5 -5
  84. package/dist/Store/ContextMapContainer.d.ts +19 -3
  85. package/dist/Store/ContextMapContainer.d.ts.map +1 -1
  86. package/dist/Store/ContextMapContainer.js +13 -3
  87. package/dist/Store/Cosmos/query.d.ts +1 -1
  88. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  89. package/dist/Store/Cosmos/query.js +8 -10
  90. package/dist/Store/Cosmos.d.ts +1 -1
  91. package/dist/Store/Cosmos.d.ts.map +1 -1
  92. package/dist/Store/Cosmos.js +308 -242
  93. package/dist/Store/Disk.d.ts +2 -2
  94. package/dist/Store/Disk.d.ts.map +1 -1
  95. package/dist/Store/Disk.js +25 -22
  96. package/dist/Store/Memory.d.ts +4 -4
  97. package/dist/Store/Memory.d.ts.map +1 -1
  98. package/dist/Store/Memory.js +27 -22
  99. package/dist/Store/SQL/Pg.d.ts +4 -0
  100. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  101. package/dist/Store/SQL/Pg.js +189 -0
  102. package/dist/Store/SQL/query.d.ts +38 -0
  103. package/dist/Store/SQL/query.d.ts.map +1 -0
  104. package/dist/Store/SQL/query.js +367 -0
  105. package/dist/Store/SQL.d.ts +20 -0
  106. package/dist/Store/SQL.d.ts.map +1 -0
  107. package/dist/Store/SQL.js +381 -0
  108. package/dist/Store/codeFilter.d.ts +1 -1
  109. package/dist/Store/codeFilter.d.ts.map +1 -1
  110. package/dist/Store/codeFilter.js +2 -1
  111. package/dist/Store/index.d.ts +5 -2
  112. package/dist/Store/index.d.ts.map +1 -1
  113. package/dist/Store/index.js +15 -3
  114. package/dist/Store/service.d.ts +17 -6
  115. package/dist/Store/service.d.ts.map +1 -1
  116. package/dist/Store/service.js +24 -6
  117. package/dist/Store/utils.d.ts +1 -1
  118. package/dist/Store/utils.d.ts.map +1 -1
  119. package/dist/Store/utils.js +3 -4
  120. package/dist/Store.d.ts +1 -1
  121. package/dist/adapters/SQL/Model.d.ts +28 -42
  122. package/dist/adapters/SQL/Model.d.ts.map +1 -1
  123. package/dist/adapters/SQL/Model.js +2 -2
  124. package/dist/adapters/SQL.d.ts +1 -1
  125. package/dist/adapters/ServiceBus.d.ts +9 -9
  126. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  127. package/dist/adapters/ServiceBus.js +13 -15
  128. package/dist/adapters/cosmos-client.d.ts +3 -3
  129. package/dist/adapters/cosmos-client.d.ts.map +1 -1
  130. package/dist/adapters/cosmos-client.js +3 -3
  131. package/dist/adapters/index.d.ts +8 -2
  132. package/dist/adapters/index.d.ts.map +1 -1
  133. package/dist/adapters/index.js +8 -2
  134. package/dist/adapters/logger.d.ts +1 -1
  135. package/dist/adapters/logger.d.ts.map +1 -1
  136. package/dist/adapters/memQueue.d.ts +3 -3
  137. package/dist/adapters/memQueue.d.ts.map +1 -1
  138. package/dist/adapters/memQueue.js +3 -3
  139. package/dist/adapters/mongo-client.d.ts +3 -3
  140. package/dist/adapters/mongo-client.d.ts.map +1 -1
  141. package/dist/adapters/mongo-client.js +3 -3
  142. package/dist/adapters/redis-client.d.ts +3 -3
  143. package/dist/adapters/redis-client.d.ts.map +1 -1
  144. package/dist/adapters/redis-client.js +3 -3
  145. package/dist/api/ContextProvider.d.ts +7 -7
  146. package/dist/api/ContextProvider.d.ts.map +1 -1
  147. package/dist/api/ContextProvider.js +6 -6
  148. package/dist/api/codec.d.ts +1 -1
  149. package/dist/api/internal/RequestContextMiddleware.d.ts +2 -2
  150. package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
  151. package/dist/api/internal/RequestContextMiddleware.js +2 -2
  152. package/dist/api/internal/auth.d.ts +44 -6
  153. package/dist/api/internal/auth.d.ts.map +1 -1
  154. package/dist/api/internal/auth.js +160 -29
  155. package/dist/api/internal/events.d.ts +3 -3
  156. package/dist/api/internal/events.d.ts.map +1 -1
  157. package/dist/api/internal/events.js +9 -7
  158. package/dist/api/internal/health.d.ts +1 -1
  159. package/dist/api/layerUtils.d.ts +6 -6
  160. package/dist/api/layerUtils.d.ts.map +1 -1
  161. package/dist/api/layerUtils.js +5 -5
  162. package/dist/api/middlewares.d.ts +1 -1
  163. package/dist/api/reportError.d.ts +1 -1
  164. package/dist/api/routing/middleware/RouterMiddleware.d.ts +4 -4
  165. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  166. package/dist/api/routing/middleware/middleware.d.ts +50 -4
  167. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  168. package/dist/api/routing/middleware/middleware.js +75 -17
  169. package/dist/api/routing/middleware.d.ts +1 -2
  170. package/dist/api/routing/middleware.d.ts.map +1 -1
  171. package/dist/api/routing/middleware.js +1 -2
  172. package/dist/api/routing/schema/jwt.d.ts +1 -1
  173. package/dist/api/routing/schema/jwt.d.ts.map +1 -1
  174. package/dist/api/routing/tsort.d.ts +1 -1
  175. package/dist/api/routing/tsort.d.ts.map +1 -1
  176. package/dist/api/routing/utils.d.ts +3 -3
  177. package/dist/api/routing/utils.d.ts.map +1 -1
  178. package/dist/api/routing.d.ts +26 -18
  179. package/dist/api/routing.d.ts.map +1 -1
  180. package/dist/api/routing.js +70 -11
  181. package/dist/api/setupRequest.d.ts +8 -5
  182. package/dist/api/setupRequest.d.ts.map +1 -1
  183. package/dist/api/setupRequest.js +12 -7
  184. package/dist/api/util.d.ts +1 -1
  185. package/dist/arbs.d.ts +1 -1
  186. package/dist/arbs.d.ts.map +1 -1
  187. package/dist/arbs.js +5 -3
  188. package/dist/errorReporter.d.ts +4 -4
  189. package/dist/errorReporter.d.ts.map +1 -1
  190. package/dist/errorReporter.js +20 -25
  191. package/dist/errors.d.ts +1 -1
  192. package/dist/fileUtil.d.ts +1 -1
  193. package/dist/fileUtil.d.ts.map +1 -1
  194. package/dist/index.d.ts +1 -1
  195. package/dist/logger/jsonLogger.d.ts +1 -1
  196. package/dist/logger/logFmtLogger.d.ts +1 -1
  197. package/dist/logger/shared.d.ts +1 -1
  198. package/dist/logger/shared.js +2 -2
  199. package/dist/logger.d.ts +1 -1
  200. package/dist/logger.d.ts.map +1 -1
  201. package/dist/rateLimit.d.ts +9 -3
  202. package/dist/rateLimit.d.ts.map +1 -1
  203. package/dist/rateLimit.js +5 -11
  204. package/dist/test.d.ts +1 -1
  205. package/dist/test.d.ts.map +1 -1
  206. package/dist/vitest.d.ts +1 -1
  207. package/eslint.config.mjs +3 -3
  208. package/examples/query.ts +39 -35
  209. package/package.json +42 -36
  210. package/src/CUPS.ts +9 -11
  211. package/src/Emailer/Sendgrid.ts +17 -14
  212. package/src/Emailer/service.ts +8 -2
  213. package/src/MainFiberSet.ts +3 -3
  214. package/src/Model/Repository/Registry.ts +33 -0
  215. package/src/Model/Repository/ext.ts +93 -6
  216. package/src/Model/Repository/internal/internal.ts +97 -88
  217. package/src/Model/Repository/makeRepo.ts +12 -10
  218. package/src/Model/Repository/service.ts +31 -22
  219. package/src/Model/Repository/validation.ts +4 -4
  220. package/src/Model/Repository.ts +1 -0
  221. package/src/Model/dsl.ts +3 -3
  222. package/src/Model/query/new-kid-interpreter.ts +2 -2
  223. package/src/Model.ts +1 -0
  224. package/src/QueueMaker/SQLQueue.ts +121 -151
  225. package/src/QueueMaker/memQueue.ts +82 -103
  226. package/src/QueueMaker/sbqueue.ts +56 -86
  227. package/src/RequestContext.ts +8 -8
  228. package/src/RequestFiberSet.ts +4 -4
  229. package/src/Store/ContextMapContainer.ts +41 -2
  230. package/src/Store/Cosmos/query.ts +9 -11
  231. package/src/Store/Cosmos.ts +437 -343
  232. package/src/Store/Disk.ts +52 -49
  233. package/src/Store/Memory.ts +54 -48
  234. package/src/Store/SQL/Pg.ts +318 -0
  235. package/src/Store/SQL/query.ts +409 -0
  236. package/src/Store/SQL.ts +668 -0
  237. package/src/Store/codeFilter.ts +1 -0
  238. package/src/Store/index.ts +17 -2
  239. package/src/Store/service.ts +31 -7
  240. package/src/Store/utils.ts +23 -22
  241. package/src/adapters/SQL/Model.ts +10 -4
  242. package/src/adapters/ServiceBus.ts +111 -115
  243. package/src/adapters/cosmos-client.ts +2 -2
  244. package/src/adapters/index.ts +7 -0
  245. package/src/adapters/memQueue.ts +2 -2
  246. package/src/adapters/mongo-client.ts +2 -2
  247. package/src/adapters/redis-client.ts +2 -2
  248. package/src/api/ContextProvider.ts +11 -11
  249. package/src/api/internal/RequestContextMiddleware.ts +1 -1
  250. package/src/api/internal/auth.ts +246 -44
  251. package/src/api/internal/events.ts +12 -8
  252. package/src/api/layerUtils.ts +8 -8
  253. package/src/api/routing/middleware/RouterMiddleware.ts +4 -4
  254. package/src/api/routing/middleware/middleware.ts +109 -15
  255. package/src/api/routing/middleware.ts +0 -2
  256. package/src/api/routing.ts +154 -13
  257. package/src/api/setupRequest.ts +28 -8
  258. package/src/arbs.ts +4 -2
  259. package/src/errorReporter.ts +62 -74
  260. package/src/logger/shared.ts +1 -1
  261. package/src/rateLimit.ts +30 -22
  262. package/test/auth.test.ts +101 -0
  263. package/test/contextProvider.test.ts +11 -11
  264. package/test/controller.test.ts +18 -14
  265. package/test/dist/auth.test.d.ts.map +1 -0
  266. package/test/dist/contextProvider.test.d.ts.map +1 -1
  267. package/test/dist/controller.test.d.ts.map +1 -1
  268. package/test/dist/date-query.test.d.ts.map +1 -0
  269. package/test/dist/fixtures.d.ts +26 -12
  270. package/test/dist/fixtures.d.ts.map +1 -1
  271. package/test/dist/fixtures.js +12 -10
  272. package/test/dist/query.test.d.ts.map +1 -1
  273. package/test/dist/rawQuery.test.d.ts.map +1 -1
  274. package/test/dist/repository-ext.test.d.ts.map +1 -0
  275. package/test/dist/requires.test.d.ts.map +1 -1
  276. package/test/dist/router-generator.test.d.ts.map +1 -0
  277. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  278. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  279. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  280. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  281. package/test/dist/sql-store.test.d.ts.map +1 -0
  282. package/test/fixtures.ts +11 -9
  283. package/test/query.test.ts +216 -34
  284. package/test/rawQuery.test.ts +23 -19
  285. package/test/repository-ext.test.ts +60 -0
  286. package/test/requires.test.ts +6 -6
  287. package/test/router-generator.test.ts +180 -0
  288. package/test/routing-interruptibility.test.ts +63 -0
  289. package/test/rpc-e2e-invalidation.test.ts +507 -0
  290. package/test/rpc-multi-middleware.test.ts +78 -9
  291. package/test/rpc-stream-fullstack.test.ts +181 -0
  292. package/test/sql-store.test.ts +1064 -0
  293. package/test/validateSample.test.ts +15 -12
  294. package/tsconfig.examples.json +1 -1
  295. package/tsconfig.json +0 -1
  296. package/tsconfig.json.bak +2 -2
  297. package/tsconfig.src.json +35 -35
  298. package/tsconfig.test.json +2 -2
  299. package/src/Operations.ts +0 -235
  300. package/src/OperationsRepo.ts +0 -16
@@ -6,6 +6,7 @@ import { CosmosClient, CosmosClientLayer } from "../adapters/cosmos-client.js";
6
6
  import { OptimisticConcurrencyException } from "../errors.js";
7
7
  import { InfraLogger } from "../logger.js";
8
8
  import { buildWhereCosmosQuery3, logQuery } from "./Cosmos/query.js";
9
+ import { storeId } from "./Memory.js";
9
10
  import { StoreMaker } from "./service.js";
10
11
  const makeMapId = (idKey) => ({ [idKey]: id, ...e }) => ({
11
12
  ...e,
@@ -20,286 +21,351 @@ class CosmosDbOperationError {
20
21
  this.raw = raw;
21
22
  }
22
23
  } // TODO: Retry operation when running into RU limit.
23
- function makeCosmosStore({ prefix }) {
24
- return Effect.gen(function* () {
25
- const { db } = yield* CosmosClient;
26
- return {
27
- make: (name, idKey, seed, config) => Effect.gen(function* () {
28
- const mapId = makeMapId(idKey);
29
- const mapReverseId = makeReverseMapId(idKey);
30
- const containerId = `${prefix}${name}`;
31
- yield* Effect.promise(() => db.containers.createIfNotExists(dropUndefinedT({
32
- id: containerId,
33
- uniqueKeyPolicy: config?.uniqueKeys
34
- ? { uniqueKeys: config.uniqueKeys }
35
- : undefined
36
- })));
37
- const mainPartitionKey = config?.partitionValue() ?? "primary";
38
- const defaultValues = config?.defaultValues ?? {};
39
- const container = db.container(containerId);
40
- const bulk = container.items.bulk.bind(container.items);
41
- const execBatch = container.items.batch.bind(container.items);
42
- // TODO: move the marker to a separate container and get rid of the checks on every query
43
- // then need to clean up the actual data.. perhaps first do with a config toggle to prescribe to it.
44
- const importedMarkerId = containerId;
45
- const bulkSet = (items) => Effect
46
- .gen(function* () {
47
- // TODO: disable batching if need atomicity
48
- // we delay and batch to keep low amount of RUs
49
- const b = [...items]
50
- .map((x) => [
24
+ const makeCosmosStore = Effect.fnUntraced(function* ({ prefix }) {
25
+ const { db } = yield* CosmosClient;
26
+ return {
27
+ make: Effect.fnUntraced(function* (name, idKey, seed, config) {
28
+ const mapId = makeMapId(idKey);
29
+ const mapReverseId = makeReverseMapId(idKey);
30
+ const containerId = `${prefix}${name}`;
31
+ yield* Effect.promise(() => db.containers.createIfNotExists(dropUndefinedT({
32
+ id: containerId,
33
+ uniqueKeyPolicy: config?.uniqueKeys
34
+ ? { uniqueKeys: config.uniqueKeys }
35
+ : undefined,
36
+ partitionKey: {
37
+ paths: ["/_partitionKey"],
38
+ version: 2 // support large partitionkeys so that the hash is not based on just the first 100 bytes!
39
+ }
40
+ })));
41
+ const basePartitionKey = config?.partitionValue() ?? "primary";
42
+ const nsPrefix = (ns) => ns === "primary" ? "" : `${ns}::`;
43
+ const nsPartitionValue = (ns, e) => {
44
+ const base = config?.partitionValue(e) ?? "primary";
45
+ return `${nsPrefix(ns)}${base}`;
46
+ };
47
+ const nsBasePartitionKey = (ns) => `${nsPrefix(ns)}${basePartitionKey}`;
48
+ const resolveNamespace = !config?.allowNamespace
49
+ ? Effect.succeed("primary")
50
+ : storeId.asEffect().pipe(Effect.map((namespace) => {
51
+ if (namespace !== "primary" && !config.allowNamespace(namespace)) {
52
+ throw new Error(`Namespace ${namespace} not allowed!`);
53
+ }
54
+ return namespace;
55
+ }));
56
+ const defaultValues = config?.defaultValues ?? {};
57
+ const container = db.container(containerId);
58
+ const bulk = container.items.bulk.bind(container.items);
59
+ const execBatch = container.items.batch.bind(container.items);
60
+ // TODO: move the marker to a separate container and get rid of the checks on every query
61
+ // then need to clean up the actual data.. perhaps first do with a config toggle to prescribe to it.
62
+ const importedMarkerId = containerId;
63
+ const ctx = yield* Effect.context();
64
+ const seedCache = new Map();
65
+ const makeSeedEffect = (ns) => {
66
+ const markerId = ns === "primary" ? importedMarkerId : `${importedMarkerId}::${ns}`;
67
+ return Effect
68
+ .promise(() => container
69
+ .item(markerId, markerId)
70
+ .read()
71
+ .then(({ resource }) => Option.fromNullishOr(resource)))
72
+ .pipe(Effect.flatMap((marker) => {
73
+ if (Option.isSome(marker))
74
+ return Effect.void;
75
+ return InfraLogger.logInfo(`Creating mock data for ${name} (namespace: ${ns})`).pipe(Effect.andThen(seed), Effect.flatMap((m) => Effect.flatMapOption(Effect.succeed(toNonEmptyArray([...m])), (a) => bulkSetInternal(a, ns).pipe(Effect.orDie))), Effect.andThen(Effect.promise(() => container.items.create({
76
+ _partitionKey: markerId,
77
+ id: markerId,
78
+ ttl: -1
79
+ }))), Effect.provide(ctx), Effect.orDie);
80
+ }), Effect.withLogSpan(`Cosmos.seedCheck ${name} in ${ns} [effect-app/infra/Store]`), Effect.withSpan("Cosmos.seed [effect-app/infra/Store]", { attributes: { name, namespace: ns } }));
81
+ };
82
+ const seedNamespace = Effect.fn("seedNamespace")(function* (ns) {
83
+ if (!seed)
84
+ return;
85
+ let cached = seedCache.get(ns);
86
+ if (!cached) {
87
+ cached = yield* Effect.cached(Effect.uninterruptible(makeSeedEffect(ns)));
88
+ seedCache.set(ns, cached);
89
+ }
90
+ yield* cached;
91
+ });
92
+ const bulkSetInternal = (items, ns) => Effect
93
+ .gen(function* () {
94
+ // TODO: disable batching if need atomicity
95
+ // we delay and batch to keep low amount of RUs
96
+ const b = [...items]
97
+ .map((x) => [
98
+ x,
99
+ Option.match(Option.fromNullishOr(x._etag), {
100
+ onNone: () => dropUndefinedT({
101
+ operationType: "Create",
102
+ resourceBody: {
103
+ ...Struct.omit(x, ["_etag", idKey]),
104
+ id: x[idKey],
105
+ _partitionKey: nsPartitionValue(ns, x)
106
+ }
107
+ // don't use this or we get an error that the request and some item partition key dont match - makese no sense
108
+ // partitionKey: config?.partitionValue(x)
109
+ }),
110
+ onSome: (eTag) => dropUndefinedT({
111
+ operationType: "Replace",
112
+ id: x[idKey],
113
+ resourceBody: {
114
+ ...Struct.omit(x, ["_etag", idKey]),
115
+ id: x[idKey],
116
+ _partitionKey: nsPartitionValue(ns, x)
117
+ },
118
+ ifMatch: eTag
119
+ // don't use this or we get an error that the request and some item partition key dont match - makese no sense
120
+ // partitionKey: config?.partitionValue(x)
121
+ })
122
+ })
123
+ ]);
124
+ const batches = Array.chunksOf(b, config?.maxBulkSize ?? 10);
125
+ const batchResult = yield* Effect.forEach(batches
126
+ .map((x, i) => [i, x]), ([i, batch]) => Effect
127
+ .promise(() => bulk(batch.map(([, op]) => op)))
128
+ .pipe(Effect
129
+ .delay(Duration.millis(i === 0 ? 0 : 150)), Effect
130
+ .flatMap((responses) => Effect.gen(function* () {
131
+ const r = responses.find((x) => x.statusCode === 412 || x.statusCode === 404 || x.statusCode === 409);
132
+ if (r) {
133
+ return yield* Effect.fail(new OptimisticConcurrencyException({
134
+ type: name,
135
+ id: JSON.stringify(r.resourceBody?.["id"]),
136
+ code: r.statusCode,
137
+ raw: responses
138
+ }));
139
+ }
140
+ const r2 = responses.find((x) => x.statusCode !== 424 && (x.statusCode > 299 || x.statusCode < 200));
141
+ if (r2) {
142
+ return yield* Effect.die(new CosmosDbOperationError("not able to update records: " + r2.statusCode, responses));
143
+ }
144
+ const r3 = responses.find((x) => x.statusCode > 299 || x.statusCode < 200);
145
+ if (r3) {
146
+ return yield* Effect.die(new CosmosDbOperationError("not able to update records: " + r3.statusCode, responses));
147
+ }
148
+ return batch.map(([e], i) => ({
149
+ ...e,
150
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
151
+ _etag: responses[i].eTag
152
+ }));
153
+ }))));
154
+ return batchResult.flat();
155
+ })
156
+ .pipe(Effect.withSpan("Cosmos.bulkSet [effect-app/infra/Store]", {
157
+ attributes: { "repository.container_id": containerId, "repository.model_name": name, namespace: ns }
158
+ }, { captureStackTrace: false }));
159
+ const bulkSet = (items) => resolveNamespace.pipe(Effect.flatMap((ns) => bulkSetInternal(items, ns)));
160
+ const batchSet = (items) => {
161
+ return resolveNamespace
162
+ .pipe(Effect.flatMap((ns) => Effect
163
+ .suspend(() => {
164
+ const batch = [...items].map((x) => [
51
165
  x,
52
166
  Option.match(Option.fromNullishOr(x._etag), {
53
- onNone: () => dropUndefinedT({
167
+ onNone: () => ({
54
168
  operationType: "Create",
55
169
  resourceBody: {
56
170
  ...Struct.omit(x, ["_etag", idKey]),
57
171
  id: x[idKey],
58
- _partitionKey: config?.partitionValue(x)
172
+ _partitionKey: nsPartitionValue(ns, x)
59
173
  }
60
174
  // don't use this or we get an error that the request and some item partition key dont match - makese no sense
61
175
  // partitionKey: config?.partitionValue(x)
62
176
  }),
63
- onSome: (eTag) => dropUndefinedT({
177
+ onSome: (eTag) => ({
64
178
  operationType: "Replace",
65
179
  id: x[idKey],
66
180
  resourceBody: {
67
181
  ...Struct.omit(x, ["_etag", idKey]),
68
182
  id: x[idKey],
69
- _partitionKey: config?.partitionValue(x)
183
+ _partitionKey: nsPartitionValue(ns, x)
70
184
  },
71
- ifMatch: eTag
72
185
  // don't use this or we get an error that the request and some item partition key dont match - makese no sense
73
186
  // partitionKey: config?.partitionValue(x)
187
+ ifMatch: eTag
74
188
  })
75
189
  })
76
190
  ]);
77
- const batches = Array.chunksOf(b, config?.maxBulkSize ?? 10);
78
- const batchResult = yield* Effect.forEach(batches
79
- .map((x, i) => [i, x]), ([i, batch]) => Effect
80
- .promise(() => bulk(batch.map(([, op]) => op)))
81
- .pipe(Effect
82
- .delay(Duration.millis(i === 0 ? 0 : 1100)), Effect
83
- .flatMap((responses) => Effect.gen(function* () {
84
- const r = responses.find((x) => x.statusCode === 412 || x.statusCode === 404 || x.statusCode === 409);
85
- if (r) {
86
- return yield* Effect.fail(new OptimisticConcurrencyException({
87
- type: name,
88
- id: JSON.stringify(r.resourceBody?.["id"]),
89
- code: r.statusCode,
90
- raw: responses
91
- }));
92
- }
93
- const r2 = responses.find((x) => x.statusCode !== 424 && (x.statusCode > 299 || x.statusCode < 200));
94
- if (r2) {
95
- return yield* Effect.die(new CosmosDbOperationError("not able to update records: " + r2.statusCode, responses));
96
- }
97
- const r3 = responses.find((x) => x.statusCode > 299 || x.statusCode < 200);
98
- if (r3) {
99
- return yield* Effect.die(new CosmosDbOperationError("not able to update records: " + r3.statusCode, responses));
191
+ const ex = batch.map(([, c]) => c);
192
+ return Effect
193
+ .promise(() => execBatch(ex, ex[0]?.resourceBody._partitionKey))
194
+ .pipe(Effect.flatMap(Effect.fnUntraced(function* (x) {
195
+ const result = x.result ?? [];
196
+ const firstFailed = result.find((x) => x.statusCode > 299 || x.statusCode < 200);
197
+ if (firstFailed) {
198
+ const code = firstFailed.statusCode ?? 0;
199
+ if (code === 412 || code === 404 || code === 409) {
200
+ return yield* new OptimisticConcurrencyException({ type: name, id: "batch", code });
201
+ }
202
+ return yield* Effect.die(new CosmosDbOperationError("not able to update record: " + code));
100
203
  }
101
204
  return batch.map(([e], i) => ({
102
205
  ...e,
103
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
104
- _etag: responses[i].eTag
206
+ _etag: result[i]?.eTag
105
207
  }));
106
- }))));
107
- return batchResult.flat();
208
+ })));
108
209
  })
109
- .pipe(Effect.withSpan("Cosmos.bulkSet [effect-app/infra/Store]", {
110
- attributes: { "repository.container_id": containerId, "repository.model_name": name }
111
- }, { captureStackTrace: false }));
112
- const batchSet = (items) => {
113
- return Effect
114
- .suspend(() => {
115
- const batch = [...items].map((x) => [
116
- x,
117
- Option.match(Option.fromNullishOr(x._etag), {
118
- onNone: () => ({
119
- operationType: "Create",
120
- resourceBody: {
121
- ...Struct.omit(x, ["_etag", idKey]),
122
- id: x[idKey],
123
- _partitionKey: config?.partitionValue(x)
124
- }
125
- // don't use this or we get an error that the request and some item partition key dont match - makese no sense
126
- // partitionKey: config?.partitionValue(x)
127
- }),
128
- onSome: (eTag) => ({
129
- operationType: "Replace",
130
- id: x[idKey],
131
- resourceBody: {
132
- ...Struct.omit(x, ["_etag", idKey]),
133
- id: x[idKey],
134
- _partitionKey: config?.partitionValue(x)
135
- },
136
- // don't use this or we get an error that the request and some item partition key dont match - makese no sense
137
- // partitionKey: config?.partitionValue(x)
138
- ifMatch: eTag
139
- })
140
- })
141
- ]);
142
- const ex = batch.map(([, c]) => c);
143
- return Effect
144
- .promise(() => execBatch(ex, ex[0]?.resourceBody._partitionKey))
145
- .pipe(Effect.flatMap(Effect.fnUntraced(function* (x) {
146
- const result = x.result ?? [];
147
- const firstFailed = result.find((x) => x.statusCode > 299 || x.statusCode < 200);
148
- if (firstFailed) {
149
- const code = firstFailed.statusCode ?? 0;
150
- if (code === 412 || code === 404 || code === 409) {
151
- return yield* new OptimisticConcurrencyException({ type: name, id: "batch", code });
152
- }
153
- return yield* Effect.die(new CosmosDbOperationError("not able to update record: " + code));
154
- }
155
- return batch.map(([e], i) => ({
156
- ...e,
157
- _etag: result[i]?.eTag
158
- }));
159
- })));
160
- })
161
- .pipe(Effect
162
- .withSpan("Cosmos.batchSet [effect-app/infra/Store]", {
163
- attributes: { "repository.container_id": containerId, "repository.model_name": name }
164
- }, { captureStackTrace: false }));
165
- };
166
- const s = {
167
- queryRaw: (query) => Effect
168
- .sync(() => query.cosmos({ name }))
169
- .pipe(Effect.tap((q) => logQuery(q)), Effect.flatMap((q) => Effect.promise(() => container
170
- .items
171
- .query(q, { partitionKey: mainPartitionKey })
172
- .fetchAll()
173
- .then(({ resources }) => resources.map((_) => ({ ...defaultValues, ...mapReverseId(_) }))))), Effect
174
- .withSpan("Cosmos.queryRaw [effect-app/infra/Store]", {
175
- attributes: { "repository.container_id": containerId, "repository.model_name": name }
176
- }, { captureStackTrace: false })),
177
- batchRemove: (ids, partitionKey) => Effect.promise(() => execBatch(mutable(ids.map((id) => dropUndefinedT({
178
- operationType: "Delete",
179
- id
180
- // don't use this or we get an error that the request and some item partition key dont match - makese no sense
181
- // partitionKey: config?.partitionValue({ [idKey]: id } as Encoded)
182
- }))), partitionKey ?? mainPartitionKey)),
183
- all: Effect
184
- .sync(() => ({
210
+ .pipe(Effect
211
+ .withSpan("Cosmos.batchSet [effect-app/infra/Store]", {
212
+ attributes: {
213
+ "repository.container_id": containerId,
214
+ "repository.model_name": name,
215
+ namespace: ns
216
+ }
217
+ }, { captureStackTrace: false }))));
218
+ };
219
+ const s = {
220
+ seedNamespace: (ns) => seedNamespace(ns),
221
+ queryRaw: (query) => Effect
222
+ .all({ q: Effect.sync(() => query.cosmos({ name })), ns: resolveNamespace })
223
+ .pipe(Effect.tap(({ q }) => logQuery(q)), Effect.flatMap(({ ns, q }) => Effect
224
+ .promise(() => container
225
+ .items
226
+ .query(q, { partitionKey: nsBasePartitionKey(ns) })
227
+ .fetchAll()
228
+ .then(({ resources }) => resources.map((_) => ({ ...defaultValues, ...mapReverseId(_) }))))
229
+ .pipe(Effect.withSpan("Cosmos.queryRaw [effect-app/infra/Store]", {
230
+ attributes: {
231
+ "repository.container_id": containerId,
232
+ "repository.model_name": name,
233
+ namespace: ns
234
+ }
235
+ }, { captureStackTrace: false })))),
236
+ batchRemove: (ids, partitionKey) => resolveNamespace.pipe(Effect.flatMap((ns) => Effect
237
+ .promise(() => execBatch(mutable(ids.map((id) => dropUndefinedT({
238
+ operationType: "Delete",
239
+ id
240
+ // don't use this or we get an error that the request and some item partition key dont match - makese no sense
241
+ // partitionKey: config?.partitionValue({ [idKey]: id } as Encoded)
242
+ }))), partitionKey ?? nsBasePartitionKey(ns)))
243
+ .pipe(Effect.withSpan("Cosmos.batchRemove [effect-app/infra/Store]", {
244
+ attributes: {
245
+ "repository.container_id": containerId,
246
+ "repository.model_name": name,
247
+ namespace: ns
248
+ }
249
+ }, { captureStackTrace: false })))),
250
+ all: Effect
251
+ .all({
252
+ q: Effect.sync(() => ({
185
253
  query: `SELECT * FROM ${name}`,
186
254
  parameters: []
187
- }))
188
- .pipe(Effect.tap((q) => logQuery(q)), Effect.flatMap((q) => Effect.promise(() => container
189
- .items
190
- .query(q, { partitionKey: mainPartitionKey })
191
- .fetchAll()
192
- .then(({ resources }) => resources.map((_) => ({ ...defaultValues, ...mapReverseId(_) }))))), Effect
193
- .withSpan("Cosmos.all [effect-app/infra/Store]", {
194
- attributes: { "repository.container_id": containerId, "repository.model_name": name }
195
- }, { captureStackTrace: false })),
196
- /**
197
- * May return duplicate results for "join_find", when matching more than once.
198
- */
199
- filter: (f) => {
200
- const skip = f?.skip;
201
- const limit = f?.limit;
202
- const filter = f.filter;
203
- return Effect
204
- .sync(() => buildWhereCosmosQuery3(idKey, filter ? [{ t: "where-scope", result: filter, relation: "some" }] : [], name, defaultValues, f.select, f.order, skip, limit))
205
- .pipe(Effect.tap((q) => logQuery(q)), Effect
206
- .flatMap((q) => Effect.promise(() => f.select
207
- ? container
208
- .items
209
- .query(q, { partitionKey: mainPartitionKey })
210
- .fetchAll()
211
- .then(({ resources }) => resources.map((_) => ({
212
- ...pipe(defaultValues, Struct.pick(f.select.filter((_) => typeof _ === "string"))),
213
- ...mapReverseId(_)
214
- })))
215
- : container
216
- .items
217
- .query(q, { partitionKey: mainPartitionKey })
218
- .fetchAll()
219
- .then(({ resources }) => resources.map(({ f }) => ({ ...defaultValues, ...mapReverseId(f) }))))))
220
- .pipe(Effect.withSpan("Cosmos.filter [effect-app/infra/Store]", {
221
- attributes: { "repository.container_id": containerId, "repository.model_name": name }
222
- }, { captureStackTrace: false }));
223
- },
224
- find: (id) => Effect
225
- .promise(() => container
226
- .item(id, config?.partitionValue({ [idKey]: id }))
227
- .read()
228
- .then(({ resource }) => Option.fromNullishOr(resource).pipe(Option.map((_) => ({ ...defaultValues, ...mapReverseId(_) })))))
229
- .pipe(Effect
230
- .withSpan("Cosmos.find [effect-app/infra/Store]", {
231
- attributes: {
232
- "repository.container_id": containerId,
233
- "repository.model_name": name,
234
- partitionValue: config?.partitionValue({ [idKey]: id }),
235
- id
236
- }
237
- }, { captureStackTrace: false })),
238
- set: (e) => Option
239
- .match(Option
240
- .fromNullishOr(e._etag), {
241
- onNone: () => Effect.promise(() => container.items.create({
242
- ...mapId(e),
243
- _partitionKey: config?.partitionValue(e)
244
- })),
245
- onSome: (eTag) => Effect.promise(() => container.item(e[idKey], config?.partitionValue(e)).replace({ ...mapId(e), _partitionKey: config?.partitionValue(e) }, {
246
- accessCondition: {
247
- type: "IfMatch",
248
- condition: eTag
249
- }
250
- }))
255
+ })),
256
+ ns: resolveNamespace
257
+ })
258
+ .pipe(Effect.tap(({ q }) => logQuery(q)), Effect.flatMap(({ ns, q }) => Effect
259
+ .promise(() => container
260
+ .items
261
+ .query(q, { partitionKey: nsBasePartitionKey(ns) })
262
+ .fetchAll()
263
+ .then(({ resources }) => resources.map((_) => ({ ...defaultValues, ...mapReverseId(_) }))))
264
+ .pipe(Effect.withSpan("Cosmos.all [effect-app/infra/Store]", {
265
+ attributes: {
266
+ "repository.container_id": containerId,
267
+ "repository.model_name": name,
268
+ namespace: ns
269
+ }
270
+ }, { captureStackTrace: false })))),
271
+ /**
272
+ * May return duplicate results for "join_find", when matching more than once.
273
+ */
274
+ filter: (f) => {
275
+ const skip = f?.skip;
276
+ const limit = f?.limit;
277
+ const filter = f.filter;
278
+ return Effect
279
+ .all({
280
+ q: Effect.sync(() => buildWhereCosmosQuery3(idKey, filter ? [{ t: "where-scope", result: filter, relation: "some" }] : [], name, defaultValues, f.select, f.order, skip, limit)),
281
+ ns: resolveNamespace
251
282
  })
252
- .pipe(Effect
253
- .flatMap((x) => {
254
- if (x.statusCode === 412 || x.statusCode === 404 || x.statusCode === 409) {
255
- return Effect.fail(new OptimisticConcurrencyException({ type: name, id: e[idKey], code: x.statusCode }));
256
- }
257
- if (x.statusCode > 299 || x.statusCode < 200) {
258
- return Effect.die(new CosmosDbOperationError("not able to update record: " + x.statusCode));
259
- }
260
- return Effect.sync(() => ({
261
- ...e,
262
- _etag: x.etag
263
- }));
264
- }), Effect
265
- .withSpan("Cosmos.set [effect-app/infra/Store]", {
283
+ .pipe(Effect.tap(({ q }) => logQuery(q)), Effect
284
+ .flatMap(({ ns, q }) => Effect
285
+ .promise(() => f.select
286
+ ? container
287
+ .items
288
+ .query(q, { partitionKey: nsBasePartitionKey(ns) })
289
+ .fetchAll()
290
+ .then(({ resources }) => resources.map((_) => ({
291
+ ...pipe(defaultValues, Struct.pick(f.select.filter((_) => typeof _ === "string"))),
292
+ ...mapReverseId(_)
293
+ })))
294
+ : container
295
+ .items
296
+ .query(q, { partitionKey: nsBasePartitionKey(ns) })
297
+ .fetchAll()
298
+ .then(({ resources }) => resources.map(({ f }) => ({ ...defaultValues, ...mapReverseId(f) }))))
299
+ .pipe(Effect.withSpan("Cosmos.filter [effect-app/infra/Store]", {
266
300
  attributes: {
267
301
  "repository.container_id": containerId,
268
302
  "repository.model_name": name,
269
- id: e[idKey]
303
+ namespace: ns
270
304
  }
271
- }, { captureStackTrace: false })),
272
- batchSet,
273
- bulkSet
274
- };
275
- // handle mock data
276
- const marker = yield* Effect.promise(() => container
277
- .item(importedMarkerId, importedMarkerId)
305
+ }, { captureStackTrace: false }))));
306
+ },
307
+ find: (id) => resolveNamespace.pipe(Effect.flatMap((ns) => Effect
308
+ .promise(() => container
309
+ .item(id, nsPartitionValue(ns, { [idKey]: id }))
278
310
  .read()
279
- .then(({ resource }) => Option.fromNullishOr(resource)));
280
- if (!Option.isSome(marker)) {
281
- yield* InfraLogger.logInfo("Creating mock data for " + name);
282
- if (seed) {
283
- const m = yield* seed;
284
- yield* Effect.flatMapOption(Effect.succeed(toNonEmptyArray([...m])), (a) => s.bulkSet(a).pipe(Effect.orDie, Effect
285
- // we delay extra here, so that initial creation between Companies/POs also have an interval between them.
286
- .delay(Duration.millis(1100))));
311
+ .then(({ resource }) => Option.fromNullishOr(resource).pipe(Option.map((_) => ({ ...defaultValues, ...mapReverseId(_) })))))
312
+ .pipe(Effect
313
+ .withSpan("Cosmos.find [effect-app/infra/Store]", {
314
+ attributes: {
315
+ "repository.container_id": containerId,
316
+ "repository.model_name": name,
317
+ partitionValue: nsPartitionValue(ns, { [idKey]: id }),
318
+ namespace: ns,
319
+ id
287
320
  }
288
- // Mark as imported
289
- yield* Effect.promise(() => container.items.create({
290
- _partitionKey: importedMarkerId,
291
- id: importedMarkerId,
292
- ttl: -1
321
+ }, { captureStackTrace: false })))),
322
+ set: (e) => resolveNamespace.pipe(Effect.flatMap((ns) => Option
323
+ .match(Option
324
+ .fromNullishOr(e._etag), {
325
+ onNone: () => Effect.promise(() => container.items.create({
326
+ ...mapId(e),
327
+ _partitionKey: nsPartitionValue(ns, e)
328
+ })),
329
+ onSome: (eTag) => Effect.promise(() => container.item(e[idKey], nsPartitionValue(ns, e)).replace({ ...mapId(e), _partitionKey: nsPartitionValue(ns, e) }, {
330
+ accessCondition: {
331
+ type: "IfMatch",
332
+ condition: eTag
333
+ }
334
+ }))
335
+ })
336
+ .pipe(Effect
337
+ .flatMap((x) => {
338
+ if (x.statusCode === 412 || x.statusCode === 404 || x.statusCode === 409) {
339
+ return Effect.fail(new OptimisticConcurrencyException({ type: name, id: e[idKey], code: x.statusCode }));
340
+ }
341
+ if (x.statusCode > 299 || x.statusCode < 200) {
342
+ return Effect.die(new CosmosDbOperationError("not able to update record: " + x.statusCode));
343
+ }
344
+ return Effect.sync(() => ({
345
+ ...e,
346
+ _etag: x.etag
293
347
  }));
294
- }
295
- return s;
296
- })
297
- };
298
- });
299
- }
348
+ }), Effect
349
+ .withSpan("Cosmos.set [effect-app/infra/Store]", {
350
+ attributes: {
351
+ "repository.container_id": containerId,
352
+ "repository.model_name": name,
353
+ namespace: ns,
354
+ id: e[idKey]
355
+ }
356
+ }, { captureStackTrace: false })))),
357
+ batchSet,
358
+ bulkSet
359
+ };
360
+ // Eagerly seed primary namespace on initialization
361
+ yield* seedNamespace("primary");
362
+ return s;
363
+ })
364
+ };
365
+ });
300
366
  export function CosmosStoreLayer(cfg) {
301
367
  return StoreMaker
302
368
  .toLayer(makeCosmosStore(cfg))
303
369
  .pipe(Layer.provide(CosmosClientLayer(Redacted.value(cfg.url), cfg.dbName)));
304
370
  }
305
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zbW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1N0b3JlL0Nvc21vcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBOEIsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3ZILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUM5RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUcxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDcEUsT0FBTyxFQUFnRyxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFdkksTUFBTSxTQUFTLEdBQ2IsQ0FBMkQsS0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvRyxHQUFHLENBQUM7SUFDSixFQUFFO0NBQ0gsQ0FBQyxDQUFBO0FBQ0osTUFBTSxnQkFBZ0IsR0FDcEIsQ0FBMkQsS0FBWSxFQUFFLEVBQUUsQ0FDM0UsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBK0QsRUFBRSxFQUFFLENBQzVFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUF5QyxDQUFBO0FB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
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zbW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1N0b3JlL0Nvc21vcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBOEIsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3ZILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUM5RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUcxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNyQyxPQUFPLEVBQWdHLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUV2SSxNQUFNLFNBQVMsR0FDYixDQUEyRCxLQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9HLEdBQUcsQ0FBQztJQUNKLEVBQUU7Q0FDSCxDQUFDLENBQUE7QUFDSixNQUFNLGdCQUFnQixHQUNwQixDQUEyRCxLQUFZLEVBQUUsRUFBRSxDQUMzRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUErRCxFQUFFLEVBQUUsQ0FDNUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENB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