@10x-media/form-builder 0.1.0-beta.2 → 0.1.0-beta.21
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 +360 -0
- package/README.md +7 -5
- package/dist/actions/assertNoBlockCollision.js +18 -0
- package/dist/actions/assertNoBlockCollision.js.map +1 -0
- package/dist/actions/body/converters.d.ts +20 -0
- package/dist/actions/body/converters.js +57 -0
- package/dist/actions/body/converters.js.map +1 -0
- package/dist/actions/body/escapeHtml.d.ts +6 -0
- package/dist/actions/body/escapeHtml.js +14 -0
- package/dist/actions/body/escapeHtml.js.map +1 -0
- package/dist/actions/body/serializeBody.d.ts +55 -0
- package/dist/actions/body/serializeBody.js +78 -0
- package/dist/actions/body/serializeBody.js.map +1 -0
- package/dist/actions/body/serializeSlate.js +31 -0
- package/dist/actions/body/serializeSlate.js.map +1 -0
- package/dist/actions/body/textOfBody.d.ts +13 -0
- package/dist/actions/body/textOfBody.js +35 -0
- package/dist/actions/body/textOfBody.js.map +1 -0
- package/dist/actions/body/wildcards.d.ts +10 -0
- package/dist/actions/body/wildcards.js +33 -0
- package/dist/actions/body/wildcards.js.map +1 -0
- package/dist/actions/buildActionBlocks.js +12 -9
- package/dist/actions/buildActionBlocks.js.map +1 -1
- package/dist/actions/builtin/confirmation.js +47 -43
- package/dist/actions/builtin/confirmation.js.map +1 -1
- package/dist/actions/builtin/emailAction.d.ts +20 -0
- package/dist/actions/builtin/emailAction.js +120 -0
- package/dist/actions/builtin/emailAction.js.map +1 -0
- package/dist/actions/builtin/emailTeam.js +20 -38
- package/dist/actions/builtin/emailTeam.js.map +1 -1
- package/dist/actions/builtin/index.d.ts +16 -1
- package/dist/actions/builtin/index.js +21 -7
- package/dist/actions/builtin/index.js.map +1 -1
- package/dist/actions/builtin/signedWebhook.js +6 -2
- package/dist/actions/builtin/signedWebhook.js.map +1 -1
- package/dist/actions/defineAction.d.ts +17 -5
- package/dist/actions/defineAction.js.map +1 -1
- package/dist/actions/dispatch.js +51 -6
- package/dist/actions/dispatch.js.map +1 -1
- package/dist/actions/dispatchContext.js +13 -0
- package/dist/actions/dispatchContext.js.map +1 -0
- package/dist/actions/emailRecipients.d.ts +12 -0
- package/dist/actions/emailRecipients.js +146 -0
- package/dist/actions/emailRecipients.js.map +1 -0
- package/dist/actions/fromAddresses.d.ts +37 -0
- package/dist/actions/fromAddresses.js +131 -0
- package/dist/actions/fromAddresses.js.map +1 -0
- package/dist/actions/recipientSources.d.ts +34 -0
- package/dist/actions/recipientSources.js +11 -0
- package/dist/actions/recipientSources.js.map +1 -0
- package/dist/actions/registry.d.ts +2 -1
- package/dist/actions/registry.js +5 -7
- package/dist/actions/registry.js.map +1 -1
- package/dist/actions/runActions.js +10 -1
- package/dist/actions/runActions.js.map +1 -1
- package/dist/actions/task.js +47 -16
- package/dist/actions/task.js.map +1 -1
- package/dist/aggregation/aggregateResponses.d.ts +9 -0
- package/dist/aggregation/aggregateResponses.js +8 -14
- package/dist/aggregation/aggregateResponses.js.map +1 -1
- package/dist/aggregation/resolveResultsRequest.d.ts +41 -6
- package/dist/aggregation/resolveResultsRequest.js +97 -11
- package/dist/aggregation/resolveResultsRequest.js.map +1 -1
- package/dist/calc/computeCalcFields.d.ts +5 -3
- package/dist/calc/computeCalcFields.js +6 -4
- package/dist/calc/computeCalcFields.js.map +1 -1
- package/dist/calc/evaluate.d.ts +26 -3
- package/dist/calc/evaluate.js +34 -13
- package/dist/calc/evaluate.js.map +1 -1
- package/dist/calc/formatCalc.d.ts +11 -0
- package/dist/calc/formatCalc.js +35 -0
- package/dist/calc/formatCalc.js.map +1 -0
- package/dist/calc/formatCalcValue.d.ts +17 -0
- package/dist/calc/formatCalcValue.js +17 -0
- package/dist/calc/formatCalcValue.js.map +1 -0
- package/dist/calc/normalizeCalc.d.ts +17 -3
- package/dist/calc/normalizeCalc.js +42 -33
- package/dist/calc/normalizeCalc.js.map +1 -1
- package/dist/calc/registry.d.ts +43 -0
- package/dist/calc/registry.js +27 -0
- package/dist/calc/registry.js.map +1 -0
- package/dist/calc/resolveCalcContext.d.ts +36 -0
- package/dist/calc/resolveCalcContext.js +87 -0
- package/dist/calc/resolveCalcContext.js.map +1 -0
- package/dist/calc/types.d.ts +25 -4
- package/dist/calc/types.js +23 -0
- package/dist/calc/types.js.map +1 -0
- package/dist/client/ByteSizeField.d.ts +29 -0
- package/dist/client/ByteSizeField.js +58 -0
- package/dist/client/ByteSizeField.js.map +1 -0
- package/dist/client/CalcExpressionBuilder.d.ts +20 -0
- package/dist/client/CalcExpressionBuilder.js +890 -0
- package/dist/client/CalcExpressionBuilder.js.map +1 -0
- package/dist/client/ClosePollButton.d.ts +15 -0
- package/dist/client/ClosePollButton.js +80 -0
- package/dist/client/ClosePollButton.js.map +1 -0
- package/dist/client/CondensedArray.d.ts +15 -0
- package/dist/client/CondensedArray.js +97 -0
- package/dist/client/CondensedArray.js.map +1 -0
- package/dist/client/ConditionBuilder.js +2 -1
- package/dist/client/ConditionBuilder.js.map +1 -1
- package/dist/client/ConsentBlockLabel.d.ts +15 -0
- package/dist/client/ConsentBlockLabel.js +71 -0
- package/dist/client/ConsentBlockLabel.js.map +1 -0
- package/dist/client/ConsentSourceRowLabel.d.ts +9 -0
- package/dist/client/ConsentSourceRowLabel.js +21 -0
- package/dist/client/ConsentSourceRowLabel.js.map +1 -0
- package/dist/client/EndpointOptionsSelect.d.ts +55 -0
- package/dist/client/EndpointOptionsSelect.js +112 -0
- package/dist/client/EndpointOptionsSelect.js.map +1 -0
- package/dist/client/FieldBlockLabel.d.ts +18 -0
- package/dist/client/FieldBlockLabel.js +34 -0
- package/dist/client/FieldBlockLabel.js.map +1 -0
- package/dist/client/FieldNameSelect.d.ts +37 -0
- package/dist/client/FieldNameSelect.js +72 -0
- package/dist/client/FieldNameSelect.js.map +1 -0
- package/dist/client/FlowBuilder.d.ts +2 -2
- package/dist/client/FlowBuilder.js +137 -88
- package/dist/client/FlowBuilder.js.map +1 -1
- package/dist/client/FormConditionField.js +1 -4
- package/dist/client/FormConditionField.js.map +1 -1
- package/dist/client/RecipientsSelect.d.ts +37 -0
- package/dist/client/RecipientsSelect.js +197 -0
- package/dist/client/RecipientsSelect.js.map +1 -0
- package/dist/client/RuleDescription.d.ts +21 -0
- package/dist/client/RuleDescription.js +19 -0
- package/dist/client/RuleDescription.js.map +1 -0
- package/dist/client/admin.css +557 -0
- package/dist/client/endpointOptions.d.ts +11 -0
- package/dist/client/endpointOptions.js +38 -0
- package/dist/client/endpointOptions.js.map +1 -0
- package/dist/client/flowAuthoring.js +142 -0
- package/dist/client/flowAuthoring.js.map +1 -0
- package/dist/client/synthesizeClientField.js +21 -10
- package/dist/client/synthesizeClientField.js.map +1 -1
- package/dist/client/toStaticLabel.js +13 -0
- package/dist/client/toStaticLabel.js.map +1 -0
- package/dist/collections/buttonFields.d.ts +34 -0
- package/dist/collections/buttonFields.js +35 -0
- package/dist/collections/buttonFields.js.map +1 -0
- package/dist/collections/cells/FieldCountCell.d.ts +15 -0
- package/dist/collections/cells/FieldCountCell.js +18 -0
- package/dist/collections/cells/FieldCountCell.js.map +1 -0
- package/dist/collections/cells/FlowStepsCell.d.ts +14 -0
- package/dist/collections/cells/FlowStepsCell.js +17 -0
- package/dist/collections/cells/FlowStepsCell.js.map +1 -0
- package/dist/collections/formSubmissions.js +114 -28
- package/dist/collections/formSubmissions.js.map +1 -1
- package/dist/collections/forms.js +449 -112
- package/dist/collections/forms.js.map +1 -1
- package/dist/collections/formsEndpoints.js +106 -0
- package/dist/collections/formsEndpoints.js.map +1 -0
- package/dist/collections/redirectFields.d.ts +29 -0
- package/dist/collections/settingsFields.d.ts +31 -0
- package/dist/collections/settingsFields.js +45 -0
- package/dist/collections/settingsFields.js.map +1 -0
- package/dist/conditions/conditionType.js +9 -2
- package/dist/conditions/conditionType.js.map +1 -1
- package/dist/conditions/evaluate.js +1 -1
- package/dist/conditions/evaluate.js.map +1 -1
- package/dist/conditions/fieldTypes.d.ts +3 -1
- package/dist/conditions/fieldTypes.js +4 -1
- package/dist/conditions/fieldTypes.js.map +1 -1
- package/dist/conditions/normalizeConditions.js +20 -6
- package/dist/conditions/normalizeConditions.js.map +1 -1
- package/dist/consent/applyConsentStatements.d.ts +14 -0
- package/dist/consent/applyConsentStatements.js +17 -0
- package/dist/consent/applyConsentStatements.js.map +1 -0
- package/dist/consent/captureConsent.d.ts +39 -11
- package/dist/consent/captureConsent.js +63 -13
- package/dist/consent/captureConsent.js.map +1 -1
- package/dist/consent/consentSourcesField.d.ts +66 -0
- package/dist/consent/consentSourcesField.js +98 -0
- package/dist/consent/consentSourcesField.js.map +1 -0
- package/dist/consent/effectiveStatement.js +16 -0
- package/dist/consent/effectiveStatement.js.map +1 -0
- package/dist/consent/resolveConsentEntries.d.ts +24 -0
- package/dist/consent/resolveConsentEntries.js +40 -0
- package/dist/consent/resolveConsentEntries.js.map +1 -0
- package/dist/consent/resolveConsentSourcesRequest.d.ts +37 -0
- package/dist/consent/resolveConsentSourcesRequest.js +54 -0
- package/dist/consent/resolveConsentSourcesRequest.js.map +1 -0
- package/dist/consent/resolveConsentStatements.d.ts +45 -0
- package/dist/consent/resolveConsentStatements.js +46 -0
- package/dist/consent/resolveConsentStatements.js.map +1 -0
- package/dist/consent/resolvePublishedVersionRef.d.ts +17 -11
- package/dist/consent/resolvePublishedVersionRef.js +13 -10
- package/dist/consent/resolvePublishedVersionRef.js.map +1 -1
- package/dist/consent/types.d.ts +69 -0
- package/dist/context/formContext.d.ts +30 -0
- package/dist/context/formContext.js +54 -0
- package/dist/context/formContext.js.map +1 -0
- package/dist/email/departments.d.ts +59 -0
- package/dist/email/departments.js +87 -0
- package/dist/email/departments.js.map +1 -0
- package/dist/email/departmentsField.d.ts +53 -0
- package/dist/email/departmentsField.js +73 -0
- package/dist/email/departmentsField.js.map +1 -0
- package/dist/exports/client.d.ts +14 -1
- package/dist/exports/client.js +14 -1
- package/dist/exports/i18n.d.ts +5 -2
- package/dist/exports/i18n.js +5 -2
- package/dist/exports/react.d.ts +34 -10
- package/dist/exports/react.js +24 -4
- package/dist/exports/rsc.d.ts +10 -1
- package/dist/exports/rsc.js +10 -1
- package/dist/exports/types.d.ts +20 -12
- package/dist/fields/buildFieldBlocks.js +46 -25
- package/dist/fields/buildFieldBlocks.js.map +1 -1
- package/dist/fields/builtin/calculation.d.ts +17 -0
- package/dist/fields/builtin/calculation.js +193 -18
- package/dist/fields/builtin/calculation.js.map +1 -1
- package/dist/fields/builtin/checkbox.js +23 -0
- package/dist/fields/builtin/checkbox.js.map +1 -1
- package/dist/fields/builtin/consent.js +49 -14
- package/dist/fields/builtin/consent.js.map +1 -1
- package/dist/fields/builtin/country.d.ts +13 -0
- package/dist/fields/builtin/country.js +30 -0
- package/dist/fields/builtin/country.js.map +1 -0
- package/dist/fields/builtin/date.js +31 -0
- package/dist/fields/builtin/date.js.map +1 -0
- package/dist/fields/builtin/email.js +8 -1
- package/dist/fields/builtin/email.js.map +1 -1
- package/dist/fields/builtin/file.d.ts +15 -0
- package/dist/fields/builtin/file.js +95 -8
- package/dist/fields/builtin/file.js.map +1 -1
- package/dist/fields/builtin/index.d.ts +30 -0
- package/dist/fields/builtin/index.js +37 -10
- package/dist/fields/builtin/index.js.map +1 -1
- package/dist/fields/builtin/message.js +30 -0
- package/dist/fields/builtin/message.js.map +1 -0
- package/dist/fields/builtin/repeater.js +8 -3
- package/dist/fields/builtin/repeater.js.map +1 -1
- package/dist/fields/builtin/select.js +28 -4
- package/dist/fields/builtin/select.js.map +1 -1
- package/dist/fields/builtin/state.d.ts +13 -0
- package/dist/fields/builtin/state.js +30 -0
- package/dist/fields/builtin/state.js.map +1 -0
- package/dist/fields/builtin/text.js +7 -0
- package/dist/fields/builtin/text.js.map +1 -1
- package/dist/fields/data/regions.d.ts +21 -0
- package/dist/fields/data/regions.js +1238 -0
- package/dist/fields/data/regions.js.map +1 -0
- package/dist/fields/fieldKey.d.ts +15 -0
- package/dist/fields/fieldKey.js +16 -0
- package/dist/fields/fieldKey.js.map +1 -0
- package/dist/fields/fieldNamesOfType.js +30 -0
- package/dist/fields/fieldNamesOfType.js.map +1 -0
- package/dist/fields/instanceOptions.js +20 -0
- package/dist/fields/instanceOptions.js.map +1 -0
- package/dist/fields/localizedIf.d.ts +13 -0
- package/dist/fields/localizedIf.js +12 -0
- package/dist/fields/localizedIf.js.map +1 -0
- package/dist/fields/registry.d.ts +3 -1
- package/dist/fields/registry.js +23 -8
- package/dist/fields/registry.js.map +1 -1
- package/dist/fields/sharedConfig.js +125 -59
- package/dist/fields/sharedConfig.js.map +1 -1
- package/dist/fields/types.d.ts +78 -9
- package/dist/flow/engine.d.ts +6 -4
- package/dist/flow/engine.js +11 -6
- package/dist/flow/engine.js.map +1 -1
- package/dist/flow/normalizeFlow.js +28 -9
- package/dist/flow/normalizeFlow.js.map +1 -1
- package/dist/flow/stepLabel.js +15 -0
- package/dist/flow/stepLabel.js.map +1 -0
- package/dist/flow/types.d.ts +12 -3
- package/dist/flow/types.js +11 -0
- package/dist/flow/types.js.map +1 -0
- package/dist/form/pollState.d.ts +23 -0
- package/dist/form/pollState.js +17 -0
- package/dist/form/pollState.js.map +1 -0
- package/dist/form/toFormDocument.d.ts +110 -0
- package/dist/form/toFormDocument.js +89 -0
- package/dist/form/toFormDocument.js.map +1 -0
- package/dist/form/types.d.ts +73 -0
- package/dist/index.d.ts +67 -61
- package/dist/index.js +120 -25
- package/dist/index.js.map +1 -1
- package/dist/options.d.ts +281 -0
- package/dist/plugin/applyRegistryConfig.d.ts +11 -0
- package/dist/plugin/applyRegistryConfig.js +20 -0
- package/dist/plugin/applyRegistryConfig.js.map +1 -0
- package/dist/plugin/customState.js +26 -0
- package/dist/plugin/customState.js.map +1 -0
- package/dist/plugin/registerCollections.js +43 -40
- package/dist/plugin/registerCollections.js.map +1 -1
- package/dist/plugin/uploadsCollection.d.ts +16 -0
- package/dist/plugin/uploadsCollection.js +53 -0
- package/dist/plugin/uploadsCollection.js.map +1 -0
- package/dist/poll/applyPollOptions.js +18 -0
- package/dist/poll/applyPollOptions.js.map +1 -0
- package/dist/poll/buildPollOptionSourceFields.js +50 -0
- package/dist/poll/buildPollOptionSourceFields.js.map +1 -0
- package/dist/poll/closeJob.d.ts +53 -0
- package/dist/poll/closeJob.js +121 -0
- package/dist/poll/closeJob.js.map +1 -0
- package/dist/poll/definePollOptionSource.d.ts +44 -0
- package/dist/poll/definePollOptionSource.js +6 -0
- package/dist/poll/definePollOptionSource.js.map +1 -0
- package/dist/poll/definePollType.d.ts +34 -0
- package/dist/poll/definePollType.js +6 -0
- package/dist/poll/definePollType.js.map +1 -0
- package/dist/poll/effectivePollOptions.d.ts +38 -0
- package/dist/poll/effectivePollOptions.js +64 -0
- package/dist/poll/effectivePollOptions.js.map +1 -0
- package/dist/poll/mostVoted.d.ts +21 -0
- package/dist/poll/mostVoted.js +32 -0
- package/dist/poll/mostVoted.js.map +1 -0
- package/dist/poll/outcomeBeforeChange.js +91 -0
- package/dist/poll/outcomeBeforeChange.js.map +1 -0
- package/dist/poll/outcomeFields.d.ts +38 -0
- package/dist/poll/outcomeFields.js +52 -0
- package/dist/poll/outcomeFields.js.map +1 -0
- package/dist/poll/pollTypeRegistry.d.ts +34 -0
- package/dist/poll/pollTypeRegistry.js +69 -0
- package/dist/poll/pollTypeRegistry.js.map +1 -0
- package/dist/poll/registry.d.ts +17 -0
- package/dist/poll/registry.js +12 -0
- package/dist/poll/registry.js.map +1 -0
- package/dist/poll/resolvePollCloseRequest.js +106 -0
- package/dist/poll/resolvePollCloseRequest.js.map +1 -0
- package/dist/poll/resolvePollOptions.d.ts +29 -0
- package/dist/poll/resolvePollOptions.js +52 -0
- package/dist/poll/resolvePollOptions.js.map +1 -0
- package/dist/poll/resolvePollOptionsRequest.js +50 -0
- package/dist/poll/resolvePollOptionsRequest.js.map +1 -0
- package/dist/poll/resolvePollOutcome.d.ts +40 -0
- package/dist/poll/resolvePollOutcome.js +90 -0
- package/dist/poll/resolvePollOutcome.js.map +1 -0
- package/dist/poll/resultsField.js +21 -0
- package/dist/poll/resultsField.js.map +1 -0
- package/dist/poll/votes/aggregateFromVotes.d.ts +27 -0
- package/dist/poll/votes/aggregateFromVotes.js +54 -0
- package/dist/poll/votes/aggregateFromVotes.js.map +1 -0
- package/dist/poll/votes/answerValues.js +16 -0
- package/dist/poll/votes/answerValues.js.map +1 -0
- package/dist/poll/votes/bumpPollVote.js +88 -0
- package/dist/poll/votes/bumpPollVote.js.map +1 -0
- package/dist/poll/votes/recountPollVotes.d.ts +20 -0
- package/dist/poll/votes/recountPollVotes.js +63 -0
- package/dist/poll/votes/recountPollVotes.js.map +1 -0
- package/dist/poll/votes/voteTallyHook.js +76 -0
- package/dist/poll/votes/voteTallyHook.js.map +1 -0
- package/dist/poll/votes/votesCollection.d.ts +19 -0
- package/dist/poll/votes/votesCollection.js +89 -0
- package/dist/poll/votes/votesCollection.js.map +1 -0
- package/dist/prefill/valuesFromSearchParams.js +5 -9
- package/dist/prefill/valuesFromSearchParams.js.map +1 -1
- package/dist/presentations/types.d.ts +3 -2
- package/dist/react/Form.d.ts +77 -35
- package/dist/react/Form.js +368 -222
- package/dist/react/Form.js.map +1 -1
- package/dist/react/FormContext.d.ts +51 -1
- package/dist/react/FormContext.js.map +1 -1
- package/dist/react/FormControls.d.ts +55 -0
- package/dist/react/FormControls.js +56 -0
- package/dist/react/FormControls.js.map +1 -0
- package/dist/react/FormFields.d.ts +18 -0
- package/dist/react/FormFields.js +114 -0
- package/dist/react/FormFields.js.map +1 -0
- package/dist/react/FormLayout.d.ts +4 -2
- package/dist/react/FormLayout.js +3 -2
- package/dist/react/FormLayout.js.map +1 -1
- package/dist/react/FormResults.d.ts +8 -3
- package/dist/react/FormResults.js +50 -29
- package/dist/react/FormResults.js.map +1 -1
- package/dist/react/FormSteps.d.ts +17 -0
- package/dist/react/FormSteps.js +35 -0
- package/dist/react/FormSteps.js.map +1 -0
- package/dist/react/Poll.d.ts +40 -6
- package/dist/react/Poll.js +137 -33
- package/dist/react/Poll.js.map +1 -1
- package/dist/react/adapters.d.ts +35 -0
- package/dist/react/adapters.js +11 -0
- package/dist/react/adapters.js.map +1 -0
- package/dist/react/captcha/HcaptchaCaptcha.d.ts +31 -0
- package/dist/react/captcha/HcaptchaCaptcha.js +53 -0
- package/dist/react/captcha/HcaptchaCaptcha.js.map +1 -0
- package/dist/react/captcha/RecaptchaCaptcha.d.ts +44 -0
- package/dist/react/captcha/RecaptchaCaptcha.js +93 -0
- package/dist/react/captcha/RecaptchaCaptcha.js.map +1 -0
- package/dist/react/captcha/TurnstileCaptcha.d.ts +31 -0
- package/dist/react/captcha/TurnstileCaptcha.js +53 -0
- package/dist/react/captcha/TurnstileCaptcha.js.map +1 -0
- package/dist/react/captcha/types.d.ts +8 -0
- package/dist/react/captcha/useCaptchaScript.js +63 -0
- package/dist/react/captcha/useCaptchaScript.js.map +1 -0
- package/dist/react/captcha/vendors.js +8 -0
- package/dist/react/captcha/vendors.js.map +1 -0
- package/dist/react/contract.d.ts +2 -3
- package/dist/react/contract.js.map +1 -1
- package/dist/react/fetchResults.d.ts +1 -1
- package/dist/react/fetchResults.js +1 -1
- package/dist/react/fetchResults.js.map +1 -1
- package/dist/react/presentation/DialogSurface.js +1 -4
- package/dist/react/presentation/DialogSurface.js.map +1 -1
- package/dist/react/primitives/Checkbox.d.ts +6 -2
- package/dist/react/primitives/Checkbox.js +4 -2
- package/dist/react/primitives/Checkbox.js.map +1 -1
- package/dist/react/primitives/ChoiceGroup.d.ts +40 -0
- package/dist/react/primitives/ChoiceGroup.js +33 -0
- package/dist/react/primitives/ChoiceGroup.js.map +1 -0
- package/dist/react/primitives/FieldShell.d.ts +13 -5
- package/dist/react/primitives/FieldShell.js +35 -32
- package/dist/react/primitives/FieldShell.js.map +1 -1
- package/dist/react/primitives/Input.d.ts +4 -2
- package/dist/react/primitives/Input.js +2 -1
- package/dist/react/primitives/Input.js.map +1 -1
- package/dist/react/renderers/calculation.js +7 -5
- package/dist/react/renderers/calculation.js.map +1 -1
- package/dist/react/renderers/checkbox.js +3 -5
- package/dist/react/renderers/checkbox.js.map +1 -1
- package/dist/react/renderers/consent.js +84 -36
- package/dist/react/renderers/consent.js.map +1 -1
- package/dist/react/renderers/date.js +33 -0
- package/dist/react/renderers/date.js.map +1 -0
- package/dist/react/renderers/email.js +4 -5
- package/dist/react/renderers/email.js.map +1 -1
- package/dist/react/renderers/file.js +29 -14
- package/dist/react/renderers/file.js.map +1 -1
- package/dist/react/renderers/index.js +7 -0
- package/dist/react/renderers/index.js.map +1 -1
- package/dist/react/renderers/message.js +41 -0
- package/dist/react/renderers/message.js.map +1 -0
- package/dist/react/renderers/number.js +1 -4
- package/dist/react/renderers/number.js.map +1 -1
- package/dist/react/renderers/region.js +43 -0
- package/dist/react/renderers/region.js.map +1 -0
- package/dist/react/renderers/repeater.js +32 -14
- package/dist/react/renderers/repeater.js.map +1 -1
- package/dist/react/renderers/select.js +21 -6
- package/dist/react/renderers/select.js.map +1 -1
- package/dist/react/renderers/text.js +4 -5
- package/dist/react/renderers/text.js.map +1 -1
- package/dist/react/renderers/textarea.js +1 -4
- package/dist/react/renderers/textarea.js.map +1 -1
- package/dist/react/state.d.ts +46 -3
- package/dist/react/state.js +73 -10
- package/dist/react/state.js.map +1 -1
- package/dist/react/submitForm.js +1 -1
- package/dist/react/submitForm.js.map +1 -1
- package/dist/react/uploadFile.d.ts +2 -2
- package/dist/react/uploadFile.js +1 -1
- package/dist/react/uploadFile.js.map +1 -1
- package/dist/react/useCalcValues.d.ts +10 -0
- package/dist/react/useCalcValues.js +13 -0
- package/dist/react/useCalcValues.js.map +1 -0
- package/dist/react/useField.d.ts +0 -1
- package/dist/react/useField.js +7 -6
- package/dist/react/useField.js.map +1 -1
- package/dist/react/useFormState.d.ts +1 -1
- package/dist/react/useFormState.js +1 -1
- package/dist/react/useFormState.js.map +1 -1
- package/dist/react/validateField.js +3 -6
- package/dist/react/validateField.js.map +1 -1
- package/dist/recall/interpolate.d.ts +4 -3
- package/dist/recall/interpolate.js +5 -4
- package/dist/recall/interpolate.js.map +1 -1
- package/dist/recall/resolver.d.ts +1 -1
- package/dist/recall/resolver.js +15 -3
- package/dist/recall/resolver.js.map +1 -1
- package/dist/spam/captcha.d.ts +4 -3
- package/dist/spam/captcha.js +4 -3
- package/dist/spam/captcha.js.map +1 -1
- package/dist/spam/clientIp.js +9 -0
- package/dist/spam/clientIp.js.map +1 -0
- package/dist/spam/constants.js +13 -1
- package/dist/spam/constants.js.map +1 -1
- package/dist/spam/identify.js +3 -6
- package/dist/spam/identify.js.map +1 -1
- package/dist/spam/providers/hcaptcha.d.ts +17 -0
- package/dist/spam/providers/hcaptcha.js +18 -0
- package/dist/spam/providers/hcaptcha.js.map +1 -0
- package/dist/spam/providers/recaptcha.d.ts +23 -0
- package/dist/spam/providers/recaptcha.js +23 -0
- package/dist/spam/providers/recaptcha.js.map +1 -0
- package/dist/spam/providers/siteverify.js +34 -0
- package/dist/spam/providers/siteverify.js.map +1 -0
- package/dist/spam/providers/turnstile.d.ts +17 -0
- package/dist/spam/providers/turnstile.js +18 -0
- package/dist/spam/providers/turnstile.js.map +1 -0
- package/dist/spam/resolveSpam.js +2 -1
- package/dist/spam/resolveSpam.js.map +1 -1
- package/dist/spam/spamGuard.js +25 -11
- package/dist/spam/spamGuard.js.map +1 -1
- package/dist/spam/types.d.ts +19 -4
- package/dist/submissions/SubmissionAnswers.js +6 -2
- package/dist/submissions/SubmissionAnswers.js.map +1 -1
- package/dist/submissions/SubmissionAnswersClient.js +100 -64
- package/dist/submissions/SubmissionAnswersClient.js.map +1 -1
- package/dist/submissions/coerceBoolean.js +14 -0
- package/dist/submissions/coerceBoolean.js.map +1 -0
- package/dist/submissions/createSubmission.d.ts +36 -0
- package/dist/submissions/createSubmission.js +26 -0
- package/dist/submissions/createSubmission.js.map +1 -0
- package/dist/submissions/formIdOf.js +13 -0
- package/dist/submissions/formIdOf.js.map +1 -0
- package/dist/submissions/resolveVotedSubmission.d.ts +27 -0
- package/dist/submissions/resolveVotedSubmission.js +51 -0
- package/dist/submissions/resolveVotedSubmission.js.map +1 -0
- package/dist/submissions/runSubmission.d.ts +10 -0
- package/dist/submissions/runSubmission.js +104 -54
- package/dist/submissions/runSubmission.js.map +1 -1
- package/dist/submissions/types.d.ts +11 -4
- package/dist/submissions/validateSubmission.js +99 -13
- package/dist/submissions/validateSubmission.js.map +1 -1
- package/dist/submissions/verifyContext.js +35 -0
- package/dist/submissions/verifyContext.js.map +1 -0
- package/dist/submissions/voteChangeEndpoint.js +105 -0
- package/dist/submissions/voteChangeEndpoint.js.map +1 -0
- package/dist/submissions/votedCookie.d.ts +15 -0
- package/dist/submissions/votedCookie.js +74 -0
- package/dist/submissions/votedCookie.js.map +1 -0
- package/dist/translations/clientRuntimeKeys.d.ts +17 -0
- package/dist/translations/clientRuntimeKeys.js +48 -0
- package/dist/translations/clientRuntimeKeys.js.map +1 -0
- package/dist/translations/de.d.ts +12 -0
- package/dist/translations/de.js +380 -0
- package/dist/translations/de.js.map +1 -0
- package/dist/translations/en.js +250 -28
- package/dist/translations/en.js.map +1 -1
- package/dist/translations/index.d.ts +14 -5
- package/dist/translations/index.js +14 -3
- package/dist/translations/index.js.map +1 -1
- package/dist/translations/keys.d.ts +245 -23
- package/dist/translations/keys.js +246 -24
- package/dist/translations/keys.js.map +1 -1
- package/dist/translations/makeTranslate.d.ts +7 -3
- package/dist/translations/makeTranslate.js +12 -3
- package/dist/translations/makeTranslate.js.map +1 -1
- package/dist/translations/server.js +8 -1
- package/dist/translations/server.js.map +1 -1
- package/dist/uploads/captureFileRef.d.ts +10 -3
- package/dist/uploads/captureFileRef.js +18 -9
- package/dist/uploads/captureFileRef.js.map +1 -1
- package/dist/uploads/formatBytes.d.ts +9 -0
- package/dist/uploads/formatBytes.js +25 -0
- package/dist/uploads/formatBytes.js.map +1 -0
- package/dist/uploads/resolveFileRef.js +3 -2
- package/dist/uploads/resolveFileRef.js.map +1 -1
- package/dist/uploads/types.d.ts +1 -2
- package/dist/validation/buildRuleBlocks.js +18 -17
- package/dist/validation/buildRuleBlocks.js.map +1 -1
- package/dist/validation/builtin/email.js +2 -1
- package/dist/validation/builtin/email.js.map +1 -1
- package/dist/validation/builtin/index.d.ts +14 -0
- package/dist/validation/builtin/index.js +14 -1
- package/dist/validation/builtin/index.js.map +1 -1
- package/dist/validation/builtin/integer.js +15 -0
- package/dist/validation/builtin/integer.js.map +1 -0
- package/dist/validation/builtin/matchesField.js +3 -7
- package/dist/validation/builtin/matchesField.js.map +1 -1
- package/dist/validation/builtin/max.js +1 -0
- package/dist/validation/builtin/max.js.map +1 -1
- package/dist/validation/builtin/maxDate.js +24 -0
- package/dist/validation/builtin/maxDate.js.map +1 -0
- package/dist/validation/builtin/maxLength.js +1 -0
- package/dist/validation/builtin/maxLength.js.map +1 -1
- package/dist/validation/builtin/min.js +1 -0
- package/dist/validation/builtin/min.js.map +1 -1
- package/dist/validation/builtin/minDate.js +24 -0
- package/dist/validation/builtin/minDate.js.map +1 -0
- package/dist/validation/builtin/minLength.js +1 -0
- package/dist/validation/builtin/minLength.js.map +1 -1
- package/dist/validation/builtin/notAlreadySubmitted.js +5 -1
- package/dist/validation/builtin/notAlreadySubmitted.js.map +1 -1
- package/dist/validation/builtin/oneOf.js +1 -0
- package/dist/validation/builtin/oneOf.js.map +1 -1
- package/dist/validation/builtin/pattern.js +11 -2
- package/dist/validation/builtin/pattern.js.map +1 -1
- package/dist/validation/builtin/url.js +1 -0
- package/dist/validation/builtin/url.js.map +1 -1
- package/dist/validation/builtin/validateDateBound.js +18 -0
- package/dist/validation/builtin/validateDateBound.js.map +1 -0
- package/dist/validation/builtin/validateRegexParams.js +44 -0
- package/dist/validation/builtin/validateRegexParams.js.map +1 -0
- package/dist/validation/emailPattern.js +10 -0
- package/dist/validation/emailPattern.js.map +1 -0
- package/dist/validation/fieldTargetParam.d.ts +22 -0
- package/dist/validation/fieldTargetParam.js +38 -0
- package/dist/validation/fieldTargetParam.js.map +1 -0
- package/dist/validation/registry.d.ts +2 -1
- package/dist/validation/registry.js +2 -9
- package/dist/validation/registry.js.map +1 -1
- package/dist/validation/runValidation.js +8 -29
- package/dist/validation/runValidation.js.map +1 -1
- package/dist/validation/types.d.ts +5 -11
- package/dist/validation/validateUrl.js +22 -0
- package/dist/validation/validateUrl.js.map +1 -0
- package/package.json +14 -6
- package/styles/form-builder.css +94 -190
- package/dist/collections/uploads.d.ts +0 -30
- package/dist/collections/uploads.js +0 -55
- package/dist/collections/uploads.js.map +0 -1
- package/dist/consent/buildConsentSourceConfig.js +0 -49
- package/dist/consent/buildConsentSourceConfig.js.map +0 -1
- package/dist/consent/builtin/index.d.ts +0 -7
- package/dist/consent/builtin/index.js +0 -11
- package/dist/consent/builtin/index.js.map +0 -1
- package/dist/consent/builtin/pageReference.js +0 -75
- package/dist/consent/builtin/pageReference.js.map +0 -1
- package/dist/consent/builtin/static.js +0 -44
- package/dist/consent/builtin/static.js.map +0 -1
- package/dist/consent/defineConsentSource.d.ts +0 -35
- package/dist/consent/defineConsentSource.js +0 -6
- package/dist/consent/defineConsentSource.js.map +0 -1
- package/dist/consent/registry.d.ts +0 -16
- package/dist/consent/registry.js +0 -16
- package/dist/consent/registry.js.map +0 -1
- package/dist/consent/resolveConsentLinks.d.ts +0 -19
- package/dist/consent/resolveConsentLinks.js +0 -26
- package/dist/consent/resolveConsentLinks.js.map +0 -1
- package/dist/presentations/registry.d.ts +0 -15
- package/dist/presentations/registry.js +0 -15
- package/dist/presentations/registry.js.map +0 -1
- package/dist/react/toFormDocument.d.ts +0 -24
- package/dist/react/toFormDocument.js +0 -22
- package/dist/react/toFormDocument.js.map +0 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { keys } from "../../translations/keys.js";
|
|
2
|
+
import { asTranslate } from "../../translations/server.js";
|
|
3
|
+
import { isValidCalendarDate } from "../../fields/builtin/date.js";
|
|
4
|
+
//#region src/validation/builtin/validateDateBound.ts
|
|
5
|
+
/**
|
|
6
|
+
* Field-level `validate` for a minDate/maxDate rule's bound param: an unset bound is tolerated
|
|
7
|
+
* (the rule itself already treats a missing bound as pass-through), otherwise it must be a real
|
|
8
|
+
* `YYYY-MM-DD` calendar date so the rule's string comparison against submitted values is meaningful.
|
|
9
|
+
* Exported for unit testing.
|
|
10
|
+
*/
|
|
11
|
+
const validateDateBound = (value, { req }) => {
|
|
12
|
+
if (typeof value !== "string" || value === "") return true;
|
|
13
|
+
return isValidCalendarDate(value) ? true : asTranslate(req.t)(keys.validationDate);
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
export { validateDateBound };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=validateDateBound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateDateBound.js","names":[],"sources":["../../../src/validation/builtin/validateDateBound.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\nimport { isValidCalendarDate } from '../../fields/builtin/date'\nimport { keys } from '../../translations/keys'\nimport { asTranslate } from '../../translations/server'\n\n/**\n * Field-level `validate` for a minDate/maxDate rule's bound param: an unset bound is tolerated\n * (the rule itself already treats a missing bound as pass-through), otherwise it must be a real\n * `YYYY-MM-DD` calendar date so the rule's string comparison against submitted values is meaningful.\n * Exported for unit testing.\n */\nexport const validateDateBound = (\n\tvalue: unknown,\n\t{ req }: { data?: unknown; req: PayloadRequest }\n): string | true => {\n\tif (typeof value !== 'string' || value === '') {\n\t\treturn true\n\t}\n\treturn isValidCalendarDate(value) ? true : asTranslate(req.t)(keys.validationDate)\n}\n"],"mappings":";;;;;;;;;;AAWA,MAAa,qBACZ,OACA,EAAE,UACiB;CACnB,IAAI,OAAO,UAAU,YAAY,UAAU,IAC1C,OAAO;CAER,OAAO,oBAAoB,KAAK,IAAI,OAAO,YAAY,IAAI,CAAC,EAAE,KAAK,cAAc;AAClF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { keys } from "../../translations/keys.js";
|
|
2
|
+
import { asTranslate } from "../../translations/server.js";
|
|
3
|
+
//#region src/validation/builtin/validateRegexParams.ts
|
|
4
|
+
/** Compiles to `undefined` instead of throwing, so callers can branch on validity. */
|
|
5
|
+
const tryCompile = (pattern, flags) => {
|
|
6
|
+
try {
|
|
7
|
+
return new RegExp(pattern, flags);
|
|
8
|
+
} catch {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const flagsOf = (siblingData) => {
|
|
13
|
+
const flags = siblingData?.flags;
|
|
14
|
+
return typeof flags === "string" && flags !== "" ? flags : void 0;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Field-level `validate` for the pattern rule's `flags` param: an unset value is tolerated,
|
|
18
|
+
* otherwise the flag set must be one `RegExp` accepts (an empty source isolates flag validity
|
|
19
|
+
* from pattern validity, so the two params report their own errors).
|
|
20
|
+
* Exported for unit testing.
|
|
21
|
+
*/
|
|
22
|
+
const validateRegexFlags = (value, { req }) => {
|
|
23
|
+
if (typeof value !== "string" || value === "") return true;
|
|
24
|
+
return tryCompile("", value) ? true : asTranslate(req.t)(keys.validationRegexFlags);
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Field-level `validate` for the pattern rule's `pattern` param. The rule itself fails open on an
|
|
28
|
+
* uncompilable pattern so a bad regex can never break the submit path, which would otherwise let an
|
|
29
|
+
* author save a rule that silently never fires; this catches it at authoring time instead.
|
|
30
|
+
*
|
|
31
|
+
* Compiled against the sibling `flags` because flags decide validity (`\p{Foo}` is a literal
|
|
32
|
+
* without `u` and a syntax error with it). Invalid flags are ignored here and left to
|
|
33
|
+
* `validateRegexFlags`, so a flag typo reports once, on the field that owns it.
|
|
34
|
+
* Exported for unit testing.
|
|
35
|
+
*/
|
|
36
|
+
const validateRegexPattern = (value, { req, siblingData }) => {
|
|
37
|
+
if (typeof value !== "string" || value === "") return true;
|
|
38
|
+
const flags = flagsOf(siblingData);
|
|
39
|
+
return tryCompile(value, flags && tryCompile("", flags) ? flags : void 0) ? true : asTranslate(req.t)(keys.validationRegexPattern);
|
|
40
|
+
};
|
|
41
|
+
//#endregion
|
|
42
|
+
export { validateRegexFlags, validateRegexPattern };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=validateRegexParams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateRegexParams.js","names":[],"sources":["../../../src/validation/builtin/validateRegexParams.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\nimport { keys } from '../../translations/keys'\nimport { asTranslate } from '../../translations/server'\n\n/** Compiles to `undefined` instead of throwing, so callers can branch on validity. */\nconst tryCompile = (pattern: string, flags?: string): RegExp | undefined => {\n\ttry {\n\t\treturn new RegExp(pattern, flags)\n\t} catch {\n\t\treturn undefined\n\t}\n}\n\nconst flagsOf = (siblingData: unknown): string | undefined => {\n\tconst flags = (siblingData as { flags?: unknown } | undefined)?.flags\n\treturn typeof flags === 'string' && flags !== '' ? flags : undefined\n}\n\n/**\n * Field-level `validate` for the pattern rule's `flags` param: an unset value is tolerated,\n * otherwise the flag set must be one `RegExp` accepts (an empty source isolates flag validity\n * from pattern validity, so the two params report their own errors).\n * Exported for unit testing.\n */\nexport const validateRegexFlags = (\n\tvalue: unknown,\n\t{ req }: { req: PayloadRequest; siblingData?: unknown }\n): string | true => {\n\tif (typeof value !== 'string' || value === '') {\n\t\treturn true\n\t}\n\treturn tryCompile('', value) ? true : asTranslate(req.t)(keys.validationRegexFlags)\n}\n\n/**\n * Field-level `validate` for the pattern rule's `pattern` param. The rule itself fails open on an\n * uncompilable pattern so a bad regex can never break the submit path, which would otherwise let an\n * author save a rule that silently never fires; this catches it at authoring time instead.\n *\n * Compiled against the sibling `flags` because flags decide validity (`\\p{Foo}` is a literal\n * without `u` and a syntax error with it). Invalid flags are ignored here and left to\n * `validateRegexFlags`, so a flag typo reports once, on the field that owns it.\n * Exported for unit testing.\n */\nexport const validateRegexPattern = (\n\tvalue: unknown,\n\t{ req, siblingData }: { req: PayloadRequest; siblingData?: unknown }\n): string | true => {\n\tif (typeof value !== 'string' || value === '') {\n\t\treturn true\n\t}\n\tconst flags = flagsOf(siblingData)\n\tconst effectiveFlags = flags && tryCompile('', flags) ? flags : undefined\n\treturn tryCompile(value, effectiveFlags) ? true : asTranslate(req.t)(keys.validationRegexPattern)\n}\n"],"mappings":";;;;AAKA,MAAM,cAAc,SAAiB,UAAuC;CAC3E,IAAI;EACH,OAAO,IAAI,OAAO,SAAS,KAAK;CACjC,QAAQ;EACP;CACD;AACD;AAEA,MAAM,WAAW,gBAA6C;CAC7D,MAAM,QAAS,aAAiD;CAChE,OAAO,OAAO,UAAU,YAAY,UAAU,KAAK,QAAQ,KAAA;AAC5D;;;;;;;AAQA,MAAa,sBACZ,OACA,EAAE,UACiB;CACnB,IAAI,OAAO,UAAU,YAAY,UAAU,IAC1C,OAAO;CAER,OAAO,WAAW,IAAI,KAAK,IAAI,OAAO,YAAY,IAAI,CAAC,EAAE,KAAK,oBAAoB;AACnF;;;;;;;;;;;AAYA,MAAa,wBACZ,OACA,EAAE,KAAK,kBACY;CACnB,IAAI,OAAO,UAAU,YAAY,UAAU,IAC1C,OAAO;CAER,MAAM,QAAQ,QAAQ,WAAW;CAEjC,OAAO,WAAW,OADK,SAAS,WAAW,IAAI,KAAK,IAAI,QAAQ,KAAA,CACzB,IAAI,OAAO,YAAY,IAAI,CAAC,EAAE,KAAK,sBAAsB;AACjG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/validation/emailPattern.ts
|
|
2
|
+
/**
|
|
3
|
+
* The email-format check shared by the `email` field type and the `email` validation rule, so the
|
|
4
|
+
* two never drift. A pragmatic "one @, one dot, no spaces" test, not a full RFC 5322 grammar.
|
|
5
|
+
*/
|
|
6
|
+
const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { EMAIL_PATTERN };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=emailPattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emailPattern.js","names":[],"sources":["../../src/validation/emailPattern.ts"],"sourcesContent":["/**\n * The email-format check shared by the `email` field type and the `email` validation rule, so the\n * two never drift. A pragmatic \"one @, one dot, no spaces\" test, not a full RFC 5322 grammar.\n */\nexport const EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n"],"mappings":";;;;;AAIA,MAAa,gBAAgB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TranslationKey } from "../translations/keys.js";
|
|
2
|
+
import { Field } from "payload";
|
|
3
|
+
|
|
4
|
+
//#region src/validation/fieldTargetParam.d.ts
|
|
5
|
+
type FieldTargetParamOptions = {
|
|
6
|
+
/** Field label; defaults to the shared `Field name` key. */label?: TranslationKey; /** Whether a target must be chosen; defaults to `true`. */
|
|
7
|
+
required?: boolean; /** Restrict the picker (and the save-time check) to these field-type slugs; omit for every field. */
|
|
8
|
+
types?: string[]; /** Optional description shown under the picker, resolved client-side from this key. */
|
|
9
|
+
description?: TranslationKey;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* A rule/action param that targets another field on the same form by name. Stores the field name as a
|
|
13
|
+
* plain text value (no data migration), but authors it with the `FieldNameSelect` picker and enforces
|
|
14
|
+
* a save-time existence check so a name that no longer resolves (typically because the field was
|
|
15
|
+
* removed) is a save error rather than a silently dead reference. The picker options and this check
|
|
16
|
+
* read the same name set from `fieldNamesOfType`/`fieldNames`, so they cannot drift. Reusable by
|
|
17
|
+
* custom rules via the package's public export.
|
|
18
|
+
*/
|
|
19
|
+
declare const fieldTargetParam: (name: string, opts?: FieldTargetParamOptions) => Field;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { FieldTargetParamOptions, fieldTargetParam };
|
|
22
|
+
//# sourceMappingURL=fieldTargetParam.d.ts.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { fieldNames, fieldNamesOfType } from "../fields/fieldNamesOfType.js";
|
|
2
|
+
import { keys } from "../translations/keys.js";
|
|
3
|
+
import { asTranslate, labelFor } from "../translations/server.js";
|
|
4
|
+
//#region src/validation/fieldTargetParam.ts
|
|
5
|
+
const FIELD_NAME_SELECT_REF = "@10x-media/form-builder/client#FieldNameSelect";
|
|
6
|
+
/**
|
|
7
|
+
* A rule/action param that targets another field on the same form by name. Stores the field name as a
|
|
8
|
+
* plain text value (no data migration), but authors it with the `FieldNameSelect` picker and enforces
|
|
9
|
+
* a save-time existence check so a name that no longer resolves (typically because the field was
|
|
10
|
+
* removed) is a save error rather than a silently dead reference. The picker options and this check
|
|
11
|
+
* read the same name set from `fieldNamesOfType`/`fieldNames`, so they cannot drift. Reusable by
|
|
12
|
+
* custom rules via the package's public export.
|
|
13
|
+
*/
|
|
14
|
+
const fieldTargetParam = (name, opts) => {
|
|
15
|
+
const types = opts?.types;
|
|
16
|
+
return {
|
|
17
|
+
name,
|
|
18
|
+
type: "text",
|
|
19
|
+
required: opts?.required ?? true,
|
|
20
|
+
label: labelFor(opts?.label ?? keys.ruleParamField),
|
|
21
|
+
admin: { components: { Field: {
|
|
22
|
+
path: FIELD_NAME_SELECT_REF,
|
|
23
|
+
clientProps: {
|
|
24
|
+
types,
|
|
25
|
+
...opts?.description ? { descriptionKey: opts.description } : {}
|
|
26
|
+
}
|
|
27
|
+
} } },
|
|
28
|
+
validate: (value, { data, req }) => {
|
|
29
|
+
if (typeof value !== "string" || value.length === 0) return true;
|
|
30
|
+
const fields = data && typeof data === "object" ? data.fields : void 0;
|
|
31
|
+
return (types ? fieldNamesOfType(fields, types) : fieldNames(fields)).includes(value) ? true : asTranslate(req.t)(keys.ruleFieldTargetInvalid);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
//#endregion
|
|
36
|
+
export { fieldTargetParam };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=fieldTargetParam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldTargetParam.js","names":[],"sources":["../../src/validation/fieldTargetParam.ts"],"sourcesContent":["import type { Field, PayloadRequest } from 'payload'\nimport { fieldNames, fieldNamesOfType } from '../fields/fieldNamesOfType'\nimport { keys, type TranslationKey } from '../translations/keys'\nimport { asTranslate, labelFor } from '../translations/server'\n\nconst FIELD_NAME_SELECT_REF = '@10x-media/form-builder/client#FieldNameSelect'\n\nexport type FieldTargetParamOptions = {\n\t/** Field label; defaults to the shared `Field name` key. */\n\tlabel?: TranslationKey\n\t/** Whether a target must be chosen; defaults to `true`. */\n\trequired?: boolean\n\t/** Restrict the picker (and the save-time check) to these field-type slugs; omit for every field. */\n\ttypes?: string[]\n\t/** Optional description shown under the picker, resolved client-side from this key. */\n\tdescription?: TranslationKey\n}\n\n/**\n * A rule/action param that targets another field on the same form by name. Stores the field name as a\n * plain text value (no data migration), but authors it with the `FieldNameSelect` picker and enforces\n * a save-time existence check so a name that no longer resolves (typically because the field was\n * removed) is a save error rather than a silently dead reference. The picker options and this check\n * read the same name set from `fieldNamesOfType`/`fieldNames`, so they cannot drift. Reusable by\n * custom rules via the package's public export.\n */\nexport const fieldTargetParam = (name: string, opts?: FieldTargetParamOptions): Field => {\n\tconst types = opts?.types\n\treturn {\n\t\tname,\n\t\ttype: 'text',\n\t\trequired: opts?.required ?? true,\n\t\tlabel: labelFor(opts?.label ?? keys.ruleParamField),\n\t\tadmin: {\n\t\t\tcomponents: {\n\t\t\t\tField: {\n\t\t\t\t\tpath: FIELD_NAME_SELECT_REF,\n\t\t\t\t\tclientProps: {\n\t\t\t\t\t\ttypes,\n\t\t\t\t\t\t...(opts?.description ? { descriptionKey: opts.description } : {}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tvalidate: (value: unknown, { data, req }: { data?: unknown; req: PayloadRequest }) => {\n\t\t\tif (typeof value !== 'string' || value.length === 0) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tconst fields =\n\t\t\t\tdata && typeof data === 'object' ? (data as Record<string, unknown>).fields : undefined\n\t\t\tconst names = types ? fieldNamesOfType(fields, types) : fieldNames(fields)\n\t\t\treturn names.includes(value) ? true : asTranslate(req.t)(keys.ruleFieldTargetInvalid)\n\t\t},\n\t}\n}\n"],"mappings":";;;;AAKA,MAAM,wBAAwB;;;;;;;;;AAqB9B,MAAa,oBAAoB,MAAc,SAA0C;CACxF,MAAM,QAAQ,MAAM;CACpB,OAAO;EACN;EACA,MAAM;EACN,UAAU,MAAM,YAAY;EAC5B,OAAO,SAAS,MAAM,SAAS,KAAK,cAAc;EAClD,OAAO,EACN,YAAY,EACX,OAAO;GACN,MAAM;GACN,aAAa;IACZ;IACA,GAAI,MAAM,cAAc,EAAE,gBAAgB,KAAK,YAAY,IAAI,CAAC;GACjE;EACD,EACD,EACD;EACA,WAAW,OAAgB,EAAE,MAAM,UAAmD;GACrF,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GACjD,OAAO;GAER,MAAM,SACL,QAAQ,OAAO,SAAS,WAAY,KAAiC,SAAS,KAAA;GAE/E,QADc,QAAQ,iBAAiB,QAAQ,KAAK,IAAI,WAAW,MAAM,GAC5D,SAAS,KAAK,IAAI,OAAO,YAAY,IAAI,CAAC,EAAE,KAAK,sBAAsB;EACrF;CACD;AACD"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { RegistryConfig } from "../plugin/applyRegistryConfig.js";
|
|
1
2
|
import { AnyValidationRuleDefinition } from "./types.js";
|
|
2
3
|
|
|
3
4
|
//#region src/validation/registry.d.ts
|
|
4
5
|
type ValidationRuleRegistry = Map<string, AnyValidationRuleDefinition>;
|
|
5
6
|
/** Per-rule opt-in: `false` removes a built-in, `true` keeps it, an object adds a new rule or replaces one. */
|
|
6
7
|
type ValidationRuleOption = boolean | AnyValidationRuleDefinition;
|
|
7
|
-
type ValidationRulesConfig =
|
|
8
|
+
type ValidationRulesConfig = RegistryConfig<AnyValidationRuleDefinition>;
|
|
8
9
|
//#endregion
|
|
9
10
|
export { ValidationRuleOption, ValidationRuleRegistry, ValidationRulesConfig };
|
|
10
11
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { applyRegistryConfig } from "../plugin/applyRegistryConfig.js";
|
|
1
2
|
//#region src/validation/registry.ts
|
|
2
3
|
const buildRuleRegistry = (rules) => {
|
|
3
4
|
const registry = /* @__PURE__ */ new Map();
|
|
@@ -5,15 +6,7 @@ const buildRuleRegistry = (rules) => {
|
|
|
5
6
|
return registry;
|
|
6
7
|
};
|
|
7
8
|
/** Resolve the active rule registry from the built-in defaults and the plugin `rules` option. */
|
|
8
|
-
const resolveValidationRules = (defaults, config = {}) =>
|
|
9
|
-
const registry = buildRuleRegistry(defaults);
|
|
10
|
-
for (const [type, option] of Object.entries(config)) if (option === false) registry.delete(type);
|
|
11
|
-
else if (option === true) {} else registry.set(type, {
|
|
12
|
-
...option,
|
|
13
|
-
type
|
|
14
|
-
});
|
|
15
|
-
return registry;
|
|
16
|
-
};
|
|
9
|
+
const resolveValidationRules = (defaults, config = {}) => applyRegistryConfig(buildRuleRegistry(defaults), config);
|
|
17
10
|
//#endregion
|
|
18
11
|
export { buildRuleRegistry, resolveValidationRules };
|
|
19
12
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","names":[],"sources":["../../src/validation/registry.ts"],"sourcesContent":["import type { AnyValidationRuleDefinition } from './types'\n\nexport type ValidationRuleRegistry = Map<string, AnyValidationRuleDefinition>\n\n/** Per-rule opt-in: `false` removes a built-in, `true` keeps it, an object adds a new rule or replaces one. */\nexport type ValidationRuleOption = boolean | AnyValidationRuleDefinition\n\nexport type ValidationRulesConfig =
|
|
1
|
+
{"version":3,"file":"registry.js","names":[],"sources":["../../src/validation/registry.ts"],"sourcesContent":["import { applyRegistryConfig, type RegistryConfig } from '../plugin/applyRegistryConfig'\nimport type { AnyValidationRuleDefinition } from './types'\n\nexport type ValidationRuleRegistry = Map<string, AnyValidationRuleDefinition>\n\n/** Per-rule opt-in: `false` removes a built-in, `true` keeps it, an object adds a new rule or replaces one. */\nexport type ValidationRuleOption = boolean | AnyValidationRuleDefinition\n\nexport type ValidationRulesConfig = RegistryConfig<AnyValidationRuleDefinition>\n\nexport const buildRuleRegistry = (rules: AnyValidationRuleDefinition[]): ValidationRuleRegistry => {\n\tconst registry: ValidationRuleRegistry = new Map()\n\tfor (const rule of rules) {\n\t\tregistry.set(rule.type, rule)\n\t}\n\treturn registry\n}\n\n/** Resolve the active rule registry from the built-in defaults and the plugin `rules` option. */\nexport const resolveValidationRules = (\n\tdefaults: AnyValidationRuleDefinition[],\n\tconfig: ValidationRulesConfig = {}\n): ValidationRuleRegistry => applyRegistryConfig(buildRuleRegistry(defaults), config)\n"],"mappings":";;AAUA,MAAa,qBAAqB,UAAiE;CAClG,MAAM,2BAAmC,IAAI,IAAI;CACjD,KAAK,MAAM,QAAQ,OAClB,SAAS,IAAI,KAAK,MAAM,IAAI;CAE7B,OAAO;AACR;;AAGA,MAAa,0BACZ,UACA,SAAgC,CAAC,MACL,oBAAoB,kBAAkB,QAAQ,GAAG,MAAM"}
|
|
@@ -5,39 +5,25 @@ const RULE_TIMEOUT_MS = 5e3;
|
|
|
5
5
|
const isEmpty = (value) => value == null || value === "" || Array.isArray(value) && value.length === 0;
|
|
6
6
|
/** Build the per-instance message resolver: custom override (a literal template) or the localized default. */
|
|
7
7
|
const makeMessage = (instance, defaultMessageKey, t) => {
|
|
8
|
-
const { blockType: _blockType, message: _message,
|
|
8
|
+
const { blockType: _blockType, message: _message, ...params } = instance;
|
|
9
9
|
const template = typeof instance.message === "string" && instance.message.length > 0 ? instance.message : t(defaultMessageKey);
|
|
10
10
|
return (vars = {}) => resolveMessage(template, {
|
|
11
11
|
...params,
|
|
12
12
|
...vars
|
|
13
13
|
});
|
|
14
14
|
};
|
|
15
|
-
const toIssue = (result, fallbackSeverity) => {
|
|
16
|
-
if (result === true) return null;
|
|
17
|
-
if (typeof result === "string") return {
|
|
18
|
-
message: result,
|
|
19
|
-
severity: fallbackSeverity
|
|
20
|
-
};
|
|
21
|
-
return {
|
|
22
|
-
message: result.message,
|
|
23
|
-
severity: result.severity ?? fallbackSeverity
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
15
|
/**
|
|
27
16
|
* The one validation engine, run per field on client and server. Order: required, the field type's
|
|
28
17
|
* intrinsic validator, then each declarative rule instance. Server-only rules are skipped in client
|
|
29
18
|
* mode; every rule is wrapped in try/catch + a timeout so a bad rule cannot crash or stall the submit
|
|
30
|
-
* path (a thrown or timed-out rule fails open, logged on the server).
|
|
31
|
-
*
|
|
19
|
+
* path (a thrown or timed-out rule fails open, logged on the server). Every returned message is a
|
|
20
|
+
* blocking error.
|
|
32
21
|
*/
|
|
33
22
|
const runValidation = async (input) => {
|
|
34
23
|
const { field, fieldDefinition, value, fieldType, ruleRegistry, answers, locale, t, operation, event, mode, req, payload, formId, timeoutMs } = input;
|
|
35
24
|
const timeout = timeoutMs ?? RULE_TIMEOUT_MS;
|
|
36
25
|
const errors = [];
|
|
37
|
-
if (field.required && isEmpty(value)) return { errors: [
|
|
38
|
-
message: t(keys.validationRequired),
|
|
39
|
-
severity: "error"
|
|
40
|
-
}] };
|
|
26
|
+
if (field.required && isEmpty(value)) return { errors: [t(keys.validationRequired)] };
|
|
41
27
|
if (isEmpty(value) && field.blockType !== "repeater") return { errors: [] };
|
|
42
28
|
if (fieldDefinition?.validate) try {
|
|
43
29
|
const ran = fieldDefinition.validate({
|
|
@@ -49,10 +35,7 @@ const runValidation = async (input) => {
|
|
|
49
35
|
t
|
|
50
36
|
});
|
|
51
37
|
const result = ran instanceof Promise ? await withTimeout(ran, timeout, true) : ran;
|
|
52
|
-
if (result !== true) errors.push(
|
|
53
|
-
message: result,
|
|
54
|
-
severity: "error"
|
|
55
|
-
});
|
|
38
|
+
if (result !== true) errors.push(result);
|
|
56
39
|
} catch (error) {
|
|
57
40
|
req?.payload?.logger?.error?.({
|
|
58
41
|
err: error,
|
|
@@ -61,10 +44,7 @@ const runValidation = async (input) => {
|
|
|
61
44
|
}
|
|
62
45
|
if (fieldDefinition?.schema) try {
|
|
63
46
|
const outcome = await fieldDefinition.schema["~standard"].validate(value);
|
|
64
|
-
if (outcome.issues) for (const issue of outcome.issues) errors.push(
|
|
65
|
-
message: issue.message,
|
|
66
|
-
severity: "error"
|
|
67
|
-
});
|
|
47
|
+
if (outcome.issues) for (const issue of outcome.issues) errors.push(issue.message);
|
|
68
48
|
} catch (error) {
|
|
69
49
|
req?.payload?.logger?.error?.({
|
|
70
50
|
err: error,
|
|
@@ -77,7 +57,6 @@ const runValidation = async (input) => {
|
|
|
77
57
|
if (!rule) continue;
|
|
78
58
|
if (mode === "client" && rule.client === false) continue;
|
|
79
59
|
const message = makeMessage(instance, rule.defaultMessage, t);
|
|
80
|
-
const fallbackSeverity = instance.severity ?? rule.severity ?? "error";
|
|
81
60
|
try {
|
|
82
61
|
const ran = rule.validate({
|
|
83
62
|
value,
|
|
@@ -94,8 +73,8 @@ const runValidation = async (input) => {
|
|
|
94
73
|
payload: mode === "server" ? payload : void 0,
|
|
95
74
|
formId: mode === "server" ? formId : void 0
|
|
96
75
|
});
|
|
97
|
-
const
|
|
98
|
-
if (
|
|
76
|
+
const result = ran instanceof Promise ? await withTimeout(ran, timeout, true) : ran;
|
|
77
|
+
if (result !== true) errors.push(result);
|
|
99
78
|
} catch (error) {
|
|
100
79
|
req?.payload?.logger?.error?.({
|
|
101
80
|
err: error,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runValidation.js","names":[],"sources":["../../src/validation/runValidation.ts"],"sourcesContent":["import type { Payload, PayloadRequest } from 'payload'\nimport type { AnyFormFieldDefinition, Translate } from '../fields/types'\nimport type { FormFieldInstance } from '../submissions/types'\nimport { keys } from '../translations/keys'\nimport { resolveMessage, withTimeout } from './message'\nimport type { ValidationRuleRegistry } from './registry'\nimport type { MessageFn
|
|
1
|
+
{"version":3,"file":"runValidation.js","names":[],"sources":["../../src/validation/runValidation.ts"],"sourcesContent":["import type { Payload, PayloadRequest } from 'payload'\nimport type { AnyFormFieldDefinition, Translate } from '../fields/types'\nimport type { FormFieldInstance } from '../submissions/types'\nimport { keys } from '../translations/keys'\nimport { resolveMessage, withTimeout } from './message'\nimport type { ValidationRuleRegistry } from './registry'\nimport type { MessageFn } from './types'\n\nconst RULE_TIMEOUT_MS = 5000\n\nexport type RunValidationInput = {\n\tfield: FormFieldInstance\n\tfieldDefinition?: AnyFormFieldDefinition\n\tvalue: unknown\n\tfieldType: string\n\truleRegistry: ValidationRuleRegistry\n\tanswers: Record<string, unknown>\n\tlocale: string\n\tt: Translate\n\toperation: 'create' | 'update'\n\tevent: 'onChange' | 'submit'\n\tmode: 'client' | 'server'\n\treq?: PayloadRequest\n\tpayload?: Payload\n\tformId?: number | string\n\t/** Override the per-rule timeout in ms. Defaults to RULE_TIMEOUT_MS; primarily for tests. */\n\ttimeoutMs?: number\n}\n\nexport type RunValidationResult = { errors: string[] }\n\nconst isEmpty = (value: unknown): boolean =>\n\tvalue == null || value === '' || (Array.isArray(value) && value.length === 0)\n\ntype RuleInstance = { blockType: string; message?: string } & Record<string, unknown>\n\n/** Build the per-instance message resolver: custom override (a literal template) or the localized default. */\nconst makeMessage = (\n\tinstance: RuleInstance,\n\tdefaultMessageKey: string,\n\tt: Translate\n): MessageFn => {\n\tconst { blockType: _blockType, message: _message, ...params } = instance\n\tconst template =\n\t\ttypeof instance.message === 'string' && instance.message.length > 0\n\t\t\t? instance.message\n\t\t\t: t(defaultMessageKey)\n\treturn (vars = {}) => resolveMessage(template, { ...params, ...vars })\n}\n\n/**\n * The one validation engine, run per field on client and server. Order: required, the field type's\n * intrinsic validator, then each declarative rule instance. Server-only rules are skipped in client\n * mode; every rule is wrapped in try/catch + a timeout so a bad rule cannot crash or stall the submit\n * path (a thrown or timed-out rule fails open, logged on the server). Every returned message is a\n * blocking error.\n */\nexport const runValidation = async (input: RunValidationInput): Promise<RunValidationResult> => {\n\tconst {\n\t\tfield,\n\t\tfieldDefinition,\n\t\tvalue,\n\t\tfieldType,\n\t\truleRegistry,\n\t\tanswers,\n\t\tlocale,\n\t\tt,\n\t\toperation,\n\t\tevent,\n\t\tmode,\n\t\treq,\n\t\tpayload,\n\t\tformId,\n\t\ttimeoutMs,\n\t} = input\n\tconst timeout = timeoutMs ?? RULE_TIMEOUT_MS\n\tconst errors: string[] = []\n\n\tif (field.required && isEmpty(value)) {\n\t\treturn { errors: [t(keys.validationRequired)] }\n\t}\n\t// Repeaters coerced to [] must reach fieldDefinition.validate so minRows is enforced;\n\t// all other empty fields have no intrinsic rules to run.\n\tif (isEmpty(value) && field.blockType !== 'repeater') {\n\t\treturn { errors: [] }\n\t}\n\n\tif (fieldDefinition?.validate) {\n\t\ttry {\n\t\t\tconst ran = fieldDefinition.validate({\n\t\t\t\tvalue,\n\t\t\t\tconfig: field,\n\t\t\t\tsiblingData: answers,\n\t\t\t\tdata: answers,\n\t\t\t\tlocale,\n\t\t\t\tt,\n\t\t\t})\n\t\t\tconst result = ran instanceof Promise ? await withTimeout(ran, timeout, true) : ran\n\t\t\tif (result !== true) {\n\t\t\t\terrors.push(result)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treq?.payload?.logger?.error?.(\n\t\t\t\t{ err: error, field: field.name },\n\t\t\t\t'form-builder intrinsic field validator threw'\n\t\t\t)\n\t\t}\n\t}\n\n\tif (fieldDefinition?.schema) {\n\t\ttry {\n\t\t\tconst outcome = await fieldDefinition.schema['~standard'].validate(value)\n\t\t\tif (outcome.issues) {\n\t\t\t\tfor (const issue of outcome.issues) {\n\t\t\t\t\terrors.push(issue.message)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treq?.payload?.logger?.error?.(\n\t\t\t\t{ err: error, field: field.name },\n\t\t\t\t'form-builder field schema threw'\n\t\t\t)\n\t\t}\n\t}\n\n\tconst instances = (Array.isArray(field.validations) ? field.validations : []) as RuleInstance[]\n\tfor (const instance of instances) {\n\t\tconst rule = ruleRegistry.get(instance.blockType)\n\t\tif (!rule) {\n\t\t\tcontinue\n\t\t}\n\t\tif (mode === 'client' && rule.client === false) {\n\t\t\tcontinue\n\t\t}\n\t\tconst message = makeMessage(instance, rule.defaultMessage, t)\n\t\ttry {\n\t\t\tconst ran = rule.validate({\n\t\t\t\tvalue,\n\t\t\t\tparams: instance,\n\t\t\t\tsiblingData: answers,\n\t\t\t\tdata: answers,\n\t\t\t\tfield,\n\t\t\t\tfieldType,\n\t\t\t\toperation,\n\t\t\t\tevent,\n\t\t\t\tlocale,\n\t\t\t\tmessage,\n\t\t\t\treq: mode === 'server' ? req : undefined,\n\t\t\t\tpayload: mode === 'server' ? payload : undefined,\n\t\t\t\tformId: mode === 'server' ? formId : undefined,\n\t\t\t})\n\t\t\tconst result = ran instanceof Promise ? await withTimeout(ran, timeout, true) : ran\n\t\t\tif (result !== true) {\n\t\t\t\terrors.push(result)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treq?.payload?.logger?.error?.(\n\t\t\t\t{ err: error, rule: rule.type },\n\t\t\t\t'form-builder validation rule threw'\n\t\t\t)\n\t\t}\n\t}\n\n\treturn { errors }\n}\n"],"mappings":";;;AAQA,MAAM,kBAAkB;AAuBxB,MAAM,WAAW,UAChB,SAAS,QAAQ,UAAU,MAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;;AAK5E,MAAM,eACL,UACA,mBACA,MACe;CACf,MAAM,EAAE,WAAW,YAAY,SAAS,UAAU,GAAG,WAAW;CAChE,MAAM,WACL,OAAO,SAAS,YAAY,YAAY,SAAS,QAAQ,SAAS,IAC/D,SAAS,UACT,EAAE,iBAAiB;CACvB,QAAQ,OAAO,CAAC,MAAM,eAAe,UAAU;EAAE,GAAG;EAAQ,GAAG;CAAK,CAAC;AACtE;;;;;;;;AASA,MAAa,gBAAgB,OAAO,UAA4D;CAC/F,MAAM,EACL,OACA,iBACA,OACA,WACA,cACA,SACA,QACA,GACA,WACA,OACA,MACA,KACA,SACA,QACA,cACG;CACJ,MAAM,UAAU,aAAa;CAC7B,MAAM,SAAmB,CAAC;CAE1B,IAAI,MAAM,YAAY,QAAQ,KAAK,GAClC,OAAO,EAAE,QAAQ,CAAC,EAAE,KAAK,kBAAkB,CAAC,EAAE;CAI/C,IAAI,QAAQ,KAAK,KAAK,MAAM,cAAc,YACzC,OAAO,EAAE,QAAQ,CAAC,EAAE;CAGrB,IAAI,iBAAiB,UACpB,IAAI;EACH,MAAM,MAAM,gBAAgB,SAAS;GACpC;GACA,QAAQ;GACR,aAAa;GACb,MAAM;GACN;GACA;EACD,CAAC;EACD,MAAM,SAAS,eAAe,UAAU,MAAM,YAAY,KAAK,SAAS,IAAI,IAAI;EAChF,IAAI,WAAW,MACd,OAAO,KAAK,MAAM;CAEpB,SAAS,OAAO;EACf,KAAK,SAAS,QAAQ,QACrB;GAAE,KAAK;GAAO,OAAO,MAAM;EAAK,GAChC,8CACD;CACD;CAGD,IAAI,iBAAiB,QACpB,IAAI;EACH,MAAM,UAAU,MAAM,gBAAgB,OAAO,aAAa,SAAS,KAAK;EACxE,IAAI,QAAQ,QACX,KAAK,MAAM,SAAS,QAAQ,QAC3B,OAAO,KAAK,MAAM,OAAO;CAG5B,SAAS,OAAO;EACf,KAAK,SAAS,QAAQ,QACrB;GAAE,KAAK;GAAO,OAAO,MAAM;EAAK,GAChC,iCACD;CACD;CAGD,MAAM,YAAa,MAAM,QAAQ,MAAM,WAAW,IAAI,MAAM,cAAc,CAAC;CAC3E,KAAK,MAAM,YAAY,WAAW;EACjC,MAAM,OAAO,aAAa,IAAI,SAAS,SAAS;EAChD,IAAI,CAAC,MACJ;EAED,IAAI,SAAS,YAAY,KAAK,WAAW,OACxC;EAED,MAAM,UAAU,YAAY,UAAU,KAAK,gBAAgB,CAAC;EAC5D,IAAI;GACH,MAAM,MAAM,KAAK,SAAS;IACzB;IACA,QAAQ;IACR,aAAa;IACb,MAAM;IACN;IACA;IACA;IACA;IACA;IACA;IACA,KAAK,SAAS,WAAW,MAAM,KAAA;IAC/B,SAAS,SAAS,WAAW,UAAU,KAAA;IACvC,QAAQ,SAAS,WAAW,SAAS,KAAA;GACtC,CAAC;GACD,MAAM,SAAS,eAAe,UAAU,MAAM,YAAY,KAAK,SAAS,IAAI,IAAI;GAChF,IAAI,WAAW,MACd,OAAO,KAAK,MAAM;EAEpB,SAAS,OAAO;GACf,KAAK,SAAS,QAAQ,QACrB;IAAE,KAAK;IAAO,MAAM,KAAK;GAAK,GAC9B,oCACD;EACD;CACD;CAEA,OAAO,EAAE,OAAO;AACjB"}
|
|
@@ -2,12 +2,8 @@ import { FormFieldInstance } from "../submissions/types.js";
|
|
|
2
2
|
import { Field, Payload, PayloadRequest } from "payload";
|
|
3
3
|
|
|
4
4
|
//#region src/validation/types.d.ts
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
type ValidationRuleResult = true | string | {
|
|
8
|
-
message: string;
|
|
9
|
-
severity?: ValidationSeverity;
|
|
10
|
-
};
|
|
5
|
+
/** A rule outcome: pass (`true`) or a blocking error message. */
|
|
6
|
+
type ValidationRuleResult = true | string;
|
|
11
7
|
/** Resolves this rule instance's message (custom override or localized default) with `{var}` interpolation. */
|
|
12
8
|
type MessageFn = (vars?: Record<string, unknown>) => string;
|
|
13
9
|
/** Resolved per-instance rule params (loose at the DB boundary, narrowed by the author's generic). */
|
|
@@ -30,7 +26,7 @@ type ValidationRuleValidateArgs<TParams extends ValidationParams, TValue, TData
|
|
|
30
26
|
type ValidationRuleValidate<TParams extends ValidationParams, TValue, TData extends Record<string, unknown> = Record<string, unknown>> = (args: ValidationRuleValidateArgs<TParams, TValue, TData>) => Promise<ValidationRuleResult> | ValidationRuleResult;
|
|
31
27
|
/**
|
|
32
28
|
* A validation rule type, authored once. `params` is a Payload `Field[]` rendered in the per-field
|
|
33
|
-
* constraint list; `validate` returns `true | string
|
|
29
|
+
* constraint list; `validate` returns `true | string`. `client` defaults from
|
|
34
30
|
* whether the rule is pure (a rule that is async or uses `req`/`payload` must set `client: false`).
|
|
35
31
|
*/
|
|
36
32
|
type ValidationRuleDefinition<TParams extends ValidationParams = ValidationParams, TValue = unknown, TData extends Record<string, unknown> = Record<string, unknown>> = {
|
|
@@ -40,8 +36,7 @@ type ValidationRuleDefinition<TParams extends ValidationParams = ValidationParam
|
|
|
40
36
|
appliesTo?: string[];
|
|
41
37
|
params?: Field[];
|
|
42
38
|
defaultMessage: string; /** Runs client-side too. Defaults to `true`; set `false` for async or `req`/`payload`-using rules. */
|
|
43
|
-
client?: boolean;
|
|
44
|
-
severity?: ValidationSeverity;
|
|
39
|
+
client?: boolean;
|
|
45
40
|
validate: ValidationRuleValidate<TParams, TValue, TData>;
|
|
46
41
|
};
|
|
47
42
|
/** Erased shape stored in the heterogeneous registry; params re-narrow per matched rule at execution. */
|
|
@@ -68,9 +63,8 @@ type AnyValidationRuleDefinition = {
|
|
|
68
63
|
params?: Field[];
|
|
69
64
|
defaultMessage: string;
|
|
70
65
|
client?: boolean;
|
|
71
|
-
severity?: ValidationSeverity;
|
|
72
66
|
validate: AnyValidationRuleValidate;
|
|
73
67
|
};
|
|
74
68
|
//#endregion
|
|
75
|
-
export { AnyValidationRuleDefinition, ValidationParams, ValidationRuleDefinition, ValidationRuleResult
|
|
69
|
+
export { AnyValidationRuleDefinition, ValidationParams, ValidationRuleDefinition, ValidationRuleResult };
|
|
76
70
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { keys } from "../translations/keys.js";
|
|
2
|
+
import { asTranslate } from "../translations/server.js";
|
|
3
|
+
//#region src/validation/validateUrl.ts
|
|
4
|
+
/**
|
|
5
|
+
* Payload field validator for URL config fields (signed-webhook `url`, response redirect `url`):
|
|
6
|
+
* unset is fine (the consumer enforces presence where it matters), otherwise the value must parse
|
|
7
|
+
* as an absolute http(s) URL.
|
|
8
|
+
*/
|
|
9
|
+
const validateUrl = (value, { req }) => {
|
|
10
|
+
if (typeof value !== "string" || value.length === 0) return true;
|
|
11
|
+
let parsed;
|
|
12
|
+
try {
|
|
13
|
+
parsed = new URL(value);
|
|
14
|
+
} catch {
|
|
15
|
+
return asTranslate(req.t)(keys.validationUrlInvalid);
|
|
16
|
+
}
|
|
17
|
+
return parsed.protocol === "http:" || parsed.protocol === "https:" ? true : asTranslate(req.t)(keys.validationUrlInvalid);
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
export { validateUrl };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=validateUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateUrl.js","names":[],"sources":["../../src/validation/validateUrl.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\nimport { keys } from '../translations/keys'\nimport { asTranslate } from '../translations/server'\n\n/**\n * Payload field validator for URL config fields (signed-webhook `url`, response redirect `url`):\n * unset is fine (the consumer enforces presence where it matters), otherwise the value must parse\n * as an absolute http(s) URL.\n */\nexport const validateUrl = (\n\tvalue: unknown,\n\t{ req }: { data?: unknown; req: PayloadRequest }\n): string | true => {\n\tif (typeof value !== 'string' || value.length === 0) {\n\t\treturn true\n\t}\n\tlet parsed: URL\n\ttry {\n\t\tparsed = new URL(value)\n\t} catch {\n\t\treturn asTranslate(req.t)(keys.validationUrlInvalid)\n\t}\n\treturn parsed.protocol === 'http:' || parsed.protocol === 'https:'\n\t\t? true\n\t\t: asTranslate(req.t)(keys.validationUrlInvalid)\n}\n"],"mappings":";;;;;;;;AASA,MAAa,eACZ,OACA,EAAE,UACiB;CACnB,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GACjD,OAAO;CAER,IAAI;CACJ,IAAI;EACH,SAAS,IAAI,IAAI,KAAK;CACvB,QAAQ;EACP,OAAO,YAAY,IAAI,CAAC,EAAE,KAAK,oBAAoB;CACpD;CACA,OAAO,OAAO,aAAa,WAAW,OAAO,aAAa,WACvD,OACA,YAAY,IAAI,CAAC,EAAE,KAAK,oBAAoB;AAChD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@10x-media/form-builder",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.21",
|
|
4
4
|
"description": "End-to-end forms platform for Payload: author, validate, render, collect, aggregate, and act.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -62,11 +62,17 @@
|
|
|
62
62
|
"LICENSE"
|
|
63
63
|
],
|
|
64
64
|
"peerDependencies": {
|
|
65
|
-
"@payloadcms/
|
|
66
|
-
"
|
|
65
|
+
"@payloadcms/db-postgres": "^3.82.0",
|
|
66
|
+
"@payloadcms/ui": "^3.83.0",
|
|
67
|
+
"payload": "^3.83.0",
|
|
67
68
|
"react": "^19.0.0",
|
|
68
69
|
"react-dom": "^19.0.0"
|
|
69
70
|
},
|
|
71
|
+
"peerDependenciesMeta": {
|
|
72
|
+
"@payloadcms/db-postgres": {
|
|
73
|
+
"optional": true
|
|
74
|
+
}
|
|
75
|
+
},
|
|
70
76
|
"dependencies": {
|
|
71
77
|
"@standard-schema/spec": "^1.0.0"
|
|
72
78
|
},
|
|
@@ -74,6 +80,7 @@
|
|
|
74
80
|
"@axe-core/playwright": "^4.11.3",
|
|
75
81
|
"@payloadcms/db-mongodb": "3.85.0",
|
|
76
82
|
"@payloadcms/db-postgres": "3.85.0",
|
|
83
|
+
"@payloadcms/richtext-lexical": "3.85.0",
|
|
77
84
|
"@payloadcms/ui": "3.85.0",
|
|
78
85
|
"@playwright/test": "1.60.0",
|
|
79
86
|
"@testing-library/jest-dom": "^6.6.3",
|
|
@@ -83,6 +90,7 @@
|
|
|
83
90
|
"@types/react-dom": "19.2.3",
|
|
84
91
|
"axe-core": "^4.12.1",
|
|
85
92
|
"jsdom": "^25.0.1",
|
|
93
|
+
"msw": "^2.14.6",
|
|
86
94
|
"payload": "3.85.0",
|
|
87
95
|
"playwright": "1.60.0",
|
|
88
96
|
"react": "19.2.6",
|
|
@@ -93,8 +101,8 @@
|
|
|
93
101
|
"vitest": "4.1.7",
|
|
94
102
|
"@10x-media/payload-test-harness": "0.0.0",
|
|
95
103
|
"@10x-media/tsdown-config": "0.0.0",
|
|
96
|
-
"@10x-media/
|
|
97
|
-
"@10x-media/
|
|
104
|
+
"@10x-media/tsconfig": "0.0.0",
|
|
105
|
+
"@10x-media/vitest-config": "0.0.0"
|
|
98
106
|
},
|
|
99
107
|
"publishConfig": {
|
|
100
108
|
"access": "public"
|
|
@@ -108,7 +116,7 @@
|
|
|
108
116
|
"test": "vitest run",
|
|
109
117
|
"test:unit": "vitest run src",
|
|
110
118
|
"test:int": "vitest run tests/int",
|
|
111
|
-
"test:matrix": "DB_MATRIX=mongo vitest run tests/int/matrix.int.spec.ts && DB_MATRIX=postgres vitest run tests/int/matrix.int.spec.ts",
|
|
119
|
+
"test:matrix": "DB_MATRIX=mongo vitest run tests/int/matrix.int.spec.ts tests/int/messageResponse.int.spec.ts tests/int/pollAllowChange.int.spec.ts tests/int/pollAutoClose.int.spec.ts tests/int/pollVotes.int.spec.ts && DB_MATRIX=postgres vitest run tests/int/matrix.int.spec.ts tests/int/messageResponse.int.spec.ts tests/int/pollAllowChange.int.spec.ts tests/int/pollAutoClose.int.spec.ts tests/int/pollVotes.int.spec.ts",
|
|
112
120
|
"test:container": "TEST_DB=container DB_MATRIX=mongo vitest run tests/int/matrix.int.spec.ts && TEST_DB=container DB_MATRIX=postgres vitest run tests/int/matrix.int.spec.ts",
|
|
113
121
|
"test:e2e": "bash scripts/e2e.sh",
|
|
114
122
|
"dev": "pnpm --filter @10x-media/form-builder-dev dev",
|