@10x-media/form-builder 0.1.0-beta.0 → 0.1.0-beta.2
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 +68 -0
- package/README.md +45 -1402
- package/dist/actions/buildActionBlocks.js +19 -0
- package/dist/actions/buildActionBlocks.js.map +1 -0
- package/dist/actions/builtin/confirmation.js +49 -0
- package/dist/actions/builtin/confirmation.js.map +1 -0
- package/dist/actions/builtin/emailTeam.js +46 -0
- package/dist/actions/builtin/emailTeam.js.map +1 -0
- package/dist/actions/builtin/index.d.ts +7 -0
- package/dist/actions/builtin/index.js +13 -0
- package/dist/actions/builtin/index.js.map +1 -0
- package/dist/actions/builtin/signedWebhook.js +49 -0
- package/dist/actions/builtin/signedWebhook.js.map +1 -0
- package/dist/actions/defineAction.d.ts +36 -0
- package/dist/actions/defineAction.js +6 -0
- package/dist/actions/defineAction.js.map +1 -0
- package/dist/actions/dispatch.js +48 -0
- package/dist/actions/dispatch.js.map +1 -0
- package/dist/actions/registry.d.ts +16 -0
- package/dist/actions/registry.js +16 -0
- package/dist/actions/registry.js.map +1 -0
- package/dist/actions/runActions.d.ts +9 -0
- package/dist/actions/runActions.js +34 -0
- package/dist/actions/runActions.js.map +1 -0
- package/dist/actions/sign.d.ts +7 -0
- package/dist/actions/sign.js +9 -0
- package/dist/actions/sign.js.map +1 -0
- package/dist/actions/task.js +82 -0
- package/dist/actions/task.js.map +1 -0
- package/dist/aggregation/aggregateResponses.d.ts +31 -0
- package/dist/aggregation/aggregateResponses.js +86 -0
- package/dist/aggregation/aggregateResponses.js.map +1 -0
- package/dist/aggregation/aggregateRows.d.ts +10 -0
- package/dist/aggregation/aggregateRows.js +64 -0
- package/dist/aggregation/aggregateRows.js.map +1 -0
- package/dist/aggregation/resolveResultsRequest.d.ts +32 -0
- package/dist/aggregation/resolveResultsRequest.js +56 -0
- package/dist/aggregation/resolveResultsRequest.js.map +1 -0
- package/dist/aggregation/types.d.ts +39 -0
- package/dist/calc/computeCalcFields.d.ts +15 -0
- package/dist/calc/computeCalcFields.js +27 -0
- package/dist/calc/computeCalcFields.js.map +1 -0
- package/dist/calc/evaluate.d.ts +8 -0
- package/dist/calc/evaluate.js +59 -0
- package/dist/calc/evaluate.js.map +1 -0
- package/dist/calc/normalizeCalc.d.ts +8 -0
- package/dist/calc/normalizeCalc.js +100 -0
- package/dist/calc/normalizeCalc.js.map +1 -0
- package/dist/calc/types.d.ts +28 -0
- package/dist/client/ConditionBuilder.js +121 -0
- package/dist/client/ConditionBuilder.js.map +1 -0
- package/dist/client/ConditionRow.js +150 -0
- package/dist/client/ConditionRow.js.map +1 -0
- package/dist/client/FlowBuilder.d.ts +15 -0
- package/dist/client/FlowBuilder.js +408 -0
- package/dist/client/FlowBuilder.js.map +1 -0
- package/dist/client/FormConditionField.d.ts +21 -0
- package/dist/client/FormConditionField.js +33 -0
- package/dist/client/FormConditionField.js.map +1 -0
- package/dist/client/synthesizeClientField.js +46 -0
- package/dist/client/synthesizeClientField.js.map +1 -0
- package/dist/collections/formSubmissions.js +157 -0
- package/dist/collections/formSubmissions.js.map +1 -0
- package/dist/collections/forms.js +198 -0
- package/dist/collections/forms.js.map +1 -0
- package/dist/collections/uploads.d.ts +30 -0
- package/dist/collections/uploads.js +55 -0
- package/dist/collections/uploads.js.map +1 -0
- package/dist/conditions/conditionType.js +14 -0
- package/dist/conditions/conditionType.js.map +1 -0
- package/dist/conditions/evaluate.d.ts +17 -0
- package/dist/conditions/evaluate.js +94 -0
- package/dist/conditions/evaluate.js.map +1 -0
- package/dist/conditions/fieldTypes.d.ts +9 -0
- package/dist/{fieldTypes-CzhhJXjg.js → conditions/fieldTypes.js} +2 -2
- package/dist/conditions/fieldTypes.js.map +1 -0
- package/dist/conditions/normalizeConditions.js +47 -0
- package/dist/conditions/normalizeConditions.js.map +1 -0
- package/dist/conditions/types.d.ts +8 -0
- package/dist/consent/buildConsentSourceConfig.js +49 -0
- package/dist/consent/buildConsentSourceConfig.js.map +1 -0
- package/dist/consent/builtin/index.d.ts +7 -0
- package/dist/consent/builtin/index.js +11 -0
- package/dist/consent/builtin/index.js.map +1 -0
- package/dist/consent/builtin/pageReference.js +75 -0
- package/dist/consent/builtin/pageReference.js.map +1 -0
- package/dist/consent/builtin/static.js +44 -0
- package/dist/consent/builtin/static.js.map +1 -0
- package/dist/consent/captureConsent.d.ts +28 -0
- package/dist/consent/captureConsent.js +26 -0
- package/dist/consent/captureConsent.js.map +1 -0
- package/dist/consent/defineConsentSource.d.ts +35 -0
- package/dist/consent/defineConsentSource.js +6 -0
- package/dist/consent/defineConsentSource.js.map +1 -0
- package/dist/consent/registry.d.ts +16 -0
- package/dist/consent/registry.js +16 -0
- package/dist/consent/registry.js.map +1 -0
- package/dist/consent/resolveConsentLinks.d.ts +19 -0
- package/dist/consent/resolveConsentLinks.js +26 -0
- package/dist/consent/resolveConsentLinks.js.map +1 -0
- package/dist/consent/resolvePublishedVersionRef.d.ts +17 -0
- package/dist/consent/resolvePublishedVersionRef.js +27 -0
- package/dist/consent/resolvePublishedVersionRef.js.map +1 -0
- package/dist/events/noopSink.js +6 -0
- package/dist/events/noopSink.js.map +1 -0
- package/dist/events/resolveEventSink.js +8 -0
- package/dist/events/resolveEventSink.js.map +1 -0
- package/dist/events/types.d.ts +31 -0
- package/dist/exports/client.d.ts +3 -21
- package/dist/exports/client.js +3 -319
- package/dist/exports/i18n.d.ts +3 -138
- package/dist/exports/i18n.js +2 -2
- package/dist/exports/react.d.ts +45 -550
- package/dist/exports/react.js +39 -1563
- package/dist/exports/rsc.d.ts +2 -16
- package/dist/exports/rsc.js +1 -54
- package/dist/exports/types.d.ts +28 -5
- package/dist/fields/buildFieldBlocks.js +60 -0
- package/dist/fields/buildFieldBlocks.js.map +1 -0
- package/dist/fields/builtin/calculation.js +24 -0
- package/dist/fields/builtin/calculation.js.map +1 -0
- package/dist/fields/builtin/checkbox.js +13 -0
- package/dist/fields/builtin/checkbox.js.map +1 -0
- package/dist/fields/builtin/consent.js +32 -0
- package/dist/fields/builtin/consent.js.map +1 -0
- package/dist/fields/builtin/email.js +18 -0
- package/dist/fields/builtin/email.js.map +1 -0
- package/dist/fields/builtin/file.js +40 -0
- package/dist/fields/builtin/file.js.map +1 -0
- package/dist/fields/builtin/index.js +27 -0
- package/dist/fields/builtin/index.js.map +1 -0
- package/dist/fields/builtin/number.js +17 -0
- package/dist/fields/builtin/number.js.map +1 -0
- package/dist/fields/builtin/repeater.js +44 -0
- package/dist/fields/builtin/repeater.js.map +1 -0
- package/dist/fields/builtin/select.js +44 -0
- package/dist/fields/builtin/select.js.map +1 -0
- package/dist/fields/builtin/text.js +13 -0
- package/dist/fields/builtin/text.js.map +1 -0
- package/dist/fields/builtin/textarea.js +13 -0
- package/dist/fields/builtin/textarea.js.map +1 -0
- package/dist/fields/defineFormField.d.ts +13 -0
- package/dist/fields/defineFormField.js +12 -0
- package/dist/fields/defineFormField.js.map +1 -0
- package/dist/fields/registry.d.ts +10 -0
- package/dist/fields/registry.js +24 -0
- package/dist/fields/registry.js.map +1 -0
- package/dist/fields/sharedConfig.js +89 -0
- package/dist/fields/sharedConfig.js.map +1 -0
- package/dist/fields/types.d.ts +89 -0
- package/dist/flow/engine.d.ts +17 -0
- package/dist/flow/engine.js +24 -0
- package/dist/flow/engine.js.map +1 -0
- package/dist/flow/normalizeFlow.js +35 -0
- package/dist/flow/normalizeFlow.js.map +1 -0
- package/dist/{types-DsJ_6kGJ.d.ts → flow/types.d.ts} +2 -2
- package/dist/index.d.ts +93 -4
- package/dist/index.js +43 -1890
- package/dist/index.js.map +1 -1
- package/dist/plugin/access.js +12 -0
- package/dist/plugin/access.js.map +1 -0
- package/dist/plugin/collectionOverrides.d.ts +22 -0
- package/dist/plugin/registerCollections.js +68 -0
- package/dist/plugin/registerCollections.js.map +1 -0
- package/dist/plugin/registerTranslations.js +19 -0
- package/dist/plugin/registerTranslations.js.map +1 -0
- package/dist/prefill/valuesFromSearchParams.d.ts +18 -0
- package/dist/prefill/valuesFromSearchParams.js +45 -0
- package/dist/prefill/valuesFromSearchParams.js.map +1 -0
- package/dist/presentations/defaults.d.ts +33 -0
- package/dist/presentations/defaults.js +35 -0
- package/dist/presentations/defaults.js.map +1 -0
- package/dist/presentations/registry.d.ts +15 -0
- package/dist/presentations/registry.js +15 -0
- package/dist/presentations/registry.js.map +1 -0
- package/dist/presentations/types.d.ts +18 -0
- package/dist/react/Form.d.ts +110 -0
- package/dist/react/Form.js +499 -0
- package/dist/react/Form.js.map +1 -0
- package/dist/react/FormContext.d.ts +16 -0
- package/dist/react/FormContext.js +14 -0
- package/dist/react/FormContext.js.map +1 -0
- package/dist/react/FormLayout.d.ts +20 -0
- package/dist/react/FormLayout.js +14 -0
- package/dist/react/FormLayout.js.map +1 -0
- package/dist/react/FormResults.d.ts +25 -0
- package/dist/react/FormResults.js +85 -0
- package/dist/react/FormResults.js.map +1 -0
- package/dist/react/Honeypot.d.ts +22 -0
- package/dist/react/Honeypot.js +38 -0
- package/dist/react/Honeypot.js.map +1 -0
- package/dist/react/Poll.d.ts +32 -0
- package/dist/react/Poll.js +77 -0
- package/dist/react/Poll.js.map +1 -0
- package/dist/react/cn.d.ts +6 -0
- package/dist/react/cn.js +8 -0
- package/dist/react/cn.js.map +1 -0
- package/dist/react/contract.d.ts +32 -0
- package/dist/react/contract.js +7 -0
- package/dist/react/contract.js.map +1 -0
- package/dist/react/events.js +14 -0
- package/dist/react/events.js.map +1 -0
- package/dist/react/fetchResults.d.ts +25 -0
- package/dist/react/fetchResults.js +31 -0
- package/dist/react/fetchResults.js.map +1 -0
- package/dist/react/presentation/Backdrop.d.ts +18 -0
- package/dist/react/presentation/Backdrop.js +14 -0
- package/dist/react/presentation/Backdrop.js.map +1 -0
- package/dist/react/presentation/DialogSurface.d.ts +35 -0
- package/dist/react/presentation/DialogSurface.js +56 -0
- package/dist/react/presentation/DialogSurface.js.map +1 -0
- package/dist/react/presentation/presentations.d.ts +7 -0
- package/dist/react/presentation/presentations.js +32 -0
- package/dist/react/presentation/presentations.js.map +1 -0
- package/dist/react/presentation/registry.d.ts +11 -0
- package/dist/react/presentation/registry.js +12 -0
- package/dist/react/presentation/registry.js.map +1 -0
- package/dist/react/presentation/types.d.ts +19 -0
- package/dist/react/presentation/useDismiss.d.ts +19 -0
- package/dist/react/presentation/useDismiss.js +33 -0
- package/dist/react/presentation/useDismiss.js.map +1 -0
- package/dist/react/presentation/useFocusTrap.d.ts +8 -0
- package/dist/react/presentation/useFocusTrap.js +35 -0
- package/dist/react/presentation/useFocusTrap.js.map +1 -0
- package/dist/react/presentation/useScrollLock.d.ts +6 -0
- package/dist/react/presentation/useScrollLock.js +18 -0
- package/dist/react/presentation/useScrollLock.js.map +1 -0
- package/dist/react/primitives/Checkbox.d.ts +26 -0
- package/dist/react/primitives/Checkbox.js +20 -0
- package/dist/react/primitives/Checkbox.js.map +1 -0
- package/dist/react/primitives/FieldShell.d.ts +31 -0
- package/dist/react/primitives/FieldShell.js +51 -0
- package/dist/react/primitives/FieldShell.js.map +1 -0
- package/dist/react/primitives/Input.d.ts +30 -0
- package/dist/react/primitives/Input.js +21 -0
- package/dist/react/primitives/Input.js.map +1 -0
- package/dist/react/primitives/Select.d.ts +34 -0
- package/dist/react/primitives/Select.js +26 -0
- package/dist/react/primitives/Select.js.map +1 -0
- package/dist/react/primitives/Textarea.d.ts +28 -0
- package/dist/react/primitives/Textarea.js +20 -0
- package/dist/react/primitives/Textarea.js.map +1 -0
- package/dist/react/recall.js +20 -0
- package/dist/react/recall.js.map +1 -0
- package/dist/react/registry.d.ts +16 -0
- package/dist/react/registry.js +16 -0
- package/dist/react/registry.js.map +1 -0
- package/dist/react/renderers/calculation.js +30 -0
- package/dist/react/renderers/calculation.js.map +1 -0
- package/dist/react/renderers/checkbox.js +35 -0
- package/dist/react/renderers/checkbox.js.map +1 -0
- package/dist/react/renderers/consent.js +54 -0
- package/dist/react/renderers/consent.js.map +1 -0
- package/dist/react/renderers/email.js +37 -0
- package/dist/react/renderers/email.js.map +1 -0
- package/dist/react/renderers/file.js +92 -0
- package/dist/react/renderers/file.js.map +1 -0
- package/dist/react/renderers/index.d.ts +8 -0
- package/dist/react/renderers/index.js +28 -0
- package/dist/react/renderers/index.js.map +1 -0
- package/dist/react/renderers/number.js +40 -0
- package/dist/react/renderers/number.js.map +1 -0
- package/dist/react/renderers/repeater.js +113 -0
- package/dist/react/renderers/repeater.js.map +1 -0
- package/dist/react/renderers/select.js +38 -0
- package/dist/react/renderers/select.js.map +1 -0
- package/dist/react/renderers/text.js +37 -0
- package/dist/react/renderers/text.js.map +1 -0
- package/dist/react/renderers/textarea.js +36 -0
- package/dist/react/renderers/textarea.js.map +1 -0
- package/dist/react/resolveForm.js +16 -0
- package/dist/react/resolveForm.js.map +1 -0
- package/dist/react/state.d.ts +15 -0
- package/dist/react/state.js +70 -0
- package/dist/react/state.js.map +1 -0
- package/dist/react/submitForm.d.ts +31 -0
- package/dist/react/submitForm.js +58 -0
- package/dist/react/submitForm.js.map +1 -0
- package/dist/react/toFormDocument.d.ts +24 -0
- package/dist/react/toFormDocument.js +22 -0
- package/dist/react/toFormDocument.js.map +1 -0
- package/dist/react/uploadFile.d.ts +23 -0
- package/dist/react/uploadFile.js +39 -0
- package/dist/react/uploadFile.js.map +1 -0
- package/dist/react/useField.d.ts +14 -0
- package/dist/react/useField.js +49 -0
- package/dist/react/useField.js.map +1 -0
- package/dist/react/useFormState.d.ts +8 -0
- package/dist/react/useFormState.js +9 -0
- package/dist/react/useFormState.js.map +1 -0
- package/dist/react/useFormStep.d.ts +8 -0
- package/dist/react/useFormStep.js +9 -0
- package/dist/react/useFormStep.js.map +1 -0
- package/dist/react/validateField.js +30 -0
- package/dist/react/validateField.js.map +1 -0
- package/dist/recall/interpolate.d.ts +10 -0
- package/dist/recall/interpolate.js +16 -0
- package/dist/recall/interpolate.js.map +1 -0
- package/dist/recall/resolver.d.ts +22 -0
- package/dist/recall/resolver.js +36 -0
- package/dist/recall/resolver.js.map +1 -0
- package/dist/spam/captcha.d.ts +12 -0
- package/dist/spam/captcha.js +11 -0
- package/dist/spam/captcha.js.map +1 -0
- package/dist/spam/constants.d.ts +12 -0
- package/dist/spam/constants.js +15 -0
- package/dist/spam/constants.js.map +1 -0
- package/dist/spam/identify.d.ts +12 -0
- package/dist/spam/identify.js +20 -0
- package/dist/spam/identify.js.map +1 -0
- package/dist/spam/rateLimiter.d.ts +18 -0
- package/dist/spam/rateLimiter.js +41 -0
- package/dist/spam/rateLimiter.js.map +1 -0
- package/dist/spam/reserved.js +30 -0
- package/dist/spam/reserved.js.map +1 -0
- package/dist/spam/resolveSpam.d.ts +12 -0
- package/dist/spam/resolveSpam.js +42 -0
- package/dist/spam/resolveSpam.js.map +1 -0
- package/dist/spam/spamGuard.js +68 -0
- package/dist/spam/spamGuard.js.map +1 -0
- package/dist/spam/types.d.ts +73 -0
- package/dist/spam/uploadHooks.js +33 -0
- package/dist/spam/uploadHooks.js.map +1 -0
- package/dist/submissions/SubmissionAnswers.d.ts +14 -0
- package/dist/submissions/SubmissionAnswers.js +133 -0
- package/dist/submissions/SubmissionAnswers.js.map +1 -0
- package/dist/submissions/SubmissionAnswersClient.js +142 -0
- package/dist/submissions/SubmissionAnswersClient.js.map +1 -0
- package/dist/submissions/runSubmission.js +257 -0
- package/dist/submissions/runSubmission.js.map +1 -0
- package/dist/submissions/types.d.ts +34 -0
- package/dist/submissions/validateSubmission.js +59 -0
- package/dist/submissions/validateSubmission.js.map +1 -0
- package/dist/translations/en.d.ts +12 -0
- package/dist/{translations-edMqq_2e.js → translations/en.js} +29 -23
- package/dist/translations/en.js.map +1 -0
- package/dist/translations/index.d.ts +14 -0
- package/dist/translations/index.js +26 -0
- package/dist/translations/index.js.map +1 -0
- package/dist/translations/keys.d.ts +157 -0
- package/dist/{keys-N5xGiUsh.js → translations/keys.js} +28 -3
- package/dist/translations/keys.js.map +1 -0
- package/dist/translations/makeTranslate.d.ts +11 -0
- package/dist/translations/makeTranslate.js +11 -0
- package/dist/translations/makeTranslate.js.map +1 -0
- package/dist/translations/server.js +25 -0
- package/dist/translations/server.js.map +1 -0
- package/dist/translations/useTranslation.js +12 -0
- package/dist/translations/useTranslation.js.map +1 -0
- package/dist/uploads/captureFileRef.d.ts +27 -0
- package/dist/uploads/captureFileRef.js +34 -0
- package/dist/uploads/captureFileRef.js.map +1 -0
- package/dist/uploads/resolveFileRef.d.ts +26 -0
- package/dist/uploads/resolveFileRef.js +44 -0
- package/dist/uploads/resolveFileRef.js.map +1 -0
- package/dist/uploads/types.d.ts +20 -0
- package/dist/validation/buildRuleBlocks.js +46 -0
- package/dist/validation/buildRuleBlocks.js.map +1 -0
- package/dist/validation/builtin/email.js +19 -0
- package/dist/validation/builtin/email.js.map +1 -0
- package/dist/validation/builtin/index.js +27 -0
- package/dist/validation/builtin/index.js.map +1 -0
- package/dist/validation/builtin/matchesField.js +20 -0
- package/dist/validation/builtin/matchesField.js.map +1 -0
- package/dist/validation/builtin/max.js +21 -0
- package/dist/validation/builtin/max.js.map +1 -0
- package/dist/validation/builtin/maxLength.js +26 -0
- package/dist/validation/builtin/maxLength.js.map +1 -0
- package/dist/validation/builtin/min.js +21 -0
- package/dist/validation/builtin/min.js.map +1 -0
- package/dist/validation/builtin/minLength.js +26 -0
- package/dist/validation/builtin/minLength.js.map +1 -0
- package/dist/validation/builtin/notAlreadySubmitted.js +32 -0
- package/dist/validation/builtin/notAlreadySubmitted.js.map +1 -0
- package/dist/validation/builtin/oneOf.js +34 -0
- package/dist/validation/builtin/oneOf.js.map +1 -0
- package/dist/validation/builtin/pattern.js +41 -0
- package/dist/validation/builtin/pattern.js.map +1 -0
- package/dist/validation/builtin/url.js +22 -0
- package/dist/validation/builtin/url.js.map +1 -0
- package/dist/validation/defineValidationRule.d.ts +12 -0
- package/dist/validation/defineValidationRule.js +11 -0
- package/dist/validation/defineValidationRule.js.map +1 -0
- package/dist/validation/message.js +14 -0
- package/dist/validation/message.js.map +1 -0
- package/dist/validation/registry.d.ts +10 -0
- package/dist/validation/registry.js +20 -0
- package/dist/validation/registry.js.map +1 -0
- package/dist/validation/runValidation.js +111 -0
- package/dist/validation/runValidation.js.map +1 -0
- package/dist/validation/types.d.ts +76 -0
- package/package.json +8 -5
- package/styles/form-builder.css +201 -11
- package/dist/constants-B-BUfetP.d.ts +0 -288
- package/dist/exports/client.js.map +0 -1
- package/dist/exports/react.js.map +0 -1
- package/dist/exports/rsc.js.map +0 -1
- package/dist/fieldTypes-B8jkNRob.d.ts +0 -188
- package/dist/fieldTypes-CzhhJXjg.js.map +0 -1
- package/dist/index-DfFYGbVF.d.ts +0 -481
- package/dist/keys-N5xGiUsh.js.map +0 -1
- package/dist/registry-CoCyhtvB.js +0 -282
- package/dist/registry-CoCyhtvB.js.map +0 -1
- package/dist/resolver-OeQyVH2N.js +0 -665
- package/dist/resolver-OeQyVH2N.js.map +0 -1
- package/dist/translations-edMqq_2e.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en.js","names":[],"sources":["../../src/translations/en.ts"],"sourcesContent":["import { keys, type TranslationKey } from './keys'\n\n/**\n * English values, keyed by the typed constants in `keys.ts` so the two stay in\n * lockstep. The `Record<TranslationKey, string>` annotation makes a missing or\n * unknown key a type error. `translations/index.ts` nests these for Payload.\n */\nexport const en: Record<TranslationKey, string> = {\n\t[keys.pluginName]: 'Form Builder',\n\t[keys.fieldTitle]: 'Title',\n\t[keys.fieldTypeText]: 'Text',\n\t[keys.fieldTypeTextarea]: 'Long text',\n\t[keys.fieldTypeEmail]: 'Email',\n\t[keys.fieldTypeNumber]: 'Number',\n\t[keys.fieldTypeSelect]: 'Select',\n\t[keys.fieldTypeCheckbox]: 'Checkbox',\n\t[keys.configOptions]: 'Options',\n\t[keys.configOption]: 'Option',\n\t[keys.configOptionLabel]: 'Option label',\n\t[keys.configOptionValue]: 'Option value',\n\t[keys.validationRequired]: 'This field is required',\n\t[keys.validationEmail]: 'Enter a valid email address',\n\t[keys.validationNumber]: 'Enter a valid number',\n\t[keys.validationSelect]: 'Choose a valid option',\n\t[keys.formatYes]: 'Yes',\n\t[keys.formatNo]: 'No',\n\t[keys.configName]: 'Name',\n\t[keys.configLabel]: 'Label',\n\t[keys.configRequired]: 'Required',\n\t[keys.configWidth]: 'Width',\n\t[keys.configPlaceholder]: 'Placeholder',\n\t[keys.configDescription]: 'Description',\n\t[keys.configVisibleWhen]: 'Show this field when',\n\t[keys.configValidateWhen]: 'Validate this field only when',\n\t[keys.submissionAnswers]: 'Answers',\n\t[keys.submissionNoAnswers]: 'No answers',\n\t[keys.ruleMinLength]: 'Minimum length',\n\t[keys.ruleMaxLength]: 'Maximum length',\n\t[keys.ruleMin]: 'Minimum',\n\t[keys.ruleMax]: 'Maximum',\n\t[keys.rulePattern]: 'Pattern',\n\t[keys.ruleEmail]: 'Email',\n\t[keys.ruleUrl]: 'URL',\n\t[keys.ruleOneOf]: 'One of',\n\t[keys.ruleMatchesField]: 'Matches field',\n\t[keys.ruleNotAlreadySubmitted]: 'Not already submitted',\n\t[keys.ruleMinLengthMessage]: 'Must be at least {min} characters',\n\t[keys.ruleMaxLengthMessage]: 'Must be at most {max} characters',\n\t[keys.ruleMinMessage]: 'Must be at least {min}',\n\t[keys.ruleMaxMessage]: 'Must be at most {max}',\n\t[keys.rulePatternMessage]: 'Invalid format',\n\t[keys.ruleEmailMessage]: 'Enter a valid email address',\n\t[keys.ruleUrlMessage]: 'Enter a valid URL',\n\t[keys.ruleOneOfMessage]: 'Choose an allowed value',\n\t[keys.ruleMatchesFieldMessage]: 'Does not match',\n\t[keys.ruleNotAlreadySubmittedMessage]: 'This value was already submitted',\n\t[keys.ruleParamMin]: 'Minimum',\n\t[keys.ruleParamMax]: 'Maximum',\n\t[keys.ruleParamPattern]: 'Pattern',\n\t[keys.ruleParamFlags]: 'Flags',\n\t[keys.ruleParamValues]: 'Allowed values',\n\t[keys.ruleParamField]: 'Field name',\n\t[keys.validationsLabel]: 'Validation rules',\n\t[keys.validationMessageLabel]: 'Custom message',\n\t[keys.validationSeverityLabel]: 'Severity',\n\t[keys.validationSeverityError]: 'Error',\n\t[keys.validationSeverityWarning]: 'Warning',\n\t[keys.conditionAddCondition]: 'Add condition',\n\t[keys.conditionAddOr]: 'Add \"or\" group',\n\t[keys.conditionAnd]: 'And',\n\t[keys.conditionOr]: 'Or',\n\t[keys.conditionRemove]: 'Remove',\n\t[keys.conditionNoFields]: 'Add named fields to this form to build a condition.',\n\t[keys.conditionEmpty]: 'No conditions. This field is always shown.',\n\t[keys.conditionSelectField]: 'Select a field',\n\t[keys.conditionValuePlaceholder]: 'Value',\n\t[keys.conditionTrue]: 'True',\n\t[keys.conditionFalse]: 'False',\n\t[keys.configAdvanced]: 'Advanced',\n\t[keys.configHidden]: 'Hidden (capture without showing)',\n\t[keys.fieldTypeCalculation]: 'Calculation',\n\t[keys.configExpression]: 'Expression (JSON)',\n\t[keys.configCalcDisplay]: 'Show computed value',\n\t[keys.configDefaultPresentation]: 'Presentation',\n\t[keys.presentationPage]: 'Page',\n\t[keys.presentationModal]: 'Modal',\n\t[keys.presentationDrawer]: 'Drawer',\n\t[keys.presentationInline]: 'Inline',\n\t[keys.actionEmailTeam]: 'Email team',\n\t[keys.actionConfirmation]: 'Confirmation email',\n\t[keys.actionSignedWebhook]: 'Signed webhook',\n\t[keys.actionConfigTo]: 'To',\n\t[keys.actionConfigSubject]: 'Subject',\n\t[keys.actionConfigBody]: 'Body',\n\t[keys.actionConfigToField]: 'Email field name',\n\t[keys.actionConfigUrl]: 'URL',\n\t[keys.actionConfigSecret]: 'Secret',\n\t[keys.configActions]: 'Actions',\n\t[keys.consentSourceStatic]: 'Static text',\n\t[keys.consentSourcePageReference]: 'Page reference',\n\t[keys.consentConfigLabel]: 'Label',\n\t[keys.consentConfigUrl]: 'URL',\n\t[keys.consentConfigVersion]: 'Version',\n\t[keys.consentConfigRelationTo]: 'Collection',\n\t[keys.consentConfigDocId]: 'Document ID',\n\t[keys.consentConfigUrlField]: 'URL field',\n\t[keys.consentConfigCaptureVersion]: 'Capture published version',\n\t[keys.fieldTypeConsent]: 'Consent',\n\t[keys.consentConfigStatement]: 'Statement',\n\t[keys.consentConfigSource]: 'Source',\n\t[keys.consentConfigSourceConfig]: 'Source settings',\n\t[keys.consentConfigOptional]: 'Optional (e.g. marketing)',\n\t[keys.resultsTitle]: 'Results',\n\t[keys.resultsResponses]: 'responses',\n\t[keys.resultsNoResponses]: 'No responses yet',\n\t[keys.resultsTruncated]: 'Showing a sample of responses',\n\t[keys.configShowResults]: 'Show results publicly',\n\t[keys.configResultsField]: 'Results field (machine name)',\n\t[keys.validationFileMissing]: 'Upload a file',\n\t[keys.validationFileMimeType]: 'File type not allowed',\n\t[keys.validationFileTooLarge]: 'File is too large',\n\t[keys.fieldTypeFile]: 'File upload',\n\t[keys.fileConfigRelationTo]: 'Upload collection',\n\t[keys.fileConfigMimeTypes]: 'Allowed file types',\n\t[keys.fileConfigMaxSize]: 'Maximum size (bytes)',\n\t[keys.spamRateLimited]: 'You have sent too many requests. Please try again later.',\n\t[keys.spamRejected]: 'Your submission could not be processed.',\n\t[keys.spamCaptchaFailed]: 'Captcha verification failed. Please try again.',\n\t[keys.collectionFormSingular]: 'Form',\n\t[keys.collectionFormPlural]: 'Forms',\n\t[keys.collectionSubmissionSingular]: 'Submission',\n\t[keys.collectionSubmissionPlural]: 'Submissions',\n\t[keys.statusComplete]: 'Complete',\n\t[keys.statusPartial]: 'Partial',\n\t[keys.fieldTypeRepeater]: 'Repeater',\n\t[keys.configMinRows]: 'Minimum rows',\n\t[keys.configMaxRows]: 'Maximum rows',\n\t[keys.configAddLabel]: 'Add button label',\n\t[keys.configSubFields]: 'Sub-fields',\n\t[keys.validationRepeaterMin]: 'Add at least {min} row(s)',\n\t[keys.validationRepeaterMax]: 'Remove rows to stay within {max}',\n\t[keys.repeaterAddRow]: 'Add row',\n\t[keys.repeaterRemoveRow]: 'Remove',\n\t[keys.repeaterRow]: 'Row {n}',\n\t[keys.repeaterRowCount]: '{count} row(s)',\n\t[keys.submissionConsent]: 'Consent',\n\t[keys.submissionDetails]: 'Submission details',\n\t[keys.submissionConsentAgreed]: 'Agreed',\n\t[keys.submissionConsentDeclined]: 'Declined',\n\t[keys.submissionMetaReceivedAt]: 'Received at',\n\t[keys.submissionMetaIp]: 'IP address',\n\t[keys.submissionMetaUserAgent]: 'User agent',\n\t[keys.submissionMetaCaptcha]: 'Captcha',\n}\n"],"mappings":";;;;;;;AAOA,MAAa,KAAqC;EAChD,KAAK,aAAa;EAClB,KAAK,aAAa;EAClB,KAAK,gBAAgB;EACrB,KAAK,oBAAoB;EACzB,KAAK,iBAAiB;EACtB,KAAK,kBAAkB;EACvB,KAAK,kBAAkB;EACvB,KAAK,oBAAoB;EACzB,KAAK,gBAAgB;EACrB,KAAK,eAAe;EACpB,KAAK,oBAAoB;EACzB,KAAK,oBAAoB;EACzB,KAAK,qBAAqB;EAC1B,KAAK,kBAAkB;EACvB,KAAK,mBAAmB;EACxB,KAAK,mBAAmB;EACxB,KAAK,YAAY;EACjB,KAAK,WAAW;EAChB,KAAK,aAAa;EAClB,KAAK,cAAc;EACnB,KAAK,iBAAiB;EACtB,KAAK,cAAc;EACnB,KAAK,oBAAoB;EACzB,KAAK,oBAAoB;EACzB,KAAK,oBAAoB;EACzB,KAAK,qBAAqB;EAC1B,KAAK,oBAAoB;EACzB,KAAK,sBAAsB;EAC3B,KAAK,gBAAgB;EACrB,KAAK,gBAAgB;EACrB,KAAK,UAAU;EACf,KAAK,UAAU;EACf,KAAK,cAAc;EACnB,KAAK,YAAY;EACjB,KAAK,UAAU;EACf,KAAK,YAAY;EACjB,KAAK,mBAAmB;EACxB,KAAK,0BAA0B;EAC/B,KAAK,uBAAuB;EAC5B,KAAK,uBAAuB;EAC5B,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,qBAAqB;EAC1B,KAAK,mBAAmB;EACxB,KAAK,iBAAiB;EACtB,KAAK,mBAAmB;EACxB,KAAK,0BAA0B;EAC/B,KAAK,iCAAiC;EACtC,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,mBAAmB;EACxB,KAAK,iBAAiB;EACtB,KAAK,kBAAkB;EACvB,KAAK,iBAAiB;EACtB,KAAK,mBAAmB;EACxB,KAAK,yBAAyB;EAC9B,KAAK,0BAA0B;EAC/B,KAAK,0BAA0B;EAC/B,KAAK,4BAA4B;EACjC,KAAK,wBAAwB;EAC7B,KAAK,iBAAiB;EACtB,KAAK,eAAe;EACpB,KAAK,cAAc;EACnB,KAAK,kBAAkB;EACvB,KAAK,oBAAoB;EACzB,KAAK,iBAAiB;EACtB,KAAK,uBAAuB;EAC5B,KAAK,4BAA4B;EACjC,KAAK,gBAAgB;EACrB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,eAAe;EACpB,KAAK,uBAAuB;EAC5B,KAAK,mBAAmB;EACxB,KAAK,oBAAoB;EACzB,KAAK,4BAA4B;EACjC,KAAK,mBAAmB;EACxB,KAAK,oBAAoB;EACzB,KAAK,qBAAqB;EAC1B,KAAK,qBAAqB;EAC1B,KAAK,kBAAkB;EACvB,KAAK,qBAAqB;EAC1B,KAAK,sBAAsB;EAC3B,KAAK,iBAAiB;EACtB,KAAK,sBAAsB;EAC3B,KAAK,mBAAmB;EACxB,KAAK,sBAAsB;EAC3B,KAAK,kBAAkB;EACvB,KAAK,qBAAqB;EAC1B,KAAK,gBAAgB;EACrB,KAAK,sBAAsB;EAC3B,KAAK,6BAA6B;EAClC,KAAK,qBAAqB;EAC1B,KAAK,mBAAmB;EACxB,KAAK,uBAAuB;EAC5B,KAAK,0BAA0B;EAC/B,KAAK,qBAAqB;EAC1B,KAAK,wBAAwB;EAC7B,KAAK,8BAA8B;EACnC,KAAK,mBAAmB;EACxB,KAAK,yBAAyB;EAC9B,KAAK,sBAAsB;EAC3B,KAAK,4BAA4B;EACjC,KAAK,wBAAwB;EAC7B,KAAK,eAAe;EACpB,KAAK,mBAAmB;EACxB,KAAK,qBAAqB;EAC1B,KAAK,mBAAmB;EACxB,KAAK,oBAAoB;EACzB,KAAK,qBAAqB;EAC1B,KAAK,wBAAwB;EAC7B,KAAK,yBAAyB;EAC9B,KAAK,yBAAyB;EAC9B,KAAK,gBAAgB;EACrB,KAAK,uBAAuB;EAC5B,KAAK,sBAAsB;EAC3B,KAAK,oBAAoB;EACzB,KAAK,kBAAkB;EACvB,KAAK,eAAe;EACpB,KAAK,oBAAoB;EACzB,KAAK,yBAAyB;EAC9B,KAAK,uBAAuB;EAC5B,KAAK,+BAA+B;EACpC,KAAK,6BAA6B;EAClC,KAAK,iBAAiB;EACtB,KAAK,gBAAgB;EACrB,KAAK,oBAAoB;EACzB,KAAK,gBAAgB;EACrB,KAAK,gBAAgB;EACrB,KAAK,iBAAiB;EACtB,KAAK,kBAAkB;EACvB,KAAK,wBAAwB;EAC7B,KAAK,wBAAwB;EAC7B,KAAK,iBAAiB;EACtB,KAAK,oBAAoB;EACzB,KAAK,cAAc;EACnB,KAAK,mBAAmB;EACxB,KAAK,oBAAoB;EACzB,KAAK,oBAAoB;EACzB,KAAK,0BAA0B;EAC/B,KAAK,4BAA4B;EACjC,KAAK,2BAA2B;EAChC,KAAK,mBAAmB;EACxB,KAAK,0BAA0B;EAC/B,KAAK,wBAAwB;AAC/B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { TranslationKey, keys } from "./keys.js";
|
|
2
|
+
|
|
3
|
+
//#region src/translations/index.d.ts
|
|
4
|
+
/** Per-locale string overrides keyed by this plugin's typed translation keys. */
|
|
5
|
+
type TranslationsOption = {
|
|
6
|
+
[locale: string]: Partial<Record<TranslationKey, string>>;
|
|
7
|
+
};
|
|
8
|
+
/** Per-locale messages merged into `config.i18n.translations`. English only for now. */
|
|
9
|
+
declare const translations: {
|
|
10
|
+
en: Record<string, Record<string, string>>;
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { TranslationsOption, translations };
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import "./keys.js";
|
|
2
|
+
import { en } from "./en.js";
|
|
3
|
+
//#region src/translations/index.ts
|
|
4
|
+
/**
|
|
5
|
+
* Flat `formBuilder:foo` entries to the nested `{ formBuilder: { foo } }`
|
|
6
|
+
* shape Payload resolves `t('formBuilder:foo')` against (it splits on `:`).
|
|
7
|
+
* Undefined values are skipped so `Partial` override maps pass through.
|
|
8
|
+
*/
|
|
9
|
+
const toNested = (flat) => {
|
|
10
|
+
const out = {};
|
|
11
|
+
for (const [fullKey, value] of Object.entries(flat)) {
|
|
12
|
+
if (typeof value !== "string") continue;
|
|
13
|
+
const separator = fullKey.indexOf(":");
|
|
14
|
+
const namespace = fullKey.slice(0, separator);
|
|
15
|
+
const bucket = out[namespace] ?? {};
|
|
16
|
+
bucket[fullKey.slice(separator + 1)] = value;
|
|
17
|
+
out[namespace] = bucket;
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
};
|
|
21
|
+
/** Per-locale messages merged into `config.i18n.translations`. English only for now. */
|
|
22
|
+
const translations = { en: toNested(en) };
|
|
23
|
+
//#endregion
|
|
24
|
+
export { toNested, translations };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/translations/index.ts"],"sourcesContent":["import { en } from './en'\nimport type { TranslationKey } from './keys'\n\nexport type { TranslationKey } from './keys'\nexport { keys } from './keys'\n\n/** Per-locale string overrides keyed by this plugin's typed translation keys. */\nexport type TranslationsOption = {\n\t[locale: string]: Partial<Record<TranslationKey, string>>\n}\n\n/**\n * Flat `formBuilder:foo` entries to the nested `{ formBuilder: { foo } }`\n * shape Payload resolves `t('formBuilder:foo')` against (it splits on `:`).\n * Undefined values are skipped so `Partial` override maps pass through.\n */\nexport const toNested = (flat: {\n\t[key: string]: string | undefined\n}): Record<string, Record<string, string>> => {\n\tconst out: Record<string, Record<string, string>> = {}\n\tfor (const [fullKey, value] of Object.entries(flat)) {\n\t\tif (typeof value !== 'string') {\n\t\t\tcontinue\n\t\t}\n\t\tconst separator = fullKey.indexOf(':')\n\t\tconst namespace = fullKey.slice(0, separator)\n\t\tconst bucket = out[namespace] ?? {}\n\t\tbucket[fullKey.slice(separator + 1)] = value\n\t\tout[namespace] = bucket\n\t}\n\treturn out\n}\n\n/** Per-locale messages merged into `config.i18n.translations`. English only for now. */\nexport const translations = {\n\ten: toNested(en),\n}\n"],"mappings":";;;;;;;;AAgBA,MAAa,YAAY,SAEqB;CAC7C,MAAM,MAA8C,CAAC;CACrD,KAAK,MAAM,CAAC,SAAS,UAAU,OAAO,QAAQ,IAAI,GAAG;EACpD,IAAI,OAAO,UAAU,UACpB;EAED,MAAM,YAAY,QAAQ,QAAQ,GAAG;EACrC,MAAM,YAAY,QAAQ,MAAM,GAAG,SAAS;EAC5C,MAAM,SAAS,IAAI,cAAc,CAAC;EAClC,OAAO,QAAQ,MAAM,YAAY,CAAC,KAAK;EACvC,IAAI,aAAa;CAClB;CACA,OAAO;AACR;;AAGA,MAAa,eAAe,EAC3B,IAAI,SAAS,EAAE,EAChB"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
//#region src/translations/keys.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Typed translation keys. Lookups must go through these constants, not string
|
|
4
|
+
* literals (enforced by requireI18nKeysTyped.grit). Every key here must have a
|
|
5
|
+
* value in every locale (`en.ts`), or it is a type error.
|
|
6
|
+
*/
|
|
7
|
+
declare const keys: {
|
|
8
|
+
readonly pluginName: "formBuilder:pluginName";
|
|
9
|
+
readonly fieldTitle: "formBuilder:fieldTitle";
|
|
10
|
+
readonly fieldTypeText: "formBuilder:fieldType.text";
|
|
11
|
+
readonly fieldTypeTextarea: "formBuilder:fieldType.textarea";
|
|
12
|
+
readonly fieldTypeEmail: "formBuilder:fieldType.email";
|
|
13
|
+
readonly fieldTypeNumber: "formBuilder:fieldType.number";
|
|
14
|
+
readonly fieldTypeSelect: "formBuilder:fieldType.select";
|
|
15
|
+
readonly fieldTypeCheckbox: "formBuilder:fieldType.checkbox";
|
|
16
|
+
readonly configOptions: "formBuilder:config.options";
|
|
17
|
+
readonly configOption: "formBuilder:config.option";
|
|
18
|
+
readonly configOptionLabel: "formBuilder:config.optionLabel";
|
|
19
|
+
readonly configOptionValue: "formBuilder:config.optionValue";
|
|
20
|
+
readonly validationRequired: "formBuilder:validation.required";
|
|
21
|
+
readonly validationEmail: "formBuilder:validation.email";
|
|
22
|
+
readonly validationNumber: "formBuilder:validation.number";
|
|
23
|
+
readonly validationSelect: "formBuilder:validation.select";
|
|
24
|
+
readonly formatYes: "formBuilder:format.yes";
|
|
25
|
+
readonly formatNo: "formBuilder:format.no";
|
|
26
|
+
readonly configName: "formBuilder:config.name";
|
|
27
|
+
readonly configLabel: "formBuilder:config.label";
|
|
28
|
+
readonly configRequired: "formBuilder:config.required";
|
|
29
|
+
readonly configWidth: "formBuilder:config.width";
|
|
30
|
+
readonly configPlaceholder: "formBuilder:config.placeholder";
|
|
31
|
+
readonly configDescription: "formBuilder:config.description";
|
|
32
|
+
readonly configVisibleWhen: "formBuilder:config.visibleWhen";
|
|
33
|
+
readonly configValidateWhen: "formBuilder:config.validateWhen";
|
|
34
|
+
readonly submissionAnswers: "formBuilder:submission.answers";
|
|
35
|
+
readonly submissionNoAnswers: "formBuilder:submission.noAnswers";
|
|
36
|
+
readonly ruleMinLength: "formBuilder:rule.minLength.label";
|
|
37
|
+
readonly ruleMaxLength: "formBuilder:rule.maxLength.label";
|
|
38
|
+
readonly ruleMin: "formBuilder:rule.min.label";
|
|
39
|
+
readonly ruleMax: "formBuilder:rule.max.label";
|
|
40
|
+
readonly rulePattern: "formBuilder:rule.pattern.label";
|
|
41
|
+
readonly ruleEmail: "formBuilder:rule.email.label";
|
|
42
|
+
readonly ruleUrl: "formBuilder:rule.url.label";
|
|
43
|
+
readonly ruleOneOf: "formBuilder:rule.oneOf.label";
|
|
44
|
+
readonly ruleMatchesField: "formBuilder:rule.matchesField.label";
|
|
45
|
+
readonly ruleNotAlreadySubmitted: "formBuilder:rule.notAlreadySubmitted.label";
|
|
46
|
+
readonly ruleMinLengthMessage: "formBuilder:rule.minLength.message";
|
|
47
|
+
readonly ruleMaxLengthMessage: "formBuilder:rule.maxLength.message";
|
|
48
|
+
readonly ruleMinMessage: "formBuilder:rule.min.message";
|
|
49
|
+
readonly ruleMaxMessage: "formBuilder:rule.max.message";
|
|
50
|
+
readonly rulePatternMessage: "formBuilder:rule.pattern.message";
|
|
51
|
+
readonly ruleEmailMessage: "formBuilder:rule.email.message";
|
|
52
|
+
readonly ruleUrlMessage: "formBuilder:rule.url.message";
|
|
53
|
+
readonly ruleOneOfMessage: "formBuilder:rule.oneOf.message";
|
|
54
|
+
readonly ruleMatchesFieldMessage: "formBuilder:rule.matchesField.message";
|
|
55
|
+
readonly ruleNotAlreadySubmittedMessage: "formBuilder:rule.notAlreadySubmitted.message";
|
|
56
|
+
readonly ruleParamMin: "formBuilder:rule.param.min";
|
|
57
|
+
readonly ruleParamMax: "formBuilder:rule.param.max";
|
|
58
|
+
readonly ruleParamPattern: "formBuilder:rule.param.pattern";
|
|
59
|
+
readonly ruleParamFlags: "formBuilder:rule.param.flags";
|
|
60
|
+
readonly ruleParamValues: "formBuilder:rule.param.values";
|
|
61
|
+
readonly ruleParamField: "formBuilder:rule.param.field";
|
|
62
|
+
readonly validationsLabel: "formBuilder:validations.label";
|
|
63
|
+
readonly validationMessageLabel: "formBuilder:validations.message";
|
|
64
|
+
readonly validationSeverityLabel: "formBuilder:validations.severity";
|
|
65
|
+
readonly validationSeverityError: "formBuilder:validations.severity.error";
|
|
66
|
+
readonly validationSeverityWarning: "formBuilder:validations.severity.warning";
|
|
67
|
+
readonly conditionAddCondition: "formBuilder:condition.addCondition";
|
|
68
|
+
readonly conditionAddOr: "formBuilder:condition.addOr";
|
|
69
|
+
readonly conditionAnd: "formBuilder:condition.and";
|
|
70
|
+
readonly conditionOr: "formBuilder:condition.or";
|
|
71
|
+
readonly conditionRemove: "formBuilder:condition.remove";
|
|
72
|
+
readonly conditionNoFields: "formBuilder:condition.noFields";
|
|
73
|
+
readonly conditionEmpty: "formBuilder:condition.empty";
|
|
74
|
+
readonly conditionSelectField: "formBuilder:condition.selectField";
|
|
75
|
+
readonly conditionValuePlaceholder: "formBuilder:condition.value";
|
|
76
|
+
readonly conditionTrue: "formBuilder:condition.true";
|
|
77
|
+
readonly conditionFalse: "formBuilder:condition.false";
|
|
78
|
+
readonly configAdvanced: "formBuilder:config.advanced";
|
|
79
|
+
readonly configHidden: "formBuilder:config.hidden";
|
|
80
|
+
readonly fieldTypeCalculation: "formBuilder:fieldType.calculation";
|
|
81
|
+
readonly configExpression: "formBuilder:config.expression";
|
|
82
|
+
readonly configCalcDisplay: "formBuilder:config.calcDisplay";
|
|
83
|
+
readonly configDefaultPresentation: "formBuilder:config.defaultPresentation";
|
|
84
|
+
readonly presentationPage: "formBuilder:presentation.page";
|
|
85
|
+
readonly presentationModal: "formBuilder:presentation.modal";
|
|
86
|
+
readonly presentationDrawer: "formBuilder:presentation.drawer";
|
|
87
|
+
readonly presentationInline: "formBuilder:presentation.inline";
|
|
88
|
+
readonly actionEmailTeam: "formBuilder:action.emailTeam";
|
|
89
|
+
readonly actionConfirmation: "formBuilder:action.confirmation";
|
|
90
|
+
readonly actionSignedWebhook: "formBuilder:action.signedWebhook";
|
|
91
|
+
readonly actionConfigTo: "formBuilder:action.config.to";
|
|
92
|
+
readonly actionConfigSubject: "formBuilder:action.config.subject";
|
|
93
|
+
readonly actionConfigBody: "formBuilder:action.config.body";
|
|
94
|
+
readonly actionConfigToField: "formBuilder:action.config.toField";
|
|
95
|
+
readonly actionConfigUrl: "formBuilder:action.config.url";
|
|
96
|
+
readonly actionConfigSecret: "formBuilder:action.config.secret";
|
|
97
|
+
readonly configActions: "formBuilder:config.actions";
|
|
98
|
+
readonly consentSourceStatic: "formBuilder:consentSource.static";
|
|
99
|
+
readonly consentSourcePageReference: "formBuilder:consentSource.pageReference";
|
|
100
|
+
readonly consentConfigLabel: "formBuilder:consent.config.label";
|
|
101
|
+
readonly consentConfigUrl: "formBuilder:consent.config.url";
|
|
102
|
+
readonly consentConfigVersion: "formBuilder:consent.config.version";
|
|
103
|
+
readonly consentConfigRelationTo: "formBuilder:consent.config.relationTo";
|
|
104
|
+
readonly consentConfigDocId: "formBuilder:consent.config.docId";
|
|
105
|
+
readonly consentConfigUrlField: "formBuilder:consent.config.urlField";
|
|
106
|
+
readonly consentConfigCaptureVersion: "formBuilder:consent.config.captureVersion";
|
|
107
|
+
readonly fieldTypeConsent: "formBuilder:fieldType.consent";
|
|
108
|
+
readonly consentConfigStatement: "formBuilder:consent.config.statement";
|
|
109
|
+
readonly consentConfigSource: "formBuilder:consent.config.source";
|
|
110
|
+
readonly consentConfigSourceConfig: "formBuilder:consent.config.sourceConfig";
|
|
111
|
+
readonly consentConfigOptional: "formBuilder:consent.config.optional";
|
|
112
|
+
readonly resultsTitle: "formBuilder:results.title";
|
|
113
|
+
readonly resultsResponses: "formBuilder:results.responses";
|
|
114
|
+
readonly resultsNoResponses: "formBuilder:results.noResponses";
|
|
115
|
+
readonly resultsTruncated: "formBuilder:results.truncated";
|
|
116
|
+
readonly configShowResults: "formBuilder:config.showResults";
|
|
117
|
+
readonly configResultsField: "formBuilder:config.resultsField";
|
|
118
|
+
readonly validationFileMissing: "formBuilder:validation.file.missing";
|
|
119
|
+
readonly validationFileMimeType: "formBuilder:validation.file.mimeType";
|
|
120
|
+
readonly validationFileTooLarge: "formBuilder:validation.file.tooLarge";
|
|
121
|
+
readonly fieldTypeFile: "formBuilder:fieldType.file";
|
|
122
|
+
readonly fileConfigRelationTo: "formBuilder:file.config.relationTo";
|
|
123
|
+
readonly fileConfigMimeTypes: "formBuilder:file.config.mimeTypes";
|
|
124
|
+
readonly fileConfigMaxSize: "formBuilder:file.config.maxSize";
|
|
125
|
+
readonly spamRateLimited: "formBuilder:spam.rateLimited";
|
|
126
|
+
readonly spamRejected: "formBuilder:spam.rejected";
|
|
127
|
+
readonly spamCaptchaFailed: "formBuilder:spam.captchaFailed";
|
|
128
|
+
readonly collectionFormSingular: "formBuilder:collection.form.singular";
|
|
129
|
+
readonly collectionFormPlural: "formBuilder:collection.form.plural";
|
|
130
|
+
readonly collectionSubmissionSingular: "formBuilder:collection.submission.singular";
|
|
131
|
+
readonly collectionSubmissionPlural: "formBuilder:collection.submission.plural";
|
|
132
|
+
readonly statusComplete: "formBuilder:status.complete";
|
|
133
|
+
readonly statusPartial: "formBuilder:status.partial";
|
|
134
|
+
readonly fieldTypeRepeater: "formBuilder:fieldType.repeater";
|
|
135
|
+
readonly configMinRows: "formBuilder:config.minRows";
|
|
136
|
+
readonly configMaxRows: "formBuilder:config.maxRows";
|
|
137
|
+
readonly configAddLabel: "formBuilder:config.addLabel";
|
|
138
|
+
readonly configSubFields: "formBuilder:config.subFields";
|
|
139
|
+
readonly validationRepeaterMin: "formBuilder:validation.repeaterMin";
|
|
140
|
+
readonly validationRepeaterMax: "formBuilder:validation.repeaterMax";
|
|
141
|
+
readonly repeaterAddRow: "formBuilder:repeater.addRow";
|
|
142
|
+
readonly repeaterRemoveRow: "formBuilder:repeater.removeRow";
|
|
143
|
+
readonly repeaterRow: "formBuilder:repeater.row";
|
|
144
|
+
readonly repeaterRowCount: "formBuilder:repeater.rowCount";
|
|
145
|
+
readonly submissionConsent: "formBuilder:submission.consent";
|
|
146
|
+
readonly submissionDetails: "formBuilder:submission.details";
|
|
147
|
+
readonly submissionConsentAgreed: "formBuilder:submission.consentAgreed";
|
|
148
|
+
readonly submissionConsentDeclined: "formBuilder:submission.consentDeclined";
|
|
149
|
+
readonly submissionMetaReceivedAt: "formBuilder:submission.meta.receivedAt";
|
|
150
|
+
readonly submissionMetaIp: "formBuilder:submission.meta.ip";
|
|
151
|
+
readonly submissionMetaUserAgent: "formBuilder:submission.meta.userAgent";
|
|
152
|
+
readonly submissionMetaCaptcha: "formBuilder:submission.meta.captcha";
|
|
153
|
+
};
|
|
154
|
+
type TranslationKey = (typeof keys)[keyof typeof keys];
|
|
155
|
+
//#endregion
|
|
156
|
+
export { TranslationKey, keys };
|
|
157
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -124,9 +124,34 @@ const keys = {
|
|
|
124
124
|
fileConfigMaxSize: "formBuilder:file.config.maxSize",
|
|
125
125
|
spamRateLimited: "formBuilder:spam.rateLimited",
|
|
126
126
|
spamRejected: "formBuilder:spam.rejected",
|
|
127
|
-
spamCaptchaFailed: "formBuilder:spam.captchaFailed"
|
|
127
|
+
spamCaptchaFailed: "formBuilder:spam.captchaFailed",
|
|
128
|
+
collectionFormSingular: "formBuilder:collection.form.singular",
|
|
129
|
+
collectionFormPlural: "formBuilder:collection.form.plural",
|
|
130
|
+
collectionSubmissionSingular: "formBuilder:collection.submission.singular",
|
|
131
|
+
collectionSubmissionPlural: "formBuilder:collection.submission.plural",
|
|
132
|
+
statusComplete: "formBuilder:status.complete",
|
|
133
|
+
statusPartial: "formBuilder:status.partial",
|
|
134
|
+
fieldTypeRepeater: "formBuilder:fieldType.repeater",
|
|
135
|
+
configMinRows: "formBuilder:config.minRows",
|
|
136
|
+
configMaxRows: "formBuilder:config.maxRows",
|
|
137
|
+
configAddLabel: "formBuilder:config.addLabel",
|
|
138
|
+
configSubFields: "formBuilder:config.subFields",
|
|
139
|
+
validationRepeaterMin: "formBuilder:validation.repeaterMin",
|
|
140
|
+
validationRepeaterMax: "formBuilder:validation.repeaterMax",
|
|
141
|
+
repeaterAddRow: "formBuilder:repeater.addRow",
|
|
142
|
+
repeaterRemoveRow: "formBuilder:repeater.removeRow",
|
|
143
|
+
repeaterRow: "formBuilder:repeater.row",
|
|
144
|
+
repeaterRowCount: "formBuilder:repeater.rowCount",
|
|
145
|
+
submissionConsent: "formBuilder:submission.consent",
|
|
146
|
+
submissionDetails: "formBuilder:submission.details",
|
|
147
|
+
submissionConsentAgreed: "formBuilder:submission.consentAgreed",
|
|
148
|
+
submissionConsentDeclined: "formBuilder:submission.consentDeclined",
|
|
149
|
+
submissionMetaReceivedAt: "formBuilder:submission.meta.receivedAt",
|
|
150
|
+
submissionMetaIp: "formBuilder:submission.meta.ip",
|
|
151
|
+
submissionMetaUserAgent: "formBuilder:submission.meta.userAgent",
|
|
152
|
+
submissionMetaCaptcha: "formBuilder:submission.meta.captcha"
|
|
128
153
|
};
|
|
129
154
|
//#endregion
|
|
130
|
-
export { keys
|
|
155
|
+
export { keys };
|
|
131
156
|
|
|
132
|
-
//# sourceMappingURL=keys
|
|
157
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","names":[],"sources":["../../src/translations/keys.ts"],"sourcesContent":["/**\n * Typed translation keys. Lookups must go through these constants, not string\n * literals (enforced by requireI18nKeysTyped.grit). Every key here must have a\n * value in every locale (`en.ts`), or it is a type error.\n */\nexport const keys = {\n\tpluginName: 'formBuilder:pluginName',\n\tfieldTitle: 'formBuilder:fieldTitle',\n\tfieldTypeText: 'formBuilder:fieldType.text',\n\tfieldTypeTextarea: 'formBuilder:fieldType.textarea',\n\tfieldTypeEmail: 'formBuilder:fieldType.email',\n\tfieldTypeNumber: 'formBuilder:fieldType.number',\n\tfieldTypeSelect: 'formBuilder:fieldType.select',\n\tfieldTypeCheckbox: 'formBuilder:fieldType.checkbox',\n\tconfigOptions: 'formBuilder:config.options',\n\tconfigOption: 'formBuilder:config.option',\n\tconfigOptionLabel: 'formBuilder:config.optionLabel',\n\tconfigOptionValue: 'formBuilder:config.optionValue',\n\tvalidationRequired: 'formBuilder:validation.required',\n\tvalidationEmail: 'formBuilder:validation.email',\n\tvalidationNumber: 'formBuilder:validation.number',\n\tvalidationSelect: 'formBuilder:validation.select',\n\tformatYes: 'formBuilder:format.yes',\n\tformatNo: 'formBuilder:format.no',\n\tconfigName: 'formBuilder:config.name',\n\tconfigLabel: 'formBuilder:config.label',\n\tconfigRequired: 'formBuilder:config.required',\n\tconfigWidth: 'formBuilder:config.width',\n\tconfigPlaceholder: 'formBuilder:config.placeholder',\n\tconfigDescription: 'formBuilder:config.description',\n\tconfigVisibleWhen: 'formBuilder:config.visibleWhen',\n\tconfigValidateWhen: 'formBuilder:config.validateWhen',\n\tsubmissionAnswers: 'formBuilder:submission.answers',\n\tsubmissionNoAnswers: 'formBuilder:submission.noAnswers',\n\truleMinLength: 'formBuilder:rule.minLength.label',\n\truleMaxLength: 'formBuilder:rule.maxLength.label',\n\truleMin: 'formBuilder:rule.min.label',\n\truleMax: 'formBuilder:rule.max.label',\n\trulePattern: 'formBuilder:rule.pattern.label',\n\truleEmail: 'formBuilder:rule.email.label',\n\truleUrl: 'formBuilder:rule.url.label',\n\truleOneOf: 'formBuilder:rule.oneOf.label',\n\truleMatchesField: 'formBuilder:rule.matchesField.label',\n\truleNotAlreadySubmitted: 'formBuilder:rule.notAlreadySubmitted.label',\n\truleMinLengthMessage: 'formBuilder:rule.minLength.message',\n\truleMaxLengthMessage: 'formBuilder:rule.maxLength.message',\n\truleMinMessage: 'formBuilder:rule.min.message',\n\truleMaxMessage: 'formBuilder:rule.max.message',\n\trulePatternMessage: 'formBuilder:rule.pattern.message',\n\truleEmailMessage: 'formBuilder:rule.email.message',\n\truleUrlMessage: 'formBuilder:rule.url.message',\n\truleOneOfMessage: 'formBuilder:rule.oneOf.message',\n\truleMatchesFieldMessage: 'formBuilder:rule.matchesField.message',\n\truleNotAlreadySubmittedMessage: 'formBuilder:rule.notAlreadySubmitted.message',\n\truleParamMin: 'formBuilder:rule.param.min',\n\truleParamMax: 'formBuilder:rule.param.max',\n\truleParamPattern: 'formBuilder:rule.param.pattern',\n\truleParamFlags: 'formBuilder:rule.param.flags',\n\truleParamValues: 'formBuilder:rule.param.values',\n\truleParamField: 'formBuilder:rule.param.field',\n\tvalidationsLabel: 'formBuilder:validations.label',\n\tvalidationMessageLabel: 'formBuilder:validations.message',\n\tvalidationSeverityLabel: 'formBuilder:validations.severity',\n\tvalidationSeverityError: 'formBuilder:validations.severity.error',\n\tvalidationSeverityWarning: 'formBuilder:validations.severity.warning',\n\tconditionAddCondition: 'formBuilder:condition.addCondition',\n\tconditionAddOr: 'formBuilder:condition.addOr',\n\tconditionAnd: 'formBuilder:condition.and',\n\tconditionOr: 'formBuilder:condition.or',\n\tconditionRemove: 'formBuilder:condition.remove',\n\tconditionNoFields: 'formBuilder:condition.noFields',\n\tconditionEmpty: 'formBuilder:condition.empty',\n\tconditionSelectField: 'formBuilder:condition.selectField',\n\tconditionValuePlaceholder: 'formBuilder:condition.value',\n\tconditionTrue: 'formBuilder:condition.true',\n\tconditionFalse: 'formBuilder:condition.false',\n\tconfigAdvanced: 'formBuilder:config.advanced',\n\tconfigHidden: 'formBuilder:config.hidden',\n\tfieldTypeCalculation: 'formBuilder:fieldType.calculation',\n\tconfigExpression: 'formBuilder:config.expression',\n\tconfigCalcDisplay: 'formBuilder:config.calcDisplay',\n\tconfigDefaultPresentation: 'formBuilder:config.defaultPresentation',\n\tpresentationPage: 'formBuilder:presentation.page',\n\tpresentationModal: 'formBuilder:presentation.modal',\n\tpresentationDrawer: 'formBuilder:presentation.drawer',\n\tpresentationInline: 'formBuilder:presentation.inline',\n\tactionEmailTeam: 'formBuilder:action.emailTeam',\n\tactionConfirmation: 'formBuilder:action.confirmation',\n\tactionSignedWebhook: 'formBuilder:action.signedWebhook',\n\tactionConfigTo: 'formBuilder:action.config.to',\n\tactionConfigSubject: 'formBuilder:action.config.subject',\n\tactionConfigBody: 'formBuilder:action.config.body',\n\tactionConfigToField: 'formBuilder:action.config.toField',\n\tactionConfigUrl: 'formBuilder:action.config.url',\n\tactionConfigSecret: 'formBuilder:action.config.secret',\n\tconfigActions: 'formBuilder:config.actions',\n\tconsentSourceStatic: 'formBuilder:consentSource.static',\n\tconsentSourcePageReference: 'formBuilder:consentSource.pageReference',\n\tconsentConfigLabel: 'formBuilder:consent.config.label',\n\tconsentConfigUrl: 'formBuilder:consent.config.url',\n\tconsentConfigVersion: 'formBuilder:consent.config.version',\n\tconsentConfigRelationTo: 'formBuilder:consent.config.relationTo',\n\tconsentConfigDocId: 'formBuilder:consent.config.docId',\n\tconsentConfigUrlField: 'formBuilder:consent.config.urlField',\n\tconsentConfigCaptureVersion: 'formBuilder:consent.config.captureVersion',\n\tfieldTypeConsent: 'formBuilder:fieldType.consent',\n\tconsentConfigStatement: 'formBuilder:consent.config.statement',\n\tconsentConfigSource: 'formBuilder:consent.config.source',\n\tconsentConfigSourceConfig: 'formBuilder:consent.config.sourceConfig',\n\tconsentConfigOptional: 'formBuilder:consent.config.optional',\n\tresultsTitle: 'formBuilder:results.title',\n\tresultsResponses: 'formBuilder:results.responses',\n\tresultsNoResponses: 'formBuilder:results.noResponses',\n\tresultsTruncated: 'formBuilder:results.truncated',\n\tconfigShowResults: 'formBuilder:config.showResults',\n\tconfigResultsField: 'formBuilder:config.resultsField',\n\tvalidationFileMissing: 'formBuilder:validation.file.missing',\n\tvalidationFileMimeType: 'formBuilder:validation.file.mimeType',\n\tvalidationFileTooLarge: 'formBuilder:validation.file.tooLarge',\n\tfieldTypeFile: 'formBuilder:fieldType.file',\n\tfileConfigRelationTo: 'formBuilder:file.config.relationTo',\n\tfileConfigMimeTypes: 'formBuilder:file.config.mimeTypes',\n\tfileConfigMaxSize: 'formBuilder:file.config.maxSize',\n\tspamRateLimited: 'formBuilder:spam.rateLimited',\n\tspamRejected: 'formBuilder:spam.rejected',\n\tspamCaptchaFailed: 'formBuilder:spam.captchaFailed',\n\tcollectionFormSingular: 'formBuilder:collection.form.singular',\n\tcollectionFormPlural: 'formBuilder:collection.form.plural',\n\tcollectionSubmissionSingular: 'formBuilder:collection.submission.singular',\n\tcollectionSubmissionPlural: 'formBuilder:collection.submission.plural',\n\tstatusComplete: 'formBuilder:status.complete',\n\tstatusPartial: 'formBuilder:status.partial',\n\tfieldTypeRepeater: 'formBuilder:fieldType.repeater',\n\tconfigMinRows: 'formBuilder:config.minRows',\n\tconfigMaxRows: 'formBuilder:config.maxRows',\n\tconfigAddLabel: 'formBuilder:config.addLabel',\n\tconfigSubFields: 'formBuilder:config.subFields',\n\tvalidationRepeaterMin: 'formBuilder:validation.repeaterMin',\n\tvalidationRepeaterMax: 'formBuilder:validation.repeaterMax',\n\trepeaterAddRow: 'formBuilder:repeater.addRow',\n\trepeaterRemoveRow: 'formBuilder:repeater.removeRow',\n\trepeaterRow: 'formBuilder:repeater.row',\n\trepeaterRowCount: 'formBuilder:repeater.rowCount',\n\tsubmissionConsent: 'formBuilder:submission.consent',\n\tsubmissionDetails: 'formBuilder:submission.details',\n\tsubmissionConsentAgreed: 'formBuilder:submission.consentAgreed',\n\tsubmissionConsentDeclined: 'formBuilder:submission.consentDeclined',\n\tsubmissionMetaReceivedAt: 'formBuilder:submission.meta.receivedAt',\n\tsubmissionMetaIp: 'formBuilder:submission.meta.ip',\n\tsubmissionMetaUserAgent: 'formBuilder:submission.meta.userAgent',\n\tsubmissionMetaCaptcha: 'formBuilder:submission.meta.captcha',\n} as const\n\nexport type TranslationKey = (typeof keys)[keyof typeof keys]\n"],"mappings":";;;;;;AAKA,MAAa,OAAO;CACnB,YAAY;CACZ,YAAY;CACZ,eAAe;CACf,mBAAmB;CACnB,gBAAgB;CAChB,iBAAiB;CACjB,iBAAiB;CACjB,mBAAmB;CACnB,eAAe;CACf,cAAc;CACd,mBAAmB;CACnB,mBAAmB;CACnB,oBAAoB;CACpB,iBAAiB;CACjB,kBAAkB;CAClB,kBAAkB;CAClB,WAAW;CACX,UAAU;CACV,YAAY;CACZ,aAAa;CACb,gBAAgB;CAChB,aAAa;CACb,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,oBAAoB;CACpB,mBAAmB;CACnB,qBAAqB;CACrB,eAAe;CACf,eAAe;CACf,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,SAAS;CACT,WAAW;CACX,kBAAkB;CAClB,yBAAyB;CACzB,sBAAsB;CACtB,sBAAsB;CACtB,gBAAgB;CAChB,gBAAgB;CAChB,oBAAoB;CACpB,kBAAkB;CAClB,gBAAgB;CAChB,kBAAkB;CAClB,yBAAyB;CACzB,gCAAgC;CAChC,cAAc;CACd,cAAc;CACd,kBAAkB;CAClB,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,wBAAwB;CACxB,yBAAyB;CACzB,yBAAyB;CACzB,2BAA2B;CAC3B,uBAAuB;CACvB,gBAAgB;CAChB,cAAc;CACd,aAAa;CACb,iBAAiB;CACjB,mBAAmB;CACnB,gBAAgB;CAChB,sBAAsB;CACtB,2BAA2B;CAC3B,eAAe;CACf,gBAAgB;CAChB,gBAAgB;CAChB,cAAc;CACd,sBAAsB;CACtB,kBAAkB;CAClB,mBAAmB;CACnB,2BAA2B;CAC3B,kBAAkB;CAClB,mBAAmB;CACnB,oBAAoB;CACpB,oBAAoB;CACpB,iBAAiB;CACjB,oBAAoB;CACpB,qBAAqB;CACrB,gBAAgB;CAChB,qBAAqB;CACrB,kBAAkB;CAClB,qBAAqB;CACrB,iBAAiB;CACjB,oBAAoB;CACpB,eAAe;CACf,qBAAqB;CACrB,4BAA4B;CAC5B,oBAAoB;CACpB,kBAAkB;CAClB,sBAAsB;CACtB,yBAAyB;CACzB,oBAAoB;CACpB,uBAAuB;CACvB,6BAA6B;CAC7B,kBAAkB;CAClB,wBAAwB;CACxB,qBAAqB;CACrB,2BAA2B;CAC3B,uBAAuB;CACvB,cAAc;CACd,kBAAkB;CAClB,oBAAoB;CACpB,kBAAkB;CAClB,mBAAmB;CACnB,oBAAoB;CACpB,uBAAuB;CACvB,wBAAwB;CACxB,wBAAwB;CACxB,eAAe;CACf,sBAAsB;CACtB,qBAAqB;CACrB,mBAAmB;CACnB,iBAAiB;CACjB,cAAc;CACd,mBAAmB;CACnB,wBAAwB;CACxB,sBAAsB;CACtB,8BAA8B;CAC9B,4BAA4B;CAC5B,gBAAgB;CAChB,eAAe;CACf,mBAAmB;CACnB,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,iBAAiB;CACjB,uBAAuB;CACvB,uBAAuB;CACvB,gBAAgB;CAChB,mBAAmB;CACnB,aAAa;CACb,kBAAkB;CAClB,mBAAmB;CACnB,mBAAmB;CACnB,yBAAyB;CACzB,2BAA2B;CAC3B,0BAA0B;CAC1B,kBAAkB;CAClB,yBAAyB;CACzB,uBAAuB;AACxB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { RendererTranslate } from "../react/contract.js";
|
|
2
|
+
|
|
3
|
+
//#region src/translations/makeTranslate.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Creates a `RendererTranslate` function from a flat key→string map (e.g. the bundled `en` map).
|
|
6
|
+
* Unknown keys fall back to the key itself so nothing crashes when running against an incomplete map.
|
|
7
|
+
*/
|
|
8
|
+
declare const makeTranslate: (map: Record<string, string>) => RendererTranslate;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { makeTranslate };
|
|
11
|
+
//# sourceMappingURL=makeTranslate.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
//#region src/translations/makeTranslate.ts
|
|
3
|
+
/**
|
|
4
|
+
* Creates a `RendererTranslate` function from a flat key→string map (e.g. the bundled `en` map).
|
|
5
|
+
* Unknown keys fall back to the key itself so nothing crashes when running against an incomplete map.
|
|
6
|
+
*/
|
|
7
|
+
const makeTranslate = (map) => (key) => map[key] ?? key;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { makeTranslate };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=makeTranslate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"makeTranslate.js","names":[],"sources":["../../src/translations/makeTranslate.ts"],"sourcesContent":["'use client'\n\nimport type { RendererTranslate } from '../react/contract'\n\n/**\n * Creates a `RendererTranslate` function from a flat key→string map (e.g. the bundled `en` map).\n * Unknown keys fall back to the key itself so nothing crashes when running against an incomplete map.\n */\nexport const makeTranslate =\n\t(map: Record<string, string>): RendererTranslate =>\n\t(key) =>\n\t\tmap[key] ?? key\n"],"mappings":";;;;;;AAQA,MAAa,iBACX,SACA,QACA,IAAI,QAAQ"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
//#region src/translations/server.ts
|
|
2
|
+
/**
|
|
3
|
+
* Adapt a Payload request `t` (typed to core keys only) so it also accepts this
|
|
4
|
+
* plugin's keys. They are registered at config time and resolve at runtime; the
|
|
5
|
+
* cast only widens the compile-time key domain.
|
|
6
|
+
*/
|
|
7
|
+
const asTranslate = (t) => t;
|
|
8
|
+
/**
|
|
9
|
+
* Adapt a Payload request `t` to the engine-facing `Translate` the submission core and field-type
|
|
10
|
+
* `format`/`validate` speak (any key string). Same runtime function as `asTranslate`; this widening
|
|
11
|
+
* accepts arbitrary keys because the engine resolves both this plugin's and a host's registered keys.
|
|
12
|
+
*/
|
|
13
|
+
const asFieldTranslate = (t) => t;
|
|
14
|
+
/** A field `label`/`description` backed by a typed key, resolved per request. */
|
|
15
|
+
const labelForKey = (key) => ({ t }) => asTranslate(t)(key);
|
|
16
|
+
/**
|
|
17
|
+
* A `label`/`description` from an arbitrary key string (a field-type-supplied label, which may be a
|
|
18
|
+
* host-registered key or a literal; Payload's `t` returns the input unchanged when unknown). Distinct
|
|
19
|
+
* from `labelForKey`, which constrains to this plugin's typed keys.
|
|
20
|
+
*/
|
|
21
|
+
const labelFor = (key) => ({ t }) => asTranslate(t)(key);
|
|
22
|
+
//#endregion
|
|
23
|
+
export { asFieldTranslate, asTranslate, labelFor, labelForKey };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","names":[],"sources":["../../src/translations/server.ts"],"sourcesContent":["import type { LabelFunction } from 'payload'\n\nimport type { Translate as FieldTranslate } from '../fields/types'\nimport type { TranslationKey } from './keys'\n\n/** A `t`-like function narrowed to this plugin's typed keys. */\ntype Translate = (key: TranslationKey) => string\n\n/**\n * Adapt a Payload request `t` (typed to core keys only) so it also accepts this\n * plugin's keys. They are registered at config time and resolve at runtime; the\n * cast only widens the compile-time key domain.\n */\nexport const asTranslate = (t: unknown): Translate => t as Translate\n\n/**\n * Adapt a Payload request `t` to the engine-facing `Translate` the submission core and field-type\n * `format`/`validate` speak (any key string). Same runtime function as `asTranslate`; this widening\n * accepts arbitrary keys because the engine resolves both this plugin's and a host's registered keys.\n */\nexport const asFieldTranslate = (t: unknown): FieldTranslate => t as FieldTranslate\n\n/** A field `label`/`description` backed by a typed key, resolved per request. */\nexport const labelForKey =\n\t(key: TranslationKey): LabelFunction =>\n\t({ t }) =>\n\t\tasTranslate(t)(key)\n\n/**\n * A `label`/`description` from an arbitrary key string (a field-type-supplied label, which may be a\n * host-registered key or a literal; Payload's `t` returns the input unchanged when unknown). Distinct\n * from `labelForKey`, which constrains to this plugin's typed keys.\n */\nexport const labelFor =\n\t(key: string): LabelFunction =>\n\t({ t }) =>\n\t\tasTranslate(t)(key as TranslationKey)\n"],"mappings":";;;;;;AAaA,MAAa,eAAe,MAA0B;;;;;;AAOtD,MAAa,oBAAoB,MAA+B;;AAGhE,MAAa,eACX,SACA,EAAE,QACF,YAAY,CAAC,EAAE,GAAG;;;;;;AAOpB,MAAa,YACX,SACA,EAAE,QACF,YAAY,CAAC,EAAE,GAAqB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useTranslation } from "@payloadcms/ui";
|
|
3
|
+
//#region src/translations/useTranslation.ts
|
|
4
|
+
/**
|
|
5
|
+
* `useTranslation` bound to this plugin's keys, so `t(keys.X)` typechecks without
|
|
6
|
+
* a per-call `@ts-expect-error`. Returns Payload's `{ t, i18n }` unchanged.
|
|
7
|
+
*/
|
|
8
|
+
const useTranslation$1 = () => useTranslation();
|
|
9
|
+
//#endregion
|
|
10
|
+
export { useTranslation$1 as useTranslation };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=useTranslation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTranslation.js","names":["useTranslation","usePayloadTranslation"],"sources":["../../src/translations/useTranslation.ts"],"sourcesContent":["'use client'\n\nimport { useTranslation as usePayloadTranslation } from '@payloadcms/ui'\n\nimport type { TranslationKey } from './keys'\n\n/**\n * `useTranslation` bound to this plugin's keys, so `t(keys.X)` typechecks without\n * a per-call `@ts-expect-error`. Returns Payload's `{ t, i18n }` unchanged.\n */\nexport const useTranslation = () => usePayloadTranslation<Record<string, never>, TranslationKey>()\n"],"mappings":";;;;;;;AAUA,MAAaA,yBAAuBC,eAA6D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { FileFieldConfig } from "./types.js";
|
|
2
|
+
import { ResolveFileRefResult } from "./resolveFileRef.js";
|
|
3
|
+
import { Payload, PayloadRequest } from "payload";
|
|
4
|
+
|
|
5
|
+
//#region src/uploads/captureFileRef.d.ts
|
|
6
|
+
type CaptureFileRefArgs = {
|
|
7
|
+
payload: Payload;
|
|
8
|
+
collectionSlug: string;
|
|
9
|
+
uploadId: string | number;
|
|
10
|
+
config: FileFieldConfig;
|
|
11
|
+
req?: PayloadRequest; /** Resolved submitter identity; must match the upload's `owner` stamp when both are present. */
|
|
12
|
+
expectedOwner?: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Load the referenced upload doc and run the pure trust-boundary check. The client sends only the id; the
|
|
16
|
+
* filename/mimeType/filesize are read authoritatively from the stored doc, never from the client. When the
|
|
17
|
+
* upload carries an `owner` stamp AND the submitter is identifiable, the two must match, so an anonymous
|
|
18
|
+
* submitter cannot capture another identity's upload; a mismatch collapses to `missing`, indistinguishable
|
|
19
|
+
* from a deleted upload. When the submitter cannot be identified (no `expectedOwner`), ownership is not
|
|
20
|
+
* enforced (fail-open, consistent with rate-limiting): a proxy-configured deployment identifies every
|
|
21
|
+
* request, so this only relaxes scoping where it could not be applied fairly anyway. Unstamped uploads
|
|
22
|
+
* (no identity at upload time, or a BYO collection without the field) pass unchanged.
|
|
23
|
+
*/
|
|
24
|
+
declare const captureFileRef: (args: CaptureFileRefArgs) => Promise<ResolveFileRefResult>;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { captureFileRef };
|
|
27
|
+
//# sourceMappingURL=captureFileRef.d.ts.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { resolveFileRef } from "./resolveFileRef.js";
|
|
2
|
+
//#region src/uploads/captureFileRef.ts
|
|
3
|
+
/**
|
|
4
|
+
* Load the referenced upload doc and run the pure trust-boundary check. The client sends only the id; the
|
|
5
|
+
* filename/mimeType/filesize are read authoritatively from the stored doc, never from the client. When the
|
|
6
|
+
* upload carries an `owner` stamp AND the submitter is identifiable, the two must match, so an anonymous
|
|
7
|
+
* submitter cannot capture another identity's upload; a mismatch collapses to `missing`, indistinguishable
|
|
8
|
+
* from a deleted upload. When the submitter cannot be identified (no `expectedOwner`), ownership is not
|
|
9
|
+
* enforced (fail-open, consistent with rate-limiting): a proxy-configured deployment identifies every
|
|
10
|
+
* request, so this only relaxes scoping where it could not be applied fairly anyway. Unstamped uploads
|
|
11
|
+
* (no identity at upload time, or a BYO collection without the field) pass unchanged.
|
|
12
|
+
*/
|
|
13
|
+
const captureFileRef = async (args) => {
|
|
14
|
+
const { payload, collectionSlug, uploadId, config, req, expectedOwner } = args;
|
|
15
|
+
const doc = await payload.findByID({
|
|
16
|
+
collection: collectionSlug,
|
|
17
|
+
id: uploadId,
|
|
18
|
+
depth: 0,
|
|
19
|
+
overrideAccess: true,
|
|
20
|
+
req
|
|
21
|
+
}).catch(() => null);
|
|
22
|
+
if (doc && expectedOwner != null) {
|
|
23
|
+
const owner = doc.owner;
|
|
24
|
+
if (typeof owner === "string" && owner.length > 0 && owner !== expectedOwner) return {
|
|
25
|
+
ok: false,
|
|
26
|
+
code: "missing"
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return resolveFileRef(doc, config);
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export { captureFileRef };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=captureFileRef.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captureFileRef.js","names":[],"sources":["../../src/uploads/captureFileRef.ts"],"sourcesContent":["import type { CollectionSlug, Payload, PayloadRequest } from 'payload'\nimport { type ResolveFileRefResult, resolveFileRef } from './resolveFileRef'\nimport type { FileFieldConfig } from './types'\n\nexport type CaptureFileRefArgs = {\n\tpayload: Payload\n\tcollectionSlug: string\n\tuploadId: string | number\n\tconfig: FileFieldConfig\n\treq?: PayloadRequest\n\t/** Resolved submitter identity; must match the upload's `owner` stamp when both are present. */\n\texpectedOwner?: string\n}\n\n/**\n * Load the referenced upload doc and run the pure trust-boundary check. The client sends only the id; the\n * filename/mimeType/filesize are read authoritatively from the stored doc, never from the client. When the\n * upload carries an `owner` stamp AND the submitter is identifiable, the two must match, so an anonymous\n * submitter cannot capture another identity's upload; a mismatch collapses to `missing`, indistinguishable\n * from a deleted upload. When the submitter cannot be identified (no `expectedOwner`), ownership is not\n * enforced (fail-open, consistent with rate-limiting): a proxy-configured deployment identifies every\n * request, so this only relaxes scoping where it could not be applied fairly anyway. Unstamped uploads\n * (no identity at upload time, or a BYO collection without the field) pass unchanged.\n */\nexport const captureFileRef = async (args: CaptureFileRefArgs): Promise<ResolveFileRefResult> => {\n\tconst { payload, collectionSlug, uploadId, config, req, expectedOwner } = args\n\tconst doc = await payload\n\t\t.findByID({\n\t\t\tcollection: collectionSlug as CollectionSlug,\n\t\t\tid: uploadId,\n\t\t\tdepth: 0,\n\t\t\toverrideAccess: true,\n\t\t\treq,\n\t\t})\n\t\t.catch(() => null)\n\tif (doc && expectedOwner != null) {\n\t\tconst owner = (doc as { owner?: unknown }).owner\n\t\tif (typeof owner === 'string' && owner.length > 0 && owner !== expectedOwner) {\n\t\t\treturn { ok: false, code: 'missing' }\n\t\t}\n\t}\n\treturn resolveFileRef(doc, config)\n}\n"],"mappings":";;;;;;;;;;;;AAwBA,MAAa,iBAAiB,OAAO,SAA4D;CAChG,MAAM,EAAE,SAAS,gBAAgB,UAAU,QAAQ,KAAK,kBAAkB;CAC1E,MAAM,MAAM,MAAM,QAChB,SAAS;EACT,YAAY;EACZ,IAAI;EACJ,OAAO;EACP,gBAAgB;EAChB;CACD,CAAC,EACA,YAAY,IAAI;CAClB,IAAI,OAAO,iBAAiB,MAAM;EACjC,MAAM,QAAS,IAA4B;EAC3C,IAAI,OAAO,UAAU,YAAY,MAAM,SAAS,KAAK,UAAU,eAC9D,OAAO;GAAE,IAAI;GAAO,MAAM;EAAU;CAEtC;CACA,OAAO,eAAe,KAAK,MAAM;AAClC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { FileFieldConfig, FileRef, FileRefError } from "./types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/uploads/resolveFileRef.d.ts
|
|
4
|
+
type UploadDoc = {
|
|
5
|
+
id?: string | number;
|
|
6
|
+
filename?: unknown;
|
|
7
|
+
mimeType?: unknown;
|
|
8
|
+
filesize?: unknown;
|
|
9
|
+
url?: unknown;
|
|
10
|
+
};
|
|
11
|
+
type ResolveFileRefResult = {
|
|
12
|
+
ok: true;
|
|
13
|
+
ref: FileRef;
|
|
14
|
+
} | {
|
|
15
|
+
ok: false;
|
|
16
|
+
code: FileRefError;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Pure server trust-boundary check for an uploaded file: given the loaded upload doc (or null) and the
|
|
20
|
+
* field's constraints, either return an authoritative `FileRef` snapshot or a rejection code. Never trusts
|
|
21
|
+
* client metadata; the caller passes the doc it loaded from the upload collection.
|
|
22
|
+
*/
|
|
23
|
+
declare const resolveFileRef: (doc: UploadDoc | null | undefined, config: FileFieldConfig) => ResolveFileRefResult;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { ResolveFileRefResult, resolveFileRef };
|
|
26
|
+
//# sourceMappingURL=resolveFileRef.d.ts.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//#region src/uploads/resolveFileRef.ts
|
|
2
|
+
const mimeAllowed = (mimeType, allow) => {
|
|
3
|
+
if (!allow || allow.length === 0) return true;
|
|
4
|
+
return allow.some((pattern) => {
|
|
5
|
+
if (pattern.endsWith("/*")) return mimeType.startsWith(pattern.slice(0, -1));
|
|
6
|
+
return mimeType === pattern;
|
|
7
|
+
});
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Pure server trust-boundary check for an uploaded file: given the loaded upload doc (or null) and the
|
|
11
|
+
* field's constraints, either return an authoritative `FileRef` snapshot or a rejection code. Never trusts
|
|
12
|
+
* client metadata; the caller passes the doc it loaded from the upload collection.
|
|
13
|
+
*/
|
|
14
|
+
const resolveFileRef = (doc, config) => {
|
|
15
|
+
if (doc == null || doc.id == null) return {
|
|
16
|
+
ok: false,
|
|
17
|
+
code: "missing"
|
|
18
|
+
};
|
|
19
|
+
const mimeType = typeof doc.mimeType === "string" ? doc.mimeType : "";
|
|
20
|
+
const filesize = typeof doc.filesize === "number" ? doc.filesize : 0;
|
|
21
|
+
if (!mimeAllowed(mimeType, config.mimeTypes)) return {
|
|
22
|
+
ok: false,
|
|
23
|
+
code: "mimeType"
|
|
24
|
+
};
|
|
25
|
+
if (typeof config.maxSize === "number" && filesize > config.maxSize) return {
|
|
26
|
+
ok: false,
|
|
27
|
+
code: "tooLarge"
|
|
28
|
+
};
|
|
29
|
+
const ref = {
|
|
30
|
+
id: doc.id,
|
|
31
|
+
filename: typeof doc.filename === "string" ? doc.filename : "",
|
|
32
|
+
mimeType,
|
|
33
|
+
filesize
|
|
34
|
+
};
|
|
35
|
+
if (typeof doc.url === "string" && doc.url.length > 0) ref.url = doc.url;
|
|
36
|
+
return {
|
|
37
|
+
ok: true,
|
|
38
|
+
ref
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
//#endregion
|
|
42
|
+
export { resolveFileRef };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=resolveFileRef.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveFileRef.js","names":[],"sources":["../../src/uploads/resolveFileRef.ts"],"sourcesContent":["import type { FileFieldConfig, FileRef, FileRefError } from './types'\n\ntype UploadDoc = {\n\tid?: string | number\n\tfilename?: unknown\n\tmimeType?: unknown\n\tfilesize?: unknown\n\turl?: unknown\n}\n\nexport type ResolveFileRefResult = { ok: true; ref: FileRef } | { ok: false; code: FileRefError }\n\nconst mimeAllowed = (mimeType: string, allow: string[] | undefined): boolean => {\n\tif (!allow || allow.length === 0) {\n\t\treturn true\n\t}\n\treturn allow.some((pattern) => {\n\t\tif (pattern.endsWith('/*')) {\n\t\t\treturn mimeType.startsWith(pattern.slice(0, -1))\n\t\t}\n\t\treturn mimeType === pattern\n\t})\n}\n\n/**\n * Pure server trust-boundary check for an uploaded file: given the loaded upload doc (or null) and the\n * field's constraints, either return an authoritative `FileRef` snapshot or a rejection code. Never trusts\n * client metadata; the caller passes the doc it loaded from the upload collection.\n */\nexport const resolveFileRef = (\n\tdoc: UploadDoc | null | undefined,\n\tconfig: FileFieldConfig\n): ResolveFileRefResult => {\n\tif (doc == null || doc.id == null) {\n\t\treturn { ok: false, code: 'missing' }\n\t}\n\tconst mimeType = typeof doc.mimeType === 'string' ? doc.mimeType : ''\n\tconst filesize = typeof doc.filesize === 'number' ? doc.filesize : 0\n\tif (!mimeAllowed(mimeType, config.mimeTypes)) {\n\t\treturn { ok: false, code: 'mimeType' }\n\t}\n\tif (typeof config.maxSize === 'number' && filesize > config.maxSize) {\n\t\treturn { ok: false, code: 'tooLarge' }\n\t}\n\tconst ref: FileRef = {\n\t\tid: doc.id,\n\t\tfilename: typeof doc.filename === 'string' ? doc.filename : '',\n\t\tmimeType,\n\t\tfilesize,\n\t}\n\tif (typeof doc.url === 'string' && doc.url.length > 0) {\n\t\tref.url = doc.url\n\t}\n\treturn { ok: true, ref }\n}\n"],"mappings":";AAYA,MAAM,eAAe,UAAkB,UAAyC;CAC/E,IAAI,CAAC,SAAS,MAAM,WAAW,GAC9B,OAAO;CAER,OAAO,MAAM,MAAM,YAAY;EAC9B,IAAI,QAAQ,SAAS,IAAI,GACxB,OAAO,SAAS,WAAW,QAAQ,MAAM,GAAG,EAAE,CAAC;EAEhD,OAAO,aAAa;CACrB,CAAC;AACF;;;;;;AAOA,MAAa,kBACZ,KACA,WAC0B;CAC1B,IAAI,OAAO,QAAQ,IAAI,MAAM,MAC5B,OAAO;EAAE,IAAI;EAAO,MAAM;CAAU;CAErC,MAAM,WAAW,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;CACnE,MAAM,WAAW,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;CACnE,IAAI,CAAC,YAAY,UAAU,OAAO,SAAS,GAC1C,OAAO;EAAE,IAAI;EAAO,MAAM;CAAW;CAEtC,IAAI,OAAO,OAAO,YAAY,YAAY,WAAW,OAAO,SAC3D,OAAO;EAAE,IAAI;EAAO,MAAM;CAAW;CAEtC,MAAM,MAAe;EACpB,IAAI,IAAI;EACR,UAAU,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;EAC5D;EACA;CACD;CACA,IAAI,OAAO,IAAI,QAAQ,YAAY,IAAI,IAAI,SAAS,GACnD,IAAI,MAAM,IAAI;CAEf,OAAO;EAAE,IAAI;EAAM;CAAI;AACxB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/uploads/types.d.ts
|
|
2
|
+
/** A self-describing reference to an uploaded file, captured server-side and stored as the field's value. */
|
|
3
|
+
type FileRef = {
|
|
4
|
+
id: string | number;
|
|
5
|
+
filename: string;
|
|
6
|
+
mimeType: string;
|
|
7
|
+
filesize: number;
|
|
8
|
+
url?: string;
|
|
9
|
+
};
|
|
10
|
+
/** Per-field file constraints, authored in the field config. */
|
|
11
|
+
type FileFieldConfig = {
|
|
12
|
+
/** Upload collection slug to read from. Defaults to the plugin's `form-uploads`. */relationTo?: string; /** Allowed MIME types (exact match or a `type/*` wildcard). Empty/absent allows any. */
|
|
13
|
+
mimeTypes?: string[]; /** Maximum file size in bytes. Absent allows any size (subject to the collection limit). */
|
|
14
|
+
maxSize?: number;
|
|
15
|
+
};
|
|
16
|
+
/** Why a file reference was rejected at the server trust boundary. */
|
|
17
|
+
type FileRefError = 'missing' | 'mimeType' | 'tooLarge';
|
|
18
|
+
//#endregion
|
|
19
|
+
export { FileFieldConfig, FileRef, FileRefError };
|
|
20
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { keys } from "../translations/keys.js";
|
|
2
|
+
import { labelFor } from "../translations/server.js";
|
|
3
|
+
//#region src/validation/buildRuleBlocks.ts
|
|
4
|
+
/** Each rule block appends its own `message` and `severity` fields, so a rule param of either name would collide and be silently dropped by Payload. */
|
|
5
|
+
const RESERVED_PARAM_NAMES = new Set(["message", "severity"]);
|
|
6
|
+
/** One block per rule applicable to `fieldType` (gated by `appliesTo`): the rule params, then a message override and severity. */
|
|
7
|
+
const buildRuleBlocks = (registry, fieldType) => {
|
|
8
|
+
const blocks = [];
|
|
9
|
+
for (const rule of registry.values()) {
|
|
10
|
+
if (rule.appliesTo && !rule.appliesTo.includes(fieldType)) continue;
|
|
11
|
+
for (const param of rule.params ?? []) if ("name" in param && RESERVED_PARAM_NAMES.has(param.name)) throw new Error(`form-builder: validation rule "${rule.type}" declares a reserved param name "${param.name}". The names "message" and "severity" are reserved for the constraint-list UI.`);
|
|
12
|
+
blocks.push({
|
|
13
|
+
slug: rule.type,
|
|
14
|
+
labels: {
|
|
15
|
+
singular: labelFor(rule.label),
|
|
16
|
+
plural: labelFor(rule.label)
|
|
17
|
+
},
|
|
18
|
+
fields: [
|
|
19
|
+
...rule.params ?? [],
|
|
20
|
+
{
|
|
21
|
+
name: "message",
|
|
22
|
+
type: "text",
|
|
23
|
+
label: labelFor(keys.validationMessageLabel)
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "severity",
|
|
27
|
+
type: "select",
|
|
28
|
+
defaultValue: "error",
|
|
29
|
+
label: labelFor(keys.validationSeverityLabel),
|
|
30
|
+
options: [{
|
|
31
|
+
label: labelFor(keys.validationSeverityError),
|
|
32
|
+
value: "error"
|
|
33
|
+
}, {
|
|
34
|
+
label: labelFor(keys.validationSeverityWarning),
|
|
35
|
+
value: "warning"
|
|
36
|
+
}]
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return blocks;
|
|
42
|
+
};
|
|
43
|
+
//#endregion
|
|
44
|
+
export { buildRuleBlocks };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=buildRuleBlocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildRuleBlocks.js","names":[],"sources":["../../src/validation/buildRuleBlocks.ts"],"sourcesContent":["import type { Block } from 'payload'\nimport { keys } from '../translations/keys'\nimport { labelFor } from '../translations/server'\nimport type { ValidationRuleRegistry } from './registry'\n\n/** Each rule block appends its own `message` and `severity` fields, so a rule param of either name would collide and be silently dropped by Payload. */\nconst RESERVED_PARAM_NAMES = new Set(['message', 'severity'])\n\n/** One block per rule applicable to `fieldType` (gated by `appliesTo`): the rule params, then a message override and severity. */\nexport const buildRuleBlocks = (registry: ValidationRuleRegistry, fieldType: string): Block[] => {\n\tconst blocks: Block[] = []\n\tfor (const rule of registry.values()) {\n\t\tif (rule.appliesTo && !rule.appliesTo.includes(fieldType)) {\n\t\t\tcontinue\n\t\t}\n\t\tfor (const param of rule.params ?? []) {\n\t\t\tif ('name' in param && RESERVED_PARAM_NAMES.has(param.name)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`form-builder: validation rule \"${rule.type}\" declares a reserved param name \"${param.name}\". The names \"message\" and \"severity\" are reserved for the constraint-list UI.`\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tblocks.push({\n\t\t\tslug: rule.type,\n\t\t\tlabels: { singular: labelFor(rule.label), plural: labelFor(rule.label) },\n\t\t\tfields: [\n\t\t\t\t...(rule.params ?? []),\n\t\t\t\t{ name: 'message', type: 'text', label: labelFor(keys.validationMessageLabel) },\n\t\t\t\t{\n\t\t\t\t\tname: 'severity',\n\t\t\t\t\ttype: 'select',\n\t\t\t\t\tdefaultValue: 'error',\n\t\t\t\t\tlabel: labelFor(keys.validationSeverityLabel),\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ label: labelFor(keys.validationSeverityError), value: 'error' },\n\t\t\t\t\t\t{ label: labelFor(keys.validationSeverityWarning), value: 'warning' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t}\n\treturn blocks\n}\n"],"mappings":";;;;AAMA,MAAM,uBAAuB,IAAI,IAAI,CAAC,WAAW,UAAU,CAAC;;AAG5D,MAAa,mBAAmB,UAAkC,cAA+B;CAChG,MAAM,SAAkB,CAAC;CACzB,KAAK,MAAM,QAAQ,SAAS,OAAO,GAAG;EACrC,IAAI,KAAK,aAAa,CAAC,KAAK,UAAU,SAAS,SAAS,GACvD;EAED,KAAK,MAAM,SAAS,KAAK,UAAU,CAAC,GACnC,IAAI,UAAU,SAAS,qBAAqB,IAAI,MAAM,IAAI,GACzD,MAAM,IAAI,MACT,kCAAkC,KAAK,KAAK,oCAAoC,MAAM,KAAK,+EAC5F;EAGF,OAAO,KAAK;GACX,MAAM,KAAK;GACX,QAAQ;IAAE,UAAU,SAAS,KAAK,KAAK;IAAG,QAAQ,SAAS,KAAK,KAAK;GAAE;GACvE,QAAQ;IACP,GAAI,KAAK,UAAU,CAAC;IACpB;KAAE,MAAM;KAAW,MAAM;KAAQ,OAAO,SAAS,KAAK,sBAAsB;IAAE;IAC9E;KACC,MAAM;KACN,MAAM;KACN,cAAc;KACd,OAAO,SAAS,KAAK,uBAAuB;KAC5C,SAAS,CACR;MAAE,OAAO,SAAS,KAAK,uBAAuB;MAAG,OAAO;KAAQ,GAChE;MAAE,OAAO,SAAS,KAAK,yBAAyB;MAAG,OAAO;KAAU,CACrE;IACD;GACD;EACD,CAAC;CACF;CACA,OAAO;AACR"}
|