@verbb/formie-browser 1.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.
- package/CHANGELOG.md +5 -0
- package/LICENSE.md +40 -0
- package/README.md +34 -0
- package/dist/chunks/address-finder-DfMCiW89.js +47 -0
- package/dist/chunks/api-CbqEMQT5.js +181 -0
- package/dist/chunks/api-DE7LfK-R.js +960 -0
- package/dist/chunks/api-DOfDzYC_.js +538 -0
- package/dist/chunks/async-B3DUf1GZ.js +26 -0
- package/dist/chunks/bpoint-Ciy3yY9Q.js +34 -0
- package/dist/chunks/calculations-CkYAqO_-.js +197 -0
- package/dist/chunks/captcha-eu-DnOWhMwr.js +43 -0
- package/dist/chunks/checkbox-radio-0x7Tc0br.js +197 -0
- package/dist/chunks/chunk-K6L4z4UQ.js +24 -0
- package/dist/chunks/conditions-4fXKhEJS.js +609 -0
- package/dist/chunks/date-picker-B6iZkjHS.js +6204 -0
- package/dist/chunks/debug-KnZeKYBI.js +39 -0
- package/dist/chunks/dist-D09GnXMW.js +2663 -0
- package/dist/chunks/event-names-DamGPtXR.js +51 -0
- package/dist/chunks/eway-DEAYcwT0.js +86 -0
- package/dist/chunks/field-references.keys-BpBZ_quS.js +24 -0
- package/dist/chunks/field-references.resolver-Ba6xhiJC.js +183 -0
- package/dist/chunks/file-upload-Bh63PQSE.js +430 -0
- package/dist/chunks/friendly-captcha-v1-CqO4WVre.js +40 -0
- package/dist/chunks/friendly-captcha-v2-CyykcJcM.js +47 -0
- package/dist/chunks/friendly-challenge-Dg8XkStd.js +1101 -0
- package/dist/chunks/go-cardless-CuND59rR.js +26 -0
- package/dist/chunks/google-address--uR8WDSm.js +208 -0
- package/dist/chunks/hcaptcha-CmaFUesv.js +72 -0
- package/dist/chunks/hidden-CYnZYple.js +36 -0
- package/dist/chunks/http-18nn97DZ.js +29 -0
- package/dist/chunks/i18n-vUh-KGiH.js +55 -0
- package/dist/chunks/loqate-BICNJlVK.js +97 -0
- package/dist/chunks/mollie-DwlsgHZ1.js +26 -0
- package/dist/chunks/moneris-B_IFZFTx.js +159 -0
- package/dist/chunks/opayo-U2x_TOII.js +192 -0
- package/dist/chunks/paddle-BqXFrc79.js +75 -0
- package/dist/chunks/paypal-Cn_DYGDb.js +121 -0
- package/dist/chunks/payway-Rnq796eC.js +75 -0
- package/dist/chunks/phone-country-B6Me4lK0.js +3317 -0
- package/dist/chunks/place-kit-ldUl-u9w.js +56 -0
- package/dist/chunks/placekit-autocomplete.esm-D-lGeaZl.js +1771 -0
- package/dist/chunks/recaptcha-enterprise-DPJNyv1X.js +72 -0
- package/dist/chunks/recaptcha-shared-DTI4qWVR.js +22 -0
- package/dist/chunks/recaptcha-v2-checkbox-zFjpvJ5c.js +49 -0
- package/dist/chunks/recaptcha-v2-invisible-CnYtkNvz.js +62 -0
- package/dist/chunks/recaptcha-v3-EAlWhnkX.js +33 -0
- package/dist/chunks/repeater-CXD1eLSn.js +151 -0
- package/dist/chunks/rich-text-DkmZRhGj.js +442 -0
- package/dist/chunks/scripts-BGD_iU_6.js +41 -0
- package/dist/chunks/sdk-B7u9fTlP.js +2103 -0
- package/dist/chunks/shared-DC6_1u8X.js +85 -0
- package/dist/chunks/signature-E9KyYXS1.js +765 -0
- package/dist/chunks/snaptcha-CCDunGeb.js +8 -0
- package/dist/chunks/square-BLqK51rS.js +61 -0
- package/dist/chunks/stripe-B8gHpZNC.js +273 -0
- package/dist/chunks/styles-BIh6g7V_.js +22 -0
- package/dist/chunks/summary-EcNE0cvg.js +191 -0
- package/dist/chunks/table-yxEDL6kA.js +124 -0
- package/dist/chunks/text-limit-D0H_Ca2c.js +179 -0
- package/dist/chunks/theme-classes-vSHpdCUO.js +59 -0
- package/dist/chunks/turnstile-DP0bdR7T.js +68 -0
- package/dist/chunks/utils-ByrEVYrJ.js +49584 -0
- package/dist/css/formie-base.css +78 -0
- package/dist/css/formie-theme.css +19 -0
- package/dist/css/formie.css +2 -0
- package/dist/css/theme/_buttons.css +249 -0
- package/dist/css/theme/_loading.css +37 -0
- package/dist/css/theme/_messages.css +39 -0
- package/dist/css/theme/_progress.css +62 -0
- package/dist/css/theme/_tokens.css +361 -0
- package/dist/css/theme/_typography.css +70 -0
- package/dist/css/theme/fields/_address.css +17 -0
- package/dist/css/theme/fields/_check-radio.css +108 -0
- package/dist/css/theme/fields/_file.css +58 -0
- package/dist/css/theme/fields/_group.css +13 -0
- package/dist/css/theme/fields/_input.css +48 -0
- package/dist/css/theme/fields/_nested.css +19 -0
- package/dist/css/theme/fields/_repeater.css +69 -0
- package/dist/css/theme/fields/_rich-text.css +201 -0
- package/dist/css/theme/fields/_select.css +37 -0
- package/dist/css/theme/fields/_signature.css +39 -0
- package/dist/css/theme/fields/_summary.css +53 -0
- package/dist/css/theme/fields/_table.css +121 -0
- package/dist/css/theme/fields/_text-limit.css +10 -0
- package/dist/css/theme/forms/_field.css +62 -0
- package/dist/css/theme/forms/_form.css +166 -0
- package/dist/css/theme/integrations/_payment-modal.css +32 -0
- package/dist/css/theme/integrations/_paypal.css +10 -0
- package/dist/css/theme/integrations/_payway.css +10 -0
- package/dist/css/theme/integrations/_stripe.css +24 -0
- package/dist/css/theme/utilities/_accessibility.css +13 -0
- package/dist/css/theme-base/_controls.css +41 -0
- package/dist/css/theme-base/_primitives.css +34 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3206 -0
- package/dist/js/compatibility/dom-adapter.d.ts +12 -0
- package/dist/js/compatibility/dom-adapter.d.ts.map +1 -0
- package/dist/js/compatibility/event-map.d.ts +25 -0
- package/dist/js/compatibility/event-map.d.ts.map +1 -0
- package/dist/js/compatibility/validator-adapter.d.ts +17 -0
- package/dist/js/compatibility/validator-adapter.d.ts.map +1 -0
- package/dist/js/contracts/client.d.ts +40 -0
- package/dist/js/contracts/client.d.ts.map +1 -0
- package/dist/js/contracts/common.d.ts +5 -0
- package/dist/js/contracts/common.d.ts.map +1 -0
- package/dist/js/contracts/modules.d.ts +47 -0
- package/dist/js/contracts/modules.d.ts.map +1 -0
- package/dist/js/contracts/schema.d.ts +79 -0
- package/dist/js/contracts/schema.d.ts.map +1 -0
- package/dist/js/contracts/theme.d.ts +2 -0
- package/dist/js/contracts/theme.d.ts.map +1 -0
- package/dist/js/core/create-formie-client.d.ts +3 -0
- package/dist/js/core/create-formie-client.d.ts.map +1 -0
- package/dist/js/core/dom-events.d.ts +2 -0
- package/dist/js/core/dom-events.d.ts.map +1 -0
- package/dist/js/core/formie.d.ts +27 -0
- package/dist/js/core/formie.d.ts.map +1 -0
- package/dist/js/core/hydrate-modules.d.ts +22 -0
- package/dist/js/core/hydrate-modules.d.ts.map +1 -0
- package/dist/js/core/page-client-event.d.ts +9 -0
- package/dist/js/core/page-client-event.d.ts.map +1 -0
- package/dist/js/core/page-tab-errors.d.ts +2 -0
- package/dist/js/core/page-tab-errors.d.ts.map +1 -0
- package/dist/js/core/submit-flow.d.ts +21 -0
- package/dist/js/core/submit-flow.d.ts.map +1 -0
- package/dist/js/core/submit-result-state.d.ts +8 -0
- package/dist/js/core/submit-result-state.d.ts.map +1 -0
- package/dist/js/core/submit-result-ui.d.ts +10 -0
- package/dist/js/core/submit-result-ui.d.ts.map +1 -0
- package/dist/js/events/event-bus.d.ts +21 -0
- package/dist/js/events/event-bus.d.ts.map +1 -0
- package/dist/js/modules/address/address-finder.d.ts +2 -0
- package/dist/js/modules/address/address-finder.d.ts.map +1 -0
- package/dist/js/modules/address/api.d.ts +8 -0
- package/dist/js/modules/address/api.d.ts.map +1 -0
- package/dist/js/modules/address/constants.d.ts +15 -0
- package/dist/js/modules/address/constants.d.ts.map +1 -0
- package/dist/js/modules/address/factories.d.ts +35 -0
- package/dist/js/modules/address/factories.d.ts.map +1 -0
- package/dist/js/modules/address/google-address.d.ts +2 -0
- package/dist/js/modules/address/google-address.d.ts.map +1 -0
- package/dist/js/modules/address/host.d.ts +30 -0
- package/dist/js/modules/address/host.d.ts.map +1 -0
- package/dist/js/modules/address/index.d.ts +3 -0
- package/dist/js/modules/address/index.d.ts.map +1 -0
- package/dist/js/modules/address/loqate.d.ts +2 -0
- package/dist/js/modules/address/loqate.d.ts.map +1 -0
- package/dist/js/modules/address/place-kit.d.ts +2 -0
- package/dist/js/modules/address/place-kit.d.ts.map +1 -0
- package/dist/js/modules/captchas/api.d.ts +9 -0
- package/dist/js/modules/captchas/api.d.ts.map +1 -0
- package/dist/js/modules/captchas/captcha-eu.d.ts +2 -0
- package/dist/js/modules/captchas/captcha-eu.d.ts.map +1 -0
- package/dist/js/modules/captchas/constants.d.ts +5 -0
- package/dist/js/modules/captchas/constants.d.ts.map +1 -0
- package/dist/js/modules/captchas/factories.d.ts +63 -0
- package/dist/js/modules/captchas/factories.d.ts.map +1 -0
- package/dist/js/modules/captchas/friendly-captcha-v1.d.ts +2 -0
- package/dist/js/modules/captchas/friendly-captcha-v1.d.ts.map +1 -0
- package/dist/js/modules/captchas/friendly-captcha-v2.d.ts +2 -0
- package/dist/js/modules/captchas/friendly-captcha-v2.d.ts.map +1 -0
- package/dist/js/modules/captchas/hcaptcha.d.ts +2 -0
- package/dist/js/modules/captchas/hcaptcha.d.ts.map +1 -0
- package/dist/js/modules/captchas/host.d.ts +78 -0
- package/dist/js/modules/captchas/host.d.ts.map +1 -0
- package/dist/js/modules/captchas/index.d.ts +3 -0
- package/dist/js/modules/captchas/index.d.ts.map +1 -0
- package/dist/js/modules/captchas/recaptcha-enterprise.d.ts +2 -0
- package/dist/js/modules/captchas/recaptcha-enterprise.d.ts.map +1 -0
- package/dist/js/modules/captchas/recaptcha-shared.d.ts +26 -0
- package/dist/js/modules/captchas/recaptcha-shared.d.ts.map +1 -0
- package/dist/js/modules/captchas/recaptcha-v2-checkbox.d.ts +2 -0
- package/dist/js/modules/captchas/recaptcha-v2-checkbox.d.ts.map +1 -0
- package/dist/js/modules/captchas/recaptcha-v2-invisible.d.ts +2 -0
- package/dist/js/modules/captchas/recaptcha-v2-invisible.d.ts.map +1 -0
- package/dist/js/modules/captchas/recaptcha-v3.d.ts +2 -0
- package/dist/js/modules/captchas/recaptcha-v3.d.ts.map +1 -0
- package/dist/js/modules/captchas/snaptcha.d.ts +2 -0
- package/dist/js/modules/captchas/snaptcha.d.ts.map +1 -0
- package/dist/js/modules/captchas/turnstile.d.ts +2 -0
- package/dist/js/modules/captchas/turnstile.d.ts.map +1 -0
- package/dist/js/modules/captchas/utils.d.ts +13 -0
- package/dist/js/modules/captchas/utils.d.ts.map +1 -0
- package/dist/js/modules/fields/calculations.d.ts +3 -0
- package/dist/js/modules/fields/calculations.d.ts.map +1 -0
- package/dist/js/modules/fields/checkbox-radio.d.ts +3 -0
- package/dist/js/modules/fields/checkbox-radio.d.ts.map +1 -0
- package/dist/js/modules/fields/conditions/config.d.ts +5 -0
- package/dist/js/modules/fields/conditions/config.d.ts.map +1 -0
- package/dist/js/modules/fields/conditions/effects.d.ts +2 -0
- package/dist/js/modules/fields/conditions/effects.d.ts.map +1 -0
- package/dist/js/modules/fields/conditions/evaluator.d.ts +6 -0
- package/dist/js/modules/fields/conditions/evaluator.d.ts.map +1 -0
- package/dist/js/modules/fields/conditions/references.d.ts +5 -0
- package/dist/js/modules/fields/conditions/references.d.ts.map +1 -0
- package/dist/js/modules/fields/conditions/transforms.d.ts +3 -0
- package/dist/js/modules/fields/conditions/transforms.d.ts.map +1 -0
- package/dist/js/modules/fields/conditions/types.d.ts +30 -0
- package/dist/js/modules/fields/conditions/types.d.ts.map +1 -0
- package/dist/js/modules/fields/conditions/values.d.ts +5 -0
- package/dist/js/modules/fields/conditions/values.d.ts.map +1 -0
- package/dist/js/modules/fields/conditions.d.ts +3 -0
- package/dist/js/modules/fields/conditions.d.ts.map +1 -0
- package/dist/js/modules/fields/date-picker.d.ts +3 -0
- package/dist/js/modules/fields/date-picker.d.ts.map +1 -0
- package/dist/js/modules/fields/file-upload.d.ts +3 -0
- package/dist/js/modules/fields/file-upload.d.ts.map +1 -0
- package/dist/js/modules/fields/hidden.d.ts +3 -0
- package/dist/js/modules/fields/hidden.d.ts.map +1 -0
- package/dist/js/modules/fields/index.d.ts +3 -0
- package/dist/js/modules/fields/index.d.ts.map +1 -0
- package/dist/js/modules/fields/phone-country.d.ts +3 -0
- package/dist/js/modules/fields/phone-country.d.ts.map +1 -0
- package/dist/js/modules/fields/repeater.d.ts +3 -0
- package/dist/js/modules/fields/repeater.d.ts.map +1 -0
- package/dist/js/modules/fields/rich-text.d.ts +3 -0
- package/dist/js/modules/fields/rich-text.d.ts.map +1 -0
- package/dist/js/modules/fields/shared.d.ts +20 -0
- package/dist/js/modules/fields/shared.d.ts.map +1 -0
- package/dist/js/modules/fields/signature.d.ts +3 -0
- package/dist/js/modules/fields/signature.d.ts.map +1 -0
- package/dist/js/modules/fields/summary.d.ts +3 -0
- package/dist/js/modules/fields/summary.d.ts.map +1 -0
- package/dist/js/modules/fields/table.d.ts +3 -0
- package/dist/js/modules/fields/table.d.ts.map +1 -0
- package/dist/js/modules/fields/text-limit.d.ts +3 -0
- package/dist/js/modules/fields/text-limit.d.ts.map +1 -0
- package/dist/js/modules/loader.d.ts +11 -0
- package/dist/js/modules/loader.d.ts.map +1 -0
- package/dist/js/modules/payments/api.d.ts +8 -0
- package/dist/js/modules/payments/api.d.ts.map +1 -0
- package/dist/js/modules/payments/bpoint.d.ts +2 -0
- package/dist/js/modules/payments/bpoint.d.ts.map +1 -0
- package/dist/js/modules/payments/constants.d.ts +5 -0
- package/dist/js/modules/payments/constants.d.ts.map +1 -0
- package/dist/js/modules/payments/eway.d.ts +9 -0
- package/dist/js/modules/payments/eway.d.ts.map +1 -0
- package/dist/js/modules/payments/factories.d.ts +54 -0
- package/dist/js/modules/payments/factories.d.ts.map +1 -0
- package/dist/js/modules/payments/go-cardless.d.ts +2 -0
- package/dist/js/modules/payments/go-cardless.d.ts.map +1 -0
- package/dist/js/modules/payments/host.d.ts +70 -0
- package/dist/js/modules/payments/host.d.ts.map +1 -0
- package/dist/js/modules/payments/index.d.ts +3 -0
- package/dist/js/modules/payments/index.d.ts.map +1 -0
- package/dist/js/modules/payments/mollie.d.ts +2 -0
- package/dist/js/modules/payments/mollie.d.ts.map +1 -0
- package/dist/js/modules/payments/moneris.d.ts +2 -0
- package/dist/js/modules/payments/moneris.d.ts.map +1 -0
- package/dist/js/modules/payments/opayo.d.ts +25 -0
- package/dist/js/modules/payments/opayo.d.ts.map +1 -0
- package/dist/js/modules/payments/paddle.d.ts +2 -0
- package/dist/js/modules/payments/paddle.d.ts.map +1 -0
- package/dist/js/modules/payments/paypal.d.ts +2 -0
- package/dist/js/modules/payments/paypal.d.ts.map +1 -0
- package/dist/js/modules/payments/payway.d.ts +2 -0
- package/dist/js/modules/payments/payway.d.ts.map +1 -0
- package/dist/js/modules/payments/square.d.ts +2 -0
- package/dist/js/modules/payments/square.d.ts.map +1 -0
- package/dist/js/modules/payments/stripe.d.ts +2 -0
- package/dist/js/modules/payments/stripe.d.ts.map +1 -0
- package/dist/js/modules/payments/utils.d.ts +17 -0
- package/dist/js/modules/payments/utils.d.ts.map +1 -0
- package/dist/js/modules/registry.d.ts +9 -0
- package/dist/js/modules/registry.d.ts.map +1 -0
- package/dist/js/modules/styles.d.ts +2 -0
- package/dist/js/modules/styles.d.ts.map +1 -0
- package/dist/js/submit/pipeline.d.ts +18 -0
- package/dist/js/submit/pipeline.d.ts.map +1 -0
- package/dist/js/theme/theme-classes.d.ts +10 -0
- package/dist/js/theme/theme-classes.d.ts.map +1 -0
- package/dist/js/transport/forms-api.d.ts +11 -0
- package/dist/js/transport/forms-api.d.ts.map +1 -0
- package/dist/js/utils/async.d.ts +8 -0
- package/dist/js/utils/async.d.ts.map +1 -0
- package/dist/js/utils/debug.d.ts +10 -0
- package/dist/js/utils/debug.d.ts.map +1 -0
- package/dist/js/utils/event-names.d.ts +13 -0
- package/dist/js/utils/event-names.d.ts.map +1 -0
- package/dist/js/utils/field-references.d.ts +6 -0
- package/dist/js/utils/field-references.d.ts.map +1 -0
- package/dist/js/utils/field-references.keys.d.ts +4 -0
- package/dist/js/utils/field-references.keys.d.ts.map +1 -0
- package/dist/js/utils/field-references.parser.d.ts +3 -0
- package/dist/js/utils/field-references.parser.d.ts.map +1 -0
- package/dist/js/utils/field-references.registry.d.ts +3 -0
- package/dist/js/utils/field-references.registry.d.ts.map +1 -0
- package/dist/js/utils/field-references.resolver.d.ts +4 -0
- package/dist/js/utils/field-references.resolver.d.ts.map +1 -0
- package/dist/js/utils/field-references.types.d.ts +27 -0
- package/dist/js/utils/field-references.types.d.ts.map +1 -0
- package/dist/js/utils/fields.d.ts +5 -0
- package/dist/js/utils/fields.d.ts.map +1 -0
- package/dist/js/utils/http.d.ts +9 -0
- package/dist/js/utils/http.d.ts.map +1 -0
- package/dist/js/utils/i18n.d.ts +7 -0
- package/dist/js/utils/i18n.d.ts.map +1 -0
- package/dist/js/utils/scripts.d.ts +13 -0
- package/dist/js/utils/scripts.d.ts.map +1 -0
- package/dist/js/utils/unload-warning.d.ts +10 -0
- package/dist/js/utils/unload-warning.d.ts.map +1 -0
- package/dist/js/validation/rules/email.d.ts +4 -0
- package/dist/js/validation/rules/email.d.ts.map +1 -0
- package/dist/js/validation/rules/match.d.ts +4 -0
- package/dist/js/validation/rules/match.d.ts.map +1 -0
- package/dist/js/validation/rules/number.d.ts +4 -0
- package/dist/js/validation/rules/number.d.ts.map +1 -0
- package/dist/js/validation/rules/required.d.ts +4 -0
- package/dist/js/validation/rules/required.d.ts.map +1 -0
- package/dist/js/validation/rules/shared.d.ts +7 -0
- package/dist/js/validation/rules/shared.d.ts.map +1 -0
- package/dist/js/validation/rules/url.d.ts +4 -0
- package/dist/js/validation/rules/url.d.ts.map +1 -0
- package/dist/js/validation/rules.d.ts +10 -0
- package/dist/js/validation/rules.d.ts.map +1 -0
- package/dist/js/validation/types.d.ts +44 -0
- package/dist/js/validation/types.d.ts.map +1 -0
- package/dist/js/validation/validator.d.ts +53 -0
- package/dist/js/validation/validator.d.ts.map +1 -0
- package/package.json +78 -0
- package/src/css/formie-base.css +78 -0
- package/src/css/formie-theme.css +19 -0
- package/src/css/formie.css +2 -0
- package/src/css/theme/_buttons.css +249 -0
- package/src/css/theme/_loading.css +37 -0
- package/src/css/theme/_messages.css +39 -0
- package/src/css/theme/_progress.css +62 -0
- package/src/css/theme/_tokens.css +361 -0
- package/src/css/theme/_typography.css +70 -0
- package/src/css/theme/fields/_address.css +17 -0
- package/src/css/theme/fields/_check-radio.css +108 -0
- package/src/css/theme/fields/_file.css +58 -0
- package/src/css/theme/fields/_group.css +13 -0
- package/src/css/theme/fields/_input.css +48 -0
- package/src/css/theme/fields/_nested.css +19 -0
- package/src/css/theme/fields/_repeater.css +69 -0
- package/src/css/theme/fields/_rich-text.css +201 -0
- package/src/css/theme/fields/_select.css +37 -0
- package/src/css/theme/fields/_signature.css +39 -0
- package/src/css/theme/fields/_summary.css +53 -0
- package/src/css/theme/fields/_table.css +121 -0
- package/src/css/theme/fields/_text-limit.css +10 -0
- package/src/css/theme/forms/_field.css +62 -0
- package/src/css/theme/forms/_form.css +166 -0
- package/src/css/theme/integrations/_payment-modal.css +32 -0
- package/src/css/theme/integrations/_paypal.css +10 -0
- package/src/css/theme/integrations/_payway.css +10 -0
- package/src/css/theme/integrations/_stripe.css +24 -0
- package/src/css/theme/utilities/_accessibility.css +13 -0
- package/src/css/theme-base/_controls.css +41 -0
- package/src/css/theme-base/_primitives.css +34 -0
- package/src/icons/rich-text/aligncenter.svg +6 -0
- package/src/icons/rich-text/alignleft.svg +6 -0
- package/src/icons/rich-text/alignright.svg +6 -0
- package/src/icons/rich-text/bold.svg +4 -0
- package/src/icons/rich-text/clear.svg +6 -0
- package/src/icons/rich-text/code.svg +4 -0
- package/src/icons/rich-text/heading1.svg +3 -0
- package/src/icons/rich-text/heading2.svg +3 -0
- package/src/icons/rich-text/image.svg +6 -0
- package/src/icons/rich-text/italic.svg +5 -0
- package/src/icons/rich-text/line.svg +3 -0
- package/src/icons/rich-text/link.svg +4 -0
- package/src/icons/rich-text/olist.svg +8 -0
- package/src/icons/rich-text/paragraph.svg +3 -0
- package/src/icons/rich-text/quote.svg +4 -0
- package/src/icons/rich-text/strikethrough.svg +4 -0
- package/src/icons/rich-text/ulist.svg +8 -0
- package/src/icons/rich-text/underline.svg +4 -0
- package/src/index.ts +125 -0
- package/src/js/compatibility/dom-adapter.ts +129 -0
- package/src/js/compatibility/event-map.ts +72 -0
- package/src/js/compatibility/validator-adapter.ts +105 -0
- package/src/js/contracts/client.ts +43 -0
- package/src/js/contracts/common.ts +14 -0
- package/src/js/contracts/modules.ts +53 -0
- package/src/js/contracts/schema.ts +83 -0
- package/src/js/contracts/theme.ts +1 -0
- package/src/js/core/create-formie-client.ts +1519 -0
- package/src/js/core/dom-events.ts +8 -0
- package/src/js/core/formie.ts +242 -0
- package/src/js/core/hydrate-modules.ts +102 -0
- package/src/js/core/page-client-event.ts +129 -0
- package/src/js/core/page-tab-errors.ts +37 -0
- package/src/js/core/submit-flow.ts +120 -0
- package/src/js/core/submit-result-state.ts +597 -0
- package/src/js/core/submit-result-ui.ts +448 -0
- package/src/js/events/event-bus.ts +109 -0
- package/src/js/modules/address/address-finder.ts +85 -0
- package/src/js/modules/address/api.ts +22 -0
- package/src/js/modules/address/constants.ts +15 -0
- package/src/js/modules/address/factories.ts +203 -0
- package/src/js/modules/address/google-address.ts +345 -0
- package/src/js/modules/address/host.ts +137 -0
- package/src/js/modules/address/index.ts +10 -0
- package/src/js/modules/address/loqate.ts +128 -0
- package/src/js/modules/address/place-kit.ts +94 -0
- package/src/js/modules/captchas/api.ts +25 -0
- package/src/js/modules/captchas/captcha-eu.ts +86 -0
- package/src/js/modules/captchas/constants.ts +4 -0
- package/src/js/modules/captchas/factories.ts +485 -0
- package/src/js/modules/captchas/friendly-captcha-v1.ts +65 -0
- package/src/js/modules/captchas/friendly-captcha-v2.ts +84 -0
- package/src/js/modules/captchas/hcaptcha.ts +153 -0
- package/src/js/modules/captchas/host.ts +448 -0
- package/src/js/modules/captchas/index.ts +16 -0
- package/src/js/modules/captchas/recaptcha-enterprise.ts +138 -0
- package/src/js/modules/captchas/recaptcha-shared.ts +69 -0
- package/src/js/modules/captchas/recaptcha-v2-checkbox.ts +72 -0
- package/src/js/modules/captchas/recaptcha-v2-invisible.ts +108 -0
- package/src/js/modules/captchas/recaptcha-v3.ts +62 -0
- package/src/js/modules/captchas/snaptcha.ts +10 -0
- package/src/js/modules/captchas/turnstile.ts +131 -0
- package/src/js/modules/captchas/utils.ts +85 -0
- package/src/js/modules/fields/calculations.ts +273 -0
- package/src/js/modules/fields/checkbox-radio.ts +295 -0
- package/src/js/modules/fields/conditions/config.ts +79 -0
- package/src/js/modules/fields/conditions/effects.ts +166 -0
- package/src/js/modules/fields/conditions/evaluator.ts +44 -0
- package/src/js/modules/fields/conditions/references.ts +165 -0
- package/src/js/modules/fields/conditions/transforms.ts +206 -0
- package/src/js/modules/fields/conditions/types.ts +33 -0
- package/src/js/modules/fields/conditions/values.ts +115 -0
- package/src/js/modules/fields/conditions.ts +229 -0
- package/src/js/modules/fields/date-picker.ts +272 -0
- package/src/js/modules/fields/file-upload.ts +628 -0
- package/src/js/modules/fields/hidden.ts +58 -0
- package/src/js/modules/fields/index.ts +19 -0
- package/src/js/modules/fields/phone-country.ts +226 -0
- package/src/js/modules/fields/repeater.ts +231 -0
- package/src/js/modules/fields/rich-text.ts +217 -0
- package/src/js/modules/fields/shared.ts +238 -0
- package/src/js/modules/fields/signature.ts +202 -0
- package/src/js/modules/fields/summary.ts +272 -0
- package/src/js/modules/fields/table.ts +197 -0
- package/src/js/modules/fields/text-limit.ts +280 -0
- package/src/js/modules/loader.ts +331 -0
- package/src/js/modules/payments/api.ts +20 -0
- package/src/js/modules/payments/bpoint.ts +48 -0
- package/src/js/modules/payments/constants.ts +17 -0
- package/src/js/modules/payments/eway.ts +132 -0
- package/src/js/modules/payments/factories.ts +332 -0
- package/src/js/modules/payments/go-cardless.ts +37 -0
- package/src/js/modules/payments/host.ts +459 -0
- package/src/js/modules/payments/index.ts +17 -0
- package/src/js/modules/payments/mollie.ts +38 -0
- package/src/js/modules/payments/moneris.ts +216 -0
- package/src/js/modules/payments/opayo.ts +272 -0
- package/src/js/modules/payments/paddle.ts +111 -0
- package/src/js/modules/payments/payment.ts +183 -0
- package/src/js/modules/payments/paypal.ts +214 -0
- package/src/js/modules/payments/payway.ts +114 -0
- package/src/js/modules/payments/square.ts +106 -0
- package/src/js/modules/payments/stripe.ts +426 -0
- package/src/js/modules/payments/stub-payment-module.ts +87 -0
- package/src/js/modules/payments/utils.ts +60 -0
- package/src/js/modules/registry.ts +38 -0
- package/src/js/modules/styles.ts +29 -0
- package/src/js/submit/pipeline.ts +514 -0
- package/src/js/theme/theme-classes.ts +106 -0
- package/src/js/transport/forms-api.ts +345 -0
- package/src/js/utils/async.ts +81 -0
- package/src/js/utils/debug.ts +59 -0
- package/src/js/utils/event-names.ts +60 -0
- package/src/js/utils/field-references.keys.ts +47 -0
- package/src/js/utils/field-references.parser.ts +121 -0
- package/src/js/utils/field-references.registry.ts +50 -0
- package/src/js/utils/field-references.resolver.ts +115 -0
- package/src/js/utils/field-references.ts +11 -0
- package/src/js/utils/field-references.types.ts +31 -0
- package/src/js/utils/fields.ts +58 -0
- package/src/js/utils/http.ts +51 -0
- package/src/js/utils/i18n.ts +98 -0
- package/src/js/utils/scripts.ts +84 -0
- package/src/js/utils/unload-warning.ts +190 -0
- package/src/js/validation/rules/email.ts +18 -0
- package/src/js/validation/rules/match.ts +26 -0
- package/src/js/validation/rules/minmax.ts +47 -0
- package/src/js/validation/rules/number.ts +55 -0
- package/src/js/validation/rules/pattern.ts +29 -0
- package/src/js/validation/rules/required.ts +30 -0
- package/src/js/validation/rules/shared.ts +47 -0
- package/src/js/validation/rules/url.ts +23 -0
- package/src/js/validation/rules.ts +16 -0
- package/src/js/validation/types.ts +50 -0
- package/src/js/validation/validator.ts +643 -0
- package/src/vendor.d.ts +100 -0
- package/src/vite-env.d.ts +22 -0
- package/vite-dev.mjs +22 -0
|
@@ -0,0 +1,960 @@
|
|
|
1
|
+
import { a as getFormStateEventName, u as normalizeFormieEventName } from "./event-names-DamGPtXR.js";
|
|
2
|
+
import { t as createDebug } from "./debug-KnZeKYBI.js";
|
|
3
|
+
import { i as toggleThemeClasses, r as removeThemeClasses, t as addThemeClasses } from "./theme-classes-vSHpdCUO.js";
|
|
4
|
+
import { i as t } from "./i18n-vUh-KGiH.js";
|
|
5
|
+
import { n as sleep, t as debounce } from "./async-B3DUf1GZ.js";
|
|
6
|
+
import { r as normalizeFieldKey, t as fieldKeyToInputName } from "./field-references.keys-BpBZ_quS.js";
|
|
7
|
+
import { n as resolveFieldReferenceLive, r as buildFieldValueRegistry } from "./field-references.resolver-Ba6xhiJC.js";
|
|
8
|
+
//#region src/js/core/page-client-event.ts
|
|
9
|
+
var debug$2 = createDebug("general", "page-client-event");
|
|
10
|
+
var CLIENT_EVENT_ATTR = "data-formie-client-event";
|
|
11
|
+
function escapePageIdForSelector(pageId) {
|
|
12
|
+
if (typeof window !== "undefined" && window.CSS?.escape) return window.CSS.escape(pageId);
|
|
13
|
+
return pageId.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
|
|
14
|
+
}
|
|
15
|
+
function resolveSubmittedPageId(form) {
|
|
16
|
+
const fromInput = form.querySelector("input[name=\"pageId\"]")?.value?.trim();
|
|
17
|
+
if (fromInput) return fromInput;
|
|
18
|
+
const fromVisible = form.querySelector("[data-formie-page]:not([data-formie-page-hidden])")?.getAttribute("data-formie-page-id")?.trim();
|
|
19
|
+
if (fromVisible) return fromVisible;
|
|
20
|
+
return form.querySelector("[data-formie-page]")?.getAttribute("data-formie-page-id")?.trim() || null;
|
|
21
|
+
}
|
|
22
|
+
function parseClientEventAttr(raw) {
|
|
23
|
+
if (!raw?.trim()) return null;
|
|
24
|
+
try {
|
|
25
|
+
const parsed = JSON.parse(raw);
|
|
26
|
+
return parsed && typeof parsed === "object" ? parsed : null;
|
|
27
|
+
} catch {
|
|
28
|
+
debug$2.warn("Invalid data-formie-client-event JSON.", { rawPreview: raw.slice(0, 80) });
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function buildPayloadObject(fields) {
|
|
33
|
+
const out = {};
|
|
34
|
+
fields.forEach((row) => {
|
|
35
|
+
const key = typeof row.label === "string" ? row.label.trim() : "";
|
|
36
|
+
if (!key) return;
|
|
37
|
+
out[key] = typeof row.value === "string" ? row.value : "";
|
|
38
|
+
});
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* When the builder enables JavaScript events for a page, the theme emits
|
|
43
|
+
* `data-formie-client-event` on that page's section. On each successful
|
|
44
|
+
* **submit** (not back/save), push the configured key/value object to
|
|
45
|
+
* `window.dataLayer` (when present) and dispatch `formie:client-event`.
|
|
46
|
+
*/
|
|
47
|
+
function dispatchPageClientEventForSubmit(form, action) {
|
|
48
|
+
if (action !== "submit") return;
|
|
49
|
+
const pageId = resolveSubmittedPageId(form);
|
|
50
|
+
if (!pageId) {
|
|
51
|
+
debug$2.log("No submitted page id; skipping client event.");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const section = form.querySelector(`[data-formie-page][data-formie-page-id="${escapePageIdForSelector(pageId)}"]`);
|
|
55
|
+
if (!section) {
|
|
56
|
+
debug$2.log("No page section for id; skipping client event.", { pageId });
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const rawAttr = section.getAttribute(CLIENT_EVENT_ATTR);
|
|
60
|
+
if (rawAttr === null) return;
|
|
61
|
+
const config = parseClientEventAttr(rawAttr);
|
|
62
|
+
if (!config || !Array.isArray(config.fields)) return;
|
|
63
|
+
const payload = buildPayloadObject(config.fields);
|
|
64
|
+
const win = window;
|
|
65
|
+
win.dataLayer = win.dataLayer || [];
|
|
66
|
+
win.dataLayer.push(payload);
|
|
67
|
+
form.dispatchEvent(new CustomEvent("formie:client-event", {
|
|
68
|
+
bubbles: true,
|
|
69
|
+
detail: { payload }
|
|
70
|
+
}));
|
|
71
|
+
debug$2.log("Dispatched page client event.", {
|
|
72
|
+
pageId,
|
|
73
|
+
keys: Object.keys(payload)
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region src/js/core/page-tab-errors.ts
|
|
78
|
+
function setTabErrorState(tab, hasError) {
|
|
79
|
+
toggleThemeClasses(tab, tab, "tabError", hasError);
|
|
80
|
+
if (hasError) {
|
|
81
|
+
tab.setAttribute("data-formie-tab-error", "true");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
tab.removeAttribute("data-formie-tab-error");
|
|
85
|
+
}
|
|
86
|
+
function syncPageTabErrors(form) {
|
|
87
|
+
const pageIdsWithErrors = /* @__PURE__ */ new Set();
|
|
88
|
+
form.querySelectorAll("[data-formie-page]").forEach((pageNode) => {
|
|
89
|
+
const page = pageNode;
|
|
90
|
+
const pageId = page.getAttribute("data-formie-page-id");
|
|
91
|
+
if (!pageId) return;
|
|
92
|
+
if (page.querySelector("[data-formie-field-has-error]")) pageIdsWithErrors.add(pageId);
|
|
93
|
+
});
|
|
94
|
+
form.querySelectorAll("[data-formie-tab]").forEach((tabNode) => {
|
|
95
|
+
const tab = tabNode;
|
|
96
|
+
const pageId = tab.getAttribute("data-formie-page-id");
|
|
97
|
+
setTabErrorState(tab, !!pageId && pageIdsWithErrors.has(pageId));
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//#endregion
|
|
101
|
+
//#region src/js/core/submit-result-state.ts
|
|
102
|
+
var STALE_SUBMISSION_STATE_CODE = "STALE_SUBMISSION_STATE";
|
|
103
|
+
var finalSubmitResetTimers = /* @__PURE__ */ new WeakMap();
|
|
104
|
+
var originalSubmitterMarkup = /* @__PURE__ */ new WeakMap();
|
|
105
|
+
var debug$1 = createDebug("general", "submit-result");
|
|
106
|
+
function setHiddenInputValue(form, name, value) {
|
|
107
|
+
let input = form.querySelector(`input[name="${name}"]`);
|
|
108
|
+
if (!input) {
|
|
109
|
+
input = document.createElement("input");
|
|
110
|
+
input.type = "hidden";
|
|
111
|
+
input.name = name;
|
|
112
|
+
form.appendChild(input);
|
|
113
|
+
}
|
|
114
|
+
input.value = value;
|
|
115
|
+
}
|
|
116
|
+
function markInternalNavigation(form, reason) {
|
|
117
|
+
form.setAttribute("data-formie-internal-navigation", reason);
|
|
118
|
+
}
|
|
119
|
+
function removeHiddenInput(form, name) {
|
|
120
|
+
form.querySelector(`input[name="${name}"]`)?.remove();
|
|
121
|
+
}
|
|
122
|
+
function stripQueryParam(urlValue, paramName) {
|
|
123
|
+
try {
|
|
124
|
+
const url = new URL(urlValue, window.location.href);
|
|
125
|
+
url.searchParams.delete(paramName);
|
|
126
|
+
return url.toString();
|
|
127
|
+
} catch {
|
|
128
|
+
return urlValue;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function isSameOriginUrl(urlValue) {
|
|
132
|
+
try {
|
|
133
|
+
return new URL(urlValue, window.location.href).origin === window.location.origin;
|
|
134
|
+
} catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function getPageElements(form) {
|
|
139
|
+
return Array.from(form.querySelectorAll("[data-formie-page]"));
|
|
140
|
+
}
|
|
141
|
+
function getTabElements(form) {
|
|
142
|
+
return Array.from(form.querySelectorAll("[data-formie-tab]"));
|
|
143
|
+
}
|
|
144
|
+
function getProgressPercent(form, currentPageIndex, totalPages) {
|
|
145
|
+
if (currentPageIndex < 0 || totalPages < 1) return 0;
|
|
146
|
+
if ((form.dataset.formieProgressCalculation === "page-position" ? "page-position" : "completion") === "page-position") return Math.round((currentPageIndex + 1) / totalPages * 100);
|
|
147
|
+
return Math.round(currentPageIndex / totalPages * 100);
|
|
148
|
+
}
|
|
149
|
+
function getProgressState(progress) {
|
|
150
|
+
if (progress <= 0) return "start";
|
|
151
|
+
if (progress >= 100) return "end";
|
|
152
|
+
return "middle";
|
|
153
|
+
}
|
|
154
|
+
function getConfiguredSubmitAction(form) {
|
|
155
|
+
return (form.dataset.formieSubmitAction || "").trim();
|
|
156
|
+
}
|
|
157
|
+
function shouldHideFormOnSuccess(form) {
|
|
158
|
+
const rawValue = form.dataset.formieSubmitActionFormHide;
|
|
159
|
+
if (rawValue === void 0) return false;
|
|
160
|
+
const normalized = rawValue.trim().toLowerCase();
|
|
161
|
+
return normalized === "true" || normalized === "1" || normalized === "";
|
|
162
|
+
}
|
|
163
|
+
function setFormHiddenState(form, hidden) {
|
|
164
|
+
const sections = [
|
|
165
|
+
"[data-formie-form-header]",
|
|
166
|
+
"[data-formie-form-navigation]",
|
|
167
|
+
"[data-formie-form-body]",
|
|
168
|
+
"[data-formie-form-footer]"
|
|
169
|
+
];
|
|
170
|
+
form.toggleAttribute("data-formie-form-hidden", hidden);
|
|
171
|
+
sections.forEach((selector) => {
|
|
172
|
+
form.querySelectorAll(selector).forEach((node) => {
|
|
173
|
+
const element = node;
|
|
174
|
+
if (hidden) element.hidden = true;
|
|
175
|
+
else element.hidden = false;
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function clearPendingFinalSubmitReset(form) {
|
|
180
|
+
const timerId = finalSubmitResetTimers.get(form);
|
|
181
|
+
if (typeof timerId === "number") {
|
|
182
|
+
window.clearTimeout(timerId);
|
|
183
|
+
finalSubmitResetTimers.delete(form);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function setSubmitterLoadingText(submitter, loadingText) {
|
|
187
|
+
if (!originalSubmitterMarkup.has(submitter)) originalSubmitterMarkup.set(submitter, submitter.innerHTML);
|
|
188
|
+
submitter.textContent = loadingText;
|
|
189
|
+
}
|
|
190
|
+
function restoreSubmitterLoadingText(submitter) {
|
|
191
|
+
const originalMarkup = originalSubmitterMarkup.get(submitter);
|
|
192
|
+
if (originalMarkup === void 0) return;
|
|
193
|
+
submitter.innerHTML = originalMarkup;
|
|
194
|
+
originalSubmitterMarkup.delete(submitter);
|
|
195
|
+
}
|
|
196
|
+
function updateProgressUi(form, progress) {
|
|
197
|
+
const progressBar = form.querySelector("[data-formie-progress-bar]");
|
|
198
|
+
const progressValue = form.querySelector("[data-formie-progress-value]");
|
|
199
|
+
if (!progressBar) return;
|
|
200
|
+
progressBar.style.width = `${progress}%`;
|
|
201
|
+
progressBar.setAttribute("aria-valuenow", `${progress}`);
|
|
202
|
+
progressBar.setAttribute("data-formie-progress-state", getProgressState(progress));
|
|
203
|
+
if (progressValue) {
|
|
204
|
+
progressValue.textContent = `${progress}%`;
|
|
205
|
+
progressValue.setAttribute("data-formie-progress-value", `${progress}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function applySubmitterLoadingState(form, submitter) {
|
|
209
|
+
if (!submitter) return;
|
|
210
|
+
const indicator = (form.dataset.formieLoadingIndicator || "").trim();
|
|
211
|
+
if (!indicator) return;
|
|
212
|
+
submitter.setAttribute("data-formie-loading-indicator", indicator);
|
|
213
|
+
if (indicator === "spinner") {
|
|
214
|
+
toggleThemeClasses(submitter, form, "loading", true);
|
|
215
|
+
restoreSubmitterLoadingText(submitter);
|
|
216
|
+
submitter.removeAttribute("data-formie-loading-text");
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (indicator === "text") {
|
|
220
|
+
const configuredText = (form.dataset.formieLoadingIndicatorText || "").trim();
|
|
221
|
+
const fallbackText = submitter.textContent?.trim() || "";
|
|
222
|
+
const loadingText = configuredText || fallbackText;
|
|
223
|
+
submitter.setAttribute("data-formie-loading-text", loadingText);
|
|
224
|
+
setSubmitterLoadingText(submitter, loadingText);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
restoreSubmitterLoadingText(submitter);
|
|
228
|
+
submitter.removeAttribute("data-formie-loading-text");
|
|
229
|
+
}
|
|
230
|
+
function getActionButtons(form) {
|
|
231
|
+
return Array.from(form.querySelectorAll("[data-formie-action]"));
|
|
232
|
+
}
|
|
233
|
+
function setSubmitLoading(form, submitter) {
|
|
234
|
+
if (form.getAttribute("data-formie-loading") === "true") return;
|
|
235
|
+
form.setAttribute("data-formie-loading", "true");
|
|
236
|
+
getActionButtons(form).forEach((button) => {
|
|
237
|
+
if ("disabled" in button) {
|
|
238
|
+
if (button.disabled) button.setAttribute("data-formie-was-disabled", "true");
|
|
239
|
+
else button.removeAttribute("data-formie-was-disabled");
|
|
240
|
+
button.disabled = true;
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
if (submitter) {
|
|
244
|
+
submitter.setAttribute("data-formie-loading", "true");
|
|
245
|
+
applySubmitterLoadingState(form, submitter);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function clearSubmitLoading(form) {
|
|
249
|
+
form.removeAttribute("data-formie-loading");
|
|
250
|
+
getActionButtons(form).forEach((button) => {
|
|
251
|
+
if ("disabled" in button) {
|
|
252
|
+
const element = button;
|
|
253
|
+
element.disabled = element.getAttribute("data-formie-was-disabled") === "true";
|
|
254
|
+
}
|
|
255
|
+
restoreSubmitterLoadingText(button);
|
|
256
|
+
button.removeAttribute("data-formie-was-disabled");
|
|
257
|
+
button.removeAttribute("data-formie-loading");
|
|
258
|
+
toggleThemeClasses(button, form, "loading", false);
|
|
259
|
+
button.removeAttribute("data-formie-loading-indicator");
|
|
260
|
+
button.removeAttribute("data-formie-loading-text");
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
function applyPageState(form, nextPageId) {
|
|
264
|
+
const pages = getPageElements(form);
|
|
265
|
+
const tabs = getTabElements(form);
|
|
266
|
+
const currentPageIndex = pages.findIndex((page) => {
|
|
267
|
+
return page.getAttribute("data-formie-page-id") === nextPageId;
|
|
268
|
+
});
|
|
269
|
+
pages.forEach((page) => {
|
|
270
|
+
if (page.getAttribute("data-formie-page-id") === nextPageId) {
|
|
271
|
+
page.removeAttribute("data-formie-page-hidden");
|
|
272
|
+
removeThemeClasses(page, form, "pageHidden");
|
|
273
|
+
} else {
|
|
274
|
+
page.setAttribute("data-formie-page-hidden", "true");
|
|
275
|
+
addThemeClasses(page, form, "pageHidden");
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
tabs.forEach((tab, index) => {
|
|
279
|
+
const isCurrent = tab.getAttribute("data-formie-page-id") === nextPageId;
|
|
280
|
+
const isComplete = currentPageIndex > -1 && index < currentPageIndex;
|
|
281
|
+
toggleThemeClasses(tab, form, "tabCurrent", isCurrent);
|
|
282
|
+
toggleThemeClasses(tab, form, "tabComplete", isComplete);
|
|
283
|
+
if (isCurrent) tab.setAttribute("aria-current", "page");
|
|
284
|
+
else tab.removeAttribute("aria-current");
|
|
285
|
+
if (isComplete) tab.setAttribute("data-formie-tab-complete", "true");
|
|
286
|
+
else tab.removeAttribute("data-formie-tab-complete");
|
|
287
|
+
});
|
|
288
|
+
if (currentPageIndex > -1 && pages.length > 0) updateProgressUi(form, getProgressPercent(form, currentPageIndex, pages.length));
|
|
289
|
+
setHiddenInputValue(form, "pageId", nextPageId);
|
|
290
|
+
syncPageTabErrors(form);
|
|
291
|
+
}
|
|
292
|
+
function syncSubmissionIdentity(form, result) {
|
|
293
|
+
const submissionUid = result.meta?.submissionUid;
|
|
294
|
+
if (typeof submissionUid === "string" && submissionUid.trim() !== "") setHiddenInputValue(form, "submissionUid", submissionUid);
|
|
295
|
+
const continuationToken = (result.meta?.session)?.continuation?.continuationToken;
|
|
296
|
+
if (typeof continuationToken === "string" && continuationToken.trim() !== "") setHiddenInputValue(form, "continuationToken", continuationToken);
|
|
297
|
+
else removeHiddenInput(form, "continuationToken");
|
|
298
|
+
}
|
|
299
|
+
function clearResumeTokenState(form) {
|
|
300
|
+
const action = form.getAttribute("action");
|
|
301
|
+
if (action) form.setAttribute("action", stripQueryParam(action, "resumeToken"));
|
|
302
|
+
try {
|
|
303
|
+
const url = new URL(window.location.href);
|
|
304
|
+
if (!url.searchParams.has("resumeToken")) return;
|
|
305
|
+
url.searchParams.delete("resumeToken");
|
|
306
|
+
window.history.replaceState({}, document.title, `${url.pathname}${url.search}${url.hash}`);
|
|
307
|
+
} catch {}
|
|
308
|
+
}
|
|
309
|
+
function applyResumeTokenState(form, result) {
|
|
310
|
+
const resumeUrl = result.meta?.resumeUrl;
|
|
311
|
+
if (typeof resumeUrl !== "string" || resumeUrl.trim() === "") return;
|
|
312
|
+
const normalizedResumeUrl = resumeUrl.trim();
|
|
313
|
+
if (!isSameOriginUrl(normalizedResumeUrl)) return;
|
|
314
|
+
if (form.getAttribute("action")) form.setAttribute("action", normalizedResumeUrl);
|
|
315
|
+
try {
|
|
316
|
+
const url = new URL(normalizedResumeUrl, window.location.href);
|
|
317
|
+
window.history.replaceState({}, document.title, `${url.pathname}${url.search}${url.hash}`);
|
|
318
|
+
} catch {}
|
|
319
|
+
}
|
|
320
|
+
function resetSubmissionState(form, options = {}) {
|
|
321
|
+
const validator = form.formieValidation;
|
|
322
|
+
const firstPageId = getPageElements(form)[0]?.getAttribute("data-formie-page-id");
|
|
323
|
+
clearPendingFinalSubmitReset(form);
|
|
324
|
+
form.reset();
|
|
325
|
+
if (!options.preserveHiddenState) setFormHiddenState(form, false);
|
|
326
|
+
removeHiddenInput(form, "submissionId");
|
|
327
|
+
removeHiddenInput(form, "submissionUid");
|
|
328
|
+
removeHiddenInput(form, "continuationToken");
|
|
329
|
+
removeHiddenInput(form, "pageId");
|
|
330
|
+
clearResumeTokenState(form);
|
|
331
|
+
validator?.resetLiveState();
|
|
332
|
+
if (firstPageId) {
|
|
333
|
+
applyPageState(form, firstPageId);
|
|
334
|
+
form.dispatchEvent(new CustomEvent(getFormStateEventName("reset"), { bubbles: true }));
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
syncPageTabErrors(form);
|
|
338
|
+
form.dispatchEvent(new CustomEvent(getFormStateEventName("reset"), { bubbles: true }));
|
|
339
|
+
}
|
|
340
|
+
function shouldResetSubmissionState(result) {
|
|
341
|
+
return result.code === STALE_SUBMISSION_STATE_CODE || result.meta?.resetState === true;
|
|
342
|
+
}
|
|
343
|
+
function dispatchSubmitDataEvents(form, result) {
|
|
344
|
+
const submitData = result.submitData;
|
|
345
|
+
const dispatchedEvents = /* @__PURE__ */ new Set();
|
|
346
|
+
let hasPaymentFollowUpEvent = false;
|
|
347
|
+
if (Array.isArray(submitData) && submitData.length > 0) {
|
|
348
|
+
const events = submitData.filter((item) => typeof item === "object" && item !== null && "event" in item && typeof item.event === "string");
|
|
349
|
+
for (const eventData of events) {
|
|
350
|
+
const eventName = normalizeFormieEventName(eventData.event);
|
|
351
|
+
dispatchedEvents.add(eventName);
|
|
352
|
+
debug$1.log("Dispatching submitData event.", { eventName });
|
|
353
|
+
if (eventName.startsWith("formie:payment:")) hasPaymentFollowUpEvent = true;
|
|
354
|
+
form.dispatchEvent(new CustomEvent(eventName, {
|
|
355
|
+
bubbles: true,
|
|
356
|
+
detail: { data: eventData.data }
|
|
357
|
+
}));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
const meta = result.meta || {};
|
|
361
|
+
const paymentAction = (meta.paymentAction && typeof meta.paymentAction === "object" ? meta.paymentAction : null) || (meta.paymentDecision && typeof meta.paymentDecision === "object" ? meta.paymentDecision.action : null);
|
|
362
|
+
const actionEvent = paymentAction ? String(paymentAction.event || "") : "";
|
|
363
|
+
const actionPayload = paymentAction ? paymentAction.payload : void 0;
|
|
364
|
+
const normalizedActionEvent = normalizeFormieEventName(actionEvent);
|
|
365
|
+
if (normalizedActionEvent && !dispatchedEvents.has(normalizedActionEvent)) {
|
|
366
|
+
if (normalizedActionEvent.startsWith("formie:payment:")) hasPaymentFollowUpEvent = true;
|
|
367
|
+
form.dispatchEvent(new CustomEvent(normalizedActionEvent, {
|
|
368
|
+
bubbles: true,
|
|
369
|
+
detail: { data: actionPayload }
|
|
370
|
+
}));
|
|
371
|
+
debug$1.log("Dispatching fallback payment action event.", { eventName: normalizedActionEvent });
|
|
372
|
+
}
|
|
373
|
+
return { hasPaymentFollowUpEvent };
|
|
374
|
+
}
|
|
375
|
+
function applySubmitResultState(form, result, action) {
|
|
376
|
+
debug$1.log("Applying submit result state.", {
|
|
377
|
+
ok: result.ok,
|
|
378
|
+
action,
|
|
379
|
+
code: result.code,
|
|
380
|
+
hasRedirect: !!result.redirect?.url,
|
|
381
|
+
hasSubmitData: Array.isArray(result.submitData) && result.submitData.length > 0
|
|
382
|
+
});
|
|
383
|
+
if (shouldResetSubmissionState(result)) {
|
|
384
|
+
resetSubmissionState(form);
|
|
385
|
+
debug$1.log("Resetting state due to stale/reset marker.");
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
const eventDispatchResult = dispatchSubmitDataEvents(form, result);
|
|
389
|
+
if (!result.ok && result.redirect?.url && !eventDispatchResult.hasPaymentFollowUpEvent) {
|
|
390
|
+
debug$1.log("Applying redirect fallback for failed result.", {
|
|
391
|
+
url: result.redirect.url,
|
|
392
|
+
target: result.redirect.target
|
|
393
|
+
});
|
|
394
|
+
clearPendingFinalSubmitReset(form);
|
|
395
|
+
if (result.redirect.target === "new-tab") window.open(result.redirect.url, "_blank");
|
|
396
|
+
else {
|
|
397
|
+
markInternalNavigation(form, "redirect");
|
|
398
|
+
window.location.href = result.redirect.url;
|
|
399
|
+
}
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
syncSubmissionIdentity(form, result);
|
|
403
|
+
if (!result.ok) {
|
|
404
|
+
debug$1.log("Non-redirect failure; keeping current form state.");
|
|
405
|
+
clearPendingFinalSubmitReset(form);
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
dispatchPageClientEventForSubmit(form, action);
|
|
409
|
+
if (result.nextPage?.id) {
|
|
410
|
+
clearPendingFinalSubmitReset(form);
|
|
411
|
+
form.formieValidation?.resetLiveState();
|
|
412
|
+
applyPageState(form, result.nextPage.id);
|
|
413
|
+
debug$1.log("Advanced to next page.", { nextPageId: result.nextPage.id });
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
if (action === "save") {
|
|
417
|
+
clearPendingFinalSubmitReset(form);
|
|
418
|
+
applyResumeTokenState(form, result);
|
|
419
|
+
debug$1.log("Applied save/resume token state.");
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
if (action === "submit" && !result.redirect?.url) {
|
|
423
|
+
const configuredSubmitAction = getConfiguredSubmitAction(form);
|
|
424
|
+
const preserveHiddenState = configuredSubmitAction === "message" && shouldHideFormOnSuccess(form);
|
|
425
|
+
if (configuredSubmitAction === "reload") {
|
|
426
|
+
clearPendingFinalSubmitReset(form);
|
|
427
|
+
markInternalNavigation(form, "reload");
|
|
428
|
+
window.location.reload();
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
if (configuredSubmitAction === "reset") {
|
|
432
|
+
resetSubmissionState(form);
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
clearPendingFinalSubmitReset(form);
|
|
436
|
+
resetSubmissionState(form, { preserveHiddenState });
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
439
|
+
if (action === "submit" && result.redirect?.url && result.redirect.target === "new-tab") {
|
|
440
|
+
const preserveHiddenState = getConfiguredSubmitAction(form) === "message" && shouldHideFormOnSuccess(form);
|
|
441
|
+
clearPendingFinalSubmitReset(form);
|
|
442
|
+
resetSubmissionState(form, { preserveHiddenState });
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
clearPendingFinalSubmitReset(form);
|
|
446
|
+
}
|
|
447
|
+
//#endregion
|
|
448
|
+
//#region src/js/modules/payments/constants.ts
|
|
449
|
+
/** Default timeout (ms) to wait for payment token inputs to populate. */
|
|
450
|
+
var DEFAULT_WAIT_FOR_VALUE_MS = 2500;
|
|
451
|
+
/** Per-provider default required input name suffixes for payment tokens. */
|
|
452
|
+
var DEFAULT_REQUIRED_INPUT_SUFFIXES = {
|
|
453
|
+
bpoint: ["bpointToken"],
|
|
454
|
+
stripe: ["stripePaymentIntentId"],
|
|
455
|
+
paypal: ["paypalOrderId", "paypalAuthId"],
|
|
456
|
+
payway: ["paywayTokenId"],
|
|
457
|
+
opayo: ["opayoTokenId"],
|
|
458
|
+
eway: ["ewayTokenData"],
|
|
459
|
+
"go-cardless": ["goCardlessRedirectId"],
|
|
460
|
+
mollie: ["molliePaymentId"],
|
|
461
|
+
moneris: ["monerisTokenId"],
|
|
462
|
+
paddle: ["paddleTransactionId"],
|
|
463
|
+
square: ["squarePaymentId"]
|
|
464
|
+
};
|
|
465
|
+
//#endregion
|
|
466
|
+
//#region src/js/utils/fields.ts
|
|
467
|
+
function normalizeHandle(handle) {
|
|
468
|
+
return handle.replace("{field:", "").replace("{", "").replace("}", "").replace("]", "").split("[").join("][");
|
|
469
|
+
}
|
|
470
|
+
function getFieldName(handle) {
|
|
471
|
+
return `fields[${normalizeHandle(handle)}]`;
|
|
472
|
+
}
|
|
473
|
+
function getFormFields(form, handle) {
|
|
474
|
+
const fieldName = getFieldName(handle);
|
|
475
|
+
const direct = Array.from(form.querySelectorAll(`[name="${fieldName}"]`));
|
|
476
|
+
const multi = Array.from(form.querySelectorAll(`[name="${fieldName}[]"]`));
|
|
477
|
+
return (multi.length ? multi : direct).filter((element) => {
|
|
478
|
+
return element instanceof HTMLElement;
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
function getFieldLabel(form, handle) {
|
|
482
|
+
const fields = getFormFields(form, handle);
|
|
483
|
+
for (const field of fields) {
|
|
484
|
+
const label = field.closest("[data-formie-field-handle]")?.querySelector("[data-formie-field-label]")?.childNodes[0]?.textContent?.trim();
|
|
485
|
+
if (label) return label;
|
|
486
|
+
}
|
|
487
|
+
return "";
|
|
488
|
+
}
|
|
489
|
+
function currencyToFloat(currencyString) {
|
|
490
|
+
let sanitized = currencyString.replace(/[^\d.,-]/g, "");
|
|
491
|
+
const hasComma = sanitized.includes(",");
|
|
492
|
+
const hasDot = sanitized.includes(".");
|
|
493
|
+
if (hasComma && hasDot) sanitized = sanitized.replace(/\./g, "").replace(/,/, ".");
|
|
494
|
+
else if (hasComma && !hasDot) sanitized = sanitized.replace(/,/, ".");
|
|
495
|
+
else sanitized = sanitized.replace(/,/g, "");
|
|
496
|
+
return parseFloat(sanitized);
|
|
497
|
+
}
|
|
498
|
+
//#endregion
|
|
499
|
+
//#region src/js/modules/payments/utils.ts
|
|
500
|
+
function findPaymentInputBySuffix(root, suffix) {
|
|
501
|
+
const escapedSuffix = suffix.replace(/"/g, "\\\"");
|
|
502
|
+
return root.querySelector(`input[name$="[${escapedSuffix}]"]`) || root.querySelector(`input[name$="${escapedSuffix}"]`);
|
|
503
|
+
}
|
|
504
|
+
function hasRequiredPaymentInputs(root, requiredInputSuffixes) {
|
|
505
|
+
const missingSuffix = requiredInputSuffixes.find((suffix) => {
|
|
506
|
+
const input = findPaymentInputBySuffix(root, suffix);
|
|
507
|
+
return !input || String(input.value || "").trim() === "";
|
|
508
|
+
});
|
|
509
|
+
return {
|
|
510
|
+
ok: !missingSuffix,
|
|
511
|
+
missingSuffix
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
async function waitForRequiredPaymentInputs(root, requiredInputSuffixes, waitForValueMs) {
|
|
515
|
+
const initial = hasRequiredPaymentInputs(root, requiredInputSuffixes);
|
|
516
|
+
if (initial.ok) return initial;
|
|
517
|
+
const deadline = Date.now() + Math.max(waitForValueMs, 0);
|
|
518
|
+
while (Date.now() < deadline) {
|
|
519
|
+
await sleep(120);
|
|
520
|
+
const current = hasRequiredPaymentInputs(root, requiredInputSuffixes);
|
|
521
|
+
if (current.ok) return current;
|
|
522
|
+
}
|
|
523
|
+
return hasRequiredPaymentInputs(root, requiredInputSuffixes);
|
|
524
|
+
}
|
|
525
|
+
//#endregion
|
|
526
|
+
//#region src/js/modules/payments/host.ts
|
|
527
|
+
var PAYMENT_OPTION_KEYS = new Set([
|
|
528
|
+
"handle",
|
|
529
|
+
"requiredInputSuffixes",
|
|
530
|
+
"waitForValueMs",
|
|
531
|
+
"errorMessage"
|
|
532
|
+
]);
|
|
533
|
+
var PAYMENT_SUCCESS_SELECTOR = "[data-payment-success]";
|
|
534
|
+
var PAYMENT_ERROR_SELECTOR = "[data-payment-error]";
|
|
535
|
+
function getPaymentProviderHandle(id, options) {
|
|
536
|
+
return (typeof options.handle === "string" && options.handle.trim() !== "" ? options.handle.trim() : "") || id;
|
|
537
|
+
}
|
|
538
|
+
function normalizePaymentModuleOptions(id, rawOptions, defaults) {
|
|
539
|
+
const options = rawOptions || {};
|
|
540
|
+
const provider = Object.entries(options).reduce((carry, [key, value]) => {
|
|
541
|
+
if (PAYMENT_OPTION_KEYS.has(key)) return carry;
|
|
542
|
+
carry[key] = value;
|
|
543
|
+
return carry;
|
|
544
|
+
}, {});
|
|
545
|
+
const requiredInputSuffixes = Array.isArray(options.requiredInputSuffixes) ? options.requiredInputSuffixes.map(String).filter(Boolean) : defaults.defaultRequiredInputSuffixes || [];
|
|
546
|
+
const waitForValueMs = Number(options.waitForValueMs ?? defaults.defaultWaitForValueMs ?? 2500);
|
|
547
|
+
const errorMessage = typeof options.errorMessage === "string" && options.errorMessage.trim() !== "" ? options.errorMessage.trim() : "Payment authorization is incomplete.";
|
|
548
|
+
return {
|
|
549
|
+
handle: getPaymentProviderHandle(id, options),
|
|
550
|
+
transport: {
|
|
551
|
+
requiredInputSuffixes,
|
|
552
|
+
waitForValueMs: Number.isFinite(waitForValueMs) ? waitForValueMs : DEFAULT_WAIT_FOR_VALUE_MS,
|
|
553
|
+
errorMessage
|
|
554
|
+
},
|
|
555
|
+
provider
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
function bindDomEvent(target, eventName, callback) {
|
|
559
|
+
target.addEventListener(eventName, callback);
|
|
560
|
+
return () => {
|
|
561
|
+
target.removeEventListener(eventName, callback);
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
function createPaymentHostServices(ctx, options) {
|
|
565
|
+
const field = ctx.target;
|
|
566
|
+
const form = ctx.form;
|
|
567
|
+
const root = ctx.root;
|
|
568
|
+
const tokenRoot = form || root;
|
|
569
|
+
const suffixes = options.transport.requiredInputSuffixes;
|
|
570
|
+
const getRegistry = () => {
|
|
571
|
+
return buildFieldValueRegistry(form || root);
|
|
572
|
+
};
|
|
573
|
+
const getReferenceValue = (reference) => {
|
|
574
|
+
const value = resolveFieldReferenceLive(reference, getRegistry()).value;
|
|
575
|
+
if (Array.isArray(value)) return value[0] || "";
|
|
576
|
+
return String(value || "");
|
|
577
|
+
};
|
|
578
|
+
const updateInputs = (name, value) => {
|
|
579
|
+
const names = Array.isArray(name) ? name : [name];
|
|
580
|
+
for (const n of names) {
|
|
581
|
+
const input = findPaymentInputBySuffix(tokenRoot, n) ?? field.querySelector(`input[name*="${n}"]`);
|
|
582
|
+
if (input) input.value = value;
|
|
583
|
+
}
|
|
584
|
+
};
|
|
585
|
+
const addError = (message) => {
|
|
586
|
+
const container = field.querySelector("[data-formie-field-type] > div, [data-field-type] > div") || field;
|
|
587
|
+
const existing = container.querySelector(PAYMENT_ERROR_SELECTOR);
|
|
588
|
+
if (existing) existing.remove();
|
|
589
|
+
const el = document.createElement("div");
|
|
590
|
+
el.setAttribute("data-payment-error", "");
|
|
591
|
+
el.textContent = message;
|
|
592
|
+
addThemeClasses(el, form || root, "fieldError");
|
|
593
|
+
container.appendChild(el);
|
|
594
|
+
};
|
|
595
|
+
const removeError = () => {
|
|
596
|
+
field.querySelector(PAYMENT_ERROR_SELECTOR)?.remove();
|
|
597
|
+
};
|
|
598
|
+
const addSuccess = (message) => {
|
|
599
|
+
const container = field.querySelector("[data-formie-field-type] > div, [data-field-type] > div") || field;
|
|
600
|
+
const existing = container.querySelector(PAYMENT_SUCCESS_SELECTOR);
|
|
601
|
+
if (existing) existing.remove();
|
|
602
|
+
const el = document.createElement("div");
|
|
603
|
+
el.setAttribute("data-payment-success", "");
|
|
604
|
+
el.textContent = message;
|
|
605
|
+
addThemeClasses(el, form || root, "successMessage");
|
|
606
|
+
container.appendChild(el);
|
|
607
|
+
};
|
|
608
|
+
const removeSuccess = () => {
|
|
609
|
+
field.querySelector(PAYMENT_SUCCESS_SELECTOR)?.remove();
|
|
610
|
+
};
|
|
611
|
+
const triggerSubmit = () => {
|
|
612
|
+
if (form) form.setAttribute("data-formie-internal-resubmit", "true");
|
|
613
|
+
if (form && typeof form.requestSubmit === "function") form.requestSubmit();
|
|
614
|
+
else if (form) form.submit();
|
|
615
|
+
};
|
|
616
|
+
const releaseSubmitLoading = () => {
|
|
617
|
+
if (!form) return;
|
|
618
|
+
form.removeAttribute("data-formie-internal-resubmit");
|
|
619
|
+
clearSubmitLoading(form);
|
|
620
|
+
};
|
|
621
|
+
const resolveAmount = (opts) => {
|
|
622
|
+
const searchRoot = form || root;
|
|
623
|
+
const isDynamic = String(opts.type || "").toLowerCase() === "dynamic" && typeof opts.variable === "string" && opts.variable.trim() !== "";
|
|
624
|
+
const source = opts.value ?? (isDynamic ? opts.variable : opts.fixed);
|
|
625
|
+
const sourceString = String(source ?? "").trim();
|
|
626
|
+
const numericDirect = typeof source === "number" ? source : currencyToFloat(sourceString);
|
|
627
|
+
if (Number.isFinite(numericDirect) && numericDirect > 0) return {
|
|
628
|
+
ok: true,
|
|
629
|
+
value: numericDirect
|
|
630
|
+
};
|
|
631
|
+
if (sourceString !== "") {
|
|
632
|
+
const raw = getReferenceValue(sourceString);
|
|
633
|
+
const numeric = currencyToFloat(raw);
|
|
634
|
+
if (Number.isFinite(numeric) && numeric > 0) return {
|
|
635
|
+
ok: true,
|
|
636
|
+
value: numeric
|
|
637
|
+
};
|
|
638
|
+
const label = getFieldLabel(searchRoot, sourceString);
|
|
639
|
+
if (!raw) return {
|
|
640
|
+
ok: false,
|
|
641
|
+
error: label ? t("Provide a value for \"{label}\" to proceed.", { label }) : t("Provide a payment amount to proceed.")
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
return {
|
|
645
|
+
ok: false,
|
|
646
|
+
error: t("Payment amount must be greater than 0.")
|
|
647
|
+
};
|
|
648
|
+
};
|
|
649
|
+
const resolveCurrency = (opts) => {
|
|
650
|
+
const searchRoot = form || root;
|
|
651
|
+
const isDynamic = String(opts.type || "").toLowerCase() === "dynamic" && typeof opts.variable === "string" && opts.variable.trim() !== "";
|
|
652
|
+
const source = opts.value ?? (isDynamic ? opts.variable : opts.fixed ?? opts.defaultCurrency ?? "");
|
|
653
|
+
const sourceString = String(source ?? "").trim();
|
|
654
|
+
const direct = sourceString.toUpperCase();
|
|
655
|
+
if (/^[A-Z]{3}$/.test(direct) && !isDynamic) return {
|
|
656
|
+
ok: true,
|
|
657
|
+
value: direct
|
|
658
|
+
};
|
|
659
|
+
if (sourceString !== "") {
|
|
660
|
+
const raw = String(getReferenceValue(sourceString) || "").trim();
|
|
661
|
+
const normalized = raw.toUpperCase();
|
|
662
|
+
if (/^[A-Z]{3}$/.test(normalized)) return {
|
|
663
|
+
ok: true,
|
|
664
|
+
value: normalized
|
|
665
|
+
};
|
|
666
|
+
const label = getFieldLabel(searchRoot, sourceString);
|
|
667
|
+
if (!raw) return {
|
|
668
|
+
ok: false,
|
|
669
|
+
error: label ? t("Provide a value for \"{label}\" to proceed.", { label }) : t("Provide a payment currency to proceed.")
|
|
670
|
+
};
|
|
671
|
+
}
|
|
672
|
+
return {
|
|
673
|
+
ok: false,
|
|
674
|
+
error: t("Payment currency must be a valid 3-letter code.")
|
|
675
|
+
};
|
|
676
|
+
};
|
|
677
|
+
const watchFieldValueChanges = (handles, callback, debounceMs = 600) => {
|
|
678
|
+
const searchRoot = form || root;
|
|
679
|
+
const normalizedHandles = handles.map((handle) => String(handle || "").trim()).filter(Boolean);
|
|
680
|
+
if (normalizedHandles.length === 0) return () => {};
|
|
681
|
+
const registry = getRegistry();
|
|
682
|
+
const watchedNames = /* @__PURE__ */ new Set();
|
|
683
|
+
normalizedHandles.forEach((handle) => {
|
|
684
|
+
const key = normalizeFieldKey(handle);
|
|
685
|
+
const entry = registry.get(key);
|
|
686
|
+
if (entry?.names?.length) {
|
|
687
|
+
entry.names.forEach((name) => {
|
|
688
|
+
watchedNames.add(name);
|
|
689
|
+
});
|
|
690
|
+
return;
|
|
691
|
+
}
|
|
692
|
+
const fallback = fieldKeyToInputName(key);
|
|
693
|
+
if (fallback) {
|
|
694
|
+
watchedNames.add(fallback);
|
|
695
|
+
watchedNames.add(`${fallback}[]`);
|
|
696
|
+
}
|
|
697
|
+
});
|
|
698
|
+
const debounced = debounce(() => {
|
|
699
|
+
callback();
|
|
700
|
+
}, debounceMs);
|
|
701
|
+
const onInput = (event) => {
|
|
702
|
+
const inputName = event.target?.name || "";
|
|
703
|
+
if (!inputName || !watchedNames.has(inputName)) return;
|
|
704
|
+
debounced();
|
|
705
|
+
};
|
|
706
|
+
searchRoot.addEventListener("input", onInput);
|
|
707
|
+
searchRoot.addEventListener("change", onInput);
|
|
708
|
+
return () => {
|
|
709
|
+
searchRoot.removeEventListener("input", onInput);
|
|
710
|
+
searchRoot.removeEventListener("change", onInput);
|
|
711
|
+
};
|
|
712
|
+
};
|
|
713
|
+
return {
|
|
714
|
+
root,
|
|
715
|
+
form,
|
|
716
|
+
field,
|
|
717
|
+
updateInputs,
|
|
718
|
+
addError,
|
|
719
|
+
removeError,
|
|
720
|
+
addSuccess,
|
|
721
|
+
removeSuccess,
|
|
722
|
+
hasToken: () => hasRequiredPaymentInputs(tokenRoot, suffixes).ok,
|
|
723
|
+
waitForToken: (timeoutMs = options.transport.waitForValueMs) => {
|
|
724
|
+
return waitForRequiredPaymentInputs(tokenRoot, suffixes, timeoutMs).then((r) => r.ok);
|
|
725
|
+
},
|
|
726
|
+
getFieldValue: (handle, type = "string") => {
|
|
727
|
+
const raw = getReferenceValue(handle);
|
|
728
|
+
if (type === "float" || type === "int" || type === "number") return currencyToFloat(raw);
|
|
729
|
+
return raw;
|
|
730
|
+
},
|
|
731
|
+
resolveAmount,
|
|
732
|
+
resolveCurrency,
|
|
733
|
+
watchFieldValueChanges,
|
|
734
|
+
triggerSubmit,
|
|
735
|
+
releaseSubmitLoading,
|
|
736
|
+
getBillingData: (billingDetails) => {
|
|
737
|
+
const billing = {};
|
|
738
|
+
if (!billingDetails || typeof billingDetails !== "object") return { billing_details: billing };
|
|
739
|
+
if (billingDetails.billingName) {
|
|
740
|
+
const name = getReferenceValue(billingDetails.billingName);
|
|
741
|
+
if (name) billing.name = name;
|
|
742
|
+
}
|
|
743
|
+
if (billingDetails.billingEmail) {
|
|
744
|
+
const email = getReferenceValue(billingDetails.billingEmail);
|
|
745
|
+
if (email) billing.email = email;
|
|
746
|
+
}
|
|
747
|
+
if (billingDetails.billingAddress) {
|
|
748
|
+
const addr = billingDetails.billingAddress;
|
|
749
|
+
const address = {};
|
|
750
|
+
const address1 = getReferenceValue(`${addr}.address1`);
|
|
751
|
+
const address2 = getReferenceValue(`${addr}.address2`);
|
|
752
|
+
const address3 = getReferenceValue(`${addr}.address3`);
|
|
753
|
+
const city = getReferenceValue(`${addr}.city`);
|
|
754
|
+
const zip = getReferenceValue(`${addr}.zip`);
|
|
755
|
+
const state = getReferenceValue(`${addr}.state`);
|
|
756
|
+
const country = getReferenceValue(`${addr}.country`);
|
|
757
|
+
if (address1) address.line1 = address1;
|
|
758
|
+
if (address2) address.line2 = address2;
|
|
759
|
+
if (address3) address.line3 = address3;
|
|
760
|
+
if (city) address.city = city;
|
|
761
|
+
if (zip) address.postal_code = zip;
|
|
762
|
+
if (state) address.state = state;
|
|
763
|
+
if (country) address.country = country;
|
|
764
|
+
if (Object.keys(address).length) billing.address = address;
|
|
765
|
+
}
|
|
766
|
+
return { billing_details: billing };
|
|
767
|
+
},
|
|
768
|
+
events: {
|
|
769
|
+
onForm: (eventName, callback) => {
|
|
770
|
+
if (!form) return () => {};
|
|
771
|
+
return bindDomEvent(form, eventName, callback);
|
|
772
|
+
},
|
|
773
|
+
onRoot: (eventName, callback) => bindDomEvent(root, eventName, callback)
|
|
774
|
+
}
|
|
775
|
+
};
|
|
776
|
+
}
|
|
777
|
+
//#endregion
|
|
778
|
+
//#region src/js/modules/payments/factories.ts
|
|
779
|
+
var debug = createDebug("payments");
|
|
780
|
+
function isTargetVisible(element) {
|
|
781
|
+
const node = element;
|
|
782
|
+
return !node.closest("[data-formie-page-hidden]") && !node.closest("[hidden]");
|
|
783
|
+
}
|
|
784
|
+
function createManagedPaymentModule(adapter) {
|
|
785
|
+
const defaultSuffixes = adapter.defaultRequiredInputSuffixes ?? DEFAULT_REQUIRED_INPUT_SUFFIXES[adapter.id] ?? [];
|
|
786
|
+
return {
|
|
787
|
+
id: adapter.id,
|
|
788
|
+
kind: "payment",
|
|
789
|
+
match: (ctx) => {
|
|
790
|
+
return !!(ctx.target.querySelector("[data-formie-field-type=\"payment\"]") || ctx.target.closest("[data-formie-field-type=\"payment\"]") || ctx.target.getAttribute?.("data-formie-field-type") === "payment");
|
|
791
|
+
},
|
|
792
|
+
setup: async (ctx) => {
|
|
793
|
+
const fieldWithRegistry = ctx.target;
|
|
794
|
+
const registry = fieldWithRegistry.__formiePaymentModuleRegistry || {};
|
|
795
|
+
fieldWithRegistry.__formiePaymentModuleRegistry = registry;
|
|
796
|
+
const previous = registry[adapter.id];
|
|
797
|
+
if (previous?.destroy) {
|
|
798
|
+
debug.warn("Found stale payment module instance; destroying previous.", { moduleId: adapter.id });
|
|
799
|
+
try {
|
|
800
|
+
await previous.destroy();
|
|
801
|
+
} catch {}
|
|
802
|
+
}
|
|
803
|
+
const options = normalizePaymentModuleOptions(adapter.id, ctx.options || {}, { defaultRequiredInputSuffixes: defaultSuffixes });
|
|
804
|
+
const services = createPaymentHostServices(ctx, options);
|
|
805
|
+
const setupCtx = {
|
|
806
|
+
...ctx,
|
|
807
|
+
options,
|
|
808
|
+
services
|
|
809
|
+
};
|
|
810
|
+
const cleanups = [];
|
|
811
|
+
let apiPromise = null;
|
|
812
|
+
let widget = null;
|
|
813
|
+
let customSetupResult = null;
|
|
814
|
+
let authorizeInFlight = null;
|
|
815
|
+
const getApi = async () => {
|
|
816
|
+
if (!apiPromise) {
|
|
817
|
+
debug.log("Loading payment provider API.", { moduleId: adapter.id });
|
|
818
|
+
apiPromise = adapter.load(setupCtx);
|
|
819
|
+
}
|
|
820
|
+
return apiPromise;
|
|
821
|
+
};
|
|
822
|
+
const ensureMounted = async () => {
|
|
823
|
+
if (!adapter.mount || widget || !isTargetVisible(ctx.target)) return;
|
|
824
|
+
const api = await getApi();
|
|
825
|
+
try {
|
|
826
|
+
widget = await adapter.mount({
|
|
827
|
+
api,
|
|
828
|
+
field: ctx.target,
|
|
829
|
+
services,
|
|
830
|
+
options,
|
|
831
|
+
provider: options.provider
|
|
832
|
+
});
|
|
833
|
+
debug.log("Payment widget mounted.", {
|
|
834
|
+
moduleId: adapter.id,
|
|
835
|
+
handle: options.handle
|
|
836
|
+
});
|
|
837
|
+
} catch {
|
|
838
|
+
debug.warn("Payment widget mount failed.", {
|
|
839
|
+
moduleId: adapter.id,
|
|
840
|
+
handle: options.handle
|
|
841
|
+
});
|
|
842
|
+
}
|
|
843
|
+
};
|
|
844
|
+
cleanups.push(ctx.on("formie:submit:before", () => {
|
|
845
|
+
services.removeError();
|
|
846
|
+
services.removeSuccess();
|
|
847
|
+
}));
|
|
848
|
+
if (adapter.setup) {
|
|
849
|
+
const root = ctx.root || ctx.form || ctx.target;
|
|
850
|
+
customSetupResult = await adapter.setup({
|
|
851
|
+
...setupCtx,
|
|
852
|
+
root
|
|
853
|
+
});
|
|
854
|
+
if (customSetupResult.destroy) cleanups.push(customSetupResult.destroy);
|
|
855
|
+
}
|
|
856
|
+
if (adapter.mount && isTargetVisible(ctx.target)) await ensureMounted();
|
|
857
|
+
["formie:page:navigate:after", "formie:submit:result"].forEach((eventName) => {
|
|
858
|
+
const handleVisibility = () => {
|
|
859
|
+
ensureMounted();
|
|
860
|
+
};
|
|
861
|
+
ctx.root.addEventListener(eventName, handleVisibility);
|
|
862
|
+
cleanups.push(() => {
|
|
863
|
+
ctx.root.removeEventListener(eventName, handleVisibility);
|
|
864
|
+
});
|
|
865
|
+
});
|
|
866
|
+
const destroy = async () => {
|
|
867
|
+
debug.log("Destroying payment module.", {
|
|
868
|
+
moduleId: adapter.id,
|
|
869
|
+
handle: options.handle
|
|
870
|
+
});
|
|
871
|
+
cleanups.forEach((c) => c());
|
|
872
|
+
if (widget && adapter.unmount) {
|
|
873
|
+
const api = await getApi();
|
|
874
|
+
await adapter.unmount({
|
|
875
|
+
api,
|
|
876
|
+
widget,
|
|
877
|
+
field: ctx.target,
|
|
878
|
+
services,
|
|
879
|
+
options,
|
|
880
|
+
provider: options.provider
|
|
881
|
+
});
|
|
882
|
+
debug.log("Payment widget unmounted.", {
|
|
883
|
+
moduleId: adapter.id,
|
|
884
|
+
handle: options.handle
|
|
885
|
+
});
|
|
886
|
+
}
|
|
887
|
+
if (registry[adapter.id]?.destroy === destroy) delete registry[adapter.id];
|
|
888
|
+
debug.log("Payment module destroy complete.", {
|
|
889
|
+
moduleId: adapter.id,
|
|
890
|
+
handle: options.handle
|
|
891
|
+
});
|
|
892
|
+
};
|
|
893
|
+
registry[adapter.id] = { destroy };
|
|
894
|
+
return {
|
|
895
|
+
destroy,
|
|
896
|
+
onBeforeStage: async (stageCtx) => {
|
|
897
|
+
if (customSetupResult?.onBeforeStage) {
|
|
898
|
+
await customSetupResult.onBeforeStage(stageCtx);
|
|
899
|
+
return;
|
|
900
|
+
}
|
|
901
|
+
if (stageCtx.stage !== "authorize" || stageCtx.action !== "submit") return;
|
|
902
|
+
if (ctx.target.closest("[data-formie-page]")?.hasAttribute("data-formie-page-hidden")) return;
|
|
903
|
+
await ensureMounted();
|
|
904
|
+
const api = await getApi();
|
|
905
|
+
if (adapter.onBeforeAuthorize) {
|
|
906
|
+
if (!authorizeInFlight) authorizeInFlight = (async () => {
|
|
907
|
+
return adapter.onBeforeAuthorize({
|
|
908
|
+
api,
|
|
909
|
+
widget,
|
|
910
|
+
field: ctx.target,
|
|
911
|
+
services,
|
|
912
|
+
options,
|
|
913
|
+
provider: options.provider,
|
|
914
|
+
stageCtx
|
|
915
|
+
});
|
|
916
|
+
})().finally(() => {
|
|
917
|
+
authorizeInFlight = null;
|
|
918
|
+
});
|
|
919
|
+
const ok = await authorizeInFlight;
|
|
920
|
+
debug.log("onBeforeAuthorize resolved.", {
|
|
921
|
+
moduleId: adapter.id,
|
|
922
|
+
handle: options.handle,
|
|
923
|
+
ok
|
|
924
|
+
});
|
|
925
|
+
if (!ok) {
|
|
926
|
+
stageCtx.abort(options.transport.errorMessage);
|
|
927
|
+
return;
|
|
928
|
+
}
|
|
929
|
+
return;
|
|
930
|
+
}
|
|
931
|
+
if (options.transport.requiredInputSuffixes.length === 0) return;
|
|
932
|
+
const result = await waitForRequiredPaymentInputs(ctx.form || ctx.root, options.transport.requiredInputSuffixes, options.transport.waitForValueMs);
|
|
933
|
+
if (!result.ok) {
|
|
934
|
+
debug.warn("Required payment input(s) missing.", {
|
|
935
|
+
moduleId: adapter.id,
|
|
936
|
+
handle: options.handle,
|
|
937
|
+
missingSuffix: result.missingSuffix
|
|
938
|
+
});
|
|
939
|
+
stageCtx.abort(options.transport.errorMessage);
|
|
940
|
+
}
|
|
941
|
+
},
|
|
942
|
+
onAfterStage: async (stagePayload, result) => {
|
|
943
|
+
if (stagePayload.stage !== "dispatch" || !adapter.onAfterSubmit) return;
|
|
944
|
+
await adapter.onAfterSubmit({
|
|
945
|
+
field: ctx.target,
|
|
946
|
+
services,
|
|
947
|
+
options,
|
|
948
|
+
provider: options.provider,
|
|
949
|
+
result
|
|
950
|
+
});
|
|
951
|
+
}
|
|
952
|
+
};
|
|
953
|
+
}
|
|
954
|
+
};
|
|
955
|
+
}
|
|
956
|
+
//#endregion
|
|
957
|
+
//#region src/js/modules/payments/api.ts
|
|
958
|
+
var definePaymentModule = createManagedPaymentModule;
|
|
959
|
+
//#endregion
|
|
960
|
+
export { setFormHiddenState as a, dispatchPageClientEventForSubmit as c, clearSubmitLoading as i, applyPageState as n, setSubmitLoading as o, applySubmitResultState as r, syncPageTabErrors as s, definePaymentModule as t };
|