@x12i/catalox 1.1.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 (423) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +222 -0
  3. package/dist/adapters/api/api-adapter.d.ts +22 -0
  4. package/dist/adapters/api/api-adapter.d.ts.map +1 -0
  5. package/dist/adapters/api/api-adapter.js +60 -0
  6. package/dist/adapters/api/api-adapter.js.map +1 -0
  7. package/dist/adapters/api/index.d.ts +2 -0
  8. package/dist/adapters/api/index.d.ts.map +1 -0
  9. package/dist/adapters/api/index.js +2 -0
  10. package/dist/adapters/api/index.js.map +1 -0
  11. package/dist/adapters/mongo/index.d.ts +3 -0
  12. package/dist/adapters/mongo/index.d.ts.map +1 -0
  13. package/dist/adapters/mongo/index.js +3 -0
  14. package/dist/adapters/mongo/index.js.map +1 -0
  15. package/dist/adapters/mongo/mongo-adapter.d.ts +21 -0
  16. package/dist/adapters/mongo/mongo-adapter.d.ts.map +1 -0
  17. package/dist/adapters/mongo/mongo-adapter.js +57 -0
  18. package/dist/adapters/mongo/mongo-adapter.js.map +1 -0
  19. package/dist/adapters/mongo/resolve-db.d.ts +4 -0
  20. package/dist/adapters/mongo/resolve-db.d.ts.map +1 -0
  21. package/dist/adapters/mongo/resolve-db.js +10 -0
  22. package/dist/adapters/mongo/resolve-db.js.map +1 -0
  23. package/dist/bindings/index.d.ts +2 -0
  24. package/dist/bindings/index.d.ts.map +1 -0
  25. package/dist/bindings/index.js +3 -0
  26. package/dist/bindings/index.js.map +1 -0
  27. package/dist/catalox/authorization.d.ts +11 -0
  28. package/dist/catalox/authorization.d.ts.map +1 -0
  29. package/dist/catalox/authorization.js +37 -0
  30. package/dist/catalox/authorization.js.map +1 -0
  31. package/dist/catalox/catalox.d.ts +80 -0
  32. package/dist/catalox/catalox.d.ts.map +1 -0
  33. package/dist/catalox/catalox.js +492 -0
  34. package/dist/catalox/catalox.js.map +1 -0
  35. package/dist/catalox/context.d.ts +17 -0
  36. package/dist/catalox/context.d.ts.map +1 -0
  37. package/dist/catalox/context.js +21 -0
  38. package/dist/catalox/context.js.map +1 -0
  39. package/dist/catalox/identity.d.ts +7 -0
  40. package/dist/catalox/identity.d.ts.map +1 -0
  41. package/dist/catalox/identity.js +26 -0
  42. package/dist/catalox/identity.js.map +1 -0
  43. package/dist/catalox/index.d.ts +6 -0
  44. package/dist/catalox/index.d.ts.map +1 -0
  45. package/dist/catalox/index.js +6 -0
  46. package/dist/catalox/index.js.map +1 -0
  47. package/dist/catalox/json-io.d.ts +3 -0
  48. package/dist/catalox/json-io.d.ts.map +1 -0
  49. package/dist/catalox/json-io.js +7 -0
  50. package/dist/catalox/json-io.js.map +1 -0
  51. package/dist/contracts/adapters.d.ts +40 -0
  52. package/dist/contracts/adapters.d.ts.map +1 -0
  53. package/dist/contracts/adapters.js +2 -0
  54. package/dist/contracts/adapters.js.map +1 -0
  55. package/dist/contracts/apps.d.ts +11 -0
  56. package/dist/contracts/apps.d.ts.map +1 -0
  57. package/dist/contracts/apps.js +2 -0
  58. package/dist/contracts/apps.js.map +1 -0
  59. package/dist/contracts/bindings.d.ts +26 -0
  60. package/dist/contracts/bindings.d.ts.map +1 -0
  61. package/dist/contracts/bindings.js +2 -0
  62. package/dist/contracts/bindings.js.map +1 -0
  63. package/dist/contracts/bootstrap.d.ts +7 -0
  64. package/dist/contracts/bootstrap.d.ts.map +1 -0
  65. package/dist/contracts/bootstrap.js +2 -0
  66. package/dist/contracts/bootstrap.js.map +1 -0
  67. package/dist/contracts/catalogs.d.ts +51 -0
  68. package/dist/contracts/catalogs.d.ts.map +1 -0
  69. package/dist/contracts/catalogs.js +2 -0
  70. package/dist/contracts/catalogs.js.map +1 -0
  71. package/dist/contracts/config.d.ts +14 -0
  72. package/dist/contracts/config.d.ts.map +1 -0
  73. package/dist/contracts/config.js +2 -0
  74. package/dist/contracts/config.js.map +1 -0
  75. package/dist/contracts/context.d.ts +11 -0
  76. package/dist/contracts/context.d.ts.map +1 -0
  77. package/dist/contracts/context.js +2 -0
  78. package/dist/contracts/context.js.map +1 -0
  79. package/dist/contracts/descriptors.d.ts +73 -0
  80. package/dist/contracts/descriptors.d.ts.map +1 -0
  81. package/dist/contracts/descriptors.js +2 -0
  82. package/dist/contracts/descriptors.js.map +1 -0
  83. package/dist/contracts/discovery.d.ts +25 -0
  84. package/dist/contracts/discovery.d.ts.map +1 -0
  85. package/dist/contracts/discovery.js +2 -0
  86. package/dist/contracts/discovery.js.map +1 -0
  87. package/dist/contracts/errors.d.ts +32 -0
  88. package/dist/contracts/errors.d.ts.map +1 -0
  89. package/dist/contracts/errors.js +53 -0
  90. package/dist/contracts/errors.js.map +1 -0
  91. package/dist/contracts/ids.d.ts +7 -0
  92. package/dist/contracts/ids.d.ts.map +1 -0
  93. package/dist/contracts/ids.js +2 -0
  94. package/dist/contracts/ids.js.map +1 -0
  95. package/dist/contracts/index.d.ts +21 -0
  96. package/dist/contracts/index.d.ts.map +1 -0
  97. package/dist/contracts/index.js +2 -0
  98. package/dist/contracts/index.js.map +1 -0
  99. package/dist/contracts/inputs.d.ts +19 -0
  100. package/dist/contracts/inputs.d.ts.map +1 -0
  101. package/dist/contracts/inputs.js +2 -0
  102. package/dist/contracts/inputs.js.map +1 -0
  103. package/dist/contracts/item-validation.d.ts +11 -0
  104. package/dist/contracts/item-validation.d.ts.map +1 -0
  105. package/dist/contracts/item-validation.js +2 -0
  106. package/dist/contracts/item-validation.js.map +1 -0
  107. package/dist/contracts/items.d.ts +49 -0
  108. package/dist/contracts/items.d.ts.map +1 -0
  109. package/dist/contracts/items.js +2 -0
  110. package/dist/contracts/items.js.map +1 -0
  111. package/dist/contracts/mappings.d.ts +35 -0
  112. package/dist/contracts/mappings.d.ts.map +1 -0
  113. package/dist/contracts/mappings.js +2 -0
  114. package/dist/contracts/mappings.js.map +1 -0
  115. package/dist/contracts/query.d.ts +10 -0
  116. package/dist/contracts/query.d.ts.map +1 -0
  117. package/dist/contracts/query.js +2 -0
  118. package/dist/contracts/query.js.map +1 -0
  119. package/dist/contracts/references.d.ts +11 -0
  120. package/dist/contracts/references.d.ts.map +1 -0
  121. package/dist/contracts/references.js +2 -0
  122. package/dist/contracts/references.js.map +1 -0
  123. package/dist/contracts/sync.d.ts +7 -0
  124. package/dist/contracts/sync.d.ts.map +1 -0
  125. package/dist/contracts/sync.js +2 -0
  126. package/dist/contracts/sync.js.map +1 -0
  127. package/dist/contracts/validation.d.ts +12 -0
  128. package/dist/contracts/validation.d.ts.map +1 -0
  129. package/dist/contracts/validation.js +2 -0
  130. package/dist/contracts/validation.js.map +1 -0
  131. package/dist/errors/index.d.ts +2 -0
  132. package/dist/errors/index.d.ts.map +1 -0
  133. package/dist/errors/index.js +3 -0
  134. package/dist/errors/index.js.map +1 -0
  135. package/dist/firebase/adapter-store.d.ts +15 -0
  136. package/dist/firebase/adapter-store.d.ts.map +1 -0
  137. package/dist/firebase/adapter-store.js +18 -0
  138. package/dist/firebase/adapter-store.js.map +1 -0
  139. package/dist/firebase/app-store.d.ts +11 -0
  140. package/dist/firebase/app-store.d.ts.map +1 -0
  141. package/dist/firebase/app-store.js +18 -0
  142. package/dist/firebase/app-store.js.map +1 -0
  143. package/dist/firebase/binding-store.d.ts +13 -0
  144. package/dist/firebase/binding-store.d.ts.map +1 -0
  145. package/dist/firebase/binding-store.js +35 -0
  146. package/dist/firebase/binding-store.js.map +1 -0
  147. package/dist/firebase/catalog-store.d.ts +12 -0
  148. package/dist/firebase/catalog-store.d.ts.map +1 -0
  149. package/dist/firebase/catalog-store.js +22 -0
  150. package/dist/firebase/catalog-store.js.map +1 -0
  151. package/dist/firebase/definition-store.d.ts +39 -0
  152. package/dist/firebase/definition-store.d.ts.map +1 -0
  153. package/dist/firebase/definition-store.js +18 -0
  154. package/dist/firebase/definition-store.js.map +1 -0
  155. package/dist/firebase/descriptor-store.d.ts +11 -0
  156. package/dist/firebase/descriptor-store.d.ts.map +1 -0
  157. package/dist/firebase/descriptor-store.js +18 -0
  158. package/dist/firebase/descriptor-store.js.map +1 -0
  159. package/dist/firebase/firestore-store.d.ts +14 -0
  160. package/dist/firebase/firestore-store.d.ts.map +1 -0
  161. package/dist/firebase/firestore-store.js +15 -0
  162. package/dist/firebase/firestore-store.js.map +1 -0
  163. package/dist/firebase/index.d.ts +12 -0
  164. package/dist/firebase/index.d.ts.map +1 -0
  165. package/dist/firebase/index.js +12 -0
  166. package/dist/firebase/index.js.map +1 -0
  167. package/dist/firebase/mapping-store.d.ts +11 -0
  168. package/dist/firebase/mapping-store.d.ts.map +1 -0
  169. package/dist/firebase/mapping-store.js +18 -0
  170. package/dist/firebase/mapping-store.js.map +1 -0
  171. package/dist/firebase/native-item-store.d.ts +20 -0
  172. package/dist/firebase/native-item-store.d.ts.map +1 -0
  173. package/dist/firebase/native-item-store.js +55 -0
  174. package/dist/firebase/native-item-store.js.map +1 -0
  175. package/dist/firebase/reference-store.d.ts +17 -0
  176. package/dist/firebase/reference-store.d.ts.map +1 -0
  177. package/dist/firebase/reference-store.js +27 -0
  178. package/dist/firebase/reference-store.js.map +1 -0
  179. package/dist/firebase/snapshot-store.d.ts +11 -0
  180. package/dist/firebase/snapshot-store.d.ts.map +1 -0
  181. package/dist/firebase/snapshot-store.js +22 -0
  182. package/dist/firebase/snapshot-store.js.map +1 -0
  183. package/dist/index.d.ts +10 -0
  184. package/dist/index.d.ts.map +1 -0
  185. package/dist/index.js +10 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/mapping/execute-mapping.d.ts +8 -0
  188. package/dist/mapping/execute-mapping.d.ts.map +1 -0
  189. package/dist/mapping/execute-mapping.js +78 -0
  190. package/dist/mapping/execute-mapping.js.map +1 -0
  191. package/dist/mapping/helper-gap-report.d.ts +7 -0
  192. package/dist/mapping/helper-gap-report.d.ts.map +1 -0
  193. package/dist/mapping/helper-gap-report.js +2 -0
  194. package/dist/mapping/helper-gap-report.js.map +1 -0
  195. package/dist/mapping/index.d.ts +4 -0
  196. package/dist/mapping/index.d.ts.map +1 -0
  197. package/dist/mapping/index.js +4 -0
  198. package/dist/mapping/index.js.map +1 -0
  199. package/dist/mapping/validate-mapping.d.ts +3 -0
  200. package/dist/mapping/validate-mapping.d.ts.map +1 -0
  201. package/dist/mapping/validate-mapping.js +32 -0
  202. package/dist/mapping/validate-mapping.js.map +1 -0
  203. package/dist/src/adapters/api/api-adapter.d.ts +22 -0
  204. package/dist/src/adapters/api/api-adapter.d.ts.map +1 -0
  205. package/dist/src/adapters/api/api-adapter.js +60 -0
  206. package/dist/src/adapters/api/api-adapter.js.map +1 -0
  207. package/dist/src/adapters/api/index.d.ts +2 -0
  208. package/dist/src/adapters/api/index.d.ts.map +1 -0
  209. package/dist/src/adapters/api/index.js +2 -0
  210. package/dist/src/adapters/api/index.js.map +1 -0
  211. package/dist/src/adapters/mongo/index.d.ts +3 -0
  212. package/dist/src/adapters/mongo/index.d.ts.map +1 -0
  213. package/dist/src/adapters/mongo/index.js +3 -0
  214. package/dist/src/adapters/mongo/index.js.map +1 -0
  215. package/dist/src/adapters/mongo/mongo-adapter.d.ts +21 -0
  216. package/dist/src/adapters/mongo/mongo-adapter.d.ts.map +1 -0
  217. package/dist/src/adapters/mongo/mongo-adapter.js +57 -0
  218. package/dist/src/adapters/mongo/mongo-adapter.js.map +1 -0
  219. package/dist/src/adapters/mongo/resolve-db.d.ts +4 -0
  220. package/dist/src/adapters/mongo/resolve-db.d.ts.map +1 -0
  221. package/dist/src/adapters/mongo/resolve-db.js +10 -0
  222. package/dist/src/adapters/mongo/resolve-db.js.map +1 -0
  223. package/dist/src/bindings/index.d.ts +2 -0
  224. package/dist/src/bindings/index.d.ts.map +1 -0
  225. package/dist/src/bindings/index.js +3 -0
  226. package/dist/src/bindings/index.js.map +1 -0
  227. package/dist/src/catalox/authorization.d.ts +11 -0
  228. package/dist/src/catalox/authorization.d.ts.map +1 -0
  229. package/dist/src/catalox/authorization.js +37 -0
  230. package/dist/src/catalox/authorization.js.map +1 -0
  231. package/dist/src/catalox/catalox.d.ts +81 -0
  232. package/dist/src/catalox/catalox.d.ts.map +1 -0
  233. package/dist/src/catalox/catalox.js +513 -0
  234. package/dist/src/catalox/catalox.js.map +1 -0
  235. package/dist/src/catalox/context.d.ts +17 -0
  236. package/dist/src/catalox/context.d.ts.map +1 -0
  237. package/dist/src/catalox/context.js +21 -0
  238. package/dist/src/catalox/context.js.map +1 -0
  239. package/dist/src/catalox/identity.d.ts +7 -0
  240. package/dist/src/catalox/identity.d.ts.map +1 -0
  241. package/dist/src/catalox/identity.js +26 -0
  242. package/dist/src/catalox/identity.js.map +1 -0
  243. package/dist/src/catalox/index.d.ts +6 -0
  244. package/dist/src/catalox/index.d.ts.map +1 -0
  245. package/dist/src/catalox/index.js +6 -0
  246. package/dist/src/catalox/index.js.map +1 -0
  247. package/dist/src/catalox/json-io.d.ts +3 -0
  248. package/dist/src/catalox/json-io.d.ts.map +1 -0
  249. package/dist/src/catalox/json-io.js +7 -0
  250. package/dist/src/catalox/json-io.js.map +1 -0
  251. package/dist/src/contracts/adapters.d.ts +40 -0
  252. package/dist/src/contracts/adapters.d.ts.map +1 -0
  253. package/dist/src/contracts/adapters.js +2 -0
  254. package/dist/src/contracts/adapters.js.map +1 -0
  255. package/dist/src/contracts/apps.d.ts +11 -0
  256. package/dist/src/contracts/apps.d.ts.map +1 -0
  257. package/dist/src/contracts/apps.js +2 -0
  258. package/dist/src/contracts/apps.js.map +1 -0
  259. package/dist/src/contracts/bindings.d.ts +26 -0
  260. package/dist/src/contracts/bindings.d.ts.map +1 -0
  261. package/dist/src/contracts/bindings.js +2 -0
  262. package/dist/src/contracts/bindings.js.map +1 -0
  263. package/dist/src/contracts/bootstrap.d.ts +7 -0
  264. package/dist/src/contracts/bootstrap.d.ts.map +1 -0
  265. package/dist/src/contracts/bootstrap.js +2 -0
  266. package/dist/src/contracts/bootstrap.js.map +1 -0
  267. package/dist/src/contracts/catalogs.d.ts +51 -0
  268. package/dist/src/contracts/catalogs.d.ts.map +1 -0
  269. package/dist/src/contracts/catalogs.js +2 -0
  270. package/dist/src/contracts/catalogs.js.map +1 -0
  271. package/dist/src/contracts/config.d.ts +14 -0
  272. package/dist/src/contracts/config.d.ts.map +1 -0
  273. package/dist/src/contracts/config.js +2 -0
  274. package/dist/src/contracts/config.js.map +1 -0
  275. package/dist/src/contracts/context.d.ts +11 -0
  276. package/dist/src/contracts/context.d.ts.map +1 -0
  277. package/dist/src/contracts/context.js +2 -0
  278. package/dist/src/contracts/context.js.map +1 -0
  279. package/dist/src/contracts/descriptors.d.ts +73 -0
  280. package/dist/src/contracts/descriptors.d.ts.map +1 -0
  281. package/dist/src/contracts/descriptors.js +2 -0
  282. package/dist/src/contracts/descriptors.js.map +1 -0
  283. package/dist/src/contracts/discovery.d.ts +25 -0
  284. package/dist/src/contracts/discovery.d.ts.map +1 -0
  285. package/dist/src/contracts/discovery.js +2 -0
  286. package/dist/src/contracts/discovery.js.map +1 -0
  287. package/dist/src/contracts/errors.d.ts +32 -0
  288. package/dist/src/contracts/errors.d.ts.map +1 -0
  289. package/dist/src/contracts/errors.js +53 -0
  290. package/dist/src/contracts/errors.js.map +1 -0
  291. package/dist/src/contracts/ids.d.ts +7 -0
  292. package/dist/src/contracts/ids.d.ts.map +1 -0
  293. package/dist/src/contracts/ids.js +2 -0
  294. package/dist/src/contracts/ids.js.map +1 -0
  295. package/dist/src/contracts/index.d.ts +21 -0
  296. package/dist/src/contracts/index.d.ts.map +1 -0
  297. package/dist/src/contracts/index.js +2 -0
  298. package/dist/src/contracts/index.js.map +1 -0
  299. package/dist/src/contracts/inputs.d.ts +19 -0
  300. package/dist/src/contracts/inputs.d.ts.map +1 -0
  301. package/dist/src/contracts/inputs.js +2 -0
  302. package/dist/src/contracts/inputs.js.map +1 -0
  303. package/dist/src/contracts/item-validation.d.ts +11 -0
  304. package/dist/src/contracts/item-validation.d.ts.map +1 -0
  305. package/dist/src/contracts/item-validation.js +2 -0
  306. package/dist/src/contracts/item-validation.js.map +1 -0
  307. package/dist/src/contracts/items.d.ts +49 -0
  308. package/dist/src/contracts/items.d.ts.map +1 -0
  309. package/dist/src/contracts/items.js +2 -0
  310. package/dist/src/contracts/items.js.map +1 -0
  311. package/dist/src/contracts/mappings.d.ts +35 -0
  312. package/dist/src/contracts/mappings.d.ts.map +1 -0
  313. package/dist/src/contracts/mappings.js +2 -0
  314. package/dist/src/contracts/mappings.js.map +1 -0
  315. package/dist/src/contracts/query.d.ts +10 -0
  316. package/dist/src/contracts/query.d.ts.map +1 -0
  317. package/dist/src/contracts/query.js +2 -0
  318. package/dist/src/contracts/query.js.map +1 -0
  319. package/dist/src/contracts/references.d.ts +11 -0
  320. package/dist/src/contracts/references.d.ts.map +1 -0
  321. package/dist/src/contracts/references.js +2 -0
  322. package/dist/src/contracts/references.js.map +1 -0
  323. package/dist/src/contracts/sync.d.ts +7 -0
  324. package/dist/src/contracts/sync.d.ts.map +1 -0
  325. package/dist/src/contracts/sync.js +2 -0
  326. package/dist/src/contracts/sync.js.map +1 -0
  327. package/dist/src/contracts/validation.d.ts +12 -0
  328. package/dist/src/contracts/validation.d.ts.map +1 -0
  329. package/dist/src/contracts/validation.js +2 -0
  330. package/dist/src/contracts/validation.js.map +1 -0
  331. package/dist/src/errors/index.d.ts +2 -0
  332. package/dist/src/errors/index.d.ts.map +1 -0
  333. package/dist/src/errors/index.js +3 -0
  334. package/dist/src/errors/index.js.map +1 -0
  335. package/dist/src/firebase/adapter-store.d.ts +15 -0
  336. package/dist/src/firebase/adapter-store.d.ts.map +1 -0
  337. package/dist/src/firebase/adapter-store.js +18 -0
  338. package/dist/src/firebase/adapter-store.js.map +1 -0
  339. package/dist/src/firebase/app-store.d.ts +11 -0
  340. package/dist/src/firebase/app-store.d.ts.map +1 -0
  341. package/dist/src/firebase/app-store.js +18 -0
  342. package/dist/src/firebase/app-store.js.map +1 -0
  343. package/dist/src/firebase/binding-store.d.ts +13 -0
  344. package/dist/src/firebase/binding-store.d.ts.map +1 -0
  345. package/dist/src/firebase/binding-store.js +35 -0
  346. package/dist/src/firebase/binding-store.js.map +1 -0
  347. package/dist/src/firebase/catalog-store.d.ts +12 -0
  348. package/dist/src/firebase/catalog-store.d.ts.map +1 -0
  349. package/dist/src/firebase/catalog-store.js +22 -0
  350. package/dist/src/firebase/catalog-store.js.map +1 -0
  351. package/dist/src/firebase/definition-store.d.ts +39 -0
  352. package/dist/src/firebase/definition-store.d.ts.map +1 -0
  353. package/dist/src/firebase/definition-store.js +18 -0
  354. package/dist/src/firebase/definition-store.js.map +1 -0
  355. package/dist/src/firebase/descriptor-store.d.ts +11 -0
  356. package/dist/src/firebase/descriptor-store.d.ts.map +1 -0
  357. package/dist/src/firebase/descriptor-store.js +18 -0
  358. package/dist/src/firebase/descriptor-store.js.map +1 -0
  359. package/dist/src/firebase/firestore-store.d.ts +14 -0
  360. package/dist/src/firebase/firestore-store.d.ts.map +1 -0
  361. package/dist/src/firebase/firestore-store.js +15 -0
  362. package/dist/src/firebase/firestore-store.js.map +1 -0
  363. package/dist/src/firebase/index.d.ts +12 -0
  364. package/dist/src/firebase/index.d.ts.map +1 -0
  365. package/dist/src/firebase/index.js +12 -0
  366. package/dist/src/firebase/index.js.map +1 -0
  367. package/dist/src/firebase/mapping-store.d.ts +11 -0
  368. package/dist/src/firebase/mapping-store.d.ts.map +1 -0
  369. package/dist/src/firebase/mapping-store.js +18 -0
  370. package/dist/src/firebase/mapping-store.js.map +1 -0
  371. package/dist/src/firebase/native-item-store.d.ts +20 -0
  372. package/dist/src/firebase/native-item-store.d.ts.map +1 -0
  373. package/dist/src/firebase/native-item-store.js +55 -0
  374. package/dist/src/firebase/native-item-store.js.map +1 -0
  375. package/dist/src/firebase/reference-store.d.ts +17 -0
  376. package/dist/src/firebase/reference-store.d.ts.map +1 -0
  377. package/dist/src/firebase/reference-store.js +27 -0
  378. package/dist/src/firebase/reference-store.js.map +1 -0
  379. package/dist/src/firebase/snapshot-store.d.ts +11 -0
  380. package/dist/src/firebase/snapshot-store.d.ts.map +1 -0
  381. package/dist/src/firebase/snapshot-store.js +22 -0
  382. package/dist/src/firebase/snapshot-store.js.map +1 -0
  383. package/dist/src/index.d.ts +10 -0
  384. package/dist/src/index.d.ts.map +1 -0
  385. package/dist/src/index.js +10 -0
  386. package/dist/src/index.js.map +1 -0
  387. package/dist/src/mapping/execute-mapping.d.ts +8 -0
  388. package/dist/src/mapping/execute-mapping.d.ts.map +1 -0
  389. package/dist/src/mapping/execute-mapping.js +78 -0
  390. package/dist/src/mapping/execute-mapping.js.map +1 -0
  391. package/dist/src/mapping/helper-gap-report.d.ts +7 -0
  392. package/dist/src/mapping/helper-gap-report.d.ts.map +1 -0
  393. package/dist/src/mapping/helper-gap-report.js +2 -0
  394. package/dist/src/mapping/helper-gap-report.js.map +1 -0
  395. package/dist/src/mapping/index.d.ts +4 -0
  396. package/dist/src/mapping/index.d.ts.map +1 -0
  397. package/dist/src/mapping/index.js +4 -0
  398. package/dist/src/mapping/index.js.map +1 -0
  399. package/dist/src/mapping/validate-mapping.d.ts +3 -0
  400. package/dist/src/mapping/validate-mapping.d.ts.map +1 -0
  401. package/dist/src/mapping/validate-mapping.js +32 -0
  402. package/dist/src/mapping/validate-mapping.js.map +1 -0
  403. package/dist/src/validation/index.d.ts +2 -0
  404. package/dist/src/validation/index.d.ts.map +1 -0
  405. package/dist/src/validation/index.js +3 -0
  406. package/dist/src/validation/index.js.map +1 -0
  407. package/dist/test/integration/firestore.emulator.test.d.ts +2 -0
  408. package/dist/test/integration/firestore.emulator.test.d.ts.map +1 -0
  409. package/dist/test/integration/firestore.emulator.test.js +122 -0
  410. package/dist/test/integration/firestore.emulator.test.js.map +1 -0
  411. package/dist/test/unit/identity.test.d.ts +2 -0
  412. package/dist/test/unit/identity.test.d.ts.map +1 -0
  413. package/dist/test/unit/identity.test.js +18 -0
  414. package/dist/test/unit/identity.test.js.map +1 -0
  415. package/dist/test/unit/mapping.test.d.ts +2 -0
  416. package/dist/test/unit/mapping.test.d.ts.map +1 -0
  417. package/dist/test/unit/mapping.test.js +19 -0
  418. package/dist/test/unit/mapping.test.js.map +1 -0
  419. package/dist/validation/index.d.ts +2 -0
  420. package/dist/validation/index.d.ts.map +1 -0
  421. package/dist/validation/index.js +3 -0
  422. package/dist/validation/index.js.map +1 -0
  423. package/package.json +55 -0
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 x12i
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,222 @@
1
+ # `@x12i/catalox`
2
+
3
+ Catalox is a **data-tier** package for managing **app-scoped catalogs** in Firebase **Firestore**, including:
4
+
5
+ - **Catalog discovery** for an `appId` (what catalogs are available + access)
6
+ - **First-class catalog descriptors** (capabilities, query metadata, identity metadata, field metadata)
7
+ - **Native catalogs** (items stored in Firestore)
8
+ - **Mapped catalogs** (items normalized from MongoDB or APIs)
9
+ - **References + validation contracts** (standardized cross-catalog shapes)
10
+ - **Seed/import/export + batch upsert** workflows for native catalogs
11
+
12
+ Catalox **does not** own UI, workflow orchestration, remote execution, artifact blobs, or secret storage.
13
+
14
+ ## Install
15
+
16
+ This repo is currently set up as a workspace package.
17
+
18
+ - **Node**: `>=20`
19
+ - **TypeScript**: builds to `dist/`
20
+
21
+ `@x12i/helpers` is a **required dependency** (installed as `@x12i/helpers@^1.2.0`).
22
+
23
+ ## Configuration (real connections)
24
+
25
+ Catalox is a library: you provide initialized clients + runtime env.
26
+
27
+ ### Firestore (Firebase Admin SDK)
28
+
29
+ This implementation of Catalox expects a **Firebase Admin SDK** Firestore instance (`firebase-admin`).
30
+
31
+ Important clarification:
32
+
33
+ - **“Admin” here means privileged access to your Firebase/GCP project’s Firestore**, using a service account.
34
+ - It is **not** “admin of the host machine / server OS”.
35
+ - Admin SDK access typically **bypasses Firestore Security Rules** (rules are for client SDKs).
36
+
37
+ Scoping:
38
+
39
+ - You can scope the service account to **Firestore-related IAM roles** and to a specific **project**.
40
+ - You generally cannot scope an Admin SDK credential to only certain collections/documents via IAM the way client rules work.
41
+
42
+ To connect to a real Firebase project, initialize `firebase-admin` using `GOOGLE_APPLICATION_CREDENTIALS` (service account JSON) or your preferred Admin initialization strategy.
43
+
44
+ Minimal example:
45
+
46
+ ```ts
47
+ import { initializeApp, applicationDefault } from "firebase-admin/app";
48
+ import { getFirestore } from "firebase-admin/firestore";
49
+
50
+ initializeApp({ credential: applicationDefault() });
51
+ const firestore = getFirestore();
52
+ ```
53
+
54
+ ### Mongo (mapped catalogs)
55
+
56
+ For Mongo-mapped catalogs, provide:
57
+
58
+ - `MONGO_URI` (or whatever you store in adapter config as `mongoUriEnvVar`)
59
+
60
+ Example `.env` (do not commit secrets):
61
+
62
+ ```bash
63
+ MONGO_URI=mongodb://127.0.0.1:27017
64
+ GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
65
+ FIRESTORE_LIVE_TESTS=1
66
+ ```
67
+
68
+ ## Firestore data model (logical collections)
69
+
70
+ Metadata:
71
+
72
+ - `apps/{appId}`
73
+ - `catalogs/{catalogId}`
74
+ - `catalogBindings/{bindingId}` (many-to-many app↔catalog)
75
+ - `catalogDefinitions/{catalogId}` (native vs mapped specifics)
76
+ - `catalogAdapters/{adapterId}` (mongo/api adapter definitions)
77
+ - `catalogMappings/{mappingId}` (field mapping specs)
78
+ - `catalogDescriptors/{catalogId}` (**descriptor metadata** for generic consumption)
79
+ - `catalogReferences/{referenceId}` (standardized reference records)
80
+
81
+ Data:
82
+
83
+ - `catalogData/{catalogId}/items/{itemId}` (native items)
84
+ - `catalogSnapshots/{catalogId}/items/{itemId}` (mapped snapshot mode)
85
+
86
+ ## Core usage (generic from `appId`)
87
+
88
+ ### Create stores and `Catalox`
89
+
90
+ ```ts
91
+ import { FirestoreStore } from "@x12i/catalox";
92
+ import { AppStore, CatalogStore, BindingStore, DefinitionStore, MappingStore, DescriptorStore, ReferenceStore, NativeItemStore, SnapshotStore, AdapterStore } from "@x12i/catalox";
93
+ import { AuthorizationService, Catalox } from "@x12i/catalox";
94
+
95
+ // firebase-admin initialization is up to the consumer
96
+ import { getFirestore } from "firebase-admin/firestore";
97
+
98
+ const firestore = getFirestore();
99
+ const store = new FirestoreStore({ firestore });
100
+
101
+ const deps = {
102
+ apps: new AppStore(store),
103
+ catalogs: new CatalogStore(store),
104
+ bindings: new BindingStore(store),
105
+ definitions: new DefinitionStore(store),
106
+ mappings: new MappingStore(store),
107
+ descriptors: new DescriptorStore(store),
108
+ references: new ReferenceStore(store),
109
+ nativeItems: new NativeItemStore(store),
110
+ snapshots: new SnapshotStore(store),
111
+ adapters: new AdapterStore(store),
112
+ authz: new AuthorizationService(new BindingStore(store)),
113
+ };
114
+
115
+ const catalox = new Catalox(deps);
116
+ ```
117
+
118
+ ### What you need persisted for “generic consumption”
119
+
120
+ To let consumers operate *purely* from `appId` with no hardcoded catalog registrations, Catalox relies on these being present in Firestore:
121
+
122
+ - **Bindings**: `catalogBindings` determine which catalogs an app can see/use.
123
+ - **Descriptors**: `catalogDescriptors/{catalogId}` provide capabilities, query metadata, identity metadata, and field metadata.
124
+
125
+ ### Discover catalogs for an app
126
+
127
+ ```ts
128
+ const context = { appId: "myAppId" };
129
+ const catalogs = await catalox.listAppCatalogs(context, { appId: "myAppId" });
130
+ ```
131
+
132
+ ### Get a catalog descriptor
133
+
134
+ ```ts
135
+ const descriptor = await catalox.getCatalogDescriptor(context, "signals");
136
+ ```
137
+
138
+ ### Bootstrap (all descriptors accessible to an app)
139
+
140
+ ```ts
141
+ const bootstrap = await catalox.getAppCatalogBootstrap(context, "myAppId");
142
+ ```
143
+
144
+ ### Common “generic client” flow (no hardcoded catalog logic)
145
+
146
+ 1) `listAppCatalogs(appId)` → get catalog list + access
147
+ 2) `getAppCatalogBootstrap(appId)` → get descriptors (capabilities/query/identity/fields)
148
+ 3) `listCatalogItems(catalogId, filter/sort)` → fetch normalized items
149
+ 4) `getCatalogItem(catalogId, itemId)` → fetch one item
150
+ 5) Optional: `getCatalogItemReferences(...)`, `validateCatalogItem(...)`
151
+
152
+ ## Native catalogs (seed/import/export + batch upsert)
153
+
154
+ ### Import/Export JSON (helpers)
155
+
156
+ ```ts
157
+ const items = catalox.importCatalogItemsFromJson<Array<Record<string, unknown>>>(jsonString);
158
+ const jsonOut = catalox.exportCatalogItemsToJson(items);
159
+ ```
160
+
161
+ ### Upsert one item (descriptor-driven identity)
162
+
163
+ ```ts
164
+ await catalox.upsertNativeCatalogItem({ appId: "myAppId" }, "signals", {
165
+ categoryId: "core",
166
+ code: "S1",
167
+ title: "Example",
168
+ indexed: { categoryId: "core", code: "S1" }
169
+ });
170
+ ```
171
+
172
+ ### Batch upsert
173
+
174
+ ```ts
175
+ await catalox.batchUpsertNativeCatalogItems({ appId: "myAppId" }, "signals", items);
176
+ ```
177
+
178
+ ### List native items with equality filtering
179
+
180
+ ```ts
181
+ const res = await catalox.listCatalogItems({ appId: "myAppId" }, "signals", {
182
+ filter: { categoryId: "core" }
183
+ });
184
+ ```
185
+
186
+ Filtering is performed on `indexed.<field>` in stored native records (payload remains in `data`).
187
+
188
+ ## References
189
+
190
+ ```ts
191
+ const refs = await catalox.getCatalogItemReferences({ appId: "myAppId" }, "signals", "core:S1");
192
+ ```
193
+
194
+ ## Validation
195
+
196
+ Catalog-level and item-level validation APIs exist with standardized contracts. (Item validation logic can be implemented by upstream domain rules while keeping the contract stable.)
197
+
198
+ ## Tests
199
+
200
+ Unit tests (default):
201
+
202
+ ```bash
203
+ npm test
204
+ ```
205
+
206
+ Integration tests (live Firestore, no mocks/emulators):
207
+
208
+ ```bash
209
+ npm run test:integration
210
+ ```
211
+
212
+ Integration tests are **live-only** (no mocks, no emulators). They require:
213
+
214
+ - `FIRESTORE_LIVE_TESTS=1`
215
+ - `FIREBASE_SERVICE_ACCOUNT_PATH=...`
216
+ - `FIREBASE_PROJECT_ID=...`
217
+
218
+ ## Boundaries (important)
219
+
220
+ - **Secrets**: do not store secret material (API keys, cloud creds) in Catalox. Store only non-secret refs like `credentialsRef`.
221
+ - **Artifacts**: store descriptor metadata and remote keys; artifact blobs live in external object storage.
222
+
@@ -0,0 +1,22 @@
1
+ import type { ApiCatalogAdapterConfig } from "../../contracts/adapters.js";
2
+ import type { CatalogQueryOptions } from "../../contracts/catalogs.js";
3
+ import type { CataloxContext } from "../../contracts/context.js";
4
+ import type { CatalogId } from "../../contracts/ids.js";
5
+ import type { UnifiedCatalogItem } from "../../contracts/items.js";
6
+ import type { CatalogFieldMappingSpec, MappingExecutionOptions } from "../../contracts/mappings.js";
7
+ export type ApiAdapterRuntime = {
8
+ fetchImpl?: typeof fetch;
9
+ };
10
+ export declare class ApiCatalogAdapter {
11
+ private readonly runtime;
12
+ constructor(runtime?: ApiAdapterRuntime);
13
+ listItems(context: CataloxContext, catalogId: CatalogId, config: ApiCatalogAdapterConfig, mapping: {
14
+ responseMapping: CatalogFieldMappingSpec[];
15
+ options?: MappingExecutionOptions;
16
+ }, options?: CatalogQueryOptions): Promise<{
17
+ items: UnifiedCatalogItem[];
18
+ nextCursor?: string;
19
+ issues?: import("../../contracts/mappings.js").CatalogMappingIssue[];
20
+ }>;
21
+ }
22
+ //# sourceMappingURL=api-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/api/api-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAGpG,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,CAAC;AAYF,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,GAAE,iBAAsB;IAEtD,SAAS,CACb,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,uBAAuB,EAC/B,OAAO,EAAE;QAAE,eAAe,EAAE,uBAAuB,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,uBAAuB,CAAA;KAAE,EAC1F,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC;QAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,6BAA6B,EAAE,mBAAmB,EAAE,CAAA;KAAE,CAAC;CAgDvI"}
@@ -0,0 +1,60 @@
1
+ import { executeMapping } from "../../mapping/execute-mapping.js";
2
+ function deepGetFallback(obj, path) {
3
+ const parts = path.split(".").map((p) => p.trim()).filter(Boolean);
4
+ let cur = obj;
5
+ for (const p of parts) {
6
+ if (cur == null)
7
+ return undefined;
8
+ cur = cur[p];
9
+ }
10
+ return cur;
11
+ }
12
+ export class ApiCatalogAdapter {
13
+ runtime;
14
+ constructor(runtime = {}) {
15
+ this.runtime = runtime;
16
+ }
17
+ async listItems(context, catalogId, config, mapping, options) {
18
+ const fetchImpl = this.runtime.fetchImpl ?? fetch;
19
+ if (!config.endpoint)
20
+ throw new Error("API adapter missing endpoint.");
21
+ const url = new URL(config.endpoint);
22
+ if (options?.limit != null)
23
+ url.searchParams.set("limit", String(options.limit));
24
+ if (options?.offset != null)
25
+ url.searchParams.set("offset", String(options.offset));
26
+ const res = await fetchImpl(url.toString(), { method: config.method ?? "GET" });
27
+ if (!res.ok)
28
+ throw new Error(`API request failed: ${res.status}`);
29
+ const body = (await res.json());
30
+ const itemsPath = config.pagination?.itemsPath;
31
+ const rawItems = itemsPath ? deepGetFallback(body, itemsPath) : body;
32
+ const arr = Array.isArray(rawItems) ? rawItems : [];
33
+ const out = [];
34
+ const issues = [];
35
+ for (const row of arr) {
36
+ const source = row;
37
+ const mapped = executeMapping(source, mapping.responseMapping, mapping.options);
38
+ if (mapped.issues)
39
+ issues.push(...mapped.issues);
40
+ const itemId = config.itemIdSourcePath ? deepGetFallback(source, config.itemIdSourcePath) : undefined;
41
+ out.push({
42
+ itemId: itemId != null ? String(itemId) : JSON.stringify(source),
43
+ catalogId,
44
+ appId: context.appId,
45
+ sourceMode: "mapped",
46
+ sourceType: "api",
47
+ sourceRef: { endpoint: config.endpoint },
48
+ data: mapped.data,
49
+ });
50
+ }
51
+ const nextCursorPath = config.pagination?.nextCursorPath;
52
+ const nextCursor = nextCursorPath ? deepGetFallback(body, nextCursorPath) : undefined;
53
+ return {
54
+ items: out,
55
+ ...(typeof nextCursor === "string" ? { nextCursor } : {}),
56
+ ...(issues.length ? { issues } : {}),
57
+ };
58
+ }
59
+ }
60
+ //# sourceMappingURL=api-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-adapter.js","sourceRoot":"","sources":["../../../src/adapters/api/api-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./api-adapter.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./api-adapter.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./mongo-adapter.js";
2
+ export * from "./resolve-db.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/mongo/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./mongo-adapter.js";
2
+ export * from "./resolve-db.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/mongo/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { MongoCatalogAdapterConfig } from "../../contracts/adapters.js";
2
+ import type { CatalogQueryOptions } from "../../contracts/catalogs.js";
3
+ import type { CataloxContext } from "../../contracts/context.js";
4
+ import type { CatalogId } from "../../contracts/ids.js";
5
+ import type { UnifiedCatalogItem } from "../../contracts/items.js";
6
+ import type { MappingExecutionOptions } from "../../contracts/mappings.js";
7
+ export type MongoAdapterRuntime = {
8
+ mongoUri: string;
9
+ };
10
+ export declare class MongoCatalogAdapter {
11
+ private readonly runtime;
12
+ constructor(runtime: MongoAdapterRuntime);
13
+ listItems(context: CataloxContext, catalogId: CatalogId, config: MongoCatalogAdapterConfig, mapping: {
14
+ mapping: import("../../contracts/mappings.js").CatalogFieldMappingSpec[];
15
+ options?: MappingExecutionOptions;
16
+ }, options?: CatalogQueryOptions): Promise<{
17
+ items: UnifiedCatalogItem[];
18
+ issues?: import("../../contracts/mappings.js").CatalogMappingIssue[];
19
+ }>;
20
+ }
21
+ //# sourceMappingURL=mongo-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/mongo/mongo-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAI3E,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,mBAAmB;IAEnD,SAAS,CACb,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,6BAA6B,EAAE,uBAAuB,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,uBAAuB,CAAA;KAAE,EACxH,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC;QAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,6BAA6B,EAAE,mBAAmB,EAAE,CAAA;KAAE,CAAC;CAyDlH"}
@@ -0,0 +1,57 @@
1
+ import { MongoClient } from "mongodb";
2
+ import { executeMapping } from "../../mapping/execute-mapping.js";
3
+ import { resolveMongoDbName } from "./resolve-db.js";
4
+ export class MongoCatalogAdapter {
5
+ runtime;
6
+ constructor(runtime) {
7
+ this.runtime = runtime;
8
+ }
9
+ async listItems(context, catalogId, config, mapping, options) {
10
+ const client = new MongoClient(this.runtime.mongoUri);
11
+ await client.connect();
12
+ try {
13
+ const dbName = config.databaseResolution.kind === "lookup"
14
+ ? resolveMongoDbName(context.appId, { kind: "appId-direct" })
15
+ : resolveMongoDbName(context.appId, config.databaseResolution);
16
+ const db = client.db(dbName);
17
+ const coll = db.collection(config.collection);
18
+ const filter = {
19
+ ...(config.queryDefaults?.filter ?? {}),
20
+ ...(options?.filter ?? {}),
21
+ };
22
+ const sort = (options?.sort ?? config.queryDefaults?.sort ?? {});
23
+ const limit = options?.limit ?? 100;
24
+ const skip = options?.offset ?? 0;
25
+ const cursor = coll.find(filter).sort(sort).skip(skip).limit(limit);
26
+ const docs = (await cursor.toArray());
27
+ const items = [];
28
+ const issues = [];
29
+ for (const doc of docs) {
30
+ const source = doc;
31
+ const mapped = executeMapping(source, mapping.mapping, mapping.options);
32
+ if (mapped.issues)
33
+ issues.push(...mapped.issues);
34
+ const itemId = (config.idSourcePath ? source?.[config.idSourcePath] : undefined) ??
35
+ String(doc._id);
36
+ items.push({
37
+ itemId: String(itemId),
38
+ catalogId,
39
+ appId: context.appId,
40
+ sourceMode: "mapped",
41
+ sourceType: "mongo",
42
+ sourceRef: {
43
+ database: dbName,
44
+ collection: config.collection,
45
+ sourceRecordId: String(doc._id),
46
+ },
47
+ data: mapped.data,
48
+ });
49
+ }
50
+ return issues.length ? { items, issues } : { items };
51
+ }
52
+ finally {
53
+ await client.close();
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=mongo-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo-adapter.js","sourceRoot":"","sources":["../../../src/adapters/mongo/mongo-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AppId } from "../../contracts/ids.js";
2
+ import type { MongoDatabaseResolution } from "../../contracts/adapters.js";
3
+ export declare function resolveMongoDbName(appId: AppId, resolution: MongoDatabaseResolution): string;
4
+ //# sourceMappingURL=resolve-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-db.d.ts","sourceRoot":"","sources":["../../../src/adapters/mongo/resolve-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,uBAAuB,GAAG,MAAM,CAO5F"}
@@ -0,0 +1,10 @@
1
+ export function resolveMongoDbName(appId, resolution) {
2
+ if (resolution.kind === "appId-direct")
3
+ return String(appId);
4
+ if (resolution.kind === "template") {
5
+ return String(resolution.template).replaceAll("{appId}", String(appId));
6
+ }
7
+ // lookup mode requires an external lookup (Firestore) and is handled at a higher layer.
8
+ return String(appId);
9
+ }
10
+ //# sourceMappingURL=resolve-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-db.js","sourceRoot":"","sources":["../../../src/adapters/mongo/resolve-db.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,kBAAkB,CAAC,KAAY,EAAE,UAAmC;IAClF,IAAI,UAAU,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,wFAAwF;IACxF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bindings/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Binding helpers will live here.
2
+ export {};
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bindings/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { AppId, CatalogId } from "../contracts/ids.js";
2
+ import type { CataloxContext } from "../contracts/context.js";
3
+ import type { CatalogBindingRecord } from "../contracts/bindings.js";
4
+ import { BindingStore } from "../firebase/binding-store.js";
5
+ export type RequiredAccess = "read" | "write" | "admin";
6
+ export declare class AuthorizationService {
7
+ private readonly bindings;
8
+ constructor(bindings: BindingStore);
9
+ requireBindingAccess(context: CataloxContext, appId: AppId, catalogId: CatalogId, required: RequiredAccess): Promise<CatalogBindingRecord>;
10
+ }
11
+ //# sourceMappingURL=authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/catalox/authorization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAExD,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAE7C,oBAAoB,CACxB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,oBAAoB,CAAC;CAiCjC"}
@@ -0,0 +1,37 @@
1
+ import { CatalogAccessDeniedError } from "../contracts/errors.js";
2
+ import { BindingStore } from "../firebase/binding-store.js";
3
+ export class AuthorizationService {
4
+ bindings;
5
+ constructor(bindings) {
6
+ this.bindings = bindings;
7
+ }
8
+ async requireBindingAccess(context, appId, catalogId, required) {
9
+ if (context.isGodMode) {
10
+ // God-mode policy: bypass binding for read/admin checks if needed.
11
+ // We still return a synthetic binding for uniformity.
12
+ return {
13
+ bindingId: `${String(appId)}:${String(catalogId)}`,
14
+ appId,
15
+ catalogId,
16
+ access: { canRead: true, canWrite: true, canAdmin: true },
17
+ status: "active",
18
+ createdAt: new Date(0).toISOString(),
19
+ updatedAt: new Date(0).toISOString(),
20
+ };
21
+ }
22
+ const binding = await this.bindings.findByAppCatalog(appId, catalogId);
23
+ if (!binding || binding.status !== "active") {
24
+ throw new CatalogAccessDeniedError({ appId, catalogId, reason: "binding_not_found_or_inactive" });
25
+ }
26
+ const ok = required === "read"
27
+ ? Boolean(binding.access.canRead)
28
+ : required === "write"
29
+ ? Boolean(binding.access.canWrite)
30
+ : Boolean(binding.access.canAdmin);
31
+ if (!ok) {
32
+ throw new CatalogAccessDeniedError({ appId, catalogId, required });
33
+ }
34
+ return binding;
35
+ }
36
+ }
37
+ //# sourceMappingURL=authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../src/catalox/authorization.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAI5D,MAAM,OAAO,oBAAoB;IACF;IAA7B,YAA6B,QAAsB;QAAtB,aAAQ,GAAR,QAAQ,CAAc;IAAG,CAAC;IAEvD,KAAK,CAAC,oBAAoB,CACxB,OAAuB,EACvB,KAAY,EACZ,SAAoB,EACpB,QAAwB;QAExB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,mEAAmE;YACnE,sDAAsD;YACtD,OAAO;gBACL,SAAS,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE;gBAClD,KAAK;gBACL,SAAS;gBACT,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACzD,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;gBACpC,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;aACrC,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,wBAAwB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC,CAAC;QACpG,CAAC;QAED,MAAM,EAAE,GACN,QAAQ,KAAK,MAAM;YACjB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;YACjC,CAAC,CAAC,QAAQ,KAAK,OAAO;gBACpB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAClC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,wBAAwB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}