@researchdatabox/redbox-core 5.0.4-beta.12498 → 5.0.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.
- package/dist/CoreController.d.ts +3 -7
- package/dist/CoreController.d.ts.map +1 -1
- package/dist/CoreController.js +3 -85
- package/dist/DatastreamService.d.ts +2 -4
- package/dist/DatastreamService.d.ts.map +1 -1
- package/dist/HarvestRunService.d.ts +3 -4
- package/dist/HarvestRunService.d.ts.map +1 -1
- package/dist/HarvestRunService.js +1 -1
- package/dist/QueueService.d.ts +1 -1
- package/dist/QueueService.d.ts.map +1 -1
- package/dist/RecordWriteOptions.d.ts +21 -0
- package/dist/RecordWriteOptions.d.ts.map +1 -0
- package/dist/RecordWriteOptions.js +17 -0
- package/dist/RecordsService.d.ts +14 -105
- package/dist/RecordsService.d.ts.map +1 -1
- package/dist/RecordsService.js +1 -44
- package/dist/SearchService.d.ts +1 -2
- package/dist/SearchService.d.ts.map +1 -1
- package/dist/StorageService.d.ts +20 -48
- package/dist/StorageService.d.ts.map +1 -1
- package/dist/StorageService.js +1 -19
- package/dist/StorageServiceResponse.d.ts +1 -22
- package/dist/StorageServiceResponse.d.ts.map +1 -1
- package/dist/StorageServiceResponse.js +4 -22
- package/dist/api-routes/groups/branding.d.ts +0 -8
- package/dist/api-routes/groups/branding.d.ts.map +1 -1
- package/dist/api-routes/groups/branding.js +11 -86
- package/dist/api-routes/groups/dashboard-config.d.ts +9 -12
- package/dist/api-routes/groups/dashboard-config.d.ts.map +1 -1
- package/dist/api-routes/groups/dashboard-config.js +73 -136
- package/dist/api-routes/groups/forms.d.ts.map +1 -1
- package/dist/api-routes/groups/forms.js +2 -10
- package/dist/api-routes/groups/records.d.ts +0 -1
- package/dist/api-routes/groups/records.d.ts.map +1 -1
- package/dist/api-routes/groups/records.js +26 -141
- package/dist/api-routes/index.d.ts +0 -3
- package/dist/api-routes/index.d.ts.map +1 -1
- package/dist/api-routes/index.js +1 -4
- package/dist/api-routes/openapi.d.ts.map +1 -1
- package/dist/api-routes/openapi.js +5 -7
- package/dist/api-routes/request-extraction.d.ts.map +1 -1
- package/dist/api-routes/request-extraction.js +8 -10
- package/dist/api-routes/route-factory.d.ts.map +1 -1
- package/dist/api-routes/route-factory.js +1 -2
- package/dist/api-routes/route-registry.d.ts.map +1 -1
- package/dist/api-routes/route-registry.js +1 -3
- package/dist/api-routes/schemas/common.d.ts +0 -36
- package/dist/api-routes/schemas/common.d.ts.map +1 -1
- package/dist/api-routes/schemas/common.js +5 -95
- package/dist/api-routes/schemas/responses.d.ts +1 -1424
- package/dist/api-routes/schemas/responses.d.ts.map +1 -1
- package/dist/api-routes/schemas/responses.js +60 -382
- package/dist/api-routes/types.d.ts +0 -1
- package/dist/api-routes/types.d.ts.map +1 -1
- package/dist/api-routes/validation.d.ts +1 -5
- package/dist/api-routes/validation.d.ts.map +1 -1
- package/dist/api-routes/validation.js +15 -14
- package/dist/bootstrap.d.ts +1 -3
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +41 -58
- package/dist/config/agendaQueue.config.d.ts +0 -3
- package/dist/config/agendaQueue.config.d.ts.map +1 -1
- package/dist/config/agendaQueue.config.js +11 -29
- package/dist/config/branding.config.d.ts +0 -13
- package/dist/config/branding.config.d.ts.map +1 -1
- package/dist/config/branding.config.js +2 -34
- package/dist/config/brandingConfigurationDefaults.config.d.ts +0 -4
- package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
- package/dist/config/brandingConfigurationDefaults.config.js +3 -42
- package/dist/config/datapubs.config.d.ts +72 -0
- package/dist/config/datapubs.config.d.ts.map +1 -0
- package/dist/config/datapubs.config.js +74 -0
- package/dist/config/i18n.config.d.ts +4 -0
- package/dist/config/i18n.config.d.ts.map +1 -1
- package/dist/config/i18n.config.js +1 -1
- package/dist/config/index.d.ts +4 -12
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +4 -7
- package/dist/config/policies.config.d.ts.map +1 -1
- package/dist/config/policies.config.js +23 -37
- package/dist/config/raid.config.d.ts +4 -7
- package/dist/config/raid.config.d.ts.map +1 -1
- package/dist/config/raid.config.js +35 -21
- package/dist/config/record.config.d.ts +0 -3
- package/dist/config/record.config.d.ts.map +1 -1
- package/dist/config/record.config.js +35 -37
- package/dist/config/recordtype.config.d.ts +9 -32
- package/dist/config/recordtype.config.d.ts.map +1 -1
- package/dist/config/recordtype.config.js +7 -4
- package/dist/config/routes.config.d.ts.map +1 -1
- package/dist/config/routes.config.js +53 -135
- package/dist/config/workflow.config.d.ts +0 -6
- package/dist/config/workflow.config.d.ts.map +1 -1
- package/dist/config/workflow.config.js +1 -1
- package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -1
- package/dist/configmodels/AdminSidebarConfig.js +2 -4
- package/dist/configmodels/ConfigModels.d.ts +1 -1
- package/dist/configmodels/ConfigModels.d.ts.map +1 -1
- package/dist/configmodels/ConfigModels.js +9 -26
- package/dist/configmodels/FigsharePublishing.d.ts +103 -0
- package/dist/configmodels/FigsharePublishing.d.ts.map +1 -1
- package/dist/configmodels/FigsharePublishing.js +36 -2
- package/dist/controllers/AppConfigController.d.ts.map +1 -1
- package/dist/controllers/AppConfigController.js +1 -4
- package/dist/controllers/BrandingAppController.d.ts +7 -29
- package/dist/controllers/BrandingAppController.d.ts.map +1 -1
- package/dist/controllers/BrandingAppController.js +69 -265
- package/dist/controllers/BrandingController.d.ts +1 -24
- package/dist/controllers/BrandingController.d.ts.map +1 -1
- package/dist/controllers/BrandingController.js +43 -173
- package/dist/controllers/DashboardConfigController.d.ts +2 -6
- package/dist/controllers/DashboardConfigController.d.ts.map +1 -1
- package/dist/controllers/DashboardConfigController.js +4 -18
- package/dist/controllers/DynamicAssetController.d.ts +5 -7
- package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
- package/dist/controllers/DynamicAssetController.js +12 -21
- package/dist/controllers/RecordAuditController.d.ts.map +1 -1
- package/dist/controllers/RecordAuditController.js +24 -6
- package/dist/controllers/RecordController.d.ts +4 -45
- package/dist/controllers/RecordController.d.ts.map +1 -1
- package/dist/controllers/RecordController.js +345 -778
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js +1 -4
- package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
- package/dist/controllers/webservice/AdminController.js +3 -4
- package/dist/controllers/webservice/BrandingController.d.ts +1 -26
- package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
- package/dist/controllers/webservice/BrandingController.js +116 -292
- package/dist/controllers/webservice/DashboardConfigController.d.ts +17 -25
- package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -1
- package/dist/controllers/webservice/DashboardConfigController.js +205 -90
- package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
- package/dist/controllers/webservice/FormManagementController.js +3 -37
- package/dist/controllers/webservice/RecordController.d.ts +1 -15
- package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordController.js +267 -647
- package/dist/controllers/webservice/RecordTypeController.d.ts +1 -6
- package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordTypeController.js +3 -21
- package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
- package/dist/controllers/webservice/SearchController.js +3 -7
- package/dist/hooks/defineRedboxHook.d.ts +0 -3
- package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
- package/dist/hooks/defineRedboxHook.js +1 -4
- package/dist/index.d.ts +25 -50
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -90
- package/dist/loader/bootstrapShimRuntime.d.ts +1 -1
- package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -1
- package/dist/loader/bootstrapShimRuntime.js +12 -20
- package/dist/loader/index.d.ts +0 -9
- package/dist/loader/index.d.ts.map +1 -1
- package/dist/loader/index.js +4 -93
- package/dist/model/BuildResponse.d.ts +11 -25
- package/dist/model/BuildResponse.d.ts.map +1 -1
- package/dist/model/BuildResponse.js +3 -4
- package/dist/model/DashboardTypeResponseModel.d.ts +0 -6
- package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
- package/dist/model/DashboardTypeResponseModel.js +1 -7
- package/dist/model/DashboardViewResponseModel.d.ts +1 -5
- package/dist/model/DashboardViewResponseModel.d.ts.map +1 -1
- package/dist/model/DashboardViewResponseModel.js +3 -6
- package/dist/model/RBValidationError.d.ts +0 -17
- package/dist/model/RBValidationError.d.ts.map +1 -1
- package/dist/model/RBValidationError.js +1 -37
- package/dist/model/RecordTypeResponseModel.d.ts +4 -12
- package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
- package/dist/model/RecordTypeResponseModel.js +2 -11
- package/dist/model/index.d.ts +1 -5
- package/dist/model/index.d.ts.map +1 -1
- package/dist/model/index.js +2 -5
- package/dist/model/storage/BrandingModel.d.ts +0 -7
- package/dist/model/storage/BrandingModel.d.ts.map +1 -1
- package/dist/model/storage/BrandingModel.js +1 -7
- package/dist/model/storage/DeletedRecordModel.d.ts +0 -35
- package/dist/model/storage/DeletedRecordModel.d.ts.map +1 -1
- package/dist/model/storage/DeletedRecordModel.js +1 -62
- package/dist/model/storage/FigshareSyncModel.d.ts +126 -0
- package/dist/model/storage/FigshareSyncModel.d.ts.map +1 -0
- package/dist/model/storage/FigshareSyncModel.js +3 -0
- package/dist/model/storage/IntegrationAuditModel.d.ts +2 -16
- package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -1
- package/dist/model/storage/IntegrationAuditModel.js +1 -15
- package/dist/model/storage/RecordAuditModel.d.ts +4 -11
- package/dist/model/storage/RecordAuditModel.d.ts.map +1 -1
- package/dist/model/storage/RecordAuditModel.js +30 -8
- package/dist/model/storage/RecordModel.d.ts +3 -6
- package/dist/model/storage/RecordModel.d.ts.map +1 -1
- package/dist/model/storage/RecordTypeModel.d.ts +0 -6
- package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
- package/dist/model/storage/RecordTypeModel.js +1 -4
- package/dist/model/storage/index.d.ts +10 -12
- package/dist/model/storage/index.d.ts.map +1 -1
- package/dist/model/storage/index.js +2 -24
- package/dist/policies/checkAuth.d.ts +6 -2
- package/dist/policies/checkAuth.d.ts.map +1 -1
- package/dist/policies/checkAuth.js +9 -32
- package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
- package/dist/policies/contentSecurityPolicy.js +2 -85
- package/dist/policies/index.d.ts +2 -3
- package/dist/policies/index.d.ts.map +1 -1
- package/dist/policies/index.js +2 -4
- package/dist/policies/validateApiContractRequest.d.ts.map +1 -1
- package/dist/policies/validateApiContractRequest.js +11 -49
- package/dist/services/AgendaQueueService.d.ts +1 -1
- package/dist/services/AgendaQueueService.d.ts.map +1 -1
- package/dist/services/AgendaQueueService.js +7 -4
- package/dist/services/AppConfigService.d.ts +0 -6
- package/dist/services/AppConfigService.d.ts.map +1 -1
- package/dist/services/AppConfigService.js +1 -23
- package/dist/services/AttachmentMetadataService.d.ts +0 -58
- package/dist/services/AttachmentMetadataService.d.ts.map +1 -1
- package/dist/services/AttachmentMetadataService.js +8 -643
- package/dist/services/BrandingLogoService.d.ts +1 -6
- package/dist/services/BrandingLogoService.d.ts.map +1 -1
- package/dist/services/BrandingLogoService.js +9 -77
- package/dist/services/BrandingService.d.ts +9 -171
- package/dist/services/BrandingService.d.ts.map +1 -1
- package/dist/services/BrandingService.js +68 -572
- package/dist/services/BrandingThemeCssService.d.ts +1 -17
- package/dist/services/BrandingThemeCssService.d.ts.map +1 -1
- package/dist/services/BrandingThemeCssService.js +9 -71
- package/dist/services/DashboardConfigService.d.ts +54 -214
- package/dist/services/DashboardConfigService.d.ts.map +1 -1
- package/dist/services/DashboardConfigService.js +261 -829
- package/dist/services/DashboardTypesService.d.ts +4 -15
- package/dist/services/DashboardTypesService.d.ts.map +1 -1
- package/dist/services/DashboardTypesService.js +139 -72
- package/dist/services/DoiService.d.ts +1 -1
- package/dist/services/DoiService.d.ts.map +1 -1
- package/dist/services/DoiService.js +45 -71
- package/dist/services/FigshareService.d.ts +15 -10
- package/dist/services/FigshareService.d.ts.map +1 -1
- package/dist/services/FigshareService.js +82 -583
- package/dist/services/FormRecordConsistencyService.d.ts +23 -8
- package/dist/services/FormRecordConsistencyService.d.ts.map +1 -1
- package/dist/services/FormRecordConsistencyService.js +70 -54
- package/dist/services/FormsService.d.ts +2 -91
- package/dist/services/FormsService.d.ts.map +1 -1
- package/dist/services/FormsService.js +64 -324
- package/dist/services/HarvestRunService.d.ts +3 -6
- package/dist/services/HarvestRunService.d.ts.map +1 -1
- package/dist/services/HarvestRunService.js +97 -161
- package/dist/services/I18nEntriesService.d.ts +2 -1
- package/dist/services/I18nEntriesService.d.ts.map +1 -1
- package/dist/services/I18nEntriesService.js +45 -30
- package/dist/services/OniService.d.ts +62 -19
- package/dist/services/OniService.d.ts.map +1 -1
- package/dist/services/OniService.js +691 -223
- package/dist/services/RDMPService.d.ts +1 -1
- package/dist/services/RDMPService.d.ts.map +1 -1
- package/dist/services/RDMPService.js +5 -5
- package/dist/services/RaidService.d.ts +61 -19
- package/dist/services/RaidService.d.ts.map +1 -1
- package/dist/services/RaidService.js +530 -191
- package/dist/services/RecordTypesService.d.ts +0 -29
- package/dist/services/RecordTypesService.d.ts.map +1 -1
- package/dist/services/RecordTypesService.js +11 -106
- package/dist/services/RecordsService.d.ts +26 -313
- package/dist/services/RecordsService.d.ts.map +1 -1
- package/dist/services/RecordsService.js +763 -5089
- package/dist/services/SolrSearchService.d.ts +1 -1
- package/dist/services/SolrSearchService.d.ts.map +1 -1
- package/dist/services/SolrSearchService.js +12 -42
- package/dist/services/StandardDatastreamService.d.ts +5 -4
- package/dist/services/StandardDatastreamService.d.ts.map +1 -1
- package/dist/services/StandardDatastreamService.js +61 -106
- package/dist/services/TriggerService.d.ts.map +1 -1
- package/dist/services/TriggerService.js +30 -54
- package/dist/services/UsersService.d.ts +1 -2
- package/dist/services/UsersService.d.ts.map +1 -1
- package/dist/services/UsersService.js +283 -364
- package/dist/services/VocabularyService.d.ts +0 -2
- package/dist/services/VocabularyService.d.ts.map +1 -1
- package/dist/services/VocabularyService.js +2 -61
- package/dist/services/WorkflowStepsService.d.ts +0 -11
- package/dist/services/WorkflowStepsService.d.ts.map +1 -1
- package/dist/services/WorkflowStepsService.js +3 -32
- package/dist/services/WorkspaceService.d.ts +2 -2
- package/dist/services/WorkspaceService.d.ts.map +1 -1
- package/dist/services/WorkspaceService.js +5 -5
- package/dist/services/doi-v2/bindings.d.ts.map +1 -1
- package/dist/services/doi-v2/bindings.js +20 -3
- package/dist/services/doi-v2/config.d.ts +0 -1
- package/dist/services/doi-v2/config.d.ts.map +1 -1
- package/dist/services/doi-v2/config.js +5 -13
- package/dist/services/doi-v2/runtime.d.ts.map +1 -1
- package/dist/services/doi-v2/runtime.js +54 -14
- package/dist/services/figshare-v2/admin.d.ts +16 -0
- package/dist/services/figshare-v2/admin.d.ts.map +1 -0
- package/dist/services/figshare-v2/admin.js +283 -0
- package/dist/services/figshare-v2/assets.d.ts +20 -1
- package/dist/services/figshare-v2/assets.d.ts.map +1 -1
- package/dist/services/figshare-v2/assets.js +16 -1
- package/dist/services/figshare-v2/bindings.d.ts.map +1 -1
- package/dist/services/figshare-v2/bindings.js +20 -3
- package/dist/services/figshare-v2/config.d.ts +8 -2
- package/dist/services/figshare-v2/config.d.ts.map +1 -1
- package/dist/services/figshare-v2/config.js +31 -3
- package/dist/services/figshare-v2/execution.d.ts +25 -0
- package/dist/services/figshare-v2/execution.d.ts.map +1 -0
- package/dist/services/figshare-v2/execution.js +49 -0
- package/dist/services/figshare-v2/http.d.ts +6 -1
- package/dist/services/figshare-v2/http.d.ts.map +1 -1
- package/dist/services/figshare-v2/http.js +69 -12
- package/dist/services/figshare-v2/identity.d.ts +12 -0
- package/dist/services/figshare-v2/identity.d.ts.map +1 -0
- package/dist/services/figshare-v2/identity.js +78 -0
- package/dist/services/figshare-v2/managed-assets.d.ts +9 -0
- package/dist/services/figshare-v2/managed-assets.d.ts.map +1 -0
- package/dist/services/figshare-v2/managed-assets.js +229 -0
- package/dist/services/figshare-v2/plan.d.ts.map +1 -1
- package/dist/services/figshare-v2/plan.js +2 -9
- package/dist/services/figshare-v2/runtime.d.ts.map +1 -1
- package/dist/services/figshare-v2/runtime.js +58 -11
- package/dist/services/figshare-v2/source-intent.d.ts +9 -0
- package/dist/services/figshare-v2/source-intent.d.ts.map +1 -0
- package/dist/services/figshare-v2/source-intent.js +93 -0
- package/dist/services/figshare-v2/status.d.ts +4 -0
- package/dist/services/figshare-v2/status.d.ts.map +1 -0
- package/dist/services/figshare-v2/status.js +29 -0
- package/dist/services/figshare-v2/sync-store.d.ts +27 -0
- package/dist/services/figshare-v2/sync-store.d.ts.map +1 -0
- package/dist/services/figshare-v2/sync-store.js +139 -0
- package/dist/services/figshare-v2/types.d.ts +3 -0
- package/dist/services/figshare-v2/types.d.ts.map +1 -1
- package/dist/services/figshare-v2/types.js +1 -1
- package/dist/services/figshare-v2/worker.d.ts +16 -0
- package/dist/services/figshare-v2/worker.d.ts.map +1 -0
- package/dist/services/figshare-v2/worker.js +572 -0
- package/dist/services/index.d.ts +0 -9
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -45
- package/dist/utilities/TranslationHtml.d.ts +3 -0
- package/dist/utilities/TranslationHtml.d.ts.map +1 -0
- package/dist/utilities/TranslationHtml.js +46 -0
- package/dist/visitor/client.visitor.d.ts +0 -6
- package/dist/visitor/client.visitor.d.ts.map +1 -1
- package/dist/visitor/client.visitor.js +14 -59
- package/dist/visitor/construct.visitor.d.ts +1 -27
- package/dist/visitor/construct.visitor.d.ts.map +1 -1
- package/dist/visitor/construct.visitor.js +177 -265
- package/dist/visitor/context-variables.visitor.d.ts +1 -3
- package/dist/visitor/context-variables.visitor.d.ts.map +1 -1
- package/dist/visitor/context-variables.visitor.js +1 -15
- package/dist/visitor/data-value.visitor.d.ts +0 -6
- package/dist/visitor/data-value.visitor.d.ts.map +1 -1
- package/dist/visitor/data-value.visitor.js +1 -10
- package/dist/visitor/json-type-def.visitor.d.ts +0 -6
- package/dist/visitor/json-type-def.visitor.d.ts.map +1 -1
- package/dist/visitor/json-type-def.visitor.js +1 -10
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +0 -11
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
- package/dist/visitor/migrate-config-v4-v5.visitor.js +133 -228
- package/dist/visitor/template.visitor.d.ts +2 -17
- package/dist/visitor/template.visitor.d.ts.map +1 -1
- package/dist/visitor/template.visitor.js +22 -60
- package/dist/visitor/validator.visitor.d.ts +7 -49
- package/dist/visitor/validator.visitor.d.ts.map +1 -1
- package/dist/visitor/validator.visitor.js +178 -275
- package/dist/waterline-models/AttachmentMetadata.d.ts +0 -22
- package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -1
- package/dist/waterline-models/AttachmentMetadata.js +3 -147
- package/dist/waterline-models/BrandingConfig.d.ts +0 -7
- package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
- package/dist/waterline-models/BrandingConfig.js +1 -16
- package/dist/waterline-models/BrandingConfigHistory.d.ts +2 -11
- package/dist/waterline-models/BrandingConfigHistory.d.ts.map +1 -1
- package/dist/waterline-models/BrandingConfigHistory.js +1 -21
- package/dist/waterline-models/FigshareSync.d.ts +41 -0
- package/dist/waterline-models/FigshareSync.d.ts.map +1 -0
- package/dist/waterline-models/FigshareSync.js +168 -0
- package/dist/waterline-models/RecordType.d.ts +0 -9
- package/dist/waterline-models/RecordType.d.ts.map +1 -1
- package/dist/waterline-models/RecordType.js +1 -16
- package/dist/waterline-models/User.d.ts.map +1 -1
- package/dist/waterline-models/User.js +15 -10
- package/dist/waterline-models/index.d.ts +2 -2
- package/dist/waterline-models/index.d.ts.map +1 -1
- package/dist/waterline-models/index.js +4 -4
- package/package.json +46 -59
- package/dist/AttachmentStagingIdentity.d.ts +0 -3
- package/dist/AttachmentStagingIdentity.d.ts.map +0 -1
- package/dist/AttachmentStagingIdentity.js +0 -10
- package/dist/RecordConcurrencyObservability.d.ts +0 -51
- package/dist/RecordConcurrencyObservability.d.ts.map +0 -1
- package/dist/RecordConcurrencyObservability.js +0 -136
- package/dist/RecordEntityTag.d.ts +0 -31
- package/dist/RecordEntityTag.d.ts.map +0 -1
- package/dist/RecordEntityTag.js +0 -101
- package/dist/RecordFormFingerprint.d.ts +0 -7
- package/dist/RecordFormFingerprint.d.ts.map +0 -1
- package/dist/RecordFormFingerprint.js +0 -106
- package/dist/RecordHttpConcurrency.d.ts +0 -60
- package/dist/RecordHttpConcurrency.d.ts.map +0 -1
- package/dist/RecordHttpConcurrency.js +0 -181
- package/dist/RecordSaveResponse.d.ts +0 -219
- package/dist/RecordSaveResponse.d.ts.map +0 -1
- package/dist/RecordSaveResponse.js +0 -639
- package/dist/RecordStorageConcurrency.d.ts +0 -48
- package/dist/RecordStorageConcurrency.d.ts.map +0 -1
- package/dist/RecordStorageConcurrency.js +0 -103
- package/dist/RecordWriteClassification.d.ts +0 -12
- package/dist/RecordWriteClassification.d.ts.map +0 -1
- package/dist/RecordWriteClassification.js +0 -70
- package/dist/action-execution/audit.d.ts +0 -41
- package/dist/action-execution/audit.d.ts.map +0 -1
- package/dist/action-execution/audit.js +0 -122
- package/dist/action-execution/executor.d.ts +0 -24
- package/dist/action-execution/executor.d.ts.map +0 -1
- package/dist/action-execution/executor.js +0 -435
- package/dist/action-execution/failure.d.ts +0 -49
- package/dist/action-execution/failure.d.ts.map +0 -1
- package/dist/action-execution/failure.js +0 -129
- package/dist/action-execution/index.d.ts +0 -7
- package/dist/action-execution/index.d.ts.map +0 -1
- package/dist/action-execution/index.js +0 -23
- package/dist/action-execution/legacy-result.d.ts +0 -21
- package/dist/action-execution/legacy-result.d.ts.map +0 -1
- package/dist/action-execution/legacy-result.js +0 -70
- package/dist/action-execution/policy.d.ts +0 -12
- package/dist/action-execution/policy.d.ts.map +0 -1
- package/dist/action-execution/policy.js +0 -138
- package/dist/action-execution/types.d.ts +0 -121
- package/dist/action-execution/types.d.ts.map +0 -1
- package/dist/action-execution/types.js +0 -22
- package/dist/api-routes/groups/record-schemas.d.ts +0 -5
- package/dist/api-routes/groups/record-schemas.d.ts.map +0 -1
- package/dist/api-routes/groups/record-schemas.js +0 -181
- package/dist/api-routes/record-schema-openapi.d.ts +0 -26
- package/dist/api-routes/record-schema-openapi.d.ts.map +0 -1
- package/dist/api-routes/record-schema-openapi.js +0 -38
- package/dist/api-routes/record-schema-response.d.ts +0 -40
- package/dist/api-routes/record-schema-response.d.ts.map +0 -1
- package/dist/api-routes/record-schema-response.js +0 -89
- package/dist/config/recordSchema.config.d.ts +0 -68
- package/dist/config/recordSchema.config.d.ts.map +0 -1
- package/dist/config/recordSchema.config.js +0 -173
- package/dist/config/recordValidation.config.d.ts +0 -19
- package/dist/config/recordValidation.config.d.ts.map +0 -1
- package/dist/config/recordValidation.config.js +0 -10
- package/dist/configmodels/DashboardFieldCatalogue.d.ts +0 -67
- package/dist/configmodels/DashboardFieldCatalogue.d.ts.map +0 -1
- package/dist/configmodels/DashboardFieldCatalogue.js +0 -174
- package/dist/configmodels/DashboardSettings.d.ts +0 -191
- package/dist/configmodels/DashboardSettings.d.ts.map +0 -1
- package/dist/configmodels/DashboardSettings.js +0 -705
- package/dist/configmodels/OniPublishing.d.ts +0 -205
- package/dist/configmodels/OniPublishing.d.ts.map +0 -1
- package/dist/configmodels/OniPublishing.js +0 -335
- package/dist/configmodels/RaidPublishing.d.ts +0 -97
- package/dist/configmodels/RaidPublishing.d.ts.map +0 -1
- package/dist/configmodels/RaidPublishing.js +0 -35
- package/dist/configmodels/WebAnalytics.d.ts +0 -55
- package/dist/configmodels/WebAnalytics.d.ts.map +0 -1
- package/dist/configmodels/WebAnalytics.js +0 -61
- package/dist/controllers/BrandingControllerSupport.d.ts +0 -20
- package/dist/controllers/BrandingControllerSupport.d.ts.map +0 -1
- package/dist/controllers/BrandingControllerSupport.js +0 -80
- package/dist/controllers/webservice/RecordSchemaController.d.ts +0 -32
- package/dist/controllers/webservice/RecordSchemaController.d.ts.map +0 -1
- package/dist/controllers/webservice/RecordSchemaController.js +0 -356
- package/dist/model/BrandingTypeface.d.ts +0 -70
- package/dist/model/BrandingTypeface.d.ts.map +0 -1
- package/dist/model/BrandingTypeface.js +0 -116
- package/dist/model/record-contract.d.ts +0 -42
- package/dist/model/record-contract.d.ts.map +0 -1
- package/dist/model/record-contract.js +0 -3
- package/dist/model/storage/record-schema.d.ts +0 -115
- package/dist/model/storage/record-schema.d.ts.map +0 -1
- package/dist/model/storage/record-schema.js +0 -3
- package/dist/record-contract/ajv-error-mapper.d.ts +0 -34
- package/dist/record-contract/ajv-error-mapper.d.ts.map +0 -1
- package/dist/record-contract/ajv-error-mapper.js +0 -153
- package/dist/record-contract/canonical-json.d.ts +0 -20
- package/dist/record-contract/canonical-json.d.ts.map +0 -1
- package/dist/record-contract/canonical-json.js +0 -126
- package/dist/record-contract/codes.d.ts +0 -36
- package/dist/record-contract/codes.d.ts.map +0 -1
- package/dist/record-contract/codes.js +0 -38
- package/dist/record-contract/contributor-registry.d.ts +0 -76
- package/dist/record-contract/contributor-registry.d.ts.map +0 -1
- package/dist/record-contract/contributor-registry.js +0 -126
- package/dist/record-contract/core-contributors.d.ts +0 -44
- package/dist/record-contract/core-contributors.d.ts.map +0 -1
- package/dist/record-contract/core-contributors.js +0 -395
- package/dist/record-contract/deep-freeze.d.ts +0 -3
- package/dist/record-contract/deep-freeze.d.ts.map +0 -1
- package/dist/record-contract/deep-freeze.js +0 -23
- package/dist/record-contract/index.d.ts +0 -13
- package/dist/record-contract/index.d.ts.map +0 -1
- package/dist/record-contract/index.js +0 -29
- package/dist/record-contract/json-pointer.d.ts +0 -20
- package/dist/record-contract/json-pointer.d.ts.map +0 -1
- package/dist/record-contract/json-pointer.js +0 -70
- package/dist/record-contract/json-schema-renderer.d.ts +0 -51
- package/dist/record-contract/json-schema-renderer.d.ts.map +0 -1
- package/dist/record-contract/json-schema-renderer.js +0 -450
- package/dist/record-contract/record-contract-compiler.d.ts +0 -42
- package/dist/record-contract/record-contract-compiler.d.ts.map +0 -1
- package/dist/record-contract/record-contract-compiler.js +0 -775
- package/dist/record-contract/record-contract-context.d.ts +0 -91
- package/dist/record-contract/record-contract-context.d.ts.map +0 -1
- package/dist/record-contract/record-contract-context.js +0 -39
- package/dist/record-contract/record-json-schema-artifact.d.ts +0 -74
- package/dist/record-contract/record-json-schema-artifact.d.ts.map +0 -1
- package/dist/record-contract/record-json-schema-artifact.js +0 -309
- package/dist/record-contract/record-json-schema-etag.d.ts +0 -15
- package/dist/record-contract/record-json-schema-etag.d.ts.map +0 -1
- package/dist/record-contract/record-json-schema-etag.js +0 -41
- package/dist/record-contract/types.d.ts +0 -151
- package/dist/record-contract/types.d.ts.map +0 -1
- package/dist/record-contract/types.js +0 -6
- package/dist/services/BrandingTypefaceService.d.ts +0 -74
- package/dist/services/BrandingTypefaceService.d.ts.map +0 -1
- package/dist/services/BrandingTypefaceService.js +0 -359
- package/dist/services/BrandingWoff2Inspector.d.ts +0 -17
- package/dist/services/BrandingWoff2Inspector.d.ts.map +0 -1
- package/dist/services/BrandingWoff2Inspector.js +0 -402
- package/dist/services/DashboardLegacyConversion.d.ts +0 -82
- package/dist/services/DashboardLegacyConversion.d.ts.map +0 -1
- package/dist/services/DashboardLegacyConversion.js +0 -427
- package/dist/services/RecordSchemaService.d.ts +0 -440
- package/dist/services/RecordSchemaService.d.ts.map +0 -1
- package/dist/services/RecordSchemaService.js +0 -3061
- package/dist/services/RecordValidationService.d.ts +0 -340
- package/dist/services/RecordValidationService.d.ts.map +0 -1
- package/dist/services/RecordValidationService.js +0 -1898
- package/dist/services/form-record-access-user.d.ts +0 -3
- package/dist/services/form-record-access-user.d.ts.map +0 -1
- package/dist/services/form-record-access-user.js +0 -23
- package/dist/services/integration-v2/bindings.d.ts +0 -3
- package/dist/services/integration-v2/bindings.d.ts.map +0 -1
- package/dist/services/integration-v2/bindings.js +0 -91
- package/dist/services/integration-v2/runtime.d.ts +0 -3
- package/dist/services/integration-v2/runtime.d.ts.map +0 -1
- package/dist/services/integration-v2/runtime.js +0 -50
- package/dist/services/internal-record-schema-authorization.d.ts +0 -8
- package/dist/services/internal-record-schema-authorization.d.ts.map +0 -1
- package/dist/services/internal-record-schema-authorization.js +0 -16
- package/dist/services/oni-v2/audit.d.ts +0 -19
- package/dist/services/oni-v2/audit.d.ts.map +0 -1
- package/dist/services/oni-v2/audit.js +0 -50
- package/dist/services/oni-v2/bindings.d.ts +0 -7
- package/dist/services/oni-v2/bindings.d.ts.map +0 -1
- package/dist/services/oni-v2/bindings.js +0 -31
- package/dist/services/oni-v2/config.d.ts +0 -12
- package/dist/services/oni-v2/config.d.ts.map +0 -1
- package/dist/services/oni-v2/config.js +0 -134
- package/dist/services/oni-v2/context.d.ts +0 -3
- package/dist/services/oni-v2/context.d.ts.map +0 -1
- package/dist/services/oni-v2/context.js +0 -17
- package/dist/services/oni-v2/crate.d.ts +0 -17
- package/dist/services/oni-v2/crate.d.ts.map +0 -1
- package/dist/services/oni-v2/crate.js +0 -504
- package/dist/services/oni-v2/flydriveOcflStore.d.ts +0 -69
- package/dist/services/oni-v2/flydriveOcflStore.d.ts.map +0 -1
- package/dist/services/oni-v2/flydriveOcflStore.js +0 -325
- package/dist/services/oni-v2/ingestion.d.ts +0 -37
- package/dist/services/oni-v2/ingestion.d.ts.map +0 -1
- package/dist/services/oni-v2/ingestion.js +0 -91
- package/dist/services/oni-v2/mapping.d.ts +0 -17
- package/dist/services/oni-v2/mapping.d.ts.map +0 -1
- package/dist/services/oni-v2/mapping.js +0 -137
- package/dist/services/oni-v2/repository.d.ts +0 -9
- package/dist/services/oni-v2/repository.d.ts.map +0 -1
- package/dist/services/oni-v2/repository.js +0 -180
- package/dist/services/oni-v2/runtime.d.ts +0 -23
- package/dist/services/oni-v2/runtime.d.ts.map +0 -1
- package/dist/services/oni-v2/runtime.js +0 -121
- package/dist/services/oni-v2/templating.d.ts +0 -11
- package/dist/services/oni-v2/templating.d.ts.map +0 -1
- package/dist/services/oni-v2/templating.js +0 -27
- package/dist/services/oni-v2/types.d.ts +0 -100
- package/dist/services/oni-v2/types.d.ts.map +0 -1
- package/dist/services/oni-v2/types.js +0 -3
- package/dist/services/raid-v2/audit.d.ts +0 -10
- package/dist/services/raid-v2/audit.d.ts.map +0 -1
- package/dist/services/raid-v2/audit.js +0 -29
- package/dist/services/raid-v2/errors.d.ts +0 -85
- package/dist/services/raid-v2/errors.d.ts.map +0 -1
- package/dist/services/raid-v2/errors.js +0 -36
- package/dist/services/raid-v2/http.d.ts +0 -4
- package/dist/services/raid-v2/http.d.ts.map +0 -1
- package/dist/services/raid-v2/http.js +0 -84
- package/dist/services/raid-v2/logger.d.ts +0 -8
- package/dist/services/raid-v2/logger.d.ts.map +0 -1
- package/dist/services/raid-v2/logger.js +0 -30
- package/dist/services/raid-v2/mapping.d.ts +0 -9
- package/dist/services/raid-v2/mapping.d.ts.map +0 -1
- package/dist/services/raid-v2/mapping.js +0 -168
- package/dist/services/raid-v2/runtime.d.ts +0 -5
- package/dist/services/raid-v2/runtime.d.ts.map +0 -1
- package/dist/services/raid-v2/runtime.js +0 -135
- package/dist/services/raid-v2/tags.d.ts +0 -11
- package/dist/services/raid-v2/tags.d.ts.map +0 -1
- package/dist/services/raid-v2/tags.js +0 -12
- package/dist/services/raid-v2/types.d.ts +0 -66
- package/dist/services/raid-v2/types.d.ts.map +0 -1
- package/dist/services/raid-v2/types.js +0 -3
- package/dist/services/record-hooks/coordinator.d.ts +0 -64
- package/dist/services/record-hooks/coordinator.d.ts.map +0 -1
- package/dist/services/record-hooks/coordinator.js +0 -276
- package/dist/visitor/related-object-data-inline.visitor.d.ts +0 -31
- package/dist/visitor/related-object-data-inline.visitor.d.ts.map +0 -1
- package/dist/visitor/related-object-data-inline.visitor.js +0 -96
- package/dist/waterline-models/DashboardConfiguration.d.ts +0 -29
- package/dist/waterline-models/DashboardConfiguration.d.ts.map +0 -1
- package/dist/waterline-models/DashboardConfiguration.js +0 -52
|
@@ -1,775 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RecordContractCompiler = void 0;
|
|
4
|
-
const sails_ng_common_1 = require("@researchdatabox/sails-ng-common");
|
|
5
|
-
const perf_hooks_1 = require("perf_hooks");
|
|
6
|
-
const codes_1 = require("./codes");
|
|
7
|
-
const deep_freeze_1 = require("./deep-freeze");
|
|
8
|
-
const json_pointer_1 = require("./json-pointer");
|
|
9
|
-
const core_contributors_1 = require("./core-contributors");
|
|
10
|
-
const record_contract_context_1 = require("./record-contract-context");
|
|
11
|
-
const noopFormOverrideLog = () => undefined;
|
|
12
|
-
const FORM_OVERRIDE_LOGGER = Object.freeze({
|
|
13
|
-
silly: noopFormOverrideLog,
|
|
14
|
-
verbose: noopFormOverrideLog,
|
|
15
|
-
trace: noopFormOverrideLog,
|
|
16
|
-
debug: noopFormOverrideLog,
|
|
17
|
-
log: noopFormOverrideLog,
|
|
18
|
-
info: noopFormOverrideLog,
|
|
19
|
-
warn: noopFormOverrideLog,
|
|
20
|
-
error: noopFormOverrideLog,
|
|
21
|
-
crit: noopFormOverrideLog,
|
|
22
|
-
fatal: noopFormOverrideLog,
|
|
23
|
-
silent: noopFormOverrideLog,
|
|
24
|
-
blank: noopFormOverrideLog,
|
|
25
|
-
});
|
|
26
|
-
class CompilerFailure extends Error {
|
|
27
|
-
failureKind;
|
|
28
|
-
code;
|
|
29
|
-
diagnostic;
|
|
30
|
-
constructor(failureKind, code, diagnostic) {
|
|
31
|
-
super(diagnostic.message);
|
|
32
|
-
this.failureKind = failureKind;
|
|
33
|
-
this.code = code;
|
|
34
|
-
this.diagnostic = diagnostic;
|
|
35
|
-
this.name = 'RecordContractCompilerFailure';
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
class ContractNodeLimitError extends Error {
|
|
39
|
-
limit;
|
|
40
|
-
constructor(limit) {
|
|
41
|
-
super(`Contract node exceeded its ${limit} limit.`);
|
|
42
|
-
this.limit = limit;
|
|
43
|
-
this.name = 'ContractNodeLimitError';
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
class CloneDepthLimitError extends Error {
|
|
47
|
-
constructor() {
|
|
48
|
-
super('Contributor output exceeds the configured nesting-depth limit.');
|
|
49
|
-
this.name = 'CloneDepthLimitError';
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
function forkCompilerState(state) {
|
|
53
|
-
return {
|
|
54
|
-
definitions: { ...state.definitions },
|
|
55
|
-
diagnostics: [...state.diagnostics],
|
|
56
|
-
fieldOwners: { ...state.fieldOwners },
|
|
57
|
-
validatorSummaries: [...state.validatorSummaries],
|
|
58
|
-
activeDefinitions: new Set(state.activeDefinitions),
|
|
59
|
-
propertyCount: state.propertyCount,
|
|
60
|
-
partial: state.partial,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
function replaceRecord(target, source) {
|
|
64
|
-
for (const key of Object.keys(target)) {
|
|
65
|
-
delete target[key];
|
|
66
|
-
}
|
|
67
|
-
Object.assign(target, source);
|
|
68
|
-
}
|
|
69
|
-
function commitCompilerState(target, source) {
|
|
70
|
-
replaceRecord(target.definitions, source.definitions);
|
|
71
|
-
replaceRecord(target.fieldOwners, source.fieldOwners);
|
|
72
|
-
target.diagnostics.splice(0, target.diagnostics.length, ...source.diagnostics);
|
|
73
|
-
target.validatorSummaries.splice(0, target.validatorSummaries.length, ...source.validatorSummaries);
|
|
74
|
-
target.activeDefinitions.clear();
|
|
75
|
-
source.activeDefinitions.forEach(definition => target.activeDefinitions.add(definition));
|
|
76
|
-
target.propertyCount = source.propertyCount;
|
|
77
|
-
target.partial = source.partial;
|
|
78
|
-
}
|
|
79
|
-
function asRecord(value) {
|
|
80
|
-
return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
81
|
-
}
|
|
82
|
-
function contributorIdentity(registration) {
|
|
83
|
-
const contributor = registration.contributor;
|
|
84
|
-
return {
|
|
85
|
-
key: contributor.key,
|
|
86
|
-
version: contributor.version,
|
|
87
|
-
source: registration.source,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
function diagnosticSortKey(diagnostic) {
|
|
91
|
-
return [
|
|
92
|
-
diagnostic.code,
|
|
93
|
-
diagnostic.pointer ?? '',
|
|
94
|
-
diagnostic.componentType ?? '',
|
|
95
|
-
diagnostic.contributor?.key ?? '',
|
|
96
|
-
diagnostic.message,
|
|
97
|
-
].join('\u0000');
|
|
98
|
-
}
|
|
99
|
-
function summarySortKey(summary) {
|
|
100
|
-
return [summary.code, summary.pointers.join(','), summary.groups.join(','), summary.operations.join(',')].join('\u0000');
|
|
101
|
-
}
|
|
102
|
-
function isPlainObject(value) {
|
|
103
|
-
const prototype = Object.getPrototypeOf(value);
|
|
104
|
-
return prototype === Object.prototype || prototype === null;
|
|
105
|
-
}
|
|
106
|
-
function isNativeRegExp(value) {
|
|
107
|
-
return Object.getPrototypeOf(value) === RegExp.prototype;
|
|
108
|
-
}
|
|
109
|
-
function isNonPersistingContribution(value) {
|
|
110
|
-
if (value === null || typeof value !== 'object' || Array.isArray(value) || !isPlainObject(value)) {
|
|
111
|
-
return false;
|
|
112
|
-
}
|
|
113
|
-
const kind = Object.getOwnPropertyDescriptor(value, 'kind');
|
|
114
|
-
return kind?.enumerable === true && 'value' in kind && kind.value === 'non-persisting';
|
|
115
|
-
}
|
|
116
|
-
/** Clone without invoking accessors or accepting values JSON would silently rewrite. */
|
|
117
|
-
function cloneJsonSafe(value, path = '$', ancestors = new Set(), depth = 0, maxDepth = Number.MAX_SAFE_INTEGER, allowUndefined = false, allowRuntimeFormObjects = false) {
|
|
118
|
-
if (depth > maxDepth) {
|
|
119
|
-
throw new CloneDepthLimitError();
|
|
120
|
-
}
|
|
121
|
-
if (value === undefined && allowUndefined) {
|
|
122
|
-
return value;
|
|
123
|
-
}
|
|
124
|
-
if (value === null || typeof value === 'string' || typeof value === 'boolean') {
|
|
125
|
-
return value;
|
|
126
|
-
}
|
|
127
|
-
if (typeof value === 'number') {
|
|
128
|
-
if (!Number.isFinite(value)) {
|
|
129
|
-
throw new Error(`${path} contains a non-finite number.`);
|
|
130
|
-
}
|
|
131
|
-
return value;
|
|
132
|
-
}
|
|
133
|
-
if (typeof value !== 'object') {
|
|
134
|
-
throw new Error(`${path} contains a non-JSON ${typeof value} value.`);
|
|
135
|
-
}
|
|
136
|
-
if (ancestors.has(value)) {
|
|
137
|
-
throw new Error(`${path} contains a cycle.`);
|
|
138
|
-
}
|
|
139
|
-
ancestors.add(value);
|
|
140
|
-
try {
|
|
141
|
-
if (allowRuntimeFormObjects && isNativeRegExp(value)) {
|
|
142
|
-
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
143
|
-
if (Object.getOwnPropertySymbols(value).length > 0 ||
|
|
144
|
-
Object.keys(descriptors).some(key => key !== 'lastIndex') ||
|
|
145
|
-
!descriptors.lastIndex ||
|
|
146
|
-
!('value' in descriptors.lastIndex) ||
|
|
147
|
-
descriptors.lastIndex.enumerable) {
|
|
148
|
-
throw new Error(`${path} contains an extended RegExp.`);
|
|
149
|
-
}
|
|
150
|
-
// Form validator configuration permits RegExp values. Preserve their
|
|
151
|
-
// deterministic semantics without carrying the mutable lastIndex or
|
|
152
|
-
// RegExp prototype across the compiler boundary.
|
|
153
|
-
return { source: value.source, flags: value.flags };
|
|
154
|
-
}
|
|
155
|
-
if (Array.isArray(value)) {
|
|
156
|
-
if (Object.getOwnPropertySymbols(value).length > 0 || Object.keys(value).length !== value.length) {
|
|
157
|
-
throw new Error(`${path} contains a sparse or extended array.`);
|
|
158
|
-
}
|
|
159
|
-
return value.map((item, index) => cloneJsonSafe(item, `${path}[${index}]`, ancestors, depth + 1, maxDepth, allowUndefined, allowRuntimeFormObjects));
|
|
160
|
-
}
|
|
161
|
-
if (!allowRuntimeFormObjects && !isPlainObject(value)) {
|
|
162
|
-
throw new Error(`${path} is not a plain JSON object.`);
|
|
163
|
-
}
|
|
164
|
-
if (Object.getOwnPropertySymbols(value).length > 0) {
|
|
165
|
-
throw new Error(`${path} contains symbol properties.`);
|
|
166
|
-
}
|
|
167
|
-
const clone = {};
|
|
168
|
-
for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {
|
|
169
|
-
if (!descriptor.enumerable || !('value' in descriptor)) {
|
|
170
|
-
throw new Error(`${path}.${key} is not an enumerable data property.`);
|
|
171
|
-
}
|
|
172
|
-
clone[key] = cloneJsonSafe(descriptor.value, `${path}.${key}`, ancestors, depth + 1, maxDepth, allowUndefined, allowRuntimeFormObjects);
|
|
173
|
-
}
|
|
174
|
-
return clone;
|
|
175
|
-
}
|
|
176
|
-
finally {
|
|
177
|
-
ancestors.delete(value);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
function cloneCompilerInput(value, path, allowRuntimeFormObjects = false) {
|
|
181
|
-
return (0, deep_freeze_1.freezeDeep)(cloneJsonSafe(value, path, new Set(), 0, Number.MAX_SAFE_INTEGER, true, allowRuntimeFormObjects));
|
|
182
|
-
}
|
|
183
|
-
function snapshotCompileRequest(request) {
|
|
184
|
-
return Object.freeze({
|
|
185
|
-
// FormsService returns visitor-aware class instances. Snapshot only their
|
|
186
|
-
// enumerable data; prototype methods never cross the compiler boundary.
|
|
187
|
-
form: cloneCompilerInput(request.form, '$request.form', true),
|
|
188
|
-
context: (0, record_contract_context_1.snapshotRecordContractPublicContext)(request.context),
|
|
189
|
-
...(request.reusableFormDefinitions === undefined
|
|
190
|
-
? {}
|
|
191
|
-
: {
|
|
192
|
-
reusableFormDefinitions: cloneCompilerInput(request.reusableFormDefinitions, '$request.reusableFormDefinitions'),
|
|
193
|
-
}),
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
function isBoolean(value) {
|
|
197
|
-
return typeof value === 'boolean';
|
|
198
|
-
}
|
|
199
|
-
function validateCondition(condition, maximumDepth) {
|
|
200
|
-
const pending = [{ condition, depth: 0 }];
|
|
201
|
-
while (pending.length > 0) {
|
|
202
|
-
const current = pending.pop();
|
|
203
|
-
if (!current) {
|
|
204
|
-
continue;
|
|
205
|
-
}
|
|
206
|
-
if (current.depth > maximumDepth) {
|
|
207
|
-
throw new ContractNodeLimitError('depth');
|
|
208
|
-
}
|
|
209
|
-
const item = current.condition;
|
|
210
|
-
if (item.kind === 'exists' || item.kind === 'equals') {
|
|
211
|
-
(0, json_pointer_1.recordContractPointer)(item.pointer);
|
|
212
|
-
}
|
|
213
|
-
else if (item.kind === 'in') {
|
|
214
|
-
(0, json_pointer_1.recordContractPointer)(item.pointer);
|
|
215
|
-
if (!Array.isArray(item.values)) {
|
|
216
|
-
throw new Error('Condition values must be an array.');
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
else if (item.kind === 'not') {
|
|
220
|
-
pending.push({ condition: item.condition, depth: current.depth + 1 });
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
if (!Array.isArray(item.conditions) || item.conditions.length === 0) {
|
|
224
|
-
throw new Error('Combined conditions require at least one condition.');
|
|
225
|
-
}
|
|
226
|
-
for (const child of item.conditions) {
|
|
227
|
-
pending.push({ condition: child, depth: current.depth + 1 });
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
function validateContractNode(node, baseDepth, maxDepth, maxProperties) {
|
|
233
|
-
const pending = [{ node, depth: baseDepth }];
|
|
234
|
-
let propertyCount = 0;
|
|
235
|
-
while (pending.length > 0) {
|
|
236
|
-
const current = pending.pop();
|
|
237
|
-
if (!current) {
|
|
238
|
-
continue;
|
|
239
|
-
}
|
|
240
|
-
if (current.depth > maxDepth) {
|
|
241
|
-
throw new ContractNodeLimitError('depth');
|
|
242
|
-
}
|
|
243
|
-
const currentNode = current.node;
|
|
244
|
-
if (!isBoolean(currentNode.nullable)) {
|
|
245
|
-
throw new Error('Contract nodes require an explicit boolean nullability declaration.');
|
|
246
|
-
}
|
|
247
|
-
switch (currentNode.kind) {
|
|
248
|
-
case 'scalar':
|
|
249
|
-
if (!['string', 'number', 'integer', 'boolean'].includes(currentNode.scalarType)) {
|
|
250
|
-
throw new Error('Scalar node type is invalid.');
|
|
251
|
-
}
|
|
252
|
-
break;
|
|
253
|
-
case 'object': {
|
|
254
|
-
if (!['allow', 'declared'].includes(currentNode.unknownProperties)) {
|
|
255
|
-
throw new Error('Object node unknown-property policy is invalid.');
|
|
256
|
-
}
|
|
257
|
-
if (currentNode.properties === null ||
|
|
258
|
-
typeof currentNode.properties !== 'object' ||
|
|
259
|
-
Array.isArray(currentNode.properties)) {
|
|
260
|
-
throw new Error('Object node properties must be a plain object.');
|
|
261
|
-
}
|
|
262
|
-
const children = Object.values(currentNode.properties);
|
|
263
|
-
propertyCount += children.length;
|
|
264
|
-
if (propertyCount > maxProperties) {
|
|
265
|
-
throw new ContractNodeLimitError('properties');
|
|
266
|
-
}
|
|
267
|
-
for (const child of children) {
|
|
268
|
-
pending.push({ node: child, depth: current.depth + 1 });
|
|
269
|
-
}
|
|
270
|
-
break;
|
|
271
|
-
}
|
|
272
|
-
case 'array':
|
|
273
|
-
pending.push({ node: currentNode.items, depth: current.depth + 1 });
|
|
274
|
-
break;
|
|
275
|
-
case 'any':
|
|
276
|
-
break;
|
|
277
|
-
case 'conditional':
|
|
278
|
-
validateCondition(currentNode.condition, maxDepth - current.depth);
|
|
279
|
-
pending.push({ node: currentNode.thenNode, depth: current.depth + 1 });
|
|
280
|
-
if (currentNode.elseNode) {
|
|
281
|
-
pending.push({ node: currentNode.elseNode, depth: current.depth + 1 });
|
|
282
|
-
}
|
|
283
|
-
break;
|
|
284
|
-
default: {
|
|
285
|
-
const exhaustive = currentNode;
|
|
286
|
-
throw new Error(`Unknown contract node ${String(exhaustive)}.`);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
function estimatedBytes(value) {
|
|
292
|
-
return Buffer.byteLength(JSON.stringify(value), 'utf8');
|
|
293
|
-
}
|
|
294
|
-
function safeNames(values) {
|
|
295
|
-
if (!Array.isArray(values)) {
|
|
296
|
-
return [];
|
|
297
|
-
}
|
|
298
|
-
return [
|
|
299
|
-
...new Set(values.filter((value) => typeof value === 'string' && /^[A-Za-z0-9._:-]+$/.test(value))),
|
|
300
|
-
].sort();
|
|
301
|
-
}
|
|
302
|
-
function safeValidatorCode(value) {
|
|
303
|
-
if (typeof value !== 'string' || !/^[A-Za-z0-9._:-]+$/.test(value)) {
|
|
304
|
-
return 'form.custom';
|
|
305
|
-
}
|
|
306
|
-
const safeBuiltIns = new Set([
|
|
307
|
-
'any-of',
|
|
308
|
-
'different-values',
|
|
309
|
-
'doi',
|
|
310
|
-
'email',
|
|
311
|
-
'integer',
|
|
312
|
-
'max',
|
|
313
|
-
'maxLength',
|
|
314
|
-
'min',
|
|
315
|
-
'minLength',
|
|
316
|
-
'orcid',
|
|
317
|
-
'pattern',
|
|
318
|
-
'required',
|
|
319
|
-
'requiredTrue',
|
|
320
|
-
'url',
|
|
321
|
-
]);
|
|
322
|
-
return safeBuiltIns.has(value) ? `form.${value}` : 'form.custom';
|
|
323
|
-
}
|
|
324
|
-
function validatorPointer(validator, fallback) {
|
|
325
|
-
const target = asRecord(validator).targetField;
|
|
326
|
-
const dataModel = asRecord(target).dataModel;
|
|
327
|
-
return Array.isArray(dataModel)
|
|
328
|
-
? (0, json_pointer_1.recordContractPointerFromTokens)(dataModel.filter((value) => typeof value === 'string' || typeof value === 'number'))
|
|
329
|
-
: fallback;
|
|
330
|
-
}
|
|
331
|
-
class RecordContractCompiler {
|
|
332
|
-
registry;
|
|
333
|
-
limits;
|
|
334
|
-
constructor(registry, limits) {
|
|
335
|
-
this.registry = registry;
|
|
336
|
-
this.limits = limits;
|
|
337
|
-
}
|
|
338
|
-
async compile(request) {
|
|
339
|
-
const state = {
|
|
340
|
-
definitions: {},
|
|
341
|
-
diagnostics: [],
|
|
342
|
-
fieldOwners: {},
|
|
343
|
-
validatorSummaries: [],
|
|
344
|
-
activeDefinitions: new Set(),
|
|
345
|
-
propertyCount: 0,
|
|
346
|
-
partial: false,
|
|
347
|
-
};
|
|
348
|
-
try {
|
|
349
|
-
const snapshot = snapshotCompileRequest(request);
|
|
350
|
-
this.assertDepth(0, (0, json_pointer_1.recordContractPointer)(''));
|
|
351
|
-
const root = await this.compileChildren(snapshot.form.componentDefinitions ?? [], (0, json_pointer_1.recordContractPointer)(''), 0, snapshot, state);
|
|
352
|
-
this.collectValidators(snapshot.form.validators, (0, json_pointer_1.recordContractPointer)(''), snapshot.form, state);
|
|
353
|
-
this.validateNodeBounds(root, 0, (0, json_pointer_1.recordContractPointer)(''));
|
|
354
|
-
const contract = (0, deep_freeze_1.freezeDeep)({
|
|
355
|
-
root,
|
|
356
|
-
definitions: Object.fromEntries(Object.entries(state.definitions).sort(([left], [right]) => left.localeCompare(right))),
|
|
357
|
-
fieldOwners: Object.fromEntries(Object.entries(state.fieldOwners).sort(([left], [right]) => left.localeCompare(right))),
|
|
358
|
-
validatorSummaries: [...state.validatorSummaries].sort((left, right) => summarySortKey(left).localeCompare(summarySortKey(right))),
|
|
359
|
-
diagnostics: [...state.diagnostics].sort((left, right) => diagnosticSortKey(left).localeCompare(diagnosticSortKey(right))),
|
|
360
|
-
completeness: state.partial ? 'partial' : 'complete',
|
|
361
|
-
context: snapshot.context,
|
|
362
|
-
});
|
|
363
|
-
if (estimatedBytes(contract) > this.limits.maxDocumentBytes) {
|
|
364
|
-
throw this.limitFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.LIMIT_DOCUMENT_BYTES, 'The estimated record-contract output exceeds the configured document-byte limit.', (0, json_pointer_1.recordContractPointer)(''));
|
|
365
|
-
}
|
|
366
|
-
return Object.freeze({ kind: 'compiled', contract });
|
|
367
|
-
}
|
|
368
|
-
catch (error) {
|
|
369
|
-
const failure = error instanceof CompilerFailure
|
|
370
|
-
? error
|
|
371
|
-
: new CompilerFailure('invalid-contract', codes_1.RECORD_SCHEMA_PROBLEM_CODES.INVALID_CONTRACT, {
|
|
372
|
-
code: codes_1.RECORD_SCHEMA_PROBLEM_CODES.INVALID_CONTRACT,
|
|
373
|
-
severity: 'error',
|
|
374
|
-
message: error instanceof Error ? error.message : 'Record contract compilation failed.',
|
|
375
|
-
});
|
|
376
|
-
const diagnostics = [...state.diagnostics, failure.diagnostic].sort((left, right) => diagnosticSortKey(left).localeCompare(diagnosticSortKey(right)));
|
|
377
|
-
return Object.freeze({
|
|
378
|
-
kind: 'failed',
|
|
379
|
-
failureKind: failure.failureKind,
|
|
380
|
-
code: failure.code,
|
|
381
|
-
diagnostics: (0, deep_freeze_1.freezeDeep)(diagnostics),
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
async compileChildren(components, parent, depth, request, state, definitionKey) {
|
|
386
|
-
this.assertDepth(depth, parent);
|
|
387
|
-
const properties = {};
|
|
388
|
-
const roleFilteredComponents = new Map();
|
|
389
|
-
for (const component of components) {
|
|
390
|
-
if (this.isRoleFilteredDuplicate(component, roleFilteredComponents)) {
|
|
391
|
-
continue;
|
|
392
|
-
}
|
|
393
|
-
const contributions = await this.compileComponent(component, parent, depth + 1, request, state);
|
|
394
|
-
for (const [name, node] of contributions) {
|
|
395
|
-
if (Object.hasOwn(properties, name)) {
|
|
396
|
-
throw this.invalidFailure('record-contract.path-ownership-collision', `Multiple components attempted to own ${(0, json_pointer_1.joinRecordContractPointer)(parent, name)}.`, (0, json_pointer_1.joinRecordContractPointer)(parent, name));
|
|
397
|
-
}
|
|
398
|
-
properties[name] = node;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
return {
|
|
402
|
-
kind: 'object',
|
|
403
|
-
nullable: false,
|
|
404
|
-
properties: Object.fromEntries(Object.entries(properties).sort(([left], [right]) => left.localeCompare(right))),
|
|
405
|
-
unknownProperties: request.context.unknownProperties,
|
|
406
|
-
...(definitionKey ? { definitionKey } : {}),
|
|
407
|
-
};
|
|
408
|
-
}
|
|
409
|
-
async compileComponent(component, parent, depth, request, state) {
|
|
410
|
-
this.assertDepth(depth, parent);
|
|
411
|
-
if (!this.isAvailableInEditMode(component)) {
|
|
412
|
-
return [];
|
|
413
|
-
}
|
|
414
|
-
const reusableName = component.overrides?.reusableFormName;
|
|
415
|
-
if (typeof reusableName === 'string' && reusableName !== '') {
|
|
416
|
-
return this.compileReusable(component, reusableName, parent, depth, request, state);
|
|
417
|
-
}
|
|
418
|
-
component = this.applyEditModeName(component);
|
|
419
|
-
const componentType = component.component?.class;
|
|
420
|
-
if (typeof componentType !== 'string' || componentType.trim() === '') {
|
|
421
|
-
throw this.invalidFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.INVALID_CONTRACT, 'A form component has no stable component class.', parent);
|
|
422
|
-
}
|
|
423
|
-
const registration = this.registry.component(componentType);
|
|
424
|
-
if (!registration || registration.contributor.kind !== 'component') {
|
|
425
|
-
if (Object.hasOwn(core_contributors_1.CORE_RECORD_CONTRACT_COMPONENT_INVENTORY, componentType)) {
|
|
426
|
-
throw this.invalidFailure('record-contract.uncovered-core-component', `Core component ${componentType} has no record-contract contributor.`, parent, componentType);
|
|
427
|
-
}
|
|
428
|
-
return this.unsupportedComponent(component, parent, componentType, state);
|
|
429
|
-
}
|
|
430
|
-
const contributor = registration.contributor;
|
|
431
|
-
const identity = contributorIdentity(registration);
|
|
432
|
-
const fieldName = component.name;
|
|
433
|
-
const pointer = fieldName ? (0, json_pointer_1.joinRecordContractPointer)(parent, fieldName) : parent;
|
|
434
|
-
const contributionState = forkCompilerState(state);
|
|
435
|
-
this.collectValidators(component.model?.config?.validators, pointer, request.form, contributionState);
|
|
436
|
-
this.collectUnrepresentableExpressions(component, pointer, contributionState);
|
|
437
|
-
let contribution;
|
|
438
|
-
try {
|
|
439
|
-
const compileContext = Object.freeze({
|
|
440
|
-
component,
|
|
441
|
-
pointer,
|
|
442
|
-
publicContext: request.context,
|
|
443
|
-
compileChildren: async (children, childParent, options) => (0, deep_freeze_1.freezeDeep)(await this.compileChildren(cloneCompilerInput(children, `$contributor[${contributor.key}].children`), childParent, depth + 1, request, contributionState, options?.definitionKey)),
|
|
444
|
-
});
|
|
445
|
-
contribution = await this.withTimeout(() => contributor.compile(compileContext), contributor.key, pointer);
|
|
446
|
-
const allowRuntimeChildren = isNonPersistingContribution(contribution);
|
|
447
|
-
contribution = cloneJsonSafe(contribution, `$contributor[${contributor.key}]`, new Set(), 0, this.limits.maxDepth + 8, allowRuntimeChildren);
|
|
448
|
-
if (estimatedBytes(contribution) > this.limits.maxDocumentBytes) {
|
|
449
|
-
throw this.limitFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.LIMIT_DOCUMENT_BYTES, `Contributor ${contributor.key} output exceeds the configured output estimate.`, pointer, componentType);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
catch (error) {
|
|
453
|
-
if (error instanceof CompilerFailure) {
|
|
454
|
-
throw error;
|
|
455
|
-
}
|
|
456
|
-
if (error instanceof CloneDepthLimitError) {
|
|
457
|
-
throw this.limitFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.LIMIT_DEPTH, `Record-contract contributor ${contributor.key} output exceeds the configured nesting-depth limit.`, pointer, componentType);
|
|
458
|
-
}
|
|
459
|
-
throw new CompilerFailure('contributor-failed', codes_1.RECORD_SCHEMA_PROBLEM_CODES.CONTRIBUTOR_FAILED, {
|
|
460
|
-
code: codes_1.RECORD_SCHEMA_PROBLEM_CODES.CONTRIBUTOR_FAILED,
|
|
461
|
-
severity: 'error',
|
|
462
|
-
message: `Record-contract contributor ${contributor.key} returned invalid output.`,
|
|
463
|
-
pointer,
|
|
464
|
-
componentType,
|
|
465
|
-
contributor: identity,
|
|
466
|
-
});
|
|
467
|
-
}
|
|
468
|
-
if (contribution.kind === 'non-persisting') {
|
|
469
|
-
if (!contribution.children || contribution.children.length === 0) {
|
|
470
|
-
commitCompilerState(state, contributionState);
|
|
471
|
-
return [];
|
|
472
|
-
}
|
|
473
|
-
const childNode = await this.compileChildren(contribution.children, parent, depth + 1, request, contributionState);
|
|
474
|
-
commitCompilerState(state, contributionState);
|
|
475
|
-
return Object.entries(childNode.properties);
|
|
476
|
-
}
|
|
477
|
-
if (!fieldName) {
|
|
478
|
-
throw this.invalidFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.INVALID_CONTRACT, `Persisting component ${componentType} has no metadata field name.`, parent, componentType);
|
|
479
|
-
}
|
|
480
|
-
try {
|
|
481
|
-
this.validateNodeBounds(contribution.node, depth, pointer);
|
|
482
|
-
this.assertNullability(contributor.nullability, contribution.node, contributor.key, pointer);
|
|
483
|
-
}
|
|
484
|
-
catch (error) {
|
|
485
|
-
if (error instanceof CompilerFailure && error.failureKind === 'limit-exceeded') {
|
|
486
|
-
throw error;
|
|
487
|
-
}
|
|
488
|
-
throw new CompilerFailure('contributor-failed', codes_1.RECORD_SCHEMA_PROBLEM_CODES.CONTRIBUTOR_FAILED, {
|
|
489
|
-
code: codes_1.RECORD_SCHEMA_PROBLEM_CODES.CONTRIBUTOR_FAILED,
|
|
490
|
-
severity: 'error',
|
|
491
|
-
message: `Record-contract contributor ${contributor.key} returned invalid output.`,
|
|
492
|
-
pointer,
|
|
493
|
-
componentType,
|
|
494
|
-
contributor: identity,
|
|
495
|
-
});
|
|
496
|
-
}
|
|
497
|
-
this.claimProperty(pointer, componentType, identity, contributionState);
|
|
498
|
-
for (const owned of contributor.ownedPointers) {
|
|
499
|
-
const ownedPointer = owned === '' ? pointer : (0, json_pointer_1.appendRecordContractPointer)(pointer, (0, json_pointer_1.recordContractPointer)(owned));
|
|
500
|
-
this.claimOwnedPointer(ownedPointer, componentType, identity, contributionState);
|
|
501
|
-
}
|
|
502
|
-
for (const diagnostic of contribution.diagnostics ?? []) {
|
|
503
|
-
this.addDiagnostic({ ...diagnostic, contributor: identity }, contributionState);
|
|
504
|
-
}
|
|
505
|
-
if (containsPermissiveNode(contribution.node)) {
|
|
506
|
-
contributionState.partial = true;
|
|
507
|
-
}
|
|
508
|
-
commitCompilerState(state, contributionState);
|
|
509
|
-
return [[fieldName, contribution.node]];
|
|
510
|
-
}
|
|
511
|
-
async compileReusable(component, name, parent, depth, request, state) {
|
|
512
|
-
const definition = request.reusableFormDefinitions?.[name];
|
|
513
|
-
if (!definition) {
|
|
514
|
-
throw this.invalidFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.INVALID_CONTRACT, `Reusable form definition ${name} does not exist.`, parent);
|
|
515
|
-
}
|
|
516
|
-
if (state.activeDefinitions.has(name)) {
|
|
517
|
-
throw this.invalidFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.INVALID_CONTRACT, `Reusable form definition cycle detected at ${name}.`, parent);
|
|
518
|
-
}
|
|
519
|
-
state.activeDefinitions.add(name);
|
|
520
|
-
try {
|
|
521
|
-
const reusableFormDefinitions = {};
|
|
522
|
-
for (const [definitionName, components] of Object.entries(request.reusableFormDefinitions ?? {})) {
|
|
523
|
-
// Reusable definitions are hook-extensible at the compiler boundary,
|
|
524
|
-
// while the shared form expander exposes the closed core component
|
|
525
|
-
// union. The runtime shape is the common FormComponentDefinitionFrame.
|
|
526
|
-
reusableFormDefinitions[definitionName] = [...components];
|
|
527
|
-
}
|
|
528
|
-
const expanded = new sails_ng_common_1.FormOverride(FORM_OVERRIDE_LOGGER).applyOverridesReusable([component], reusableFormDefinitions);
|
|
529
|
-
const effectiveComponents = expanded.map(expandedComponent => {
|
|
530
|
-
if (expandedComponent.name || !component.name) {
|
|
531
|
-
return expandedComponent;
|
|
532
|
-
}
|
|
533
|
-
const overrides = { ...expandedComponent.overrides };
|
|
534
|
-
delete overrides.replaceName;
|
|
535
|
-
return {
|
|
536
|
-
...expandedComponent,
|
|
537
|
-
name: component.name,
|
|
538
|
-
...(Object.keys(overrides).length > 0 ? { overrides } : { overrides: undefined }),
|
|
539
|
-
};
|
|
540
|
-
});
|
|
541
|
-
const compiled = await this.compileChildren(effectiveComponents, parent, depth + 1, request, state);
|
|
542
|
-
return Object.entries(compiled.properties).map(([propertyName, node]) => {
|
|
543
|
-
if (node.definitionKey) {
|
|
544
|
-
return [propertyName, node];
|
|
545
|
-
}
|
|
546
|
-
const definitionKey = `reusable:${JSON.stringify(name)}:property:${JSON.stringify(propertyName)}`;
|
|
547
|
-
const referencedNode = { ...node, definitionKey };
|
|
548
|
-
const prior = state.definitions[definitionKey];
|
|
549
|
-
if (prior && JSON.stringify(prior) !== JSON.stringify(referencedNode)) {
|
|
550
|
-
throw this.invalidFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.INVALID_CONTRACT, `Reusable form definition ${name} property ${propertyName} compiled inconsistently.`, parent);
|
|
551
|
-
}
|
|
552
|
-
state.definitions[definitionKey] = referencedNode;
|
|
553
|
-
return [propertyName, referencedNode];
|
|
554
|
-
});
|
|
555
|
-
}
|
|
556
|
-
finally {
|
|
557
|
-
state.activeDefinitions.delete(name);
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
isAvailableInEditMode(component) {
|
|
561
|
-
const allowModes = component.constraints?.allowModes;
|
|
562
|
-
return !Array.isArray(allowModes) || allowModes.length === 0 || allowModes.includes('edit');
|
|
563
|
-
}
|
|
564
|
-
/**
|
|
565
|
-
* Role-specific form variants can describe the same persisted field more
|
|
566
|
-
* than once. The record schema is role-independent, so retain the first
|
|
567
|
-
* variant when the role scopes are disjoint and let the client visitor pick
|
|
568
|
-
* the variant for the current user. Overlapping or unrestricted variants
|
|
569
|
-
* remain a contract error because they may represent a real collision.
|
|
570
|
-
*/
|
|
571
|
-
isRoleFilteredDuplicate(component, roleFilteredComponents) {
|
|
572
|
-
if (!component.model || !this.isAvailableInEditMode(component)) {
|
|
573
|
-
return false;
|
|
574
|
-
}
|
|
575
|
-
const fieldName = this.applyEditModeName(component).name;
|
|
576
|
-
const allowRoles = component.constraints?.authorization?.allowRoles;
|
|
577
|
-
if (!fieldName || !Array.isArray(allowRoles) || allowRoles.length === 0) {
|
|
578
|
-
return false;
|
|
579
|
-
}
|
|
580
|
-
const priorComponents = roleFilteredComponents.get(fieldName) ?? [];
|
|
581
|
-
const isDuplicate = priorComponents.some(priorComponent => {
|
|
582
|
-
const priorRoles = priorComponent.constraints?.authorization?.allowRoles;
|
|
583
|
-
return (Array.isArray(priorRoles) &&
|
|
584
|
-
priorRoles.length > 0 &&
|
|
585
|
-
allowRoles.every(role => !priorRoles.includes(role)));
|
|
586
|
-
});
|
|
587
|
-
priorComponents.push(component);
|
|
588
|
-
roleFilteredComponents.set(fieldName, priorComponents);
|
|
589
|
-
return isDuplicate;
|
|
590
|
-
}
|
|
591
|
-
applyEditModeName(component) {
|
|
592
|
-
const replaceName = component.overrides?.replaceName;
|
|
593
|
-
return replaceName === undefined || replaceName === component.name
|
|
594
|
-
? component
|
|
595
|
-
: { ...component, name: replaceName };
|
|
596
|
-
}
|
|
597
|
-
unsupportedComponent(component, parent, componentType, state) {
|
|
598
|
-
if (!component.name) {
|
|
599
|
-
throw this.invalidFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.INVALID_CONTRACT, `Unsupported component ${componentType} has no field name.`, parent, componentType);
|
|
600
|
-
}
|
|
601
|
-
const pointer = (0, json_pointer_1.joinRecordContractPointer)(parent, component.name);
|
|
602
|
-
const node = {
|
|
603
|
-
kind: 'any',
|
|
604
|
-
nullable: true,
|
|
605
|
-
reason: 'unsupported-component',
|
|
606
|
-
annotations: {
|
|
607
|
-
extensions: { 'x-redbox-unsupported-component': componentType },
|
|
608
|
-
},
|
|
609
|
-
};
|
|
610
|
-
this.claimProperty(pointer, componentType, undefined, state);
|
|
611
|
-
this.addDiagnostic({
|
|
612
|
-
code: 'x-redbox-unsupported-component',
|
|
613
|
-
severity: 'warning',
|
|
614
|
-
message: 'A custom component has no registered record-contract contributor and remains permissive.',
|
|
615
|
-
pointer,
|
|
616
|
-
componentType,
|
|
617
|
-
}, state);
|
|
618
|
-
state.partial = true;
|
|
619
|
-
return [[component.name, node]];
|
|
620
|
-
}
|
|
621
|
-
collectValidators(configured, fallbackPointer, form, state) {
|
|
622
|
-
for (const validator of configured ?? []) {
|
|
623
|
-
const groups = safeNames(validator.groups?.include);
|
|
624
|
-
const operations = Object.entries(form.validationOperations ?? {})
|
|
625
|
-
.filter(([, operation]) => {
|
|
626
|
-
const operationGroups = safeNames(operation.enabledValidationGroups);
|
|
627
|
-
return groups.length === 0 || operationGroups.some(group => groups.includes(group));
|
|
628
|
-
})
|
|
629
|
-
.map(([name]) => name)
|
|
630
|
-
.filter(name => /^[A-Za-z0-9._:-]+$/.test(name))
|
|
631
|
-
.sort();
|
|
632
|
-
state.validatorSummaries.push({
|
|
633
|
-
code: safeValidatorCode(validator.class),
|
|
634
|
-
pointers: [validatorPointer(validator, fallbackPointer)],
|
|
635
|
-
groups,
|
|
636
|
-
operations,
|
|
637
|
-
blocking: true,
|
|
638
|
-
});
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
collectUnrepresentableExpressions(component, pointer, state) {
|
|
642
|
-
const expressions = component.expressions ?? [];
|
|
643
|
-
if (expressions.length === 0) {
|
|
644
|
-
return;
|
|
645
|
-
}
|
|
646
|
-
this.addDiagnostic({
|
|
647
|
-
code: 'record-contract.unrepresentable-condition',
|
|
648
|
-
severity: 'warning',
|
|
649
|
-
message: 'Runtime component expressions are annotation-only and do not remove the field from the contract.',
|
|
650
|
-
pointer,
|
|
651
|
-
componentType: component.component.class,
|
|
652
|
-
}, state);
|
|
653
|
-
state.partial = true;
|
|
654
|
-
}
|
|
655
|
-
claimProperty(pointer, key, contributor, state, kind = 'component') {
|
|
656
|
-
if (state.fieldOwners[pointer]) {
|
|
657
|
-
throw this.invalidFailure('record-contract.path-ownership-collision', `Metadata path ${pointer} already has an owner.`, pointer);
|
|
658
|
-
}
|
|
659
|
-
state.propertyCount += 1;
|
|
660
|
-
if (state.propertyCount > this.limits.maxProperties) {
|
|
661
|
-
throw this.limitFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.LIMIT_PROPERTIES, 'The record contract exceeds the configured property limit.', pointer);
|
|
662
|
-
}
|
|
663
|
-
state.fieldOwners[pointer] = { kind, key, ...(contributor ? { contributor } : {}) };
|
|
664
|
-
}
|
|
665
|
-
claimOwnedPointer(pointer, key, contributor, state) {
|
|
666
|
-
const existing = state.fieldOwners[pointer];
|
|
667
|
-
if (existing && existing.contributor?.key !== contributor.key) {
|
|
668
|
-
throw this.invalidFailure('record-contract.path-ownership-collision', `Contributor ${contributor.key} attempted to overwrite ${pointer}.`, pointer);
|
|
669
|
-
}
|
|
670
|
-
if (!existing) {
|
|
671
|
-
state.fieldOwners[pointer] = { kind: 'component', key, contributor };
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
addDiagnostic(diagnostic, state) {
|
|
675
|
-
if (state.diagnostics.length >= this.limits.maxDiagnostics) {
|
|
676
|
-
throw this.limitFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.LIMIT_DIAGNOSTICS, 'The record contract exceeds the configured diagnostic limit.', diagnostic.pointer ?? (0, json_pointer_1.recordContractPointer)(''));
|
|
677
|
-
}
|
|
678
|
-
state.diagnostics.push(diagnostic);
|
|
679
|
-
if (diagnostic.code === 'x-redbox-unsupported-component' ||
|
|
680
|
-
diagnostic.code === 'record-contract.unrepresentable-condition' ||
|
|
681
|
-
diagnostic.code === 'record-contract.core-permissive-shape') {
|
|
682
|
-
state.partial = true;
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
assertDepth(depth, pointer) {
|
|
686
|
-
if (depth > this.limits.maxDepth) {
|
|
687
|
-
throw this.limitFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.LIMIT_DEPTH, 'The record contract exceeds the configured nesting-depth limit.', pointer);
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
assertNullability(policy, node, key, pointer) {
|
|
691
|
-
if ((policy === 'non-null' && node.nullable) || (policy === 'nullable' && !node.nullable)) {
|
|
692
|
-
throw this.invalidFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.CONTRIBUTOR_INVALID, `Contributor ${key} output contradicts its declared nullability policy.`, pointer);
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
validateNodeBounds(node, baseDepth, pointer) {
|
|
696
|
-
try {
|
|
697
|
-
validateContractNode(node, baseDepth, this.limits.maxDepth, this.limits.maxProperties);
|
|
698
|
-
}
|
|
699
|
-
catch (error) {
|
|
700
|
-
if (error instanceof ContractNodeLimitError) {
|
|
701
|
-
if (error.limit === 'depth') {
|
|
702
|
-
throw this.limitFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.LIMIT_DEPTH, 'Contributor output exceeds the configured nesting-depth limit.', pointer);
|
|
703
|
-
}
|
|
704
|
-
throw this.limitFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.LIMIT_PROPERTIES, 'Contributor output exceeds the configured property limit.', pointer);
|
|
705
|
-
}
|
|
706
|
-
throw error;
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
async withTimeout(invoke, key, pointer) {
|
|
710
|
-
// JavaScript cannot pre-empt a synchronous callback. Charge its measured
|
|
711
|
-
// elapsed time immediately, then give asynchronous completion only the
|
|
712
|
-
// remaining budget and verify total elapsed time again after settlement.
|
|
713
|
-
const startedAt = perf_hooks_1.performance.now();
|
|
714
|
-
const timeoutFailure = () => this.limitFailure(codes_1.RECORD_SCHEMA_PROBLEM_CODES.LIMIT_CONTRIBUTOR_TIMEOUT, `Record-contract contributor ${key} exceeded its configured timeout.`, pointer);
|
|
715
|
-
const pending = invoke();
|
|
716
|
-
const synchronousElapsedMs = perf_hooks_1.performance.now() - startedAt;
|
|
717
|
-
if (synchronousElapsedMs > this.limits.contributorTimeoutMs) {
|
|
718
|
-
throw timeoutFailure();
|
|
719
|
-
}
|
|
720
|
-
let timeout;
|
|
721
|
-
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
722
|
-
timeout = setTimeout(() => reject(timeoutFailure()), this.limits.contributorTimeoutMs - synchronousElapsedMs);
|
|
723
|
-
});
|
|
724
|
-
try {
|
|
725
|
-
const result = await Promise.race([Promise.resolve(pending), timeoutPromise]);
|
|
726
|
-
if (perf_hooks_1.performance.now() - startedAt > this.limits.contributorTimeoutMs) {
|
|
727
|
-
throw timeoutFailure();
|
|
728
|
-
}
|
|
729
|
-
return result;
|
|
730
|
-
}
|
|
731
|
-
finally {
|
|
732
|
-
if (timeout) {
|
|
733
|
-
clearTimeout(timeout);
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
invalidFailure(code, message, pointer, componentType) {
|
|
738
|
-
return new CompilerFailure('invalid-contract', codes_1.RECORD_SCHEMA_PROBLEM_CODES.INVALID_CONTRACT, {
|
|
739
|
-
code,
|
|
740
|
-
severity: 'error',
|
|
741
|
-
message,
|
|
742
|
-
pointer,
|
|
743
|
-
...(componentType ? { componentType } : {}),
|
|
744
|
-
});
|
|
745
|
-
}
|
|
746
|
-
limitFailure(code, message, pointer, componentType) {
|
|
747
|
-
return new CompilerFailure('limit-exceeded', code, {
|
|
748
|
-
code,
|
|
749
|
-
severity: 'error',
|
|
750
|
-
message,
|
|
751
|
-
pointer,
|
|
752
|
-
...(componentType ? { componentType } : {}),
|
|
753
|
-
});
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
exports.RecordContractCompiler = RecordContractCompiler;
|
|
757
|
-
function containsPermissiveNode(node) {
|
|
758
|
-
switch (node.kind) {
|
|
759
|
-
case 'any':
|
|
760
|
-
return node.reason !== undefined;
|
|
761
|
-
case 'array':
|
|
762
|
-
return containsPermissiveNode(node.items);
|
|
763
|
-
case 'object':
|
|
764
|
-
return Object.values(node.properties).some(containsPermissiveNode);
|
|
765
|
-
case 'conditional':
|
|
766
|
-
return containsPermissiveNode(node.thenNode) || (node.elseNode ? containsPermissiveNode(node.elseNode) : false);
|
|
767
|
-
case 'scalar':
|
|
768
|
-
return false;
|
|
769
|
-
default: {
|
|
770
|
-
const exhaustive = node;
|
|
771
|
-
return exhaustive;
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLWNvbnRyYWN0LWNvbXBpbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlY29yZC1jb250cmFjdC9yZWNvcmQtY29udHJhY3QtY29tcGlsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU0Esc0VBQWdFO0FBQ2hFLDJDQUF5QztBQUd6QyxtQ0FBc0Q7QUFDdEQsK0NBQTJDO0FBbUIzQyxpREFLd0I7QUFDeEIsMkRBQStFO0FBQy9FLHVFQUFrSDtBQUlsSCxNQUFNLG1CQUFtQixHQUFHLEdBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQztBQUNsRCxNQUFNLG9CQUFvQixHQUFZLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEQsS0FBSyxFQUFFLG1CQUFtQjtJQUMxQixPQUFPLEVBQUUsbUJBQW1CO0lBQzVCLEtBQUssRUFBRSxtQkFBbUI7SUFDMUIsS0FBSyxFQUFFLG1CQUFtQjtJQUMxQixHQUFHLEVBQUUsbUJBQW1CO0lBQ3hCLElBQUksRUFBRSxtQkFBbUI7SUFDekIsSUFBSSxFQUFFLG1CQUFtQjtJQUN6QixLQUFLLEVBQUUsbUJBQW1CO0lBQzFCLElBQUksRUFBRSxtQkFBbUI7SUFDekIsS0FBSyxFQUFFLG1CQUFtQjtJQUMxQixNQUFNLEVBQUUsbUJBQW1CO0lBQzNCLEtBQUssRUFBRSxtQkFBbUI7Q0FDM0IsQ0FBQyxDQUFDO0FBUUgsTUFBTSxlQUFnQixTQUFRLEtBQUs7SUFFZjtJQUNBO0lBQ0E7SUFIbEIsWUFDa0IsV0FBeUUsRUFDekUsSUFBb0YsRUFDcEYsVUFBb0M7UUFFcEQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUpWLGdCQUFXLEdBQVgsV0FBVyxDQUE4RDtRQUN6RSxTQUFJLEdBQUosSUFBSSxDQUFnRjtRQUNwRixlQUFVLEdBQVYsVUFBVSxDQUEwQjtRQUdwRCxJQUFJLENBQUMsSUFBSSxHQUFHLCtCQUErQixDQUFDO0lBQzlDLENBQUM7Q0FDRjtBQUVELE1B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
|