@10x-media/form-builder 0.1.0-beta.6 → 0.1.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/dist/actions/body/serializeBody.d.ts +3 -1
  3. package/dist/actions/body/serializeBody.js.map +1 -1
  4. package/dist/actions/buildActionBlocks.js +12 -9
  5. package/dist/actions/buildActionBlocks.js.map +1 -1
  6. package/dist/actions/builtin/confirmation.js +13 -68
  7. package/dist/actions/builtin/confirmation.js.map +1 -1
  8. package/dist/actions/builtin/emailAction.d.ts +17 -0
  9. package/dist/actions/builtin/emailAction.js +83 -0
  10. package/dist/actions/builtin/emailAction.js.map +1 -0
  11. package/dist/actions/builtin/emailTeam.js +14 -74
  12. package/dist/actions/builtin/emailTeam.js.map +1 -1
  13. package/dist/actions/builtin/index.d.ts +9 -12
  14. package/dist/actions/builtin/index.js +11 -11
  15. package/dist/actions/builtin/index.js.map +1 -1
  16. package/dist/actions/defineAction.d.ts +2 -2
  17. package/dist/actions/defineAction.js.map +1 -1
  18. package/dist/actions/emailRecipients.js +75 -31
  19. package/dist/actions/emailRecipients.js.map +1 -1
  20. package/dist/actions/registry.d.ts +2 -1
  21. package/dist/actions/registry.js +2 -6
  22. package/dist/actions/registry.js.map +1 -1
  23. package/dist/actions/task.js +5 -3
  24. package/dist/actions/task.js.map +1 -1
  25. package/dist/calc/evaluate.js +1 -2
  26. package/dist/calc/evaluate.js.map +1 -1
  27. package/dist/calc/normalizeCalc.js +1 -2
  28. package/dist/calc/normalizeCalc.js.map +1 -1
  29. package/dist/calc/types.js.map +1 -1
  30. package/dist/collections/buttonFields.js +1 -1
  31. package/dist/collections/formSubmissions.js +2 -1
  32. package/dist/collections/formSubmissions.js.map +1 -1
  33. package/dist/collections/forms.js +32 -100
  34. package/dist/collections/forms.js.map +1 -1
  35. package/dist/collections/formsEndpoints.js +101 -0
  36. package/dist/collections/formsEndpoints.js.map +1 -0
  37. package/dist/conditions/evaluate.js +1 -1
  38. package/dist/conditions/evaluate.js.map +1 -1
  39. package/dist/conditions/fieldTypes.d.ts +3 -1
  40. package/dist/conditions/fieldTypes.js +4 -1
  41. package/dist/conditions/fieldTypes.js.map +1 -1
  42. package/dist/conditions/normalizeConditions.js +18 -5
  43. package/dist/conditions/normalizeConditions.js.map +1 -1
  44. package/dist/consent/captureConsent.d.ts +7 -0
  45. package/dist/consent/captureConsent.js +7 -0
  46. package/dist/consent/captureConsent.js.map +1 -1
  47. package/dist/consent/consentSourcesField.d.ts +4 -0
  48. package/dist/consent/consentSourcesField.js +5 -1
  49. package/dist/consent/consentSourcesField.js.map +1 -1
  50. package/dist/consent/resolveConsentEntries.d.ts +1 -1
  51. package/dist/consent/resolveConsentEntries.js +1 -4
  52. package/dist/consent/resolveConsentEntries.js.map +1 -1
  53. package/dist/consent/resolveConsentSourcesRequest.js +0 -1
  54. package/dist/consent/resolveConsentSourcesRequest.js.map +1 -1
  55. package/dist/consent/resolveConsentStatements.d.ts +1 -1
  56. package/dist/consent/resolveConsentStatements.js.map +1 -1
  57. package/dist/consent/types.d.ts +9 -1
  58. package/dist/email/departmentsField.js +1 -1
  59. package/dist/exports/react.d.ts +5 -4
  60. package/dist/exports/react.js +3 -2
  61. package/dist/exports/rsc.js +1 -1
  62. package/dist/exports/types.d.ts +1 -1
  63. package/dist/fields/builtin/email.js +1 -1
  64. package/dist/fields/builtin/email.js.map +1 -1
  65. package/dist/fields/builtin/message.js +1 -1
  66. package/dist/fields/builtin/repeater.js +1 -1
  67. package/dist/fields/builtin/select.js +1 -1
  68. package/dist/fields/registry.d.ts +2 -1
  69. package/dist/fields/registry.js +2 -6
  70. package/dist/fields/registry.js.map +1 -1
  71. package/dist/fields/sharedConfig.js +1 -1
  72. package/dist/flow/normalizeFlow.js +7 -3
  73. package/dist/flow/normalizeFlow.js.map +1 -1
  74. package/dist/index.d.ts +4 -201
  75. package/dist/index.js +11 -4
  76. package/dist/index.js.map +1 -1
  77. package/dist/options.d.ts +229 -0
  78. package/dist/plugin/applyRegistryConfig.d.ts +11 -0
  79. package/dist/plugin/applyRegistryConfig.js +20 -0
  80. package/dist/plugin/applyRegistryConfig.js.map +1 -0
  81. package/dist/plugin/registerCollections.js +2 -1
  82. package/dist/plugin/registerCollections.js.map +1 -1
  83. package/dist/poll/buildPollOptionSourceFields.js +2 -2
  84. package/dist/poll/buildPollOptionSourceFields.js.map +1 -1
  85. package/dist/poll/definePollOptionSource.d.ts +2 -2
  86. package/dist/poll/definePollOptionSource.js.map +1 -1
  87. package/dist/poll/pollTypeRegistry.js +2 -4
  88. package/dist/poll/pollTypeRegistry.js.map +1 -1
  89. package/dist/poll/registry.d.ts +2 -1
  90. package/dist/poll/registry.js +2 -6
  91. package/dist/poll/registry.js.map +1 -1
  92. package/dist/poll/resolvePollOptionsRequest.js +0 -1
  93. package/dist/poll/resolvePollOptionsRequest.js.map +1 -1
  94. package/dist/prefill/valuesFromSearchParams.js +2 -7
  95. package/dist/prefill/valuesFromSearchParams.js.map +1 -1
  96. package/dist/react/Form.d.ts +39 -3
  97. package/dist/react/Form.js +148 -164
  98. package/dist/react/Form.js.map +1 -1
  99. package/dist/react/FormContext.d.ts +7 -1
  100. package/dist/react/FormContext.js.map +1 -1
  101. package/dist/react/FormFields.d.ts +18 -0
  102. package/dist/react/FormFields.js +114 -0
  103. package/dist/react/FormFields.js.map +1 -0
  104. package/dist/react/FormLayout.d.ts +4 -2
  105. package/dist/react/FormLayout.js +3 -2
  106. package/dist/react/FormLayout.js.map +1 -1
  107. package/dist/react/Poll.js +15 -5
  108. package/dist/react/Poll.js.map +1 -1
  109. package/dist/react/presentation/DialogSurface.js +1 -4
  110. package/dist/react/presentation/DialogSurface.js.map +1 -1
  111. package/dist/react/renderers/calculation.js +1 -3
  112. package/dist/react/renderers/calculation.js.map +1 -1
  113. package/dist/react/renderers/checkbox.js +1 -3
  114. package/dist/react/renderers/checkbox.js.map +1 -1
  115. package/dist/react/renderers/consent.js +2 -3
  116. package/dist/react/renderers/consent.js.map +1 -1
  117. package/dist/react/renderers/date.js +1 -3
  118. package/dist/react/renderers/date.js.map +1 -1
  119. package/dist/react/renderers/email.js +1 -3
  120. package/dist/react/renderers/email.js.map +1 -1
  121. package/dist/react/renderers/file.js +6 -7
  122. package/dist/react/renderers/file.js.map +1 -1
  123. package/dist/react/renderers/message.js +8 -2
  124. package/dist/react/renderers/message.js.map +1 -1
  125. package/dist/react/renderers/number.js +1 -3
  126. package/dist/react/renderers/number.js.map +1 -1
  127. package/dist/react/renderers/region.js +1 -3
  128. package/dist/react/renderers/region.js.map +1 -1
  129. package/dist/react/renderers/repeater.js +20 -4
  130. package/dist/react/renderers/repeater.js.map +1 -1
  131. package/dist/react/renderers/select.js +1 -3
  132. package/dist/react/renderers/select.js.map +1 -1
  133. package/dist/react/renderers/text.js +1 -3
  134. package/dist/react/renderers/text.js.map +1 -1
  135. package/dist/react/renderers/textarea.js +1 -3
  136. package/dist/react/renderers/textarea.js.map +1 -1
  137. package/dist/react/state.d.ts +3 -0
  138. package/dist/react/state.js +1 -0
  139. package/dist/react/state.js.map +1 -1
  140. package/dist/spam/constants.js +7 -1
  141. package/dist/spam/constants.js.map +1 -1
  142. package/dist/spam/resolveSpam.js +2 -1
  143. package/dist/spam/resolveSpam.js.map +1 -1
  144. package/dist/spam/spamGuard.js +22 -6
  145. package/dist/spam/spamGuard.js.map +1 -1
  146. package/dist/spam/types.d.ts +17 -2
  147. package/dist/submissions/coerceBoolean.js +14 -0
  148. package/dist/submissions/coerceBoolean.js.map +1 -0
  149. package/dist/submissions/runSubmission.js +7 -7
  150. package/dist/submissions/runSubmission.js.map +1 -1
  151. package/dist/submissions/validateSubmission.js +3 -2
  152. package/dist/submissions/validateSubmission.js.map +1 -1
  153. package/dist/translations/de.js +10 -0
  154. package/dist/translations/de.js.map +1 -1
  155. package/dist/translations/en.js +10 -0
  156. package/dist/translations/en.js.map +1 -1
  157. package/dist/translations/keys.d.ts +10 -0
  158. package/dist/translations/keys.js +10 -0
  159. package/dist/translations/keys.js.map +1 -1
  160. package/dist/translations/server.js +8 -1
  161. package/dist/translations/server.js.map +1 -1
  162. package/dist/uploads/captureFileRef.d.ts +10 -3
  163. package/dist/uploads/captureFileRef.js +18 -9
  164. package/dist/uploads/captureFileRef.js.map +1 -1
  165. package/dist/validation/builtin/email.js +1 -1
  166. package/dist/validation/builtin/email.js.map +1 -1
  167. package/dist/validation/builtin/notAlreadySubmitted.js +1 -0
  168. package/dist/validation/builtin/notAlreadySubmitted.js.map +1 -1
  169. package/dist/validation/emailPattern.js +10 -0
  170. package/dist/validation/emailPattern.js.map +1 -0
  171. package/dist/validation/registry.d.ts +2 -1
  172. package/dist/validation/registry.js +2 -9
  173. package/dist/validation/registry.js.map +1 -1
  174. package/package.json +4 -4
@@ -134,6 +134,8 @@ const en = {
134
134
  [keys.recipientsGroupFields]: "Form fields",
135
135
  [keys.validationRecipientInvalid]: "Enter a valid email address.",
136
136
  [keys.validationRecipientUnknownField]: "References a field that no longer exists.",
137
+ [keys.validationRecipientNotAllowed]: "This recipient is not in the allowed list.",
138
+ [keys.validationRecipientOptionsUnavailable]: "Recipient options are currently unavailable. Please try again later.",
137
139
  [keys.validationFromUnknown]: "Choose one of the configured from addresses",
138
140
  [keys.validationFromUnavailable]: "From addresses are currently unavailable. Please try again later.",
139
141
  [keys.actionConfigUrl]: "URL",
@@ -194,6 +196,7 @@ const en = {
194
196
  [keys.endpointOptionsError]: "Options could not be loaded.",
195
197
  [keys.pollOptionsUnavailable]: "Poll options are currently unavailable. Please try again later.",
196
198
  [keys.pollFinalResult]: "Final result",
199
+ [keys.pollResultsError]: "Results could not be loaded.",
197
200
  [keys.resultsWinner]: "Winner",
198
201
  [keys.validationFileMissing]: "Upload a file",
199
202
  [keys.validationFileMimeType]: "File type not allowed",
@@ -206,6 +209,10 @@ const en = {
206
209
  [keys.fileUploadMisconfigured]: "File uploads are not configured for this form",
207
210
  [keys.fileHintAccepted]: "Accepted: {types}",
208
211
  [keys.fileHintMaxSize]: "Max size: {max}",
212
+ [keys.fileUploaded]: "Uploaded file",
213
+ [keys.fileUploading]: "Uploading",
214
+ [keys.fileUploadFailed]: "Upload failed",
215
+ [keys.fileRemove]: "Remove",
209
216
  [keys.spamRateLimited]: "You have sent too many requests. Please try again later.",
210
217
  [keys.spamRejected]: "Your submission could not be processed.",
211
218
  [keys.spamCaptchaFailed]: "Captcha verification failed. Please try again.",
@@ -278,6 +285,9 @@ const en = {
278
285
  [keys.formSubmit]: "Submit",
279
286
  [keys.formMultistep]: "Multi-step",
280
287
  [keys.formPollEnabled]: "Poll",
288
+ [keys.formClose]: "Close",
289
+ [keys.formSuccess]: "Thank you.",
290
+ [keys.formSubmitFailed]: "Submission failed",
281
291
  [keys.cellStepCountOne]: "{{count}} step",
282
292
  [keys.cellStepCountOther]: "{{count}} steps",
283
293
  [keys.cellFieldCountOne]: "{{count}} Field",
@@ -1 +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.fieldTitle]: 'Title',\n\t[keys.fieldTypeText]: 'Text',\n\t[keys.fieldTypeTextarea]: 'Textarea',\n\t[keys.fieldTypeEmail]: 'Email',\n\t[keys.fieldTypeNumber]: 'Number',\n\t[keys.fieldTypeSelect]: 'Select',\n\t[keys.fieldTypeCountry]: 'Country',\n\t[keys.fieldTypeState]: 'State',\n\t[keys.fieldTypeCheckbox]: 'Checkbox',\n\t[keys.fieldTypeDate]: 'Date',\n\t[keys.configOptions]: 'Options',\n\t[keys.configOption]: 'Option',\n\t[keys.configOptionLabel]: 'Label',\n\t[keys.configOptionValue]: '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.validationDate]: 'Enter a valid date',\n\t[keys.validationSelect]: 'Choose a valid option',\n\t[keys.validationCountry]: 'Choose a valid country',\n\t[keys.validationState]: 'Choose a valid state',\n\t[keys.validationRegexPattern]: 'Enter a valid regular expression',\n\t[keys.validationRegexFlags]: 'Enter valid regular expression flags, for example i or gi',\n\t[keys.validationEmailFieldUnknown]: 'Choose an existing email field on this form',\n\t[keys.validationResultsFieldUnknown]: 'Choose an eligible choice field on this form',\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.ruleMinDate]: 'Earliest date',\n\t[keys.ruleMaxDate]: 'Latest date',\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.ruleMinDateMessage]: 'Must be on or after {min}',\n\t[keys.ruleMaxDateMessage]: 'Must be on or before {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.ruleMinLengthDescription]:\n\t\t'Fails when the entered text is shorter than the minimum number of characters.',\n\t[keys.ruleMaxLengthDescription]:\n\t\t'Fails when the entered text is longer than the maximum number of characters.',\n\t[keys.ruleMinDescription]: 'Fails when the entered number is below the minimum.',\n\t[keys.ruleMaxDescription]: 'Fails when the entered number is above the maximum.',\n\t[keys.ruleMinDateDescription]: 'Fails when the chosen date is earlier than the minimum date.',\n\t[keys.ruleMaxDateDescription]: 'Fails when the chosen date is later than the maximum date.',\n\t[keys.rulePatternDescription]:\n\t\t'Fails when the entered text does not match the regular expression.',\n\t[keys.ruleEmailDescription]: 'Fails when the entered value is not a valid email address.',\n\t[keys.ruleUrlDescription]: 'Fails when the entered value is not a valid http or https URL.',\n\t[keys.ruleOneOfDescription]:\n\t\t'Fails when the entered value is not one of the allowed values you list.',\n\t[keys.ruleMatchesFieldDescription]:\n\t\t\"Fails when this field's value does not equal the chosen field. Use it for confirm-email or confirm-password.\",\n\t[keys.ruleNotAlreadySubmittedDescription]:\n\t\t'Fails when this same value was already submitted to this form (checked on the server).',\n\t[keys.ruleFieldTargetInvalid]: 'The selected field no longer exists. Choose a valid field.',\n\t[keys.ruleParamMin]: 'Minimum',\n\t[keys.ruleParamMax]: 'Maximum',\n\t[keys.ruleParamMinDate]: 'Earliest date (YYYY-MM-DD)',\n\t[keys.ruleParamMaxDate]: 'Latest date (YYYY-MM-DD)',\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.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.conditionTrue]: 'True',\n\t[keys.conditionFalse]: 'False',\n\t[keys.configHidden]: 'Hidden (capture without showing)',\n\t[keys.tabFields]: 'Fields',\n\t[keys.tabFlow]: 'Flow',\n\t[keys.tabActions]: 'Actions',\n\t[keys.tabField]: 'Field',\n\t[keys.tabValidation]: 'Validation',\n\t[keys.tabAdvanced]: 'Advanced',\n\t[keys.fieldTypeCalculation]: 'Calculation',\n\t[keys.configExpression]: 'Expression (JSON)',\n\t[keys.configExpressionDescription]:\n\t\t'Expression tree of nodes {\"type\":\"lit\"|\"ref\"|\"op\"|\"neg\"|\"fn\"|\"weight\"}. Example: {\"type\":\"op\",\"op\":\"+\",\"left\":{\"type\":\"ref\",\"field\":\"qty\"},\"right\":{\"type\":\"lit\",\"value\":10}}',\n\t[keys.configCalcDisplay]: 'Show computed value',\n\t[keys.validationCalcExpressionInvalid]: 'Enter a valid calculation expression',\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.actionConfigBodyDescription]:\n\t\t'Supports {{ fieldName|fallback }} tokens, {{*}} for all answers as lines, and {{*:table}} for all answers as a table.',\n\t[keys.actionConfigToField]: 'Email field name',\n\t[keys.actionConfigToFieldDescription]:\n\t\t'The email field on this form the confirmation is sent to.',\n\t[keys.actionConfigFrom]: 'From',\n\t[keys.actionConfigFromDescription]:\n\t\t'Sender address for this action. Leave empty to use the email adapter default.',\n\t[keys.actionConfigCc]: 'CC',\n\t[keys.actionConfigBcc]: 'BCC',\n\t[keys.actionConfigReplyTo]: 'Reply-to',\n\t[keys.recipientsGroupDepartments]: 'Departments',\n\t[keys.recipientsGroupFields]: 'Form fields',\n\t[keys.validationRecipientInvalid]: 'Enter a valid email address.',\n\t[keys.validationRecipientUnknownField]: 'References a field that no longer exists.',\n\t[keys.validationFromUnknown]: 'Choose one of the configured from addresses',\n\t[keys.validationFromUnavailable]:\n\t\t'From addresses are currently unavailable. Please try again later.',\n\t[keys.actionConfigUrl]: 'URL',\n\t[keys.actionConfigUrlDescription]:\n\t\t'The endpoint that receives a signed JSON POST for each submission.',\n\t[keys.actionConfigSecret]: 'Secret',\n\t[keys.actionConfigSecretDescription]:\n\t\t'HMAC key used for the X-Form-Signature header, shared with the receiver.',\n\t[keys.validationUrlInvalid]: 'Enter a valid http or https URL',\n\t[keys.configActions]: 'Actions',\n\t[keys.fieldTypeConsent]: 'Consent',\n\t[keys.consentConfigSource]: 'Source',\n\t[keys.consentConfigSourceDescription]:\n\t\t'The statement the visitor agrees to. Its wording and policy page live with the source, so an edit there applies to every form using it.',\n\t[keys.consentSourcesField]: 'Consent sources',\n\t[keys.consentSourcesFieldDescription]: 'Statements forms can utilize in consent fields',\n\t[keys.consentSourceSingular]: 'Consent source',\n\t[keys.consentSourcePlural]: 'Consent sources',\n\t[keys.consentSourceLabel]: 'Name',\n\t[keys.consentSourceStatement]: 'Statement',\n\t[keys.consentSourcePage]: 'Statement source',\n\t[keys.consentSourcePageDescription]:\n\t\t'Must be set if you want form submissions to save a reference to your policy.',\n\t[keys.consentSourcesUnavailable]: 'Consent sources are unavailable. Try again shortly.',\n\t[keys.resultsResponses]: 'responses',\n\t[keys.resultsNoResponses]: 'No responses yet',\n\t[keys.resultsTruncated]: 'Showing a sample of responses',\n\t[keys.pollGroup]: 'Poll',\n\t[keys.pollResultsField]: 'Vote field',\n\t[keys.pollResultsFieldDescription]:\n\t\t'The choice field whose answers are counted as votes. Auto-selected when your form has one choice field. Use a choice field, never a free-text or PII field.',\n\t[keys.pollVoteFieldChoose]: \"Choose which field's answers count as votes.\",\n\t[keys.pollVoteFieldMissing]: 'Add a choice field to use as the poll question.',\n\t[keys.pollResultsVisibility]: 'Results visibility',\n\t[keys.pollVisibilityAfterVote]: 'After voting',\n\t[keys.pollVisibilityAfterClose]: 'After the poll closes',\n\t[keys.pollClosesAt]: 'Closes at',\n\t[keys.pollClosed]: 'This poll is closed.',\n\t[keys.pollResultsAfterClose]: 'Results will be shown after the poll closes.',\n\t[keys.pollOptionSource]: 'Option source',\n\t[keys.pollOptionSourceDescription]:\n\t\t'Populate the results field choices from app data instead of hand-authored options.',\n\t[keys.pollSourceConfig]: 'Source settings',\n\t[keys.pollOutcome]: 'Outcome',\n\t[keys.pollType]: 'Outcome type',\n\t[keys.pollTypeDescription]: 'How the winning option is decided when the poll closes.',\n\t[keys.pollTypeManual]: 'Set the winner manually',\n\t[keys.pollTypeMostVoted]: 'Most-voted option wins',\n\t[keys.pollTypeSource]: 'Winner from the option source',\n\t[keys.pollCloseButton]: 'Close poll now',\n\t[keys.pollReopenButton]: 'Reopen poll',\n\t[keys.pollCloseHintManual]: 'Closing records the selected winner as the result.',\n\t[keys.pollCloseHintMostVoted]: 'Closing now picks the most-voted option as the winner.',\n\t[keys.pollCloseHintSource]: 'Closing now resolves the winner from the option source.',\n\t[keys.pollReopenHint]: 'Reopening clears the recorded winner and lets people vote again.',\n\t[keys.pollCloseNeedsWinner]: 'Select a winning value first.',\n\t[keys.pollCloseManualNoWinner]: 'Set a winner before closing the poll.',\n\t[keys.pollWinningValue]: 'Winning values',\n\t[keys.pollWinningValueDescription]:\n\t\t'Pick the winning option once the outcome is decided, or several on a tie. Saving records the resolution time; clear them to reopen the outcome.',\n\t[keys.pollResolvedAt]: 'Resolved at',\n\t[keys.validationWinningValueUnknown]: 'The winning value must be one of the poll options.',\n\t[keys.validationWinningValueDisabled]: 'Enable the poll before recording an outcome.',\n\t[keys.endpointOptionsLoading]: 'Loading options...',\n\t[keys.endpointOptionsError]: 'Options could not be loaded.',\n\t[keys.pollOptionsUnavailable]: 'Poll options are currently unavailable. Please try again later.',\n\t[keys.pollFinalResult]: 'Final result',\n\t[keys.resultsWinner]: 'Winner',\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.fileConfigMimeTypes]: 'Allowed file types',\n\t[keys.fileConfigMaxSize]: 'Maximum size (bytes)',\n\t[keys.fileConfigMaxSizeDescription]: 'Files larger than this are rejected.',\n\t[keys.fileTooLarge]: 'File is too large (max {max})',\n\t[keys.fileUploadMisconfigured]: 'File uploads are not configured for this form',\n\t[keys.fileHintAccepted]: 'Accepted: {types}',\n\t[keys.fileHintMaxSize]: 'Max size: {max}',\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.submissionMetaLocale]: 'Locale',\n\t[keys.submissionMetaReceivedAt]: 'Received at',\n\t[keys.submissionMetaIp]: 'IP address',\n\t[keys.submissionMetaUserAgent]: 'User agent',\n\t[keys.submissionMetaCaptcha]: 'Captcha',\n\t[keys.flowDescription]:\n\t\t'Only needed for multi-step forms: group fields into steps and route between them. Leave empty to show the form as a single page.',\n\t[keys.flowStepFallbackTitle]: 'Step {n}',\n\t[keys.flowFieldInStep]: 'in {step}',\n\t[keys.flowUnassigned]: 'Not in any step',\n\t[keys.flowAssignToStep]: 'Add to step',\n\t[keys.flowNextSequential]: 'Next step in order',\n\t[keys.flowNextTerminal]: 'End of form',\n\t[keys.flowFields]: 'Fields',\n\t[keys.flowDefaultNext]: 'Default next',\n\t[keys.flowConditionalTransitions]: 'Conditional transitions',\n\t[keys.flowStepTitleLabel]: 'Title',\n\t[keys.flowSelectStepPlaceholder]: 'Select step…',\n\t[keys.flowMoveTransitionUp]: 'Move transition up',\n\t[keys.flowMoveTransitionDown]: 'Move transition down',\n\t[keys.flowRemoveTransition]: 'Remove transition',\n\t[keys.flowAddAbove]: 'Add above',\n\t[keys.flowAddBelow]: 'Add below',\n\t[keys.flowGoTo]: 'go to',\n\t[keys.flowWhen]: 'when',\n\t[keys.flowNoFields]: 'No fields defined on the form yet.',\n\t[keys.flowFirstMatchWins]: '(first match wins)',\n\t[keys.flowAddTransition]: 'Add transition',\n\t[keys.flowNoSteps]: 'No steps defined. Add at least two steps to enable multi-page flow routing.',\n\t[keys.flowFallbackTitle]: 'Flow',\n\t[keys.fieldTypeMessage]: 'Message',\n\t[keys.configContent]: 'Content',\n\t[keys.tabResponse]: 'Response',\n\t[keys.responseType]: 'After submit',\n\t[keys.responseTypeMessage]: 'Show a message',\n\t[keys.responseTypeRedirect]: 'Redirect to a URL',\n\t[keys.responseMessage]: 'Message',\n\t[keys.responseRedirect]: 'Redirect',\n\t[keys.responseUrl]: 'URL',\n\t[keys.responseRedirectReference]: 'Document',\n\t[keys.responseRedirectReferenceDescription]: 'Redirect to an internal document instead of a URL',\n\t[keys.buttonsSubmitLabel]: 'Submit button label',\n\t[keys.buttonsNextLabel]: 'Next button label',\n\t[keys.buttonsPrevLabel]: 'Previous button label',\n\t[keys.formBack]: 'Back',\n\t[keys.formNext]: 'Next',\n\t[keys.formSubmit]: 'Submit',\n\t[keys.formMultistep]: 'Multi-step',\n\t[keys.formPollEnabled]: 'Poll',\n\t[keys.cellStepCountOne]: '{{count}} step',\n\t[keys.cellStepCountOther]: '{{count}} steps',\n\t[keys.cellFieldCountOne]: '{{count}} Field',\n\t[keys.cellFieldCountOther]: '{{count}} Fields',\n\t[keys.departmentsField]: 'Department emails',\n\t[keys.departmentsFieldDescription]:\n\t\t'Addresses a form can route submissions to, each shown by its label.',\n\t[keys.departmentSingular]: 'Department email',\n\t[keys.departmentPlural]: 'Department emails',\n\t[keys.departmentLabel]: 'Label',\n\t[keys.departmentEmail]: 'Email',\n\t[keys.departmentAddRow]: 'Add email',\n\t[keys.departmentRemoveRow]: 'Remove email',\n}\n"],"mappings":"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"}
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.fieldTitle]: 'Title',\n\t[keys.fieldTypeText]: 'Text',\n\t[keys.fieldTypeTextarea]: 'Textarea',\n\t[keys.fieldTypeEmail]: 'Email',\n\t[keys.fieldTypeNumber]: 'Number',\n\t[keys.fieldTypeSelect]: 'Select',\n\t[keys.fieldTypeCountry]: 'Country',\n\t[keys.fieldTypeState]: 'State',\n\t[keys.fieldTypeCheckbox]: 'Checkbox',\n\t[keys.fieldTypeDate]: 'Date',\n\t[keys.configOptions]: 'Options',\n\t[keys.configOption]: 'Option',\n\t[keys.configOptionLabel]: 'Label',\n\t[keys.configOptionValue]: '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.validationDate]: 'Enter a valid date',\n\t[keys.validationSelect]: 'Choose a valid option',\n\t[keys.validationCountry]: 'Choose a valid country',\n\t[keys.validationState]: 'Choose a valid state',\n\t[keys.validationRegexPattern]: 'Enter a valid regular expression',\n\t[keys.validationRegexFlags]: 'Enter valid regular expression flags, for example i or gi',\n\t[keys.validationEmailFieldUnknown]: 'Choose an existing email field on this form',\n\t[keys.validationResultsFieldUnknown]: 'Choose an eligible choice field on this form',\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.ruleMinDate]: 'Earliest date',\n\t[keys.ruleMaxDate]: 'Latest date',\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.ruleMinDateMessage]: 'Must be on or after {min}',\n\t[keys.ruleMaxDateMessage]: 'Must be on or before {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.ruleMinLengthDescription]:\n\t\t'Fails when the entered text is shorter than the minimum number of characters.',\n\t[keys.ruleMaxLengthDescription]:\n\t\t'Fails when the entered text is longer than the maximum number of characters.',\n\t[keys.ruleMinDescription]: 'Fails when the entered number is below the minimum.',\n\t[keys.ruleMaxDescription]: 'Fails when the entered number is above the maximum.',\n\t[keys.ruleMinDateDescription]: 'Fails when the chosen date is earlier than the minimum date.',\n\t[keys.ruleMaxDateDescription]: 'Fails when the chosen date is later than the maximum date.',\n\t[keys.rulePatternDescription]:\n\t\t'Fails when the entered text does not match the regular expression.',\n\t[keys.ruleEmailDescription]: 'Fails when the entered value is not a valid email address.',\n\t[keys.ruleUrlDescription]: 'Fails when the entered value is not a valid http or https URL.',\n\t[keys.ruleOneOfDescription]:\n\t\t'Fails when the entered value is not one of the allowed values you list.',\n\t[keys.ruleMatchesFieldDescription]:\n\t\t\"Fails when this field's value does not equal the chosen field. Use it for confirm-email or confirm-password.\",\n\t[keys.ruleNotAlreadySubmittedDescription]:\n\t\t'Fails when this same value was already submitted to this form (checked on the server).',\n\t[keys.ruleFieldTargetInvalid]: 'The selected field no longer exists. Choose a valid field.',\n\t[keys.ruleParamMin]: 'Minimum',\n\t[keys.ruleParamMax]: 'Maximum',\n\t[keys.ruleParamMinDate]: 'Earliest date (YYYY-MM-DD)',\n\t[keys.ruleParamMaxDate]: 'Latest date (YYYY-MM-DD)',\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.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.conditionTrue]: 'True',\n\t[keys.conditionFalse]: 'False',\n\t[keys.configHidden]: 'Hidden (capture without showing)',\n\t[keys.tabFields]: 'Fields',\n\t[keys.tabFlow]: 'Flow',\n\t[keys.tabActions]: 'Actions',\n\t[keys.tabField]: 'Field',\n\t[keys.tabValidation]: 'Validation',\n\t[keys.tabAdvanced]: 'Advanced',\n\t[keys.fieldTypeCalculation]: 'Calculation',\n\t[keys.configExpression]: 'Expression (JSON)',\n\t[keys.configExpressionDescription]:\n\t\t'Expression tree of nodes {\"type\":\"lit\"|\"ref\"|\"op\"|\"neg\"|\"fn\"|\"weight\"}. Example: {\"type\":\"op\",\"op\":\"+\",\"left\":{\"type\":\"ref\",\"field\":\"qty\"},\"right\":{\"type\":\"lit\",\"value\":10}}',\n\t[keys.configCalcDisplay]: 'Show computed value',\n\t[keys.validationCalcExpressionInvalid]: 'Enter a valid calculation expression',\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.actionConfigBodyDescription]:\n\t\t'Supports {{ fieldName|fallback }} tokens, {{*}} for all answers as lines, and {{*:table}} for all answers as a table.',\n\t[keys.actionConfigToField]: 'Email field name',\n\t[keys.actionConfigToFieldDescription]:\n\t\t'The email field on this form the confirmation is sent to.',\n\t[keys.actionConfigFrom]: 'From',\n\t[keys.actionConfigFromDescription]:\n\t\t'Sender address for this action. Leave empty to use the email adapter default.',\n\t[keys.actionConfigCc]: 'CC',\n\t[keys.actionConfigBcc]: 'BCC',\n\t[keys.actionConfigReplyTo]: 'Reply-to',\n\t[keys.recipientsGroupDepartments]: 'Departments',\n\t[keys.recipientsGroupFields]: 'Form fields',\n\t[keys.validationRecipientInvalid]: 'Enter a valid email address.',\n\t[keys.validationRecipientUnknownField]: 'References a field that no longer exists.',\n\t[keys.validationRecipientNotAllowed]: 'This recipient is not in the allowed list.',\n\t[keys.validationRecipientOptionsUnavailable]:\n\t\t'Recipient options are currently unavailable. Please try again later.',\n\t[keys.validationFromUnknown]: 'Choose one of the configured from addresses',\n\t[keys.validationFromUnavailable]:\n\t\t'From addresses are currently unavailable. Please try again later.',\n\t[keys.actionConfigUrl]: 'URL',\n\t[keys.actionConfigUrlDescription]:\n\t\t'The endpoint that receives a signed JSON POST for each submission.',\n\t[keys.actionConfigSecret]: 'Secret',\n\t[keys.actionConfigSecretDescription]:\n\t\t'HMAC key used for the X-Form-Signature header, shared with the receiver.',\n\t[keys.validationUrlInvalid]: 'Enter a valid http or https URL',\n\t[keys.configActions]: 'Actions',\n\t[keys.fieldTypeConsent]: 'Consent',\n\t[keys.consentConfigSource]: 'Source',\n\t[keys.consentConfigSourceDescription]:\n\t\t'The statement the visitor agrees to. Its wording and policy page live with the source, so an edit there applies to every form using it.',\n\t[keys.consentSourcesField]: 'Consent sources',\n\t[keys.consentSourcesFieldDescription]: 'Statements forms can utilize in consent fields',\n\t[keys.consentSourceSingular]: 'Consent source',\n\t[keys.consentSourcePlural]: 'Consent sources',\n\t[keys.consentSourceLabel]: 'Name',\n\t[keys.consentSourceStatement]: 'Statement',\n\t[keys.consentSourcePage]: 'Statement source',\n\t[keys.consentSourcePageDescription]:\n\t\t'Must be set if you want form submissions to save a reference to your policy.',\n\t[keys.consentSourcesUnavailable]: 'Consent sources are unavailable. Try again shortly.',\n\t[keys.resultsResponses]: 'responses',\n\t[keys.resultsNoResponses]: 'No responses yet',\n\t[keys.resultsTruncated]: 'Showing a sample of responses',\n\t[keys.pollGroup]: 'Poll',\n\t[keys.pollResultsField]: 'Vote field',\n\t[keys.pollResultsFieldDescription]:\n\t\t'The choice field whose answers are counted as votes. Auto-selected when your form has one choice field. Use a choice field, never a free-text or PII field.',\n\t[keys.pollVoteFieldChoose]: \"Choose which field's answers count as votes.\",\n\t[keys.pollVoteFieldMissing]: 'Add a choice field to use as the poll question.',\n\t[keys.pollResultsVisibility]: 'Results visibility',\n\t[keys.pollVisibilityAfterVote]: 'After voting',\n\t[keys.pollVisibilityAfterClose]: 'After the poll closes',\n\t[keys.pollClosesAt]: 'Closes at',\n\t[keys.pollClosed]: 'This poll is closed.',\n\t[keys.pollResultsAfterClose]: 'Results will be shown after the poll closes.',\n\t[keys.pollOptionSource]: 'Option source',\n\t[keys.pollOptionSourceDescription]:\n\t\t'Populate the results field choices from app data instead of hand-authored options.',\n\t[keys.pollSourceConfig]: 'Source settings',\n\t[keys.pollOutcome]: 'Outcome',\n\t[keys.pollType]: 'Outcome type',\n\t[keys.pollTypeDescription]: 'How the winning option is decided when the poll closes.',\n\t[keys.pollTypeManual]: 'Set the winner manually',\n\t[keys.pollTypeMostVoted]: 'Most-voted option wins',\n\t[keys.pollTypeSource]: 'Winner from the option source',\n\t[keys.pollCloseButton]: 'Close poll now',\n\t[keys.pollReopenButton]: 'Reopen poll',\n\t[keys.pollCloseHintManual]: 'Closing records the selected winner as the result.',\n\t[keys.pollCloseHintMostVoted]: 'Closing now picks the most-voted option as the winner.',\n\t[keys.pollCloseHintSource]: 'Closing now resolves the winner from the option source.',\n\t[keys.pollReopenHint]: 'Reopening clears the recorded winner and lets people vote again.',\n\t[keys.pollCloseNeedsWinner]: 'Select a winning value first.',\n\t[keys.pollCloseManualNoWinner]: 'Set a winner before closing the poll.',\n\t[keys.pollWinningValue]: 'Winning values',\n\t[keys.pollWinningValueDescription]:\n\t\t'Pick the winning option once the outcome is decided, or several on a tie. Saving records the resolution time; clear them to reopen the outcome.',\n\t[keys.pollResolvedAt]: 'Resolved at',\n\t[keys.validationWinningValueUnknown]: 'The winning value must be one of the poll options.',\n\t[keys.validationWinningValueDisabled]: 'Enable the poll before recording an outcome.',\n\t[keys.endpointOptionsLoading]: 'Loading options...',\n\t[keys.endpointOptionsError]: 'Options could not be loaded.',\n\t[keys.pollOptionsUnavailable]: 'Poll options are currently unavailable. Please try again later.',\n\t[keys.pollFinalResult]: 'Final result',\n\t[keys.pollResultsError]: 'Results could not be loaded.',\n\t[keys.resultsWinner]: 'Winner',\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.fileConfigMimeTypes]: 'Allowed file types',\n\t[keys.fileConfigMaxSize]: 'Maximum size (bytes)',\n\t[keys.fileConfigMaxSizeDescription]: 'Files larger than this are rejected.',\n\t[keys.fileTooLarge]: 'File is too large (max {max})',\n\t[keys.fileUploadMisconfigured]: 'File uploads are not configured for this form',\n\t[keys.fileHintAccepted]: 'Accepted: {types}',\n\t[keys.fileHintMaxSize]: 'Max size: {max}',\n\t[keys.fileUploaded]: 'Uploaded file',\n\t[keys.fileUploading]: 'Uploading',\n\t[keys.fileUploadFailed]: 'Upload failed',\n\t[keys.fileRemove]: 'Remove',\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.submissionMetaLocale]: 'Locale',\n\t[keys.submissionMetaReceivedAt]: 'Received at',\n\t[keys.submissionMetaIp]: 'IP address',\n\t[keys.submissionMetaUserAgent]: 'User agent',\n\t[keys.submissionMetaCaptcha]: 'Captcha',\n\t[keys.flowDescription]:\n\t\t'Only needed for multi-step forms: group fields into steps and route between them. Leave empty to show the form as a single page.',\n\t[keys.flowStepFallbackTitle]: 'Step {n}',\n\t[keys.flowFieldInStep]: 'in {step}',\n\t[keys.flowUnassigned]: 'Not in any step',\n\t[keys.flowAssignToStep]: 'Add to step',\n\t[keys.flowNextSequential]: 'Next step in order',\n\t[keys.flowNextTerminal]: 'End of form',\n\t[keys.flowFields]: 'Fields',\n\t[keys.flowDefaultNext]: 'Default next',\n\t[keys.flowConditionalTransitions]: 'Conditional transitions',\n\t[keys.flowStepTitleLabel]: 'Title',\n\t[keys.flowSelectStepPlaceholder]: 'Select step…',\n\t[keys.flowMoveTransitionUp]: 'Move transition up',\n\t[keys.flowMoveTransitionDown]: 'Move transition down',\n\t[keys.flowRemoveTransition]: 'Remove transition',\n\t[keys.flowAddAbove]: 'Add above',\n\t[keys.flowAddBelow]: 'Add below',\n\t[keys.flowGoTo]: 'go to',\n\t[keys.flowWhen]: 'when',\n\t[keys.flowNoFields]: 'No fields defined on the form yet.',\n\t[keys.flowFirstMatchWins]: '(first match wins)',\n\t[keys.flowAddTransition]: 'Add transition',\n\t[keys.flowNoSteps]: 'No steps defined. Add at least two steps to enable multi-page flow routing.',\n\t[keys.flowFallbackTitle]: 'Flow',\n\t[keys.fieldTypeMessage]: 'Message',\n\t[keys.configContent]: 'Content',\n\t[keys.tabResponse]: 'Response',\n\t[keys.responseType]: 'After submit',\n\t[keys.responseTypeMessage]: 'Show a message',\n\t[keys.responseTypeRedirect]: 'Redirect to a URL',\n\t[keys.responseMessage]: 'Message',\n\t[keys.responseRedirect]: 'Redirect',\n\t[keys.responseUrl]: 'URL',\n\t[keys.responseRedirectReference]: 'Document',\n\t[keys.responseRedirectReferenceDescription]: 'Redirect to an internal document instead of a URL',\n\t[keys.buttonsSubmitLabel]: 'Submit button label',\n\t[keys.buttonsNextLabel]: 'Next button label',\n\t[keys.buttonsPrevLabel]: 'Previous button label',\n\t[keys.formBack]: 'Back',\n\t[keys.formNext]: 'Next',\n\t[keys.formSubmit]: 'Submit',\n\t[keys.formMultistep]: 'Multi-step',\n\t[keys.formPollEnabled]: 'Poll',\n\t[keys.formClose]: 'Close',\n\t[keys.formSuccess]: 'Thank you.',\n\t[keys.formSubmitFailed]: 'Submission failed',\n\t[keys.cellStepCountOne]: '{{count}} step',\n\t[keys.cellStepCountOther]: '{{count}} steps',\n\t[keys.cellFieldCountOne]: '{{count}} Field',\n\t[keys.cellFieldCountOther]: '{{count}} Fields',\n\t[keys.departmentsField]: 'Department emails',\n\t[keys.departmentsFieldDescription]:\n\t\t'Addresses a form can route submissions to, each shown by its label.',\n\t[keys.departmentSingular]: 'Department email',\n\t[keys.departmentPlural]: 'Department emails',\n\t[keys.departmentLabel]: 'Label',\n\t[keys.departmentEmail]: 'Email',\n\t[keys.departmentAddRow]: 'Add email',\n\t[keys.departmentRemoveRow]: 'Remove email',\n}\n"],"mappings":"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"}
@@ -133,6 +133,8 @@ declare const keys: {
133
133
  readonly recipientsGroupFields: "formBuilder:recipients.group.fields";
134
134
  readonly validationRecipientInvalid: "formBuilder:validation.recipient.invalid";
135
135
  readonly validationRecipientUnknownField: "formBuilder:validation.recipient.unknownField";
136
+ readonly validationRecipientNotAllowed: "formBuilder:validation.recipient.notAllowed";
137
+ readonly validationRecipientOptionsUnavailable: "formBuilder:validation.recipient.optionsUnavailable";
136
138
  readonly validationFromUnknown: "formBuilder:validation.fromUnknown";
137
139
  readonly validationFromUnavailable: "formBuilder:validation.fromUnavailable";
138
140
  readonly actionConfigUrl: "formBuilder:action.config.url";
@@ -193,6 +195,7 @@ declare const keys: {
193
195
  readonly endpointOptionsError: "formBuilder:endpointOptions.error";
194
196
  readonly pollOptionsUnavailable: "formBuilder:poll.optionsUnavailable";
195
197
  readonly pollFinalResult: "formBuilder:poll.finalResult";
198
+ readonly pollResultsError: "formBuilder:poll.resultsError";
196
199
  readonly resultsWinner: "formBuilder:results.winner";
197
200
  readonly validationFileMissing: "formBuilder:validation.file.missing";
198
201
  readonly validationFileMimeType: "formBuilder:validation.file.mimeType";
@@ -205,6 +208,10 @@ declare const keys: {
205
208
  readonly fileUploadMisconfigured: "formBuilder:file.uploadMisconfigured";
206
209
  readonly fileHintAccepted: "formBuilder:file.hint.accepted";
207
210
  readonly fileHintMaxSize: "formBuilder:file.hint.maxSize";
211
+ readonly fileUploaded: "formBuilder:file.uploaded";
212
+ readonly fileUploading: "formBuilder:file.uploading";
213
+ readonly fileUploadFailed: "formBuilder:file.uploadFailed";
214
+ readonly fileRemove: "formBuilder:file.remove";
208
215
  readonly spamRateLimited: "formBuilder:spam.rateLimited";
209
216
  readonly spamRejected: "formBuilder:spam.rejected";
210
217
  readonly spamCaptchaFailed: "formBuilder:spam.captchaFailed";
@@ -277,6 +284,9 @@ declare const keys: {
277
284
  readonly formSubmit: "formBuilder:form.submit";
278
285
  readonly formMultistep: "formBuilder:form.multistep";
279
286
  readonly formPollEnabled: "formBuilder:form.pollEnabled";
287
+ readonly formClose: "formBuilder:form.close";
288
+ readonly formSuccess: "formBuilder:form.success";
289
+ readonly formSubmitFailed: "formBuilder:form.submitFailed";
280
290
  readonly cellStepCountOne: "formBuilder:cell.stepCount.one";
281
291
  readonly cellStepCountOther: "formBuilder:cell.stepCount.other";
282
292
  readonly cellFieldCountOne: "formBuilder:cell.fieldCount.one";
@@ -133,6 +133,8 @@ const keys = {
133
133
  recipientsGroupFields: "formBuilder:recipients.group.fields",
134
134
  validationRecipientInvalid: "formBuilder:validation.recipient.invalid",
135
135
  validationRecipientUnknownField: "formBuilder:validation.recipient.unknownField",
136
+ validationRecipientNotAllowed: "formBuilder:validation.recipient.notAllowed",
137
+ validationRecipientOptionsUnavailable: "formBuilder:validation.recipient.optionsUnavailable",
136
138
  validationFromUnknown: "formBuilder:validation.fromUnknown",
137
139
  validationFromUnavailable: "formBuilder:validation.fromUnavailable",
138
140
  actionConfigUrl: "formBuilder:action.config.url",
@@ -193,6 +195,7 @@ const keys = {
193
195
  endpointOptionsError: "formBuilder:endpointOptions.error",
194
196
  pollOptionsUnavailable: "formBuilder:poll.optionsUnavailable",
195
197
  pollFinalResult: "formBuilder:poll.finalResult",
198
+ pollResultsError: "formBuilder:poll.resultsError",
196
199
  resultsWinner: "formBuilder:results.winner",
197
200
  validationFileMissing: "formBuilder:validation.file.missing",
198
201
  validationFileMimeType: "formBuilder:validation.file.mimeType",
@@ -205,6 +208,10 @@ const keys = {
205
208
  fileUploadMisconfigured: "formBuilder:file.uploadMisconfigured",
206
209
  fileHintAccepted: "formBuilder:file.hint.accepted",
207
210
  fileHintMaxSize: "formBuilder:file.hint.maxSize",
211
+ fileUploaded: "formBuilder:file.uploaded",
212
+ fileUploading: "formBuilder:file.uploading",
213
+ fileUploadFailed: "formBuilder:file.uploadFailed",
214
+ fileRemove: "formBuilder:file.remove",
208
215
  spamRateLimited: "formBuilder:spam.rateLimited",
209
216
  spamRejected: "formBuilder:spam.rejected",
210
217
  spamCaptchaFailed: "formBuilder:spam.captchaFailed",
@@ -277,6 +284,9 @@ const keys = {
277
284
  formSubmit: "formBuilder:form.submit",
278
285
  formMultistep: "formBuilder:form.multistep",
279
286
  formPollEnabled: "formBuilder:form.pollEnabled",
287
+ formClose: "formBuilder:form.close",
288
+ formSuccess: "formBuilder:form.success",
289
+ formSubmitFailed: "formBuilder:form.submitFailed",
280
290
  cellStepCountOne: "formBuilder:cell.stepCount.one",
281
291
  cellStepCountOther: "formBuilder:cell.stepCount.other",
282
292
  cellFieldCountOne: "formBuilder:cell.fieldCount.one",
@@ -1 +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\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\tfieldTypeCountry: 'formBuilder:fieldType.country',\n\tfieldTypeState: 'formBuilder:fieldType.state',\n\tfieldTypeCheckbox: 'formBuilder:fieldType.checkbox',\n\tfieldTypeDate: 'formBuilder:fieldType.date',\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\tvalidationDate: 'formBuilder:validation.date',\n\tvalidationSelect: 'formBuilder:validation.select',\n\tvalidationCountry: 'formBuilder:validation.country',\n\tvalidationState: 'formBuilder:validation.state',\n\tvalidationRegexPattern: 'formBuilder:validation.regexPattern',\n\tvalidationRegexFlags: 'formBuilder:validation.regexFlags',\n\tvalidationEmailFieldUnknown: 'formBuilder:validation.emailFieldUnknown',\n\tvalidationResultsFieldUnknown: 'formBuilder:validation.resultsFieldUnknown',\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\truleMinDate: 'formBuilder:rule.minDate.label',\n\truleMaxDate: 'formBuilder:rule.maxDate.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\truleMinDateMessage: 'formBuilder:rule.minDate.message',\n\truleMaxDateMessage: 'formBuilder:rule.maxDate.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\truleMinLengthDescription: 'formBuilder:rule.minLength.description',\n\truleMaxLengthDescription: 'formBuilder:rule.maxLength.description',\n\truleMinDescription: 'formBuilder:rule.min.description',\n\truleMaxDescription: 'formBuilder:rule.max.description',\n\truleMinDateDescription: 'formBuilder:rule.minDate.description',\n\truleMaxDateDescription: 'formBuilder:rule.maxDate.description',\n\trulePatternDescription: 'formBuilder:rule.pattern.description',\n\truleEmailDescription: 'formBuilder:rule.email.description',\n\truleUrlDescription: 'formBuilder:rule.url.description',\n\truleOneOfDescription: 'formBuilder:rule.oneOf.description',\n\truleMatchesFieldDescription: 'formBuilder:rule.matchesField.description',\n\truleNotAlreadySubmittedDescription: 'formBuilder:rule.notAlreadySubmitted.description',\n\truleFieldTargetInvalid: 'formBuilder:rule.fieldTargetInvalid',\n\truleParamMin: 'formBuilder:rule.param.min',\n\truleParamMax: 'formBuilder:rule.param.max',\n\truleParamMinDate: 'formBuilder:rule.param.minDate',\n\truleParamMaxDate: 'formBuilder:rule.param.maxDate',\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\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\tconditionTrue: 'formBuilder:condition.true',\n\tconditionFalse: 'formBuilder:condition.false',\n\tconfigHidden: 'formBuilder:config.hidden',\n\ttabFields: 'formBuilder:tab.fields',\n\ttabFlow: 'formBuilder:tab.flow',\n\ttabActions: 'formBuilder:tab.actions',\n\ttabField: 'formBuilder:tab.field',\n\ttabValidation: 'formBuilder:tab.validation',\n\ttabAdvanced: 'formBuilder:tab.advanced',\n\tfieldTypeCalculation: 'formBuilder:fieldType.calculation',\n\tconfigExpression: 'formBuilder:config.expression',\n\tconfigExpressionDescription: 'formBuilder:config.expressionDescription',\n\tconfigCalcDisplay: 'formBuilder:config.calcDisplay',\n\tvalidationCalcExpressionInvalid: 'formBuilder:validation.calcExpressionInvalid',\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\tactionConfigBodyDescription: 'formBuilder:action.config.bodyDescription',\n\tactionConfigToField: 'formBuilder:action.config.toField',\n\tactionConfigToFieldDescription: 'formBuilder:action.config.toFieldDescription',\n\tactionConfigFrom: 'formBuilder:action.config.from',\n\tactionConfigFromDescription: 'formBuilder:action.config.fromDescription',\n\tactionConfigCc: 'formBuilder:action.config.cc',\n\tactionConfigBcc: 'formBuilder:action.config.bcc',\n\tactionConfigReplyTo: 'formBuilder:action.config.replyTo',\n\trecipientsGroupDepartments: 'formBuilder:recipients.group.departments',\n\trecipientsGroupFields: 'formBuilder:recipients.group.fields',\n\tvalidationRecipientInvalid: 'formBuilder:validation.recipient.invalid',\n\tvalidationRecipientUnknownField: 'formBuilder:validation.recipient.unknownField',\n\tvalidationFromUnknown: 'formBuilder:validation.fromUnknown',\n\tvalidationFromUnavailable: 'formBuilder:validation.fromUnavailable',\n\tactionConfigUrl: 'formBuilder:action.config.url',\n\tactionConfigUrlDescription: 'formBuilder:action.config.urlDescription',\n\tactionConfigSecret: 'formBuilder:action.config.secret',\n\tactionConfigSecretDescription: 'formBuilder:action.config.secretDescription',\n\tvalidationUrlInvalid: 'formBuilder:validation.urlInvalid',\n\tconfigActions: 'formBuilder:config.actions',\n\tfieldTypeConsent: 'formBuilder:fieldType.consent',\n\tconsentConfigSource: 'formBuilder:consent.config.source',\n\tconsentConfigSourceDescription: 'formBuilder:consent.config.sourceDescription',\n\tconsentSourcesField: 'formBuilder:consentSources.field',\n\tconsentSourcesFieldDescription: 'formBuilder:consentSources.fieldDescription',\n\tconsentSourceSingular: 'formBuilder:consentSources.singular',\n\tconsentSourcePlural: 'formBuilder:consentSources.plural',\n\tconsentSourceLabel: 'formBuilder:consentSources.label',\n\tconsentSourceStatement: 'formBuilder:consentSources.statement',\n\tconsentSourcePage: 'formBuilder:consentSources.page',\n\tconsentSourcePageDescription: 'formBuilder:consentSources.pageDescription',\n\tconsentSourcesUnavailable: 'formBuilder:consent.sourcesUnavailable',\n\tresultsResponses: 'formBuilder:results.responses',\n\tresultsNoResponses: 'formBuilder:results.noResponses',\n\tresultsTruncated: 'formBuilder:results.truncated',\n\tpollGroup: 'formBuilder:poll.group',\n\tpollResultsField: 'formBuilder:poll.resultsField',\n\tpollResultsFieldDescription: 'formBuilder:poll.resultsFieldDescription',\n\tpollVoteFieldChoose: 'formBuilder:poll.voteFieldChoose',\n\tpollVoteFieldMissing: 'formBuilder:poll.voteFieldMissing',\n\tpollResultsVisibility: 'formBuilder:poll.resultsVisibility',\n\tpollVisibilityAfterVote: 'formBuilder:poll.visibility.afterVote',\n\tpollVisibilityAfterClose: 'formBuilder:poll.visibility.afterClose',\n\tpollClosesAt: 'formBuilder:poll.closesAt',\n\tpollClosed: 'formBuilder:poll.closed',\n\tpollResultsAfterClose: 'formBuilder:poll.resultsAfterClose',\n\tpollOptionSource: 'formBuilder:poll.optionSource',\n\tpollOptionSourceDescription: 'formBuilder:poll.optionSourceDescription',\n\tpollSourceConfig: 'formBuilder:poll.sourceConfig',\n\tpollOutcome: 'formBuilder:poll.outcome',\n\tpollType: 'formBuilder:poll.type',\n\tpollTypeDescription: 'formBuilder:poll.typeDescription',\n\tpollTypeManual: 'formBuilder:poll.type.manual',\n\tpollTypeMostVoted: 'formBuilder:poll.type.mostVoted',\n\tpollTypeSource: 'formBuilder:poll.type.source',\n\tpollCloseButton: 'formBuilder:poll.close.button',\n\tpollReopenButton: 'formBuilder:poll.reopen.button',\n\tpollCloseHintManual: 'formBuilder:poll.close.hintManual',\n\tpollCloseHintMostVoted: 'formBuilder:poll.close.hintMostVoted',\n\tpollCloseHintSource: 'formBuilder:poll.close.hintSource',\n\tpollReopenHint: 'formBuilder:poll.reopen.hint',\n\tpollCloseNeedsWinner: 'formBuilder:poll.close.needsWinner',\n\tpollCloseManualNoWinner: 'formBuilder:poll.close.manualNoWinner',\n\tpollWinningValue: 'formBuilder:poll.winningValue',\n\tpollWinningValueDescription: 'formBuilder:poll.winningValueDescription',\n\tpollResolvedAt: 'formBuilder:poll.resolvedAt',\n\tvalidationWinningValueUnknown: 'formBuilder:validation.winningValueUnknown',\n\tvalidationWinningValueDisabled: 'formBuilder:validation.winningValueDisabled',\n\tendpointOptionsLoading: 'formBuilder:endpointOptions.loading',\n\tendpointOptionsError: 'formBuilder:endpointOptions.error',\n\tpollOptionsUnavailable: 'formBuilder:poll.optionsUnavailable',\n\tpollFinalResult: 'formBuilder:poll.finalResult',\n\tresultsWinner: 'formBuilder:results.winner',\n\tvalidationFileMissing: 'formBuilder:validation.file.missing',\n\tvalidationFileMimeType: 'formBuilder:validation.file.mimeType',\n\tvalidationFileTooLarge: 'formBuilder:validation.file.tooLarge',\n\tfieldTypeFile: 'formBuilder:fieldType.file',\n\tfileConfigMimeTypes: 'formBuilder:file.config.mimeTypes',\n\tfileConfigMaxSize: 'formBuilder:file.config.maxSize',\n\tfileConfigMaxSizeDescription: 'formBuilder:file.config.maxSizeDescription',\n\tfileTooLarge: 'formBuilder:file.tooLarge',\n\tfileUploadMisconfigured: 'formBuilder:file.uploadMisconfigured',\n\tfileHintAccepted: 'formBuilder:file.hint.accepted',\n\tfileHintMaxSize: 'formBuilder:file.hint.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\tsubmissionMetaLocale: 'formBuilder:submission.meta.locale',\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\tflowDescription: 'formBuilder:flow.description',\n\tflowStepFallbackTitle: 'formBuilder:flow.stepFallbackTitle',\n\tflowFieldInStep: 'formBuilder:flow.fieldInStep',\n\tflowUnassigned: 'formBuilder:flow.unassigned',\n\tflowAssignToStep: 'formBuilder:flow.assignToStep',\n\tflowNextSequential: 'formBuilder:flow.nextSequential',\n\tflowNextTerminal: 'formBuilder:flow.nextTerminal',\n\tflowFields: 'formBuilder:flow.fields',\n\tflowDefaultNext: 'formBuilder:flow.defaultNext',\n\tflowConditionalTransitions: 'formBuilder:flow.conditionalTransitions',\n\tflowStepTitleLabel: 'formBuilder:flow.stepTitleLabel',\n\tflowSelectStepPlaceholder: 'formBuilder:flow.selectStepPlaceholder',\n\tflowMoveTransitionUp: 'formBuilder:flow.moveTransitionUp',\n\tflowMoveTransitionDown: 'formBuilder:flow.moveTransitionDown',\n\tflowRemoveTransition: 'formBuilder:flow.removeTransition',\n\tflowAddAbove: 'formBuilder:flow.addAbove',\n\tflowAddBelow: 'formBuilder:flow.addBelow',\n\tflowGoTo: 'formBuilder:flow.goTo',\n\tflowWhen: 'formBuilder:flow.when',\n\tflowNoFields: 'formBuilder:flow.noFields',\n\tflowFirstMatchWins: 'formBuilder:flow.firstMatchWins',\n\tflowAddTransition: 'formBuilder:flow.addTransition',\n\tflowNoSteps: 'formBuilder:flow.noSteps',\n\tflowFallbackTitle: 'formBuilder:flow.fallbackTitle',\n\tfieldTypeMessage: 'formBuilder:fieldType.message',\n\tconfigContent: 'formBuilder:config.content',\n\ttabResponse: 'formBuilder:tab.response',\n\tresponseType: 'formBuilder:response.type',\n\tresponseTypeMessage: 'formBuilder:response.type.message',\n\tresponseTypeRedirect: 'formBuilder:response.type.redirect',\n\tresponseMessage: 'formBuilder:response.message',\n\tresponseRedirect: 'formBuilder:response.redirect',\n\tresponseUrl: 'formBuilder:response.url',\n\tresponseRedirectReference: 'formBuilder:response.redirect.reference',\n\tresponseRedirectReferenceDescription: 'formBuilder:response.redirect.referenceDescription',\n\tbuttonsSubmitLabel: 'formBuilder:buttons.submitLabel',\n\tbuttonsNextLabel: 'formBuilder:buttons.nextLabel',\n\tbuttonsPrevLabel: 'formBuilder:buttons.prevLabel',\n\tformBack: 'formBuilder:form.back',\n\tformNext: 'formBuilder:form.next',\n\tformSubmit: 'formBuilder:form.submit',\n\tformMultistep: 'formBuilder:form.multistep',\n\tformPollEnabled: 'formBuilder:form.pollEnabled',\n\tcellStepCountOne: 'formBuilder:cell.stepCount.one',\n\tcellStepCountOther: 'formBuilder:cell.stepCount.other',\n\tcellFieldCountOne: 'formBuilder:cell.fieldCount.one',\n\tcellFieldCountOther: 'formBuilder:cell.fieldCount.other',\n\tdepartmentsField: 'formBuilder:departments.field',\n\tdepartmentsFieldDescription: 'formBuilder:departments.fieldDescription',\n\tdepartmentSingular: 'formBuilder:departments.singular',\n\tdepartmentPlural: 'formBuilder:departments.plural',\n\tdepartmentLabel: 'formBuilder:departments.label',\n\tdepartmentEmail: 'formBuilder:departments.email',\n\tdepartmentAddRow: 'formBuilder:departments.addRow',\n\tdepartmentRemoveRow: 'formBuilder:departments.removeRow',\n} as const\n\nexport type TranslationKey = (typeof keys)[keyof typeof keys]\n"],"mappings":"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"}
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\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\tfieldTypeCountry: 'formBuilder:fieldType.country',\n\tfieldTypeState: 'formBuilder:fieldType.state',\n\tfieldTypeCheckbox: 'formBuilder:fieldType.checkbox',\n\tfieldTypeDate: 'formBuilder:fieldType.date',\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\tvalidationDate: 'formBuilder:validation.date',\n\tvalidationSelect: 'formBuilder:validation.select',\n\tvalidationCountry: 'formBuilder:validation.country',\n\tvalidationState: 'formBuilder:validation.state',\n\tvalidationRegexPattern: 'formBuilder:validation.regexPattern',\n\tvalidationRegexFlags: 'formBuilder:validation.regexFlags',\n\tvalidationEmailFieldUnknown: 'formBuilder:validation.emailFieldUnknown',\n\tvalidationResultsFieldUnknown: 'formBuilder:validation.resultsFieldUnknown',\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\truleMinDate: 'formBuilder:rule.minDate.label',\n\truleMaxDate: 'formBuilder:rule.maxDate.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\truleMinDateMessage: 'formBuilder:rule.minDate.message',\n\truleMaxDateMessage: 'formBuilder:rule.maxDate.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\truleMinLengthDescription: 'formBuilder:rule.minLength.description',\n\truleMaxLengthDescription: 'formBuilder:rule.maxLength.description',\n\truleMinDescription: 'formBuilder:rule.min.description',\n\truleMaxDescription: 'formBuilder:rule.max.description',\n\truleMinDateDescription: 'formBuilder:rule.minDate.description',\n\truleMaxDateDescription: 'formBuilder:rule.maxDate.description',\n\trulePatternDescription: 'formBuilder:rule.pattern.description',\n\truleEmailDescription: 'formBuilder:rule.email.description',\n\truleUrlDescription: 'formBuilder:rule.url.description',\n\truleOneOfDescription: 'formBuilder:rule.oneOf.description',\n\truleMatchesFieldDescription: 'formBuilder:rule.matchesField.description',\n\truleNotAlreadySubmittedDescription: 'formBuilder:rule.notAlreadySubmitted.description',\n\truleFieldTargetInvalid: 'formBuilder:rule.fieldTargetInvalid',\n\truleParamMin: 'formBuilder:rule.param.min',\n\truleParamMax: 'formBuilder:rule.param.max',\n\truleParamMinDate: 'formBuilder:rule.param.minDate',\n\truleParamMaxDate: 'formBuilder:rule.param.maxDate',\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\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\tconditionTrue: 'formBuilder:condition.true',\n\tconditionFalse: 'formBuilder:condition.false',\n\tconfigHidden: 'formBuilder:config.hidden',\n\ttabFields: 'formBuilder:tab.fields',\n\ttabFlow: 'formBuilder:tab.flow',\n\ttabActions: 'formBuilder:tab.actions',\n\ttabField: 'formBuilder:tab.field',\n\ttabValidation: 'formBuilder:tab.validation',\n\ttabAdvanced: 'formBuilder:tab.advanced',\n\tfieldTypeCalculation: 'formBuilder:fieldType.calculation',\n\tconfigExpression: 'formBuilder:config.expression',\n\tconfigExpressionDescription: 'formBuilder:config.expressionDescription',\n\tconfigCalcDisplay: 'formBuilder:config.calcDisplay',\n\tvalidationCalcExpressionInvalid: 'formBuilder:validation.calcExpressionInvalid',\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\tactionConfigBodyDescription: 'formBuilder:action.config.bodyDescription',\n\tactionConfigToField: 'formBuilder:action.config.toField',\n\tactionConfigToFieldDescription: 'formBuilder:action.config.toFieldDescription',\n\tactionConfigFrom: 'formBuilder:action.config.from',\n\tactionConfigFromDescription: 'formBuilder:action.config.fromDescription',\n\tactionConfigCc: 'formBuilder:action.config.cc',\n\tactionConfigBcc: 'formBuilder:action.config.bcc',\n\tactionConfigReplyTo: 'formBuilder:action.config.replyTo',\n\trecipientsGroupDepartments: 'formBuilder:recipients.group.departments',\n\trecipientsGroupFields: 'formBuilder:recipients.group.fields',\n\tvalidationRecipientInvalid: 'formBuilder:validation.recipient.invalid',\n\tvalidationRecipientUnknownField: 'formBuilder:validation.recipient.unknownField',\n\tvalidationRecipientNotAllowed: 'formBuilder:validation.recipient.notAllowed',\n\tvalidationRecipientOptionsUnavailable: 'formBuilder:validation.recipient.optionsUnavailable',\n\tvalidationFromUnknown: 'formBuilder:validation.fromUnknown',\n\tvalidationFromUnavailable: 'formBuilder:validation.fromUnavailable',\n\tactionConfigUrl: 'formBuilder:action.config.url',\n\tactionConfigUrlDescription: 'formBuilder:action.config.urlDescription',\n\tactionConfigSecret: 'formBuilder:action.config.secret',\n\tactionConfigSecretDescription: 'formBuilder:action.config.secretDescription',\n\tvalidationUrlInvalid: 'formBuilder:validation.urlInvalid',\n\tconfigActions: 'formBuilder:config.actions',\n\tfieldTypeConsent: 'formBuilder:fieldType.consent',\n\tconsentConfigSource: 'formBuilder:consent.config.source',\n\tconsentConfigSourceDescription: 'formBuilder:consent.config.sourceDescription',\n\tconsentSourcesField: 'formBuilder:consentSources.field',\n\tconsentSourcesFieldDescription: 'formBuilder:consentSources.fieldDescription',\n\tconsentSourceSingular: 'formBuilder:consentSources.singular',\n\tconsentSourcePlural: 'formBuilder:consentSources.plural',\n\tconsentSourceLabel: 'formBuilder:consentSources.label',\n\tconsentSourceStatement: 'formBuilder:consentSources.statement',\n\tconsentSourcePage: 'formBuilder:consentSources.page',\n\tconsentSourcePageDescription: 'formBuilder:consentSources.pageDescription',\n\tconsentSourcesUnavailable: 'formBuilder:consent.sourcesUnavailable',\n\tresultsResponses: 'formBuilder:results.responses',\n\tresultsNoResponses: 'formBuilder:results.noResponses',\n\tresultsTruncated: 'formBuilder:results.truncated',\n\tpollGroup: 'formBuilder:poll.group',\n\tpollResultsField: 'formBuilder:poll.resultsField',\n\tpollResultsFieldDescription: 'formBuilder:poll.resultsFieldDescription',\n\tpollVoteFieldChoose: 'formBuilder:poll.voteFieldChoose',\n\tpollVoteFieldMissing: 'formBuilder:poll.voteFieldMissing',\n\tpollResultsVisibility: 'formBuilder:poll.resultsVisibility',\n\tpollVisibilityAfterVote: 'formBuilder:poll.visibility.afterVote',\n\tpollVisibilityAfterClose: 'formBuilder:poll.visibility.afterClose',\n\tpollClosesAt: 'formBuilder:poll.closesAt',\n\tpollClosed: 'formBuilder:poll.closed',\n\tpollResultsAfterClose: 'formBuilder:poll.resultsAfterClose',\n\tpollOptionSource: 'formBuilder:poll.optionSource',\n\tpollOptionSourceDescription: 'formBuilder:poll.optionSourceDescription',\n\tpollSourceConfig: 'formBuilder:poll.sourceConfig',\n\tpollOutcome: 'formBuilder:poll.outcome',\n\tpollType: 'formBuilder:poll.type',\n\tpollTypeDescription: 'formBuilder:poll.typeDescription',\n\tpollTypeManual: 'formBuilder:poll.type.manual',\n\tpollTypeMostVoted: 'formBuilder:poll.type.mostVoted',\n\tpollTypeSource: 'formBuilder:poll.type.source',\n\tpollCloseButton: 'formBuilder:poll.close.button',\n\tpollReopenButton: 'formBuilder:poll.reopen.button',\n\tpollCloseHintManual: 'formBuilder:poll.close.hintManual',\n\tpollCloseHintMostVoted: 'formBuilder:poll.close.hintMostVoted',\n\tpollCloseHintSource: 'formBuilder:poll.close.hintSource',\n\tpollReopenHint: 'formBuilder:poll.reopen.hint',\n\tpollCloseNeedsWinner: 'formBuilder:poll.close.needsWinner',\n\tpollCloseManualNoWinner: 'formBuilder:poll.close.manualNoWinner',\n\tpollWinningValue: 'formBuilder:poll.winningValue',\n\tpollWinningValueDescription: 'formBuilder:poll.winningValueDescription',\n\tpollResolvedAt: 'formBuilder:poll.resolvedAt',\n\tvalidationWinningValueUnknown: 'formBuilder:validation.winningValueUnknown',\n\tvalidationWinningValueDisabled: 'formBuilder:validation.winningValueDisabled',\n\tendpointOptionsLoading: 'formBuilder:endpointOptions.loading',\n\tendpointOptionsError: 'formBuilder:endpointOptions.error',\n\tpollOptionsUnavailable: 'formBuilder:poll.optionsUnavailable',\n\tpollFinalResult: 'formBuilder:poll.finalResult',\n\tpollResultsError: 'formBuilder:poll.resultsError',\n\tresultsWinner: 'formBuilder:results.winner',\n\tvalidationFileMissing: 'formBuilder:validation.file.missing',\n\tvalidationFileMimeType: 'formBuilder:validation.file.mimeType',\n\tvalidationFileTooLarge: 'formBuilder:validation.file.tooLarge',\n\tfieldTypeFile: 'formBuilder:fieldType.file',\n\tfileConfigMimeTypes: 'formBuilder:file.config.mimeTypes',\n\tfileConfigMaxSize: 'formBuilder:file.config.maxSize',\n\tfileConfigMaxSizeDescription: 'formBuilder:file.config.maxSizeDescription',\n\tfileTooLarge: 'formBuilder:file.tooLarge',\n\tfileUploadMisconfigured: 'formBuilder:file.uploadMisconfigured',\n\tfileHintAccepted: 'formBuilder:file.hint.accepted',\n\tfileHintMaxSize: 'formBuilder:file.hint.maxSize',\n\tfileUploaded: 'formBuilder:file.uploaded',\n\tfileUploading: 'formBuilder:file.uploading',\n\tfileUploadFailed: 'formBuilder:file.uploadFailed',\n\tfileRemove: 'formBuilder:file.remove',\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\tsubmissionMetaLocale: 'formBuilder:submission.meta.locale',\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\tflowDescription: 'formBuilder:flow.description',\n\tflowStepFallbackTitle: 'formBuilder:flow.stepFallbackTitle',\n\tflowFieldInStep: 'formBuilder:flow.fieldInStep',\n\tflowUnassigned: 'formBuilder:flow.unassigned',\n\tflowAssignToStep: 'formBuilder:flow.assignToStep',\n\tflowNextSequential: 'formBuilder:flow.nextSequential',\n\tflowNextTerminal: 'formBuilder:flow.nextTerminal',\n\tflowFields: 'formBuilder:flow.fields',\n\tflowDefaultNext: 'formBuilder:flow.defaultNext',\n\tflowConditionalTransitions: 'formBuilder:flow.conditionalTransitions',\n\tflowStepTitleLabel: 'formBuilder:flow.stepTitleLabel',\n\tflowSelectStepPlaceholder: 'formBuilder:flow.selectStepPlaceholder',\n\tflowMoveTransitionUp: 'formBuilder:flow.moveTransitionUp',\n\tflowMoveTransitionDown: 'formBuilder:flow.moveTransitionDown',\n\tflowRemoveTransition: 'formBuilder:flow.removeTransition',\n\tflowAddAbove: 'formBuilder:flow.addAbove',\n\tflowAddBelow: 'formBuilder:flow.addBelow',\n\tflowGoTo: 'formBuilder:flow.goTo',\n\tflowWhen: 'formBuilder:flow.when',\n\tflowNoFields: 'formBuilder:flow.noFields',\n\tflowFirstMatchWins: 'formBuilder:flow.firstMatchWins',\n\tflowAddTransition: 'formBuilder:flow.addTransition',\n\tflowNoSteps: 'formBuilder:flow.noSteps',\n\tflowFallbackTitle: 'formBuilder:flow.fallbackTitle',\n\tfieldTypeMessage: 'formBuilder:fieldType.message',\n\tconfigContent: 'formBuilder:config.content',\n\ttabResponse: 'formBuilder:tab.response',\n\tresponseType: 'formBuilder:response.type',\n\tresponseTypeMessage: 'formBuilder:response.type.message',\n\tresponseTypeRedirect: 'formBuilder:response.type.redirect',\n\tresponseMessage: 'formBuilder:response.message',\n\tresponseRedirect: 'formBuilder:response.redirect',\n\tresponseUrl: 'formBuilder:response.url',\n\tresponseRedirectReference: 'formBuilder:response.redirect.reference',\n\tresponseRedirectReferenceDescription: 'formBuilder:response.redirect.referenceDescription',\n\tbuttonsSubmitLabel: 'formBuilder:buttons.submitLabel',\n\tbuttonsNextLabel: 'formBuilder:buttons.nextLabel',\n\tbuttonsPrevLabel: 'formBuilder:buttons.prevLabel',\n\tformBack: 'formBuilder:form.back',\n\tformNext: 'formBuilder:form.next',\n\tformSubmit: 'formBuilder:form.submit',\n\tformMultistep: 'formBuilder:form.multistep',\n\tformPollEnabled: 'formBuilder:form.pollEnabled',\n\tformClose: 'formBuilder:form.close',\n\tformSuccess: 'formBuilder:form.success',\n\tformSubmitFailed: 'formBuilder:form.submitFailed',\n\tcellStepCountOne: 'formBuilder:cell.stepCount.one',\n\tcellStepCountOther: 'formBuilder:cell.stepCount.other',\n\tcellFieldCountOne: 'formBuilder:cell.fieldCount.one',\n\tcellFieldCountOther: 'formBuilder:cell.fieldCount.other',\n\tdepartmentsField: 'formBuilder:departments.field',\n\tdepartmentsFieldDescription: 'formBuilder:departments.fieldDescription',\n\tdepartmentSingular: 'formBuilder:departments.singular',\n\tdepartmentPlural: 'formBuilder:departments.plural',\n\tdepartmentLabel: 'formBuilder:departments.label',\n\tdepartmentEmail: 'formBuilder:departments.email',\n\tdepartmentAddRow: 'formBuilder:departments.addRow',\n\tdepartmentRemoveRow: 'formBuilder:departments.removeRow',\n} as const\n\nexport type TranslationKey = (typeof keys)[keyof typeof keys]\n"],"mappings":"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"}
@@ -19,7 +19,14 @@ const labelForKey = (key) => ({ t }) => asTranslate(t)(key);
19
19
  * from `labelForKey`, which constrains to this plugin's typed keys.
20
20
  */
21
21
  const labelFor = (key) => ({ t }) => asTranslate(t)(key);
22
+ /**
23
+ * Turn a registry definition's `label` into a value Payload accepts for a field/block `label`. A
24
+ * string resolves per request like a field label (an i18n key or a literal) via `labelFor`; a
25
+ * per-locale record passes through unchanged. Shared by the action, poll-source, and poll-type
26
+ * registries so every definition label honors one contract.
27
+ */
28
+ const resolveDefinitionLabel = (label) => typeof label === "string" ? labelFor(label) : label;
22
29
  //#endregion
23
- export { asFieldTranslate, asTranslate, labelFor, labelForKey };
30
+ export { asFieldTranslate, asTranslate, labelFor, labelForKey, resolveDefinitionLabel };
24
31
 
25
32
  //# sourceMappingURL=server.js.map
@@ -1 +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"}
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\n/**\n * Turn a registry definition's `label` into a value Payload accepts for a field/block `label`. A\n * string resolves per request like a field label (an i18n key or a literal) via `labelFor`; a\n * per-locale record passes through unchanged. Shared by the action, poll-source, and poll-type\n * registries so every definition label honors one contract.\n */\nexport const resolveDefinitionLabel = (\n\tlabel: string | Record<string, string>\n): LabelFunction | Record<string, string> => (typeof label === 'string' ? labelFor(label) : label)\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;;;;;;;AAQtC,MAAa,0BACZ,UAC6C,OAAO,UAAU,WAAW,SAAS,KAAK,IAAI"}
@@ -10,6 +10,11 @@ type CaptureFileRefArgs = {
10
10
  config: FileFieldConfig;
11
11
  req?: PayloadRequest; /** Resolved submitter identity; must match the upload's `owner` stamp when both are present. */
12
12
  expectedOwner?: string;
13
+ /**
14
+ * Fail closed when a stamped upload's submitter cannot be identified (plugin `spam.uploadOwnership:
15
+ * 'strict'`). Default lenient: an unidentifiable submitter passes an owned upload through.
16
+ */
17
+ strict?: boolean;
13
18
  };
14
19
  /**
15
20
  * Load the referenced upload doc and run the pure trust-boundary check. The client sends only the id; the
@@ -17,9 +22,11 @@ type CaptureFileRefArgs = {
17
22
  * upload carries an `owner` stamp AND the submitter is identifiable, the two must match, so an anonymous
18
23
  * submitter cannot capture another identity's upload; a mismatch collapses to `missing`, indistinguishable
19
24
  * 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.
25
+ * enforced by default (fail-open, consistent with rate-limiting): a proxy-configured deployment identifies
26
+ * every request, so this only relaxes scoping where it could not be applied fairly anyway. Under `strict`
27
+ * (plugin `spam.uploadOwnership: 'strict'`) a stamped upload is rejected even then, so an unverifiable
28
+ * claim can never capture an owned upload. Unstamped uploads (no identity at upload time, or a BYO
29
+ * collection without the field) pass unchanged in either mode.
23
30
  */
24
31
  declare const captureFileRef: (args: CaptureFileRefArgs) => Promise<ResolveFileRefResult>;
25
32
  //#endregion
@@ -6,12 +6,14 @@ import { resolveFileRef } from "./resolveFileRef.js";
6
6
  * upload carries an `owner` stamp AND the submitter is identifiable, the two must match, so an anonymous
7
7
  * submitter cannot capture another identity's upload; a mismatch collapses to `missing`, indistinguishable
8
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.
9
+ * enforced by default (fail-open, consistent with rate-limiting): a proxy-configured deployment identifies
10
+ * every request, so this only relaxes scoping where it could not be applied fairly anyway. Under `strict`
11
+ * (plugin `spam.uploadOwnership: 'strict'`) a stamped upload is rejected even then, so an unverifiable
12
+ * claim can never capture an owned upload. Unstamped uploads (no identity at upload time, or a BYO
13
+ * collection without the field) pass unchanged in either mode.
12
14
  */
13
15
  const captureFileRef = async (args) => {
14
- const { payload, collectionSlug, uploadId, config, req, expectedOwner } = args;
16
+ const { payload, collectionSlug, uploadId, config, req, expectedOwner, strict } = args;
15
17
  const doc = await payload.findByID({
16
18
  collection: collectionSlug,
17
19
  id: uploadId,
@@ -19,12 +21,19 @@ const captureFileRef = async (args) => {
19
21
  overrideAccess: true,
20
22
  req
21
23
  }).catch(() => null);
22
- if (doc && expectedOwner != null) {
24
+ if (doc) {
23
25
  const owner = doc.owner;
24
- if (typeof owner === "string" && owner.length > 0 && owner !== expectedOwner) return {
25
- ok: false,
26
- code: "missing"
27
- };
26
+ if (typeof owner === "string" && owner.length > 0) {
27
+ if (expectedOwner == null) {
28
+ if (strict) return {
29
+ ok: false,
30
+ code: "missing"
31
+ };
32
+ } else if (owner !== expectedOwner) return {
33
+ ok: false,
34
+ code: "missing"
35
+ };
36
+ }
28
37
  }
29
38
  return resolveFileRef(doc, config);
30
39
  };
@@ -1 +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"}
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\t/**\n\t * Fail closed when a stamped upload's submitter cannot be identified (plugin `spam.uploadOwnership:\n\t * 'strict'`). Default lenient: an unidentifiable submitter passes an owned upload through.\n\t */\n\tstrict?: boolean\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 by default (fail-open, consistent with rate-limiting): a proxy-configured deployment identifies\n * every request, so this only relaxes scoping where it could not be applied fairly anyway. Under `strict`\n * (plugin `spam.uploadOwnership: 'strict'`) a stamped upload is rejected even then, so an unverifiable\n * claim can never capture an owned upload. Unstamped uploads (no identity at upload time, or a BYO\n * collection without the field) pass unchanged in either mode.\n */\nexport const captureFileRef = async (args: CaptureFileRefArgs): Promise<ResolveFileRefResult> => {\n\tconst { payload, collectionSlug, uploadId, config, req, expectedOwner, strict } = 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) {\n\t\tconst owner = (doc as { owner?: unknown }).owner\n\t\tconst stamped = typeof owner === 'string' && owner.length > 0\n\t\tif (stamped) {\n\t\t\tif (expectedOwner == null) {\n\t\t\t\tif (strict) {\n\t\t\t\t\treturn { ok: false, code: 'missing' }\n\t\t\t\t}\n\t\t\t} else if (owner !== expectedOwner) {\n\t\t\t\treturn { ok: false, code: 'missing' }\n\t\t\t}\n\t\t}\n\t}\n\treturn resolveFileRef(doc, config)\n}\n"],"mappings":";;;;;;;;;;;;;;AA+BA,MAAa,iBAAiB,OAAO,SAA4D;CAChG,MAAM,EAAE,SAAS,gBAAgB,UAAU,QAAQ,KAAK,eAAe,WAAW;CAClF,MAAM,MAAM,MAAM,QAChB,SAAS;EACT,YAAY;EACZ,IAAI;EACJ,OAAO;EACP,gBAAgB;EAChB;CACD,CAAC,EACA,YAAY,IAAI;CAClB,IAAI,KAAK;EACR,MAAM,QAAS,IAA4B;EAE3C,IADgB,OAAO,UAAU,YAAY,MAAM,SAAS;OAEvD,iBAAiB;QAChB,QACH,OAAO;KAAE,IAAI;KAAO,MAAM;IAAU;GAAA,OAE/B,IAAI,UAAU,eACpB,OAAO;IAAE,IAAI;IAAO,MAAM;GAAU;EAAA;CAGvC;CACA,OAAO,eAAe,KAAK,MAAM;AAClC"}
@@ -1,7 +1,7 @@
1
1
  import { keys } from "../../translations/keys.js";
2
+ import { EMAIL_PATTERN } from "../emailPattern.js";
2
3
  import { defineValidationRule } from "../defineValidationRule.js";
3
4
  //#region src/validation/builtin/email.ts
4
- const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
5
5
  const emailRule = defineValidationRule({
6
6
  type: "email",
7
7
  label: keys.ruleEmail,
@@ -1 +1 @@
1
- {"version":3,"file":"email.js","names":[],"sources":["../../../src/validation/builtin/email.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { defineValidationRule } from '../defineValidationRule'\n\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nexport const emailRule = defineValidationRule<Record<string, never>, string>({\n\ttype: 'email',\n\tlabel: keys.ruleEmail,\n\tdescription: keys.ruleEmailDescription,\n\tappliesTo: ['text', 'textarea', 'email'],\n\tdefaultMessage: keys.ruleEmailMessage,\n\tvalidate: ({ value, message }) =>\n\t\tvalue == null || value === '' || EMAIL_PATTERN.test(value) ? true : message(),\n})\n"],"mappings":";;;AAGA,MAAM,gBAAgB;AAEtB,MAAa,YAAY,qBAAoD;CAC5E,MAAM;CACN,OAAO,KAAK;CACZ,aAAa,KAAK;CAClB,WAAW;EAAC;EAAQ;EAAY;CAAO;CACvC,gBAAgB,KAAK;CACrB,WAAW,EAAE,OAAO,cACnB,SAAS,QAAQ,UAAU,MAAM,cAAc,KAAK,KAAK,IAAI,OAAO,QAAQ;AAC9E,CAAC"}
1
+ {"version":3,"file":"email.js","names":[],"sources":["../../../src/validation/builtin/email.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { defineValidationRule } from '../defineValidationRule'\nimport { EMAIL_PATTERN } from '../emailPattern'\n\nexport const emailRule = defineValidationRule<Record<string, never>, string>({\n\ttype: 'email',\n\tlabel: keys.ruleEmail,\n\tdescription: keys.ruleEmailDescription,\n\tappliesTo: ['text', 'textarea', 'email'],\n\tdefaultMessage: keys.ruleEmailMessage,\n\tvalidate: ({ value, message }) =>\n\t\tvalue == null || value === '' || EMAIL_PATTERN.test(value) ? true : message(),\n})\n"],"mappings":";;;;AAIA,MAAa,YAAY,qBAAoD;CAC5E,MAAM;CACN,OAAO,KAAK;CACZ,aAAa,KAAK;CAClB,WAAW;EAAC;EAAQ;EAAY;CAAO;CACvC,gBAAgB,KAAK;CACrB,WAAW,EAAE,OAAO,cACnB,SAAS,QAAQ,UAAU,MAAM,cAAc,KAAK,KAAK,IAAI,OAAO,QAAQ;AAC9E,CAAC"}
@@ -21,6 +21,7 @@ const notAlreadySubmittedRule = defineValidationRule({
21
21
  where: { form: { equals: formId } },
22
22
  limit: SCAN_LIMIT,
23
23
  depth: 0,
24
+ overrideAccess: true,
24
25
  req
25
26
  })).docs.some((doc) => {
26
27
  return (doc.values ?? []).some((entry) => entry.field === field.name && entry.value === value);
@@ -1 +1 @@
1
- {"version":3,"file":"notAlreadySubmitted.js","names":[],"sources":["../../../src/validation/builtin/notAlreadySubmitted.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { defineValidationRule } from '../defineValidationRule'\n\nconst FORM_SUBMISSIONS_SLUG = 'form-submissions'\nconst SCAN_LIMIT = 500\n\n/**\n * Server-only async exemplar: rejects a value already present for the same form. Scans up to\n * `SCAN_LIMIT` recent submissions in JS (the values live in a json column, so a portable DB query is\n * not available); a future phase can add an indexed dedup column for scale.\n */\nexport const notAlreadySubmittedRule = defineValidationRule<Record<string, never>, unknown>({\n\ttype: 'notAlreadySubmitted',\n\tlabel: keys.ruleNotAlreadySubmitted,\n\tdescription: keys.ruleNotAlreadySubmittedDescription,\n\tclient: false,\n\tdefaultMessage: keys.ruleNotAlreadySubmittedMessage,\n\tvalidate: async ({ value, field, payload, req, formId, message }) => {\n\t\tif (value == null || value === '' || !payload || formId == null) {\n\t\t\treturn true\n\t\t}\n\t\tconst result = await payload.find({\n\t\t\tcollection: FORM_SUBMISSIONS_SLUG,\n\t\t\twhere: { form: { equals: formId } },\n\t\t\tlimit: SCAN_LIMIT,\n\t\t\tdepth: 0,\n\t\t\treq,\n\t\t})\n\t\tconst clash = result.docs.some((doc) => {\n\t\t\tconst values = (doc as { values?: { field: string; value: unknown }[] }).values ?? []\n\t\t\treturn values.some((entry) => entry.field === field.name && entry.value === value)\n\t\t})\n\t\treturn clash ? message() : true\n\t},\n})\n"],"mappings":";;;AAGA,MAAM,wBAAwB;AAC9B,MAAM,aAAa;;;;;;AAOnB,MAAa,0BAA0B,qBAAqD;CAC3F,MAAM;CACN,OAAO,KAAK;CACZ,aAAa,KAAK;CAClB,QAAQ;CACR,gBAAgB,KAAK;CACrB,UAAU,OAAO,EAAE,OAAO,OAAO,SAAS,KAAK,QAAQ,cAAc;EACpE,IAAI,SAAS,QAAQ,UAAU,MAAM,CAAC,WAAW,UAAU,MAC1D,OAAO;EAaR,QAJc,MAPO,QAAQ,KAAK;GACjC,YAAY;GACZ,OAAO,EAAE,MAAM,EAAE,QAAQ,OAAO,EAAE;GAClC,OAAO;GACP,OAAO;GACP;EACD,CAAC,GACoB,KAAK,MAAM,QAAQ;GAEvC,QADgB,IAAyD,UAAU,CAAC,GACtE,MAAM,UAAU,MAAM,UAAU,MAAM,QAAQ,MAAM,UAAU,KAAK;EAClF,CACW,IAAI,QAAQ,IAAI;CAC5B;AACD,CAAC"}
1
+ {"version":3,"file":"notAlreadySubmitted.js","names":[],"sources":["../../../src/validation/builtin/notAlreadySubmitted.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { defineValidationRule } from '../defineValidationRule'\n\nconst FORM_SUBMISSIONS_SLUG = 'form-submissions'\nconst SCAN_LIMIT = 500\n\n/**\n * Server-only async exemplar: rejects a value already present for the same form. Scans up to\n * `SCAN_LIMIT` recent submissions in JS (the values live in a json column, so a portable DB query is\n * not available); a future phase can add an indexed dedup column for scale.\n */\nexport const notAlreadySubmittedRule = defineValidationRule<Record<string, never>, unknown>({\n\ttype: 'notAlreadySubmitted',\n\tlabel: keys.ruleNotAlreadySubmitted,\n\tdescription: keys.ruleNotAlreadySubmittedDescription,\n\tclient: false,\n\tdefaultMessage: keys.ruleNotAlreadySubmittedMessage,\n\tvalidate: async ({ value, field, payload, req, formId, message }) => {\n\t\tif (value == null || value === '' || !payload || formId == null) {\n\t\t\treturn true\n\t\t}\n\t\tconst result = await payload.find({\n\t\t\tcollection: FORM_SUBMISSIONS_SLUG,\n\t\t\twhere: { form: { equals: formId } },\n\t\t\tlimit: SCAN_LIMIT,\n\t\t\tdepth: 0,\n\t\t\t// Trusted internal dedup read: scan every prior submission of this form regardless of the\n\t\t\t// submitter's own access. This is the local-API default made explicit, matching the sibling\n\t\t\t// resolvePollOutcome/aggregateResponses reads; the `form` filter keeps it single-tenant.\n\t\t\toverrideAccess: true,\n\t\t\treq,\n\t\t})\n\t\tconst clash = result.docs.some((doc) => {\n\t\t\tconst values = (doc as { values?: { field: string; value: unknown }[] }).values ?? []\n\t\t\treturn values.some((entry) => entry.field === field.name && entry.value === value)\n\t\t})\n\t\treturn clash ? message() : true\n\t},\n})\n"],"mappings":";;;AAGA,MAAM,wBAAwB;AAC9B,MAAM,aAAa;;;;;;AAOnB,MAAa,0BAA0B,qBAAqD;CAC3F,MAAM;CACN,OAAO,KAAK;CACZ,aAAa,KAAK;CAClB,QAAQ;CACR,gBAAgB,KAAK;CACrB,UAAU,OAAO,EAAE,OAAO,OAAO,SAAS,KAAK,QAAQ,cAAc;EACpE,IAAI,SAAS,QAAQ,UAAU,MAAM,CAAC,WAAW,UAAU,MAC1D,OAAO;EAiBR,QAJc,MAXO,QAAQ,KAAK;GACjC,YAAY;GACZ,OAAO,EAAE,MAAM,EAAE,QAAQ,OAAO,EAAE;GAClC,OAAO;GACP,OAAO;GAIP,gBAAgB;GAChB;EACD,CAAC,GACoB,KAAK,MAAM,QAAQ;GAEvC,QADgB,IAAyD,UAAU,CAAC,GACtE,MAAM,UAAU,MAAM,UAAU,MAAM,QAAQ,MAAM,UAAU,KAAK;EAClF,CACW,IAAI,QAAQ,IAAI;CAC5B;AACD,CAAC"}
@@ -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"}
@@ -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 = Record<string, ValidationRuleOption>;
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 = Record<string, ValidationRuleOption>\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 => {\n\tconst registry = buildRuleRegistry(defaults)\n\tfor (const [type, option] of Object.entries(config)) {\n\t\tif (option === false) {\n\t\t\tregistry.delete(type)\n\t\t} else if (option === true) {\n\t\t\t// keep the default; a no-op when no default exists for this key\n\t\t} else {\n\t\t\tregistry.set(type, { ...option, type })\n\t\t}\n\t}\n\treturn registry\n}\n"],"mappings":";AASA,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;CAC5B,MAAM,WAAW,kBAAkB,QAAQ;CAC3C,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,MAAM,GACjD,IAAI,WAAW,OACd,SAAS,OAAO,IAAI;MACd,IAAI,WAAW,MAAM,CAE5B,OACC,SAAS,IAAI,MAAM;EAAE,GAAG;EAAQ;CAAK,CAAC;CAGxC,OAAO;AACR"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@10x-media/form-builder",
3
- "version": "0.1.0-beta.6",
3
+ "version": "0.1.0-beta.8",
4
4
  "description": "End-to-end forms platform for Payload: author, validate, render, collect, aggregate, and act.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -93,10 +93,10 @@
93
93
  "tsdown": "0.22.1",
94
94
  "typescript": "5.9.3",
95
95
  "vitest": "4.1.7",
96
- "@10x-media/tsconfig": "0.0.0",
97
96
  "@10x-media/payload-test-harness": "0.0.0",
98
- "@10x-media/vitest-config": "0.0.0",
99
- "@10x-media/tsdown-config": "0.0.0"
97
+ "@10x-media/tsconfig": "0.0.0",
98
+ "@10x-media/tsdown-config": "0.0.0",
99
+ "@10x-media/vitest-config": "0.0.0"
100
100
  },
101
101
  "publishConfig": {
102
102
  "access": "public"