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.
- package/README.md +33 -0
- package/build/src/background-jobs/job-runner.d.ts.map +1 -1
- package/build/src/background-jobs/job-runner.js +7 -2
- package/build/src/background-jobs/json-socket.d.ts +4 -0
- package/build/src/background-jobs/json-socket.d.ts.map +1 -1
- package/build/src/background-jobs/json-socket.js +5 -1
- package/build/src/background-jobs/main.d.ts +13 -0
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +47 -5
- package/build/src/background-jobs/store.d.ts +5 -1
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +10 -4
- package/build/src/background-jobs/types.d.ts +3 -1
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +2 -2
- package/build/src/background-jobs/worker.d.ts +16 -9
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +53 -15
- package/build/src/configuration-types.d.ts +24 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +9 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +7 -2
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +28 -0
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +129 -10
- package/build/src/database/record/instance-relationships/has-many.d.ts +2 -0
- package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/has-many.js +13 -1
- package/build/src/frontend-models/clear-pending-debounced-callback.d.ts +6 -0
- package/build/src/frontend-models/clear-pending-debounced-callback.d.ts.map +1 -0
- package/build/src/frontend-models/clear-pending-debounced-callback.js +12 -0
- package/build/src/frontend-models/event-hook-models.d.ts +12 -0
- package/build/src/frontend-models/event-hook-models.d.ts.map +1 -0
- package/build/src/frontend-models/event-hook-models.js +37 -0
- package/build/src/frontend-models/use-created-event.d.ts +17 -0
- package/build/src/frontend-models/use-created-event.d.ts.map +1 -0
- package/build/src/frontend-models/use-created-event.js +19 -0
- package/build/src/frontend-models/use-destroyed-event.d.ts +19 -0
- package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -0
- package/build/src/frontend-models/use-destroyed-event.js +99 -0
- package/build/src/frontend-models/use-model-class-event.d.ts +27 -0
- package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -0
- package/build/src/frontend-models/use-model-class-event.js +112 -0
- package/build/src/frontend-models/use-updated-event.d.ts +20 -0
- package/build/src/frontend-models/use-updated-event.d.ts.map +1 -0
- package/build/src/frontend-models/use-updated-event.js +101 -0
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +35 -0
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -0
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +259 -0
- package/build/src/testing/browser-test-app.js +3 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import useModelClassEvent from "./use-model-class-event.js";
|
|
3
|
+
/** @typedef {typeof import("./base.js").default} FrontendModelClass */
|
|
4
|
+
/** @typedef {import("./use-model-class-event.js").FrontendModelCreateUpdateEventPayload} FrontendModelCreateEventPayload */
|
|
5
|
+
/** @typedef {import("./use-model-class-event.js").UseModelClassEventOptions} UseCreatedEventOptions */
|
|
6
|
+
/** @typedef {(payload: FrontendModelCreateEventPayload) => void} FrontendModelCreateEventCallback */
|
|
7
|
+
/**
|
|
8
|
+
* React hook for frontend-model class create events.
|
|
9
|
+
* @param {FrontendModelClass | null | undefined} modelClass - Frontend model class.
|
|
10
|
+
* @param {FrontendModelCreateEventCallback} callback - Event callback.
|
|
11
|
+
* @param {UseCreatedEventOptions} [options] - Hook options.
|
|
12
|
+
* @returns {void}
|
|
13
|
+
*/
|
|
14
|
+
export default function useCreatedEvent(modelClass, callback, options = {}) {
|
|
15
|
+
useModelClassEvent(modelClass, "create", (payload) => {
|
|
16
|
+
callback(/** @type {FrontendModelCreateEventPayload} */ (payload));
|
|
17
|
+
}, options);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNyZWF0ZWQtZXZlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL3VzZS1jcmVhdGVkLWV2ZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGtCQUFrQixNQUFNLDRCQUE0QixDQUFBO0FBRTNELHVFQUF1RTtBQUN2RSw0SEFBNEg7QUFDNUgsdUdBQXVHO0FBQ3ZHLHFHQUFxRztBQUVyRzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxVQUFVLGVBQWUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sR0FBRyxFQUFFO0lBQ3hFLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNuRCxRQUFRLENBQUMsOENBQThDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQ3BFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHVzZU1vZGVsQ2xhc3NFdmVudCBmcm9tIFwiLi91c2UtbW9kZWwtY2xhc3MtZXZlbnQuanNcIlxuXG4vKiogQHR5cGVkZWYge3R5cGVvZiBpbXBvcnQoXCIuL2Jhc2UuanNcIikuZGVmYXVsdH0gRnJvbnRlbmRNb2RlbENsYXNzICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vdXNlLW1vZGVsLWNsYXNzLWV2ZW50LmpzXCIpLkZyb250ZW5kTW9kZWxDcmVhdGVVcGRhdGVFdmVudFBheWxvYWR9IEZyb250ZW5kTW9kZWxDcmVhdGVFdmVudFBheWxvYWQgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi91c2UtbW9kZWwtY2xhc3MtZXZlbnQuanNcIikuVXNlTW9kZWxDbGFzc0V2ZW50T3B0aW9uc30gVXNlQ3JlYXRlZEV2ZW50T3B0aW9ucyAqL1xuLyoqIEB0eXBlZGVmIHsocGF5bG9hZDogRnJvbnRlbmRNb2RlbENyZWF0ZUV2ZW50UGF5bG9hZCkgPT4gdm9pZH0gRnJvbnRlbmRNb2RlbENyZWF0ZUV2ZW50Q2FsbGJhY2sgKi9cblxuLyoqXG4gKiBSZWFjdCBob29rIGZvciBmcm9udGVuZC1tb2RlbCBjbGFzcyBjcmVhdGUgZXZlbnRzLlxuICogQHBhcmFtIHtGcm9udGVuZE1vZGVsQ2xhc3MgfCBudWxsIHwgdW5kZWZpbmVkfSBtb2RlbENsYXNzIC0gRnJvbnRlbmQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxDcmVhdGVFdmVudENhbGxiYWNrfSBjYWxsYmFjayAtIEV2ZW50IGNhbGxiYWNrLlxuICogQHBhcmFtIHtVc2VDcmVhdGVkRXZlbnRPcHRpb25zfSBbb3B0aW9uc10gLSBIb29rIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ3JlYXRlZEV2ZW50KG1vZGVsQ2xhc3MsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcbiAgdXNlTW9kZWxDbGFzc0V2ZW50KG1vZGVsQ2xhc3MsIFwiY3JlYXRlXCIsIChwYXlsb2FkKSA9PiB7XG4gICAgY2FsbGJhY2soLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsQ3JlYXRlRXZlbnRQYXlsb2FkfSAqLyAocGF5bG9hZCkpXG4gIH0sIG9wdGlvbnMpXG59XG4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for frontend-model destroy events. Pass a model class for class-level
|
|
3
|
+
* destroy events, or a model / model array for instance-level destroy events.
|
|
4
|
+
* @param {FrontendModelClass | FrontendModelInstance | FrontendModelInstance[] | null | undefined} modelClassOrModels - Model class, model, or models.
|
|
5
|
+
* @param {FrontendModelDestroyEventCallback} callback - Event callback.
|
|
6
|
+
* @param {UseDestroyedEventOptions} [options] - Hook options.
|
|
7
|
+
* @returns {void}
|
|
8
|
+
*/
|
|
9
|
+
export default function useDestroyedEvent(modelClassOrModels: FrontendModelClass | FrontendModelInstance | FrontendModelInstance[] | null | undefined, callback: FrontendModelDestroyEventCallback, options?: UseDestroyedEventOptions): void;
|
|
10
|
+
export type FrontendModelClass = typeof import("./base.js").default;
|
|
11
|
+
export type FrontendModelInstance = import("./base.js").default;
|
|
12
|
+
export type FrontendModelClassDestroyEventPayload = import("./use-model-class-event.js").FrontendModelDestroyEventPayload;
|
|
13
|
+
export type FrontendModelInstanceDestroyEventPayload = {
|
|
14
|
+
id: string;
|
|
15
|
+
};
|
|
16
|
+
export type FrontendModelDestroyEventPayload = FrontendModelClassDestroyEventPayload | FrontendModelInstanceDestroyEventPayload;
|
|
17
|
+
export type UseDestroyedEventOptions = import("./use-model-class-event.js").UseModelClassEventOptions;
|
|
18
|
+
export type FrontendModelDestroyEventCallback = (payload: FrontendModelDestroyEventPayload) => void;
|
|
19
|
+
//# sourceMappingURL=use-destroyed-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-destroyed-event.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/use-destroyed-event.js"],"names":[],"mappings":"AA6BA;;;;;;;GAOG;AACH,8DALW,kBAAkB,GAAG,qBAAqB,GAAG,qBAAqB,EAAE,GAAG,IAAI,GAAG,SAAS,YACvF,iCAAiC,YACjC,wBAAwB,GACtB,IAAI,CAWhB;iCArCa,cAAc,WAAW,EAAE,OAAO;oCAClC,OAAO,WAAW,EAAE,OAAO;oDAC3B,OAAO,4BAA4B,EAAE,gCAAgC;uDACrE;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC;+CACZ,qCAAqC,GAAG,wCAAwC;uCAChF,OAAO,4BAA4B,EAAE,yBAAyB;gDAC9D,CAAC,OAAO,EAAE,gCAAgC,KAAK,IAAI"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import debounceFunction from "debounce";
|
|
3
|
+
import { useEffect, useMemo, useRef } from "react";
|
|
4
|
+
import clearPendingDebouncedCallback from "./clear-pending-debounced-callback.js";
|
|
5
|
+
import { modelsDependencyKey, modelsFromInput } from "./event-hook-models.js";
|
|
6
|
+
import useModelClassEvent from "./use-model-class-event.js";
|
|
7
|
+
/** @typedef {typeof import("./base.js").default} FrontendModelClass */
|
|
8
|
+
/** @typedef {import("./base.js").default} FrontendModelInstance */
|
|
9
|
+
/** @typedef {import("./use-model-class-event.js").FrontendModelDestroyEventPayload} FrontendModelClassDestroyEventPayload */
|
|
10
|
+
/** @typedef {{id: string}} FrontendModelInstanceDestroyEventPayload */
|
|
11
|
+
/** @typedef {FrontendModelClassDestroyEventPayload | FrontendModelInstanceDestroyEventPayload} FrontendModelDestroyEventPayload */
|
|
12
|
+
/** @typedef {import("./use-model-class-event.js").UseModelClassEventOptions} UseDestroyedEventOptions */
|
|
13
|
+
/** @typedef {(payload: FrontendModelDestroyEventPayload) => void} FrontendModelDestroyEventCallback */
|
|
14
|
+
/**
|
|
15
|
+
* @param {Record<string, unknown>} restOptions - Unknown options object.
|
|
16
|
+
* @returns {void}
|
|
17
|
+
*/
|
|
18
|
+
function assertNoUnknownOptions(restOptions) {
|
|
19
|
+
const unknownOptionNames = Object.keys(restOptions);
|
|
20
|
+
if (unknownOptionNames.length > 0) {
|
|
21
|
+
throw new Error(`Unknown options given to useDestroyedEvent: ${unknownOptionNames.join(", ")}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* React hook for frontend-model destroy events. Pass a model class for class-level
|
|
26
|
+
* destroy events, or a model / model array for instance-level destroy events.
|
|
27
|
+
* @param {FrontendModelClass | FrontendModelInstance | FrontendModelInstance[] | null | undefined} modelClassOrModels - Model class, model, or models.
|
|
28
|
+
* @param {FrontendModelDestroyEventCallback} callback - Event callback.
|
|
29
|
+
* @param {UseDestroyedEventOptions} [options] - Hook options.
|
|
30
|
+
* @returns {void}
|
|
31
|
+
*/
|
|
32
|
+
export default function useDestroyedEvent(modelClassOrModels, callback, options = {}) {
|
|
33
|
+
const { active = true, debounce = false, onConnected, ...restOptions } = options;
|
|
34
|
+
assertNoUnknownOptions(restOptions);
|
|
35
|
+
const classModel = typeof modelClassOrModels === "function" ? modelClassOrModels : null;
|
|
36
|
+
const instanceModels = typeof modelClassOrModels === "function" ? null : modelClassOrModels;
|
|
37
|
+
useModelClassEvent(classModel, "destroy", callback, { active: active && Boolean(classModel), debounce, onConnected });
|
|
38
|
+
useInstanceDestroyedEvent(instanceModels, callback, { active: active && !classModel, debounce, onConnected });
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @param {FrontendModelInstance | FrontendModelInstance[] | null | undefined} modelOrModels - Model or models.
|
|
42
|
+
* @param {FrontendModelDestroyEventCallback} callback - Event callback.
|
|
43
|
+
* @param {UseDestroyedEventOptions} options - Hook options.
|
|
44
|
+
* @returns {void}
|
|
45
|
+
*/
|
|
46
|
+
function useInstanceDestroyedEvent(modelOrModels, callback, options) {
|
|
47
|
+
const { active = true, debounce = false, onConnected } = options;
|
|
48
|
+
const callbackRef = useRef(callback);
|
|
49
|
+
const activeRef = useRef(active);
|
|
50
|
+
callbackRef.current = callback;
|
|
51
|
+
activeRef.current = active;
|
|
52
|
+
const modelsKey = modelsDependencyKey(modelOrModels);
|
|
53
|
+
const eventCallback = useMemo(() => {
|
|
54
|
+
const wrappedCallback = (/** @type {FrontendModelInstanceDestroyEventPayload} */ payload) => {
|
|
55
|
+
if (activeRef.current)
|
|
56
|
+
callbackRef.current(payload);
|
|
57
|
+
};
|
|
58
|
+
if (typeof debounce === "number")
|
|
59
|
+
return debounceFunction(wrappedCallback, debounce);
|
|
60
|
+
if (debounce)
|
|
61
|
+
return debounceFunction(wrappedCallback);
|
|
62
|
+
return wrappedCallback;
|
|
63
|
+
}, [debounce]);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (!active)
|
|
66
|
+
return undefined;
|
|
67
|
+
const models = modelsFromInput(modelOrModels);
|
|
68
|
+
if (models.length < 1)
|
|
69
|
+
return undefined;
|
|
70
|
+
let closed = false;
|
|
71
|
+
/** @type {Array<() => void>} */
|
|
72
|
+
const unsubscribeCallbacks = [];
|
|
73
|
+
const subscriptionCallback = (/** @type {FrontendModelInstanceDestroyEventPayload} */ payload) => {
|
|
74
|
+
if (!closed)
|
|
75
|
+
eventCallback(payload);
|
|
76
|
+
};
|
|
77
|
+
void (async () => {
|
|
78
|
+
for (const model of models) {
|
|
79
|
+
const unsubscribe = await model.onDestroy(subscriptionCallback);
|
|
80
|
+
if (closed) {
|
|
81
|
+
unsubscribe();
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
unsubscribeCallbacks.push(unsubscribe);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (!closed && onConnected)
|
|
88
|
+
onConnected();
|
|
89
|
+
})();
|
|
90
|
+
return () => {
|
|
91
|
+
closed = true;
|
|
92
|
+
for (const unsubscribe of unsubscribeCallbacks) {
|
|
93
|
+
unsubscribe();
|
|
94
|
+
}
|
|
95
|
+
clearPendingDebouncedCallback(eventCallback);
|
|
96
|
+
};
|
|
97
|
+
}, [active, eventCallback, modelsKey, onConnected]);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWRlc3Ryb3llZC1ldmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbHMvdXNlLWRlc3Ryb3llZC1ldmVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxnQkFBZ0IsTUFBTSxVQUFVLENBQUE7QUFDdkMsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFDLE1BQU0sT0FBTyxDQUFBO0FBRWhELE9BQU8sNkJBQTZCLE1BQU0sdUNBQXVDLENBQUE7QUFDakYsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQzNFLE9BQU8sa0JBQWtCLE1BQU0sNEJBQTRCLENBQUE7QUFFM0QsdUVBQXVFO0FBQ3ZFLG1FQUFtRTtBQUNuRSw2SEFBNkg7QUFDN0gsdUVBQXVFO0FBQ3ZFLG1JQUFtSTtBQUNuSSx5R0FBeUc7QUFDekcsdUdBQXVHO0FBRXZHOzs7R0FHRztBQUNILFNBQVMsc0JBQXNCLENBQUMsV0FBVztJQUN6QyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFbkQsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0Msa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNqRyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsT0FBTyxVQUFVLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxPQUFPLEdBQUcsRUFBRTtJQUNsRixNQUFNLEVBQUMsTUFBTSxHQUFHLElBQUksRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLFdBQVcsRUFBQyxHQUFHLE9BQU8sQ0FB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QkFDeEMsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxJQUFJLFdBQVc7Z0JBQUUsV0FBVyxFQUFFLENBQUE7UUFDM0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVKLE9BQU8sR0FBRyxFQUFFO1lBQ1YsTUFBTSxHQUFHLElBQUksQ0FBQTtZQUViLEtBQUssTUFBTSxXQUFXLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDL0MsV0FBVyxFQUFFLENBQUE7WUFDZixDQUFDO1lBRUQsNkJBQTZCLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDOUMsQ0FBQyxDQUFBO0lBQ0gsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBkZWJvdW5jZUZ1bmN0aW9uIGZyb20gXCJkZWJvdW5jZVwiXG5pbXBvcnQge3VzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmfSBmcm9tIFwicmVhY3RcIlxuXG5pbXBvcnQgY2xlYXJQZW5kaW5nRGVib3VuY2VkQ2FsbGJhY2sgZnJvbSBcIi4vY2xlYXItcGVuZGluZy1kZWJvdW5jZWQtY2FsbGJhY2suanNcIlxuaW1wb3J0IHttb2RlbHNEZXBlbmRlbmN5S2V5LCBtb2RlbHNGcm9tSW5wdXR9IGZyb20gXCIuL2V2ZW50LWhvb2stbW9kZWxzLmpzXCJcbmltcG9ydCB1c2VNb2RlbENsYXNzRXZlbnQgZnJvbSBcIi4vdXNlLW1vZGVsLWNsYXNzLWV2ZW50LmpzXCJcblxuLyoqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLmpzXCIpLmRlZmF1bHR9IEZyb250ZW5kTW9kZWxDbGFzcyAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuZGVmYXVsdH0gRnJvbnRlbmRNb2RlbEluc3RhbmNlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vdXNlLW1vZGVsLWNsYXNzLWV2ZW50LmpzXCIpLkZyb250ZW5kTW9kZWxEZXN0cm95RXZlbnRQYXlsb2FkfSBGcm9udGVuZE1vZGVsQ2xhc3NEZXN0cm95RXZlbnRQYXlsb2FkICovXG4vKiogQHR5cGVkZWYge3tpZDogc3RyaW5nfX0gRnJvbnRlbmRNb2RlbEluc3RhbmNlRGVzdHJveUV2ZW50UGF5bG9hZCAqL1xuLyoqIEB0eXBlZGVmIHtGcm9udGVuZE1vZGVsQ2xhc3NEZXN0cm95RXZlbnRQYXlsb2FkIHwgRnJvbnRlbmRNb2RlbEluc3RhbmNlRGVzdHJveUV2ZW50UGF5bG9hZH0gRnJvbnRlbmRNb2RlbERlc3Ryb3lFdmVudFBheWxvYWQgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi91c2UtbW9kZWwtY2xhc3MtZXZlbnQuanNcIikuVXNlTW9kZWxDbGFzc0V2ZW50T3B0aW9uc30gVXNlRGVzdHJveWVkRXZlbnRPcHRpb25zICovXG4vKiogQHR5cGVkZWYgeyhwYXlsb2FkOiBGcm9udGVuZE1vZGVsRGVzdHJveUV2ZW50UGF5bG9hZCkgPT4gdm9pZH0gRnJvbnRlbmRNb2RlbERlc3Ryb3lFdmVudENhbGxiYWNrICovXG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gcmVzdE9wdGlvbnMgLSBVbmtub3duIG9wdGlvbnMgb2JqZWN0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vVW5rbm93bk9wdGlvbnMocmVzdE9wdGlvbnMpIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbk5hbWVzID0gT2JqZWN0LmtleXMocmVzdE9wdGlvbnMpXG5cbiAgaWYgKHVua25vd25PcHRpb25OYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9wdGlvbnMgZ2l2ZW4gdG8gdXNlRGVzdHJveWVkRXZlbnQ6ICR7dW5rbm93bk9wdGlvbk5hbWVzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG59XG5cbi8qKlxuICogUmVhY3QgaG9vayBmb3IgZnJvbnRlbmQtbW9kZWwgZGVzdHJveSBldmVudHMuIFBhc3MgYSBtb2RlbCBjbGFzcyBmb3IgY2xhc3MtbGV2ZWxcbiAqIGRlc3Ryb3kgZXZlbnRzLCBvciBhIG1vZGVsIC8gbW9kZWwgYXJyYXkgZm9yIGluc3RhbmNlLWxldmVsIGRlc3Ryb3kgZXZlbnRzLlxuICogQHBhcmFtIHtGcm9udGVuZE1vZGVsQ2xhc3MgfCBGcm9udGVuZE1vZGVsSW5zdGFuY2UgfCBGcm9udGVuZE1vZGVsSW5zdGFuY2VbXSB8IG51bGwgfCB1bmRlZmluZWR9IG1vZGVsQ2xhc3NPck1vZGVscyAtIE1vZGVsIGNsYXNzLCBtb2RlbCwgb3IgbW9kZWxzLlxuICogQHBhcmFtIHtGcm9udGVuZE1vZGVsRGVzdHJveUV2ZW50Q2FsbGJhY2t9IGNhbGxiYWNrIC0gRXZlbnQgY2FsbGJhY2suXG4gKiBAcGFyYW0ge1VzZURlc3Ryb3llZEV2ZW50T3B0aW9uc30gW29wdGlvbnNdIC0gSG9vayBvcHRpb25zLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZURlc3Ryb3llZEV2ZW50KG1vZGVsQ2xhc3NPck1vZGVscywgY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7YWN0aXZlID0gdHJ1ZSwgZGVib3VuY2UgPSBmYWxzZSwgb25Db25uZWN0ZWQsIC4uLnJlc3RPcHRpb25zfSA9IG9wdGlvbnNcbiAgYXNzZXJ0Tm9Vbmtub3duT3B0aW9ucyhyZXN0T3B0aW9ucylcblxuICBjb25zdCBjbGFzc01vZGVsID0gdHlwZW9mIG1vZGVsQ2xhc3NPck1vZGVscyA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWxDbGFzc09yTW9kZWxzIDogbnVsbFxuICBjb25zdCBpbnN0YW5jZU1vZGVscyA9IHR5cGVvZiBtb2RlbENsYXNzT3JNb2RlbHMgPT09IFwiZnVuY3Rpb25cIiA/IG51bGwgOiBtb2RlbENsYXNzT3JNb2RlbHNcblxuICB1c2VNb2RlbENsYXNzRXZlbnQoY2xhc3NNb2RlbCwgXCJkZXN0cm95XCIsIGNhbGxiYWNrLCB7YWN0aXZlOiBhY3RpdmUgJiYgQm9vbGVhbihjbGFzc01vZGVsKSwgZGVib3VuY2UsIG9uQ29ubmVjdGVkfSlcbiAgdXNlSW5zdGFuY2VEZXN0cm95ZWRFdmVudChpbnN0YW5jZU1vZGVscywgY2FsbGJhY2ssIHthY3RpdmU6IGFjdGl2ZSAmJiAhY2xhc3NNb2RlbCwgZGVib3VuY2UsIG9uQ29ubmVjdGVkfSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxJbnN0YW5jZSB8IEZyb250ZW5kTW9kZWxJbnN0YW5jZVtdIHwgbnVsbCB8IHVuZGVmaW5lZH0gbW9kZWxPck1vZGVscyAtIE1vZGVsIG9yIG1vZGVscy5cbiAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbERlc3Ryb3lFdmVudENhbGxiYWNrfSBjYWxsYmFjayAtIEV2ZW50IGNhbGxiYWNrLlxuICogQHBhcmFtIHtVc2VEZXN0cm95ZWRFdmVudE9wdGlvbnN9IG9wdGlvbnMgLSBIb29rIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdXNlSW5zdGFuY2VEZXN0cm95ZWRFdmVudChtb2RlbE9yTW9kZWxzLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICBjb25zdCB7YWN0aXZlID0gdHJ1ZSwgZGVib3VuY2UgPSBmYWxzZSwgb25Db25uZWN0ZWR9ID0gb3B0aW9uc1xuICBjb25zdCBjYWxsYmFja1JlZiA9IHVzZVJlZihjYWxsYmFjaylcbiAgY29uc3QgYWN0aXZlUmVmID0gdXNlUmVmKGFjdGl2ZSlcbiAgY2FsbGJhY2tSZWYuY3VycmVudCA9IGNhbGxiYWNrXG4gIGFjdGl2ZVJlZi5jdXJyZW50ID0gYWN0aXZlXG5cbiAgY29uc3QgbW9kZWxzS2V5ID0gbW9kZWxzRGVwZW5kZW5jeUtleShtb2RlbE9yTW9kZWxzKVxuICBjb25zdCBldmVudENhbGxiYWNrID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlZENhbGxiYWNrID0gKC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbEluc3RhbmNlRGVzdHJveUV2ZW50UGF5bG9hZH0gKi8gcGF5bG9hZCkgPT4ge1xuICAgICAgaWYgKGFjdGl2ZVJlZi5jdXJyZW50KSBjYWxsYmFja1JlZi5jdXJyZW50KHBheWxvYWQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZWJvdW5jZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGRlYm91bmNlRnVuY3Rpb24od3JhcHBlZENhbGxiYWNrLCBkZWJvdW5jZSlcbiAgICBpZiAoZGVib3VuY2UpIHJldHVybiBkZWJvdW5jZUZ1bmN0aW9uKHdyYXBwZWRDYWxsYmFjaylcblxuICAgIHJldHVybiB3cmFwcGVkQ2FsbGJhY2tcbiAgfSwgW2RlYm91bmNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghYWN0aXZlKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBjb25zdCBtb2RlbHMgPSBtb2RlbHNGcm9tSW5wdXQobW9kZWxPck1vZGVscylcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA8IDEpIHJldHVybiB1bmRlZmluZWRcblxuICAgIGxldCBjbG9zZWQgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7QXJyYXk8KCkgPT4gdm9pZD59ICovXG4gICAgY29uc3QgdW5zdWJzY3JpYmVDYWxsYmFja3MgPSBbXVxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbkNhbGxiYWNrID0gKC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbEluc3RhbmNlRGVzdHJveUV2ZW50UGF5bG9hZH0gKi8gcGF5bG9hZCkgPT4ge1xuICAgICAgaWYgKCFjbG9zZWQpIGV2ZW50Q2FsbGJhY2socGF5bG9hZClcbiAgICB9XG5cbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVscykge1xuICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IGF3YWl0IG1vZGVsLm9uRGVzdHJveShzdWJzY3JpcHRpb25DYWxsYmFjaylcblxuICAgICAgICBpZiAoY2xvc2VkKSB7XG4gICAgICAgICAgdW5zdWJzY3JpYmUoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Vic2NyaWJlQ2FsbGJhY2tzLnB1c2godW5zdWJzY3JpYmUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFjbG9zZWQgJiYgb25Db25uZWN0ZWQpIG9uQ29ubmVjdGVkKClcbiAgICB9KSgpXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xvc2VkID0gdHJ1ZVxuXG4gICAgICBmb3IgKGNvbnN0IHVuc3Vic2NyaWJlIG9mIHVuc3Vic2NyaWJlQ2FsbGJhY2tzKSB7XG4gICAgICAgIHVuc3Vic2NyaWJlKClcbiAgICAgIH1cblxuICAgICAgY2xlYXJQZW5kaW5nRGVib3VuY2VkQ2FsbGJhY2soZXZlbnRDYWxsYmFjaylcbiAgICB9XG4gIH0sIFthY3RpdmUsIGV2ZW50Q2FsbGJhY2ssIG1vZGVsc0tleSwgb25Db25uZWN0ZWRdKVxufVxuIl19
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for frontend-model class lifecycle events.
|
|
3
|
+
* @param {FrontendModelClass | null | undefined} modelClass - Frontend model class.
|
|
4
|
+
* @param {FrontendModelClassEventName | FrontendModelClassEventName[]} eventOrEvents - Event name or names.
|
|
5
|
+
* @param {FrontendModelClassEventCallback} callback - Event callback.
|
|
6
|
+
* @param {UseModelClassEventOptions} [options] - Hook options.
|
|
7
|
+
* @returns {void}
|
|
8
|
+
*/
|
|
9
|
+
export default function useModelClassEvent(modelClass: FrontendModelClass | null | undefined, eventOrEvents: FrontendModelClassEventName | FrontendModelClassEventName[], callback: FrontendModelClassEventCallback, options?: UseModelClassEventOptions): void;
|
|
10
|
+
export type FrontendModelClass = typeof import("./base.js").default;
|
|
11
|
+
export type FrontendModelInstance = InstanceType<FrontendModelClass>;
|
|
12
|
+
export type FrontendModelClassEventName = "create" | "update" | "destroy";
|
|
13
|
+
export type FrontendModelCreateUpdateEventPayload = {
|
|
14
|
+
id: string;
|
|
15
|
+
model: FrontendModelInstance;
|
|
16
|
+
};
|
|
17
|
+
export type FrontendModelDestroyEventPayload = {
|
|
18
|
+
id: string;
|
|
19
|
+
};
|
|
20
|
+
export type FrontendModelClassEventPayload = FrontendModelCreateUpdateEventPayload | FrontendModelDestroyEventPayload;
|
|
21
|
+
export type FrontendModelClassEventCallback = (payload: FrontendModelClassEventPayload) => void;
|
|
22
|
+
export type UseModelClassEventOptions = {
|
|
23
|
+
active?: boolean;
|
|
24
|
+
debounce?: boolean | number;
|
|
25
|
+
onConnected?: () => void;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=use-model-class-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-model-class-event.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/use-model-class-event.js"],"names":[],"mappings":"AA0DA;;;;;;;GAOG;AACH,uDANW,kBAAkB,GAAG,IAAI,GAAG,SAAS,iBACrC,2BAA2B,GAAG,2BAA2B,EAAE,YAC3D,+BAA+B,YAC/B,yBAAyB,GACvB,IAAI,CA0DhB;iCAnHa,cAAc,WAAW,EAAE,OAAO;oCAClC,YAAY,CAAC,kBAAkB,CAAC;0CAChC,QAAQ,GAAG,QAAQ,GAAG,SAAS;oDAC/B;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAC;+CAC1C;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC;6CACZ,qCAAqC,GAAG,gCAAgC;8CACxE,CAAC,OAAO,EAAE,8BAA8B,KAAK,IAAI;wCACjD;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import debounceFunction from "debounce";
|
|
3
|
+
import { useEffect, useMemo, useRef } from "react";
|
|
4
|
+
import clearPendingDebouncedCallback from "./clear-pending-debounced-callback.js";
|
|
5
|
+
/** @typedef {typeof import("./base.js").default} FrontendModelClass */
|
|
6
|
+
/** @typedef {InstanceType<FrontendModelClass>} FrontendModelInstance */
|
|
7
|
+
/** @typedef {"create" | "update" | "destroy"} FrontendModelClassEventName */
|
|
8
|
+
/** @typedef {{id: string, model: FrontendModelInstance}} FrontendModelCreateUpdateEventPayload */
|
|
9
|
+
/** @typedef {{id: string}} FrontendModelDestroyEventPayload */
|
|
10
|
+
/** @typedef {FrontendModelCreateUpdateEventPayload | FrontendModelDestroyEventPayload} FrontendModelClassEventPayload */
|
|
11
|
+
/** @typedef {(payload: FrontendModelClassEventPayload) => void} FrontendModelClassEventCallback */
|
|
12
|
+
/** @typedef {{active?: boolean, debounce?: boolean | number, onConnected?: () => void}} UseModelClassEventOptions */
|
|
13
|
+
/**
|
|
14
|
+
* @param {FrontendModelClassEventName | FrontendModelClassEventName[]} eventOrEvents - Event name or names.
|
|
15
|
+
* @returns {FrontendModelClassEventName[]} - Normalized event names.
|
|
16
|
+
*/
|
|
17
|
+
function normalizeEventNames(eventOrEvents) {
|
|
18
|
+
return Array.isArray(eventOrEvents) ? eventOrEvents : [eventOrEvents];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @param {FrontendModelClassEventName[]} eventNames - Event names.
|
|
22
|
+
* @returns {string} - Stable dependency key.
|
|
23
|
+
*/
|
|
24
|
+
function eventNamesDependencyKey(eventNames) {
|
|
25
|
+
return eventNames.join("|");
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @param {Record<string, unknown>} restOptions - Unknown options object.
|
|
29
|
+
* @returns {void}
|
|
30
|
+
*/
|
|
31
|
+
function assertNoUnknownOptions(restOptions) {
|
|
32
|
+
const unknownOptionNames = Object.keys(restOptions);
|
|
33
|
+
if (unknownOptionNames.length > 0) {
|
|
34
|
+
throw new Error(`Unknown options given to useModelClassEvent: ${unknownOptionNames.join(", ")}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @param {FrontendModelClass} modelClass - Frontend model class.
|
|
39
|
+
* @param {FrontendModelClassEventName} eventName - Event name.
|
|
40
|
+
* @param {FrontendModelClassEventCallback} callback - Event callback.
|
|
41
|
+
* @returns {Promise<() => void>} - Unsubscribe callback.
|
|
42
|
+
*/
|
|
43
|
+
async function subscribeToModelClassEvent(modelClass, eventName, callback) {
|
|
44
|
+
if (eventName === "create")
|
|
45
|
+
return await modelClass.onCreate(callback);
|
|
46
|
+
if (eventName === "update")
|
|
47
|
+
return await modelClass.onUpdate(callback);
|
|
48
|
+
if (eventName === "destroy")
|
|
49
|
+
return await modelClass.onDestroy(callback);
|
|
50
|
+
throw new Error(`Unsupported frontend model class event: ${eventName}`);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* React hook for frontend-model class lifecycle events.
|
|
54
|
+
* @param {FrontendModelClass | null | undefined} modelClass - Frontend model class.
|
|
55
|
+
* @param {FrontendModelClassEventName | FrontendModelClassEventName[]} eventOrEvents - Event name or names.
|
|
56
|
+
* @param {FrontendModelClassEventCallback} callback - Event callback.
|
|
57
|
+
* @param {UseModelClassEventOptions} [options] - Hook options.
|
|
58
|
+
* @returns {void}
|
|
59
|
+
*/
|
|
60
|
+
export default function useModelClassEvent(modelClass, eventOrEvents, callback, options = {}) {
|
|
61
|
+
const { active = true, debounce = false, onConnected, ...restOptions } = options;
|
|
62
|
+
assertNoUnknownOptions(restOptions);
|
|
63
|
+
const callbackRef = useRef(callback);
|
|
64
|
+
const activeRef = useRef(active);
|
|
65
|
+
callbackRef.current = callback;
|
|
66
|
+
activeRef.current = active;
|
|
67
|
+
const eventNames = normalizeEventNames(eventOrEvents);
|
|
68
|
+
const eventsKey = eventNamesDependencyKey(eventNames);
|
|
69
|
+
const eventCallback = useMemo(() => {
|
|
70
|
+
const wrappedCallback = (/** @type {FrontendModelClassEventPayload} */ payload) => {
|
|
71
|
+
if (activeRef.current)
|
|
72
|
+
callbackRef.current(payload);
|
|
73
|
+
};
|
|
74
|
+
if (typeof debounce === "number")
|
|
75
|
+
return debounceFunction(wrappedCallback, debounce);
|
|
76
|
+
if (debounce)
|
|
77
|
+
return debounceFunction(wrappedCallback);
|
|
78
|
+
return wrappedCallback;
|
|
79
|
+
}, [debounce]);
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
if (!active || !modelClass)
|
|
82
|
+
return undefined;
|
|
83
|
+
let closed = false;
|
|
84
|
+
/** @type {Array<() => void>} */
|
|
85
|
+
const unsubscribeCallbacks = [];
|
|
86
|
+
const subscriptionCallback = (/** @type {FrontendModelClassEventPayload} */ payload) => {
|
|
87
|
+
if (!closed)
|
|
88
|
+
eventCallback(payload);
|
|
89
|
+
};
|
|
90
|
+
void (async () => {
|
|
91
|
+
for (const eventName of eventNames) {
|
|
92
|
+
const unsubscribe = await subscribeToModelClassEvent(modelClass, eventName, subscriptionCallback);
|
|
93
|
+
if (closed) {
|
|
94
|
+
unsubscribe();
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
unsubscribeCallbacks.push(unsubscribe);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (!closed && onConnected)
|
|
101
|
+
onConnected();
|
|
102
|
+
})();
|
|
103
|
+
return () => {
|
|
104
|
+
closed = true;
|
|
105
|
+
for (const unsubscribe of unsubscribeCallbacks) {
|
|
106
|
+
unsubscribe();
|
|
107
|
+
}
|
|
108
|
+
clearPendingDebouncedCallback(eventCallback);
|
|
109
|
+
};
|
|
110
|
+
}, [active, eventsKey, eventCallback, modelClass, onConnected]);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLW1vZGVsLWNsYXNzLWV2ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Zyb250ZW5kLW1vZGVscy91c2UtbW9kZWwtY2xhc3MtZXZlbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sZ0JBQWdCLE1BQU0sVUFBVSxDQUFBO0FBQ3ZDLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBQyxNQUFNLE9BQU8sQ0FBQTtBQUVoRCxPQUFPLDZCQUE2QixNQUFNLHVDQUF1QyxDQUFBO0FBRWpGLHVFQUF1RTtBQUN2RSx3RUFBd0U7QUFDeEUsNkVBQTZFO0FBQzdFLGtHQUFrRztBQUNsRywrREFBK0Q7QUFDL0QseUhBQXlIO0FBQ3pILG1HQUFtRztBQUNuRyxxSEFBcUg7QUFFckg7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxhQUFhO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0FBQ3ZFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHVCQUF1QixDQUFDLFVBQVU7SUFDekMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQzdCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLFdBQVc7SUFDekMsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRW5ELElBQUksa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDbEcsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztB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LEVBQUUsQ0FBQTtRQUMzQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRUosT0FBTyxHQUFHLEVBQUU7WUFDVixNQUFNLEdBQUcsSUFBSSxDQUFBO1lBRWIsS0FBSyxNQUFNLFdBQVcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUMvQyxXQUFXLEVBQUUsQ0FBQTtZQUNmLENBQUM7WUFFRCw2QkFBNkIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUM5QyxDQUFDLENBQUE7SUFDSCxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBkZWJvdW5jZUZ1bmN0aW9uIGZyb20gXCJkZWJvdW5jZVwiXG5pbXBvcnQge3VzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmfSBmcm9tIFwicmVhY3RcIlxuXG5pbXBvcnQgY2xlYXJQZW5kaW5nRGVib3VuY2VkQ2FsbGJhY2sgZnJvbSBcIi4vY2xlYXItcGVuZGluZy1kZWJvdW5jZWQtY2FsbGJhY2suanNcIlxuXG4vKiogQHR5cGVkZWYge3R5cGVvZiBpbXBvcnQoXCIuL2Jhc2UuanNcIikuZGVmYXVsdH0gRnJvbnRlbmRNb2RlbENsYXNzICovXG4vKiogQHR5cGVkZWYge0luc3RhbmNlVHlwZTxGcm9udGVuZE1vZGVsQ2xhc3M+fSBGcm9udGVuZE1vZGVsSW5zdGFuY2UgKi9cbi8qKiBAdHlwZWRlZiB7XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIn0gRnJvbnRlbmRNb2RlbENsYXNzRXZlbnROYW1lICovXG4vKiogQHR5cGVkZWYge3tpZDogc3RyaW5nLCBtb2RlbDogRnJvbnRlbmRNb2RlbEluc3RhbmNlfX0gRnJvbnRlbmRNb2RlbENyZWF0ZVVwZGF0ZUV2ZW50UGF5bG9hZCAqL1xuLyoqIEB0eXBlZGVmIHt7aWQ6IHN0cmluZ319IEZyb250ZW5kTW9kZWxEZXN0cm95RXZlbnRQYXlsb2FkICovXG4vKiogQHR5cGVkZWYge0Zyb250ZW5kTW9kZWxDcmVhdGVVcGRhdGVFdmVudFBheWxvYWQgfCBGcm9udGVuZE1vZGVsRGVzdHJveUV2ZW50UGF5bG9hZH0gRnJvbnRlbmRNb2RlbENsYXNzRXZlbnRQYXlsb2FkICovXG4vKiogQHR5cGVkZWYgeyhwYXlsb2FkOiBGcm9udGVuZE1vZGVsQ2xhc3NFdmVudFBheWxvYWQpID0+IHZvaWR9IEZyb250ZW5kTW9kZWxDbGFzc0V2ZW50Q2FsbGJhY2sgKi9cbi8qKiBAdHlwZWRlZiB7e2FjdGl2ZT86IGJvb2xlYW4sIGRlYm91bmNlPzogYm9vbGVhbiB8IG51bWJlciwgb25Db25uZWN0ZWQ/OiAoKSA9PiB2b2lkfX0gVXNlTW9kZWxDbGFzc0V2ZW50T3B0aW9ucyAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbENsYXNzRXZlbnROYW1lIHwgRnJvbnRlbmRNb2RlbENsYXNzRXZlbnROYW1lW119IGV2ZW50T3JFdmVudHMgLSBFdmVudCBuYW1lIG9yIG5hbWVzLlxuICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxDbGFzc0V2ZW50TmFtZVtdfSAtIE5vcm1hbGl6ZWQgZXZlbnQgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV2ZW50TmFtZXMoZXZlbnRPckV2ZW50cykge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShldmVudE9yRXZlbnRzKSA/IGV2ZW50T3JFdmVudHMgOiBbZXZlbnRPckV2ZW50c11cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxDbGFzc0V2ZW50TmFtZVtdfSBldmVudE5hbWVzIC0gRXZlbnQgbmFtZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0YWJsZSBkZXBlbmRlbmN5IGtleS5cbiAqL1xuZnVuY3Rpb24gZXZlbnROYW1lc0RlcGVuZGVuY3lLZXkoZXZlbnROYW1lcykge1xuICByZXR1cm4gZXZlbnROYW1lcy5qb2luKFwifFwiKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IHJlc3RPcHRpb25zIC0gVW5rbm93biBvcHRpb25zIG9iamVjdC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnROb1Vua25vd25PcHRpb25zKHJlc3RPcHRpb25zKSB7XG4gIGNvbnN0IHVua25vd25PcHRpb25OYW1lcyA9IE9iamVjdC5rZXlzKHJlc3RPcHRpb25zKVxuXG4gIGlmICh1bmtub3duT3B0aW9uTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBvcHRpb25zIGdpdmVuIHRvIHVzZU1vZGVsQ2xhc3NFdmVudDogJHt1bmtub3duT3B0aW9uTmFtZXMuam9pbihcIiwgXCIpfWApXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEZyb250ZW5kIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtGcm9udGVuZE1vZGVsQ2xhc3NFdmVudE5hbWV9IGV2ZW50TmFtZSAtIEV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxDbGFzc0V2ZW50Q2FsbGJhY2t9IGNhbGxiYWNrIC0gRXZlbnQgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7UHJvbWlzZTwoKSA9PiB2b2lkPn0gLSBVbnN1YnNjcmliZSBjYWxsYmFjay5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3Vic2NyaWJlVG9Nb2RlbENsYXNzRXZlbnQobW9kZWxDbGFzcywgZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICBpZiAoZXZlbnROYW1lID09PSBcImNyZWF0ZVwiKSByZXR1cm4gYXdhaXQgbW9kZWxDbGFzcy5vbkNyZWF0ZShjYWxsYmFjaylcbiAgaWYgKGV2ZW50TmFtZSA9PT0gXCJ1cGRhdGVcIikgcmV0dXJuIGF3YWl0IG1vZGVsQ2xhc3Mub25VcGRhdGUoY2FsbGJhY2spXG4gIGlmIChldmVudE5hbWUgPT09IFwiZGVzdHJveVwiKSByZXR1cm4gYXdhaXQgbW9kZWxDbGFzcy5vbkRlc3Ryb3koY2FsbGJhY2spXG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBmcm9udGVuZCBtb2RlbCBjbGFzcyBldmVudDogJHtldmVudE5hbWV9YClcbn1cblxuLyoqXG4gKiBSZWFjdCBob29rIGZvciBmcm9udGVuZC1tb2RlbCBjbGFzcyBsaWZlY3ljbGUgZXZlbnRzLlxuICogQHBhcmFtIHtGcm9udGVuZE1vZGVsQ2xhc3MgfCBudWxsIHwgdW5kZWZpbmVkfSBtb2RlbENsYXNzIC0gRnJvbnRlbmQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxDbGFzc0V2ZW50TmFtZSB8IEZyb250ZW5kTW9kZWxDbGFzc0V2ZW50TmFtZVtdfSBldmVudE9yRXZlbnRzIC0gRXZlbnQgbmFtZSBvciBuYW1lcy5cbiAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbENsYXNzRXZlbnRDYWxsYmFja30gY2FsbGJhY2sgLSBFdmVudCBjYWxsYmFjay5cbiAqIEBwYXJhbSB7VXNlTW9kZWxDbGFzc0V2ZW50T3B0aW9uc30gW29wdGlvbnNdIC0gSG9vayBvcHRpb25zLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1vZGVsQ2xhc3NFdmVudChtb2RlbENsYXNzLCBldmVudE9yRXZlbnRzLCBjYWxsYmFjaywgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHthY3RpdmUgPSB0cnVlLCBkZWJvdW5jZSA9IGZhbHNlLCBvbkNvbm5lY3RlZCwgLi4ucmVzdE9wdGlvbnN9ID0gb3B0aW9uc1xuICBhc3NlcnROb1Vua25vd25PcHRpb25zKHJlc3RPcHRpb25zKVxuXG4gIGNvbnN0IGNhbGxiYWNrUmVmID0gdXNlUmVmKGNhbGxiYWNrKVxuICBjb25zdCBhY3RpdmVSZWYgPSB1c2VSZWYoYWN0aXZlKVxuICBjYWxsYmFja1JlZi5jdXJyZW50ID0gY2FsbGJhY2tcbiAgYWN0aXZlUmVmLmN1cnJlbnQgPSBhY3RpdmVcblxuICBjb25zdCBldmVudE5hbWVzID0gbm9ybWFsaXplRXZlbnROYW1lcyhldmVudE9yRXZlbnRzKVxuICBjb25zdCBldmVudHNLZXkgPSBldmVudE5hbWVzRGVwZW5kZW5jeUtleShldmVudE5hbWVzKVxuICBjb25zdCBldmVudENhbGxiYWNrID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlZENhbGxiYWNrID0gKC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbENsYXNzRXZlbnRQYXlsb2FkfSAqLyBwYXlsb2FkKSA9PiB7XG4gICAgICBpZiAoYWN0aXZlUmVmLmN1cnJlbnQpIGNhbGxiYWNrUmVmLmN1cnJlbnQocGF5bG9hZClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlYm91bmNlID09PSBcIm51bWJlclwiKSByZXR1cm4gZGVib3VuY2VGdW5jdGlvbih3cmFwcGVkQ2FsbGJhY2ssIGRlYm91bmNlKVxuICAgIGlmIChkZWJvdW5jZSkgcmV0dXJuIGRlYm91bmNlRnVuY3Rpb24od3JhcHBlZENhbGxiYWNrKVxuXG4gICAgcmV0dXJuIHdyYXBwZWRDYWxsYmFja1xuICB9LCBbZGVib3VuY2VdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFhY3RpdmUgfHwgIW1vZGVsQ2xhc3MpIHJldHVybiB1bmRlZmluZWRcblxuICAgIGxldCBjbG9zZWQgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7QXJyYXk8KCkgPT4gdm9pZD59ICovXG4gICAgY29uc3QgdW5zdWJzY3JpYmVDYWxsYmFja3MgPSBbXVxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbkNhbGxiYWNrID0gKC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbENsYXNzRXZlbnRQYXlsb2FkfSAqLyBwYXlsb2FkKSA9PiB7XG4gICAgICBpZiAoIWNsb3NlZCkgZXZlbnRDYWxsYmFjayhwYXlsb2FkKVxuICAgIH1cblxuICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIGV2ZW50TmFtZXMpIHtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBhd2FpdCBzdWJzY3JpYmVUb01vZGVsQ2xhc3NFdmVudChtb2RlbENsYXNzLCBldmVudE5hbWUsIHN1YnNjcmlwdGlvbkNhbGxiYWNrKVxuXG4gICAgICAgIGlmIChjbG9zZWQpIHtcbiAgICAgICAgICB1bnN1YnNjcmliZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdWJzY3JpYmVDYWxsYmFja3MucHVzaCh1bnN1YnNjcmliZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWNsb3NlZCAmJiBvbkNvbm5lY3RlZCkgb25Db25uZWN0ZWQoKVxuICAgIH0pKClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbG9zZWQgPSB0cnVlXG5cbiAgICAgIGZvciAoY29uc3QgdW5zdWJzY3JpYmUgb2YgdW5zdWJzY3JpYmVDYWxsYmFja3MpIHtcbiAgICAgICAgdW5zdWJzY3JpYmUoKVxuICAgICAgfVxuXG4gICAgICBjbGVhclBlbmRpbmdEZWJvdW5jZWRDYWxsYmFjayhldmVudENhbGxiYWNrKVxuICAgIH1cbiAgfSwgW2FjdGl2ZSwgZXZlbnRzS2V5LCBldmVudENhbGxiYWNrLCBtb2RlbENsYXNzLCBvbkNvbm5lY3RlZF0pXG59XG4iXX0=
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for frontend-model update events. Pass a model class for class-level
|
|
3
|
+
* update events, or a model / model array for instance-level update events.
|
|
4
|
+
* @param {FrontendModelClass | FrontendModelInstance | FrontendModelInstance[] | null | undefined} modelClassOrModels - Model class, model, or models.
|
|
5
|
+
* @param {FrontendModelUpdateEventCallback} callback - Event callback.
|
|
6
|
+
* @param {UseUpdatedEventOptions} [options] - Hook options.
|
|
7
|
+
* @returns {void}
|
|
8
|
+
*/
|
|
9
|
+
export default function useUpdatedEvent(modelClassOrModels: FrontendModelClass | FrontendModelInstance | FrontendModelInstance[] | null | undefined, callback: FrontendModelUpdateEventCallback, options?: UseUpdatedEventOptions): void;
|
|
10
|
+
export type FrontendModelClass = typeof import("./base.js").default;
|
|
11
|
+
export type FrontendModelInstance = import("./base.js").default;
|
|
12
|
+
export type FrontendModelClassUpdateEventPayload = import("./use-model-class-event.js").FrontendModelCreateUpdateEventPayload;
|
|
13
|
+
export type FrontendModelInstanceUpdateEventPayload = {
|
|
14
|
+
id: string;
|
|
15
|
+
model: FrontendModelInstance;
|
|
16
|
+
};
|
|
17
|
+
export type FrontendModelUpdateEventPayload = FrontendModelClassUpdateEventPayload | FrontendModelInstanceUpdateEventPayload;
|
|
18
|
+
export type UseUpdatedEventOptions = import("./use-model-class-event.js").UseModelClassEventOptions;
|
|
19
|
+
export type FrontendModelUpdateEventCallback = (payload: FrontendModelUpdateEventPayload) => void;
|
|
20
|
+
//# sourceMappingURL=use-updated-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-updated-event.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/use-updated-event.js"],"names":[],"mappings":"AA6BA;;;;;;;GAOG;AACH,4DALW,kBAAkB,GAAG,qBAAqB,GAAG,qBAAqB,EAAE,GAAG,IAAI,GAAG,SAAS,YACvF,gCAAgC,YAChC,sBAAsB,GACpB,IAAI,CAahB;iCAvCa,cAAc,WAAW,EAAE,OAAO;oCAClC,OAAO,WAAW,EAAE,OAAO;mDAC3B,OAAO,4BAA4B,EAAE,qCAAqC;sDAC1E;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAC;8CAC1C,oCAAoC,GAAG,uCAAuC;qCAC9E,OAAO,4BAA4B,EAAE,yBAAyB;+CAC9D,CAAC,OAAO,EAAE,+BAA+B,KAAK,IAAI"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import debounceFunction from "debounce";
|
|
3
|
+
import { useEffect, useMemo, useRef } from "react";
|
|
4
|
+
import clearPendingDebouncedCallback from "./clear-pending-debounced-callback.js";
|
|
5
|
+
import { modelsDependencyKey, modelsFromInput } from "./event-hook-models.js";
|
|
6
|
+
import useModelClassEvent from "./use-model-class-event.js";
|
|
7
|
+
/** @typedef {typeof import("./base.js").default} FrontendModelClass */
|
|
8
|
+
/** @typedef {import("./base.js").default} FrontendModelInstance */
|
|
9
|
+
/** @typedef {import("./use-model-class-event.js").FrontendModelCreateUpdateEventPayload} FrontendModelClassUpdateEventPayload */
|
|
10
|
+
/** @typedef {{id: string, model: FrontendModelInstance}} FrontendModelInstanceUpdateEventPayload */
|
|
11
|
+
/** @typedef {FrontendModelClassUpdateEventPayload | FrontendModelInstanceUpdateEventPayload} FrontendModelUpdateEventPayload */
|
|
12
|
+
/** @typedef {import("./use-model-class-event.js").UseModelClassEventOptions} UseUpdatedEventOptions */
|
|
13
|
+
/** @typedef {(payload: FrontendModelUpdateEventPayload) => void} FrontendModelUpdateEventCallback */
|
|
14
|
+
/**
|
|
15
|
+
* @param {Record<string, unknown>} restOptions - Unknown options object.
|
|
16
|
+
* @returns {void}
|
|
17
|
+
*/
|
|
18
|
+
function assertNoUnknownOptions(restOptions) {
|
|
19
|
+
const unknownOptionNames = Object.keys(restOptions);
|
|
20
|
+
if (unknownOptionNames.length > 0) {
|
|
21
|
+
throw new Error(`Unknown options given to useUpdatedEvent: ${unknownOptionNames.join(", ")}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* React hook for frontend-model update events. Pass a model class for class-level
|
|
26
|
+
* update events, or a model / model array for instance-level update events.
|
|
27
|
+
* @param {FrontendModelClass | FrontendModelInstance | FrontendModelInstance[] | null | undefined} modelClassOrModels - Model class, model, or models.
|
|
28
|
+
* @param {FrontendModelUpdateEventCallback} callback - Event callback.
|
|
29
|
+
* @param {UseUpdatedEventOptions} [options] - Hook options.
|
|
30
|
+
* @returns {void}
|
|
31
|
+
*/
|
|
32
|
+
export default function useUpdatedEvent(modelClassOrModels, callback, options = {}) {
|
|
33
|
+
const { active = true, debounce = false, onConnected, ...restOptions } = options;
|
|
34
|
+
assertNoUnknownOptions(restOptions);
|
|
35
|
+
const classModel = typeof modelClassOrModels === "function" ? modelClassOrModels : null;
|
|
36
|
+
const instanceModels = typeof modelClassOrModels === "function" ? null : modelClassOrModels;
|
|
37
|
+
useModelClassEvent(classModel, "update", (payload) => {
|
|
38
|
+
callback(/** @type {FrontendModelClassUpdateEventPayload} */ (payload));
|
|
39
|
+
}, { active: active && Boolean(classModel), debounce, onConnected });
|
|
40
|
+
useInstanceUpdatedEvent(instanceModels, callback, { active: active && !classModel, debounce, onConnected });
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* @param {FrontendModelInstance | FrontendModelInstance[] | null | undefined} modelOrModels - Model or models.
|
|
44
|
+
* @param {FrontendModelUpdateEventCallback} callback - Event callback.
|
|
45
|
+
* @param {UseUpdatedEventOptions} options - Hook options.
|
|
46
|
+
* @returns {void}
|
|
47
|
+
*/
|
|
48
|
+
function useInstanceUpdatedEvent(modelOrModels, callback, options) {
|
|
49
|
+
const { active = true, debounce = false, onConnected } = options;
|
|
50
|
+
const callbackRef = useRef(callback);
|
|
51
|
+
const activeRef = useRef(active);
|
|
52
|
+
callbackRef.current = callback;
|
|
53
|
+
activeRef.current = active;
|
|
54
|
+
const modelsKey = modelsDependencyKey(modelOrModels);
|
|
55
|
+
const eventCallback = useMemo(() => {
|
|
56
|
+
const wrappedCallback = (/** @type {FrontendModelInstanceUpdateEventPayload} */ payload) => {
|
|
57
|
+
if (activeRef.current)
|
|
58
|
+
callbackRef.current(payload);
|
|
59
|
+
};
|
|
60
|
+
if (typeof debounce === "number")
|
|
61
|
+
return debounceFunction(wrappedCallback, debounce);
|
|
62
|
+
if (debounce)
|
|
63
|
+
return debounceFunction(wrappedCallback);
|
|
64
|
+
return wrappedCallback;
|
|
65
|
+
}, [debounce]);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (!active)
|
|
68
|
+
return undefined;
|
|
69
|
+
const models = modelsFromInput(modelOrModels);
|
|
70
|
+
if (models.length < 1)
|
|
71
|
+
return undefined;
|
|
72
|
+
let closed = false;
|
|
73
|
+
/** @type {Array<() => void>} */
|
|
74
|
+
const unsubscribeCallbacks = [];
|
|
75
|
+
const subscriptionCallback = (/** @type {FrontendModelInstanceUpdateEventPayload} */ payload) => {
|
|
76
|
+
if (!closed)
|
|
77
|
+
eventCallback(payload);
|
|
78
|
+
};
|
|
79
|
+
void (async () => {
|
|
80
|
+
for (const model of models) {
|
|
81
|
+
const unsubscribe = await model.onUpdate(subscriptionCallback);
|
|
82
|
+
if (closed) {
|
|
83
|
+
unsubscribe();
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
unsubscribeCallbacks.push(unsubscribe);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (!closed && onConnected)
|
|
90
|
+
onConnected();
|
|
91
|
+
})();
|
|
92
|
+
return () => {
|
|
93
|
+
closed = true;
|
|
94
|
+
for (const unsubscribe of unsubscribeCallbacks) {
|
|
95
|
+
unsubscribe();
|
|
96
|
+
}
|
|
97
|
+
clearPendingDebouncedCallback(eventCallback);
|
|
98
|
+
};
|
|
99
|
+
}, [active, eventCallback, modelsKey, onConnected]);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXVwZGF0ZWQtZXZlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL3VzZS11cGRhdGVkLWV2ZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGdCQUFnQixNQUFNLFVBQVUsQ0FBQTtBQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUMsTUFBTSxPQUFPLENBQUE7QUFFaEQsT0FBTyw2QkFBNkIsTUFBTSx1Q0FBdUMsQ0FBQTtBQUNqRixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDM0UsT0FBTyxrQkFBa0IsTUFBTSw0QkFBNEIsQ0FBQTtBQUUzRCx1RUFBdUU7QUFDdkUsbUVBQW1FO0FBQ25FLGlJQUFpSTtBQUNqSSxvR0FBb0c7QUFDcEcsZ0lBQWdJO0FBQ2hJLHVHQUF1RztBQUN2RyxxR0FBcUc7QUFFckc7OztHQUdHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxXQUFXO0lBQ3pDLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUVuRCxJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQy9GLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxPQUFPLFVBQVUsZUFBZSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxPQUFPLEdBQUcsRUFBRTtJQUNoRixNQUFNLEVBQUMsTUFBTSxHQUFHLElBQUksRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLFdBQVcsRUFBQyxHQUFHLE9BQU8sQ0FBQTtJQUM5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RSxDQUFBO2dCQUNmLENBQUM7cUJBQU0sQ0FBQztvQkFDTixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQ3hDLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXO2dCQUFFLFdBQVcsRUFBRSxDQUFBO1FBQzNDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFSixPQUFPLEdBQUcsRUFBRTtZQUNWLE1BQU0sR0FBRyxJQUFJLENBQUE7WUFFYixLQUFLLE1BQU0sV0FBVyxJQUFJLG9CQUFvQixFQUFFLENBQUM7Z0JBQy9DLFdBQVcsRUFBRSxDQUFBO1lBQ2YsQ0FBQztZQUVELDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQzlDLENBQUMsQ0FBQTtJQUNILENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUE7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgZGVib3VuY2VGdW5jdGlvbiBmcm9tIFwiZGVib3VuY2VcIlxuaW1wb3J0IHt1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZn0gZnJvbSBcInJlYWN0XCJcblxuaW1wb3J0IGNsZWFyUGVuZGluZ0RlYm91bmNlZENhbGxiYWNrIGZyb20gXCIuL2NsZWFyLXBlbmRpbmctZGVib3VuY2VkLWNhbGxiYWNrLmpzXCJcbmltcG9ydCB7bW9kZWxzRGVwZW5kZW5jeUtleSwgbW9kZWxzRnJvbUlucHV0fSBmcm9tIFwiLi9ldmVudC1ob29rLW1vZGVscy5qc1wiXG5pbXBvcnQgdXNlTW9kZWxDbGFzc0V2ZW50IGZyb20gXCIuL3VzZS1tb2RlbC1jbGFzcy1ldmVudC5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS5qc1wiKS5kZWZhdWx0fSBGcm9udGVuZE1vZGVsQ2xhc3MgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLmRlZmF1bHR9IEZyb250ZW5kTW9kZWxJbnN0YW5jZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3VzZS1tb2RlbC1jbGFzcy1ldmVudC5qc1wiKS5Gcm9udGVuZE1vZGVsQ3JlYXRlVXBkYXRlRXZlbnRQYXlsb2FkfSBGcm9udGVuZE1vZGVsQ2xhc3NVcGRhdGVFdmVudFBheWxvYWQgKi9cbi8qKiBAdHlwZWRlZiB7e2lkOiBzdHJpbmcsIG1vZGVsOiBGcm9udGVuZE1vZGVsSW5zdGFuY2V9fSBGcm9udGVuZE1vZGVsSW5zdGFuY2VVcGRhdGVFdmVudFBheWxvYWQgKi9cbi8qKiBAdHlwZWRlZiB7RnJvbnRlbmRNb2RlbENsYXNzVXBkYXRlRXZlbnRQYXlsb2FkIHwgRnJvbnRlbmRNb2RlbEluc3RhbmNlVXBkYXRlRXZlbnRQYXlsb2FkfSBGcm9udGVuZE1vZGVsVXBkYXRlRXZlbnRQYXlsb2FkICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vdXNlLW1vZGVsLWNsYXNzLWV2ZW50LmpzXCIpLlVzZU1vZGVsQ2xhc3NFdmVudE9wdGlvbnN9IFVzZVVwZGF0ZWRFdmVudE9wdGlvbnMgKi9cbi8qKiBAdHlwZWRlZiB7KHBheWxvYWQ6IEZyb250ZW5kTW9kZWxVcGRhdGVFdmVudFBheWxvYWQpID0+IHZvaWR9IEZyb250ZW5kTW9kZWxVcGRhdGVFdmVudENhbGxiYWNrICovXG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gcmVzdE9wdGlvbnMgLSBVbmtub3duIG9wdGlvbnMgb2JqZWN0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vVW5rbm93bk9wdGlvbnMocmVzdE9wdGlvbnMpIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbk5hbWVzID0gT2JqZWN0LmtleXMocmVzdE9wdGlvbnMpXG5cbiAgaWYgKHVua25vd25PcHRpb25OYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9wdGlvbnMgZ2l2ZW4gdG8gdXNlVXBkYXRlZEV2ZW50OiAke3Vua25vd25PcHRpb25OYW1lcy5qb2luKFwiLCBcIil9YClcbiAgfVxufVxuXG4vKipcbiAqIFJlYWN0IGhvb2sgZm9yIGZyb250ZW5kLW1vZGVsIHVwZGF0ZSBldmVudHMuIFBhc3MgYSBtb2RlbCBjbGFzcyBmb3IgY2xhc3MtbGV2ZWxcbiAqIHVwZGF0ZSBldmVudHMsIG9yIGEgbW9kZWwgLyBtb2RlbCBhcnJheSBmb3IgaW5zdGFuY2UtbGV2ZWwgdXBkYXRlIGV2ZW50cy5cbiAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbENsYXNzIHwgRnJvbnRlbmRNb2RlbEluc3RhbmNlIHwgRnJvbnRlbmRNb2RlbEluc3RhbmNlW10gfCBudWxsIHwgdW5kZWZpbmVkfSBtb2RlbENsYXNzT3JNb2RlbHMgLSBNb2RlbCBjbGFzcywgbW9kZWwsIG9yIG1vZGVscy5cbiAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbFVwZGF0ZUV2ZW50Q2FsbGJhY2t9IGNhbGxiYWNrIC0gRXZlbnQgY2FsbGJhY2suXG4gKiBAcGFyYW0ge1VzZVVwZGF0ZWRFdmVudE9wdGlvbnN9IFtvcHRpb25zXSAtIEhvb2sgb3B0aW9ucy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VVcGRhdGVkRXZlbnQobW9kZWxDbGFzc09yTW9kZWxzLCBjYWxsYmFjaywgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHthY3RpdmUgPSB0cnVlLCBkZWJvdW5jZSA9IGZhbHNlLCBvbkNvbm5lY3RlZCwgLi4ucmVzdE9wdGlvbnN9ID0gb3B0aW9uc1xuICBhc3NlcnROb1Vua25vd25PcHRpb25zKHJlc3RPcHRpb25zKVxuXG4gIGNvbnN0IGNsYXNzTW9kZWwgPSB0eXBlb2YgbW9kZWxDbGFzc09yTW9kZWxzID09PSBcImZ1bmN0aW9uXCIgPyBtb2RlbENsYXNzT3JNb2RlbHMgOiBudWxsXG4gIGNvbnN0IGluc3RhbmNlTW9kZWxzID0gdHlwZW9mIG1vZGVsQ2xhc3NPck1vZGVscyA9PT0gXCJmdW5jdGlvblwiID8gbnVsbCA6IG1vZGVsQ2xhc3NPck1vZGVsc1xuXG4gIHVzZU1vZGVsQ2xhc3NFdmVudChjbGFzc01vZGVsLCBcInVwZGF0ZVwiLCAocGF5bG9hZCkgPT4ge1xuICAgIGNhbGxiYWNrKC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbENsYXNzVXBkYXRlRXZlbnRQYXlsb2FkfSAqLyAocGF5bG9hZCkpXG4gIH0sIHthY3RpdmU6IGFjdGl2ZSAmJiBCb29sZWFuKGNsYXNzTW9kZWwpLCBkZWJvdW5jZSwgb25Db25uZWN0ZWR9KVxuICB1c2VJbnN0YW5jZVVwZGF0ZWRFdmVudChpbnN0YW5jZU1vZGVscywgY2FsbGJhY2ssIHthY3RpdmU6IGFjdGl2ZSAmJiAhY2xhc3NNb2RlbCwgZGVib3VuY2UsIG9uQ29ubmVjdGVkfSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxJbnN0YW5jZSB8IEZyb250ZW5kTW9kZWxJbnN0YW5jZVtdIHwgbnVsbCB8IHVuZGVmaW5lZH0gbW9kZWxPck1vZGVscyAtIE1vZGVsIG9yIG1vZGVscy5cbiAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbFVwZGF0ZUV2ZW50Q2FsbGJhY2t9IGNhbGxiYWNrIC0gRXZlbnQgY2FsbGJhY2suXG4gKiBAcGFyYW0ge1VzZVVwZGF0ZWRFdmVudE9wdGlvbnN9IG9wdGlvbnMgLSBIb29rIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdXNlSW5zdGFuY2VVcGRhdGVkRXZlbnQobW9kZWxPck1vZGVscywgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgY29uc3Qge2FjdGl2ZSA9IHRydWUsIGRlYm91bmNlID0gZmFsc2UsIG9uQ29ubmVjdGVkfSA9IG9wdGlvbnNcbiAgY29uc3QgY2FsbGJhY2tSZWYgPSB1c2VSZWYoY2FsbGJhY2spXG4gIGNvbnN0IGFjdGl2ZVJlZiA9IHVzZVJlZihhY3RpdmUpXG4gIGNhbGxiYWNrUmVmLmN1cnJlbnQgPSBjYWxsYmFja1xuICBhY3RpdmVSZWYuY3VycmVudCA9IGFjdGl2ZVxuXG4gIGNvbnN0IG1vZGVsc0tleSA9IG1vZGVsc0RlcGVuZGVuY3lLZXkobW9kZWxPck1vZGVscylcbiAgY29uc3QgZXZlbnRDYWxsYmFjayA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZWRDYWxsYmFjayA9ICgvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxJbnN0YW5jZVVwZGF0ZUV2ZW50UGF5bG9hZH0gKi8gcGF5bG9hZCkgPT4ge1xuICAgICAgaWYgKGFjdGl2ZVJlZi5jdXJyZW50KSBjYWxsYmFja1JlZi5jdXJyZW50KHBheWxvYWQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZWJvdW5jZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGRlYm91bmNlRnVuY3Rpb24od3JhcHBlZENhbGxiYWNrLCBkZWJvdW5jZSlcbiAgICBpZiAoZGVib3VuY2UpIHJldHVybiBkZWJvdW5jZUZ1bmN0aW9uKHdyYXBwZWRDYWxsYmFjaylcblxuICAgIHJldHVybiB3cmFwcGVkQ2FsbGJhY2tcbiAgfSwgW2RlYm91bmNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghYWN0aXZlKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBjb25zdCBtb2RlbHMgPSBtb2RlbHNGcm9tSW5wdXQobW9kZWxPck1vZGVscylcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA8IDEpIHJldHVybiB1bmRlZmluZWRcblxuICAgIGxldCBjbG9zZWQgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7QXJyYXk8KCkgPT4gdm9pZD59ICovXG4gICAgY29uc3QgdW5zdWJzY3JpYmVDYWxsYmFja3MgPSBbXVxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbkNhbGxiYWNrID0gKC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbEluc3RhbmNlVXBkYXRlRXZlbnRQYXlsb2FkfSAqLyBwYXlsb2FkKSA9PiB7XG4gICAgICBpZiAoIWNsb3NlZCkgZXZlbnRDYWxsYmFjayhwYXlsb2FkKVxuICAgIH1cblxuICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgbW9kZWxzKSB7XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gYXdhaXQgbW9kZWwub25VcGRhdGUoc3Vic2NyaXB0aW9uQ2FsbGJhY2spXG5cbiAgICAgICAgaWYgKGNsb3NlZCkge1xuICAgICAgICAgIHVuc3Vic2NyaWJlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN1YnNjcmliZUNhbGxiYWNrcy5wdXNoKHVuc3Vic2NyaWJlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghY2xvc2VkICYmIG9uQ29ubmVjdGVkKSBvbkNvbm5lY3RlZCgpXG4gICAgfSkoKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNsb3NlZCA9IHRydWVcblxuICAgICAgZm9yIChjb25zdCB1bnN1YnNjcmliZSBvZiB1bnN1YnNjcmliZUNhbGxiYWNrcykge1xuICAgICAgICB1bnN1YnNjcmliZSgpXG4gICAgICB9XG5cbiAgICAgIGNsZWFyUGVuZGluZ0RlYm91bmNlZENhbGxiYWNrKGV2ZW50Q2FsbGJhY2spXG4gICAgfVxuICB9LCBbYWN0aXZlLCBldmVudENhbGxiYWNrLCBtb2RlbHNLZXksIG9uQ29ubmVjdGVkXSlcbn1cbiJdfQ==
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {keyof typeof scenarios} scenarioName - Scenario name.
|
|
3
|
+
* @returns {Promise<Record<string, number>>} - Scenario result.
|
|
4
|
+
*/
|
|
5
|
+
export default function runFrontendModelEventHookScenario(scenarioName: keyof typeof scenarios): Promise<Record<string, number>>;
|
|
6
|
+
export type FakeSubscriptions = {
|
|
7
|
+
/**
|
|
8
|
+
* - Create callbacks.
|
|
9
|
+
*/
|
|
10
|
+
create: Set<(payload: unknown) => void>;
|
|
11
|
+
/**
|
|
12
|
+
* - Destroy callbacks.
|
|
13
|
+
*/
|
|
14
|
+
destroy: Set<(payload: unknown) => void>;
|
|
15
|
+
/**
|
|
16
|
+
* - Update callbacks.
|
|
17
|
+
*/
|
|
18
|
+
update: Set<(payload: unknown) => void>;
|
|
19
|
+
};
|
|
20
|
+
declare namespace scenarios {
|
|
21
|
+
export { classLifecycleScenario as classLifecycle };
|
|
22
|
+
export { debounceUnmountScenario as debounceUnmount };
|
|
23
|
+
export { instanceLifecycleScenario as instanceLifecycle };
|
|
24
|
+
export { resubscribeInstanceScenario as resubscribeInstance };
|
|
25
|
+
}
|
|
26
|
+
/** @returns {Promise<Record<string, number>>} - Scenario result. */
|
|
27
|
+
declare function classLifecycleScenario(): Promise<Record<string, number>>;
|
|
28
|
+
/** @returns {Promise<Record<string, number>>} - Scenario result. */
|
|
29
|
+
declare function debounceUnmountScenario(): Promise<Record<string, number>>;
|
|
30
|
+
/** @returns {Promise<Record<string, number>>} - Scenario result. */
|
|
31
|
+
declare function instanceLifecycleScenario(): Promise<Record<string, number>>;
|
|
32
|
+
/** @returns {Promise<Record<string, number>>} - Scenario result. */
|
|
33
|
+
declare function resubscribeInstanceScenario(): Promise<Record<string, number>>;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=browser-frontend-model-event-hook-scenarios.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-frontend-model-event-hook-scenarios.d.ts","sourceRoot":"","sources":["../../../src/testing/browser-frontend-model-event-hook-scenarios.js"],"names":[],"mappings":"AAiTA;;;GAGG;AACH,wEAHW,MAAM,OAAO,SAAS,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAQ3C;;;;;YA/Sa,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;;;;aAC/B,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;;;;YAC/B,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;;;;;;;;AAqH7C,oEAAoE;AACpE,2CADc,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAyC5C;AA6CD,oEAAoE;AACpE,4CADc,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2B5C;AAtED,oEAAoE;AACpE,8CADc,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAyC5C;AA+BD,oEAAoE;AACpE,gDADc,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAkD5C"}
|