@kelpie/server 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/ids.d.ts +11 -0
- package/dist/lib/ids.d.ts.map +1 -1
- package/dist/lib/ids.js +11 -0
- package/dist/lib/ids.js.map +1 -1
- package/dist/modules/activities/repository.d.ts.map +1 -1
- package/dist/modules/activities/repository.js +19 -20
- package/dist/modules/activities/repository.js.map +1 -1
- package/dist/modules/activities/wording.d.ts +12 -0
- package/dist/modules/activities/wording.d.ts.map +1 -1
- package/dist/modules/activities/wording.js +16 -0
- package/dist/modules/activities/wording.js.map +1 -1
- package/dist/modules/agent-tasks/catalog.d.ts.map +1 -1
- package/dist/modules/agent-tasks/catalog.js +62 -0
- package/dist/modules/agent-tasks/catalog.js.map +1 -1
- package/dist/modules/agent-tasks/resolve.d.ts.map +1 -1
- package/dist/modules/agent-tasks/resolve.js +42 -9
- package/dist/modules/agent-tasks/resolve.js.map +1 -1
- package/dist/modules/agent-tasks/routes.d.ts +2 -0
- package/dist/modules/agent-tasks/routes.d.ts.map +1 -1
- package/dist/modules/attachedRecords.d.ts +6 -1
- package/dist/modules/attachedRecords.d.ts.map +1 -1
- package/dist/modules/attachedRecords.js +15 -1
- package/dist/modules/attachedRecords.js.map +1 -1
- package/dist/modules/companies/index.d.ts.map +1 -1
- package/dist/modules/companies/index.js +3 -1
- package/dist/modules/companies/index.js.map +1 -1
- package/dist/modules/companies/routes.d.ts +14 -0
- package/dist/modules/companies/routes.d.ts.map +1 -1
- package/dist/modules/companies/routes.js +7 -0
- package/dist/modules/companies/routes.js.map +1 -1
- package/dist/modules/companies/schema.d.ts +20 -0
- package/dist/modules/companies/schema.d.ts.map +1 -1
- package/dist/modules/companies/schema.js +6 -1
- package/dist/modules/companies/schema.js.map +1 -1
- package/dist/modules/companies/service.d.ts +5 -0
- package/dist/modules/companies/service.d.ts.map +1 -1
- package/dist/modules/companies/service.js +24 -12
- package/dist/modules/companies/service.js.map +1 -1
- package/dist/modules/consent-purposes/capabilities.d.ts +7 -0
- package/dist/modules/consent-purposes/capabilities.d.ts.map +1 -0
- package/dist/modules/consent-purposes/capabilities.js +10 -0
- package/dist/modules/consent-purposes/capabilities.js.map +1 -0
- package/dist/modules/consent-purposes/events.d.ts +38 -0
- package/dist/modules/consent-purposes/events.d.ts.map +1 -0
- package/dist/modules/consent-purposes/events.js +17 -0
- package/dist/modules/consent-purposes/events.js.map +1 -0
- package/dist/modules/consent-purposes/index.d.ts +13 -0
- package/dist/modules/consent-purposes/index.d.ts.map +1 -0
- package/dist/modules/consent-purposes/index.js +41 -0
- package/dist/modules/consent-purposes/index.js.map +1 -0
- package/dist/modules/consent-purposes/repository.d.ts +21 -0
- package/dist/modules/consent-purposes/repository.d.ts.map +1 -0
- package/dist/modules/consent-purposes/repository.js +98 -0
- package/dist/modules/consent-purposes/repository.js.map +1 -0
- package/dist/modules/consent-purposes/routes.d.ts +39 -0
- package/dist/modules/consent-purposes/routes.d.ts.map +1 -0
- package/dist/modules/consent-purposes/routes.js +79 -0
- package/dist/modules/consent-purposes/routes.js.map +1 -0
- package/dist/modules/consent-purposes/schema.d.ts +175 -0
- package/dist/modules/consent-purposes/schema.d.ts.map +1 -0
- package/dist/modules/consent-purposes/schema.js +35 -0
- package/dist/modules/consent-purposes/schema.js.map +1 -0
- package/dist/modules/consent-purposes/service.d.ts +50 -0
- package/dist/modules/consent-purposes/service.d.ts.map +1 -0
- package/dist/modules/consent-purposes/service.js +263 -0
- package/dist/modules/consent-purposes/service.js.map +1 -0
- package/dist/modules/consent-purposes/starters.d.ts +17 -0
- package/dist/modules/consent-purposes/starters.d.ts.map +1 -0
- package/dist/modules/consent-purposes/starters.js +15 -0
- package/dist/modules/consent-purposes/starters.js.map +1 -0
- package/dist/modules/consent-purposes/tools.d.ts +4 -0
- package/dist/modules/consent-purposes/tools.d.ts.map +1 -0
- package/dist/modules/consent-purposes/tools.js +29 -0
- package/dist/modules/consent-purposes/tools.js.map +1 -0
- package/dist/modules/core.d.ts.map +1 -1
- package/dist/modules/core.js +10 -0
- package/dist/modules/core.js.map +1 -1
- package/dist/modules/custom-fields/capabilities.d.ts +12 -0
- package/dist/modules/custom-fields/capabilities.d.ts.map +1 -0
- package/dist/modules/custom-fields/capabilities.js +15 -0
- package/dist/modules/custom-fields/capabilities.js.map +1 -0
- package/dist/modules/custom-fields/events.d.ts +49 -0
- package/dist/modules/custom-fields/events.d.ts.map +1 -0
- package/dist/modules/custom-fields/events.js +25 -0
- package/dist/modules/custom-fields/events.js.map +1 -0
- package/dist/modules/custom-fields/index.d.ts +19 -0
- package/dist/modules/custom-fields/index.d.ts.map +1 -0
- package/dist/modules/custom-fields/index.js +46 -0
- package/dist/modules/custom-fields/index.js.map +1 -0
- package/dist/modules/custom-fields/repository.d.ts +37 -0
- package/dist/modules/custom-fields/repository.d.ts.map +1 -0
- package/dist/modules/custom-fields/repository.js +144 -0
- package/dist/modules/custom-fields/repository.js.map +1 -0
- package/dist/modules/custom-fields/routes.d.ts +44 -0
- package/dist/modules/custom-fields/routes.d.ts.map +1 -0
- package/dist/modules/custom-fields/routes.js +103 -0
- package/dist/modules/custom-fields/routes.js.map +1 -0
- package/dist/modules/custom-fields/schema.d.ts +215 -0
- package/dist/modules/custom-fields/schema.d.ts.map +1 -0
- package/dist/modules/custom-fields/schema.js +43 -0
- package/dist/modules/custom-fields/schema.js.map +1 -0
- package/dist/modules/custom-fields/service.d.ts +57 -0
- package/dist/modules/custom-fields/service.d.ts.map +1 -0
- package/dist/modules/custom-fields/service.js +273 -0
- package/dist/modules/custom-fields/service.js.map +1 -0
- package/dist/modules/custom-fields/tools.d.ts +4 -0
- package/dist/modules/custom-fields/tools.d.ts.map +1 -0
- package/dist/modules/custom-fields/tools.js +38 -0
- package/dist/modules/custom-fields/tools.js.map +1 -0
- package/dist/modules/custom-fields/values.d.ts +49 -0
- package/dist/modules/custom-fields/values.d.ts.map +1 -0
- package/dist/modules/custom-fields/values.js +249 -0
- package/dist/modules/custom-fields/values.js.map +1 -0
- package/dist/modules/custom-fields/wire.d.ts +12 -0
- package/dist/modules/custom-fields/wire.d.ts.map +1 -0
- package/dist/modules/custom-fields/wire.js +30 -0
- package/dist/modules/custom-fields/wire.js.map +1 -0
- package/dist/modules/dashboard/repository.d.ts.map +1 -1
- package/dist/modules/dashboard/repository.js +4 -3
- package/dist/modules/dashboard/repository.js.map +1 -1
- package/dist/modules/deals/index.d.ts +2 -1
- package/dist/modules/deals/index.d.ts.map +1 -1
- package/dist/modules/deals/index.js +5 -2
- package/dist/modules/deals/index.js.map +1 -1
- package/dist/modules/deals/repository.d.ts +0 -16
- package/dist/modules/deals/repository.d.ts.map +1 -1
- package/dist/modules/deals/repository.js +6 -76
- package/dist/modules/deals/repository.js.map +1 -1
- package/dist/modules/deals/routes.d.ts +14 -0
- package/dist/modules/deals/routes.d.ts.map +1 -1
- package/dist/modules/deals/routes.js +7 -0
- package/dist/modules/deals/routes.js.map +1 -1
- package/dist/modules/deals/schema.d.ts +20 -42
- package/dist/modules/deals/schema.d.ts.map +1 -1
- package/dist/modules/deals/schema.js +6 -11
- package/dist/modules/deals/schema.js.map +1 -1
- package/dist/modules/deals/service.d.ts +13 -2
- package/dist/modules/deals/service.d.ts.map +1 -1
- package/dist/modules/deals/service.js +43 -20
- package/dist/modules/deals/service.js.map +1 -1
- package/dist/modules/decisions/repository.d.ts.map +1 -1
- package/dist/modules/decisions/repository.js +2 -0
- package/dist/modules/decisions/repository.js.map +1 -1
- package/dist/modules/decisions/routes.d.ts +1 -0
- package/dist/modules/decisions/routes.d.ts.map +1 -1
- package/dist/modules/enquiries/events.d.ts +44 -0
- package/dist/modules/enquiries/events.d.ts.map +1 -0
- package/dist/modules/enquiries/events.js +19 -0
- package/dist/modules/enquiries/events.js.map +1 -0
- package/dist/modules/enquiries/index.d.ts +13 -0
- package/dist/modules/enquiries/index.d.ts.map +1 -0
- package/dist/modules/enquiries/index.js +44 -0
- package/dist/modules/enquiries/index.js.map +1 -0
- package/dist/modules/enquiries/repository.d.ts +30 -0
- package/dist/modules/enquiries/repository.d.ts.map +1 -0
- package/dist/modules/enquiries/repository.js +94 -0
- package/dist/modules/enquiries/repository.js.map +1 -0
- package/dist/modules/enquiries/routes.d.ts +52 -0
- package/dist/modules/enquiries/routes.d.ts.map +1 -0
- package/dist/modules/enquiries/routes.js +127 -0
- package/dist/modules/enquiries/routes.js.map +1 -0
- package/dist/modules/enquiries/schema.d.ts +290 -0
- package/dist/modules/enquiries/schema.d.ts.map +1 -0
- package/dist/modules/enquiries/schema.js +52 -0
- package/dist/modules/enquiries/schema.js.map +1 -0
- package/dist/modules/enquiries/service.d.ts +85 -0
- package/dist/modules/enquiries/service.d.ts.map +1 -0
- package/dist/modules/enquiries/service.js +370 -0
- package/dist/modules/enquiries/service.js.map +1 -0
- package/dist/modules/enquiries/tools.d.ts +4 -0
- package/dist/modules/enquiries/tools.d.ts.map +1 -0
- package/dist/modules/enquiries/tools.js +50 -0
- package/dist/modules/enquiries/tools.js.map +1 -0
- package/dist/modules/eventCatalogs.d.ts +3 -0
- package/dist/modules/eventCatalogs.d.ts.map +1 -1
- package/dist/modules/eventCatalogs.js +3 -0
- package/dist/modules/eventCatalogs.js.map +1 -1
- package/dist/modules/forms/embed.d.ts +20 -6
- package/dist/modules/forms/embed.d.ts.map +1 -1
- package/dist/modules/forms/embed.js +359 -43
- package/dist/modules/forms/embed.js.map +1 -1
- package/dist/modules/forms/events.d.ts +20 -7
- package/dist/modules/forms/events.d.ts.map +1 -1
- package/dist/modules/forms/events.js +20 -2
- package/dist/modules/forms/events.js.map +1 -1
- package/dist/modules/forms/fields.d.ts +14 -1
- package/dist/modules/forms/fields.d.ts.map +1 -1
- package/dist/modules/forms/fields.js +87 -3
- package/dist/modules/forms/fields.js.map +1 -1
- package/dist/modules/forms/index.d.ts.map +1 -1
- package/dist/modules/forms/index.js +12 -1
- package/dist/modules/forms/index.js.map +1 -1
- package/dist/modules/forms/mapping.d.ts +62 -5
- package/dist/modules/forms/mapping.d.ts.map +1 -1
- package/dist/modules/forms/mapping.js +139 -5
- package/dist/modules/forms/mapping.js.map +1 -1
- package/dist/modules/forms/publicRoutes.d.ts.map +1 -1
- package/dist/modules/forms/publicRoutes.js +29 -1
- package/dist/modules/forms/publicRoutes.js.map +1 -1
- package/dist/modules/forms/repository.d.ts +31 -0
- package/dist/modules/forms/repository.d.ts.map +1 -1
- package/dist/modules/forms/repository.js +90 -1
- package/dist/modules/forms/repository.js.map +1 -1
- package/dist/modules/forms/routes.d.ts +83 -1
- package/dist/modules/forms/routes.d.ts.map +1 -1
- package/dist/modules/forms/routes.js +185 -2
- package/dist/modules/forms/routes.js.map +1 -1
- package/dist/modules/forms/schema.d.ts +672 -1
- package/dist/modules/forms/schema.d.ts.map +1 -1
- package/dist/modules/forms/schema.js +146 -3
- package/dist/modules/forms/schema.js.map +1 -1
- package/dist/modules/forms/service.d.ts +54 -1
- package/dist/modules/forms/service.d.ts.map +1 -1
- package/dist/modules/forms/service.js +338 -28
- package/dist/modules/forms/service.js.map +1 -1
- package/dist/modules/forms/submission.d.ts +15 -0
- package/dist/modules/forms/submission.d.ts.map +1 -1
- package/dist/modules/forms/submission.js +418 -40
- package/dist/modules/forms/submission.js.map +1 -1
- package/dist/modules/import-export/drafts.d.ts +10 -0
- package/dist/modules/import-export/drafts.d.ts.map +1 -1
- package/dist/modules/import-export/drafts.js +16 -2
- package/dist/modules/import-export/drafts.js.map +1 -1
- package/dist/modules/import-export/exportRows.d.ts +7 -4
- package/dist/modules/import-export/exportRows.d.ts.map +1 -1
- package/dist/modules/import-export/exportRows.js +20 -5
- package/dist/modules/import-export/exportRows.js.map +1 -1
- package/dist/modules/import-export/plan.d.ts +12 -1
- package/dist/modules/import-export/plan.d.ts.map +1 -1
- package/dist/modules/import-export/plan.js +29 -2
- package/dist/modules/import-export/plan.js.map +1 -1
- package/dist/modules/import-export/presets.d.ts.map +1 -1
- package/dist/modules/import-export/presets.js +10 -0
- package/dist/modules/import-export/presets.js.map +1 -1
- package/dist/modules/import-export/repository.d.ts +11 -1
- package/dist/modules/import-export/repository.d.ts.map +1 -1
- package/dist/modules/import-export/repository.js +42 -9
- package/dist/modules/import-export/repository.js.map +1 -1
- package/dist/modules/import-export/routes.d.ts.map +1 -1
- package/dist/modules/import-export/routes.js +4 -0
- package/dist/modules/import-export/routes.js.map +1 -1
- package/dist/modules/import-export/schema.d.ts +17 -0
- package/dist/modules/import-export/schema.d.ts.map +1 -1
- package/dist/modules/import-export/schema.js +11 -0
- package/dist/modules/import-export/schema.js.map +1 -1
- package/dist/modules/import-export/service.d.ts +6 -0
- package/dist/modules/import-export/service.d.ts.map +1 -1
- package/dist/modules/import-export/service.js +14 -2
- package/dist/modules/import-export/service.js.map +1 -1
- package/dist/modules/import-export/streams.d.ts.map +1 -1
- package/dist/modules/import-export/streams.js +3 -3
- package/dist/modules/import-export/streams.js.map +1 -1
- package/dist/modules/import-export/tools.d.ts.map +1 -1
- package/dist/modules/import-export/tools.js +8 -0
- package/dist/modules/import-export/tools.js.map +1 -1
- package/dist/modules/import-export/validation.d.ts.map +1 -1
- package/dist/modules/import-export/validation.js +22 -1
- package/dist/modules/import-export/validation.js.map +1 -1
- package/dist/modules/import-export/writes.d.ts.map +1 -1
- package/dist/modules/import-export/writes.js +37 -4
- package/dist/modules/import-export/writes.js.map +1 -1
- package/dist/modules/lists/repository.d.ts +11 -0
- package/dist/modules/lists/repository.d.ts.map +1 -1
- package/dist/modules/lists/repository.js +13 -0
- package/dist/modules/lists/repository.js.map +1 -1
- package/dist/modules/lists/routes.d.ts +4 -0
- package/dist/modules/lists/routes.d.ts.map +1 -1
- package/dist/modules/lists/routes.js +8 -0
- package/dist/modules/lists/routes.js.map +1 -1
- package/dist/modules/lists/schema.d.ts +17 -0
- package/dist/modules/lists/schema.d.ts.map +1 -1
- package/dist/modules/lists/schema.js +10 -0
- package/dist/modules/lists/schema.js.map +1 -1
- package/dist/modules/lists/service.d.ts +14 -2
- package/dist/modules/lists/service.d.ts.map +1 -1
- package/dist/modules/lists/service.js +55 -7
- package/dist/modules/lists/service.js.map +1 -1
- package/dist/modules/mcp/index.d.ts.map +1 -1
- package/dist/modules/mcp/index.js +5 -0
- package/dist/modules/mcp/index.js.map +1 -1
- package/dist/modules/notes/routes.d.ts +1 -0
- package/dist/modules/notes/routes.d.ts.map +1 -1
- package/dist/modules/opportunities/index.d.ts.map +1 -1
- package/dist/modules/opportunities/index.js +3 -1
- package/dist/modules/opportunities/index.js.map +1 -1
- package/dist/modules/opportunities/repository.d.ts +2 -0
- package/dist/modules/opportunities/repository.d.ts.map +1 -1
- package/dist/modules/opportunities/repository.js +4 -0
- package/dist/modules/opportunities/repository.js.map +1 -1
- package/dist/modules/opportunities/routes.d.ts +16 -0
- package/dist/modules/opportunities/routes.d.ts.map +1 -1
- package/dist/modules/opportunities/routes.js +13 -0
- package/dist/modules/opportunities/routes.js.map +1 -1
- package/dist/modules/opportunities/schema.d.ts +20 -0
- package/dist/modules/opportunities/schema.d.ts.map +1 -1
- package/dist/modules/opportunities/schema.js +6 -1
- package/dist/modules/opportunities/schema.js.map +1 -1
- package/dist/modules/opportunities/service.d.ts +20 -3
- package/dist/modules/opportunities/service.d.ts.map +1 -1
- package/dist/modules/opportunities/service.js +99 -18
- package/dist/modules/opportunities/service.js.map +1 -1
- package/dist/modules/opportunities/tools.d.ts.map +1 -1
- package/dist/modules/opportunities/tools.js +2 -0
- package/dist/modules/opportunities/tools.js.map +1 -1
- package/dist/modules/partnerships/index.d.ts.map +1 -1
- package/dist/modules/partnerships/index.js +3 -1
- package/dist/modules/partnerships/index.js.map +1 -1
- package/dist/modules/partnerships/repository.d.ts +0 -17
- package/dist/modules/partnerships/repository.d.ts.map +1 -1
- package/dist/modules/partnerships/repository.js +6 -82
- package/dist/modules/partnerships/repository.js.map +1 -1
- package/dist/modules/partnerships/routes.d.ts +14 -0
- package/dist/modules/partnerships/routes.d.ts.map +1 -1
- package/dist/modules/partnerships/routes.js +7 -0
- package/dist/modules/partnerships/routes.js.map +1 -1
- package/dist/modules/partnerships/schema.d.ts +20 -41
- package/dist/modules/partnerships/schema.d.ts.map +1 -1
- package/dist/modules/partnerships/schema.js +6 -10
- package/dist/modules/partnerships/schema.js.map +1 -1
- package/dist/modules/partnerships/service.d.ts +11 -1
- package/dist/modules/partnerships/service.d.ts.map +1 -1
- package/dist/modules/partnerships/service.js +43 -20
- package/dist/modules/partnerships/service.js.map +1 -1
- package/dist/modules/people/consentHydration.d.ts +26 -0
- package/dist/modules/people/consentHydration.d.ts.map +1 -0
- package/dist/modules/people/consentHydration.js +100 -0
- package/dist/modules/people/consentHydration.js.map +1 -0
- package/dist/modules/people/index.d.ts.map +1 -1
- package/dist/modules/people/index.js +3 -1
- package/dist/modules/people/index.js.map +1 -1
- package/dist/modules/people/personConsentWrites.d.ts +40 -0
- package/dist/modules/people/personConsentWrites.d.ts.map +1 -0
- package/dist/modules/people/personConsentWrites.js +98 -0
- package/dist/modules/people/personConsentWrites.js.map +1 -0
- package/dist/modules/people/repository.d.ts.map +1 -1
- package/dist/modules/people/repository.js +5 -1
- package/dist/modules/people/repository.js.map +1 -1
- package/dist/modules/people/routes.d.ts +57 -4
- package/dist/modules/people/routes.d.ts.map +1 -1
- package/dist/modules/people/routes.js +104 -5
- package/dist/modules/people/routes.js.map +1 -1
- package/dist/modules/people/schema.d.ts +366 -1
- package/dist/modules/people/schema.d.ts.map +1 -1
- package/dist/modules/people/schema.js +92 -2
- package/dist/modules/people/schema.js.map +1 -1
- package/dist/modules/people/service.d.ts +30 -1
- package/dist/modules/people/service.d.ts.map +1 -1
- package/dist/modules/people/service.js +115 -38
- package/dist/modules/people/service.js.map +1 -1
- package/dist/modules/people/tools.d.ts.map +1 -1
- package/dist/modules/people/tools.js +4 -1
- package/dist/modules/people/tools.js.map +1 -1
- package/dist/modules/personLinks.d.ts +79 -0
- package/dist/modules/personLinks.d.ts.map +1 -0
- package/dist/modules/personLinks.js +155 -0
- package/dist/modules/personLinks.js.map +1 -0
- package/dist/modules/pipelines/routes.d.ts +1 -0
- package/dist/modules/pipelines/routes.d.ts.map +1 -1
- package/dist/modules/plans/routes.d.ts +1 -0
- package/dist/modules/plans/routes.d.ts.map +1 -1
- package/dist/modules/raises/index.d.ts.map +1 -1
- package/dist/modules/raises/index.js +3 -1
- package/dist/modules/raises/index.js.map +1 -1
- package/dist/modules/raises/repository.d.ts +0 -17
- package/dist/modules/raises/repository.d.ts.map +1 -1
- package/dist/modules/raises/repository.js +6 -77
- package/dist/modules/raises/repository.js.map +1 -1
- package/dist/modules/raises/routes.d.ts +14 -0
- package/dist/modules/raises/routes.d.ts.map +1 -1
- package/dist/modules/raises/routes.js +7 -0
- package/dist/modules/raises/routes.js.map +1 -1
- package/dist/modules/raises/schema.d.ts +20 -41
- package/dist/modules/raises/schema.d.ts.map +1 -1
- package/dist/modules/raises/schema.js +6 -10
- package/dist/modules/raises/schema.js.map +1 -1
- package/dist/modules/raises/service.d.ts +11 -1
- package/dist/modules/raises/service.d.ts.map +1 -1
- package/dist/modules/raises/service.js +41 -18
- package/dist/modules/raises/service.js.map +1 -1
- package/dist/modules/recordTargets.d.ts.map +1 -1
- package/dist/modules/recordTargets.js +2 -0
- package/dist/modules/recordTargets.js.map +1 -1
- package/dist/modules/references.d.ts +10 -0
- package/dist/modules/references.d.ts.map +1 -1
- package/dist/modules/references.js +27 -4
- package/dist/modules/references.js.map +1 -1
- package/dist/modules/sample-data/fixture.d.ts +21 -0
- package/dist/modules/sample-data/fixture.d.ts.map +1 -1
- package/dist/modules/sample-data/fixture.js +40 -0
- package/dist/modules/sample-data/fixture.js.map +1 -1
- package/dist/modules/sample-data/index.d.ts.map +1 -1
- package/dist/modules/sample-data/index.js +1 -0
- package/dist/modules/sample-data/index.js.map +1 -1
- package/dist/modules/sample-data/routes.d.ts.map +1 -1
- package/dist/modules/sample-data/routes.js +1 -0
- package/dist/modules/sample-data/routes.js.map +1 -1
- package/dist/modules/sample-data/service.d.ts +1 -0
- package/dist/modules/sample-data/service.d.ts.map +1 -1
- package/dist/modules/sample-data/service.js +77 -8
- package/dist/modules/sample-data/service.js.map +1 -1
- package/dist/modules/search/index.d.ts +1 -1
- package/dist/modules/search/index.d.ts.map +1 -1
- package/dist/modules/search/index.js +2 -1
- package/dist/modules/search/index.js.map +1 -1
- package/dist/modules/search/repository.d.ts +1 -0
- package/dist/modules/search/repository.d.ts.map +1 -1
- package/dist/modules/search/repository.js +23 -0
- package/dist/modules/search/repository.js.map +1 -1
- package/dist/modules/search/service.d.ts +3 -3
- package/dist/modules/search/service.d.ts.map +1 -1
- package/dist/modules/search/service.js +5 -4
- package/dist/modules/search/service.js.map +1 -1
- package/dist/modules/stagedRecords.d.ts +3 -3
- package/dist/modules/stagedRecords.d.ts.map +1 -1
- package/dist/modules/stagedRecords.js +9 -0
- package/dist/modules/stagedRecords.js.map +1 -1
- package/dist/modules/webhooks/payloads.d.ts.map +1 -1
- package/dist/modules/webhooks/payloads.js +15 -2
- package/dist/modules/webhooks/payloads.js.map +1 -1
- package/dist/modules/workspace/repository.d.ts +2 -0
- package/dist/modules/workspace/repository.d.ts.map +1 -1
- package/dist/modules/workspace/repository.js +7 -0
- package/dist/modules/workspace/repository.js.map +1 -1
- package/dist/modules/workspace/service.d.ts.map +1 -1
- package/dist/modules/workspace/service.js +10 -0
- package/dist/modules/workspace/service.js.map +1 -1
- package/dist/modules/workspace/starters.d.ts.map +1 -1
- package/dist/modules/workspace/starters.js +5 -0
- package/dist/modules/workspace/starters.js.map +1 -1
- package/dist/runtime/events.d.ts +1 -1
- package/dist/runtime/events.d.ts.map +1 -1
- package/dist/runtime/events.js +1 -0
- package/dist/runtime/events.js.map +1 -1
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/testing/database.d.ts +5 -1
- package/dist/testing/database.d.ts.map +1 -1
- package/dist/testing/database.js +81 -10
- package/dist/testing/database.js.map +1 -1
- package/migrations/0024_third_king_cobra.sql +46 -0
- package/migrations/0025_worthless_chimera.sql +3 -0
- package/migrations/0026_late_aqueduct.sql +46 -0
- package/migrations/0027_brainy_silver_sable.sql +3 -0
- package/migrations/0028_freezing_scrambler.sql +19 -0
- package/migrations/0029_custom_fields.sql +26 -0
- package/migrations/0030_enquiries.sql +79 -0
- package/migrations/0031_consent.sql +45 -0
- package/migrations/0032_form_field_statement.sql +1 -0
- package/migrations/0033_form_field_consent_purpose_ids.sql +5 -0
- package/migrations/0034_drop_form_field_consent_purpose_id.sql +1 -0
- package/migrations/0035_form_field_consent_purpose_labels.sql +1 -0
- package/migrations/0036_form_field_notice_type.sql +2 -0
- package/migrations/meta/0024_snapshot.json +5516 -0
- package/migrations/meta/0025_snapshot.json +5336 -0
- package/migrations/meta/0026_snapshot.json +5710 -0
- package/migrations/meta/0027_snapshot.json +5716 -0
- package/migrations/meta/0028_snapshot.json +5740 -0
- package/migrations/meta/0029_snapshot.json +5935 -0
- package/migrations/meta/0030_snapshot.json +6245 -0
- package/migrations/meta/0031_snapshot.json +6572 -0
- package/migrations/meta/0032_snapshot.json +6578 -0
- package/migrations/meta/0033_snapshot.json +6572 -0
- package/migrations/meta/0034_snapshot.json +6566 -0
- package/migrations/meta/0035_snapshot.json +6573 -0
- package/migrations/meta/0036_snapshot.json +6573 -0
- package/migrations/meta/_journal.json +91 -0
- package/package.json +2 -2
- package/src/lib/ids.ts +11 -0
- package/src/modules/activities/repository.ts +22 -23
- package/src/modules/activities/wording.ts +18 -0
- package/src/modules/agent-tasks/catalog.ts +63 -0
- package/src/modules/agent-tasks/resolve.ts +64 -24
- package/src/modules/attachedRecords.ts +29 -2
- package/src/modules/companies/index.ts +3 -1
- package/src/modules/companies/routes.ts +7 -0
- package/src/modules/companies/schema.ts +7 -1
- package/src/modules/companies/service.ts +48 -13
- package/src/modules/consent-purposes/capabilities.ts +12 -0
- package/src/modules/consent-purposes/events.ts +38 -0
- package/src/modules/consent-purposes/index.ts +48 -0
- package/src/modules/consent-purposes/repository.ts +163 -0
- package/src/modules/consent-purposes/routes.ts +122 -0
- package/src/modules/consent-purposes/schema.ts +46 -0
- package/src/modules/consent-purposes/service.ts +423 -0
- package/src/modules/consent-purposes/starters.ts +32 -0
- package/src/modules/consent-purposes/tools.ts +44 -0
- package/src/modules/core.ts +10 -0
- package/src/modules/custom-fields/capabilities.ts +17 -0
- package/src/modules/custom-fields/events.ts +51 -0
- package/src/modules/custom-fields/index.ts +61 -0
- package/src/modules/custom-fields/repository.ts +225 -0
- package/src/modules/custom-fields/routes.ts +155 -0
- package/src/modules/custom-fields/schema.ts +61 -0
- package/src/modules/custom-fields/service.ts +439 -0
- package/src/modules/custom-fields/tools.ts +53 -0
- package/src/modules/custom-fields/values.ts +352 -0
- package/src/modules/custom-fields/wire.ts +32 -0
- package/src/modules/dashboard/repository.ts +4 -3
- package/src/modules/deals/index.ts +5 -2
- package/src/modules/deals/repository.ts +6 -106
- package/src/modules/deals/routes.ts +7 -0
- package/src/modules/deals/schema.ts +7 -15
- package/src/modules/deals/service.ts +92 -23
- package/src/modules/decisions/repository.ts +2 -0
- package/src/modules/enquiries/events.ts +45 -0
- package/src/modules/enquiries/index.ts +50 -0
- package/src/modules/enquiries/repository.ts +164 -0
- package/src/modules/enquiries/routes.ts +172 -0
- package/src/modules/enquiries/schema.ts +59 -0
- package/src/modules/enquiries/service.ts +644 -0
- package/src/modules/enquiries/tools.ts +66 -0
- package/src/modules/eventCatalogs.ts +3 -0
- package/src/modules/forms/embed.ts +391 -44
- package/src/modules/forms/events.ts +30 -2
- package/src/modules/forms/fields.ts +102 -2
- package/src/modules/forms/index.ts +12 -1
- package/src/modules/forms/mapping.ts +183 -6
- package/src/modules/forms/publicRoutes.ts +43 -1
- package/src/modules/forms/repository.ts +162 -1
- package/src/modules/forms/routes.ts +212 -2
- package/src/modules/forms/schema.ts +166 -4
- package/src/modules/forms/service.ts +565 -41
- package/src/modules/forms/submission.ts +718 -44
- package/src/modules/import-export/drafts.ts +20 -1
- package/src/modules/import-export/exportRows.ts +21 -5
- package/src/modules/import-export/plan.ts +47 -2
- package/src/modules/import-export/presets.ts +10 -0
- package/src/modules/import-export/repository.ts +73 -8
- package/src/modules/import-export/routes.ts +4 -0
- package/src/modules/import-export/schema.ts +11 -0
- package/src/modules/import-export/service.ts +28 -2
- package/src/modules/import-export/streams.ts +3 -1
- package/src/modules/import-export/tools.ts +10 -0
- package/src/modules/import-export/validation.ts +28 -0
- package/src/modules/import-export/writes.ts +70 -5
- package/src/modules/lists/repository.ts +30 -0
- package/src/modules/lists/routes.ts +8 -0
- package/src/modules/lists/schema.ts +10 -0
- package/src/modules/lists/service.ts +110 -9
- package/src/modules/mcp/index.ts +5 -0
- package/src/modules/opportunities/index.ts +3 -1
- package/src/modules/opportunities/repository.ts +11 -0
- package/src/modules/opportunities/routes.ts +13 -0
- package/src/modules/opportunities/schema.ts +7 -1
- package/src/modules/opportunities/service.ts +188 -22
- package/src/modules/opportunities/tools.ts +2 -0
- package/src/modules/partnerships/index.ts +3 -1
- package/src/modules/partnerships/repository.ts +6 -117
- package/src/modules/partnerships/routes.ts +7 -0
- package/src/modules/partnerships/schema.ts +7 -14
- package/src/modules/partnerships/service.ts +93 -22
- package/src/modules/people/consentHydration.ts +167 -0
- package/src/modules/people/index.ts +3 -1
- package/src/modules/people/personConsentWrites.ts +177 -0
- package/src/modules/people/repository.ts +5 -0
- package/src/modules/people/routes.ts +127 -18
- package/src/modules/people/schema.ts +109 -3
- package/src/modules/people/service.ts +186 -40
- package/src/modules/people/tools.ts +5 -1
- package/src/modules/personLinks.ts +278 -0
- package/src/modules/raises/index.ts +3 -1
- package/src/modules/raises/repository.ts +6 -107
- package/src/modules/raises/routes.ts +7 -0
- package/src/modules/raises/schema.ts +7 -14
- package/src/modules/raises/service.ts +91 -20
- package/src/modules/recordTargets.ts +2 -0
- package/src/modules/references.ts +43 -4
- package/src/modules/sample-data/fixture.ts +63 -0
- package/src/modules/sample-data/index.ts +1 -0
- package/src/modules/sample-data/routes.ts +1 -0
- package/src/modules/sample-data/service.ts +97 -8
- package/src/modules/search/index.ts +2 -1
- package/src/modules/search/repository.ts +33 -1
- package/src/modules/search/service.ts +7 -5
- package/src/modules/stagedRecords.ts +18 -3
- package/src/modules/webhooks/payloads.ts +20 -2
- package/src/modules/workspace/repository.ts +12 -0
- package/src/modules/workspace/service.ts +14 -0
- package/src/modules/workspace/starters.ts +5 -0
- package/src/runtime/events.ts +1 -0
- package/src/schema/index.ts +3 -0
- package/src/testing/database.ts +97 -11
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { PERSON_EMAIL_TARGET } from './schema.js';
|
|
2
|
+
/** The map target for a consent field. Repeatable, unique per purpose_id. */
|
|
3
|
+
const PERSON_CONSENT_TARGET = 'person.consent';
|
|
2
4
|
/**
|
|
3
5
|
* Targets a form may map more than one field to.
|
|
4
6
|
*
|
|
@@ -21,25 +23,92 @@ const COMPANY_TARGETS = ['company.name', 'company.domain'];
|
|
|
21
23
|
* or `company.domain` answer, so a deal-creating form without either would
|
|
22
24
|
* quietly never create a deal. Refused here rather than discovered later by
|
|
23
25
|
* somebody wondering where their inbound pipeline went.
|
|
26
|
+
* @param createsPartnership Same rule for partnerships: a Partnership belongs
|
|
27
|
+
* to a Company. Opportunities are exempt because `opportunities.company_id`
|
|
28
|
+
* is nullable — a form that creates an opportunity without resolving a
|
|
29
|
+
* company creates an opportunity without one, which is a valid state.
|
|
24
30
|
*/
|
|
25
|
-
export function findFieldProblems(fields, createsDeal) {
|
|
31
|
+
export function findFieldProblems(fields, createsDeal, createsPartnership = false) {
|
|
26
32
|
const problems = [];
|
|
27
33
|
const seenTargets = new Set();
|
|
34
|
+
const usedConsentPurposes = new Set();
|
|
28
35
|
if (!fields.some((field) => field.mapTo === PERSON_EMAIL_TARGET)) {
|
|
29
36
|
problems.push({
|
|
30
37
|
field: 'fields',
|
|
31
38
|
message: `A form needs exactly one field mapped to ${PERSON_EMAIL_TARGET}`,
|
|
32
39
|
});
|
|
33
40
|
}
|
|
34
|
-
|
|
41
|
+
const hasCompanyField = fields.some((field) => COMPANY_TARGETS.includes(field.mapTo));
|
|
42
|
+
if (createsDeal && !hasCompanyField) {
|
|
35
43
|
problems.push({
|
|
36
44
|
field: 'fields',
|
|
37
45
|
message: `A form that creates deals needs a field mapped to ${COMPANY_TARGETS.join(' or ')}`,
|
|
38
46
|
});
|
|
39
47
|
}
|
|
48
|
+
if (createsPartnership && !hasCompanyField) {
|
|
49
|
+
problems.push({
|
|
50
|
+
field: 'fields',
|
|
51
|
+
message: `A form that creates partnerships needs a field mapped to ${COMPANY_TARGETS.join(' or ')}`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
40
54
|
for (const [index, field] of fields.entries()) {
|
|
41
55
|
const at = `fields.${String(index)}`;
|
|
42
|
-
|
|
56
|
+
// `person.consent` is repeatable — a form may carry more than one consent
|
|
57
|
+
// (checkbox) or notice (implicit) field, each offering its own list of
|
|
58
|
+
// purposes — but no purpose may appear on two fields, whether as the
|
|
59
|
+
// same field's duplicate or on two fields at once. Everything else
|
|
60
|
+
// non-`submission` is unique per form.
|
|
61
|
+
if (field.mapTo === PERSON_CONSENT_TARGET) {
|
|
62
|
+
if (field.type !== 'consent' && field.type !== 'notice') {
|
|
63
|
+
problems.push({
|
|
64
|
+
field: `${at}.type`,
|
|
65
|
+
message: 'A person.consent field must be of type "consent" or "notice"',
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (field.type === 'notice' && (field.statement ?? '').trim().length === 0) {
|
|
69
|
+
problems.push({
|
|
70
|
+
field: `${at}.statement`,
|
|
71
|
+
message: 'A notice field needs a statement',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
if (field.consentPurposeIds.length === 0) {
|
|
75
|
+
problems.push({
|
|
76
|
+
field: `${at}.consent_purpose_ids`,
|
|
77
|
+
message: field.type === 'notice'
|
|
78
|
+
? 'A notice field needs at least one purpose it grants implicitly'
|
|
79
|
+
: 'A consent field needs at least one purpose',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const seenLocal = new Set();
|
|
84
|
+
for (const purposeId of field.consentPurposeIds) {
|
|
85
|
+
if (seenLocal.has(purposeId)) {
|
|
86
|
+
problems.push({
|
|
87
|
+
field: `${at}.consent_purpose_ids`,
|
|
88
|
+
message: 'A consent field lists each purpose only once',
|
|
89
|
+
});
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
seenLocal.add(purposeId);
|
|
93
|
+
if (usedConsentPurposes.has(purposeId)) {
|
|
94
|
+
problems.push({
|
|
95
|
+
field: `${at}.consent_purpose_ids`,
|
|
96
|
+
message: 'Another consent field on this form already names this purpose',
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
usedConsentPurposes.add(purposeId);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else if (field.type === 'consent' || field.type === 'notice') {
|
|
106
|
+
problems.push({
|
|
107
|
+
field: `${at}.map_to`,
|
|
108
|
+
message: 'A consent or notice field must map to person.consent',
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
else if (!REPEATABLE_TARGETS.has(field.mapTo)) {
|
|
43
112
|
if (seenTargets.has(field.mapTo)) {
|
|
44
113
|
problems.push({ field: `${at}.map_to`, message: `Another field already maps to ${field.mapTo}` });
|
|
45
114
|
}
|
|
@@ -104,9 +173,24 @@ export function fieldsDiffer(stored, drafts) {
|
|
|
104
173
|
field.required !== draft.required ||
|
|
105
174
|
field.mapTo !== draft.mapTo ||
|
|
106
175
|
field.placeholder !== draft.placeholder ||
|
|
176
|
+
field.statement !== draft.statement ||
|
|
177
|
+
stringListDiffer(field.consentPurposeIds, draft.consentPurposeIds) ||
|
|
178
|
+
labelMapDiffer(field.consentPurposeLabels, draft.consentPurposeLabels) ||
|
|
107
179
|
optionsDiffer(field.options, draft.options));
|
|
108
180
|
});
|
|
109
181
|
}
|
|
182
|
+
function labelMapDiffer(stored, drafts) {
|
|
183
|
+
const storedKeys = Object.keys(stored);
|
|
184
|
+
const draftKeys = Object.keys(drafts);
|
|
185
|
+
if (storedKeys.length !== draftKeys.length)
|
|
186
|
+
return true;
|
|
187
|
+
return storedKeys.some((key) => stored[key] !== drafts[key]);
|
|
188
|
+
}
|
|
189
|
+
function stringListDiffer(stored, drafts) {
|
|
190
|
+
if (stored.length !== drafts.length)
|
|
191
|
+
return true;
|
|
192
|
+
return stored.some((value, index) => value !== drafts[index]);
|
|
193
|
+
}
|
|
110
194
|
function optionsDiffer(stored, drafts) {
|
|
111
195
|
if (stored.length !== drafts.length) {
|
|
112
196
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../src/modules/forms/fields.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../src/modules/forms/fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/forms/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAU3D;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,mBAAmB,EAAE,MAAM,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/forms/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAU3D;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,mBAAmB,EAAE,MAAM,GAAG,YAAY,CAwD3E"}
|
|
@@ -21,7 +21,18 @@ import { registerFormsTools } from './tools.js';
|
|
|
21
21
|
export function createFormsModule(migrationsDirectory) {
|
|
22
22
|
return {
|
|
23
23
|
id: 'forms',
|
|
24
|
-
requires: [
|
|
24
|
+
requires: [
|
|
25
|
+
'people',
|
|
26
|
+
'companies',
|
|
27
|
+
'positions',
|
|
28
|
+
'pipelines',
|
|
29
|
+
'deals',
|
|
30
|
+
'opportunities',
|
|
31
|
+
'partnerships',
|
|
32
|
+
'raises',
|
|
33
|
+
'lists',
|
|
34
|
+
'activities',
|
|
35
|
+
],
|
|
25
36
|
events: formsEvents,
|
|
26
37
|
register(context) {
|
|
27
38
|
const service = createFormsService({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/forms/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,mBAA2B;IAC3D,OAAO;QACL,EAAE,EAAE,OAAO;QACX,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/forms/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,mBAA2B;IAC3D,OAAO;QACL,EAAE,EAAE,OAAO;QACX,QAAQ,EAAE;YACR,QAAQ;YACR,WAAW;YACX,WAAW;YACX,WAAW;YACX,OAAO;YACP,eAAe;YACf,cAAc;YACd,QAAQ;YACR,OAAO;YACP,YAAY;SACb;QACD,MAAM,EAAE,WAAW;QAEnB,QAAQ,CAAC,OAAO;YACd,MAAM,OAAO,GAAG,kBAAkB,CAAC;gBACjC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAA;YAEF,MAAM,WAAW,GAAG,uBAAuB,CAAC;gBAC1C,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,cAAc,EAAE,sBAAsB,CAAC;oBACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;iBACjB,CAAC;gBACF,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC,CAAC,CAAA;YAEF,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;YAE3C,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;gBACxB,gBAAgB,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YACzE,CAAC,CAAC,CAAA;YAEF,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC9B,qBAAqB,CAAC,MAAM,EAAE;oBAC5B,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,WAAW;oBACX,YAAY,EAAE,OAAO,CAAC,YAAY;iBACnC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;YAEF,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAExC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -23,14 +23,42 @@ export type MappedAnswers = Partial<Record<FormFieldMapTarget, string>>;
|
|
|
23
23
|
export interface SubmitIntent {
|
|
24
24
|
/** Normalised. The one value a submit cannot proceed without. */
|
|
25
25
|
readonly email: string;
|
|
26
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* The name given, the one composed from the first and last name answers, or —
|
|
28
|
+
* when the form asked for no name at all — the part of the address before the
|
|
29
|
+
* `@`.
|
|
30
|
+
*/
|
|
27
31
|
readonly personName: string;
|
|
32
|
+
/** The `person.first_name` answer only. Never split out of `personName`. */
|
|
33
|
+
readonly personFirstName: string | undefined;
|
|
34
|
+
readonly personLastName: string | undefined;
|
|
28
35
|
readonly companyName: string | undefined;
|
|
29
36
|
/** The `company.domain` answer only. Never derived from the address; see `resolveDomain`. */
|
|
30
37
|
readonly companyDomain: string | undefined;
|
|
31
38
|
readonly positionTitle: string | undefined;
|
|
32
39
|
/** Only meaningful when the form creates deals. */
|
|
33
40
|
readonly dealName: string | undefined;
|
|
41
|
+
/** Only meaningful when the form creates opportunities. */
|
|
42
|
+
readonly opportunityName: string | undefined;
|
|
43
|
+
/** Only meaningful when the form creates partnerships. */
|
|
44
|
+
readonly partnershipName: string | undefined;
|
|
45
|
+
/** Only meaningful when the form creates enquiries. */
|
|
46
|
+
readonly enquiryName: string | undefined;
|
|
47
|
+
}
|
|
48
|
+
/** True for a consent-field answer that means "ticked". */
|
|
49
|
+
export declare function isConsentTicked(value: string | undefined): boolean;
|
|
50
|
+
/** One consent grant read off the answers, for the submit transaction to apply. */
|
|
51
|
+
export interface ConsentGrant {
|
|
52
|
+
readonly fieldId: string;
|
|
53
|
+
readonly purposeId: string;
|
|
54
|
+
/** The field-level intro sentence, shown above every checkbox in the field. */
|
|
55
|
+
readonly statement: string;
|
|
56
|
+
/**
|
|
57
|
+
* The field's per-purpose text override for this purpose. Empty when the
|
|
58
|
+
* field defers to the workspace purpose's own label; the submit resolves
|
|
59
|
+
* that fallback with the purpose row it loads to record the activity.
|
|
60
|
+
*/
|
|
61
|
+
readonly customLabel: string;
|
|
34
62
|
}
|
|
35
63
|
/**
|
|
36
64
|
* Reduces answers to one value per target.
|
|
@@ -38,9 +66,24 @@ export interface SubmitIntent {
|
|
|
38
66
|
* Blank answers are dropped, so a submitter who cleared a prefilled field does
|
|
39
67
|
* not overwrite a stored value with nothing. Two fields sharing a target is
|
|
40
68
|
* refused when the form is written, except for `submission`, which writes
|
|
41
|
-
* nothing and so cannot collide.
|
|
69
|
+
* nothing and so cannot collide, and `person.consent`, which is read by
|
|
70
|
+
* {@link readConsentGrants} instead — a form may carry several consent boxes,
|
|
71
|
+
* each granting a different purpose.
|
|
42
72
|
*/
|
|
43
73
|
export declare function mapAnswers(fields: readonly FormFieldRecord[], answers: Answers): MappedAnswers;
|
|
74
|
+
/**
|
|
75
|
+
* Every ticked purpose across every consent field on this form, in field
|
|
76
|
+
* order then purpose order. A consent field's answer is a comma-separated
|
|
77
|
+
* list of the purpose ids the visitor ticked; anything not on the field's
|
|
78
|
+
* configured list is dropped silently — the embed offers only what the field
|
|
79
|
+
* declares, so an unlisted id has to be an unusual client.
|
|
80
|
+
*
|
|
81
|
+
* The statement is the field's `statement` when set, else the field's label —
|
|
82
|
+
* the sentence shown above the checkboxes.
|
|
83
|
+
*/
|
|
84
|
+
export declare function readConsentGrants(fields: readonly FormFieldRecord[], answers: Answers): readonly ConsentGrant[];
|
|
85
|
+
/** Splits a consent field's answer into the ticked purpose ids. */
|
|
86
|
+
export declare function parseConsentAnswer(raw: string | undefined): readonly string[];
|
|
44
87
|
/**
|
|
45
88
|
* Everything wrong with an answer map, as `api.md` field details.
|
|
46
89
|
*
|
|
@@ -75,16 +118,30 @@ export declare function fillBlank(stored: string | null, inbound: string | undef
|
|
|
75
118
|
/** What a new Company is called when the answers named a domain and no name. */
|
|
76
119
|
export declare function companyNameFrom(intent: SubmitIntent): string | undefined;
|
|
77
120
|
/**
|
|
78
|
-
* Expands `{{company.name}}` and `{{person.name}}` in a
|
|
121
|
+
* Expands `{{company.name}}` and `{{person.name}}` in a create-trigger name
|
|
122
|
+
* template. Shared by the deal, opportunity, and partnership triggers.
|
|
79
123
|
*
|
|
80
124
|
* The fallbacks are the mockup's: a template is written once by an admin and
|
|
81
125
|
* then run against whatever arrives, so a submission with no company name must
|
|
82
|
-
* still produce a
|
|
126
|
+
* still produce a record with a name somebody can read on a board.
|
|
83
127
|
*/
|
|
84
|
-
export declare function
|
|
128
|
+
export declare function expandNameTemplate(template: string, values: {
|
|
85
129
|
readonly companyName: string;
|
|
86
130
|
readonly personName: string;
|
|
87
131
|
}): string;
|
|
132
|
+
/**
|
|
133
|
+
* The union merge for a form's tag actions. The stored order is preserved and
|
|
134
|
+
* new tags land at the end, so the timeline reads oldest-first. Never removes
|
|
135
|
+
* a tag a human set: `forms.md` §Tags is explicit on that.
|
|
136
|
+
*
|
|
137
|
+
* @returns The merged list, and `changed` = true when at least one new tag
|
|
138
|
+
* landed. The caller uses `changed` to decide whether to emit an update
|
|
139
|
+
* event, since a no-op merge should not publish `*.updated`.
|
|
140
|
+
*/
|
|
141
|
+
export declare function mergeTags(stored: readonly string[], inbound: readonly string[]): {
|
|
142
|
+
readonly next: readonly string[];
|
|
143
|
+
readonly changed: boolean;
|
|
144
|
+
};
|
|
88
145
|
/** How far ahead a deal created by a form is expected to close (`forms.md` rule 6). */
|
|
89
146
|
export declare const DEAL_CLOSE_HORIZON_DAYS = 30;
|
|
90
147
|
/** `YYYY-MM-DD`, `days` after `from`. Date-only, per `api.md`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../../../src/modules/forms/mapping.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../../../src/modules/forms/mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,30 @@
|
|
|
1
|
+
import { composeName } from '@kelpie/schemas';
|
|
1
2
|
import { normaliseDomain, normaliseEmail } from '../../lib/normalisation.js';
|
|
2
3
|
import { PERSON_EMAIL_TARGET } from './schema.js';
|
|
4
|
+
/** True for a consent-field answer that means "ticked". */
|
|
5
|
+
export function isConsentTicked(value) {
|
|
6
|
+
if (value === undefined)
|
|
7
|
+
return false;
|
|
8
|
+
const trimmed = value.trim().toLowerCase();
|
|
9
|
+
return trimmed === 'true' || trimmed === 'on' || trimmed === '1' || trimmed === 'yes';
|
|
10
|
+
}
|
|
3
11
|
/**
|
|
4
12
|
* Reduces answers to one value per target.
|
|
5
13
|
*
|
|
6
14
|
* Blank answers are dropped, so a submitter who cleared a prefilled field does
|
|
7
15
|
* not overwrite a stored value with nothing. Two fields sharing a target is
|
|
8
16
|
* refused when the form is written, except for `submission`, which writes
|
|
9
|
-
* nothing and so cannot collide.
|
|
17
|
+
* nothing and so cannot collide, and `person.consent`, which is read by
|
|
18
|
+
* {@link readConsentGrants} instead — a form may carry several consent boxes,
|
|
19
|
+
* each granting a different purpose.
|
|
10
20
|
*/
|
|
11
21
|
export function mapAnswers(fields, answers) {
|
|
12
22
|
const mapped = {};
|
|
13
23
|
for (const field of fields) {
|
|
24
|
+
// `person.consent` (both `consent` and `notice` types) is read separately
|
|
25
|
+
// — a checkbox field by ticked ids, a notice implicitly by submission.
|
|
26
|
+
if (field.mapTo === 'person.consent')
|
|
27
|
+
continue;
|
|
14
28
|
const value = answers[field.id]?.trim();
|
|
15
29
|
if (value === undefined || value.length === 0) {
|
|
16
30
|
continue;
|
|
@@ -19,6 +33,65 @@ export function mapAnswers(fields, answers) {
|
|
|
19
33
|
}
|
|
20
34
|
return mapped;
|
|
21
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Every ticked purpose across every consent field on this form, in field
|
|
38
|
+
* order then purpose order. A consent field's answer is a comma-separated
|
|
39
|
+
* list of the purpose ids the visitor ticked; anything not on the field's
|
|
40
|
+
* configured list is dropped silently — the embed offers only what the field
|
|
41
|
+
* declares, so an unlisted id has to be an unusual client.
|
|
42
|
+
*
|
|
43
|
+
* The statement is the field's `statement` when set, else the field's label —
|
|
44
|
+
* the sentence shown above the checkboxes.
|
|
45
|
+
*/
|
|
46
|
+
export function readConsentGrants(fields, answers) {
|
|
47
|
+
const grants = [];
|
|
48
|
+
for (const field of fields) {
|
|
49
|
+
if (field.consentPurposeIds.length === 0)
|
|
50
|
+
continue;
|
|
51
|
+
const statement = field.statement ?? field.label;
|
|
52
|
+
// A `notice` field grants every configured purpose implicitly: the
|
|
53
|
+
// visitor's act of submitting the form is the consent, per the notice
|
|
54
|
+
// text they read. No answer to parse.
|
|
55
|
+
if (field.type === 'notice') {
|
|
56
|
+
for (const purposeId of field.consentPurposeIds) {
|
|
57
|
+
grants.push({
|
|
58
|
+
fieldId: field.id,
|
|
59
|
+
purposeId,
|
|
60
|
+
statement,
|
|
61
|
+
customLabel: '',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (field.type !== 'consent')
|
|
67
|
+
continue;
|
|
68
|
+
const ticked = parseConsentAnswer(answers[field.id]);
|
|
69
|
+
if (ticked.length === 0)
|
|
70
|
+
continue;
|
|
71
|
+
const allowed = new Set(field.consentPurposeIds);
|
|
72
|
+
for (const purposeId of ticked) {
|
|
73
|
+
if (!allowed.has(purposeId))
|
|
74
|
+
continue;
|
|
75
|
+
grants.push({
|
|
76
|
+
fieldId: field.id,
|
|
77
|
+
purposeId,
|
|
78
|
+
statement,
|
|
79
|
+
customLabel: field.consentPurposeLabels[purposeId] ?? '',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return grants;
|
|
84
|
+
}
|
|
85
|
+
/** Splits a consent field's answer into the ticked purpose ids. */
|
|
86
|
+
export function parseConsentAnswer(raw) {
|
|
87
|
+
if (raw === undefined)
|
|
88
|
+
return [];
|
|
89
|
+
const parts = raw
|
|
90
|
+
.split(',')
|
|
91
|
+
.map((part) => part.trim())
|
|
92
|
+
.filter((part) => part.length > 0);
|
|
93
|
+
return Array.from(new Set(parts));
|
|
94
|
+
}
|
|
22
95
|
/**
|
|
23
96
|
* Everything wrong with an answer map, as `api.md` field details.
|
|
24
97
|
*
|
|
@@ -39,6 +112,26 @@ export function findAnswerProblems(fields, answers) {
|
|
|
39
112
|
}
|
|
40
113
|
}
|
|
41
114
|
for (const field of fields) {
|
|
115
|
+
// A consent field's answer is a comma-separated list of ticked purpose
|
|
116
|
+
// ids. Required means at least one must be ticked; unrequired means the
|
|
117
|
+
// list may be empty. Ids not on the field's own list are silently
|
|
118
|
+
// ignored on submit — the embed offers only what the field configures.
|
|
119
|
+
if (field.type === 'consent') {
|
|
120
|
+
const ticked = parseConsentAnswer(answers[field.id]);
|
|
121
|
+
if (field.required && ticked.length === 0) {
|
|
122
|
+
problems.push({
|
|
123
|
+
field: `answers.${field.id}`,
|
|
124
|
+
message: `${field.label} needs at least one choice`,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
// A notice field carries no answer — its consent is implicit in the
|
|
130
|
+
// submission. `required` is meaningless on it. An answer sent for it is
|
|
131
|
+
// silently ignored; the mapper never reads it either.
|
|
132
|
+
if (field.type === 'notice') {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
42
135
|
const value = answers[field.id]?.trim() ?? '';
|
|
43
136
|
if (value.length === 0) {
|
|
44
137
|
if (field.required) {
|
|
@@ -86,13 +179,28 @@ export function readIntent(mapped) {
|
|
|
86
179
|
if (email === null || !email.includes('@')) {
|
|
87
180
|
return undefined;
|
|
88
181
|
}
|
|
182
|
+
const firstName = mapped['person.first_name'];
|
|
183
|
+
const lastName = mapped['person.last_name'];
|
|
184
|
+
// A form that asks for a first and last name rather than one name box is the
|
|
185
|
+
// common arrangement, so the pair composes the display name. The address's
|
|
186
|
+
// local part stays the last resort it always was, for a form that asks for
|
|
187
|
+
// neither.
|
|
188
|
+
const composed = composeName({ firstName, lastName });
|
|
89
189
|
return {
|
|
90
190
|
email,
|
|
91
|
-
personName: mapped['person.name'] ??
|
|
191
|
+
personName: mapped['person.name'] ??
|
|
192
|
+
(composed.length > 0 ? composed : undefined) ??
|
|
193
|
+
email.split('@')[0] ??
|
|
194
|
+
email,
|
|
195
|
+
personFirstName: firstName,
|
|
196
|
+
personLastName: lastName,
|
|
92
197
|
companyName: mapped['company.name'],
|
|
93
198
|
companyDomain: resolveDomain(mapped),
|
|
94
199
|
positionTitle: mapped['position.title'],
|
|
95
200
|
dealName: mapped['deal.name'],
|
|
201
|
+
opportunityName: mapped['opportunity.name'],
|
|
202
|
+
partnershipName: mapped['partnership.name'],
|
|
203
|
+
enquiryName: mapped['enquiry.name'],
|
|
96
204
|
};
|
|
97
205
|
}
|
|
98
206
|
/**
|
|
@@ -116,17 +224,43 @@ export function companyNameFrom(intent) {
|
|
|
116
224
|
return intent.companyName ?? intent.companyDomain;
|
|
117
225
|
}
|
|
118
226
|
/**
|
|
119
|
-
* Expands `{{company.name}}` and `{{person.name}}` in a
|
|
227
|
+
* Expands `{{company.name}}` and `{{person.name}}` in a create-trigger name
|
|
228
|
+
* template. Shared by the deal, opportunity, and partnership triggers.
|
|
120
229
|
*
|
|
121
230
|
* The fallbacks are the mockup's: a template is written once by an admin and
|
|
122
231
|
* then run against whatever arrives, so a submission with no company name must
|
|
123
|
-
* still produce a
|
|
232
|
+
* still produce a record with a name somebody can read on a board.
|
|
124
233
|
*/
|
|
125
|
-
export function
|
|
234
|
+
export function expandNameTemplate(template, values) {
|
|
126
235
|
return template
|
|
127
236
|
.replaceAll('{{company.name}}', values.companyName.length > 0 ? values.companyName : 'Website lead')
|
|
128
237
|
.replaceAll('{{person.name}}', values.personName.length > 0 ? values.personName : 'Lead');
|
|
129
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* The union merge for a form's tag actions. The stored order is preserved and
|
|
241
|
+
* new tags land at the end, so the timeline reads oldest-first. Never removes
|
|
242
|
+
* a tag a human set: `forms.md` §Tags is explicit on that.
|
|
243
|
+
*
|
|
244
|
+
* @returns The merged list, and `changed` = true when at least one new tag
|
|
245
|
+
* landed. The caller uses `changed` to decide whether to emit an update
|
|
246
|
+
* event, since a no-op merge should not publish `*.updated`.
|
|
247
|
+
*/
|
|
248
|
+
export function mergeTags(stored, inbound) {
|
|
249
|
+
const known = new Set(stored);
|
|
250
|
+
const additions = [];
|
|
251
|
+
for (const tag of inbound) {
|
|
252
|
+
const trimmed = tag.trim();
|
|
253
|
+
if (trimmed.length === 0 || known.has(trimmed)) {
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
known.add(trimmed);
|
|
257
|
+
additions.push(trimmed);
|
|
258
|
+
}
|
|
259
|
+
if (additions.length === 0) {
|
|
260
|
+
return { next: stored, changed: false };
|
|
261
|
+
}
|
|
262
|
+
return { next: [...stored, ...additions], changed: true };
|
|
263
|
+
}
|
|
130
264
|
/** How far ahead a deal created by a form is expected to close (`forms.md` rule 6). */
|
|
131
265
|
export const DEAL_CLOSE_HORIZON_DAYS = 30;
|
|
132
266
|
/** `YYYY-MM-DD`, `days` after `from`. Date-only, per `api.md`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../../src/modules/forms/mapping.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../../src/modules/forms/mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publicRoutes.d.ts","sourceRoot":"","sources":["../../../src/modules/forms/publicRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAGhC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAIrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"publicRoutes.d.ts","sourceRoot":"","sources":["../../../src/modules/forms/publicRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAGhC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAIrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAOxE,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAA;AAiBvE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;IACrB,uEAAuE;IACvE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,MAAM,CAAA;IACrC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAA;IACvC,oFAAoF;IACpF,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAA;CAC3C;AAsCD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,IAAI,EACZ,YAAY,EAAE,4BAA4B,GACzC,IAAI,CAgEN"}
|
|
@@ -3,6 +3,8 @@ import { AppError } from '../../lib/errors.js';
|
|
|
3
3
|
import { PUBLIC_ROUTE_PREFIX, readJsonBody, requestOrigin } from '../../lib/http.js';
|
|
4
4
|
import { requireCapability } from '../../runtime/entitlements.js';
|
|
5
5
|
import { moduleCapabilityName } from '../../runtime/moduleConfig.js';
|
|
6
|
+
import * as consentPurposesRepository from '../consent-purposes/repository.js';
|
|
7
|
+
import { findWorkspace } from '../workspace/repository.js';
|
|
6
8
|
import { embedContentSecurityPolicy, renderEmbedPage } from './embed.js';
|
|
7
9
|
import * as repository from './repository.js';
|
|
8
10
|
/**
|
|
@@ -18,6 +20,20 @@ import * as repository from './repository.js';
|
|
|
18
20
|
const submitBody = z.strictObject({
|
|
19
21
|
answers: z.record(z.string().min(1), z.string()),
|
|
20
22
|
});
|
|
23
|
+
/**
|
|
24
|
+
* The purpose labels every consent field on this form points at, keyed by id.
|
|
25
|
+
* Renders the embed with the display label beside each checkbox rather than
|
|
26
|
+
* an opaque id. A purpose that has since been removed drops out of the map;
|
|
27
|
+
* `renderField` falls back to the id when it does, so a stale field stays
|
|
28
|
+
* visible but obviously off.
|
|
29
|
+
*/
|
|
30
|
+
async function loadConsentPurposeLabels(db, workspaceId, fields) {
|
|
31
|
+
const ids = Array.from(new Set(fields.flatMap((field) => (field.type === 'consent' ? field.consentPurposeIds : []))));
|
|
32
|
+
if (ids.length === 0)
|
|
33
|
+
return new Map();
|
|
34
|
+
const rows = await consentPurposesRepository.listPurposesByIds(db, workspaceId, ids);
|
|
35
|
+
return new Map(rows.map((row) => [row.id, row.label]));
|
|
36
|
+
}
|
|
21
37
|
function submitResponse(outcome) {
|
|
22
38
|
// The upserted record ids stay off this response on purpose. The caller is an
|
|
23
39
|
// unauthenticated website, and a Kelpie id is a ULID whose timestamp would tell
|
|
@@ -56,12 +72,24 @@ export function mountPublicFormRoutes(router, dependencies) {
|
|
|
56
72
|
// Ungated by the runtime, like the submit route: a workspace with the forms
|
|
57
73
|
// module off does not serve its embed either.
|
|
58
74
|
await requireCapability(dependencies.entitlements, form.workspaceId, moduleCapabilityName('forms'));
|
|
75
|
+
const workspace = await findWorkspace(dependencies.db, form.workspaceId);
|
|
76
|
+
if (workspace === undefined) {
|
|
77
|
+
throw AppError.notFound('Form not found');
|
|
78
|
+
}
|
|
79
|
+
// `view=page` is the standalone hosted URL (brand chrome). The default —
|
|
80
|
+
// and what iframe snippets load — is the bare embed: fields only.
|
|
81
|
+
const layout = context.req.query('view') === 'page' ? 'page' : 'embed';
|
|
59
82
|
const nonce = generateNonce();
|
|
83
|
+
const fields = await repository.listFields(dependencies.db, form.id);
|
|
84
|
+
const consentPurposeLabels = await loadConsentPurposeLabels(dependencies.db, form.workspaceId, fields);
|
|
60
85
|
const page = renderEmbedPage({
|
|
61
86
|
form,
|
|
62
|
-
fields
|
|
87
|
+
fields,
|
|
88
|
+
consentPurposeLabels,
|
|
63
89
|
submitUrl: `${requestOrigin(context)}${PUBLIC_ROUTE_PREFIX}/forms/${publicKey}/submit`,
|
|
64
90
|
nonce,
|
|
91
|
+
workspaceName: workspace.name,
|
|
92
|
+
layout,
|
|
65
93
|
});
|
|
66
94
|
context.header('Content-Security-Policy', embedContentSecurityPolicy(nonce));
|
|
67
95
|
// The page is per-form and changes whenever the form is edited. A short
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publicRoutes.js","sourceRoot":"","sources":["../../../src/modules/forms/publicRoutes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"publicRoutes.js","sourceRoot":"","sources":["../../../src/modules/forms/publicRoutes.ts"],"names":[],"mappings":"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"}
|