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.
- package/README.md +2 -0
- package/build/background-jobs/status-reporter.js +15 -2
- package/build/background-jobs/worker.js +5 -1
- package/build/frontend-models/base.js +105 -47
- package/build/frontend-models/transport-deadline.js +66 -0
- package/build/src/background-jobs/status-reporter.d.ts +3 -1
- package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
- package/build/src/background-jobs/status-reporter.js +16 -3
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +6 -2
- package/build/src/frontend-models/base.d.ts +10 -1
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +71 -26
- package/build/src/frontend-models/transport-deadline.d.ts +26 -0
- package/build/src/frontend-models/transport-deadline.d.ts.map +1 -0
- package/build/src/frontend-models/transport-deadline.js +61 -0
- package/build/src/testing/factory/association-declaration.d.ts +37 -0
- package/build/src/testing/factory/association-declaration.d.ts.map +1 -0
- package/build/src/testing/factory/association-declaration.js +41 -0
- package/build/src/testing/factory/declarations.d.ts +190 -0
- package/build/src/testing/factory/declarations.d.ts.map +1 -0
- package/build/src/testing/factory/declarations.js +98 -0
- package/build/src/testing/factory/definition-builder.d.ts +132 -0
- package/build/src/testing/factory/definition-builder.d.ts.map +1 -0
- package/build/src/testing/factory/definition-builder.js +417 -0
- package/build/src/testing/factory/errors.d.ts +62 -0
- package/build/src/testing/factory/errors.d.ts.map +1 -0
- package/build/src/testing/factory/errors.js +67 -0
- package/build/src/testing/factory/evaluation-context.d.ts +95 -0
- package/build/src/testing/factory/evaluation-context.d.ts.map +1 -0
- package/build/src/testing/factory/evaluation-context.js +175 -0
- package/build/src/testing/factory/events.d.ts +21 -0
- package/build/src/testing/factory/events.d.ts.map +1 -0
- package/build/src/testing/factory/events.js +26 -0
- package/build/src/testing/factory/factory-definition.d.ts +39 -0
- package/build/src/testing/factory/factory-definition.d.ts.map +1 -0
- package/build/src/testing/factory/factory-definition.js +35 -0
- package/build/src/testing/factory/factory-registry.d.ts +263 -0
- package/build/src/testing/factory/factory-registry.d.ts.map +1 -0
- package/build/src/testing/factory/factory-registry.js +438 -0
- package/build/src/testing/factory/factory-runner.d.ts +179 -0
- package/build/src/testing/factory/factory-runner.d.ts.map +1 -0
- package/build/src/testing/factory/factory-runner.js +266 -0
- package/build/src/testing/factory/index.d.ts +18 -0
- package/build/src/testing/factory/index.d.ts.map +1 -0
- package/build/src/testing/factory/index.js +21 -0
- package/build/src/testing/factory/linter.d.ts +55 -0
- package/build/src/testing/factory/linter.d.ts.map +1 -0
- package/build/src/testing/factory/linter.js +106 -0
- package/build/src/testing/factory/model-contract.d.ts +11 -0
- package/build/src/testing/factory/model-contract.d.ts.map +1 -0
- package/build/src/testing/factory/model-contract.js +26 -0
- package/build/src/testing/factory/node/load-definitions.d.ts +24 -0
- package/build/src/testing/factory/node/load-definitions.d.ts.map +1 -0
- package/build/src/testing/factory/node/load-definitions.js +87 -0
- package/build/src/testing/factory/sequence.d.ts +73 -0
- package/build/src/testing/factory/sequence.d.ts.map +1 -0
- package/build/src/testing/factory/sequence.js +78 -0
- package/build/src/testing/factory/strategies/attributes-for.d.ts +21 -0
- package/build/src/testing/factory/strategies/attributes-for.d.ts.map +1 -0
- package/build/src/testing/factory/strategies/attributes-for.js +22 -0
- package/build/src/testing/factory/strategies/base.d.ts +101 -0
- package/build/src/testing/factory/strategies/base.d.ts.map +1 -0
- package/build/src/testing/factory/strategies/base.js +191 -0
- package/build/src/testing/factory/strategies/build.d.ts +20 -0
- package/build/src/testing/factory/strategies/build.d.ts.map +1 -0
- package/build/src/testing/factory/strategies/build.js +34 -0
- package/build/src/testing/factory/strategies/create.d.ts +32 -0
- package/build/src/testing/factory/strategies/create.d.ts.map +1 -0
- package/build/src/testing/factory/strategies/create.js +57 -0
- package/build/src/testing/factory/trait-definition.d.ts +22 -0
- package/build/src/testing/factory/trait-definition.d.ts.map +1 -0
- package/build/src/testing/factory/trait-definition.js +22 -0
- package/build/testing/factory/association-declaration.js +50 -0
- package/build/testing/factory/declarations.js +110 -0
- package/build/testing/factory/definition-builder.js +476 -0
- package/build/testing/factory/errors.js +79 -0
- package/build/testing/factory/evaluation-context.js +199 -0
- package/build/testing/factory/events.js +30 -0
- package/build/testing/factory/factory-definition.js +41 -0
- package/build/testing/factory/factory-registry.js +501 -0
- package/build/testing/factory/factory-runner.js +296 -0
- package/build/testing/factory/index.js +24 -0
- package/build/testing/factory/linter.js +119 -0
- package/build/testing/factory/model-contract.js +31 -0
- package/build/testing/factory/node/load-definitions.js +103 -0
- package/build/testing/factory/sequence.js +91 -0
- package/build/testing/factory/strategies/attributes-for.js +24 -0
- package/build/testing/factory/strategies/base.js +209 -0
- package/build/testing/factory/strategies/build.js +42 -0
- package/build/testing/factory/strategies/create.js +68 -0
- package/build/testing/factory/trait-definition.js +24 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/background-jobs/status-reporter.js +15 -2
- package/src/background-jobs/worker.js +5 -1
- package/src/frontend-models/base.js +105 -47
- package/src/frontend-models/transport-deadline.js +66 -0
- package/src/testing/factory/association-declaration.js +50 -0
- package/src/testing/factory/declarations.js +110 -0
- package/src/testing/factory/definition-builder.js +476 -0
- package/src/testing/factory/errors.js +79 -0
- package/src/testing/factory/evaluation-context.js +199 -0
- package/src/testing/factory/events.js +30 -0
- package/src/testing/factory/factory-definition.js +41 -0
- package/src/testing/factory/factory-registry.js +501 -0
- package/src/testing/factory/factory-runner.js +296 -0
- package/src/testing/factory/index.js +24 -0
- package/src/testing/factory/linter.js +119 -0
- package/src/testing/factory/model-contract.js +31 -0
- package/src/testing/factory/node/load-definitions.js +103 -0
- package/src/testing/factory/sequence.js +91 -0
- package/src/testing/factory/strategies/attributes-for.js +24 -0
- package/src/testing/factory/strategies/base.js +209 -0
- package/src/testing/factory/strategies/build.js +42 -0
- package/src/testing/factory/strategies/create.js +68 -0
- package/src/testing/factory/trait-definition.js +24 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { isPlainObject } from "is-plain-object";
|
|
3
|
+
import DatabaseRecord from "../../database/record/index.js";
|
|
4
|
+
import { attributeDeclaration, callbackDeclaration, initializeWithDeclaration, skipCreateDeclaration, toCreateDeclaration, traitIncludeDeclaration } from "./declarations.js";
|
|
5
|
+
import AssociationDeclaration from "./association-declaration.js";
|
|
6
|
+
import FactoryDefinition from "./factory-definition.js";
|
|
7
|
+
import Sequence from "./sequence.js";
|
|
8
|
+
import TraitDefinition from "./trait-definition.js";
|
|
9
|
+
import { InvalidDefinitionError } from "./errors.js";
|
|
10
|
+
/** Callback phases accepted by `before`/`after` mapped to their event suffix. */
|
|
11
|
+
const CALLBACK_PHASES = { all: "All", build: "Build", create: "Create" };
|
|
12
|
+
/**
|
|
13
|
+
* Resolves a `before`/`after` phase into the concrete event name.
|
|
14
|
+
* @param {"before" | "after"} prefix - Callback prefix.
|
|
15
|
+
* @param {string} phase - Declared phase (all/build/create).
|
|
16
|
+
* @returns {string} - Concrete event name (e.g. "afterCreate").
|
|
17
|
+
*/
|
|
18
|
+
function eventNameFor(prefix, phase) {
|
|
19
|
+
const suffix = /** @type {Record<string, string>} */ (CALLBACK_PHASES)[phase];
|
|
20
|
+
if (!suffix) {
|
|
21
|
+
throw new InvalidDefinitionError(`Unknown callback phase "${String(phase)}". Use one of: ${Object.keys(CALLBACK_PHASES).join(", ")}`);
|
|
22
|
+
}
|
|
23
|
+
return `${prefix}${suffix}`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validates a declared name is a non-empty string.
|
|
27
|
+
* @param {string} name - Name to validate.
|
|
28
|
+
* @param {string} what - What is being named (for the message).
|
|
29
|
+
* @returns {void}
|
|
30
|
+
*/
|
|
31
|
+
function assertName(name, what) {
|
|
32
|
+
if (!name || typeof name !== "string") {
|
|
33
|
+
throw new InvalidDefinitionError(`${what} name must be a non-empty string, got: ${String(name)}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Builds an association declaration from the loose `association(name, ...)` args:
|
|
38
|
+
* leading strings are traits and a trailing plain object supplies factory/strategy
|
|
39
|
+
* plus overrides.
|
|
40
|
+
* @param {string} name - Relationship name.
|
|
41
|
+
* @param {Array<?>} args - Remaining arguments.
|
|
42
|
+
* @returns {AssociationDeclaration} - The declaration.
|
|
43
|
+
*/
|
|
44
|
+
function buildAssociationDeclaration(name, args) {
|
|
45
|
+
/** @type {string[]} */
|
|
46
|
+
const traits = [];
|
|
47
|
+
/** @type {Record<string, ?>} */
|
|
48
|
+
let options = {};
|
|
49
|
+
for (const arg of args) {
|
|
50
|
+
if (typeof arg === "string") {
|
|
51
|
+
traits.push(arg);
|
|
52
|
+
}
|
|
53
|
+
else if (isPlainObject(arg)) {
|
|
54
|
+
options = arg;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
throw new InvalidDefinitionError(`Invalid association argument for "${name}": ${String(arg)}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const { factory, strategy, ...overrides } = options;
|
|
61
|
+
return new AssociationDeclaration({ name, factory, strategy, traits, overrides });
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parses the polymorphic `sequence(name, ...)` argument forms into a Sequence.
|
|
65
|
+
* @param {string} name - Sequence name.
|
|
66
|
+
* @param {Array<?>} args - Remaining arguments (initial/options and/or formatter).
|
|
67
|
+
* @returns {Sequence} - The constructed sequence.
|
|
68
|
+
*/
|
|
69
|
+
function buildSequence(name, args) {
|
|
70
|
+
assertName(name, "Sequence");
|
|
71
|
+
let initial = 1;
|
|
72
|
+
/** @type {string[]} */
|
|
73
|
+
let aliases = [];
|
|
74
|
+
/** @type {import("./sequence.js").SequenceFormatter | undefined} */
|
|
75
|
+
let formatter;
|
|
76
|
+
for (const arg of args) {
|
|
77
|
+
if (typeof arg === "function") {
|
|
78
|
+
formatter = arg;
|
|
79
|
+
}
|
|
80
|
+
else if (typeof arg === "number") {
|
|
81
|
+
initial = arg;
|
|
82
|
+
}
|
|
83
|
+
else if (isPlainObject(arg)) {
|
|
84
|
+
if (typeof arg.initial === "number")
|
|
85
|
+
initial = arg.initial;
|
|
86
|
+
if (Array.isArray(arg.aliases))
|
|
87
|
+
aliases = arg.aliases;
|
|
88
|
+
}
|
|
89
|
+
else if (arg !== undefined) {
|
|
90
|
+
throw new InvalidDefinitionError(`Invalid sequence argument for "${name}": ${String(arg)}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return new Sequence({ name, initial, formatter, aliases });
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Collects declarations for one factory/trait block. Shared by factory blocks,
|
|
97
|
+
* trait blocks and the root registry-defaults block.
|
|
98
|
+
*/
|
|
99
|
+
class DeclarationCollector {
|
|
100
|
+
/** Builds a collector. */
|
|
101
|
+
constructor() {
|
|
102
|
+
/** @type {import("./declarations.js").Declaration[]} - Ordered declarations. */
|
|
103
|
+
this.declarations = [];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Records a literal/lazy attribute.
|
|
107
|
+
* @param {string} name - Attribute name.
|
|
108
|
+
* @param {?} value - Literal value or lazy function.
|
|
109
|
+
* @returns {void}
|
|
110
|
+
*/
|
|
111
|
+
attribute(name, value) {
|
|
112
|
+
assertName(name, "Attribute");
|
|
113
|
+
this.declarations.push(attributeDeclaration(name, value, false));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Records a transient attribute.
|
|
117
|
+
* @param {string} name - Transient name.
|
|
118
|
+
* @param {?} value - Literal value or lazy function.
|
|
119
|
+
* @returns {void}
|
|
120
|
+
*/
|
|
121
|
+
transient(name, value) {
|
|
122
|
+
assertName(name, "Transient");
|
|
123
|
+
this.declarations.push(attributeDeclaration(name, value, true));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Records an association.
|
|
127
|
+
* @param {string} name - Relationship name.
|
|
128
|
+
* @param {Array<?>} args - Traits and/or an options object.
|
|
129
|
+
* @returns {void}
|
|
130
|
+
*/
|
|
131
|
+
association(name, ...args) {
|
|
132
|
+
assertName(name, "Association");
|
|
133
|
+
this.declarations.push(buildAssociationDeclaration(name, args));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Records a before-callback.
|
|
137
|
+
* @param {string} phase - Phase (all/build/create).
|
|
138
|
+
* @param {import("./declarations.js").CallbackDeclaration["fn"]} fn - Callback body.
|
|
139
|
+
* @returns {void}
|
|
140
|
+
*/
|
|
141
|
+
before(phase, fn) {
|
|
142
|
+
this.declarations.push(callbackDeclaration(eventNameFor("before", phase), fn));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Records an after-callback.
|
|
146
|
+
* @param {string} phase - Phase (all/build/create).
|
|
147
|
+
* @param {import("./declarations.js").CallbackDeclaration["fn"]} fn - Callback body.
|
|
148
|
+
* @returns {void}
|
|
149
|
+
*/
|
|
150
|
+
after(phase, fn) {
|
|
151
|
+
this.declarations.push(callbackDeclaration(eventNameFor("after", phase), fn));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Records a custom constructor.
|
|
155
|
+
* @param {import("./declarations.js").InitializeWithDeclaration["fn"]} fn - Constructor body.
|
|
156
|
+
* @returns {void}
|
|
157
|
+
*/
|
|
158
|
+
initializeWith(fn) {
|
|
159
|
+
this.declarations.push(initializeWithDeclaration(fn));
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Records a custom persistence hook.
|
|
163
|
+
* @param {import("./declarations.js").ToCreateDeclaration["fn"]} fn - Persistence body.
|
|
164
|
+
* @returns {void}
|
|
165
|
+
*/
|
|
166
|
+
toCreate(fn) {
|
|
167
|
+
this.declarations.push(toCreateDeclaration(fn));
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Records that persistence should be skipped for the create strategy.
|
|
171
|
+
* @returns {void}
|
|
172
|
+
*/
|
|
173
|
+
skipCreate() {
|
|
174
|
+
this.declarations.push(skipCreateDeclaration());
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Runs a trait block against a fresh collector and compiles it into a definition.
|
|
179
|
+
* @param {string} name - Trait name.
|
|
180
|
+
* @param {(builder: object) => void} callback - Trait builder callback.
|
|
181
|
+
* @returns {TraitDefinition} - Compiled trait.
|
|
182
|
+
*/
|
|
183
|
+
function compileTrait(name, callback) {
|
|
184
|
+
assertName(name, "Trait");
|
|
185
|
+
if (typeof callback !== "function") {
|
|
186
|
+
throw new InvalidDefinitionError(`Trait "${name}" requires a builder function`);
|
|
187
|
+
}
|
|
188
|
+
const collector = new DeclarationCollector();
|
|
189
|
+
const builder = {
|
|
190
|
+
attribute: (/** @type {string} */ attrName, /** @type {?} */ value) => collector.attribute(attrName, value),
|
|
191
|
+
transient: (/** @type {string} */ attrName, /** @type {?} */ value) => collector.transient(attrName, value),
|
|
192
|
+
association: (/** @type {string} */ assocName, /** @type {Array<?>} */ ...args) => collector.association(assocName, ...args),
|
|
193
|
+
before: (/** @type {string} */ phase, /** @type {?} */ fn) => collector.before(phase, fn),
|
|
194
|
+
after: (/** @type {string} */ phase, /** @type {?} */ fn) => collector.after(phase, fn),
|
|
195
|
+
initializeWith: (/** @type {?} */ fn) => collector.initializeWith(fn),
|
|
196
|
+
toCreate: (/** @type {?} */ fn) => collector.toCreate(fn),
|
|
197
|
+
skipCreate: () => collector.skipCreate(),
|
|
198
|
+
trait: (/** @type {string} */ includeName) => {
|
|
199
|
+
assertName(includeName, "Trait include");
|
|
200
|
+
collector.declarations.push(traitIncludeDeclaration(includeName));
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
callback(builder);
|
|
204
|
+
return new TraitDefinition({ name, declarations: collector.declarations });
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* A single `define`/`modify` session. It walks the builder callbacks, compiles
|
|
208
|
+
* immutable definitions and registers them into the target registry, throwing on
|
|
209
|
+
* duplicate or structurally invalid declarations at definition time.
|
|
210
|
+
*/
|
|
211
|
+
export default class DefinitionSession {
|
|
212
|
+
/**
|
|
213
|
+
* Builds a session.
|
|
214
|
+
* @param {import("./factory-registry.js").default} registry - Target registry.
|
|
215
|
+
*/
|
|
216
|
+
constructor(registry) {
|
|
217
|
+
/** @type {import("./factory-registry.js").default} - Target registry. */
|
|
218
|
+
this.registry = registry;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Runs a root `define` callback.
|
|
222
|
+
* @param {(builder: object) => void} callback - Root builder callback.
|
|
223
|
+
* @returns {void}
|
|
224
|
+
*/
|
|
225
|
+
run(callback) {
|
|
226
|
+
if (typeof callback !== "function") {
|
|
227
|
+
throw new InvalidDefinitionError("define requires a builder callback");
|
|
228
|
+
}
|
|
229
|
+
callback(this._rootBuilder());
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Runs a `modify` callback that reopens existing factories to append/override
|
|
233
|
+
* declarations, recompiling each into a fresh immutable definition rather than
|
|
234
|
+
* mutating the original.
|
|
235
|
+
* @param {(builder: object) => void} callback - Modify builder callback.
|
|
236
|
+
* @returns {void}
|
|
237
|
+
*/
|
|
238
|
+
runModify(callback) {
|
|
239
|
+
if (typeof callback !== "function") {
|
|
240
|
+
throw new InvalidDefinitionError("modify requires a builder callback");
|
|
241
|
+
}
|
|
242
|
+
callback(this._modifyBuilder());
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Builds the builder object exposed to `modify`.
|
|
246
|
+
* @returns {object} - Modify builder.
|
|
247
|
+
*/
|
|
248
|
+
_modifyBuilder() {
|
|
249
|
+
return {
|
|
250
|
+
factory: (/** @type {string} */ name, /** @type {(builder: object) => void} */ cb) => this._modifyFactory(name, cb),
|
|
251
|
+
trait: (/** @type {string} */ name, /** @type {(builder: object) => void} */ cb) => this.registry._registerGlobalTrait(compileTrait(name, cb)),
|
|
252
|
+
sequence: (/** @type {string} */ name, /** @type {Array<?>} */ ...args) => this.registry._registerSequence(buildSequence(name, args), null),
|
|
253
|
+
before: (/** @type {string} */ phase, /** @type {?} */ fn) => this.registry._addGlobalDeclaration(callbackDeclaration(eventNameFor("before", phase), fn)),
|
|
254
|
+
after: (/** @type {string} */ phase, /** @type {?} */ fn) => this.registry._addGlobalDeclaration(callbackDeclaration(eventNameFor("after", phase), fn)),
|
|
255
|
+
initializeWith: (/** @type {?} */ fn) => this.registry._addGlobalDeclaration(initializeWithDeclaration(fn)),
|
|
256
|
+
toCreate: (/** @type {?} */ fn) => this.registry._addGlobalDeclaration(toCreateDeclaration(fn)),
|
|
257
|
+
skipCreate: () => this.registry._addGlobalDeclaration(skipCreateDeclaration())
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Recompiles an existing factory with appended declarations.
|
|
262
|
+
* @param {string} name - Existing factory name.
|
|
263
|
+
* @param {(builder: object) => void} cb - Factory builder callback.
|
|
264
|
+
* @returns {void}
|
|
265
|
+
*/
|
|
266
|
+
_modifyFactory(name, cb) {
|
|
267
|
+
assertName(name, "Factory");
|
|
268
|
+
const existing = this.registry._factories.get(name);
|
|
269
|
+
if (!existing) {
|
|
270
|
+
throw new InvalidDefinitionError(`Cannot modify unknown factory "${name}"`);
|
|
271
|
+
}
|
|
272
|
+
const collector = new DeclarationCollector();
|
|
273
|
+
/** @type {Array<{name: string, modelOrOptions: ?, cb: ?}>} */
|
|
274
|
+
const nestedFactories = [];
|
|
275
|
+
const localTraits = new Map(existing.localTraits);
|
|
276
|
+
/** @type {Sequence[]} */
|
|
277
|
+
const scopedSequences = [];
|
|
278
|
+
if (typeof cb === "function") {
|
|
279
|
+
cb(this._factoryBuilder(collector, nestedFactories, localTraits, scopedSequences));
|
|
280
|
+
}
|
|
281
|
+
const merged = new FactoryDefinition({
|
|
282
|
+
name: existing.name,
|
|
283
|
+
modelClass: existing.modelClass,
|
|
284
|
+
parentName: existing.parentName,
|
|
285
|
+
aliases: [...existing.aliases],
|
|
286
|
+
declarations: [...existing.declarations, ...collector.declarations],
|
|
287
|
+
localTraits
|
|
288
|
+
});
|
|
289
|
+
this.registry._replaceFactoryDefinition(merged);
|
|
290
|
+
for (const sequence of scopedSequences) {
|
|
291
|
+
this.registry._registerSequence(sequence, name);
|
|
292
|
+
}
|
|
293
|
+
for (const nested of nestedFactories) {
|
|
294
|
+
this._defineFactory(nested.name, nested.modelOrOptions, nested.cb, name);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Builds the root builder object exposed to `define`.
|
|
299
|
+
* @returns {object} - Root builder.
|
|
300
|
+
*/
|
|
301
|
+
_rootBuilder() {
|
|
302
|
+
return {
|
|
303
|
+
factory: (/** @type {string} */ name, /** @type {?} */ modelOrOptions, /** @type {?} */ cb) => this._defineFactory(name, modelOrOptions, cb, null),
|
|
304
|
+
trait: (/** @type {string} */ name, /** @type {(builder: object) => void} */ cb) => this.registry._registerGlobalTrait(compileTrait(name, cb)),
|
|
305
|
+
sequence: (/** @type {string} */ name, /** @type {Array<?>} */ ...args) => this.registry._registerSequence(buildSequence(name, args), null),
|
|
306
|
+
before: (/** @type {string} */ phase, /** @type {?} */ fn) => this.registry._addGlobalDeclaration(callbackDeclaration(eventNameFor("before", phase), fn)),
|
|
307
|
+
after: (/** @type {string} */ phase, /** @type {?} */ fn) => this.registry._addGlobalDeclaration(callbackDeclaration(eventNameFor("after", phase), fn)),
|
|
308
|
+
initializeWith: (/** @type {?} */ fn) => this.registry._addGlobalDeclaration(initializeWithDeclaration(fn)),
|
|
309
|
+
toCreate: (/** @type {?} */ fn) => this.registry._addGlobalDeclaration(toCreateDeclaration(fn)),
|
|
310
|
+
skipCreate: () => this.registry._addGlobalDeclaration(skipCreateDeclaration())
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Compiles and registers a factory (and its nested children/local traits/scoped
|
|
315
|
+
* sequences).
|
|
316
|
+
* @param {string} name - Factory name.
|
|
317
|
+
* @param {?} modelOrOptions - Model class or options object.
|
|
318
|
+
* @param {?} cb - Factory builder callback.
|
|
319
|
+
* @param {string | null} inheritedParent - Parent name for nested factories.
|
|
320
|
+
* @returns {void}
|
|
321
|
+
*/
|
|
322
|
+
_defineFactory(name, modelOrOptions, cb, inheritedParent) {
|
|
323
|
+
assertName(name, "Factory");
|
|
324
|
+
let modelClass = null;
|
|
325
|
+
let builderCallback = cb;
|
|
326
|
+
/** @type {Record<string, ?>} */
|
|
327
|
+
let options = {};
|
|
328
|
+
if (typeof cb === "function") {
|
|
329
|
+
// Three-argument form: the second argument is the model class or options.
|
|
330
|
+
if (typeof modelOrOptions === "function") {
|
|
331
|
+
modelClass = modelOrOptions;
|
|
332
|
+
}
|
|
333
|
+
else if (isPlainObject(modelOrOptions)) {
|
|
334
|
+
options = modelOrOptions;
|
|
335
|
+
modelClass = options.model || options.class || null;
|
|
336
|
+
}
|
|
337
|
+
else if (modelOrOptions !== undefined) {
|
|
338
|
+
throw new InvalidDefinitionError(`Factory "${name}" model must be a class or an options object`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else if (typeof modelOrOptions === "function") {
|
|
342
|
+
// Two-argument form with a trailing function. A backend model class means
|
|
343
|
+
// "no builder"; any other function is the builder (child inherits its model).
|
|
344
|
+
if (modelOrOptions.prototype instanceof DatabaseRecord) {
|
|
345
|
+
modelClass = modelOrOptions;
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
builderCallback = modelOrOptions;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
else if (isPlainObject(modelOrOptions)) {
|
|
352
|
+
options = modelOrOptions;
|
|
353
|
+
modelClass = options.model || options.class || null;
|
|
354
|
+
}
|
|
355
|
+
else if (modelOrOptions !== undefined) {
|
|
356
|
+
throw new InvalidDefinitionError(`Factory "${name}" model must be a class or an options object`);
|
|
357
|
+
}
|
|
358
|
+
const parentName = options.parent || inheritedParent || null;
|
|
359
|
+
const aliases = Array.isArray(options.aliases) ? options.aliases : [];
|
|
360
|
+
const baseTraits = Array.isArray(options.traits) ? options.traits : [];
|
|
361
|
+
const collector = new DeclarationCollector();
|
|
362
|
+
/** @type {Array<{name: string, modelOrOptions: ?, cb: ?}>} */
|
|
363
|
+
const nestedFactories = [];
|
|
364
|
+
/** @type {Map<string, TraitDefinition>} */
|
|
365
|
+
const localTraits = new Map();
|
|
366
|
+
/** @type {Sequence[]} */
|
|
367
|
+
const scopedSequences = [];
|
|
368
|
+
if (typeof builderCallback === "function") {
|
|
369
|
+
builderCallback(this._factoryBuilder(collector, nestedFactories, localTraits, scopedSequences));
|
|
370
|
+
}
|
|
371
|
+
const declarations = [...baseTraits.map((traitName) => traitIncludeDeclaration(traitName)), ...collector.declarations];
|
|
372
|
+
const definition = new FactoryDefinition({ name, modelClass, parentName, aliases, declarations, localTraits });
|
|
373
|
+
this.registry._registerFactoryDefinition(definition);
|
|
374
|
+
for (const sequence of scopedSequences) {
|
|
375
|
+
this.registry._registerSequence(sequence, name);
|
|
376
|
+
}
|
|
377
|
+
for (const nested of nestedFactories) {
|
|
378
|
+
this._defineFactory(nested.name, nested.modelOrOptions, nested.cb, name);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Builds the factory builder object.
|
|
383
|
+
* @param {DeclarationCollector} collector - Declaration collector.
|
|
384
|
+
* @param {Array<{name: string, modelOrOptions: ?, cb: ?}>} nestedFactories - Nested factory sink.
|
|
385
|
+
* @param {Map<string, TraitDefinition>} localTraits - Local trait sink.
|
|
386
|
+
* @param {Sequence[]} scopedSequences - Scoped sequence sink.
|
|
387
|
+
* @returns {object} - Factory builder.
|
|
388
|
+
*/
|
|
389
|
+
_factoryBuilder(collector, nestedFactories, localTraits, scopedSequences) {
|
|
390
|
+
return {
|
|
391
|
+
attribute: (/** @type {string} */ attrName, /** @type {?} */ value) => collector.attribute(attrName, value),
|
|
392
|
+
transient: (/** @type {string} */ attrName, /** @type {?} */ value) => collector.transient(attrName, value),
|
|
393
|
+
association: (/** @type {string} */ assocName, /** @type {Array<?>} */ ...args) => collector.association(assocName, ...args),
|
|
394
|
+
before: (/** @type {string} */ phase, /** @type {?} */ fn) => collector.before(phase, fn),
|
|
395
|
+
after: (/** @type {string} */ phase, /** @type {?} */ fn) => collector.after(phase, fn),
|
|
396
|
+
initializeWith: (/** @type {?} */ fn) => collector.initializeWith(fn),
|
|
397
|
+
toCreate: (/** @type {?} */ fn) => collector.toCreate(fn),
|
|
398
|
+
skipCreate: () => collector.skipCreate(),
|
|
399
|
+
sequence: (/** @type {string} */ seqName, /** @type {Array<?>} */ ...args) => scopedSequences.push(buildSequence(seqName, args)),
|
|
400
|
+
trait: (/** @type {string} */ traitName, /** @type {((builder: object) => void) | undefined} */ traitCb) => {
|
|
401
|
+
if (typeof traitCb === "function") {
|
|
402
|
+
const compiled = compileTrait(traitName, traitCb);
|
|
403
|
+
if (localTraits.has(traitName)) {
|
|
404
|
+
throw new InvalidDefinitionError(`Local trait "${traitName}" is already defined on this factory`);
|
|
405
|
+
}
|
|
406
|
+
localTraits.set(traitName, compiled);
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
assertName(traitName, "Trait include");
|
|
410
|
+
collector.declarations.push(traitIncludeDeclaration(traitName));
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
factory: (/** @type {string} */ childName, /** @type {?} */ childModelOrOptions, /** @type {?} */ childCb) => nestedFactories.push({ name: childName, modelOrOptions: childModelOrOptions, cb: childCb })
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rlc3RpbmcvZmFjdG9yeS9kZWZpbml0aW9uLWJ1aWxkZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM3QyxPQUFPLGNBQWMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMzRCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQix5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQix1QkFBdUIsRUFDeEIsTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLHNCQUFzQixNQUFNLDhCQUE4QixDQUFBO0FBQ2pFLE9BQU8saUJBQWlCLE1BQU0seUJBQXlCLENBQUE7QUFDdkQsT0FBTyxRQUFRLE1BQU0sZUFBZSxDQUFBO0FBQ3BDLE9BQU8sZUFBZSxNQUFNLHVCQUF1QixDQUFBO0FBQ25ELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUVsRCxpRkFBaUY7QUFDakYsTUFBTSxlQUFlLEdBQUcsRUFBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFBO0FBRXRFOzs7OztHQUtHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUs7SUFDakMsTUFBTSxNQUFNLEdBQUcscUNBQXFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUU3RSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksc0JBQXNCLENBQUMsMkJBQTJCLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENB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T0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUNsQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO29CQUVqRCxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzt3QkFDL0IsTUFBTSxJQUFJLHNCQUFzQixDQUFDLGdCQUFnQixTQUFTLHNDQUFzQyxDQUFDLENBQUE7b0JBQ25HLENBQUM7b0JBRUQsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUE7Z0JBQ3RDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixVQUFVLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFBO29CQUN0QyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO2dCQUNqRSxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUMzRyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBQyxDQUFDO1NBQzVGLENBQUE7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtpc1BsYWluT2JqZWN0fSBmcm9tIFwiaXMtcGxhaW4tb2JqZWN0XCJcbmltcG9ydCBEYXRhYmFzZVJlY29yZCBmcm9tIFwiLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCJcbmltcG9ydCB7XG4gIGF0dHJpYnV0ZURlY2xhcmF0aW9uLFxuICBjYWxsYmFja0RlY2xhcmF0aW9uLFxuICBpbml0aWFsaXplV2l0aERlY2xhcmF0aW9uLFxuICBza2lwQ3JlYXRlRGVjbGFyYXRpb24sXG4gIHRvQ3JlYXRlRGVjbGFyYXRpb24sXG4gIHRyYWl0SW5jbHVkZURlY2xhcmF0aW9uXG59IGZyb20gXCIuL2RlY2xhcmF0aW9ucy5qc1wiXG5pbXBvcnQgQXNzb2NpYXRpb25EZWNsYXJhdGlvbiBmcm9tIFwiLi9hc3NvY2lhdGlvbi1kZWNsYXJhdGlvbi5qc1wiXG5pbXBvcnQgRmFjdG9yeURlZmluaXRpb24gZnJvbSBcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCJcbmltcG9ydCBTZXF1ZW5jZSBmcm9tIFwiLi9zZXF1ZW5jZS5qc1wiXG5pbXBvcnQgVHJhaXREZWZpbml0aW9uIGZyb20gXCIuL3RyYWl0LWRlZmluaXRpb24uanNcIlxuaW1wb3J0IHtJbnZhbGlkRGVmaW5pdGlvbkVycm9yfSBmcm9tIFwiLi9lcnJvcnMuanNcIlxuXG4vKiogQ2FsbGJhY2sgcGhhc2VzIGFjY2VwdGVkIGJ5IGBiZWZvcmVgL2BhZnRlcmAgbWFwcGVkIHRvIHRoZWlyIGV2ZW50IHN1ZmZpeC4gKi9cbmNvbnN0IENBTExCQUNLX1BIQVNFUyA9IHthbGw6IFwiQWxsXCIsIGJ1aWxkOiBcIkJ1aWxkXCIsIGNyZWF0ZTogXCJDcmVhdGVcIn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGBiZWZvcmVgL2BhZnRlcmAgcGhhc2UgaW50byB0aGUgY29uY3JldGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7XCJiZWZvcmVcIiB8IFwiYWZ0ZXJcIn0gcHJlZml4IC0gQ2FsbGJhY2sgcHJlZml4LlxuICogQHBhcmFtIHtzdHJpbmd9IHBoYXNlIC0gRGVjbGFyZWQgcGhhc2UgKGFsbC9idWlsZC9jcmVhdGUpLlxuICogQHJldHVybnMge3N0cmluZ30gLSBDb25jcmV0ZSBldmVudCBuYW1lIChlLmcuIFwiYWZ0ZXJDcmVhdGVcIikuXG4gKi9cbmZ1bmN0aW9uIGV2ZW50TmFtZUZvcihwcmVmaXgsIHBoYXNlKSB7XG4gIGNvbnN0IHN1ZmZpeCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi8gKENBTExCQUNLX1BIQVNFUylbcGhhc2VdXG5cbiAgaWYgKCFzdWZmaXgpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZERlZmluaXRpb25FcnJvcihgVW5rbm93biBjYWxsYmFjayBwaGFzZSBcIiR7U3RyaW5nKHBoYXNlKX1cIi4gVXNlIG9uZSBvZjogJHtPYmplY3Qua2V5cyhDQUxMQkFDS19QSEFTRVMpLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgcmV0dXJuIGAke3ByZWZpeH0ke3N1ZmZpeH1gXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgZGVjbGFyZWQgbmFtZSBpcyBhIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUgdG8gdmFsaWRhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2hhdCAtIFdoYXQgaXMgYmVpbmcgbmFtZWQgKGZvciB0aGUgbWVzc2FnZSkuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0TmFtZShuYW1lLCB3aGF0KSB7XG4gIGlmICghbmFtZSB8fCB0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBJbnZhbGlkRGVmaW5pdGlvbkVycm9yKGAke3doYXR9IG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcsIGdvdDogJHtTdHJpbmcobmFtZSl9YClcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhbiBhc3NvY2lhdGlvbiBkZWNsYXJhdGlvbiBmcm9tIHRoZSBsb29zZSBgYXNzb2NpYXRpb24obmFtZSwgLi4uKWAgYXJnczpcbiAqIGxlYWRpbmcgc3RyaW5ncyBhcmUgdHJhaXRzIGFuZCBhIHRyYWlsaW5nIHBsYWluIG9iamVjdCBzdXBwbGllcyBmYWN0b3J5L3N0cmF0ZWd5XG4gKiBwbHVzIG92ZXJyaWRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gKiBAcGFyYW0ge0FycmF5PD8+fSBhcmdzIC0gUmVtYWluaW5nIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIHtBc3NvY2lhdGlvbkRlY2xhcmF0aW9ufSAtIFRoZSBkZWNsYXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gYnVpbGRBc3NvY2lhdGlvbkRlY2xhcmF0aW9uKG5hbWUsIGFyZ3MpIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgdHJhaXRzID0gW11cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgbGV0IG9wdGlvbnMgPSB7fVxuXG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJhaXRzLnB1c2goYXJnKVxuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChhcmcpKSB7XG4gICAgICBvcHRpb25zID0gYXJnXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGVmaW5pdGlvbkVycm9yKGBJbnZhbGlkIGFzc29jaWF0aW9uIGFyZ3VtZW50IGZvciBcIiR7bmFtZX1cIjogJHtTdHJpbmcoYXJnKX1gKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHtmYWN0b3J5LCBzdHJhdGVneSwgLi4ub3ZlcnJpZGVzfSA9IG9wdGlvbnNcblxuICByZXR1cm4gbmV3IEFzc29jaWF0aW9uRGVjbGFyYXRpb24oe25hbWUsIGZhY3RvcnksIHN0cmF0ZWd5LCB0cmFpdHMsIG92ZXJyaWRlc30pXG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBwb2x5bW9ycGhpYyBgc2VxdWVuY2UobmFtZSwgLi4uKWAgYXJndW1lbnQgZm9ybXMgaW50byBhIFNlcXVlbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBTZXF1ZW5jZSBuYW1lLlxuICogQHBhcmFtIHtBcnJheTw/Pn0gYXJncyAtIFJlbWFpbmluZyBhcmd1bWVudHMgKGluaXRpYWwvb3B0aW9ucyBhbmQvb3IgZm9ybWF0dGVyKS5cbiAqIEByZXR1cm5zIHtTZXF1ZW5jZX0gLSBUaGUgY29uc3RydWN0ZWQgc2VxdWVuY2UuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2VxdWVuY2UobmFtZSwgYXJncykge1xuICBhc3NlcnROYW1lKG5hbWUsIFwiU2VxdWVuY2VcIilcblxuICBsZXQgaW5pdGlhbCA9IDFcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgbGV0IGFsaWFzZXMgPSBbXVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VxdWVuY2UuanNcIikuU2VxdWVuY2VGb3JtYXR0ZXIgfCB1bmRlZmluZWR9ICovXG4gIGxldCBmb3JtYXR0ZXJcblxuICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZm9ybWF0dGVyID0gYXJnXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09PSBcIm51bWJlclwiKSB7XG4gICAgICBpbml0aWFsID0gYXJnXG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGFyZykpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnLmluaXRpYWwgPT09IFwibnVtYmVyXCIpIGluaXRpYWwgPSBhcmcuaW5pdGlhbFxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnLmFsaWFzZXMpKSBhbGlhc2VzID0gYXJnLmFsaWFzZXNcbiAgICB9IGVsc2UgaWYgKGFyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZERlZmluaXRpb25FcnJvcihgSW52YWxpZCBzZXF1ZW5jZSBhcmd1bWVudCBmb3IgXCIke25hbWV9XCI6ICR7U3RyaW5nKGFyZyl9YClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlcXVlbmNlKHtuYW1lLCBpbml0aWFsLCBmb3JtYXR0ZXIsIGFsaWFzZXN9KVxufVxuXG4vKipcbiAqIENvbGxlY3RzIGRlY2xhcmF0aW9ucyBmb3Igb25lIGZhY3RvcnkvdHJhaXQgYmxvY2suIFNoYXJlZCBieSBmYWN0b3J5IGJsb2NrcyxcbiAqIHRyYWl0IGJsb2NrcyBhbmQgdGhlIHJvb3QgcmVnaXN0cnktZGVmYXVsdHMgYmxvY2suXG4gKi9cbmNsYXNzIERlY2xhcmF0aW9uQ29sbGVjdG9yIHtcbiAgLyoqIEJ1aWxkcyBhIGNvbGxlY3Rvci4gKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5EZWNsYXJhdGlvbltdfSAtIE9yZGVyZWQgZGVjbGFyYXRpb25zLiAqL1xuICAgIHRoaXMuZGVjbGFyYXRpb25zID0gW11cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGEgbGl0ZXJhbC9sYXp5IGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHs/fSB2YWx1ZSAtIExpdGVyYWwgdmFsdWUgb3IgbGF6eSBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHtcbiAgICBhc3NlcnROYW1lKG5hbWUsIFwiQXR0cmlidXRlXCIpXG4gICAgdGhpcy5kZWNsYXJhdGlvbnMucHVzaChhdHRyaWJ1dGVEZWNsYXJhdGlvbihuYW1lLCB2YWx1ZSwgZmFsc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgYSB0cmFuc2llbnQgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRyYW5zaWVudCBuYW1lLlxuICAgKiBAcGFyYW0gez99IHZhbHVlIC0gTGl0ZXJhbCB2YWx1ZSBvciBsYXp5IGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRyYW5zaWVudChuYW1lLCB2YWx1ZSkge1xuICAgIGFzc2VydE5hbWUobmFtZSwgXCJUcmFuc2llbnRcIilcbiAgICB0aGlzLmRlY2xhcmF0aW9ucy5wdXNoKGF0dHJpYnV0ZURlY2xhcmF0aW9uKG5hbWUsIHZhbHVlLCB0cnVlKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGFuIGFzc29jaWF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBhcmdzIC0gVHJhaXRzIGFuZC9vciBhbiBvcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NvY2lhdGlvbihuYW1lLCAuLi5hcmdzKSB7XG4gICAgYXNzZXJ0TmFtZShuYW1lLCBcIkFzc29jaWF0aW9uXCIpXG4gICAgdGhpcy5kZWNsYXJhdGlvbnMucHVzaChidWlsZEFzc29jaWF0aW9uRGVjbGFyYXRpb24obmFtZSwgYXJncykpXG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhIGJlZm9yZS1jYWxsYmFjay5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBoYXNlIC0gUGhhc2UgKGFsbC9idWlsZC9jcmVhdGUpLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLkNhbGxiYWNrRGVjbGFyYXRpb25bXCJmblwiXX0gZm4gLSBDYWxsYmFjayBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGJlZm9yZShwaGFzZSwgZm4pIHtcbiAgICB0aGlzLmRlY2xhcmF0aW9ucy5wdXNoKGNhbGxiYWNrRGVjbGFyYXRpb24oZXZlbnROYW1lRm9yKFwiYmVmb3JlXCIsIHBoYXNlKSwgZm4pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgYW4gYWZ0ZXItY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwaGFzZSAtIFBoYXNlIChhbGwvYnVpbGQvY3JlYXRlKS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5DYWxsYmFja0RlY2xhcmF0aW9uW1wiZm5cIl19IGZuIC0gQ2FsbGJhY2sgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhZnRlcihwaGFzZSwgZm4pIHtcbiAgICB0aGlzLmRlY2xhcmF0aW9ucy5wdXNoKGNhbGxiYWNrRGVjbGFyYXRpb24oZXZlbnROYW1lRm9yKFwiYWZ0ZXJcIiwgcGhhc2UpLCBmbikpXG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhIGN1c3RvbSBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5Jbml0aWFsaXplV2l0aERlY2xhcmF0aW9uW1wiZm5cIl19IGZuIC0gQ29uc3RydWN0b3IgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBpbml0aWFsaXplV2l0aChmbikge1xuICAgIHRoaXMuZGVjbGFyYXRpb25zLnB1c2goaW5pdGlhbGl6ZVdpdGhEZWNsYXJhdGlvbihmbikpXG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhIGN1c3RvbSBwZXJzaXN0ZW5jZSBob29rLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLlRvQ3JlYXRlRGVjbGFyYXRpb25bXCJmblwiXX0gZm4gLSBQZXJzaXN0ZW5jZSBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRvQ3JlYXRlKGZuKSB7XG4gICAgdGhpcy5kZWNsYXJhdGlvbnMucHVzaCh0b0NyZWF0ZURlY2xhcmF0aW9uKGZuKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoYXQgcGVyc2lzdGVuY2Ugc2hvdWxkIGJlIHNraXBwZWQgZm9yIHRoZSBjcmVhdGUgc3RyYXRlZ3kuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2tpcENyZWF0ZSgpIHtcbiAgICB0aGlzLmRlY2xhcmF0aW9ucy5wdXNoKHNraXBDcmVhdGVEZWNsYXJhdGlvbigpKVxuICB9XG59XG5cbi8qKlxuICogUnVucyBhIHRyYWl0IGJsb2NrIGFnYWluc3QgYSBmcmVzaCBjb2xsZWN0b3IgYW5kIGNvbXBpbGVzIGl0IGludG8gYSBkZWZpbml0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUcmFpdCBuYW1lLlxuICogQHBhcmFtIHsoYnVpbGRlcjogb2JqZWN0KSA9PiB2b2lkfSBjYWxsYmFjayAtIFRyYWl0IGJ1aWxkZXIgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7VHJhaXREZWZpbml0aW9ufSAtIENvbXBpbGVkIHRyYWl0LlxuICovXG5mdW5jdGlvbiBjb21waWxlVHJhaXQobmFtZSwgY2FsbGJhY2spIHtcbiAgYXNzZXJ0TmFtZShuYW1lLCBcIlRyYWl0XCIpXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWREZWZpbml0aW9uRXJyb3IoYFRyYWl0IFwiJHtuYW1lfVwiIHJlcXVpcmVzIGEgYnVpbGRlciBmdW5jdGlvbmApXG4gIH1cblxuICBjb25zdCBjb2xsZWN0b3IgPSBuZXcgRGVjbGFyYXRpb25Db2xsZWN0b3IoKVxuICBjb25zdCBidWlsZGVyID0ge1xuICAgIGF0dHJpYnV0ZTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBhdHRyTmFtZSwgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSkgPT4gY29sbGVjdG9yLmF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsdWUpLFxuICAgIHRyYW5zaWVudDogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBhdHRyTmFtZSwgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSkgPT4gY29sbGVjdG9yLnRyYW5zaWVudChhdHRyTmFtZSwgdmFsdWUpLFxuICAgIGFzc29jaWF0aW9uOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGFzc29jTmFtZSwgLyoqIEB0eXBlIHtBcnJheTw/Pn0gKi8gLi4uYXJncykgPT4gY29sbGVjdG9yLmFzc29jaWF0aW9uKGFzc29jTmFtZSwgLi4uYXJncyksXG4gICAgYmVmb3JlOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIHBoYXNlLCAvKiogQHR5cGUgez99ICovIGZuKSA9PiBjb2xsZWN0b3IuYmVmb3JlKHBoYXNlLCBmbiksXG4gICAgYWZ0ZXI6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gcGhhc2UsIC8qKiBAdHlwZSB7P30gKi8gZm4pID0+IGNvbGxlY3Rvci5hZnRlcihwaGFzZSwgZm4pLFxuICAgIGluaXRpYWxpemVXaXRoOiAoLyoqIEB0eXBlIHs/fSAqLyBmbikgPT4gY29sbGVjdG9yLmluaXRpYWxpemVXaXRoKGZuKSxcbiAgICB0b0NyZWF0ZTogKC8qKiBAdHlwZSB7P30gKi8gZm4pID0+IGNvbGxlY3Rvci50b0NyZWF0ZShmbiksXG4gICAgc2tpcENyZWF0ZTogKCkgPT4gY29sbGVjdG9yLnNraXBDcmVhdGUoKSxcbiAgICB0cmFpdDogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBpbmNsdWRlTmFtZSkgPT4ge1xuICAgICAgYXNzZXJ0TmFtZShpbmNsdWRlTmFtZSwgXCJUcmFpdCBpbmNsdWRlXCIpXG4gICAgICBjb2xsZWN0b3IuZGVjbGFyYXRpb25zLnB1c2godHJhaXRJbmNsdWRlRGVjbGFyYXRpb24oaW5jbHVkZU5hbWUpKVxuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGJ1aWxkZXIpXG5cbiAgcmV0dXJuIG5ldyBUcmFpdERlZmluaXRpb24oe25hbWUsIGRlY2xhcmF0aW9uczogY29sbGVjdG9yLmRlY2xhcmF0aW9uc30pXG59XG5cbi8qKlxuICogQSBzaW5nbGUgYGRlZmluZWAvYG1vZGlmeWAgc2Vzc2lvbi4gSXQgd2Fsa3MgdGhlIGJ1aWxkZXIgY2FsbGJhY2tzLCBjb21waWxlc1xuICogaW1tdXRhYmxlIGRlZmluaXRpb25zIGFuZCByZWdpc3RlcnMgdGhlbSBpbnRvIHRoZSB0YXJnZXQgcmVnaXN0cnksIHRocm93aW5nIG9uXG4gKiBkdXBsaWNhdGUgb3Igc3RydWN0dXJhbGx5IGludmFsaWQgZGVjbGFyYXRpb25zIGF0IGRlZmluaXRpb24gdGltZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVmaW5pdGlvblNlc3Npb24ge1xuICAvKipcbiAgICogQnVpbGRzIGEgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gcmVnaXN0cnkgLSBUYXJnZXQgcmVnaXN0cnkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWdpc3RyeSkge1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9mYWN0b3J5LXJlZ2lzdHJ5LmpzXCIpLmRlZmF1bHR9IC0gVGFyZ2V0IHJlZ2lzdHJ5LiAqL1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSByb290IGBkZWZpbmVgIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0geyhidWlsZGVyOiBvYmplY3QpID0+IHZvaWR9IGNhbGxiYWNrIC0gUm9vdCBidWlsZGVyIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJ1bihjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREZWZpbml0aW9uRXJyb3IoXCJkZWZpbmUgcmVxdWlyZXMgYSBidWlsZGVyIGNhbGxiYWNrXCIpXG4gICAgfVxuXG4gICAgY2FsbGJhY2sodGhpcy5fcm9vdEJ1aWxkZXIoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgYG1vZGlmeWAgY2FsbGJhY2sgdGhhdCByZW9wZW5zIGV4aXN0aW5nIGZhY3RvcmllcyB0byBhcHBlbmQvb3ZlcnJpZGVcbiAgICogZGVjbGFyYXRpb25zLCByZWNvbXBpbGluZyBlYWNoIGludG8gYSBmcmVzaCBpbW11dGFibGUgZGVmaW5pdGlvbiByYXRoZXIgdGhhblxuICAgKiBtdXRhdGluZyB0aGUgb3JpZ2luYWwuXG4gICAqIEBwYXJhbSB7KGJ1aWxkZXI6IG9iamVjdCkgPT4gdm9pZH0gY2FsbGJhY2sgLSBNb2RpZnkgYnVpbGRlciBjYWxsYmFjay5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBydW5Nb2RpZnkoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGVmaW5pdGlvbkVycm9yKFwibW9kaWZ5IHJlcXVpcmVzIGEgYnVpbGRlciBjYWxsYmFja1wiKVxuICAgIH1cblxuICAgIGNhbGxiYWNrKHRoaXMuX21vZGlmeUJ1aWxkZXIoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGJ1aWxkZXIgb2JqZWN0IGV4cG9zZWQgdG8gYG1vZGlmeWAuXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IC0gTW9kaWZ5IGJ1aWxkZXIuXG4gICAqL1xuICBfbW9kaWZ5QnVpbGRlcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmFjdG9yeTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBuYW1lLCAvKiogQHR5cGUgeyhidWlsZGVyOiBvYmplY3QpID0+IHZvaWR9ICovIGNiKSA9PiB0aGlzLl9tb2RpZnlGYWN0b3J5KG5hbWUsIGNiKSxcbiAgICAgIHRyYWl0OiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIG5hbWUsIC8qKiBAdHlwZSB7KGJ1aWxkZXI6IG9iamVjdCkgPT4gdm9pZH0gKi8gY2IpID0+XG4gICAgICAgIHRoaXMucmVnaXN0cnkuX3JlZ2lzdGVyR2xvYmFsVHJhaXQoY29tcGlsZVRyYWl0KG5hbWUsIGNiKSksXG4gICAgICBzZXF1ZW5jZTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBuYW1lLCAvKiogQHR5cGUge0FycmF5PD8+fSAqLyAuLi5hcmdzKSA9PlxuICAgICAgICB0aGlzLnJlZ2lzdHJ5Ll9yZWdpc3RlclNlcXVlbmNlKGJ1aWxkU2VxdWVuY2UobmFtZSwgYXJncyksIG51bGwpLFxuICAgICAgYmVmb3JlOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIHBoYXNlLCAvKiogQHR5cGUgez99ICovIGZuKSA9PlxuICAgICAgICB0aGlzLnJlZ2lzdHJ5Ll9hZGRHbG9iYWxEZWNsYXJhdGlvbihjYWxsYmFja0RlY2xhcmF0aW9uKGV2ZW50TmFtZUZvcihcImJlZm9yZVwiLCBwaGFzZSksIGZuKSksXG4gICAgICBhZnRlcjogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBwaGFzZSwgLyoqIEB0eXBlIHs/fSAqLyBmbikgPT5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5fYWRkR2xvYmFsRGVjbGFyYXRpb24oY2FsbGJhY2tEZWNsYXJhdGlvbihldmVudE5hbWVGb3IoXCJhZnRlclwiLCBwaGFzZSksIGZuKSksXG4gICAgICBpbml0aWFsaXplV2l0aDogKC8qKiBAdHlwZSB7P30gKi8gZm4pID0+IHRoaXMucmVnaXN0cnkuX2FkZEdsb2JhbERlY2xhcmF0aW9uKGluaXRpYWxpemVXaXRoRGVjbGFyYXRpb24oZm4pKSxcbiAgICAgIHRvQ3JlYXRlOiAoLyoqIEB0eXBlIHs/fSAqLyBmbikgPT4gdGhpcy5yZWdpc3RyeS5fYWRkR2xvYmFsRGVjbGFyYXRpb24odG9DcmVhdGVEZWNsYXJhdGlvbihmbikpLFxuICAgICAgc2tpcENyZWF0ZTogKCkgPT4gdGhpcy5yZWdpc3RyeS5fYWRkR2xvYmFsRGVjbGFyYXRpb24oc2tpcENyZWF0ZURlY2xhcmF0aW9uKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcGlsZXMgYW4gZXhpc3RpbmcgZmFjdG9yeSB3aXRoIGFwcGVuZGVkIGRlY2xhcmF0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBFeGlzdGluZyBmYWN0b3J5IG5hbWUuXG4gICAqIEBwYXJhbSB7KGJ1aWxkZXI6IG9iamVjdCkgPT4gdm9pZH0gY2IgLSBGYWN0b3J5IGJ1aWxkZXIgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX21vZGlmeUZhY3RvcnkobmFtZSwgY2IpIHtcbiAgICBhc3NlcnROYW1lKG5hbWUsIFwiRmFjdG9yeVwiKVxuXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnJlZ2lzdHJ5Ll9mYWN0b3JpZXMuZ2V0KG5hbWUpXG5cbiAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZERlZmluaXRpb25FcnJvcihgQ2Fubm90IG1vZGlmeSB1bmtub3duIGZhY3RvcnkgXCIke25hbWV9XCJgKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3RvciA9IG5ldyBEZWNsYXJhdGlvbkNvbGxlY3RvcigpXG4gICAgLyoqIEB0eXBlIHtBcnJheTx7bmFtZTogc3RyaW5nLCBtb2RlbE9yT3B0aW9uczogPywgY2I6ID99Pn0gKi9cbiAgICBjb25zdCBuZXN0ZWRGYWN0b3JpZXMgPSBbXVxuICAgIGNvbnN0IGxvY2FsVHJhaXRzID0gbmV3IE1hcChleGlzdGluZy5sb2NhbFRyYWl0cylcbiAgICAvKiogQHR5cGUge1NlcXVlbmNlW119ICovXG4gICAgY29uc3Qgc2NvcGVkU2VxdWVuY2VzID0gW11cblxuICAgIGlmICh0eXBlb2YgY2IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY2IodGhpcy5fZmFjdG9yeUJ1aWxkZXIoY29sbGVjdG9yLCBuZXN0ZWRGYWN0b3JpZXMsIGxvY2FsVHJhaXRzLCBzY29wZWRTZXF1ZW5jZXMpKVxuICAgIH1cblxuICAgIGNvbnN0IG1lcmdlZCA9IG5ldyBGYWN0b3J5RGVmaW5pdGlvbih7XG4gICAgICBuYW1lOiBleGlzdGluZy5uYW1lLFxuICAgICAgbW9kZWxDbGFzczogZXhpc3RpbmcubW9kZWxDbGFzcyxcbiAgICAgIHBhcmVudE5hbWU6IGV4aXN0aW5nLnBhcmVudE5hbWUsXG4gICAgICBhbGlhc2VzOiBbLi4uZXhpc3RpbmcuYWxpYXNlc10sXG4gICAgICBkZWNsYXJhdGlvbnM6IFsuLi5leGlzdGluZy5kZWNsYXJhdGlvbnMsIC4uLmNvbGxlY3Rvci5kZWNsYXJhdGlvbnNdLFxuICAgICAgbG9jYWxUcmFpdHNcbiAgICB9KVxuXG4gICAgdGhpcy5yZWdpc3RyeS5fcmVwbGFjZUZhY3RvcnlEZWZpbml0aW9uKG1lcmdlZClcblxuICAgIGZvciAoY29uc3Qgc2VxdWVuY2Ugb2Ygc2NvcGVkU2VxdWVuY2VzKSB7XG4gICAgICB0aGlzLnJlZ2lzdHJ5Ll9yZWdpc3RlclNlcXVlbmNlKHNlcXVlbmNlLCBuYW1lKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIG5lc3RlZEZhY3Rvcmllcykge1xuICAgICAgdGhpcy5fZGVmaW5lRmFjdG9yeShuZXN0ZWQubmFtZSwgbmVzdGVkLm1vZGVsT3JPcHRpb25zLCBuZXN0ZWQuY2IsIG5hbWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcm9vdCBidWlsZGVyIG9iamVjdCBleHBvc2VkIHRvIGBkZWZpbmVgLlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFJvb3QgYnVpbGRlci5cbiAgICovXG4gIF9yb290QnVpbGRlcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmFjdG9yeTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBuYW1lLCAvKiogQHR5cGUgez99ICovIG1vZGVsT3JPcHRpb25zLCAvKiogQHR5cGUgez99ICovIGNiKSA9PlxuICAgICAgICB0aGlzLl9kZWZpbmVGYWN0b3J5KG5hbWUsIG1vZGVsT3JPcHRpb25zLCBjYiwgbnVsbCksXG4gICAgICB0cmFpdDogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBuYW1lLCAvKiogQHR5cGUgeyhidWlsZGVyOiBvYmplY3QpID0+IHZvaWR9ICovIGNiKSA9PlxuICAgICAgICB0aGlzLnJlZ2lzdHJ5Ll9yZWdpc3Rlckdsb2JhbFRyYWl0KGNvbXBpbGVUcmFpdChuYW1lLCBjYikpLFxuICAgICAgc2VxdWVuY2U6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gbmFtZSwgLyoqIEB0eXBlIHtBcnJheTw/Pn0gKi8gLi4uYXJncykgPT5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5fcmVnaXN0ZXJTZXF1ZW5jZShidWlsZFNlcXVlbmNlKG5hbWUsIGFyZ3MpLCBudWxsKSxcbiAgICAgIGJlZm9yZTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBwaGFzZSwgLyoqIEB0eXBlIHs/fSAqLyBmbikgPT5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5fYWRkR2xvYmFsRGVjbGFyYXRpb24oY2FsbGJhY2tEZWNsYXJhdGlvbihldmVudE5hbWVGb3IoXCJiZWZvcmVcIiwgcGhhc2UpLCBmbikpLFxuICAgICAgYWZ0ZXI6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gcGhhc2UsIC8qKiBAdHlwZSB7P30gKi8gZm4pID0+XG4gICAgICAgIHRoaXMucmVnaXN0cnkuX2FkZEdsb2JhbERlY2xhcmF0aW9uKGNhbGxiYWNrRGVjbGFyYXRpb24oZXZlbnROYW1lRm9yKFwiYWZ0ZXJcIiwgcGhhc2UpLCBmbikpLFxuICAgICAgaW5pdGlhbGl6ZVdpdGg6ICgvKiogQHR5cGUgez99ICovIGZuKSA9PiB0aGlzLnJlZ2lzdHJ5Ll9hZGRHbG9iYWxEZWNsYXJhdGlvbihpbml0aWFsaXplV2l0aERlY2xhcmF0aW9uKGZuKSksXG4gICAgICB0b0NyZWF0ZTogKC8qKiBAdHlwZSB7P30gKi8gZm4pID0+IHRoaXMucmVnaXN0cnkuX2FkZEdsb2JhbERlY2xhcmF0aW9uKHRvQ3JlYXRlRGVjbGFyYXRpb24oZm4pKSxcbiAgICAgIHNraXBDcmVhdGU6ICgpID0+IHRoaXMucmVnaXN0cnkuX2FkZEdsb2JhbERlY2xhcmF0aW9uKHNraXBDcmVhdGVEZWNsYXJhdGlvbigpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21waWxlcyBhbmQgcmVnaXN0ZXJzIGEgZmFjdG9yeSAoYW5kIGl0cyBuZXN0ZWQgY2hpbGRyZW4vbG9jYWwgdHJhaXRzL3Njb3BlZFxuICAgKiBzZXF1ZW5jZXMpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHs/fSBtb2RlbE9yT3B0aW9ucyAtIE1vZGVsIGNsYXNzIG9yIG9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gez99IGNiIC0gRmFjdG9yeSBidWlsZGVyIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGluaGVyaXRlZFBhcmVudCAtIFBhcmVudCBuYW1lIGZvciBuZXN0ZWQgZmFjdG9yaWVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9kZWZpbmVGYWN0b3J5KG5hbWUsIG1vZGVsT3JPcHRpb25zLCBjYiwgaW5oZXJpdGVkUGFyZW50KSB7XG4gICAgYXNzZXJ0TmFtZShuYW1lLCBcIkZhY3RvcnlcIilcblxuICAgIGxldCBtb2RlbENsYXNzID0gbnVsbFxuICAgIGxldCBidWlsZGVyQ2FsbGJhY2sgPSBjYlxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgbGV0IG9wdGlvbnMgPSB7fVxuXG4gICAgaWYgKHR5cGVvZiBjYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBUaHJlZS1hcmd1bWVudCBmb3JtOiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBtb2RlbCBjbGFzcyBvciBvcHRpb25zLlxuICAgICAgaWYgKHR5cGVvZiBtb2RlbE9yT3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG1vZGVsQ2xhc3MgPSBtb2RlbE9yT3B0aW9uc1xuICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KG1vZGVsT3JPcHRpb25zKSkge1xuICAgICAgICBvcHRpb25zID0gbW9kZWxPck9wdGlvbnNcbiAgICAgICAgbW9kZWxDbGFzcyA9IG9wdGlvbnMubW9kZWwgfHwgb3B0aW9ucy5jbGFzcyB8fCBudWxsXG4gICAgICB9IGVsc2UgaWYgKG1vZGVsT3JPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWREZWZpbml0aW9uRXJyb3IoYEZhY3RvcnkgXCIke25hbWV9XCIgbW9kZWwgbXVzdCBiZSBhIGNsYXNzIG9yIGFuIG9wdGlvbnMgb2JqZWN0YClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2RlbE9yT3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBUd28tYXJndW1lbnQgZm9ybSB3aXRoIGEgdHJhaWxpbmcgZnVuY3Rpb24uIEEgYmFja2VuZCBtb2RlbCBjbGFzcyBtZWFuc1xuICAgICAgLy8gXCJubyBidWlsZGVyXCI7IGFueSBvdGhlciBmdW5jdGlvbiBpcyB0aGUgYnVpbGRlciAoY2hpbGQgaW5oZXJpdHMgaXRzIG1vZGVsKS5cbiAgICAgIGlmIChtb2RlbE9yT3B0aW9ucy5wcm90b3R5cGUgaW5zdGFuY2VvZiBEYXRhYmFzZVJlY29yZCkge1xuICAgICAgICBtb2RlbENsYXNzID0gbW9kZWxPck9wdGlvbnNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1aWxkZXJDYWxsYmFjayA9IG1vZGVsT3JPcHRpb25zXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KG1vZGVsT3JPcHRpb25zKSkge1xuICAgICAgb3B0aW9ucyA9IG1vZGVsT3JPcHRpb25zXG4gICAgICBtb2RlbENsYXNzID0gb3B0aW9ucy5tb2RlbCB8fCBvcHRpb25zLmNsYXNzIHx8IG51bGxcbiAgICB9IGVsc2UgaWYgKG1vZGVsT3JPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGVmaW5pdGlvbkVycm9yKGBGYWN0b3J5IFwiJHtuYW1lfVwiIG1vZGVsIG11c3QgYmUgYSBjbGFzcyBvciBhbiBvcHRpb25zIG9iamVjdGApXG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50TmFtZSA9IG9wdGlvbnMucGFyZW50IHx8IGluaGVyaXRlZFBhcmVudCB8fCBudWxsXG4gICAgY29uc3QgYWxpYXNlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlhc2VzKSA/IG9wdGlvbnMuYWxpYXNlcyA6IFtdXG4gICAgY29uc3QgYmFzZVRyYWl0cyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy50cmFpdHMpID8gb3B0aW9ucy50cmFpdHMgOiBbXVxuXG4gICAgY29uc3QgY29sbGVjdG9yID0gbmV3IERlY2xhcmF0aW9uQ29sbGVjdG9yKClcbiAgICAvKiogQHR5cGUge0FycmF5PHtuYW1lOiBzdHJpbmcsIG1vZGVsT3JPcHRpb25zOiA/LCBjYjogP30+fSAqL1xuICAgIGNvbnN0IG5lc3RlZEZhY3RvcmllcyA9IFtdXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBUcmFpdERlZmluaXRpb24+fSAqL1xuICAgIGNvbnN0IGxvY2FsVHJhaXRzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtTZXF1ZW5jZVtdfSAqL1xuICAgIGNvbnN0IHNjb3BlZFNlcXVlbmNlcyA9IFtdXG5cbiAgICBpZiAodHlwZW9mIGJ1aWxkZXJDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBidWlsZGVyQ2FsbGJhY2sodGhpcy5fZmFjdG9yeUJ1aWxkZXIoY29sbGVjdG9yLCBuZXN0ZWRGYWN0b3JpZXMsIGxvY2FsVHJhaXRzLCBzY29wZWRTZXF1ZW5jZXMpKVxuICAgIH1cblxuICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IFsuLi5iYXNlVHJhaXRzLm1hcCgodHJhaXROYW1lKSA9PiB0cmFpdEluY2x1ZGVEZWNsYXJhdGlvbih0cmFpdE5hbWUpKSwgLi4uY29sbGVjdG9yLmRlY2xhcmF0aW9uc11cbiAgICBjb25zdCBkZWZpbml0aW9uID0gbmV3IEZhY3RvcnlEZWZpbml0aW9uKHtuYW1lLCBtb2RlbENsYXNzLCBwYXJlbnROYW1lLCBhbGlhc2VzLCBkZWNsYXJhdGlvbnMsIGxvY2FsVHJhaXRzfSlcblxuICAgIHRoaXMucmVnaXN0cnkuX3JlZ2lzdGVyRmFjdG9yeURlZmluaXRpb24oZGVmaW5pdGlvbilcblxuICAgIGZvciAoY29uc3Qgc2VxdWVuY2Ugb2Ygc2NvcGVkU2VxdWVuY2VzKSB7XG4gICAgICB0aGlzLnJlZ2lzdHJ5Ll9yZWdpc3RlclNlcXVlbmNlKHNlcXVlbmNlLCBuYW1lKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIG5lc3RlZEZhY3Rvcmllcykge1xuICAgICAgdGhpcy5fZGVmaW5lRmFjdG9yeShuZXN0ZWQubmFtZSwgbmVzdGVkLm1vZGVsT3JPcHRpb25zLCBuZXN0ZWQuY2IsIG5hbWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZmFjdG9yeSBidWlsZGVyIG9iamVjdC5cbiAgICogQHBhcmFtIHtEZWNsYXJhdGlvbkNvbGxlY3Rvcn0gY29sbGVjdG9yIC0gRGVjbGFyYXRpb24gY29sbGVjdG9yLlxuICAgKiBAcGFyYW0ge0FycmF5PHtuYW1lOiBzdHJpbmcsIG1vZGVsT3JPcHRpb25zOiA/LCBjYjogP30+fSBuZXN0ZWRGYWN0b3JpZXMgLSBOZXN0ZWQgZmFjdG9yeSBzaW5rLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFRyYWl0RGVmaW5pdGlvbj59IGxvY2FsVHJhaXRzIC0gTG9jYWwgdHJhaXQgc2luay5cbiAgICogQHBhcmFtIHtTZXF1ZW5jZVtdfSBzY29wZWRTZXF1ZW5jZXMgLSBTY29wZWQgc2VxdWVuY2Ugc2luay5cbiAgICogQHJldHVybnMge29iamVjdH0gLSBGYWN0b3J5IGJ1aWxkZXIuXG4gICAqL1xuICBfZmFjdG9yeUJ1aWxkZXIoY29sbGVjdG9yLCBuZXN0ZWRGYWN0b3JpZXMsIGxvY2FsVHJhaXRzLCBzY29wZWRTZXF1ZW5jZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGF0dHJOYW1lLCAvKiogQHR5cGUgez99ICovIHZhbHVlKSA9PiBjb2xsZWN0b3IuYXR0cmlidXRlKGF0dHJOYW1lLCB2YWx1ZSksXG4gICAgICB0cmFuc2llbnQ6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gYXR0ck5hbWUsIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUpID0+IGNvbGxlY3Rvci50cmFuc2llbnQoYXR0ck5hbWUsIHZhbHVlKSxcbiAgICAgIGFzc29jaWF0aW9uOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGFzc29jTmFtZSwgLyoqIEB0eXBlIHtBcnJheTw/Pn0gKi8gLi4uYXJncykgPT4gY29sbGVjdG9yLmFzc29jaWF0aW9uKGFzc29jTmFtZSwgLi4uYXJncyksXG4gICAgICBiZWZvcmU6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gcGhhc2UsIC8qKiBAdHlwZSB7P30gKi8gZm4pID0+IGNvbGxlY3Rvci5iZWZvcmUocGhhc2UsIGZuKSxcbiAgICAgIGFmdGVyOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIHBoYXNlLCAvKiogQHR5cGUgez99ICovIGZuKSA9PiBjb2xsZWN0b3IuYWZ0ZXIocGhhc2UsIGZuKSxcbiAgICAgIGluaXRpYWxpemVXaXRoOiAoLyoqIEB0eXBlIHs/fSAqLyBmbikgPT4gY29sbGVjdG9yLmluaXRpYWxpemVXaXRoKGZuKSxcbiAgICAgIHRvQ3JlYXRlOiAoLyoqIEB0eXBlIHs/fSAqLyBmbikgPT4gY29sbGVjdG9yLnRvQ3JlYXRlKGZuKSxcbiAgICAgIHNraXBDcmVhdGU6ICgpID0+IGNvbGxlY3Rvci5za2lwQ3JlYXRlKCksXG4gICAgICBzZXF1ZW5jZTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBzZXFOYW1lLCAvKiogQHR5cGUge0FycmF5PD8+fSAqLyAuLi5hcmdzKSA9PiBzY29wZWRTZXF1ZW5jZXMucHVzaChidWlsZFNlcXVlbmNlKHNlcU5hbWUsIGFyZ3MpKSxcbiAgICAgIHRyYWl0OiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIHRyYWl0TmFtZSwgLyoqIEB0eXBlIHsoKGJ1aWxkZXI6IG9iamVjdCkgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovIHRyYWl0Q2IpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFpdENiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjb25zdCBjb21waWxlZCA9IGNvbXBpbGVUcmFpdCh0cmFpdE5hbWUsIHRyYWl0Q2IpXG5cbiAgICAgICAgICBpZiAobG9jYWxUcmFpdHMuaGFzKHRyYWl0TmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRGVmaW5pdGlvbkVycm9yKGBMb2NhbCB0cmFpdCBcIiR7dHJhaXROYW1lfVwiIGlzIGFscmVhZHkgZGVmaW5lZCBvbiB0aGlzIGZhY3RvcnlgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxvY2FsVHJhaXRzLnNldCh0cmFpdE5hbWUsIGNvbXBpbGVkKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2VydE5hbWUodHJhaXROYW1lLCBcIlRyYWl0IGluY2x1ZGVcIilcbiAgICAgICAgICBjb2xsZWN0b3IuZGVjbGFyYXRpb25zLnB1c2godHJhaXRJbmNsdWRlRGVjbGFyYXRpb24odHJhaXROYW1lKSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZhY3Rvcnk6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gY2hpbGROYW1lLCAvKiogQHR5cGUgez99ICovIGNoaWxkTW9kZWxPck9wdGlvbnMsIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRDYikgPT5cbiAgICAgICAgbmVzdGVkRmFjdG9yaWVzLnB1c2goe25hbWU6IGNoaWxkTmFtZSwgbW9kZWxPck9wdGlvbnM6IGNoaWxkTW9kZWxPck9wdGlvbnMsIGNiOiBjaGlsZENifSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raised when a factory, trait or sequence is declared twice within the same
|
|
3
|
+
* registry, matching FactoryBot's duplicate-definition guard.
|
|
4
|
+
*/
|
|
5
|
+
export class DuplicateDefinitionError extends FactoryError {
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Raised when attribute or factory/trait resolution forms a cycle. The message
|
|
9
|
+
* always contains the full offending path so the author can break it.
|
|
10
|
+
*/
|
|
11
|
+
export class FactoryCycleError extends FactoryError {
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Base error for every Factory-framework failure so callers can catch the whole
|
|
15
|
+
* family with a single `instanceof FactoryError` check.
|
|
16
|
+
*/
|
|
17
|
+
export class FactoryError extends Error {
|
|
18
|
+
/**
|
|
19
|
+
* Builds a factory error.
|
|
20
|
+
* @param {string} message - Human readable description of the failure.
|
|
21
|
+
*/
|
|
22
|
+
constructor(message: string);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Raised when a definition is structurally invalid at declaration time (bad
|
|
26
|
+
* names, option shapes, event names, or model references).
|
|
27
|
+
*/
|
|
28
|
+
export class InvalidDefinitionError extends FactoryError {
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Raised when a build/create strategy is asked to construct a class that is not a
|
|
32
|
+
* supported, initialized Velocious backend record.
|
|
33
|
+
*/
|
|
34
|
+
export class ModelContractError extends FactoryError {
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Raised when setup-time mutation (define/modify/reset/sequence set/rewind) is
|
|
38
|
+
* attempted while the registry has in-flight evaluations.
|
|
39
|
+
*/
|
|
40
|
+
export class RegistryBusyError extends FactoryError {
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Raised when a lazy attribute references another attribute that does not exist.
|
|
44
|
+
*/
|
|
45
|
+
export class UndefinedAttributeError extends FactoryError {
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Raised when a strategy references a factory name that was never registered.
|
|
49
|
+
*/
|
|
50
|
+
export class UndefinedFactoryError extends FactoryError {
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Raised when a sequence name cannot be resolved in the factory-local or global scope.
|
|
54
|
+
*/
|
|
55
|
+
export class UndefinedSequenceError extends FactoryError {
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Raised when a trait name cannot be resolved in the factory-local or global scope.
|
|
59
|
+
*/
|
|
60
|
+
export class UndefinedTraitError extends FactoryError {
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/testing/factory/errors.js"],"names":[],"mappings":"AAiBA;;;GAGG;AACH;CAAsD;AAsBtD;;;GAGG;AACH;CAA+C;AA7C/C;;;GAGG;AACH;IACE;;;OAGG;IACH,qBAFW,MAAM,EAKhB;CACF;AAkCD;;;GAGG;AACH;CAAoD;AAEpD;;;GAGG;AACH;CAAgD;AAEhD;;;GAGG;AACH;CAA+C;AA3B/C;;GAEG;AACH;CAAqD;AAlBrD;;GAEG;AACH;CAAmD;AAOnD;;GAEG;AACH;CAAoD;AARpD;;GAEG;AACH;CAAiD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* Base error for every Factory-framework failure so callers can catch the whole
|
|
4
|
+
* family with a single `instanceof FactoryError` check.
|
|
5
|
+
*/
|
|
6
|
+
class FactoryError extends Error {
|
|
7
|
+
/**
|
|
8
|
+
* Builds a factory error.
|
|
9
|
+
* @param {string} message - Human readable description of the failure.
|
|
10
|
+
*/
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = this.constructor.name;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Raised when a factory, trait or sequence is declared twice within the same
|
|
18
|
+
* registry, matching FactoryBot's duplicate-definition guard.
|
|
19
|
+
*/
|
|
20
|
+
class DuplicateDefinitionError extends FactoryError {
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Raised when a strategy references a factory name that was never registered.
|
|
24
|
+
*/
|
|
25
|
+
class UndefinedFactoryError extends FactoryError {
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Raised when a trait name cannot be resolved in the factory-local or global scope.
|
|
29
|
+
*/
|
|
30
|
+
class UndefinedTraitError extends FactoryError {
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Raised when a sequence name cannot be resolved in the factory-local or global scope.
|
|
34
|
+
*/
|
|
35
|
+
class UndefinedSequenceError extends FactoryError {
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Raised when a lazy attribute references another attribute that does not exist.
|
|
39
|
+
*/
|
|
40
|
+
class UndefinedAttributeError extends FactoryError {
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Raised when attribute or factory/trait resolution forms a cycle. The message
|
|
44
|
+
* always contains the full offending path so the author can break it.
|
|
45
|
+
*/
|
|
46
|
+
class FactoryCycleError extends FactoryError {
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Raised when a definition is structurally invalid at declaration time (bad
|
|
50
|
+
* names, option shapes, event names, or model references).
|
|
51
|
+
*/
|
|
52
|
+
class InvalidDefinitionError extends FactoryError {
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Raised when a build/create strategy is asked to construct a class that is not a
|
|
56
|
+
* supported, initialized Velocious backend record.
|
|
57
|
+
*/
|
|
58
|
+
class ModelContractError extends FactoryError {
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Raised when setup-time mutation (define/modify/reset/sequence set/rewind) is
|
|
62
|
+
* attempted while the registry has in-flight evaluations.
|
|
63
|
+
*/
|
|
64
|
+
class RegistryBusyError extends FactoryError {
|
|
65
|
+
}
|
|
66
|
+
export { DuplicateDefinitionError, FactoryCycleError, FactoryError, InvalidDefinitionError, ModelContractError, RegistryBusyError, UndefinedAttributeError, UndefinedFactoryError, UndefinedSequenceError, UndefinedTraitError };
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rlc3RpbmcvZmFjdG9yeS9lcnJvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7R0FHRztBQUNILE1BQU0sWUFBYSxTQUFRLEtBQUs7SUFDOUI7OztPQUdHO0lBQ0gsWUFBWSxPQUFPO1FBQ2pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUE7SUFDbkMsQ0FBQztDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSx3QkFBeUIsU0FBUSxZQUFZO0NBQUc7QUFFdEQ7O0dBRUc7QUFDSCxNQUFNLHFCQUFzQixTQUFRLFlBQVk7Q0FBRztBQUVuRDs7R0FFRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsWUFBWTtDQUFHO0FBRWpEOztHQUVHO0FBQ0gsTUFBTSxzQkFBdUIsU0FBUSxZQUFZO0NBQUc7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLHVCQUF3QixTQUFRLFlBQVk7Q0FBRztBQUVyRDs7O0dBR0c7QUFDSCxNQUFNLGlCQUFrQixTQUFRLFlBQVk7Q0FBRztBQUUvQzs7O0dBR0c7QUFDSCxNQUFNLHNCQUF1QixTQUFRLFlBQVk7Q0FBRztBQUVwRDs7O0dBR0c7QUFDSCxNQUFNLGtCQUFtQixTQUFRLFlBQVk7Q0FBRztBQUVoRDs7O0dBR0c7QUFDSCxNQUFNLGlCQUFrQixTQUFRLFlBQVk7Q0FBRztBQUUvQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ3BCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBCYXNlIGVycm9yIGZvciBldmVyeSBGYWN0b3J5LWZyYW1ld29yayBmYWlsdXJlIHNvIGNhbGxlcnMgY2FuIGNhdGNoIHRoZSB3aG9sZVxuICogZmFtaWx5IHdpdGggYSBzaW5nbGUgYGluc3RhbmNlb2YgRmFjdG9yeUVycm9yYCBjaGVjay5cbiAqL1xuY2xhc3MgRmFjdG9yeUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQnVpbGRzIGEgZmFjdG9yeSBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBIdW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmFpbHVyZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZVxuICB9XG59XG5cbi8qKlxuICogUmFpc2VkIHdoZW4gYSBmYWN0b3J5LCB0cmFpdCBvciBzZXF1ZW5jZSBpcyBkZWNsYXJlZCB0d2ljZSB3aXRoaW4gdGhlIHNhbWVcbiAqIHJlZ2lzdHJ5LCBtYXRjaGluZyBGYWN0b3J5Qm90J3MgZHVwbGljYXRlLWRlZmluaXRpb24gZ3VhcmQuXG4gKi9cbmNsYXNzIER1cGxpY2F0ZURlZmluaXRpb25FcnJvciBleHRlbmRzIEZhY3RvcnlFcnJvciB7fVxuXG4vKipcbiAqIFJhaXNlZCB3aGVuIGEgc3RyYXRlZ3kgcmVmZXJlbmNlcyBhIGZhY3RvcnkgbmFtZSB0aGF0IHdhcyBuZXZlciByZWdpc3RlcmVkLlxuICovXG5jbGFzcyBVbmRlZmluZWRGYWN0b3J5RXJyb3IgZXh0ZW5kcyBGYWN0b3J5RXJyb3Ige31cblxuLyoqXG4gKiBSYWlzZWQgd2hlbiBhIHRyYWl0IG5hbWUgY2Fubm90IGJlIHJlc29sdmVkIGluIHRoZSBmYWN0b3J5LWxvY2FsIG9yIGdsb2JhbCBzY29wZS5cbiAqL1xuY2xhc3MgVW5kZWZpbmVkVHJhaXRFcnJvciBleHRlbmRzIEZhY3RvcnlFcnJvciB7fVxuXG4vKipcbiAqIFJhaXNlZCB3aGVuIGEgc2VxdWVuY2UgbmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gdGhlIGZhY3RvcnktbG9jYWwgb3IgZ2xvYmFsIHNjb3BlLlxuICovXG5jbGFzcyBVbmRlZmluZWRTZXF1ZW5jZUVycm9yIGV4dGVuZHMgRmFjdG9yeUVycm9yIHt9XG5cbi8qKlxuICogUmFpc2VkIHdoZW4gYSBsYXp5IGF0dHJpYnV0ZSByZWZlcmVuY2VzIGFub3RoZXIgYXR0cmlidXRlIHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmNsYXNzIFVuZGVmaW5lZEF0dHJpYnV0ZUVycm9yIGV4dGVuZHMgRmFjdG9yeUVycm9yIHt9XG5cbi8qKlxuICogUmFpc2VkIHdoZW4gYXR0cmlidXRlIG9yIGZhY3RvcnkvdHJhaXQgcmVzb2x1dGlvbiBmb3JtcyBhIGN5Y2xlLiBUaGUgbWVzc2FnZVxuICogYWx3YXlzIGNvbnRhaW5zIHRoZSBmdWxsIG9mZmVuZGluZyBwYXRoIHNvIHRoZSBhdXRob3IgY2FuIGJyZWFrIGl0LlxuICovXG5jbGFzcyBGYWN0b3J5Q3ljbGVFcnJvciBleHRlbmRzIEZhY3RvcnlFcnJvciB7fVxuXG4vKipcbiAqIFJhaXNlZCB3aGVuIGEgZGVmaW5pdGlvbiBpcyBzdHJ1Y3R1cmFsbHkgaW52YWxpZCBhdCBkZWNsYXJhdGlvbiB0aW1lIChiYWRcbiAqIG5hbWVzLCBvcHRpb24gc2hhcGVzLCBldmVudCBuYW1lcywgb3IgbW9kZWwgcmVmZXJlbmNlcykuXG4gKi9cbmNsYXNzIEludmFsaWREZWZpbml0aW9uRXJyb3IgZXh0ZW5kcyBGYWN0b3J5RXJyb3Ige31cblxuLyoqXG4gKiBSYWlzZWQgd2hlbiBhIGJ1aWxkL2NyZWF0ZSBzdHJhdGVneSBpcyBhc2tlZCB0byBjb25zdHJ1Y3QgYSBjbGFzcyB0aGF0IGlzIG5vdCBhXG4gKiBzdXBwb3J0ZWQsIGluaXRpYWxpemVkIFZlbG9jaW91cyBiYWNrZW5kIHJlY29yZC5cbiAqL1xuY2xhc3MgTW9kZWxDb250cmFjdEVycm9yIGV4dGVuZHMgRmFjdG9yeUVycm9yIHt9XG5cbi8qKlxuICogUmFpc2VkIHdoZW4gc2V0dXAtdGltZSBtdXRhdGlvbiAoZGVmaW5lL21vZGlmeS9yZXNldC9zZXF1ZW5jZSBzZXQvcmV3aW5kKSBpc1xuICogYXR0ZW1wdGVkIHdoaWxlIHRoZSByZWdpc3RyeSBoYXMgaW4tZmxpZ2h0IGV2YWx1YXRpb25zLlxuICovXG5jbGFzcyBSZWdpc3RyeUJ1c3lFcnJvciBleHRlbmRzIEZhY3RvcnlFcnJvciB7fVxuXG5leHBvcnQge1xuICBEdXBsaWNhdGVEZWZpbml0aW9uRXJyb3IsXG4gIEZhY3RvcnlDeWNsZUVycm9yLFxuICBGYWN0b3J5RXJyb3IsXG4gIEludmFsaWREZWZpbml0aW9uRXJyb3IsXG4gIE1vZGVsQ29udHJhY3RFcnJvcixcbiAgUmVnaXN0cnlCdXN5RXJyb3IsXG4gIFVuZGVmaW5lZEF0dHJpYnV0ZUVycm9yLFxuICBVbmRlZmluZWRGYWN0b3J5RXJyb3IsXG4gIFVuZGVmaW5lZFNlcXVlbmNlRXJyb3IsXG4gIFVuZGVmaW5lZFRyYWl0RXJyb3Jcbn1cbiJdfQ==
|