@redrockswebdevelopment/formstack-form-testing 0.1.10 → 0.1.12
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/dist/effects.d.ts +117 -0
- package/dist/effects.d.ts.map +1 -0
- package/dist/effects.js +399 -0
- package/dist/effects.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -2
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
export type FormstackFieldRef = string | number;
|
|
2
|
+
export interface LiveFormFieldProbeTarget {
|
|
3
|
+
readonly fieldId?: FormstackFieldRef;
|
|
4
|
+
readonly internalLabel?: string;
|
|
5
|
+
readonly label?: string;
|
|
6
|
+
}
|
|
7
|
+
export type LiveFormEffectPhase = "immediate" | "afterValue" | "afterQuiet" | "afterValidation";
|
|
8
|
+
export interface LiveFormFieldChangeEvent {
|
|
9
|
+
readonly target: LiveFormFieldProbeTarget;
|
|
10
|
+
readonly fieldId?: string | number | null;
|
|
11
|
+
readonly internalLabel?: string | null;
|
|
12
|
+
readonly previousValue?: unknown;
|
|
13
|
+
readonly currentValue: unknown;
|
|
14
|
+
readonly source?: string;
|
|
15
|
+
readonly transactionId?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface LiveFormEffectTraceEvent {
|
|
18
|
+
readonly kind: "registered" | "change" | "effect-start" | "effect-skip" | "effect-complete" | "effect-error" | "write";
|
|
19
|
+
readonly at: string;
|
|
20
|
+
readonly elapsedMs: number;
|
|
21
|
+
readonly effectId?: string;
|
|
22
|
+
readonly transactionId?: string;
|
|
23
|
+
readonly detail: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
export interface LiveFormFieldEffectContext {
|
|
26
|
+
readonly event: LiveFormFieldChangeEvent;
|
|
27
|
+
readonly effectId: string;
|
|
28
|
+
readonly transactionId: string;
|
|
29
|
+
readonly runIndex: number;
|
|
30
|
+
readField(target: LiveFormFieldProbeTarget): Promise<unknown>;
|
|
31
|
+
writeField(target: LiveFormFieldProbeTarget, value: unknown, options?: LiveFormEffectWriteOptions): Promise<void>;
|
|
32
|
+
waitForQuiet(options?: LiveFormEffectQuietOptions): Promise<void>;
|
|
33
|
+
validate(options?: LiveFormEffectValidationOptions): Promise<unknown>;
|
|
34
|
+
trace(kind: LiveFormEffectTraceEvent["kind"], detail?: Record<string, unknown>): void;
|
|
35
|
+
}
|
|
36
|
+
export type LiveFormFieldEffectHandler = (context: LiveFormFieldEffectContext) => Promise<void> | void;
|
|
37
|
+
export interface LiveFormFieldEffectDefinition {
|
|
38
|
+
readonly id: string;
|
|
39
|
+
readonly sources: readonly LiveFormFieldProbeTarget[];
|
|
40
|
+
readonly phase?: LiveFormEffectPhase;
|
|
41
|
+
readonly latestOnly?: boolean;
|
|
42
|
+
readonly ignoreTransactions?: readonly string[];
|
|
43
|
+
readonly handler: LiveFormFieldEffectHandler;
|
|
44
|
+
}
|
|
45
|
+
export interface LiveFormEffectWriteOptions {
|
|
46
|
+
readonly source?: string;
|
|
47
|
+
readonly transactionId?: string;
|
|
48
|
+
readonly suppressEffects?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface LiveFormEffectQuietOptions {
|
|
51
|
+
readonly quietMs?: number;
|
|
52
|
+
readonly timeoutMs?: number;
|
|
53
|
+
}
|
|
54
|
+
export interface LiveFormEffectValidationOptions {
|
|
55
|
+
readonly validate?: boolean;
|
|
56
|
+
}
|
|
57
|
+
export interface LiveFormEffectAdapter {
|
|
58
|
+
readField(target: LiveFormFieldProbeTarget): Promise<unknown>;
|
|
59
|
+
writeField(target: LiveFormFieldProbeTarget, value: unknown, options?: LiveFormEffectWriteOptions): Promise<void>;
|
|
60
|
+
onFieldChange(listener: (event: LiveFormFieldChangeEvent) => void): () => void;
|
|
61
|
+
resolveTarget?(target: LiveFormFieldProbeTarget): Promise<LiveFormFieldProbeTarget>;
|
|
62
|
+
waitForQuiet?(options?: LiveFormEffectQuietOptions): Promise<void>;
|
|
63
|
+
validate?(options?: LiveFormEffectValidationOptions): Promise<unknown>;
|
|
64
|
+
now?(): number;
|
|
65
|
+
}
|
|
66
|
+
export interface LiveFormEffectControllerOptions {
|
|
67
|
+
readonly maxRunsPerTransaction?: number;
|
|
68
|
+
readonly trace?: boolean;
|
|
69
|
+
readonly onTrace?: (event: LiveFormEffectTraceEvent) => void;
|
|
70
|
+
}
|
|
71
|
+
export interface LiveFormEffectController {
|
|
72
|
+
register(effect: LiveFormFieldEffectDefinition): () => void;
|
|
73
|
+
emit(event: LiveFormFieldChangeEvent): Promise<void>;
|
|
74
|
+
writeField(target: LiveFormFieldProbeTarget, value: unknown, options?: LiveFormEffectWriteOptions): Promise<void>;
|
|
75
|
+
readField(target: LiveFormFieldProbeTarget): Promise<unknown>;
|
|
76
|
+
waitForQuiet(options?: LiveFormEffectQuietOptions): Promise<void>;
|
|
77
|
+
validate(options?: LiveFormEffectValidationOptions): Promise<unknown>;
|
|
78
|
+
traces(): readonly LiveFormEffectTraceEvent[];
|
|
79
|
+
dispose(): void;
|
|
80
|
+
}
|
|
81
|
+
export interface FormstackLiveFormEffectAdapterOptions {
|
|
82
|
+
readonly waitForApiTimeoutMs?: number;
|
|
83
|
+
readonly quietMs?: number;
|
|
84
|
+
readonly quietTimeoutMs?: number;
|
|
85
|
+
readonly notifyWrites?: boolean;
|
|
86
|
+
}
|
|
87
|
+
export interface DeriveLiveFormFieldOptions {
|
|
88
|
+
readonly id: string;
|
|
89
|
+
readonly sources: readonly LiveFormFieldProbeTarget[];
|
|
90
|
+
readonly target: LiveFormFieldProbeTarget;
|
|
91
|
+
readonly phase?: LiveFormEffectPhase;
|
|
92
|
+
readonly latestOnly?: boolean;
|
|
93
|
+
readonly suppressEffects?: boolean;
|
|
94
|
+
readonly compute: (values: readonly unknown[], context: LiveFormFieldEffectContext) => Promise<unknown> | unknown;
|
|
95
|
+
readonly shouldWrite?: (nextValue: unknown, currentValue: unknown) => boolean;
|
|
96
|
+
}
|
|
97
|
+
export interface ResetLiveFormDependentsOptions {
|
|
98
|
+
readonly id: string;
|
|
99
|
+
readonly sources: readonly LiveFormFieldProbeTarget[];
|
|
100
|
+
readonly dependents: readonly LiveFormFieldProbeTarget[];
|
|
101
|
+
readonly phase?: LiveFormEffectPhase;
|
|
102
|
+
readonly emptyValue?: unknown;
|
|
103
|
+
readonly suppressEffects?: boolean;
|
|
104
|
+
}
|
|
105
|
+
export interface GateLiveFormSubmitOptions {
|
|
106
|
+
readonly id: string;
|
|
107
|
+
readonly sources: readonly LiveFormFieldProbeTarget[];
|
|
108
|
+
readonly submitSelector?: string;
|
|
109
|
+
readonly phase?: LiveFormEffectPhase;
|
|
110
|
+
readonly isReady: (values: readonly unknown[], context: LiveFormFieldEffectContext) => Promise<boolean> | boolean;
|
|
111
|
+
}
|
|
112
|
+
export declare function createLiveFormEffectController(adapter: LiveFormEffectAdapter, options?: LiveFormEffectControllerOptions): LiveFormEffectController;
|
|
113
|
+
export declare function createFormstackLiveFormEffectAdapter(options?: FormstackLiveFormEffectAdapterOptions): LiveFormEffectAdapter;
|
|
114
|
+
export declare function deriveLiveFormField(options: DeriveLiveFormFieldOptions): LiveFormFieldEffectDefinition;
|
|
115
|
+
export declare function resetLiveFormDependents(options: ResetLiveFormDependentsOptions): LiveFormFieldEffectDefinition;
|
|
116
|
+
export declare function gateLiveFormSubmit(options: GateLiveFormSubmitOptions): LiveFormFieldEffectDefinition;
|
|
117
|
+
//# sourceMappingURL=effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,CAAC;AAEhG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,cAAc,GAAG,aAAa,GAAG,iBAAiB,GAAG,cAAc,GAAG,OAAO,CAAC;IACvH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,UAAU,CAAC,MAAM,EAAE,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClH,YAAY,CAAC,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,+BAA+B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,EAAE,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACvF;AAED,MAAM,MAAM,0BAA0B,GAAG,CAAC,OAAO,EAAE,0BAA0B,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEvG,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;CAC9C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,UAAU,CAAC,MAAM,EAAE,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClH,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC/E,aAAa,CAAC,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACpF,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,+BAA+B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,GAAG,CAAC,IAAI,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,6BAA6B,GAAG,MAAM,IAAI,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,UAAU,CAAC,MAAM,EAAE,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClH,SAAS,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,YAAY,CAAC,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,+BAA+B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,IAAI,SAAS,wBAAwB,EAAE,CAAC;IAC9C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,qCAAqC;IACpD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACtD,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,EAAE,0BAA0B,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAClH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC;CAC/E;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACtD,QAAQ,CAAC,UAAU,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACzD,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACtD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,EAAE,0BAA0B,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACnH;AAkBD,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,qBAAqB,EAC9B,OAAO,GAAE,+BAAoC,GAC5C,wBAAwB,CA2J1B;AAED,wBAAgB,oCAAoC,CAAC,OAAO,GAAE,qCAA0C,GAAG,qBAAqB,CA4J/H;AAWD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,6BAA6B,CAsBtG;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,8BAA8B,GAAG,6BAA6B,CAa9G;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,6BAA6B,CAuBpG"}
|
package/dist/effects.js
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
function delay(ms) {
|
|
2
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
3
|
+
}
|
|
4
|
+
function liveFormTargetMatches(source, event) {
|
|
5
|
+
if (source.internalLabel && event.internalLabel)
|
|
6
|
+
return source.internalLabel === event.internalLabel;
|
|
7
|
+
if (source.internalLabel && event.target.internalLabel)
|
|
8
|
+
return source.internalLabel === event.target.internalLabel;
|
|
9
|
+
if (source.fieldId != null && event.fieldId != null)
|
|
10
|
+
return String(source.fieldId) === String(event.fieldId);
|
|
11
|
+
if (source.fieldId != null && event.target.fieldId != null)
|
|
12
|
+
return String(source.fieldId) === String(event.target.fieldId);
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
function createLiveFormEffectTransactionId(prefix = "fspt-effect") {
|
|
16
|
+
return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
17
|
+
}
|
|
18
|
+
export function createLiveFormEffectController(adapter, options = {}) {
|
|
19
|
+
const startedAt = adapter.now?.() ?? Date.now();
|
|
20
|
+
const now = () => adapter.now?.() ?? Date.now();
|
|
21
|
+
const effects = new Map();
|
|
22
|
+
const traces = [];
|
|
23
|
+
const runCounts = new Map();
|
|
24
|
+
const latestSequenceByEffect = new Map();
|
|
25
|
+
const normalizedSourcesByEffect = new Map();
|
|
26
|
+
const maxRunsPerTransaction = options.maxRunsPerTransaction ?? 25;
|
|
27
|
+
const emitTrace = (kind, detail, effectId, transactionId) => {
|
|
28
|
+
const event = {
|
|
29
|
+
kind,
|
|
30
|
+
at: new Date().toISOString(),
|
|
31
|
+
elapsedMs: Math.round(now() - startedAt),
|
|
32
|
+
...(effectId ? { effectId } : {}),
|
|
33
|
+
...(transactionId ? { transactionId } : {}),
|
|
34
|
+
detail,
|
|
35
|
+
};
|
|
36
|
+
if (options.trace !== false)
|
|
37
|
+
traces.push(event);
|
|
38
|
+
options.onTrace?.(event);
|
|
39
|
+
};
|
|
40
|
+
const runEffect = async (effect, event) => {
|
|
41
|
+
const transactionId = event.transactionId ?? createLiveFormEffectTransactionId();
|
|
42
|
+
if (effect.ignoreTransactions?.includes(transactionId)) {
|
|
43
|
+
emitTrace("effect-skip", { reason: "ignored-transaction" }, effect.id, transactionId);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const runKey = `${transactionId}:${effect.id}`;
|
|
47
|
+
const runIndex = (runCounts.get(runKey) ?? 0) + 1;
|
|
48
|
+
runCounts.set(runKey, runIndex);
|
|
49
|
+
if (runIndex > maxRunsPerTransaction) {
|
|
50
|
+
emitTrace("effect-skip", { reason: "max-runs-exceeded", runIndex, maxRunsPerTransaction }, effect.id, transactionId);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const sequence = (latestSequenceByEffect.get(effect.id) ?? 0) + 1;
|
|
54
|
+
latestSequenceByEffect.set(effect.id, sequence);
|
|
55
|
+
const waitForPhase = async () => {
|
|
56
|
+
if (effect.phase === "afterQuiet" || effect.phase === "afterValidation")
|
|
57
|
+
await adapter.waitForQuiet?.();
|
|
58
|
+
if (effect.phase === "afterValidation")
|
|
59
|
+
await adapter.validate?.({ validate: true });
|
|
60
|
+
};
|
|
61
|
+
emitTrace("effect-start", { phase: effect.phase ?? "afterValue", runIndex }, effect.id, transactionId);
|
|
62
|
+
try {
|
|
63
|
+
await waitForPhase();
|
|
64
|
+
if (effect.latestOnly !== false && latestSequenceByEffect.get(effect.id) !== sequence) {
|
|
65
|
+
emitTrace("effect-skip", { reason: "stale-run", sequence }, effect.id, transactionId);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const context = {
|
|
69
|
+
event,
|
|
70
|
+
effectId: effect.id,
|
|
71
|
+
transactionId,
|
|
72
|
+
runIndex,
|
|
73
|
+
readField: (target) => adapter.readField(target),
|
|
74
|
+
writeField: async (target, value, writeOptions = {}) => {
|
|
75
|
+
const writeTransactionId = writeOptions.transactionId ?? transactionId;
|
|
76
|
+
emitTrace("write", {
|
|
77
|
+
target,
|
|
78
|
+
value,
|
|
79
|
+
source: writeOptions.source ?? effect.id,
|
|
80
|
+
suppressEffects: writeOptions.suppressEffects ?? false,
|
|
81
|
+
}, effect.id, writeTransactionId);
|
|
82
|
+
await adapter.writeField(target, value, {
|
|
83
|
+
...writeOptions,
|
|
84
|
+
source: writeOptions.source ?? effect.id,
|
|
85
|
+
transactionId: writeTransactionId,
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
waitForQuiet: async (quietOptions) => {
|
|
89
|
+
await adapter.waitForQuiet?.(quietOptions);
|
|
90
|
+
},
|
|
91
|
+
validate: async (validationOptions) => adapter.validate?.(validationOptions),
|
|
92
|
+
trace: (kind, detail = {}) => emitTrace(kind, detail, effect.id, transactionId),
|
|
93
|
+
};
|
|
94
|
+
await effect.handler(context);
|
|
95
|
+
emitTrace("effect-complete", { runIndex }, effect.id, transactionId);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
emitTrace("effect-error", { message: error instanceof Error ? error.message : String(error) }, effect.id, transactionId);
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const normalizeEffectSources = async (effect) => {
|
|
103
|
+
const cached = normalizedSourcesByEffect.get(effect.id);
|
|
104
|
+
if (cached)
|
|
105
|
+
return cached;
|
|
106
|
+
if (!adapter.resolveTarget) {
|
|
107
|
+
normalizedSourcesByEffect.set(effect.id, effect.sources);
|
|
108
|
+
return effect.sources;
|
|
109
|
+
}
|
|
110
|
+
const normalized = await Promise.all(effect.sources.map(async (source) => {
|
|
111
|
+
try {
|
|
112
|
+
return await adapter.resolveTarget?.(source) ?? source;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return source;
|
|
116
|
+
}
|
|
117
|
+
}));
|
|
118
|
+
normalizedSourcesByEffect.set(effect.id, normalized);
|
|
119
|
+
return normalized;
|
|
120
|
+
};
|
|
121
|
+
const emit = async (event) => {
|
|
122
|
+
emitTrace("change", {
|
|
123
|
+
target: event.target,
|
|
124
|
+
fieldId: event.fieldId ?? null,
|
|
125
|
+
internalLabel: event.internalLabel ?? null,
|
|
126
|
+
source: event.source ?? null,
|
|
127
|
+
}, undefined, event.transactionId);
|
|
128
|
+
for (const effect of effects.values()) {
|
|
129
|
+
const sources = await normalizeEffectSources(effect);
|
|
130
|
+
if (!sources.some((source) => liveFormTargetMatches(source, event)))
|
|
131
|
+
continue;
|
|
132
|
+
await runEffect(effect, event);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
const unsubscribe = adapter.onFieldChange((event) => {
|
|
136
|
+
void emit(event);
|
|
137
|
+
});
|
|
138
|
+
return {
|
|
139
|
+
register: (effect) => {
|
|
140
|
+
if (effects.has(effect.id))
|
|
141
|
+
throw new Error(`Live form effect "${effect.id}" is already registered.`);
|
|
142
|
+
effects.set(effect.id, effect);
|
|
143
|
+
emitTrace("registered", { sources: effect.sources, phase: effect.phase ?? "afterValue" }, effect.id);
|
|
144
|
+
void normalizeEffectSources(effect);
|
|
145
|
+
return () => {
|
|
146
|
+
effects.delete(effect.id);
|
|
147
|
+
normalizedSourcesByEffect.delete(effect.id);
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
emit,
|
|
151
|
+
writeField: async (target, value, writeOptions = {}) => {
|
|
152
|
+
const transactionId = writeOptions.transactionId ?? createLiveFormEffectTransactionId();
|
|
153
|
+
emitTrace("write", { target, value, source: writeOptions.source ?? "controller", suppressEffects: writeOptions.suppressEffects ?? false }, undefined, transactionId);
|
|
154
|
+
await adapter.writeField(target, value, { ...writeOptions, transactionId });
|
|
155
|
+
},
|
|
156
|
+
readField: (target) => adapter.readField(target),
|
|
157
|
+
waitForQuiet: async (quietOptions) => {
|
|
158
|
+
await adapter.waitForQuiet?.(quietOptions);
|
|
159
|
+
},
|
|
160
|
+
validate: async (validationOptions) => adapter.validate?.(validationOptions),
|
|
161
|
+
traces: () => [...traces],
|
|
162
|
+
dispose: () => {
|
|
163
|
+
effects.clear();
|
|
164
|
+
unsubscribe();
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
export function createFormstackLiveFormEffectAdapter(options = {}) {
|
|
169
|
+
const readApi = () => {
|
|
170
|
+
const globalObject = globalThis;
|
|
171
|
+
const factory = globalObject.window && typeof globalObject.window === "object"
|
|
172
|
+
? Reflect.get(globalObject.window, "fsApi")
|
|
173
|
+
: Reflect.get(globalObject, "fsApi");
|
|
174
|
+
const api = typeof factory === "function" ? Reflect.apply(factory, globalObject.window ?? globalObject, []) : null;
|
|
175
|
+
const getForms = api && typeof api === "object" ? Reflect.get(api, "getForms") : null;
|
|
176
|
+
const forms = typeof getForms === "function" ? Reflect.apply(getForms, api, []) : [];
|
|
177
|
+
return Array.isArray(forms) ? forms[0] ?? null : null;
|
|
178
|
+
};
|
|
179
|
+
const waitForForm = async () => {
|
|
180
|
+
const timeoutMs = options.waitForApiTimeoutMs ?? 10_000;
|
|
181
|
+
const deadline = Date.now() + timeoutMs;
|
|
182
|
+
let form = readApi();
|
|
183
|
+
while ((!form || typeof form !== "object") && Date.now() < deadline) {
|
|
184
|
+
await delay(50);
|
|
185
|
+
form = readApi();
|
|
186
|
+
}
|
|
187
|
+
if (!form || typeof form !== "object")
|
|
188
|
+
throw new Error("Formstack Live Form API did not become available.");
|
|
189
|
+
return form;
|
|
190
|
+
};
|
|
191
|
+
const resolveField = async (target) => {
|
|
192
|
+
const form = await waitForForm();
|
|
193
|
+
const getField = Reflect.get(form, "getField");
|
|
194
|
+
const getFieldByInternalLabel = Reflect.get(form, "getFieldByInternalLabel");
|
|
195
|
+
if (target.internalLabel && typeof getFieldByInternalLabel === "function") {
|
|
196
|
+
const field = Reflect.apply(getFieldByInternalLabel, form, [target.internalLabel]);
|
|
197
|
+
if (field)
|
|
198
|
+
return field;
|
|
199
|
+
}
|
|
200
|
+
if (target.fieldId != null && typeof getField === "function")
|
|
201
|
+
return Reflect.apply(getField, form, [String(target.fieldId)]);
|
|
202
|
+
return null;
|
|
203
|
+
};
|
|
204
|
+
const readFieldValue = (field) => {
|
|
205
|
+
if (!field || typeof field !== "object")
|
|
206
|
+
return null;
|
|
207
|
+
const getValue = Reflect.get(field, "getValue");
|
|
208
|
+
return typeof getValue === "function" ? Reflect.apply(getValue, field, []) : null;
|
|
209
|
+
};
|
|
210
|
+
const readFieldId = (field) => {
|
|
211
|
+
if (!field || typeof field !== "object")
|
|
212
|
+
return null;
|
|
213
|
+
const getId = Reflect.get(field, "getId");
|
|
214
|
+
if (typeof getId === "function")
|
|
215
|
+
return Reflect.apply(getId, field, []);
|
|
216
|
+
return Reflect.get(field, "id") ?? null;
|
|
217
|
+
};
|
|
218
|
+
const listeners = new Set();
|
|
219
|
+
let formListenerDispose = null;
|
|
220
|
+
const ensureFormListener = async () => {
|
|
221
|
+
if (formListenerDispose)
|
|
222
|
+
return;
|
|
223
|
+
const form = await waitForForm();
|
|
224
|
+
const registerFormEventListener = Reflect.get(form, "registerFormEventListener");
|
|
225
|
+
const unregisterFormEventListener = Reflect.get(form, "unregisterFormEventListener");
|
|
226
|
+
if (typeof registerFormEventListener !== "function")
|
|
227
|
+
return;
|
|
228
|
+
const formEventListener = {
|
|
229
|
+
type: "change",
|
|
230
|
+
onFormEvent: async (event) => {
|
|
231
|
+
const eventObject = event && typeof event === "object" ? event : {};
|
|
232
|
+
const data = Reflect.get(eventObject, "data");
|
|
233
|
+
const dataObject = data && typeof data === "object" ? data : {};
|
|
234
|
+
const fieldId = Reflect.get(dataObject, "fieldId") ?? null;
|
|
235
|
+
const getField = Reflect.get(form, "getField");
|
|
236
|
+
const field = fieldId == null || typeof getField !== "function"
|
|
237
|
+
? null
|
|
238
|
+
: Reflect.apply(getField, form, [String(fieldId)]);
|
|
239
|
+
const currentValue = readFieldValue(field);
|
|
240
|
+
const internalLabel = field && typeof field === "object"
|
|
241
|
+
? Reflect.get(field, "internalLabel") ?? null
|
|
242
|
+
: null;
|
|
243
|
+
const changeEvent = {
|
|
244
|
+
target: fieldId == null ? {} : { fieldId },
|
|
245
|
+
fieldId,
|
|
246
|
+
internalLabel,
|
|
247
|
+
currentValue,
|
|
248
|
+
source: Reflect.get(dataObject, "type") ?? "formstack-change",
|
|
249
|
+
};
|
|
250
|
+
for (const listener of listeners)
|
|
251
|
+
listener(changeEvent);
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
Reflect.apply(registerFormEventListener, form, [formEventListener]);
|
|
255
|
+
formListenerDispose = () => {
|
|
256
|
+
if (typeof unregisterFormEventListener === "function")
|
|
257
|
+
Reflect.apply(unregisterFormEventListener, form, [formEventListener]);
|
|
258
|
+
formListenerDispose = null;
|
|
259
|
+
};
|
|
260
|
+
};
|
|
261
|
+
return {
|
|
262
|
+
readField: async (target) => readFieldValue(await resolveField(target)),
|
|
263
|
+
resolveTarget: async (target) => {
|
|
264
|
+
const field = await resolveField(target);
|
|
265
|
+
if (!field || typeof field !== "object")
|
|
266
|
+
return target;
|
|
267
|
+
const fieldId = readFieldId(field);
|
|
268
|
+
return fieldId == null ? target : { ...target, fieldId };
|
|
269
|
+
},
|
|
270
|
+
writeField: async (target, value, writeOptions = {}) => {
|
|
271
|
+
const form = await waitForForm();
|
|
272
|
+
const field = await resolveField(target);
|
|
273
|
+
if (!field || typeof field !== "object")
|
|
274
|
+
throw new Error(`Unable to resolve Formstack field ${target.internalLabel ?? target.fieldId ?? "unknown"}.`);
|
|
275
|
+
const setValue = Reflect.get(field, "setValue");
|
|
276
|
+
if (typeof setValue !== "function")
|
|
277
|
+
throw new Error("Resolved Formstack field does not support setValue().");
|
|
278
|
+
const previousValue = readFieldValue(field);
|
|
279
|
+
await Promise.resolve(Reflect.apply(setValue, field, [value]));
|
|
280
|
+
if (options.notifyWrites ?? true) {
|
|
281
|
+
const notifyFormEventListeners = Reflect.get(form, "notifyFormEventListeners");
|
|
282
|
+
if (typeof notifyFormEventListeners === "function") {
|
|
283
|
+
await Promise.resolve(Reflect.apply(notifyFormEventListeners, form, [
|
|
284
|
+
"change",
|
|
285
|
+
{
|
|
286
|
+
fieldId: readFieldId(field),
|
|
287
|
+
type: writeOptions.source ?? "effect-write",
|
|
288
|
+
transactionId: writeOptions.transactionId,
|
|
289
|
+
suppressEffects: writeOptions.suppressEffects ?? false,
|
|
290
|
+
value,
|
|
291
|
+
},
|
|
292
|
+
]));
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (!writeOptions.suppressEffects) {
|
|
296
|
+
const currentValue = readFieldValue(field);
|
|
297
|
+
const event = {
|
|
298
|
+
target,
|
|
299
|
+
fieldId: readFieldId(field),
|
|
300
|
+
internalLabel: target.internalLabel ?? null,
|
|
301
|
+
previousValue,
|
|
302
|
+
currentValue,
|
|
303
|
+
source: writeOptions.source ?? "effect-write",
|
|
304
|
+
...(writeOptions.transactionId ? { transactionId: writeOptions.transactionId } : {}),
|
|
305
|
+
};
|
|
306
|
+
for (const listener of listeners)
|
|
307
|
+
listener(event);
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
onFieldChange: (listener) => {
|
|
311
|
+
listeners.add(listener);
|
|
312
|
+
void ensureFormListener();
|
|
313
|
+
return () => {
|
|
314
|
+
listeners.delete(listener);
|
|
315
|
+
if (listeners.size === 0)
|
|
316
|
+
formListenerDispose?.();
|
|
317
|
+
};
|
|
318
|
+
},
|
|
319
|
+
waitForQuiet: async (quietOptions = {}) => {
|
|
320
|
+
await delay(quietOptions.quietMs ?? options.quietMs ?? 250);
|
|
321
|
+
},
|
|
322
|
+
validate: async (validationOptions = {}) => {
|
|
323
|
+
const form = await waitForForm();
|
|
324
|
+
if (!validationOptions.validate)
|
|
325
|
+
return null;
|
|
326
|
+
const validateForm = Reflect.get(form, "validateForm");
|
|
327
|
+
return typeof validateForm === "function" ? Reflect.apply(validateForm, form, []) : null;
|
|
328
|
+
},
|
|
329
|
+
now: () => Date.now(),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
function liveFormEffectValuesEqual(left, right) {
|
|
333
|
+
if (Object.is(left, right))
|
|
334
|
+
return true;
|
|
335
|
+
try {
|
|
336
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
return false;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
export function deriveLiveFormField(options) {
|
|
343
|
+
return {
|
|
344
|
+
id: options.id,
|
|
345
|
+
sources: options.sources,
|
|
346
|
+
phase: options.phase ?? "afterQuiet",
|
|
347
|
+
latestOnly: options.latestOnly ?? true,
|
|
348
|
+
handler: async (context) => {
|
|
349
|
+
const values = await Promise.all(options.sources.map((source) => context.readField(source)));
|
|
350
|
+
const nextValue = await options.compute(values, context);
|
|
351
|
+
const currentValue = await context.readField(options.target);
|
|
352
|
+
const shouldWrite = options.shouldWrite?.(nextValue, currentValue) ?? !liveFormEffectValuesEqual(nextValue, currentValue);
|
|
353
|
+
if (!shouldWrite) {
|
|
354
|
+
context.trace("effect-skip", { reason: "derived-value-unchanged", target: options.target });
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
await context.writeField(options.target, nextValue, options.suppressEffects === undefined ? {} : { suppressEffects: options.suppressEffects });
|
|
358
|
+
},
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
export function resetLiveFormDependents(options) {
|
|
362
|
+
return {
|
|
363
|
+
id: options.id,
|
|
364
|
+
sources: options.sources,
|
|
365
|
+
phase: options.phase ?? "afterQuiet",
|
|
366
|
+
handler: async (context) => {
|
|
367
|
+
for (const dependent of options.dependents) {
|
|
368
|
+
await context.writeField(dependent, options.emptyValue ?? "", {
|
|
369
|
+
suppressEffects: options.suppressEffects ?? true,
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
export function gateLiveFormSubmit(options) {
|
|
376
|
+
return {
|
|
377
|
+
id: options.id,
|
|
378
|
+
sources: options.sources,
|
|
379
|
+
phase: options.phase ?? "afterQuiet",
|
|
380
|
+
latestOnly: true,
|
|
381
|
+
handler: async (context) => {
|
|
382
|
+
const values = await Promise.all(options.sources.map((source) => context.readField(source)));
|
|
383
|
+
const ready = await options.isReady(values, context);
|
|
384
|
+
const selector = options.submitSelector ?? ".fsSubmitButton, [type=submit]";
|
|
385
|
+
const documentObject = globalThis.document;
|
|
386
|
+
if (!documentObject?.querySelectorAll) {
|
|
387
|
+
context.trace("effect-skip", { reason: "document-unavailable", ready, selector });
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
for (const element of Array.from(documentObject.querySelectorAll(selector))) {
|
|
391
|
+
element.toggleAttribute("disabled", !ready);
|
|
392
|
+
element.setAttribute("aria-disabled", ready ? "false" : "true");
|
|
393
|
+
element.dataset.fsptSubmitReady = ready ? "true" : "false";
|
|
394
|
+
}
|
|
395
|
+
context.trace("effect-complete", { kind: "submit-gate", ready, selector });
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -421,6 +421,7 @@ export interface LiveFormEffectAdapter {
|
|
|
421
421
|
readField(target: LiveFormFieldProbeTarget): Promise<unknown>;
|
|
422
422
|
writeField(target: LiveFormFieldProbeTarget, value: unknown, options?: LiveFormEffectWriteOptions): Promise<void>;
|
|
423
423
|
onFieldChange(listener: (event: LiveFormFieldChangeEvent) => void): () => void;
|
|
424
|
+
resolveTarget?(target: LiveFormFieldProbeTarget): Promise<LiveFormFieldProbeTarget>;
|
|
424
425
|
waitForQuiet?(options?: LiveFormEffectQuietOptions): Promise<void>;
|
|
425
426
|
validate?(options?: LiveFormEffectValidationOptions): Promise<unknown>;
|
|
426
427
|
now?(): number;
|