@party-stack/ontology 0.19.0 → 0.20.0

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 (401) hide show
  1. package/lib/OntologyPullConfig.d.ts +15 -13
  2. package/lib/OntologyPullConfig.d.ts.map +1 -1
  3. package/lib/OntologyPullConfig.js +0 -1
  4. package/lib/cli/format.d.ts +4 -0
  5. package/lib/cli/format.d.ts.map +1 -0
  6. package/lib/cli/format.js +19 -0
  7. package/lib/cli/format.js.map +1 -0
  8. package/lib/cli/generate.d.ts +6 -5
  9. package/lib/cli/generate.d.ts.map +1 -1
  10. package/lib/cli/generate.js +86 -110
  11. package/lib/cli/generate.js.map +1 -1
  12. package/lib/cli/index.d.ts +1 -3
  13. package/lib/cli/index.js +42 -59
  14. package/lib/cli/index.js.map +1 -1
  15. package/lib/cli/pull.d.ts +3 -1
  16. package/lib/cli/pull.d.ts.map +1 -1
  17. package/lib/cli/pull.js +42 -60
  18. package/lib/cli/pull.js.map +1 -1
  19. package/lib/examples/blog.d.ts +347 -345
  20. package/lib/examples/blog.d.ts.map +1 -1
  21. package/lib/examples/blog.js +350 -337
  22. package/lib/examples/blog.js.map +1 -1
  23. package/lib/examples/blog.live-queries.d.ts +8 -3
  24. package/lib/examples/blog.live-queries.d.ts.map +1 -1
  25. package/lib/examples/blog.live-queries.js +28 -44
  26. package/lib/examples/blog.live-queries.js.map +1 -1
  27. package/lib/examples/generated/constants.d.ts +1 -2
  28. package/lib/examples/generated/constants.js +0 -2
  29. package/lib/examples/generated/live.d.ts +5 -3
  30. package/lib/examples/generated/live.d.ts.map +1 -1
  31. package/lib/examples/generated/live.js +12 -8
  32. package/lib/examples/generated/live.js.map +1 -1
  33. package/lib/examples/generated/types.d.ts +52 -50
  34. package/lib/examples/generated/types.d.ts.map +1 -1
  35. package/lib/examples/generated/types.js +0 -2
  36. package/lib/generate/builders.d.ts +8 -5
  37. package/lib/generate/builders.d.ts.map +1 -1
  38. package/lib/generate/builders.js +53 -55
  39. package/lib/generate/builders.js.map +1 -1
  40. package/lib/generate/constants.d.ts +3 -1
  41. package/lib/generate/constants.d.ts.map +1 -1
  42. package/lib/generate/constants.js +23 -26
  43. package/lib/generate/constants.js.map +1 -1
  44. package/lib/generate/index.d.ts +6 -6
  45. package/lib/generate/index.js +6 -6
  46. package/lib/generate/live.d.ts +8 -6
  47. package/lib/generate/live.d.ts.map +1 -1
  48. package/lib/generate/live.js +43 -42
  49. package/lib/generate/live.js.map +1 -1
  50. package/lib/generate/ontology.d.ts +4 -2
  51. package/lib/generate/ontology.d.ts.map +1 -1
  52. package/lib/generate/ontology.js +453 -354
  53. package/lib/generate/ontology.js.map +1 -1
  54. package/lib/generate/types.d.ts +7 -5
  55. package/lib/generate/types.d.ts.map +1 -1
  56. package/lib/generate/types.js +190 -262
  57. package/lib/generate/types.js.map +1 -1
  58. package/lib/generate/utils/buildJsDocs.d.ts +7 -4
  59. package/lib/generate/utils/buildJsDocs.d.ts.map +1 -1
  60. package/lib/generate/utils/buildJsDocs.js +14 -10
  61. package/lib/generate/utils/buildJsDocs.js.map +1 -1
  62. package/lib/index.d.ts +30 -13
  63. package/lib/index.js +18 -10
  64. package/lib/infer.d.ts +129 -151
  65. package/lib/infer.d.ts.map +1 -1
  66. package/lib/infer.js +10 -6
  67. package/lib/infer.js.map +1 -1
  68. package/lib/installation/createMetaOntologyConfiguration.d.ts +6 -3
  69. package/lib/installation/createMetaOntologyConfiguration.d.ts.map +1 -1
  70. package/lib/installation/createMetaOntologyConfiguration.js +13 -11
  71. package/lib/installation/createMetaOntologyConfiguration.js.map +1 -1
  72. package/lib/installation/createOntologyBackendInstallation.d.ts +3 -1
  73. package/lib/installation/createOntologyBackendInstallation.d.ts.map +1 -1
  74. package/lib/installation/createOntologyBackendInstallation.js +205 -268
  75. package/lib/installation/createOntologyBackendInstallation.js.map +1 -1
  76. package/lib/installation/index.d.ts +4 -4
  77. package/lib/installation/index.js +3 -3
  78. package/lib/installation/types.d.ts +83 -80
  79. package/lib/installation/types.d.ts.map +1 -1
  80. package/lib/installation/types.js +0 -1
  81. package/lib/ir/generated/builders.d.ts +294 -382
  82. package/lib/ir/generated/builders.d.ts.map +1 -1
  83. package/lib/ir/generated/builders.js +180 -119
  84. package/lib/ir/generated/builders.js.map +1 -1
  85. package/lib/ir/generated/constants.d.ts +137 -135
  86. package/lib/ir/generated/constants.d.ts.map +1 -1
  87. package/lib/ir/generated/constants.js +162 -129
  88. package/lib/ir/generated/constants.js.map +1 -1
  89. package/lib/ir/generated/types.d.ts +236 -234
  90. package/lib/ir/generated/types.d.ts.map +1 -1
  91. package/lib/ir/generated/types.js +0 -2
  92. package/lib/ir/index.d.ts +4 -4
  93. package/lib/ir/index.js +3 -4
  94. package/lib/ir/schema.d.ts +2174 -2172
  95. package/lib/ir/schema.d.ts.map +1 -1
  96. package/lib/ir/schema.js +1184 -1343
  97. package/lib/ir/schema.js.map +1 -1
  98. package/lib/ir/validate.d.ts +5 -3
  99. package/lib/ir/validate.d.ts.map +1 -1
  100. package/lib/ir/validate.js +589 -707
  101. package/lib/ir/validate.js.map +1 -1
  102. package/lib/json/index.d.ts +10 -8
  103. package/lib/json/index.d.ts.map +1 -1
  104. package/lib/json/index.js +101 -135
  105. package/lib/json/index.js.map +1 -1
  106. package/lib/lenses.d.ts +7 -4
  107. package/lib/lenses.d.ts.map +1 -1
  108. package/lib/lenses.js +96 -132
  109. package/lib/lenses.js.map +1 -1
  110. package/lib/live/LiveOntology.d.ts +55 -60
  111. package/lib/live/LiveOntology.d.ts.map +1 -1
  112. package/lib/live/LiveOntology.js +98 -124
  113. package/lib/live/LiveOntology.js.map +1 -1
  114. package/lib/live/OntologyBackendAdapter.d.ts +84 -77
  115. package/lib/live/OntologyBackendAdapter.d.ts.map +1 -1
  116. package/lib/live/OntologyBackendAdapter.js +0 -1
  117. package/lib/live/actions/createLiveOntologyAction.d.ts +27 -24
  118. package/lib/live/actions/createLiveOntologyAction.d.ts.map +1 -1
  119. package/lib/live/actions/createLiveOntologyAction.js +24 -21
  120. package/lib/live/actions/createLiveOntologyAction.js.map +1 -1
  121. package/lib/live/actions/createLiveOntologyActions.d.ts +23 -20
  122. package/lib/live/actions/createLiveOntologyActions.d.ts.map +1 -1
  123. package/lib/live/actions/createLiveOntologyActions.js +131 -161
  124. package/lib/live/actions/createLiveOntologyActions.js.map +1 -1
  125. package/lib/live/actions/prepareActionParameters.d.ts +14 -11
  126. package/lib/live/actions/prepareActionParameters.d.ts.map +1 -1
  127. package/lib/live/actions/prepareActionParameters.js +190 -228
  128. package/lib/live/actions/prepareActionParameters.js.map +1 -1
  129. package/lib/live/attachments/attachmentSources.d.ts +7 -4
  130. package/lib/live/attachments/attachmentSources.d.ts.map +1 -1
  131. package/lib/live/attachments/attachmentSources.js +55 -71
  132. package/lib/live/attachments/attachmentSources.js.map +1 -1
  133. package/lib/live/attachments/createLiveOntologyAttachments.d.ts +47 -44
  134. package/lib/live/attachments/createLiveOntologyAttachments.d.ts.map +1 -1
  135. package/lib/live/attachments/createLiveOntologyAttachments.js +65 -83
  136. package/lib/live/attachments/createLiveOntologyAttachments.js.map +1 -1
  137. package/lib/live/attachments/types.d.ts +10 -8
  138. package/lib/live/attachments/types.d.ts.map +1 -1
  139. package/lib/live/attachments/types.js +0 -1
  140. package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.d.ts +3 -1
  141. package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.d.ts.map +1 -1
  142. package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.js +5 -3
  143. package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.js.map +1 -1
  144. package/lib/live/expression.d.ts +16 -13
  145. package/lib/live/expression.d.ts.map +1 -1
  146. package/lib/live/expression.js +142 -223
  147. package/lib/live/expression.js.map +1 -1
  148. package/lib/live/index.d.ts +12 -9
  149. package/lib/live/index.js +6 -8
  150. package/lib/live/mutators/OntologyEdits.d.ts +12 -9
  151. package/lib/live/mutators/OntologyEdits.d.ts.map +1 -1
  152. package/lib/live/mutators/OntologyEdits.js +57 -74
  153. package/lib/live/mutators/OntologyEdits.js.map +1 -1
  154. package/lib/live/mutators/createMutatorTx.d.ts +7 -5
  155. package/lib/live/mutators/createMutatorTx.d.ts.map +1 -1
  156. package/lib/live/mutators/createMutatorTx.js +53 -69
  157. package/lib/live/mutators/createMutatorTx.js.map +1 -1
  158. package/lib/live/mutators/runOptimisticAction.d.ts +16 -13
  159. package/lib/live/mutators/runOptimisticAction.d.ts.map +1 -1
  160. package/lib/live/mutators/runOptimisticAction.js +26 -26
  161. package/lib/live/mutators/runOptimisticAction.js.map +1 -1
  162. package/lib/live/mutators/types.d.ts +18 -16
  163. package/lib/live/mutators/types.d.ts.map +1 -1
  164. package/lib/live/mutators/types.js +0 -1
  165. package/lib/live/objects/OntologyObject.d.ts +2 -0
  166. package/lib/live/objects/OntologyObject.d.ts.map +1 -1
  167. package/lib/live/objects/OntologyObject.js +0 -1
  168. package/lib/live/objects/createLiveOntologyObjectCollection.d.ts +14 -11
  169. package/lib/live/objects/createLiveOntologyObjectCollection.d.ts.map +1 -1
  170. package/lib/live/objects/createLiveOntologyObjectCollection.js +62 -49
  171. package/lib/live/objects/createLiveOntologyObjectCollection.js.map +1 -1
  172. package/lib/live/objects/ontologyObjectCollectionId.d.ts +2 -0
  173. package/lib/live/objects/ontologyObjectCollectionId.d.ts.map +1 -1
  174. package/lib/live/objects/ontologyObjectCollectionId.js +6 -2
  175. package/lib/live/objects/ontologyObjectCollectionId.js.map +1 -1
  176. package/lib/live/outbox/createOntologyOutbox.d.ts +16 -14
  177. package/lib/live/outbox/createOntologyOutbox.d.ts.map +1 -1
  178. package/lib/live/outbox/createOntologyOutbox.js +275 -326
  179. package/lib/live/outbox/createOntologyOutbox.js.map +1 -1
  180. package/lib/live/outbox/leaderExecutor.d.ts +15 -13
  181. package/lib/live/outbox/leaderExecutor.d.ts.map +1 -1
  182. package/lib/live/outbox/leaderExecutor.js +114 -153
  183. package/lib/live/outbox/leaderExecutor.js.map +1 -1
  184. package/lib/live/outbox/outboxService.d.ts +4 -2
  185. package/lib/live/outbox/outboxService.d.ts.map +1 -1
  186. package/lib/live/outbox/outboxService.js +66 -71
  187. package/lib/live/outbox/outboxService.js.map +1 -1
  188. package/lib/live/outbox/projectionManager.d.ts +26 -24
  189. package/lib/live/outbox/projectionManager.d.ts.map +1 -1
  190. package/lib/live/outbox/projectionManager.js +121 -147
  191. package/lib/live/outbox/projectionManager.js.map +1 -1
  192. package/lib/live/outbox/repository.d.ts +27 -25
  193. package/lib/live/outbox/repository.d.ts.map +1 -1
  194. package/lib/live/outbox/repository.js +192 -241
  195. package/lib/live/outbox/repository.js.map +1 -1
  196. package/lib/live/outbox/service.d.ts +52 -50
  197. package/lib/live/outbox/service.d.ts.map +1 -1
  198. package/lib/live/outbox/service.js +5 -1
  199. package/lib/live/outbox/service.js.map +1 -1
  200. package/lib/live/outbox/types.d.ts +35 -33
  201. package/lib/live/outbox/types.d.ts.map +1 -1
  202. package/lib/live/outbox/types.js +10 -6
  203. package/lib/live/outbox/types.js.map +1 -1
  204. package/lib/live/waitForCollectionReady.d.ts +3 -1
  205. package/lib/live/waitForCollectionReady.d.ts.map +1 -1
  206. package/lib/live/waitForCollectionReady.js +44 -65
  207. package/lib/live/waitForCollectionReady.js.map +1 -1
  208. package/lib/meta/createLocalMetaOntologyBackendAdapter.d.ts +5 -2
  209. package/lib/meta/createLocalMetaOntologyBackendAdapter.d.ts.map +1 -1
  210. package/lib/meta/createLocalMetaOntologyBackendAdapter.js +37 -39
  211. package/lib/meta/createLocalMetaOntologyBackendAdapter.js.map +1 -1
  212. package/lib/meta/generated/constants.d.ts +137 -135
  213. package/lib/meta/generated/constants.d.ts.map +1 -1
  214. package/lib/meta/generated/constants.js +162 -129
  215. package/lib/meta/generated/constants.js.map +1 -1
  216. package/lib/meta/generated/live.d.ts +5 -2
  217. package/lib/meta/generated/live.d.ts.map +1 -1
  218. package/lib/meta/generated/live.js +12 -8
  219. package/lib/meta/generated/live.js.map +1 -1
  220. package/lib/meta/generated/types.d.ts +233 -231
  221. package/lib/meta/generated/types.d.ts.map +1 -1
  222. package/lib/meta/generated/types.js +0 -2
  223. package/lib/meta/ontology.d.ts +23 -21
  224. package/lib/meta/ontology.d.ts.map +1 -1
  225. package/lib/meta/ontology.js +100 -104
  226. package/lib/meta/ontology.js.map +1 -1
  227. package/lib/meta/pull.d.ts +8 -6
  228. package/lib/meta/pull.d.ts.map +1 -1
  229. package/lib/meta/pull.js +39 -52
  230. package/lib/meta/pull.js.map +1 -1
  231. package/lib/utils/index.d.ts +8 -8
  232. package/lib/utils/index.js +5 -6
  233. package/lib/utils/links.d.ts +34 -31
  234. package/lib/utils/links.d.ts.map +1 -1
  235. package/lib/utils/links.js +10 -17
  236. package/lib/utils/links.js.map +1 -1
  237. package/lib/utils/paths.d.ts +2 -0
  238. package/lib/utils/paths.d.ts.map +1 -1
  239. package/lib/utils/paths.js +32 -44
  240. package/lib/utils/paths.js.map +1 -1
  241. package/lib/utils/provide.d.ts +2 -0
  242. package/lib/utils/provide.d.ts.map +1 -1
  243. package/lib/utils/provide.js +7 -9
  244. package/lib/utils/provide.js.map +1 -1
  245. package/lib/utils/targets.d.ts +20 -18
  246. package/lib/utils/targets.d.ts.map +1 -1
  247. package/lib/utils/targets.js +0 -1
  248. package/lib/utils/typeNames.d.ts +10 -8
  249. package/lib/utils/typeNames.d.ts.map +1 -1
  250. package/lib/utils/typeNames.js +0 -1
  251. package/lib/utils/types.d.ts +6 -4
  252. package/lib/utils/types.d.ts.map +1 -1
  253. package/lib/utils/types.js +38 -38
  254. package/lib/utils/types.js.map +1 -1
  255. package/lib/utils/uncertain.d.ts +5 -3
  256. package/lib/utils/uncertain.d.ts.map +1 -1
  257. package/lib/utils/uncertain.js +11 -9
  258. package/lib/utils/uncertain.js.map +1 -1
  259. package/lib/utils/validation.d.ts +4 -2
  260. package/lib/utils/validation.d.ts.map +1 -1
  261. package/lib/utils/validation.js +0 -1
  262. package/lib/utils/values.d.ts +18 -18
  263. package/lib/utils/values.d.ts.map +1 -1
  264. package/lib/utils/values.js +0 -1
  265. package/package.json +22 -26
  266. package/lib/OntologyPullConfig.js.map +0 -1
  267. package/lib/cli/index.d.ts.map +0 -1
  268. package/lib/cli/index.test.d.ts +0 -2
  269. package/lib/cli/index.test.d.ts.map +0 -1
  270. package/lib/cli/index.test.js +0 -34
  271. package/lib/cli/index.test.js.map +0 -1
  272. package/lib/cli/pull.test.d.ts +0 -2
  273. package/lib/cli/pull.test.d.ts.map +0 -1
  274. package/lib/cli/pull.test.js +0 -125
  275. package/lib/cli/pull.test.js.map +0 -1
  276. package/lib/examples/generated/constants.d.ts.map +0 -1
  277. package/lib/examples/generated/constants.js.map +0 -1
  278. package/lib/examples/generated/types.js.map +0 -1
  279. package/lib/generate/builders.test.d.ts +0 -2
  280. package/lib/generate/builders.test.d.ts.map +0 -1
  281. package/lib/generate/builders.test.js +0 -49
  282. package/lib/generate/builders.test.js.map +0 -1
  283. package/lib/generate/index.d.ts.map +0 -1
  284. package/lib/generate/index.js.map +0 -1
  285. package/lib/generate/live.test.d.ts +0 -2
  286. package/lib/generate/live.test.d.ts.map +0 -1
  287. package/lib/generate/live.test.js +0 -22
  288. package/lib/generate/live.test.js.map +0 -1
  289. package/lib/generate/ontology.test.d.ts +0 -2
  290. package/lib/generate/ontology.test.d.ts.map +0 -1
  291. package/lib/generate/ontology.test.js +0 -157
  292. package/lib/generate/ontology.test.js.map +0 -1
  293. package/lib/generate/types.test.d.ts +0 -2
  294. package/lib/generate/types.test.d.ts.map +0 -1
  295. package/lib/generate/types.test.js +0 -304
  296. package/lib/generate/types.test.js.map +0 -1
  297. package/lib/index.d.ts.map +0 -1
  298. package/lib/index.js.map +0 -1
  299. package/lib/infer.test.d.ts +0 -2
  300. package/lib/infer.test.d.ts.map +0 -1
  301. package/lib/infer.test.js +0 -125
  302. package/lib/infer.test.js.map +0 -1
  303. package/lib/installation/createMetaOntologyConfiguration.test.d.ts +0 -2
  304. package/lib/installation/createMetaOntologyConfiguration.test.d.ts.map +0 -1
  305. package/lib/installation/createMetaOntologyConfiguration.test.js +0 -20
  306. package/lib/installation/createMetaOntologyConfiguration.test.js.map +0 -1
  307. package/lib/installation/createOntologyBackendInstallation.test.d.ts +0 -2
  308. package/lib/installation/createOntologyBackendInstallation.test.d.ts.map +0 -1
  309. package/lib/installation/createOntologyBackendInstallation.test.js +0 -320
  310. package/lib/installation/createOntologyBackendInstallation.test.js.map +0 -1
  311. package/lib/installation/index.d.ts.map +0 -1
  312. package/lib/installation/index.js.map +0 -1
  313. package/lib/installation/types.js.map +0 -1
  314. package/lib/ir/generated/types.js.map +0 -1
  315. package/lib/ir/index.d.ts.map +0 -1
  316. package/lib/ir/index.js.map +0 -1
  317. package/lib/ir/validate.test.d.ts +0 -2
  318. package/lib/ir/validate.test.d.ts.map +0 -1
  319. package/lib/ir/validate.test.js +0 -1061
  320. package/lib/ir/validate.test.js.map +0 -1
  321. package/lib/json/index.test.d.ts +0 -2
  322. package/lib/json/index.test.d.ts.map +0 -1
  323. package/lib/json/index.test.js +0 -142
  324. package/lib/json/index.test.js.map +0 -1
  325. package/lib/lenses.test.d.ts +0 -2
  326. package/lib/lenses.test.d.ts.map +0 -1
  327. package/lib/lenses.test.js +0 -80
  328. package/lib/lenses.test.js.map +0 -1
  329. package/lib/live/LiveOntology.test.d.ts +0 -2
  330. package/lib/live/LiveOntology.test.d.ts.map +0 -1
  331. package/lib/live/LiveOntology.test.js +0 -507
  332. package/lib/live/LiveOntology.test.js.map +0 -1
  333. package/lib/live/OntologyBackendAdapter.js.map +0 -1
  334. package/lib/live/actions/createLiveOntologyAction.test.d.ts +0 -2
  335. package/lib/live/actions/createLiveOntologyAction.test.d.ts.map +0 -1
  336. package/lib/live/actions/createLiveOntologyAction.test.js +0 -232
  337. package/lib/live/actions/createLiveOntologyAction.test.js.map +0 -1
  338. package/lib/live/actions/prepareActionParameters.test.d.ts +0 -2
  339. package/lib/live/actions/prepareActionParameters.test.d.ts.map +0 -1
  340. package/lib/live/actions/prepareActionParameters.test.js +0 -165
  341. package/lib/live/actions/prepareActionParameters.test.js.map +0 -1
  342. package/lib/live/attachments/attachmentMetadata.test.d.ts +0 -2
  343. package/lib/live/attachments/attachmentMetadata.test.d.ts.map +0 -1
  344. package/lib/live/attachments/attachmentMetadata.test.js +0 -73
  345. package/lib/live/attachments/attachmentMetadata.test.js.map +0 -1
  346. package/lib/live/attachments/createLiveOntologyAttachments.test.d.ts +0 -2
  347. package/lib/live/attachments/createLiveOntologyAttachments.test.d.ts.map +0 -1
  348. package/lib/live/attachments/createLiveOntologyAttachments.test.js +0 -363
  349. package/lib/live/attachments/createLiveOntologyAttachments.test.js.map +0 -1
  350. package/lib/live/attachments/types.js.map +0 -1
  351. package/lib/live/expression.test.d.ts +0 -2
  352. package/lib/live/expression.test.d.ts.map +0 -1
  353. package/lib/live/expression.test.js +0 -311
  354. package/lib/live/expression.test.js.map +0 -1
  355. package/lib/live/index.d.ts.map +0 -1
  356. package/lib/live/index.js.map +0 -1
  357. package/lib/live/mutators/OntologyEdits.test.d.ts +0 -2
  358. package/lib/live/mutators/OntologyEdits.test.d.ts.map +0 -1
  359. package/lib/live/mutators/OntologyEdits.test.js +0 -85
  360. package/lib/live/mutators/OntologyEdits.test.js.map +0 -1
  361. package/lib/live/mutators/createMutatorTx.test.d.ts +0 -2
  362. package/lib/live/mutators/createMutatorTx.test.d.ts.map +0 -1
  363. package/lib/live/mutators/createMutatorTx.test.js +0 -180
  364. package/lib/live/mutators/createMutatorTx.test.js.map +0 -1
  365. package/lib/live/mutators/types.js.map +0 -1
  366. package/lib/live/objects/OntologyObject.js.map +0 -1
  367. package/lib/live/objects/createLiveOntologyObjectCollection.test.d.ts +0 -2
  368. package/lib/live/objects/createLiveOntologyObjectCollection.test.d.ts.map +0 -1
  369. package/lib/live/objects/createLiveOntologyObjectCollection.test.js +0 -310
  370. package/lib/live/objects/createLiveOntologyObjectCollection.test.js.map +0 -1
  371. package/lib/live/outbox/createOntologyOutbox.test.d.ts +0 -2
  372. package/lib/live/outbox/createOntologyOutbox.test.d.ts.map +0 -1
  373. package/lib/live/outbox/createOntologyOutbox.test.js +0 -1030
  374. package/lib/live/outbox/createOntologyOutbox.test.js.map +0 -1
  375. package/lib/meta/generated/types.js.map +0 -1
  376. package/lib/meta/ontology.test.d.ts +0 -2
  377. package/lib/meta/ontology.test.d.ts.map +0 -1
  378. package/lib/meta/ontology.test.js +0 -84
  379. package/lib/meta/ontology.test.js.map +0 -1
  380. package/lib/utils/index.d.ts.map +0 -1
  381. package/lib/utils/index.js.map +0 -1
  382. package/lib/utils/links.test.d.ts +0 -2
  383. package/lib/utils/links.test.d.ts.map +0 -1
  384. package/lib/utils/links.test.js +0 -109
  385. package/lib/utils/links.test.js.map +0 -1
  386. package/lib/utils/paths.test.d.ts +0 -2
  387. package/lib/utils/paths.test.d.ts.map +0 -1
  388. package/lib/utils/paths.test.js +0 -33
  389. package/lib/utils/paths.test.js.map +0 -1
  390. package/lib/utils/targets.js.map +0 -1
  391. package/lib/utils/typeNames.js.map +0 -1
  392. package/lib/utils/types.test.d.ts +0 -2
  393. package/lib/utils/types.test.d.ts.map +0 -1
  394. package/lib/utils/types.test.js +0 -157
  395. package/lib/utils/types.test.js.map +0 -1
  396. package/lib/utils/uncertain.test.d.ts +0 -2
  397. package/lib/utils/uncertain.test.d.ts.map +0 -1
  398. package/lib/utils/uncertain.test.js +0 -14
  399. package/lib/utils/uncertain.test.js.map +0 -1
  400. package/lib/utils/validation.js.map +0 -1
  401. package/lib/utils/values.js.map +0 -1
@@ -1,741 +1,623 @@
1
- import { isLinkHopFromForeignKeySource, resolveLinkHop, } from "../utils/links.js";
1
+ import { isLinkHopFromForeignKeySource, resolveLinkHop } from "../utils/links.js";
2
2
  import { unwrapType } from "../utils/types.js";
3
3
  import { ImageMediaTypeOptions } from "./generated/constants.js";
4
- // TODO: Replace this attachment-specific range validation with real numeric constraints in the meta ontology.
4
+ //#region src/ir/validate.ts
5
5
  function validateNonNegativeRange(range, path) {
6
- if (!range)
7
- return [];
8
- const errors = [];
9
- for (const bound of ["min", "max"]) {
10
- const value = range[bound];
11
- if (value !== undefined && (!Number.isFinite(value) || value < 0)) {
12
- errors.push({
13
- message: `Range ${bound} must be a finite, non-negative number.`,
14
- path: [...path, bound],
15
- });
16
- }
17
- }
18
- if (range.min !== undefined && range.max !== undefined && range.min > range.max) {
19
- errors.push({
20
- message: "Range min must be less than or equal to max.",
21
- path,
22
- });
23
- }
24
- return errors;
6
+ if (!range) return [];
7
+ const errors = [];
8
+ for (const bound of ["min", "max"]) {
9
+ const value = range[bound];
10
+ if (value !== void 0 && (!Number.isFinite(value) || value < 0)) errors.push({
11
+ message: `Range ${bound} must be a finite, non-negative number.`,
12
+ path: [...path, bound]
13
+ });
14
+ }
15
+ if (range.min !== void 0 && range.max !== void 0 && range.min > range.max) errors.push({
16
+ message: "Range min must be less than or equal to max.",
17
+ path
18
+ });
19
+ return errors;
25
20
  }
26
21
  function validateAttachmentConstraints(type) {
27
- const constraint = type.value.constraint;
28
- if (!constraint)
29
- return [];
30
- const errors = validateNonNegativeRange(constraint.size, ["constraint", "size"]);
31
- const content = constraint.content;
32
- if (content?.kind !== "image")
33
- return errors;
34
- for (const [index, mediaType] of (content.value.mediaTypes ?? []).entries()) {
35
- if (!ImageMediaTypeOptions.some((option) => option.value === mediaType)) {
36
- errors.push({
37
- message: `Unsupported image media type: "${mediaType}".`,
38
- path: ["constraint", "content", "value", "mediaTypes", index],
39
- });
40
- }
41
- }
42
- errors.push(...validateNonNegativeRange(content.value.dimensions?.width, [
43
- "constraint",
44
- "content",
45
- "value",
46
- "dimensions",
47
- "width",
48
- ]), ...validateNonNegativeRange(content.value.dimensions?.height, [
49
- "constraint",
50
- "content",
51
- "value",
52
- "dimensions",
53
- "height",
54
- ]));
55
- return errors;
22
+ const constraint = type.value.constraint;
23
+ if (!constraint) return [];
24
+ const errors = validateNonNegativeRange(constraint.size, ["constraint", "size"]);
25
+ const content = constraint.content;
26
+ if (content?.kind !== "image") return errors;
27
+ for (const [index, mediaType] of (content.value.mediaTypes ?? []).entries()) if (!ImageMediaTypeOptions.some((option) => option.value === mediaType)) errors.push({
28
+ message: `Unsupported image media type: "${mediaType}".`,
29
+ path: [
30
+ "constraint",
31
+ "content",
32
+ "value",
33
+ "mediaTypes",
34
+ index
35
+ ]
36
+ });
37
+ errors.push(...validateNonNegativeRange(content.value.dimensions?.width, [
38
+ "constraint",
39
+ "content",
40
+ "value",
41
+ "dimensions",
42
+ "width"
43
+ ]), ...validateNonNegativeRange(content.value.dimensions?.height, [
44
+ "constraint",
45
+ "content",
46
+ "value",
47
+ "dimensions",
48
+ "height"
49
+ ]));
50
+ return errors;
56
51
  }
57
52
  function validateTypeDef(type, path, valueTypeNames, objectTypeNames) {
58
- switch (type.kind) {
59
- case "string":
60
- case "boolean":
61
- case "integer":
62
- case "float":
63
- case "double":
64
- case "date":
65
- case "timestamp":
66
- case "geopoint":
67
- case "unknown":
68
- return [];
69
- case "attachment":
70
- return validateAttachmentConstraints(type).map((error) => ({
71
- ...error,
72
- path: [...path, ...(error.path ?? [])],
73
- }));
74
- case "objectReference":
75
- return objectTypeNames.has(type.value.objectType)
76
- ? []
77
- : [
78
- {
79
- message: `Unknown object type reference: "${type.value.objectType}".`,
80
- path: [...path, "objectType"],
81
- },
82
- ];
83
- case "list":
84
- return validateTypeDef(type.value.elementType, [...path, "elementType"], valueTypeNames, objectTypeNames);
85
- case "map": {
86
- const errors = [];
87
- if (type.value.keyType.kind !== "string") {
88
- errors.push({
89
- message: "Map key types must be string.",
90
- path: [...path, "keyType"],
91
- });
92
- }
93
- return [
94
- ...errors,
95
- ...validateTypeDef(type.value.keyType, [...path, "keyType"], valueTypeNames, objectTypeNames),
96
- ...validateTypeDef(type.value.valueType, [...path, "valueType"], valueTypeNames, objectTypeNames),
97
- ];
98
- }
99
- case "struct":
100
- return validateStructFields(type.value.fields, [...path, "fields"], valueTypeNames, objectTypeNames);
101
- case "union":
102
- return validateUnionVariants(type.value.variants, [...path, "variants"], valueTypeNames, objectTypeNames);
103
- case "optional":
104
- return validateTypeDef(type.value.type, [...path, "type"], valueTypeNames, objectTypeNames);
105
- case "result":
106
- return [
107
- ...validateTypeDef(type.value.okType, [...path, "okType"], valueTypeNames, objectTypeNames),
108
- ...validateTypeDef(type.value.errType, [...path, "errType"], valueTypeNames, objectTypeNames),
109
- ];
110
- case "ref":
111
- return valueTypeNames.has(type.value.name)
112
- ? []
113
- : [
114
- {
115
- message: `Unknown value type reference: "${type.value.name}".`,
116
- path: [...path, "name"],
117
- },
118
- ];
119
- }
53
+ switch (type.kind) {
54
+ case "string":
55
+ case "boolean":
56
+ case "integer":
57
+ case "float":
58
+ case "double":
59
+ case "date":
60
+ case "timestamp":
61
+ case "geopoint":
62
+ case "unknown": return [];
63
+ case "attachment": return validateAttachmentConstraints(type).map((error) => ({
64
+ ...error,
65
+ path: [...path, ...error.path ?? []]
66
+ }));
67
+ case "objectReference": return objectTypeNames.has(type.value.objectType) ? [] : [{
68
+ message: `Unknown object type reference: "${type.value.objectType}".`,
69
+ path: [...path, "objectType"]
70
+ }];
71
+ case "list": return validateTypeDef(type.value.elementType, [...path, "elementType"], valueTypeNames, objectTypeNames);
72
+ case "map": {
73
+ const errors = [];
74
+ if (type.value.keyType.kind !== "string") errors.push({
75
+ message: "Map key types must be string.",
76
+ path: [...path, "keyType"]
77
+ });
78
+ return [
79
+ ...errors,
80
+ ...validateTypeDef(type.value.keyType, [...path, "keyType"], valueTypeNames, objectTypeNames),
81
+ ...validateTypeDef(type.value.valueType, [...path, "valueType"], valueTypeNames, objectTypeNames)
82
+ ];
83
+ }
84
+ case "struct": return validateStructFields(type.value.fields, [...path, "fields"], valueTypeNames, objectTypeNames);
85
+ case "union": return validateUnionVariants(type.value.variants, [...path, "variants"], valueTypeNames, objectTypeNames);
86
+ case "optional": return validateTypeDef(type.value.type, [...path, "type"], valueTypeNames, objectTypeNames);
87
+ case "result": return [...validateTypeDef(type.value.okType, [...path, "okType"], valueTypeNames, objectTypeNames), ...validateTypeDef(type.value.errType, [...path, "errType"], valueTypeNames, objectTypeNames)];
88
+ case "ref": return valueTypeNames.has(type.value.name) ? [] : [{
89
+ message: `Unknown value type reference: "${type.value.name}".`,
90
+ path: [...path, "name"]
91
+ }];
92
+ }
120
93
  }
121
94
  function validateStructFields(fields, path, valueTypeNames, objectTypeNames) {
122
- const fieldNames = new Set();
123
- const errors = [];
124
- for (let i = 0; i < fields.length; i++) {
125
- const field = fields[i];
126
- const fieldPath = [...path, i];
127
- if (fieldNames.has(field.name)) {
128
- errors.push({ message: `Duplicate field name: "${field.name}".`, path: [...fieldPath, "name"] });
129
- }
130
- fieldNames.add(field.name);
131
- errors.push(...validateTypeDef(field.type, [...fieldPath, "type"], valueTypeNames, objectTypeNames));
132
- }
133
- return errors;
95
+ const fieldNames = /* @__PURE__ */ new Set();
96
+ const errors = [];
97
+ for (let i = 0; i < fields.length; i++) {
98
+ const field = fields[i];
99
+ const fieldPath = [...path, i];
100
+ if (fieldNames.has(field.name)) errors.push({
101
+ message: `Duplicate field name: "${field.name}".`,
102
+ path: [...fieldPath, "name"]
103
+ });
104
+ fieldNames.add(field.name);
105
+ errors.push(...validateTypeDef(field.type, [...fieldPath, "type"], valueTypeNames, objectTypeNames));
106
+ }
107
+ return errors;
134
108
  }
135
109
  function validateUnionVariants(variants, path, valueTypeNames, objectTypeNames) {
136
- const seen = new Set();
137
- const errors = [];
138
- for (let i = 0; i < variants.length; i++) {
139
- const variant = variants[i];
140
- const variantPath = [...path, i];
141
- if (seen.has(variant.name)) {
142
- errors.push({
143
- message: `Duplicate variant name: "${variant.name}".`,
144
- path: [...variantPath, "name"],
145
- });
146
- }
147
- seen.add(variant.name);
148
- errors.push(...validateTypeDef(variant.type, [...variantPath, "type"], valueTypeNames, objectTypeNames));
149
- }
150
- return errors;
110
+ const seen = /* @__PURE__ */ new Set();
111
+ const errors = [];
112
+ for (let i = 0; i < variants.length; i++) {
113
+ const variant = variants[i];
114
+ const variantPath = [...path, i];
115
+ if (seen.has(variant.name)) errors.push({
116
+ message: `Duplicate variant name: "${variant.name}".`,
117
+ path: [...variantPath, "name"]
118
+ });
119
+ seen.add(variant.name);
120
+ errors.push(...validateTypeDef(variant.type, [...variantPath, "type"], valueTypeNames, objectTypeNames));
121
+ }
122
+ return errors;
151
123
  }
152
124
  function validateProperties(properties, path, valueTypeNames, objectTypeNames) {
153
- const names = new Set();
154
- const errors = [];
155
- for (let i = 0; i < properties.length; i++) {
156
- const prop = properties[i];
157
- const propPath = [...path, i];
158
- if (names.has(prop.name)) {
159
- errors.push({
160
- message: `Duplicate property name: "${prop.name}".`,
161
- path: [...propPath, "name"],
162
- });
163
- }
164
- names.add(prop.name);
165
- errors.push(...validateTypeDef(prop.type, [...propPath, "type"], valueTypeNames, objectTypeNames));
166
- }
167
- return errors;
125
+ const names = /* @__PURE__ */ new Set();
126
+ const errors = [];
127
+ for (let i = 0; i < properties.length; i++) {
128
+ const prop = properties[i];
129
+ const propPath = [...path, i];
130
+ if (names.has(prop.name)) errors.push({
131
+ message: `Duplicate property name: "${prop.name}".`,
132
+ path: [...propPath, "name"]
133
+ });
134
+ names.add(prop.name);
135
+ errors.push(...validateTypeDef(prop.type, [...propPath, "type"], valueTypeNames, objectTypeNames));
136
+ }
137
+ return errors;
168
138
  }
169
- function resolveType(type, valueTypes, seen = new Set()) {
170
- if (type.kind !== "ref") {
171
- return type;
172
- }
173
- const name = type.value.name;
174
- if (seen.has(name)) {
175
- return undefined;
176
- }
177
- const resolved = valueTypes.get(name);
178
- if (!resolved) {
179
- return undefined;
180
- }
181
- return resolveType(resolved, valueTypes, new Set([...seen, name]));
139
+ function resolveType(type, valueTypes, seen = /* @__PURE__ */ new Set()) {
140
+ if (type.kind !== "ref") return type;
141
+ const name = type.value.name;
142
+ if (seen.has(name)) return;
143
+ const resolved = valueTypes.get(name);
144
+ if (!resolved) return;
145
+ return resolveType(resolved, valueTypes, /* @__PURE__ */ new Set([...seen, name]));
182
146
  }
183
147
  function resolveFieldType(type, path, valueTypes) {
184
- const resolvedType = resolveType(type, valueTypes);
185
- if (!resolvedType) {
186
- return undefined;
187
- }
188
- if (path.length === 0) {
189
- return resolvedType;
190
- }
191
- const [segment, ...rest] = path;
192
- switch (resolvedType.kind) {
193
- case "optional":
194
- return resolveFieldType(resolvedType.value.type, path, valueTypes);
195
- case "struct": {
196
- const field = resolvedType.value.fields.find((candidate) => candidate.name === segment);
197
- return field ? resolveFieldType(field.type, rest, valueTypes) : undefined;
198
- }
199
- default:
200
- return undefined;
201
- }
148
+ const resolvedType = resolveType(type, valueTypes);
149
+ if (!resolvedType) return;
150
+ if (path.length === 0) return resolvedType;
151
+ const [segment, ...rest] = path;
152
+ switch (resolvedType.kind) {
153
+ case "optional": return resolveFieldType(resolvedType.value.type, path, valueTypes);
154
+ case "struct": {
155
+ const field = resolvedType.value.fields.find((candidate) => candidate.name === segment);
156
+ return field ? resolveFieldType(field.type, rest, valueTypes) : void 0;
157
+ }
158
+ default: return;
159
+ }
202
160
  }
203
161
  function resolveExpressionType(expression, parameters, valueTypes, objectTypes, linkTypes, contextType, locals) {
204
- switch (expression.kind) {
205
- case "inputReference":
206
- return parameters.get(expression.value.name)?.type;
207
- case "contextReference":
208
- return contextType
209
- ? resolveFieldType(contextType, [expression.value.name], valueTypes)
210
- : undefined;
211
- case "localReference":
212
- return locals.get(expression.value.name);
213
- case "getAt": {
214
- const sourceType = resolveExpressionType(expression.value.source, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
215
- if (!sourceType || expression.value.path.length === 0) {
216
- return undefined;
217
- }
218
- if (sourceType.kind === "ontologyObject") {
219
- const [propertyName, ...rest] = expression.value.path;
220
- const property = objectTypes
221
- .get(sourceType.objectType)
222
- ?.properties.find((candidate) => candidate.name === propertyName);
223
- return property
224
- ? resolveFieldType(property.type, rest, valueTypes)
225
- : undefined;
226
- }
227
- return resolveFieldType(sourceType, expression.value.path, valueTypes);
228
- }
229
- case "objectLookup": {
230
- const referenceType = resolveExpressionType(expression.value.reference, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
231
- const resolved = referenceType?.kind === "ontologyObject"
232
- ? undefined
233
- : referenceType
234
- ? unwrapOptionalType(referenceType, valueTypes)
235
- : undefined;
236
- return resolved?.kind === "objectReference"
237
- ? {
238
- kind: "ontologyObject",
239
- objectType: resolved.value.objectType,
240
- }
241
- : undefined;
242
- }
243
- case "linkHop": {
244
- const sourceType = resolveExpressionType(expression.value.source, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
245
- if (sourceType?.kind !== "ontologyObject") {
246
- return undefined;
247
- }
248
- const link = resolveLinkHop({
249
- objectTypes: [...objectTypes.values()],
250
- linkTypes: [...linkTypes],
251
- }, sourceType.objectType, expression.value.link);
252
- if (!link)
253
- return undefined;
254
- const foreignKeyOnSource = isLinkHopFromForeignKeySource(link, sourceType.objectType, expression.value.link);
255
- if (!foreignKeyOnSource &&
256
- link.cardinality === "many") {
257
- return undefined;
258
- }
259
- return {
260
- kind: "ontologyObject",
261
- objectType: foreignKeyOnSource
262
- ? link.target.objectType
263
- : link.source.objectType,
264
- };
265
- }
266
- case "struct":
267
- return {
268
- kind: "struct",
269
- value: {
270
- fields: expression.value.fields.map((field) => ({
271
- name: field.name,
272
- displayName: field.name,
273
- type: (() => {
274
- const resolved = resolveExpressionType(field.value, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
275
- return resolved &&
276
- resolved.kind !== "ontologyObject"
277
- ? resolved
278
- : {
279
- kind: "unknown",
280
- value: {},
281
- };
282
- })(),
283
- })),
284
- },
285
- };
286
- case "map": {
287
- const sourceType = resolveExpressionType(expression.value.source, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
288
- const listType = sourceType &&
289
- sourceType.kind !== "ontologyObject"
290
- ? unwrapOptionalType(sourceType, valueTypes)
291
- : undefined;
292
- if (listType?.kind !== "list") {
293
- return undefined;
294
- }
295
- const bodyLocals = new Map(locals);
296
- bodyLocals.set(expression.value.binding, listType.value.elementType);
297
- const bodyType = resolveExpressionType(expression.value.body, parameters, valueTypes, objectTypes, linkTypes, contextType, bodyLocals);
298
- return bodyType && bodyType.kind !== "ontologyObject"
299
- ? {
300
- kind: "list",
301
- value: { elementType: bodyType },
302
- }
303
- : undefined;
304
- }
305
- case "literal":
306
- return { kind: "unknown", value: {} };
307
- case "uuid":
308
- return { kind: "string", value: {} };
309
- case "now":
310
- return { kind: "timestamp", value: {} };
311
- }
162
+ switch (expression.kind) {
163
+ case "inputReference": return parameters.get(expression.value.name)?.type;
164
+ case "contextReference": return contextType ? resolveFieldType(contextType, [expression.value.name], valueTypes) : void 0;
165
+ case "localReference": return locals.get(expression.value.name);
166
+ case "getAt": {
167
+ const sourceType = resolveExpressionType(expression.value.source, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
168
+ if (!sourceType || expression.value.path.length === 0) return;
169
+ if (sourceType.kind === "ontologyObject") {
170
+ const [propertyName, ...rest] = expression.value.path;
171
+ const property = objectTypes.get(sourceType.objectType)?.properties.find((candidate) => candidate.name === propertyName);
172
+ return property ? resolveFieldType(property.type, rest, valueTypes) : void 0;
173
+ }
174
+ return resolveFieldType(sourceType, expression.value.path, valueTypes);
175
+ }
176
+ case "objectLookup": {
177
+ const referenceType = resolveExpressionType(expression.value.reference, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
178
+ const resolved = referenceType?.kind === "ontologyObject" ? void 0 : referenceType ? unwrapOptionalType(referenceType, valueTypes) : void 0;
179
+ return resolved?.kind === "objectReference" ? {
180
+ kind: "ontologyObject",
181
+ objectType: resolved.value.objectType
182
+ } : void 0;
183
+ }
184
+ case "linkHop": {
185
+ const sourceType = resolveExpressionType(expression.value.source, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
186
+ if (sourceType?.kind !== "ontologyObject") return;
187
+ const link = resolveLinkHop({
188
+ objectTypes: [...objectTypes.values()],
189
+ linkTypes: [...linkTypes]
190
+ }, sourceType.objectType, expression.value.link);
191
+ if (!link) return void 0;
192
+ const foreignKeyOnSource = isLinkHopFromForeignKeySource(link, sourceType.objectType, expression.value.link);
193
+ if (!foreignKeyOnSource && link.cardinality === "many") return;
194
+ return {
195
+ kind: "ontologyObject",
196
+ objectType: foreignKeyOnSource ? link.target.objectType : link.source.objectType
197
+ };
198
+ }
199
+ case "struct": return {
200
+ kind: "struct",
201
+ value: { fields: expression.value.fields.map((field) => ({
202
+ name: field.name,
203
+ displayName: field.name,
204
+ type: (() => {
205
+ const resolved = resolveExpressionType(field.value, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
206
+ return resolved && resolved.kind !== "ontologyObject" ? resolved : {
207
+ kind: "unknown",
208
+ value: {}
209
+ };
210
+ })()
211
+ })) }
212
+ };
213
+ case "map": {
214
+ const sourceType = resolveExpressionType(expression.value.source, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
215
+ const listType = sourceType && sourceType.kind !== "ontologyObject" ? unwrapOptionalType(sourceType, valueTypes) : void 0;
216
+ if (listType?.kind !== "list") return;
217
+ const bodyLocals = new Map(locals);
218
+ bodyLocals.set(expression.value.binding, listType.value.elementType);
219
+ const bodyType = resolveExpressionType(expression.value.body, parameters, valueTypes, objectTypes, linkTypes, contextType, bodyLocals);
220
+ return bodyType && bodyType.kind !== "ontologyObject" ? {
221
+ kind: "list",
222
+ value: { elementType: bodyType }
223
+ } : void 0;
224
+ }
225
+ case "literal": return {
226
+ kind: "unknown",
227
+ value: {}
228
+ };
229
+ case "uuid": return {
230
+ kind: "string",
231
+ value: {}
232
+ };
233
+ case "now": return {
234
+ kind: "timestamp",
235
+ value: {}
236
+ };
237
+ }
312
238
  }
313
- function validateExpression(expression, parameters, path, valueTypes, objectTypes, linkTypes, contextType, locals = new Map()) {
314
- switch (expression.kind) {
315
- case "inputReference": {
316
- const parameter = parameters.get(expression.value.name);
317
- if (!parameter) {
318
- return [
319
- {
320
- message: `Unknown action parameter: "${expression.value.name}".`,
321
- path: [...path, "name"],
322
- },
323
- ];
324
- }
325
- return [];
326
- }
327
- case "contextReference":
328
- if (!contextType) {
329
- return [];
330
- }
331
- return resolveFieldType(contextType, [expression.value.name], valueTypes)
332
- ? []
333
- : [
334
- {
335
- message: `Unknown context value: "${expression.value.name}".`,
336
- path: [...path, "name"],
337
- },
338
- ];
339
- case "localReference": {
340
- const local = locals.get(expression.value.name);
341
- if (!local) {
342
- return [
343
- {
344
- message: `Unknown expression binding: "${expression.value.name}".`,
345
- path: [...path, "name"],
346
- },
347
- ];
348
- }
349
- return [];
350
- }
351
- case "getAt":
352
- case "objectLookup":
353
- case "linkHop": {
354
- const childKey = expression.kind === "objectLookup" ? "reference" : "source";
355
- const child = expression.kind === "objectLookup"
356
- ? expression.value.reference
357
- : expression.value.source;
358
- const errors = validateExpression(child, parameters, [...path, childKey], valueTypes, objectTypes, linkTypes, contextType, locals);
359
- if (expression.kind === "getAt" &&
360
- expression.value.path.length === 0) {
361
- errors.push({
362
- message: "Get-at expression paths must not be empty.",
363
- path: [...path, "path"],
364
- });
365
- }
366
- const resolved = resolveExpressionType(expression, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
367
- if (!resolved) {
368
- errors.push({
369
- message: expression.kind === "getAt"
370
- ? "Get-at expression source and path must resolve structurally."
371
- : expression.kind === "objectLookup"
372
- ? "Object lookup references must resolve to an object reference."
373
- : "Link hop must resolve to a named to-one link.",
374
- path,
375
- });
376
- }
377
- return errors;
378
- }
379
- case "struct": {
380
- const errors = [];
381
- const names = new Set();
382
- for (let index = 0; index < expression.value.fields.length; index++) {
383
- const field = expression.value.fields[index];
384
- if (names.has(field.name)) {
385
- errors.push({
386
- message: `Duplicate struct expression field: "${field.name}".`,
387
- path: [...path, "fields", index, "name"],
388
- });
389
- }
390
- names.add(field.name);
391
- errors.push(...validateExpression(field.value, parameters, [...path, "fields", index, "value"], valueTypes, objectTypes, linkTypes, contextType, locals));
392
- }
393
- return errors;
394
- }
395
- case "map": {
396
- const errors = validateExpression(expression.value.source, parameters, [...path, "source"], valueTypes, objectTypes, linkTypes, contextType, locals);
397
- const sourceType = resolveExpressionType(expression.value.source, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
398
- const listType = sourceType &&
399
- sourceType.kind !== "ontologyObject"
400
- ? unwrapOptionalType(sourceType, valueTypes)
401
- : undefined;
402
- if (sourceType && listType?.kind !== "list") {
403
- errors.push({
404
- message: "Map expression source must resolve to a list.",
405
- path: [...path, "source"],
406
- });
407
- }
408
- if (!expression.value.binding) {
409
- errors.push({
410
- message: "Map expression binding must not be empty.",
411
- path: [...path, "binding"],
412
- });
413
- }
414
- const bodyLocals = new Map(locals);
415
- bodyLocals.set(expression.value.binding, listType?.kind === "list" ? listType.value.elementType : { kind: "unknown", value: {} });
416
- errors.push(...validateExpression(expression.value.body, parameters, [...path, "body"], valueTypes, objectTypes, linkTypes, contextType, bodyLocals));
417
- return errors;
418
- }
419
- case "uuid":
420
- case "now":
421
- case "literal":
422
- return [];
423
- }
239
+ function validateExpression(expression, parameters, path, valueTypes, objectTypes, linkTypes, contextType, locals = /* @__PURE__ */ new Map()) {
240
+ switch (expression.kind) {
241
+ case "inputReference":
242
+ if (!parameters.get(expression.value.name)) return [{
243
+ message: `Unknown action parameter: "${expression.value.name}".`,
244
+ path: [...path, "name"]
245
+ }];
246
+ return [];
247
+ case "contextReference":
248
+ if (!contextType) return [];
249
+ return resolveFieldType(contextType, [expression.value.name], valueTypes) ? [] : [{
250
+ message: `Unknown context value: "${expression.value.name}".`,
251
+ path: [...path, "name"]
252
+ }];
253
+ case "localReference":
254
+ if (!locals.get(expression.value.name)) return [{
255
+ message: `Unknown expression binding: "${expression.value.name}".`,
256
+ path: [...path, "name"]
257
+ }];
258
+ return [];
259
+ case "getAt":
260
+ case "objectLookup":
261
+ case "linkHop": {
262
+ const childKey = expression.kind === "objectLookup" ? "reference" : "source";
263
+ const errors = validateExpression(expression.kind === "objectLookup" ? expression.value.reference : expression.value.source, parameters, [...path, childKey], valueTypes, objectTypes, linkTypes, contextType, locals);
264
+ if (expression.kind === "getAt" && expression.value.path.length === 0) errors.push({
265
+ message: "Get-at expression paths must not be empty.",
266
+ path: [...path, "path"]
267
+ });
268
+ if (!resolveExpressionType(expression, parameters, valueTypes, objectTypes, linkTypes, contextType, locals)) errors.push({
269
+ message: expression.kind === "getAt" ? "Get-at expression source and path must resolve structurally." : expression.kind === "objectLookup" ? "Object lookup references must resolve to an object reference." : "Link hop must resolve to a named to-one link.",
270
+ path
271
+ });
272
+ return errors;
273
+ }
274
+ case "struct": {
275
+ const errors = [];
276
+ const names = /* @__PURE__ */ new Set();
277
+ for (let index = 0; index < expression.value.fields.length; index++) {
278
+ const field = expression.value.fields[index];
279
+ if (names.has(field.name)) errors.push({
280
+ message: `Duplicate struct expression field: "${field.name}".`,
281
+ path: [
282
+ ...path,
283
+ "fields",
284
+ index,
285
+ "name"
286
+ ]
287
+ });
288
+ names.add(field.name);
289
+ errors.push(...validateExpression(field.value, parameters, [
290
+ ...path,
291
+ "fields",
292
+ index,
293
+ "value"
294
+ ], valueTypes, objectTypes, linkTypes, contextType, locals));
295
+ }
296
+ return errors;
297
+ }
298
+ case "map": {
299
+ const errors = validateExpression(expression.value.source, parameters, [...path, "source"], valueTypes, objectTypes, linkTypes, contextType, locals);
300
+ const sourceType = resolveExpressionType(expression.value.source, parameters, valueTypes, objectTypes, linkTypes, contextType, locals);
301
+ const listType = sourceType && sourceType.kind !== "ontologyObject" ? unwrapOptionalType(sourceType, valueTypes) : void 0;
302
+ if (sourceType && listType?.kind !== "list") errors.push({
303
+ message: "Map expression source must resolve to a list.",
304
+ path: [...path, "source"]
305
+ });
306
+ if (!expression.value.binding) errors.push({
307
+ message: "Map expression binding must not be empty.",
308
+ path: [...path, "binding"]
309
+ });
310
+ const bodyLocals = new Map(locals);
311
+ bodyLocals.set(expression.value.binding, listType?.kind === "list" ? listType.value.elementType : {
312
+ kind: "unknown",
313
+ value: {}
314
+ });
315
+ errors.push(...validateExpression(expression.value.body, parameters, [...path, "body"], valueTypes, objectTypes, linkTypes, contextType, bodyLocals));
316
+ return errors;
317
+ }
318
+ case "uuid":
319
+ case "now":
320
+ case "literal": return [];
321
+ }
424
322
  }
425
323
  function unwrapOptionalType(type, valueTypes) {
426
- const resolved = resolveType(type, valueTypes);
427
- return resolved?.kind === "optional" ? unwrapOptionalType(resolved.value.type, valueTypes) : resolved;
324
+ const resolved = resolveType(type, valueTypes);
325
+ return resolved?.kind === "optional" ? unwrapOptionalType(resolved.value.type, valueTypes) : resolved;
428
326
  }
429
327
  function areDefaultTypesCompatible(target, source, valueTypes) {
430
- const targetType = unwrapOptionalType(target, valueTypes);
431
- const sourceType = unwrapOptionalType(source, valueTypes);
432
- if (!targetType || !sourceType)
433
- return false;
434
- if (targetType.kind === "unknown" || sourceType.kind === "unknown")
435
- return true;
436
- if (targetType.kind !== sourceType.kind)
437
- return false;
438
- if (targetType.kind === "objectReference" && sourceType.kind === "objectReference") {
439
- return targetType.value.objectType === sourceType.value.objectType;
440
- }
441
- if (targetType.kind === "list" && sourceType.kind === "list") {
442
- return areDefaultTypesCompatible(targetType.value.elementType, sourceType.value.elementType, valueTypes);
443
- }
444
- return true;
328
+ const targetType = unwrapOptionalType(target, valueTypes);
329
+ const sourceType = unwrapOptionalType(source, valueTypes);
330
+ if (!targetType || !sourceType) return false;
331
+ if (targetType.kind === "unknown" || sourceType.kind === "unknown") return true;
332
+ if (targetType.kind !== sourceType.kind) return false;
333
+ if (targetType.kind === "objectReference" && sourceType.kind === "objectReference") return targetType.value.objectType === sourceType.value.objectType;
334
+ if (targetType.kind === "list" && sourceType.kind === "list") return areDefaultTypesCompatible(targetType.value.elementType, sourceType.value.elementType, valueTypes);
335
+ return true;
445
336
  }
446
337
  function validateActionObjectReference(reference, parameters, path, valueTypes, objectTypes) {
447
- const parameterName = reference.name;
448
- const parameter = parameters.get(parameterName);
449
- if (!parameter) {
450
- return {
451
- errors: [
452
- {
453
- message: `Unknown action parameter: "${parameterName}".`,
454
- path: [...path, "name"],
455
- },
456
- ],
457
- };
458
- }
459
- const resolved = resolveType(parameter.type, valueTypes);
460
- if (!resolved || resolved.kind !== "objectReference") {
461
- return {
462
- errors: [
463
- {
464
- message: `Action target parameter "${parameterName}" must be an object reference.`,
465
- path: [...path, "name"],
466
- },
467
- ],
468
- };
469
- }
470
- const targetObjectType = objectTypes.get(resolved.value.objectType);
471
- return targetObjectType
472
- ? { errors: [], objectType: targetObjectType }
473
- : {
474
- errors: [
475
- {
476
- message: `Unknown object type reference: "${resolved.value.objectType}".`,
477
- path: [...path, "name"],
478
- },
479
- ],
480
- };
338
+ const parameterName = reference.name;
339
+ const parameter = parameters.get(parameterName);
340
+ if (!parameter) return { errors: [{
341
+ message: `Unknown action parameter: "${parameterName}".`,
342
+ path: [...path, "name"]
343
+ }] };
344
+ const resolved = resolveType(parameter.type, valueTypes);
345
+ if (!resolved || resolved.kind !== "objectReference") return { errors: [{
346
+ message: `Action target parameter "${parameterName}" must be an object reference.`,
347
+ path: [...path, "name"]
348
+ }] };
349
+ const targetObjectType = objectTypes.get(resolved.value.objectType);
350
+ return targetObjectType ? {
351
+ errors: [],
352
+ objectType: targetObjectType
353
+ } : { errors: [{
354
+ message: `Unknown object type reference: "${resolved.value.objectType}".`,
355
+ path: [...path, "name"]
356
+ }] };
481
357
  }
482
358
  function validateActionPropertyAssignment(assignment, target, parameters, path, valueTypes, objectTypes, linkTypes, contextType) {
483
- if (assignment.property.length === 0) {
484
- return [
485
- { message: "Action property assignments must specify a property.", path: [...path, "property"] },
486
- ];
487
- }
488
- const [propertyName, ...rest] = assignment.property;
489
- const property = target.properties.find((candidate) => candidate.name === propertyName);
490
- if (!property) {
491
- return [
492
- {
493
- message: `Unknown property "${propertyName}" on object type "${target.name}".`,
494
- path: [...path, "property"],
495
- },
496
- ];
497
- }
498
- const resolved = resolveFieldType(property.type, rest, valueTypes);
499
- const errors = validateExpression(assignment.value, parameters, [...path, "value"], valueTypes, objectTypes, linkTypes, contextType);
500
- return resolved
501
- ? errors
502
- : [
503
- ...errors,
504
- {
505
- message: `Invalid property "${assignment.property.join(".")}" on object type "${target.name}".`,
506
- path: [...path, "property"],
507
- },
508
- ];
359
+ if (assignment.property.length === 0) return [{
360
+ message: "Action property assignments must specify a property.",
361
+ path: [...path, "property"]
362
+ }];
363
+ const [propertyName, ...rest] = assignment.property;
364
+ const property = target.properties.find((candidate) => candidate.name === propertyName);
365
+ if (!property) return [{
366
+ message: `Unknown property "${propertyName}" on object type "${target.name}".`,
367
+ path: [...path, "property"]
368
+ }];
369
+ const resolved = resolveFieldType(property.type, rest, valueTypes);
370
+ const errors = validateExpression(assignment.value, parameters, [...path, "value"], valueTypes, objectTypes, linkTypes, contextType);
371
+ return resolved ? errors : [...errors, {
372
+ message: `Invalid property "${assignment.property.join(".")}" on object type "${target.name}".`,
373
+ path: [...path, "property"]
374
+ }];
509
375
  }
510
376
  function validateAction(action, path, valueTypes, objectTypes, linkTypes, contextType) {
511
- const errors = [];
512
- const parameters = new Map(action.parameters.map((parameter) => [parameter.name, parameter]));
513
- const seenParameters = new Set();
514
- for (let index = 0; index < action.parameters.length; index++) {
515
- const parameter = action.parameters[index];
516
- const parameterPath = [...path, "parameters", index];
517
- if (seenParameters.has(parameter.name)) {
518
- errors.push({
519
- message: `Duplicate action parameter name: "${parameter.name}".`,
520
- path: [...parameterPath, "name"],
521
- });
522
- }
523
- seenParameters.add(parameter.name);
524
- errors.push(...validateTypeDef(parameter.type, [...parameterPath, "type"], new Set(valueTypes.keys()), new Set(objectTypes.keys())));
525
- if (parameter.defaultValue) {
526
- errors.push(...validateExpression(parameter.defaultValue, parameters, [...parameterPath, "defaultValue"], valueTypes, objectTypes, linkTypes, contextType));
527
- const sourceType = resolveExpressionType(parameter.defaultValue, parameters, valueTypes, objectTypes, linkTypes, contextType, new Map());
528
- if (sourceType &&
529
- sourceType.kind !== "ontologyObject" &&
530
- !areDefaultTypesCompatible(parameter.type, sourceType, valueTypes)) {
531
- errors.push({
532
- message: `Default value for "${parameter.name}" has an incompatible type.`,
533
- path: [...parameterPath, "defaultValue"],
534
- });
535
- }
536
- }
537
- }
538
- for (let index = 0; index < action.logic.length; index++) {
539
- const step = action.logic[index];
540
- const stepPath = [...path, "logic", index];
541
- switch (step.kind) {
542
- case "createObject": {
543
- const objectType = objectTypes.get(step.value.objectType);
544
- if (!objectType) {
545
- errors.push({
546
- message: `Unknown object type "${step.value.objectType}" in action "${action.name}".`,
547
- path: [...stepPath, "value", "objectType"],
548
- });
549
- continue;
550
- }
551
- for (let valueIndex = 0; valueIndex < step.value.values.length; valueIndex++) {
552
- errors.push(...validateActionPropertyAssignment(step.value.values[valueIndex], objectType, parameters, [...stepPath, "value", "values", valueIndex], valueTypes, objectTypes, linkTypes, contextType));
553
- }
554
- break;
555
- }
556
- case "updateObject": {
557
- const target = validateActionObjectReference(step.value.object, parameters, [...stepPath, "value", "object"], valueTypes, objectTypes);
558
- errors.push(...target.errors);
559
- if (!target.objectType) {
560
- continue;
561
- }
562
- for (let valueIndex = 0; valueIndex < step.value.values.length; valueIndex++) {
563
- errors.push(...validateActionPropertyAssignment(step.value.values[valueIndex], target.objectType, parameters, [...stepPath, "value", "values", valueIndex], valueTypes, objectTypes, linkTypes, contextType));
564
- }
565
- break;
566
- }
567
- case "deleteObject":
568
- errors.push(...validateActionObjectReference(step.value.object, parameters, [...stepPath, "value", "object"], valueTypes, objectTypes).errors);
569
- break;
570
- }
571
- }
572
- return errors;
377
+ const errors = [];
378
+ const parameters = new Map(action.parameters.map((parameter) => [parameter.name, parameter]));
379
+ const seenParameters = /* @__PURE__ */ new Set();
380
+ for (let index = 0; index < action.parameters.length; index++) {
381
+ const parameter = action.parameters[index];
382
+ const parameterPath = [
383
+ ...path,
384
+ "parameters",
385
+ index
386
+ ];
387
+ if (seenParameters.has(parameter.name)) errors.push({
388
+ message: `Duplicate action parameter name: "${parameter.name}".`,
389
+ path: [...parameterPath, "name"]
390
+ });
391
+ seenParameters.add(parameter.name);
392
+ errors.push(...validateTypeDef(parameter.type, [...parameterPath, "type"], new Set(valueTypes.keys()), new Set(objectTypes.keys())));
393
+ if (parameter.defaultValue) {
394
+ errors.push(...validateExpression(parameter.defaultValue, parameters, [...parameterPath, "defaultValue"], valueTypes, objectTypes, linkTypes, contextType));
395
+ const sourceType = resolveExpressionType(parameter.defaultValue, parameters, valueTypes, objectTypes, linkTypes, contextType, /* @__PURE__ */ new Map());
396
+ if (sourceType && sourceType.kind !== "ontologyObject" && !areDefaultTypesCompatible(parameter.type, sourceType, valueTypes)) errors.push({
397
+ message: `Default value for "${parameter.name}" has an incompatible type.`,
398
+ path: [...parameterPath, "defaultValue"]
399
+ });
400
+ }
401
+ }
402
+ for (let index = 0; index < action.logic.length; index++) {
403
+ const step = action.logic[index];
404
+ const stepPath = [
405
+ ...path,
406
+ "logic",
407
+ index
408
+ ];
409
+ switch (step.kind) {
410
+ case "createObject": {
411
+ const objectType = objectTypes.get(step.value.objectType);
412
+ if (!objectType) {
413
+ errors.push({
414
+ message: `Unknown object type "${step.value.objectType}" in action "${action.name}".`,
415
+ path: [
416
+ ...stepPath,
417
+ "value",
418
+ "objectType"
419
+ ]
420
+ });
421
+ continue;
422
+ }
423
+ for (let valueIndex = 0; valueIndex < step.value.values.length; valueIndex++) errors.push(...validateActionPropertyAssignment(step.value.values[valueIndex], objectType, parameters, [
424
+ ...stepPath,
425
+ "value",
426
+ "values",
427
+ valueIndex
428
+ ], valueTypes, objectTypes, linkTypes, contextType));
429
+ break;
430
+ }
431
+ case "updateObject": {
432
+ const target = validateActionObjectReference(step.value.object, parameters, [
433
+ ...stepPath,
434
+ "value",
435
+ "object"
436
+ ], valueTypes, objectTypes);
437
+ errors.push(...target.errors);
438
+ if (!target.objectType) continue;
439
+ for (let valueIndex = 0; valueIndex < step.value.values.length; valueIndex++) errors.push(...validateActionPropertyAssignment(step.value.values[valueIndex], target.objectType, parameters, [
440
+ ...stepPath,
441
+ "value",
442
+ "values",
443
+ valueIndex
444
+ ], valueTypes, objectTypes, linkTypes, contextType));
445
+ break;
446
+ }
447
+ case "deleteObject": errors.push(...validateActionObjectReference(step.value.object, parameters, [
448
+ ...stepPath,
449
+ "value",
450
+ "object"
451
+ ], valueTypes, objectTypes).errors);
452
+ }
453
+ }
454
+ return errors;
573
455
  }
574
456
  function validateQueryFunctionType(queryFunctionType, path, valueTypeNames, objectTypeNames) {
575
- const errors = [];
576
- const seenParameters = new Set();
577
- for (let index = 0; index < queryFunctionType.parameters.length; index++) {
578
- const parameter = queryFunctionType.parameters[index];
579
- const parameterPath = [...path, "parameters", index];
580
- if (seenParameters.has(parameter.name)) {
581
- errors.push({
582
- message: `Duplicate query function parameter name: "${parameter.name}".`,
583
- path: [...parameterPath, "name"],
584
- });
585
- }
586
- seenParameters.add(parameter.name);
587
- errors.push(...validateTypeDef(parameter.type, [...parameterPath, "type"], valueTypeNames, objectTypeNames));
588
- }
589
- errors.push(...validateTypeDef(queryFunctionType.returnType, [...path, "returnType"], valueTypeNames, objectTypeNames));
590
- return errors;
457
+ const errors = [];
458
+ const seenParameters = /* @__PURE__ */ new Set();
459
+ for (let index = 0; index < queryFunctionType.parameters.length; index++) {
460
+ const parameter = queryFunctionType.parameters[index];
461
+ const parameterPath = [
462
+ ...path,
463
+ "parameters",
464
+ index
465
+ ];
466
+ if (seenParameters.has(parameter.name)) errors.push({
467
+ message: `Duplicate query function parameter name: "${parameter.name}".`,
468
+ path: [...parameterPath, "name"]
469
+ });
470
+ seenParameters.add(parameter.name);
471
+ errors.push(...validateTypeDef(parameter.type, [...parameterPath, "type"], valueTypeNames, objectTypeNames));
472
+ }
473
+ errors.push(...validateTypeDef(queryFunctionType.returnType, [...path, "returnType"], valueTypeNames, objectTypeNames));
474
+ return errors;
591
475
  }
592
- export function validate(ontology) {
593
- const errors = [];
594
- // Collect value type names for ref resolution
595
- const valueTypeNames = new Set();
596
- for (let i = 0; i < ontology.types.length; i++) {
597
- const vt = ontology.types[i];
598
- if (valueTypeNames.has(vt.name)) {
599
- errors.push({
600
- message: `Duplicate value type name: "${vt.name}".`,
601
- path: ["types", i, "name"],
602
- });
603
- }
604
- valueTypeNames.add(vt.name);
605
- }
606
- const objectTypeNames = new Set();
607
- for (let i = 0; i < ontology.objectTypes.length; i++) {
608
- const ot = ontology.objectTypes[i];
609
- if (objectTypeNames.has(ot.name)) {
610
- errors.push({
611
- message: `Duplicate object type name: "${ot.name}".`,
612
- path: ["objectTypes", i, "name"],
613
- });
614
- }
615
- objectTypeNames.add(ot.name);
616
- }
617
- const valueTypes = new Map(ontology.types.map((type) => [type.name, type.type]));
618
- const objectTypes = new Map(ontology.objectTypes.map((objectType) => [objectType.name, objectType]));
619
- if (ontology.contextType) {
620
- errors.push(...validateTypeDef(ontology.contextType, ["contextType"], valueTypeNames, objectTypeNames));
621
- const resolvedContextType = resolveType(ontology.contextType, valueTypes);
622
- if (resolvedContextType?.kind === "struct") {
623
- const userField = resolvedContextType.value.fields.find((field) => field.name === "user");
624
- const unwrappedUserType = userField ? unwrapType(userField.type).type : undefined;
625
- const resolvedUserType = unwrappedUserType
626
- ? resolveType(unwrappedUserType, valueTypes)
627
- : undefined;
628
- if (userField && resolvedUserType?.kind !== "objectReference") {
629
- errors.push({
630
- message: 'Reserved context field "user" must be an object reference.',
631
- path: [
632
- "contextType",
633
- "fields",
634
- resolvedContextType.value.fields.indexOf(userField),
635
- "type",
636
- ],
637
- });
638
- }
639
- }
640
- }
641
- // Validate value type definitions once both namespaces are known.
642
- for (let i = 0; i < ontology.types.length; i++) {
643
- const vt = ontology.types[i];
644
- errors.push(...validateTypeDef(vt.type, ["types", i, "type"], valueTypeNames, objectTypeNames));
645
- }
646
- // Validate object types
647
- for (let i = 0; i < ontology.objectTypes.length; i++) {
648
- const ot = ontology.objectTypes[i];
649
- const otPath = ["objectTypes", i];
650
- // Validate properties
651
- errors.push(...validateProperties(ot.properties, [...otPath, "properties"], valueTypeNames, objectTypeNames));
652
- // Validate primary key references a valid property
653
- const propertyNames = new Set(ot.properties.map((p) => p.name));
654
- if (!propertyNames.has(ot.primaryKey)) {
655
- errors.push({
656
- message: `Primary key "${ot.primaryKey}" does not reference a valid property.`,
657
- path: [...otPath, "primaryKey"],
658
- });
659
- }
660
- if (ot.title && !propertyNames.has(ot.title)) {
661
- errors.push({
662
- message: `Title "${ot.title}" does not reference a valid property.`,
663
- path: [...otPath, "title"],
664
- });
665
- }
666
- }
667
- // Validate link types
668
- const linkIds = new Set();
669
- const linkNames = new Set();
670
- for (let i = 0; i < ontology.linkTypes.length; i++) {
671
- const lt = ontology.linkTypes[i];
672
- const ltPath = ["linkTypes", i];
673
- if (linkIds.has(lt.id)) {
674
- errors.push({
675
- message: `Duplicate link type id: "${lt.id}".`,
676
- path: [...ltPath, "id"],
677
- });
678
- }
679
- linkIds.add(lt.id);
680
- // Relationship names from a source object are keyed by target.name.
681
- const linkName = `${lt.source.objectType}:${lt.target.name}`;
682
- if (linkNames.has(linkName)) {
683
- errors.push({
684
- message: `Duplicate link type target name: "${lt.target.name}" on "${lt.source.objectType}".`,
685
- path: [...ltPath, "target", "name"],
686
- });
687
- }
688
- linkNames.add(linkName);
689
- if (!objectTypeNames.has(lt.source.objectType)) {
690
- errors.push({
691
- message: `Source object type "${lt.source.objectType}" does not exist.`,
692
- path: [...ltPath, "source", "objectType"],
693
- });
694
- }
695
- if (!objectTypeNames.has(lt.target.objectType)) {
696
- errors.push({
697
- message: `Target object type "${lt.target.objectType}" does not exist.`,
698
- path: [...ltPath, "target", "objectType"],
699
- });
700
- }
701
- const foreignKeyRoot = lt.foreignKey.split(".")[0];
702
- const sourceType = ontology.objectTypes.find((candidate) => candidate.name === lt.source.objectType);
703
- const sourceHasFk = sourceType?.properties.some((property) => property.name === foreignKeyRoot) ?? false;
704
- if (sourceType && !sourceHasFk) {
705
- errors.push({
706
- message: `Foreign key "${lt.foreignKey}" does not exist on source object type "${lt.source.objectType}" for link "${lt.id}".`,
707
- path: [...ltPath, "foreignKey"],
708
- });
709
- }
710
- }
711
- const actionNames = new Set();
712
- for (let i = 0; i < ontology.actionTypes.length; i++) {
713
- const action = ontology.actionTypes[i];
714
- const actionPath = ["actionTypes", i];
715
- if (actionNames.has(action.name)) {
716
- errors.push({
717
- message: `Duplicate action type name: "${action.name}".`,
718
- path: [...actionPath, "name"],
719
- });
720
- }
721
- actionNames.add(action.name);
722
- errors.push(...validateAction(action, actionPath, valueTypes, objectTypes, ontology.linkTypes, ontology.contextType));
723
- }
724
- const queryFunctionTypeNames = new Set();
725
- for (let i = 0; i < ontology.queryFunctionTypes.length; i++) {
726
- const queryFunctionType = ontology.queryFunctionTypes[i];
727
- const queryFunctionTypePath = ["queryFunctionTypes", i];
728
- if (queryFunctionTypeNames.has(queryFunctionType.name)) {
729
- errors.push({
730
- message: `Duplicate query function type name: "${queryFunctionType.name}".`,
731
- path: [...queryFunctionTypePath, "name"],
732
- });
733
- }
734
- queryFunctionTypeNames.add(queryFunctionType.name);
735
- errors.push(...validateQueryFunctionType(queryFunctionType, queryFunctionTypePath, valueTypeNames, objectTypeNames));
736
- }
737
- return errors.length === 0
738
- ? { kind: "ok", value: undefined }
739
- : { kind: "err", value: errors };
476
+ function validate(ontology) {
477
+ const errors = [];
478
+ const valueTypeNames = /* @__PURE__ */ new Set();
479
+ for (let i = 0; i < ontology.types.length; i++) {
480
+ const vt = ontology.types[i];
481
+ if (valueTypeNames.has(vt.name)) errors.push({
482
+ message: `Duplicate value type name: "${vt.name}".`,
483
+ path: [
484
+ "types",
485
+ i,
486
+ "name"
487
+ ]
488
+ });
489
+ valueTypeNames.add(vt.name);
490
+ }
491
+ const objectTypeNames = /* @__PURE__ */ new Set();
492
+ for (let i = 0; i < ontology.objectTypes.length; i++) {
493
+ const ot = ontology.objectTypes[i];
494
+ if (objectTypeNames.has(ot.name)) errors.push({
495
+ message: `Duplicate object type name: "${ot.name}".`,
496
+ path: [
497
+ "objectTypes",
498
+ i,
499
+ "name"
500
+ ]
501
+ });
502
+ objectTypeNames.add(ot.name);
503
+ }
504
+ const valueTypes = new Map(ontology.types.map((type) => [type.name, type.type]));
505
+ const objectTypes = new Map(ontology.objectTypes.map((objectType) => [objectType.name, objectType]));
506
+ if (ontology.contextType) {
507
+ errors.push(...validateTypeDef(ontology.contextType, ["contextType"], valueTypeNames, objectTypeNames));
508
+ const resolvedContextType = resolveType(ontology.contextType, valueTypes);
509
+ if (resolvedContextType?.kind === "struct") {
510
+ const userField = resolvedContextType.value.fields.find((field) => field.name === "user");
511
+ const unwrappedUserType = userField ? unwrapType(userField.type).type : void 0;
512
+ const resolvedUserType = unwrappedUserType ? resolveType(unwrappedUserType, valueTypes) : void 0;
513
+ if (userField && resolvedUserType?.kind !== "objectReference") errors.push({
514
+ message: "Reserved context field \"user\" must be an object reference.",
515
+ path: [
516
+ "contextType",
517
+ "fields",
518
+ resolvedContextType.value.fields.indexOf(userField),
519
+ "type"
520
+ ]
521
+ });
522
+ }
523
+ }
524
+ for (let i = 0; i < ontology.types.length; i++) {
525
+ const vt = ontology.types[i];
526
+ errors.push(...validateTypeDef(vt.type, [
527
+ "types",
528
+ i,
529
+ "type"
530
+ ], valueTypeNames, objectTypeNames));
531
+ }
532
+ for (let i = 0; i < ontology.objectTypes.length; i++) {
533
+ const ot = ontology.objectTypes[i];
534
+ const otPath = ["objectTypes", i];
535
+ errors.push(...validateProperties(ot.properties, [...otPath, "properties"], valueTypeNames, objectTypeNames));
536
+ const propertyNames = new Set(ot.properties.map((p) => p.name));
537
+ if (!propertyNames.has(ot.primaryKey)) errors.push({
538
+ message: `Primary key "${ot.primaryKey}" does not reference a valid property.`,
539
+ path: [...otPath, "primaryKey"]
540
+ });
541
+ if (ot.title && !propertyNames.has(ot.title)) errors.push({
542
+ message: `Title "${ot.title}" does not reference a valid property.`,
543
+ path: [...otPath, "title"]
544
+ });
545
+ }
546
+ const linkIds = /* @__PURE__ */ new Set();
547
+ const linkNames = /* @__PURE__ */ new Set();
548
+ for (let i = 0; i < ontology.linkTypes.length; i++) {
549
+ const lt = ontology.linkTypes[i];
550
+ const ltPath = ["linkTypes", i];
551
+ if (linkIds.has(lt.id)) errors.push({
552
+ message: `Duplicate link type id: "${lt.id}".`,
553
+ path: [...ltPath, "id"]
554
+ });
555
+ linkIds.add(lt.id);
556
+ const linkName = `${lt.source.objectType}:${lt.target.name}`;
557
+ if (linkNames.has(linkName)) errors.push({
558
+ message: `Duplicate link type target name: "${lt.target.name}" on "${lt.source.objectType}".`,
559
+ path: [
560
+ ...ltPath,
561
+ "target",
562
+ "name"
563
+ ]
564
+ });
565
+ linkNames.add(linkName);
566
+ if (!objectTypeNames.has(lt.source.objectType)) errors.push({
567
+ message: `Source object type "${lt.source.objectType}" does not exist.`,
568
+ path: [
569
+ ...ltPath,
570
+ "source",
571
+ "objectType"
572
+ ]
573
+ });
574
+ if (!objectTypeNames.has(lt.target.objectType)) errors.push({
575
+ message: `Target object type "${lt.target.objectType}" does not exist.`,
576
+ path: [
577
+ ...ltPath,
578
+ "target",
579
+ "objectType"
580
+ ]
581
+ });
582
+ const foreignKeyRoot = lt.foreignKey.split(".")[0];
583
+ const sourceType = ontology.objectTypes.find((candidate) => candidate.name === lt.source.objectType);
584
+ const sourceHasFk = sourceType?.properties.some((property) => property.name === foreignKeyRoot) ?? false;
585
+ if (sourceType && !sourceHasFk) errors.push({
586
+ message: `Foreign key "${lt.foreignKey}" does not exist on source object type "${lt.source.objectType}" for link "${lt.id}".`,
587
+ path: [...ltPath, "foreignKey"]
588
+ });
589
+ }
590
+ const actionNames = /* @__PURE__ */ new Set();
591
+ for (let i = 0; i < ontology.actionTypes.length; i++) {
592
+ const action = ontology.actionTypes[i];
593
+ const actionPath = ["actionTypes", i];
594
+ if (actionNames.has(action.name)) errors.push({
595
+ message: `Duplicate action type name: "${action.name}".`,
596
+ path: [...actionPath, "name"]
597
+ });
598
+ actionNames.add(action.name);
599
+ errors.push(...validateAction(action, actionPath, valueTypes, objectTypes, ontology.linkTypes, ontology.contextType));
600
+ }
601
+ const queryFunctionTypeNames = /* @__PURE__ */ new Set();
602
+ for (let i = 0; i < ontology.queryFunctionTypes.length; i++) {
603
+ const queryFunctionType = ontology.queryFunctionTypes[i];
604
+ const queryFunctionTypePath = ["queryFunctionTypes", i];
605
+ if (queryFunctionTypeNames.has(queryFunctionType.name)) errors.push({
606
+ message: `Duplicate query function type name: "${queryFunctionType.name}".`,
607
+ path: [...queryFunctionTypePath, "name"]
608
+ });
609
+ queryFunctionTypeNames.add(queryFunctionType.name);
610
+ errors.push(...validateQueryFunctionType(queryFunctionType, queryFunctionTypePath, valueTypeNames, objectTypeNames));
611
+ }
612
+ return errors.length === 0 ? {
613
+ kind: "ok",
614
+ value: void 0
615
+ } : {
616
+ kind: "err",
617
+ value: errors
618
+ };
740
619
  }
620
+ //#endregion
621
+ export { validate };
622
+
741
623
  //# sourceMappingURL=validate.js.map