@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.
Files changed (546) hide show
  1. package/dist/AttachmentStagingIdentity.d.ts +3 -0
  2. package/dist/AttachmentStagingIdentity.d.ts.map +1 -0
  3. package/dist/AttachmentStagingIdentity.js +10 -0
  4. package/dist/CoreController.d.ts +7 -3
  5. package/dist/CoreController.d.ts.map +1 -1
  6. package/dist/CoreController.js +85 -3
  7. package/dist/DatastreamService.d.ts +4 -0
  8. package/dist/DatastreamService.d.ts.map +1 -1
  9. package/dist/HarvestRunService.d.ts +4 -3
  10. package/dist/HarvestRunService.d.ts.map +1 -1
  11. package/dist/HarvestRunService.js +1 -1
  12. package/dist/RecordConcurrencyObservability.d.ts +51 -0
  13. package/dist/RecordConcurrencyObservability.d.ts.map +1 -0
  14. package/dist/RecordConcurrencyObservability.js +136 -0
  15. package/dist/RecordEntityTag.d.ts +31 -0
  16. package/dist/RecordEntityTag.d.ts.map +1 -0
  17. package/dist/RecordEntityTag.js +101 -0
  18. package/dist/RecordFormFingerprint.d.ts +7 -0
  19. package/dist/RecordFormFingerprint.d.ts.map +1 -0
  20. package/dist/RecordFormFingerprint.js +106 -0
  21. package/dist/RecordHttpConcurrency.d.ts +60 -0
  22. package/dist/RecordHttpConcurrency.d.ts.map +1 -0
  23. package/dist/RecordHttpConcurrency.js +181 -0
  24. package/dist/RecordSaveResponse.d.ts +219 -0
  25. package/dist/RecordSaveResponse.d.ts.map +1 -0
  26. package/dist/RecordSaveResponse.js +639 -0
  27. package/dist/RecordStorageConcurrency.d.ts +48 -0
  28. package/dist/RecordStorageConcurrency.d.ts.map +1 -0
  29. package/dist/RecordStorageConcurrency.js +103 -0
  30. package/dist/RecordWriteClassification.d.ts +12 -0
  31. package/dist/RecordWriteClassification.d.ts.map +1 -0
  32. package/dist/RecordWriteClassification.js +70 -0
  33. package/dist/RecordsService.d.ts +105 -12
  34. package/dist/RecordsService.d.ts.map +1 -1
  35. package/dist/RecordsService.js +44 -1
  36. package/dist/SearchService.d.ts +2 -1
  37. package/dist/SearchService.d.ts.map +1 -1
  38. package/dist/StorageService.d.ts +48 -8
  39. package/dist/StorageService.d.ts.map +1 -1
  40. package/dist/StorageService.js +19 -1
  41. package/dist/StorageServiceResponse.d.ts +22 -1
  42. package/dist/StorageServiceResponse.d.ts.map +1 -1
  43. package/dist/StorageServiceResponse.js +22 -4
  44. package/dist/action-execution/audit.d.ts +41 -0
  45. package/dist/action-execution/audit.d.ts.map +1 -0
  46. package/dist/action-execution/audit.js +122 -0
  47. package/dist/action-execution/executor.d.ts +24 -0
  48. package/dist/action-execution/executor.d.ts.map +1 -0
  49. package/dist/action-execution/executor.js +435 -0
  50. package/dist/action-execution/failure.d.ts +49 -0
  51. package/dist/action-execution/failure.d.ts.map +1 -0
  52. package/dist/action-execution/failure.js +129 -0
  53. package/dist/action-execution/index.d.ts +7 -0
  54. package/dist/action-execution/index.d.ts.map +1 -0
  55. package/dist/action-execution/index.js +23 -0
  56. package/dist/action-execution/legacy-result.d.ts +21 -0
  57. package/dist/action-execution/legacy-result.d.ts.map +1 -0
  58. package/dist/action-execution/legacy-result.js +70 -0
  59. package/dist/action-execution/policy.d.ts +12 -0
  60. package/dist/action-execution/policy.d.ts.map +1 -0
  61. package/dist/action-execution/policy.js +138 -0
  62. package/dist/action-execution/types.d.ts +121 -0
  63. package/dist/action-execution/types.d.ts.map +1 -0
  64. package/dist/action-execution/types.js +22 -0
  65. package/dist/api-routes/groups/branding.d.ts +8 -0
  66. package/dist/api-routes/groups/branding.d.ts.map +1 -1
  67. package/dist/api-routes/groups/branding.js +86 -11
  68. package/dist/api-routes/groups/dashboard-config.d.ts +12 -9
  69. package/dist/api-routes/groups/dashboard-config.d.ts.map +1 -1
  70. package/dist/api-routes/groups/dashboard-config.js +136 -73
  71. package/dist/api-routes/groups/forms.d.ts.map +1 -1
  72. package/dist/api-routes/groups/forms.js +10 -2
  73. package/dist/api-routes/groups/record-schemas.d.ts +5 -0
  74. package/dist/api-routes/groups/record-schemas.d.ts.map +1 -0
  75. package/dist/api-routes/groups/record-schemas.js +181 -0
  76. package/dist/api-routes/groups/records.d.ts +1 -0
  77. package/dist/api-routes/groups/records.d.ts.map +1 -1
  78. package/dist/api-routes/groups/records.js +141 -26
  79. package/dist/api-routes/index.d.ts +3 -0
  80. package/dist/api-routes/index.d.ts.map +1 -1
  81. package/dist/api-routes/index.js +4 -1
  82. package/dist/api-routes/openapi.d.ts.map +1 -1
  83. package/dist/api-routes/openapi.js +7 -5
  84. package/dist/api-routes/record-schema-openapi.d.ts +26 -0
  85. package/dist/api-routes/record-schema-openapi.d.ts.map +1 -0
  86. package/dist/api-routes/record-schema-openapi.js +38 -0
  87. package/dist/api-routes/record-schema-response.d.ts +40 -0
  88. package/dist/api-routes/record-schema-response.d.ts.map +1 -0
  89. package/dist/api-routes/record-schema-response.js +89 -0
  90. package/dist/api-routes/request-extraction.d.ts.map +1 -1
  91. package/dist/api-routes/request-extraction.js +10 -8
  92. package/dist/api-routes/route-factory.d.ts.map +1 -1
  93. package/dist/api-routes/route-factory.js +2 -1
  94. package/dist/api-routes/route-registry.d.ts.map +1 -1
  95. package/dist/api-routes/route-registry.js +3 -1
  96. package/dist/api-routes/schemas/common.d.ts +36 -0
  97. package/dist/api-routes/schemas/common.d.ts.map +1 -1
  98. package/dist/api-routes/schemas/common.js +95 -5
  99. package/dist/api-routes/schemas/responses.d.ts +1424 -1
  100. package/dist/api-routes/schemas/responses.d.ts.map +1 -1
  101. package/dist/api-routes/schemas/responses.js +382 -60
  102. package/dist/api-routes/types.d.ts +1 -0
  103. package/dist/api-routes/types.d.ts.map +1 -1
  104. package/dist/api-routes/validation.d.ts +5 -1
  105. package/dist/api-routes/validation.d.ts.map +1 -1
  106. package/dist/api-routes/validation.js +14 -15
  107. package/dist/bootstrap.d.ts +3 -1
  108. package/dist/bootstrap.d.ts.map +1 -1
  109. package/dist/bootstrap.js +58 -41
  110. package/dist/config/agendaQueue.config.d.ts +3 -0
  111. package/dist/config/agendaQueue.config.d.ts.map +1 -1
  112. package/dist/config/agendaQueue.config.js +29 -2
  113. package/dist/config/branding.config.d.ts +13 -0
  114. package/dist/config/branding.config.d.ts.map +1 -1
  115. package/dist/config/branding.config.js +34 -2
  116. package/dist/config/brandingConfigurationDefaults.config.d.ts +4 -0
  117. package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
  118. package/dist/config/brandingConfigurationDefaults.config.js +42 -3
  119. package/dist/config/index.d.ts +12 -4
  120. package/dist/config/index.d.ts.map +1 -1
  121. package/dist/config/index.js +7 -4
  122. package/dist/config/policies.config.d.ts.map +1 -1
  123. package/dist/config/policies.config.js +37 -23
  124. package/dist/config/raid.config.d.ts +7 -4
  125. package/dist/config/raid.config.d.ts.map +1 -1
  126. package/dist/config/raid.config.js +21 -35
  127. package/dist/config/record.config.d.ts +3 -0
  128. package/dist/config/record.config.d.ts.map +1 -1
  129. package/dist/config/record.config.js +37 -35
  130. package/dist/config/recordSchema.config.d.ts +68 -0
  131. package/dist/config/recordSchema.config.d.ts.map +1 -0
  132. package/dist/config/recordSchema.config.js +173 -0
  133. package/dist/config/recordValidation.config.d.ts +19 -0
  134. package/dist/config/recordValidation.config.d.ts.map +1 -0
  135. package/dist/config/recordValidation.config.js +10 -0
  136. package/dist/config/recordtype.config.d.ts +32 -9
  137. package/dist/config/recordtype.config.d.ts.map +1 -1
  138. package/dist/config/recordtype.config.js +4 -7
  139. package/dist/config/routes.config.d.ts.map +1 -1
  140. package/dist/config/routes.config.js +135 -53
  141. package/dist/config/workflow.config.d.ts +6 -0
  142. package/dist/config/workflow.config.d.ts.map +1 -1
  143. package/dist/config/workflow.config.js +1 -1
  144. package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -1
  145. package/dist/configmodels/AdminSidebarConfig.js +4 -2
  146. package/dist/configmodels/ConfigModels.d.ts +1 -1
  147. package/dist/configmodels/ConfigModels.d.ts.map +1 -1
  148. package/dist/configmodels/ConfigModels.js +26 -9
  149. package/dist/configmodels/DashboardFieldCatalogue.d.ts +67 -0
  150. package/dist/configmodels/DashboardFieldCatalogue.d.ts.map +1 -0
  151. package/dist/configmodels/DashboardFieldCatalogue.js +174 -0
  152. package/dist/configmodels/DashboardSettings.d.ts +191 -0
  153. package/dist/configmodels/DashboardSettings.d.ts.map +1 -0
  154. package/dist/configmodels/DashboardSettings.js +705 -0
  155. package/dist/configmodels/OniPublishing.d.ts +205 -0
  156. package/dist/configmodels/OniPublishing.d.ts.map +1 -0
  157. package/dist/configmodels/OniPublishing.js +335 -0
  158. package/dist/configmodels/RaidPublishing.d.ts +97 -0
  159. package/dist/configmodels/RaidPublishing.d.ts.map +1 -0
  160. package/dist/configmodels/RaidPublishing.js +35 -0
  161. package/dist/configmodels/WebAnalytics.d.ts +55 -0
  162. package/dist/configmodels/WebAnalytics.d.ts.map +1 -0
  163. package/dist/configmodels/WebAnalytics.js +61 -0
  164. package/dist/controllers/AppConfigController.d.ts.map +1 -1
  165. package/dist/controllers/AppConfigController.js +4 -1
  166. package/dist/controllers/BrandingAppController.d.ts +29 -7
  167. package/dist/controllers/BrandingAppController.d.ts.map +1 -1
  168. package/dist/controllers/BrandingAppController.js +265 -69
  169. package/dist/controllers/BrandingController.d.ts +24 -1
  170. package/dist/controllers/BrandingController.d.ts.map +1 -1
  171. package/dist/controllers/BrandingController.js +173 -43
  172. package/dist/controllers/BrandingControllerSupport.d.ts +20 -0
  173. package/dist/controllers/BrandingControllerSupport.d.ts.map +1 -0
  174. package/dist/controllers/BrandingControllerSupport.js +80 -0
  175. package/dist/controllers/DashboardConfigController.d.ts +6 -2
  176. package/dist/controllers/DashboardConfigController.d.ts.map +1 -1
  177. package/dist/controllers/DashboardConfigController.js +18 -4
  178. package/dist/controllers/DynamicAssetController.d.ts +7 -5
  179. package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
  180. package/dist/controllers/DynamicAssetController.js +21 -12
  181. package/dist/controllers/RecordController.d.ts +45 -4
  182. package/dist/controllers/RecordController.d.ts.map +1 -1
  183. package/dist/controllers/RecordController.js +778 -345
  184. package/dist/controllers/index.d.ts.map +1 -1
  185. package/dist/controllers/index.js +4 -1
  186. package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
  187. package/dist/controllers/webservice/AdminController.js +4 -3
  188. package/dist/controllers/webservice/BrandingController.d.ts +26 -1
  189. package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
  190. package/dist/controllers/webservice/BrandingController.js +292 -116
  191. package/dist/controllers/webservice/DashboardConfigController.d.ts +25 -17
  192. package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -1
  193. package/dist/controllers/webservice/DashboardConfigController.js +90 -205
  194. package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
  195. package/dist/controllers/webservice/FormManagementController.js +37 -3
  196. package/dist/controllers/webservice/RecordController.d.ts +15 -1
  197. package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
  198. package/dist/controllers/webservice/RecordController.js +647 -267
  199. package/dist/controllers/webservice/RecordSchemaController.d.ts +32 -0
  200. package/dist/controllers/webservice/RecordSchemaController.d.ts.map +1 -0
  201. package/dist/controllers/webservice/RecordSchemaController.js +356 -0
  202. package/dist/controllers/webservice/RecordTypeController.d.ts +6 -1
  203. package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
  204. package/dist/controllers/webservice/RecordTypeController.js +21 -3
  205. package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
  206. package/dist/controllers/webservice/SearchController.js +7 -3
  207. package/dist/hooks/defineRedboxHook.d.ts +3 -0
  208. package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
  209. package/dist/hooks/defineRedboxHook.js +4 -1
  210. package/dist/index.d.ts +50 -23
  211. package/dist/index.d.ts.map +1 -1
  212. package/dist/index.js +90 -2
  213. package/dist/loader/bootstrapShimRuntime.d.ts +1 -1
  214. package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -1
  215. package/dist/loader/bootstrapShimRuntime.js +20 -12
  216. package/dist/loader/index.d.ts +9 -0
  217. package/dist/loader/index.d.ts.map +1 -1
  218. package/dist/loader/index.js +93 -4
  219. package/dist/model/BrandingTypeface.d.ts +70 -0
  220. package/dist/model/BrandingTypeface.d.ts.map +1 -0
  221. package/dist/model/BrandingTypeface.js +116 -0
  222. package/dist/model/BuildResponse.d.ts +25 -11
  223. package/dist/model/BuildResponse.d.ts.map +1 -1
  224. package/dist/model/BuildResponse.js +4 -3
  225. package/dist/model/DashboardTypeResponseModel.d.ts +6 -0
  226. package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
  227. package/dist/model/DashboardTypeResponseModel.js +7 -1
  228. package/dist/model/DashboardViewResponseModel.d.ts +5 -1
  229. package/dist/model/DashboardViewResponseModel.d.ts.map +1 -1
  230. package/dist/model/DashboardViewResponseModel.js +6 -3
  231. package/dist/model/RBValidationError.d.ts +17 -0
  232. package/dist/model/RBValidationError.d.ts.map +1 -1
  233. package/dist/model/RBValidationError.js +37 -1
  234. package/dist/model/RecordTypeResponseModel.d.ts +12 -4
  235. package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
  236. package/dist/model/RecordTypeResponseModel.js +11 -2
  237. package/dist/model/index.d.ts +5 -1
  238. package/dist/model/index.d.ts.map +1 -1
  239. package/dist/model/index.js +5 -2
  240. package/dist/model/record-contract.d.ts +42 -0
  241. package/dist/model/record-contract.d.ts.map +1 -0
  242. package/dist/model/record-contract.js +3 -0
  243. package/dist/model/storage/BrandingModel.d.ts +7 -0
  244. package/dist/model/storage/BrandingModel.d.ts.map +1 -1
  245. package/dist/model/storage/BrandingModel.js +7 -1
  246. package/dist/model/storage/DeletedRecordModel.d.ts +35 -0
  247. package/dist/model/storage/DeletedRecordModel.d.ts.map +1 -1
  248. package/dist/model/storage/DeletedRecordModel.js +62 -1
  249. package/dist/model/storage/IntegrationAuditModel.d.ts +16 -2
  250. package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -1
  251. package/dist/model/storage/IntegrationAuditModel.js +15 -1
  252. package/dist/model/storage/RecordAuditModel.d.ts +11 -1
  253. package/dist/model/storage/RecordAuditModel.d.ts.map +1 -1
  254. package/dist/model/storage/RecordAuditModel.js +8 -2
  255. package/dist/model/storage/RecordModel.d.ts +6 -0
  256. package/dist/model/storage/RecordModel.d.ts.map +1 -1
  257. package/dist/model/storage/RecordTypeModel.d.ts +6 -0
  258. package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
  259. package/dist/model/storage/RecordTypeModel.js +4 -1
  260. package/dist/model/storage/index.d.ts +12 -10
  261. package/dist/model/storage/index.d.ts.map +1 -1
  262. package/dist/model/storage/index.js +24 -2
  263. package/dist/model/storage/record-schema.d.ts +115 -0
  264. package/dist/model/storage/record-schema.d.ts.map +1 -0
  265. package/dist/model/storage/record-schema.js +3 -0
  266. package/dist/policies/checkAuth.d.ts +2 -6
  267. package/dist/policies/checkAuth.d.ts.map +1 -1
  268. package/dist/policies/checkAuth.js +32 -9
  269. package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
  270. package/dist/policies/contentSecurityPolicy.js +85 -2
  271. package/dist/policies/index.d.ts +3 -2
  272. package/dist/policies/index.d.ts.map +1 -1
  273. package/dist/policies/index.js +4 -2
  274. package/dist/policies/validateApiContractRequest.d.ts.map +1 -1
  275. package/dist/policies/validateApiContractRequest.js +49 -11
  276. package/dist/record-contract/ajv-error-mapper.d.ts +34 -0
  277. package/dist/record-contract/ajv-error-mapper.d.ts.map +1 -0
  278. package/dist/record-contract/ajv-error-mapper.js +153 -0
  279. package/dist/record-contract/canonical-json.d.ts +20 -0
  280. package/dist/record-contract/canonical-json.d.ts.map +1 -0
  281. package/dist/record-contract/canonical-json.js +126 -0
  282. package/dist/record-contract/codes.d.ts +36 -0
  283. package/dist/record-contract/codes.d.ts.map +1 -0
  284. package/dist/record-contract/codes.js +38 -0
  285. package/dist/record-contract/contributor-registry.d.ts +76 -0
  286. package/dist/record-contract/contributor-registry.d.ts.map +1 -0
  287. package/dist/record-contract/contributor-registry.js +126 -0
  288. package/dist/record-contract/core-contributors.d.ts +44 -0
  289. package/dist/record-contract/core-contributors.d.ts.map +1 -0
  290. package/dist/record-contract/core-contributors.js +395 -0
  291. package/dist/record-contract/deep-freeze.d.ts +3 -0
  292. package/dist/record-contract/deep-freeze.d.ts.map +1 -0
  293. package/dist/record-contract/deep-freeze.js +23 -0
  294. package/dist/record-contract/index.d.ts +13 -0
  295. package/dist/record-contract/index.d.ts.map +1 -0
  296. package/dist/record-contract/index.js +29 -0
  297. package/dist/record-contract/json-pointer.d.ts +20 -0
  298. package/dist/record-contract/json-pointer.d.ts.map +1 -0
  299. package/dist/record-contract/json-pointer.js +70 -0
  300. package/dist/record-contract/json-schema-renderer.d.ts +51 -0
  301. package/dist/record-contract/json-schema-renderer.d.ts.map +1 -0
  302. package/dist/record-contract/json-schema-renderer.js +450 -0
  303. package/dist/record-contract/record-contract-compiler.d.ts +42 -0
  304. package/dist/record-contract/record-contract-compiler.d.ts.map +1 -0
  305. package/dist/record-contract/record-contract-compiler.js +775 -0
  306. package/dist/record-contract/record-contract-context.d.ts +91 -0
  307. package/dist/record-contract/record-contract-context.d.ts.map +1 -0
  308. package/dist/record-contract/record-contract-context.js +39 -0
  309. package/dist/record-contract/record-json-schema-artifact.d.ts +74 -0
  310. package/dist/record-contract/record-json-schema-artifact.d.ts.map +1 -0
  311. package/dist/record-contract/record-json-schema-artifact.js +309 -0
  312. package/dist/record-contract/record-json-schema-etag.d.ts +15 -0
  313. package/dist/record-contract/record-json-schema-etag.d.ts.map +1 -0
  314. package/dist/record-contract/record-json-schema-etag.js +41 -0
  315. package/dist/record-contract/types.d.ts +151 -0
  316. package/dist/record-contract/types.d.ts.map +1 -0
  317. package/dist/record-contract/types.js +6 -0
  318. package/dist/services/AppConfigService.d.ts +6 -0
  319. package/dist/services/AppConfigService.d.ts.map +1 -1
  320. package/dist/services/AppConfigService.js +23 -1
  321. package/dist/services/AttachmentMetadataService.d.ts +58 -0
  322. package/dist/services/AttachmentMetadataService.d.ts.map +1 -1
  323. package/dist/services/AttachmentMetadataService.js +643 -8
  324. package/dist/services/BrandingLogoService.d.ts +6 -1
  325. package/dist/services/BrandingLogoService.d.ts.map +1 -1
  326. package/dist/services/BrandingLogoService.js +77 -9
  327. package/dist/services/BrandingService.d.ts +171 -9
  328. package/dist/services/BrandingService.d.ts.map +1 -1
  329. package/dist/services/BrandingService.js +572 -68
  330. package/dist/services/BrandingThemeCssService.d.ts +17 -1
  331. package/dist/services/BrandingThemeCssService.d.ts.map +1 -1
  332. package/dist/services/BrandingThemeCssService.js +71 -9
  333. package/dist/services/BrandingTypefaceService.d.ts +74 -0
  334. package/dist/services/BrandingTypefaceService.d.ts.map +1 -0
  335. package/dist/services/BrandingTypefaceService.js +359 -0
  336. package/dist/services/BrandingWoff2Inspector.d.ts +17 -0
  337. package/dist/services/BrandingWoff2Inspector.d.ts.map +1 -0
  338. package/dist/services/BrandingWoff2Inspector.js +402 -0
  339. package/dist/services/DashboardConfigService.d.ts +214 -54
  340. package/dist/services/DashboardConfigService.d.ts.map +1 -1
  341. package/dist/services/DashboardConfigService.js +829 -261
  342. package/dist/services/DashboardLegacyConversion.d.ts +82 -0
  343. package/dist/services/DashboardLegacyConversion.d.ts.map +1 -0
  344. package/dist/services/DashboardLegacyConversion.js +427 -0
  345. package/dist/services/DashboardTypesService.d.ts +15 -4
  346. package/dist/services/DashboardTypesService.d.ts.map +1 -1
  347. package/dist/services/DashboardTypesService.js +72 -139
  348. package/dist/services/DoiService.d.ts +1 -1
  349. package/dist/services/DoiService.d.ts.map +1 -1
  350. package/dist/services/DoiService.js +71 -45
  351. package/dist/services/FigshareService.d.ts +1 -1
  352. package/dist/services/FigshareService.d.ts.map +1 -1
  353. package/dist/services/FigshareService.js +73 -32
  354. package/dist/services/FormRecordConsistencyService.d.ts +8 -23
  355. package/dist/services/FormRecordConsistencyService.d.ts.map +1 -1
  356. package/dist/services/FormRecordConsistencyService.js +54 -70
  357. package/dist/services/FormsService.d.ts +91 -2
  358. package/dist/services/FormsService.d.ts.map +1 -1
  359. package/dist/services/FormsService.js +324 -64
  360. package/dist/services/HarvestRunService.d.ts +6 -3
  361. package/dist/services/HarvestRunService.d.ts.map +1 -1
  362. package/dist/services/HarvestRunService.js +161 -97
  363. package/dist/services/I18nEntriesService.d.ts +1 -0
  364. package/dist/services/I18nEntriesService.d.ts.map +1 -1
  365. package/dist/services/I18nEntriesService.js +26 -6
  366. package/dist/services/OniService.d.ts +19 -62
  367. package/dist/services/OniService.d.ts.map +1 -1
  368. package/dist/services/OniService.js +223 -691
  369. package/dist/services/RDMPService.d.ts +1 -1
  370. package/dist/services/RDMPService.d.ts.map +1 -1
  371. package/dist/services/RDMPService.js +5 -5
  372. package/dist/services/RaidService.d.ts +19 -61
  373. package/dist/services/RaidService.d.ts.map +1 -1
  374. package/dist/services/RaidService.js +191 -530
  375. package/dist/services/RecordSchemaService.d.ts +440 -0
  376. package/dist/services/RecordSchemaService.d.ts.map +1 -0
  377. package/dist/services/RecordSchemaService.js +3061 -0
  378. package/dist/services/RecordTypesService.d.ts +29 -0
  379. package/dist/services/RecordTypesService.d.ts.map +1 -1
  380. package/dist/services/RecordTypesService.js +106 -11
  381. package/dist/services/RecordValidationService.d.ts +340 -0
  382. package/dist/services/RecordValidationService.d.ts.map +1 -0
  383. package/dist/services/RecordValidationService.js +1898 -0
  384. package/dist/services/RecordsService.d.ts +313 -22
  385. package/dist/services/RecordsService.d.ts.map +1 -1
  386. package/dist/services/RecordsService.js +4948 -509
  387. package/dist/services/SolrSearchService.d.ts +1 -1
  388. package/dist/services/SolrSearchService.d.ts.map +1 -1
  389. package/dist/services/SolrSearchService.js +42 -12
  390. package/dist/services/StandardDatastreamService.d.ts +4 -0
  391. package/dist/services/StandardDatastreamService.d.ts.map +1 -1
  392. package/dist/services/StandardDatastreamService.js +106 -44
  393. package/dist/services/TriggerService.d.ts.map +1 -1
  394. package/dist/services/TriggerService.js +54 -30
  395. package/dist/services/UsersService.d.ts +2 -1
  396. package/dist/services/UsersService.d.ts.map +1 -1
  397. package/dist/services/UsersService.js +364 -283
  398. package/dist/services/VocabularyService.d.ts +2 -0
  399. package/dist/services/VocabularyService.d.ts.map +1 -1
  400. package/dist/services/VocabularyService.js +61 -2
  401. package/dist/services/WorkflowStepsService.d.ts +11 -0
  402. package/dist/services/WorkflowStepsService.d.ts.map +1 -1
  403. package/dist/services/WorkflowStepsService.js +32 -3
  404. package/dist/services/WorkspaceService.d.ts +2 -2
  405. package/dist/services/WorkspaceService.d.ts.map +1 -1
  406. package/dist/services/WorkspaceService.js +5 -5
  407. package/dist/services/doi-v2/bindings.d.ts.map +1 -1
  408. package/dist/services/doi-v2/bindings.js +3 -20
  409. package/dist/services/doi-v2/config.d.ts +1 -0
  410. package/dist/services/doi-v2/config.d.ts.map +1 -1
  411. package/dist/services/doi-v2/config.js +13 -5
  412. package/dist/services/doi-v2/runtime.d.ts.map +1 -1
  413. package/dist/services/doi-v2/runtime.js +14 -54
  414. package/dist/services/figshare-v2/bindings.d.ts.map +1 -1
  415. package/dist/services/figshare-v2/bindings.js +3 -20
  416. package/dist/services/figshare-v2/runtime.d.ts.map +1 -1
  417. package/dist/services/figshare-v2/runtime.js +11 -58
  418. package/dist/services/form-record-access-user.d.ts +3 -0
  419. package/dist/services/form-record-access-user.d.ts.map +1 -0
  420. package/dist/services/form-record-access-user.js +23 -0
  421. package/dist/services/index.d.ts +9 -0
  422. package/dist/services/index.d.ts.map +1 -1
  423. package/dist/services/index.js +45 -3
  424. package/dist/services/integration-v2/bindings.d.ts +3 -0
  425. package/dist/services/integration-v2/bindings.d.ts.map +1 -0
  426. package/dist/services/integration-v2/bindings.js +91 -0
  427. package/dist/services/integration-v2/runtime.d.ts +3 -0
  428. package/dist/services/integration-v2/runtime.d.ts.map +1 -0
  429. package/dist/services/integration-v2/runtime.js +50 -0
  430. package/dist/services/internal-record-schema-authorization.d.ts +8 -0
  431. package/dist/services/internal-record-schema-authorization.d.ts.map +1 -0
  432. package/dist/services/internal-record-schema-authorization.js +16 -0
  433. package/dist/services/oni-v2/audit.d.ts +19 -0
  434. package/dist/services/oni-v2/audit.d.ts.map +1 -0
  435. package/dist/services/oni-v2/audit.js +50 -0
  436. package/dist/services/oni-v2/bindings.d.ts +7 -0
  437. package/dist/services/oni-v2/bindings.d.ts.map +1 -0
  438. package/dist/services/oni-v2/bindings.js +31 -0
  439. package/dist/services/oni-v2/config.d.ts +12 -0
  440. package/dist/services/oni-v2/config.d.ts.map +1 -0
  441. package/dist/services/oni-v2/config.js +134 -0
  442. package/dist/services/oni-v2/context.d.ts +3 -0
  443. package/dist/services/oni-v2/context.d.ts.map +1 -0
  444. package/dist/services/oni-v2/context.js +17 -0
  445. package/dist/services/oni-v2/crate.d.ts +17 -0
  446. package/dist/services/oni-v2/crate.d.ts.map +1 -0
  447. package/dist/services/oni-v2/crate.js +504 -0
  448. package/dist/services/oni-v2/flydriveOcflStore.d.ts +69 -0
  449. package/dist/services/oni-v2/flydriveOcflStore.d.ts.map +1 -0
  450. package/dist/services/oni-v2/flydriveOcflStore.js +325 -0
  451. package/dist/services/oni-v2/ingestion.d.ts +37 -0
  452. package/dist/services/oni-v2/ingestion.d.ts.map +1 -0
  453. package/dist/services/oni-v2/ingestion.js +91 -0
  454. package/dist/services/oni-v2/mapping.d.ts +17 -0
  455. package/dist/services/oni-v2/mapping.d.ts.map +1 -0
  456. package/dist/services/oni-v2/mapping.js +137 -0
  457. package/dist/services/oni-v2/repository.d.ts +9 -0
  458. package/dist/services/oni-v2/repository.d.ts.map +1 -0
  459. package/dist/services/oni-v2/repository.js +180 -0
  460. package/dist/services/oni-v2/runtime.d.ts +23 -0
  461. package/dist/services/oni-v2/runtime.d.ts.map +1 -0
  462. package/dist/services/oni-v2/runtime.js +121 -0
  463. package/dist/services/oni-v2/templating.d.ts +11 -0
  464. package/dist/services/oni-v2/templating.d.ts.map +1 -0
  465. package/dist/services/oni-v2/templating.js +27 -0
  466. package/dist/services/oni-v2/types.d.ts +100 -0
  467. package/dist/services/oni-v2/types.d.ts.map +1 -0
  468. package/dist/services/oni-v2/types.js +3 -0
  469. package/dist/services/raid-v2/audit.d.ts +10 -0
  470. package/dist/services/raid-v2/audit.d.ts.map +1 -0
  471. package/dist/services/raid-v2/audit.js +29 -0
  472. package/dist/services/raid-v2/errors.d.ts +85 -0
  473. package/dist/services/raid-v2/errors.d.ts.map +1 -0
  474. package/dist/services/raid-v2/errors.js +36 -0
  475. package/dist/services/raid-v2/http.d.ts +4 -0
  476. package/dist/services/raid-v2/http.d.ts.map +1 -0
  477. package/dist/services/raid-v2/http.js +84 -0
  478. package/dist/services/raid-v2/logger.d.ts +8 -0
  479. package/dist/services/raid-v2/logger.d.ts.map +1 -0
  480. package/dist/services/raid-v2/logger.js +30 -0
  481. package/dist/services/raid-v2/mapping.d.ts +9 -0
  482. package/dist/services/raid-v2/mapping.d.ts.map +1 -0
  483. package/dist/services/raid-v2/mapping.js +168 -0
  484. package/dist/services/raid-v2/runtime.d.ts +5 -0
  485. package/dist/services/raid-v2/runtime.d.ts.map +1 -0
  486. package/dist/services/raid-v2/runtime.js +135 -0
  487. package/dist/services/raid-v2/tags.d.ts +11 -0
  488. package/dist/services/raid-v2/tags.d.ts.map +1 -0
  489. package/dist/services/raid-v2/tags.js +12 -0
  490. package/dist/services/raid-v2/types.d.ts +66 -0
  491. package/dist/services/raid-v2/types.d.ts.map +1 -0
  492. package/dist/services/raid-v2/types.js +3 -0
  493. package/dist/services/record-hooks/coordinator.d.ts +64 -0
  494. package/dist/services/record-hooks/coordinator.d.ts.map +1 -0
  495. package/dist/services/record-hooks/coordinator.js +276 -0
  496. package/dist/visitor/client.visitor.d.ts +6 -0
  497. package/dist/visitor/client.visitor.d.ts.map +1 -1
  498. package/dist/visitor/client.visitor.js +59 -14
  499. package/dist/visitor/construct.visitor.d.ts +27 -1
  500. package/dist/visitor/construct.visitor.d.ts.map +1 -1
  501. package/dist/visitor/construct.visitor.js +265 -177
  502. package/dist/visitor/context-variables.visitor.d.ts +3 -1
  503. package/dist/visitor/context-variables.visitor.d.ts.map +1 -1
  504. package/dist/visitor/context-variables.visitor.js +15 -1
  505. package/dist/visitor/data-value.visitor.d.ts +6 -0
  506. package/dist/visitor/data-value.visitor.d.ts.map +1 -1
  507. package/dist/visitor/data-value.visitor.js +10 -1
  508. package/dist/visitor/json-type-def.visitor.d.ts +6 -0
  509. package/dist/visitor/json-type-def.visitor.d.ts.map +1 -1
  510. package/dist/visitor/json-type-def.visitor.js +10 -1
  511. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +11 -0
  512. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
  513. package/dist/visitor/migrate-config-v4-v5.visitor.js +228 -133
  514. package/dist/visitor/related-object-data-inline.visitor.d.ts +31 -0
  515. package/dist/visitor/related-object-data-inline.visitor.d.ts.map +1 -0
  516. package/dist/visitor/related-object-data-inline.visitor.js +96 -0
  517. package/dist/visitor/template.visitor.d.ts +17 -2
  518. package/dist/visitor/template.visitor.d.ts.map +1 -1
  519. package/dist/visitor/template.visitor.js +60 -22
  520. package/dist/visitor/validator.visitor.d.ts +49 -7
  521. package/dist/visitor/validator.visitor.d.ts.map +1 -1
  522. package/dist/visitor/validator.visitor.js +275 -178
  523. package/dist/waterline-models/AttachmentMetadata.d.ts +22 -0
  524. package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -1
  525. package/dist/waterline-models/AttachmentMetadata.js +147 -3
  526. package/dist/waterline-models/BrandingConfig.d.ts +7 -0
  527. package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
  528. package/dist/waterline-models/BrandingConfig.js +16 -1
  529. package/dist/waterline-models/BrandingConfigHistory.d.ts +11 -2
  530. package/dist/waterline-models/BrandingConfigHistory.d.ts.map +1 -1
  531. package/dist/waterline-models/BrandingConfigHistory.js +21 -1
  532. package/dist/waterline-models/DashboardConfiguration.d.ts +29 -0
  533. package/dist/waterline-models/DashboardConfiguration.d.ts.map +1 -0
  534. package/dist/waterline-models/DashboardConfiguration.js +52 -0
  535. package/dist/waterline-models/RecordType.d.ts +9 -0
  536. package/dist/waterline-models/RecordType.d.ts.map +1 -1
  537. package/dist/waterline-models/RecordType.js +16 -1
  538. package/dist/waterline-models/User.d.ts.map +1 -1
  539. package/dist/waterline-models/User.js +10 -15
  540. package/dist/waterline-models/index.d.ts +2 -0
  541. package/dist/waterline-models/index.d.ts.map +1 -1
  542. package/dist/waterline-models/index.js +4 -1
  543. package/package.json +60 -47
  544. package/dist/config/datapubs.config.d.ts +0 -72
  545. package/dist/config/datapubs.config.d.ts.map +0 -1
  546. 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("Default brand already exists...");
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("Loading available brands......");
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("Failed to load default brand!");
114
- return (0, rxjs_1.throwError)(new Error("Failed to load default brand!"));
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) => { return o.name == this.dBrand.name; });
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) => { return o.name == name; });
137
+ return _.find(this.brandings, (o) => {
138
+ return o.name == name;
139
+ });
124
140
  };
125
141
  getBrandById = (id) => {
126
- return _.find(this.brandings, (o) => { return o.id == id; });
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
- /** Save draft variables after whitelist + contrast validation */
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
- const brand = await BrandingConfig.findOne({ name: input.branding });
210
- if (!brand)
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
- /** Generate preview token storing compiled CSS in CacheEntry */
217
- async preview(branding, portal) {
218
- const brand = await BrandingConfig.findOne({ name: branding });
219
- if (!brand)
220
- throw new Error('branding-not-found');
221
- const { css, hash } = BrandingThemeCssService.generate(brand.variables || {});
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
- const url = `/${branding}/${portal}/preview/${token}.css`;
227
- return { token, url, hash };
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
- /** Publish current draft (variables) -> CSS, bump version, persist hash, history */
246
- async publish(branding, portal, _actor, opts) {
247
- const brand = await BrandingConfig.findOne({ name: branding });
248
- if (!brand)
249
- throw new Error('branding-not-found');
250
- if (opts?.expectedVersion != null && brand.version != null && opts.expectedVersion !== brand.version) {
251
- throw new Error('publish-conflict');
252
- }
253
- const { css, hash } = BrandingThemeCssService.generate(brand.variables || {});
254
- // Idempotency: if hash unchanged from last published, do not create new history/version
255
- if (brand.hash && brand.hash === hash) {
256
- return { version: brand.version || 0, hash: brand.hash, idempotent: true };
257
- }
258
- const newVersion = (brand.version || 0) + 1;
259
- await BrandingConfig.update({ id: brand.id }, { css, hash, version: newVersion });
260
- await BrandingConfigHistory.create({ branding: brand.id, version: newVersion, hash, css, variables: brand.variables });
261
- await this.refreshBrandingCache(brand.id);
262
- return { version: newVersion, hash };
263
- }
264
- /** Rollback to a previous published version via history id */
265
- async rollback(historyId, _actor) {
266
- const historyEntry = await BrandingConfigHistory.findOne({ id: historyId }).populate('branding');
267
- if (!historyEntry)
268
- throw new Error('history-not-found');
269
- const branding = historyEntry.branding;
270
- if (!branding)
271
- throw new Error('branding-not-found');
272
- // Restore variables, CSS, hash from history
273
- await BrandingConfig.update({ id: branding.id }, {
274
- variables: historyEntry.variables,
275
- css: historyEntry.css,
276
- hash: historyEntry.hash,
277
- version: historyEntry.version
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
- const refreshed = await this.refreshBrandingCache(branding.id);
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
- version: historyEntry.version,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJhbmRpbmdTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0JyYW5kaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEZBQTBGO0FBQzFGLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsdUVBQXVFO0FBQ3ZFLG9FQUFvRTtBQUNwRSxzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsZ0VBQWdFO0FBQ2hFLCtDQUErQztBQUMvQyxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw4REFBOEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUU5RCwrQkFBa0Q7QUFDbEQsOENBQXFEO0FBQ3JELGdEQUFzRDtBQUd0RCwrQ0FBaUM7QUFLakMsSUFBaUIsUUFBUSxDQXNReEI7QUF0UUQsV0FBaUIsUUFBUTtJQUN2Qjs7OztPQUlHO0lBQ0gsTUFBYSxRQUFTLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUU5QixnQkFBZ0IsR0FBYTtZQUM5QyxXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLFlBQVk7WUFDWixVQUFVO1lBQ1YsY0FBYztZQUNkLHVCQUF1QjtZQUN2QixxQkFBcUI7WUFDckIsaUJBQWlCO1lBQ2pCLGtCQUFrQjtZQUNsQixhQUFhO1lBQ2IsZ0JBQWdCO1lBQ2hCLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsV0FBVztZQUNYLFNBQVM7WUFDVCxjQUFjO1lBQ2QsU0FBUztZQUNULFVBQVU7WUFDVixzQkFBc0I7U0FDdkIsQ0FBQztRQUVRLGtCQUFrQixHQUFhLEVBQUUsQ0FBQTtRQUNqQyxTQUFTLEdBQW9CLEVBQUUsQ0FBQTtRQUMvQixNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFFaEMsU0FBUyxHQUFH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
808
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJhbmRpbmdTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0JyYW5kaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEZBQTBGO0FBQzFGLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsdUVBQXVFO0FBQ3ZFLG9FQUFvRTtBQUNwRSxzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsZ0VBQWdFO0FBQ2hFLCtDQUErQztBQUMvQyxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw4REFBOEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUU5RCwrQkFBa0Q7QUFDbEQsOENBQXFEO0FBQ3JELGdEQUFzRDtBQUl0RCwrQ0FBaUM7QUFHakMsK0RBQW1FO0FBQ25FLGdFQVVtQztBQUNuQyxvRUFBMkU7QUE2QzNFLElBQWlCLFFBQVEsQ0FrNUJ4QjtBQWw1QkQsV0FBaUIsUUFBUTtJQUN2Qjs7OztPQUlHO0lBQ0gsTUFBYSxRQUFTLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUM5QixnQkFBZ0IsR0FBYTtZQUM5QyxXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLFlBQVk7WUFDWixVQUFVO1lBQ1YsY0FBYztZQUNkLHVCQUF1QjtZQUN2QixlQUFlO1lBQ2YscUJBQXFCO1lBQ3JCLGlCQUFpQjtZQUNqQixrQkFBa0I7WUFDbEIsYUFBYTtZQUNiLGdCQUFnQjtZQUNoQixjQUFjO1lBQ2QsbUJBQW1CO1lBQ25CLDJCQUEyQjtZQUMzQix5QkFBeUI7WUFDekIsZUFBZTtZQUNmLGNBQWM7WUFDZCxXQUFXO1lBQ1gsb0JBQW9CO1lBQ3BCLG9CQUFvQjtZQUNwQixzQkFBc0I7WUFDdEIscUJBQXFCO1lBQ3JCLFNBQVM7WUFDVCxnQkFBZ0I7WUFDaEIs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