@verbb/formie-browser 1.0.3 → 1.0.5

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 (206) hide show
  1. package/CHANGELOG.md +65 -17
  2. package/dist/chunks/address-country-Rx6GQTND.js +68 -0
  3. package/dist/chunks/address-finder-yXU5yMjG.js +30 -0
  4. package/dist/chunks/address-state-BQ0xGV9n.js +344 -0
  5. package/dist/chunks/api-CmwLRq_n.js +780 -0
  6. package/dist/chunks/api-DMK8NSUI.js +407 -0
  7. package/dist/chunks/api-sPqGbOww.js +125 -0
  8. package/dist/chunks/async-nPFRNQ06.js +25 -0
  9. package/dist/chunks/bpoint-DSjqRv63.js +24 -0
  10. package/dist/chunks/calculations-CgVJcQ2P.js +299 -0
  11. package/dist/chunks/captcha-eu-CWJb64_j.js +31 -0
  12. package/dist/chunks/checkbox-radio-DQ0H67Tj.js +125 -0
  13. package/dist/chunks/chunk-3b4jIN3o.js +13 -0
  14. package/dist/chunks/combobox-D-2b42wn.js +1954 -0
  15. package/dist/chunks/conditions-CZ3FU5QO.js +412 -0
  16. package/dist/chunks/constants-DVcJAvc5.js +38 -0
  17. package/dist/chunks/country-from-ip-BwxKaBuJ.js +26 -0
  18. package/dist/chunks/custom-google-maps-BsaSirEZ.js +194 -0
  19. package/dist/chunks/custom-link-CJ1-FjEM.js +46 -0
  20. package/dist/chunks/custom-maps-DYW_pBid.js +161 -0
  21. package/dist/chunks/date-picker-5CA_-zGb.js +5311 -0
  22. package/dist/chunks/debug-BV0DvdHx.js +41 -0
  23. package/dist/chunks/dist-BF5GU3_9.js +2674 -0
  24. package/dist/chunks/event-names-BCI2FLD8.js +51 -0
  25. package/dist/chunks/eway-D3ctTbEk.js +70 -0
  26. package/dist/chunks/field-references.keys-58ZSTrCW.js +21 -0
  27. package/dist/chunks/field-references.resolver-CHwn0G0L.js +145 -0
  28. package/dist/chunks/file-upload-D49m8-DR.js +287 -0
  29. package/dist/chunks/friendly-captcha-v1-ByXzENYZ.js +31 -0
  30. package/dist/chunks/friendly-captcha-v2-BPdlmhQu.js +36 -0
  31. package/dist/chunks/friendly-challenge-8uPatWqk.js +832 -0
  32. package/dist/chunks/go-cardless-BwASSYSK.js +23 -0
  33. package/dist/chunks/google-address-OhKilPWE.js +161 -0
  34. package/dist/chunks/hcaptcha-CdCd9oEi.js +54 -0
  35. package/dist/chunks/hidden-D7_Ch-QN.js +26 -0
  36. package/dist/chunks/http-D-JExro7.js +27 -0
  37. package/dist/chunks/i18n-BY1ds1BL.js +121 -0
  38. package/dist/chunks/leaflet-src-j-lHNmhR.js +4585 -0
  39. package/dist/chunks/loqate-Cp2zvwpE.js +76 -0
  40. package/dist/chunks/mollie-COG-ko2D.js +23 -0
  41. package/dist/chunks/moneris-CMH8PlRc.js +117 -0
  42. package/dist/chunks/opayo-D2jsR5vh.js +113 -0
  43. package/dist/chunks/paddle-DxF88RfC.js +55 -0
  44. package/dist/chunks/paypal-b5pnwrA2.js +95 -0
  45. package/dist/chunks/payway-BJYu9DIR.js +55 -0
  46. package/dist/chunks/phone-country-D3ayr60L.js +2645 -0
  47. package/dist/chunks/place-kit-BGHklIZ-.js +48 -0
  48. package/dist/chunks/placekit-autocomplete.esm-DWVabQlq.js +1236 -0
  49. package/dist/chunks/recaptcha-enterprise-BSwi8IVX.js +65 -0
  50. package/dist/chunks/recaptcha-shared-B4zAescW.js +15 -0
  51. package/dist/chunks/recaptcha-v2-checkbox-CnDQmsKa.js +40 -0
  52. package/dist/chunks/recaptcha-v2-invisible-Cz5uIlp-.js +53 -0
  53. package/dist/chunks/recaptcha-v3-BtbbP111.js +27 -0
  54. package/dist/chunks/repeater-B5leVxZU.js +102 -0
  55. package/dist/chunks/rich-text-Cv8ADyk-.js +349 -0
  56. package/dist/chunks/scripts-6CYSUGKQ.js +24 -0
  57. package/dist/chunks/sdk-BhHAYgga.js +1397 -0
  58. package/dist/chunks/shared-Bx9s0i0P.js +100 -0
  59. package/dist/chunks/signature-CpgqHCEx.js +463 -0
  60. package/dist/chunks/snaptcha-vz1RnZ15.js +8 -0
  61. package/dist/chunks/square-BP8RWAKB.js +40 -0
  62. package/dist/chunks/stripe-MihN63uC.js +184 -0
  63. package/dist/chunks/styles-BfoIZwJp.js +19 -0
  64. package/dist/chunks/summary-D3AjxpYN.js +114 -0
  65. package/dist/chunks/table-C-lkQN6I.js +78 -0
  66. package/dist/chunks/text-limit-B09elPDB.js +125 -0
  67. package/dist/chunks/theme-classes-Tv7q7ToE.js +44 -0
  68. package/dist/chunks/turnstile-D_Pi1CKM.js +58 -0
  69. package/dist/chunks/utils-Vqp8i_RM.js +49401 -0
  70. package/dist/css/formie-theme.css +2 -0
  71. package/dist/css/theme/fields/_address-state.css +94 -0
  72. package/dist/css/theme/fields/_combobox.css +246 -0
  73. package/dist/css/theme/fields/_select.css +13 -0
  74. package/dist/index.js +2447 -39
  75. package/dist/js/core/create-formie-client.d.ts.map +1 -1
  76. package/dist/js/core/field-error-container.d.ts +4 -0
  77. package/dist/js/core/field-error-container.d.ts.map +1 -0
  78. package/dist/js/core/submit-result-state.d.ts.map +1 -1
  79. package/dist/js/core/submit-result-ui.d.ts.map +1 -1
  80. package/dist/js/core/validation-focus.d.ts +4 -0
  81. package/dist/js/core/validation-focus.d.ts.map +1 -0
  82. package/dist/js/modules/address/api.d.ts +1 -0
  83. package/dist/js/modules/address/api.d.ts.map +1 -1
  84. package/dist/js/modules/address/constants.d.ts +22 -1
  85. package/dist/js/modules/address/constants.d.ts.map +1 -1
  86. package/dist/js/modules/address/host.d.ts +2 -2
  87. package/dist/js/modules/address/host.d.ts.map +1 -1
  88. package/dist/js/modules/address/loqate.d.ts.map +1 -1
  89. package/dist/js/modules/fields/address-country.d.ts +3 -0
  90. package/dist/js/modules/fields/address-country.d.ts.map +1 -0
  91. package/dist/js/modules/fields/address-state.d.ts +3 -0
  92. package/dist/js/modules/fields/address-state.d.ts.map +1 -0
  93. package/dist/js/modules/fields/calculations.d.ts.map +1 -1
  94. package/dist/js/modules/fields/checkbox-radio.d.ts.map +1 -1
  95. package/dist/js/modules/fields/combobox.d.ts +17 -0
  96. package/dist/js/modules/fields/combobox.d.ts.map +1 -0
  97. package/dist/js/modules/fields/custom-google-maps.d.ts +64 -0
  98. package/dist/js/modules/fields/custom-google-maps.d.ts.map +1 -0
  99. package/dist/js/modules/fields/custom-link.d.ts +3 -0
  100. package/dist/js/modules/fields/custom-link.d.ts.map +1 -0
  101. package/dist/js/modules/fields/custom-maps.d.ts +3 -0
  102. package/dist/js/modules/fields/custom-maps.d.ts.map +1 -0
  103. package/dist/js/modules/fields/date-picker.d.ts.map +1 -1
  104. package/dist/js/modules/fields/file-upload.d.ts.map +1 -1
  105. package/dist/js/modules/fields/index.d.ts.map +1 -1
  106. package/dist/js/modules/fields/phone-country.d.ts.map +1 -1
  107. package/dist/js/modules/fields/text-limit.d.ts.map +1 -1
  108. package/dist/js/submit/pipeline.d.ts.map +1 -1
  109. package/dist/js/utils/country-from-ip.d.ts +7 -0
  110. package/dist/js/utils/country-from-ip.d.ts.map +1 -0
  111. package/dist/js/utils/field-references.d.ts +1 -0
  112. package/dist/js/utils/field-references.d.ts.map +1 -1
  113. package/dist/js/utils/field-references.row-scope.d.ts +11 -0
  114. package/dist/js/utils/field-references.row-scope.d.ts.map +1 -0
  115. package/dist/js/utils/i18n.d.ts.map +1 -1
  116. package/dist/js/validation/rules/email.d.ts.map +1 -1
  117. package/dist/js/validation/rules/number.d.ts.map +1 -1
  118. package/dist/js/validation/validator.d.ts.map +1 -1
  119. package/package.json +6 -3
  120. package/src/css/formie-theme.css +2 -0
  121. package/src/css/theme/fields/_address-state.css +94 -0
  122. package/src/css/theme/fields/_combobox.css +246 -0
  123. package/src/css/theme/fields/_select.css +13 -0
  124. package/src/js/core/create-formie-client.ts +27 -0
  125. package/src/js/core/field-error-container.ts +39 -0
  126. package/src/js/core/submit-result-state.ts +12 -2
  127. package/src/js/core/submit-result-ui.ts +7 -13
  128. package/src/js/core/validation-focus.ts +117 -0
  129. package/src/js/modules/address/api.ts +7 -0
  130. package/src/js/modules/address/constants.ts +82 -2
  131. package/src/js/modules/address/host.ts +16 -6
  132. package/src/js/modules/address/loqate.ts +3 -17
  133. package/src/js/modules/fields/address-country.ts +156 -0
  134. package/src/js/modules/fields/address-state.ts +946 -0
  135. package/src/js/modules/fields/calculations.ts +32 -0
  136. package/src/js/modules/fields/checkbox-radio.ts +21 -15
  137. package/src/js/modules/fields/combobox.ts +188 -0
  138. package/src/js/modules/fields/custom-google-maps.ts +416 -0
  139. package/src/js/modules/fields/custom-link.ts +95 -0
  140. package/src/js/modules/fields/custom-maps.ts +339 -0
  141. package/src/js/modules/fields/date-picker.ts +96 -3
  142. package/src/js/modules/fields/file-upload.ts +12 -9
  143. package/src/js/modules/fields/index.ts +6 -0
  144. package/src/js/modules/fields/phone-country.ts +6 -0
  145. package/src/js/modules/fields/text-limit.ts +87 -22
  146. package/src/js/submit/pipeline.ts +11 -1
  147. package/src/js/utils/country-from-ip.ts +54 -0
  148. package/src/js/utils/field-references.row-scope.ts +303 -0
  149. package/src/js/utils/field-references.ts +1 -0
  150. package/src/js/utils/i18n.ts +184 -5
  151. package/src/js/validation/rules/email.ts +3 -2
  152. package/src/js/validation/rules/match.ts +2 -2
  153. package/src/js/validation/rules/minmax.ts +4 -4
  154. package/src/js/validation/rules/number.ts +9 -5
  155. package/src/js/validation/rules/pattern.ts +4 -4
  156. package/src/js/validation/rules/required.ts +1 -1
  157. package/src/js/validation/rules/url.ts +1 -1
  158. package/src/js/validation/validator.ts +7 -7
  159. package/dist/chunks/address-finder-BjMuEiwF.js +0 -37
  160. package/dist/chunks/bpoint-KudsBCo2.js +0 -26
  161. package/dist/chunks/calculations-DlGSkQ3W.js +0 -147
  162. package/dist/chunks/captcha-eu-CterYFok.js +0 -34
  163. package/dist/chunks/checkbox-radio-CBvgk3hR.js +0 -136
  164. package/dist/chunks/conditions-DYy1-Hwt.js +0 -459
  165. package/dist/chunks/date-picker-BlD--zfe.js +0 -4994
  166. package/dist/chunks/eway-qwc-B5Us.js +0 -74
  167. package/dist/chunks/file-upload-CIgHrXfp.js +0 -316
  168. package/dist/chunks/friendly-captcha-v1-EDFac33c.js +0 -33
  169. package/dist/chunks/friendly-captcha-v2-BDpSvFGR.js +0 -38
  170. package/dist/chunks/go-cardless-DuDMVsnz.js +0 -24
  171. package/dist/chunks/google-address-Bmjp01pH.js +0 -181
  172. package/dist/chunks/hcaptcha-BTQ6An6g.js +0 -56
  173. package/dist/chunks/hidden-DbPdOxKb.js +0 -31
  174. package/dist/chunks/index-BEsfee-D.js +0 -1839
  175. package/dist/chunks/index-BP7Unm5Y.js +0 -863
  176. package/dist/chunks/index-BcqwpPNE.js +0 -4314
  177. package/dist/chunks/loqate-BdNGv93o.js +0 -55
  178. package/dist/chunks/mollie-DFOjTuGX.js +0 -24
  179. package/dist/chunks/moneris-BbFfl-EL.js +0 -101
  180. package/dist/chunks/opayo-CmgYa9ya.js +0 -122
  181. package/dist/chunks/paddle-BUi7w1_o.js +0 -60
  182. package/dist/chunks/paypal-A-ePfh6k.js +0 -100
  183. package/dist/chunks/payway-BqFCbhyo.js +0 -56
  184. package/dist/chunks/phone-country-DPMiqk4L.js +0 -3765
  185. package/dist/chunks/place-kit-CX7tamAg.js +0 -42
  186. package/dist/chunks/placekit-autocomplete.esm-LAwfbPZl.js +0 -1299
  187. package/dist/chunks/recaptcha-enterprise-DxF6cW95.js +0 -71
  188. package/dist/chunks/recaptcha-shared-DhGcbiaq.js +0 -15
  189. package/dist/chunks/recaptcha-v2-checkbox-R9EfbZ4k.js +0 -41
  190. package/dist/chunks/recaptcha-v2-invisible-DV9hswAp.js +0 -59
  191. package/dist/chunks/recaptcha-v3-V0xc-Edh.js +0 -28
  192. package/dist/chunks/repeater-DKUT6TGI.js +0 -124
  193. package/dist/chunks/rich-text-SH7KiaKH.js +0 -304
  194. package/dist/chunks/scripts-D9N2d5rN.js +0 -36
  195. package/dist/chunks/sdk-3SicTWby.js +0 -1559
  196. package/dist/chunks/shared-BmntPmnW.js +0 -80
  197. package/dist/chunks/signature-BA3tQsGT.js +0 -550
  198. package/dist/chunks/snaptcha-DV7p6J9k.js +0 -8
  199. package/dist/chunks/square-Bs-ndqYK.js +0 -46
  200. package/dist/chunks/stripe-DkZAHxtn.js +0 -202
  201. package/dist/chunks/styles-C3aqgtek.js +0 -21
  202. package/dist/chunks/summary-Dq2i9TQk.js +0 -126
  203. package/dist/chunks/table-Cu4WfVcw.js +0 -95
  204. package/dist/chunks/text-limit-2ycmB-Ae.js +0 -135
  205. package/dist/chunks/turnstile-CId90tRr.js +0 -59
  206. package/dist/chunks/utils-BntI3W4S.js +0 -6149
@@ -1,8 +1,9 @@
1
1
  import type { ModuleSetupContext } from '#contracts/modules';
2
2
  import {
3
3
  ADDRESS_LOCATION_SELECTOR,
4
- ADDRESS_SELECTORS,
5
4
  DEFAULT_AUTOCOMPLETE_SELECTOR,
5
+ findAddressFieldInput,
6
+ type AddressFieldInputKey,
6
7
  } from '#modules/address/constants';
7
8
 
8
9
  type Cleanup = () => void;
@@ -24,7 +25,7 @@ export type AddressHostServices = {
24
25
  form: HTMLFormElement | null;
25
26
  input: {
26
27
  getAutocomplete: () => HTMLInputElement | null;
27
- setValue: (selector: keyof typeof ADDRESS_SELECTORS, value: string, fallback?: string) => void;
28
+ setValue: (selector: AddressFieldInputKey, value: string, fallback?: string) => void;
28
29
  };
29
30
  location: {
30
31
  getButton: () => HTMLElement | null;
@@ -90,12 +91,21 @@ export function createAddressHostServices(
90
91
  return field.querySelector(autocompleteSelector) as HTMLInputElement | null;
91
92
  },
92
93
  setValue: (selectorKey, value, fallback) => {
93
- const selector = ADDRESS_SELECTORS[selectorKey];
94
- const el = field.querySelector(selector) as HTMLInputElement | null;
94
+ const el = findAddressFieldInput(field, selectorKey);
95
95
 
96
- if (el) {
97
- el.value = value || fallback || '';
96
+ if (!el) {
97
+ return;
98
98
  }
99
+
100
+ const nextValue = value || fallback || '';
101
+
102
+ if (el.value === nextValue) {
103
+ return;
104
+ }
105
+
106
+ el.value = nextValue;
107
+ el.dispatchEvent(new Event('input', { bubbles: true }));
108
+ el.dispatchEvent(new Event('change', { bubbles: true }));
99
109
  },
100
110
  },
101
111
  location: {
@@ -1,5 +1,5 @@
1
1
  import { defineAddressModule } from '#modules/address/api';
2
- import { ADDRESS_SELECTORS } from '#modules/address/constants';
2
+ import { findAddressFieldInput, type AddressFieldInputKey } from '#modules/address/constants';
3
3
  import { loadScriptAndEnsureGlobal } from '#utils/scripts';
4
4
 
5
5
  type PcaFieldMode = {
@@ -63,27 +63,13 @@ export const loqateModule = defineAddressModule<
63
63
  throw new Error('Loqate API key is required');
64
64
  }
65
65
 
66
- const handleToSelector: Record<string, string> = {
67
- autoComplete: ADDRESS_SELECTORS.autoComplete,
68
- address1: ADDRESS_SELECTORS.address1,
69
- address2: ADDRESS_SELECTORS.address2,
70
- address3: ADDRESS_SELECTORS.address3,
71
- city: ADDRESS_SELECTORS.city,
72
- state: ADDRESS_SELECTORS.state,
73
- zip: ADDRESS_SELECTORS.zip,
74
- country: ADDRESS_SELECTORS.country,
75
- };
76
-
77
66
  // Loqate PCA expects element to be an id string, name string, or RegExp matching ids – not CSS selectors
78
- const getLoqateElementRef = (handle: string): string => {
67
+ const getLoqateElementRef = (handle: AddressFieldInputKey): string => {
79
68
  if (namespace) {
80
69
  return `${namespace}[${handle}]`;
81
70
  }
82
71
 
83
- const cssSelector = handleToSelector[handle];
84
- const el = cssSelector
85
- ? (field.querySelector(cssSelector) as HTMLInputElement | null)
86
- : null;
72
+ const el = findAddressFieldInput(field, handle);
87
73
 
88
74
  if (el?.name) {
89
75
  return el.name;
@@ -0,0 +1,156 @@
1
+ import type { FormieModuleDefinition } from '#contracts/modules';
2
+ import { ADDRESS_SELECTORS, findAddressFieldInput } from '#modules/address/constants';
3
+ import { getModuleFieldContainers } from '#modules/fields/shared';
4
+ import { fetchCountryFromIp } from '#utils/country-from-ip';
5
+ import { createDebug } from '#utils/debug';
6
+
7
+ const MODULE_ID = 'address-country';
8
+ const COUNTRY_SELECTOR = ADDRESS_SELECTORS.country;
9
+ const debug = createDebug('fields', 'address-country');
10
+
11
+ type ComboboxSelect = HTMLSelectElement & {
12
+ _formieTomSelect?: {
13
+ setValue: (value: string, silent?: boolean) => void;
14
+ };
15
+ };
16
+
17
+ type AddressCountryOptions = {
18
+ countryPreselectFromIp?: boolean;
19
+ countryAllowed?: string[];
20
+ countryOptionValue?: 'short' | 'full';
21
+ countryFromIpAction?: string;
22
+ };
23
+
24
+ function resolveCountrySelectValue(
25
+ countryCode: string,
26
+ countryName: string | null | undefined,
27
+ optionValue: 'short' | 'full',
28
+ ): string {
29
+ if (optionValue === 'full' && countryName) {
30
+ return countryName;
31
+ }
32
+
33
+ return countryCode.toUpperCase();
34
+ }
35
+
36
+ function isCountryAllowed(countryCode: string, countryAllowed: string[] = []): boolean {
37
+ if (!countryAllowed.length) {
38
+ return true;
39
+ }
40
+
41
+ const upperCode = countryCode.toUpperCase();
42
+
43
+ return countryAllowed.some((allowed) => allowed.toUpperCase() === upperCode);
44
+ }
45
+
46
+ function optionExists(select: HTMLSelectElement, value: string): boolean {
47
+ return Array.from(select.options).some((option) => option.value === value);
48
+ }
49
+
50
+ async function setCountrySelectValue(select: HTMLSelectElement, value: string): Promise<void> {
51
+ for (let attempt = 0; attempt < 20; attempt += 1) {
52
+ const combobox = (select as ComboboxSelect)._formieTomSelect;
53
+
54
+ if (combobox || !select.hasAttribute('data-formie-combobox-input')) {
55
+ if (combobox) {
56
+ combobox.setValue(value, true);
57
+ } else {
58
+ select.value = value;
59
+ }
60
+
61
+ select.dispatchEvent(new Event('change', { bubbles: true }));
62
+ return;
63
+ }
64
+
65
+ await new Promise((resolve) => {
66
+ window.setTimeout(resolve, 50);
67
+ });
68
+ }
69
+
70
+ debug.warn('Timed out waiting for country combobox initialisation.');
71
+ }
72
+
73
+ async function preselectCountry(
74
+ addressRoot: HTMLElement,
75
+ options: AddressCountryOptions,
76
+ ): Promise<void> {
77
+ const countryControl = findAddressFieldInput(addressRoot, 'country');
78
+
79
+ if (!(countryControl instanceof HTMLSelectElement)) {
80
+ debug.warn('Country control not found or not a select; skipping preselect.');
81
+ return;
82
+ }
83
+
84
+ if (countryControl.value.trim()) {
85
+ return;
86
+ }
87
+
88
+ const response = await fetchCountryFromIp(options.countryFromIpAction);
89
+
90
+ if (!response?.countryCode) {
91
+ return;
92
+ }
93
+
94
+ if (!isCountryAllowed(response.countryCode, options.countryAllowed)) {
95
+ debug.log('Detected country is not in the allowed list; skipping preselect.', {
96
+ countryCode: response.countryCode,
97
+ });
98
+ return;
99
+ }
100
+
101
+ const optionValue = options.countryOptionValue === 'full' ? 'full' : 'short';
102
+ const selectValue = resolveCountrySelectValue(
103
+ response.countryCode,
104
+ response.countryName,
105
+ optionValue,
106
+ );
107
+
108
+ if (!optionExists(countryControl, selectValue)) {
109
+ debug.warn('Detected country is not available in the country dropdown; skipping preselect.', {
110
+ selectValue,
111
+ });
112
+ return;
113
+ }
114
+
115
+ await setCountrySelectValue(countryControl, selectValue);
116
+ debug.log('Preselected country from IP.', { selectValue });
117
+ }
118
+
119
+ export const addressCountryModule: FormieModuleDefinition = {
120
+ id: MODULE_ID,
121
+ kind: 'field',
122
+ match: (ctx) => {
123
+ return !!ctx.target.querySelector(COUNTRY_SELECTOR);
124
+ },
125
+ setup: async (ctx) => {
126
+ const options = (ctx.options || {}) as AddressCountryOptions;
127
+
128
+ if (!options.countryPreselectFromIp) {
129
+ return {
130
+ destroy: () => {},
131
+ };
132
+ }
133
+
134
+ const fields = getModuleFieldContainers(ctx);
135
+ const tasks = fields.map(async (field) => {
136
+ const addressRoot = field.closest('[data-formie-field-type="address"]')
137
+ || field.closest('[data-formie-address-field-layout]')?.closest('[data-formie-field]')
138
+ || field;
139
+
140
+ if (!(addressRoot instanceof HTMLElement)) {
141
+ return;
142
+ }
143
+
144
+ await preselectCountry(addressRoot, options);
145
+ });
146
+
147
+ await Promise.all(tasks);
148
+ debug.log('Module setup.', { fieldCount: fields.length });
149
+
150
+ return {
151
+ destroy: () => {
152
+ debug.log('Module destroy.', { fieldCount: fields.length });
153
+ },
154
+ };
155
+ },
156
+ };