@researchdatabox/redbox-core 5.0.4-beta.12498 → 5.0.5

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