velocious 1.0.552 → 1.0.555

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 (117) hide show
  1. package/README.md +2 -0
  2. package/build/background-jobs/status-reporter.js +15 -2
  3. package/build/background-jobs/worker.js +5 -1
  4. package/build/frontend-models/base.js +105 -47
  5. package/build/frontend-models/transport-deadline.js +66 -0
  6. package/build/src/background-jobs/status-reporter.d.ts +3 -1
  7. package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
  8. package/build/src/background-jobs/status-reporter.js +16 -3
  9. package/build/src/background-jobs/worker.d.ts.map +1 -1
  10. package/build/src/background-jobs/worker.js +6 -2
  11. package/build/src/frontend-models/base.d.ts +10 -1
  12. package/build/src/frontend-models/base.d.ts.map +1 -1
  13. package/build/src/frontend-models/base.js +71 -26
  14. package/build/src/frontend-models/transport-deadline.d.ts +26 -0
  15. package/build/src/frontend-models/transport-deadline.d.ts.map +1 -0
  16. package/build/src/frontend-models/transport-deadline.js +61 -0
  17. package/build/src/testing/factory/association-declaration.d.ts +37 -0
  18. package/build/src/testing/factory/association-declaration.d.ts.map +1 -0
  19. package/build/src/testing/factory/association-declaration.js +41 -0
  20. package/build/src/testing/factory/declarations.d.ts +190 -0
  21. package/build/src/testing/factory/declarations.d.ts.map +1 -0
  22. package/build/src/testing/factory/declarations.js +98 -0
  23. package/build/src/testing/factory/definition-builder.d.ts +132 -0
  24. package/build/src/testing/factory/definition-builder.d.ts.map +1 -0
  25. package/build/src/testing/factory/definition-builder.js +417 -0
  26. package/build/src/testing/factory/errors.d.ts +62 -0
  27. package/build/src/testing/factory/errors.d.ts.map +1 -0
  28. package/build/src/testing/factory/errors.js +67 -0
  29. package/build/src/testing/factory/evaluation-context.d.ts +95 -0
  30. package/build/src/testing/factory/evaluation-context.d.ts.map +1 -0
  31. package/build/src/testing/factory/evaluation-context.js +175 -0
  32. package/build/src/testing/factory/events.d.ts +21 -0
  33. package/build/src/testing/factory/events.d.ts.map +1 -0
  34. package/build/src/testing/factory/events.js +26 -0
  35. package/build/src/testing/factory/factory-definition.d.ts +39 -0
  36. package/build/src/testing/factory/factory-definition.d.ts.map +1 -0
  37. package/build/src/testing/factory/factory-definition.js +35 -0
  38. package/build/src/testing/factory/factory-registry.d.ts +263 -0
  39. package/build/src/testing/factory/factory-registry.d.ts.map +1 -0
  40. package/build/src/testing/factory/factory-registry.js +438 -0
  41. package/build/src/testing/factory/factory-runner.d.ts +179 -0
  42. package/build/src/testing/factory/factory-runner.d.ts.map +1 -0
  43. package/build/src/testing/factory/factory-runner.js +266 -0
  44. package/build/src/testing/factory/index.d.ts +18 -0
  45. package/build/src/testing/factory/index.d.ts.map +1 -0
  46. package/build/src/testing/factory/index.js +21 -0
  47. package/build/src/testing/factory/linter.d.ts +55 -0
  48. package/build/src/testing/factory/linter.d.ts.map +1 -0
  49. package/build/src/testing/factory/linter.js +106 -0
  50. package/build/src/testing/factory/model-contract.d.ts +11 -0
  51. package/build/src/testing/factory/model-contract.d.ts.map +1 -0
  52. package/build/src/testing/factory/model-contract.js +26 -0
  53. package/build/src/testing/factory/node/load-definitions.d.ts +24 -0
  54. package/build/src/testing/factory/node/load-definitions.d.ts.map +1 -0
  55. package/build/src/testing/factory/node/load-definitions.js +87 -0
  56. package/build/src/testing/factory/sequence.d.ts +73 -0
  57. package/build/src/testing/factory/sequence.d.ts.map +1 -0
  58. package/build/src/testing/factory/sequence.js +78 -0
  59. package/build/src/testing/factory/strategies/attributes-for.d.ts +21 -0
  60. package/build/src/testing/factory/strategies/attributes-for.d.ts.map +1 -0
  61. package/build/src/testing/factory/strategies/attributes-for.js +22 -0
  62. package/build/src/testing/factory/strategies/base.d.ts +101 -0
  63. package/build/src/testing/factory/strategies/base.d.ts.map +1 -0
  64. package/build/src/testing/factory/strategies/base.js +191 -0
  65. package/build/src/testing/factory/strategies/build.d.ts +20 -0
  66. package/build/src/testing/factory/strategies/build.d.ts.map +1 -0
  67. package/build/src/testing/factory/strategies/build.js +34 -0
  68. package/build/src/testing/factory/strategies/create.d.ts +32 -0
  69. package/build/src/testing/factory/strategies/create.d.ts.map +1 -0
  70. package/build/src/testing/factory/strategies/create.js +57 -0
  71. package/build/src/testing/factory/trait-definition.d.ts +22 -0
  72. package/build/src/testing/factory/trait-definition.d.ts.map +1 -0
  73. package/build/src/testing/factory/trait-definition.js +22 -0
  74. package/build/testing/factory/association-declaration.js +50 -0
  75. package/build/testing/factory/declarations.js +110 -0
  76. package/build/testing/factory/definition-builder.js +476 -0
  77. package/build/testing/factory/errors.js +79 -0
  78. package/build/testing/factory/evaluation-context.js +199 -0
  79. package/build/testing/factory/events.js +30 -0
  80. package/build/testing/factory/factory-definition.js +41 -0
  81. package/build/testing/factory/factory-registry.js +501 -0
  82. package/build/testing/factory/factory-runner.js +296 -0
  83. package/build/testing/factory/index.js +24 -0
  84. package/build/testing/factory/linter.js +119 -0
  85. package/build/testing/factory/model-contract.js +31 -0
  86. package/build/testing/factory/node/load-definitions.js +103 -0
  87. package/build/testing/factory/sequence.js +91 -0
  88. package/build/testing/factory/strategies/attributes-for.js +24 -0
  89. package/build/testing/factory/strategies/base.js +209 -0
  90. package/build/testing/factory/strategies/build.js +42 -0
  91. package/build/testing/factory/strategies/create.js +68 -0
  92. package/build/testing/factory/trait-definition.js +24 -0
  93. package/build/tsconfig.tsbuildinfo +1 -1
  94. package/package.json +1 -1
  95. package/src/background-jobs/status-reporter.js +15 -2
  96. package/src/background-jobs/worker.js +5 -1
  97. package/src/frontend-models/base.js +105 -47
  98. package/src/frontend-models/transport-deadline.js +66 -0
  99. package/src/testing/factory/association-declaration.js +50 -0
  100. package/src/testing/factory/declarations.js +110 -0
  101. package/src/testing/factory/definition-builder.js +476 -0
  102. package/src/testing/factory/errors.js +79 -0
  103. package/src/testing/factory/evaluation-context.js +199 -0
  104. package/src/testing/factory/events.js +30 -0
  105. package/src/testing/factory/factory-definition.js +41 -0
  106. package/src/testing/factory/factory-registry.js +501 -0
  107. package/src/testing/factory/factory-runner.js +296 -0
  108. package/src/testing/factory/index.js +24 -0
  109. package/src/testing/factory/linter.js +119 -0
  110. package/src/testing/factory/model-contract.js +31 -0
  111. package/src/testing/factory/node/load-definitions.js +103 -0
  112. package/src/testing/factory/sequence.js +91 -0
  113. package/src/testing/factory/strategies/attributes-for.js +24 -0
  114. package/src/testing/factory/strategies/base.js +209 -0
  115. package/src/testing/factory/strategies/build.js +42 -0
  116. package/src/testing/factory/strategies/create.js +68 -0
  117. package/src/testing/factory/trait-definition.js +24 -0
@@ -0,0 +1,179 @@
1
+ /**
2
+ * A resolved attribute/transient/association slot in a compiled plan.
3
+ * @typedef {object} Slot
4
+ * @property {"attribute" | "transient" | "association"} slotKind - Slot nature.
5
+ * @property {?} value - Literal/lazy value, override value, or AssociationDeclaration.
6
+ * @property {boolean} isOverride - Whether the value came from a call-site override.
7
+ */
8
+ /**
9
+ * The immutable result of compiling a factory invocation.
10
+ * @typedef {object} CompiledPlan
11
+ * @property {string} factoryName - Target factory name.
12
+ * @property {import("./factory-definition.js").default} factoryDefinition - Target definition.
13
+ * @property {(new (attributes?: Record<string, ?>) => ?) | null} modelClass - Resolved model class.
14
+ * @property {string[]} chainNames - Inheritance chain names (child last) for sequence scope.
15
+ * @property {Map<string, Slot>} resolved - Name→slot map (last declaration wins).
16
+ * @property {Map<string, import("./declarations.js").CallbackDeclaration[]>} callbacks - Deduped callbacks by event.
17
+ * @property {import("./declarations.js").InitializeWithDeclaration["fn"] | null} initializeWith - Custom constructor, or null.
18
+ * @property {import("./declarations.js").ToCreateDeclaration["fn"] | null} toCreate - Custom persistence, or null.
19
+ * @property {boolean} skipCreate - Whether persistence is skipped.
20
+ */
21
+ /**
22
+ * Compiles factory invocations into immutable plans by resolving the inheritance
23
+ * chain, expanding base and requested traits, and folding declarations into a
24
+ * name→slot map plus a deduped, ordered callback set.
25
+ */
26
+ export default class FactoryRunner {
27
+ /**
28
+ * Builds a runner.
29
+ * @param {import("./factory-registry.js").default} registry - Owning registry.
30
+ */
31
+ constructor(registry: import("./factory-registry.js").default);
32
+ /** @type {import("./factory-registry.js").default} - Owning registry. */
33
+ registry: import("./factory-registry.js").default;
34
+ /**
35
+ * Compiles a factory invocation into a plan.
36
+ * @param {string} factoryName - Factory to run.
37
+ * @param {string[]} requestedTraits - Traits requested at the call site, in order.
38
+ * @param {Record<string, ?>} overrides - Call-site overrides (highest precedence).
39
+ * @returns {CompiledPlan} - The compiled plan.
40
+ */
41
+ compile(factoryName: string, requestedTraits: string[], overrides: Record<string, unknown>): CompiledPlan;
42
+ /**
43
+ * Resolves the inheritance chain from the root parent down to the target.
44
+ * @param {string} factoryName - Target factory name.
45
+ * @returns {import("./factory-definition.js").default[]} - Chain (root first, target last).
46
+ */
47
+ _resolveChain(factoryName: string): import("./factory-definition.js").default[];
48
+ /**
49
+ * Resolves a factory definition by name (or alias).
50
+ * @param {string} factoryName - Factory name.
51
+ * @returns {import("./factory-definition.js").default} - The definition.
52
+ */
53
+ _resolveFactory(factoryName: string): import("./factory-definition.js").default;
54
+ /**
55
+ * Picks the nearest declared model class in the chain (child overrides parent).
56
+ * @param {import("./factory-definition.js").default[]} chain - Inheritance chain.
57
+ * @returns {(new (attributes?: Record<string, ?>) => ?) | null} - The model class, or null.
58
+ */
59
+ _resolveModelClass(chain: import("./factory-definition.js").default[]): (new (attributes?: Record<string, unknown>) => unknown) | null;
60
+ /**
61
+ * Expands one factory's own declarations, inlining base-trait inclusions.
62
+ * @param {import("./factory-definition.js").default} factoryDefinition - Factory whose declarations are expanded.
63
+ * @param {import("./factory-definition.js").default} scope - Target factory (for local-trait resolution).
64
+ * @param {Array<{decl: import("./declarations.js").Declaration}>} out - Flattened output sink.
65
+ * @returns {void}
66
+ */
67
+ _expandFactoryDeclarations(factoryDefinition: import("./factory-definition.js").default, scope: import("./factory-definition.js").default, out: Array<{
68
+ decl: import("./declarations.js").Declaration;
69
+ }>): void;
70
+ /**
71
+ * Expands a trait (resolving factory-local before global) and its inclusions.
72
+ * @param {string} traitName - Trait to expand.
73
+ * @param {import("./factory-definition.js").default} scope - Target factory (for local-trait resolution).
74
+ * @param {Array<{decl: import("./declarations.js").Declaration}>} out - Flattened output sink.
75
+ * @param {string[]} activePath - Trait inclusion path (for cycle detection).
76
+ * @returns {void}
77
+ */
78
+ _expandTrait(traitName: string, scope: import("./factory-definition.js").default, out: Array<{
79
+ decl: import("./declarations.js").Declaration;
80
+ }>, activePath: string[]): void;
81
+ /**
82
+ * Resolves a local trait from the current factory upward through its parents.
83
+ * @param {string} traitName - Trait name to resolve.
84
+ * @param {import("./factory-definition.js").default} scope - Declaring/requesting factory scope.
85
+ * @returns {{trait: import("./trait-definition.js").default, scope: import("./factory-definition.js").default} | undefined} - Nearest local trait and its declaring scope, if any.
86
+ */
87
+ _resolveLocalTrait(traitName: string, scope: import("./factory-definition.js").default): {
88
+ trait: import("./trait-definition.js").default;
89
+ scope: import("./factory-definition.js").default;
90
+ } | undefined;
91
+ /**
92
+ * Folds flattened declarations plus overrides into a compiled plan.
93
+ * @param {object} args - Options.
94
+ * @param {Array<{decl: import("./declarations.js").Declaration}>} args.flattened - Flattened declarations.
95
+ * @param {Record<string, ?>} args.overrides - Call-site overrides.
96
+ * @param {(new (attributes?: Record<string, ?>) => ?) | null} args.modelClass - Resolved model class.
97
+ * @param {import("./factory-definition.js").default} args.target - Target factory definition.
98
+ * @param {string[]} args.chainNames - Inheritance chain names.
99
+ * @returns {CompiledPlan} - The compiled plan.
100
+ */
101
+ _buildPlan({ flattened, overrides, modelClass, target, chainNames }: {
102
+ flattened: Array<{
103
+ decl: import("./declarations.js").Declaration;
104
+ }>;
105
+ overrides: Record<string, unknown>;
106
+ modelClass: (new (attributes?: Record<string, unknown>) => unknown) | null;
107
+ target: import("./factory-definition.js").default;
108
+ chainNames: string[];
109
+ }): CompiledPlan;
110
+ /**
111
+ * Applies belongs-to override precedence using the declared model relationship's
112
+ * real foreign-key metadata. An explicit association object wins over its key;
113
+ * otherwise an explicit key suppresses the factory-declared association.
114
+ * @param {Map<string, Slot>} resolved - Folded slots.
115
+ * @param {Record<string, ?>} overrides - Call-site overrides.
116
+ * @param {(new (attributes?: Record<string, ?>) => ?) | null} modelClass - Resolved model class.
117
+ * @returns {void}
118
+ */
119
+ _arbitrateAssociationOverrides(resolved: Map<string, Slot>, overrides: Record<string, unknown>, modelClass: (new (attributes?: Record<string, unknown>) => unknown) | null): void;
120
+ }
121
+ /**
122
+ * A resolved attribute/transient/association slot in a compiled plan.
123
+ */
124
+ export type Slot = {
125
+ /**
126
+ * - Slot nature.
127
+ */
128
+ slotKind: "attribute" | "transient" | "association";
129
+ /**
130
+ * - Literal/lazy value, override value, or AssociationDeclaration.
131
+ */
132
+ value: unknown;
133
+ /**
134
+ * - Whether the value came from a call-site override.
135
+ */
136
+ isOverride: boolean;
137
+ };
138
+ /**
139
+ * The immutable result of compiling a factory invocation.
140
+ */
141
+ export type CompiledPlan = {
142
+ /**
143
+ * - Target factory name.
144
+ */
145
+ factoryName: string;
146
+ /**
147
+ * - Target definition.
148
+ */
149
+ factoryDefinition: import("./factory-definition.js").default;
150
+ /**
151
+ * - Resolved model class.
152
+ */
153
+ modelClass: (new (attributes?: Record<string, unknown>) => unknown) | null;
154
+ /**
155
+ * - Inheritance chain names (child last) for sequence scope.
156
+ */
157
+ chainNames: string[];
158
+ /**
159
+ * - Name→slot map (last declaration wins).
160
+ */
161
+ resolved: Map<string, Slot>;
162
+ /**
163
+ * - Deduped callbacks by event.
164
+ */
165
+ callbacks: Map<string, import("./declarations.js").CallbackDeclaration[]>;
166
+ /**
167
+ * - Custom constructor, or null.
168
+ */
169
+ initializeWith: import("./declarations.js").InitializeWithDeclaration["fn"] | null;
170
+ /**
171
+ * - Custom persistence, or null.
172
+ */
173
+ toCreate: import("./declarations.js").ToCreateDeclaration["fn"] | null;
174
+ /**
175
+ * - Whether persistence is skipped.
176
+ */
177
+ skipCreate: boolean;
178
+ };
179
+ //# sourceMappingURL=factory-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-runner.d.ts","sourceRoot":"","sources":["../../../../src/testing/factory/factory-runner.js"],"names":[],"mappings":"AAKA;;;;;;GAMG;AAEH;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH;IACE;;;OAGG;IACH,sBAFW,OAAO,uBAAuB,EAAE,OAAO,EAKjD;IAFC,yEAAyE;IACzE,UADW,OAAO,uBAAuB,EAAE,OAAO,CAC1B;IAG1B;;;;;;OAMG;IACH,qBALW,MAAM,mBACN,MAAM,EAAE,aACR,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GACf,YAAY,CAuBxB;IAED;;;;OAIG;IACH,2BAHW,MAAM,GACJ,OAAO,yBAAyB,EAAE,OAAO,EAAE,CAqBvD;IAED;;;;OAIG;IACH,6BAHW,MAAM,GACJ,OAAO,yBAAyB,EAAE,OAAO,CAUrD;IAED;;;;OAIG;IACH,0BAHW,OAAO,yBAAyB,EAAE,OAAO,EAAE,GACzC,CAAC,KAAK,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,KAAK,OAAC,CAAC,GAAG,IAAI,CAQ9D;IAED;;;;;;OAMG;IACH,8CALW,OAAO,yBAAyB,EAAE,OAAO,SACzC,OAAO,yBAAyB,EAAE,OAAO,OACzC,KAAK,CAAC;QAAC,IAAI,EAAE,OAAO,mBAAmB,EAAE,WAAW,CAAA;KAAC,CAAC,GACpD,IAAI,CAUhB;IAED;;;;;;;OAOG;IACH,wBANW,MAAM,SACN,OAAO,yBAAyB,EAAE,OAAO,OACzC,KAAK,CAAC;QAAC,IAAI,EAAE,OAAO,mBAAmB,EAAE,WAAW,CAAA;KAAC,CAAC,cACtD,MAAM,EAAE,GACN,IAAI,CAsBhB;IAED;;;;;OAKG;IACH,8BAJW,MAAM,SACN,OAAO,yBAAyB,EAAE,OAAO,GACvC;QAAC,KAAK,EAAE,OAAO,uBAAuB,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,yBAAyB,EAAE,OAAO,CAAA;KAAC,GAAG,SAAS,CAe1H;IAED;;;;;;;;;OASG;IACH,qEAPG;QAAqE,SAAS,EAAtE,KAAK,CAAC;YAAC,IAAI,EAAE,OAAO,mBAAmB,EAAE,WAAW,CAAA;SAAC,CAAC;QAC9B,SAAS,EAAjC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;QACwC,UAAU,EAAnE,CAAC,KAAK,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,KAAK,OAAC,CAAC,GAAG,IAAI;QACF,MAAM,EAAtD,OAAO,yBAAyB,EAAE,OAAO;QAC1B,UAAU,EAAzB,MAAM,EAAE;KAChB,GAAU,YAAY,CAyDxB;IAED;;;;;;;;OAQG;IACH,yCALW,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,aACjB,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,cACjB,CAAC,KAAK,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,KAAK,OAAC,CAAC,GAAG,IAAI,GAChD,IAAI,CA0BhB;CACF;;;;;;;;cA/Ra,WAAW,GAAG,WAAW,GAAG,aAAa;;;;WACzC,OAAC;;;;gBACD,OAAO;;;;;;;;;iBAMP,MAAM;;;;uBACN,OAAO,yBAAyB,EAAE,OAAO;;;;gBACzC,CAAC,KAAK,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,KAAK,OAAC,CAAC,GAAG,IAAI;;;;gBAClD,MAAM,EAAE;;;;cACR,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;;;;eACjB,GAAG,CAAC,MAAM,EAAE,OAAO,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;;;;oBAC9D,OAAO,mBAAmB,EAAE,yBAAyB,CAAC,IAAI,CAAC,GAAG,IAAI;;;;cAClE,OAAO,mBAAmB,EAAE,mBAAmB,CAAC,IAAI,CAAC,GAAG,IAAI;;;;gBAC5D,OAAO"}
@@ -0,0 +1,266 @@
1
+ // @ts-check
2
+ import DatabaseRecord from "../../database/record/index.js";
3
+ import { FactoryCycleError, UndefinedFactoryError, UndefinedTraitError } from "./errors.js";
4
+ /**
5
+ * A resolved attribute/transient/association slot in a compiled plan.
6
+ * @typedef {object} Slot
7
+ * @property {"attribute" | "transient" | "association"} slotKind - Slot nature.
8
+ * @property {?} value - Literal/lazy value, override value, or AssociationDeclaration.
9
+ * @property {boolean} isOverride - Whether the value came from a call-site override.
10
+ */
11
+ /**
12
+ * The immutable result of compiling a factory invocation.
13
+ * @typedef {object} CompiledPlan
14
+ * @property {string} factoryName - Target factory name.
15
+ * @property {import("./factory-definition.js").default} factoryDefinition - Target definition.
16
+ * @property {(new (attributes?: Record<string, ?>) => ?) | null} modelClass - Resolved model class.
17
+ * @property {string[]} chainNames - Inheritance chain names (child last) for sequence scope.
18
+ * @property {Map<string, Slot>} resolved - Name→slot map (last declaration wins).
19
+ * @property {Map<string, import("./declarations.js").CallbackDeclaration[]>} callbacks - Deduped callbacks by event.
20
+ * @property {import("./declarations.js").InitializeWithDeclaration["fn"] | null} initializeWith - Custom constructor, or null.
21
+ * @property {import("./declarations.js").ToCreateDeclaration["fn"] | null} toCreate - Custom persistence, or null.
22
+ * @property {boolean} skipCreate - Whether persistence is skipped.
23
+ */
24
+ /**
25
+ * Compiles factory invocations into immutable plans by resolving the inheritance
26
+ * chain, expanding base and requested traits, and folding declarations into a
27
+ * name→slot map plus a deduped, ordered callback set.
28
+ */
29
+ export default class FactoryRunner {
30
+ /**
31
+ * Builds a runner.
32
+ * @param {import("./factory-registry.js").default} registry - Owning registry.
33
+ */
34
+ constructor(registry) {
35
+ /** @type {import("./factory-registry.js").default} - Owning registry. */
36
+ this.registry = registry;
37
+ }
38
+ /**
39
+ * Compiles a factory invocation into a plan.
40
+ * @param {string} factoryName - Factory to run.
41
+ * @param {string[]} requestedTraits - Traits requested at the call site, in order.
42
+ * @param {Record<string, ?>} overrides - Call-site overrides (highest precedence).
43
+ * @returns {CompiledPlan} - The compiled plan.
44
+ */
45
+ compile(factoryName, requestedTraits, overrides) {
46
+ const chain = this._resolveChain(factoryName);
47
+ const target = chain[chain.length - 1];
48
+ const modelClass = this._resolveModelClass(chain);
49
+ /** @type {Array<{decl: import("./declarations.js").Declaration}>} */
50
+ const flattened = [];
51
+ for (const declaration of this.registry._globalDeclarations) {
52
+ flattened.push({ decl: declaration });
53
+ }
54
+ for (const factoryDefinition of chain) {
55
+ this._expandFactoryDeclarations(factoryDefinition, factoryDefinition, flattened);
56
+ }
57
+ for (const traitName of requestedTraits) {
58
+ this._expandTrait(traitName, target, flattened, []);
59
+ }
60
+ return this._buildPlan({ flattened, overrides, modelClass, target, chainNames: chain.map((definition) => definition.name) });
61
+ }
62
+ /**
63
+ * Resolves the inheritance chain from the root parent down to the target.
64
+ * @param {string} factoryName - Target factory name.
65
+ * @returns {import("./factory-definition.js").default[]} - Chain (root first, target last).
66
+ */
67
+ _resolveChain(factoryName) {
68
+ /** @type {import("./factory-definition.js").default[]} */
69
+ const chain = [];
70
+ /** @type {Set<string>} */
71
+ const seen = new Set();
72
+ /** @type {import("./factory-definition.js").default | null} */
73
+ let current = this._resolveFactory(factoryName);
74
+ while (current) {
75
+ if (seen.has(current.name)) {
76
+ throw new FactoryCycleError(`Factory inheritance cycle detected: ${[...seen, current.name].join(" -> ")}`);
77
+ }
78
+ seen.add(current.name);
79
+ chain.unshift(current);
80
+ current = current.parentName ? this._resolveFactory(current.parentName) : null;
81
+ }
82
+ return chain;
83
+ }
84
+ /**
85
+ * Resolves a factory definition by name (or alias).
86
+ * @param {string} factoryName - Factory name.
87
+ * @returns {import("./factory-definition.js").default} - The definition.
88
+ */
89
+ _resolveFactory(factoryName) {
90
+ const definition = this.registry._factories.get(factoryName);
91
+ if (!definition) {
92
+ throw new UndefinedFactoryError(`No factory registered called "${factoryName}". Registered: ${[...this.registry._factories.keys()].join(", ") || "(none)"}`);
93
+ }
94
+ return definition;
95
+ }
96
+ /**
97
+ * Picks the nearest declared model class in the chain (child overrides parent).
98
+ * @param {import("./factory-definition.js").default[]} chain - Inheritance chain.
99
+ * @returns {(new (attributes?: Record<string, ?>) => ?) | null} - The model class, or null.
100
+ */
101
+ _resolveModelClass(chain) {
102
+ for (let index = chain.length - 1; index >= 0; index--) {
103
+ if (chain[index].modelClass)
104
+ return chain[index].modelClass;
105
+ }
106
+ return null;
107
+ }
108
+ /**
109
+ * Expands one factory's own declarations, inlining base-trait inclusions.
110
+ * @param {import("./factory-definition.js").default} factoryDefinition - Factory whose declarations are expanded.
111
+ * @param {import("./factory-definition.js").default} scope - Target factory (for local-trait resolution).
112
+ * @param {Array<{decl: import("./declarations.js").Declaration}>} out - Flattened output sink.
113
+ * @returns {void}
114
+ */
115
+ _expandFactoryDeclarations(factoryDefinition, scope, out) {
116
+ for (const declaration of factoryDefinition.declarations) {
117
+ if (declaration.kind === "traitInclude") {
118
+ this._expandTrait(declaration.name, scope, out, []);
119
+ }
120
+ else {
121
+ out.push({ decl: declaration });
122
+ }
123
+ }
124
+ }
125
+ /**
126
+ * Expands a trait (resolving factory-local before global) and its inclusions.
127
+ * @param {string} traitName - Trait to expand.
128
+ * @param {import("./factory-definition.js").default} scope - Target factory (for local-trait resolution).
129
+ * @param {Array<{decl: import("./declarations.js").Declaration}>} out - Flattened output sink.
130
+ * @param {string[]} activePath - Trait inclusion path (for cycle detection).
131
+ * @returns {void}
132
+ */
133
+ _expandTrait(traitName, scope, out, activePath) {
134
+ if (activePath.includes(traitName)) {
135
+ throw new FactoryCycleError(`Trait inclusion cycle detected: ${[...activePath, traitName].join(" -> ")}`);
136
+ }
137
+ const localTrait = this._resolveLocalTrait(traitName, scope);
138
+ const trait = localTrait?.trait || this.registry._globalTraits.get(traitName);
139
+ const inclusionScope = localTrait?.scope || scope;
140
+ if (!trait) {
141
+ throw new UndefinedTraitError(`No trait registered called "${traitName}" for factory "${scope.name}"`);
142
+ }
143
+ for (const declaration of trait.declarations) {
144
+ if (declaration.kind === "traitInclude") {
145
+ this._expandTrait(declaration.name, inclusionScope, out, [...activePath, traitName]);
146
+ }
147
+ else {
148
+ out.push({ decl: declaration });
149
+ }
150
+ }
151
+ }
152
+ /**
153
+ * Resolves a local trait from the current factory upward through its parents.
154
+ * @param {string} traitName - Trait name to resolve.
155
+ * @param {import("./factory-definition.js").default} scope - Declaring/requesting factory scope.
156
+ * @returns {{trait: import("./trait-definition.js").default, scope: import("./factory-definition.js").default} | undefined} - Nearest local trait and its declaring scope, if any.
157
+ */
158
+ _resolveLocalTrait(traitName, scope) {
159
+ /** @type {import("./factory-definition.js").default | undefined} */
160
+ let current = scope;
161
+ while (current) {
162
+ const trait = current.localTraits.get(traitName);
163
+ if (trait)
164
+ return { trait, scope: current };
165
+ current = current.parentName ? this._resolveFactory(current.parentName) : undefined;
166
+ }
167
+ return undefined;
168
+ }
169
+ /**
170
+ * Folds flattened declarations plus overrides into a compiled plan.
171
+ * @param {object} args - Options.
172
+ * @param {Array<{decl: import("./declarations.js").Declaration}>} args.flattened - Flattened declarations.
173
+ * @param {Record<string, ?>} args.overrides - Call-site overrides.
174
+ * @param {(new (attributes?: Record<string, ?>) => ?) | null} args.modelClass - Resolved model class.
175
+ * @param {import("./factory-definition.js").default} args.target - Target factory definition.
176
+ * @param {string[]} args.chainNames - Inheritance chain names.
177
+ * @returns {CompiledPlan} - The compiled plan.
178
+ */
179
+ _buildPlan({ flattened, overrides, modelClass, target, chainNames }) {
180
+ /** @type {Map<string, Slot>} */
181
+ const resolved = new Map();
182
+ /** @type {Map<string, import("./declarations.js").CallbackDeclaration[]>} */
183
+ const callbacks = new Map();
184
+ /** @type {Set<import("./declarations.js").CallbackDeclaration>} */
185
+ const seenCallbacks = new Set();
186
+ /** @type {import("./declarations.js").InitializeWithDeclaration["fn"] | null} */
187
+ let initializeWith = null;
188
+ /** @type {import("./declarations.js").ToCreateDeclaration["fn"] | null} */
189
+ let toCreate = null;
190
+ let skipCreate = false;
191
+ for (const { decl } of flattened) {
192
+ if (decl.kind === "attribute") {
193
+ resolved.set(decl.name, { slotKind: decl.isTransient ? "transient" : "attribute", value: decl.value, isOverride: false });
194
+ }
195
+ else if (decl.kind === "association") {
196
+ resolved.set(decl.name, { slotKind: "association", value: decl, isOverride: false });
197
+ }
198
+ else if (decl.kind === "callback") {
199
+ if (!seenCallbacks.has(decl)) {
200
+ seenCallbacks.add(decl);
201
+ const eventCallbacks = callbacks.get(decl.event) || [];
202
+ eventCallbacks.push(decl);
203
+ callbacks.set(decl.event, eventCallbacks);
204
+ }
205
+ }
206
+ else if (decl.kind === "initializeWith") {
207
+ initializeWith = decl.fn;
208
+ }
209
+ else if (decl.kind === "toCreate") {
210
+ toCreate = decl.fn;
211
+ }
212
+ else if (decl.kind === "skipCreate") {
213
+ skipCreate = true;
214
+ }
215
+ }
216
+ for (const key of Object.keys(overrides)) {
217
+ const prior = resolved.get(key);
218
+ resolved.set(key, { slotKind: prior ? prior.slotKind : "attribute", value: overrides[key], isOverride: true });
219
+ }
220
+ this._arbitrateAssociationOverrides(resolved, overrides, modelClass);
221
+ return {
222
+ factoryName: target.name,
223
+ factoryDefinition: target,
224
+ modelClass,
225
+ chainNames,
226
+ resolved,
227
+ callbacks,
228
+ initializeWith,
229
+ toCreate,
230
+ skipCreate
231
+ };
232
+ }
233
+ /**
234
+ * Applies belongs-to override precedence using the declared model relationship's
235
+ * real foreign-key metadata. An explicit association object wins over its key;
236
+ * otherwise an explicit key suppresses the factory-declared association.
237
+ * @param {Map<string, Slot>} resolved - Folded slots.
238
+ * @param {Record<string, ?>} overrides - Call-site overrides.
239
+ * @param {(new (attributes?: Record<string, ?>) => ?) | null} modelClass - Resolved model class.
240
+ * @returns {void}
241
+ */
242
+ _arbitrateAssociationOverrides(resolved, overrides, modelClass) {
243
+ if (typeof modelClass !== "function" || !(modelClass.prototype instanceof DatabaseRecord))
244
+ return;
245
+ const backendModelClass = /** @type {typeof DatabaseRecord} */ (modelClass);
246
+ const columnToAttribute = backendModelClass.getColumnNameToAttributeNameMap();
247
+ for (const [name, slot] of [...resolved]) {
248
+ if (slot.slotKind !== "association")
249
+ continue;
250
+ const relationship = backendModelClass.getRelationshipByName(name);
251
+ if (relationship.getType() !== "belongsTo")
252
+ continue;
253
+ const foreignKeyColumn = relationship.getForeignKey();
254
+ const foreignKeyAttribute = columnToAttribute[foreignKeyColumn] || foreignKeyColumn;
255
+ if (!Object.hasOwn(overrides, foreignKeyAttribute))
256
+ continue;
257
+ if (slot.isOverride) {
258
+ resolved.delete(foreignKeyAttribute);
259
+ }
260
+ else {
261
+ resolved.delete(name);
262
+ }
263
+ }
264
+ }
265
+ }
266
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVzdGluZy9mYWN0b3J5L2ZhY3RvcnktcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMzRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFekY7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYTtJQUNoQzs7O09BR0c7SUFDSCxZQUFZLFFBQVE7UUFDbEIseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0lBQzFCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxTQUFTO1FBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDN0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRWpELHFFQUFxRTtRQUNyRSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFFcEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDNUQsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1FBQ3JDLENBQUM7UUFFRCxLQUFLLE1BQU0saUJBQWlCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLDBCQUEwQixD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LG9DQUFvQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0UsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQywrQkFBK0IsRUFBRSxDQUFBO1FBRTdFLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssYUFBYTtnQkFBRSxTQUFRO1lBRTdDLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFBO1lBRWxFLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxLQUFLLFdBQVc7Z0JBQUUsU0FBUTtZQUVwRCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUNyRCxNQUFNLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLElBQUksZ0JBQWdCLENBQUE7WUFFbkYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDO2dCQUFFLFNBQVE7WUFFNUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtZQUN0QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUN2QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgRGF0YWJhc2VSZWNvcmQgZnJvbSBcIi4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXG5pbXBvcnQge0ZhY3RvcnlDeWNsZUVycm9yLCBVbmRlZmluZWRGYWN0b3J5RXJyb3IsIFVuZGVmaW5lZFRyYWl0RXJyb3J9IGZyb20gXCIuL2Vycm9ycy5qc1wiXG5cbi8qKlxuICogQSByZXNvbHZlZCBhdHRyaWJ1dGUvdHJhbnNpZW50L2Fzc29jaWF0aW9uIHNsb3QgaW4gYSBjb21waWxlZCBwbGFuLlxuICogQHR5cGVkZWYge29iamVjdH0gU2xvdFxuICogQHByb3BlcnR5IHtcImF0dHJpYnV0ZVwiIHwgXCJ0cmFuc2llbnRcIiB8IFwiYXNzb2NpYXRpb25cIn0gc2xvdEtpbmQgLSBTbG90IG5hdHVyZS5cbiAqIEBwcm9wZXJ0eSB7P30gdmFsdWUgLSBMaXRlcmFsL2xhenkgdmFsdWUsIG92ZXJyaWRlIHZhbHVlLCBvciBBc3NvY2lhdGlvbkRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpc092ZXJyaWRlIC0gV2hldGhlciB0aGUgdmFsdWUgY2FtZSBmcm9tIGEgY2FsbC1zaXRlIG92ZXJyaWRlLlxuICovXG5cbi8qKlxuICogVGhlIGltbXV0YWJsZSByZXN1bHQgb2YgY29tcGlsaW5nIGEgZmFjdG9yeSBpbnZvY2F0aW9uLlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tcGlsZWRQbGFuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBUYXJnZXQgZmFjdG9yeSBuYW1lLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0fSBmYWN0b3J5RGVmaW5pdGlvbiAtIFRhcmdldCBkZWZpbml0aW9uLlxuICogQHByb3BlcnR5IHsobmV3IChhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgPz4pID0+ID8pIHwgbnVsbH0gbW9kZWxDbGFzcyAtIFJlc29sdmVkIG1vZGVsIGNsYXNzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY2hhaW5OYW1lcyAtIEluaGVyaXRhbmNlIGNoYWluIG5hbWVzIChjaGlsZCBsYXN0KSBmb3Igc2VxdWVuY2Ugc2NvcGUuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIFNsb3Q+fSByZXNvbHZlZCAtIE5hbWXihpJzbG90IG1hcCAobGFzdCBkZWNsYXJhdGlvbiB3aW5zKS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9kZWNsYXJhdGlvbnMuanNcIikuQ2FsbGJhY2tEZWNsYXJhdGlvbltdPn0gY2FsbGJhY2tzIC0gRGVkdXBlZCBjYWxsYmFja3MgYnkgZXZlbnQuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLkluaXRpYWxpemVXaXRoRGVjbGFyYXRpb25bXCJmblwiXSB8IG51bGx9IGluaXRpYWxpemVXaXRoIC0gQ3VzdG9tIGNvbnN0cnVjdG9yLCBvciBudWxsLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5Ub0NyZWF0ZURlY2xhcmF0aW9uW1wiZm5cIl0gfCBudWxsfSB0b0NyZWF0ZSAtIEN1c3RvbSBwZXJzaXN0ZW5jZSwgb3IgbnVsbC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2tpcENyZWF0ZSAtIFdoZXRoZXIgcGVyc2lzdGVuY2UgaXMgc2tpcHBlZC5cbiAqL1xuXG4vKipcbiAqIENvbXBpbGVzIGZhY3RvcnkgaW52b2NhdGlvbnMgaW50byBpbW11dGFibGUgcGxhbnMgYnkgcmVzb2x2aW5nIHRoZSBpbmhlcml0YW5jZVxuICogY2hhaW4sIGV4cGFuZGluZyBiYXNlIGFuZCByZXF1ZXN0ZWQgdHJhaXRzLCBhbmQgZm9sZGluZyBkZWNsYXJhdGlvbnMgaW50byBhXG4gKiBuYW1l4oaSc2xvdCBtYXAgcGx1cyBhIGRlZHVwZWQsIG9yZGVyZWQgY2FsbGJhY2sgc2V0LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGYWN0b3J5UnVubmVyIHtcbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHJ1bm5lci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gcmVnaXN0cnkgLSBPd25pbmcgcmVnaXN0cnkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWdpc3RyeSkge1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9mYWN0b3J5LXJlZ2lzdHJ5LmpzXCIpLmRlZmF1bHR9IC0gT3duaW5nIHJlZ2lzdHJ5LiAqL1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBpbGVzIGEgZmFjdG9yeSBpbnZvY2F0aW9uIGludG8gYSBwbGFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBGYWN0b3J5IHRvIHJ1bi5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcmVxdWVzdGVkVHJhaXRzIC0gVHJhaXRzIHJlcXVlc3RlZCBhdCB0aGUgY2FsbCBzaXRlLCBpbiBvcmRlci5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gb3ZlcnJpZGVzIC0gQ2FsbC1zaXRlIG92ZXJyaWRlcyAoaGlnaGVzdCBwcmVjZWRlbmNlKS5cbiAgICogQHJldHVybnMge0NvbXBpbGVkUGxhbn0gLSBUaGUgY29tcGlsZWQgcGxhbi5cbiAgICovXG4gIGNvbXBpbGUoZmFjdG9yeU5hbWUsIHJlcXVlc3RlZFRyYWl0cywgb3ZlcnJpZGVzKSB7XG4gICAgY29uc3QgY2hhaW4gPSB0aGlzLl9yZXNvbHZlQ2hhaW4oZmFjdG9yeU5hbWUpXG4gICAgY29uc3QgdGFyZ2V0ID0gY2hhaW5bY2hhaW4ubGVuZ3RoIC0gMV1cbiAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5fcmVzb2x2ZU1vZGVsQ2xhc3MoY2hhaW4pXG5cbiAgICAvKiogQHR5cGUge0FycmF5PHtkZWNsOiBpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5EZWNsYXJhdGlvbn0+fSAqL1xuICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHRoaXMucmVnaXN0cnkuX2dsb2JhbERlY2xhcmF0aW9ucykge1xuICAgICAgZmxhdHRlbmVkLnB1c2goe2RlY2w6IGRlY2xhcmF0aW9ufSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZhY3RvcnlEZWZpbml0aW9uIG9mIGNoYWluKSB7XG4gICAgICB0aGlzLl9leHBhbmRGYWN0b3J5RGVjbGFyYXRpb25zKGZhY3RvcnlEZWZpbml0aW9uLCBmYWN0b3J5RGVmaW5pdGlvbiwgZmxhdHRlbmVkKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgdHJhaXROYW1lIG9mIHJlcXVlc3RlZFRyYWl0cykge1xuICAgICAgdGhpcy5fZXhwYW5kVHJhaXQodHJhaXROYW1lLCB0YXJnZXQsIGZsYXR0ZW5lZCwgW10pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2J1aWxkUGxhbih7ZmxhdHRlbmVkLCBvdmVycmlkZXMsIG1vZGVsQ2xhc3MsIHRhcmdldCwgY2hhaW5OYW1lczogY2hhaW4ubWFwKChkZWZpbml0aW9uKSA9PiBkZWZpbml0aW9uLm5hbWUpfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgaW5oZXJpdGFuY2UgY2hhaW4gZnJvbSB0aGUgcm9vdCBwYXJlbnQgZG93biB0byB0aGUgdGFyZ2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBUYXJnZXQgZmFjdG9yeSBuYW1lLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdFtdfSAtIENoYWluIChyb290IGZpcnN0LCB0YXJnZXQgbGFzdCkuXG4gICAqL1xuICBfcmVzb2x2ZUNoYWluKGZhY3RvcnlOYW1lKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgY29uc3QgY2hhaW4gPSBbXVxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9yZXNvbHZlRmFjdG9yeShmYWN0b3J5TmFtZSlcblxuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY3VycmVudC5uYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRmFjdG9yeUN5Y2xlRXJyb3IoYEZhY3RvcnkgaW5oZXJpdGFuY2UgY3ljbGUgZGV0ZWN0ZWQ6ICR7Wy4uLnNlZW4sIGN1cnJlbnQubmFtZV0uam9pbihcIiAtPiBcIil9YClcbiAgICAgIH1cblxuICAgICAgc2Vlbi5hZGQoY3VycmVudC5uYW1lKVxuICAgICAgY2hhaW4udW5zaGlmdChjdXJyZW50KVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50TmFtZSA/IHRoaXMuX3Jlc29sdmVGYWN0b3J5KGN1cnJlbnQucGFyZW50TmFtZSkgOiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYWluXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBmYWN0b3J5IGRlZmluaXRpb24gYnkgbmFtZSAob3IgYWxpYXMpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBGYWN0b3J5IG5hbWUuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0fSAtIFRoZSBkZWZpbml0aW9uLlxuICAgKi9cbiAgX3Jlc29sdmVGYWN0b3J5KGZhY3RvcnlOYW1lKSB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMucmVnaXN0cnkuX2ZhY3Rvcmllcy5nZXQoZmFjdG9yeU5hbWUpXG5cbiAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBVbmRlZmluZWRGYWN0b3J5RXJyb3IoYE5vIGZhY3RvcnkgcmVnaXN0ZXJlZCBjYWxsZWQgXCIke2ZhY3RvcnlOYW1lfVwiLiBSZWdpc3RlcmVkOiAke1suLi50aGlzLnJlZ2lzdHJ5Ll9mYWN0b3JpZXMua2V5cygpXS5qb2luKFwiLCBcIikgfHwgXCIobm9uZSlcIn1gKVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbml0aW9uXG4gIH1cblxuICAvKipcbiAgICogUGlja3MgdGhlIG5lYXJlc3QgZGVjbGFyZWQgbW9kZWwgY2xhc3MgaW4gdGhlIGNoYWluIChjaGlsZCBvdmVycmlkZXMgcGFyZW50KS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0W119IGNoYWluIC0gSW5oZXJpdGFuY2UgY2hhaW4uXG4gICAqIEByZXR1cm5zIHsobmV3IChhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgPz4pID0+ID8pIHwgbnVsbH0gLSBUaGUgbW9kZWwgY2xhc3MsIG9yIG51bGwuXG4gICAqL1xuICBfcmVzb2x2ZU1vZGVsQ2xhc3MoY2hhaW4pIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IGNoYWluLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbiAgICAgIGlmIChjaGFpbltpbmRleF0ubW9kZWxDbGFzcykgcmV0dXJuIGNoYWluW2luZGV4XS5tb2RlbENsYXNzXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmRzIG9uZSBmYWN0b3J5J3Mgb3duIGRlY2xhcmF0aW9ucywgaW5saW5pbmcgYmFzZS10cmFpdCBpbmNsdXNpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHR9IGZhY3RvcnlEZWZpbml0aW9uIC0gRmFjdG9yeSB3aG9zZSBkZWNsYXJhdGlvbnMgYXJlIGV4cGFuZGVkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHR9IHNjb3BlIC0gVGFyZ2V0IGZhY3RvcnkgKGZvciBsb2NhbC10cmFpdCByZXNvbHV0aW9uKS5cbiAgICogQHBhcmFtIHtBcnJheTx7ZGVjbDogaW1wb3J0KFwiLi9kZWNsYXJhdGlvbnMuanNcIikuRGVjbGFyYXRpb259Pn0gb3V0IC0gRmxhdHRlbmVkIG91dHB1dCBzaW5rLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9leHBhbmRGYWN0b3J5RGVjbGFyYXRpb25zKGZhY3RvcnlEZWZpbml0aW9uLCBzY29wZSwgb3V0KSB7XG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBmYWN0b3J5RGVmaW5pdGlvbi5kZWNsYXJhdGlvbnMpIHtcbiAgICAgIGlmIChkZWNsYXJhdGlvbi5raW5kID09PSBcInRyYWl0SW5jbHVkZVwiKSB7XG4gICAgICAgIHRoaXMuX2V4cGFuZFRyYWl0KGRlY2xhcmF0aW9uLm5hbWUsIHNjb3BlLCBvdXQsIFtdKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0LnB1c2goe2RlY2w6IGRlY2xhcmF0aW9ufSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kcyBhIHRyYWl0IChyZXNvbHZpbmcgZmFjdG9yeS1sb2NhbCBiZWZvcmUgZ2xvYmFsKSBhbmQgaXRzIGluY2x1c2lvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFpdE5hbWUgLSBUcmFpdCB0byBleHBhbmQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gc2NvcGUgLSBUYXJnZXQgZmFjdG9yeSAoZm9yIGxvY2FsLXRyYWl0IHJlc29sdXRpb24pLlxuICAgKiBAcGFyYW0ge0FycmF5PHtkZWNsOiBpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5EZWNsYXJhdGlvbn0+fSBvdXQgLSBGbGF0dGVuZWQgb3V0cHV0IHNpbmsuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFjdGl2ZVBhdGggLSBUcmFpdCBpbmNsdXNpb24gcGF0aCAoZm9yIGN5Y2xlIGRldGVjdGlvbikuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2V4cGFuZFRyYWl0KHRyYWl0TmFtZSwgc2NvcGUsIG91dCwgYWN0aXZlUGF0aCkge1xuICAgIGlmIChhY3RpdmVQYXRoLmluY2x1ZGVzKHRyYWl0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBGYWN0b3J5Q3ljbGVFcnJvcihgVHJhaXQgaW5jbHVzaW9uIGN5Y2xlIGRldGVjdGVkOiAke1suLi5hY3RpdmVQYXRoLCB0cmFpdE5hbWVdLmpvaW4oXCIgLT4gXCIpfWApXG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxUcmFpdCA9IHRoaXMuX3Jlc29sdmVMb2NhbFRyYWl0KHRyYWl0TmFtZSwgc2NvcGUpXG4gICAgY29uc3QgdHJhaXQgPSBsb2NhbFRyYWl0Py50cmFpdCB8fCB0aGlzLnJlZ2lzdHJ5Ll9nbG9iYWxUcmFpdHMuZ2V0KHRyYWl0TmFtZSlcbiAgICBjb25zdCBpbmNsdXNpb25TY29wZSA9IGxvY2FsVHJhaXQ/LnNjb3BlIHx8IHNjb3BlXG5cbiAgICBpZiAoIXRyYWl0KSB7XG4gICAgICB0aHJvdyBuZXcgVW5kZWZpbmVkVHJhaXRFcnJvcihgTm8gdHJhaXQgcmVnaXN0ZXJlZCBjYWxsZWQgXCIke3RyYWl0TmFtZX1cIiBmb3IgZmFjdG9yeSBcIiR7c2NvcGUubmFtZX1cImApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiB0cmFpdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgIGlmIChkZWNsYXJhdGlvbi5raW5kID09PSBcInRyYWl0SW5jbHVkZVwiKSB7XG4gICAgICAgIHRoaXMuX2V4cGFuZFRyYWl0KGRlY2xhcmF0aW9uLm5hbWUsIGluY2x1c2lvblNjb3BlLCBvdXQsIFsuLi5hY3RpdmVQYXRoLCB0cmFpdE5hbWVdKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0LnB1c2goe2RlY2w6IGRlY2xhcmF0aW9ufSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBsb2NhbCB0cmFpdCBmcm9tIHRoZSBjdXJyZW50IGZhY3RvcnkgdXB3YXJkIHRocm91Z2ggaXRzIHBhcmVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFpdE5hbWUgLSBUcmFpdCBuYW1lIHRvIHJlc29sdmUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gc2NvcGUgLSBEZWNsYXJpbmcvcmVxdWVzdGluZyBmYWN0b3J5IHNjb3BlLlxuICAgKiBAcmV0dXJucyB7e3RyYWl0OiBpbXBvcnQoXCIuL3RyYWl0LWRlZmluaXRpb24uanNcIikuZGVmYXVsdCwgc2NvcGU6IGltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHR9IHwgdW5kZWZpbmVkfSAtIE5lYXJlc3QgbG9jYWwgdHJhaXQgYW5kIGl0cyBkZWNsYXJpbmcgc2NvcGUsIGlmIGFueS5cbiAgICovXG4gIF9yZXNvbHZlTG9jYWxUcmFpdCh0cmFpdE5hbWUsIHNjb3BlKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBjdXJyZW50ID0gc2NvcGVcblxuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBjb25zdCB0cmFpdCA9IGN1cnJlbnQubG9jYWxUcmFpdHMuZ2V0KHRyYWl0TmFtZSlcblxuICAgICAgaWYgKHRyYWl0KSByZXR1cm4ge3RyYWl0LCBzY29wZTogY3VycmVudH1cblxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50TmFtZSA/IHRoaXMuX3Jlc29sdmVGYWN0b3J5KGN1cnJlbnQucGFyZW50TmFtZSkgOiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogRm9sZHMgZmxhdHRlbmVkIGRlY2xhcmF0aW9ucyBwbHVzIG92ZXJyaWRlcyBpbnRvIGEgY29tcGlsZWQgcGxhbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge0FycmF5PHtkZWNsOiBpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5EZWNsYXJhdGlvbn0+fSBhcmdzLmZsYXR0ZW5lZCAtIEZsYXR0ZW5lZCBkZWNsYXJhdGlvbnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IGFyZ3Mub3ZlcnJpZGVzIC0gQ2FsbC1zaXRlIG92ZXJyaWRlcy5cbiAgICogQHBhcmFtIHsobmV3IChhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgPz4pID0+ID8pIHwgbnVsbH0gYXJncy5tb2RlbENsYXNzIC0gUmVzb2x2ZWQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gYXJncy50YXJnZXQgLSBUYXJnZXQgZmFjdG9yeSBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLmNoYWluTmFtZXMgLSBJbmhlcml0YW5jZSBjaGFpbiBuYW1lcy5cbiAgICogQHJldHVybnMge0NvbXBpbGVkUGxhbn0gLSBUaGUgY29tcGlsZWQgcGxhbi5cbiAgICovXG4gIF9idWlsZFBsYW4oe2ZsYXR0ZW5lZCwgb3ZlcnJpZGVzLCBtb2RlbENsYXNzLCB0YXJnZXQsIGNoYWluTmFtZXN9KSB7XG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBTbG90Pn0gKi9cbiAgICBjb25zdCByZXNvbHZlZCA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9kZWNsYXJhdGlvbnMuanNcIikuQ2FsbGJhY2tEZWNsYXJhdGlvbltdPn0gKi9cbiAgICBjb25zdCBjYWxsYmFja3MgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge1NldDxpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5DYWxsYmFja0RlY2xhcmF0aW9uPn0gKi9cbiAgICBjb25zdCBzZWVuQ2FsbGJhY2tzID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5Jbml0aWFsaXplV2l0aERlY2xhcmF0aW9uW1wiZm5cIl0gfCBudWxsfSAqL1xuICAgIGxldCBpbml0aWFsaXplV2l0aCA9IG51bGxcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLlRvQ3JlYXRlRGVjbGFyYXRpb25bXCJmblwiXSB8IG51bGx9ICovXG4gICAgbGV0IHRvQ3JlYXRlID0gbnVsbFxuICAgIGxldCBza2lwQ3JlYXRlID0gZmFsc2VcblxuICAgIGZvciAoY29uc3Qge2RlY2x9IG9mIGZsYXR0ZW5lZCkge1xuICAgICAgaWYgKGRlY2wua2luZCA9PT0gXCJhdHRyaWJ1dGVcIikge1xuICAgICAgICByZXNvbHZlZC5zZXQoZGVjbC5uYW1lLCB7c2xvdEtpbmQ6IGRlY2wuaXNUcmFuc2llbnQgPyBcInRyYW5zaWVudFwiIDogXCJhdHRyaWJ1dGVcIiwgdmFsdWU6IGRlY2wudmFsdWUsIGlzT3ZlcnJpZGU6IGZhbHNlfSlcbiAgICAgIH0gZWxzZSBpZiAoZGVjbC5raW5kID09PSBcImFzc29jaWF0aW9uXCIpIHtcbiAgICAgICAgcmVzb2x2ZWQuc2V0KGRlY2wubmFtZSwge3Nsb3RLaW5kOiBcImFzc29jaWF0aW9uXCIsIHZhbHVlOiBkZWNsLCBpc092ZXJyaWRlOiBmYWxzZX0pXG4gICAgICB9IGVsc2UgaWYgKGRlY2wua2luZCA9PT0gXCJjYWxsYmFja1wiKSB7XG4gICAgICAgIGlmICghc2VlbkNhbGxiYWNrcy5oYXMoZGVjbCkpIHtcbiAgICAgICAgICBzZWVuQ2FsbGJhY2tzLmFkZChkZWNsKVxuXG4gICAgICAgICAgY29uc3QgZXZlbnRDYWxsYmFja3MgPSBjYWxsYmFja3MuZ2V0KGRlY2wuZXZlbnQpIHx8IFtdXG5cbiAgICAgICAgICBldmVudENhbGxiYWNrcy5wdXNoKGRlY2wpXG4gICAgICAgICAgY2FsbGJhY2tzLnNldChkZWNsLmV2ZW50LCBldmVudENhbGxiYWNrcylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkZWNsLmtpbmQgPT09IFwiaW5pdGlhbGl6ZVdpdGhcIikge1xuICAgICAgICBpbml0aWFsaXplV2l0aCA9IGRlY2wuZm5cbiAgICAgIH0gZWxzZSBpZiAoZGVjbC5raW5kID09PSBcInRvQ3JlYXRlXCIpIHtcbiAgICAgICAgdG9DcmVhdGUgPSBkZWNsLmZuXG4gICAgICB9IGVsc2UgaWYgKGRlY2wua2luZCA9PT0gXCJza2lwQ3JlYXRlXCIpIHtcbiAgICAgICAgc2tpcENyZWF0ZSA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvdmVycmlkZXMpKSB7XG4gICAgICBjb25zdCBwcmlvciA9IHJlc29sdmVkLmdldChrZXkpXG5cbiAgICAgIHJlc29sdmVkLnNldChrZXksIHtzbG90S2luZDogcHJpb3IgPyBwcmlvci5zbG90S2luZCA6IFwiYXR0cmlidXRlXCIsIHZhbHVlOiBvdmVycmlkZXNba2V5XSwgaXNPdmVycmlkZTogdHJ1ZX0pXG4gICAgfVxuXG4gICAgdGhpcy5fYXJiaXRyYXRlQXNzb2NpYXRpb25PdmVycmlkZXMocmVzb2x2ZWQsIG92ZXJyaWRlcywgbW9kZWxDbGFzcylcblxuICAgIHJldHVybiB7XG4gICAgICBmYWN0b3J5TmFtZTogdGFyZ2V0Lm5hbWUsXG4gICAgICBmYWN0b3J5RGVmaW5pdGlvbjogdGFyZ2V0LFxuICAgICAgbW9kZWxDbGFzcyxcbiAgICAgIGNoYWluTmFtZXMsXG4gICAgICByZXNvbHZlZCxcbiAgICAgIGNhbGxiYWNrcyxcbiAgICAgIGluaXRpYWxpemVXaXRoLFxuICAgICAgdG9DcmVhdGUsXG4gICAgICBza2lwQ3JlYXRlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYmVsb25ncy10byBvdmVycmlkZSBwcmVjZWRlbmNlIHVzaW5nIHRoZSBkZWNsYXJlZCBtb2RlbCByZWxhdGlvbnNoaXAnc1xuICAgKiByZWFsIGZvcmVpZ24ta2V5IG1ldGFkYXRhLiBBbiBleHBsaWNpdCBhc3NvY2lhdGlvbiBvYmplY3Qgd2lucyBvdmVyIGl0cyBrZXk7XG4gICAqIG90aGVyd2lzZSBhbiBleHBsaWNpdCBrZXkgc3VwcHJlc3NlcyB0aGUgZmFjdG9yeS1kZWNsYXJlZCBhc3NvY2lhdGlvbi5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTbG90Pn0gcmVzb2x2ZWQgLSBGb2xkZWQgc2xvdHMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG92ZXJyaWRlcyAtIENhbGwtc2l0ZSBvdmVycmlkZXMuXG4gICAqIEBwYXJhbSB7KG5ldyAoYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsID8+KSA9PiA/KSB8IG51bGx9IG1vZGVsQ2xhc3MgLSBSZXNvbHZlZCBtb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfYXJiaXRyYXRlQXNzb2NpYXRpb25PdmVycmlkZXMocmVzb2x2ZWQsIG92ZXJyaWRlcywgbW9kZWxDbGFzcykge1xuICAgIGlmICh0eXBlb2YgbW9kZWxDbGFzcyAhPT0gXCJmdW5jdGlvblwiIHx8ICEobW9kZWxDbGFzcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBEYXRhYmFzZVJlY29yZCkpIHJldHVyblxuXG4gICAgY29uc3QgYmFja2VuZE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBEYXRhYmFzZVJlY29yZH0gKi8gKG1vZGVsQ2xhc3MpXG4gICAgY29uc3QgY29sdW1uVG9BdHRyaWJ1dGUgPSBiYWNrZW5kTW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwKClcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHNsb3RdIG9mIFsuLi5yZXNvbHZlZF0pIHtcbiAgICAgIGlmIChzbG90LnNsb3RLaW5kICE9PSBcImFzc29jaWF0aW9uXCIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IGJhY2tlbmRNb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShuYW1lKVxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwLmdldFR5cGUoKSAhPT0gXCJiZWxvbmdzVG9cIikgY29udGludWVcblxuICAgICAgY29uc3QgZm9yZWlnbktleUNvbHVtbiA9IHJlbGF0aW9uc2hpcC5nZXRGb3JlaWduS2V5KClcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlBdHRyaWJ1dGUgPSBjb2x1bW5Ub0F0dHJpYnV0ZVtmb3JlaWduS2V5Q29sdW1uXSB8fCBmb3JlaWduS2V5Q29sdW1uXG5cbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihvdmVycmlkZXMsIGZvcmVpZ25LZXlBdHRyaWJ1dGUpKSBjb250aW51ZVxuXG4gICAgICBpZiAoc2xvdC5pc092ZXJyaWRlKSB7XG4gICAgICAgIHJlc29sdmVkLmRlbGV0ZShmb3JlaWduS2V5QXR0cmlidXRlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZWQuZGVsZXRlKG5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Creates a fresh, isolated factory registry independent of the default singleton
3
+ * (for libraries or spec groups that must not share global factory state).
4
+ * @returns {FactoryRegistry} - A new registry.
5
+ */
6
+ export function createFactoryRegistry(): FactoryRegistry;
7
+ export default Factory;
8
+ import FactoryRegistry from "./factory-registry.js";
9
+ /**
10
+ * The default, convenient factory registry singleton. Import it as `Factory` and
11
+ * call `Factory.define(...)`, `Factory.build(...)`, `Factory.create(...)`,
12
+ * `Factory.attributesFor(...)` and the list/pair helpers. This module is
13
+ * browser/Metro-safe: it contains no Node built-ins, filesystem discovery, or
14
+ * raw `import.meta`. Node-only definition loading lives in `./node/load-definitions.js`.
15
+ * @type {FactoryRegistry}
16
+ */
17
+ declare const Factory: FactoryRegistry;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/factory/index.js"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,yCAFa,eAAe,CAI3B;;4BAnB2B,uBAAuB;AAEnD;;;;;;;GAOG;AACH,uBAFU,eAAe,CAEY"}
@@ -0,0 +1,21 @@
1
+ // @ts-check
2
+ import FactoryRegistry from "./factory-registry.js";
3
+ /**
4
+ * The default, convenient factory registry singleton. Import it as `Factory` and
5
+ * call `Factory.define(...)`, `Factory.build(...)`, `Factory.create(...)`,
6
+ * `Factory.attributesFor(...)` and the list/pair helpers. This module is
7
+ * browser/Metro-safe: it contains no Node built-ins, filesystem discovery, or
8
+ * raw `import.meta`. Node-only definition loading lives in `./node/load-definitions.js`.
9
+ * @type {FactoryRegistry}
10
+ */
11
+ const Factory = new FactoryRegistry();
12
+ /**
13
+ * Creates a fresh, isolated factory registry independent of the default singleton
14
+ * (for libraries or spec groups that must not share global factory state).
15
+ * @returns {FactoryRegistry} - A new registry.
16
+ */
17
+ export function createFactoryRegistry() {
18
+ return new FactoryRegistry();
19
+ }
20
+ export default Factory;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVzdGluZy9mYWN0b3J5L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVuRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQTtBQUVyQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxPQUFPLElBQUksZUFBZSxFQUFFLENBQUE7QUFDOUIsQ0FBQztBQUVELGVBQWUsT0FBTyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBGYWN0b3J5UmVnaXN0cnkgZnJvbSBcIi4vZmFjdG9yeS1yZWdpc3RyeS5qc1wiXG5cbi8qKlxuICogVGhlIGRlZmF1bHQsIGNvbnZlbmllbnQgZmFjdG9yeSByZWdpc3RyeSBzaW5nbGV0b24uIEltcG9ydCBpdCBhcyBgRmFjdG9yeWAgYW5kXG4gKiBjYWxsIGBGYWN0b3J5LmRlZmluZSguLi4pYCwgYEZhY3RvcnkuYnVpbGQoLi4uKWAsIGBGYWN0b3J5LmNyZWF0ZSguLi4pYCxcbiAqIGBGYWN0b3J5LmF0dHJpYnV0ZXNGb3IoLi4uKWAgYW5kIHRoZSBsaXN0L3BhaXIgaGVscGVycy4gVGhpcyBtb2R1bGUgaXNcbiAqIGJyb3dzZXIvTWV0cm8tc2FmZTogaXQgY29udGFpbnMgbm8gTm9kZSBidWlsdC1pbnMsIGZpbGVzeXN0ZW0gZGlzY292ZXJ5LCBvclxuICogcmF3IGBpbXBvcnQubWV0YWAuIE5vZGUtb25seSBkZWZpbml0aW9uIGxvYWRpbmcgbGl2ZXMgaW4gYC4vbm9kZS9sb2FkLWRlZmluaXRpb25zLmpzYC5cbiAqIEB0eXBlIHtGYWN0b3J5UmVnaXN0cnl9XG4gKi9cbmNvbnN0IEZhY3RvcnkgPSBuZXcgRmFjdG9yeVJlZ2lzdHJ5KClcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnJlc2gsIGlzb2xhdGVkIGZhY3RvcnkgcmVnaXN0cnkgaW5kZXBlbmRlbnQgb2YgdGhlIGRlZmF1bHQgc2luZ2xldG9uXG4gKiAoZm9yIGxpYnJhcmllcyBvciBzcGVjIGdyb3VwcyB0aGF0IG11c3Qgbm90IHNoYXJlIGdsb2JhbCBmYWN0b3J5IHN0YXRlKS5cbiAqIEByZXR1cm5zIHtGYWN0b3J5UmVnaXN0cnl9IC0gQSBuZXcgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGYWN0b3J5UmVnaXN0cnkoKSB7XG4gIHJldHVybiBuZXcgRmFjdG9yeVJlZ2lzdHJ5KClcbn1cblxuZXhwb3J0IGRlZmF1bHQgRmFjdG9yeVxuIl19
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Executes registered factories (and optionally their traits) to prove they build
3
+ * and persist, aggregating every failure by case. For the create strategy each
4
+ * case runs inside the model's ambient transaction and is rolled back, so no rows
5
+ * remain in the supported single-connection case. External callback side effects
6
+ * are not reversible and cross-database writes are not globally atomic.
7
+ */
8
+ export default class FactoryLinter {
9
+ /**
10
+ * Builds a linter.
11
+ * @param {import("./factory-registry.js").default} registry - Registry to lint.
12
+ */
13
+ constructor(registry: import("./factory-registry.js").default);
14
+ /** @type {import("./factory-registry.js").default} - Registry to lint. */
15
+ registry: import("./factory-registry.js").default;
16
+ /**
17
+ * Lints selected factories and reports every failure together.
18
+ * @param {object} [options] - Options.
19
+ * @param {string[]} [options.factories] - Factory names to lint. Defaults to all.
20
+ * @param {boolean} [options.traits] - Whether to also lint each factory's local traits.
21
+ * @param {"attributesFor" | "build" | "create"} [options.strategy] - Strategy to lint with. Defaults to create.
22
+ * @returns {Promise<void>} - Resolves when every case passed; rejects with an aggregate otherwise.
23
+ */
24
+ lint({ factories, traits, strategy }?: {
25
+ factories?: string[] | undefined;
26
+ traits?: boolean | undefined;
27
+ strategy?: "create" | "build" | "attributesFor" | undefined;
28
+ }): Promise<void>;
29
+ /**
30
+ * Resolves the unique set of factory definitions to lint.
31
+ * @param {string[] | undefined} factories - Explicit names, or undefined for all.
32
+ * @returns {import("./factory-definition.js").default[]} - Unique definitions.
33
+ */
34
+ _selectDefinitions(factories: string[] | undefined): import("./factory-definition.js").default[];
35
+ /**
36
+ * Lints one factory/trait case, rolling back create-strategy persistence.
37
+ * @param {import("./factory-definition.js").default} definition - Factory definition.
38
+ * @param {string[]} traits - Traits to apply for this case.
39
+ * @param {"attributesFor" | "build" | "create"} strategy - Strategy to run.
40
+ * @param {Array<{label: string, error: ?}>} failures - Failure sink.
41
+ * @returns {Promise<void>} - Resolves when the case has been evaluated.
42
+ */
43
+ _lintCase(definition: import("./factory-definition.js").default, traits: string[], strategy: "attributesFor" | "build" | "create", failures: Array<{
44
+ label: string;
45
+ error: unknown;
46
+ }>): Promise<void>;
47
+ /**
48
+ * Runs a create-strategy case inside a transaction and forces a rollback.
49
+ * @param {import("./factory-definition.js").default} definition - Factory definition.
50
+ * @param {string[]} traits - Traits to apply.
51
+ * @returns {Promise<void>} - Resolves (or rejects) once the rollback completes.
52
+ */
53
+ _lintCreateCase(definition: import("./factory-definition.js").default, traits: string[]): Promise<void>;
54
+ }
55
+ //# sourceMappingURL=linter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../../../../src/testing/factory/linter.js"],"names":[],"mappings":"AAYA;;;;;;GAMG;AACH;IACE;;;OAGG;IACH,sBAFW,OAAO,uBAAuB,EAAE,OAAO,EAKjD;IAFC,0EAA0E;IAC1E,UADW,OAAO,uBAAuB,EAAE,OAAO,CAC1B;IAG1B;;;;;;;OAOG;IACH,uCALG;QAA2B,SAAS;QACV,MAAM;QACuB,QAAQ;KAC/D,GAAU,OAAO,CAAC,IAAI,CAAC,CAsBzB;IAED;;;;OAIG;IACH,8BAHW,MAAM,EAAE,GAAG,SAAS,GAClB,OAAO,yBAAyB,EAAE,OAAO,EAAE,CAQvD;IAED;;;;;;;OAOG;IACH,sBANW,OAAO,yBAAyB,EAAE,OAAO,UACzC,MAAM,EAAE,YACR,eAAe,GAAG,OAAO,GAAG,QAAQ,YACpC,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAC,CAAA;KAAC,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;;;OAKG;IACH,4BAJW,OAAO,yBAAyB,EAAE,OAAO,UACzC,MAAM,EAAE,GACN,OAAO,CAAC,IAAI,CAAC,CAiBzB;CACF"}