@researchdatabox/redbox-core 5.0.3 → 5.0.4-beta.12498
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 +4 -0
- 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 +48 -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 +105 -12
- 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 +48 -8
- 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/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 +6 -0
- 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 +1 -1
- package/dist/services/FigshareService.d.ts.map +1 -1
- package/dist/services/FigshareService.js +73 -32
- 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 +1 -0
- package/dist/services/I18nEntriesService.d.ts.map +1 -1
- package/dist/services/I18nEntriesService.js +26 -6
- 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 +313 -22
- package/dist/services/RecordsService.d.ts.map +1 -1
- package/dist/services/RecordsService.js +4948 -509
- 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/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 +60 -47
- 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
|
@@ -56,6 +56,9 @@ const rxjs_1 = require("rxjs");
|
|
|
56
56
|
const operators_1 = require("rxjs/operators");
|
|
57
57
|
const CoreService_1 = require("../CoreService");
|
|
58
58
|
const crypto = __importStar(require("crypto"));
|
|
59
|
+
const branding_config_1 = require("../config/branding.config");
|
|
60
|
+
const BrandingTypeface_1 = require("../model/BrandingTypeface");
|
|
61
|
+
const TransactionUtils_1 = require("../utilities/TransactionUtils");
|
|
59
62
|
var Services;
|
|
60
63
|
(function (Services) {
|
|
61
64
|
/**
|
|
@@ -71,6 +74,7 @@ var Services;
|
|
|
71
74
|
'getBrand',
|
|
72
75
|
'getAvailable',
|
|
73
76
|
'getBrandAndPortalPath',
|
|
77
|
+
'getFaviconUrl',
|
|
74
78
|
'getBrandNameFromReq',
|
|
75
79
|
'getBrandFromReq',
|
|
76
80
|
'getPortalFromReq',
|
|
@@ -78,55 +82,69 @@ var Services;
|
|
|
78
82
|
'getRootContext',
|
|
79
83
|
'getBrandById',
|
|
80
84
|
'getBrandingFromDB',
|
|
85
|
+
'getActiveTypefaceFontInfo',
|
|
86
|
+
'hasActiveCustomTypeface',
|
|
87
|
+
'getAdminState',
|
|
88
|
+
'listVersions',
|
|
81
89
|
'saveDraft',
|
|
90
|
+
'uploadTypefaceFace',
|
|
91
|
+
'removeTypefaceFace',
|
|
92
|
+
'useDefaultTypography',
|
|
93
|
+
'revertTypefaceDraft',
|
|
82
94
|
'preview',
|
|
95
|
+
'previewVersion',
|
|
83
96
|
'fetchPreview',
|
|
84
97
|
'publish',
|
|
98
|
+
'restore',
|
|
85
99
|
'rollback',
|
|
86
|
-
'refreshBrandingCache'
|
|
100
|
+
'refreshBrandingCache',
|
|
87
101
|
];
|
|
88
102
|
availableBrandings = [];
|
|
89
103
|
brandings = [];
|
|
90
104
|
dBrand = { name: 'default' };
|
|
91
105
|
bootstrap = () => {
|
|
92
|
-
return super.getObservable(BrandingConfig.findOne(this.dBrand))
|
|
93
|
-
.pipe((0, operators_1.mergeMap)(defaultBrand => {
|
|
106
|
+
return super.getObservable(BrandingConfig.findOne(this.dBrand)).pipe((0, operators_1.mergeMap)(defaultBrand => {
|
|
94
107
|
if (_.isEmpty(defaultBrand)) {
|
|
95
108
|
// create default brand
|
|
96
109
|
sails.log.verbose("Default brand doesn't exist, creating...");
|
|
97
110
|
return super.getObservable(BrandingConfig.create(this.dBrand));
|
|
98
111
|
}
|
|
99
|
-
sails.log.verbose(
|
|
112
|
+
sails.log.verbose('Default brand already exists...');
|
|
100
113
|
return (0, rxjs_1.of)(defaultBrand);
|
|
101
114
|
}), (0, operators_1.mergeMap)(this.loadAvailableBrands));
|
|
102
115
|
};
|
|
103
116
|
loadAvailableBrands = (_defBrand) => {
|
|
104
|
-
sails.log.verbose(
|
|
117
|
+
sails.log.verbose('Loading available brands......');
|
|
105
118
|
// Find all the BrandingConfig we have and add them to the availableBrandings array.
|
|
106
119
|
// A policy is configured to reject any branding values not present in this array.
|
|
107
|
-
return super.getObservable(BrandingConfig.find({}).populate('roles'))
|
|
108
|
-
.pipe((0, operators_1.mergeMap)(brands => {
|
|
120
|
+
return super.getObservable(BrandingConfig.find({}).populate('roles')).pipe((0, operators_1.mergeMap)(brands => {
|
|
109
121
|
this.brandings = brands;
|
|
110
122
|
this.availableBrandings = _.map(this.brandings, 'name');
|
|
111
123
|
const defBrandEntry = this.getDefault();
|
|
112
124
|
if (defBrandEntry == null) {
|
|
113
|
-
sails.log.error(
|
|
114
|
-
return (0, rxjs_1.throwError)(new Error(
|
|
125
|
+
sails.log.error('Failed to load default brand!');
|
|
126
|
+
return (0, rxjs_1.throwError)(new Error('Failed to load default brand!'));
|
|
115
127
|
}
|
|
116
128
|
return (0, rxjs_1.of)(defBrandEntry);
|
|
117
129
|
}));
|
|
118
130
|
};
|
|
119
131
|
getDefault = () => {
|
|
120
|
-
return _.find(this.brandings, (o) => {
|
|
132
|
+
return _.find(this.brandings, (o) => {
|
|
133
|
+
return o.name == this.dBrand.name;
|
|
134
|
+
});
|
|
121
135
|
};
|
|
122
136
|
getBrand = (name) => {
|
|
123
|
-
return _.find(this.brandings, (o) => {
|
|
137
|
+
return _.find(this.brandings, (o) => {
|
|
138
|
+
return o.name == name;
|
|
139
|
+
});
|
|
124
140
|
};
|
|
125
141
|
getBrandById = (id) => {
|
|
126
|
-
return _.find(this.brandings, (o) => {
|
|
142
|
+
return _.find(this.brandings, (o) => {
|
|
143
|
+
return o.id == id;
|
|
144
|
+
});
|
|
127
145
|
};
|
|
128
146
|
async getBrandingFromDB(name) {
|
|
129
|
-
return BrandingConfig.findOne({ name: name });
|
|
147
|
+
return (await BrandingConfig.findOne({ name: name }));
|
|
130
148
|
}
|
|
131
149
|
getAvailable = () => {
|
|
132
150
|
return this.availableBrandings;
|
|
@@ -142,6 +160,9 @@ var Services;
|
|
|
142
160
|
return `${rootContext}/${branding}/${portal}`;
|
|
143
161
|
}
|
|
144
162
|
}
|
|
163
|
+
getFaviconUrl(req) {
|
|
164
|
+
return `${this.getBrandAndPortalPath(req)}/images/favicon`;
|
|
165
|
+
}
|
|
145
166
|
getRootContext() {
|
|
146
167
|
const rootContext = sails.config.http.rootContext;
|
|
147
168
|
if (_.isEmpty(rootContext)) {
|
|
@@ -203,28 +224,314 @@ var Services;
|
|
|
203
224
|
}
|
|
204
225
|
return portal;
|
|
205
226
|
}
|
|
206
|
-
|
|
227
|
+
// ------------------------------------------------------------------
|
|
228
|
+
// Revisioned draft and version lifecycle (design.md sections 3.3, 5, 7).
|
|
229
|
+
// Every colour/typeface draft mutation requires `expectedDraftRevision`
|
|
230
|
+
// and applies exactly one logical mutation with one revision increment via
|
|
231
|
+
// a conditional update. Publish/restore require both expected counters,
|
|
232
|
+
// re-verify stored bytes, and move active state in a single row update.
|
|
233
|
+
// ------------------------------------------------------------------
|
|
234
|
+
readHistoryMaxVersions() {
|
|
235
|
+
return (0, branding_config_1.getBrandingPositiveInt)('historyMaxVersions', BrandingTypeface_1.BRANDING_HISTORY_MAX_VERSIONS);
|
|
236
|
+
}
|
|
237
|
+
snapshotKey(value) {
|
|
238
|
+
return JSON.stringify(value === undefined ? null : value);
|
|
239
|
+
}
|
|
240
|
+
brandCounters(brand) {
|
|
241
|
+
return {
|
|
242
|
+
version: typeof brand.version === 'number' ? brand.version : 0,
|
|
243
|
+
draftRevision: typeof brand.draftRevision === 'number' ? brand.draftRevision : 0,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
conflictError(brand) {
|
|
247
|
+
const current = this.brandCounters(brand);
|
|
248
|
+
const error = new Error(`branding-conflict: expected version ${current.version} and draft revision ${current.draftRevision}`);
|
|
249
|
+
error.code = 'branding-conflict';
|
|
250
|
+
error.current = current;
|
|
251
|
+
return error;
|
|
252
|
+
}
|
|
253
|
+
codedError(code, message) {
|
|
254
|
+
const error = new Error(`${code}: ${message}`);
|
|
255
|
+
error.code = code;
|
|
256
|
+
return error;
|
|
257
|
+
}
|
|
258
|
+
isUniqueViolation(error) {
|
|
259
|
+
const code = typeof error?.code === 'string' ? String(error.code) : '';
|
|
260
|
+
const message = error instanceof Error ? error.message : String(error ?? '');
|
|
261
|
+
return code === 'E_UNIQUE' || /E_UNIQUE|unique|duplicate key/i.test(`${code} ${message}`);
|
|
262
|
+
}
|
|
263
|
+
extractActor(actor) {
|
|
264
|
+
if (!actor || typeof actor !== 'object') {
|
|
265
|
+
return {};
|
|
266
|
+
}
|
|
267
|
+
const record = actor;
|
|
268
|
+
const actorId = typeof record.id === 'string' || typeof record.id === 'number'
|
|
269
|
+
? String(record.id)
|
|
270
|
+
: typeof record.username === 'string'
|
|
271
|
+
? record.username
|
|
272
|
+
: undefined;
|
|
273
|
+
const actorDisplayName = typeof record.displayName === 'string'
|
|
274
|
+
? record.displayName
|
|
275
|
+
: typeof record.name === 'string'
|
|
276
|
+
? record.name
|
|
277
|
+
: typeof record.username === 'string'
|
|
278
|
+
? record.username
|
|
279
|
+
: actorId;
|
|
280
|
+
return { actorId, actorDisplayName };
|
|
281
|
+
}
|
|
282
|
+
async loadBrandOrThrow(branding) {
|
|
283
|
+
const brand = await BrandingConfig.findOne({ name: branding });
|
|
284
|
+
if (!brand) {
|
|
285
|
+
throw this.codedError('branding-not-found', `Brand not found: ${branding}`);
|
|
286
|
+
}
|
|
287
|
+
return brand;
|
|
288
|
+
}
|
|
289
|
+
draftTypefaceOf(brand) {
|
|
290
|
+
return (0, BrandingTypeface_1.normalizeTypefaceState)(brand.draftTypeface);
|
|
291
|
+
}
|
|
292
|
+
async listHistoriesAsc(brandingId) {
|
|
293
|
+
return (await BrandingConfigHistory.find({ branding: brandingId }).sort('version ASC'));
|
|
294
|
+
}
|
|
295
|
+
activeHistoryRow(histories, activeVersion) {
|
|
296
|
+
return histories.find(history => history.version === activeVersion);
|
|
297
|
+
}
|
|
298
|
+
async maxHistoryVersion(brandingId) {
|
|
299
|
+
const histories = await this.listHistoriesAsc(brandingId);
|
|
300
|
+
return histories.reduce((max, history) => Math.max(max, history.version), 0);
|
|
301
|
+
}
|
|
302
|
+
publicationIdentity(hash, typeface) {
|
|
303
|
+
return this.snapshotKey({
|
|
304
|
+
hash: String(hash ?? ''),
|
|
305
|
+
faces: (0, BrandingTypeface_1.orderedTypefaceFaces)((0, BrandingTypeface_1.normalizeTypefaceState)(typeface)).map(face => [face.slot, face.sha256]),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/** Newest-first version entries shared by getAdminState and listVersions. */
|
|
309
|
+
buildVersionEntries(brand, histories) {
|
|
310
|
+
return [...histories]
|
|
311
|
+
.sort((left, right) => right.version - left.version)
|
|
312
|
+
.map(history => ({
|
|
313
|
+
id: String(history.id),
|
|
314
|
+
branding: String(brand.id),
|
|
315
|
+
version: history.version,
|
|
316
|
+
hash: history.hash,
|
|
317
|
+
dateCreated: history.dateCreated ?? '',
|
|
318
|
+
actorId: history.actorId,
|
|
319
|
+
actorDisplayName: history.actorDisplayName,
|
|
320
|
+
restoredFromVersion: history.restoredFromVersion,
|
|
321
|
+
variables: history.variables ?? {},
|
|
322
|
+
typeface: (0, BrandingTypeface_1.normalizeTypefaceState)(history.typeface),
|
|
323
|
+
}));
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Canonical Admin-state response builder (design.md section 5.3).
|
|
327
|
+
*
|
|
328
|
+
* Every response includes advisory active-face health, including mutations,
|
|
329
|
+
* because the Admin UI replaces its canonical state with each response.
|
|
330
|
+
*/
|
|
331
|
+
async getAdminState(branding) {
|
|
332
|
+
const brand = await this.loadBrandOrThrow(branding);
|
|
333
|
+
const { version: activeVersion, draftRevision } = this.brandCounters(brand);
|
|
334
|
+
const histories = await this.listHistoriesAsc(String(brand.id));
|
|
335
|
+
const activeRow = this.activeHistoryRow(histories, activeVersion);
|
|
336
|
+
const activeVariables = activeRow?.variables ?? {};
|
|
337
|
+
const activeTypeface = (0, BrandingTypeface_1.normalizeTypefaceState)(brand.typeface ?? activeRow?.typeface ?? null);
|
|
338
|
+
const draftVariables = brand.variables ?? {};
|
|
339
|
+
const draftTypeface = this.draftTypefaceOf(brand);
|
|
340
|
+
const versions = this.buildVersionEntries(brand, histories);
|
|
341
|
+
const healthWarnings = await this.activeHealthWarnings(String(brand.id), activeTypeface);
|
|
342
|
+
return {
|
|
343
|
+
branding: { id: String(brand.id), name: String(brand.name) },
|
|
344
|
+
active: {
|
|
345
|
+
version: activeVersion,
|
|
346
|
+
hash: String(brand.hash ?? ''),
|
|
347
|
+
variables: activeVariables,
|
|
348
|
+
typeface: activeTypeface,
|
|
349
|
+
},
|
|
350
|
+
draft: {
|
|
351
|
+
revision: draftRevision,
|
|
352
|
+
variables: draftVariables,
|
|
353
|
+
typeface: draftTypeface,
|
|
354
|
+
dirty: {
|
|
355
|
+
colours: this.snapshotKey(draftVariables) !== this.snapshotKey(activeVariables),
|
|
356
|
+
typeface: this.snapshotKey(draftTypeface) !== this.snapshotKey(activeTypeface),
|
|
357
|
+
},
|
|
358
|
+
},
|
|
359
|
+
versions,
|
|
360
|
+
limits: {
|
|
361
|
+
faceMaxBytes: (0, branding_config_1.getBrandingPositiveInt)('typefaceFaceMaxBytes', BrandingTypeface_1.BRANDING_TYPEFACE_FACE_MAX_BYTES),
|
|
362
|
+
familyMaxBytes: (0, branding_config_1.getBrandingPositiveInt)('typefaceFamilyMaxBytes', BrandingTypeface_1.BRANDING_TYPEFACE_FAMILY_MAX_BYTES),
|
|
363
|
+
historyMaxVersions: this.readHistoryMaxVersions(),
|
|
364
|
+
},
|
|
365
|
+
healthWarnings,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
/** Retained versions newest-first (no storage health reads). */
|
|
369
|
+
async listVersions(branding) {
|
|
370
|
+
const brand = await this.loadBrandOrThrow(branding);
|
|
371
|
+
const histories = await this.listHistoriesAsc(String(brand.id));
|
|
372
|
+
return this.buildVersionEntries(brand, histories);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Advisory active-asset health; config retrieval never fails on storage errors.
|
|
376
|
+
* Missing objects are reported via a cheap existence probe; only faces that
|
|
377
|
+
* exist pay for a full read plus hash verification (corruption check).
|
|
378
|
+
*/
|
|
379
|
+
async activeHealthWarnings(brandingId, activeTypeface) {
|
|
380
|
+
const warnings = [];
|
|
381
|
+
for (const face of (0, BrandingTypeface_1.orderedTypefaceFaces)(activeTypeface)) {
|
|
382
|
+
if (!(await BrandingTypefaceService.faceExists(brandingId, face.sha256))) {
|
|
383
|
+
sails.log.warn(`BrandingService active typeface health: brand ${brandingId} slot ${face.slot} face-unavailable`);
|
|
384
|
+
warnings.push({ code: 'face-unavailable', slot: face.slot, sha256: face.sha256 });
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
try {
|
|
388
|
+
await BrandingTypefaceService.readFace(brandingId, face.sha256);
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
const code = error?.code === 'typeface-corrupt' ? 'face-corrupt' : 'face-unavailable';
|
|
392
|
+
sails.log.warn(`BrandingService active typeface health: brand ${brandingId} slot ${face.slot} ${code}`);
|
|
393
|
+
warnings.push({ code, slot: face.slot, sha256: face.sha256 });
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return warnings;
|
|
397
|
+
}
|
|
398
|
+
requireDraftRevision(brand, expectedDraftRevision) {
|
|
399
|
+
const current = typeof brand.draftRevision === 'number' ? brand.draftRevision : 0;
|
|
400
|
+
if (expectedDraftRevision === undefined || expectedDraftRevision !== current) {
|
|
401
|
+
throw this.conflictError(brand);
|
|
402
|
+
}
|
|
403
|
+
return current;
|
|
404
|
+
}
|
|
405
|
+
requireCounters(brand, expectedVersion, expectedDraftRevision) {
|
|
406
|
+
const current = this.brandCounters(brand);
|
|
407
|
+
if (expectedVersion === undefined ||
|
|
408
|
+
expectedVersion !== current.version ||
|
|
409
|
+
expectedDraftRevision === undefined ||
|
|
410
|
+
expectedDraftRevision !== current.draftRevision) {
|
|
411
|
+
throw this.conflictError(brand);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
async conditionalDraftUpdate(brand, patch) {
|
|
415
|
+
const current = typeof brand.draftRevision === 'number' ? brand.draftRevision : 0;
|
|
416
|
+
const updated = await BrandingConfig.updateOne({ id: brand.id, draftRevision: current }).set({
|
|
417
|
+
...patch,
|
|
418
|
+
draftRevision: current + 1,
|
|
419
|
+
});
|
|
420
|
+
if (!updated) {
|
|
421
|
+
const reread = await this.loadBrandOrThrow(String(brand.name));
|
|
422
|
+
throw this.conflictError(reread);
|
|
423
|
+
}
|
|
424
|
+
return updated;
|
|
425
|
+
}
|
|
426
|
+
/** Save colour draft; typeface draft is preserved untouched. */
|
|
207
427
|
async saveDraft(input) {
|
|
428
|
+
const brand = await this.loadBrandOrThrow(input.branding);
|
|
429
|
+
this.requireDraftRevision(brand, input.expectedDraftRevision);
|
|
208
430
|
const normalized = BrandingThemeCssService.validateVariables(input.variables || {});
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
throw new Error('branding-not-found');
|
|
212
|
-
await BrandingConfig.update({ id: brand.id }, { variables: normalized });
|
|
213
|
-
const updated = await this.refreshBrandingCache(brand.id);
|
|
214
|
-
return updated;
|
|
431
|
+
await this.conditionalDraftUpdate(brand, { variables: normalized });
|
|
432
|
+
return this.getAdminState(input.branding);
|
|
215
433
|
}
|
|
216
|
-
/**
|
|
217
|
-
async
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
const
|
|
434
|
+
/** Stage one uploaded face and apply a single-slot draft mutation. */
|
|
435
|
+
async uploadTypefaceFace(input) {
|
|
436
|
+
if (!(0, BrandingTypeface_1.isBrandingTypefaceSlot)(input.slot)) {
|
|
437
|
+
throw this.codedError('branding-invalid', `Invalid typeface slot: ${String(input.slot)}`);
|
|
438
|
+
}
|
|
439
|
+
const brand = await this.loadBrandOrThrow(input.branding);
|
|
440
|
+
this.requireDraftRevision(brand, input.expectedDraftRevision);
|
|
441
|
+
const draft = this.draftTypefaceOf(brand);
|
|
442
|
+
const base = { ...(draft.faces ?? {}) };
|
|
443
|
+
const face = await BrandingTypefaceService.inspectAndStoreFace({
|
|
444
|
+
brandingId: String(brand.id),
|
|
445
|
+
slot: input.slot,
|
|
446
|
+
bytes: input.bytes,
|
|
447
|
+
originalFilename: input.originalFilename,
|
|
448
|
+
existingFaces: (0, BrandingTypeface_1.orderedTypefaceFaces)({ mode: 'custom', faces: base }),
|
|
449
|
+
});
|
|
450
|
+
base[input.slot] = face;
|
|
451
|
+
await this.conditionalDraftUpdate(brand, { draftTypeface: { mode: 'custom', faces: base } });
|
|
452
|
+
return this.getAdminState(input.branding);
|
|
453
|
+
}
|
|
454
|
+
/** Remove one draft face; the active typeface is untouched. */
|
|
455
|
+
async removeTypefaceFace(input) {
|
|
456
|
+
if (!(0, BrandingTypeface_1.isBrandingTypefaceSlot)(input.slot)) {
|
|
457
|
+
throw this.codedError('branding-invalid', `Invalid typeface slot: ${String(input.slot)}`);
|
|
458
|
+
}
|
|
459
|
+
const brand = await this.loadBrandOrThrow(input.branding);
|
|
460
|
+
this.requireDraftRevision(brand, input.expectedDraftRevision);
|
|
461
|
+
const draft = this.draftTypefaceOf(brand);
|
|
462
|
+
if (draft.mode !== 'custom' || !draft.faces?.[input.slot]) {
|
|
463
|
+
throw this.codedError('branding-face-not-found', `No draft face in slot: ${String(input.slot)}`);
|
|
464
|
+
}
|
|
465
|
+
const faces = { ...(draft.faces ?? {}) };
|
|
466
|
+
delete faces[input.slot];
|
|
467
|
+
const next = Object.keys(faces).length === 0 ? { mode: 'default', faces: {} } : { mode: 'custom', faces };
|
|
468
|
+
await this.conditionalDraftUpdate(brand, { draftTypeface: next });
|
|
469
|
+
return this.getAdminState(input.branding);
|
|
470
|
+
}
|
|
471
|
+
/** Set the draft typeface to Default Typography; draft colours are preserved. */
|
|
472
|
+
async useDefaultTypography(input) {
|
|
473
|
+
const brand = await this.loadBrandOrThrow(input.branding);
|
|
474
|
+
this.requireDraftRevision(brand, input.expectedDraftRevision);
|
|
475
|
+
await this.conditionalDraftUpdate(brand, { draftTypeface: { mode: 'default', faces: {} } });
|
|
476
|
+
return this.getAdminState(input.branding);
|
|
477
|
+
}
|
|
478
|
+
/** Copy only the active typeface into the draft; draft colours are preserved. */
|
|
479
|
+
async revertTypefaceDraft(input) {
|
|
480
|
+
const brand = await this.loadBrandOrThrow(input.branding);
|
|
481
|
+
this.requireDraftRevision(brand, input.expectedDraftRevision);
|
|
482
|
+
const histories = await this.listHistoriesAsc(String(brand.id));
|
|
483
|
+
const { version: activeVersion } = this.brandCounters(brand);
|
|
484
|
+
const activeRow = this.activeHistoryRow(histories, activeVersion);
|
|
485
|
+
const activeTypeface = (0, BrandingTypeface_1.normalizeTypefaceState)(brand.typeface ?? activeRow?.typeface ?? null);
|
|
486
|
+
await this.conditionalDraftUpdate(brand, { draftTypeface: activeTypeface });
|
|
487
|
+
return this.getAdminState(input.branding);
|
|
488
|
+
}
|
|
489
|
+
previewUrl(branding, portal, token) {
|
|
490
|
+
return `/${branding}/${portal}/preview/${token}.css`;
|
|
491
|
+
}
|
|
492
|
+
/** Generate preview CSS for an exact draft revision (non-mutating). */
|
|
493
|
+
async preview(branding, portal, expectedDraftRevision) {
|
|
494
|
+
const brand = await this.loadBrandOrThrow(branding);
|
|
495
|
+
const current = typeof brand.draftRevision === 'number' ? brand.draftRevision : 0;
|
|
496
|
+
if (expectedDraftRevision === undefined || expectedDraftRevision !== current) {
|
|
497
|
+
throw this.conflictError(brand);
|
|
498
|
+
}
|
|
499
|
+
const draftVariables = brand.variables ?? {};
|
|
500
|
+
const draftTypeface = this.draftTypefaceOf(brand);
|
|
501
|
+
if (!(0, BrandingTypeface_1.isPublishableTypefaceState)(draftTypeface)) {
|
|
502
|
+
throw this.codedError('branding-invalid', 'A custom typeface cannot be previewed without a Regular face');
|
|
503
|
+
}
|
|
504
|
+
const { css, hash } = BrandingThemeCssService.generate(draftVariables, {
|
|
505
|
+
typeface: draftTypeface,
|
|
506
|
+
brandName: String(brand.name),
|
|
507
|
+
});
|
|
222
508
|
const token = crypto.randomBytes(16).toString('hex');
|
|
223
509
|
const name = `branding-preview:${token}`;
|
|
224
510
|
const ts = Math.floor(Date.now() / 1000);
|
|
225
|
-
await CacheEntry.create({ name, data: { css, branding, portal, hash }, ts_added: ts });
|
|
226
|
-
|
|
227
|
-
|
|
511
|
+
await CacheEntry.create({ name, data: { css, branding, portal, hash, revision: current }, ts_added: ts });
|
|
512
|
+
return { token, url: this.previewUrl(branding, portal, token), hash, revision: current };
|
|
513
|
+
}
|
|
514
|
+
/** Preview a retained version without mutating the draft. */
|
|
515
|
+
async previewVersion(input) {
|
|
516
|
+
const brand = await this.loadBrandOrThrow(input.branding);
|
|
517
|
+
// Brand-scoped lookup: rows from another brand never match, so cross-brand
|
|
518
|
+
// restores/previews are rejected as not-found.
|
|
519
|
+
const histories = await this.listHistoriesAsc(String(brand.id));
|
|
520
|
+
const row = histories.find(history => String(history.id) === String(input.versionId));
|
|
521
|
+
if (!row) {
|
|
522
|
+
throw this.codedError('history-not-found', `Version not found: ${input.versionId}`);
|
|
523
|
+
}
|
|
524
|
+
const variables = row.variables ?? {};
|
|
525
|
+
const typeface = (0, BrandingTypeface_1.normalizeTypefaceState)(row.typeface);
|
|
526
|
+
const { css, hash } = BrandingThemeCssService.generate(variables, { typeface, brandName: String(brand.name) });
|
|
527
|
+
const token = crypto.randomBytes(16).toString('hex');
|
|
528
|
+
const ts = Math.floor(Date.now() / 1000);
|
|
529
|
+
await CacheEntry.create({
|
|
530
|
+
name: `branding-preview:${token}`,
|
|
531
|
+
data: { css, branding: input.branding, portal: input.portal, hash, versionId: String(row.id) },
|
|
532
|
+
ts_added: ts,
|
|
533
|
+
});
|
|
534
|
+
return { token, url: this.previewUrl(input.branding, input.portal, token), hash };
|
|
228
535
|
}
|
|
229
536
|
/** Fetch preview CSS (helper for tests); enforces TTL */
|
|
230
537
|
async fetchPreview(token) {
|
|
@@ -242,50 +549,247 @@ var Services;
|
|
|
242
549
|
await CacheEntry.destroy({ id: entry.id });
|
|
243
550
|
return entry.data;
|
|
244
551
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
const
|
|
248
|
-
if (!
|
|
249
|
-
throw
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
552
|
+
async buildPublishSnapshot(brand) {
|
|
553
|
+
const variables = BrandingThemeCssService.validateVariables(brand.variables ?? {});
|
|
554
|
+
const typeface = this.draftTypefaceOf(brand);
|
|
555
|
+
if (!(0, BrandingTypeface_1.isPublishableTypefaceState)(typeface)) {
|
|
556
|
+
throw this.codedError('branding-invalid', 'A custom typeface cannot be published without a Regular face');
|
|
557
|
+
}
|
|
558
|
+
await BrandingTypefaceService.assertTypefaceAvailable(String(brand.id), typeface);
|
|
559
|
+
const { css, hash } = BrandingThemeCssService.generate(variables, { typeface, brandName: String(brand.name) });
|
|
560
|
+
return { variables, typeface, css, hash };
|
|
561
|
+
}
|
|
562
|
+
async persistPublication(brand, historyValues, snapshot, nextVersion) {
|
|
563
|
+
const { version: activeVersion, draftRevision } = this.brandCounters(brand);
|
|
564
|
+
const datastore = typeof BrandingConfig.getDatastore === 'function' ? BrandingConfig.getDatastore() : undefined;
|
|
565
|
+
await (0, TransactionUtils_1.runWithOptionalTransaction)(datastore, async (connection) => {
|
|
566
|
+
const createQuery = BrandingConfigHistory.create(historyValues);
|
|
567
|
+
let created = null;
|
|
568
|
+
try {
|
|
569
|
+
created = await (connection && typeof createQuery.usingConnection === 'function'
|
|
570
|
+
? createQuery.usingConnection(connection)
|
|
571
|
+
: createQuery);
|
|
572
|
+
}
|
|
573
|
+
catch (error) {
|
|
574
|
+
if (!this.isUniqueViolation(error)) {
|
|
575
|
+
throw error;
|
|
576
|
+
}
|
|
577
|
+
const reread = await this.loadBrandOrThrow(String(brand.name));
|
|
578
|
+
throw this.conflictError(reread);
|
|
579
|
+
}
|
|
580
|
+
let updated;
|
|
581
|
+
try {
|
|
582
|
+
const updateQuery = BrandingConfig.updateOne({
|
|
583
|
+
id: brand.id,
|
|
584
|
+
version: activeVersion,
|
|
585
|
+
draftRevision,
|
|
586
|
+
}).set({
|
|
587
|
+
variables: snapshot.variables,
|
|
588
|
+
css: snapshot.css,
|
|
589
|
+
hash: snapshot.hash,
|
|
590
|
+
version: nextVersion,
|
|
591
|
+
typeface: snapshot.typeface,
|
|
592
|
+
draftTypeface: snapshot.typeface,
|
|
593
|
+
draftRevision: draftRevision + 1,
|
|
594
|
+
});
|
|
595
|
+
updated = await (connection && typeof updateQuery.usingConnection === 'function'
|
|
596
|
+
? updateQuery.usingConnection(connection)
|
|
597
|
+
: updateQuery);
|
|
598
|
+
}
|
|
599
|
+
catch (error) {
|
|
600
|
+
// Only adapter/Waterline validation failures certify non-application.
|
|
601
|
+
// A transport timeout may occur after commit: retain its history.
|
|
602
|
+
const code = error.code;
|
|
603
|
+
if (!connection &&
|
|
604
|
+
created?.id !== undefined &&
|
|
605
|
+
['E_INVALID_NEW_RECORD', 'E_INVALID_VALUES_TO_SET', 'E_USAGE', 'E_UNIQUE'].includes(code ?? '')) {
|
|
606
|
+
await BrandingConfigHistory.destroy({ id: created.id });
|
|
607
|
+
}
|
|
608
|
+
throw error;
|
|
609
|
+
}
|
|
610
|
+
if (!updated) {
|
|
611
|
+
if (!connection && created && created.id !== undefined) {
|
|
612
|
+
await BrandingConfigHistory.destroy({ id: created.id }).catch(() => undefined);
|
|
613
|
+
}
|
|
614
|
+
const reread = await this.loadBrandOrThrow(String(brand.name));
|
|
615
|
+
throw this.conflictError(reread);
|
|
616
|
+
}
|
|
617
|
+
}, { logger: sails.log });
|
|
618
|
+
}
|
|
619
|
+
/** Publish the draft atomically; unchanged publishes are idempotent. */
|
|
620
|
+
async publish(branding, portal, actor, opts) {
|
|
621
|
+
const brand = await this.loadBrandOrThrow(branding);
|
|
622
|
+
this.requireCounters(brand, opts?.expectedVersion, opts?.expectedDraftRevision);
|
|
623
|
+
const snapshot = await this.buildPublishSnapshot(brand);
|
|
624
|
+
const { version: activeVersion } = this.brandCounters(brand);
|
|
625
|
+
const histories = await this.listHistoriesAsc(String(brand.id));
|
|
626
|
+
const activeRow = this.activeHistoryRow(histories, activeVersion);
|
|
627
|
+
const activeVariables = activeRow?.variables ?? {};
|
|
628
|
+
const activeTypeface = (0, BrandingTypeface_1.normalizeTypefaceState)(brand.typeface ?? activeRow?.typeface ?? null);
|
|
629
|
+
if (String(brand.hash ?? '') === snapshot.hash &&
|
|
630
|
+
this.snapshotKey((0, BrandingTypeface_1.orderedTypefaceFaces)(snapshot.typeface).map(face => [face.slot, face.sha256])) ===
|
|
631
|
+
this.snapshotKey((0, BrandingTypeface_1.orderedTypefaceFaces)(activeTypeface).map(face => [face.slot, face.sha256]))) {
|
|
632
|
+
if (this.snapshotKey(snapshot.typeface) !== this.snapshotKey(activeTypeface) ||
|
|
633
|
+
this.snapshotKey(snapshot.variables) !== this.snapshotKey(activeVariables)) {
|
|
634
|
+
await this.conditionalDraftUpdate(brand, { variables: activeVariables, draftTypeface: activeTypeface });
|
|
635
|
+
}
|
|
636
|
+
// A previous write may have committed but lost its response before cache refresh.
|
|
637
|
+
await this.pruneHistories(String(brand.id));
|
|
638
|
+
await this.refreshBrandingCache(String(brand.id));
|
|
639
|
+
const state = await this.getAdminState(branding);
|
|
640
|
+
return { state, version: activeVersion, hash: String(brand.hash ?? ''), idempotent: true };
|
|
641
|
+
}
|
|
642
|
+
const maxVersion = histories.reduce((max, history) => Math.max(max, history.version), activeVersion);
|
|
643
|
+
const nextVersion = maxVersion + 1;
|
|
644
|
+
const attribution = this.extractActor(actor);
|
|
645
|
+
const historyValues = {
|
|
646
|
+
branding: brand.id,
|
|
647
|
+
version: nextVersion,
|
|
648
|
+
hash: snapshot.hash,
|
|
649
|
+
css: snapshot.css,
|
|
650
|
+
variables: snapshot.variables,
|
|
651
|
+
typeface: snapshot.typeface,
|
|
652
|
+
...(attribution.actorId ? { actorId: attribution.actorId } : {}),
|
|
653
|
+
...(attribution.actorDisplayName ? { actorDisplayName: attribution.actorDisplayName } : {}),
|
|
654
|
+
};
|
|
655
|
+
await this.persistPublication(brand, historyValues, snapshot, nextVersion);
|
|
656
|
+
await this.pruneSupersededAmbiguousHistories(String(brand.id), activeVersion, nextVersion, snapshot);
|
|
657
|
+
await this.pruneHistories(String(brand.id));
|
|
658
|
+
await this.refreshBrandingCache(String(brand.id));
|
|
659
|
+
const state = await this.getAdminState(branding);
|
|
660
|
+
return { state, version: nextVersion, hash: snapshot.hash };
|
|
661
|
+
}
|
|
662
|
+
/** Restore a retained version as a new monotonically increasing version. */
|
|
663
|
+
async restore(input) {
|
|
664
|
+
const brand = await this.loadBrandOrThrow(input.branding);
|
|
665
|
+
this.requireCounters(brand, input.expectedVersion, input.expectedDraftRevision);
|
|
666
|
+
const histories = await this.listHistoriesAsc(String(brand.id));
|
|
667
|
+
const row = histories.find(history => String(history.id) === String(input.versionId));
|
|
668
|
+
if (!row) {
|
|
669
|
+
throw this.codedError('history-not-found', `Version not found: ${input.versionId}`);
|
|
670
|
+
}
|
|
671
|
+
const { version: activeVersion } = this.brandCounters(brand);
|
|
672
|
+
const variables = BrandingThemeCssService.validateVariables(row.variables ?? {});
|
|
673
|
+
const typeface = (0, BrandingTypeface_1.normalizeTypefaceState)(row.typeface);
|
|
674
|
+
// Re-read and hash-check every face before any active mutation.
|
|
675
|
+
await BrandingTypefaceService.assertTypefaceAvailable(String(brand.id), typeface);
|
|
676
|
+
// Regenerate CSS from the historical snapshot rather than trusting stored CSS.
|
|
677
|
+
const { css, hash } = BrandingThemeCssService.generate(variables, { typeface, brandName: String(brand.name) });
|
|
678
|
+
const maxVersion = histories.reduce((max, history) => Math.max(max, history.version), activeVersion);
|
|
679
|
+
const nextVersion = maxVersion + 1;
|
|
680
|
+
const attribution = this.extractActor(input.actor);
|
|
681
|
+
const historyValues = {
|
|
682
|
+
branding: brand.id,
|
|
683
|
+
version: nextVersion,
|
|
684
|
+
hash,
|
|
685
|
+
css,
|
|
686
|
+
variables,
|
|
687
|
+
typeface,
|
|
688
|
+
restoredFromVersion: row.version,
|
|
689
|
+
...(attribution.actorId ? { actorId: attribution.actorId } : {}),
|
|
690
|
+
...(attribution.actorDisplayName ? { actorDisplayName: attribution.actorDisplayName } : {}),
|
|
691
|
+
};
|
|
692
|
+
await this.persistPublication(brand, historyValues, { css, hash, variables, typeface }, nextVersion);
|
|
693
|
+
await this.pruneSupersededAmbiguousHistories(String(brand.id), activeVersion, nextVersion, {
|
|
694
|
+
hash,
|
|
695
|
+
typeface,
|
|
696
|
+
});
|
|
697
|
+
await this.pruneHistories(String(brand.id));
|
|
698
|
+
await this.refreshBrandingCache(String(brand.id));
|
|
699
|
+
const state = await this.getAdminState(input.branding);
|
|
700
|
+
return { state, version: nextVersion, hash };
|
|
701
|
+
}
|
|
702
|
+
/**
|
|
703
|
+
* Deprecated one-major-release alias with restore semantics.
|
|
704
|
+
* Kept only for the compatibility route; new code must call restore.
|
|
705
|
+
*/
|
|
706
|
+
async rollback(versionId, actor, opts) {
|
|
707
|
+
let branding = opts?.branding;
|
|
708
|
+
if (!branding) {
|
|
709
|
+
const row = await BrandingConfigHistory.findOne({
|
|
710
|
+
id: versionId,
|
|
711
|
+
});
|
|
712
|
+
if (!row) {
|
|
713
|
+
throw this.codedError('history-not-found', `Version not found: ${versionId}`);
|
|
714
|
+
}
|
|
715
|
+
const populated = row.branding;
|
|
716
|
+
if (typeof populated === 'object' && populated !== null && populated.id !== undefined) {
|
|
717
|
+
const brand = await BrandingConfig.findOne({ id: populated.id });
|
|
718
|
+
if (!brand) {
|
|
719
|
+
throw this.codedError('branding-not-found', `Brand not found for version: ${versionId}`);
|
|
720
|
+
}
|
|
721
|
+
branding = String(brand.name);
|
|
722
|
+
}
|
|
723
|
+
else {
|
|
724
|
+
const brand = await BrandingConfig.findOne({ id: String(populated) });
|
|
725
|
+
if (!brand) {
|
|
726
|
+
throw this.codedError('branding-not-found', `Brand not found for version: ${versionId}`);
|
|
727
|
+
}
|
|
728
|
+
branding = String(brand.name);
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
return this.restore({
|
|
732
|
+
branding,
|
|
733
|
+
versionId,
|
|
734
|
+
expectedVersion: opts?.expectedVersion,
|
|
735
|
+
expectedDraftRevision: opts?.expectedDraftRevision,
|
|
736
|
+
actor,
|
|
278
737
|
});
|
|
279
|
-
|
|
738
|
+
}
|
|
739
|
+
/** Retain only the newest configured history rows after a durable transition. */
|
|
740
|
+
async pruneHistories(brandingId) {
|
|
741
|
+
const retain = this.readHistoryMaxVersions();
|
|
742
|
+
const histories = (await BrandingConfigHistory.find({ branding: brandingId }).sort('version DESC'));
|
|
743
|
+
for (const history of histories.slice(retain)) {
|
|
744
|
+
await BrandingConfigHistory.destroy({ id: history.id });
|
|
745
|
+
sails.log.verbose(`BrandingService pruned branding ${brandingId} version ${history.version}`);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* Remove an ambiguous non-transactional attempt once a later publication
|
|
750
|
+
* has committed the same snapshot. Such rows can sit above the active
|
|
751
|
+
* version when an update response is lost and must not consume retention.
|
|
752
|
+
*/
|
|
753
|
+
async pruneSupersededAmbiguousHistories(brandingId, activeVersion, successfulVersion, snapshot) {
|
|
754
|
+
const successfulIdentity = this.publicationIdentity(snapshot.hash, snapshot.typeface);
|
|
755
|
+
const histories = await this.listHistoriesAsc(brandingId);
|
|
756
|
+
for (const history of histories) {
|
|
757
|
+
if (history.version <= activeVersion ||
|
|
758
|
+
history.version >= successfulVersion ||
|
|
759
|
+
history.id === undefined ||
|
|
760
|
+
history.id === null ||
|
|
761
|
+
this.publicationIdentity(history.hash, history.typeface) !== successfulIdentity) {
|
|
762
|
+
continue;
|
|
763
|
+
}
|
|
764
|
+
await BrandingConfigHistory.destroy({ id: history.id });
|
|
765
|
+
sails.log.verbose(`BrandingService removed superseded ambiguous publication for brand ${brandingId} version ${history.version}`);
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
// ------------------------------------------------------------------
|
|
769
|
+
// Page-rendering helpers for layouts (design.md sections 3.4, 9.1).
|
|
770
|
+
// Synchronous reads of the in-memory brand cache so EJS layouts can
|
|
771
|
+
// decide font inclusion without storage I/O. A missing or corrupt active
|
|
772
|
+
// face never re-enables Google fonts here; the browser falls back via CSS
|
|
773
|
+
// while the Admin state carries the health warning.
|
|
774
|
+
// ------------------------------------------------------------------
|
|
775
|
+
/** Regular-face public URL for an active custom typeface, else null. */
|
|
776
|
+
getActiveTypefaceFontInfo(brandingName) {
|
|
777
|
+
const brand = this.getBrand(brandingName);
|
|
778
|
+
const typeface = (0, BrandingTypeface_1.normalizeTypefaceState)(brand?.typeface);
|
|
779
|
+
if (typeface.mode !== 'custom' || !typeface.faces?.regular) {
|
|
780
|
+
return null;
|
|
781
|
+
}
|
|
280
782
|
return {
|
|
281
|
-
|
|
282
|
-
hash: historyEntry.hash,
|
|
283
|
-
branding: refreshed
|
|
783
|
+
regularUrl: BrandingTypefaceService.publicUrl(String(brand?.name), typeface.faces.regular.sha256),
|
|
284
784
|
};
|
|
285
785
|
}
|
|
786
|
+
/** True when the resolved brand has an active custom typeface with a Regular face. */
|
|
787
|
+
hasActiveCustomTypeface(brandingName) {
|
|
788
|
+
return this.getActiveTypefaceFontInfo(brandingName) !== null;
|
|
789
|
+
}
|
|
286
790
|
/** Refresh a single branding record in the in-memory cache (this.brandings & availableBrandings) */
|
|
287
791
|
async refreshBrandingCache(id) {
|
|
288
|
-
const updated = await BrandingConfig.findOne({ id }).populate('roles');
|
|
792
|
+
const updated = (await BrandingConfig.findOne({ id }).populate('roles'));
|
|
289
793
|
if (updated) {
|
|
290
794
|
const idx = this.brandings.findIndex((b) => b.id === id);
|
|
291
795
|
if (idx >= 0) {
|
|
@@ -301,4 +805,4 @@ var Services;
|
|
|
301
805
|
}
|
|
302
806
|
Services.Branding = Branding;
|
|
303
807
|
})(Services || (exports.Services = Services = {}));
|
|
304
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJhbmRpbmdTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0JyYW5kaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEZBQTBGO0FBQzFGLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsdUVBQXVFO0FBQ3ZFLG9FQUFvRTtBQUNwRSxzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsZ0VBQWdFO0FBQ2hFLCtDQUErQztBQUMvQyxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw4REFBOEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUU5RCwrQkFBa0Q7QUFDbEQsOENBQXFEO0FBQ3JELGdEQUFzRDtBQUd0RCwrQ0FBaUM7QUFLakMsSUFBaUIsUUFBUSxDQXNReEI7QUF0UUQsV0FBaUIsUUFBUTtJQUN2Qjs7OztPQUlHO0lBQ0gsTUFBYSxRQUFTLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUU5QixnQkFBZ0IsR0FBYTtZQUM5QyxXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLFlBQVk7WUFDWixVQUFVO1lBQ1YsY0FBYztZQUNkLHVCQUF1QjtZQUN2QixxQkFBcUI7WUFDckIsaUJBQWlCO1lBQ2pCLGtCQUFrQjtZQUNsQixhQUFhO1lBQ2IsZ0JBQWdCO1lBQ2hCLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsV0FBVztZQUNYLFNBQVM7WUFDVCxjQUFjO1lBQ2QsU0FBUztZQUNULFVBQVU7WUFDVixzQkFBc0I7U0FDdkIsQ0FBQztRQUVRLGtCQUFrQixHQUFhLEVBQUUsQ0FBQTtRQUNqQyxTQUFTLEdBQW9CLEVBQUUsQ0FBQTtRQUMvQixNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFFaEMsU0FBUyxHQUFHLEdBQThCLEVBQUU7WUFDakQsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUM1RCxJQUFJLENBQUMsSUFBQSxvQkFBTyxFQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMzQixJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztvQkFDNUIsdUJBQXVCO29CQUN2QixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO29CQUM5RCxPQUFPLEtBQUssQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtnQkFDaEUsQ0FBQztnQkFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO2dCQUNyRCxPQUFPLElBQUEsU0FBRSxFQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzFCLENBQUMsQ0FBQyxFQUNFLElBQUEsb0JBQU8sRUFBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQTtRQUVNLG1CQUFtQixHQUFHLENBQUMsU0FBa0IsRUFBNkIsRUFBRTtZQUM3RSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQ3BELG9GQUFvRjtZQUNwRixrRkFBa0Y7WUFDbEYsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNsRSxJQUFJLENBQUMsSUFBQSxvQkFBTyxFQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQXlCLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sYUFBYSxHQUFrQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3ZELElBQUksYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUMxQixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO29CQUNqRCxPQUFPLElBQUEsaUJBQVUsRUFBQyxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLENBQUM7Z0JBQ0QsT0FBTyxJQUFBLFNBQUUsRUFBQyxhQUFhLENBQUMsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxDQUFBO1FBRU0sVUFBVSxHQUFHLEdBQWtCLEVBQUU7WUFDdEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFnQixFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUEsQ0FBQyxDQUFDLENBQWtCLENBQUM7UUFDOUcsQ0FBQyxDQUFBO1FBRU0sUUFBUSxHQUFHLENBQUMsSUFBWSxFQUFpQixFQUFFO1lBQ2hELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQSxDQUFDLENBQUMsQ0FBa0IsQ0FBQztRQUNsRyxDQUFDLENBQUE7UUFFTSxZQUFZLEdBQUcsQ0FBQyxFQUFVLEVBQWlCLEVBQUU7WUFDbEQsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFnQixFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFrQixDQUFDO1FBQzlGLENBQUMsQ0FBQTtRQUVNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFZO1lBQ3pDLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBNkIsQ0FBQztRQUM1RSxDQUFDO1FBRU0sWUFBWSxHQUFHLEdBQWEsRUFBRTtZQUNuQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNqQyxDQUFDLENBQUE7UUFFTSxxQkFBcUIsQ0FBQyxHQUEyQjtZQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsT0FBTyxJQUFJLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNsQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxHQUFHLFdBQVcsSUFBSSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7WUFDaEQsQ0FBQztRQUNILENBQUM7UUFFTSxjQUFjO1lBRW5CLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNsRCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBR00sV0FBVyxDQUFDLEdBQTJCO1lBQzVDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFTSxtQkFBbUIsQ0FBQyxHQUEyQjtZQUNwRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0QixNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3QyxRQUFRLEdBQUcsT0FBTyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN0RSxDQUFDO1lBQ0QsSUFBSSxRQUFRLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUM1QixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3JCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUN2QyxRQUFRLEdBQUcsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDcEUsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQzVCLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7b0JBQzdDLFFBQVEsR0FBRyxPQUFPLGVBQWUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUMxRSxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNyQixRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQzVDLENBQUM7WUFFRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRU0sZUFBZSxDQUFDLEdBQTJCO1lBQ2hELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRU0sZ0JBQWdCLENBQUMsR0FBMkI7WUFDakQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekMsTUFBTSxHQUFHLE9BQU8sV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDaEUsQ0FBQztZQUNELElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNyQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztvQkFDbkMsTUFBTSxHQUFHLE9BQU8sVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzlELENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUMxQixJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3hCLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO29CQUN6QyxNQUFNLEdBQUcsT0FBTyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDcEUsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUMzQyxDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELGlFQUFpRTtRQUMxRCxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWdGO1lBQ3JHLE1BQU0sVUFBVSxHQUFHLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7WUFDcEYsTUFBTSxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxLQUFLO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNsRCxNQUFNLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDekUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxnRUFBZ0U7UUFDekQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFnQixFQUFFLE1BQWM7WUFDbkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsdUJBQXVCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckQsTUFBTSxJQUFJLEdBQUcsb0JBQW9CLEtBQUssRUFBRSxDQUFDO1lBQ3pDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2RixNQUFNLEdBQUcsR0FBRyxJQUFJLFFBQVEsSUFBSSxNQUFNLFlBQVksS0FBSyxNQUFNLENBQUM7WUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUVELHlEQUF5RDtRQUNsRCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQWE7WUFDckMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsbUNBQW1DLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkUsTUFBTSxJQUFJLEdBQUcsb0JBQW9CLEtBQUssRUFBRSxDQUFDO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDM0QsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDckMsQ0FBQztZQUNELG1EQUFtRDtZQUNuRCxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0MsT0FBTyxLQUFLLENBQUMsSUFBd0UsQ0FBQztRQUN4RixDQUFDO1FBRUQsb0ZBQW9GO1FBQzdFLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsTUFBZSxFQUFFLElBQW9DO1lBQzFHLE1BQU0sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxLQUFLO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNsRCxJQUFJLElBQUksRUFBRSxlQUFlLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyRyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsdUJBQXVCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUUsd0ZBQXdGO1lBQ3hGLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM3RSxDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QyxNQUFNLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNsRixNQUFNLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDdkgsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFFRCw4REFBOEQ7UUFDdkQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFpQixFQUFFLE1BQWU7WUFDdEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFzRCxDQUFDO1lBQ3RKLElBQUksQ0FBQyxZQUFZO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN4RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBMkMsQ0FBQztZQUMxRSxJQUFJLENBQUMsUUFBUTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFFckQsNENBQTRDO1lBQzVDLE1BQU0sY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRyxRQUEwQixDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNsRSxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVM7Z0JBQ2pDLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDckIsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO2dCQUN2QixPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU87YUFDOUIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUUsUUFBMEIsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsRixPQUFPO2dCQUNMLE9BQU8sRUFBRSxZQUFZLENBQUMsT0FBTztnQkFDN0IsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO2dCQUN2QixRQUFRLEVBQUUsU0FBUzthQUNwQixDQUFDO1FBQ0osQ0FBQztRQUVELG9HQUFvRztRQUM3RixLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBVTtZQUMxQyxNQUFNLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQW9DLENBQUM7WUFDMUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDO2dCQUNoQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9CLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztLQUVGO0lBOVBZLGlCQUFRLFdBOFBwQixDQUFBO0FBRUgsQ0FBQyxFQXRRZ0IsUUFBUSx3QkFBUixRQUFRLFFBc1F4QiJ9
|
|
808
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJhbmRpbmdTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0JyYW5kaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEZBQTBGO0FBQzFGLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsdUVBQXVFO0FBQ3ZFLG9FQUFvRTtBQUNwRSxzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsZ0VBQWdFO0FBQ2hFLCtDQUErQztBQUMvQyxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw4REFBOEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUU5RCwrQkFBa0Q7QUFDbEQsOENBQXFEO0FBQ3JELGdEQUFzRDtBQUl0RCwrQ0FBaUM7QUFHakMsK0RBQW1FO0FBQ25FLGdFQVVtQztBQUNuQyxvRUFBMkU7QUE2QzNFLElBQWlCLFFBQVEsQ0FrNUJ4QjtBQWw1QkQsV0FBaUIsUUFBUTtJQUN2Qjs7OztPQUlHO0lBQ0gsTUFBYSxRQUFTLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUM5QixnQkFBZ0IsR0FBYTtZQUM5QyxXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLFlBQVk7WUFDWixVQUFVO1lBQ1YsY0FBYztZQUNkLHVCQUF1QjtZQUN2QixlQUFlO1lBQ2YscUJBQXFCO1lBQ3JCLGlCQUFpQjtZQUNqQixrQkFBa0I7WUFDbEIsYUFBYTtZQUNiLGdCQUFnQjtZQUNoQixjQUFjO1lBQ2QsbUJBQW1CO1lBQ25CLDJCQUEyQjtZQUMzQix5QkFBeUI7WUFDekIsZUFBZTtZQUNmLGNBQWM7WUFDZCxXQUFXO1lBQ1gsb0JBQW9CO1lBQ3BCLG9CQUFvQjtZQUNwQixzQkFBc0I7WUFDdEIscUJBQXFCO1lBQ3JCLFNBQVM7WUFDVCxnQkFBZ0I7WUFDaEIs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
|