gg-wf-scripts 2.8.0 → 3.0.0

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 (58) hide show
  1. package/dist/action-engine.d.ts +2 -3
  2. package/dist/action-engine.js +59 -40
  3. package/dist/action-engine.js.map +1 -1
  4. package/dist/actions.d.ts +1 -10
  5. package/dist/actions.js +1 -11
  6. package/dist/actions.js.map +1 -1
  7. package/dist/attrs.d.ts +59 -0
  8. package/dist/attrs.js +67 -0
  9. package/dist/attrs.js.map +1 -0
  10. package/dist/auth.d.ts +3 -3
  11. package/dist/auth.js +6 -5
  12. package/dist/auth.js.map +1 -1
  13. package/dist/bridges.d.ts +1 -1
  14. package/dist/bridges.js +23 -13
  15. package/dist/bridges.js.map +1 -1
  16. package/dist/data-engine.d.ts +2 -3
  17. package/dist/data-engine.js +101 -106
  18. package/dist/data-engine.js.map +1 -1
  19. package/dist/dialog.d.ts +1 -1
  20. package/dist/dialog.js +15 -11
  21. package/dist/dialog.js.map +1 -1
  22. package/dist/dom-observer.d.ts +4 -0
  23. package/dist/dom-observer.js +47 -0
  24. package/dist/dom-observer.js.map +1 -0
  25. package/dist/engine-deps.d.ts +23 -0
  26. package/dist/engine-deps.js +2 -0
  27. package/dist/engine-deps.js.map +1 -0
  28. package/dist/errors.d.ts +25 -0
  29. package/dist/errors.js +30 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/form-action-engine.d.ts +2 -3
  32. package/dist/form-action-engine.js +90 -73
  33. package/dist/form-action-engine.js.map +1 -1
  34. package/dist/form-actions.d.ts +1 -13
  35. package/dist/form-actions.js +1 -14
  36. package/dist/form-actions.js.map +1 -1
  37. package/dist/form-visibility.d.ts +1 -1
  38. package/dist/form-visibility.js +89 -88
  39. package/dist/form-visibility.js.map +1 -1
  40. package/dist/helpers/form-field.d.ts +19 -0
  41. package/dist/helpers/form-field.js +58 -0
  42. package/dist/helpers/form-field.js.map +1 -0
  43. package/dist/helpers/run-handler.d.ts +6 -2
  44. package/dist/helpers/run-handler.js +5 -2
  45. package/dist/helpers/run-handler.js.map +1 -1
  46. package/dist/index.d.ts +46 -14
  47. package/dist/index.js +43 -17
  48. package/dist/index.js.map +1 -1
  49. package/dist/queries.d.ts +1 -10
  50. package/dist/queries.js +1 -11
  51. package/dist/queries.js.map +1 -1
  52. package/dist/query-params.d.ts +1 -1
  53. package/dist/query-params.js +40 -22
  54. package/dist/query-params.js.map +1 -1
  55. package/dist/switch-engine.d.ts +1 -1
  56. package/dist/switch-engine.js +16 -9
  57. package/dist/switch-engine.js.map +1 -1
  58. package/package.json +8 -3
@@ -1,12 +1,14 @@
1
+ import { ATTR, SEL } from "./attrs.js";
1
2
  import { getPath } from "./helpers/path.js";
2
3
  import { populateFields, setSwitchState, applySwitchState, } from "./helpers/dom.js";
4
+ import { writeField } from "./helpers/form-field.js";
3
5
  import { runHandler } from "./helpers/run-handler.js";
4
6
  import { runWithLoading } from "./helpers/run-with-loading.js";
5
- import { queryRegistry } from "./queries.js";
7
+ import { onElement } from "./dom-observer.js";
6
8
  import { onQueryChanged, getParams } from "./query-params.js";
7
9
  function applySwitchFields(root, record) {
8
- root.querySelectorAll("[gg-switch-field]").forEach((el) => {
9
- const path = el.getAttribute("gg-switch-field");
10
+ root.querySelectorAll(SEL.switchField).forEach((el) => {
11
+ const path = el.getAttribute(ATTR.switchField);
10
12
  if (!path)
11
13
  return;
12
14
  const value = getPath(record, path);
@@ -23,12 +25,12 @@ function queryDeep(root, selector) {
23
25
  return results;
24
26
  }
25
27
  function applyDataValues(root, record) {
26
- queryDeep(root, "[gg-data-key]").forEach((el) => {
27
- const path = el.getAttribute("gg-data-key");
28
+ queryDeep(root, SEL.dataKey).forEach((el) => {
29
+ const path = el.getAttribute(ATTR.dataKey);
28
30
  const value = path ? getPath(record, path) : record;
29
31
  if (value === undefined)
30
32
  return;
31
- el.setAttribute("gg-data-value", JSON.stringify(value));
33
+ el.setAttribute(ATTR.dataValue, JSON.stringify(value));
32
34
  });
33
35
  }
34
36
  function populateFormFields(root, record) {
@@ -38,121 +40,114 @@ function populateFormFields(root, record) {
38
40
  const name = el.getAttribute("name");
39
41
  if (!name)
40
42
  return;
41
- const value = getPath(record, name);
42
- if (value == null)
43
- return;
44
- if (el instanceof HTMLInputElement) {
45
- if (el.type === "checkbox") {
46
- el.checked = Boolean(value);
47
- }
48
- else if (el.type === "radio") {
49
- el.checked = String(el.value) === String(value);
50
- }
51
- else {
52
- el.value = String(value);
53
- }
54
- }
55
- else {
56
- el.value = String(value);
57
- }
58
- el.dispatchEvent(new Event("input", { bubbles: true }));
59
- el.dispatchEvent(new Event("change", { bubbles: true }));
43
+ writeField(root, name, getPath(record, name));
60
44
  });
61
45
  }
62
- export function initDataEngine(context, { debug = false } = {}) {
63
- async function runQuery(container) {
64
- const isList = container.hasAttribute("gg-data-list");
65
- const isForm = container.hasAttribute("gg-data-form");
66
- const id = container.getAttribute(isList ? "gg-data-list" : isForm ? "gg-data-form" : "gg-data");
67
- if (!id)
68
- return;
69
- const query = queryRegistry[id];
70
- if (!query) {
71
- console.warn(`[gg-data] no query registered for "${id}"`);
72
- return;
73
- }
74
- const params = getParams();
75
- const handlerResult = await runWithLoading([container], () => runHandler({
46
+ async function runQuery(container, deps) {
47
+ const isList = container.hasAttribute(ATTR.dataList);
48
+ const isForm = container.hasAttribute(ATTR.dataForm);
49
+ const id = container.getAttribute(isList ? ATTR.dataList : isForm ? ATTR.dataForm : ATTR.data);
50
+ if (!id)
51
+ return;
52
+ const query = deps.queries[id];
53
+ if (!query) {
54
+ console.warn(`[gg-data] no query registered for "${id}"`);
55
+ deps.emitError({
76
56
  prefix: "[gg-data]",
77
57
  id,
78
- fields: { container, params: Object.fromEntries(params) },
79
- debug,
80
- }, () => query(context, params)));
81
- if (!handlerResult.ok)
58
+ error: "no query registered",
59
+ fields: { container },
60
+ });
61
+ return;
62
+ }
63
+ const params = getParams();
64
+ const handlerResult = await runWithLoading([container], () => runHandler({
65
+ prefix: "[gg-data]",
66
+ id,
67
+ fields: { container, params: Object.fromEntries(params) },
68
+ debug: deps.debug,
69
+ emitError: deps.emitError,
70
+ }, () => query(deps.context, params)));
71
+ if (!handlerResult.ok)
72
+ return;
73
+ const result = handlerResult.value;
74
+ if (result === undefined)
75
+ return;
76
+ if (isList) {
77
+ if (!Array.isArray(result)) {
78
+ console.warn(`[gg-data-list] query "${id}" did not return an array`);
82
79
  return;
83
- const result = handlerResult.value;
84
- if (result === undefined)
80
+ }
81
+ const template = container.querySelector(SEL.listTemplate);
82
+ if (!template) {
83
+ console.warn(`[gg-data-list] no [${ATTR.listTemplate}] inside "${id}"`);
85
84
  return;
86
- if (isList) {
87
- if (!Array.isArray(result)) {
88
- console.warn(`[gg-data-list] query "${id}" did not return an array`);
89
- return;
90
- }
91
- const template = container.querySelector("[gg-list-template]");
92
- if (!template) {
93
- console.warn(`[gg-data-list] no [gg-list-template] inside "${id}"`);
94
- return;
95
- }
96
- Array.from(container.children).forEach((child) => {
97
- if (child !== template)
98
- child.remove();
99
- });
100
- result.forEach((record) => {
101
- const clone = template.cloneNode(true);
102
- clone.removeAttribute("gg-list-template");
103
- clone.setAttribute("gg-query-set", `modal:view,id:${record.id}`);
104
- clone.style.display = "flex";
105
- if (record?.id != null)
106
- clone.id = String(record.id);
107
- clone.__ggRecord = record;
108
- populateFields(clone, record);
109
- applySwitchFields(clone, record);
110
- applyDataValues(clone, record);
111
- container.appendChild(clone);
112
- });
113
85
  }
114
- else if (isForm) {
115
- if (Array.isArray(result)) {
116
- console.warn(`[gg-data-form] query "${id}" returned an array; expected a single record`);
117
- return;
118
- }
119
- if (!result)
120
- return;
121
- const record = result;
122
- container.__ggRecord = record;
123
- populateFormFields(container, record);
124
- applyDataValues(container, record);
86
+ Array.from(container.children).forEach((child) => {
87
+ if (child !== template)
88
+ child.remove();
89
+ });
90
+ result.forEach((record) => {
91
+ const clone = template.cloneNode(true);
92
+ clone.removeAttribute(ATTR.listTemplate);
93
+ clone.setAttribute(ATTR.querySet, `modal:view,id:${record.id}`);
94
+ clone.style.display = "flex";
95
+ if (record?.id != null)
96
+ clone.id = String(record.id);
97
+ clone.__ggRecord = record;
98
+ populateFields(clone, record);
99
+ applySwitchFields(clone, record);
100
+ applyDataValues(clone, record);
101
+ container.appendChild(clone);
102
+ });
103
+ }
104
+ else if (isForm) {
105
+ if (Array.isArray(result)) {
106
+ console.warn(`[gg-data-form] query "${id}" returned an array; expected a single record`);
107
+ return;
125
108
  }
126
- else {
127
- if (Array.isArray(result)) {
128
- console.warn(`[gg-data] query "${id}" returned an array; use gg-data-list instead`);
129
- return;
130
- }
131
- if (!result)
132
- return;
133
- const record = result;
134
- container.__ggRecord = record;
135
- populateFields(container, record);
136
- applySwitchFields(container, record);
137
- applyDataValues(container, record);
109
+ if (!result)
110
+ return;
111
+ const record = result;
112
+ container.__ggRecord = record;
113
+ populateFormFields(container, record);
114
+ applyDataValues(container, record);
115
+ }
116
+ else {
117
+ if (Array.isArray(result)) {
118
+ console.warn(`[gg-data] query "${id}" returned an array; use gg-data-list instead`);
119
+ return;
138
120
  }
121
+ if (!result)
122
+ return;
123
+ const record = result;
124
+ container.__ggRecord = record;
125
+ populateFields(container, record);
126
+ applySwitchFields(container, record);
127
+ applyDataValues(container, record);
139
128
  }
140
- // Run all data containers on load
141
- document
142
- .querySelectorAll("[gg-data], [gg-data-list], [gg-data-form]")
143
- .forEach(runQuery);
144
- // Re-run queries when matching URL params change
145
- onQueryChanged((key) => {
146
- document
147
- .querySelectorAll("[gg-data][gg-data-on], [gg-data-list][gg-data-on], [gg-data-form][gg-data-on]")
148
- .forEach((c) => {
149
- const attr = c.getAttribute("gg-data-on");
129
+ }
130
+ export function initDataEngine(deps) {
131
+ const seen = new WeakSet();
132
+ const unbind = onElement(SEL.dataAny, (el) => {
133
+ if (seen.has(el))
134
+ return;
135
+ seen.add(el);
136
+ runQuery(el, deps);
137
+ });
138
+ const unsubscribe = onQueryChanged((key) => {
139
+ document.querySelectorAll(SEL.dataAnyOn).forEach((c) => {
140
+ const attr = c.getAttribute(ATTR.dataOn);
150
141
  if (!attr)
151
142
  return;
152
143
  const keys = attr.split(",").map((s) => s.trim());
153
144
  if (keys.includes(key))
154
- runQuery(c);
145
+ runQuery(c, deps);
155
146
  });
156
147
  });
148
+ return () => {
149
+ unbind();
150
+ unsubscribe();
151
+ };
157
152
  }
158
153
  //# sourceMappingURL=data-engine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-engine.js","sourceRoot":"","sources":["../src/data-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-engine.js","sourceRoot":"","sources":["../src/data-engine.ts"],"names":[],"mappings":"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"}
package/dist/dialog.d.ts CHANGED
@@ -1 +1 @@
1
- export declare function initDialog(): void;
1
+ export declare function initDialog(): () => void;
package/dist/dialog.js CHANGED
@@ -44,8 +44,7 @@ function syncDialogToUrl() {
44
44
  }
45
45
  }
46
46
  export function initDialog() {
47
- // Subscribe to query param changes — open/close when "modal" changes
48
- onQueryChanged((key, value) => {
47
+ const unsubscribe = onQueryChanged((key, value) => {
49
48
  if (key !== "modal")
50
49
  return;
51
50
  if (value) {
@@ -55,11 +54,9 @@ export function initDialog() {
55
54
  closeDialog();
56
55
  }
57
56
  });
58
- // Inbound events from external code
59
57
  document.addEventListener("gg:dialog:open", openDialog);
60
58
  document.addEventListener("gg:dialog:close", closeDialog);
61
- // Backdrop click
62
- document.addEventListener("click", (e) => {
59
+ const onClick = (e) => {
63
60
  const target = e.target;
64
61
  if (!(target instanceof HTMLDialogElement))
65
62
  return;
@@ -72,18 +69,25 @@ export function initDialog() {
72
69
  e.clientY > rect.bottom;
73
70
  if (outside)
74
71
  dismissViaUrlOrDirect();
75
- });
76
- // Escape key — preempt the default close so the URL stays source of truth
77
- document.addEventListener("cancel", (e) => {
72
+ };
73
+ document.addEventListener("click", onClick);
74
+ const onCancel = (e) => {
78
75
  const target = e.target;
79
76
  if (!(target instanceof HTMLDialogElement))
80
77
  return;
81
78
  e.preventDefault();
82
79
  dismissViaUrlOrDirect();
83
- });
84
- // Back button
80
+ };
81
+ document.addEventListener("cancel", onCancel);
85
82
  window.addEventListener("popstate", syncDialogToUrl);
86
- // Initial load
87
83
  syncDialogToUrl();
84
+ return () => {
85
+ unsubscribe();
86
+ document.removeEventListener("gg:dialog:open", openDialog);
87
+ document.removeEventListener("gg:dialog:close", closeDialog);
88
+ document.removeEventListener("click", onClick);
89
+ document.removeEventListener("cancel", onCancel);
90
+ window.removeEventListener("popstate", syncDialogToUrl);
91
+ };
88
92
  }
89
93
  //# sourceMappingURL=dialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../src/dialog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../src/dialog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ type ElementHandler = (el: Element) => void;
2
+ export declare function onElement(selector: string, handler: ElementHandler): () => void;
3
+ export declare function startDomObserver(): () => void;
4
+ export {};
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Shared MutationObserver. Engines call `onElement(selector, handler)` to be
3
+ * notified when a matching element is present at start time **or** later
4
+ * inserted into the DOM (Webflow IX, CMS templates, custom elements). One
5
+ * observer for the whole library — not one per engine.
6
+ *
7
+ * `start()` returns the global teardown; `onElement()` returns a per-handler
8
+ * teardown so engines can clean up their own subscriptions in dispose().
9
+ */
10
+ const subscriptions = [];
11
+ let observer = null;
12
+ export function onElement(selector, handler) {
13
+ const sub = { selector, handler };
14
+ subscriptions.push(sub);
15
+ document.querySelectorAll(selector).forEach(handler);
16
+ return () => {
17
+ const idx = subscriptions.indexOf(sub);
18
+ if (idx >= 0)
19
+ subscriptions.splice(idx, 1);
20
+ };
21
+ }
22
+ export function startDomObserver() {
23
+ if (observer)
24
+ return () => { };
25
+ observer = new MutationObserver((mutations) => {
26
+ for (const m of mutations) {
27
+ m.addedNodes.forEach((node) => {
28
+ if (!(node instanceof Element))
29
+ return;
30
+ for (const sub of subscriptions) {
31
+ if (node.matches(sub.selector))
32
+ sub.handler(node);
33
+ node
34
+ .querySelectorAll(sub.selector)
35
+ .forEach((el) => sub.handler(el));
36
+ }
37
+ });
38
+ }
39
+ });
40
+ observer.observe(document.body, { childList: true, subtree: true });
41
+ return () => {
42
+ observer?.disconnect();
43
+ observer = null;
44
+ subscriptions.length = 0;
45
+ };
46
+ }
47
+ //# sourceMappingURL=dom-observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-observer.js","sourceRoot":"","sources":["../src/dom-observer.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,MAAM,aAAa,GAAmB,EAAE,CAAC;AACzC,IAAI,QAAQ,GAA4B,IAAI,CAAC;AAE7C,MAAM,UAAU,SAAS,CACvB,QAAgB,EAChB,OAAuB;IAEvB,MAAM,GAAG,GAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAChD,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,GAAG,EAAE;QACV,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,GAAG,IAAI,CAAC;YAAE,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,QAAQ;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAC9B,QAAQ,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;QAC5C,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC5B,IAAI,CAAC,CAAC,IAAI,YAAY,OAAO,CAAC;oBAAE,OAAO;gBACvC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;oBAChC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;wBAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAClD,IAAI;yBACD,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;yBAC9B,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,OAAO,GAAG,EAAE;QACV,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,QAAQ,GAAG,IAAI,CAAC;QAChB,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { GgErrorEvent } from "./errors.js";
2
+ import type { Query } from "./queries.js";
3
+ import type { Action } from "./actions.js";
4
+ import type { FormAction } from "./form-actions.js";
5
+ /**
6
+ * The minimum surface every engine needs. Engines should depend on this (or a
7
+ * superset) instead of the full `App<TContext>` so they're easier to test and
8
+ * the dependency graph stays explicit.
9
+ */
10
+ export type EngineCore<TContext> = {
11
+ context: TContext;
12
+ debug: boolean;
13
+ emitError: (event: GgErrorEvent) => void;
14
+ };
15
+ export type DataEngineDeps<TContext> = EngineCore<TContext> & {
16
+ queries: Record<string, Query<TContext>>;
17
+ };
18
+ export type ActionEngineDeps<TContext> = EngineCore<TContext> & {
19
+ actions: Record<string, Action<TContext>>;
20
+ };
21
+ export type FormActionEngineDeps<TContext> = EngineCore<TContext> & {
22
+ formActions: Record<string, FormAction<TContext>>;
23
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=engine-deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-deps.js","sourceRoot":"","sources":["../src/engine-deps.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Emitted whenever a registered query, action, or form action throws — and
3
+ * for non-throwing failure modes the engines detect (missing handler, wrong
4
+ * return shape). Subscribe via `app.onError(handler)` to forward to Sentry,
5
+ * Datadog, or any other error tracker.
6
+ */
7
+ export type GgErrorEvent = {
8
+ /** Engine label, e.g. "[gg-action]", "[gg-data]", "[gg-form-action]". */
9
+ prefix: string;
10
+ /** Handler id (the value of the gg-action / gg-data / gg-form-action attr). */
11
+ id: string;
12
+ /** The thrown error or a string describing the non-throw failure. */
13
+ error: unknown;
14
+ /** Engine-specific context: trigger element, form, params, etc. */
15
+ fields?: Record<string, unknown>;
16
+ };
17
+ export type ErrorHandler = (event: GgErrorEvent) => void;
18
+ /**
19
+ * Internal helper that owns the subscriber list. Lives on the App instance.
20
+ */
21
+ export declare function createErrorBus(): {
22
+ subscribe: (handler: ErrorHandler) => () => void;
23
+ emit: (event: GgErrorEvent) => void;
24
+ clear: () => void;
25
+ };
package/dist/errors.js ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Internal helper that owns the subscriber list. Lives on the App instance.
3
+ */
4
+ export function createErrorBus() {
5
+ const handlers = [];
6
+ return {
7
+ subscribe(handler) {
8
+ handlers.push(handler);
9
+ return () => {
10
+ const idx = handlers.indexOf(handler);
11
+ if (idx >= 0)
12
+ handlers.splice(idx, 1);
13
+ };
14
+ },
15
+ emit(event) {
16
+ handlers.forEach((h) => {
17
+ try {
18
+ h(event);
19
+ }
20
+ catch (err) {
21
+ console.error("[gg] onError handler threw:", err);
22
+ }
23
+ });
24
+ },
25
+ clear() {
26
+ handlers.length = 0;
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,UAAU,cAAc;IAK5B,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,OAAO;QACL,SAAS,CAAC,OAAO;YACf,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,GAAG,EAAE;gBACV,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACtC,IAAI,GAAG,IAAI,CAAC;oBAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACxC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,KAAK;YACR,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrB,IAAI,CAAC;oBACH,CAAC,CAAC,KAAK,CAAC,CAAC;gBACX,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK;YACH,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,3 +1,2 @@
1
- export declare function initFormActionEngine(context: unknown, { debug }?: {
2
- debug?: boolean;
3
- }): void;
1
+ import type { FormActionEngineDeps } from "./engine-deps.js";
2
+ export declare function initFormActionEngine<TContext>(deps: FormActionEngineDeps<TContext>): () => void;