velocious 1.0.279 → 1.0.280

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 CHANGED
@@ -4,6 +4,7 @@
4
4
  * Database framework with familiar MVC concepts
5
5
  * Database models with migrations and validations
6
6
  * Database models that work almost the same in frontend and backend
7
+ * Declarative state machines for models (see [docs/state-machine.md](docs/state-machine.md))
7
8
  * Migrations for schema changes
8
9
  * Controllers and views for HTTP endpoints
9
10
 
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Registers a state machine on a Velocious model class.
3
+ *
4
+ * Usage:
5
+ * ```js
6
+ * import {stateMachine} from "velocious/build/src/database/record/state-machine.js"
7
+ *
8
+ * class Build extends BuildBase {}
9
+ *
10
+ * stateMachine(Build, {
11
+ * column: "status",
12
+ * initial: "new",
13
+ * states: {
14
+ * new: {},
15
+ * queued: {beforeEnter: (build) => { build.setQueuedAt(new Date()) }},
16
+ * running: {beforeEnter: (build) => { build.setStartedAt(new Date()) }},
17
+ * failed: {beforeEnter: (build) => { build.setEndedAt(new Date()) }},
18
+ * succeeded: {beforeEnter: (build) => { build.setEndedAt(new Date()) }}
19
+ * },
20
+ * events: {
21
+ * queue: {from: "new", to: "queued"},
22
+ * run: {from: ["new", "queued", "crashed"], to: "running"},
23
+ * fail: {from: ["new", "queued", "running"], to: "failed"},
24
+ * succeed: {from: "running", to: "succeeded"},
25
+ * cancel: {from: ["new", "queued", "running"], to: "cancelled", guard: (build) => !build.isNewRecord()}
26
+ * }
27
+ * })
28
+ * ```
29
+ *
30
+ * @param {typeof import("./index.js").default} ModelClass - The model class to add state machine behavior to.
31
+ * @param {StateMachineDefinition} definition - The state machine definition.
32
+ * @returns {void}
33
+ */
34
+ export function stateMachine(ModelClass: typeof import("./index.js").default, definition: StateMachineDefinition): void;
35
+ export type StateMachineDefinition = {
36
+ column?: string;
37
+ initial: string;
38
+ states: Record<string, StateDefinition>;
39
+ events: Record<string, EventDefinition>;
40
+ };
41
+ export type StateDefinition = {
42
+ beforeEnter?: (model: import("./index.js").default) => void | Promise<void>;
43
+ afterEnter?: (model: import("./index.js").default) => void | Promise<void>;
44
+ };
45
+ export type EventDefinition = {
46
+ from: string | string[];
47
+ to: string;
48
+ guard?: (model: import("./index.js").default) => boolean | Promise<boolean>;
49
+ before?: (model: import("./index.js").default) => void | Promise<void>;
50
+ after?: (model: import("./index.js").default) => void | Promise<void>;
51
+ };
52
+ //# sourceMappingURL=state-machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../../../../src/database/record/state-machine.js"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,yCAJW,cAAc,YAAY,EAAE,OAAO,cACnC,sBAAsB,GACpB,IAAI,CA6LhB;qCApPY;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CACxC;8BAES;IACR,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,YAAY,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,YAAY,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3E;8BAES;IACR,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,YAAY,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,YAAY,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,YAAY,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE"}
@@ -0,0 +1,205 @@
1
+ // @ts-check
2
+ /**
3
+ * @typedef {{
4
+ * column?: string,
5
+ * initial: string,
6
+ * states: Record<string, StateDefinition>,
7
+ * events: Record<string, EventDefinition>
8
+ * }} StateMachineDefinition
9
+ *
10
+ * @typedef {{
11
+ * beforeEnter?: (model: import("./index.js").default) => void | Promise<void>,
12
+ * afterEnter?: (model: import("./index.js").default) => void | Promise<void>
13
+ * }} StateDefinition
14
+ *
15
+ * @typedef {{
16
+ * from: string | string[],
17
+ * to: string,
18
+ * guard?: (model: import("./index.js").default) => boolean | Promise<boolean>,
19
+ * before?: (model: import("./index.js").default) => void | Promise<void>,
20
+ * after?: (model: import("./index.js").default) => void | Promise<void>
21
+ * }} EventDefinition
22
+ */
23
+ /** @type {string} */
24
+ const PENDING_TRANSITION_KEY = "_stateMachinePendingTransition";
25
+ /**
26
+ * Registers a state machine on a Velocious model class.
27
+ *
28
+ * Usage:
29
+ * ```js
30
+ * import {stateMachine} from "velocious/build/src/database/record/state-machine.js"
31
+ *
32
+ * class Build extends BuildBase {}
33
+ *
34
+ * stateMachine(Build, {
35
+ * column: "status",
36
+ * initial: "new",
37
+ * states: {
38
+ * new: {},
39
+ * queued: {beforeEnter: (build) => { build.setQueuedAt(new Date()) }},
40
+ * running: {beforeEnter: (build) => { build.setStartedAt(new Date()) }},
41
+ * failed: {beforeEnter: (build) => { build.setEndedAt(new Date()) }},
42
+ * succeeded: {beforeEnter: (build) => { build.setEndedAt(new Date()) }}
43
+ * },
44
+ * events: {
45
+ * queue: {from: "new", to: "queued"},
46
+ * run: {from: ["new", "queued", "crashed"], to: "running"},
47
+ * fail: {from: ["new", "queued", "running"], to: "failed"},
48
+ * succeed: {from: "running", to: "succeeded"},
49
+ * cancel: {from: ["new", "queued", "running"], to: "cancelled", guard: (build) => !build.isNewRecord()}
50
+ * }
51
+ * })
52
+ * ```
53
+ *
54
+ * @param {typeof import("./index.js").default} ModelClass - The model class to add state machine behavior to.
55
+ * @param {StateMachineDefinition} definition - The state machine definition.
56
+ * @returns {void}
57
+ */
58
+ export function stateMachine(ModelClass, definition) {
59
+ const column = definition.column || "state";
60
+ const stateNames = Object.keys(definition.states);
61
+ // Store definition on the model class for introspection
62
+ /** @type {any} */
63
+ const dynamicClass = ModelClass;
64
+ dynamicClass._stateMachineDefinition = definition;
65
+ dynamicClass._stateMachineColumn = column;
66
+ /** @returns {StateMachineDefinition} - The registered state machine definition. */
67
+ dynamicClass.getStateMachineDefinition = function () {
68
+ return dynamicClass._stateMachineDefinition;
69
+ };
70
+ /** @returns {string} - The column name used for state storage. */
71
+ dynamicClass.getStateMachineColumn = function () {
72
+ return dynamicClass._stateMachineColumn;
73
+ };
74
+ /** @returns {string[]} - All declared state names. */
75
+ dynamicClass.getStateMachineStateNames = function () {
76
+ return stateNames;
77
+ };
78
+ // Register event methods and guard methods on the prototype
79
+ /** @type {any} */
80
+ const proto = ModelClass.prototype;
81
+ for (const [eventName, eventDef] of Object.entries(definition.events)) {
82
+ const fromStates = Array.isArray(eventDef.from) ? eventDef.from : [eventDef.from];
83
+ const capitalizedEvent = eventName.charAt(0).toUpperCase() + eventName.slice(1);
84
+ const canMethodName = `can${capitalizedEvent}`;
85
+ const setterName = columnSetterName(column);
86
+ // Guard method: canQueue(), canRun(), etc.
87
+ proto[canMethodName] = function () {
88
+ const currentState = this.readAttribute(column);
89
+ if (!fromStates.includes(currentState)) {
90
+ return false;
91
+ }
92
+ if (eventDef.guard) {
93
+ const guardResult = eventDef.guard(this);
94
+ if (guardResult instanceof Promise) {
95
+ throw new Error(`Guard for event "${eventName}" returned a Promise. Use await model.can${capitalizedEvent}Async() instead.`);
96
+ }
97
+ return guardResult;
98
+ }
99
+ return true;
100
+ };
101
+ // Async guard method: canQueueAsync(), canRunAsync(), etc.
102
+ proto[`${canMethodName}Async`] = async function () {
103
+ const currentState = this.readAttribute(column);
104
+ if (!fromStates.includes(currentState)) {
105
+ return false;
106
+ }
107
+ if (eventDef.guard) {
108
+ return await eventDef.guard(this);
109
+ }
110
+ return true;
111
+ };
112
+ // Transition method: queue(), run(), etc. — checks guard, sets the state, stashes event name
113
+ proto[eventName] = function () {
114
+ /** @type {any} */
115
+ const self = this;
116
+ const currentState = self.readAttribute(column);
117
+ if (!fromStates.includes(currentState)) {
118
+ throw new Error(`Cannot transition "${eventName}" from "${currentState}" on ${self.getModelClass().name}. ` +
119
+ `Allowed source states: ${fromStates.join(", ")}`);
120
+ }
121
+ // Enforce synchronous guard before mutating state
122
+ if (eventDef.guard) {
123
+ const guardResult = eventDef.guard(self);
124
+ if (guardResult instanceof Promise) {
125
+ throw new Error(`Guard for event "${eventName}" returned a Promise. Use await model.${eventName}AndSave() for async guards.`);
126
+ }
127
+ if (!guardResult) {
128
+ throw new Error(`Guard rejected transition "${eventName}" from "${currentState}" on ${self.getModelClass().name}.`);
129
+ }
130
+ }
131
+ // Stash the transition so beforeSave/afterSave know which event was invoked
132
+ self[PENDING_TRANSITION_KEY] = { eventName, from: currentState, to: eventDef.to };
133
+ self[setterName](eventDef.to);
134
+ };
135
+ // Bang method: queueAndSave(), runAndSave(), etc. — transitions AND saves (supports async guards)
136
+ proto[`${eventName}AndSave`] = async function () {
137
+ /** @type {any} */
138
+ const self = this;
139
+ const currentState = self.readAttribute(column);
140
+ if (!fromStates.includes(currentState)) {
141
+ throw new Error(`Cannot transition "${eventName}" from "${currentState}" on ${self.getModelClass().name}. ` +
142
+ `Allowed source states: ${fromStates.join(", ")}`);
143
+ }
144
+ // Enforce async guard before mutating state
145
+ if (eventDef.guard) {
146
+ const allowed = await eventDef.guard(self);
147
+ if (!allowed) {
148
+ throw new Error(`Guard rejected transition "${eventName}" from "${currentState}" on ${self.getModelClass().name}.`);
149
+ }
150
+ }
151
+ self[PENDING_TRANSITION_KEY] = { eventName, from: currentState, to: eventDef.to };
152
+ self[setterName](eventDef.to);
153
+ await self.save();
154
+ };
155
+ }
156
+ // Register a beforeSave callback that fires state-enter hooks
157
+ ModelClass.beforeSave(async function (model) {
158
+ /** @type {any} */
159
+ const dynamicModel = model;
160
+ const pending = dynamicModel[PENDING_TRANSITION_KEY];
161
+ if (!pending) {
162
+ return;
163
+ }
164
+ const eventDef = definition.events[pending.eventName];
165
+ // Run event-level before callback
166
+ if (eventDef?.before) {
167
+ await eventDef.before(model);
168
+ }
169
+ // Run state-level beforeEnter callback
170
+ const stateDefinition = definition.states[pending.to];
171
+ if (stateDefinition?.beforeEnter) {
172
+ await stateDefinition.beforeEnter(model);
173
+ }
174
+ });
175
+ // Register an afterSave callback for afterEnter hooks
176
+ ModelClass.afterSave(async function (model) {
177
+ /** @type {any} */
178
+ const dynamicModel = model;
179
+ const pending = dynamicModel[PENDING_TRANSITION_KEY];
180
+ if (!pending) {
181
+ return;
182
+ }
183
+ // Clear the pending transition now that save is complete
184
+ dynamicModel[PENDING_TRANSITION_KEY] = null;
185
+ // Run state-level afterEnter callback
186
+ const stateDefinition = definition.states[pending.to];
187
+ if (stateDefinition?.afterEnter) {
188
+ await stateDefinition.afterEnter(model);
189
+ }
190
+ // Run event-level after callback
191
+ const eventDef = definition.events[pending.eventName];
192
+ if (eventDef?.after) {
193
+ await eventDef.after(model);
194
+ }
195
+ });
196
+ }
197
+ /**
198
+ * Returns the setter method name for a column (e.g., "status" → "setStatus", "state" → "setState").
199
+ * @param {string} column - The column name.
200
+ * @returns {string} - The setter method name.
201
+ */
202
+ function columnSetterName(column) {
203
+ return `set${column.charAt(0).toUpperCase()}${column.slice(1)}`;
204
+ }
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtbWFjaGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9yZWNvcmQvc3RhdGUtbWFjaGluZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgscUJBQXFCO0FBQ3JCLE1BQU0sc0JBQXNCLEdBQUcsZ0NBQWdDLENBQUE7QUFFL0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxVQUFVLEVBQUUsVUFBVTtJQUNqRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQTtJQUMzQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUVqRCx3REFBd0Q7SUFDeEQsa0JBQWtCO0lBQ2xCLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQTtJQUUvQixZQUFZLENBQUMsdUJBQXVCLEdBQUcsVUFBVSxDQUFBO0lBQ2pELFlBQVksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUE7SUFFekMsbUZBQW1GO0lBQ25GLFlBQVksQ0FBQyx5QkFBeUIsR0FBRztRQUN2QyxPQUFPLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQTtJQUM3QyxDQUFDLENBQUE7SUFFRCxrRUFBa0U7SUFDbEUsWUFBWSxDQUFDLHFCQUFxQixHQUFHO1FBQ25DLE9BQU8sWUFBWSxDQUFDLG1CQUFtQixDQUFBO0lBQ3pDLENBQUMsQ0FBQTtJQUVELHNEQUFzRDtJQUN0RCxZQUFZLENBQUMseUJBQXlCLEdBQUc7UUFDdkMsT0FBTyxVQUFVLENBQUE7SUFDbkIsQ0FBQyxDQUFBO0lBRUQsNERBQTREO0lBQzVELGtCQUFrQjtJQUNsQixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFBO0lBRWxDLEtBQUssTUFBTSxD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UUFDeEMsa0JBQWtCO1FBQ2xCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQTtRQUMxQixNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtRQUVwRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFNO1FBQ1IsQ0FBQztRQUVELHlEQUF5RDtRQUN6RCxZQUFZLENBQUMsc0JBQXNCLENBQUMsR0FBRyxJQUFJLENBQUE7UUFFM0Msc0NBQXNDO1FBQ3RDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRXJELElBQUksZUFBZSxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sZUFBZSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN6QyxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRXJELElBQUksUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3BCLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM3QixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsTUFBTTtJQUM5QixPQUFPLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGNvbHVtbj86IHN0cmluZyxcbiAqICAgaW5pdGlhbDogc3RyaW5nLFxuICogICBzdGF0ZXM6IFJlY29yZDxzdHJpbmcsIFN0YXRlRGVmaW5pdGlvbj4sXG4gKiAgIGV2ZW50czogUmVjb3JkPHN0cmluZywgRXZlbnREZWZpbml0aW9uPlxuICogfX0gU3RhdGVNYWNoaW5lRGVmaW5pdGlvblxuICpcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGJlZm9yZUVudGVyPzogKG1vZGVsOiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LFxuICogICBhZnRlckVudGVyPzogKG1vZGVsOiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+XG4gKiB9fSBTdGF0ZURlZmluaXRpb25cbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICBmcm9tOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAqICAgdG86IHN0cmluZyxcbiAqICAgZ3VhcmQ/OiAobW9kZWw6IGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4sXG4gKiAgIGJlZm9yZT86IChtb2RlbDogaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbiAqICAgYWZ0ZXI/OiAobW9kZWw6IGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5cbiAqIH19IEV2ZW50RGVmaW5pdGlvblxuICovXG5cbi8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuY29uc3QgUEVORElOR19UUkFOU0lUSU9OX0tFWSA9IFwiX3N0YXRlTWFjaGluZVBlbmRpbmdUcmFuc2l0aW9uXCJcblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBzdGF0ZSBtYWNoaW5lIG9uIGEgVmVsb2Npb3VzIG1vZGVsIGNsYXNzLlxuICpcbiAqIFVzYWdlOlxuICogYGBganNcbiAqIGltcG9ydCB7c3RhdGVNYWNoaW5lfSBmcm9tIFwidmVsb2Npb3VzL2J1aWxkL3NyYy9kYXRhYmFzZS9yZWNvcmQvc3RhdGUtbWFjaGluZS5qc1wiXG4gKlxuICogY2xhc3MgQnVpbGQgZXh0ZW5kcyBCdWlsZEJhc2Uge31cbiAqXG4gKiBzdGF0ZU1hY2hpbmUoQnVpbGQsIHtcbiAqICAgY29sdW1uOiBcInN0YXR1c1wiLFxuICogICBpbml0aWFsOiBcIm5ld1wiLFxuICogICBzdGF0ZXM6IHtcbiAqICAgICBuZXc6IHt9LFxuICogICAgIHF1ZXVlZDoge2JlZm9yZUVudGVyOiAoYnVpbGQpID0+IHsgYnVpbGQuc2V0UXVldWVkQXQobmV3IERhdGUoKSkgfX0sXG4gKiAgICAgcnVubmluZzoge2JlZm9yZUVudGVyOiAoYnVpbGQpID0+IHsgYnVpbGQuc2V0U3RhcnRlZEF0KG5ldyBEYXRlKCkpIH19LFxuICogICAgIGZhaWxlZDoge2JlZm9yZUVudGVyOiAoYnVpbGQpID0+IHsgYnVpbGQuc2V0RW5kZWRBdChuZXcgRGF0ZSgpKSB9fSxcbiAqICAgICBzdWNjZWVkZWQ6IHtiZWZvcmVFbnRlcjogKGJ1aWxkKSA9PiB7IGJ1aWxkLnNldEVuZGVkQXQobmV3IERhdGUoKSkgfX1cbiAqICAgfSxcbiAqICAgZXZlbnRzOiB7XG4gKiAgICAgcXVldWU6IHtmcm9tOiBcIm5ld1wiLCB0bzogXCJxdWV1ZWRcIn0sXG4gKiAgICAgcnVuOiB7ZnJvbTogW1wibmV3XCIsIFwicXVldWVkXCIsIFwiY3Jhc2hlZFwiXSwgdG86IFwicnVubmluZ1wifSxcbiAqICAgICBmYWlsOiB7ZnJvbTogW1wibmV3XCIsIFwicXVldWVkXCIsIFwicnVubmluZ1wiXSwgdG86IFwiZmFpbGVkXCJ9LFxuICogICAgIHN1Y2NlZWQ6IHtmcm9tOiBcInJ1bm5pbmdcIiwgdG86IFwic3VjY2VlZGVkXCJ9LFxuICogICAgIGNhbmNlbDoge2Zyb206IFtcIm5ld1wiLCBcInF1ZXVlZFwiLCBcInJ1bm5pbmdcIl0sIHRvOiBcImNhbmNlbGxlZFwiLCBndWFyZDogKGJ1aWxkKSA9PiAhYnVpbGQuaXNOZXdSZWNvcmQoKX1cbiAqICAgfVxuICogfSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gTW9kZWxDbGFzcyAtIFRoZSBtb2RlbCBjbGFzcyB0byBhZGQgc3RhdGUgbWFjaGluZSBiZWhhdmlvciB0by5cbiAqIEBwYXJhbSB7U3RhdGVNYWNoaW5lRGVmaW5pdGlvbn0gZGVmaW5pdGlvbiAtIFRoZSBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXRlTWFjaGluZShNb2RlbENsYXNzLCBkZWZpbml0aW9uKSB7XG4gIGNvbnN0IGNvbHVtbiA9IGRlZmluaXRpb24uY29sdW1uIHx8IFwic3RhdGVcIlxuICBjb25zdCBzdGF0ZU5hbWVzID0gT2JqZWN0LmtleXMoZGVmaW5pdGlvbi5zdGF0ZXMpXG5cbiAgLy8gU3RvcmUgZGVmaW5pdGlvbiBvbiB0aGUgbW9kZWwgY2xhc3MgZm9yIGludHJvc3BlY3Rpb25cbiAgLyoqIEB0eXBlIHthbnl9ICovXG4gIGNvbnN0IGR5bmFtaWNDbGFzcyA9IE1vZGVsQ2xhc3NcblxuICBkeW5hbWljQ2xhc3MuX3N0YXRlTWFjaGluZURlZmluaXRpb24gPSBkZWZpbml0aW9uXG4gIGR5bmFtaWNDbGFzcy5fc3RhdGVNYWNoaW5lQ29sdW1uID0gY29sdW1uXG5cbiAgLyoqIEByZXR1cm5zIHtTdGF0ZU1hY2hpbmVEZWZpbml0aW9ufSAtIFRoZSByZWdpc3RlcmVkIHN0YXRlIG1hY2hpbmUgZGVmaW5pdGlvbi4gKi9cbiAgZHluYW1pY0NsYXNzLmdldFN0YXRlTWFjaGluZURlZmluaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGR5bmFtaWNDbGFzcy5fc3RhdGVNYWNoaW5lRGVmaW5pdGlvblxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGNvbHVtbiBuYW1lIHVzZWQgZm9yIHN0YXRlIHN0b3JhZ2UuICovXG4gIGR5bmFtaWNDbGFzcy5nZXRTdGF0ZU1hY2hpbmVDb2x1bW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGR5bmFtaWNDbGFzcy5fc3RhdGVNYWNoaW5lQ29sdW1uXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ1tdfSAtIEFsbCBkZWNsYXJlZCBzdGF0ZSBuYW1lcy4gKi9cbiAgZHluYW1pY0NsYXNzLmdldFN0YXRlTWFjaGluZVN0YXRlTmFtZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHN0YXRlTmFtZXNcbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIGV2ZW50IG1ldGhvZHMgYW5kIGd1YXJkIG1ldGhvZHMgb24gdGhlIHByb3RvdHlwZVxuICAvKiogQHR5cGUge2FueX0gKi9cbiAgY29uc3QgcHJvdG8gPSBNb2RlbENsYXNzLnByb3RvdHlwZVxuXG4gIGZvciAoY29uc3QgW2V2ZW50TmFtZSwgZXZlbnREZWZdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb24uZXZlbnRzKSkge1xuICAgIGNvbnN0IGZyb21TdGF0ZXMgPSBBcnJheS5pc0FycmF5KGV2ZW50RGVmLmZyb20pID8gZXZlbnREZWYuZnJvbSA6IFtldmVudERlZi5mcm9tXVxuICAgIGNvbnN0IGNhcGl0YWxpemVkRXZlbnQgPSBldmVudE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICBjb25zdCBjYW5NZXRob2ROYW1lID0gYGNhbiR7Y2FwaXRhbGl6ZWRFdmVudH1gXG4gICAgY29uc3Qgc2V0dGVyTmFtZSA9IGNvbHVtblNldHRlck5hbWUoY29sdW1uKVxuXG4gICAgLy8gR3VhcmQgbWV0aG9kOiBjYW5RdWV1ZSgpLCBjYW5SdW4oKSwgZXRjLlxuICAgIHByb3RvW2Nhbk1ldGhvZE5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5yZWFkQXR0cmlidXRlKGNvbHVtbilcblxuICAgICAgaWYgKCFmcm9tU3RhdGVzLmluY2x1ZGVzKGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudERlZi5ndWFyZCkge1xuICAgICAgICBjb25zdCBndWFyZFJlc3VsdCA9IGV2ZW50RGVmLmd1YXJkKHRoaXMpXG5cbiAgICAgICAgaWYgKGd1YXJkUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR3VhcmQgZm9yIGV2ZW50IFwiJHtldmVudE5hbWV9XCIgcmV0dXJuZWQgYSBQcm9taXNlLiBVc2UgYXdhaXQgbW9kZWwuY2FuJHtjYXBpdGFsaXplZEV2ZW50fUFzeW5jKCkgaW5zdGVhZC5gKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGd1YXJkUmVzdWx0XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gQXN5bmMgZ3VhcmQgbWV0aG9kOiBjYW5RdWV1ZUFzeW5jKCksIGNhblJ1bkFzeW5jKCksIGV0Yy5cbiAgICBwcm90b1tgJHtjYW5NZXRob2ROYW1lfUFzeW5jYF0gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnJlYWRBdHRyaWJ1dGUoY29sdW1uKVxuXG4gICAgICBpZiAoIWZyb21TdGF0ZXMuaW5jbHVkZXMoY3VycmVudFN0YXRlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50RGVmLmd1YXJkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBldmVudERlZi5ndWFyZCh0aGlzKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIFRyYW5zaXRpb24gbWV0aG9kOiBxdWV1ZSgpLCBydW4oKSwgZXRjLiDigJQgY2hlY2tzIGd1YXJkLCBzZXRzIHRoZSBzdGF0ZSwgc3Rhc2hlcyBldmVudCBuYW1lXG4gICAgcHJvdG9bZXZlbnROYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKiBAdHlwZSB7YW55fSAqL1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHNlbGYucmVhZEF0dHJpYnV0ZShjb2x1bW4pXG5cbiAgICAgIGlmICghZnJvbVN0YXRlcy5pbmNsdWRlcyhjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHRyYW5zaXRpb24gXCIke2V2ZW50TmFtZX1cIiBmcm9tIFwiJHtjdXJyZW50U3RhdGV9XCIgb24gJHtzZWxmLmdldE1vZGVsQ2xhc3MoKS5uYW1lfS4gYCArXG4gICAgICAgICAgYEFsbG93ZWQgc291cmNlIHN0YXRlczogJHtmcm9tU3RhdGVzLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gRW5mb3JjZSBzeW5jaHJvbm91cyBndWFyZCBiZWZvcmUgbXV0YXRpbmcgc3RhdGVcbiAgICAgIGlmIChldmVudERlZi5ndWFyZCkge1xuICAgICAgICBjb25zdCBndWFyZFJlc3VsdCA9IGV2ZW50RGVmLmd1YXJkKHNlbGYpXG5cbiAgICAgICAgaWYgKGd1YXJkUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR3VhcmQgZm9yIGV2ZW50IFwiJHtldmVudE5hbWV9XCIgcmV0dXJuZWQgYSBQcm9taXNlLiBVc2UgYXdhaXQgbW9kZWwuJHtldmVudE5hbWV9QW5kU2F2ZSgpIGZvciBhc3luYyBndWFyZHMuYClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZ3VhcmRSZXN1bHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgR3VhcmQgcmVqZWN0ZWQgdHJhbnNpdGlvbiBcIiR7ZXZlbnROYW1lfVwiIGZyb20gXCIke2N1cnJlbnRTdGF0ZX1cIiBvbiAke3NlbGYuZ2V0TW9kZWxDbGFzcygpLm5hbWV9LmBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3Rhc2ggdGhlIHRyYW5zaXRpb24gc28gYmVmb3JlU2F2ZS9hZnRlclNhdmUga25vdyB3aGljaCBldmVudCB3YXMgaW52b2tlZFxuICAgICAgc2VsZltQRU5ESU5HX1RSQU5TSVRJT05fS0VZXSA9IHtldmVudE5hbWUsIGZyb206IGN1cnJlbnRTdGF0ZSwgdG86IGV2ZW50RGVmLnRvfVxuICAgICAgc2VsZltzZXR0ZXJOYW1lXShldmVudERlZi50bylcbiAgICB9XG5cbiAgICAvLyBCYW5nIG1ldGhvZDogcXVldWVBbmRTYXZlKCksIHJ1bkFuZFNhdmUoKSwgZXRjLiDigJQgdHJhbnNpdGlvbnMgQU5EIHNhdmVzIChzdXBwb3J0cyBhc3luYyBndWFyZHMpXG4gICAgcHJvdG9bYCR7ZXZlbnROYW1lfUFuZFNhdmVgXSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKiBAdHlwZSB7YW55fSAqL1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHNlbGYucmVhZEF0dHJpYnV0ZShjb2x1bW4pXG5cbiAgICAgIGlmICghZnJvbVN0YXRlcy5pbmNsdWRlcyhjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHRyYW5zaXRpb24gXCIke2V2ZW50TmFtZX1cIiBmcm9tIFwiJHtjdXJyZW50U3RhdGV9XCIgb24gJHtzZWxmLmdldE1vZGVsQ2xhc3MoKS5uYW1lfS4gYCArXG4gICAgICAgICAgYEFsbG93ZWQgc291cmNlIHN0YXRlczogJHtmcm9tU3RhdGVzLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gRW5mb3JjZSBhc3luYyBndWFyZCBiZWZvcmUgbXV0YXRpbmcgc3RhdGVcbiAgICAgIGlmIChldmVudERlZi5ndWFyZCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gYXdhaXQgZXZlbnREZWYuZ3VhcmQoc2VsZilcblxuICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgR3VhcmQgcmVqZWN0ZWQgdHJhbnNpdGlvbiBcIiR7ZXZlbnROYW1lfVwiIGZyb20gXCIke2N1cnJlbnRTdGF0ZX1cIiBvbiAke3NlbGYuZ2V0TW9kZWxDbGFzcygpLm5hbWV9LmBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VsZltQRU5ESU5HX1RSQU5TSVRJT05fS0VZXSA9IHtldmVudE5hbWUsIGZyb206IGN1cnJlbnRTdGF0ZSwgdG86IGV2ZW50RGVmLnRvfVxuICAgICAgc2VsZltzZXR0ZXJOYW1lXShldmVudERlZi50bylcbiAgICAgIGF3YWl0IHNlbGYuc2F2ZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgYSBiZWZvcmVTYXZlIGNhbGxiYWNrIHRoYXQgZmlyZXMgc3RhdGUtZW50ZXIgaG9va3NcbiAgTW9kZWxDbGFzcy5iZWZvcmVTYXZlKGFzeW5jIGZ1bmN0aW9uIChtb2RlbCkge1xuICAgIC8qKiBAdHlwZSB7YW55fSAqL1xuICAgIGNvbnN0IGR5bmFtaWNNb2RlbCA9IG1vZGVsXG4gICAgY29uc3QgcGVuZGluZyA9IGR5bmFtaWNNb2RlbFtQRU5ESU5HX1RSQU5TSVRJT05fS0VZXVxuXG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBldmVudERlZiA9IGRlZmluaXRpb24uZXZlbnRzW3BlbmRpbmcuZXZlbnROYW1lXVxuXG4gICAgLy8gUnVuIGV2ZW50LWxldmVsIGJlZm9yZSBjYWxsYmFja1xuICAgIGlmIChldmVudERlZj8uYmVmb3JlKSB7XG4gICAgICBhd2FpdCBldmVudERlZi5iZWZvcmUobW9kZWwpXG4gICAgfVxuXG4gICAgLy8gUnVuIHN0YXRlLWxldmVsIGJlZm9yZUVudGVyIGNhbGxiYWNrXG4gICAgY29uc3Qgc3RhdGVEZWZpbml0aW9uID0gZGVmaW5pdGlvbi5zdGF0ZXNbcGVuZGluZy50b11cblxuICAgIGlmIChzdGF0ZURlZmluaXRpb24/LmJlZm9yZUVudGVyKSB7XG4gICAgICBhd2FpdCBzdGF0ZURlZmluaXRpb24uYmVmb3JlRW50ZXIobW9kZWwpXG4gICAgfVxuICB9KVxuXG4gIC8vIFJlZ2lzdGVyIGFuIGFmdGVyU2F2ZSBjYWxsYmFjayBmb3IgYWZ0ZXJFbnRlciBob29rc1xuICBNb2RlbENsYXNzLmFmdGVyU2F2ZShhc3luYyBmdW5jdGlvbiAobW9kZWwpIHtcbiAgICAvKiogQHR5cGUge2FueX0gKi9cbiAgICBjb25zdCBkeW5hbWljTW9kZWwgPSBtb2RlbFxuICAgIGNvbnN0IHBlbmRpbmcgPSBkeW5hbWljTW9kZWxbUEVORElOR19UUkFOU0lUSU9OX0tFWV1cblxuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgdGhlIHBlbmRpbmcgdHJhbnNpdGlvbiBub3cgdGhhdCBzYXZlIGlzIGNvbXBsZXRlXG4gICAgZHluYW1pY01vZGVsW1BFTkRJTkdfVFJBTlNJVElPTl9LRVldID0gbnVsbFxuXG4gICAgLy8gUnVuIHN0YXRlLWxldmVsIGFmdGVyRW50ZXIgY2FsbGJhY2tcbiAgICBjb25zdCBzdGF0ZURlZmluaXRpb24gPSBkZWZpbml0aW9uLnN0YXRlc1twZW5kaW5nLnRvXVxuXG4gICAgaWYgKHN0YXRlRGVmaW5pdGlvbj8uYWZ0ZXJFbnRlcikge1xuICAgICAgYXdhaXQgc3RhdGVEZWZpbml0aW9uLmFmdGVyRW50ZXIobW9kZWwpXG4gICAgfVxuXG4gICAgLy8gUnVuIGV2ZW50LWxldmVsIGFmdGVyIGNhbGxiYWNrXG4gICAgY29uc3QgZXZlbnREZWYgPSBkZWZpbml0aW9uLmV2ZW50c1twZW5kaW5nLmV2ZW50TmFtZV1cblxuICAgIGlmIChldmVudERlZj8uYWZ0ZXIpIHtcbiAgICAgIGF3YWl0IGV2ZW50RGVmLmFmdGVyKG1vZGVsKVxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzZXR0ZXIgbWV0aG9kIG5hbWUgZm9yIGEgY29sdW1uIChlLmcuLCBcInN0YXR1c1wiIOKGkiBcInNldFN0YXR1c1wiLCBcInN0YXRlXCIg4oaSIFwic2V0U3RhdGVcIikuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uIC0gVGhlIGNvbHVtbiBuYW1lLlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgc2V0dGVyIG1ldGhvZCBuYW1lLlxuICovXG5mdW5jdGlvbiBjb2x1bW5TZXR0ZXJOYW1lKGNvbHVtbikge1xuICByZXR1cm4gYHNldCR7Y29sdW1uLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7Y29sdW1uLnNsaWNlKDEpfWBcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/scheduler.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/where-base.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/user-module.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/frontend-model-resource/base-resource.js","../src/frontend-models/base.js","../src/frontend-models/model-registry.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/index.js","../src/http-server/server-client.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/testing/base-expect.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/format-value.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner.js","../src/utils/ensure-error.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/nest-callbacks.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.2"}
1
+ {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/scheduler.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/where-base.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/frontend-model-resource/base-resource.js","../src/frontend-models/base.js","../src/frontend-models/model-registry.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/index.js","../src/http-server/server-client.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/testing/base-expect.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/format-value.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner.js","../src/utils/ensure-error.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/nest-callbacks.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.2"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.279",
6
+ "version": "1.0.280",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [