joist-orm 0.1.538 → 1.0.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.
Files changed (221) hide show
  1. package/build/{BaseEntity.d.ts → src/BaseEntity.d.ts} +2 -1
  2. package/build/{BaseEntity.js → src/BaseEntity.js} +13 -9
  3. package/build/src/BaseEntity.js.map +1 -0
  4. package/build/{EntityManager.d.ts → src/EntityManager.d.ts} +139 -110
  5. package/build/{EntityManager.js → src/EntityManager.js} +281 -262
  6. package/build/src/EntityManager.js.map +1 -0
  7. package/build/{QueryBuilder.d.ts → src/QueryBuilder.d.ts} +53 -3
  8. package/build/src/QueryBuilder.js +341 -0
  9. package/build/src/QueryBuilder.js.map +1 -0
  10. package/build/src/Todo.d.ts +25 -0
  11. package/build/src/Todo.js +52 -0
  12. package/build/src/Todo.js.map +1 -0
  13. package/build/src/changes.d.ts +34 -0
  14. package/build/src/changes.js +37 -0
  15. package/build/src/changes.js.map +1 -0
  16. package/build/src/config.d.ts +43 -0
  17. package/build/src/config.js +114 -0
  18. package/build/src/config.js.map +1 -0
  19. package/build/{createOrUpdatePartial.d.ts → src/createOrUpdatePartial.d.ts} +2 -1
  20. package/build/{createOrUpdatePartial.js → src/createOrUpdatePartial.js} +42 -10
  21. package/build/src/createOrUpdatePartial.js.map +1 -0
  22. package/build/src/dataloaders/findDataLoader.d.ts +5 -0
  23. package/build/src/dataloaders/findDataLoader.js +28 -0
  24. package/build/src/dataloaders/findDataLoader.js.map +1 -0
  25. package/build/src/dataloaders/loadDataLoader.d.ts +3 -0
  26. package/build/src/dataloaders/loadDataLoader.js +37 -0
  27. package/build/src/dataloaders/loadDataLoader.js.map +1 -0
  28. package/build/src/dataloaders/manyToManyDataLoader.d.ts +5 -0
  29. package/build/src/dataloaders/manyToManyDataLoader.js +78 -0
  30. package/build/src/dataloaders/manyToManyDataLoader.js.map +1 -0
  31. package/build/src/dataloaders/manyToManyFindDataLoader.d.ts +5 -0
  32. package/build/src/dataloaders/manyToManyFindDataLoader.js +33 -0
  33. package/build/src/dataloaders/manyToManyFindDataLoader.js.map +1 -0
  34. package/build/src/dataloaders/oneToManyDataLoader.d.ts +4 -0
  35. package/build/src/dataloaders/oneToManyDataLoader.js +40 -0
  36. package/build/src/dataloaders/oneToManyDataLoader.js.map +1 -0
  37. package/build/src/dataloaders/oneToManyFindDataLoader.d.ts +5 -0
  38. package/build/src/dataloaders/oneToManyFindDataLoader.js +32 -0
  39. package/build/src/dataloaders/oneToManyFindDataLoader.js.map +1 -0
  40. package/build/src/dataloaders/oneToOneDataLoader.d.ts +4 -0
  41. package/build/src/dataloaders/oneToOneDataLoader.js +40 -0
  42. package/build/src/dataloaders/oneToOneDataLoader.js.map +1 -0
  43. package/build/src/drivers/IdAssigner.d.ts +33 -0
  44. package/build/src/drivers/IdAssigner.js +106 -0
  45. package/build/src/drivers/IdAssigner.js.map +1 -0
  46. package/build/src/drivers/InMemoryDriver.d.ts +29 -0
  47. package/build/src/drivers/InMemoryDriver.js +306 -0
  48. package/build/src/drivers/InMemoryDriver.js.map +1 -0
  49. package/build/src/drivers/PostgresDriver.d.ts +40 -0
  50. package/build/src/drivers/PostgresDriver.js +376 -0
  51. package/build/src/drivers/PostgresDriver.js.map +1 -0
  52. package/build/src/drivers/driver.d.ts +23 -0
  53. package/build/src/drivers/driver.js +3 -0
  54. package/build/src/drivers/driver.js.map +1 -0
  55. package/build/src/drivers/index.d.ts +4 -0
  56. package/build/src/drivers/index.js +17 -0
  57. package/build/src/drivers/index.js.map +1 -0
  58. package/build/{getProperties.d.ts → src/getProperties.d.ts} +0 -0
  59. package/build/{getProperties.js → src/getProperties.js} +1 -1
  60. package/build/src/getProperties.js.map +1 -0
  61. package/build/src/index.d.ts +62 -0
  62. package/build/src/index.js +263 -0
  63. package/build/src/index.js.map +1 -0
  64. package/build/src/keys.d.ts +30 -0
  65. package/build/{keys.js → src/keys.js} +48 -16
  66. package/build/src/keys.js.map +1 -0
  67. package/build/{loadLens.d.ts → src/loadLens.d.ts} +2 -2
  68. package/build/{loadLens.js → src/loadLens.js} +1 -1
  69. package/build/src/loadLens.js.map +1 -0
  70. package/build/src/loaded.d.ts +49 -0
  71. package/build/src/loaded.js +9 -0
  72. package/build/src/loaded.js.map +1 -0
  73. package/build/{newTestInstance.d.ts → src/newTestInstance.d.ts} +37 -3
  74. package/build/src/newTestInstance.js +342 -0
  75. package/build/src/newTestInstance.js.map +1 -0
  76. package/build/{collections → src/relations}/AbstractRelationImpl.d.ts +6 -5
  77. package/build/{collections → src/relations}/AbstractRelationImpl.js +0 -0
  78. package/build/src/relations/AbstractRelationImpl.js.map +1 -0
  79. package/build/src/relations/Collection.d.ts +26 -0
  80. package/build/src/relations/Collection.js +19 -0
  81. package/build/src/relations/Collection.js.map +1 -0
  82. package/build/{collections → src/relations}/CustomCollection.d.ts +6 -2
  83. package/build/{collections → src/relations}/CustomCollection.js +17 -9
  84. package/build/src/relations/CustomCollection.js.map +1 -0
  85. package/build/{collections → src/relations}/CustomReference.d.ts +7 -2
  86. package/build/{collections → src/relations}/CustomReference.js +16 -9
  87. package/build/src/relations/CustomReference.js.map +1 -0
  88. package/build/src/relations/LargeCollection.d.ts +17 -0
  89. package/build/src/relations/LargeCollection.js +3 -0
  90. package/build/src/relations/LargeCollection.js.map +1 -0
  91. package/build/{collections → src/relations}/ManyToManyCollection.d.ts +9 -2
  92. package/build/src/relations/ManyToManyCollection.js +249 -0
  93. package/build/src/relations/ManyToManyCollection.js.map +1 -0
  94. package/build/src/relations/ManyToManyLargeCollection.d.ts +25 -0
  95. package/build/src/relations/ManyToManyLargeCollection.js +97 -0
  96. package/build/src/relations/ManyToManyLargeCollection.js.map +1 -0
  97. package/build/src/relations/ManyToOneReference.d.ts +77 -0
  98. package/build/{collections → src/relations}/ManyToOneReference.js +101 -48
  99. package/build/src/relations/ManyToOneReference.js.map +1 -0
  100. package/build/{collections → src/relations}/OneToManyCollection.d.ts +10 -2
  101. package/build/{collections → src/relations}/OneToManyCollection.js +54 -59
  102. package/build/src/relations/OneToManyCollection.js.map +1 -0
  103. package/build/src/relations/OneToManyLargeCollection.d.ts +25 -0
  104. package/build/src/relations/OneToManyLargeCollection.js +83 -0
  105. package/build/src/relations/OneToManyLargeCollection.js.map +1 -0
  106. package/build/src/relations/OneToOneReference.d.ts +82 -0
  107. package/build/src/relations/OneToOneReference.js +168 -0
  108. package/build/src/relations/OneToOneReference.js.map +1 -0
  109. package/build/src/relations/PolymorphicReference.d.ts +69 -0
  110. package/build/src/relations/PolymorphicReference.js +210 -0
  111. package/build/src/relations/PolymorphicReference.js.map +1 -0
  112. package/build/src/relations/Reference.d.ts +29 -0
  113. package/build/src/relations/Reference.js +23 -0
  114. package/build/src/relations/Reference.js.map +1 -0
  115. package/build/src/relations/Relation.d.ts +10 -0
  116. package/build/src/relations/Relation.js +13 -0
  117. package/build/src/relations/Relation.js.map +1 -0
  118. package/build/src/relations/hasAsyncProperty.d.ts +36 -0
  119. package/build/src/relations/hasAsyncProperty.js +55 -0
  120. package/build/src/relations/hasAsyncProperty.js.map +1 -0
  121. package/build/{collections → src/relations}/hasManyDerived.d.ts +2 -1
  122. package/build/{collections → src/relations}/hasManyDerived.js +1 -1
  123. package/build/src/relations/hasManyDerived.js.map +1 -0
  124. package/build/{collections → src/relations}/hasManyThrough.d.ts +0 -0
  125. package/build/{collections → src/relations}/hasManyThrough.js +2 -2
  126. package/build/src/relations/hasManyThrough.js.map +1 -0
  127. package/build/{collections → src/relations}/hasOneDerived.d.ts +3 -2
  128. package/build/{collections → src/relations}/hasOneDerived.js +1 -1
  129. package/build/src/relations/hasOneDerived.js.map +1 -0
  130. package/build/{collections → src/relations}/hasOneThrough.d.ts +0 -0
  131. package/build/{collections → src/relations}/hasOneThrough.js +2 -2
  132. package/build/src/relations/hasOneThrough.js.map +1 -0
  133. package/build/src/relations/index.d.ts +18 -0
  134. package/build/src/relations/index.js +53 -0
  135. package/build/src/relations/index.js.map +1 -0
  136. package/build/{reverseHint.d.ts → src/reverseHint.d.ts} +2 -1
  137. package/build/{reverseHint.js → src/reverseHint.js} +13 -9
  138. package/build/src/reverseHint.js.map +1 -0
  139. package/build/src/rules.d.ts +23 -0
  140. package/build/src/rules.js +23 -0
  141. package/build/src/rules.js.map +1 -0
  142. package/build/src/serde.d.ts +121 -0
  143. package/build/src/serde.js +190 -0
  144. package/build/src/serde.js.map +1 -0
  145. package/build/{utils.d.ts → src/utils.d.ts} +2 -0
  146. package/build/{utils.js → src/utils.js} +10 -1
  147. package/build/src/utils.js.map +1 -0
  148. package/build/tsconfig.tsbuildinfo +1 -0
  149. package/package.json +30 -15
  150. package/build/BaseEntity.js.map +0 -1
  151. package/build/EntityManager.js.map +0 -1
  152. package/build/EntityPersister.d.ts +0 -30
  153. package/build/EntityPersister.js +0 -197
  154. package/build/EntityPersister.js.map +0 -1
  155. package/build/QueryBuilder.js +0 -195
  156. package/build/QueryBuilder.js.map +0 -1
  157. package/build/changes.d.ts +0 -23
  158. package/build/changes.js +0 -14
  159. package/build/changes.js.map +0 -1
  160. package/build/collections/AbstractRelationImpl.js.map +0 -1
  161. package/build/collections/CustomCollection.js.map +0 -1
  162. package/build/collections/CustomReference.js.map +0 -1
  163. package/build/collections/ManyToManyCollection.js +0 -288
  164. package/build/collections/ManyToManyCollection.js.map +0 -1
  165. package/build/collections/ManyToOneReference.d.ts +0 -50
  166. package/build/collections/ManyToOneReference.js.map +0 -1
  167. package/build/collections/OneToManyCollection.js.map +0 -1
  168. package/build/collections/OneToOneReference.d.ts +0 -51
  169. package/build/collections/OneToOneReference.js +0 -132
  170. package/build/collections/OneToOneReference.js.map +0 -1
  171. package/build/collections/hasManyDerived.js.map +0 -1
  172. package/build/collections/hasManyThrough.js.map +0 -1
  173. package/build/collections/hasOneDerived.js.map +0 -1
  174. package/build/collections/hasOneThrough.js.map +0 -1
  175. package/build/collections/index.d.ts +0 -19
  176. package/build/collections/index.js +0 -49
  177. package/build/collections/index.js.map +0 -1
  178. package/build/createOrUpdatePartial.js.map +0 -1
  179. package/build/getProperties.js.map +0 -1
  180. package/build/index.d.ts +0 -140
  181. package/build/index.js +0 -278
  182. package/build/index.js.map +0 -1
  183. package/build/keys.d.ts +0 -21
  184. package/build/keys.js.map +0 -1
  185. package/build/loadLens.js.map +0 -1
  186. package/build/newTestInstance.js +0 -153
  187. package/build/newTestInstance.js.map +0 -1
  188. package/build/reverseHint.js.map +0 -1
  189. package/build/serde.d.ts +0 -47
  190. package/build/serde.js +0 -93
  191. package/build/serde.js.map +0 -1
  192. package/build/utils.js.map +0 -1
  193. package/package.json.bak +0 -27
  194. package/src/BaseEntity.ts +0 -104
  195. package/src/EntityManager.ts +0 -1263
  196. package/src/EntityPersister.ts +0 -240
  197. package/src/QueryBuilder.ts +0 -289
  198. package/src/changes.ts +0 -40
  199. package/src/collections/AbstractRelationImpl.ts +0 -28
  200. package/src/collections/CustomCollection.ts +0 -152
  201. package/src/collections/CustomReference.ts +0 -138
  202. package/src/collections/ManyToManyCollection.ts +0 -346
  203. package/src/collections/ManyToOneReference.ts +0 -215
  204. package/src/collections/OneToManyCollection.ts +0 -254
  205. package/src/collections/OneToOneReference.ts +0 -153
  206. package/src/collections/hasManyDerived.ts +0 -29
  207. package/src/collections/hasManyThrough.ts +0 -20
  208. package/src/collections/hasOneDerived.ts +0 -26
  209. package/src/collections/hasOneThrough.ts +0 -20
  210. package/src/collections/index.ts +0 -74
  211. package/src/createOrUpdatePartial.ts +0 -144
  212. package/src/getProperties.ts +0 -27
  213. package/src/index.ts +0 -400
  214. package/src/keys.ts +0 -75
  215. package/src/loadLens.ts +0 -126
  216. package/src/newTestInstance.ts +0 -205
  217. package/src/reverseHint.ts +0 -43
  218. package/src/serde.ts +0 -97
  219. package/src/utils.ts +0 -63
  220. package/tsconfig.json +0 -21
  221. package/tsconfig.tsbuildinfo +0 -2646
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneToManyDataLoader.js","sourceRoot":"","sources":["../../../src/dataloaders/oneToManyDataLoader.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAoC;AAEpC,oCAAwG;AACxG,oCAA6C;AAE7C,SAAgB,mBAAmB,CACjC,EAAiB,EACjB,UAAqC;IAErC,2DAA2D;IAC3D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;IACvC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IACpD,OAAO,IAAA,gBAAQ,EAAC,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE;QAC/C,OAAO,IAAI,oBAAU,CAAc,KAAK,EAAE,KAAK,EAAE,EAAE;YACjD,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;YAEjC,IAAA,0BAAkB,EAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAA,gBAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAEnC,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAEjE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAClG,sCAAsC;YAEtC,MAAM,QAAQ,GAAG,IAAA,eAAO,EAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC5C,wEAAwE;gBACxE,MAAM,OAAO,GAAG,IAAA,iCAAyB,EAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;gBACxF,yFAAyF;gBACzF,uFAAuF;gBACvF,0FAA0F;gBAC1F,sFAAsF;gBACtF,0FAA0F;gBAC1F,qFAAqF;gBACrF,eAAe;gBACf,OAAO,OAAO,IAAI,oBAAoB,CAAC;YACzC,CAAC,CAAC,CAAC;YACH,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAnCD,kDAmCC"}
@@ -0,0 +1,5 @@
1
+ import DataLoader from "dataloader";
2
+ import { Entity, EntityManager } from "../EntityManager";
3
+ import { OneToManyCollection, OneToManyLargeCollection } from "../index";
4
+ /** Batches o2m.find/include calls (i.e. that don't fully load the o2m relation). */
5
+ export declare function oneToManyFindDataLoader<T extends Entity, U extends Entity>(em: EntityManager, collection: OneToManyCollection<T, U> | OneToManyLargeCollection<T, U>): DataLoader<string, U | undefined>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.oneToManyFindDataLoader = void 0;
7
+ const dataloader_1 = __importDefault(require("dataloader"));
8
+ const utils_1 = require("../utils");
9
+ /** Batches o2m.find/include calls (i.e. that don't fully load the o2m relation). */
10
+ function oneToManyFindDataLoader(em, collection) {
11
+ const { meta, fieldName } = collection;
12
+ const loaderName = `find-${meta.tableName}.${collection.fieldName}`;
13
+ return (0, utils_1.getOrSet)(em.loadLoaders, loaderName, () => {
14
+ return new dataloader_1.default(async (keys) => {
15
+ const { em } = collection.entity;
16
+ const rows = await em.driver.findOneToMany(em, collection, keys);
17
+ const entities = rows.map((row) => em.hydrate(collection.otherMeta.cstr, row, { overwriteExisting: false }));
18
+ // Decode `id=b:1,author_id=a:1`
19
+ return keys.map((k) => {
20
+ const [otherKey, parentKey] = k.split(",");
21
+ const [, otherId] = otherKey.split("=");
22
+ const [, parentId] = parentKey.split("=");
23
+ const other = em.getEntity(otherId);
24
+ // We have may fetched `other` for a different parent in our batch
25
+ const isMine = other?.[collection.otherFieldName].id === parentId;
26
+ return isMine ? other : undefined;
27
+ });
28
+ });
29
+ });
30
+ }
31
+ exports.oneToManyFindDataLoader = oneToManyFindDataLoader;
32
+ //# sourceMappingURL=oneToManyFindDataLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneToManyFindDataLoader.js","sourceRoot":"","sources":["../../../src/dataloaders/oneToManyFindDataLoader.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAoC;AAGpC,oCAAoC;AAEpC,oFAAoF;AACpF,SAAgB,uBAAuB,CACrC,EAAiB,EACjB,UAAsE;IAEtE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;IACvC,MAAM,UAAU,GAAG,QAAQ,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;IACpE,OAAO,IAAA,gBAAQ,EAAC,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE;QAC/C,OAAO,IAAI,oBAAU,CAAwB,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1D,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7G,gCAAgC;YAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACpB,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC3C,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxC,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,OAAkB,CAAC,CAAC;gBAC/C,kEAAkE;gBAClE,MAAM,MAAM,GAAI,KAAa,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;gBAC3E,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAvBD,0DAuBC"}
@@ -0,0 +1,4 @@
1
+ import DataLoader from "dataloader";
2
+ import { Entity, EntityManager } from "../EntityManager";
3
+ import { OneToOneReferenceImpl } from "../relations/OneToOneReference";
4
+ export declare function oneToOneDataLoader<T extends Entity, U extends Entity>(em: EntityManager, reference: OneToOneReferenceImpl<T, U>): DataLoader<string, U | undefined>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.oneToOneDataLoader = void 0;
7
+ const dataloader_1 = __importDefault(require("dataloader"));
8
+ const EntityManager_1 = require("../EntityManager");
9
+ const index_1 = require("../index");
10
+ const utils_1 = require("../utils");
11
+ function oneToOneDataLoader(em, reference) {
12
+ // The metadata for the entity that contains the reference
13
+ const meta = (0, EntityManager_1.getMetadata)(reference.entity);
14
+ const loaderName = `${meta.tableName}.${reference.fieldName}`;
15
+ return (0, utils_1.getOrSet)(em.loadLoaders, loaderName, () => {
16
+ return new dataloader_1.default(async (_keys) => {
17
+ const { otherMeta, otherFieldName } = reference;
18
+ (0, index_1.assertIdsAreTagged)(_keys);
19
+ const keys = (0, index_1.deTagIds)(meta, _keys);
20
+ const { em } = reference.entity;
21
+ const rows = await em.driver.loadOneToOne(em, reference, keys);
22
+ const entities = rows.map((row) => em.hydrate(otherMeta.cstr, row, { overwriteExisting: false }));
23
+ const rowsById = (0, utils_1.groupBy)(entities, (entity) => {
24
+ // TODO If this came from the UoW, it may not be an id? I.e. pre-insert.
25
+ const ownerId = (0, index_1.maybeResolveReferenceToId)(entity.__orm.data[otherFieldName]);
26
+ // We almost always expect ownerId to be found, b/c normally we just hydrated this entity
27
+ // directly from a SQL row with owner_id=X, however we might be loading this reference
28
+ // (i.e. find all children where owner_id=X) when the SQL thinks a child is still pointing
29
+ // at the parent (i.e. owner_id=X in the db), but our already-loaded child has had its
30
+ // `child.owner` field either changed to some other owner, or set to undefined. In either,
31
+ // that child should no longer be parent of this owner's collection, so just return a
32
+ // dummy value.
33
+ return ownerId ?? "dummyNoLongerOwned";
34
+ });
35
+ return _keys.map((k) => rowsById.get(k)?.[0]);
36
+ });
37
+ });
38
+ }
39
+ exports.oneToOneDataLoader = oneToOneDataLoader;
40
+ //# sourceMappingURL=oneToOneDataLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneToOneDataLoader.js","sourceRoot":"","sources":["../../../src/dataloaders/oneToOneDataLoader.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAoC;AACpC,oDAAsE;AACtE,oCAAmF;AAEnF,oCAA6C;AAE7C,SAAgB,kBAAkB,CAChC,EAAiB,EACjB,SAAsC;IAEtC,0DAA0D;IAC1D,MAAM,IAAI,GAAG,IAAA,2BAAW,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;IAC9D,OAAO,IAAA,gBAAQ,EAAC,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE;QAC/C,OAAO,IAAI,oBAAU,CAAwB,KAAK,EAAE,KAAK,EAAE,EAAE;YAC3D,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;YAEhD,IAAA,0BAAkB,EAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAA,gBAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAEnC,MAAM,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC;YAChC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAE/D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAElG,MAAM,QAAQ,GAAG,IAAA,eAAO,EAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC5C,wEAAwE;gBACxE,MAAM,OAAO,GAAG,IAAA,iCAAyB,EAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAC7E,yFAAyF;gBACzF,sFAAsF;gBACtF,0FAA0F;gBAC1F,sFAAsF;gBACtF,0FAA0F;gBAC1F,qFAAqF;gBACrF,eAAe;gBACf,OAAO,OAAO,IAAI,oBAAoB,CAAC;YACzC,CAAC,CAAC,CAAC;YACH,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAkB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAlCD,gDAkCC"}
@@ -0,0 +1,33 @@
1
+ import { Knex } from "knex";
2
+ import { Todo } from "../Todo";
3
+ export interface IdAssigner {
4
+ assignNewIds(knex: Knex, todos: Record<string, Todo>): Promise<void>;
5
+ }
6
+ /**
7
+ * Assigns all new entities an id directly from their corresponding sequence generator, instead of via INSERTs.
8
+ *
9
+ * This lets us avoid cyclic issues with some INSERTs having foreign keys to other rows that themselves
10
+ * need to first be INSERTed.
11
+ */
12
+ export declare class SequenceIdAssigner implements IdAssigner {
13
+ assignNewIds(knex: Knex, todos: Record<string, Todo>): Promise<void>;
14
+ }
15
+ /**
16
+ * Creates random UUIDs for uuid-based keys in production environments.
17
+ *
18
+ * See {@link TestUuidAssigner} for creating stable-ish ids for tests
19
+ */
20
+ export declare class RandomUuidAssigner implements IdAssigner {
21
+ assignNewIds(knex: Knex, todos: Record<string, Todo>): Promise<void>;
22
+ }
23
+ /**
24
+ * Creates deterministic / stable-ish UUIDs for test suites.
25
+ *
26
+ * These ids can technically change as test cases insert different types/numbers
27
+ * of entities, in different orders, but otherwise will be stable.
28
+ */
29
+ export declare class TestUuidAssigner implements IdAssigner {
30
+ private nextId;
31
+ assignNewIds(knex: Knex, todos: Record<string, Todo>): Promise<void>;
32
+ reset(): void;
33
+ }
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.TestUuidAssigner = exports.RandomUuidAssigner = exports.SequenceIdAssigner = void 0;
23
+ const crypto = __importStar(require("crypto"));
24
+ const keys_1 = require("../keys");
25
+ /**
26
+ * Assigns all new entities an id directly from their corresponding sequence generator, instead of via INSERTs.
27
+ *
28
+ * This lets us avoid cyclic issues with some INSERTs having foreign keys to other rows that themselves
29
+ * need to first be INSERTed.
30
+ */
31
+ class SequenceIdAssigner {
32
+ async assignNewIds(knex, todos) {
33
+ const seqStatements = [];
34
+ Object.values(todos).forEach((todo) => {
35
+ if (todo.inserts.length > 0) {
36
+ const meta = todo.inserts[0].__orm.metadata;
37
+ const sequenceName = `${meta.tableName}_id_seq`;
38
+ const sql = `select nextval('${sequenceName}') from generate_series(1, ${todo.inserts.length})`;
39
+ seqStatements.push(sql);
40
+ }
41
+ });
42
+ if (seqStatements.length > 0) {
43
+ // There will be 1 per table; 1 single insert should be fine but we might need to batch for super-large schemas?
44
+ const sql = seqStatements.join(" UNION ALL ");
45
+ const result = await knex.raw(sql);
46
+ let i = 0;
47
+ Object.values(todos).forEach((todo) => {
48
+ for (const insert of todo.inserts) {
49
+ insert.__orm.data["id"] = (0, keys_1.keyToString)(todo.metadata, result.rows[i++]["nextval"]);
50
+ }
51
+ });
52
+ }
53
+ }
54
+ }
55
+ exports.SequenceIdAssigner = SequenceIdAssigner;
56
+ /**
57
+ * Creates random UUIDs for uuid-based keys in production environments.
58
+ *
59
+ * See {@link TestUuidAssigner} for creating stable-ish ids for tests
60
+ */
61
+ class RandomUuidAssigner {
62
+ async assignNewIds(knex, todos) {
63
+ Object.values(todos).forEach((todo) => {
64
+ for (const insert of todo.inserts) {
65
+ insert.__orm.data["id"] = (0, keys_1.keyToString)(todo.metadata, crypto.randomUUID());
66
+ }
67
+ });
68
+ }
69
+ }
70
+ exports.RandomUuidAssigner = RandomUuidAssigner;
71
+ /**
72
+ * Creates deterministic / stable-ish UUIDs for test suites.
73
+ *
74
+ * These ids can technically change as test cases insert different types/numbers
75
+ * of entities, in different orders, but otherwise will be stable.
76
+ */
77
+ class TestUuidAssigner {
78
+ constructor() {
79
+ // We can be cute and create per-entity UUID spaces to be more stable
80
+ this.nextId = {};
81
+ }
82
+ async assignNewIds(knex, todos) {
83
+ Object.entries(todos).forEach(([type, todo]) => {
84
+ if (todo.inserts.length > 0) {
85
+ // Each entity's uuid space is based on the slot/order it's added to nextId.
86
+ // This will change across tests, i.e. it's not like tagged ids, but it's
87
+ // an easy number to determine, and should be stable enough.
88
+ let entitySpace = Object.keys(this.nextId).indexOf(type);
89
+ if (entitySpace === -1) {
90
+ this.nextId[type] = 0;
91
+ entitySpace = Object.keys(this.nextId).indexOf(type);
92
+ }
93
+ for (const insert of todo.inserts) {
94
+ const id = this.nextId[type]++;
95
+ const uuid = `10000000-${String(entitySpace).padStart(4, "0")}-0000-0000-${String(id).padStart(12, "0")}`;
96
+ insert.__orm.data["id"] = (0, keys_1.keyToString)(todo.metadata, uuid);
97
+ }
98
+ }
99
+ });
100
+ }
101
+ reset() {
102
+ this.nextId = {};
103
+ }
104
+ }
105
+ exports.TestUuidAssigner = TestUuidAssigner;
106
+ //# sourceMappingURL=IdAssigner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdAssigner.js","sourceRoot":"","sources":["../../../src/drivers/IdAssigner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { Knex } from "knex";
2
+ import { Entity, EntityConstructor, EntityManager, EntityMetadata } from "../EntityManager";
3
+ import { FilterAndSettings } from "../QueryBuilder";
4
+ import { ManyToManyCollection, OneToManyCollection, OneToOneReferenceImpl } from "../relations";
5
+ import { JoinRow } from "../relations/ManyToManyCollection";
6
+ import { JoinRowTodo, Todo } from "../Todo";
7
+ import { Driver } from "./driver";
8
+ export declare class InMemoryDriver implements Driver {
9
+ private data;
10
+ private onQuery;
11
+ constructor(onQuery?: () => void);
12
+ select(tableName: string): readonly any[];
13
+ insert(tableName: string, row: any): void;
14
+ update(tableName: string, row: any): void;
15
+ delete(tableName: string, id: number): void;
16
+ clear(): void;
17
+ find<T extends Entity>(em: EntityManager, type: EntityConstructor<T>, queries: readonly FilterAndSettings<T>[]): Promise<unknown[][]>;
18
+ flushEntities(em: EntityManager, todos: Record<string, Todo>): Promise<void>;
19
+ flushJoinTables(em: EntityManager, joinRows: Record<string, JoinRowTodo>): Promise<void>;
20
+ load<T extends Entity>(em: EntityManager, meta: EntityMetadata<T>, untaggedIds: readonly string[]): Promise<unknown[]>;
21
+ loadManyToMany<T extends Entity, U extends Entity>(em: EntityManager, collection: ManyToManyCollection<T, U>, keys: readonly string[]): Promise<JoinRow[]>;
22
+ findManyToMany<T extends Entity, U extends Entity>(em: EntityManager, collection: ManyToManyCollection<T, U>, keys: readonly string[]): Promise<JoinRow[]>;
23
+ loadOneToMany<T extends Entity, U extends Entity>(em: EntityManager, collection: OneToManyCollection<T, U>, untaggedIds: readonly string[]): Promise<unknown[]>;
24
+ findOneToMany<T extends Entity, U extends Entity>(em: EntityManager, collection: OneToManyCollection<T, U>, keys: readonly string[]): Promise<JoinRow[]>;
25
+ loadOneToOne<T extends Entity, U extends Entity>(em: EntityManager, reference: OneToOneReferenceImpl<T, U>, untaggedIds: readonly string[]): Promise<unknown[]>;
26
+ transaction<T>(em: EntityManager, fn: (txn: Knex.Transaction) => Promise<T>, isolationLevel?: "serializable"): Promise<T>;
27
+ rowsOfTable(tableName: string): Record<string, any>;
28
+ private nextId;
29
+ }
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryDriver = void 0;
4
+ const EntityManager_1 = require("../EntityManager");
5
+ const keys_1 = require("../keys");
6
+ const QueryBuilder_1 = require("../QueryBuilder");
7
+ const serde_1 = require("../serde");
8
+ const utils_1 = require("../utils");
9
+ class InMemoryDriver {
10
+ constructor(onQuery) {
11
+ // Map from table name --> string untagged id --> record
12
+ this.data = {};
13
+ this.onQuery = onQuery || (() => { });
14
+ }
15
+ select(tableName) {
16
+ this.onQuery();
17
+ return Object.values(this.data[tableName] || {});
18
+ }
19
+ insert(tableName, row) {
20
+ this.onQuery();
21
+ // Purposefully assign row.id as a side-effect
22
+ row.id || (row.id = this.nextId(tableName));
23
+ this.rowsOfTable(tableName)[row.id] = { ...row }; // Make a copy
24
+ }
25
+ update(tableName, row) {
26
+ this.onQuery();
27
+ const existingRow = this.rowsOfTable(tableName)[row.id];
28
+ this.rowsOfTable(tableName)[row.id] = { ...existingRow, ...row };
29
+ }
30
+ delete(tableName, id) {
31
+ this.onQuery();
32
+ delete this.rowsOfTable(tableName)[id];
33
+ }
34
+ clear() {
35
+ this.data = {};
36
+ }
37
+ async find(em, type, queries) {
38
+ this.onQuery();
39
+ return queries.map((query) => {
40
+ const { where, orderBy, limit, offset = 0 } = query;
41
+ const meta = (0, EntityManager_1.getMetadata)(type);
42
+ const allRows = Object.values(this.rowsOfTable(meta.tableName));
43
+ const matched = allRows.filter((row) => rowMatches(this, meta, row, where));
44
+ const sorted = !orderBy ? matched : matched.sort((a, b) => sort(this, meta, orderBy, a, b));
45
+ return ensureUnderLimit(sorted.slice(offset, offset + (limit ?? sorted.length)));
46
+ });
47
+ }
48
+ async flushEntities(em, todos) {
49
+ const updatedAt = new Date();
50
+ // do our version of assign ids
51
+ Object.entries(todos).forEach(([_, todo]) => {
52
+ todo.inserts.forEach((i) => {
53
+ const id = this.nextId(todo.metadata.tableName);
54
+ i.__orm.data["id"] = (0, keys_1.keyToString)(todo.metadata, id);
55
+ this.rowsOfTable(todo.metadata.tableName)[id] = {};
56
+ });
57
+ });
58
+ Object.entries(todos).forEach(([_, todo]) => {
59
+ // Because our assign id step effectively inserts the row, we can handle
60
+ // both inserts and updates with the same code path.
61
+ [...todo.updates, ...todo.inserts].forEach((u) => {
62
+ this.onQuery();
63
+ // TODO Do this in EntityManager instead of the drivers
64
+ u.__orm.data["updatedAt"] = updatedAt;
65
+ const id = (0, keys_1.deTagId)(todo.metadata, u.idOrFail);
66
+ const row = {};
67
+ Object.values(todo.metadata.fields)
68
+ .filter(serde_1.hasSerde)
69
+ .flatMap((f) => f.serde.columns.map((c) => [f, c]))
70
+ .forEach(([f, c]) => {
71
+ // Kinda surprised mapToDb doesn't work here...
72
+ row[c.columnName] = c.dbValue(u.__orm.data) ?? null;
73
+ });
74
+ this.rowsOfTable(todo.metadata.tableName)[id] = row;
75
+ });
76
+ todo.deletes.forEach((d) => {
77
+ this.onQuery();
78
+ const id = (0, keys_1.deTagId)(todo.metadata, d.idOrFail);
79
+ delete this.rowsOfTable(todo.metadata.tableName)[id];
80
+ d.__orm.deleted = "deleted";
81
+ });
82
+ });
83
+ }
84
+ async flushJoinTables(em, joinRows) {
85
+ for (const [joinTableName, { m2m, newRows, deletedRows }] of Object.entries(joinRows)) {
86
+ // Any newRows count as 1 query
87
+ if (newRows.length > 0) {
88
+ this.onQuery();
89
+ }
90
+ newRows.forEach((row) => {
91
+ const { id, created_at, deleted, m2m, ...fkColumns } = row;
92
+ // The rows in EntityManager.joinRows point to entities, change those to integers
93
+ Object.keys(fkColumns).forEach((key) => {
94
+ const meta = key == m2m.columnName ? (0, EntityManager_1.getMetadata)(m2m.entity) : m2m.otherMeta;
95
+ fkColumns[key] = (0, keys_1.keyToNumber)(meta, (0, keys_1.maybeResolveReferenceToId)(fkColumns[key]));
96
+ });
97
+ // Mimic an ON CONFLICT upsert
98
+ const existing = Object.values(this.rowsOfTable(joinTableName)).find((row) => {
99
+ const [col1, col2] = Object.keys(fkColumns);
100
+ return fkColumns[col1] === row[col1] && fkColumns[col2] === row[col2];
101
+ });
102
+ if (!existing) {
103
+ this.insert(joinTableName, fkColumns);
104
+ row.id = fkColumns.id;
105
+ }
106
+ else {
107
+ row.id = existing.id;
108
+ }
109
+ });
110
+ // `remove`s that were done against unloaded ManyToManyCollections will not have row ids
111
+ const [haveIds, noIds] = (0, utils_1.partition)(deletedRows, (r) => r.id !== -1);
112
+ if (haveIds.length > 0) {
113
+ this.onQuery();
114
+ haveIds.forEach((row) => this.delete(joinTableName, row.id));
115
+ }
116
+ if (noIds.length > 0) {
117
+ this.onQuery();
118
+ noIds.forEach((noIdRow) => {
119
+ const rows = Object.values(this.rowsOfTable(joinTableName));
120
+ rows
121
+ .filter((row) => {
122
+ const a = String(row[m2m.columnName]) === (0, keys_1.deTagId)(m2m.meta, (0, keys_1.maybeResolveReferenceToId)(noIdRow[m2m.columnName]));
123
+ const b = String(row[m2m.otherColumnName]) ===
124
+ (0, keys_1.deTagId)(m2m.otherMeta, (0, keys_1.maybeResolveReferenceToId)(noIdRow[m2m.otherColumnName]));
125
+ return a && b;
126
+ })
127
+ .forEach((found) => this.delete(joinTableName, found.id));
128
+ });
129
+ }
130
+ }
131
+ }
132
+ async load(em, meta, untaggedIds) {
133
+ this.onQuery();
134
+ const rows = Object.values(this.data[meta.tableName] || {});
135
+ return rows.filter((row) => untaggedIds.includes(String(row["id"])));
136
+ }
137
+ async loadManyToMany(em, collection, keys) {
138
+ this.onQuery();
139
+ const ids = {};
140
+ keys.forEach((key) => {
141
+ const [column, id] = key.split("=");
142
+ (ids[column] || (ids[column] = [])).push((0, keys_1.unsafeDeTagIds)([id])[0]);
143
+ });
144
+ const rows = Object.values(this.rowsOfTable(collection.joinTableName));
145
+ return rows.filter((row) => {
146
+ return Object.entries(ids).some(([column, ids]) => ids.includes(String(row[column])));
147
+ });
148
+ }
149
+ async findManyToMany(em, collection, keys) {
150
+ this.onQuery();
151
+ const rows = Object.values(this.rowsOfTable(collection.joinTableName));
152
+ const set = new Set(keys);
153
+ const [column1, column2] = [collection.columnName, collection.otherColumnName];
154
+ const [m1, m2] = [collection.meta, collection.otherMeta];
155
+ return rows.filter((row) => {
156
+ const key1 = `${column1}=${(0, keys_1.tagId)(m1, row[column1])},${column2}=${(0, keys_1.tagId)(m2, row[column2])}`;
157
+ const key2 = `${column2}=${(0, keys_1.tagId)(m2, row[column2])},${column1}=${(0, keys_1.tagId)(m1, row[column1])}`;
158
+ return set.has(key1) || set.has(key2);
159
+ });
160
+ }
161
+ async loadOneToMany(em, collection, untaggedIds) {
162
+ this.onQuery();
163
+ const rows = Object.values(this.rowsOfTable(collection.otherMeta.tableName));
164
+ return rows.filter((row) => untaggedIds.includes(String(row[collection.otherColumnName])));
165
+ }
166
+ async findOneToMany(em, collection, keys) {
167
+ this.onQuery();
168
+ // If we're loading author.books, we need to look in the books table
169
+ const rows = Object.values(this.rowsOfTable(collection.otherMeta.tableName));
170
+ const set = new Set(keys);
171
+ return rows.filter((row) => {
172
+ const col1 = `id=${(0, keys_1.tagId)(collection.otherMeta, row.id)}`;
173
+ const col2 = `${collection.otherColumnName}=${(0, keys_1.tagId)(collection.meta, row[collection.otherColumnName])}`;
174
+ return set.has(`${col1},${col2}`);
175
+ });
176
+ }
177
+ async loadOneToOne(em, reference, untaggedIds) {
178
+ this.onQuery();
179
+ const rows = Object.values(this.rowsOfTable(reference.otherMeta.tableName));
180
+ return rows.filter((row) => untaggedIds.includes(String(row[reference.otherColumnName])));
181
+ }
182
+ transaction(em, fn, isolationLevel) {
183
+ return fn(undefined);
184
+ }
185
+ rowsOfTable(tableName) {
186
+ var _a;
187
+ return ((_a = this.data)[tableName] || (_a[tableName] = {}));
188
+ }
189
+ nextId(tableName) {
190
+ return Object.values(this.data[tableName] || {}).length + 1;
191
+ }
192
+ }
193
+ exports.InMemoryDriver = InMemoryDriver;
194
+ /** In SQL `a !== null` is false. */
195
+ function notEqual(a, b) {
196
+ if (a === null || b === null) {
197
+ return !(a === null && b === null);
198
+ }
199
+ else {
200
+ return a !== b;
201
+ }
202
+ }
203
+ const ops = {
204
+ gt: (a, b) => a > b,
205
+ gte: (a, b) => a >= b,
206
+ lt: (a, b) => a < b,
207
+ lte: (a, b) => a <= b,
208
+ like: (a, b) => new RegExp(b.replace("%", ".*")).test(a),
209
+ ilike: (a, b) => new RegExp(b.replace("%", ".*"), "i").test(a),
210
+ };
211
+ function rowMatches(driver, meta, row, where) {
212
+ return Object.entries(where)
213
+ .filter(([_, value]) => value !== undefined)
214
+ .every(([fieldName, value]) => {
215
+ const field = meta.fields[fieldName] || (0, utils_1.fail)();
216
+ // TODO Add column data to the fields
217
+ const column = meta.fields[field.fieldName] || (0, utils_1.fail)();
218
+ // TODO Support multiple columns i.e. polymorphic references
219
+ const currentValue = (column.serde && row[column.serde.columns[0].columnName]) ?? null;
220
+ switch (field.kind) {
221
+ case "primaryKey":
222
+ case "primitive":
223
+ case "enum":
224
+ let fn = (a) => a;
225
+ if (field.kind === "enum") {
226
+ fn = (v) => field.enumDetailType.getByCode(v).id;
227
+ }
228
+ else if (field.kind === "primaryKey") {
229
+ fn = (v) => (0, keys_1.keyToNumber)(meta, v);
230
+ }
231
+ const filter = (0, QueryBuilder_1.parseValueFilter)(value);
232
+ switch (filter.kind) {
233
+ case "eq":
234
+ return currentValue === fn(filter.value);
235
+ case "ne":
236
+ return notEqual(currentValue, fn(filter.value));
237
+ case "in":
238
+ return filter.value.map(fn).includes(currentValue);
239
+ case "gt":
240
+ case "gte":
241
+ case "lt":
242
+ case "lte":
243
+ case "like":
244
+ case "ilike":
245
+ const a = currentValue;
246
+ const b = fn(filter.value);
247
+ const op = ops[filter.kind];
248
+ return op(a, b);
249
+ case "pass":
250
+ return true;
251
+ default:
252
+ throw new Error("Unsupported");
253
+ }
254
+ case "m2o":
255
+ const otherMeta = field.otherMetadata();
256
+ const ef = (0, QueryBuilder_1.parseEntityFilter)(otherMeta, value);
257
+ switch (ef.kind) {
258
+ case "eq":
259
+ return currentValue === ef.id;
260
+ case "ne":
261
+ return notEqual(currentValue, ef.id);
262
+ case "in":
263
+ return ef.ids.includes(currentValue);
264
+ case "join":
265
+ if (currentValue === null) {
266
+ return false;
267
+ }
268
+ const otherRow = driver.rowsOfTable(otherMeta.tableName)[currentValue];
269
+ return rowMatches(driver, otherMeta, otherRow, ef.subFilter);
270
+ default:
271
+ throw new Error("Unsupported");
272
+ }
273
+ default:
274
+ throw new Error("Unsupported");
275
+ }
276
+ });
277
+ }
278
+ function sort(driver, meta, orderBy, a, b) {
279
+ const fieldName = Object.keys(orderBy)[0];
280
+ const value = orderBy[fieldName];
281
+ if (value !== "ASC" && value !== "DESC") {
282
+ // I.e. value is something like `{ book: { author: { ... } }`
283
+ const field = meta.fields[fieldName] || (0, utils_1.fail)();
284
+ if (field.kind === "m2o") {
285
+ const newMeta = field.otherMetadata();
286
+ const newA = driver.rowsOfTable(newMeta.tableName)[a.id];
287
+ const newB = driver.rowsOfTable(newMeta.tableName)[b.id];
288
+ return sort(driver, newMeta, value, newA, newB);
289
+ }
290
+ else {
291
+ throw new Error(`Unsupported order by field ${fieldName}`);
292
+ }
293
+ }
294
+ const flip = value === "DESC" ? -1 : 1;
295
+ const column = meta.fields[fieldName] || (0, utils_1.fail)();
296
+ const key = column.serde.columns[0].columnName;
297
+ // TODO Handle sorting by more than just strings
298
+ return a[key].localeCompare(b[key]) * flip;
299
+ }
300
+ function ensureUnderLimit(rows) {
301
+ if (rows.length >= EntityManager_1.entityLimit) {
302
+ throw new Error(`Query returned more than ${EntityManager_1.entityLimit} rows`);
303
+ }
304
+ return rows;
305
+ }
306
+ //# sourceMappingURL=InMemoryDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryDriver.js","sourceRoot":"","sources":["../../../src/drivers/InMemoryDriver.ts"],"names":[],"mappings":";;;AACA,oDAAsH;AACtH,kCAA8G;AAC9G,kDAAsG;AAGtG,oCAAoC;AAEpC,oCAA2C;AAG3C,MAAa,cAAc;IAczB,YAAY,OAAoB;QAbhC,wDAAwD;QAChD,SAAI,GAAwC,EAAE,CAAC;QAarD,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,GAAQ;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,8CAA8C;QAC9C,GAAG,CAAC,EAAE,KAAN,GAAG,CAAC,EAAE,GAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAC;QAClC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,cAAc;IAClE,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,GAAQ;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,GAAG,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,EAAU;QAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAiB,EACjB,IAA0B,EAC1B,OAAwC;QAExC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3B,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;YACpD,MAAM,IAAI,GAAG,IAAA,2BAAW,EAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5E,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACnG,OAAO,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAiB,EAAE,KAA2B;QAChE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE7B,+BAA+B;QAC/B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE;YAC1C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAChD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAA,kBAAW,EAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACpD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;YACrD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE;YAC1C,wEAAwE;YACxE,oDAAoD;YACpD,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,uDAAuD;gBACvD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;gBACtC,MAAM,EAAE,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC9C,MAAM,GAAG,GAAwB,EAAE,CAAC;gBACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;qBAChC,MAAM,CAAC,gBAAQ,CAAC;qBAChB,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAU,CAAC,CAAC;qBAC3D,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;oBAClB,+CAA+C;oBAC/C,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;gBACtD,CAAC,CAAC,CAAC;gBACL,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YACtD,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACzB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,MAAM,EAAE,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC9C,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrD,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAiB,EAAE,QAAqC;QAC5E,KAAK,MAAM,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YACrF,+BAA+B;YAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACtB,IAAI,CAAC,OAAO,EAAE,CAAC;aAChB;YACD,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACtB,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,GAAG,CAAC;gBAC3D,iFAAiF;gBACjF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;oBACrC,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAA,2BAAW,EAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;oBAC7E,SAAS,CAAC,GAAG,CAAC,GAAG,IAAA,kBAAW,EAAC,IAAI,EAAE,IAAA,gCAAyB,EAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAChF,CAAC,CAAC,CAAC;gBACH,8BAA8B;gBAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC3E,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC5C,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,EAAE;oBACb,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;oBACtC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC,EAAY,CAAC;iBACjC;qBAAM;oBACL,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;iBACtB;YACH,CAAC,CAAC,CAAC;YAEH,wFAAwF;YACxF,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,IAAA,iBAAS,EAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAEpE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACtB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,EAAG,CAAC,CAAC,CAAC;aAC/D;YAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACxB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;oBAC5D,IAAI;yBACD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;wBACd,MAAM,CAAC,GACL,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,IAAA,cAAO,EAAC,GAAG,CAAC,IAAI,EAAE,IAAA,gCAAyB,EAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAE,CAAC,CAAC;wBACzG,MAAM,CAAC,GACL,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;4BAChC,IAAA,cAAO,EAAC,GAAG,CAAC,SAAS,EAAE,IAAA,gCAAyB,EAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAE,CAAC,CAAC;wBACnF,OAAO,CAAC,IAAI,CAAC,CAAC;oBAChB,CAAC,CAAC;yBACD,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC,CAAC,CAAC;aACJ;SACF;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAiB,EACjB,IAAuB,EACvB,WAA8B;QAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,EAAiB,EACjB,UAAsC,EACtC,IAAuB;QAEvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,GAAG,GAA6B,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpC,CAAC,GAAG,CAAC,MAAM,MAAV,GAAG,CAAC,MAAM,IAAM,EAAE,EAAC,CAAC,IAAI,CAAC,IAAA,qBAAc,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACzB,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,EAAiB,EACjB,UAAsC,EACtC,IAAuB;QAEvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;QAC/E,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,IAAI,GAAG,GAAG,OAAO,IAAI,IAAA,YAAK,EAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,IAAI,IAAA,YAAK,EAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC3F,MAAM,IAAI,GAAG,GAAG,OAAO,IAAI,IAAA,YAAK,EAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,IAAI,IAAA,YAAK,EAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC3F,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,EAAiB,EACjB,UAAqC,EACrC,WAA8B;QAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,EAAiB,EACjB,UAAqC,EACrC,IAAuB;QAEvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,oEAAoE;QACpE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,IAAI,GAAG,MAAM,IAAA,YAAK,EAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,GAAG,GAAG,UAAU,CAAC,eAAe,IAAI,IAAA,YAAK,EAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;YACxG,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,EAAiB,EACjB,SAAsC,EACtC,WAA8B;QAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,WAAW,CACT,EAAiB,EACjB,EAAyC,EACzC,cAA+B;QAE/B,OAAO,EAAE,CAAC,SAAU,CAAC,CAAC;IACxB,CAAC;IAED,WAAW,CAAC,SAAiB;;QAC3B,OAAO,OAAC,IAAI,CAAC,IAAI,EAAC,SAAS,SAAT,SAAS,IAAM,EAAE,EAAC,CAAC;IACvC,CAAC;IAEO,MAAM,CAAC,SAAiB;QAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9D,CAAC;CACF;AAxPD,wCAwPC;AAED,oCAAoC;AACpC,SAAS,QAAQ,CAAC,CAAM,EAAE,CAAM;IAC9B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE;QAC5B,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;KACpC;SAAM;QACL,OAAO,CAAC,KAAK,CAAC,CAAC;KAChB;AACH,CAAC;AAED,MAAM,GAAG,GAAG;IACV,EAAE,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC;IACnC,GAAG,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC;IACrC,EAAE,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC;IACnC,GAAG,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC;IACrC,IAAI,EAAE,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,KAAK,EAAE,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;CACzE,CAAC;AAEF,SAAS,UAAU,CAAC,MAAsB,EAAE,IAAyB,EAAE,GAAQ,EAAE,KAAc;IAC7F,OAAO,MAAM,CAAC,OAAO,CAAC,KAAY,CAAC;SAChC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;SAC3C,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,IAAA,YAAI,GAAE,CAAC;QAC/C,qCAAqC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAA,YAAI,GAAE,CAAC;QACtD,4DAA4D;QAC5D,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC;QACvF,QAAQ,KAAK,CAAC,IAAI,EAAE;YAClB,KAAK,YAAY,CAAC;YAClB,KAAK,WAAW,CAAC;YACjB,KAAK,MAAM;gBACT,IAAI,EAAE,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC;gBACvB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;oBACzB,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAE,KAAK,CAAC,cAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC3D;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;oBACtC,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,kBAAW,EAAC,IAAI,EAAE,CAAQ,CAAC,CAAC;iBACzC;gBACD,MAAM,MAAM,GAAG,IAAA,+BAAgB,EAAC,KAA8B,CAAC,CAAC;gBAChE,QAAQ,MAAM,CAAC,IAAI,EAAE;oBACnB,KAAK,IAAI;wBACP,OAAO,YAAY,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC3C,KAAK,IAAI;wBACP,OAAO,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClD,KAAK,IAAI;wBACP,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;oBACrD,KAAK,IAAI,CAAC;oBACV,KAAK,KAAK,CAAC;oBACX,KAAK,IAAI,CAAC;oBACV,KAAK,KAAK,CAAC;oBACX,KAAK,MAAM,CAAC;oBACZ,KAAK,OAAO;wBACV,MAAM,CAAC,GAAG,YAAY,CAAC;wBACvB,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAC3B,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBAC5B,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAClB,KAAK,MAAM;wBACT,OAAO,IAAI,CAAC;oBACd;wBACE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;iBAClC;YACH,KAAK,KAAK;gBACR,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;gBACxC,MAAM,EAAE,GAAG,IAAA,gCAAiB,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC/C,QAAQ,EAAE,CAAC,IAAI,EAAE;oBACf,KAAK,IAAI;wBACP,OAAO,YAAY,KAAK,EAAE,CAAC,EAAE,CAAC;oBAChC,KAAK,IAAI;wBACP,OAAO,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;oBACvC,KAAK,IAAI;wBACP,OAAO,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;oBACvC,KAAK,MAAM;wBACT,IAAI,YAAY,KAAK,IAAI,EAAE;4BACzB,OAAO,KAAK,CAAC;yBACd;wBACD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC;wBACvE,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;oBAC/D;wBACE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;iBAClC;YACH;gBACE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;SAClC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,IAAI,CAAC,MAAsB,EAAE,IAAyB,EAAE,OAAe,EAAE,CAAM,EAAE,CAAM;IAC9F,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAI,OAAe,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE;QACvC,6DAA6D;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,IAAA,YAAI,GAAE,CAAC;QAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE;YACxB,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;SACjD;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;SAC5D;KACF;IACD,MAAM,IAAI,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,IAAA,YAAI,GAAE,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAChD,gDAAgD;IAChD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;AAC7C,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAe;IACvC,IAAI,IAAI,CAAC,MAAM,IAAI,2BAAW,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,2BAAW,OAAO,CAAC,CAAC;KACjE;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}