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

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