@spinajs/orm 2.0.481 → 2.0.484

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 (228) hide show
  1. package/README.md +72 -3
  2. package/lib/cjs/bootstrap.js +10 -0
  3. package/lib/cjs/bootstrap.js.map +1 -1
  4. package/lib/cjs/builders.d.ts +127 -11
  5. package/lib/cjs/builders.d.ts.map +1 -1
  6. package/lib/cjs/builders.js +368 -283
  7. package/lib/cjs/builders.js.map +1 -1
  8. package/lib/cjs/converters.d.ts +9 -2
  9. package/lib/cjs/converters.d.ts.map +1 -1
  10. package/lib/cjs/converters.js +48 -8
  11. package/lib/cjs/converters.js.map +1 -1
  12. package/lib/cjs/decorators.d.ts +26 -3
  13. package/lib/cjs/decorators.d.ts.map +1 -1
  14. package/lib/cjs/decorators.js +95 -42
  15. package/lib/cjs/decorators.js.map +1 -1
  16. package/lib/cjs/dehydrators.js +1 -1
  17. package/lib/cjs/dehydrators.js.map +1 -1
  18. package/lib/cjs/descriptor.d.ts +1 -0
  19. package/lib/cjs/descriptor.d.ts.map +1 -1
  20. package/lib/cjs/descriptor.js +16 -40
  21. package/lib/cjs/descriptor.js.map +1 -1
  22. package/lib/cjs/driver.d.ts +136 -7
  23. package/lib/cjs/driver.d.ts.map +1 -1
  24. package/lib/cjs/driver.js +279 -0
  25. package/lib/cjs/driver.js.map +1 -1
  26. package/lib/cjs/existsRelationHandlers.d.ts +29 -0
  27. package/lib/cjs/existsRelationHandlers.d.ts.map +1 -0
  28. package/lib/cjs/existsRelationHandlers.js +138 -0
  29. package/lib/cjs/existsRelationHandlers.js.map +1 -0
  30. package/lib/cjs/fp.d.ts.map +1 -1
  31. package/lib/cjs/fp.js +10 -15
  32. package/lib/cjs/fp.js.map +1 -1
  33. package/lib/cjs/hydrators.d.ts.map +1 -1
  34. package/lib/cjs/hydrators.js +29 -2
  35. package/lib/cjs/hydrators.js.map +1 -1
  36. package/lib/cjs/identity-map.d.ts +60 -0
  37. package/lib/cjs/identity-map.d.ts.map +1 -0
  38. package/lib/cjs/identity-map.js +135 -0
  39. package/lib/cjs/identity-map.js.map +1 -0
  40. package/lib/cjs/index.d.ts +12 -0
  41. package/lib/cjs/index.d.ts.map +1 -1
  42. package/lib/cjs/index.js +12 -0
  43. package/lib/cjs/index.js.map +1 -1
  44. package/lib/cjs/interfaces.d.ts +300 -10
  45. package/lib/cjs/interfaces.d.ts.map +1 -1
  46. package/lib/cjs/interfaces.js +54 -1
  47. package/lib/cjs/interfaces.js.map +1 -1
  48. package/lib/cjs/metadata.d.ts.map +1 -1
  49. package/lib/cjs/metadata.js +4 -1
  50. package/lib/cjs/metadata.js.map +1 -1
  51. package/lib/cjs/metrics.d.ts +53 -0
  52. package/lib/cjs/metrics.d.ts.map +1 -0
  53. package/lib/cjs/metrics.js +82 -0
  54. package/lib/cjs/metrics.js.map +1 -0
  55. package/lib/cjs/middlewares.d.ts +13 -1
  56. package/lib/cjs/middlewares.d.ts.map +1 -1
  57. package/lib/cjs/middlewares.js +55 -15
  58. package/lib/cjs/middlewares.js.map +1 -1
  59. package/lib/cjs/model.d.ts +129 -13
  60. package/lib/cjs/model.d.ts.map +1 -1
  61. package/lib/cjs/model.js +449 -93
  62. package/lib/cjs/model.js.map +1 -1
  63. package/lib/cjs/orm.d.ts.map +1 -1
  64. package/lib/cjs/orm.js +12 -3
  65. package/lib/cjs/orm.js.map +1 -1
  66. package/lib/cjs/orphan.d.ts +27 -0
  67. package/lib/cjs/orphan.d.ts.map +1 -0
  68. package/lib/cjs/orphan.js +55 -0
  69. package/lib/cjs/orphan.js.map +1 -0
  70. package/lib/cjs/primary-keys.d.ts +60 -0
  71. package/lib/cjs/primary-keys.d.ts.map +1 -0
  72. package/lib/cjs/primary-keys.js +243 -0
  73. package/lib/cjs/primary-keys.js.map +1 -0
  74. package/lib/cjs/relation-objects.d.ts +101 -9
  75. package/lib/cjs/relation-objects.d.ts.map +1 -1
  76. package/lib/cjs/relation-objects.js +194 -43
  77. package/lib/cjs/relation-objects.js.map +1 -1
  78. package/lib/cjs/relations.d.ts +7 -1
  79. package/lib/cjs/relations.d.ts.map +1 -1
  80. package/lib/cjs/relations.js +16 -1
  81. package/lib/cjs/relations.js.map +1 -1
  82. package/lib/cjs/resilience.d.ts +50 -0
  83. package/lib/cjs/resilience.d.ts.map +1 -0
  84. package/lib/cjs/resilience.js +70 -0
  85. package/lib/cjs/resilience.js.map +1 -0
  86. package/lib/cjs/snapshot.d.ts +58 -0
  87. package/lib/cjs/snapshot.d.ts.map +1 -0
  88. package/lib/cjs/snapshot.js +125 -0
  89. package/lib/cjs/snapshot.js.map +1 -0
  90. package/lib/cjs/statements.d.ts +11 -1
  91. package/lib/cjs/statements.d.ts.map +1 -1
  92. package/lib/cjs/statements.js +13 -2
  93. package/lib/cjs/statements.js.map +1 -1
  94. package/lib/cjs/subject-builder.d.ts +79 -0
  95. package/lib/cjs/subject-builder.d.ts.map +1 -0
  96. package/lib/cjs/subject-builder.js +296 -0
  97. package/lib/cjs/subject-builder.js.map +1 -0
  98. package/lib/cjs/subject-executor.d.ts +122 -0
  99. package/lib/cjs/subject-executor.d.ts.map +1 -0
  100. package/lib/cjs/subject-executor.js +319 -0
  101. package/lib/cjs/subject-executor.js.map +1 -0
  102. package/lib/cjs/subject-sorter.d.ts +70 -0
  103. package/lib/cjs/subject-sorter.d.ts.map +1 -0
  104. package/lib/cjs/subject-sorter.js +173 -0
  105. package/lib/cjs/subject-sorter.js.map +1 -0
  106. package/lib/cjs/subject.d.ts +100 -0
  107. package/lib/cjs/subject.d.ts.map +1 -0
  108. package/lib/cjs/subject.js +89 -0
  109. package/lib/cjs/subject.js.map +1 -0
  110. package/lib/cjs/unit-of-work.d.ts +52 -0
  111. package/lib/cjs/unit-of-work.d.ts.map +1 -0
  112. package/lib/cjs/unit-of-work.js +170 -0
  113. package/lib/cjs/unit-of-work.js.map +1 -0
  114. package/lib/mjs/bootstrap.js +10 -0
  115. package/lib/mjs/bootstrap.js.map +1 -1
  116. package/lib/mjs/builders.d.ts +127 -11
  117. package/lib/mjs/builders.d.ts.map +1 -1
  118. package/lib/mjs/builders.js +370 -285
  119. package/lib/mjs/builders.js.map +1 -1
  120. package/lib/mjs/converters.d.ts +9 -2
  121. package/lib/mjs/converters.d.ts.map +1 -1
  122. package/lib/mjs/converters.js +48 -8
  123. package/lib/mjs/converters.js.map +1 -1
  124. package/lib/mjs/decorators.d.ts +26 -3
  125. package/lib/mjs/decorators.d.ts.map +1 -1
  126. package/lib/mjs/decorators.js +96 -44
  127. package/lib/mjs/decorators.js.map +1 -1
  128. package/lib/mjs/dehydrators.js +1 -1
  129. package/lib/mjs/dehydrators.js.map +1 -1
  130. package/lib/mjs/descriptor.d.ts +1 -0
  131. package/lib/mjs/descriptor.d.ts.map +1 -1
  132. package/lib/mjs/descriptor.js +17 -39
  133. package/lib/mjs/descriptor.js.map +1 -1
  134. package/lib/mjs/driver.d.ts +136 -7
  135. package/lib/mjs/driver.d.ts.map +1 -1
  136. package/lib/mjs/driver.js +279 -0
  137. package/lib/mjs/driver.js.map +1 -1
  138. package/lib/mjs/existsRelationHandlers.d.ts +29 -0
  139. package/lib/mjs/existsRelationHandlers.d.ts.map +1 -0
  140. package/lib/mjs/existsRelationHandlers.js +134 -0
  141. package/lib/mjs/existsRelationHandlers.js.map +1 -0
  142. package/lib/mjs/fp.d.ts.map +1 -1
  143. package/lib/mjs/fp.js +10 -15
  144. package/lib/mjs/fp.js.map +1 -1
  145. package/lib/mjs/hydrators.d.ts.map +1 -1
  146. package/lib/mjs/hydrators.js +29 -2
  147. package/lib/mjs/hydrators.js.map +1 -1
  148. package/lib/mjs/identity-map.d.ts +60 -0
  149. package/lib/mjs/identity-map.d.ts.map +1 -0
  150. package/lib/mjs/identity-map.js +130 -0
  151. package/lib/mjs/identity-map.js.map +1 -0
  152. package/lib/mjs/index.d.ts +12 -0
  153. package/lib/mjs/index.d.ts.map +1 -1
  154. package/lib/mjs/index.js +12 -0
  155. package/lib/mjs/index.js.map +1 -1
  156. package/lib/mjs/interfaces.d.ts +300 -10
  157. package/lib/mjs/interfaces.d.ts.map +1 -1
  158. package/lib/mjs/interfaces.js +53 -0
  159. package/lib/mjs/interfaces.js.map +1 -1
  160. package/lib/mjs/metadata.d.ts.map +1 -1
  161. package/lib/mjs/metadata.js +4 -1
  162. package/lib/mjs/metadata.js.map +1 -1
  163. package/lib/mjs/metrics.d.ts +53 -0
  164. package/lib/mjs/metrics.d.ts.map +1 -0
  165. package/lib/mjs/metrics.js +76 -0
  166. package/lib/mjs/metrics.js.map +1 -0
  167. package/lib/mjs/middlewares.d.ts +13 -1
  168. package/lib/mjs/middlewares.d.ts.map +1 -1
  169. package/lib/mjs/middlewares.js +55 -15
  170. package/lib/mjs/middlewares.js.map +1 -1
  171. package/lib/mjs/model.d.ts +129 -13
  172. package/lib/mjs/model.d.ts.map +1 -1
  173. package/lib/mjs/model.js +451 -95
  174. package/lib/mjs/model.js.map +1 -1
  175. package/lib/mjs/orm.d.ts.map +1 -1
  176. package/lib/mjs/orm.js +12 -3
  177. package/lib/mjs/orm.js.map +1 -1
  178. package/lib/mjs/orphan.d.ts +27 -0
  179. package/lib/mjs/orphan.d.ts.map +1 -0
  180. package/lib/mjs/orphan.js +52 -0
  181. package/lib/mjs/orphan.js.map +1 -0
  182. package/lib/mjs/primary-keys.d.ts +60 -0
  183. package/lib/mjs/primary-keys.d.ts.map +1 -0
  184. package/lib/mjs/primary-keys.js +223 -0
  185. package/lib/mjs/primary-keys.js.map +1 -0
  186. package/lib/mjs/relation-objects.d.ts +101 -9
  187. package/lib/mjs/relation-objects.d.ts.map +1 -1
  188. package/lib/mjs/relation-objects.js +194 -43
  189. package/lib/mjs/relation-objects.js.map +1 -1
  190. package/lib/mjs/relations.d.ts +7 -1
  191. package/lib/mjs/relations.d.ts.map +1 -1
  192. package/lib/mjs/relations.js +16 -1
  193. package/lib/mjs/relations.js.map +1 -1
  194. package/lib/mjs/resilience.d.ts +50 -0
  195. package/lib/mjs/resilience.d.ts.map +1 -0
  196. package/lib/mjs/resilience.js +64 -0
  197. package/lib/mjs/resilience.js.map +1 -0
  198. package/lib/mjs/snapshot.d.ts +58 -0
  199. package/lib/mjs/snapshot.d.ts.map +1 -0
  200. package/lib/mjs/snapshot.js +115 -0
  201. package/lib/mjs/snapshot.js.map +1 -0
  202. package/lib/mjs/statements.d.ts +11 -1
  203. package/lib/mjs/statements.d.ts.map +1 -1
  204. package/lib/mjs/statements.js +14 -3
  205. package/lib/mjs/statements.js.map +1 -1
  206. package/lib/mjs/subject-builder.d.ts +79 -0
  207. package/lib/mjs/subject-builder.d.ts.map +1 -0
  208. package/lib/mjs/subject-builder.js +292 -0
  209. package/lib/mjs/subject-builder.js.map +1 -0
  210. package/lib/mjs/subject-executor.d.ts +122 -0
  211. package/lib/mjs/subject-executor.d.ts.map +1 -0
  212. package/lib/mjs/subject-executor.js +312 -0
  213. package/lib/mjs/subject-executor.js.map +1 -0
  214. package/lib/mjs/subject-sorter.d.ts +70 -0
  215. package/lib/mjs/subject-sorter.d.ts.map +1 -0
  216. package/lib/mjs/subject-sorter.js +168 -0
  217. package/lib/mjs/subject-sorter.js.map +1 -0
  218. package/lib/mjs/subject.d.ts +100 -0
  219. package/lib/mjs/subject.d.ts.map +1 -0
  220. package/lib/mjs/subject.js +84 -0
  221. package/lib/mjs/subject.js.map +1 -0
  222. package/lib/mjs/unit-of-work.d.ts +52 -0
  223. package/lib/mjs/unit-of-work.d.ts.map +1 -0
  224. package/lib/mjs/unit-of-work.js +166 -0
  225. package/lib/mjs/unit-of-work.js.map +1 -0
  226. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  227. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  228. package/package.json +10 -7
@@ -6,6 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  /* eslint-disable prettier/prettier */
8
8
  import { RelationType } from './interfaces.js';
9
+ import { ModelBase } from './model.js';
9
10
  import { Injectable, isConstructor } from '@spinajs/di';
10
11
  import { OneToManyRelationList, SingleRelation } from './relation-objects.js';
11
12
  export class ModelHydrator {
@@ -22,12 +23,22 @@ let DbPropertyHydrator = class DbPropertyHydrator extends ModelHydrator {
22
23
  keys.forEach((k) => {
23
24
  // skip if column is primary key & is null
24
25
  // we dont want to override pkey of target model
25
- if (k === descriptor.PrimaryKey && !values[k]) {
26
+ if (descriptor.PrimaryKey.includes(k) && (values[k] === null || values[k] === undefined)) {
26
27
  return;
27
28
  }
28
29
  const column = descriptor.Columns?.find((c) => c.Name === k);
29
30
  if (values[k] !== undefined) {
30
- target[k] = column?.Converter ? column.Converter.fromDB(values[k], values, descriptor.Converters.get(column.Name)?.Options) : values[k];
31
+ const incoming = values[k];
32
+ // A relation FK column may receive either a raw scalar id or an
33
+ // already-resolved model instance (eg. from a DTO @Relation field).
34
+ // When a model instance arrives, translate it to its primary key value
35
+ // so the FK column stores the id, not the object.
36
+ if (incoming instanceof ModelBase) {
37
+ target[k] = incoming.PrimaryKeyValue;
38
+ }
39
+ else {
40
+ target[k] = column?.Converter ? column.Converter.fromDB(incoming, values, descriptor.Converters.get(column.Name)?.Options) : incoming;
41
+ }
31
42
  }
32
43
  });
33
44
  }
@@ -72,7 +83,11 @@ let OneToManyRelationHydrator = class OneToManyRelationHydrator extends ModelHyd
72
83
  return tEntity;
73
84
  });
74
85
  const rel = new OneToManyRelationList(target, val, mapRel);
86
+ // Only reached under `values[key] != null`, i.e. only when the row actually carried
87
+ // relation data — so this never marks a relation the query did not ask for.
88
+ rel.Populated = true;
75
89
  entity[key] = rel;
90
+ target.snapshotRelation(key);
76
91
  delete target[val.ForeignKey];
77
92
  }
78
93
  }
@@ -94,6 +109,14 @@ let OneToOneRelationHydrator = class OneToOneRelationHydrator extends ModelHydra
94
109
  }
95
110
  if (values[key] != null) {
96
111
  const entity = target;
112
+ // Accept an already-resolved model instance passed under the relation
113
+ // name: attach it directly and translate its PK into the FK column,
114
+ // instead of trying to re-hydrate it from a plain data object.
115
+ if (values[key] instanceof ModelBase) {
116
+ entity[key] = new SingleRelation(target, val.TargetModel, val, values[key]);
117
+ target[val.ForeignKey] = values[key].PrimaryKeyValue;
118
+ continue;
119
+ }
97
120
  let tEntity = undefined;
98
121
  if (!Object.values(values[key]).every((x) => x === null)) {
99
122
  tEntity = !isConstructor(val.TargetModel) ? new (val.TargetModel())() : new val.TargetModel();
@@ -101,7 +124,11 @@ let OneToOneRelationHydrator = class OneToOneRelationHydrator extends ModelHydra
101
124
  tEntity['__relationKey__'] = key;
102
125
  }
103
126
  const rel = new SingleRelation(target, val.TargetModel, val, tEntity);
127
+ // Same guard as OneToManyRelationHydrator: `values[key] != null` means the query
128
+ // joined this relation in.
129
+ rel.Populated = true;
104
130
  entity[key] = rel;
131
+ target.snapshotRelation(key);
105
132
  }
106
133
  }
107
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hydrators.js","sourceRoot":"","sources":["../../src/hydrators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hydrators.js","sourceRoot":"","sources":["../../src/hydrators.ts"],"names":[],"mappings":";;;;;;AAAA,sCAAsC;AACtC,OAAO,EAAsB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE9E,MAAM,OAAgB,aAAa;CAElC;AAGM,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,aAAa;IAC5C,OAAO,CAAC,MAAiB,EAAE,MAAW;QAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,WAAW,CAAC,IAAI,6BAA6B,CAAC,CAAC;QAChG,CAAC;QAED,qCAAqC;QACrC,wBAAwB;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACjB,0CAA0C;YAC1C,gDAAgD;YAChD,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;gBACzF,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YAE7D,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAE3B,gEAAgE;gBAChE,oEAAoE;gBACpE,uEAAuE;gBACvE,kDAAkD;gBAClD,IAAI,QAAQ,YAAY,SAAS,EAAE,CAAC;oBACjC,MAAc,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC;gBAChD,CAAC;qBAAM,CAAC;oBACL,MAAc,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACjJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAlCY,kBAAkB;IAD9B,UAAU,CAAC,aAAa,CAAC;GACb,kBAAkB,CAkC9B;;AAGM,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,aAAa;IAC/C,OAAO,CAAC,MAAiB,EAAE,MAAW;QAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,WAAW,CAAC,IAAI,6BAA6B,CAAC,CAAC;QAChG,CAAC;QAED,yCAAyC;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC5G,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAChB,MAAc,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAbY,qBAAqB;IADjC,UAAU,CAAC,aAAa,CAAC;GACb,qBAAqB,CAajC;;AAGM,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,aAAa;IACnD,OAAO,CAAC,MAAiB,EAAE,MAAW;QAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,WAAW,CAAC,IAAI,6BAA6B,CAAC,CAAC;QAChG,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YAC9C,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;gBACnC,SAAS;YACX,CAAC;YAED,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,MAAa,CAAC;gBAE7B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;oBACxC,MAAM,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAE,GAAG,CAAC,WAAkC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAK,GAAG,CAAC,WAAmB,EAAE,CAAC;oBACpI,OAAe,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC;oBAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACnB,OAAO,OAAO,CAAC;gBACjB,CAAC,CAAC,CAAC;gBAEH,MAAM,GAAG,GAAG,IAAI,qBAAqB,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC3D,oFAAoF;gBACpF,4EAA4E;gBAC5E,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;gBAClB,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBAC7B,OAAQ,MAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAA;AAhCY,yBAAyB;IADrC,UAAU,CAAC,aAAa,CAAC;GACb,yBAAyB,CAgCrC;;AAGM,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,aAAa;IAClD,OAAO,CAAC,MAAiB,EAAE,MAAW;QAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,WAAW,CAAC,IAAI,6BAA6B,CAAC,CAAC;QAChG,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YAC9C,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,GAAG,EAAE,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,MAAa,CAAC;gBAE7B,sEAAsE;gBACtE,oEAAoE;gBACpE,+DAA+D;gBAC/D,IAAI,MAAM,CAAC,GAAG,CAAC,YAAY,SAAS,EAAE,CAAC;oBACrC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC3E,MAAc,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC;oBAC9D,SAAS;gBACX,CAAC;gBAED,IAAI,OAAO,GAAG,SAAS,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;oBACzD,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAE,GAAG,CAAC,WAAkC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAK,GAAG,CAAC,WAAmB,EAAE,CAAC;oBAC/H,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC5B,OAAe,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC;gBAC5C,CAAC;gBAED,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;gBACtE,iFAAiF;gBACjF,2BAA2B;gBAC3B,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;gBAClB,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAA;AAxCY,wBAAwB;IADpC,UAAU,CAAC,aAAa,CAAC;GACb,wBAAwB,CAwCpC;;AAGM,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,aAAa;IACvD,OAAO,CAAC,MAAiB,EAAE,MAAW;QAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,WAAW,CAAC,IAAI,6BAA6B,CAAC,CAAC;QAChG,CAAC;QAED,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,uBAAuB,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAEpC,MAAc,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACpC,CAAC;IACH,CAAC;CACF,CAAA;AAdY,6BAA6B;IADzC,UAAU,CAAC,aAAa,CAAC;GACb,6BAA6B,CAczC"}
@@ -0,0 +1,60 @@
1
+ import { Constructor } from '@spinajs/di';
2
+ import { IIdentityMap } from './interfaces.js';
3
+ import type { ModelBase } from './model.js';
4
+ /**
5
+ * Renders a primary-key value as a Map key.
6
+ *
7
+ * Type-tagged so `1` and `'1'` never collide — a string key column and an integer key column
8
+ * on two different models could otherwise alias each other through a shared cache. Returns
9
+ * `null` for an absent key: a model with no primary key cannot be identified and is never
10
+ * registered.
11
+ *
12
+ * A composite key arrives as a tuple ( that is what `ModelBase.PrimaryKeyValue` returns for a
13
+ * multi-column key ). Its parts are rendered individually and length-prefixed, because
14
+ * `String([1, 2])` and `String(['1,2'])` are both `"1,2"`. A tuple with any part missing has
15
+ * no identity at all, so it renders as `null` — the same answer as a missing scalar key.
16
+ *
17
+ * A one-element tuple renders exactly like the bare scalar: the ORM reads a single-column key
18
+ * as a scalar everywhere, and both spellings must reach the same entry.
19
+ *
20
+ * @param pk - primary key value: a scalar, or a tuple in key order
21
+ */
22
+ export declare function identityKey(pk: unknown): string | null;
23
+ /**
24
+ * Maps `(table, primary key) -> instance` for the duration of one `save()` graph walk, or of
25
+ * one transaction when several saves run inside it ( overview decision D7 ).
26
+ *
27
+ * Its only job is to guarantee that a row reached through two relation paths produces one
28
+ * subject rather than two conflicting ones. It is **not** a cache: nothing outside a
29
+ * `save()` consults it, it is discarded when the transaction ends, and queries behave
30
+ * exactly as they did before.
31
+ *
32
+ * **Keyed by table name, not by constructor.** A row's identity is the table it lives in plus
33
+ * its key — that is the definition `SubjectBuilder.buildOrphans` has always used, for the
34
+ * reason it records there: a `@DiscriminationMap` produces several constructors for one
35
+ * table, and a subclass instance is still the same row. Keying here by constructor made the
36
+ * two disagree, so the same row reached once as its base class and once as its discriminated
37
+ * subclass produced two entries and two conflicting subjects for one row.
38
+ *
39
+ * Table names are unique within the map's scope because `UnitOfWork.save()` refuses to span
40
+ * connections, so the A9 concerns that ruled out CLASS NAME keys — minification, and two
41
+ * connections declaring the same class name — do not apply to table names here. A table name
42
+ * is data from the schema, not a symbol the bundler may rewrite.
43
+ */
44
+ export declare class IdentityMap implements IIdentityMap {
45
+ private _entries;
46
+ private _size;
47
+ get Size(): number;
48
+ get(model: Constructor<ModelBase>, pk: unknown): ModelBase | undefined;
49
+ has(model: Constructor<ModelBase>, pk: unknown): boolean;
50
+ /**
51
+ * Registers `model` and returns the canonical instance for its identity — the one already
52
+ * registered if there is one, otherwise `model` itself. A model with no primary key is
53
+ * returned unchanged and not registered: it has no identity yet.
54
+ *
55
+ * @param model - model to canonicalize
56
+ */
57
+ add(model: ModelBase): ModelBase;
58
+ clear(): void;
59
+ }
60
+ //# sourceMappingURL=identity-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-map.d.ts","sourceRoot":"","sources":["../../src/identity-map.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAS5C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CA2BtD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAA8C;IAE9D,OAAO,CAAC,KAAK,CAAK;IAElB,IAAW,IAAI,IAAI,MAAM,CAExB;IAEM,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS;IAStE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO;IAI/D;;;;;;OAMG;IACI,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS;IAyBhC,KAAK,IAAI,IAAI;CAIrB"}
@@ -0,0 +1,130 @@
1
+ import { extractModelDescriptor } from './descriptor.js';
2
+ /**
3
+ * Separator between the parts of a composite key. Any character does: every part is
4
+ * length-prefixed, and it is the length prefix — not the separator — that makes two
5
+ * different tuples impossible to confuse.
6
+ */
7
+ const KEY_SEPARATOR = '|';
8
+ /**
9
+ * Renders a primary-key value as a Map key.
10
+ *
11
+ * Type-tagged so `1` and `'1'` never collide — a string key column and an integer key column
12
+ * on two different models could otherwise alias each other through a shared cache. Returns
13
+ * `null` for an absent key: a model with no primary key cannot be identified and is never
14
+ * registered.
15
+ *
16
+ * A composite key arrives as a tuple ( that is what `ModelBase.PrimaryKeyValue` returns for a
17
+ * multi-column key ). Its parts are rendered individually and length-prefixed, because
18
+ * `String([1, 2])` and `String(['1,2'])` are both `"1,2"`. A tuple with any part missing has
19
+ * no identity at all, so it renders as `null` — the same answer as a missing scalar key.
20
+ *
21
+ * A one-element tuple renders exactly like the bare scalar: the ORM reads a single-column key
22
+ * as a scalar everywhere, and both spellings must reach the same entry.
23
+ *
24
+ * @param pk - primary key value: a scalar, or a tuple in key order
25
+ */
26
+ export function identityKey(pk) {
27
+ if (pk === null || pk === undefined) {
28
+ return null;
29
+ }
30
+ if (Buffer.isBuffer(pk)) {
31
+ return `b:${pk.toString('hex')}`;
32
+ }
33
+ if (Array.isArray(pk)) {
34
+ if (pk.length === 1) {
35
+ return identityKey(pk[0]);
36
+ }
37
+ const parts = [];
38
+ for (const part of pk) {
39
+ const rendered = identityKey(part);
40
+ if (rendered === null) {
41
+ return null;
42
+ }
43
+ parts.push(`${rendered.length}:${rendered}`);
44
+ }
45
+ return parts.join(KEY_SEPARATOR);
46
+ }
47
+ return `${typeof pk}:${String(pk)}`;
48
+ }
49
+ /**
50
+ * Maps `(table, primary key) -> instance` for the duration of one `save()` graph walk, or of
51
+ * one transaction when several saves run inside it ( overview decision D7 ).
52
+ *
53
+ * Its only job is to guarantee that a row reached through two relation paths produces one
54
+ * subject rather than two conflicting ones. It is **not** a cache: nothing outside a
55
+ * `save()` consults it, it is discarded when the transaction ends, and queries behave
56
+ * exactly as they did before.
57
+ *
58
+ * **Keyed by table name, not by constructor.** A row's identity is the table it lives in plus
59
+ * its key — that is the definition `SubjectBuilder.buildOrphans` has always used, for the
60
+ * reason it records there: a `@DiscriminationMap` produces several constructors for one
61
+ * table, and a subclass instance is still the same row. Keying here by constructor made the
62
+ * two disagree, so the same row reached once as its base class and once as its discriminated
63
+ * subclass produced two entries and two conflicting subjects for one row.
64
+ *
65
+ * Table names are unique within the map's scope because `UnitOfWork.save()` refuses to span
66
+ * connections, so the A9 concerns that ruled out CLASS NAME keys — minification, and two
67
+ * connections declaring the same class name — do not apply to table names here. A table name
68
+ * is data from the schema, not a symbol the bundler may rewrite.
69
+ */
70
+ export class IdentityMap {
71
+ constructor() {
72
+ this._entries = new Map();
73
+ this._size = 0;
74
+ }
75
+ get Size() {
76
+ return this._size;
77
+ }
78
+ get(model, pk) {
79
+ const key = identityKey(pk);
80
+ if (key === null) {
81
+ return undefined;
82
+ }
83
+ return this._entries.get(scopeOf(model))?.get(key);
84
+ }
85
+ has(model, pk) {
86
+ return this.get(model, pk) !== undefined;
87
+ }
88
+ /**
89
+ * Registers `model` and returns the canonical instance for its identity — the one already
90
+ * registered if there is one, otherwise `model` itself. A model with no primary key is
91
+ * returned unchanged and not registered: it has no identity yet.
92
+ *
93
+ * @param model - model to canonicalize
94
+ */
95
+ add(model) {
96
+ const key = identityKey(model.PrimaryKeyValue);
97
+ if (key === null) {
98
+ return model;
99
+ }
100
+ const scope = scopeOf(model.constructor);
101
+ let byKey = this._entries.get(scope);
102
+ if (!byKey) {
103
+ byKey = new Map();
104
+ this._entries.set(scope, byKey);
105
+ }
106
+ const existing = byKey.get(key);
107
+ if (existing) {
108
+ return existing;
109
+ }
110
+ byKey.set(key, model);
111
+ this._size += 1;
112
+ return model;
113
+ }
114
+ clear() {
115
+ this._entries.clear();
116
+ this._size = 0;
117
+ }
118
+ }
119
+ /**
120
+ * The bucket a model class's rows live in: its table when it has a descriptor, otherwise the
121
+ * constructor itself.
122
+ *
123
+ * The table string and the constructor object can never collide as Map keys, so the fallback
124
+ * is safe. It exists for classes the ORM was handed without a `@Model` decorator — they have
125
+ * no table to unify on, and each constructor keeping its own bucket is the old behaviour.
126
+ */
127
+ function scopeOf(model) {
128
+ return extractModelDescriptor(model)?.TableName ?? model;
129
+ }
130
+ //# sourceMappingURL=identity-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-map.js","sourceRoot":"","sources":["../../src/identity-map.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,9 @@ export * from './interfaces.js';
2
2
  export * from './enums.js';
3
3
  export * from './symbols.js';
4
4
  export * from './descriptor.js';
5
+ export * from './primary-keys.js';
6
+ export * from './resilience.js';
7
+ export * from './metrics.js';
5
8
  export * from './schema.js';
6
9
  export * from './schema-providers.js';
7
10
  export * from './statements.js';
@@ -9,6 +12,7 @@ export * from './exceptions.js';
9
12
  export * from './converters.js';
10
13
  export * from './decorators.js';
11
14
  export * from './builders.js';
15
+ export * from './existsRelationHandlers.js';
12
16
  export * from './model.js';
13
17
  export * from './relations.js';
14
18
  export * from './relation-objects.js';
@@ -18,6 +22,14 @@ export * from './orm.js';
18
22
  export * from './types.js';
19
23
  export * from './hydrators.js';
20
24
  export * from './dehydrators.js';
25
+ export * from './snapshot.js';
26
+ export * from './identity-map.js';
27
+ export * from './orphan.js';
28
+ export * from './subject.js';
29
+ export * from './subject-builder.js';
30
+ export * from './subject-sorter.js';
31
+ export * from './subject-executor.js';
32
+ export * from './unit-of-work.js';
21
33
  export * from './driver.js';
22
34
  export * from './wrappers.js';
23
35
  export * from './fp.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
package/lib/mjs/index.js CHANGED
@@ -2,6 +2,9 @@ export * from './interfaces.js';
2
2
  export * from './enums.js';
3
3
  export * from './symbols.js';
4
4
  export * from './descriptor.js';
5
+ export * from './primary-keys.js';
6
+ export * from './resilience.js';
7
+ export * from './metrics.js';
5
8
  export * from './schema.js';
6
9
  export * from './schema-providers.js';
7
10
  export * from './statements.js';
@@ -9,6 +12,7 @@ export * from './exceptions.js';
9
12
  export * from './converters.js';
10
13
  export * from './decorators.js';
11
14
  export * from './builders.js';
15
+ export * from './existsRelationHandlers.js';
12
16
  export * from './model.js';
13
17
  export * from './relations.js';
14
18
  export * from './relation-objects.js';
@@ -18,6 +22,14 @@ export * from './orm.js';
18
22
  export * from './types.js';
19
23
  export * from './hydrators.js';
20
24
  export * from './dehydrators.js';
25
+ export * from './snapshot.js';
26
+ export * from './identity-map.js';
27
+ export * from './orphan.js';
28
+ export * from './subject.js';
29
+ export * from './subject-builder.js';
30
+ export * from './subject-sorter.js';
31
+ export * from './subject-executor.js';
32
+ export * from './unit-of-work.js';
21
33
  export * from './driver.js';
22
34
  export * from './wrappers.js';
23
35
  export * from './fp.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAE9B,mFAAmF;AACnF,kDAAkD;AAClD,sFAAsF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAE9B,mFAAmF;AACnF,kDAAkD;AAClD,sFAAsF"}