@10x-media/form-builder 0.1.0-beta.3 → 0.1.0-beta.4

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 (166) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +2 -2
  3. package/dist/actions/body/serializeBody.d.ts +19 -4
  4. package/dist/actions/body/serializeBody.js +3 -1
  5. package/dist/actions/body/serializeBody.js.map +1 -1
  6. package/dist/actions/builtin/confirmation.js +13 -4
  7. package/dist/actions/builtin/confirmation.js.map +1 -1
  8. package/dist/actions/builtin/emailTeam.js +13 -4
  9. package/dist/actions/builtin/emailTeam.js.map +1 -1
  10. package/dist/actions/builtin/index.d.ts +13 -1
  11. package/dist/actions/builtin/index.js +18 -7
  12. package/dist/actions/builtin/index.js.map +1 -1
  13. package/dist/actions/builtin/signedWebhook.js +2 -16
  14. package/dist/actions/builtin/signedWebhook.js.map +1 -1
  15. package/dist/actions/runActions.js +2 -0
  16. package/dist/actions/runActions.js.map +1 -1
  17. package/dist/aggregation/resolveResultsRequest.d.ts +22 -6
  18. package/dist/aggregation/resolveResultsRequest.js +18 -7
  19. package/dist/aggregation/resolveResultsRequest.js.map +1 -1
  20. package/dist/client/FlowBuilder.js +98 -53
  21. package/dist/client/FlowBuilder.js.map +1 -1
  22. package/dist/client/admin.css +47 -5
  23. package/dist/client/flowAuthoring.js +35 -0
  24. package/dist/client/flowAuthoring.js.map +1 -0
  25. package/dist/client/synthesizeClientField.js +6 -2
  26. package/dist/client/synthesizeClientField.js.map +1 -1
  27. package/dist/collections/formSubmissions.js +47 -9
  28. package/dist/collections/formSubmissions.js.map +1 -1
  29. package/dist/collections/forms.js +180 -34
  30. package/dist/collections/forms.js.map +1 -1
  31. package/dist/conditions/conditionType.js +9 -2
  32. package/dist/conditions/conditionType.js.map +1 -1
  33. package/dist/conditions/normalizeConditions.js +2 -1
  34. package/dist/conditions/normalizeConditions.js.map +1 -1
  35. package/dist/consent/builtin/index.d.ts +11 -1
  36. package/dist/consent/builtin/index.js +15 -5
  37. package/dist/consent/builtin/index.js.map +1 -1
  38. package/dist/consent/builtin/static.js +7 -3
  39. package/dist/consent/builtin/static.js.map +1 -1
  40. package/dist/exports/react.d.ts +10 -6
  41. package/dist/exports/react.js +6 -2
  42. package/dist/exports/rsc.d.ts +6 -1
  43. package/dist/exports/rsc.js +6 -1
  44. package/dist/exports/types.d.ts +4 -4
  45. package/dist/fields/buildFieldBlocks.js +17 -8
  46. package/dist/fields/buildFieldBlocks.js.map +1 -1
  47. package/dist/fields/builtin/consent.js +8 -4
  48. package/dist/fields/builtin/consent.js.map +1 -1
  49. package/dist/fields/builtin/file.js +8 -4
  50. package/dist/fields/builtin/file.js.map +1 -1
  51. package/dist/fields/builtin/index.d.ts +11 -1
  52. package/dist/fields/builtin/index.js +21 -9
  53. package/dist/fields/builtin/index.js.map +1 -1
  54. package/dist/fields/builtin/message.js +26 -0
  55. package/dist/fields/builtin/message.js.map +1 -0
  56. package/dist/fields/builtin/repeater.js +7 -3
  57. package/dist/fields/builtin/repeater.js.map +1 -1
  58. package/dist/fields/builtin/select.js +7 -3
  59. package/dist/fields/builtin/select.js.map +1 -1
  60. package/dist/fields/localizedIf.d.ts +13 -0
  61. package/dist/fields/localizedIf.js +12 -0
  62. package/dist/fields/localizedIf.js.map +1 -0
  63. package/dist/fields/sharedConfig.js +64 -51
  64. package/dist/fields/sharedConfig.js.map +1 -1
  65. package/dist/fields/types.d.ts +7 -2
  66. package/dist/flow/normalizeFlow.js +7 -1
  67. package/dist/flow/normalizeFlow.js.map +1 -1
  68. package/dist/flow/stepLabel.js +15 -0
  69. package/dist/flow/stepLabel.js.map +1 -0
  70. package/dist/form/pollState.d.ts +22 -0
  71. package/dist/form/pollState.js +17 -0
  72. package/dist/form/pollState.js.map +1 -0
  73. package/dist/form/toFormDocument.d.ts +60 -0
  74. package/dist/form/toFormDocument.js +39 -0
  75. package/dist/form/toFormDocument.js.map +1 -0
  76. package/dist/form/types.d.ts +48 -0
  77. package/dist/index.d.ts +69 -18
  78. package/dist/index.js +24 -13
  79. package/dist/index.js.map +1 -1
  80. package/dist/plugin/registerCollections.js +15 -36
  81. package/dist/plugin/registerCollections.js.map +1 -1
  82. package/dist/plugin/uploadsCollection.d.ts +11 -0
  83. package/dist/plugin/uploadsCollection.js +44 -0
  84. package/dist/plugin/uploadsCollection.js.map +1 -0
  85. package/dist/poll/applyPollOptions.js +17 -0
  86. package/dist/poll/applyPollOptions.js.map +1 -0
  87. package/dist/poll/buildPollOptionSourceFields.js +53 -0
  88. package/dist/poll/buildPollOptionSourceFields.js.map +1 -0
  89. package/dist/poll/definePollOptionSource.d.ts +35 -0
  90. package/dist/poll/definePollOptionSource.js +6 -0
  91. package/dist/poll/definePollOptionSource.js.map +1 -0
  92. package/dist/poll/registry.d.ts +16 -0
  93. package/dist/poll/registry.js +16 -0
  94. package/dist/poll/registry.js.map +1 -0
  95. package/dist/poll/resolvePollOptions.d.ts +28 -0
  96. package/dist/poll/resolvePollOptions.js +64 -0
  97. package/dist/poll/resolvePollOptions.js.map +1 -0
  98. package/dist/poll/resolvePollOutcome.d.ts +21 -0
  99. package/dist/poll/resolvePollOutcome.js +36 -0
  100. package/dist/poll/resolvePollOutcome.js.map +1 -0
  101. package/dist/prefill/valuesFromSearchParams.js +1 -1
  102. package/dist/prefill/valuesFromSearchParams.js.map +1 -1
  103. package/dist/presentations/types.d.ts +3 -2
  104. package/dist/react/Form.d.ts +13 -31
  105. package/dist/react/Form.js +96 -83
  106. package/dist/react/Form.js.map +1 -1
  107. package/dist/react/FormContext.d.ts +35 -1
  108. package/dist/react/FormContext.js.map +1 -1
  109. package/dist/react/FormControls.d.ts +55 -0
  110. package/dist/react/FormControls.js +56 -0
  111. package/dist/react/FormControls.js.map +1 -0
  112. package/dist/react/FormResults.d.ts +6 -3
  113. package/dist/react/FormResults.js +37 -29
  114. package/dist/react/FormResults.js.map +1 -1
  115. package/dist/react/FormSteps.d.ts +17 -0
  116. package/dist/react/FormSteps.js +35 -0
  117. package/dist/react/FormSteps.js.map +1 -0
  118. package/dist/react/Poll.d.ts +17 -6
  119. package/dist/react/Poll.js +66 -18
  120. package/dist/react/Poll.js.map +1 -1
  121. package/dist/react/fetchResults.d.ts +1 -1
  122. package/dist/react/fetchResults.js +1 -1
  123. package/dist/react/fetchResults.js.map +1 -1
  124. package/dist/react/renderers/file.js +5 -1
  125. package/dist/react/renderers/file.js.map +1 -1
  126. package/dist/react/renderers/index.js +2 -0
  127. package/dist/react/renderers/index.js.map +1 -1
  128. package/dist/react/renderers/message.js +35 -0
  129. package/dist/react/renderers/message.js.map +1 -0
  130. package/dist/react/state.d.ts +25 -1
  131. package/dist/react/state.js +14 -1
  132. package/dist/react/state.js.map +1 -1
  133. package/dist/react/uploadFile.d.ts +2 -2
  134. package/dist/react/uploadFile.js +1 -1
  135. package/dist/react/uploadFile.js.map +1 -1
  136. package/dist/submissions/runSubmission.js +70 -33
  137. package/dist/submissions/runSubmission.js.map +1 -1
  138. package/dist/submissions/validateSubmission.js +41 -7
  139. package/dist/submissions/validateSubmission.js.map +1 -1
  140. package/dist/submissions/votedCookie.d.ts +13 -0
  141. package/dist/submissions/votedCookie.js +27 -0
  142. package/dist/submissions/votedCookie.js.map +1 -0
  143. package/dist/translations/de.js +219 -0
  144. package/dist/translations/de.js.map +1 -0
  145. package/dist/translations/en.js +45 -6
  146. package/dist/translations/en.js.map +1 -1
  147. package/dist/translations/index.d.ts +2 -1
  148. package/dist/translations/index.js +6 -2
  149. package/dist/translations/index.js.map +1 -1
  150. package/dist/translations/keys.d.ts +43 -4
  151. package/dist/translations/keys.js +44 -5
  152. package/dist/translations/keys.js.map +1 -1
  153. package/dist/uploads/types.d.ts +1 -2
  154. package/dist/validation/validateUrl.js +22 -0
  155. package/dist/validation/validateUrl.js.map +1 -0
  156. package/package.json +2 -1
  157. package/styles/form-builder.css +10 -0
  158. package/dist/collections/uploads.d.ts +0 -30
  159. package/dist/collections/uploads.js +0 -55
  160. package/dist/collections/uploads.js.map +0 -1
  161. package/dist/presentations/registry.d.ts +0 -15
  162. package/dist/presentations/registry.js +0 -15
  163. package/dist/presentations/registry.js.map +0 -1
  164. package/dist/react/toFormDocument.d.ts +0 -24
  165. package/dist/react/toFormDocument.js +0 -22
  166. package/dist/react/toFormDocument.js.map +0 -1
@@ -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\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\tvalidationEmailFieldUnknown: 'formBuilder:validation.emailFieldUnknown',\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\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\tvalidationSeverityLabel: 'formBuilder:validations.severity',\n\tvalidationSeverityError: 'formBuilder:validations.severity.error',\n\tvalidationSeverityWarning: 'formBuilder:validations.severity.warning',\n\tconditionAddCondition: 'formBuilder:condition.addCondition',\n\tconditionAddOr: 'formBuilder:condition.addOr',\n\tconditionAnd: 'formBuilder:condition.and',\n\tconditionOr: 'formBuilder:condition.or',\n\tconditionRemove: 'formBuilder:condition.remove',\n\tconditionNoFields: 'formBuilder:condition.noFields',\n\tconditionEmpty: 'formBuilder:condition.empty',\n\tconditionSelectField: 'formBuilder:condition.selectField',\n\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\tconfigDefaultPresentation: 'formBuilder:config.defaultPresentation',\n\tpresentationPage: 'formBuilder:presentation.page',\n\tpresentationModal: 'formBuilder:presentation.modal',\n\tpresentationDrawer: 'formBuilder:presentation.drawer',\n\tpresentationInline: 'formBuilder:presentation.inline',\n\tactionEmailTeam: 'formBuilder:action.emailTeam',\n\tactionConfirmation: 'formBuilder:action.confirmation',\n\tactionSignedWebhook: 'formBuilder:action.signedWebhook',\n\tactionConfigTo: 'formBuilder:action.config.to',\n\tactionConfigSubject: 'formBuilder:action.config.subject',\n\tactionConfigBody: 'formBuilder:action.config.body',\n\tactionConfigBodyDescription: 'formBuilder:action.config.bodyDescription',\n\tactionConfigToField: 'formBuilder:action.config.toField',\n\tactionConfigToFieldDescription: 'formBuilder:action.config.toFieldDescription',\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\tconsentSourceStatic: 'formBuilder:consentSource.static',\n\tconsentSourcePageReference: 'formBuilder:consentSource.pageReference',\n\tconsentConfigLabel: 'formBuilder:consent.config.label',\n\tconsentConfigUrl: 'formBuilder:consent.config.url',\n\tconsentConfigVersion: 'formBuilder:consent.config.version',\n\tconsentConfigRelationTo: 'formBuilder:consent.config.relationTo',\n\tconsentConfigDocId: 'formBuilder:consent.config.docId',\n\tconsentConfigUrlField: 'formBuilder:consent.config.urlField',\n\tconsentConfigCaptureVersion: 'formBuilder:consent.config.captureVersion',\n\tfieldTypeConsent: 'formBuilder:fieldType.consent',\n\tconsentConfigStatement: 'formBuilder:consent.config.statement',\n\tconsentConfigSource: 'formBuilder:consent.config.source',\n\tconsentConfigSourceConfig: 'formBuilder:consent.config.sourceConfig',\n\tconsentConfigOptional: 'formBuilder:consent.config.optional',\n\tresultsResponses: 'formBuilder:results.responses',\n\tresultsNoResponses: 'formBuilder:results.noResponses',\n\tresultsTruncated: 'formBuilder:results.truncated',\n\tconfigShowResults: 'formBuilder:config.showResults',\n\tconfigResultsField: 'formBuilder:config.resultsField',\n\tvalidationFileMissing: 'formBuilder:validation.file.missing',\n\tvalidationFileMimeType: 'formBuilder:validation.file.mimeType',\n\tvalidationFileTooLarge: 'formBuilder:validation.file.tooLarge',\n\tfieldTypeFile: 'formBuilder:fieldType.file',\n\tfileConfigRelationTo: 'formBuilder:file.config.relationTo',\n\tfileConfigMimeTypes: 'formBuilder:file.config.mimeTypes',\n\tfileConfigMaxSize: 'formBuilder:file.config.maxSize',\n\tfileConfigMaxSizeDescription: 'formBuilder:file.config.maxSizeDescription',\n\tfileTooLarge: 'formBuilder:file.tooLarge',\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\tsubmissionMetaReceivedAt: 'formBuilder:submission.meta.receivedAt',\n\tsubmissionMetaIp: 'formBuilder:submission.meta.ip',\n\tsubmissionMetaUserAgent: 'formBuilder:submission.meta.userAgent',\n\tsubmissionMetaCaptcha: 'formBuilder:submission.meta.captcha',\n} as const\n\nexport type TranslationKey = (typeof keys)[keyof typeof keys]\n"],"mappings":"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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\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\tvalidationEmailFieldUnknown: 'formBuilder:validation.emailFieldUnknown',\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\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\tvalidationSeverityLabel: 'formBuilder:validations.severity',\n\tvalidationSeverityError: 'formBuilder:validations.severity.error',\n\tvalidationSeverityWarning: 'formBuilder:validations.severity.warning',\n\tconditionAddCondition: 'formBuilder:condition.addCondition',\n\tconditionAddOr: 'formBuilder:condition.addOr',\n\tconditionAnd: 'formBuilder:condition.and',\n\tconditionOr: 'formBuilder:condition.or',\n\tconditionRemove: 'formBuilder:condition.remove',\n\tconditionNoFields: 'formBuilder:condition.noFields',\n\tconditionEmpty: 'formBuilder:condition.empty',\n\tconditionSelectField: 'formBuilder:condition.selectField',\n\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\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\tconsentSourceStatic: 'formBuilder:consentSource.static',\n\tconsentSourcePageReference: 'formBuilder:consentSource.pageReference',\n\tconsentConfigLabel: 'formBuilder:consent.config.label',\n\tconsentConfigUrl: 'formBuilder:consent.config.url',\n\tconsentConfigVersion: 'formBuilder:consent.config.version',\n\tconsentConfigRelationTo: 'formBuilder:consent.config.relationTo',\n\tconsentConfigDocId: 'formBuilder:consent.config.docId',\n\tconsentConfigUrlField: 'formBuilder:consent.config.urlField',\n\tconsentConfigCaptureVersion: 'formBuilder:consent.config.captureVersion',\n\tfieldTypeConsent: 'formBuilder:fieldType.consent',\n\tconsentConfigStatement: 'formBuilder:consent.config.statement',\n\tconsentConfigSource: 'formBuilder:consent.config.source',\n\tconsentConfigSourceConfig: 'formBuilder:consent.config.sourceConfig',\n\tconsentConfigOptional: 'formBuilder:consent.config.optional',\n\tresultsResponses: 'formBuilder:results.responses',\n\tresultsNoResponses: 'formBuilder:results.noResponses',\n\tresultsTruncated: 'formBuilder:results.truncated',\n\tpollGroup: 'formBuilder:poll.group',\n\tpollEnabled: 'formBuilder:poll.enabled',\n\tpollResultsField: 'formBuilder:poll.resultsField',\n\tpollResultsFieldDescription: 'formBuilder:poll.resultsFieldDescription',\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\tpollWinningValue: 'formBuilder:poll.winningValue',\n\tpollResolvedAt: 'formBuilder:poll.resolvedAt',\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\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\tflowNextTerminal: 'formBuilder:flow.nextTerminal',\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\tresponseSubmitLabel: 'formBuilder:response.submitLabel',\n\ttabDisplay: 'formBuilder:tab.display',\n\tdisplayShowTitle: 'formBuilder:display.showTitle',\n\tdisplayTitle: 'formBuilder:display.title',\n\tdisplayIntro: 'formBuilder:display.intro',\n\tformBack: 'formBuilder:form.back',\n\tformNext: 'formBuilder:form.next',\n\tformSubmit: 'formBuilder:form.submit',\n} as const\n\nexport type TranslationKey = (typeof keys)[keyof typeof keys]\n"],"mappings":"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"}
@@ -9,8 +9,7 @@ type FileRef = {
9
9
  };
10
10
  /** Per-field file constraints, authored in the field config. */
11
11
  type FileFieldConfig = {
12
- /** Upload collection slug to read from. Defaults to the plugin's `form-uploads`. */relationTo?: string; /** Allowed MIME types (exact match or a `type/*` wildcard). Empty/absent allows any. */
13
- mimeTypes?: string[]; /** Maximum file size in bytes. Absent allows any size (subject to the collection limit). */
12
+ /** Allowed MIME types (exact match or a `type/*` wildcard). Empty/absent allows any. */mimeTypes?: string[]; /** Maximum file size in bytes. Absent allows any size (subject to the collection limit). */
14
13
  maxSize?: number;
15
14
  };
16
15
  /** Why a file reference was rejected at the server trust boundary. */
@@ -0,0 +1,22 @@
1
+ import { keys } from "../translations/keys.js";
2
+ import { asTranslate } from "../translations/server.js";
3
+ //#region src/validation/validateUrl.ts
4
+ /**
5
+ * Payload field validator for URL config fields (signed-webhook `url`, response redirect `url`):
6
+ * unset is fine (the consumer enforces presence where it matters), otherwise the value must parse
7
+ * as an absolute http(s) URL.
8
+ */
9
+ const validateUrl = (value, { req }) => {
10
+ if (typeof value !== "string" || value.length === 0) return true;
11
+ let parsed;
12
+ try {
13
+ parsed = new URL(value);
14
+ } catch {
15
+ return asTranslate(req.t)(keys.validationUrlInvalid);
16
+ }
17
+ return parsed.protocol === "http:" || parsed.protocol === "https:" ? true : asTranslate(req.t)(keys.validationUrlInvalid);
18
+ };
19
+ //#endregion
20
+ export { validateUrl };
21
+
22
+ //# sourceMappingURL=validateUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateUrl.js","names":[],"sources":["../../src/validation/validateUrl.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\nimport { keys } from '../translations/keys'\nimport { asTranslate } from '../translations/server'\n\n/**\n * Payload field validator for URL config fields (signed-webhook `url`, response redirect `url`):\n * unset is fine (the consumer enforces presence where it matters), otherwise the value must parse\n * as an absolute http(s) URL.\n */\nexport const validateUrl = (\n\tvalue: unknown,\n\t{ req }: { data?: unknown; req: PayloadRequest }\n): string | true => {\n\tif (typeof value !== 'string' || value.length === 0) {\n\t\treturn true\n\t}\n\tlet parsed: URL\n\ttry {\n\t\tparsed = new URL(value)\n\t} catch {\n\t\treturn asTranslate(req.t)(keys.validationUrlInvalid)\n\t}\n\treturn parsed.protocol === 'http:' || parsed.protocol === 'https:'\n\t\t? true\n\t\t: asTranslate(req.t)(keys.validationUrlInvalid)\n}\n"],"mappings":";;;;;;;;AASA,MAAa,eACZ,OACA,EAAE,UACiB;CACnB,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GACjD,OAAO;CAER,IAAI;CACJ,IAAI;EACH,SAAS,IAAI,IAAI,KAAK;CACvB,QAAQ;EACP,OAAO,YAAY,IAAI,CAAC,EAAE,KAAK,oBAAoB;CACpD;CACA,OAAO,OAAO,aAAa,WAAW,OAAO,aAAa,WACvD,OACA,YAAY,IAAI,CAAC,EAAE,KAAK,oBAAoB;AAChD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@10x-media/form-builder",
3
- "version": "0.1.0-beta.3",
3
+ "version": "0.1.0-beta.4",
4
4
  "description": "End-to-end forms platform for Payload: author, validate, render, collect, aggregate, and act.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -74,6 +74,7 @@
74
74
  "@axe-core/playwright": "^4.11.3",
75
75
  "@payloadcms/db-mongodb": "3.85.0",
76
76
  "@payloadcms/db-postgres": "3.85.0",
77
+ "@payloadcms/richtext-lexical": "3.85.0",
77
78
  "@payloadcms/ui": "3.85.0",
78
79
  "@playwright/test": "1.60.0",
79
80
  "@testing-library/jest-dom": "^6.6.3",
@@ -101,6 +101,16 @@
101
101
  height: 100%;
102
102
  background: var(--fb-results-fill, currentColor);
103
103
  }
104
+ .fb-results__bucket--winner {
105
+ font-weight: 600;
106
+ }
107
+ .fb-results__winner-badge {
108
+ margin-inline-start: 0.375rem;
109
+ font-size: 0.75em;
110
+ text-transform: uppercase;
111
+ letter-spacing: 0.05em;
112
+ opacity: 0.7;
113
+ }
104
114
  .fb-results__total {
105
115
  margin-block-start: 0.5rem;
106
116
  opacity: 0.7;
@@ -1,30 +0,0 @@
1
- import { CollectionOverrides } from "../plugin/collectionOverrides.js";
2
- import { CollectionConfig } from "payload";
3
-
4
- //#region src/collections/uploads.d.ts
5
- declare const FORM_UPLOADS_SLUG = "form-uploads";
6
- /** Override surface for the built-in upload collection. */
7
- type UploadsCollectionConfig = {
8
- slug?: string; /** Merged onto the collection's `upload` config (e.g. `staticDir`, `mimeTypes`). `true` uses Payload defaults. */
9
- upload?: NonNullable<CollectionConfig['upload']> | true; /** Replace access (defaults: anonymous create, authed read/update/delete). */
10
- access?: CollectionConfig['access']; /** Append extra fields. */
11
- fields?: CollectionConfig['fields'];
12
- };
13
- type UploadsOption = boolean | UploadsCollectionConfig;
14
- /**
15
- * The built-in upload collection backing the `file` field. Anonymous create (public forms upload here),
16
- * authed read/update/delete (only admins read stored files; submitters cannot enumerate others' uploads).
17
- * Per-field MIME/size is re-enforced at submit, so the collection stays permissive by default. No
18
- * `imageSizes`, so it needs no `sharp`. Projects with their own upload collection set `uploads: false` and
19
- * point the file field's `relationTo` at theirs.
20
- */
21
- declare const buildUploadsCollection: (config?: UploadsCollectionConfig, overrides?: CollectionOverrides) => CollectionConfig;
22
- /** Resolve the `uploads` plugin option: `false` disables, `true`/object enables the built-in collection. */
23
- declare const resolveUploads: (option: UploadsOption | undefined) => {
24
- enabled: boolean;
25
- slug: string;
26
- collection?: CollectionConfig;
27
- };
28
- //#endregion
29
- export { FORM_UPLOADS_SLUG, UploadsCollectionConfig, UploadsOption, buildUploadsCollection, resolveUploads };
30
- //# sourceMappingURL=uploads.d.ts.map
@@ -1,55 +0,0 @@
1
- import { isLoggedIn } from "../plugin/access.js";
2
- //#region src/collections/uploads.ts
3
- const FORM_UPLOADS_SLUG = "form-uploads";
4
- /**
5
- * The built-in upload collection backing the `file` field. Anonymous create (public forms upload here),
6
- * authed read/update/delete (only admins read stored files; submitters cannot enumerate others' uploads).
7
- * Per-field MIME/size is re-enforced at submit, so the collection stays permissive by default. No
8
- * `imageSizes`, so it needs no `sharp`. Projects with their own upload collection set `uploads: false` and
9
- * point the file field's `relationTo` at theirs.
10
- */
11
- const buildUploadsCollection = (config = {}, overrides) => {
12
- const defaultFields = [{
13
- name: "owner",
14
- type: "text",
15
- admin: {
16
- readOnly: true,
17
- hidden: true
18
- }
19
- }, ...config.fields ?? []];
20
- return {
21
- ...overrides ?? {},
22
- slug: config.slug ?? "form-uploads",
23
- access: {
24
- create: () => true,
25
- read: isLoggedIn,
26
- update: isLoggedIn,
27
- delete: isLoggedIn,
28
- ...config.access ?? {},
29
- ...overrides?.access ?? {}
30
- },
31
- admin: {
32
- group: "Forms",
33
- ...overrides?.admin ?? {}
34
- },
35
- upload: config.upload && config.upload !== true ? config.upload : true,
36
- fields: overrides?.fields ? overrides.fields({ defaultFields }) : defaultFields
37
- };
38
- };
39
- /** Resolve the `uploads` plugin option: `false` disables, `true`/object enables the built-in collection. */
40
- const resolveUploads = (option) => {
41
- if (option === false) return {
42
- enabled: false,
43
- slug: FORM_UPLOADS_SLUG
44
- };
45
- const collection = buildUploadsCollection(option && option !== true ? option : {});
46
- return {
47
- enabled: true,
48
- slug: collection.slug,
49
- collection
50
- };
51
- };
52
- //#endregion
53
- export { FORM_UPLOADS_SLUG, buildUploadsCollection, resolveUploads };
54
-
55
- //# sourceMappingURL=uploads.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploads.js","names":[],"sources":["../../src/collections/uploads.ts"],"sourcesContent":["import type { CollectionConfig, Field } from 'payload'\nimport { isLoggedIn } from '../plugin/access'\nimport type { CollectionOverrides } from '../plugin/collectionOverrides'\n\nexport const FORM_UPLOADS_SLUG = 'form-uploads'\n\n/** Override surface for the built-in upload collection. */\nexport type UploadsCollectionConfig = {\n\tslug?: string\n\t/** Merged onto the collection's `upload` config (e.g. `staticDir`, `mimeTypes`). `true` uses Payload defaults. */\n\tupload?: NonNullable<CollectionConfig['upload']> | true\n\t/** Replace access (defaults: anonymous create, authed read/update/delete). */\n\taccess?: CollectionConfig['access']\n\t/** Append extra fields. */\n\tfields?: CollectionConfig['fields']\n}\n\nexport type UploadsOption = boolean | UploadsCollectionConfig\n\n/**\n * The built-in upload collection backing the `file` field. Anonymous create (public forms upload here),\n * authed read/update/delete (only admins read stored files; submitters cannot enumerate others' uploads).\n * Per-field MIME/size is re-enforced at submit, so the collection stays permissive by default. No\n * `imageSizes`, so it needs no `sharp`. Projects with their own upload collection set `uploads: false` and\n * point the file field's `relationTo` at theirs.\n */\nexport const buildUploadsCollection = (\n\tconfig: UploadsCollectionConfig = {},\n\toverrides?: CollectionOverrides\n): CollectionConfig => {\n\tconst defaultFields: Field[] = [\n\t\t{ name: 'owner', type: 'text', admin: { readOnly: true, hidden: true } },\n\t\t...(config.fields ?? []),\n\t]\n\n\treturn {\n\t\t...(overrides ?? {}),\n\t\tslug: config.slug ?? FORM_UPLOADS_SLUG,\n\t\taccess: {\n\t\t\tcreate: () => true,\n\t\t\tread: isLoggedIn,\n\t\t\tupdate: isLoggedIn,\n\t\t\tdelete: isLoggedIn,\n\t\t\t...(config.access ?? {}),\n\t\t\t...(overrides?.access ?? {}),\n\t\t},\n\t\tadmin: { group: 'Forms', ...(overrides?.admin ?? {}) },\n\t\tupload: config.upload && config.upload !== true ? config.upload : true,\n\t\tfields: overrides?.fields ? overrides.fields({ defaultFields }) : defaultFields,\n\t}\n}\n\n/** Resolve the `uploads` plugin option: `false` disables, `true`/object enables the built-in collection. */\nexport const resolveUploads = (\n\toption: UploadsOption | undefined\n): { enabled: boolean; slug: string; collection?: CollectionConfig } => {\n\tif (option === false) {\n\t\treturn { enabled: false, slug: FORM_UPLOADS_SLUG }\n\t}\n\tconst config = option && option !== true ? option : {}\n\tconst collection = buildUploadsCollection(config)\n\treturn { enabled: true, slug: collection.slug as string, collection }\n}\n"],"mappings":";;AAIA,MAAa,oBAAoB;;;;;;;;AAsBjC,MAAa,0BACZ,SAAkC,CAAC,GACnC,cACsB;CACtB,MAAM,gBAAyB,CAC9B;EAAE,MAAM;EAAS,MAAM;EAAQ,OAAO;GAAE,UAAU;GAAM,QAAQ;EAAK;CAAE,GACvE,GAAI,OAAO,UAAU,CAAC,CACvB;CAEA,OAAO;EACN,GAAI,aAAa,CAAC;EAClB,MAAM,OAAO,QAAA;EACb,QAAQ;GACP,cAAc;GACd,MAAM;GACN,QAAQ;GACR,QAAQ;GACR,GAAI,OAAO,UAAU,CAAC;GACtB,GAAI,WAAW,UAAU,CAAC;EAC3B;EACA,OAAO;GAAE,OAAO;GAAS,GAAI,WAAW,SAAS,CAAC;EAAG;EACrD,QAAQ,OAAO,UAAU,OAAO,WAAW,OAAO,OAAO,SAAS;EAClE,QAAQ,WAAW,SAAS,UAAU,OAAO,EAAE,cAAc,CAAC,IAAI;CACnE;AACD;;AAGA,MAAa,kBACZ,WACuE;CACvE,IAAI,WAAW,OACd,OAAO;EAAE,SAAS;EAAO,MAAM;CAAkB;CAGlD,MAAM,aAAa,uBADJ,UAAU,WAAW,OAAO,SAAS,CAAC,CACL;CAChD,OAAO;EAAE,SAAS;EAAM,MAAM,WAAW;EAAgB;CAAW;AACrE"}
@@ -1,15 +0,0 @@
1
- import { PresentationDescriptor } from "./types.js";
2
-
3
- //#region src/presentations/registry.d.ts
4
- type PresentationDescriptorRegistry = Map<string, PresentationDescriptor>;
5
- /** Per-name override: `false` removes, `true` keeps the default, a descriptor adds or replaces one. */
6
- type PresentationDescriptorOption = boolean | PresentationDescriptor;
7
- type PresentationsDescriptorConfig = Record<string, PresentationDescriptorOption>;
8
- /**
9
- * Resolve the active presentation descriptors from the defaults and a consumer override map.
10
- * Mirrors the field-type, validation-rule, and renderer registry convention.
11
- */
12
- declare const resolvePresentationDescriptors: (defaults: Record<string, PresentationDescriptor>, config?: PresentationsDescriptorConfig) => PresentationDescriptorRegistry;
13
- //#endregion
14
- export { PresentationDescriptorOption, PresentationDescriptorRegistry, PresentationsDescriptorConfig, resolvePresentationDescriptors };
15
- //# sourceMappingURL=registry.d.ts.map
@@ -1,15 +0,0 @@
1
- //#region src/presentations/registry.ts
2
- /**
3
- * Resolve the active presentation descriptors from the defaults and a consumer override map.
4
- * Mirrors the field-type, validation-rule, and renderer registry convention.
5
- */
6
- const resolvePresentationDescriptors = (defaults, config = {}) => {
7
- const registry = new Map(Object.entries(defaults));
8
- for (const [name, option] of Object.entries(config)) if (option === false) registry.delete(name);
9
- else if (option === true) {} else registry.set(name, option);
10
- return registry;
11
- };
12
- //#endregion
13
- export { resolvePresentationDescriptors };
14
-
15
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","names":[],"sources":["../../src/presentations/registry.ts"],"sourcesContent":["import type { PresentationDescriptor } from './types'\n\nexport type PresentationDescriptorRegistry = Map<string, PresentationDescriptor>\n\n/** Per-name override: `false` removes, `true` keeps the default, a descriptor adds or replaces one. */\nexport type PresentationDescriptorOption = boolean | PresentationDescriptor\n\nexport type PresentationsDescriptorConfig = Record<string, PresentationDescriptorOption>\n\n/**\n * Resolve the active presentation descriptors from the defaults and a consumer override map.\n * Mirrors the field-type, validation-rule, and renderer registry convention.\n */\nexport const resolvePresentationDescriptors = (\n\tdefaults: Record<string, PresentationDescriptor>,\n\tconfig: PresentationsDescriptorConfig = {}\n): PresentationDescriptorRegistry => {\n\tconst registry: PresentationDescriptorRegistry = new Map(Object.entries(defaults))\n\tfor (const [name, option] of Object.entries(config)) {\n\t\tif (option === false) {\n\t\t\tregistry.delete(name)\n\t\t} else if (option === true) {\n\t\t\t// keep the default; no-op when no default exists for this name\n\t\t} else {\n\t\t\tregistry.set(name, option)\n\t\t}\n\t}\n\treturn registry\n}\n"],"mappings":";;;;;AAaA,MAAa,kCACZ,UACA,SAAwC,CAAC,MACL;CACpC,MAAM,WAA2C,IAAI,IAAI,OAAO,QAAQ,QAAQ,CAAC;CACjF,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,MAAM,GACjD,IAAI,WAAW,OACd,SAAS,OAAO,IAAI;MACd,IAAI,WAAW,MAAM,CAE5B,OACC,SAAS,IAAI,MAAM,MAAM;CAG3B,OAAO;AACR"}
@@ -1,24 +0,0 @@
1
- import { FormDocument } from "./Form.js";
2
-
3
- //#region src/react/toFormDocument.d.ts
4
- /**
5
- * Narrows a Payload-generated form document (from `getPayload().findByID()` or `fetch`) to
6
- * `FormDocument` without an unsafe `as` cast. Handles the small structural mismatches between
7
- * the auto-generated collection types and what `<Form>` expects:
8
- * - `fields` may be a typed blocks-union array or null; normalized to `FormFieldInstance[]`
9
- * - `flow` is stored as opaque JSON; typed as `FormFlow | undefined`
10
- * - `defaultPresentation` may be null; coerced to `undefined`
11
- */
12
- declare function toFormDocument(form: {
13
- id: number | string;
14
- fields?: {
15
- blockType: string;
16
- name: string;
17
- [key: string]: unknown;
18
- }[] | null;
19
- flow?: unknown;
20
- defaultPresentation?: string | null;
21
- }): FormDocument;
22
- //#endregion
23
- export { toFormDocument };
24
- //# sourceMappingURL=toFormDocument.d.ts.map
@@ -1,22 +0,0 @@
1
- "use client";
2
- //#region src/react/toFormDocument.ts
3
- /**
4
- * Narrows a Payload-generated form document (from `getPayload().findByID()` or `fetch`) to
5
- * `FormDocument` without an unsafe `as` cast. Handles the small structural mismatches between
6
- * the auto-generated collection types and what `<Form>` expects:
7
- * - `fields` may be a typed blocks-union array or null; normalized to `FormFieldInstance[]`
8
- * - `flow` is stored as opaque JSON; typed as `FormFlow | undefined`
9
- * - `defaultPresentation` may be null; coerced to `undefined`
10
- */
11
- function toFormDocument(form) {
12
- return {
13
- id: form.id,
14
- fields: form.fields ?? [],
15
- flow: form.flow,
16
- defaultPresentation: form.defaultPresentation ?? void 0
17
- };
18
- }
19
- //#endregion
20
- export { toFormDocument };
21
-
22
- //# sourceMappingURL=toFormDocument.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toFormDocument.js","names":[],"sources":["../../src/react/toFormDocument.ts"],"sourcesContent":["'use client'\n\nimport type { FormFlow } from '../flow/types'\nimport type { FormFieldInstance } from '../submissions/types'\nimport type { FormDocument } from './Form'\n\n/**\n * Narrows a Payload-generated form document (from `getPayload().findByID()` or `fetch`) to\n * `FormDocument` without an unsafe `as` cast. Handles the small structural mismatches between\n * the auto-generated collection types and what `<Form>` expects:\n * - `fields` may be a typed blocks-union array or null; normalized to `FormFieldInstance[]`\n * - `flow` is stored as opaque JSON; typed as `FormFlow | undefined`\n * - `defaultPresentation` may be null; coerced to `undefined`\n */\nexport function toFormDocument(form: {\n\tid: number | string\n\tfields?: { blockType: string; name: string; [key: string]: unknown }[] | null\n\tflow?: unknown\n\tdefaultPresentation?: string | null\n}): FormDocument {\n\treturn {\n\t\tid: form.id,\n\t\tfields: (form.fields ?? []) as FormFieldInstance[],\n\t\tflow: form.flow as FormFlow | undefined,\n\t\tdefaultPresentation: form.defaultPresentation ?? undefined,\n\t}\n}\n"],"mappings":";;;;;;;;;;AAcA,SAAgB,eAAe,MAKd;CAChB,OAAO;EACN,IAAI,KAAK;EACT,QAAS,KAAK,UAAU,CAAC;EACzB,MAAM,KAAK;EACX,qBAAqB,KAAK,uBAAuB,KAAA;CAClD;AACD"}