velocious 1.0.395 → 1.0.397

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +33 -0
  2. package/build/src/background-jobs/job-runner.d.ts.map +1 -1
  3. package/build/src/background-jobs/job-runner.js +7 -2
  4. package/build/src/background-jobs/json-socket.d.ts +4 -0
  5. package/build/src/background-jobs/json-socket.d.ts.map +1 -1
  6. package/build/src/background-jobs/json-socket.js +5 -1
  7. package/build/src/background-jobs/main.d.ts +13 -0
  8. package/build/src/background-jobs/main.d.ts.map +1 -1
  9. package/build/src/background-jobs/main.js +47 -5
  10. package/build/src/background-jobs/store.d.ts +5 -1
  11. package/build/src/background-jobs/store.d.ts.map +1 -1
  12. package/build/src/background-jobs/store.js +10 -4
  13. package/build/src/background-jobs/types.d.ts +3 -1
  14. package/build/src/background-jobs/types.d.ts.map +1 -1
  15. package/build/src/background-jobs/types.js +2 -2
  16. package/build/src/background-jobs/worker.d.ts +16 -9
  17. package/build/src/background-jobs/worker.d.ts.map +1 -1
  18. package/build/src/background-jobs/worker.js +53 -15
  19. package/build/src/configuration-types.d.ts +24 -0
  20. package/build/src/configuration-types.d.ts.map +1 -1
  21. package/build/src/configuration-types.js +9 -1
  22. package/build/src/configuration.d.ts.map +1 -1
  23. package/build/src/configuration.js +7 -2
  24. package/build/src/database/pool/async-tracked-multi-connection.d.ts +28 -0
  25. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  26. package/build/src/database/pool/async-tracked-multi-connection.js +129 -10
  27. package/build/src/database/record/instance-relationships/has-many.d.ts +2 -0
  28. package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  29. package/build/src/database/record/instance-relationships/has-many.js +13 -1
  30. package/build/src/frontend-models/clear-pending-debounced-callback.d.ts +6 -0
  31. package/build/src/frontend-models/clear-pending-debounced-callback.d.ts.map +1 -0
  32. package/build/src/frontend-models/clear-pending-debounced-callback.js +12 -0
  33. package/build/src/frontend-models/event-hook-models.d.ts +12 -0
  34. package/build/src/frontend-models/event-hook-models.d.ts.map +1 -0
  35. package/build/src/frontend-models/event-hook-models.js +37 -0
  36. package/build/src/frontend-models/use-created-event.d.ts +17 -0
  37. package/build/src/frontend-models/use-created-event.d.ts.map +1 -0
  38. package/build/src/frontend-models/use-created-event.js +19 -0
  39. package/build/src/frontend-models/use-destroyed-event.d.ts +19 -0
  40. package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -0
  41. package/build/src/frontend-models/use-destroyed-event.js +99 -0
  42. package/build/src/frontend-models/use-model-class-event.d.ts +27 -0
  43. package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -0
  44. package/build/src/frontend-models/use-model-class-event.js +112 -0
  45. package/build/src/frontend-models/use-updated-event.d.ts +20 -0
  46. package/build/src/frontend-models/use-updated-event.d.ts.map +1 -0
  47. package/build/src/frontend-models/use-updated-event.js +101 -0
  48. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +35 -0
  49. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -0
  50. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +259 -0
  51. package/build/src/testing/browser-test-app.js +3 -1
  52. package/build/tsconfig.tsbuildinfo +1 -1
  53. package/package.json +10 -1
@@ -0,0 +1,259 @@
1
+ // @ts-check
2
+ import React from "react";
3
+ import { createRoot } from "react-dom/client";
4
+ import useDestroyedEvent from "../frontend-models/use-destroyed-event.js";
5
+ import useCreatedEvent from "../frontend-models/use-created-event.js";
6
+ import useModelClassEvent from "../frontend-models/use-model-class-event.js";
7
+ import useUpdatedEvent from "../frontend-models/use-updated-event.js";
8
+ /**
9
+ * @typedef {object} FakeSubscriptions
10
+ * @property {Set<(payload: unknown) => void>} create - Create callbacks.
11
+ * @property {Set<(payload: unknown) => void>} destroy - Destroy callbacks.
12
+ * @property {Set<(payload: unknown) => void>} update - Update callbacks.
13
+ */
14
+ /** @returns {Promise<void>} - Resolves after React effects have run. */
15
+ async function flushEffects() {
16
+ await Promise.resolve();
17
+ await new Promise((resolve) => setTimeout(resolve, 0));
18
+ }
19
+ /**
20
+ * @param {number} milliseconds - Milliseconds to wait.
21
+ * @returns {Promise<void>} - Resolves after the delay.
22
+ */
23
+ async function sleep(milliseconds) {
24
+ await new Promise((resolve) => setTimeout(resolve, milliseconds));
25
+ }
26
+ /**
27
+ * @param {() => boolean} callback - Predicate to wait for.
28
+ * @returns {Promise<void>} - Resolves when the predicate returns true.
29
+ */
30
+ async function waitFor(callback) {
31
+ const startedAt = Date.now();
32
+ while (!callback()) {
33
+ if (Date.now() - startedAt > 1000)
34
+ return;
35
+ await sleep(10);
36
+ }
37
+ }
38
+ /**
39
+ * @param {React.ReactElement} element - Element to render.
40
+ * @returns {Promise<{rerender: (nextElement: React.ReactElement) => Promise<void>, unmount: () => Promise<void>}>} - Render controls.
41
+ */
42
+ async function renderElement(element) {
43
+ const container = document.createElement("div");
44
+ document.body.appendChild(container);
45
+ const root = createRoot(container);
46
+ root.render(element);
47
+ await flushEffects();
48
+ return {
49
+ rerender: async (nextElement) => {
50
+ root.render(nextElement);
51
+ await flushEffects();
52
+ },
53
+ unmount: async () => {
54
+ root.unmount();
55
+ container.remove();
56
+ await flushEffects();
57
+ }
58
+ };
59
+ }
60
+ /** @returns {{ModelClass: typeof import("../frontend-models/base.js").default, subscriptions: FakeSubscriptions}} - Fake model class setup. */
61
+ function buildFakeModelClass() {
62
+ const subscriptions = {
63
+ create: new Set(),
64
+ destroy: new Set(),
65
+ update: new Set()
66
+ };
67
+ const ModelClass = /** @type {typeof import("../frontend-models/base.js").default} */ ( /** @type {unknown} */({
68
+ onCreate: async (/** @type {(payload: unknown) => void} */ callback) => {
69
+ subscriptions.create.add(callback);
70
+ return () => subscriptions.create.delete(callback);
71
+ },
72
+ onDestroy: async (/** @type {(payload: unknown) => void} */ callback) => {
73
+ subscriptions.destroy.add(callback);
74
+ return () => subscriptions.destroy.delete(callback);
75
+ },
76
+ onUpdate: async (/** @type {(payload: unknown) => void} */ callback) => {
77
+ subscriptions.update.add(callback);
78
+ return () => subscriptions.update.delete(callback);
79
+ }
80
+ }));
81
+ return { ModelClass, subscriptions };
82
+ }
83
+ /**
84
+ * @param {FakeSubscriptions} subscriptions - Callback sets.
85
+ * @param {"create" | "destroy" | "update"} eventName - Event name.
86
+ * @param {unknown} payload - Event payload.
87
+ * @returns {void}
88
+ */
89
+ function emitEvent(subscriptions, eventName, payload) {
90
+ for (const callback of subscriptions[eventName]) {
91
+ callback(payload);
92
+ }
93
+ }
94
+ /**
95
+ * @param {string} id - Model id.
96
+ * @param {FakeSubscriptions} subscriptions - Callback sets.
97
+ * @returns {import("../frontend-models/base.js").default} - Fake model instance.
98
+ */
99
+ function buildFakeModel(id, subscriptions) {
100
+ return /** @type {import("../frontend-models/base.js").default} */ ( /** @type {unknown} */({
101
+ onDestroy: async (/** @type {(payload: unknown) => void} */ callback) => {
102
+ subscriptions.destroy.add(callback);
103
+ return () => subscriptions.destroy.delete(callback);
104
+ },
105
+ onUpdate: async (/** @type {(payload: unknown) => void} */ callback) => {
106
+ subscriptions.update.add(callback);
107
+ return () => subscriptions.update.delete(callback);
108
+ },
109
+ primaryKeyValue: () => id
110
+ }));
111
+ }
112
+ /** @returns {Promise<Record<string, number>>} - Scenario result. */
113
+ async function classLifecycleScenario() {
114
+ const { ModelClass, subscriptions } = buildFakeModelClass();
115
+ const receivedEvents = /** @type {unknown[]} */ ([]);
116
+ let connectedCount = 0;
117
+ /** @returns {React.ReactElement} - Test element. */
118
+ function TestComponent() {
119
+ useModelClassEvent(ModelClass, ["create", "update"], (payload) => receivedEvents.push(payload), {
120
+ onConnected: () => { connectedCount += 1; }
121
+ });
122
+ useCreatedEvent(ModelClass, (payload) => receivedEvents.push(payload));
123
+ return React.createElement("div");
124
+ }
125
+ const controls = await renderElement(React.createElement(TestComponent));
126
+ await waitFor(() => subscriptions.create.size === 2 && subscriptions.update.size === 1);
127
+ const mountedCreateSubscriptions = subscriptions.create.size;
128
+ const mountedUpdateSubscriptions = subscriptions.update.size;
129
+ const mountedDestroySubscriptions = subscriptions.destroy.size;
130
+ const mountedConnectedCount = connectedCount;
131
+ emitEvent(subscriptions, "create", { id: "1", model: { id: "1" } });
132
+ emitEvent(subscriptions, "update", { id: "1", model: { id: "1" } });
133
+ emitEvent(subscriptions, "destroy", { id: "1" });
134
+ const receivedEventsAfterEmit = receivedEvents.length;
135
+ await controls.unmount();
136
+ return {
137
+ mountedConnectedCount,
138
+ mountedCreateSubscriptions,
139
+ mountedDestroySubscriptions,
140
+ mountedUpdateSubscriptions,
141
+ receivedEventsAfterEmit,
142
+ unmountedCreateSubscriptions: subscriptions.create.size,
143
+ unmountedUpdateSubscriptions: subscriptions.update.size
144
+ };
145
+ }
146
+ /** @returns {Promise<Record<string, number>>} - Scenario result. */
147
+ async function instanceLifecycleScenario() {
148
+ const subscriptions = { create: new Set(), destroy: new Set(), update: new Set() };
149
+ const model = buildFakeModel("task-1", subscriptions);
150
+ const receivedEvents = /** @type {unknown[]} */ ([]);
151
+ let connectedCount = 0;
152
+ /** @returns {React.ReactElement} - Test element. */
153
+ function TestComponent() {
154
+ useUpdatedEvent(model, (payload) => receivedEvents.push(payload), {
155
+ onConnected: () => { connectedCount += 1; }
156
+ });
157
+ useDestroyedEvent([model], (payload) => receivedEvents.push(payload), {
158
+ onConnected: () => { connectedCount += 1; }
159
+ });
160
+ return React.createElement("div");
161
+ }
162
+ const controls = await renderElement(React.createElement(TestComponent));
163
+ await waitFor(() => subscriptions.update.size === 1 && subscriptions.destroy.size === 1);
164
+ const mountedConnectedCount = connectedCount;
165
+ const mountedDestroySubscriptions = subscriptions.destroy.size;
166
+ const mountedUpdateSubscriptions = subscriptions.update.size;
167
+ emitEvent(subscriptions, "update", { id: "task-1", model });
168
+ emitEvent(subscriptions, "destroy", { id: "task-1" });
169
+ const receivedEventsAfterEmit = receivedEvents.length;
170
+ await controls.unmount();
171
+ return {
172
+ mountedConnectedCount,
173
+ mountedDestroySubscriptions,
174
+ mountedUpdateSubscriptions,
175
+ receivedEventsAfterEmit,
176
+ unmountedDestroySubscriptions: subscriptions.destroy.size,
177
+ unmountedUpdateSubscriptions: subscriptions.update.size
178
+ };
179
+ }
180
+ /** @returns {Promise<Record<string, number>>} - Scenario result. */
181
+ async function debounceUnmountScenario() {
182
+ const { ModelClass, subscriptions: classSubscriptions } = buildFakeModelClass();
183
+ const instanceSubscriptions = { create: new Set(), destroy: new Set(), update: new Set() };
184
+ const model = buildFakeModel("task-1", instanceSubscriptions);
185
+ const receivedEvents = /** @type {unknown[]} */ ([]);
186
+ /** @returns {React.ReactElement} - Test element. */
187
+ function TestComponent() {
188
+ useModelClassEvent(ModelClass, "update", (payload) => receivedEvents.push(payload), { debounce: 20 });
189
+ useUpdatedEvent(model, (payload) => receivedEvents.push(payload), { debounce: 20 });
190
+ useDestroyedEvent(model, (payload) => receivedEvents.push(payload), { debounce: 20 });
191
+ return React.createElement("div");
192
+ }
193
+ const controls = await renderElement(React.createElement(TestComponent));
194
+ await waitFor(() => classSubscriptions.update.size === 1 && instanceSubscriptions.update.size === 1 && instanceSubscriptions.destroy.size === 1);
195
+ emitEvent(classSubscriptions, "update", { id: "task-1", model });
196
+ emitEvent(instanceSubscriptions, "update", { id: "task-1", model });
197
+ emitEvent(instanceSubscriptions, "destroy", { id: "task-1" });
198
+ await controls.unmount();
199
+ await sleep(30);
200
+ return { receivedEventsAfterDebounceWindow: receivedEvents.length };
201
+ }
202
+ /** @returns {Promise<Record<string, number>>} - Scenario result. */
203
+ async function resubscribeInstanceScenario() {
204
+ const firstSubscriptions = { create: new Set(), destroy: new Set(), update: new Set() };
205
+ const secondSubscriptions = { create: new Set(), destroy: new Set(), update: new Set() };
206
+ const firstModel = buildFakeModel("task-1", firstSubscriptions);
207
+ const secondModel = buildFakeModel("task-1", secondSubscriptions);
208
+ const receivedEvents = /** @type {unknown[]} */ ([]);
209
+ /**
210
+ * @param {{model: import("../frontend-models/base.js").default}} props - Component props.
211
+ * @returns {React.ReactElement} - Test element.
212
+ */
213
+ function TestComponent({ model }) {
214
+ useUpdatedEvent(model, (payload) => receivedEvents.push(payload));
215
+ useDestroyedEvent(model, (payload) => receivedEvents.push(payload));
216
+ return React.createElement("div");
217
+ }
218
+ const controls = await renderElement(React.createElement(TestComponent, { model: firstModel }));
219
+ await waitFor(() => firstSubscriptions.update.size === 1 && firstSubscriptions.destroy.size === 1);
220
+ const firstMountedDestroySubscriptions = firstSubscriptions.destroy.size;
221
+ const firstMountedUpdateSubscriptions = firstSubscriptions.update.size;
222
+ await controls.rerender(React.createElement(TestComponent, { model: secondModel }));
223
+ await waitFor(() => firstSubscriptions.update.size === 0 && firstSubscriptions.destroy.size === 0 && secondSubscriptions.update.size === 1 && secondSubscriptions.destroy.size === 1);
224
+ const firstAfterRerenderDestroySubscriptions = firstSubscriptions.destroy.size;
225
+ const firstAfterRerenderUpdateSubscriptions = firstSubscriptions.update.size;
226
+ const secondAfterRerenderDestroySubscriptions = secondSubscriptions.destroy.size;
227
+ const secondAfterRerenderUpdateSubscriptions = secondSubscriptions.update.size;
228
+ emitEvent(firstSubscriptions, "update", { id: "task-1", model: firstModel });
229
+ emitEvent(secondSubscriptions, "update", { id: "task-1", model: secondModel });
230
+ emitEvent(secondSubscriptions, "destroy", { id: "task-1" });
231
+ const receivedEventsAfterEmit = receivedEvents.length;
232
+ await controls.unmount();
233
+ return {
234
+ firstAfterRerenderDestroySubscriptions,
235
+ firstAfterRerenderUpdateSubscriptions,
236
+ firstMountedDestroySubscriptions,
237
+ firstMountedUpdateSubscriptions,
238
+ receivedEventsAfterEmit,
239
+ secondAfterRerenderDestroySubscriptions,
240
+ secondAfterRerenderUpdateSubscriptions
241
+ };
242
+ }
243
+ const scenarios = {
244
+ classLifecycle: classLifecycleScenario,
245
+ debounceUnmount: debounceUnmountScenario,
246
+ instanceLifecycle: instanceLifecycleScenario,
247
+ resubscribeInstance: resubscribeInstanceScenario
248
+ };
249
+ /**
250
+ * @param {keyof typeof scenarios} scenarioName - Scenario name.
251
+ * @returns {Promise<Record<string, number>>} - Scenario result.
252
+ */
253
+ export default async function runFrontendModelEventHookScenario(scenarioName) {
254
+ const scenario = scenarios[scenarioName];
255
+ if (!scenario)
256
+ throw new Error(`Unknown frontend model event hook scenario: ${scenarioName}`);
257
+ return await scenario();
258
+ }
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1mcm9udGVuZC1tb2RlbC1ldmVudC1ob29rLXNjZW5hcmlvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2Jyb3dzZXItZnJvbnRlbmQtbW9kZWwtZXZlbnQtaG9vay1zY2VuYXJpb3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFFM0MsT0FBTyxpQkFBaUIsTUFBTSwyQ0FBMkMsQ0FBQTtBQUN6RSxPQUFPLGVBQWUsTUFBTSx5Q0FBeUMsQ0FBQTtBQUNyRSxPQUFPLGtCQUFrQixNQUFNLDZDQUE2QyxDQUFBO0FBQzVFLE9BQU8sZUFBZSxNQUFNLHlDQUF5QyxDQUFBO0FBRXJFOzs7OztHQUtHO0FBRUgsd0VBQXdFO0FBQ3hFLEtBQUssVUFBVSxZQUFZO0lBQ3pCLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN4RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLEtBQUssQ0FBQyxZQUFZO0lBQy9CLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtBQUNuRSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLE9BQU8sQ0FBQyxRQUFRO0lBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUU1QixPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxT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QUMsSUFBSSxDQUFBO0lBRTlFLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsRUFBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0lBQzFFLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsRUFBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO0lBQzVFLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsRUFBQyxFQUFFLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtJQUV6RCxNQUFNLHVCQUF1QixHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUE7SUFFckQsTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUE7SUFFeEIsT0FBTztRQUNMLHNDQUFzQztRQUN0QyxxQ0FBcUM7UUFDckMsZ0NBQWdDO1FBQ2hDLCtCQUErQjtRQUMvQix1QkFBdUI7UUFDdkIsdUNBQXVDO1FBQ3ZDLHNDQUFzQztLQUN2QyxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sU0FBUyxHQUFHO0lBQ2hCLGNBQWMsRUFBRSxzQkFBc0I7SUFDdEMsZUFBZSxFQUFFLHVCQUF1QjtJQUN4QyxpQkFBaUIsRUFBRSx5QkFBeUI7SUFDNUMsbUJBQW1CLEVBQUUsMkJBQTJCO0NBQ2pELENBQUE7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssVUFBVSxpQ0FBaUMsQ0FBQyxZQUFZO0lBQzFFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUV4QyxJQUFJLENBQUMsUUFBUTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLFlBQVksRUFBRSxDQUFDLENBQUE7SUFFN0YsT0FBTyxNQUFNLFFBQVEsRUFBRSxDQUFBO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQge2NyZWF0ZVJvb3R9IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCJcblxuaW1wb3J0IHVzZURlc3Ryb3llZEV2ZW50IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvdXNlLWRlc3Ryb3llZC1ldmVudC5qc1wiXG5pbXBvcnQgdXNlQ3JlYXRlZEV2ZW50IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvdXNlLWNyZWF0ZWQtZXZlbnQuanNcIlxuaW1wb3J0IHVzZU1vZGVsQ2xhc3NFdmVudCBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL3VzZS1tb2RlbC1jbGFzcy1ldmVudC5qc1wiXG5pbXBvcnQgdXNlVXBkYXRlZEV2ZW50IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvdXNlLXVwZGF0ZWQtZXZlbnQuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZha2VTdWJzY3JpcHRpb25zXG4gKiBAcHJvcGVydHkge1NldDwocGF5bG9hZDogdW5rbm93bikgPT4gdm9pZD59IGNyZWF0ZSAtIENyZWF0ZSBjYWxsYmFja3MuXG4gKiBAcHJvcGVydHkge1NldDwocGF5bG9hZDogdW5rbm93bikgPT4gdm9pZD59IGRlc3Ryb3kgLSBEZXN0cm95IGNhbGxiYWNrcy5cbiAqIEBwcm9wZXJ0eSB7U2V0PChwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkPn0gdXBkYXRlIC0gVXBkYXRlIGNhbGxiYWNrcy5cbiAqL1xuXG4vKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgUmVhY3QgZWZmZWN0cyBoYXZlIHJ1bi4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZsdXNoRWZmZWN0cygpIHtcbiAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKClcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIE1pbGxpc2Vjb25kcyB0byB3YWl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHMpIHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0geygpID0+IGJvb2xlYW59IGNhbGxiYWNrIC0gUHJlZGljYXRlIHRvIHdhaXQgZm9yLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgcHJlZGljYXRlIHJldHVybnMgdHJ1ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvcihjYWxsYmFjaykge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpXG5cbiAgd2hpbGUgKCFjYWxsYmFjaygpKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGFydGVkQXQgPiAxMDAwKSByZXR1cm5cblxuICAgIGF3YWl0IHNsZWVwKDEwKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWFjdC5SZWFjdEVsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtyZXJlbmRlcjogKG5leHRFbGVtZW50OiBSZWFjdC5SZWFjdEVsZW1lbnQpID0+IFByb21pc2U8dm9pZD4sIHVubW91bnQ6ICgpID0+IFByb21pc2U8dm9pZD59Pn0gLSBSZW5kZXIgY29udHJvbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbmRlckVsZW1lbnQoZWxlbWVudCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKVxuICBjb25zdCByb290ID0gY3JlYXRlUm9vdChjb250YWluZXIpXG5cbiAgcm9vdC5yZW5kZXIoZWxlbWVudClcbiAgYXdhaXQgZmx1c2hFZmZlY3RzKClcblxuICByZXR1cm4ge1xuICAgIHJlcmVuZGVyOiBhc3luYyAobmV4dEVsZW1lbnQpID0+IHtcbiAgICAgIHJvb3QucmVuZGVyKG5leHRFbGVtZW50KVxuICAgICAgYXdhaXQgZmx1c2hFZmZlY3RzKClcbiAgICB9LFxuICAgIHVubW91bnQ6IGFzeW5jICgpID0+IHtcbiAgICAgIHJvb3QudW5tb3VudCgpXG4gICAgICBjb250YWluZXIucmVtb3ZlKClcbiAgICAgIGF3YWl0IGZsdXNoRWZmZWN0cygpXG4gICAgfVxuICB9XG59XG5cbi8qKiBAcmV0dXJucyB7e01vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbHMvYmFzZS5qc1wiKS5kZWZhdWx0LCBzdWJzY3JpcHRpb25zOiBGYWtlU3Vic2NyaXB0aW9uc319IC0gRmFrZSBtb2RlbCBjbGFzcyBzZXR1cC4gKi9cbmZ1bmN0aW9uIGJ1aWxkRmFrZU1vZGVsQ2xhc3MoKSB7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSB7XG4gICAgY3JlYXRlOiBuZXcgU2V0KCksXG4gICAgZGVzdHJveTogbmV3IFNldCgpLFxuICAgIHVwZGF0ZTogbmV3IFNldCgpXG4gIH1cbiAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCIpLmRlZmF1bHR9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh7XG4gICAgb25DcmVhdGU6IGFzeW5jICgvKiogQHR5cGUgeyhwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkfSAqLyBjYWxsYmFjaykgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9ucy5jcmVhdGUuYWRkKGNhbGxiYWNrKVxuXG4gICAgICByZXR1cm4gKCkgPT4gc3Vic2NyaXB0aW9ucy5jcmVhdGUuZGVsZXRlKGNhbGxiYWNrKVxuICAgIH0sXG4gICAgb25EZXN0cm95OiBhc3luYyAoLyoqIEB0eXBlIHsocGF5bG9hZDogdW5rbm93bikgPT4gdm9pZH0gKi8gY2FsbGJhY2spID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbnMuZGVzdHJveS5hZGQoY2FsbGJhY2spXG5cbiAgICAgIHJldHVybiAoKSA9PiBzdWJzY3JpcHRpb25zLmRlc3Ryb3kuZGVsZXRlKGNhbGxiYWNrKVxuICAgIH0sXG4gICAgb25VcGRhdGU6IGFzeW5jICgvKiogQHR5cGUgeyhwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkfSAqLyBjYWxsYmFjaykgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9ucy51cGRhdGUuYWRkKGNhbGxiYWNrKVxuXG4gICAgICByZXR1cm4gKCkgPT4gc3Vic2NyaXB0aW9ucy51cGRhdGUuZGVsZXRlKGNhbGxiYWNrKVxuICAgIH1cbiAgfSkpXG5cbiAgcmV0dXJuIHtNb2RlbENsYXNzLCBzdWJzY3JpcHRpb25zfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RmFrZVN1YnNjcmlwdGlvbnN9IHN1YnNjcmlwdGlvbnMgLSBDYWxsYmFjayBzZXRzLlxuICogQHBhcmFtIHtcImNyZWF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcInVwZGF0ZVwifSBldmVudE5hbWUgLSBFdmVudCBuYW1lLlxuICogQHBhcmFtIHt1bmtub3dufSBwYXlsb2FkIC0gRXZlbnQgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0RXZlbnQoc3Vic2NyaXB0aW9ucywgZXZlbnROYW1lLCBwYXlsb2FkKSB7XG4gIGZvciAoY29uc3QgY2FsbGJhY2sgb2Ygc3Vic2NyaXB0aW9uc1tldmVudE5hbWVdKSB7XG4gICAgY2FsbGJhY2socGF5bG9hZClcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIE1vZGVsIGlkLlxuICogQHBhcmFtIHtGYWtlU3Vic2NyaXB0aW9uc30gc3Vic2NyaXB0aW9ucyAtIENhbGxiYWNrIHNldHMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIikuZGVmYXVsdH0gLSBGYWtlIG1vZGVsIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBidWlsZEZha2VNb2RlbChpZCwgc3Vic2NyaXB0aW9ucykge1xuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbHMvYmFzZS5qc1wiKS5kZWZhdWx0fSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoe1xuICAgIG9uRGVzdHJveTogYXN5bmMgKC8qKiBAdHlwZSB7KHBheWxvYWQ6IHVua25vd24pID0+IHZvaWR9ICovIGNhbGxiYWNrKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb25zLmRlc3Ryb3kuYWRkKGNhbGxiYWNrKVxuXG4gICAgICByZXR1cm4gKCkgPT4gc3Vic2NyaXB0aW9ucy5kZXN0cm95LmRlbGV0ZShjYWxsYmFjaylcbiAgICB9LFxuICAgIG9uVXBkYXRlOiBhc3luYyAoLyoqIEB0eXBlIHsocGF5bG9hZDogdW5rbm93bikgPT4gdm9pZH0gKi8gY2FsbGJhY2spID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbnMudXBkYXRlLmFkZChjYWxsYmFjaylcblxuICAgICAgcmV0dXJuICgpID0+IHN1YnNjcmlwdGlvbnMudXBkYXRlLmRlbGV0ZShjYWxsYmFjaylcbiAgICB9LFxuICAgIHByaW1hcnlLZXlWYWx1ZTogKCkgPT4gaWRcbiAgfSkpXG59XG5cbi8qKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+Pn0gLSBTY2VuYXJpbyByZXN1bHQuICovXG5hc3luYyBmdW5jdGlvbiBjbGFzc0xpZmVjeWNsZVNjZW5hcmlvKCkge1xuICBjb25zdCB7TW9kZWxDbGFzcywgc3Vic2NyaXB0aW9uc30gPSBidWlsZEZha2VNb2RlbENsYXNzKClcbiAgY29uc3QgcmVjZWl2ZWRFdmVudHMgPSAvKiogQHR5cGUge3Vua25vd25bXX0gKi8gKFtdKVxuICBsZXQgY29ubmVjdGVkQ291bnQgPSAwXG5cbiAgLyoqIEByZXR1cm5zIHtSZWFjdC5SZWFjdEVsZW1lbnR9IC0gVGVzdCBlbGVtZW50LiAqL1xuICBmdW5jdGlvbiBUZXN0Q29tcG9uZW50KCkge1xuICAgIHVzZU1vZGVsQ2xhc3NFdmVudChNb2RlbENsYXNzLCBbXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIl0sIChwYXlsb2FkKSA9PiByZWNlaXZlZEV2ZW50cy5wdXNoKHBheWxvYWQpLCB7XG4gICAgICBvbkNvbm5lY3RlZDogKCkgPT4geyBjb25uZWN0ZWRDb3VudCArPSAxIH1cbiAgICB9KVxuICAgIHVzZUNyZWF0ZWRFdmVudChNb2RlbENsYXNzLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICBjb25zdCBjb250cm9scyA9IGF3YWl0IHJlbmRlckVsZW1lbnQoUmVhY3QuY3JlYXRlRWxlbWVudChUZXN0Q29tcG9uZW50KSlcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBzdWJzY3JpcHRpb25zLmNyZWF0ZS5zaXplID09PSAyICYmIHN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEpXG5cbiAgY29uc3QgbW91bnRlZENyZWF0ZVN1YnNjcmlwdGlvbnMgPSBzdWJzY3JpcHRpb25zLmNyZWF0ZS5zaXplXG4gIGNvbnN0IG1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZVxuICBjb25zdCBtb3VudGVkRGVzdHJveVN1YnNjcmlwdGlvbnMgPSBzdWJzY3JpcHRpb25zLmRlc3Ryb3kuc2l6ZVxuICBjb25zdCBtb3VudGVkQ29ubmVjdGVkQ291bnQgPSBjb25uZWN0ZWRDb3VudFxuXG4gIGVtaXRFdmVudChzdWJzY3JpcHRpb25zLCBcImNyZWF0ZVwiLCB7aWQ6IFwiMVwiLCBtb2RlbDoge2lkOiBcIjFcIn19KVxuICBlbWl0RXZlbnQoc3Vic2NyaXB0aW9ucywgXCJ1cGRhdGVcIiwge2lkOiBcIjFcIiwgbW9kZWw6IHtpZDogXCIxXCJ9fSlcbiAgZW1pdEV2ZW50KHN1YnNjcmlwdGlvbnMsIFwiZGVzdHJveVwiLCB7aWQ6IFwiMVwifSlcblxuICBjb25zdCByZWNlaXZlZEV2ZW50c0FmdGVyRW1pdCA9IHJlY2VpdmVkRXZlbnRzLmxlbmd0aFxuXG4gIGF3YWl0IGNvbnRyb2xzLnVubW91bnQoKVxuXG4gIHJldHVybiB7XG4gICAgbW91bnRlZENvbm5lY3RlZENvdW50LFxuICAgIG1vdW50ZWRDcmVhdGVTdWJzY3JpcHRpb25zLFxuICAgIG1vdW50ZWREZXN0cm95U3Vic2NyaXB0aW9ucyxcbiAgICBtb3VudGVkVXBkYXRlU3Vic2NyaXB0aW9ucyxcbiAgICByZWNlaXZlZEV2ZW50c0FmdGVyRW1pdCxcbiAgICB1bm1vdW50ZWRDcmVhdGVTdWJzY3JpcHRpb25zOiBzdWJzY3JpcHRpb25zLmNyZWF0ZS5zaXplLFxuICAgIHVubW91bnRlZFVwZGF0ZVN1YnNjcmlwdGlvbnM6IHN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemVcbiAgfVxufVxuXG4vKiogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj59IC0gU2NlbmFyaW8gcmVzdWx0LiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFuY2VMaWZlY3ljbGVTY2VuYXJpbygpIHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHtjcmVhdGU6IG5ldyBTZXQoKSwgZGVzdHJveTogbmV3IFNldCgpLCB1cGRhdGU6IG5ldyBTZXQoKX1cbiAgY29uc3QgbW9kZWwgPSBidWlsZEZha2VNb2RlbChcInRhc2stMVwiLCBzdWJzY3JpcHRpb25zKVxuICBjb25zdCByZWNlaXZlZEV2ZW50cyA9IC8qKiBAdHlwZSB7dW5rbm93bltdfSAqLyAoW10pXG4gIGxldCBjb25uZWN0ZWRDb3VudCA9IDBcblxuICAvKiogQHJldHVybnMge1JlYWN0LlJlYWN0RWxlbWVudH0gLSBUZXN0IGVsZW1lbnQuICovXG4gIGZ1bmN0aW9uIFRlc3RDb21wb25lbnQoKSB7XG4gICAgdXNlVXBkYXRlZEV2ZW50KG1vZGVsLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSwge1xuICAgICAgb25Db25uZWN0ZWQ6ICgpID0+IHsgY29ubmVjdGVkQ291bnQgKz0gMSB9XG4gICAgfSlcbiAgICB1c2VEZXN0cm95ZWRFdmVudChbbW9kZWxdLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSwge1xuICAgICAgb25Db25uZWN0ZWQ6ICgpID0+IHsgY29ubmVjdGVkQ291bnQgKz0gMSB9XG4gICAgfSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICBjb25zdCBjb250cm9scyA9IGF3YWl0IHJlbmRlckVsZW1lbnQoUmVhY3QuY3JlYXRlRWxlbWVudChUZXN0Q29tcG9uZW50KSlcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBzdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplID09PSAxICYmIHN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplID09PSAxKVxuXG4gIGNvbnN0IG1vdW50ZWRDb25uZWN0ZWRDb3VudCA9IGNvbm5lY3RlZENvdW50XG4gIGNvbnN0IG1vdW50ZWREZXN0cm95U3Vic2NyaXB0aW9ucyA9IHN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplXG4gIGNvbnN0IG1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZVxuXG4gIGVtaXRFdmVudChzdWJzY3JpcHRpb25zLCBcInVwZGF0ZVwiLCB7aWQ6IFwidGFzay0xXCIsIG1vZGVsfSlcbiAgZW1pdEV2ZW50KHN1YnNjcmlwdGlvbnMsIFwiZGVzdHJveVwiLCB7aWQ6IFwidGFzay0xXCJ9KVxuXG4gIGNvbnN0IHJlY2VpdmVkRXZlbnRzQWZ0ZXJFbWl0ID0gcmVjZWl2ZWRFdmVudHMubGVuZ3RoXG5cbiAgYXdhaXQgY29udHJvbHMudW5tb3VudCgpXG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudGVkQ29ubmVjdGVkQ291bnQsXG4gICAgbW91bnRlZERlc3Ryb3lTdWJzY3JpcHRpb25zLFxuICAgIG1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zLFxuICAgIHJlY2VpdmVkRXZlbnRzQWZ0ZXJFbWl0LFxuICAgIHVubW91bnRlZERlc3Ryb3lTdWJzY3JpcHRpb25zOiBzdWJzY3JpcHRpb25zLmRlc3Ryb3kuc2l6ZSxcbiAgICB1bm1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zOiBzdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplXG4gIH1cbn1cblxuLyoqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+fSAtIFNjZW5hcmlvIHJlc3VsdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlYm91bmNlVW5tb3VudFNjZW5hcmlvKCkge1xuICBjb25zdCB7TW9kZWxDbGFzcywgc3Vic2NyaXB0aW9uczogY2xhc3NTdWJzY3JpcHRpb25zfSA9IGJ1aWxkRmFrZU1vZGVsQ2xhc3MoKVxuICBjb25zdCBpbnN0YW5jZVN1YnNjcmlwdGlvbnMgPSB7Y3JlYXRlOiBuZXcgU2V0KCksIGRlc3Ryb3k6IG5ldyBTZXQoKSwgdXBkYXRlOiBuZXcgU2V0KCl9XG4gIGNvbnN0IG1vZGVsID0gYnVpbGRGYWtlTW9kZWwoXCJ0YXNrLTFcIiwgaW5zdGFuY2VTdWJzY3JpcHRpb25zKVxuICBjb25zdCByZWNlaXZlZEV2ZW50cyA9IC8qKiBAdHlwZSB7dW5rbm93bltdfSAqLyAoW10pXG5cbiAgLyoqIEByZXR1cm5zIHtSZWFjdC5SZWFjdEVsZW1lbnR9IC0gVGVzdCBlbGVtZW50LiAqL1xuICBmdW5jdGlvbiBUZXN0Q29tcG9uZW50KCkge1xuICAgIHVzZU1vZGVsQ2xhc3NFdmVudChNb2RlbENsYXNzLCBcInVwZGF0ZVwiLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSwge2RlYm91bmNlOiAyMH0pXG4gICAgdXNlVXBkYXRlZEV2ZW50KG1vZGVsLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSwge2RlYm91bmNlOiAyMH0pXG4gICAgdXNlRGVzdHJveWVkRXZlbnQobW9kZWwsIChwYXlsb2FkKSA9PiByZWNlaXZlZEV2ZW50cy5wdXNoKHBheWxvYWQpLCB7ZGVib3VuY2U6IDIwfSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICBjb25zdCBjb250cm9scyA9IGF3YWl0IHJlbmRlckVsZW1lbnQoUmVhY3QuY3JlYXRlRWxlbWVudChUZXN0Q29tcG9uZW50KSlcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBjbGFzc1N1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEgJiYgaW5zdGFuY2VTdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplID09PSAxICYmIGluc3RhbmNlU3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemUgPT09IDEpXG5cbiAgZW1pdEV2ZW50KGNsYXNzU3Vic2NyaXB0aW9ucywgXCJ1cGRhdGVcIiwge2lkOiBcInRhc2stMVwiLCBtb2RlbH0pXG4gIGVtaXRFdmVudChpbnN0YW5jZVN1YnNjcmlwdGlvbnMsIFwidXBkYXRlXCIsIHtpZDogXCJ0YXNrLTFcIiwgbW9kZWx9KVxuICBlbWl0RXZlbnQoaW5zdGFuY2VTdWJzY3JpcHRpb25zLCBcImRlc3Ryb3lcIiwge2lkOiBcInRhc2stMVwifSlcblxuICBhd2FpdCBjb250cm9scy51bm1vdW50KClcbiAgYXdhaXQgc2xlZXAoMzApXG5cbiAgcmV0dXJuIHtyZWNlaXZlZEV2ZW50c0FmdGVyRGVib3VuY2VXaW5kb3c6IHJlY2VpdmVkRXZlbnRzLmxlbmd0aH1cbn1cblxuLyoqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+fSAtIFNjZW5hcmlvIHJlc3VsdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc3Vic2NyaWJlSW5zdGFuY2VTY2VuYXJpbygpIHtcbiAgY29uc3QgZmlyc3RTdWJzY3JpcHRpb25zID0ge2NyZWF0ZTogbmV3IFNldCgpLCBkZXN0cm95OiBuZXcgU2V0KCksIHVwZGF0ZTogbmV3IFNldCgpfVxuICBjb25zdCBzZWNvbmRTdWJzY3JpcHRpb25zID0ge2NyZWF0ZTogbmV3IFNldCgpLCBkZXN0cm95OiBuZXcgU2V0KCksIHVwZGF0ZTogbmV3IFNldCgpfVxuICBjb25zdCBmaXJzdE1vZGVsID0gYnVpbGRGYWtlTW9kZWwoXCJ0YXNrLTFcIiwgZmlyc3RTdWJzY3JpcHRpb25zKVxuICBjb25zdCBzZWNvbmRNb2RlbCA9IGJ1aWxkRmFrZU1vZGVsKFwidGFzay0xXCIsIHNlY29uZFN1YnNjcmlwdGlvbnMpXG4gIGNvbnN0IHJlY2VpdmVkRXZlbnRzID0gLyoqIEB0eXBlIHt1bmtub3duW119ICovIChbXSlcblxuICAvKipcbiAgICogQHBhcmFtIHt7bW9kZWw6IGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCIpLmRlZmF1bHR9fSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcy5cbiAgICogQHJldHVybnMge1JlYWN0LlJlYWN0RWxlbWVudH0gLSBUZXN0IGVsZW1lbnQuXG4gICAqL1xuICBmdW5jdGlvbiBUZXN0Q29tcG9uZW50KHttb2RlbH0pIHtcbiAgICB1c2VVcGRhdGVkRXZlbnQobW9kZWwsIChwYXlsb2FkKSA9PiByZWNlaXZlZEV2ZW50cy5wdXNoKHBheWxvYWQpKVxuICAgIHVzZURlc3Ryb3llZEV2ZW50KG1vZGVsLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICBjb25zdCBjb250cm9scyA9IGF3YWl0IHJlbmRlckVsZW1lbnQoUmVhY3QuY3JlYXRlRWxlbWVudChUZXN0Q29tcG9uZW50LCB7bW9kZWw6IGZpcnN0TW9kZWx9KSlcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBmaXJzdFN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEgJiYgZmlyc3RTdWJzY3JpcHRpb25zLmRlc3Ryb3kuc2l6ZSA9PT0gMSlcblxuICBjb25zdCBmaXJzdE1vdW50ZWREZXN0cm95U3Vic2NyaXB0aW9ucyA9IGZpcnN0U3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemVcbiAgY29uc3QgZmlyc3RNb3VudGVkVXBkYXRlU3Vic2NyaXB0aW9ucyA9IGZpcnN0U3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZVxuXG4gIGF3YWl0IGNvbnRyb2xzLnJlcmVuZGVyKFJlYWN0LmNyZWF0ZUVsZW1lbnQoVGVzdENvbXBvbmVudCwge21vZGVsOiBzZWNvbmRNb2RlbH0pKVxuICBhd2FpdCB3YWl0Rm9yKCgpID0+IGZpcnN0U3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZSA9PT0gMCAmJiBmaXJzdFN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplID09PSAwICYmIHNlY29uZFN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEgJiYgc2Vjb25kU3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemUgPT09IDEpXG5cbiAgY29uc3QgZmlyc3RBZnRlclJlcmVuZGVyRGVzdHJveVN1YnNjcmlwdGlvbnMgPSBmaXJzdFN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplXG4gIGNvbnN0IGZpcnN0QWZ0ZXJSZXJlbmRlclVwZGF0ZVN1YnNjcmlwdGlvbnMgPSBmaXJzdFN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemVcbiAgY29uc3Qgc2Vjb25kQWZ0ZXJSZXJlbmRlckRlc3Ryb3lTdWJzY3JpcHRpb25zID0gc2Vjb25kU3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemVcbiAgY29uc3Qgc2Vjb25kQWZ0ZXJSZXJlbmRlclVwZGF0ZVN1YnNjcmlwdGlvbnMgPSBzZWNvbmRTdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplXG5cbiAgZW1pdEV2ZW50KGZpcnN0U3Vic2NyaXB0aW9ucywgXCJ1cGRhdGVcIiwge2lkOiBcInRhc2stMVwiLCBtb2RlbDogZmlyc3RNb2RlbH0pXG4gIGVtaXRFdmVudChzZWNvbmRTdWJzY3JpcHRpb25zLCBcInVwZGF0ZVwiLCB7aWQ6IFwidGFzay0xXCIsIG1vZGVsOiBzZWNvbmRNb2RlbH0pXG4gIGVtaXRFdmVudChzZWNvbmRTdWJzY3JpcHRpb25zLCBcImRlc3Ryb3lcIiwge2lkOiBcInRhc2stMVwifSlcblxuICBjb25zdCByZWNlaXZlZEV2ZW50c0FmdGVyRW1pdCA9IHJlY2VpdmVkRXZlbnRzLmxlbmd0aFxuXG4gIGF3YWl0IGNvbnRyb2xzLnVubW91bnQoKVxuXG4gIHJldHVybiB7XG4gICAgZmlyc3RBZnRlclJlcmVuZGVyRGVzdHJveVN1YnNjcmlwdGlvbnMsXG4gICAgZmlyc3RBZnRlclJlcmVuZGVyVXBkYXRlU3Vic2NyaXB0aW9ucyxcbiAgICBmaXJzdE1vdW50ZWREZXN0cm95U3Vic2NyaXB0aW9ucyxcbiAgICBmaXJzdE1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zLFxuICAgIHJlY2VpdmVkRXZlbnRzQWZ0ZXJFbWl0LFxuICAgIHNlY29uZEFmdGVyUmVyZW5kZXJEZXN0cm95U3Vic2NyaXB0aW9ucyxcbiAgICBzZWNvbmRBZnRlclJlcmVuZGVyVXBkYXRlU3Vic2NyaXB0aW9uc1xuICB9XG59XG5cbmNvbnN0IHNjZW5hcmlvcyA9IHtcbiAgY2xhc3NMaWZlY3ljbGU6IGNsYXNzTGlmZWN5Y2xlU2NlbmFyaW8sXG4gIGRlYm91bmNlVW5tb3VudDogZGVib3VuY2VVbm1vdW50U2NlbmFyaW8sXG4gIGluc3RhbmNlTGlmZWN5Y2xlOiBpbnN0YW5jZUxpZmVjeWNsZVNjZW5hcmlvLFxuICByZXN1YnNjcmliZUluc3RhbmNlOiByZXN1YnNjcmliZUluc3RhbmNlU2NlbmFyaW9cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2tleW9mIHR5cGVvZiBzY2VuYXJpb3N9IHNjZW5hcmlvTmFtZSAtIFNjZW5hcmlvIG5hbWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+Pn0gLSBTY2VuYXJpbyByZXN1bHQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHJ1bkZyb250ZW5kTW9kZWxFdmVudEhvb2tTY2VuYXJpbyhzY2VuYXJpb05hbWUpIHtcbiAgY29uc3Qgc2NlbmFyaW8gPSBzY2VuYXJpb3Nbc2NlbmFyaW9OYW1lXVxuXG4gIGlmICghc2NlbmFyaW8pIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmcm9udGVuZCBtb2RlbCBldmVudCBob29rIHNjZW5hcmlvOiAke3NjZW5hcmlvTmFtZX1gKVxuXG4gIHJldHVybiBhd2FpdCBzY2VuYXJpbygpXG59XG4iXX0=
@@ -1,6 +1,7 @@
1
1
  // @ts-check
2
2
  import SystemTestBrowserHelper from "system-testing/build/system-test-browser-helper.js";
3
3
  import BrowserEnvironmentHandler from "../environment-handlers/browser.js";
4
+ import runFrontendModelEventHookScenario from "./browser-frontend-model-event-hook-scenarios.js";
4
5
  const root = document.getElementById("root") || (() => {
5
6
  const element = document.createElement("div");
6
7
  element.id = "root";
@@ -19,6 +20,7 @@ const systemTestBrowserHelper = new SystemTestBrowserHelper();
19
20
  systemTestBrowserHelper.enableOnBrowser();
20
21
  globalThis.velociousBrowserTest = {
21
22
  BrowserEnvironmentHandler,
23
+ runFrontendModelEventHookScenario,
22
24
  systemTestBrowserHelper
23
25
  };
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci10ZXN0LWFwcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2Jyb3dzZXItdGVzdC1hcHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sdUJBQXVCLE1BQU0sb0RBQW9ELENBQUE7QUFDeEYsT0FBTyx5QkFBeUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUUxRSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ3BELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDN0MsT0FBTyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUE7SUFDbkIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDbEMsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtBQUVKLE1BQU0sc0JBQXNCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM1RCxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLHdCQUF3QixDQUFDLENBQUE7QUFDNUUsc0JBQXNCLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUU1RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQy9DLFNBQVMsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0FBQ2xELFNBQVMsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFBO0FBRS9CLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUE7QUFFeEMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLHVCQUF1QixFQUFFLENBQUE7QUFDN0QsdUJBQXVCLENBQUMsZUFBZSxFQUFFLENBQUE7QUFFekMsVUFBVSxDQUFDLG9CQUFvQixHQUFHO0lBQ2hDLHlCQUF5QjtJQUN6Qix1QkFBdUI7Q0FDeEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgZnJvbSBcInN5c3RlbS10ZXN0aW5nL2J1aWxkL3N5c3RlbS10ZXN0LWJyb3dzZXItaGVscGVyLmpzXCJcbmltcG9ydCBCcm93c2VyRW52aXJvbm1lbnRIYW5kbGVyIGZyb20gXCIuLi9lbnZpcm9ubWVudC1oYW5kbGVycy9icm93c2VyLmpzXCJcblxuY29uc3Qgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicm9vdFwiKSB8fCAoKCkgPT4ge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICBlbGVtZW50LmlkID0gXCJyb290XCJcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVtZW50KVxuICByZXR1cm4gZWxlbWVudFxufSkoKVxuXG5jb25zdCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuc3lzdGVtVGVzdGluZ0NvbXBvbmVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXRlc3RpZFwiLCBcInN5c3RlbVRlc3RpbmdDb21wb25lbnRcIilcbnN5c3RlbVRlc3RpbmdDb21wb25lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1mb2N1c3NlZFwiLCBcInRydWVcIilcblxuY29uc3QgYmxhbmtUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuYmxhbmtUZXh0LnNldEF0dHJpYnV0ZShcImRhdGEtdGVzdGlkXCIsIFwiYmxhbmtUZXh0XCIpXG5ibGFua1RleHQudGV4dENvbnRlbnQgPSBcImJsYW5rXCJcblxuc3lzdGVtVGVzdGluZ0NvbXBvbmVudC5hcHBlbmRDaGlsZChibGFua1RleHQpXG5yb290LmFwcGVuZENoaWxkKHN5c3RlbVRlc3RpbmdDb21wb25lbnQpXG5cbmNvbnN0IHN5c3RlbVRlc3RCcm93c2VySGVscGVyID0gbmV3IFN5c3RlbVRlc3RCcm93c2VySGVscGVyKClcbnN5c3RlbVRlc3RCcm93c2VySGVscGVyLmVuYWJsZU9uQnJvd3NlcigpXG5cbmdsb2JhbFRoaXMudmVsb2Npb3VzQnJvd3NlclRlc3QgPSB7XG4gIEJyb3dzZXJFbnZpcm9ubWVudEhhbmRsZXIsXG4gIHN5c3RlbVRlc3RCcm93c2VySGVscGVyXG59XG4iXX0=
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci10ZXN0LWFwcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2Jyb3dzZXItdGVzdC1hcHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sdUJBQXVCLE1BQU0sb0RBQW9ELENBQUE7QUFDeEYsT0FBTyx5QkFBeUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUMxRSxPQUFPLGlDQUFpQyxNQUFNLGtEQUFrRCxDQUFBO0FBRWhHLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDcEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3QyxPQUFPLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQTtJQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNsQyxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDLENBQUMsRUFBRSxDQUFBO0FBRUosTUFBTSxzQkFBc0IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzVELHNCQUFzQixDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsd0JBQXdCLENBQUMsQ0FBQTtBQUM1RSxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBRTVELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDL0MsU0FBUyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUE7QUFDbEQsU0FBUyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUE7QUFFL0Isc0JBQXNCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBQzdDLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtBQUV4QyxNQUFNLHVCQUF1QixHQUFHLElBQUksdUJBQXVCLEVBQUUsQ0FBQTtBQUM3RCx1QkFBdUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQTtBQUV6QyxVQUFVLENBQUMsb0JBQW9CLEdBQUc7SUFDaEMseUJBQXlCO0lBQ3pCLGlDQUFpQztJQUNqQyx1QkFBdUI7Q0FDeEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgZnJvbSBcInN5c3RlbS10ZXN0aW5nL2J1aWxkL3N5c3RlbS10ZXN0LWJyb3dzZXItaGVscGVyLmpzXCJcbmltcG9ydCBCcm93c2VyRW52aXJvbm1lbnRIYW5kbGVyIGZyb20gXCIuLi9lbnZpcm9ubWVudC1oYW5kbGVycy9icm93c2VyLmpzXCJcbmltcG9ydCBydW5Gcm9udGVuZE1vZGVsRXZlbnRIb29rU2NlbmFyaW8gZnJvbSBcIi4vYnJvd3Nlci1mcm9udGVuZC1tb2RlbC1ldmVudC1ob29rLXNjZW5hcmlvcy5qc1wiXG5cbmNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvb3RcIikgfHwgKCgpID0+IHtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgZWxlbWVudC5pZCA9IFwicm9vdFwiXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudClcbiAgcmV0dXJuIGVsZW1lbnRcbn0pKClcblxuY29uc3Qgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbnN5c3RlbVRlc3RpbmdDb21wb25lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS10ZXN0aWRcIiwgXCJzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG5zeXN0ZW1UZXN0aW5nQ29tcG9uZW50LnNldEF0dHJpYnV0ZShcImRhdGEtZm9jdXNzZWRcIiwgXCJ0cnVlXCIpXG5cbmNvbnN0IGJsYW5rVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbmJsYW5rVGV4dC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXRlc3RpZFwiLCBcImJsYW5rVGV4dFwiKVxuYmxhbmtUZXh0LnRleHRDb250ZW50ID0gXCJibGFua1wiXG5cbnN5c3RlbVRlc3RpbmdDb21wb25lbnQuYXBwZW5kQ2hpbGQoYmxhbmtUZXh0KVxucm9vdC5hcHBlbmRDaGlsZChzeXN0ZW1UZXN0aW5nQ29tcG9uZW50KVxuXG5jb25zdCBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlciA9IG5ldyBTeXN0ZW1UZXN0QnJvd3NlckhlbHBlcigpXG5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlci5lbmFibGVPbkJyb3dzZXIoKVxuXG5nbG9iYWxUaGlzLnZlbG9jaW91c0Jyb3dzZXJUZXN0ID0ge1xuICBCcm93c2VyRW52aXJvbm1lbnRIYW5kbGVyLFxuICBydW5Gcm9udGVuZE1vZGVsRXZlbnRIb29rU2NlbmFyaW8sXG4gIHN5c3RlbVRlc3RCcm93c2VySGVscGVyXG59XG4iXX0=
@@ -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/cron-expression.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/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.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/beacon.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/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/migrate.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-database.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/mssql/sql/upsert.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-database.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/mysql/sql/upsert.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-database.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/pgsql/sql/upsert.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-rebuilder.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/sqlite/sql/upsert.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-database-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-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.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/upsert-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/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.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/format.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/beacon.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/outgoing-event-buffer.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/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.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-timing.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/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-node.js","../src/utils/backtrace-cleaner.js","../src/utils/ensure-error.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/model-scope.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.3"}
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/cron-expression.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/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.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/beacon.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/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/migrate.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-database.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/mssql/sql/upsert.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-database.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/mysql/sql/upsert.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-database.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/pgsql/sql/upsert.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-rebuilder.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/sqlite/sql/upsert.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-database-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-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.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/upsert-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/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.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/format.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/beacon.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/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.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/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.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/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.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-timing.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-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.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-node.js","../src/utils/backtrace-cleaner.js","../src/utils/ensure-error.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/model-scope.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.3"}
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.395",
6
+ "version": "1.0.397",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -63,8 +63,14 @@
63
63
  "strftime": "^0.10.2"
64
64
  },
65
65
  "peerDependencies": {
66
+ "react": ">=18",
66
67
  "smtp-connection": "^4.0.2"
67
68
  },
69
+ "peerDependenciesMeta": {
70
+ "react": {
71
+ "optional": true
72
+ }
73
+ },
68
74
  "devDependencies": {
69
75
  "@eslint/js": "^10.0.1",
70
76
  "@types/ejs": "^3.1.5",
@@ -75,6 +81,7 @@
75
81
  "@types/pg": "^8.20.0",
76
82
  "@types/proxy-addr": "^2.0.3",
77
83
  "@types/react": "^19.2.14",
84
+ "@types/react-dom": "^19.2.3",
78
85
  "@types/strftime": "^0.9.8",
79
86
  "chokidar-cli": "^3.0.0",
80
87
  "cpy-cli": "^7.0.0",
@@ -86,6 +93,8 @@
86
93
  "mysql": "^2.18.1",
87
94
  "node-fetch": "^3.3.1",
88
95
  "pg": "^8.16.3",
96
+ "react": "^19.2.0",
97
+ "react-dom": "^19.2.0",
89
98
  "release-patch": "^1.0.0",
90
99
  "require-context": "^1.1.0",
91
100
  "sqlite": "^5.1.1",