@researchdatabox/redbox-core 5.0.4 → 5.1.0-beta.12568
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/AttachmentStagingIdentity.d.ts +3 -0
- package/dist/AttachmentStagingIdentity.d.ts.map +1 -0
- package/dist/AttachmentStagingIdentity.js +10 -0
- package/dist/CoreController.d.ts +7 -3
- package/dist/CoreController.d.ts.map +1 -1
- package/dist/CoreController.js +85 -3
- package/dist/DatastreamService.d.ts +5 -1
- package/dist/DatastreamService.d.ts.map +1 -1
- package/dist/HarvestRunService.d.ts +4 -3
- package/dist/HarvestRunService.d.ts.map +1 -1
- package/dist/HarvestRunService.js +1 -1
- package/dist/RecordConcurrencyObservability.d.ts +51 -0
- package/dist/RecordConcurrencyObservability.d.ts.map +1 -0
- package/dist/RecordConcurrencyObservability.js +136 -0
- package/dist/RecordEntityTag.d.ts +31 -0
- package/dist/RecordEntityTag.d.ts.map +1 -0
- package/dist/RecordEntityTag.js +101 -0
- package/dist/RecordFormFingerprint.d.ts +7 -0
- package/dist/RecordFormFingerprint.d.ts.map +1 -0
- package/dist/RecordFormFingerprint.js +106 -0
- package/dist/RecordHttpConcurrency.d.ts +60 -0
- package/dist/RecordHttpConcurrency.d.ts.map +1 -0
- package/dist/RecordHttpConcurrency.js +181 -0
- package/dist/RecordSaveResponse.d.ts +219 -0
- package/dist/RecordSaveResponse.d.ts.map +1 -0
- package/dist/RecordSaveResponse.js +639 -0
- package/dist/RecordStorageConcurrency.d.ts +49 -0
- package/dist/RecordStorageConcurrency.d.ts.map +1 -0
- package/dist/RecordStorageConcurrency.js +103 -0
- package/dist/RecordWriteClassification.d.ts +12 -0
- package/dist/RecordWriteClassification.d.ts.map +1 -0
- package/dist/RecordWriteClassification.js +70 -0
- package/dist/RecordsService.d.ts +109 -13
- package/dist/RecordsService.d.ts.map +1 -1
- package/dist/RecordsService.js +44 -1
- package/dist/SearchService.d.ts +2 -1
- package/dist/SearchService.d.ts.map +1 -1
- package/dist/StorageService.d.ts +49 -9
- package/dist/StorageService.d.ts.map +1 -1
- package/dist/StorageService.js +19 -1
- package/dist/StorageServiceResponse.d.ts +22 -1
- package/dist/StorageServiceResponse.d.ts.map +1 -1
- package/dist/StorageServiceResponse.js +22 -4
- package/dist/action-execution/audit.d.ts +41 -0
- package/dist/action-execution/audit.d.ts.map +1 -0
- package/dist/action-execution/audit.js +122 -0
- package/dist/action-execution/executor.d.ts +24 -0
- package/dist/action-execution/executor.d.ts.map +1 -0
- package/dist/action-execution/executor.js +435 -0
- package/dist/action-execution/failure.d.ts +49 -0
- package/dist/action-execution/failure.d.ts.map +1 -0
- package/dist/action-execution/failure.js +129 -0
- package/dist/action-execution/index.d.ts +7 -0
- package/dist/action-execution/index.d.ts.map +1 -0
- package/dist/action-execution/index.js +23 -0
- package/dist/action-execution/legacy-result.d.ts +21 -0
- package/dist/action-execution/legacy-result.d.ts.map +1 -0
- package/dist/action-execution/legacy-result.js +70 -0
- package/dist/action-execution/policy.d.ts +12 -0
- package/dist/action-execution/policy.d.ts.map +1 -0
- package/dist/action-execution/policy.js +138 -0
- package/dist/action-execution/types.d.ts +121 -0
- package/dist/action-execution/types.d.ts.map +1 -0
- package/dist/action-execution/types.js +22 -0
- package/dist/api-routes/groups/branding.d.ts +8 -0
- package/dist/api-routes/groups/branding.d.ts.map +1 -1
- package/dist/api-routes/groups/branding.js +86 -11
- package/dist/api-routes/groups/dashboard-config.d.ts +12 -9
- package/dist/api-routes/groups/dashboard-config.d.ts.map +1 -1
- package/dist/api-routes/groups/dashboard-config.js +136 -73
- package/dist/api-routes/groups/forms.d.ts.map +1 -1
- package/dist/api-routes/groups/forms.js +10 -2
- package/dist/api-routes/groups/record-schemas.d.ts +5 -0
- package/dist/api-routes/groups/record-schemas.d.ts.map +1 -0
- package/dist/api-routes/groups/record-schemas.js +181 -0
- package/dist/api-routes/groups/records.d.ts +1 -0
- package/dist/api-routes/groups/records.d.ts.map +1 -1
- package/dist/api-routes/groups/records.js +141 -26
- package/dist/api-routes/index.d.ts +3 -0
- package/dist/api-routes/index.d.ts.map +1 -1
- package/dist/api-routes/index.js +4 -1
- package/dist/api-routes/openapi.d.ts.map +1 -1
- package/dist/api-routes/openapi.js +7 -5
- package/dist/api-routes/record-schema-openapi.d.ts +26 -0
- package/dist/api-routes/record-schema-openapi.d.ts.map +1 -0
- package/dist/api-routes/record-schema-openapi.js +38 -0
- package/dist/api-routes/record-schema-response.d.ts +40 -0
- package/dist/api-routes/record-schema-response.d.ts.map +1 -0
- package/dist/api-routes/record-schema-response.js +89 -0
- package/dist/api-routes/request-extraction.d.ts.map +1 -1
- package/dist/api-routes/request-extraction.js +10 -8
- package/dist/api-routes/route-factory.d.ts.map +1 -1
- package/dist/api-routes/route-factory.js +2 -1
- package/dist/api-routes/route-registry.d.ts.map +1 -1
- package/dist/api-routes/route-registry.js +3 -1
- package/dist/api-routes/schemas/common.d.ts +36 -0
- package/dist/api-routes/schemas/common.d.ts.map +1 -1
- package/dist/api-routes/schemas/common.js +95 -5
- package/dist/api-routes/schemas/responses.d.ts +1424 -1
- package/dist/api-routes/schemas/responses.d.ts.map +1 -1
- package/dist/api-routes/schemas/responses.js +382 -60
- package/dist/api-routes/types.d.ts +1 -0
- package/dist/api-routes/types.d.ts.map +1 -1
- package/dist/api-routes/validation.d.ts +5 -1
- package/dist/api-routes/validation.d.ts.map +1 -1
- package/dist/api-routes/validation.js +14 -15
- package/dist/bootstrap.d.ts +3 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +58 -41
- package/dist/config/agendaQueue.config.d.ts +3 -0
- package/dist/config/agendaQueue.config.d.ts.map +1 -1
- package/dist/config/agendaQueue.config.js +29 -2
- package/dist/config/branding.config.d.ts +13 -0
- package/dist/config/branding.config.d.ts.map +1 -1
- package/dist/config/branding.config.js +34 -2
- package/dist/config/brandingConfigurationDefaults.config.d.ts +4 -0
- package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
- package/dist/config/brandingConfigurationDefaults.config.js +42 -3
- package/dist/config/index.d.ts +12 -4
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +7 -4
- package/dist/config/policies.config.d.ts.map +1 -1
- package/dist/config/policies.config.js +37 -23
- package/dist/config/raid.config.d.ts +7 -4
- package/dist/config/raid.config.d.ts.map +1 -1
- package/dist/config/raid.config.js +21 -35
- package/dist/config/record.config.d.ts +3 -0
- package/dist/config/record.config.d.ts.map +1 -1
- package/dist/config/record.config.js +37 -35
- package/dist/config/recordSchema.config.d.ts +68 -0
- package/dist/config/recordSchema.config.d.ts.map +1 -0
- package/dist/config/recordSchema.config.js +173 -0
- package/dist/config/recordValidation.config.d.ts +19 -0
- package/dist/config/recordValidation.config.d.ts.map +1 -0
- package/dist/config/recordValidation.config.js +10 -0
- package/dist/config/recordtype.config.d.ts +32 -9
- package/dist/config/recordtype.config.d.ts.map +1 -1
- package/dist/config/recordtype.config.js +4 -7
- package/dist/config/routes.config.d.ts.map +1 -1
- package/dist/config/routes.config.js +135 -53
- package/dist/config/workflow.config.d.ts +6 -0
- 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 +4 -2
- package/dist/configmodels/ConfigModels.d.ts +1 -1
- package/dist/configmodels/ConfigModels.d.ts.map +1 -1
- package/dist/configmodels/ConfigModels.js +26 -9
- package/dist/configmodels/DashboardFieldCatalogue.d.ts +67 -0
- package/dist/configmodels/DashboardFieldCatalogue.d.ts.map +1 -0
- package/dist/configmodels/DashboardFieldCatalogue.js +174 -0
- package/dist/configmodels/DashboardSettings.d.ts +191 -0
- package/dist/configmodels/DashboardSettings.d.ts.map +1 -0
- package/dist/configmodels/DashboardSettings.js +705 -0
- package/dist/configmodels/FigsharePublishing.d.ts +1 -1
- package/dist/configmodels/OniPublishing.d.ts +205 -0
- package/dist/configmodels/OniPublishing.d.ts.map +1 -0
- package/dist/configmodels/OniPublishing.js +335 -0
- package/dist/configmodels/RaidPublishing.d.ts +97 -0
- package/dist/configmodels/RaidPublishing.d.ts.map +1 -0
- package/dist/configmodels/RaidPublishing.js +35 -0
- package/dist/configmodels/WebAnalytics.d.ts +55 -0
- package/dist/configmodels/WebAnalytics.d.ts.map +1 -0
- package/dist/configmodels/WebAnalytics.js +61 -0
- package/dist/controllers/AppConfigController.d.ts.map +1 -1
- package/dist/controllers/AppConfigController.js +4 -1
- package/dist/controllers/BrandingAppController.d.ts +29 -7
- package/dist/controllers/BrandingAppController.d.ts.map +1 -1
- package/dist/controllers/BrandingAppController.js +265 -69
- package/dist/controllers/BrandingController.d.ts +24 -1
- package/dist/controllers/BrandingController.d.ts.map +1 -1
- package/dist/controllers/BrandingController.js +173 -43
- package/dist/controllers/BrandingControllerSupport.d.ts +20 -0
- package/dist/controllers/BrandingControllerSupport.d.ts.map +1 -0
- package/dist/controllers/BrandingControllerSupport.js +80 -0
- package/dist/controllers/DashboardConfigController.d.ts +6 -2
- package/dist/controllers/DashboardConfigController.d.ts.map +1 -1
- package/dist/controllers/DashboardConfigController.js +18 -4
- package/dist/controllers/DynamicAssetController.d.ts +7 -5
- package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
- package/dist/controllers/DynamicAssetController.js +21 -12
- package/dist/controllers/RecordController.d.ts +45 -4
- package/dist/controllers/RecordController.d.ts.map +1 -1
- package/dist/controllers/RecordController.js +778 -345
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js +4 -1
- package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
- package/dist/controllers/webservice/AdminController.js +4 -3
- package/dist/controllers/webservice/BrandingController.d.ts +26 -1
- package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
- package/dist/controllers/webservice/BrandingController.js +292 -116
- package/dist/controllers/webservice/DashboardConfigController.d.ts +25 -17
- package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -1
- package/dist/controllers/webservice/DashboardConfigController.js +90 -205
- package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
- package/dist/controllers/webservice/FormManagementController.js +37 -3
- package/dist/controllers/webservice/RecordController.d.ts +15 -1
- package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordController.js +647 -267
- package/dist/controllers/webservice/RecordSchemaController.d.ts +32 -0
- package/dist/controllers/webservice/RecordSchemaController.d.ts.map +1 -0
- package/dist/controllers/webservice/RecordSchemaController.js +356 -0
- package/dist/controllers/webservice/RecordTypeController.d.ts +6 -1
- package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordTypeController.js +21 -3
- package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
- package/dist/controllers/webservice/SearchController.js +7 -3
- package/dist/hooks/defineRedboxHook.d.ts +3 -0
- package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
- package/dist/hooks/defineRedboxHook.js +4 -1
- package/dist/index.d.ts +50 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +90 -2
- package/dist/loader/bootstrapShimRuntime.d.ts +1 -1
- package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -1
- package/dist/loader/bootstrapShimRuntime.js +20 -12
- package/dist/loader/index.d.ts +9 -0
- package/dist/loader/index.d.ts.map +1 -1
- package/dist/loader/index.js +93 -4
- package/dist/model/BrandingTypeface.d.ts +70 -0
- package/dist/model/BrandingTypeface.d.ts.map +1 -0
- package/dist/model/BrandingTypeface.js +116 -0
- package/dist/model/BuildResponse.d.ts +25 -11
- package/dist/model/BuildResponse.d.ts.map +1 -1
- package/dist/model/BuildResponse.js +4 -3
- package/dist/model/DashboardTypeResponseModel.d.ts +6 -0
- package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
- package/dist/model/DashboardTypeResponseModel.js +7 -1
- package/dist/model/DashboardViewResponseModel.d.ts +5 -1
- package/dist/model/DashboardViewResponseModel.d.ts.map +1 -1
- package/dist/model/DashboardViewResponseModel.js +6 -3
- package/dist/model/RBValidationError.d.ts +17 -0
- package/dist/model/RBValidationError.d.ts.map +1 -1
- package/dist/model/RBValidationError.js +37 -1
- package/dist/model/RecordTypeResponseModel.d.ts +12 -4
- package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
- package/dist/model/RecordTypeResponseModel.js +11 -2
- package/dist/model/index.d.ts +5 -1
- package/dist/model/index.d.ts.map +1 -1
- package/dist/model/index.js +5 -2
- package/dist/model/record-contract.d.ts +42 -0
- package/dist/model/record-contract.d.ts.map +1 -0
- package/dist/model/record-contract.js +3 -0
- package/dist/model/storage/BrandingModel.d.ts +7 -0
- package/dist/model/storage/BrandingModel.d.ts.map +1 -1
- package/dist/model/storage/BrandingModel.js +7 -1
- package/dist/model/storage/DeletedRecordModel.d.ts +35 -0
- package/dist/model/storage/DeletedRecordModel.d.ts.map +1 -1
- package/dist/model/storage/DeletedRecordModel.js +62 -1
- package/dist/model/storage/IntegrationAuditModel.d.ts +16 -2
- package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -1
- package/dist/model/storage/IntegrationAuditModel.js +15 -1
- package/dist/model/storage/RecordAuditModel.d.ts +11 -1
- package/dist/model/storage/RecordAuditModel.d.ts.map +1 -1
- package/dist/model/storage/RecordAuditModel.js +8 -2
- package/dist/model/storage/RecordModel.d.ts +8 -2
- package/dist/model/storage/RecordModel.d.ts.map +1 -1
- package/dist/model/storage/RecordTypeModel.d.ts +6 -0
- package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
- package/dist/model/storage/RecordTypeModel.js +4 -1
- package/dist/model/storage/index.d.ts +12 -10
- package/dist/model/storage/index.d.ts.map +1 -1
- package/dist/model/storage/index.js +24 -2
- package/dist/model/storage/record-schema.d.ts +115 -0
- package/dist/model/storage/record-schema.d.ts.map +1 -0
- package/dist/model/storage/record-schema.js +3 -0
- package/dist/policies/checkAuth.d.ts +2 -6
- package/dist/policies/checkAuth.d.ts.map +1 -1
- package/dist/policies/checkAuth.js +32 -9
- package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
- package/dist/policies/contentSecurityPolicy.js +85 -2
- package/dist/policies/index.d.ts +3 -2
- package/dist/policies/index.d.ts.map +1 -1
- package/dist/policies/index.js +4 -2
- package/dist/policies/validateApiContractRequest.d.ts.map +1 -1
- package/dist/policies/validateApiContractRequest.js +49 -11
- package/dist/record-contract/ajv-error-mapper.d.ts +34 -0
- package/dist/record-contract/ajv-error-mapper.d.ts.map +1 -0
- package/dist/record-contract/ajv-error-mapper.js +153 -0
- package/dist/record-contract/canonical-json.d.ts +20 -0
- package/dist/record-contract/canonical-json.d.ts.map +1 -0
- package/dist/record-contract/canonical-json.js +126 -0
- package/dist/record-contract/codes.d.ts +36 -0
- package/dist/record-contract/codes.d.ts.map +1 -0
- package/dist/record-contract/codes.js +38 -0
- package/dist/record-contract/contributor-registry.d.ts +76 -0
- package/dist/record-contract/contributor-registry.d.ts.map +1 -0
- package/dist/record-contract/contributor-registry.js +126 -0
- package/dist/record-contract/core-contributors.d.ts +44 -0
- package/dist/record-contract/core-contributors.d.ts.map +1 -0
- package/dist/record-contract/core-contributors.js +395 -0
- package/dist/record-contract/deep-freeze.d.ts +3 -0
- package/dist/record-contract/deep-freeze.d.ts.map +1 -0
- package/dist/record-contract/deep-freeze.js +23 -0
- package/dist/record-contract/index.d.ts +13 -0
- package/dist/record-contract/index.d.ts.map +1 -0
- package/dist/record-contract/index.js +29 -0
- package/dist/record-contract/json-pointer.d.ts +20 -0
- package/dist/record-contract/json-pointer.d.ts.map +1 -0
- package/dist/record-contract/json-pointer.js +70 -0
- package/dist/record-contract/json-schema-renderer.d.ts +51 -0
- package/dist/record-contract/json-schema-renderer.d.ts.map +1 -0
- package/dist/record-contract/json-schema-renderer.js +450 -0
- package/dist/record-contract/record-contract-compiler.d.ts +42 -0
- package/dist/record-contract/record-contract-compiler.d.ts.map +1 -0
- package/dist/record-contract/record-contract-compiler.js +775 -0
- package/dist/record-contract/record-contract-context.d.ts +91 -0
- package/dist/record-contract/record-contract-context.d.ts.map +1 -0
- package/dist/record-contract/record-contract-context.js +39 -0
- package/dist/record-contract/record-json-schema-artifact.d.ts +74 -0
- package/dist/record-contract/record-json-schema-artifact.d.ts.map +1 -0
- package/dist/record-contract/record-json-schema-artifact.js +309 -0
- package/dist/record-contract/record-json-schema-etag.d.ts +15 -0
- package/dist/record-contract/record-json-schema-etag.d.ts.map +1 -0
- package/dist/record-contract/record-json-schema-etag.js +41 -0
- package/dist/record-contract/types.d.ts +151 -0
- package/dist/record-contract/types.d.ts.map +1 -0
- package/dist/record-contract/types.js +6 -0
- package/dist/services/AppConfigService.d.ts +6 -0
- package/dist/services/AppConfigService.d.ts.map +1 -1
- package/dist/services/AppConfigService.js +23 -1
- package/dist/services/AttachmentMetadataService.d.ts +58 -0
- package/dist/services/AttachmentMetadataService.d.ts.map +1 -1
- package/dist/services/AttachmentMetadataService.js +643 -8
- package/dist/services/BrandingLogoService.d.ts +6 -1
- package/dist/services/BrandingLogoService.d.ts.map +1 -1
- package/dist/services/BrandingLogoService.js +77 -9
- package/dist/services/BrandingService.d.ts +171 -9
- package/dist/services/BrandingService.d.ts.map +1 -1
- package/dist/services/BrandingService.js +572 -68
- package/dist/services/BrandingThemeCssService.d.ts +17 -1
- package/dist/services/BrandingThemeCssService.d.ts.map +1 -1
- package/dist/services/BrandingThemeCssService.js +71 -9
- package/dist/services/BrandingTypefaceService.d.ts +74 -0
- package/dist/services/BrandingTypefaceService.d.ts.map +1 -0
- package/dist/services/BrandingTypefaceService.js +359 -0
- package/dist/services/BrandingWoff2Inspector.d.ts +17 -0
- package/dist/services/BrandingWoff2Inspector.d.ts.map +1 -0
- package/dist/services/BrandingWoff2Inspector.js +402 -0
- package/dist/services/DashboardConfigService.d.ts +214 -54
- package/dist/services/DashboardConfigService.d.ts.map +1 -1
- package/dist/services/DashboardConfigService.js +829 -261
- package/dist/services/DashboardLegacyConversion.d.ts +82 -0
- package/dist/services/DashboardLegacyConversion.d.ts.map +1 -0
- package/dist/services/DashboardLegacyConversion.js +427 -0
- package/dist/services/DashboardTypesService.d.ts +15 -4
- package/dist/services/DashboardTypesService.d.ts.map +1 -1
- package/dist/services/DashboardTypesService.js +72 -139
- package/dist/services/DoiService.d.ts +1 -1
- package/dist/services/DoiService.d.ts.map +1 -1
- package/dist/services/DoiService.js +71 -45
- package/dist/services/FigshareService.d.ts.map +1 -1
- package/dist/services/FigshareService.js +8 -7
- package/dist/services/FormRecordConsistencyService.d.ts +8 -23
- package/dist/services/FormRecordConsistencyService.d.ts.map +1 -1
- package/dist/services/FormRecordConsistencyService.js +54 -70
- package/dist/services/FormsService.d.ts +91 -2
- package/dist/services/FormsService.d.ts.map +1 -1
- package/dist/services/FormsService.js +324 -64
- package/dist/services/HarvestRunService.d.ts +6 -3
- package/dist/services/HarvestRunService.d.ts.map +1 -1
- package/dist/services/HarvestRunService.js +161 -97
- package/dist/services/I18nEntriesService.d.ts +11 -11
- package/dist/services/I18nEntriesService.d.ts.map +1 -1
- package/dist/services/I18nEntriesService.js +71 -48
- package/dist/services/OniService.d.ts +19 -62
- package/dist/services/OniService.d.ts.map +1 -1
- package/dist/services/OniService.js +223 -691
- 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 +19 -61
- package/dist/services/RaidService.d.ts.map +1 -1
- package/dist/services/RaidService.js +191 -530
- package/dist/services/RecordSchemaService.d.ts +440 -0
- package/dist/services/RecordSchemaService.d.ts.map +1 -0
- package/dist/services/RecordSchemaService.js +3061 -0
- package/dist/services/RecordTypesService.d.ts +29 -0
- package/dist/services/RecordTypesService.d.ts.map +1 -1
- package/dist/services/RecordTypesService.js +106 -11
- package/dist/services/RecordValidationService.d.ts +340 -0
- package/dist/services/RecordValidationService.d.ts.map +1 -0
- package/dist/services/RecordValidationService.js +1898 -0
- package/dist/services/RecordsService.d.ts +317 -26
- package/dist/services/RecordsService.d.ts.map +1 -1
- package/dist/services/RecordsService.js +5145 -765
- package/dist/services/SolrSearchService.d.ts +1 -1
- package/dist/services/SolrSearchService.d.ts.map +1 -1
- package/dist/services/SolrSearchService.js +42 -12
- package/dist/services/StandardDatastreamService.d.ts +4 -0
- package/dist/services/StandardDatastreamService.d.ts.map +1 -1
- package/dist/services/StandardDatastreamService.js +106 -44
- package/dist/services/TriggerService.d.ts.map +1 -1
- package/dist/services/TriggerService.js +54 -30
- package/dist/services/UsersService.d.ts +2 -1
- package/dist/services/UsersService.d.ts.map +1 -1
- package/dist/services/UsersService.js +364 -283
- package/dist/services/VocabularyService.d.ts +2 -0
- package/dist/services/VocabularyService.d.ts.map +1 -1
- package/dist/services/VocabularyService.js +61 -2
- package/dist/services/WorkflowStepsService.d.ts +11 -0
- package/dist/services/WorkflowStepsService.d.ts.map +1 -1
- package/dist/services/WorkflowStepsService.js +32 -3
- 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 +3 -20
- package/dist/services/doi-v2/config.d.ts +1 -0
- package/dist/services/doi-v2/config.d.ts.map +1 -1
- package/dist/services/doi-v2/config.js +13 -5
- package/dist/services/doi-v2/runtime.d.ts.map +1 -1
- package/dist/services/doi-v2/runtime.js +14 -54
- package/dist/services/figshare-v2/bindings.d.ts.map +1 -1
- package/dist/services/figshare-v2/bindings.js +3 -20
- package/dist/services/figshare-v2/runtime.d.ts.map +1 -1
- package/dist/services/figshare-v2/runtime.js +11 -58
- package/dist/services/figshare-v2/worker.d.ts.map +1 -1
- package/dist/services/figshare-v2/worker.js +254 -74
- package/dist/services/form-record-access-user.d.ts +3 -0
- package/dist/services/form-record-access-user.d.ts.map +1 -0
- package/dist/services/form-record-access-user.js +23 -0
- package/dist/services/index.d.ts +9 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +45 -3
- package/dist/services/integration-v2/bindings.d.ts +3 -0
- package/dist/services/integration-v2/bindings.d.ts.map +1 -0
- package/dist/services/integration-v2/bindings.js +91 -0
- package/dist/services/integration-v2/runtime.d.ts +3 -0
- package/dist/services/integration-v2/runtime.d.ts.map +1 -0
- package/dist/services/integration-v2/runtime.js +50 -0
- package/dist/services/internal-record-schema-authorization.d.ts +8 -0
- package/dist/services/internal-record-schema-authorization.d.ts.map +1 -0
- package/dist/services/internal-record-schema-authorization.js +16 -0
- package/dist/services/oni-v2/audit.d.ts +19 -0
- package/dist/services/oni-v2/audit.d.ts.map +1 -0
- package/dist/services/oni-v2/audit.js +50 -0
- package/dist/services/oni-v2/bindings.d.ts +7 -0
- package/dist/services/oni-v2/bindings.d.ts.map +1 -0
- package/dist/services/oni-v2/bindings.js +31 -0
- package/dist/services/oni-v2/config.d.ts +12 -0
- package/dist/services/oni-v2/config.d.ts.map +1 -0
- package/dist/services/oni-v2/config.js +134 -0
- package/dist/services/oni-v2/context.d.ts +3 -0
- package/dist/services/oni-v2/context.d.ts.map +1 -0
- package/dist/services/oni-v2/context.js +17 -0
- package/dist/services/oni-v2/crate.d.ts +17 -0
- package/dist/services/oni-v2/crate.d.ts.map +1 -0
- package/dist/services/oni-v2/crate.js +504 -0
- package/dist/services/oni-v2/flydriveOcflStore.d.ts +69 -0
- package/dist/services/oni-v2/flydriveOcflStore.d.ts.map +1 -0
- package/dist/services/oni-v2/flydriveOcflStore.js +325 -0
- package/dist/services/oni-v2/ingestion.d.ts +37 -0
- package/dist/services/oni-v2/ingestion.d.ts.map +1 -0
- package/dist/services/oni-v2/ingestion.js +91 -0
- package/dist/services/oni-v2/mapping.d.ts +17 -0
- package/dist/services/oni-v2/mapping.d.ts.map +1 -0
- package/dist/services/oni-v2/mapping.js +137 -0
- package/dist/services/oni-v2/repository.d.ts +9 -0
- package/dist/services/oni-v2/repository.d.ts.map +1 -0
- package/dist/services/oni-v2/repository.js +180 -0
- package/dist/services/oni-v2/runtime.d.ts +23 -0
- package/dist/services/oni-v2/runtime.d.ts.map +1 -0
- package/dist/services/oni-v2/runtime.js +121 -0
- package/dist/services/oni-v2/templating.d.ts +11 -0
- package/dist/services/oni-v2/templating.d.ts.map +1 -0
- package/dist/services/oni-v2/templating.js +27 -0
- package/dist/services/oni-v2/types.d.ts +100 -0
- package/dist/services/oni-v2/types.d.ts.map +1 -0
- package/dist/services/oni-v2/types.js +3 -0
- package/dist/services/raid-v2/audit.d.ts +10 -0
- package/dist/services/raid-v2/audit.d.ts.map +1 -0
- package/dist/services/raid-v2/audit.js +29 -0
- package/dist/services/raid-v2/errors.d.ts +85 -0
- package/dist/services/raid-v2/errors.d.ts.map +1 -0
- package/dist/services/raid-v2/errors.js +36 -0
- package/dist/services/raid-v2/http.d.ts +4 -0
- package/dist/services/raid-v2/http.d.ts.map +1 -0
- package/dist/services/raid-v2/http.js +84 -0
- package/dist/services/raid-v2/logger.d.ts +8 -0
- package/dist/services/raid-v2/logger.d.ts.map +1 -0
- package/dist/services/raid-v2/logger.js +30 -0
- package/dist/services/raid-v2/mapping.d.ts +9 -0
- package/dist/services/raid-v2/mapping.d.ts.map +1 -0
- package/dist/services/raid-v2/mapping.js +168 -0
- package/dist/services/raid-v2/runtime.d.ts +5 -0
- package/dist/services/raid-v2/runtime.d.ts.map +1 -0
- package/dist/services/raid-v2/runtime.js +135 -0
- package/dist/services/raid-v2/tags.d.ts +11 -0
- package/dist/services/raid-v2/tags.d.ts.map +1 -0
- package/dist/services/raid-v2/tags.js +12 -0
- package/dist/services/raid-v2/types.d.ts +66 -0
- package/dist/services/raid-v2/types.d.ts.map +1 -0
- package/dist/services/raid-v2/types.js +3 -0
- package/dist/services/record-hooks/coordinator.d.ts +64 -0
- package/dist/services/record-hooks/coordinator.d.ts.map +1 -0
- package/dist/services/record-hooks/coordinator.js +276 -0
- package/dist/visitor/client.visitor.d.ts +6 -0
- package/dist/visitor/client.visitor.d.ts.map +1 -1
- package/dist/visitor/client.visitor.js +59 -14
- package/dist/visitor/construct.visitor.d.ts +27 -1
- package/dist/visitor/construct.visitor.d.ts.map +1 -1
- package/dist/visitor/construct.visitor.js +265 -177
- package/dist/visitor/context-variables.visitor.d.ts +3 -1
- package/dist/visitor/context-variables.visitor.d.ts.map +1 -1
- package/dist/visitor/context-variables.visitor.js +15 -1
- package/dist/visitor/data-value.visitor.d.ts +6 -0
- package/dist/visitor/data-value.visitor.d.ts.map +1 -1
- package/dist/visitor/data-value.visitor.js +10 -1
- package/dist/visitor/json-type-def.visitor.d.ts +6 -0
- package/dist/visitor/json-type-def.visitor.d.ts.map +1 -1
- package/dist/visitor/json-type-def.visitor.js +10 -1
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +11 -0
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
- package/dist/visitor/migrate-config-v4-v5.visitor.js +228 -133
- package/dist/visitor/related-object-data-inline.visitor.d.ts +31 -0
- package/dist/visitor/related-object-data-inline.visitor.d.ts.map +1 -0
- package/dist/visitor/related-object-data-inline.visitor.js +96 -0
- package/dist/visitor/template.visitor.d.ts +17 -2
- package/dist/visitor/template.visitor.d.ts.map +1 -1
- package/dist/visitor/template.visitor.js +60 -22
- package/dist/visitor/validator.visitor.d.ts +49 -7
- package/dist/visitor/validator.visitor.d.ts.map +1 -1
- package/dist/visitor/validator.visitor.js +275 -178
- package/dist/waterline-models/AttachmentMetadata.d.ts +22 -0
- package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -1
- package/dist/waterline-models/AttachmentMetadata.js +147 -3
- package/dist/waterline-models/BrandingConfig.d.ts +7 -0
- package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
- package/dist/waterline-models/BrandingConfig.js +16 -1
- package/dist/waterline-models/BrandingConfigHistory.d.ts +11 -2
- package/dist/waterline-models/BrandingConfigHistory.d.ts.map +1 -1
- package/dist/waterline-models/BrandingConfigHistory.js +21 -1
- package/dist/waterline-models/DashboardConfiguration.d.ts +29 -0
- package/dist/waterline-models/DashboardConfiguration.d.ts.map +1 -0
- package/dist/waterline-models/DashboardConfiguration.js +52 -0
- package/dist/waterline-models/RecordType.d.ts +9 -0
- package/dist/waterline-models/RecordType.d.ts.map +1 -1
- package/dist/waterline-models/RecordType.js +16 -1
- package/dist/waterline-models/User.d.ts.map +1 -1
- package/dist/waterline-models/User.js +10 -15
- package/dist/waterline-models/index.d.ts +2 -0
- package/dist/waterline-models/index.d.ts.map +1 -1
- package/dist/waterline-models/index.js +4 -1
- package/package.json +59 -45
- package/dist/config/datapubs.config.d.ts +0 -72
- package/dist/config/datapubs.config.d.ts.map +0 -1
- package/dist/config/datapubs.config.js +0 -74
|
@@ -0,0 +1,775 @@
|
|
|
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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
|