@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
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.JunctionModelPropertyHydrator = exports.OneToOneRelationHydrator = exports.OneToManyRelationHydrator = exports.NonDbPropertyHydrator = exports.DbPropertyHydrator = exports.ModelHydrator = void 0;
10
10
  /* eslint-disable prettier/prettier */
11
11
  const interfaces_js_1 = require("./interfaces.js");
12
+ const model_js_1 = require("./model.js");
12
13
  const di_1 = require("@spinajs/di");
13
14
  const relation_objects_js_1 = require("./relation-objects.js");
14
15
  class ModelHydrator {
@@ -26,12 +27,22 @@ let DbPropertyHydrator = class DbPropertyHydrator extends ModelHydrator {
26
27
  keys.forEach((k) => {
27
28
  // skip if column is primary key & is null
28
29
  // we dont want to override pkey of target model
29
- if (k === descriptor.PrimaryKey && !values[k]) {
30
+ if (descriptor.PrimaryKey.includes(k) && (values[k] === null || values[k] === undefined)) {
30
31
  return;
31
32
  }
32
33
  const column = descriptor.Columns?.find((c) => c.Name === k);
33
34
  if (values[k] !== undefined) {
34
- target[k] = column?.Converter ? column.Converter.fromDB(values[k], values, descriptor.Converters.get(column.Name)?.Options) : values[k];
35
+ const incoming = values[k];
36
+ // A relation FK column may receive either a raw scalar id or an
37
+ // already-resolved model instance (eg. from a DTO @Relation field).
38
+ // When a model instance arrives, translate it to its primary key value
39
+ // so the FK column stores the id, not the object.
40
+ if (incoming instanceof model_js_1.ModelBase) {
41
+ target[k] = incoming.PrimaryKeyValue;
42
+ }
43
+ else {
44
+ target[k] = column?.Converter ? column.Converter.fromDB(incoming, values, descriptor.Converters.get(column.Name)?.Options) : incoming;
45
+ }
35
46
  }
36
47
  });
37
48
  }
@@ -76,7 +87,11 @@ let OneToManyRelationHydrator = class OneToManyRelationHydrator extends ModelHyd
76
87
  return tEntity;
77
88
  });
78
89
  const rel = new relation_objects_js_1.OneToManyRelationList(target, val, mapRel);
90
+ // Only reached under `values[key] != null`, i.e. only when the row actually carried
91
+ // relation data — so this never marks a relation the query did not ask for.
92
+ rel.Populated = true;
79
93
  entity[key] = rel;
94
+ target.snapshotRelation(key);
80
95
  delete target[val.ForeignKey];
81
96
  }
82
97
  }
@@ -98,6 +113,14 @@ let OneToOneRelationHydrator = class OneToOneRelationHydrator extends ModelHydra
98
113
  }
99
114
  if (values[key] != null) {
100
115
  const entity = target;
116
+ // Accept an already-resolved model instance passed under the relation
117
+ // name: attach it directly and translate its PK into the FK column,
118
+ // instead of trying to re-hydrate it from a plain data object.
119
+ if (values[key] instanceof model_js_1.ModelBase) {
120
+ entity[key] = new relation_objects_js_1.SingleRelation(target, val.TargetModel, val, values[key]);
121
+ target[val.ForeignKey] = values[key].PrimaryKeyValue;
122
+ continue;
123
+ }
101
124
  let tEntity = undefined;
102
125
  if (!Object.values(values[key]).every((x) => x === null)) {
103
126
  tEntity = !(0, di_1.isConstructor)(val.TargetModel) ? new (val.TargetModel())() : new val.TargetModel();
@@ -105,7 +128,11 @@ let OneToOneRelationHydrator = class OneToOneRelationHydrator extends ModelHydra
105
128
  tEntity['__relationKey__'] = key;
106
129
  }
107
130
  const rel = new relation_objects_js_1.SingleRelation(target, val.TargetModel, val, tEntity);
131
+ // Same guard as OneToManyRelationHydrator: `values[key] != null` means the query
132
+ // joined this relation in.
133
+ rel.Populated = true;
108
134
  entity[key] = rel;
135
+ target.snapshotRelation(key);
109
136
  }
110
137
  }
111
138
  }
@@ -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":"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"}
@@ -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,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IdentityMap = void 0;
4
+ exports.identityKey = identityKey;
5
+ const descriptor_js_1 = require("./descriptor.js");
6
+ /**
7
+ * Separator between the parts of a composite key. Any character does: every part is
8
+ * length-prefixed, and it is the length prefix — not the separator — that makes two
9
+ * different tuples impossible to confuse.
10
+ */
11
+ const KEY_SEPARATOR = '|';
12
+ /**
13
+ * Renders a primary-key value as a Map key.
14
+ *
15
+ * Type-tagged so `1` and `'1'` never collide — a string key column and an integer key column
16
+ * on two different models could otherwise alias each other through a shared cache. Returns
17
+ * `null` for an absent key: a model with no primary key cannot be identified and is never
18
+ * registered.
19
+ *
20
+ * A composite key arrives as a tuple ( that is what `ModelBase.PrimaryKeyValue` returns for a
21
+ * multi-column key ). Its parts are rendered individually and length-prefixed, because
22
+ * `String([1, 2])` and `String(['1,2'])` are both `"1,2"`. A tuple with any part missing has
23
+ * no identity at all, so it renders as `null` — the same answer as a missing scalar key.
24
+ *
25
+ * A one-element tuple renders exactly like the bare scalar: the ORM reads a single-column key
26
+ * as a scalar everywhere, and both spellings must reach the same entry.
27
+ *
28
+ * @param pk - primary key value: a scalar, or a tuple in key order
29
+ */
30
+ function identityKey(pk) {
31
+ if (pk === null || pk === undefined) {
32
+ return null;
33
+ }
34
+ if (Buffer.isBuffer(pk)) {
35
+ return `b:${pk.toString('hex')}`;
36
+ }
37
+ if (Array.isArray(pk)) {
38
+ if (pk.length === 1) {
39
+ return identityKey(pk[0]);
40
+ }
41
+ const parts = [];
42
+ for (const part of pk) {
43
+ const rendered = identityKey(part);
44
+ if (rendered === null) {
45
+ return null;
46
+ }
47
+ parts.push(`${rendered.length}:${rendered}`);
48
+ }
49
+ return parts.join(KEY_SEPARATOR);
50
+ }
51
+ return `${typeof pk}:${String(pk)}`;
52
+ }
53
+ /**
54
+ * Maps `(table, primary key) -> instance` for the duration of one `save()` graph walk, or of
55
+ * one transaction when several saves run inside it ( overview decision D7 ).
56
+ *
57
+ * Its only job is to guarantee that a row reached through two relation paths produces one
58
+ * subject rather than two conflicting ones. It is **not** a cache: nothing outside a
59
+ * `save()` consults it, it is discarded when the transaction ends, and queries behave
60
+ * exactly as they did before.
61
+ *
62
+ * **Keyed by table name, not by constructor.** A row's identity is the table it lives in plus
63
+ * its key — that is the definition `SubjectBuilder.buildOrphans` has always used, for the
64
+ * reason it records there: a `@DiscriminationMap` produces several constructors for one
65
+ * table, and a subclass instance is still the same row. Keying here by constructor made the
66
+ * two disagree, so the same row reached once as its base class and once as its discriminated
67
+ * subclass produced two entries and two conflicting subjects for one row.
68
+ *
69
+ * Table names are unique within the map's scope because `UnitOfWork.save()` refuses to span
70
+ * connections, so the A9 concerns that ruled out CLASS NAME keys — minification, and two
71
+ * connections declaring the same class name — do not apply to table names here. A table name
72
+ * is data from the schema, not a symbol the bundler may rewrite.
73
+ */
74
+ class IdentityMap {
75
+ constructor() {
76
+ this._entries = new Map();
77
+ this._size = 0;
78
+ }
79
+ get Size() {
80
+ return this._size;
81
+ }
82
+ get(model, pk) {
83
+ const key = identityKey(pk);
84
+ if (key === null) {
85
+ return undefined;
86
+ }
87
+ return this._entries.get(scopeOf(model))?.get(key);
88
+ }
89
+ has(model, pk) {
90
+ return this.get(model, pk) !== undefined;
91
+ }
92
+ /**
93
+ * Registers `model` and returns the canonical instance for its identity — the one already
94
+ * registered if there is one, otherwise `model` itself. A model with no primary key is
95
+ * returned unchanged and not registered: it has no identity yet.
96
+ *
97
+ * @param model - model to canonicalize
98
+ */
99
+ add(model) {
100
+ const key = identityKey(model.PrimaryKeyValue);
101
+ if (key === null) {
102
+ return model;
103
+ }
104
+ const scope = scopeOf(model.constructor);
105
+ let byKey = this._entries.get(scope);
106
+ if (!byKey) {
107
+ byKey = new Map();
108
+ this._entries.set(scope, byKey);
109
+ }
110
+ const existing = byKey.get(key);
111
+ if (existing) {
112
+ return existing;
113
+ }
114
+ byKey.set(key, model);
115
+ this._size += 1;
116
+ return model;
117
+ }
118
+ clear() {
119
+ this._entries.clear();
120
+ this._size = 0;
121
+ }
122
+ }
123
+ exports.IdentityMap = IdentityMap;
124
+ /**
125
+ * The bucket a model class's rows live in: its table when it has a descriptor, otherwise the
126
+ * constructor itself.
127
+ *
128
+ * The table string and the constructor object can never collide as Map keys, so the fallback
129
+ * is safe. It exists for classes the ORM was handed without a `@Model` decorator — they have
130
+ * no table to unify on, and each constructor keeping its own bucket is the old behaviour.
131
+ */
132
+ function scopeOf(model) {
133
+ return (0, descriptor_js_1.extractModelDescriptor)(model)?.TableName ?? model;
134
+ }
135
+ //# sourceMappingURL=identity-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-map.js","sourceRoot":"","sources":["../../src/identity-map.ts"],"names":[],"mappings":";;;AA+BA,kCA2BC;AAxDD,mDAAyD;AAIzD;;;;GAIG;AACH,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,WAAW,CAAC,EAAW;IACrC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QACtB,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,GAAG,OAAO,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAa,WAAW;IAAxB;QACU,aAAQ,GAAG,IAAI,GAAG,EAAmC,CAAC;QAEtD,UAAK,GAAG,CAAC,CAAC;IAuDpB,CAAC;IArDC,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEM,GAAG,CAAC,KAA6B,EAAE,EAAW;QACnD,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAEM,GAAG,CAAC,KAA6B,EAAE,EAAW;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,SAAS,CAAC;IAC3C,CAAC;IAED;;;;;;OAMG;IACI,GAAG,CAAC,KAAgB;QACzB,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAqC,CAAC,CAAC;QACnE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAErC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAEhB,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,CAAC;CACF;AA1DD,kCA0DC;AAED;;;;;;;GAOG;AACH,SAAS,OAAO,CAAC,KAA6B;IAC5C,OAAO,IAAA,sCAAsB,EAAC,KAAK,CAAC,EAAE,SAAS,IAAI,KAAK,CAAC;AAC3D,CAAC"}
@@ -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/cjs/index.js CHANGED
@@ -18,6 +18,9 @@ __exportStar(require("./interfaces.js"), exports);
18
18
  __exportStar(require("./enums.js"), exports);
19
19
  __exportStar(require("./symbols.js"), exports);
20
20
  __exportStar(require("./descriptor.js"), exports);
21
+ __exportStar(require("./primary-keys.js"), exports);
22
+ __exportStar(require("./resilience.js"), exports);
23
+ __exportStar(require("./metrics.js"), exports);
21
24
  __exportStar(require("./schema.js"), exports);
22
25
  __exportStar(require("./schema-providers.js"), exports);
23
26
  __exportStar(require("./statements.js"), exports);
@@ -25,6 +28,7 @@ __exportStar(require("./exceptions.js"), exports);
25
28
  __exportStar(require("./converters.js"), exports);
26
29
  __exportStar(require("./decorators.js"), exports);
27
30
  __exportStar(require("./builders.js"), exports);
31
+ __exportStar(require("./existsRelationHandlers.js"), exports);
28
32
  __exportStar(require("./model.js"), exports);
29
33
  __exportStar(require("./relations.js"), exports);
30
34
  __exportStar(require("./relation-objects.js"), exports);
@@ -34,6 +38,14 @@ __exportStar(require("./orm.js"), exports);
34
38
  __exportStar(require("./types.js"), exports);
35
39
  __exportStar(require("./hydrators.js"), exports);
36
40
  __exportStar(require("./dehydrators.js"), exports);
41
+ __exportStar(require("./snapshot.js"), exports);
42
+ __exportStar(require("./identity-map.js"), exports);
43
+ __exportStar(require("./orphan.js"), exports);
44
+ __exportStar(require("./subject.js"), exports);
45
+ __exportStar(require("./subject-builder.js"), exports);
46
+ __exportStar(require("./subject-sorter.js"), exports);
47
+ __exportStar(require("./subject-executor.js"), exports);
48
+ __exportStar(require("./unit-of-work.js"), exports);
37
49
  __exportStar(require("./driver.js"), exports);
38
50
  __exportStar(require("./wrappers.js"), exports);
39
51
  __exportStar(require("./fp.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,6CAA2B;AAC3B,+CAA6B;AAC7B,kDAAgC;AAChC,8CAA4B;AAC5B,wDAAsC;AACtC,kDAAgC;AAChC,kDAAgC;AAChC,kDAAgC;AAChC,kDAAgC;AAChC,gDAA8B;AAC9B,6CAA2B;AAC3B,iDAA+B;AAC/B,wDAAsC;AACtC,mDAAiC;AACjC,iEAA+C;AAC/C,2CAAyB;AACzB,6CAA2B;AAC3B,iDAA+B;AAC/B,mDAAiC;AACjC,8CAA4B;AAC5B,gDAA8B;AAC9B,0CAAwB;AACxB,iDAA+B;AAC/B,gDAA8B;AAE9B,mFAAmF;AACnF,kDAAkD;AAClD,sFAAsF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,6CAA2B;AAC3B,+CAA6B;AAC7B,kDAAgC;AAChC,oDAAkC;AAClC,kDAAgC;AAChC,+CAA6B;AAC7B,8CAA4B;AAC5B,wDAAsC;AACtC,kDAAgC;AAChC,kDAAgC;AAChC,kDAAgC;AAChC,kDAAgC;AAChC,gDAA8B;AAC9B,8DAA4C;AAC5C,6CAA2B;AAC3B,iDAA+B;AAC/B,wDAAsC;AACtC,mDAAiC;AACjC,iEAA+C;AAC/C,2CAAyB;AACzB,6CAA2B;AAC3B,iDAA+B;AAC/B,mDAAiC;AACjC,gDAA8B;AAC9B,oDAAkC;AAClC,8CAA4B;AAC5B,+CAA6B;AAC7B,uDAAqC;AACrC,sDAAoC;AACpC,wDAAsC;AACtC,oDAAkC;AAClC,8CAA4B;AAC5B,gDAA8B;AAC9B,0CAAwB;AACxB,iDAA+B;AAC/B,gDAA8B;AAE9B,mFAAmF;AACnF,kDAAkD;AAClD,sFAAsF"}