@party-stack/ontology 0.20.0 → 0.21.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 (355) hide show
  1. package/README.md +31 -0
  2. package/lib/OntologyPullConfig.d.ts +4 -17
  3. package/lib/OntologyPullConfig.d.ts.map +1 -1
  4. package/lib/authentication.d.ts +1068 -0
  5. package/lib/authentication.d.ts.map +1 -0
  6. package/lib/authentication.js +55 -0
  7. package/lib/authentication.js.map +1 -0
  8. package/lib/cli/index.js +19 -45
  9. package/lib/cli/index.js.map +1 -1
  10. package/lib/cli/pull.d.ts.map +1 -1
  11. package/lib/cli/pull.js +16 -29
  12. package/lib/cli/pull.js.map +1 -1
  13. package/lib/client.d.ts +11 -0
  14. package/lib/client.d.ts.map +1 -0
  15. package/lib/client.js +21 -0
  16. package/lib/client.js.map +1 -0
  17. package/lib/examples/blog.d.ts +2 -387
  18. package/lib/examples/blog.js +1 -353
  19. package/lib/examples/blog.live-queries.d.ts +1 -1
  20. package/lib/examples/blog.live-queries.d.ts.map +1 -1
  21. package/lib/examples/blog.live-queries.js +1 -1
  22. package/lib/examples/blog.live-queries.js.map +1 -1
  23. package/lib/examples/generated/collections.d.ts +7 -0
  24. package/lib/examples/generated/collections.d.ts.map +1 -0
  25. package/lib/examples/generated/collections.js +12 -0
  26. package/lib/examples/generated/collections.js.map +1 -0
  27. package/lib/examples/generated/live.d.ts +2 -2
  28. package/lib/examples/generated/live.d.ts.map +1 -1
  29. package/lib/examples/generated/live.js.map +1 -1
  30. package/lib/http.d.ts +13 -0
  31. package/lib/http.d.ts.map +1 -0
  32. package/lib/http.js +29 -0
  33. package/lib/http.js.map +1 -0
  34. package/lib/index.d.ts +19 -25
  35. package/lib/index.js +9 -15
  36. package/lib/json/index.d.ts +1 -16
  37. package/lib/json/index.js +2 -132
  38. package/lib/live/LiveOntology.d.ts +114 -50
  39. package/lib/live/LiveOntology.d.ts.map +1 -1
  40. package/lib/live/LiveOntology.js +23 -103
  41. package/lib/live/LiveOntology.js.map +1 -1
  42. package/lib/live/actions/createLiveOntologyAction.d.ts +15 -16
  43. package/lib/live/actions/createLiveOntologyAction.d.ts.map +1 -1
  44. package/lib/live/actions/createLiveOntologyAction.js +3 -11
  45. package/lib/live/actions/createLiveOntologyAction.js.map +1 -1
  46. package/lib/live/actions/types.d.ts +21 -0
  47. package/lib/live/actions/types.d.ts.map +1 -0
  48. package/lib/live/attachments/createLiveOntologyAttachments.d.ts +29 -19
  49. package/lib/live/attachments/createLiveOntologyAttachments.d.ts.map +1 -1
  50. package/lib/live/attachments/createLiveOntologyAttachments.js +43 -60
  51. package/lib/live/attachments/createLiveOntologyAttachments.js.map +1 -1
  52. package/lib/live/attachments/types.d.ts +3 -3
  53. package/lib/live/index.d.ts +10 -10
  54. package/lib/live/index.js +5 -6
  55. package/lib/live/mutators/createReadTx.d.ts +5 -0
  56. package/lib/live/mutators/createReadTx.d.ts.map +1 -0
  57. package/lib/live/mutators/createReadTx.js +19 -0
  58. package/lib/live/mutators/createReadTx.js.map +1 -0
  59. package/lib/live/mutators/types.d.ts +7 -2
  60. package/lib/live/mutators/types.d.ts.map +1 -1
  61. package/lib/live/objects/types.d.ts +6 -0
  62. package/lib/live/objects/types.d.ts.map +1 -0
  63. package/lib/live/outbox/types.d.ts +24 -15
  64. package/lib/live/outbox/types.d.ts.map +1 -1
  65. package/lib/live/outbox/types.js +1 -11
  66. package/lib/live/pins.d.ts +51 -0
  67. package/lib/live/pins.d.ts.map +1 -0
  68. package/lib/live/pins.js +113 -0
  69. package/lib/live/pins.js.map +1 -0
  70. package/lib/live/storageBackend.d.ts +50 -0
  71. package/lib/live/storageBackend.d.ts.map +1 -0
  72. package/lib/live/storageBackend.js +42 -0
  73. package/lib/live/storageBackend.js.map +1 -0
  74. package/lib/local.d.ts +15 -0
  75. package/lib/local.d.ts.map +1 -0
  76. package/lib/local.js +19 -0
  77. package/lib/local.js.map +1 -0
  78. package/lib/meta/generated/collections.d.ts +7 -0
  79. package/lib/meta/generated/collections.d.ts.map +1 -0
  80. package/lib/meta/generated/collections.js +15 -0
  81. package/lib/meta/generated/collections.js.map +1 -0
  82. package/lib/meta/generated/live.d.ts +3 -3
  83. package/lib/meta/generated/live.d.ts.map +1 -1
  84. package/lib/meta/generated/live.js +2 -2
  85. package/lib/meta/generated/live.js.map +1 -1
  86. package/lib/meta/pull.d.ts +5 -9
  87. package/lib/meta/pull.d.ts.map +1 -1
  88. package/lib/meta/pull.js +5 -43
  89. package/lib/meta/pull.js.map +1 -1
  90. package/lib/query.d.ts +1 -0
  91. package/lib/query.js +2 -0
  92. package/lib/runtime/host.d.ts +35 -0
  93. package/lib/runtime/host.d.ts.map +1 -0
  94. package/lib/runtime/host.js +39 -0
  95. package/lib/runtime/host.js.map +1 -0
  96. package/lib/runtime/index.d.ts +2 -0
  97. package/lib/runtime/index.js +1 -0
  98. package/lib/runtime/live.d.ts +25 -0
  99. package/lib/runtime/live.d.ts.map +1 -0
  100. package/lib/runtime/live.js +31 -0
  101. package/lib/runtime/live.js.map +1 -0
  102. package/lib/runtime/resource.d.ts +24 -0
  103. package/lib/runtime/resource.d.ts.map +1 -0
  104. package/lib/runtime/resource.js +127 -0
  105. package/lib/runtime/resource.js.map +1 -0
  106. package/lib/runtime/transactions.d.ts +27 -0
  107. package/lib/runtime/transactions.d.ts.map +1 -0
  108. package/lib/runtime/transactions.js +188 -0
  109. package/lib/runtime/transactions.js.map +1 -0
  110. package/lib/runtime/view.d.ts +25 -0
  111. package/lib/runtime/view.d.ts.map +1 -0
  112. package/lib/runtime/view.js +256 -0
  113. package/lib/runtime/view.js.map +1 -0
  114. package/lib/tanstack/collections.d.ts +73 -0
  115. package/lib/tanstack/collections.d.ts.map +1 -0
  116. package/lib/tanstack/collections.js +495 -0
  117. package/lib/tanstack/collections.js.map +1 -0
  118. package/lib/tanstack/createLocalCollection.d.ts +14 -0
  119. package/lib/tanstack/createLocalCollection.d.ts.map +1 -0
  120. package/lib/tanstack/createLocalCollection.js +9 -0
  121. package/lib/tanstack/createLocalCollection.js.map +1 -0
  122. package/lib/tanstack/descriptors.d.ts +33 -0
  123. package/lib/tanstack/descriptors.d.ts.map +1 -0
  124. package/lib/tanstack/descriptors.js +38 -0
  125. package/lib/tanstack/descriptors.js.map +1 -0
  126. package/lib/tanstack/diagnostics.d.ts +23 -0
  127. package/lib/tanstack/diagnostics.d.ts.map +1 -0
  128. package/lib/tanstack/diagnostics.js +14 -0
  129. package/lib/tanstack/diagnostics.js.map +1 -0
  130. package/lib/tanstack/index.d.ts +6 -0
  131. package/lib/tanstack/index.js +6 -0
  132. package/lib/tanstack/localCollection.d.ts +14 -0
  133. package/lib/tanstack/localCollection.d.ts.map +1 -0
  134. package/lib/tanstack/localCollection.js +73 -0
  135. package/lib/tanstack/localCollection.js.map +1 -0
  136. package/lib/tanstack/subset.d.ts +28 -0
  137. package/lib/tanstack/subset.d.ts.map +1 -0
  138. package/lib/tanstack/subset.js +290 -0
  139. package/lib/tanstack/subset.js.map +1 -0
  140. package/lib/testing/sqlite.d.ts +40 -0
  141. package/lib/testing/sqlite.d.ts.map +1 -0
  142. package/lib/testing/sqlite.js +409 -0
  143. package/lib/testing/sqlite.js.map +1 -0
  144. package/lib/testing/sqliteBackend.d.ts +68 -0
  145. package/lib/testing/sqliteBackend.d.ts.map +1 -0
  146. package/lib/testing/sqliteBackend.js +34 -0
  147. package/lib/testing/sqliteBackend.js.map +1 -0
  148. package/lib/utils/index.d.ts +1 -8
  149. package/lib/utils/index.js +2 -5
  150. package/lib/utils/values.d.ts +1 -30
  151. package/lib/worker.d.ts +19 -0
  152. package/lib/worker.d.ts.map +1 -0
  153. package/lib/worker.js +46 -0
  154. package/lib/worker.js.map +1 -0
  155. package/package.json +53 -18
  156. package/lib/cli/format.d.ts +0 -4
  157. package/lib/cli/format.d.ts.map +0 -1
  158. package/lib/cli/format.js +0 -19
  159. package/lib/cli/format.js.map +0 -1
  160. package/lib/cli/generate.d.ts +0 -10
  161. package/lib/cli/generate.d.ts.map +0 -1
  162. package/lib/cli/generate.js +0 -108
  163. package/lib/cli/generate.js.map +0 -1
  164. package/lib/examples/blog.d.ts.map +0 -1
  165. package/lib/examples/blog.js.map +0 -1
  166. package/lib/generate/builders.d.ts +0 -12
  167. package/lib/generate/builders.d.ts.map +0 -1
  168. package/lib/generate/builders.js +0 -58
  169. package/lib/generate/builders.js.map +0 -1
  170. package/lib/generate/constants.d.ts +0 -5
  171. package/lib/generate/constants.d.ts.map +0 -1
  172. package/lib/generate/constants.js +0 -28
  173. package/lib/generate/constants.js.map +0 -1
  174. package/lib/generate/index.d.ts +0 -6
  175. package/lib/generate/index.js +0 -6
  176. package/lib/generate/live.d.ts +0 -12
  177. package/lib/generate/live.d.ts.map +0 -1
  178. package/lib/generate/live.js +0 -48
  179. package/lib/generate/live.js.map +0 -1
  180. package/lib/generate/ontology.d.ts +0 -8
  181. package/lib/generate/ontology.d.ts.map +0 -1
  182. package/lib/generate/ontology.js +0 -501
  183. package/lib/generate/ontology.js.map +0 -1
  184. package/lib/generate/types.d.ts +0 -18
  185. package/lib/generate/types.d.ts.map +0 -1
  186. package/lib/generate/types.js +0 -216
  187. package/lib/generate/types.js.map +0 -1
  188. package/lib/generate/utils/buildJsDocs.d.ts +0 -10
  189. package/lib/generate/utils/buildJsDocs.d.ts.map +0 -1
  190. package/lib/generate/utils/buildJsDocs.js +0 -16
  191. package/lib/generate/utils/buildJsDocs.js.map +0 -1
  192. package/lib/infer.d.ts +0 -223
  193. package/lib/infer.d.ts.map +0 -1
  194. package/lib/infer.js +0 -14
  195. package/lib/infer.js.map +0 -1
  196. package/lib/installation/createMetaOntologyConfiguration.d.ts +0 -10
  197. package/lib/installation/createMetaOntologyConfiguration.d.ts.map +0 -1
  198. package/lib/installation/createMetaOntologyConfiguration.js +0 -16
  199. package/lib/installation/createMetaOntologyConfiguration.js.map +0 -1
  200. package/lib/installation/createOntologyBackendInstallation.d.ts +0 -5
  201. package/lib/installation/createOntologyBackendInstallation.d.ts.map +0 -1
  202. package/lib/installation/createOntologyBackendInstallation.js +0 -221
  203. package/lib/installation/createOntologyBackendInstallation.js.map +0 -1
  204. package/lib/installation/index.d.ts +0 -4
  205. package/lib/installation/index.js +0 -3
  206. package/lib/installation/types.d.ts +0 -94
  207. package/lib/installation/types.d.ts.map +0 -1
  208. package/lib/ir/generated/builders.d.ts +0 -380
  209. package/lib/ir/generated/builders.d.ts.map +0 -1
  210. package/lib/ir/generated/builders.js +0 -186
  211. package/lib/ir/generated/builders.js.map +0 -1
  212. package/lib/ir/generated/constants.d.ts +0 -265
  213. package/lib/ir/generated/constants.d.ts.map +0 -1
  214. package/lib/ir/generated/constants.js +0 -165
  215. package/lib/ir/generated/constants.js.map +0 -1
  216. package/lib/ir/generated/types.d.ts +0 -413
  217. package/lib/ir/generated/types.d.ts.map +0 -1
  218. package/lib/ir/index.d.ts +0 -4
  219. package/lib/ir/index.js +0 -3
  220. package/lib/ir/schema.d.ts +0 -2246
  221. package/lib/ir/schema.d.ts.map +0 -1
  222. package/lib/ir/schema.js +0 -1187
  223. package/lib/ir/schema.js.map +0 -1
  224. package/lib/ir/validate.d.ts +0 -8
  225. package/lib/ir/validate.d.ts.map +0 -1
  226. package/lib/ir/validate.js +0 -623
  227. package/lib/ir/validate.js.map +0 -1
  228. package/lib/json/index.d.ts.map +0 -1
  229. package/lib/json/index.js.map +0 -1
  230. package/lib/lenses.d.ts +0 -21
  231. package/lib/lenses.d.ts.map +0 -1
  232. package/lib/lenses.js +0 -110
  233. package/lib/lenses.js.map +0 -1
  234. package/lib/live/OntologyBackendAdapter.d.ts +0 -104
  235. package/lib/live/OntologyBackendAdapter.d.ts.map +0 -1
  236. package/lib/live/OntologyBackendAdapter.js +0 -1
  237. package/lib/live/actions/createLiveOntologyActions.d.ts +0 -28
  238. package/lib/live/actions/createLiveOntologyActions.d.ts.map +0 -1
  239. package/lib/live/actions/createLiveOntologyActions.js +0 -139
  240. package/lib/live/actions/createLiveOntologyActions.js.map +0 -1
  241. package/lib/live/actions/prepareActionParameters.d.ts +0 -19
  242. package/lib/live/actions/prepareActionParameters.d.ts.map +0 -1
  243. package/lib/live/actions/prepareActionParameters.js +0 -213
  244. package/lib/live/actions/prepareActionParameters.js.map +0 -1
  245. package/lib/live/attachments/attachmentSources.d.ts +0 -10
  246. package/lib/live/attachments/attachmentSources.d.ts.map +0 -1
  247. package/lib/live/attachments/attachmentSources.js +0 -64
  248. package/lib/live/attachments/attachmentSources.js.map +0 -1
  249. package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.d.ts +0 -5
  250. package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.d.ts.map +0 -1
  251. package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.js +0 -6
  252. package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.js.map +0 -1
  253. package/lib/live/expression.d.ts +0 -24
  254. package/lib/live/expression.d.ts.map +0 -1
  255. package/lib/live/expression.js +0 -160
  256. package/lib/live/expression.js.map +0 -1
  257. package/lib/live/mutators/OntologyEdits.d.ts +0 -15
  258. package/lib/live/mutators/OntologyEdits.d.ts.map +0 -1
  259. package/lib/live/mutators/OntologyEdits.js +0 -65
  260. package/lib/live/mutators/OntologyEdits.js.map +0 -1
  261. package/lib/live/mutators/createMutatorTx.d.ts +0 -11
  262. package/lib/live/mutators/createMutatorTx.d.ts.map +0 -1
  263. package/lib/live/mutators/createMutatorTx.js +0 -61
  264. package/lib/live/mutators/createMutatorTx.js.map +0 -1
  265. package/lib/live/mutators/runOptimisticAction.d.ts +0 -19
  266. package/lib/live/mutators/runOptimisticAction.d.ts.map +0 -1
  267. package/lib/live/mutators/runOptimisticAction.js +0 -30
  268. package/lib/live/mutators/runOptimisticAction.js.map +0 -1
  269. package/lib/live/objects/OntologyObject.d.ts +0 -4
  270. package/lib/live/objects/OntologyObject.d.ts.map +0 -1
  271. package/lib/live/objects/OntologyObject.js +0 -1
  272. package/lib/live/objects/createLiveOntologyObjectCollection.d.ts +0 -17
  273. package/lib/live/objects/createLiveOntologyObjectCollection.d.ts.map +0 -1
  274. package/lib/live/objects/createLiveOntologyObjectCollection.js +0 -69
  275. package/lib/live/objects/createLiveOntologyObjectCollection.js.map +0 -1
  276. package/lib/live/objects/ontologyObjectCollectionId.d.ts +0 -4
  277. package/lib/live/objects/ontologyObjectCollectionId.d.ts.map +0 -1
  278. package/lib/live/objects/ontologyObjectCollectionId.js +0 -8
  279. package/lib/live/objects/ontologyObjectCollectionId.js.map +0 -1
  280. package/lib/live/outbox/createOntologyOutbox.d.ts +0 -23
  281. package/lib/live/outbox/createOntologyOutbox.d.ts.map +0 -1
  282. package/lib/live/outbox/createOntologyOutbox.js +0 -292
  283. package/lib/live/outbox/createOntologyOutbox.js.map +0 -1
  284. package/lib/live/outbox/leaderExecutor.d.ts +0 -20
  285. package/lib/live/outbox/leaderExecutor.d.ts.map +0 -1
  286. package/lib/live/outbox/leaderExecutor.js +0 -130
  287. package/lib/live/outbox/leaderExecutor.js.map +0 -1
  288. package/lib/live/outbox/outboxService.d.ts +0 -7
  289. package/lib/live/outbox/outboxService.d.ts.map +0 -1
  290. package/lib/live/outbox/outboxService.js +0 -68
  291. package/lib/live/outbox/outboxService.js.map +0 -1
  292. package/lib/live/outbox/projectionManager.d.ts +0 -31
  293. package/lib/live/outbox/projectionManager.d.ts.map +0 -1
  294. package/lib/live/outbox/projectionManager.js +0 -127
  295. package/lib/live/outbox/projectionManager.js.map +0 -1
  296. package/lib/live/outbox/repository.d.ts +0 -31
  297. package/lib/live/outbox/repository.d.ts.map +0 -1
  298. package/lib/live/outbox/repository.js +0 -196
  299. package/lib/live/outbox/repository.js.map +0 -1
  300. package/lib/live/outbox/service.d.ts +0 -61
  301. package/lib/live/outbox/service.d.ts.map +0 -1
  302. package/lib/live/outbox/service.js +0 -6
  303. package/lib/live/outbox/service.js.map +0 -1
  304. package/lib/live/outbox/types.js.map +0 -1
  305. package/lib/live/waitForCollectionReady.d.ts +0 -5
  306. package/lib/live/waitForCollectionReady.d.ts.map +0 -1
  307. package/lib/live/waitForCollectionReady.js +0 -49
  308. package/lib/live/waitForCollectionReady.js.map +0 -1
  309. package/lib/meta/createLocalMetaOntologyBackendAdapter.d.ts +0 -7
  310. package/lib/meta/createLocalMetaOntologyBackendAdapter.d.ts.map +0 -1
  311. package/lib/meta/createLocalMetaOntologyBackendAdapter.js +0 -44
  312. package/lib/meta/createLocalMetaOntologyBackendAdapter.js.map +0 -1
  313. package/lib/meta/generated/constants.d.ts +0 -265
  314. package/lib/meta/generated/constants.d.ts.map +0 -1
  315. package/lib/meta/generated/constants.js +0 -165
  316. package/lib/meta/generated/constants.js.map +0 -1
  317. package/lib/meta/generated/types.d.ts +0 -417
  318. package/lib/meta/generated/types.d.ts.map +0 -1
  319. package/lib/meta/generated/types.js +0 -1
  320. package/lib/meta/ontology.d.ts +0 -26
  321. package/lib/meta/ontology.d.ts.map +0 -1
  322. package/lib/meta/ontology.js +0 -111
  323. package/lib/meta/ontology.js.map +0 -1
  324. package/lib/utils/links.d.ts +0 -50
  325. package/lib/utils/links.d.ts.map +0 -1
  326. package/lib/utils/links.js +0 -13
  327. package/lib/utils/links.js.map +0 -1
  328. package/lib/utils/paths.d.ts +0 -6
  329. package/lib/utils/paths.d.ts.map +0 -1
  330. package/lib/utils/paths.js +0 -42
  331. package/lib/utils/paths.js.map +0 -1
  332. package/lib/utils/provide.d.ts +0 -4
  333. package/lib/utils/provide.d.ts.map +0 -1
  334. package/lib/utils/provide.js +0 -9
  335. package/lib/utils/provide.js.map +0 -1
  336. package/lib/utils/targets.d.ts +0 -37
  337. package/lib/utils/targets.d.ts.map +0 -1
  338. package/lib/utils/targets.js +0 -1
  339. package/lib/utils/typeNames.d.ts +0 -28
  340. package/lib/utils/typeNames.d.ts.map +0 -1
  341. package/lib/utils/typeNames.js +0 -1
  342. package/lib/utils/types.d.ts +0 -12
  343. package/lib/utils/types.d.ts.map +0 -1
  344. package/lib/utils/types.js +0 -48
  345. package/lib/utils/types.js.map +0 -1
  346. package/lib/utils/uncertain.d.ts +0 -11
  347. package/lib/utils/uncertain.d.ts.map +0 -1
  348. package/lib/utils/uncertain.js +0 -14
  349. package/lib/utils/uncertain.js.map +0 -1
  350. package/lib/utils/validation.d.ts +0 -7
  351. package/lib/utils/validation.d.ts.map +0 -1
  352. package/lib/utils/validation.js +0 -1
  353. package/lib/utils/values.d.ts.map +0 -1
  354. /package/lib/{installation → live/actions}/types.js +0 -0
  355. /package/lib/{ir/generated → live/objects}/types.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subset.js","names":[],"sources":["../../src/tanstack/subset.ts"],"sourcesContent":["import * as q from \"@party-stack/ontology-spec/query\";\nimport { IR } from \"@tanstack/db\";\nimport type { Expression, Subset, QueryOrder, OntologyIR } from \"@party-stack/ontology-spec\";\nimport type { ObjectSubset } from \"@party-stack/ontology-spec/query\";\nimport type { Field } from \"@party-stack/ontology-storage\";\nimport type {\n Query,\n Scalar,\n Predicate as StoragePredicate,\n Operand as StorageOperand,\n} from \"@party-stack/ontology-storage\";\nconst field = (...path: string[]): Expression => q.field(\"row\", ...path);\nconst isField = (value: Expression) => value.kind === \"getAt\";\nimport type { LoadSubsetOptions } from \"@tanstack/db\";\n\ntype Definition = OntologyIR[\"types\"][number][\"type\"];\ntype Family = \"string\" | \"number\" | \"boolean\" | \"date\" | \"timestamp\";\ninterface Value {\n operand: Expression;\n family?: Family;\n elementFamily?: Family;\n optional: boolean;\n}\ntype Condition = Expression | boolean;\ninterface Truth {\n yes: Condition;\n no: Condition;\n exact: boolean;\n}\nconst unknown: Truth = { yes: true, no: true, exact: false };\nconst combine = (op: \"and\" | \"or\", values: readonly Condition[]): Condition => {\n const terminal = op === \"or\";\n if (values.includes(terminal)) return terminal;\n const predicates = values.filter((value): value is Expression => typeof value !== \"boolean\");\n return predicates.length === 0\n ? !terminal\n : predicates.length === 1\n ? predicates[0]!\n : q[op](...predicates);\n};\nconst predicate = (value: Condition): Expression | undefined =>\n value === true ? undefined : value === false ? q.or() : value;\nconst negate = (value: Condition): Condition => (typeof value === \"boolean\" ? !value : q.not(value));\n\n/** Translate TanStack semantics into the shared ontology expression IR. Unsupported expressions\n * widen demand; TanStack still evaluates the original query on the returned rows.\n * In particular, a residual filter or locale comparator must run before LIMIT.\n */\nexport function analyzeOntologySubset(subset: LoadSubsetOptions, ir?: OntologyIR, objectType?: string) {\n const objects = new Map(ir?.objectTypes.map((type) => [type.name, type]));\n const named = new Map(ir?.types.map((type) => [type.name, type.type]));\n const resolve = (\n type: Definition | undefined,\n path: readonly string[],\n optional = false,\n seen = new Set<Definition>()\n ): Omit<Value, \"operand\"> | undefined => {\n if (!type || seen.has(type)) return undefined;\n const next = new Set([...seen, type]);\n if (type.kind === \"optional\") return resolve(type.value.type, path, true, next);\n if (type.kind === \"ref\") return resolve(named.get(type.value.name), path, optional, next);\n if (type.kind === \"objectReference\") {\n const object = objects.get(type.value.objectType);\n return resolve(\n object?.properties.find((prop) => prop.name === object.primaryKey)?.type,\n path,\n optional,\n next\n );\n }\n if (path.length)\n return type.kind === \"struct\"\n ? resolve(\n type.value.fields.find((prop) => prop.name === path[0])?.type,\n path.slice(1),\n optional,\n next\n )\n : undefined;\n if (type.kind === \"list\")\n return { elementFamily: resolve(type.value.elementType, [], false, next)?.family, optional };\n switch (type.kind) {\n case \"string\":\n case \"boolean\":\n case \"date\":\n case \"timestamp\":\n return { family: type.kind, optional };\n case \"integer\":\n case \"float\":\n case \"double\":\n return { family: \"number\", optional };\n default:\n return undefined;\n }\n };\n const value = (expression: IR.BasicExpression): Value | undefined => {\n if (expression.type === \"ref\") {\n const path = IR.getPropRefPropertyPath(expression);\n if (!path.length) return undefined;\n const type = objects\n .get(objectType ?? \"\")\n ?.properties.find((prop) => prop.name === path[0])?.type;\n const resolved = resolve(type, path.slice(1));\n return resolved && { operand: field(...path), ...resolved };\n }\n if (expression.type !== \"val\") return undefined;\n const literal: unknown = expression.value;\n if (literal == null) return { operand: q.literal(literal), optional: true };\n if (typeof literal === \"string\" || typeof literal === \"boolean\")\n return {\n operand: q.literal(literal),\n family: typeof literal as \"string\" | \"boolean\",\n optional: false,\n };\n if (typeof literal === \"number\" && Number.isFinite(literal))\n return { operand: q.literal(literal), family: \"number\", optional: false };\n if (typeof literal === \"object\") {\n const tag = Reflect.get(literal, Symbol.toStringTag) as unknown;\n if (tag === \"Temporal.Instant\" || tag === \"Temporal.PlainDate\")\n return {\n operand: q.literal(literal),\n family: tag === \"Temporal.Instant\" ? \"timestamp\" : \"date\",\n optional: false,\n };\n }\n return undefined;\n };\n const present = (v: Value): Condition =>\n !v.optional\n ? true\n : isField(v.operand)\n ? // Ontology object decoding normalizes optional nulls to undefined.\n q.ne(v.operand, q.literal(undefined))\n : false;\n const truth = (expression: IR.BasicExpression): Truth => {\n if (expression.type === \"val\" && (typeof expression.value === \"boolean\" || expression.value == null))\n return {\n yes: expression.value === true,\n no: expression.value === false,\n exact: true,\n };\n if (expression.type === \"ref\") {\n const v = value(expression);\n return v?.family === \"boolean\"\n ? {\n yes: q.eq(v.operand, q.literal(true)),\n no: q.eq(v.operand, q.literal(false)),\n exact: true,\n }\n : unknown;\n }\n if (expression.type !== \"func\") return unknown;\n const { name, args } = expression;\n if (name === \"and\" || name === \"or\") {\n const children = args.map(truth);\n return {\n yes: combine(\n name,\n children.map((c) => c.yes)\n ),\n no: combine(\n name === \"and\" ? \"or\" : \"and\",\n children.map((c) => c.no)\n ),\n exact: children.every((c) => c.exact),\n };\n }\n if (name === \"not\" && args.length === 1) {\n const child = truth(args[0]!);\n return { yes: child.no, no: child.yes, exact: child.exact };\n }\n const left = args[0] && value(args[0]);\n if (!left) return unknown;\n if ((name === \"isNull\" || name === \"isUndefined\") && args.length === 1) {\n const yes = q.eq(left.operand, q.literal(name === \"isNull\" ? null : undefined));\n return { yes, no: negate(yes), exact: true };\n }\n // Physical PlainDate equality follows ISO day ordering, while TanStack\n // equality also distinguishes calendars. Neither an equality/membership\n // predicate nor its negation is exact at that boundary. Broaden both\n // branches and let TanStack filter before applying its window.\n if (left.family === \"date\" && (name === \"eq\" || name === \"in\")) return unknown;\n if (name === \"in\" && args[1]?.type === \"ref\") {\n const array = value(args[1]);\n if (!array?.elementFamily || !isField(array.operand)) return unknown;\n if (!left.family) return { yes: false, no: false, exact: true };\n if (left.family !== array.elementFamily) return unknown;\n const yes = q.contains(array.operand, left.operand);\n return {\n yes: combine(\"and\", [present(left), yes]),\n no: combine(\"and\", [present(left), negate(yes)]),\n exact: true,\n };\n }\n if (name === \"in\" && args[1]?.type === \"val\" && Array.isArray(args[1].value)) {\n const items = (args[1].value as unknown[])\n .filter((item) => item != null)\n .map((item) => value(new IR.Value(item)));\n if (items.some((item) => !item || item.family !== left.family)) return unknown;\n const yes = q.inArray(\n left.operand,\n q.literal(\n items.map(\n (item) => (item!.operand as Extract<Expression, { kind: \"literal\" }>).value.value\n )\n )\n );\n return {\n yes: combine(\"and\", [present(left), yes]),\n no: combine(\"and\", [present(left), negate(yes)]),\n exact: true,\n };\n }\n if (![\"eq\", \"gt\", \"gte\", \"lt\", \"lte\", \"like\", \"ilike\"].includes(name)) return unknown;\n const right = args[1] && value(args[1]);\n if (!right || args.length !== 2) return unknown;\n if (!left.family || !right.family) return { yes: false, no: false, exact: true };\n if (left.family !== right.family) return unknown;\n const guard = combine(\"and\", [present(left), present(right)]);\n let yes: Expression;\n if (name === \"eq\" || name === \"gt\" || name === \"gte\" || name === \"lt\" || name === \"lte\")\n yes = q[name](left.operand, right.operand);\n else if ((name === \"like\" || name === \"ilike\") && left.family === \"string\")\n yes = q[name](left.operand, right.operand);\n else return unknown;\n // Equality against a defined operand already rejects missing values. Two\n // optional operands can both be missing and still compare equal in storage.\n // Negation always needs the guard: TanStack treats missing as UNKNOWN,\n // whereas storage's NOT turns an ordinary false comparison into true.\n return {\n yes: name === \"eq\" && (!left.optional || !right.optional) ? yes : combine(\"and\", [guard, yes]),\n no: combine(\"and\", [guard, negate(yes)]),\n exact: true,\n };\n };\n const filter = subset.where ? truth(subset.where) : { yes: true, exact: true };\n // Load the entire leading-value tie on cursor requests. A local lastKey\n // does not prove remote coverage for a composite ordering boundary.\n const cursor = subset.cursor\n ? truth(new IR.Func(\"or\", [subset.cursor.whereFrom, subset.cursor.whereCurrent]))\n : undefined;\n const orderBy: QueryOrder[] = [];\n let ordered = true;\n let homogeneousOrder = true;\n for (const order of subset.orderBy ?? []) {\n const v = value(order.expression);\n const compare = order.compareOptions;\n homogeneousOrder &&= !!v?.family && (compare.nulls === \"first\" || compare.nulls === \"last\");\n if (\n order.expression.type !== \"ref\" ||\n !v ||\n compare.stringSort === \"custom\" ||\n (v.family === \"string\" && compare.stringSort !== \"lexical\")\n ) {\n ordered = false;\n break;\n }\n orderBy.push({\n expression: v.operand,\n direction: compare.direction,\n nulls: compare.nulls,\n });\n }\n const bounded = filter.exact && ordered && !cursor;\n const limit = bounded && subset.limit !== undefined ? subset.limit + (subset.offset ?? 0) : undefined;\n const finalOrder = subset.orderBy?.at(-1)?.expression;\n const finalPath = finalOrder?.type === \"ref\" ? IR.getPropRefPropertyPath(finalOrder) : [];\n const finalValue = finalOrder && value(finalOrder);\n // A finite prefix is independently complete only when the full comparison\n // has known domains and a unique final key. This is schema evidence, never\n // an inference from whichever rows happen to be cached.\n const orderedWindowExact =\n bounded &&\n homogeneousOrder &&\n subset.limit !== undefined &&\n Number.isSafeInteger(subset.limit) &&\n subset.limit >= 0 &&\n limit !== undefined &&\n Number.isSafeInteger(limit) &&\n limit >= 0 &&\n Number.isSafeInteger(subset.offset ?? 0) &&\n (subset.offset ?? 0) >= 0 &&\n finalPath.length === 1 &&\n finalPath[0] === objects.get(objectType ?? \"\")?.primaryKey &&\n !!finalValue &&\n !finalValue.optional &&\n (finalValue.family === \"string\" || finalValue.family === \"number\");\n const subsetIR: Subset = {\n where: predicate(combine(\"and\", [filter.yes, cursor?.yes ?? true])),\n ...(ordered && orderBy.length ? { orderBy } : {}),\n ...(limit !== undefined && Number.isSafeInteger(limit) ? { page: { limit } } : {}),\n };\n return {\n subset: subsetIR,\n exact: filter.exact && ordered && !cursor,\n filterExact: filter.exact,\n orderExact: ordered,\n orderedWindowExact,\n };\n}\n\n/** Raw Tables/transaction adapter. Only serializes nodes constructed by the analyzer above. */\nfunction storageScan(subset: Subset): Query {\n const operand = (e: Expression): StorageOperand =>\n e.kind === \"getAt\"\n ? { _tag: \"Field\", path: e.value.path }\n : ((e as Extract<Expression, { kind: \"literal\" }>).value.value as Scalar);\n const predicate = (e: Expression): StoragePredicate => {\n if (e.kind === \"and\" || e.kind === \"or\")\n return { op: e.kind, predicates: e.value.expressions.map(predicate) };\n if (e.kind === \"not\") return { op: \"not\", predicate: predicate(e.value.expression) };\n if (e.kind === \"in\")\n return {\n op: \"in\",\n left: operand(e.value.left),\n values: (e.value.right as Extract<Expression, { kind: \"literal\" }>).value.value as Scalar[],\n };\n const binary = e as Extract<\n Expression,\n { kind: \"eq\" | \"ne\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"like\" | \"ilike\" | \"contains\" }\n >;\n return {\n op: binary.kind,\n left: operand(binary.value.left),\n right: operand(binary.value.right),\n } as StoragePredicate;\n };\n return {\n where: subset.where ? predicate(subset.where) : undefined,\n ...(subset.orderBy\n ? {\n orderBy: subset.orderBy.map((o) => ({\n field: operand(o.expression) as Field,\n direction: o.direction,\n nulls: o.nulls,\n })),\n }\n : {}),\n ...(subset.page?.limit !== undefined ? { limit: subset.page.limit } : {}),\n };\n}\nexport function analyzeStorageSubset(subset: LoadSubsetOptions, ir?: OntologyIR, objectType?: string) {\n const analysis = analyzeOntologySubset(subset, ir, objectType);\n return { ...analysis, query: storageScan(analysis.subset) };\n}\nexport function storageSubset(subset: LoadSubsetOptions, ir?: OntologyIR, objectType?: string): Query {\n return analyzeStorageSubset(subset, ir, objectType).query;\n}\nexport function ontologySubset(subset: LoadSubsetOptions, ir: OntologyIR, objectType: string): ObjectSubset {\n return {\n from: { source: { objectType }, binding: \"row\" },\n ...analyzeOntologySubset(subset, ir, objectType).subset,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { SQLiteDatabase } from "./sqliteBackend.js";
2
+ import { OntologyIR } from "@party-stack/ontology";
3
+ //#region src/testing/sqlite.d.ts
4
+ declare const conformanceIR: OntologyIR;
5
+ declare function runSchemaCreation(database: SQLiteDatabase): Promise<void>;
6
+ declare function runActionsAndContext(database: SQLiteDatabase): Promise<void>;
7
+ declare function runHandlers(database: SQLiteDatabase): Promise<void>;
8
+ declare function runInlineAttachments(database: SQLiteDatabase): Promise<void>;
9
+ declare function runTransactionRollback(database: SQLiteDatabase): void;
10
+ declare function runExternalAttachments(database: SQLiteDatabase): Promise<void>;
11
+ export declare const sqliteOntologyConformanceCases: readonly [{
12
+ readonly id: "schema";
13
+ readonly name: "creates schemas idempotently";
14
+ readonly run: typeof runSchemaCreation;
15
+ }, {
16
+ readonly id: "actions-context";
17
+ readonly name: "persists declarative actions with context.user";
18
+ readonly run: typeof runActionsAndContext;
19
+ }, {
20
+ readonly id: "handlers";
21
+ readonly name: "runs registered mutators and query functions";
22
+ readonly run: typeof runHandlers;
23
+ }, {
24
+ readonly id: "inline-attachments";
25
+ readonly name: "persists inline SQLite attachment bytes";
26
+ readonly run: typeof runInlineAttachments;
27
+ }, {
28
+ readonly id: "transaction-rollback";
29
+ readonly name: "rolls back synchronous transactions";
30
+ readonly run: typeof runTransactionRollback;
31
+ }, {
32
+ readonly id: "external-attachments";
33
+ readonly name: "uses injectable external attachment bytes safely";
34
+ readonly run: typeof runExternalAttachments;
35
+ }];
36
+ export type SQLiteOntologyConformanceCaseId = (typeof sqliteOntologyConformanceCases)[number]["id"];
37
+ export declare function runSQLiteOntologyConformanceCase(id: SQLiteOntologyConformanceCaseId, database: SQLiteDatabase): Promise<void>;
38
+ //#endregion
39
+ export { conformanceIR as sqliteOntologyConformanceIR };
40
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","names":[],"sources":["../../src/testing/sqlite.ts"],"mappings":";;;cAiBM,eAAe;iBA0MN,kBAAkB,UAAU,iBAAiB;iBAe7C,qBAAqB,UAAU,iBAAiB;iBA+BhD,YAAY,UAAU,iBAAiB;iBAqCvC,qBAAqB,UAAU,iBAAiB;iBA+BtD,uBAAuB,UAAU;iBAsE3B,uBAAuB,UAAU,iBAAiB;qBAuFpD;WACP;WAAc;WAAsC,YAAG;;WAErD;WACA;WACA,YAAG;;WAGH;WACA;WACA,YAAG;;WAGH;WACA;WACA,YAAG;;WAGH;WACA;WACA,YAAG;;WAGH;WACA;WACA,YAAG;;YAIC,0CAA0C;wBAEhC,iCAClB,IAAI,iCACJ,UAAU,iBACX"}
@@ -0,0 +1,409 @@
1
+ import { makeSQLiteTestBackend } from "./sqliteBackend.js";
2
+ import { Effect } from "effect";
3
+ import { eq, queryOnce } from "@tanstack/db";
4
+ import { collectByteBlob } from "@party-stack/ontology-storage/blobs";
5
+ import { createLiveOntology, o } from "@party-stack/ontology";
6
+ //#region src/testing/sqlite.ts
7
+ const conformanceIR = {
8
+ types: [],
9
+ objectTypes: [{
10
+ name: "Note",
11
+ displayName: "Note",
12
+ pluralDisplayName: "Notes",
13
+ primaryKey: "id",
14
+ properties: [
15
+ {
16
+ name: "id",
17
+ displayName: "ID",
18
+ type: o.string({})
19
+ },
20
+ {
21
+ name: "title",
22
+ displayName: "Title",
23
+ type: o.string({})
24
+ },
25
+ {
26
+ name: "owner",
27
+ displayName: "Owner",
28
+ type: o.string({})
29
+ }
30
+ ]
31
+ }, {
32
+ name: "Asset",
33
+ displayName: "Asset",
34
+ pluralDisplayName: "Assets",
35
+ primaryKey: "id",
36
+ properties: [{
37
+ name: "id",
38
+ displayName: "ID",
39
+ type: o.string({})
40
+ }, {
41
+ name: "attachment",
42
+ displayName: "Attachment",
43
+ type: o.attachment({})
44
+ }]
45
+ }],
46
+ linkTypes: [],
47
+ actionTypes: [
48
+ {
49
+ name: "createNote",
50
+ displayName: "Create note",
51
+ parameters: [
52
+ {
53
+ name: "id",
54
+ displayName: "ID",
55
+ type: o.string({})
56
+ },
57
+ {
58
+ name: "title",
59
+ displayName: "Title",
60
+ type: o.string({})
61
+ },
62
+ {
63
+ name: "owner",
64
+ displayName: "Owner",
65
+ type: o.string({}),
66
+ defaultValue: o.Expression.contextReference({ name: "user" })
67
+ }
68
+ ],
69
+ logic: [o.ActionLogicStep.createObject({
70
+ objectType: "Note",
71
+ values: [
72
+ {
73
+ property: ["id"],
74
+ value: o.Expression.inputReference({ name: "id" })
75
+ },
76
+ {
77
+ property: ["title"],
78
+ value: o.Expression.inputReference({ name: "title" })
79
+ },
80
+ {
81
+ property: ["owner"],
82
+ value: o.Expression.inputReference({ name: "owner" })
83
+ }
84
+ ]
85
+ })]
86
+ },
87
+ {
88
+ name: "renameNote",
89
+ displayName: "Rename note",
90
+ parameters: [{
91
+ name: "note",
92
+ displayName: "Note",
93
+ type: o.objectReference({ objectType: "Note" })
94
+ }, {
95
+ name: "title",
96
+ displayName: "Title",
97
+ type: o.string({})
98
+ }],
99
+ logic: []
100
+ },
101
+ {
102
+ name: "createAsset",
103
+ displayName: "Create asset",
104
+ parameters: [{
105
+ name: "id",
106
+ displayName: "ID",
107
+ type: o.string({})
108
+ }, {
109
+ name: "attachment",
110
+ displayName: "Attachment",
111
+ type: o.attachment({})
112
+ }],
113
+ logic: [o.ActionLogicStep.createObject({
114
+ objectType: "Asset",
115
+ values: [{
116
+ property: ["id"],
117
+ value: o.Expression.inputReference({ name: "id" })
118
+ }, {
119
+ property: ["attachment"],
120
+ value: o.Expression.inputReference({ name: "attachment" })
121
+ }]
122
+ })]
123
+ }
124
+ ],
125
+ queryFunctionTypes: [{
126
+ name: "noteTitle",
127
+ displayName: "Note title",
128
+ parameters: [{
129
+ name: "note",
130
+ displayName: "Note",
131
+ type: o.objectReference({ objectType: "Note" })
132
+ }],
133
+ returnType: o.string({})
134
+ }, {
135
+ name: "currentUser",
136
+ displayName: "Current user",
137
+ parameters: [],
138
+ returnType: o.string({})
139
+ }]
140
+ };
141
+ function assert(condition, message) {
142
+ if (!condition) throw new Error(message);
143
+ }
144
+ function assertEqual(actual, expected, message) {
145
+ if (JSON.stringify(actual) !== JSON.stringify(expected)) throw new Error(`${message} Expected ${JSON.stringify(expected)}, received ${JSON.stringify(actual)}.`);
146
+ }
147
+ async function readObject(collection, id) {
148
+ return (await queryOnce((query) => query.from({ object: collection }).where(({ object }) => eq(object.id, id)).select(({ object }) => object)))[0];
149
+ }
150
+ const mutators = { renameNote: async ({ tx, args }) => {
151
+ await tx.mutate.Note.update(args.note, { title: args.title });
152
+ } };
153
+ const queryFunctions = {
154
+ noteTitle: async ({ tx, args }) => {
155
+ return (await tx.query((query, objects) => query.from({ note: objects.Note }).where(({ note }) => eq(note.id, args.note)).select(({ note }) => ({ title: note.title })).findOne()))?.title;
156
+ },
157
+ currentUser: ({ context }) => context.user
158
+ };
159
+ async function runSchemaCreation(database) {
160
+ const open = (name) => Effect.runPromise(Effect.scoped(makeSQLiteTestBackend({
161
+ ir: conformanceIR,
162
+ database,
163
+ name,
164
+ context: {}
165
+ })));
166
+ await open("sqlite");
167
+ await open("sqlite");
168
+ assert(database.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get("party_tables_rows"), "Native Tables rows were not created.");
169
+ }
170
+ async function runActionsAndContext(database) {
171
+ const ontology = await createLiveOntology({
172
+ ir: conformanceIR,
173
+ backend: makeSQLiteTestBackend({
174
+ ir: conformanceIR,
175
+ database,
176
+ name: "sqlite",
177
+ context: { user: "alice" }
178
+ }),
179
+ context: { user: "alice" }
180
+ });
181
+ try {
182
+ await ontology.actions.createNote({
183
+ id: "note-1",
184
+ title: "Hello"
185
+ });
186
+ const note = await readObject(ontology.objects.Note, "note-1");
187
+ assertEqual(note && {
188
+ id: note.id,
189
+ title: note.title,
190
+ owner: note.owner
191
+ }, {
192
+ id: "note-1",
193
+ title: "Hello",
194
+ owner: "alice"
195
+ }, "Declarative action or context.user failed.");
196
+ } finally {
197
+ await ontology.cleanup();
198
+ }
199
+ }
200
+ async function runHandlers(database) {
201
+ const ontology = await createLiveOntology({
202
+ ir: conformanceIR,
203
+ backend: makeSQLiteTestBackend({
204
+ ir: conformanceIR,
205
+ database,
206
+ name: "sqlite",
207
+ mutators,
208
+ queryFunctions,
209
+ context: { user: "alice" }
210
+ }),
211
+ context: { user: "alice" }
212
+ });
213
+ try {
214
+ await ontology.actions.createNote({
215
+ id: "note-1",
216
+ title: "Before"
217
+ });
218
+ await ontology.actions.renameNote({
219
+ note: "note-1",
220
+ title: "After"
221
+ });
222
+ assertEqual(await ontology.queryFunctions.noteTitle({ note: "note-1" }), "After", "Registered mutator or query function failed.");
223
+ assertEqual(await ontology.queryFunctions.currentUser({}), "alice", "Query function did not receive context.user.");
224
+ } finally {
225
+ await ontology.cleanup();
226
+ }
227
+ }
228
+ async function runInlineAttachments(database) {
229
+ const ontology = await createLiveOntology({
230
+ ir: conformanceIR,
231
+ backend: makeSQLiteTestBackend({
232
+ ir: conformanceIR,
233
+ database,
234
+ name: "sqlite"
235
+ })
236
+ });
237
+ try {
238
+ const created = await ontology.attachments.create(new Blob(["inline"], { type: "text/plain" }), { target: {
239
+ kind: "objectProperty",
240
+ objectType: "Asset",
241
+ property: "attachment"
242
+ } });
243
+ await ontology.actions.createAsset({
244
+ id: "asset-1",
245
+ attachment: created.attachment
246
+ });
247
+ assertEqual(await (await ontology.attachments.blob(created.attachment)).text(), "inline", "Inline attachment bytes were not persisted.");
248
+ } finally {
249
+ await ontology.cleanup();
250
+ }
251
+ }
252
+ function runTransactionRollback(database) {
253
+ database.exec(`CREATE TABLE rollback_test (id TEXT PRIMARY KEY)`);
254
+ try {
255
+ database.transaction(() => {
256
+ database.prepare(`INSERT INTO rollback_test (id) VALUES (?)`).run("rolled-back");
257
+ throw new Error("intentional rollback");
258
+ })();
259
+ } catch {}
260
+ assertEqual(database.prepare(`SELECT id FROM rollback_test`).all(), [], "Synchronous transaction did not roll back.");
261
+ }
262
+ var MemoryAttachmentBytesStore = class {
263
+ blobs = /* @__PURE__ */ new Map();
264
+ async write(id, input) {
265
+ this.blobs.set(id, await Effect.runPromise(collectByteBlob(input)));
266
+ }
267
+ read(id) {
268
+ const blob = this.blobs.get(id);
269
+ return blob ? Promise.resolve(blob) : Promise.reject(/* @__PURE__ */ new Error(`Missing external bytes "${id}".`));
270
+ }
271
+ delete(id) {
272
+ this.blobs.delete(id);
273
+ return Promise.resolve();
274
+ }
275
+ };
276
+ var DelayedAttachmentBytesStore = class extends MemoryAttachmentBytesStore {
277
+ releaseWrite;
278
+ writeGate;
279
+ markStarted;
280
+ writeStarted;
281
+ deleteCalls = 0;
282
+ constructor() {
283
+ super();
284
+ let started;
285
+ this.writeStarted = new Promise((resolve) => {
286
+ started = resolve;
287
+ });
288
+ this.writeGate = new Promise((resolve) => {
289
+ this.releaseWrite = resolve;
290
+ });
291
+ this.markStarted = started;
292
+ }
293
+ async write(id, blob) {
294
+ this.markStarted();
295
+ await this.writeGate;
296
+ await super.write(id, blob);
297
+ }
298
+ delete(id) {
299
+ this.deleteCalls++;
300
+ return super.delete(id);
301
+ }
302
+ release() {
303
+ this.releaseWrite();
304
+ }
305
+ };
306
+ async function runExternalAttachments(database) {
307
+ const storage = { external: { bytes: new MemoryAttachmentBytesStore() } };
308
+ const ontology = await createLiveOntology({
309
+ ir: conformanceIR,
310
+ backend: makeSQLiteTestBackend({
311
+ ir: conformanceIR,
312
+ database,
313
+ name: "sqlite",
314
+ attachmentStorage: storage
315
+ })
316
+ });
317
+ try {
318
+ const created = await ontology.attachments.create(new Blob(["external"], { type: "text/plain" }), { target: {
319
+ kind: "objectProperty",
320
+ objectType: "Asset",
321
+ property: "attachment"
322
+ } });
323
+ await ontology.actions.createAsset({
324
+ id: "external-asset",
325
+ attachment: created.attachment
326
+ });
327
+ assertEqual(await (await ontology.attachments.blob(created.attachment)).text(), "external", "External authoritative bytes were not readable.");
328
+ } finally {
329
+ await ontology.cleanup();
330
+ }
331
+ const delayedBytes = new DelayedAttachmentBytesStore();
332
+ const delayed = await createLiveOntology({
333
+ ir: conformanceIR,
334
+ backend: makeSQLiteTestBackend({
335
+ ir: conformanceIR,
336
+ database,
337
+ name: "sqlite",
338
+ attachmentStorage: { external: { bytes: delayedBytes } }
339
+ })
340
+ });
341
+ try {
342
+ const created = await delayed.attachments.create(new Blob(["delayed"], { type: "text/plain" }), { target: {
343
+ kind: "objectProperty",
344
+ objectType: "Asset",
345
+ property: "attachment"
346
+ } });
347
+ const action = delayed.actions.createAsset({
348
+ id: "delayed-asset",
349
+ attachment: created.attachment
350
+ });
351
+ action.catch(() => void 0);
352
+ await delayedBytes.writeStarted;
353
+ assertEqual(await Effect.runPromise(Effect.scoped(Effect.gen(function* () {
354
+ return yield* (yield* makeSQLiteTestBackend({
355
+ ir: conformanceIR,
356
+ database,
357
+ name: "sqlite",
358
+ attachmentStorage: { external: { bytes: delayedBytes } }
359
+ })).collectGarbage({ orphanGraceMs: 0 });
360
+ }))), 0, "Collector claimed an active upload.");
361
+ delayedBytes.release();
362
+ await action;
363
+ assertEqual(delayedBytes.deleteCalls, 0, "Collector deleted an active upload.");
364
+ } finally {
365
+ delayedBytes.release();
366
+ await delayed.cleanup();
367
+ }
368
+ }
369
+ const sqliteOntologyConformanceCases = [
370
+ {
371
+ id: "schema",
372
+ name: "creates schemas idempotently",
373
+ run: runSchemaCreation
374
+ },
375
+ {
376
+ id: "actions-context",
377
+ name: "persists declarative actions with context.user",
378
+ run: runActionsAndContext
379
+ },
380
+ {
381
+ id: "handlers",
382
+ name: "runs registered mutators and query functions",
383
+ run: runHandlers
384
+ },
385
+ {
386
+ id: "inline-attachments",
387
+ name: "persists inline SQLite attachment bytes",
388
+ run: runInlineAttachments
389
+ },
390
+ {
391
+ id: "transaction-rollback",
392
+ name: "rolls back synchronous transactions",
393
+ run: runTransactionRollback
394
+ },
395
+ {
396
+ id: "external-attachments",
397
+ name: "uses injectable external attachment bytes safely",
398
+ run: runExternalAttachments
399
+ }
400
+ ];
401
+ async function runSQLiteOntologyConformanceCase(id, database) {
402
+ const test = sqliteOntologyConformanceCases.find((candidate) => candidate.id === id);
403
+ assert(test, `Unknown SQLite ontology conformance case "${id}".`);
404
+ await test.run(database);
405
+ }
406
+ //#endregion
407
+ export { runSQLiteOntologyConformanceCase, sqliteOntologyConformanceCases, conformanceIR as sqliteOntologyConformanceIR };
408
+
409
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","names":[],"sources":["../../src/testing/sqlite.ts"],"sourcesContent":["import {\n createLiveOntology,\n o,\n type OntologyIR,\n type OntologyMutatorRegistry,\n type OntologyQueryFunctionRegistry,\n} from \"@party-stack/ontology\";\nimport { collectByteBlob, type ByteInput } from \"@party-stack/ontology-storage/blobs\";\nimport { eq, queryOnce, type Collection } from \"@tanstack/db\";\nimport { Effect } from \"effect\";\nimport {\n makeSQLiteTestBackend,\n type SQLiteAttachmentBytesStore,\n type SQLiteAttachmentStorageOptions,\n type SQLiteDatabase,\n} from \"./sqliteBackend.js\";\n\nconst conformanceIR: OntologyIR = {\n types: [],\n objectTypes: [\n {\n name: \"Note\",\n displayName: \"Note\",\n pluralDisplayName: \"Notes\",\n primaryKey: \"id\",\n properties: [\n { name: \"id\", displayName: \"ID\", type: o.string({}) },\n {\n name: \"title\",\n displayName: \"Title\",\n type: o.string({}),\n },\n {\n name: \"owner\",\n displayName: \"Owner\",\n type: o.string({}),\n },\n ],\n },\n {\n name: \"Asset\",\n displayName: \"Asset\",\n pluralDisplayName: \"Assets\",\n primaryKey: \"id\",\n properties: [\n { name: \"id\", displayName: \"ID\", type: o.string({}) },\n {\n name: \"attachment\",\n displayName: \"Attachment\",\n type: o.attachment({}),\n },\n ],\n },\n ],\n linkTypes: [],\n actionTypes: [\n {\n name: \"createNote\",\n displayName: \"Create note\",\n parameters: [\n { name: \"id\", displayName: \"ID\", type: o.string({}) },\n {\n name: \"title\",\n displayName: \"Title\",\n type: o.string({}),\n },\n {\n name: \"owner\",\n displayName: \"Owner\",\n type: o.string({}),\n defaultValue: o.Expression.contextReference({\n name: \"user\",\n }),\n },\n ],\n logic: [\n o.ActionLogicStep.createObject({\n objectType: \"Note\",\n values: [\n {\n property: [\"id\"],\n value: o.Expression.inputReference({\n name: \"id\",\n }),\n },\n {\n property: [\"title\"],\n value: o.Expression.inputReference({\n name: \"title\",\n }),\n },\n {\n property: [\"owner\"],\n value: o.Expression.inputReference({\n name: \"owner\",\n }),\n },\n ],\n }),\n ],\n },\n {\n name: \"renameNote\",\n displayName: \"Rename note\",\n parameters: [\n {\n name: \"note\",\n displayName: \"Note\",\n type: o.objectReference({ objectType: \"Note\" }),\n },\n {\n name: \"title\",\n displayName: \"Title\",\n type: o.string({}),\n },\n ],\n logic: [],\n },\n {\n name: \"createAsset\",\n displayName: \"Create asset\",\n parameters: [\n { name: \"id\", displayName: \"ID\", type: o.string({}) },\n {\n name: \"attachment\",\n displayName: \"Attachment\",\n type: o.attachment({}),\n },\n ],\n logic: [\n o.ActionLogicStep.createObject({\n objectType: \"Asset\",\n values: [\n {\n property: [\"id\"],\n value: o.Expression.inputReference({\n name: \"id\",\n }),\n },\n {\n property: [\"attachment\"],\n value: o.Expression.inputReference({\n name: \"attachment\",\n }),\n },\n ],\n }),\n ],\n },\n ],\n queryFunctionTypes: [\n {\n name: \"noteTitle\",\n displayName: \"Note title\",\n parameters: [\n {\n name: \"note\",\n displayName: \"Note\",\n type: o.objectReference({ objectType: \"Note\" }),\n },\n ],\n returnType: o.string({}),\n },\n {\n name: \"currentUser\",\n displayName: \"Current user\",\n parameters: [],\n returnType: o.string({}),\n },\n ],\n};\n\nfunction assert(condition: unknown, message: string): asserts condition {\n if (!condition) throw new Error(message);\n}\n\nfunction assertEqual(actual: unknown, expected: unknown, message: string): void {\n if (JSON.stringify(actual) !== JSON.stringify(expected)) {\n throw new Error(\n `${message} Expected ${JSON.stringify(expected)}, received ${JSON.stringify(actual)}.`\n );\n }\n}\n\nasync function readObject(\n collection: Collection<Record<string, unknown>>,\n id: string\n): Promise<Record<string, unknown> | undefined> {\n const rows = await queryOnce((query) =>\n query\n .from({ object: collection })\n .where(({ object }) => eq(object.id, id))\n .select(({ object }) => object)\n );\n return rows[0];\n}\n\nconst mutators = {\n renameNote: async ({ tx, args }) => {\n await tx.mutate.Note!.update(args.note as string, {\n title: args.title,\n });\n },\n} satisfies OntologyMutatorRegistry;\n\nconst queryFunctions = {\n noteTitle: async ({ tx, args }) => {\n const note = await tx.query<{ title: unknown } | undefined>((query, objects) =>\n query\n .from({ note: objects.Note! })\n .where(({ note }) => eq(note.id, args.note))\n .select(({ note }) => ({ title: note.title }))\n .findOne()\n );\n return note?.title;\n },\n currentUser: ({ context }) => context.user,\n} satisfies OntologyQueryFunctionRegistry;\n\nasync function runSchemaCreation(database: SQLiteDatabase): Promise<void> {\n const open = (name: string) =>\n Effect.runPromise(\n Effect.scoped(makeSQLiteTestBackend({ ir: conformanceIR, database, name, context: {} }))\n );\n await open(\"sqlite\");\n await open(\"sqlite\");\n assert(\n database\n .prepare(\"SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?\")\n .get(\"party_tables_rows\"),\n \"Native Tables rows were not created.\"\n );\n}\n\nasync function runActionsAndContext(database: SQLiteDatabase): Promise<void> {\n const ontology = await createLiveOntology({\n ir: conformanceIR,\n backend: makeSQLiteTestBackend({\n ir: conformanceIR,\n database,\n name: \"sqlite\",\n context: { user: \"alice\" },\n }),\n context: { user: \"alice\" },\n });\n try {\n await ontology.actions.createNote!({\n id: \"note-1\",\n title: \"Hello\",\n });\n const note = await readObject(ontology.objects.Note!, \"note-1\");\n assertEqual(\n note && {\n id: note.id,\n title: note.title,\n owner: note.owner,\n },\n { id: \"note-1\", title: \"Hello\", owner: \"alice\" },\n \"Declarative action or context.user failed.\"\n );\n } finally {\n await ontology.cleanup();\n }\n}\n\nasync function runHandlers(database: SQLiteDatabase): Promise<void> {\n const ontology = await createLiveOntology({\n ir: conformanceIR,\n backend: makeSQLiteTestBackend({\n ir: conformanceIR,\n database,\n name: \"sqlite\",\n mutators,\n queryFunctions,\n context: { user: \"alice\" },\n }),\n context: { user: \"alice\" },\n });\n try {\n await ontology.actions.createNote!({\n id: \"note-1\",\n title: \"Before\",\n });\n await ontology.actions.renameNote!({\n note: \"note-1\",\n title: \"After\",\n });\n assertEqual(\n await ontology.queryFunctions.noteTitle!({ note: \"note-1\" }),\n \"After\",\n \"Registered mutator or query function failed.\"\n );\n assertEqual(\n await ontology.queryFunctions.currentUser!({}),\n \"alice\",\n \"Query function did not receive context.user.\"\n );\n } finally {\n await ontology.cleanup();\n }\n}\n\nasync function runInlineAttachments(database: SQLiteDatabase): Promise<void> {\n const ontology = await createLiveOntology({\n ir: conformanceIR,\n backend: makeSQLiteTestBackend({\n ir: conformanceIR,\n database,\n name: \"sqlite\",\n }),\n });\n try {\n const created = await ontology.attachments.create(new Blob([\"inline\"], { type: \"text/plain\" }), {\n target: {\n kind: \"objectProperty\",\n objectType: \"Asset\",\n property: \"attachment\",\n },\n });\n await ontology.actions.createAsset!({\n id: \"asset-1\",\n attachment: created.attachment,\n });\n assertEqual(\n await (await ontology.attachments.blob(created.attachment)).text(),\n \"inline\",\n \"Inline attachment bytes were not persisted.\"\n );\n } finally {\n await ontology.cleanup();\n }\n}\n\nfunction runTransactionRollback(database: SQLiteDatabase): void {\n database.exec(`CREATE TABLE rollback_test (id TEXT PRIMARY KEY)`);\n try {\n database.transaction(() => {\n database.prepare(`INSERT INTO rollback_test (id) VALUES (?)`).run(\"rolled-back\");\n throw new Error(\"intentional rollback\");\n })();\n } catch {\n // Expected.\n }\n assertEqual(\n database.prepare(`SELECT id FROM rollback_test`).all(),\n [],\n \"Synchronous transaction did not roll back.\"\n );\n}\n\nclass MemoryAttachmentBytesStore implements SQLiteAttachmentBytesStore {\n readonly blobs = new Map<string, Blob>();\n\n async write(id: string, input: ByteInput): Promise<void> {\n this.blobs.set(id, await Effect.runPromise(collectByteBlob(input)));\n }\n\n read(id: string): Promise<Blob> {\n const blob = this.blobs.get(id);\n return blob ? Promise.resolve(blob) : Promise.reject(new Error(`Missing external bytes \"${id}\".`));\n }\n\n delete(id: string): Promise<void> {\n this.blobs.delete(id);\n return Promise.resolve();\n }\n}\n\nclass DelayedAttachmentBytesStore extends MemoryAttachmentBytesStore {\n private releaseWrite!: () => void;\n private readonly writeGate: Promise<void>;\n private readonly markStarted: () => void;\n readonly writeStarted: Promise<void>;\n deleteCalls = 0;\n\n constructor() {\n super();\n let started!: () => void;\n this.writeStarted = new Promise<void>((resolve) => {\n started = resolve;\n });\n this.writeGate = new Promise<void>((resolve) => {\n this.releaseWrite = resolve;\n });\n this.markStarted = started;\n }\n\n override async write(id: string, blob: ByteInput): Promise<void> {\n this.markStarted();\n await this.writeGate;\n await super.write(id, blob);\n }\n\n override delete(id: string): Promise<void> {\n this.deleteCalls++;\n return super.delete(id);\n }\n\n release(): void {\n this.releaseWrite();\n }\n}\n\nasync function runExternalAttachments(database: SQLiteDatabase): Promise<void> {\n const bytes = new MemoryAttachmentBytesStore();\n const storage = {\n external: { bytes },\n } satisfies SQLiteAttachmentStorageOptions;\n const ontology = await createLiveOntology({\n ir: conformanceIR,\n backend: makeSQLiteTestBackend({\n ir: conformanceIR,\n database,\n name: \"sqlite\",\n attachmentStorage: storage,\n }),\n });\n try {\n const created = await ontology.attachments.create(new Blob([\"external\"], { type: \"text/plain\" }), {\n target: {\n kind: \"objectProperty\",\n objectType: \"Asset\",\n property: \"attachment\",\n },\n });\n await ontology.actions.createAsset!({\n id: \"external-asset\",\n attachment: created.attachment,\n });\n assertEqual(\n await (await ontology.attachments.blob(created.attachment)).text(),\n \"external\",\n \"External authoritative bytes were not readable.\"\n );\n } finally {\n await ontology.cleanup();\n }\n\n const delayedBytes = new DelayedAttachmentBytesStore();\n const delayed = await createLiveOntology({\n ir: conformanceIR,\n backend: makeSQLiteTestBackend({\n ir: conformanceIR,\n database,\n name: \"sqlite\",\n attachmentStorage: {\n external: { bytes: delayedBytes },\n },\n }),\n });\n try {\n const created = await delayed.attachments.create(new Blob([\"delayed\"], { type: \"text/plain\" }), {\n target: {\n kind: \"objectProperty\",\n objectType: \"Asset\",\n property: \"attachment\",\n },\n });\n const action = delayed.actions.createAsset!({\n id: \"delayed-asset\",\n attachment: created.attachment,\n });\n void action.catch(() => undefined);\n await delayedBytes.writeStarted;\n assertEqual(\n await Effect.runPromise(\n Effect.scoped(\n Effect.gen(function* () {\n const backend = yield* makeSQLiteTestBackend({\n ir: conformanceIR,\n database,\n name: \"sqlite\",\n attachmentStorage: { external: { bytes: delayedBytes } },\n });\n return yield* backend.collectGarbage({ orphanGraceMs: 0 });\n })\n )\n ),\n 0,\n \"Collector claimed an active upload.\"\n );\n delayedBytes.release();\n await action;\n assertEqual(delayedBytes.deleteCalls, 0, \"Collector deleted an active upload.\");\n } finally {\n delayedBytes.release();\n await delayed.cleanup();\n }\n}\n\nexport const sqliteOntologyConformanceCases = [\n { id: \"schema\", name: \"creates schemas idempotently\", run: runSchemaCreation },\n {\n id: \"actions-context\",\n name: \"persists declarative actions with context.user\",\n run: runActionsAndContext,\n },\n {\n id: \"handlers\",\n name: \"runs registered mutators and query functions\",\n run: runHandlers,\n },\n {\n id: \"inline-attachments\",\n name: \"persists inline SQLite attachment bytes\",\n run: runInlineAttachments,\n },\n {\n id: \"transaction-rollback\",\n name: \"rolls back synchronous transactions\",\n run: runTransactionRollback,\n },\n {\n id: \"external-attachments\",\n name: \"uses injectable external attachment bytes safely\",\n run: runExternalAttachments,\n },\n] as const;\n\nexport type SQLiteOntologyConformanceCaseId = (typeof sqliteOntologyConformanceCases)[number][\"id\"];\n\nexport async function runSQLiteOntologyConformanceCase(\n id: SQLiteOntologyConformanceCaseId,\n database: SQLiteDatabase\n): Promise<void> {\n const test = sqliteOntologyConformanceCases.find((candidate) => candidate.id === id);\n assert(test, `Unknown SQLite ontology conformance case \"${id}\".`);\n await test.run(database);\n}\n\nexport { conformanceIR as sqliteOntologyConformanceIR };\n"],"mappings":";;;;;;AAiBA,MAAM,gBAA4B;CAC9B,OAAO,CAAC;CACR,aAAa,CACT;EACI,MAAM;EACN,aAAa;EACb,mBAAmB;EACnB,YAAY;EACZ,YAAY;GACR;IAAE,MAAM;IAAM,aAAa;IAAM,MAAM,EAAE,OAAO,CAAC,CAAC;GAAE;GACpD;IACI,MAAM;IACN,aAAa;IACb,MAAM,EAAE,OAAO,CAAC,CAAC;GACrB;GACA;IACI,MAAM;IACN,aAAa;IACb,MAAM,EAAE,OAAO,CAAC,CAAC;GACrB;EACJ;CACJ,GACA;EACI,MAAM;EACN,aAAa;EACb,mBAAmB;EACnB,YAAY;EACZ,YAAY,CACR;GAAE,MAAM;GAAM,aAAa;GAAM,MAAM,EAAE,OAAO,CAAC,CAAC;EAAE,GACpD;GACI,MAAM;GACN,aAAa;GACb,MAAM,EAAE,WAAW,CAAC,CAAC;EACzB,CACJ;CACJ,CACJ;CACA,WAAW,CAAC;CACZ,aAAa;EACT;GACI,MAAM;GACN,aAAa;GACb,YAAY;IACR;KAAE,MAAM;KAAM,aAAa;KAAM,MAAM,EAAE,OAAO,CAAC,CAAC;IAAE;IACpD;KACI,MAAM;KACN,aAAa;KACb,MAAM,EAAE,OAAO,CAAC,CAAC;IACrB;IACA;KACI,MAAM;KACN,aAAa;KACb,MAAM,EAAE,OAAO,CAAC,CAAC;KACjB,cAAc,EAAE,WAAW,iBAAiB,EACxC,MAAM,OACV,CAAC;IACL;GACJ;GACA,OAAO,CACH,EAAE,gBAAgB,aAAa;IAC3B,YAAY;IACZ,QAAQ;KACJ;MACI,UAAU,CAAC,IAAI;MACf,OAAO,EAAE,WAAW,eAAe,EAC/B,MAAM,KACV,CAAC;KACL;KACA;MACI,UAAU,CAAC,OAAO;MAClB,OAAO,EAAE,WAAW,eAAe,EAC/B,MAAM,QACV,CAAC;KACL;KACA;MACI,UAAU,CAAC,OAAO;MAClB,OAAO,EAAE,WAAW,eAAe,EAC/B,MAAM,QACV,CAAC;KACL;IACJ;GACJ,CAAC,CACL;EACJ;EACA;GACI,MAAM;GACN,aAAa;GACb,YAAY,CACR;IACI,MAAM;IACN,aAAa;IACb,MAAM,EAAE,gBAAgB,EAAE,YAAY,OAAO,CAAC;GAClD,GACA;IACI,MAAM;IACN,aAAa;IACb,MAAM,EAAE,OAAO,CAAC,CAAC;GACrB,CACJ;GACA,OAAO,CAAC;EACZ;EACA;GACI,MAAM;GACN,aAAa;GACb,YAAY,CACR;IAAE,MAAM;IAAM,aAAa;IAAM,MAAM,EAAE,OAAO,CAAC,CAAC;GAAE,GACpD;IACI,MAAM;IACN,aAAa;IACb,MAAM,EAAE,WAAW,CAAC,CAAC;GACzB,CACJ;GACA,OAAO,CACH,EAAE,gBAAgB,aAAa;IAC3B,YAAY;IACZ,QAAQ,CACJ;KACI,UAAU,CAAC,IAAI;KACf,OAAO,EAAE,WAAW,eAAe,EAC/B,MAAM,KACV,CAAC;IACL,GACA;KACI,UAAU,CAAC,YAAY;KACvB,OAAO,EAAE,WAAW,eAAe,EAC/B,MAAM,aACV,CAAC;IACL,CACJ;GACJ,CAAC,CACL;EACJ;CACJ;CACA,oBAAoB,CAChB;EACI,MAAM;EACN,aAAa;EACb,YAAY,CACR;GACI,MAAM;GACN,aAAa;GACb,MAAM,EAAE,gBAAgB,EAAE,YAAY,OAAO,CAAC;EAClD,CACJ;EACA,YAAY,EAAE,OAAO,CAAC,CAAC;CAC3B,GACA;EACI,MAAM;EACN,aAAa;EACb,YAAY,CAAC;EACb,YAAY,EAAE,OAAO,CAAC,CAAC;CAC3B,CACJ;AACJ;AAEA,SAAS,OAAO,WAAoB,SAAoC;CACpE,IAAI,CAAC,WAAW,MAAM,IAAI,MAAM,OAAO;AAC3C;AAEA,SAAS,YAAY,QAAiB,UAAmB,SAAuB;CAC5E,IAAI,KAAK,UAAU,MAAM,MAAM,KAAK,UAAU,QAAQ,GAClD,MAAM,IAAI,MACN,GAAG,QAAQ,YAAY,KAAK,UAAU,QAAQ,EAAE,aAAa,KAAK,UAAU,MAAM,EAAE,EACxF;AAER;AAEA,eAAe,WACX,YACA,IAC4C;CAO5C,QAAO,MANY,WAAW,UAC1B,MACK,KAAK,EAAE,QAAQ,WAAW,CAAC,CAAC,CAC5B,OAAO,EAAE,aAAa,GAAG,OAAO,IAAI,EAAE,CAAC,CAAC,CACxC,QAAQ,EAAE,aAAa,MAAM,CACtC,EAAA,CACY;AAChB;AAEA,MAAM,WAAW,EACb,YAAY,OAAO,EAAE,IAAI,WAAW;CAChC,MAAM,GAAG,OAAO,KAAM,OAAO,KAAK,MAAgB,EAC9C,OAAO,KAAK,MAChB,CAAC;AACL,EACJ;AAEA,MAAM,iBAAiB;CACnB,WAAW,OAAO,EAAE,IAAI,WAAW;EAQ/B,QAAO,MAPY,GAAG,OAAuC,OAAO,YAChE,MACK,KAAK,EAAE,MAAM,QAAQ,KAAM,CAAC,CAAC,CAC7B,OAAO,EAAE,WAAW,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,CAC3C,QAAQ,EAAE,YAAY,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC,CAC7C,QAAQ,CACjB,EAAA,EACa;CACjB;CACA,cAAc,EAAE,cAAc,QAAQ;AAC1C;AAEA,eAAe,kBAAkB,UAAyC;CACtE,MAAM,QAAQ,SACV,OAAO,WACH,OAAO,OAAO,sBAAsB;EAAE,IAAI;EAAe;EAAU;EAAM,SAAS,CAAC;CAAE,CAAC,CAAC,CAC3F;CACJ,MAAM,KAAK,QAAQ;CACnB,MAAM,KAAK,QAAQ;CACnB,OACI,SACK,QAAQ,kEAAkE,CAAC,CAC3E,IAAI,mBAAmB,GAC5B,sCACJ;AACJ;AAEA,eAAe,qBAAqB,UAAyC;CACzE,MAAM,WAAW,MAAM,mBAAmB;EACtC,IAAI;EACJ,SAAS,sBAAsB;GAC3B,IAAI;GACJ;GACA,MAAM;GACN,SAAS,EAAE,MAAM,QAAQ;EAC7B,CAAC;EACD,SAAS,EAAE,MAAM,QAAQ;CAC7B,CAAC;CACD,IAAI;EACA,MAAM,SAAS,QAAQ,WAAY;GAC/B,IAAI;GACJ,OAAO;EACX,CAAC;EACD,MAAM,OAAO,MAAM,WAAW,SAAS,QAAQ,MAAO,QAAQ;EAC9D,YACI,QAAQ;GACJ,IAAI,KAAK;GACT,OAAO,KAAK;GACZ,OAAO,KAAK;EAChB,GACA;GAAE,IAAI;GAAU,OAAO;GAAS,OAAO;EAAQ,GAC/C,4CACJ;CACJ,UAAU;EACN,MAAM,SAAS,QAAQ;CAC3B;AACJ;AAEA,eAAe,YAAY,UAAyC;CAChE,MAAM,WAAW,MAAM,mBAAmB;EACtC,IAAI;EACJ,SAAS,sBAAsB;GAC3B,IAAI;GACJ;GACA,MAAM;GACN;GACA;GACA,SAAS,EAAE,MAAM,QAAQ;EAC7B,CAAC;EACD,SAAS,EAAE,MAAM,QAAQ;CAC7B,CAAC;CACD,IAAI;EACA,MAAM,SAAS,QAAQ,WAAY;GAC/B,IAAI;GACJ,OAAO;EACX,CAAC;EACD,MAAM,SAAS,QAAQ,WAAY;GAC/B,MAAM;GACN,OAAO;EACX,CAAC;EACD,YACI,MAAM,SAAS,eAAe,UAAW,EAAE,MAAM,SAAS,CAAC,GAC3D,SACA,8CACJ;EACA,YACI,MAAM,SAAS,eAAe,YAAa,CAAC,CAAC,GAC7C,SACA,8CACJ;CACJ,UAAU;EACN,MAAM,SAAS,QAAQ;CAC3B;AACJ;AAEA,eAAe,qBAAqB,UAAyC;CACzE,MAAM,WAAW,MAAM,mBAAmB;EACtC,IAAI;EACJ,SAAS,sBAAsB;GAC3B,IAAI;GACJ;GACA,MAAM;EACV,CAAC;CACL,CAAC;CACD,IAAI;EACA,MAAM,UAAU,MAAM,SAAS,YAAY,OAAO,IAAI,KAAK,CAAC,QAAQ,GAAG,EAAE,MAAM,aAAa,CAAC,GAAG,EAC5F,QAAQ;GACJ,MAAM;GACN,YAAY;GACZ,UAAU;EACd,EACJ,CAAC;EACD,MAAM,SAAS,QAAQ,YAAa;GAChC,IAAI;GACJ,YAAY,QAAQ;EACxB,CAAC;EACD,YACI,OAAO,MAAM,SAAS,YAAY,KAAK,QAAQ,UAAU,EAAA,CAAG,KAAK,GACjE,UACA,6CACJ;CACJ,UAAU;EACN,MAAM,SAAS,QAAQ;CAC3B;AACJ;AAEA,SAAS,uBAAuB,UAAgC;CAC5D,SAAS,KAAK,kDAAkD;CAChE,IAAI;EACA,SAAS,kBAAkB;GACvB,SAAS,QAAQ,2CAA2C,CAAC,CAAC,IAAI,aAAa;GAC/E,MAAM,IAAI,MAAM,sBAAsB;EAC1C,CAAC,CAAC,CAAC;CACP,QAAQ,CAER;CACA,YACI,SAAS,QAAQ,8BAA8B,CAAC,CAAC,IAAI,GACrD,CAAC,GACD,4CACJ;AACJ;AAEA,IAAM,6BAAN,MAAuE;CACnE,wBAAiB,IAAI,IAAkB;CAEvC,MAAM,MAAM,IAAY,OAAiC;EACrD,KAAK,MAAM,IAAI,IAAI,MAAM,OAAO,WAAW,gBAAgB,KAAK,CAAC,CAAC;CACtE;CAEA,KAAK,IAA2B;EAC5B,MAAM,OAAO,KAAK,MAAM,IAAI,EAAE;EAC9B,OAAO,OAAO,QAAQ,QAAQ,IAAI,IAAI,QAAQ,uBAAO,IAAI,MAAM,2BAA2B,GAAG,GAAG,CAAC;CACrG;CAEA,OAAO,IAA2B;EAC9B,KAAK,MAAM,OAAO,EAAE;EACpB,OAAO,QAAQ,QAAQ;CAC3B;AACJ;AAEA,IAAM,8BAAN,cAA0C,2BAA2B;CACjE;CACA;CACA;CACA;CACA,cAAc;CAEd,cAAc;EACV,MAAM;EACN,IAAI;EACJ,KAAK,eAAe,IAAI,SAAe,YAAY;GAC/C,UAAU;EACd,CAAC;EACD,KAAK,YAAY,IAAI,SAAe,YAAY;GAC5C,KAAK,eAAe;EACxB,CAAC;EACD,KAAK,cAAc;CACvB;CAEA,MAAe,MAAM,IAAY,MAAgC;EAC7D,KAAK,YAAY;EACjB,MAAM,KAAK;EACX,MAAM,MAAM,MAAM,IAAI,IAAI;CAC9B;CAEA,OAAgB,IAA2B;EACvC,KAAK;EACL,OAAO,MAAM,OAAO,EAAE;CAC1B;CAEA,UAAgB;EACZ,KAAK,aAAa;CACtB;AACJ;AAEA,eAAe,uBAAuB,UAAyC;CAE3E,MAAM,UAAU,EACZ,UAAU,EAAE,OAAA,IAFE,2BAEE,EAAE,EACtB;CACA,MAAM,WAAW,MAAM,mBAAmB;EACtC,IAAI;EACJ,SAAS,sBAAsB;GAC3B,IAAI;GACJ;GACA,MAAM;GACN,mBAAmB;EACvB,CAAC;CACL,CAAC;CACD,IAAI;EACA,MAAM,UAAU,MAAM,SAAS,YAAY,OAAO,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,MAAM,aAAa,CAAC,GAAG,EAC9F,QAAQ;GACJ,MAAM;GACN,YAAY;GACZ,UAAU;EACd,EACJ,CAAC;EACD,MAAM,SAAS,QAAQ,YAAa;GAChC,IAAI;GACJ,YAAY,QAAQ;EACxB,CAAC;EACD,YACI,OAAO,MAAM,SAAS,YAAY,KAAK,QAAQ,UAAU,EAAA,CAAG,KAAK,GACjE,YACA,iDACJ;CACJ,UAAU;EACN,MAAM,SAAS,QAAQ;CAC3B;CAEA,MAAM,eAAe,IAAI,4BAA4B;CACrD,MAAM,UAAU,MAAM,mBAAmB;EACrC,IAAI;EACJ,SAAS,sBAAsB;GAC3B,IAAI;GACJ;GACA,MAAM;GACN,mBAAmB,EACf,UAAU,EAAE,OAAO,aAAa,EACpC;EACJ,CAAC;CACL,CAAC;CACD,IAAI;EACA,MAAM,UAAU,MAAM,QAAQ,YAAY,OAAO,IAAI,KAAK,CAAC,SAAS,GAAG,EAAE,MAAM,aAAa,CAAC,GAAG,EAC5F,QAAQ;GACJ,MAAM;GACN,YAAY;GACZ,UAAU;EACd,EACJ,CAAC;EACD,MAAM,SAAS,QAAQ,QAAQ,YAAa;GACxC,IAAI;GACJ,YAAY,QAAQ;EACxB,CAAC;EACD,OAAY,YAAY,KAAA,CAAS;EACjC,MAAM,aAAa;EACnB,YACI,MAAM,OAAO,WACT,OAAO,OACH,OAAO,IAAI,aAAa;GAOpB,OAAO,QAAO,OANS,sBAAsB;IACzC,IAAI;IACJ;IACA,MAAM;IACN,mBAAmB,EAAE,UAAU,EAAE,OAAO,aAAa,EAAE;GAC3D,CAAC,EAAA,CACqB,eAAe,EAAE,eAAe,EAAE,CAAC;EAC7D,CAAC,CACL,CACJ,GACA,GACA,qCACJ;EACA,aAAa,QAAQ;EACrB,MAAM;EACN,YAAY,aAAa,aAAa,GAAG,qCAAqC;CAClF,UAAU;EACN,aAAa,QAAQ;EACrB,MAAM,QAAQ,QAAQ;CAC1B;AACJ;AAEA,MAAa,iCAAiC;CAC1C;EAAE,IAAI;EAAU,MAAM;EAAgC,KAAK;CAAkB;CAC7E;EACI,IAAI;EACJ,MAAM;EACN,KAAK;CACT;CACA;EACI,IAAI;EACJ,MAAM;EACN,KAAK;CACT;CACA;EACI,IAAI;EACJ,MAAM;EACN,KAAK;CACT;CACA;EACI,IAAI;EACJ,MAAM;EACN,KAAK;CACT;CACA;EACI,IAAI;EACJ,MAAM;EACN,KAAK;CACT;AACJ;AAIA,eAAsB,iCAClB,IACA,UACa;CACb,MAAM,OAAO,+BAA+B,MAAM,cAAc,UAAU,OAAO,EAAE;CACnF,OAAO,MAAM,6CAA6C,GAAG,GAAG;CAChE,MAAM,KAAK,IAAI,QAAQ;AAC3B"}
@@ -0,0 +1,68 @@
1
+ import { StorageOntologyBackendOptions } from "../live/storageBackend.js";
2
+ import { BackendError } from "@party-stack/ontology-backend";
3
+ import { Effect } from "effect";
4
+ import { ByteInput } from "@party-stack/ontology-storage/blobs";
5
+ import * as SQLite from "@party-stack/sql-ontology-storage/sqlite";
6
+ //#region src/testing/sqliteBackend.d.ts
7
+ export interface SQLiteDatabase extends SQLite.SQLiteDatabase {
8
+ prepare(sql: string): SQLite.SQLiteStatement & {
9
+ get(...parameters: unknown[]): unknown;
10
+ };
11
+ transaction(body: () => void): () => void;
12
+ }
13
+ export interface SQLiteAttachmentBytesStore {
14
+ write(id: string, blob: ByteInput, signal?: AbortSignal): Promise<void>;
15
+ read(id: string): Promise<ByteInput | undefined>;
16
+ delete(id: string): Promise<void>;
17
+ }
18
+ export interface SQLiteAttachmentStorageOptions {
19
+ external?: {
20
+ bytes: SQLiteAttachmentBytesStore;
21
+ };
22
+ }
23
+ type Options = Omit<StorageOntologyBackendOptions, "namespace" | "tables" | "blobs"> & {
24
+ database: SQLiteDatabase;
25
+ name?: string;
26
+ attachmentStorage?: SQLiteAttachmentStorageOptions;
27
+ };
28
+ export declare const makeSQLiteTestBackend: (options: Options) => Effect.Effect<{
29
+ name: string;
30
+ sourceId: string;
31
+ supportsIdempotency: boolean;
32
+ loadSubset: (subset: import("@party-stack/ontology-spec/query").ObjectSubset) => Effect.Effect<import("@party-stack/ontology-backend").BackendSnapshot, BackendError>;
33
+ subscribeSelection?: (selection: import("@party-stack/ontology-backend").ObjectSelection, policy?: import("@party-stack/ontology-backend/delivery").DeliveryPolicy, resume?: import("@party-stack/ontology-backend/delivery").DeliveryPosition) => Effect.Effect<import("@party-stack/ontology-backend/delivery").DeliverySubscription, BackendError, import("effect/Scope").Scope>;
34
+ acknowledgeDelivery?: (position: import("@party-stack/ontology-backend/delivery").DeliveryPosition) => Effect.Effect<void, BackendError>;
35
+ watchSubset?: (subset: import("@party-stack/ontology-spec/query").ObjectSubset) => Effect.Effect<import("effect/Stream").Stream<import("@party-stack/ontology-backend").SubsetWatchEvent, BackendError>, BackendError, import("effect/Scope").Scope> | undefined;
36
+ refresh?: (subset: import("@party-stack/ontology-spec/query").ObjectSubset) => {
37
+ readonly pollIntervalMs?: number | false;
38
+ readonly maxCoverageAgeMs?: number;
39
+ } | undefined;
40
+ validateAction?: (name: string, parameters: Record<string, unknown>, options?: {
41
+ readonly knownParameters?: readonly string[];
42
+ }) => Effect.Effect<import("@party-stack/ontology-backend").ValidationReport, BackendError>;
43
+ queryFunction: (name: string, parameters: Record<string, unknown>) => Effect.Effect<unknown, BackendError>;
44
+ changes?: {
45
+ readonly pull: (options: {
46
+ readonly cursor?: string;
47
+ readonly limit?: number;
48
+ }) => Effect.Effect<import("@party-stack/ontology-backend").BackendChangePage, BackendError>;
49
+ readonly watch?: Effect.Effect<import("effect/Stream").Stream<void, BackendError>, BackendError, import("effect/Scope").Scope>;
50
+ };
51
+ attachments?: import("@party-stack/ontology-backend").BackendAttachments;
52
+ encrypted?: import("@party-stack/ontology-backend").BackendEncryptedValues;
53
+ storage: import("@party-stack/ontology-backend/owned").OwnedStorageService;
54
+ maintenance: Effect.Effect<void, BackendError<"Conflict" | "Forbidden" | "HistoryExpired" | "Internal" | "InvalidConfiguration" | "InvalidRequest" | "InvalidResponse" | "NotFound" | "NotImplemented" | "RateLimited" | "ResultExpired" | "SchemaMismatch" | "SessionExpired" | "SessionReplaced" | "SourceMismatch" | "Unauthenticated" | "Unavailable" | "ValidationFailed" | "ViewReplaced">, never>;
55
+ query: (document: import("@party-stack/ontology-spec").QueryDocument, options?: {
56
+ readonly inputs?: Record<string, unknown>;
57
+ }) => Effect.Effect<Record<string, unknown>, BackendError>;
58
+ applyAction: (invocation: import("@party-stack/ontology-backend").ActionRequest) => Effect.Effect<import("@party-stack/ontology-backend").ActionReceipt, BackendError<"Conflict" | "Forbidden" | "HistoryExpired" | "Internal" | "InvalidConfiguration" | "InvalidRequest" | "InvalidResponse" | "NotFound" | "NotImplemented" | "RateLimited" | "ResultExpired" | "SchemaMismatch" | "SessionExpired" | "SessionReplaced" | "SourceMismatch" | "Unauthenticated" | "Unavailable" | "ValidationFailed" | "ViewReplaced">, never>;
59
+ blobs: import("@party-stack/ontology-storage/blobs").BlobStorageService;
60
+ resolveActionParameters: (name: string, parameters: Record<string, unknown>) => Effect.Effect<Record<string, unknown>, BackendError<any>, never>;
61
+ collectGarbage: (options?: {
62
+ readonly orphanGraceMs?: number;
63
+ readonly limit?: number;
64
+ }) => Effect.Effect<number, BackendError<"Conflict" | "Forbidden" | "HistoryExpired" | "Internal" | "InvalidConfiguration" | "InvalidRequest" | "InvalidResponse" | "NotFound" | "NotImplemented" | "RateLimited" | "ResultExpired" | "SchemaMismatch" | "SessionExpired" | "SessionReplaced" | "SourceMismatch" | "Unauthenticated" | "Unavailable" | "ValidationFailed" | "ViewReplaced">, never>;
65
+ }, BackendError<"Conflict" | "Forbidden" | "HistoryExpired" | "Internal" | "InvalidConfiguration" | "InvalidRequest" | "InvalidResponse" | "NotFound" | "NotImplemented" | "RateLimited" | "ResultExpired" | "SchemaMismatch" | "SessionExpired" | "SessionReplaced" | "SourceMismatch" | "Unauthenticated" | "Unavailable" | "ValidationFailed" | "ViewReplaced">, import("effect/Scope").Scope>;
66
+ //#endregion
67
+ export {};
68
+ //# sourceMappingURL=sqliteBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqliteBackend.d.ts","names":[],"sources":["../../src/testing/sqliteBackend.ts"],"mappings":";;;;;;iBAKiB,uBAAuB,OAAO;EAC3C,QAAQ,cAAc,OAAO;IAAoB,OAAO;;EACxD,YAAY;;iBAEC;EACb,MAAM,YAAY,MAAM,WAAW,SAAS,cAAc;EAC1D,KAAK,aAAa,QAAQ;EAC1B,OAAO,aAAa;;iBAEP;EACb;IAAa,OAAO;;;KAEnB,UAAU,KAAK;EAChB,UAAU;EACV;EACA,oBAAoB;;qBAEX,wBAAqB,SAAA,YAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BjC,wXAAA"}