gg-wf-scripts 2.8.0 → 4.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 (59) hide show
  1. package/README.md +15 -10
  2. package/dist/action-engine.d.ts +2 -3
  3. package/dist/action-engine.js +59 -40
  4. package/dist/action-engine.js.map +1 -1
  5. package/dist/actions.d.ts +1 -10
  6. package/dist/actions.js +1 -11
  7. package/dist/actions.js.map +1 -1
  8. package/dist/attrs.d.ts +56 -0
  9. package/dist/attrs.js +64 -0
  10. package/dist/attrs.js.map +1 -0
  11. package/dist/auth.d.ts +3 -3
  12. package/dist/auth.js +6 -5
  13. package/dist/auth.js.map +1 -1
  14. package/dist/bridges.d.ts +1 -1
  15. package/dist/bridges.js +23 -13
  16. package/dist/bridges.js.map +1 -1
  17. package/dist/data-engine.d.ts +2 -3
  18. package/dist/data-engine.js +100 -119
  19. package/dist/data-engine.js.map +1 -1
  20. package/dist/dialog.d.ts +1 -1
  21. package/dist/dialog.js +15 -11
  22. package/dist/dialog.js.map +1 -1
  23. package/dist/dom-observer.d.ts +4 -0
  24. package/dist/dom-observer.js +47 -0
  25. package/dist/dom-observer.js.map +1 -0
  26. package/dist/engine-deps.d.ts +23 -0
  27. package/dist/engine-deps.js +2 -0
  28. package/dist/engine-deps.js.map +1 -0
  29. package/dist/errors.d.ts +25 -0
  30. package/dist/errors.js +30 -0
  31. package/dist/errors.js.map +1 -0
  32. package/dist/form-action-engine.d.ts +2 -3
  33. package/dist/form-action-engine.js +90 -73
  34. package/dist/form-action-engine.js.map +1 -1
  35. package/dist/form-actions.d.ts +1 -13
  36. package/dist/form-actions.js +1 -14
  37. package/dist/form-actions.js.map +1 -1
  38. package/dist/form-visibility.d.ts +1 -1
  39. package/dist/form-visibility.js +89 -88
  40. package/dist/form-visibility.js.map +1 -1
  41. package/dist/helpers/form-field.d.ts +19 -0
  42. package/dist/helpers/form-field.js +58 -0
  43. package/dist/helpers/form-field.js.map +1 -0
  44. package/dist/helpers/run-handler.d.ts +6 -2
  45. package/dist/helpers/run-handler.js +5 -2
  46. package/dist/helpers/run-handler.js.map +1 -1
  47. package/dist/index.d.ts +46 -14
  48. package/dist/index.js +43 -17
  49. package/dist/index.js.map +1 -1
  50. package/dist/queries.d.ts +1 -10
  51. package/dist/queries.js +1 -11
  52. package/dist/queries.js.map +1 -1
  53. package/dist/query-params.d.ts +1 -1
  54. package/dist/query-params.js +40 -22
  55. package/dist/query-params.js.map +1 -1
  56. package/dist/switch-engine.d.ts +1 -1
  57. package/dist/switch-engine.js +16 -9
  58. package/dist/switch-engine.js.map +1 -1
  59. package/package.json +8 -3
@@ -1,8 +1,10 @@
1
+ import type { GgErrorEvent } from "../errors.js";
1
2
  type RunHandlerOptions = {
2
3
  prefix: string;
3
4
  id: string;
4
5
  fields: Record<string, unknown>;
5
6
  debug: boolean;
7
+ emitError?: (event: GgErrorEvent) => void;
6
8
  };
7
9
  export type RunHandlerResult<T> = {
8
10
  ok: true;
@@ -16,7 +18,9 @@ export type RunHandlerResult<T> = {
16
18
  *
17
19
  * Catches throws so engine code can branch on a result instead of try/catch.
18
20
  * On success, returns { ok: true, value } where value is whatever the handler
19
- * returned. On throw, returns { ok: false, error } and logs the error.
21
+ * returned. On throw, returns { ok: false, error }, logs the error, and emits
22
+ * a GgErrorEvent so consumers subscribed via app.onError() can ship it to
23
+ * their error tracker.
20
24
  */
21
- export declare function runHandler<T>({ prefix, id, fields, debug }: RunHandlerOptions, fn: () => Promise<T> | T): Promise<RunHandlerResult<T>>;
25
+ export declare function runHandler<T>({ prefix, id, fields, debug, emitError }: RunHandlerOptions, fn: () => Promise<T> | T): Promise<RunHandlerResult<T>>;
22
26
  export {};
@@ -3,9 +3,11 @@
3
3
  *
4
4
  * Catches throws so engine code can branch on a result instead of try/catch.
5
5
  * On success, returns { ok: true, value } where value is whatever the handler
6
- * returned. On throw, returns { ok: false, error } and logs the error.
6
+ * returned. On throw, returns { ok: false, error }, logs the error, and emits
7
+ * a GgErrorEvent so consumers subscribed via app.onError() can ship it to
8
+ * their error tracker.
7
9
  */
8
- export async function runHandler({ prefix, id, fields, debug }, fn) {
10
+ export async function runHandler({ prefix, id, fields, debug, emitError }, fn) {
9
11
  if (debug) {
10
12
  console.groupCollapsed(`${prefix} "${id}"`);
11
13
  for (const [key, value] of Object.entries(fields)) {
@@ -23,6 +25,7 @@ export async function runHandler({ prefix, id, fields, debug }, fn) {
23
25
  }
24
26
  catch (error) {
25
27
  console.error(`${prefix} "${id}" threw:`, error);
28
+ emitError?.({ prefix, id, error, fields });
26
29
  return { ok: false, error };
27
30
  }
28
31
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"run-handler.js","sourceRoot":"","sources":["../../src/helpers/run-handler.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAqB,EAChD,EAAwB;IAExB,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,cAAc,CAAC,GAAG,MAAM,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,EAAE,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"run-handler.js","sourceRoot":"","sources":["../../src/helpers/run-handler.ts"],"names":[],"mappings":"AAcA;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAqB,EAC3D,EAAwB;IAExB,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,cAAc,CAAC,GAAG,MAAM,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,EAAE,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QACjD,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,37 +1,69 @@
1
- import { registerQuery } from "./queries.js";
2
- import { registerAction } from "./actions.js";
3
- import { registerFormAction } from "./form-actions.js";
4
- import { setSwitchState, applySwitchState, populateFields } from "./helpers/dom.js";
1
+ import type { Query } from "./queries.js";
2
+ import type { Action } from "./actions.js";
3
+ import type { FormAction } from "./form-actions.js";
5
4
  import { setQueryParams, removeQueryParams } from "./query-params.js";
6
5
  import { type AuthAdapter } from "./auth.js";
7
- export { setSwitchState, applySwitchState, populateFields, setQueryParams, removeQueryParams };
6
+ import { type ErrorHandler } from "./errors.js";
7
+ export { setQueryParams, removeQueryParams };
8
8
  export { getPath } from "./helpers/path.js";
9
9
  export type { AuthAdapter } from "./auth.js";
10
10
  export type { Query } from "./queries.js";
11
11
  export type { Action, ActionResult } from "./actions.js";
12
12
  export type { FormAction, FormActionResult, FormFieldError } from "./form-actions.js";
13
- export type InitOptions = {
13
+ export type { GgErrorEvent, ErrorHandler } from "./errors.js";
14
+ export type InitOptions<TContext = unknown> = {
14
15
  /**
15
16
  * Arbitrary object passed to every query and action. Put backend clients
16
17
  * (Supabase, fetch wrappers, etc.) or anything else your queries need on it.
17
18
  */
18
- context?: unknown;
19
+ context?: TContext;
19
20
  /**
20
21
  * Auth adapter. If omitted, gg-auth/gg-role attrs are never set.
21
22
  */
22
- auth?: AuthAdapter;
23
+ auth?: AuthAdapter<TContext>;
23
24
  /**
24
25
  * When true, every query and action is logged to the console with its
25
26
  * trigger/container, data, result, and duration.
26
27
  */
27
28
  debug?: boolean;
28
29
  };
30
+ export type App<TContext = unknown> = {
31
+ context: TContext;
32
+ debug: boolean;
33
+ queries: Record<string, Query<TContext>>;
34
+ actions: Record<string, Action<TContext>>;
35
+ formActions: Record<string, FormAction<TContext>>;
36
+ /**
37
+ * Register a query. Optionally pin the result type at the call site:
38
+ * `app.addQuery<User[]>("users.list", ...)` for autocomplete on the
39
+ * handler's return value.
40
+ */
41
+ addQuery: <TResult = unknown>(id: string, fn: Query<TContext, TResult>) => void;
42
+ /**
43
+ * Register an action. Optionally pin the data shape:
44
+ * `app.addAction<{ id: string }>("posts.delete", ...)`.
45
+ */
46
+ addAction: <TData extends Record<string, unknown> = Record<string, unknown>>(id: string, fn: Action<TContext, TData>) => void;
47
+ addFormAction: (id: string, fn: FormAction<TContext>) => void;
48
+ /**
49
+ * Subscribe to errors from any registered handler — including thrown
50
+ * exceptions, missing-handler lookups, and `{ ok: false }` returns. Useful
51
+ * for shipping errors to Sentry or similar. Returns an unsubscribe fn.
52
+ */
53
+ onError: (handler: ErrorHandler) => () => void;
54
+ /**
55
+ * Mount all engines. Idempotent only in the sense that calling start()
56
+ * twice without dispose() will double-bind listeners — don't do that.
57
+ */
58
+ start: () => void;
59
+ /**
60
+ * Detach every listener and observer the library installed. Call from
61
+ * SPA route changes, HMR teardown, or test cleanup. Handler registrations
62
+ * are kept so you can call start() again on the same App.
63
+ */
64
+ dispose: () => void;
65
+ };
29
66
  /**
30
67
  * Create a gg-scripts app instance.
31
68
  */
32
- export declare function init({ context, auth, debug }?: InitOptions): {
33
- addQuery: typeof registerQuery;
34
- addAction: typeof registerAction;
35
- addFormAction: typeof registerFormAction;
36
- start(): void;
37
- };
69
+ export declare function init<TContext = unknown>({ context, auth, debug }?: InitOptions<TContext>): App<TContext>;
package/dist/index.js CHANGED
@@ -1,7 +1,3 @@
1
- import { registerQuery } from "./queries.js";
2
- import { registerAction } from "./actions.js";
3
- import { registerFormAction } from "./form-actions.js";
4
- import { setSwitchState, applySwitchState, populateFields } from "./helpers/dom.js";
5
1
  import { setQueryParams, removeQueryParams, initQueryParams } from "./query-params.js";
6
2
  import { initAuth } from "./auth.js";
7
3
  import { initSwitchEngine } from "./switch-engine.js";
@@ -11,28 +7,53 @@ import { initFormVisibility } from "./form-visibility.js";
11
7
  import { initDataEngine } from "./data-engine.js";
12
8
  import { initActionEngine } from "./action-engine.js";
13
9
  import { initFormActionEngine } from "./form-action-engine.js";
14
- export { setSwitchState, applySwitchState, populateFields, setQueryParams, removeQueryParams };
10
+ import { startDomObserver } from "./dom-observer.js";
11
+ import { createErrorBus } from "./errors.js";
12
+ export { setQueryParams, removeQueryParams };
15
13
  export { getPath } from "./helpers/path.js";
16
14
  /**
17
15
  * Create a gg-scripts app instance.
18
16
  */
19
17
  export function init({ context = {}, auth, debug = false } = {}) {
20
- return {
21
- addQuery: registerQuery,
22
- addAction: registerAction,
23
- addFormAction: registerFormAction,
18
+ const queries = {};
19
+ const actions = {};
20
+ const formActions = {};
21
+ const errorBus = createErrorBus();
22
+ let cleanups = [];
23
+ const app = {
24
+ context,
25
+ debug,
26
+ queries,
27
+ actions,
28
+ formActions,
29
+ addQuery: (id, fn) => {
30
+ queries[id] = fn;
31
+ },
32
+ addAction: (id, fn) => {
33
+ actions[id] = fn;
34
+ },
35
+ addFormAction: (id, fn) => {
36
+ formActions[id] = fn;
37
+ },
38
+ onError: (handler) => errorBus.subscribe(handler),
24
39
  start() {
25
40
  function run() {
41
+ const core = {
42
+ context,
43
+ debug,
44
+ emitError: (event) => errorBus.emit(event),
45
+ };
26
46
  if (auth)
27
47
  initAuth(context, auth);
28
- initSwitchEngine();
29
- initQueryParams();
30
- initDialog();
31
- initBridges();
32
- initFormVisibility();
33
- initDataEngine(context, { debug });
34
- initActionEngine(context, { debug });
35
- initFormActionEngine(context, { debug });
48
+ cleanups.push(startDomObserver());
49
+ cleanups.push(initSwitchEngine());
50
+ cleanups.push(initQueryParams());
51
+ cleanups.push(initDialog());
52
+ cleanups.push(initBridges());
53
+ cleanups.push(initFormVisibility());
54
+ cleanups.push(initDataEngine({ ...core, queries }));
55
+ cleanups.push(initActionEngine({ ...core, actions }));
56
+ cleanups.push(initFormActionEngine({ ...core, formActions }));
36
57
  }
37
58
  if (document.readyState === "loading") {
38
59
  document.addEventListener("DOMContentLoaded", run);
@@ -41,6 +62,11 @@ export function init({ context = {}, auth, debug = false } = {}) {
41
62
  run();
42
63
  }
43
64
  },
65
+ dispose() {
66
+ cleanups.forEach((c) => c());
67
+ cleanups = [];
68
+ },
44
69
  };
70
+ return app;
45
71
  }
46
72
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAoB,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAuB5C;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,KAAkB,EAAE;IAC1E,OAAO;QACL,QAAQ,EAAE,aAAa;QACvB,SAAS,EAAE,cAAc;QACzB,aAAa,EAAE,kBAAkB;QACjC,KAAK;YACH,SAAS,GAAG;gBACV,IAAI,IAAI;oBAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAClC,gBAAgB,EAAE,CAAC;gBACnB,eAAe,EAAE,CAAC;gBAClB,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,kBAAkB,EAAE,CAAC;gBACrB,cAAc,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACnC,gBAAgB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrC,oBAAoB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACtC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,GAAG,EAAE,CAAC;YACR,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/queries.d.ts CHANGED
@@ -1,10 +1 @@
1
- export type Query = (context: unknown, params: URLSearchParams) => Promise<unknown> | unknown;
2
- export declare const queryRegistry: Record<string, Query>;
3
- /**
4
- * Register a data query for use with gg-data, gg-data-form, or gg-data-list.
5
- *
6
- * Receives the context object passed to init() and a URLSearchParams snapshot of the
7
- * current URL query string. Return a single object (or null) for gg-data/gg-data-form,
8
- * or an array for gg-data-list.
9
- */
10
- export declare function registerQuery(id: string, fn: Query): void;
1
+ export type Query<TContext = unknown, TResult = unknown> = (context: TContext, params: URLSearchParams) => Promise<TResult> | TResult;
package/dist/queries.js CHANGED
@@ -1,12 +1,2 @@
1
- export const queryRegistry = {};
2
- /**
3
- * Register a data query for use with gg-data, gg-data-form, or gg-data-list.
4
- *
5
- * Receives the context object passed to init() and a URLSearchParams snapshot of the
6
- * current URL query string. Return a single object (or null) for gg-data/gg-data-form,
7
- * or an array for gg-data-list.
8
- */
9
- export function registerQuery(id, fn) {
10
- queryRegistry[id] = fn;
11
- }
1
+ export {};
12
2
  //# sourceMappingURL=queries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,aAAa,GAA0B,EAAE,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU,EAAE,EAAS;IACjD,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":""}
@@ -15,5 +15,5 @@ export declare function setQueryParams(params: Array<{
15
15
  * Remove one or more URL query params and notify subscribers.
16
16
  */
17
17
  export declare function removeQueryParams(keys: string[]): void;
18
- export declare function initQueryParams(): void;
18
+ export declare function initQueryParams(): () => void;
19
19
  export {};
@@ -1,3 +1,5 @@
1
+ import { ATTR, SEL } from "./attrs.js";
2
+ import { onElement } from "./dom-observer.js";
1
3
  const subscribers = [];
2
4
  /**
3
5
  * Snapshot of the current URL query string as a URLSearchParams instance.
@@ -38,9 +40,9 @@ export function removeQueryParams(keys) {
38
40
  function handleQueryClick(target) {
39
41
  if (!target)
40
42
  return;
41
- const setTrigger = target.closest("[gg-query-set]");
43
+ const setTrigger = target.closest(`[${ATTR.querySet}]`);
42
44
  if (setTrigger) {
43
- const attr = setTrigger.getAttribute("gg-query-set") ?? "";
45
+ const attr = setTrigger.getAttribute(ATTR.querySet) ?? "";
44
46
  const params = attr
45
47
  .split(",")
46
48
  .filter(Boolean)
@@ -53,9 +55,9 @@ function handleQueryClick(target) {
53
55
  setQueryParams(params);
54
56
  return;
55
57
  }
56
- const removeTrigger = target.closest("[gg-query-remove]");
58
+ const removeTrigger = target.closest(`[${ATTR.queryRemove}]`);
57
59
  if (removeTrigger) {
58
- const attr = removeTrigger.getAttribute("gg-query-remove") ?? "";
60
+ const attr = removeTrigger.getAttribute(ATTR.queryRemove) ?? "";
59
61
  const keys = attr
60
62
  .split(",")
61
63
  .map((k) => k.trim())
@@ -66,30 +68,39 @@ function handleQueryClick(target) {
66
68
  }
67
69
  }
68
70
  export function initQueryParams() {
69
- document.addEventListener("click", (e) => {
71
+ const onClick = (e) => {
70
72
  handleQueryClick(e.target instanceof Element ? e.target : null);
71
- });
72
- // Shadow-root click forwarder shadow DOM swallows bubbling, so anything
73
- // inside a shadow tree dispatches `gg:shadow:click` with the real target.
74
- document.addEventListener("gg:shadow:click", (e) => {
73
+ };
74
+ const onShadowClick = (e) => {
75
75
  const detail = e.detail;
76
76
  handleQueryClick(detail?.target ?? null);
77
- });
78
- initQueryBindings();
77
+ };
78
+ document.addEventListener("click", onClick);
79
+ document.addEventListener("gg:shadow:click", onShadowClick);
80
+ const unbindBindings = initQueryBindings();
81
+ return () => {
82
+ document.removeEventListener("click", onClick);
83
+ document.removeEventListener("gg:shadow:click", onShadowClick);
84
+ unbindBindings();
85
+ };
79
86
  }
80
87
  function syncBindInputFromUrl(el) {
81
- const key = el.getAttribute("gg-query-bind");
88
+ const key = el.getAttribute(ATTR.queryBind);
82
89
  if (!key)
83
90
  return;
84
91
  const value = new URL(window.location.href).searchParams.get(key) ?? "";
85
92
  if (el.value !== value)
86
93
  el.value = value;
87
94
  }
95
+ const boundInputs = new WeakSet();
88
96
  function setupQueryBindInput(el) {
89
- const key = el.getAttribute("gg-query-bind");
97
+ if (boundInputs.has(el))
98
+ return;
99
+ const key = el.getAttribute(ATTR.queryBind);
90
100
  if (!key)
91
101
  return;
92
- const debounceMs = parseInt(el.getAttribute("gg-query-debounce") ?? "0", 10) || 0;
102
+ boundInputs.add(el);
103
+ const debounceMs = parseInt(el.getAttribute(ATTR.queryDebounce) ?? "0", 10) || 0;
93
104
  syncBindInputFromUrl(el);
94
105
  let timer;
95
106
  let suppress = false;
@@ -128,15 +139,22 @@ function setupQueryBindInput(el) {
128
139
  });
129
140
  }
130
141
  function initQueryBindings() {
131
- document
132
- .querySelectorAll("[gg-query-bind]")
133
- .forEach(setupQueryBindInput);
134
- // Back/forward navigation doesn't fire pushState notifications, so
135
- // re-sync all bound inputs from the URL on popstate.
136
- window.addEventListener("popstate", () => {
142
+ const unbind = onElement(SEL.queryBind, (el) => {
143
+ if (el instanceof HTMLInputElement ||
144
+ el instanceof HTMLTextAreaElement ||
145
+ el instanceof HTMLSelectElement) {
146
+ setupQueryBindInput(el);
147
+ }
148
+ });
149
+ const onPopstate = () => {
137
150
  document
138
- .querySelectorAll("[gg-query-bind]")
151
+ .querySelectorAll(SEL.queryBind)
139
152
  .forEach(syncBindInputFromUrl);
140
- });
153
+ };
154
+ window.addEventListener("popstate", onPopstate);
155
+ return () => {
156
+ unbind();
157
+ window.removeEventListener("popstate", onPopstate);
158
+ };
141
159
  }
142
160
  //# sourceMappingURL=query-params.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-params.js","sourceRoot":"","sources":["../src/query-params.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-params.js","sourceRoot":"","sources":["../src/query-params.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- export declare function initSwitchEngine(): void;
1
+ export declare function initSwitchEngine(): () => void;
@@ -1,21 +1,28 @@
1
+ import { ATTR, SEL } from "./attrs.js";
1
2
  import { applySwitchState } from "./helpers/dom.js";
3
+ import { onElement } from "./dom-observer.js";
2
4
  export function initSwitchEngine() {
3
5
  // Re-apply whenever gg-switch-state changes on any element.
4
- new MutationObserver((mutations) => {
6
+ const observer = new MutationObserver((mutations) => {
5
7
  mutations.forEach((m) => {
6
- if (m.attributeName === "gg-switch-state" && m.target instanceof Element) {
8
+ if (m.attributeName === ATTR.switchState &&
9
+ m.target instanceof Element) {
7
10
  applySwitchState(m.target);
8
11
  }
9
12
  });
10
- }).observe(document.body, {
13
+ });
14
+ observer.observe(document.body, {
11
15
  attributes: true,
12
- attributeFilter: ["gg-switch-state"],
16
+ attributeFilter: [ATTR.switchState],
13
17
  subtree: true,
14
18
  });
15
- // Apply initial state for any elements that already have gg-switch-state
16
- // set at load time, so we don't flash all children before the first mutation.
17
- document
18
- .querySelectorAll("[gg-switch-state]")
19
- .forEach(applySwitchState);
19
+ // Initial pass for elements present at start AND any inserted later the
20
+ // mutation observer above only fires on attribute *changes*, so freshly
21
+ // inserted nodes need an explicit apply.
22
+ const unbind = onElement(SEL.switchState, applySwitchState);
23
+ return () => {
24
+ observer.disconnect();
25
+ unbind();
26
+ };
20
27
  }
21
28
  //# sourceMappingURL=switch-engine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"switch-engine.js","sourceRoot":"","sources":["../src/switch-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,UAAU,gBAAgB;IAC9B,4DAA4D;IAC5D,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;QACjC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,IAAI,CAAC,CAAC,aAAa,KAAK,iBAAiB,IAAI,CAAC,CAAC,MAAM,YAAY,OAAO,EAAE,CAAC;gBACzE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;QACxB,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,CAAC,iBAAiB,CAAC;QACpC,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,yEAAyE;IACzE,8EAA8E;IAC9E,QAAQ;SACL,gBAAgB,CAAC,mBAAmB,CAAC;SACrC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"switch-engine.js","sourceRoot":"","sources":["../src/switch-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,UAAU,gBAAgB;IAC9B,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;QAClD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,IACE,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,WAAW;gBACpC,CAAC,CAAC,MAAM,YAAY,OAAO,EAC3B,CAAC;gBACD,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC9B,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;QACnC,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,0EAA0E;IAC1E,wEAAwE;IACxE,yCAAyC;IACzC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAE5D,OAAO,GAAG,EAAE;QACV,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gg-wf-scripts",
3
- "version": "2.8.0",
3
+ "version": "4.0.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -15,10 +15,15 @@
15
15
  "clean": "rimraf dist",
16
16
  "build": "npm run clean && tsc",
17
17
  "typecheck": "tsc --noEmit",
18
- "prepublishOnly": "npm run build"
18
+ "prepublishOnly": "npm run build",
19
+ "docs:dev": "vitepress dev docs",
20
+ "docs:build": "vitepress build docs",
21
+ "docs:preview": "vitepress preview docs"
19
22
  },
20
23
  "devDependencies": {
21
24
  "rimraf": "^6.1.3",
22
- "typescript": "^6.0.3"
25
+ "typescript": "^6.0.3",
26
+ "vitepress": "^1.6.4",
27
+ "vitepress-plugin-llms": "^1.12.1"
23
28
  }
24
29
  }