@researchdatabox/redbox-core 5.0.4 → 5.1.0-beta.12568

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (548) 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 +5 -1
  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 +49 -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 +109 -13
  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 +49 -9
  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/FigsharePublishing.d.ts +1 -1
  156. package/dist/configmodels/OniPublishing.d.ts +205 -0
  157. package/dist/configmodels/OniPublishing.d.ts.map +1 -0
  158. package/dist/configmodels/OniPublishing.js +335 -0
  159. package/dist/configmodels/RaidPublishing.d.ts +97 -0
  160. package/dist/configmodels/RaidPublishing.d.ts.map +1 -0
  161. package/dist/configmodels/RaidPublishing.js +35 -0
  162. package/dist/configmodels/WebAnalytics.d.ts +55 -0
  163. package/dist/configmodels/WebAnalytics.d.ts.map +1 -0
  164. package/dist/configmodels/WebAnalytics.js +61 -0
  165. package/dist/controllers/AppConfigController.d.ts.map +1 -1
  166. package/dist/controllers/AppConfigController.js +4 -1
  167. package/dist/controllers/BrandingAppController.d.ts +29 -7
  168. package/dist/controllers/BrandingAppController.d.ts.map +1 -1
  169. package/dist/controllers/BrandingAppController.js +265 -69
  170. package/dist/controllers/BrandingController.d.ts +24 -1
  171. package/dist/controllers/BrandingController.d.ts.map +1 -1
  172. package/dist/controllers/BrandingController.js +173 -43
  173. package/dist/controllers/BrandingControllerSupport.d.ts +20 -0
  174. package/dist/controllers/BrandingControllerSupport.d.ts.map +1 -0
  175. package/dist/controllers/BrandingControllerSupport.js +80 -0
  176. package/dist/controllers/DashboardConfigController.d.ts +6 -2
  177. package/dist/controllers/DashboardConfigController.d.ts.map +1 -1
  178. package/dist/controllers/DashboardConfigController.js +18 -4
  179. package/dist/controllers/DynamicAssetController.d.ts +7 -5
  180. package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
  181. package/dist/controllers/DynamicAssetController.js +21 -12
  182. package/dist/controllers/RecordController.d.ts +45 -4
  183. package/dist/controllers/RecordController.d.ts.map +1 -1
  184. package/dist/controllers/RecordController.js +778 -345
  185. package/dist/controllers/index.d.ts.map +1 -1
  186. package/dist/controllers/index.js +4 -1
  187. package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
  188. package/dist/controllers/webservice/AdminController.js +4 -3
  189. package/dist/controllers/webservice/BrandingController.d.ts +26 -1
  190. package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
  191. package/dist/controllers/webservice/BrandingController.js +292 -116
  192. package/dist/controllers/webservice/DashboardConfigController.d.ts +25 -17
  193. package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -1
  194. package/dist/controllers/webservice/DashboardConfigController.js +90 -205
  195. package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
  196. package/dist/controllers/webservice/FormManagementController.js +37 -3
  197. package/dist/controllers/webservice/RecordController.d.ts +15 -1
  198. package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
  199. package/dist/controllers/webservice/RecordController.js +647 -267
  200. package/dist/controllers/webservice/RecordSchemaController.d.ts +32 -0
  201. package/dist/controllers/webservice/RecordSchemaController.d.ts.map +1 -0
  202. package/dist/controllers/webservice/RecordSchemaController.js +356 -0
  203. package/dist/controllers/webservice/RecordTypeController.d.ts +6 -1
  204. package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
  205. package/dist/controllers/webservice/RecordTypeController.js +21 -3
  206. package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
  207. package/dist/controllers/webservice/SearchController.js +7 -3
  208. package/dist/hooks/defineRedboxHook.d.ts +3 -0
  209. package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
  210. package/dist/hooks/defineRedboxHook.js +4 -1
  211. package/dist/index.d.ts +50 -23
  212. package/dist/index.d.ts.map +1 -1
  213. package/dist/index.js +90 -2
  214. package/dist/loader/bootstrapShimRuntime.d.ts +1 -1
  215. package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -1
  216. package/dist/loader/bootstrapShimRuntime.js +20 -12
  217. package/dist/loader/index.d.ts +9 -0
  218. package/dist/loader/index.d.ts.map +1 -1
  219. package/dist/loader/index.js +93 -4
  220. package/dist/model/BrandingTypeface.d.ts +70 -0
  221. package/dist/model/BrandingTypeface.d.ts.map +1 -0
  222. package/dist/model/BrandingTypeface.js +116 -0
  223. package/dist/model/BuildResponse.d.ts +25 -11
  224. package/dist/model/BuildResponse.d.ts.map +1 -1
  225. package/dist/model/BuildResponse.js +4 -3
  226. package/dist/model/DashboardTypeResponseModel.d.ts +6 -0
  227. package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
  228. package/dist/model/DashboardTypeResponseModel.js +7 -1
  229. package/dist/model/DashboardViewResponseModel.d.ts +5 -1
  230. package/dist/model/DashboardViewResponseModel.d.ts.map +1 -1
  231. package/dist/model/DashboardViewResponseModel.js +6 -3
  232. package/dist/model/RBValidationError.d.ts +17 -0
  233. package/dist/model/RBValidationError.d.ts.map +1 -1
  234. package/dist/model/RBValidationError.js +37 -1
  235. package/dist/model/RecordTypeResponseModel.d.ts +12 -4
  236. package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
  237. package/dist/model/RecordTypeResponseModel.js +11 -2
  238. package/dist/model/index.d.ts +5 -1
  239. package/dist/model/index.d.ts.map +1 -1
  240. package/dist/model/index.js +5 -2
  241. package/dist/model/record-contract.d.ts +42 -0
  242. package/dist/model/record-contract.d.ts.map +1 -0
  243. package/dist/model/record-contract.js +3 -0
  244. package/dist/model/storage/BrandingModel.d.ts +7 -0
  245. package/dist/model/storage/BrandingModel.d.ts.map +1 -1
  246. package/dist/model/storage/BrandingModel.js +7 -1
  247. package/dist/model/storage/DeletedRecordModel.d.ts +35 -0
  248. package/dist/model/storage/DeletedRecordModel.d.ts.map +1 -1
  249. package/dist/model/storage/DeletedRecordModel.js +62 -1
  250. package/dist/model/storage/IntegrationAuditModel.d.ts +16 -2
  251. package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -1
  252. package/dist/model/storage/IntegrationAuditModel.js +15 -1
  253. package/dist/model/storage/RecordAuditModel.d.ts +11 -1
  254. package/dist/model/storage/RecordAuditModel.d.ts.map +1 -1
  255. package/dist/model/storage/RecordAuditModel.js +8 -2
  256. package/dist/model/storage/RecordModel.d.ts +8 -2
  257. package/dist/model/storage/RecordModel.d.ts.map +1 -1
  258. package/dist/model/storage/RecordTypeModel.d.ts +6 -0
  259. package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
  260. package/dist/model/storage/RecordTypeModel.js +4 -1
  261. package/dist/model/storage/index.d.ts +12 -10
  262. package/dist/model/storage/index.d.ts.map +1 -1
  263. package/dist/model/storage/index.js +24 -2
  264. package/dist/model/storage/record-schema.d.ts +115 -0
  265. package/dist/model/storage/record-schema.d.ts.map +1 -0
  266. package/dist/model/storage/record-schema.js +3 -0
  267. package/dist/policies/checkAuth.d.ts +2 -6
  268. package/dist/policies/checkAuth.d.ts.map +1 -1
  269. package/dist/policies/checkAuth.js +32 -9
  270. package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
  271. package/dist/policies/contentSecurityPolicy.js +85 -2
  272. package/dist/policies/index.d.ts +3 -2
  273. package/dist/policies/index.d.ts.map +1 -1
  274. package/dist/policies/index.js +4 -2
  275. package/dist/policies/validateApiContractRequest.d.ts.map +1 -1
  276. package/dist/policies/validateApiContractRequest.js +49 -11
  277. package/dist/record-contract/ajv-error-mapper.d.ts +34 -0
  278. package/dist/record-contract/ajv-error-mapper.d.ts.map +1 -0
  279. package/dist/record-contract/ajv-error-mapper.js +153 -0
  280. package/dist/record-contract/canonical-json.d.ts +20 -0
  281. package/dist/record-contract/canonical-json.d.ts.map +1 -0
  282. package/dist/record-contract/canonical-json.js +126 -0
  283. package/dist/record-contract/codes.d.ts +36 -0
  284. package/dist/record-contract/codes.d.ts.map +1 -0
  285. package/dist/record-contract/codes.js +38 -0
  286. package/dist/record-contract/contributor-registry.d.ts +76 -0
  287. package/dist/record-contract/contributor-registry.d.ts.map +1 -0
  288. package/dist/record-contract/contributor-registry.js +126 -0
  289. package/dist/record-contract/core-contributors.d.ts +44 -0
  290. package/dist/record-contract/core-contributors.d.ts.map +1 -0
  291. package/dist/record-contract/core-contributors.js +395 -0
  292. package/dist/record-contract/deep-freeze.d.ts +3 -0
  293. package/dist/record-contract/deep-freeze.d.ts.map +1 -0
  294. package/dist/record-contract/deep-freeze.js +23 -0
  295. package/dist/record-contract/index.d.ts +13 -0
  296. package/dist/record-contract/index.d.ts.map +1 -0
  297. package/dist/record-contract/index.js +29 -0
  298. package/dist/record-contract/json-pointer.d.ts +20 -0
  299. package/dist/record-contract/json-pointer.d.ts.map +1 -0
  300. package/dist/record-contract/json-pointer.js +70 -0
  301. package/dist/record-contract/json-schema-renderer.d.ts +51 -0
  302. package/dist/record-contract/json-schema-renderer.d.ts.map +1 -0
  303. package/dist/record-contract/json-schema-renderer.js +450 -0
  304. package/dist/record-contract/record-contract-compiler.d.ts +42 -0
  305. package/dist/record-contract/record-contract-compiler.d.ts.map +1 -0
  306. package/dist/record-contract/record-contract-compiler.js +775 -0
  307. package/dist/record-contract/record-contract-context.d.ts +91 -0
  308. package/dist/record-contract/record-contract-context.d.ts.map +1 -0
  309. package/dist/record-contract/record-contract-context.js +39 -0
  310. package/dist/record-contract/record-json-schema-artifact.d.ts +74 -0
  311. package/dist/record-contract/record-json-schema-artifact.d.ts.map +1 -0
  312. package/dist/record-contract/record-json-schema-artifact.js +309 -0
  313. package/dist/record-contract/record-json-schema-etag.d.ts +15 -0
  314. package/dist/record-contract/record-json-schema-etag.d.ts.map +1 -0
  315. package/dist/record-contract/record-json-schema-etag.js +41 -0
  316. package/dist/record-contract/types.d.ts +151 -0
  317. package/dist/record-contract/types.d.ts.map +1 -0
  318. package/dist/record-contract/types.js +6 -0
  319. package/dist/services/AppConfigService.d.ts +6 -0
  320. package/dist/services/AppConfigService.d.ts.map +1 -1
  321. package/dist/services/AppConfigService.js +23 -1
  322. package/dist/services/AttachmentMetadataService.d.ts +58 -0
  323. package/dist/services/AttachmentMetadataService.d.ts.map +1 -1
  324. package/dist/services/AttachmentMetadataService.js +643 -8
  325. package/dist/services/BrandingLogoService.d.ts +6 -1
  326. package/dist/services/BrandingLogoService.d.ts.map +1 -1
  327. package/dist/services/BrandingLogoService.js +77 -9
  328. package/dist/services/BrandingService.d.ts +171 -9
  329. package/dist/services/BrandingService.d.ts.map +1 -1
  330. package/dist/services/BrandingService.js +572 -68
  331. package/dist/services/BrandingThemeCssService.d.ts +17 -1
  332. package/dist/services/BrandingThemeCssService.d.ts.map +1 -1
  333. package/dist/services/BrandingThemeCssService.js +71 -9
  334. package/dist/services/BrandingTypefaceService.d.ts +74 -0
  335. package/dist/services/BrandingTypefaceService.d.ts.map +1 -0
  336. package/dist/services/BrandingTypefaceService.js +359 -0
  337. package/dist/services/BrandingWoff2Inspector.d.ts +17 -0
  338. package/dist/services/BrandingWoff2Inspector.d.ts.map +1 -0
  339. package/dist/services/BrandingWoff2Inspector.js +402 -0
  340. package/dist/services/DashboardConfigService.d.ts +214 -54
  341. package/dist/services/DashboardConfigService.d.ts.map +1 -1
  342. package/dist/services/DashboardConfigService.js +829 -261
  343. package/dist/services/DashboardLegacyConversion.d.ts +82 -0
  344. package/dist/services/DashboardLegacyConversion.d.ts.map +1 -0
  345. package/dist/services/DashboardLegacyConversion.js +427 -0
  346. package/dist/services/DashboardTypesService.d.ts +15 -4
  347. package/dist/services/DashboardTypesService.d.ts.map +1 -1
  348. package/dist/services/DashboardTypesService.js +72 -139
  349. package/dist/services/DoiService.d.ts +1 -1
  350. package/dist/services/DoiService.d.ts.map +1 -1
  351. package/dist/services/DoiService.js +71 -45
  352. package/dist/services/FigshareService.d.ts.map +1 -1
  353. package/dist/services/FigshareService.js +8 -7
  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 +11 -11
  364. package/dist/services/I18nEntriesService.d.ts.map +1 -1
  365. package/dist/services/I18nEntriesService.js +71 -48
  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 +317 -26
  385. package/dist/services/RecordsService.d.ts.map +1 -1
  386. package/dist/services/RecordsService.js +5145 -765
  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/figshare-v2/worker.d.ts.map +1 -1
  419. package/dist/services/figshare-v2/worker.js +254 -74
  420. package/dist/services/form-record-access-user.d.ts +3 -0
  421. package/dist/services/form-record-access-user.d.ts.map +1 -0
  422. package/dist/services/form-record-access-user.js +23 -0
  423. package/dist/services/index.d.ts +9 -0
  424. package/dist/services/index.d.ts.map +1 -1
  425. package/dist/services/index.js +45 -3
  426. package/dist/services/integration-v2/bindings.d.ts +3 -0
  427. package/dist/services/integration-v2/bindings.d.ts.map +1 -0
  428. package/dist/services/integration-v2/bindings.js +91 -0
  429. package/dist/services/integration-v2/runtime.d.ts +3 -0
  430. package/dist/services/integration-v2/runtime.d.ts.map +1 -0
  431. package/dist/services/integration-v2/runtime.js +50 -0
  432. package/dist/services/internal-record-schema-authorization.d.ts +8 -0
  433. package/dist/services/internal-record-schema-authorization.d.ts.map +1 -0
  434. package/dist/services/internal-record-schema-authorization.js +16 -0
  435. package/dist/services/oni-v2/audit.d.ts +19 -0
  436. package/dist/services/oni-v2/audit.d.ts.map +1 -0
  437. package/dist/services/oni-v2/audit.js +50 -0
  438. package/dist/services/oni-v2/bindings.d.ts +7 -0
  439. package/dist/services/oni-v2/bindings.d.ts.map +1 -0
  440. package/dist/services/oni-v2/bindings.js +31 -0
  441. package/dist/services/oni-v2/config.d.ts +12 -0
  442. package/dist/services/oni-v2/config.d.ts.map +1 -0
  443. package/dist/services/oni-v2/config.js +134 -0
  444. package/dist/services/oni-v2/context.d.ts +3 -0
  445. package/dist/services/oni-v2/context.d.ts.map +1 -0
  446. package/dist/services/oni-v2/context.js +17 -0
  447. package/dist/services/oni-v2/crate.d.ts +17 -0
  448. package/dist/services/oni-v2/crate.d.ts.map +1 -0
  449. package/dist/services/oni-v2/crate.js +504 -0
  450. package/dist/services/oni-v2/flydriveOcflStore.d.ts +69 -0
  451. package/dist/services/oni-v2/flydriveOcflStore.d.ts.map +1 -0
  452. package/dist/services/oni-v2/flydriveOcflStore.js +325 -0
  453. package/dist/services/oni-v2/ingestion.d.ts +37 -0
  454. package/dist/services/oni-v2/ingestion.d.ts.map +1 -0
  455. package/dist/services/oni-v2/ingestion.js +91 -0
  456. package/dist/services/oni-v2/mapping.d.ts +17 -0
  457. package/dist/services/oni-v2/mapping.d.ts.map +1 -0
  458. package/dist/services/oni-v2/mapping.js +137 -0
  459. package/dist/services/oni-v2/repository.d.ts +9 -0
  460. package/dist/services/oni-v2/repository.d.ts.map +1 -0
  461. package/dist/services/oni-v2/repository.js +180 -0
  462. package/dist/services/oni-v2/runtime.d.ts +23 -0
  463. package/dist/services/oni-v2/runtime.d.ts.map +1 -0
  464. package/dist/services/oni-v2/runtime.js +121 -0
  465. package/dist/services/oni-v2/templating.d.ts +11 -0
  466. package/dist/services/oni-v2/templating.d.ts.map +1 -0
  467. package/dist/services/oni-v2/templating.js +27 -0
  468. package/dist/services/oni-v2/types.d.ts +100 -0
  469. package/dist/services/oni-v2/types.d.ts.map +1 -0
  470. package/dist/services/oni-v2/types.js +3 -0
  471. package/dist/services/raid-v2/audit.d.ts +10 -0
  472. package/dist/services/raid-v2/audit.d.ts.map +1 -0
  473. package/dist/services/raid-v2/audit.js +29 -0
  474. package/dist/services/raid-v2/errors.d.ts +85 -0
  475. package/dist/services/raid-v2/errors.d.ts.map +1 -0
  476. package/dist/services/raid-v2/errors.js +36 -0
  477. package/dist/services/raid-v2/http.d.ts +4 -0
  478. package/dist/services/raid-v2/http.d.ts.map +1 -0
  479. package/dist/services/raid-v2/http.js +84 -0
  480. package/dist/services/raid-v2/logger.d.ts +8 -0
  481. package/dist/services/raid-v2/logger.d.ts.map +1 -0
  482. package/dist/services/raid-v2/logger.js +30 -0
  483. package/dist/services/raid-v2/mapping.d.ts +9 -0
  484. package/dist/services/raid-v2/mapping.d.ts.map +1 -0
  485. package/dist/services/raid-v2/mapping.js +168 -0
  486. package/dist/services/raid-v2/runtime.d.ts +5 -0
  487. package/dist/services/raid-v2/runtime.d.ts.map +1 -0
  488. package/dist/services/raid-v2/runtime.js +135 -0
  489. package/dist/services/raid-v2/tags.d.ts +11 -0
  490. package/dist/services/raid-v2/tags.d.ts.map +1 -0
  491. package/dist/services/raid-v2/tags.js +12 -0
  492. package/dist/services/raid-v2/types.d.ts +66 -0
  493. package/dist/services/raid-v2/types.d.ts.map +1 -0
  494. package/dist/services/raid-v2/types.js +3 -0
  495. package/dist/services/record-hooks/coordinator.d.ts +64 -0
  496. package/dist/services/record-hooks/coordinator.d.ts.map +1 -0
  497. package/dist/services/record-hooks/coordinator.js +276 -0
  498. package/dist/visitor/client.visitor.d.ts +6 -0
  499. package/dist/visitor/client.visitor.d.ts.map +1 -1
  500. package/dist/visitor/client.visitor.js +59 -14
  501. package/dist/visitor/construct.visitor.d.ts +27 -1
  502. package/dist/visitor/construct.visitor.d.ts.map +1 -1
  503. package/dist/visitor/construct.visitor.js +265 -177
  504. package/dist/visitor/context-variables.visitor.d.ts +3 -1
  505. package/dist/visitor/context-variables.visitor.d.ts.map +1 -1
  506. package/dist/visitor/context-variables.visitor.js +15 -1
  507. package/dist/visitor/data-value.visitor.d.ts +6 -0
  508. package/dist/visitor/data-value.visitor.d.ts.map +1 -1
  509. package/dist/visitor/data-value.visitor.js +10 -1
  510. package/dist/visitor/json-type-def.visitor.d.ts +6 -0
  511. package/dist/visitor/json-type-def.visitor.d.ts.map +1 -1
  512. package/dist/visitor/json-type-def.visitor.js +10 -1
  513. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +11 -0
  514. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
  515. package/dist/visitor/migrate-config-v4-v5.visitor.js +228 -133
  516. package/dist/visitor/related-object-data-inline.visitor.d.ts +31 -0
  517. package/dist/visitor/related-object-data-inline.visitor.d.ts.map +1 -0
  518. package/dist/visitor/related-object-data-inline.visitor.js +96 -0
  519. package/dist/visitor/template.visitor.d.ts +17 -2
  520. package/dist/visitor/template.visitor.d.ts.map +1 -1
  521. package/dist/visitor/template.visitor.js +60 -22
  522. package/dist/visitor/validator.visitor.d.ts +49 -7
  523. package/dist/visitor/validator.visitor.d.ts.map +1 -1
  524. package/dist/visitor/validator.visitor.js +275 -178
  525. package/dist/waterline-models/AttachmentMetadata.d.ts +22 -0
  526. package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -1
  527. package/dist/waterline-models/AttachmentMetadata.js +147 -3
  528. package/dist/waterline-models/BrandingConfig.d.ts +7 -0
  529. package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
  530. package/dist/waterline-models/BrandingConfig.js +16 -1
  531. package/dist/waterline-models/BrandingConfigHistory.d.ts +11 -2
  532. package/dist/waterline-models/BrandingConfigHistory.d.ts.map +1 -1
  533. package/dist/waterline-models/BrandingConfigHistory.js +21 -1
  534. package/dist/waterline-models/DashboardConfiguration.d.ts +29 -0
  535. package/dist/waterline-models/DashboardConfiguration.d.ts.map +1 -0
  536. package/dist/waterline-models/DashboardConfiguration.js +52 -0
  537. package/dist/waterline-models/RecordType.d.ts +9 -0
  538. package/dist/waterline-models/RecordType.d.ts.map +1 -1
  539. package/dist/waterline-models/RecordType.js +16 -1
  540. package/dist/waterline-models/User.d.ts.map +1 -1
  541. package/dist/waterline-models/User.js +10 -15
  542. package/dist/waterline-models/index.d.ts +2 -0
  543. package/dist/waterline-models/index.d.ts.map +1 -1
  544. package/dist/waterline-models/index.js +4 -1
  545. package/package.json +59 -45
  546. package/dist/config/datapubs.config.d.ts +0 -72
  547. package/dist/config/datapubs.config.d.ts.map +0 -1
  548. package/dist/config/datapubs.config.js +0 -74
@@ -0,0 +1,639 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isCanonicalSaveRequestId = exports.RecordSaveTracker = exports.RecordSaveResponse = exports.RECORD_VALIDATION_REQUEST_FACT_NAMES = exports.RECORD_VALIDATION_BYPASS_REASONS = void 0;
4
+ exports.isRecordValidationBypassReason = isRecordValidationBypassReason;
5
+ exports.isInternalRecordValidationBypass = isInternalRecordValidationBypass;
6
+ exports.isRecordSaveContext = isRecordSaveContext;
7
+ exports.createRecordSaveSchemaOutcomeMetadata = createRecordSaveSchemaOutcomeMetadata;
8
+ exports.normalizeRecordValidationRequestFacts = normalizeRecordValidationRequestFacts;
9
+ exports.recordValidationRuntimeFacts = recordValidationRuntimeFacts;
10
+ exports.parsePublicValidationOperation = parsePublicValidationOperation;
11
+ exports.normalizeRecordConcurrencyContext = normalizeRecordConcurrencyContext;
12
+ exports.createRecordSaveContext = createRecordSaveContext;
13
+ exports.readSaveRequestId = readSaveRequestId;
14
+ exports.isRecordConflictStatus = isRecordConflictStatus;
15
+ exports.recordSaveFailureStatus = recordSaveFailureStatus;
16
+ exports.recordSaveDisplayErrors = recordSaveDisplayErrors;
17
+ exports.resolveStorageMutationState = resolveStorageMutationState;
18
+ exports.recordSaveProblem = recordSaveProblem;
19
+ const node_crypto_1 = require("node:crypto");
20
+ const lodash_1 = require("lodash");
21
+ const sails_ng_common_1 = require("@researchdatabox/sails-ng-common");
22
+ const codes_1 = require("./record-contract/codes");
23
+ const canonical_json_1 = require("./record-contract/canonical-json");
24
+ const StorageServiceResponse_1 = require("./StorageServiceResponse");
25
+ /** Reasons approved for the narrowly scoped internal validation bypass. */
26
+ exports.RECORD_VALIDATION_BYPASS_REASONS = [
27
+ 'historical-record-repair',
28
+ 'trusted-data-migration',
29
+ 'configuration-recovery',
30
+ ];
31
+ const SAFE_VALIDATION_BYPASS_SERVICE_ID = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/;
32
+ function isRecordValidationBypassReason(value) {
33
+ return typeof value === 'string' && exports.RECORD_VALIDATION_BYPASS_REASONS.includes(value);
34
+ }
35
+ /** Runtime guard for JavaScript callers crossing the internal capability boundary. */
36
+ function isInternalRecordValidationBypass(value) {
37
+ if (!value || typeof value !== 'object' || Array.isArray(value))
38
+ return false;
39
+ const candidate = value;
40
+ const actor = candidate.actor;
41
+ if (!actor || typeof actor !== 'object' || Array.isArray(actor))
42
+ return false;
43
+ const actorCandidate = actor;
44
+ return (candidate.mode === 'bypass' &&
45
+ isRecordValidationBypassReason(candidate.reason) &&
46
+ actorCandidate.kind === 'service' &&
47
+ typeof actorCandidate.id === 'string' &&
48
+ SAFE_VALIDATION_BYPASS_SERVICE_ID.test(actorCandidate.id.trim()));
49
+ }
50
+ const trustedRecordSaveContexts = new WeakSet();
51
+ const RECORD_SCHEMA_DIGEST_PATTERN = /^[0-9a-f]{64}$/;
52
+ const RECORD_SCHEMA_IMMUTABLE_URL_PATTERN = /^\/([^/?#]+)\/([^/?#]+)\/api\/records\/schemas\/([0-9a-f]{64})$/;
53
+ function invalidNestedRecordSaveContext(name) {
54
+ return new TypeError(`${name} must contain only acyclic JSON values.`);
55
+ }
56
+ /** Materialize caller-controlled accessors and proxies exactly once at the trust boundary. */
57
+ function materializeRecordSaveContextJSONValue(value, name, ancestors) {
58
+ if (value === null || typeof value === 'string' || typeof value === 'boolean')
59
+ return value;
60
+ if (typeof value === 'number') {
61
+ if (Number.isFinite(value))
62
+ return value;
63
+ throw invalidNestedRecordSaveContext(name);
64
+ }
65
+ if (typeof value !== 'object' || ancestors.has(value)) {
66
+ throw invalidNestedRecordSaveContext(name);
67
+ }
68
+ ancestors.add(value);
69
+ try {
70
+ if (Array.isArray(value)) {
71
+ const snapshot = [];
72
+ const length = value.length;
73
+ for (let index = 0; index < length; index += 1) {
74
+ snapshot.push(materializeRecordSaveContextJSONValue(value[index], name, ancestors));
75
+ }
76
+ return snapshot;
77
+ }
78
+ const prototype = Object.getPrototypeOf(value);
79
+ if (prototype !== Object.prototype && prototype !== null) {
80
+ throw invalidNestedRecordSaveContext(name);
81
+ }
82
+ const source = value;
83
+ const snapshot = {};
84
+ for (const key of Object.keys(source)) {
85
+ snapshot[key] = materializeRecordSaveContextJSONValue(source[key], name, ancestors);
86
+ }
87
+ return snapshot;
88
+ }
89
+ finally {
90
+ ancestors.delete(value);
91
+ }
92
+ }
93
+ function snapshotRecordSaveContextJSONValue(value, name) {
94
+ try {
95
+ const materialized = materializeRecordSaveContextJSONValue(value, name, new WeakSet());
96
+ return (0, canonical_json_1.normalizeRedboxCanonicalJsonV1)(materialized);
97
+ }
98
+ catch {
99
+ throw invalidNestedRecordSaveContext(name);
100
+ }
101
+ }
102
+ function snapshotRecordSaveContextObject(value, name) {
103
+ if (value === undefined)
104
+ return undefined;
105
+ const snapshot = snapshotRecordSaveContextJSONValue(value, name);
106
+ if (!snapshot || typeof snapshot !== 'object' || Array.isArray(snapshot)) {
107
+ throw invalidNestedRecordSaveContext(name);
108
+ }
109
+ return snapshot;
110
+ }
111
+ function snapshotRecordValidationBypass(value) {
112
+ if (value === undefined)
113
+ return undefined;
114
+ return snapshotRecordSaveContextJSONValue(value, 'validationBypass');
115
+ }
116
+ /** Runtime counterpart to the nominal context type for JavaScript/service boundaries. */
117
+ function isRecordSaveContext(value) {
118
+ if (!value || typeof value !== 'object' || Array.isArray(value))
119
+ return false;
120
+ return trustedRecordSaveContexts.has(value);
121
+ }
122
+ function isCanonicalEncodedRouteSegment(value) {
123
+ try {
124
+ const decoded = decodeURIComponent(value);
125
+ return decoded.length > 0 && decoded !== '.' && decoded !== '..' && encodeURIComponent(decoded) === value;
126
+ }
127
+ catch {
128
+ return false;
129
+ }
130
+ }
131
+ /** Validate and brand the schema identity exposed by a completed save. */
132
+ function createRecordSaveSchemaOutcomeMetadata(metadata) {
133
+ if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {
134
+ throw new TypeError('Record save schema outcome metadata must be an object.');
135
+ }
136
+ const candidate = metadata;
137
+ const digest = candidate.digest;
138
+ const immutableUrl = candidate.immutableUrl;
139
+ const completeness = candidate.completeness;
140
+ const enforcement = candidate.enforcement;
141
+ if (typeof digest !== 'string' || !RECORD_SCHEMA_DIGEST_PATTERN.test(digest)) {
142
+ throw new TypeError('Record save schema outcome digest must be a lowercase SHA-256 hexadecimal value.');
143
+ }
144
+ const matchedUrl = typeof immutableUrl === 'string' ? RECORD_SCHEMA_IMMUTABLE_URL_PATTERN.exec(immutableUrl) : null;
145
+ if (!matchedUrl || !isCanonicalEncodedRouteSegment(matchedUrl[1]) || !isCanonicalEncodedRouteSegment(matchedUrl[2])) {
146
+ throw new TypeError('Record save schema outcome immutable URL must be a canonical origin-relative schema URL.');
147
+ }
148
+ if (matchedUrl[3] !== digest) {
149
+ throw new TypeError('Record save schema outcome immutable URL must identify its digest.');
150
+ }
151
+ if (completeness !== 'complete' && completeness !== 'partial') {
152
+ throw new TypeError('Record save schema outcome completeness is invalid.');
153
+ }
154
+ if (enforcement !== 'shadow' && enforcement !== 'enforce') {
155
+ throw new TypeError('Record save schema outcome enforcement is invalid.');
156
+ }
157
+ return Object.freeze({
158
+ digest,
159
+ immutableUrl,
160
+ completeness,
161
+ enforcement,
162
+ });
163
+ }
164
+ exports.RECORD_VALIDATION_REQUEST_FACT_NAMES = ['recordType', 'targetStep', 'merge', 'datastreams'];
165
+ /**
166
+ * Project the same bounded request facts for browser and API transports.
167
+ * Sources are checked in order and accessors are never invoked.
168
+ */
169
+ function normalizeRecordValidationRequestFacts(...sources) {
170
+ const result = {};
171
+ for (const name of exports.RECORD_VALIDATION_REQUEST_FACT_NAMES) {
172
+ for (const source of sources) {
173
+ if (!source || typeof source !== 'object' || Array.isArray(source))
174
+ continue;
175
+ const descriptor = Object.getOwnPropertyDescriptor(source, name);
176
+ if (!descriptor || !('value' in descriptor) || descriptor.value === undefined)
177
+ continue;
178
+ const value = descriptor.value;
179
+ if (name === 'recordType' || name === 'targetStep') {
180
+ const normalized = typeof value === 'string' ? value.trim() : '';
181
+ if (sails_ng_common_1.RECORD_VALIDATION_REFERENCE_PATTERN.test(normalized)) {
182
+ result[name] = normalized;
183
+ break;
184
+ }
185
+ }
186
+ else if (value === true || value === false) {
187
+ result[name] = value;
188
+ break;
189
+ }
190
+ else if (value === 'true' || value === 'false') {
191
+ result[name] = value === 'true';
192
+ break;
193
+ }
194
+ }
195
+ }
196
+ return result;
197
+ }
198
+ /** Shared transport-neutral runtime facts; public callers cannot add objects. */
199
+ function recordValidationRuntimeFacts(context, writeKind) {
200
+ const routeFamily = context.routeFamily ?? 'internal';
201
+ return {
202
+ ...(routeFamily === 'internal' ? (context.validationRuntimeContext ?? {}) : {}),
203
+ routeFamily,
204
+ writeKind,
205
+ saveOperation: context.operation ?? writeKind,
206
+ };
207
+ }
208
+ /** Narrow and trim the public operation field before it enters save context. */
209
+ function parsePublicValidationOperation(value) {
210
+ if (value === undefined || value === null)
211
+ return { valid: true };
212
+ if (typeof value !== 'string')
213
+ return { valid: false };
214
+ const normalized = value.trim();
215
+ return sails_ng_common_1.VALIDATION_OPERATION_NAME_PATTERN.test(normalized) ? { valid: true, value: normalized } : { valid: false };
216
+ }
217
+ /** A typed response for record metadata save operations. */
218
+ class RecordSaveResponse extends StorageServiceResponse_1.StorageServiceResponse {
219
+ outcome = 'not-saved';
220
+ problems = [];
221
+ completion = (0, sails_ng_common_1.emptyRecordSaveCompletion)();
222
+ requestId;
223
+ context;
224
+ concurrency;
225
+ #schemaOutcome;
226
+ /** Legacy API v1 fields populated by the RDMP workspace post-save hook. */
227
+ workspaceOid;
228
+ workspaceData;
229
+ constructor(context = createRecordSaveContext()) {
230
+ super();
231
+ this.context = typeof context === 'string' ? createRecordSaveContext({ requestId: context }) : context;
232
+ this.requestId = this.context.requestId;
233
+ Object.defineProperty(this, 'schemaOutcome', {
234
+ configurable: false,
235
+ enumerable: true,
236
+ get: () => this.#schemaOutcome,
237
+ });
238
+ }
239
+ /** True when the primary metadata mutation is known to have been applied. */
240
+ wasPersisted() {
241
+ return this.outcome === 'saved' || this.outcome === 'saved-with-warnings';
242
+ }
243
+ /** True only when all required awaited save phases completed. */
244
+ isComplete() {
245
+ return (0, sails_ng_common_1.isRecordSaveComplete)(this);
246
+ }
247
+ addProblem(problem) {
248
+ this.problems.push(cloneProblem(problem));
249
+ if (problem.source !== 'advisory') {
250
+ this.downgradeCompleteSave();
251
+ }
252
+ }
253
+ setAttachmentItems(items) {
254
+ const copiedItems = (0, lodash_1.cloneDeep)(items);
255
+ this.completion = {
256
+ attachments: {
257
+ status: (0, sails_ng_common_1.reduceAttachmentStatus)(copiedItems),
258
+ items: copiedItems,
259
+ },
260
+ };
261
+ if (this.completion.attachments.status === 'incomplete' || this.completion.attachments.status === 'unknown') {
262
+ this.downgradeCompleteSave();
263
+ }
264
+ }
265
+ setProjectedMetadata(metadata) {
266
+ this.metadata = (0, lodash_1.cloneDeep)(metadata);
267
+ }
268
+ /** Retain only bounded server-owned concurrency diagnostics. */
269
+ setConcurrencyMetadata(metadata) {
270
+ this.concurrency = (0, sails_ng_common_1.sanitizeRecordConcurrencyMetadata)(metadata);
271
+ }
272
+ /** Compatibility view used by save-pipeline code while the response owns its state directly. */
273
+ get result() {
274
+ return this;
275
+ }
276
+ confirmPrimaryPersistence(oid, source) {
277
+ if (this.outcome === 'unknown')
278
+ return;
279
+ this.oid = oid ?? '';
280
+ if (source) {
281
+ this.message = typeof source.message === 'string' ? source.message : '';
282
+ this.data = (0, lodash_1.cloneDeep)(source.data);
283
+ this.metadata = (0, lodash_1.cloneDeep)(source.metadata ?? null);
284
+ this.totalItems = source.totalItems;
285
+ this.items = Array.isArray(source.items) ? (0, lodash_1.cloneDeep)(source.items) : [];
286
+ }
287
+ this.outcome = this.problems.some(problem => problem.source !== 'advisory')
288
+ ? 'saved-with-warnings'
289
+ : 'saved';
290
+ this.success = true;
291
+ }
292
+ recordPrimaryNotApplied(problem) {
293
+ this.recordPrimaryFailure('not-saved', problem);
294
+ }
295
+ recordPrimaryUnknown(problem) {
296
+ this.recordPrimaryFailure('unknown', problem);
297
+ }
298
+ recordPostPersistenceProblem(problem) {
299
+ this.addProblem(problem);
300
+ }
301
+ recordWarning(problem) {
302
+ this.addProblem(problem);
303
+ }
304
+ mergeLegacyHookFields(source) {
305
+ if (!source || typeof source !== 'object')
306
+ return;
307
+ const fields = source;
308
+ if (typeof fields.workspaceOid === 'string' && fields.workspaceOid.trim())
309
+ this.workspaceOid = fields.workspaceOid;
310
+ if (Object.hasOwn(fields, 'workspaceData'))
311
+ this.workspaceData = (0, lodash_1.cloneDeep)(fields.workspaceData);
312
+ }
313
+ toResponse() {
314
+ const copy = new RecordSaveResponse(this.context);
315
+ copy.success = this.success;
316
+ copy.oid = this.oid;
317
+ copy.message = this.message;
318
+ copy.data = (0, lodash_1.cloneDeep)(this.data);
319
+ copy.metadata = (0, lodash_1.cloneDeep)(this.metadata);
320
+ copy.details = (0, lodash_1.cloneDeep)(this.details);
321
+ copy.totalItems = this.totalItems;
322
+ copy.items = (0, lodash_1.cloneDeep)(this.items);
323
+ copy.outcome = this.outcome;
324
+ copy.problems = this.problems.map(cloneProblem);
325
+ copy.completion = (0, lodash_1.cloneDeep)(this.completion);
326
+ copy.setConcurrencyMetadata(this.concurrency);
327
+ copy.workspaceOid = this.workspaceOid;
328
+ copy.workspaceData = (0, lodash_1.cloneDeep)(this.workspaceData);
329
+ if (this.schemaOutcome)
330
+ copy.setSchemaOutcome(this.schemaOutcome);
331
+ return copy;
332
+ }
333
+ setSchemaOutcome(metadata) {
334
+ this.#schemaOutcome = createRecordSaveSchemaOutcomeMetadata(metadata);
335
+ }
336
+ /**
337
+ * A persisted save can only ever move from `saved` to `saved-with-warnings`.
338
+ * Non-persisted outcomes are left untouched so a later warning cannot
339
+ * manufacture a commit that never happened.
340
+ */
341
+ downgradeCompleteSave() {
342
+ if (this.outcome === 'saved') {
343
+ this.outcome = 'saved-with-warnings';
344
+ }
345
+ }
346
+ recordPrimaryFailure(outcome, problem) {
347
+ if (this.wasPersisted())
348
+ return;
349
+ this.outcome = outcome;
350
+ this.success = false;
351
+ if (problem)
352
+ this.addProblem(problem);
353
+ }
354
+ }
355
+ exports.RecordSaveResponse = RecordSaveResponse;
356
+ /**
357
+ * Small state owner used by RecordsService. Callers cannot accidentally
358
+ * downgrade a confirmed commit while handling a later warning.
359
+ */
360
+ class RecordSaveTracker {
361
+ context;
362
+ response;
363
+ constructor(context) {
364
+ this.context = context;
365
+ if (!isRecordSaveContext(context)) {
366
+ throw new TypeError('Record save contexts must be created by createRecordSaveContext().');
367
+ }
368
+ this.response = new RecordSaveResponse(context.requestId);
369
+ }
370
+ get result() {
371
+ return this.response;
372
+ }
373
+ confirmPrimaryPersistence(oid, source) {
374
+ if (this.response.outcome === 'unknown') {
375
+ return;
376
+ }
377
+ this.response.oid = oid ?? '';
378
+ if (source) {
379
+ // Preserve only compatibility-safe action fields. Adapter diagnostics
380
+ // stay in logs rather than crossing the save-result boundary.
381
+ this.response.message = typeof source.message === 'string' ? source.message : '';
382
+ this.response.data = (0, lodash_1.cloneDeep)(source.data);
383
+ this.response.metadata = (0, lodash_1.cloneDeep)(source.metadata ?? null);
384
+ this.response.totalItems = source.totalItems;
385
+ this.response.items = Array.isArray(source.items) ? (0, lodash_1.cloneDeep)(source.items) : [];
386
+ }
387
+ this.response.outcome = this.response.problems.some(problem => problem.source !== 'advisory')
388
+ ? 'saved-with-warnings'
389
+ : 'saved';
390
+ this.response.success = true;
391
+ }
392
+ recordPrimaryNotApplied(problem) {
393
+ this.recordPrimaryFailure('not-saved', problem);
394
+ }
395
+ recordPrimaryUnknown(problem) {
396
+ this.recordPrimaryFailure('unknown', problem);
397
+ }
398
+ recordPostPersistenceProblem(problem) {
399
+ this.response.addProblem(problem);
400
+ }
401
+ /** Track a nonblocking warning before or after the primary commit. */
402
+ recordWarning(problem) {
403
+ this.response.addProblem(problem);
404
+ }
405
+ setAttachmentItems(items) {
406
+ this.response.setAttachmentItems(items);
407
+ }
408
+ setProjectedMetadata(metadata) {
409
+ this.response.setProjectedMetadata(metadata);
410
+ }
411
+ setConcurrencyMetadata(metadata) {
412
+ this.response.setConcurrencyMetadata(metadata);
413
+ }
414
+ setSchemaOutcome(metadata) {
415
+ this.response.setSchemaOutcome(metadata);
416
+ }
417
+ /** Preserve the narrowly scoped legacy fields without exposing tracked save state to hooks. */
418
+ mergeLegacyHookFields(source) {
419
+ if (!source || typeof source !== 'object') {
420
+ return;
421
+ }
422
+ const hookFields = source;
423
+ if (typeof hookFields.workspaceOid === 'string' && hookFields.workspaceOid.trim()) {
424
+ this.response.workspaceOid = hookFields.workspaceOid;
425
+ }
426
+ if (Object.hasOwn(hookFields, 'workspaceData')) {
427
+ this.response.workspaceData = (0, lodash_1.cloneDeep)(hookFields.workspaceData);
428
+ }
429
+ }
430
+ /** A detached copy, so callers cannot mutate tracked state after the fact. */
431
+ toResponse() {
432
+ const copy = new RecordSaveResponse(this.response.requestId);
433
+ copy.success = this.response.success;
434
+ copy.oid = this.response.oid;
435
+ copy.message = this.response.message;
436
+ copy.data = (0, lodash_1.cloneDeep)(this.response.data);
437
+ copy.metadata = (0, lodash_1.cloneDeep)(this.response.metadata);
438
+ copy.details = (0, lodash_1.cloneDeep)(this.response.details);
439
+ copy.totalItems = this.response.totalItems;
440
+ copy.items = (0, lodash_1.cloneDeep)(this.response.items);
441
+ copy.outcome = this.response.outcome;
442
+ copy.problems = this.response.problems.map(cloneProblem);
443
+ copy.completion = {
444
+ attachments: {
445
+ status: this.response.completion.attachments.status,
446
+ items: (0, lodash_1.cloneDeep)(this.response.completion.attachments.items),
447
+ },
448
+ };
449
+ copy.setConcurrencyMetadata(this.response.concurrency);
450
+ copy.workspaceOid = this.response.workspaceOid;
451
+ copy.workspaceData = (0, lodash_1.cloneDeep)(this.response.workspaceData);
452
+ if (this.response.schemaOutcome) {
453
+ copy.setSchemaOutcome(this.response.schemaOutcome);
454
+ }
455
+ return copy;
456
+ }
457
+ recordPrimaryFailure(outcome, problem) {
458
+ if (this.response.wasPersisted()) {
459
+ return;
460
+ }
461
+ this.response.outcome = outcome;
462
+ this.response.success = false;
463
+ if (problem) {
464
+ this.response.addProblem(problem);
465
+ }
466
+ }
467
+ }
468
+ exports.RecordSaveTracker = RecordSaveTracker;
469
+ function cloneProblem(problem) {
470
+ return { ...problem, issues: problem.issues.map(sails_ng_common_1.sanitizeRecordSaveIssue) };
471
+ }
472
+ /**
473
+ * One canonical save request-correlation UUID. The format lives in the shared
474
+ * package so browser, controller, and concurrency diagnostics agree.
475
+ */
476
+ exports.isCanonicalSaveRequestId = sails_ng_common_1.isRecordSaveRequestId;
477
+ /** Drop every field outside the bounded server-owned concurrency allowlist. */
478
+ function normalizeRecordConcurrencyContext(value) {
479
+ if (!value || typeof value !== 'object' || Array.isArray(value))
480
+ return undefined;
481
+ const descriptors = Object.getOwnPropertyDescriptors(value);
482
+ const ownValue = (name) => {
483
+ const descriptor = descriptors[name];
484
+ return descriptor && 'value' in descriptor ? descriptor.value : undefined;
485
+ };
486
+ const expectedRevisionValue = ownValue('expectedRevision');
487
+ const formFingerprintValue = ownValue('formFingerprint');
488
+ const resolutionValue = ownValue('resolution');
489
+ const resolutionOfRequestIdValue = ownValue('resolutionOfRequestId');
490
+ const expectedRevision = (0, sails_ng_common_1.isRecordRevision)(expectedRevisionValue) ? expectedRevisionValue : undefined;
491
+ const formFingerprint = (0, sails_ng_common_1.isRecordFormFingerprint)(formFingerprintValue) ? formFingerprintValue : undefined;
492
+ const resolution = (0, sails_ng_common_1.isRecordConcurrencyResolution)(resolutionValue) ? resolutionValue : undefined;
493
+ const resolutionOfRequestId = (0, sails_ng_common_1.isRecordSaveRequestId)(resolutionOfRequestIdValue)
494
+ ? resolutionOfRequestIdValue
495
+ : undefined;
496
+ return {
497
+ entityTagSupplied: ownValue('entityTagSupplied') === true,
498
+ ...(expectedRevision !== undefined ? { expectedRevision } : {}),
499
+ ...(formFingerprint ? { formFingerprint } : {}),
500
+ ...(resolution ? { resolution } : {}),
501
+ ...(resolutionOfRequestId ? { resolutionOfRequestId } : {}),
502
+ };
503
+ }
504
+ function createRecordSaveContext(context = {}) {
505
+ const { requestId, routeFamily, operation, portal, targetStep, validationOperation, validationRequestParameters, validationRuntimeContext, validationBypass, concurrency: concurrencyInput, recordSchemaIfMatch, } = context;
506
+ const parsedSchemaOperation = parsePublicValidationOperation(validationOperation);
507
+ const concurrency = normalizeRecordConcurrencyContext(concurrencyInput);
508
+ const trustedContext = Object.freeze({
509
+ requestId: (0, exports.isCanonicalSaveRequestId)(requestId) ? requestId : (0, node_crypto_1.randomUUID)(),
510
+ routeFamily,
511
+ operation,
512
+ portal: typeof portal === 'string' && sails_ng_common_1.RECORD_VALIDATION_REFERENCE_PATTERN.test(portal.trim()) ? portal.trim() : undefined,
513
+ targetStep,
514
+ validationOperation,
515
+ schemaOperation: parsedSchemaOperation.valid
516
+ ? parsedSchemaOperation.value
517
+ : undefined,
518
+ ifMatch: typeof recordSchemaIfMatch === 'string' ? recordSchemaIfMatch : undefined,
519
+ validationRequestParameters: snapshotRecordSaveContextObject(validationRequestParameters, 'validationRequestParameters'),
520
+ validationRuntimeContext: snapshotRecordSaveContextObject(validationRuntimeContext, 'validationRuntimeContext'),
521
+ validationBypass: snapshotRecordValidationBypass(validationBypass),
522
+ ...(concurrency ? { concurrency: Object.freeze(concurrency) } : {}),
523
+ });
524
+ trustedRecordSaveContexts.add(trustedContext);
525
+ return trustedContext;
526
+ }
527
+ /**
528
+ * Read the client-supplied save request ID from request headers. Node
529
+ * lower-cases incoming header names, and anything that is not a single
530
+ * canonical UUID is replaced by a server-generated value.
531
+ */
532
+ function readSaveRequestId(headers) {
533
+ const header = headers?.['x-redbox-save-request-id'];
534
+ return (0, exports.isCanonicalSaveRequestId)(header) ? header : undefined;
535
+ }
536
+ /**
537
+ * Transport status for each certified concurrency failure, in the precedence
538
+ * the service resolves them. A conflict is a definitive non-write, so it must
539
+ * never be reported as a generic 500: the browser treats a 5xx as an ambiguous
540
+ * `unknown` result that may not be rebased or retried.
541
+ */
542
+ const RECORD_CONFLICT_STATUS_PRECEDENCE = [
543
+ ['record-precondition-required', 428],
544
+ ['record-revision-stale', 412],
545
+ ['record-deleted', 412],
546
+ ['form-definition-changed', 409],
547
+ ['record-lifecycle-operation-conflict', 409],
548
+ ];
549
+ /** Generic conflict status for a conflict problem without a recognised code. */
550
+ const RECORD_CONFLICT_DEFAULT_STATUS = 409;
551
+ /**
552
+ * The statuses a certified concurrency refusal uses. API v1 keeps its legacy
553
+ * body but must not collapse these to 500: a strict record type is an
554
+ * intentional opt-in status change, and a 5xx would read as an ambiguous
555
+ * `unknown` result that a client may retry.
556
+ */
557
+ const RECORD_CONFLICT_HTTP_STATUSES = new Set([409, 412, 428]);
558
+ function isRecordConflictStatus(status) {
559
+ return RECORD_CONFLICT_HTTP_STATUSES.has(status);
560
+ }
561
+ /** Kinds that certify no write occurred, and therefore map below a 5xx. */
562
+ const CERTIFIED_NON_WRITE_KINDS = new Set([
563
+ 'validation',
564
+ 'authorization',
565
+ 'conflict',
566
+ ]);
567
+ function conflictFailureStatus(problems) {
568
+ const conflicts = problems.filter(problem => problem.kind === 'conflict');
569
+ if (conflicts.length === 0) {
570
+ return undefined;
571
+ }
572
+ const codes = new Set(conflicts.flatMap(problem => problem.issues.map(issue => issue.code)));
573
+ const match = RECORD_CONFLICT_STATUS_PRECEDENCE.find(([code]) => codes.has(code));
574
+ return match ? match[1] : RECORD_CONFLICT_DEFAULT_STATUS;
575
+ }
576
+ /**
577
+ * HTTP status for a save that did not persist. Persisted outcomes never
578
+ * reach here: once primary metadata is applied the route family decides the
579
+ * success status and the warnings travel in the typed result.
580
+ */
581
+ function recordSaveFailureStatus(result) {
582
+ if (result?.outcome !== 'not-saved') {
583
+ // `unknown` is deliberately a 5xx: the client must not assume a non-write.
584
+ return 500;
585
+ }
586
+ // Select the most severe transport classification independently of problem
587
+ // insertion order: system-like failures outrank authorization, which outranks
588
+ // a certified conflict, which outranks ordinary validation failures.
589
+ if (result.problems.some(problem => !CERTIFIED_NON_WRITE_KINDS.has(problem.kind)))
590
+ return 500;
591
+ if (result.problems.some(problem => problem.kind === 'authorization'))
592
+ return 403;
593
+ const conflictStatus = conflictFailureStatus(result.problems);
594
+ if (conflictStatus !== undefined)
595
+ return conflictStatus;
596
+ if (result.problems.some(problem => problem.kind === 'validation' &&
597
+ problem.issues.some(issue => issue.code === codes_1.RECORD_SCHEMA_PROBLEM_CODES.PRECONDITION_FAILED)))
598
+ return 412;
599
+ if (result.problems.some(problem => problem.kind === 'validation'))
600
+ return 400;
601
+ return 500;
602
+ }
603
+ /**
604
+ * Project only the safe issue contract into the v2 JSON:API error array. The
605
+ * complete typed result remains in `meta`; raw exceptions and candidates are
606
+ * never used to infer a conflict.
607
+ */
608
+ function recordSaveDisplayErrors(result, fallbackDetail) {
609
+ const errors = (result?.problems ?? []).flatMap(problem => problem.issues.map(issue => ({
610
+ ...(issue.code ? { code: issue.code } : {}),
611
+ title: issue.message,
612
+ ...(issue.pointer ? { source: { pointer: issue.pointer } } : {}),
613
+ })));
614
+ return errors.length > 0 ? errors : [{ detail: fallbackDetail }];
615
+ }
616
+ /**
617
+ * Normalize old and new adapter responses at one boundary. Legacy success
618
+ * is trusted temporarily for compatibility; legacy false is ambiguous
619
+ * because a failed call is not proof that nothing was written.
620
+ */
621
+ function resolveStorageMutationState(response, logDeprecation) {
622
+ const explicit = response?.applicationState;
623
+ if (explicit === 'applied' || explicit === 'not-applied' || explicit === 'unknown') {
624
+ return explicit;
625
+ }
626
+ if (response?.success === true) {
627
+ logDeprecation?.('Legacy storage mutation response omitted application state', { oid: response.oid });
628
+ return 'applied';
629
+ }
630
+ return 'unknown';
631
+ }
632
+ function recordSaveProblem(kind, phase, message, code, issue = {}) {
633
+ return {
634
+ kind,
635
+ phase,
636
+ issues: [(0, sails_ng_common_1.sanitizeRecordSaveIssue)({ ...issue, ...(code ? { code } : {}), message })],
637
+ };
638
+ }
639
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkU2F2ZVJlc3BvbnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1JlY29yZFNhdmVSZXNwb25zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxREEsd0VBRUM7QUFpQkQsNEVBYUM7QUF3SUQsa0RBR0M7QUFZRCxzRkErQkM7QUFzQkQsc0ZBMEJDO0FBR0Qsb0VBV0M7QUFPRCx3RUFLQztBQXdTRCw4RUF3QkM7QUFFRCwwREFzQ0M7QUFPRCw4Q0FHQztBQTJCRCx3REFFQztBQXdCRCwwREF3QkM7QUFjRCwwREFZQztBQVNELGtFQWFDO0FBRUQsOENBWUM7QUFsMUJELDZDQUF5QztBQUN6QyxtQ0FBaUQ7QUFDakQsc0VBdUIwQztBQUUxQyxtREFBc0U7QUFDdEUscUVBQWtGO0FBQ2xGLHFFQUEyRjtBQWEzRiwyRUFBMkU7QUFDOUQsUUFBQSxnQ0FBZ0MsR0FBRztJQUM5QywwQkFBMEI7SUFDMUIsd0JBQXdCO0lBQ3hCLHdCQUF3QjtDQUNoQixDQUFDO0FBSVgsTUFBTSxpQ0FBaUMsR0FBRyxzQ0FBc0MsQ0FBQztBQUVqRixTQUFnQiw4QkFBOEIsQ0FBQyxLQUFjO0lBQzNELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFLLHdDQUFzRCxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RyxDQUFDO0FBZ0JELHNGQUFzRjtBQUN0RixTQUFnQixnQ0FBZ0MsQ0FBQyxLQUFjO0lBQzdELElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUUsTUFBTSxTQUFTLEdBQUcsS0FBZ0MsQ0FBQztJQUNuRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQzlCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFP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