grafeo-ogm 1.0.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 (333) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1121 -0
  3. package/dist/cjs/compilers/fulltext.compiler.d.ts +67 -0
  4. package/dist/cjs/compilers/fulltext.compiler.d.ts.map +1 -0
  5. package/dist/cjs/compilers/fulltext.compiler.js +254 -0
  6. package/dist/cjs/compilers/fulltext.compiler.js.map +1 -0
  7. package/dist/cjs/compilers/mutation.compiler.d.ts +126 -0
  8. package/dist/cjs/compilers/mutation.compiler.d.ts.map +1 -0
  9. package/dist/cjs/compilers/mutation.compiler.js +1239 -0
  10. package/dist/cjs/compilers/mutation.compiler.js.map +1 -0
  11. package/dist/cjs/compilers/select-normalizer.d.ts +50 -0
  12. package/dist/cjs/compilers/select-normalizer.d.ts.map +1 -0
  13. package/dist/cjs/compilers/select-normalizer.js +225 -0
  14. package/dist/cjs/compilers/select-normalizer.js.map +1 -0
  15. package/dist/cjs/compilers/selection.compiler.d.ts +113 -0
  16. package/dist/cjs/compilers/selection.compiler.d.ts.map +1 -0
  17. package/dist/cjs/compilers/selection.compiler.js +410 -0
  18. package/dist/cjs/compilers/selection.compiler.js.map +1 -0
  19. package/dist/cjs/compilers/where.compiler.d.ts +39 -0
  20. package/dist/cjs/compilers/where.compiler.d.ts.map +1 -0
  21. package/dist/cjs/compilers/where.compiler.js +456 -0
  22. package/dist/cjs/compilers/where.compiler.js.map +1 -0
  23. package/dist/cjs/errors.d.ts +28 -0
  24. package/dist/cjs/errors.d.ts.map +1 -0
  25. package/dist/cjs/errors.js +42 -0
  26. package/dist/cjs/errors.js.map +1 -0
  27. package/dist/cjs/execution/executor.d.ts +38 -0
  28. package/dist/cjs/execution/executor.d.ts.map +1 -0
  29. package/dist/cjs/execution/executor.js +50 -0
  30. package/dist/cjs/execution/executor.js.map +1 -0
  31. package/dist/cjs/execution/result-mapper.d.ts +26 -0
  32. package/dist/cjs/execution/result-mapper.d.ts.map +1 -0
  33. package/dist/cjs/execution/result-mapper.js +92 -0
  34. package/dist/cjs/execution/result-mapper.js.map +1 -0
  35. package/dist/cjs/generator/generate-types.d.ts +55 -0
  36. package/dist/cjs/generator/generate-types.d.ts.map +1 -0
  37. package/dist/cjs/generator/generate-types.js +181 -0
  38. package/dist/cjs/generator/generate-types.js.map +1 -0
  39. package/dist/cjs/generator/index.d.ts +3 -0
  40. package/dist/cjs/generator/index.d.ts.map +1 -0
  41. package/dist/cjs/generator/index.js +6 -0
  42. package/dist/cjs/generator/index.js.map +1 -0
  43. package/dist/cjs/generator/type-emitters/aggregation-emitter.d.ts +7 -0
  44. package/dist/cjs/generator/type-emitters/aggregation-emitter.d.ts.map +1 -0
  45. package/dist/cjs/generator/type-emitters/aggregation-emitter.js +196 -0
  46. package/dist/cjs/generator/type-emitters/aggregation-emitter.js.map +1 -0
  47. package/dist/cjs/generator/type-emitters/connection-emitter.d.ts +22 -0
  48. package/dist/cjs/generator/type-emitters/connection-emitter.d.ts.map +1 -0
  49. package/dist/cjs/generator/type-emitters/connection-emitter.js +270 -0
  50. package/dist/cjs/generator/type-emitters/connection-emitter.js.map +1 -0
  51. package/dist/cjs/generator/type-emitters/enum-emitter.d.ts +7 -0
  52. package/dist/cjs/generator/type-emitters/enum-emitter.d.ts.map +1 -0
  53. package/dist/cjs/generator/type-emitters/enum-emitter.js +45 -0
  54. package/dist/cjs/generator/type-emitters/enum-emitter.js.map +1 -0
  55. package/dist/cjs/generator/type-emitters/fulltext-emitter.d.ts +15 -0
  56. package/dist/cjs/generator/type-emitters/fulltext-emitter.d.ts.map +1 -0
  57. package/dist/cjs/generator/type-emitters/fulltext-emitter.js +80 -0
  58. package/dist/cjs/generator/type-emitters/fulltext-emitter.js.map +1 -0
  59. package/dist/cjs/generator/type-emitters/helpers.d.ts +32 -0
  60. package/dist/cjs/generator/type-emitters/helpers.d.ts.map +1 -0
  61. package/dist/cjs/generator/type-emitters/helpers.js +69 -0
  62. package/dist/cjs/generator/type-emitters/helpers.js.map +1 -0
  63. package/dist/cjs/generator/type-emitters/input-emitter.d.ts +6 -0
  64. package/dist/cjs/generator/type-emitters/input-emitter.d.ts.map +1 -0
  65. package/dist/cjs/generator/type-emitters/input-emitter.js +560 -0
  66. package/dist/cjs/generator/type-emitters/input-emitter.js.map +1 -0
  67. package/dist/cjs/generator/type-emitters/interface-emitter.d.ts +10 -0
  68. package/dist/cjs/generator/type-emitters/interface-emitter.d.ts.map +1 -0
  69. package/dist/cjs/generator/type-emitters/interface-emitter.js +88 -0
  70. package/dist/cjs/generator/type-emitters/interface-emitter.js.map +1 -0
  71. package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts +32 -0
  72. package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts.map +1 -0
  73. package/dist/cjs/generator/type-emitters/model-map-emitter.js +154 -0
  74. package/dist/cjs/generator/type-emitters/model-map-emitter.js.map +1 -0
  75. package/dist/cjs/generator/type-emitters/mutation-response-emitter.d.ts +9 -0
  76. package/dist/cjs/generator/type-emitters/mutation-response-emitter.d.ts.map +1 -0
  77. package/dist/cjs/generator/type-emitters/mutation-response-emitter.js +69 -0
  78. package/dist/cjs/generator/type-emitters/mutation-response-emitter.js.map +1 -0
  79. package/dist/cjs/generator/type-emitters/node-type-emitter.d.ts +13 -0
  80. package/dist/cjs/generator/type-emitters/node-type-emitter.d.ts.map +1 -0
  81. package/dist/cjs/generator/type-emitters/node-type-emitter.js +123 -0
  82. package/dist/cjs/generator/type-emitters/node-type-emitter.js.map +1 -0
  83. package/dist/cjs/generator/type-emitters/select-fields-emitter.d.ts +8 -0
  84. package/dist/cjs/generator/type-emitters/select-fields-emitter.d.ts.map +1 -0
  85. package/dist/cjs/generator/type-emitters/select-fields-emitter.js +169 -0
  86. package/dist/cjs/generator/type-emitters/select-fields-emitter.js.map +1 -0
  87. package/dist/cjs/generator/type-emitters/select-result-emitter.d.ts +9 -0
  88. package/dist/cjs/generator/type-emitters/select-result-emitter.d.ts.map +1 -0
  89. package/dist/cjs/generator/type-emitters/select-result-emitter.js +61 -0
  90. package/dist/cjs/generator/type-emitters/select-result-emitter.js.map +1 -0
  91. package/dist/cjs/generator/type-emitters/sort-options-emitter.d.ts +8 -0
  92. package/dist/cjs/generator/type-emitters/sort-options-emitter.d.ts.map +1 -0
  93. package/dist/cjs/generator/type-emitters/sort-options-emitter.js +47 -0
  94. package/dist/cjs/generator/type-emitters/sort-options-emitter.js.map +1 -0
  95. package/dist/cjs/generator/type-emitters/utility-types.d.ts +10 -0
  96. package/dist/cjs/generator/type-emitters/utility-types.d.ts.map +1 -0
  97. package/dist/cjs/generator/type-emitters/utility-types.js +93 -0
  98. package/dist/cjs/generator/type-emitters/utility-types.js.map +1 -0
  99. package/dist/cjs/generator/type-emitters/where-emitter.d.ts +15 -0
  100. package/dist/cjs/generator/type-emitters/where-emitter.d.ts.map +1 -0
  101. package/dist/cjs/generator/type-emitters/where-emitter.js +189 -0
  102. package/dist/cjs/generator/type-emitters/where-emitter.js.map +1 -0
  103. package/dist/cjs/index.d.ts +30 -0
  104. package/dist/cjs/index.d.ts.map +1 -0
  105. package/dist/cjs/index.js +59 -0
  106. package/dist/cjs/index.js.map +1 -0
  107. package/dist/cjs/interface-model.d.ts +158 -0
  108. package/dist/cjs/interface-model.d.ts.map +1 -0
  109. package/dist/cjs/interface-model.js +214 -0
  110. package/dist/cjs/interface-model.js.map +1 -0
  111. package/dist/cjs/model.d.ts +354 -0
  112. package/dist/cjs/model.d.ts.map +1 -0
  113. package/dist/cjs/model.js +513 -0
  114. package/dist/cjs/model.js.map +1 -0
  115. package/dist/cjs/ogm.d.ts +97 -0
  116. package/dist/cjs/ogm.d.ts.map +1 -0
  117. package/dist/cjs/ogm.js +224 -0
  118. package/dist/cjs/ogm.js.map +1 -0
  119. package/dist/cjs/package.json +1 -0
  120. package/dist/cjs/schema/parser.d.ts +12 -0
  121. package/dist/cjs/schema/parser.d.ts.map +1 -0
  122. package/dist/cjs/schema/parser.js +331 -0
  123. package/dist/cjs/schema/parser.js.map +1 -0
  124. package/dist/cjs/schema/types.d.ts +66 -0
  125. package/dist/cjs/schema/types.d.ts.map +1 -0
  126. package/dist/cjs/schema/types.js +3 -0
  127. package/dist/cjs/schema/types.js.map +1 -0
  128. package/dist/cjs/schema/utils.d.ts +23 -0
  129. package/dist/cjs/schema/utils.d.ts.map +1 -0
  130. package/dist/cjs/schema/utils.js +92 -0
  131. package/dist/cjs/schema/utils.js.map +1 -0
  132. package/dist/cjs/subgraph/index.d.ts +3 -0
  133. package/dist/cjs/subgraph/index.d.ts.map +1 -0
  134. package/dist/cjs/subgraph/index.js +7 -0
  135. package/dist/cjs/subgraph/index.js.map +1 -0
  136. package/dist/cjs/subgraph/subgraph-operations.d.ts +34 -0
  137. package/dist/cjs/subgraph/subgraph-operations.d.ts.map +1 -0
  138. package/dist/cjs/subgraph/subgraph-operations.js +225 -0
  139. package/dist/cjs/subgraph/subgraph-operations.js.map +1 -0
  140. package/dist/cjs/subgraph/types.d.ts +23 -0
  141. package/dist/cjs/subgraph/types.d.ts.map +1 -0
  142. package/dist/cjs/subgraph/types.js +3 -0
  143. package/dist/cjs/subgraph/types.js.map +1 -0
  144. package/dist/cjs/testing/cypher-assert.d.ts +35 -0
  145. package/dist/cjs/testing/cypher-assert.d.ts.map +1 -0
  146. package/dist/cjs/testing/cypher-assert.js +72 -0
  147. package/dist/cjs/testing/cypher-assert.js.map +1 -0
  148. package/dist/cjs/testing/index.d.ts +4 -0
  149. package/dist/cjs/testing/index.d.ts.map +1 -0
  150. package/dist/cjs/testing/index.js +10 -0
  151. package/dist/cjs/testing/index.js.map +1 -0
  152. package/dist/cjs/testing/neo4j-record-factory.d.ts +25 -0
  153. package/dist/cjs/testing/neo4j-record-factory.d.ts.map +1 -0
  154. package/dist/cjs/testing/neo4j-record-factory.js +43 -0
  155. package/dist/cjs/testing/neo4j-record-factory.js.map +1 -0
  156. package/dist/cjs/testing/selection-set-factory.d.ts +24 -0
  157. package/dist/cjs/testing/selection-set-factory.d.ts.map +1 -0
  158. package/dist/cjs/testing/selection-set-factory.js +44 -0
  159. package/dist/cjs/testing/selection-set-factory.js.map +1 -0
  160. package/dist/cjs/utils/lucene.d.ts +9 -0
  161. package/dist/cjs/utils/lucene.d.ts.map +1 -0
  162. package/dist/cjs/utils/lucene.js +25 -0
  163. package/dist/cjs/utils/lucene.js.map +1 -0
  164. package/dist/cjs/utils/validation.d.ts +25 -0
  165. package/dist/cjs/utils/validation.d.ts.map +1 -0
  166. package/dist/cjs/utils/validation.js +53 -0
  167. package/dist/cjs/utils/validation.js.map +1 -0
  168. package/dist/esm/compilers/fulltext.compiler.d.ts +67 -0
  169. package/dist/esm/compilers/fulltext.compiler.d.ts.map +1 -0
  170. package/dist/esm/compilers/fulltext.compiler.js +250 -0
  171. package/dist/esm/compilers/fulltext.compiler.js.map +1 -0
  172. package/dist/esm/compilers/mutation.compiler.d.ts +126 -0
  173. package/dist/esm/compilers/mutation.compiler.d.ts.map +1 -0
  174. package/dist/esm/compilers/mutation.compiler.js +1235 -0
  175. package/dist/esm/compilers/mutation.compiler.js.map +1 -0
  176. package/dist/esm/compilers/select-normalizer.d.ts +50 -0
  177. package/dist/esm/compilers/select-normalizer.d.ts.map +1 -0
  178. package/dist/esm/compilers/select-normalizer.js +221 -0
  179. package/dist/esm/compilers/select-normalizer.js.map +1 -0
  180. package/dist/esm/compilers/selection.compiler.d.ts +113 -0
  181. package/dist/esm/compilers/selection.compiler.d.ts.map +1 -0
  182. package/dist/esm/compilers/selection.compiler.js +406 -0
  183. package/dist/esm/compilers/selection.compiler.js.map +1 -0
  184. package/dist/esm/compilers/where.compiler.d.ts +39 -0
  185. package/dist/esm/compilers/where.compiler.d.ts.map +1 -0
  186. package/dist/esm/compilers/where.compiler.js +452 -0
  187. package/dist/esm/compilers/where.compiler.js.map +1 -0
  188. package/dist/esm/errors.d.ts +28 -0
  189. package/dist/esm/errors.d.ts.map +1 -0
  190. package/dist/esm/errors.js +36 -0
  191. package/dist/esm/errors.js.map +1 -0
  192. package/dist/esm/execution/executor.d.ts +38 -0
  193. package/dist/esm/execution/executor.d.ts.map +1 -0
  194. package/dist/esm/execution/executor.js +46 -0
  195. package/dist/esm/execution/executor.js.map +1 -0
  196. package/dist/esm/execution/result-mapper.d.ts +26 -0
  197. package/dist/esm/execution/result-mapper.d.ts.map +1 -0
  198. package/dist/esm/execution/result-mapper.js +85 -0
  199. package/dist/esm/execution/result-mapper.js.map +1 -0
  200. package/dist/esm/generator/generate-types.d.ts +55 -0
  201. package/dist/esm/generator/generate-types.d.ts.map +1 -0
  202. package/dist/esm/generator/generate-types.js +141 -0
  203. package/dist/esm/generator/generate-types.js.map +1 -0
  204. package/dist/esm/generator/index.d.ts +3 -0
  205. package/dist/esm/generator/index.d.ts.map +1 -0
  206. package/dist/esm/generator/index.js +2 -0
  207. package/dist/esm/generator/index.js.map +1 -0
  208. package/dist/esm/generator/type-emitters/aggregation-emitter.d.ts +7 -0
  209. package/dist/esm/generator/type-emitters/aggregation-emitter.d.ts.map +1 -0
  210. package/dist/esm/generator/type-emitters/aggregation-emitter.js +193 -0
  211. package/dist/esm/generator/type-emitters/aggregation-emitter.js.map +1 -0
  212. package/dist/esm/generator/type-emitters/connection-emitter.d.ts +22 -0
  213. package/dist/esm/generator/type-emitters/connection-emitter.d.ts.map +1 -0
  214. package/dist/esm/generator/type-emitters/connection-emitter.js +266 -0
  215. package/dist/esm/generator/type-emitters/connection-emitter.js.map +1 -0
  216. package/dist/esm/generator/type-emitters/enum-emitter.d.ts +7 -0
  217. package/dist/esm/generator/type-emitters/enum-emitter.d.ts.map +1 -0
  218. package/dist/esm/generator/type-emitters/enum-emitter.js +42 -0
  219. package/dist/esm/generator/type-emitters/enum-emitter.js.map +1 -0
  220. package/dist/esm/generator/type-emitters/fulltext-emitter.d.ts +15 -0
  221. package/dist/esm/generator/type-emitters/fulltext-emitter.d.ts.map +1 -0
  222. package/dist/esm/generator/type-emitters/fulltext-emitter.js +77 -0
  223. package/dist/esm/generator/type-emitters/fulltext-emitter.js.map +1 -0
  224. package/dist/esm/generator/type-emitters/helpers.d.ts +32 -0
  225. package/dist/esm/generator/type-emitters/helpers.d.ts.map +1 -0
  226. package/dist/esm/generator/type-emitters/helpers.js +63 -0
  227. package/dist/esm/generator/type-emitters/helpers.js.map +1 -0
  228. package/dist/esm/generator/type-emitters/input-emitter.d.ts +6 -0
  229. package/dist/esm/generator/type-emitters/input-emitter.d.ts.map +1 -0
  230. package/dist/esm/generator/type-emitters/input-emitter.js +557 -0
  231. package/dist/esm/generator/type-emitters/input-emitter.js.map +1 -0
  232. package/dist/esm/generator/type-emitters/interface-emitter.d.ts +10 -0
  233. package/dist/esm/generator/type-emitters/interface-emitter.d.ts.map +1 -0
  234. package/dist/esm/generator/type-emitters/interface-emitter.js +85 -0
  235. package/dist/esm/generator/type-emitters/interface-emitter.js.map +1 -0
  236. package/dist/esm/generator/type-emitters/model-map-emitter.d.ts +32 -0
  237. package/dist/esm/generator/type-emitters/model-map-emitter.d.ts.map +1 -0
  238. package/dist/esm/generator/type-emitters/model-map-emitter.js +149 -0
  239. package/dist/esm/generator/type-emitters/model-map-emitter.js.map +1 -0
  240. package/dist/esm/generator/type-emitters/mutation-response-emitter.d.ts +9 -0
  241. package/dist/esm/generator/type-emitters/mutation-response-emitter.d.ts.map +1 -0
  242. package/dist/esm/generator/type-emitters/mutation-response-emitter.js +66 -0
  243. package/dist/esm/generator/type-emitters/mutation-response-emitter.js.map +1 -0
  244. package/dist/esm/generator/type-emitters/node-type-emitter.d.ts +13 -0
  245. package/dist/esm/generator/type-emitters/node-type-emitter.d.ts.map +1 -0
  246. package/dist/esm/generator/type-emitters/node-type-emitter.js +120 -0
  247. package/dist/esm/generator/type-emitters/node-type-emitter.js.map +1 -0
  248. package/dist/esm/generator/type-emitters/select-fields-emitter.d.ts +8 -0
  249. package/dist/esm/generator/type-emitters/select-fields-emitter.d.ts.map +1 -0
  250. package/dist/esm/generator/type-emitters/select-fields-emitter.js +166 -0
  251. package/dist/esm/generator/type-emitters/select-fields-emitter.js.map +1 -0
  252. package/dist/esm/generator/type-emitters/select-result-emitter.d.ts +9 -0
  253. package/dist/esm/generator/type-emitters/select-result-emitter.d.ts.map +1 -0
  254. package/dist/esm/generator/type-emitters/select-result-emitter.js +58 -0
  255. package/dist/esm/generator/type-emitters/select-result-emitter.js.map +1 -0
  256. package/dist/esm/generator/type-emitters/sort-options-emitter.d.ts +8 -0
  257. package/dist/esm/generator/type-emitters/sort-options-emitter.d.ts.map +1 -0
  258. package/dist/esm/generator/type-emitters/sort-options-emitter.js +44 -0
  259. package/dist/esm/generator/type-emitters/sort-options-emitter.js.map +1 -0
  260. package/dist/esm/generator/type-emitters/utility-types.d.ts +10 -0
  261. package/dist/esm/generator/type-emitters/utility-types.d.ts.map +1 -0
  262. package/dist/esm/generator/type-emitters/utility-types.js +88 -0
  263. package/dist/esm/generator/type-emitters/utility-types.js.map +1 -0
  264. package/dist/esm/generator/type-emitters/where-emitter.d.ts +15 -0
  265. package/dist/esm/generator/type-emitters/where-emitter.d.ts.map +1 -0
  266. package/dist/esm/generator/type-emitters/where-emitter.js +186 -0
  267. package/dist/esm/generator/type-emitters/where-emitter.js.map +1 -0
  268. package/dist/esm/index.d.ts +30 -0
  269. package/dist/esm/index.d.ts.map +1 -0
  270. package/dist/esm/index.js +29 -0
  271. package/dist/esm/index.js.map +1 -0
  272. package/dist/esm/interface-model.d.ts +158 -0
  273. package/dist/esm/interface-model.d.ts.map +1 -0
  274. package/dist/esm/interface-model.js +210 -0
  275. package/dist/esm/interface-model.js.map +1 -0
  276. package/dist/esm/model.d.ts +354 -0
  277. package/dist/esm/model.d.ts.map +1 -0
  278. package/dist/esm/model.js +507 -0
  279. package/dist/esm/model.js.map +1 -0
  280. package/dist/esm/ogm.d.ts +97 -0
  281. package/dist/esm/ogm.d.ts.map +1 -0
  282. package/dist/esm/ogm.js +220 -0
  283. package/dist/esm/ogm.js.map +1 -0
  284. package/dist/esm/package.json +1 -0
  285. package/dist/esm/schema/parser.d.ts +12 -0
  286. package/dist/esm/schema/parser.d.ts.map +1 -0
  287. package/dist/esm/schema/parser.js +324 -0
  288. package/dist/esm/schema/parser.js.map +1 -0
  289. package/dist/esm/schema/types.d.ts +66 -0
  290. package/dist/esm/schema/types.d.ts.map +1 -0
  291. package/dist/esm/schema/types.js +2 -0
  292. package/dist/esm/schema/types.js.map +1 -0
  293. package/dist/esm/schema/utils.d.ts +23 -0
  294. package/dist/esm/schema/utils.d.ts.map +1 -0
  295. package/dist/esm/schema/utils.js +87 -0
  296. package/dist/esm/schema/utils.js.map +1 -0
  297. package/dist/esm/subgraph/index.d.ts +3 -0
  298. package/dist/esm/subgraph/index.d.ts.map +1 -0
  299. package/dist/esm/subgraph/index.js +2 -0
  300. package/dist/esm/subgraph/index.js.map +1 -0
  301. package/dist/esm/subgraph/subgraph-operations.d.ts +34 -0
  302. package/dist/esm/subgraph/subgraph-operations.d.ts.map +1 -0
  303. package/dist/esm/subgraph/subgraph-operations.js +221 -0
  304. package/dist/esm/subgraph/subgraph-operations.js.map +1 -0
  305. package/dist/esm/subgraph/types.d.ts +23 -0
  306. package/dist/esm/subgraph/types.d.ts.map +1 -0
  307. package/dist/esm/subgraph/types.js +2 -0
  308. package/dist/esm/subgraph/types.js.map +1 -0
  309. package/dist/esm/testing/cypher-assert.d.ts +35 -0
  310. package/dist/esm/testing/cypher-assert.d.ts.map +1 -0
  311. package/dist/esm/testing/cypher-assert.js +68 -0
  312. package/dist/esm/testing/cypher-assert.js.map +1 -0
  313. package/dist/esm/testing/index.d.ts +4 -0
  314. package/dist/esm/testing/index.d.ts.map +1 -0
  315. package/dist/esm/testing/index.js +4 -0
  316. package/dist/esm/testing/index.js.map +1 -0
  317. package/dist/esm/testing/neo4j-record-factory.d.ts +25 -0
  318. package/dist/esm/testing/neo4j-record-factory.d.ts.map +1 -0
  319. package/dist/esm/testing/neo4j-record-factory.js +36 -0
  320. package/dist/esm/testing/neo4j-record-factory.js.map +1 -0
  321. package/dist/esm/testing/selection-set-factory.d.ts +24 -0
  322. package/dist/esm/testing/selection-set-factory.d.ts.map +1 -0
  323. package/dist/esm/testing/selection-set-factory.js +40 -0
  324. package/dist/esm/testing/selection-set-factory.js.map +1 -0
  325. package/dist/esm/utils/lucene.d.ts +9 -0
  326. package/dist/esm/utils/lucene.d.ts.map +1 -0
  327. package/dist/esm/utils/lucene.js +22 -0
  328. package/dist/esm/utils/lucene.js.map +1 -0
  329. package/dist/esm/utils/validation.d.ts +25 -0
  330. package/dist/esm/utils/validation.d.ts.map +1 -0
  331. package/dist/esm/utils/validation.js +46 -0
  332. package/dist/esm/utils/validation.js.map +1 -0
  333. package/package.json +88 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/schema/types.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,UAAU,EAAE,GACZ;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,CAAC;AAElC,6BAA6B;AAC7B,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,EAAE,CAAC;CACvD;AACD,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,EAAE,CAAC;CAC7D;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACnD,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACnD,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACnC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC;IACtE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/schema/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import type { NodeDefinition, SchemaMetadata } from './types';
2
+ /**
3
+ * Clear the module-level resolve cache.
4
+ * Useful in tests to prevent cross-test state pollution.
5
+ */
6
+ export declare function clearResolveTargetDefCache(): void;
7
+ /**
8
+ * Resolve a target type name to a NodeDefinition, handling union targets
9
+ * by merging all member nodes' properties and relationships.
10
+ *
11
+ * Results are memoized per (schema identity + target) to avoid repeated
12
+ * O(members × properties) merges for the same union type.
13
+ */
14
+ export declare function resolveTargetDef(target: string, schema: SchemaMetadata): NodeDefinition | null;
15
+ /**
16
+ * Compute the validated label string for a NodeDefinition.
17
+ * Deduplicates labels, validates each, and joins with ':'.
18
+ *
19
+ * Callers that need caching should maintain their own cache (e.g., per MutationCompiler instance)
20
+ * to avoid cross-test pollution from module-level state.
21
+ */
22
+ export declare function getTargetLabelString(nodeDef: NodeDefinition): string;
23
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/schema/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,cAAc,EACf,MAAM,SAAS,CAAC;AAUjB;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,GACrB,cAAc,GAAG,IAAI,CA0DvB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAKpE"}
@@ -0,0 +1,87 @@
1
+ import { assertSafeLabel } from '../utils/validation';
2
+ /**
3
+ * Module-level cache for resolved union/interface target definitions.
4
+ * Bounded by the number of unique type names in the schema (~50-100 entries).
5
+ * Use `clearResolveTargetDefCache()` to reset (e.g., between tests).
6
+ */
7
+ const resolveTargetDefCache = new Map();
8
+ /**
9
+ * Clear the module-level resolve cache.
10
+ * Useful in tests to prevent cross-test state pollution.
11
+ */
12
+ export function clearResolveTargetDefCache() {
13
+ resolveTargetDefCache.clear();
14
+ }
15
+ /**
16
+ * Resolve a target type name to a NodeDefinition, handling union targets
17
+ * by merging all member nodes' properties and relationships.
18
+ *
19
+ * Results are memoized per (schema identity + target) to avoid repeated
20
+ * O(members × properties) merges for the same union type.
21
+ */
22
+ export function resolveTargetDef(target, schema) {
23
+ const direct = schema.nodes.get(target);
24
+ if (direct)
25
+ return direct;
26
+ const cached = resolveTargetDefCache.get(target);
27
+ if (cached !== undefined)
28
+ return cached;
29
+ // Check interfaces — build a NodeDefinition from the interface definition
30
+ const interfaceDef = schema.interfaces?.get(target);
31
+ if (interfaceDef) {
32
+ const result = {
33
+ typeName: interfaceDef.name,
34
+ label: interfaceDef.label,
35
+ labels: [interfaceDef.label],
36
+ pluralName: interfaceDef.name.toLowerCase() + 's',
37
+ properties: interfaceDef.properties,
38
+ relationships: interfaceDef.relationships,
39
+ fulltextIndexes: [],
40
+ implementsInterfaces: [],
41
+ };
42
+ resolveTargetDefCache.set(target, result);
43
+ return result;
44
+ }
45
+ const unionMembers = schema.unions?.get(target);
46
+ if (!unionMembers || unionMembers.length === 0) {
47
+ resolveTargetDefCache.set(target, null);
48
+ return null;
49
+ }
50
+ const mergedProperties = new Map();
51
+ const mergedRelationships = new Map();
52
+ for (const memberName of unionMembers) {
53
+ const memberDef = schema.nodes.get(memberName);
54
+ if (!memberDef)
55
+ continue;
56
+ for (const [k, v] of memberDef.properties)
57
+ if (!mergedProperties.has(k))
58
+ mergedProperties.set(k, v);
59
+ for (const [k, v] of memberDef.relationships)
60
+ if (!mergedRelationships.has(k))
61
+ mergedRelationships.set(k, v);
62
+ }
63
+ const result = {
64
+ typeName: target,
65
+ label: target,
66
+ labels: [target],
67
+ pluralName: target.toLowerCase() + 's',
68
+ properties: mergedProperties,
69
+ relationships: mergedRelationships,
70
+ fulltextIndexes: [],
71
+ implementsInterfaces: [],
72
+ };
73
+ resolveTargetDefCache.set(target, result);
74
+ return result;
75
+ }
76
+ /**
77
+ * Compute the validated label string for a NodeDefinition.
78
+ * Deduplicates labels, validates each, and joins with ':'.
79
+ *
80
+ * Callers that need caching should maintain their own cache (e.g., per MutationCompiler instance)
81
+ * to avoid cross-test pollution from module-level state.
82
+ */
83
+ export function getTargetLabelString(nodeDef) {
84
+ const allLabels = [...new Set([nodeDef.label, ...nodeDef.labels])].map((l) => assertSafeLabel(l));
85
+ return allLabels.join(':');
86
+ }
87
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/schema/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { cloneSubgraph, deleteSubgraph } from './subgraph-operations';
2
+ export type { SubgraphCloneResult, SubgraphConfig, SubgraphDeleteResult, SubgraphReferenceRelationship, } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/subgraph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACtE,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { cloneSubgraph, deleteSubgraph } from './subgraph-operations';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/subgraph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { Transaction } from 'neo4j-driver';
2
+ import { OGMLogger } from '../execution/executor';
3
+ import { SubgraphCloneResult, SubgraphConfig, SubgraphDeleteResult } from './types';
4
+ /**
5
+ * Clones a content subgraph rooted at the given source node using APOC procedures.
6
+ *
7
+ * Phase 1: Collects the subgraph via `apoc.path.subgraphAll` and clones it
8
+ * with `apoc.refactor.cloneSubgraph`. Generates new UUIDs for all cloned nodes
9
+ * and sets `clonedFromId` on each clone pointing to the original.
10
+ *
11
+ * Phase 2: Re-attaches reference relationships from cloned nodes to shared/lookup nodes
12
+ * (e.g., Language, Status, MeasurementUnit) that were outside the clone scope.
13
+ *
14
+ * @param sourceRootId - The `id` property of the root node to clone
15
+ * @param config - Defines which nodes to clone vs reference
16
+ * @param transaction - Caller-managed Neo4j transaction
17
+ * @param logger - Optional logger for debug output
18
+ * @returns The cloned root node id and a mapping of original→cloned node ids
19
+ */
20
+ export declare function cloneSubgraph(sourceRootId: string, config: SubgraphConfig, transaction: Transaction, logger?: OGMLogger): Promise<SubgraphCloneResult>;
21
+ /**
22
+ * Deletes a content subgraph rooted at the given node using APOC procedures.
23
+ *
24
+ * Uses `apoc.path.subgraphAll` to collect all owned nodes within the configured
25
+ * labels and relationships, then `DETACH DELETE`s them.
26
+ *
27
+ * @param rootId - The `id` property of the subgraph root node to delete
28
+ * @param config - Defines which labels/relationships form the owned subgraph
29
+ * @param transaction - Caller-managed Neo4j transaction
30
+ * @param logger - Optional logger for debug output
31
+ * @returns The count of deleted nodes
32
+ */
33
+ export declare function deleteSubgraph(rootId: string, config: SubgraphConfig, transaction: Transaction, logger?: OGMLogger): Promise<SubgraphDeleteResult>;
34
+ //# sourceMappingURL=subgraph-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subgraph-operations.d.ts","sourceRoot":"","sources":["../../../src/subgraph/subgraph-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMlD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACrB,MAAM,SAAS,CAAC;AA4BjB;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,WAAW,EACxB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,mBAAmB,CAAC,CA+B9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,WAAW,EACxB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAkD/B"}
@@ -0,0 +1,221 @@
1
+ import { SubgraphOperationError } from '../errors';
2
+ import { assertSafeIdentifier, assertSafeLabel, escapeIdentifier, } from '../utils/validation';
3
+ /** No-op logger used when no logger is provided. */
4
+ const NOOP_LOGGER = { debug: () => { } };
5
+ /**
6
+ * Validates all labels and relationship types in a SubgraphConfig
7
+ * to prevent Cypher injection (these values are string-interpolated).
8
+ */
9
+ function validateConfig(config) {
10
+ for (const label of config.ownedLabels)
11
+ assertSafeLabel(label);
12
+ for (const rel of config.ownedRelationships)
13
+ assertSafeIdentifier(rel, 'owned relationship type');
14
+ for (const ref of config.referenceRelationships) {
15
+ assertSafeLabel(ref.fromLabel);
16
+ assertSafeIdentifier(ref.relationshipType, 'reference relationship type');
17
+ if (ref.direction !== 'OUT' && ref.direction !== 'IN')
18
+ throw new SubgraphOperationError('clone', '', `Invalid direction "${ref.direction}" for reference relationship ${ref.relationshipType}`);
19
+ }
20
+ }
21
+ /**
22
+ * Clones a content subgraph rooted at the given source node using APOC procedures.
23
+ *
24
+ * Phase 1: Collects the subgraph via `apoc.path.subgraphAll` and clones it
25
+ * with `apoc.refactor.cloneSubgraph`. Generates new UUIDs for all cloned nodes
26
+ * and sets `clonedFromId` on each clone pointing to the original.
27
+ *
28
+ * Phase 2: Re-attaches reference relationships from cloned nodes to shared/lookup nodes
29
+ * (e.g., Language, Status, MeasurementUnit) that were outside the clone scope.
30
+ *
31
+ * @param sourceRootId - The `id` property of the root node to clone
32
+ * @param config - Defines which nodes to clone vs reference
33
+ * @param transaction - Caller-managed Neo4j transaction
34
+ * @param logger - Optional logger for debug output
35
+ * @returns The cloned root node id and a mapping of original→cloned node ids
36
+ */
37
+ export async function cloneSubgraph(sourceRootId, config, transaction, logger) {
38
+ const log = logger ?? NOOP_LOGGER;
39
+ validateConfig(config);
40
+ try {
41
+ const cloneResult = await executeApocClone(sourceRootId, config, transaction, log);
42
+ log.debug('[OGM $cloneSubgraph] Cloned %d nodes from root %s', cloneResult.nodeMapping.size, sourceRootId);
43
+ await reattachReferenceRelationships(config, cloneResult, transaction, log);
44
+ return cloneResult;
45
+ }
46
+ catch (error) {
47
+ if (error instanceof SubgraphOperationError)
48
+ throw error;
49
+ throw new SubgraphOperationError('clone', sourceRootId, error instanceof Error ? error.message : String(error), error instanceof Error ? error : undefined);
50
+ }
51
+ }
52
+ /**
53
+ * Deletes a content subgraph rooted at the given node using APOC procedures.
54
+ *
55
+ * Uses `apoc.path.subgraphAll` to collect all owned nodes within the configured
56
+ * labels and relationships, then `DETACH DELETE`s them.
57
+ *
58
+ * @param rootId - The `id` property of the subgraph root node to delete
59
+ * @param config - Defines which labels/relationships form the owned subgraph
60
+ * @param transaction - Caller-managed Neo4j transaction
61
+ * @param logger - Optional logger for debug output
62
+ * @returns The count of deleted nodes
63
+ */
64
+ export async function deleteSubgraph(rootId, config, transaction, logger) {
65
+ const log = logger ?? NOOP_LOGGER;
66
+ validateConfig(config);
67
+ const relFilter = config.ownedRelationships.join('|');
68
+ const labelFilter = config.ownedLabels.map((l) => `+${l}`).join('|');
69
+ try {
70
+ const result = await transaction.run(`
71
+ MATCH (source {id: $rootId})
72
+ CALL apoc.path.subgraphAll(source, {
73
+ relationshipFilter: $relFilter,
74
+ labelFilter: $labelFilter,
75
+ maxLevel: $maxLevel
76
+ }) YIELD nodes
77
+ UNWIND nodes AS n
78
+ DETACH DELETE n
79
+ RETURN count(*) AS deletedCount
80
+ `, {
81
+ rootId,
82
+ relFilter,
83
+ labelFilter,
84
+ maxLevel: config.maxLevel,
85
+ });
86
+ const deletedCount = result.records[0]?.get('deletedCount')?.toNumber?.() ??
87
+ result.records[0]?.get('deletedCount') ??
88
+ 0;
89
+ log.debug('[OGM $deleteSubgraph] Deleted %d nodes from root %s', deletedCount, rootId);
90
+ return { deletedCount };
91
+ }
92
+ catch (error) {
93
+ if (error instanceof SubgraphOperationError)
94
+ throw error;
95
+ throw new SubgraphOperationError('delete', rootId, error instanceof Error ? error.message : String(error), error instanceof Error ? error : undefined);
96
+ }
97
+ }
98
+ /**
99
+ * Executes the APOC subgraph clone and generates new UUIDs for cloned nodes.
100
+ */
101
+ async function executeApocClone(sourceRootId, config, transaction, logger) {
102
+ const relFilter = config.ownedRelationships.join('|');
103
+ const labelFilter = config.ownedLabels.map((l) => `+${l}`).join('|');
104
+ // Step 1: Collect subgraph and clone it
105
+ // APOC cloneSubgraph returns: input=INTEGER (original internal ID), output=NODE (clone).
106
+ // skipProperties: ['id'] avoids unique constraint violations during clone.
107
+ // We use `input` (internal ID) to match back to the original's app-level id.
108
+ const result = await transaction.run(`
109
+ MATCH (source {id: $sourceId})
110
+ CALL apoc.path.subgraphAll(source, {
111
+ relationshipFilter: $relFilter,
112
+ labelFilter: $labelFilter,
113
+ maxLevel: $maxLevel
114
+ }) YIELD nodes, relationships
115
+ CALL apoc.refactor.cloneSubgraph(nodes, relationships, {skipProperties: ['id']})
116
+ YIELD input, output, error
117
+ WHERE output IS NOT NULL
118
+ WITH input, output
119
+ MATCH (original) WHERE id(original) = input
120
+ SET output.clonedFromId = original.id
121
+ RETURN original.id AS originalId, elementId(output) AS cloneElementId
122
+ `, {
123
+ sourceId: sourceRootId,
124
+ relFilter,
125
+ labelFilter,
126
+ maxLevel: config.maxLevel,
127
+ });
128
+ // Build nodeMapping from result records
129
+ const nodeMapping = new Map();
130
+ let clonedRootElementId;
131
+ for (const record of result.records) {
132
+ const originalId = record.get('originalId');
133
+ const cloneElementId = record.get('cloneElementId');
134
+ nodeMapping.set(originalId, cloneElementId);
135
+ if (originalId === sourceRootId)
136
+ clonedRootElementId = cloneElementId;
137
+ }
138
+ if (!clonedRootElementId)
139
+ throw new SubgraphOperationError('clone', sourceRootId, 'Clone did not produce a root node');
140
+ // Step 2: Generate new UUIDs for cloned nodes
141
+ // clonedFromId was already set in Step 1 via the APOC clone query
142
+ const uuidResult = await transaction.run(`
143
+ UNWIND $elementIds AS elemId
144
+ MATCH (n) WHERE elementId(n) = elemId
145
+ WITH n, elementId(n) AS elemId, randomUUID() AS newId
146
+ SET n.id = newId
147
+ RETURN elemId, newId
148
+ `, {
149
+ elementIds: Array.from(nodeMapping.values()),
150
+ });
151
+ // Rebuild mapping with new UUIDs: originalId → newUUID
152
+ const elementIdToNewUuid = new Map();
153
+ for (const record of uuidResult.records)
154
+ elementIdToNewUuid.set(record.get('elemId'), record.get('newId'));
155
+ const finalMapping = new Map();
156
+ for (const [originalId, elementId] of nodeMapping) {
157
+ const newUuid = elementIdToNewUuid.get(elementId);
158
+ if (newUuid)
159
+ finalMapping.set(originalId, newUuid);
160
+ }
161
+ const finalClonedRootId = elementIdToNewUuid.get(clonedRootElementId);
162
+ if (!finalClonedRootId)
163
+ throw new SubgraphOperationError('clone', sourceRootId, 'Failed to assign new UUID to cloned root node');
164
+ logger.debug('[OGM $cloneSubgraph] APOC clone complete: %d nodes, root %s → %s', finalMapping.size, sourceRootId, finalClonedRootId);
165
+ return {
166
+ clonedRootId: finalClonedRootId,
167
+ nodeMapping: finalMapping,
168
+ };
169
+ }
170
+ /**
171
+ * Re-attaches reference relationships from cloned nodes to shared/lookup nodes.
172
+ *
173
+ * After APOC cloning, cloned nodes lose their relationships to shared nodes
174
+ * (e.g., Language, Status, MeasurementUnit) because those were outside the clone scope.
175
+ * This queries the original nodes for their reference relationships and re-creates
176
+ * them on the cloned nodes.
177
+ *
178
+ * NOTE: `properties(r)` is materialized into a map variable (`relProps`) BEFORE
179
+ * the CREATE to ensure relationship properties are preserved. Accessing
180
+ * `properties(r)` after a WITH boundary inside CALL {} can silently return
181
+ * an empty map in some Neo4j versions.
182
+ */
183
+ async function reattachReferenceRelationships(config, cloneResult, transaction, logger) {
184
+ if (!config.referenceRelationships.length)
185
+ return;
186
+ const mappings = Array.from(cloneResult.nodeMapping.entries()).map(([originalId, cloneId]) => ({ originalId, cloneId }));
187
+ for (const refRel of config.referenceRelationships) {
188
+ const escapedRelType = escapeIdentifier(refRel.relationshipType);
189
+ const escapedLabel = assertSafeLabel(refRel.fromLabel);
190
+ const matchPattern = refRel.direction === 'OUT'
191
+ ? `-[r:${escapedRelType}]->(target)`
192
+ : `<-[r:${escapedRelType}]-(target)`;
193
+ const createPattern = refRel.direction === 'OUT'
194
+ ? `CREATE (clone)-[newR:${escapedRelType}]->(target)`
195
+ : `CREATE (clone)<-[newR:${escapedRelType}]-(target)`;
196
+ const result = await transaction.run(`
197
+ UNWIND $mappings AS mapping
198
+ MATCH (original {id: mapping.originalId})
199
+ WHERE original:${escapedLabel}
200
+ MATCH (clone {id: mapping.cloneId})
201
+ WHERE clone:${escapedLabel}
202
+ WITH original, clone
203
+ CALL {
204
+ WITH original, clone
205
+ MATCH (original)${matchPattern}
206
+ WITH clone, target, properties(r) AS relProps
207
+ ${createPattern}
208
+ SET newR = relProps
209
+ RETURN count(*) AS created
210
+ }
211
+ RETURN sum(created) AS totalCreated
212
+ `, { mappings });
213
+ const totalCreated = result.records[0]?.get('totalCreated')?.toNumber?.() ??
214
+ result.records[0]?.get('totalCreated') ??
215
+ 0;
216
+ if (totalCreated > 0)
217
+ logger.debug('[OGM $cloneSubgraph] Reattached %d %s relationships (%s)', totalCreated, refRel.relationshipType, refRel.fromLabel);
218
+ }
219
+ logger.debug('[OGM $cloneSubgraph] Reattached %d reference relationship types', config.referenceRelationships.length);
220
+ }
221
+ //# sourceMappingURL=subgraph-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subgraph-operations.js","sourceRoot":"","sources":["../../../src/subgraph/subgraph-operations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAO7B,oDAAoD;AACpD,MAAM,WAAW,GAAc,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;AAEnD;;;GAGG;AACH,SAAS,cAAc,CAAC,MAAsB;IAC5C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,WAAW;QAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAE/D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB;QACzC,oBAAoB,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;IAEvD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChD,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,oBAAoB,CAAC,GAAG,CAAC,gBAAgB,EAAE,6BAA6B,CAAC,CAAC;QAE1E,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI;YACnD,MAAM,IAAI,sBAAsB,CAC9B,OAAO,EACP,EAAE,EACF,sBAAsB,GAAG,CAAC,SAAS,gCAAgC,GAAG,CAAC,gBAAgB,EAAE,CAC1F,CAAC;IACN,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,YAAoB,EACpB,MAAsB,EACtB,WAAwB,EACxB,MAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,IAAI,WAAW,CAAC;IAClC,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,gBAAgB,CACxC,YAAY,EACZ,MAAM,EACN,WAAW,EACX,GAAG,CACJ,CAAC;QAEF,GAAG,CAAC,KAAK,CACP,mDAAmD,EACnD,WAAW,CAAC,WAAW,CAAC,IAAI,EAC5B,YAAY,CACb,CAAC;QAEF,MAAM,8BAA8B,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAE5E,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,sBAAsB;YAAE,MAAM,KAAK,CAAC;QAEzD,MAAM,IAAI,sBAAsB,CAC9B,OAAO,EACP,YAAY,EACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,MAAsB,EACtB,WAAwB,EACxB,MAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,IAAI,WAAW,CAAC;IAClC,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,SAAS,GAAG,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAClC;;;;;;;;;;OAUC,EACD;YACE,MAAM;YACN,SAAS;YACT,WAAW;YACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CACF,CAAC;QAEF,MAAM,YAAY,GAChB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;YACpD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC;YACtC,CAAC,CAAC;QAEJ,GAAG,CAAC,KAAK,CACP,qDAAqD,EACrD,YAAY,EACZ,MAAM,CACP,CAAC;QAEF,OAAO,EAAE,YAAY,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,sBAAsB;YAAE,MAAM,KAAK,CAAC;QAEzD,MAAM,IAAI,sBAAsB,CAC9B,QAAQ,EACR,MAAM,EACN,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,YAAoB,EACpB,MAAsB,EACtB,WAAwB,EACxB,MAAiB;IAEjB,MAAM,SAAS,GAAG,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAErE,wCAAwC;IACxC,yFAAyF;IACzF,2EAA2E;IAC3E,6EAA6E;IAC7E,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAClC;;;;;;;;;;;;;;KAcC,EACD;QACE,QAAQ,EAAE,YAAY;QACtB,SAAS;QACT,WAAW;QACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CACF,CAAC;IAEF,wCAAwC;IACxC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,IAAI,mBAAuC,CAAC;IAE5C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAW,CAAC;QACtD,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAW,CAAC;QAE9D,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAE5C,IAAI,UAAU,KAAK,YAAY;YAAE,mBAAmB,GAAG,cAAc,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,mBAAmB;QACtB,MAAM,IAAI,sBAAsB,CAC9B,OAAO,EACP,YAAY,EACZ,mCAAmC,CACpC,CAAC;IAEJ,8CAA8C;IAC9C,kEAAkE;IAClE,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,GAAG,CACtC;;;;;;KAMC,EACD;QACE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;KAC7C,CACF,CAAC;IAEF,uDAAuD;IACvD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrD,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO;QACrC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAEpE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,OAAO;YAAE,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACtE,IAAI,CAAC,iBAAiB;QACpB,MAAM,IAAI,sBAAsB,CAC9B,OAAO,EACP,YAAY,EACZ,+CAA+C,CAChD,CAAC;IAEJ,MAAM,CAAC,KAAK,CACV,kEAAkE,EAClE,YAAY,CAAC,IAAI,EACjB,YAAY,EACZ,iBAAiB,CAClB,CAAC;IAEF,OAAO;QACL,YAAY,EAAE,iBAAiB;QAC/B,WAAW,EAAE,YAAY;KAC1B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,8BAA8B,CAC3C,MAAsB,EACtB,WAAgC,EAChC,WAAwB,EACxB,MAAiB;IAEjB,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM;QAAE,OAAO;IAElD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAChE,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CACrD,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC;QACnD,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACjE,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,YAAY,GAChB,MAAM,CAAC,SAAS,KAAK,KAAK;YACxB,CAAC,CAAC,OAAO,cAAc,aAAa;YACpC,CAAC,CAAC,QAAQ,cAAc,YAAY,CAAC;QACzC,MAAM,aAAa,GACjB,MAAM,CAAC,SAAS,KAAK,KAAK;YACxB,CAAC,CAAC,wBAAwB,cAAc,aAAa;YACrD,CAAC,CAAC,yBAAyB,cAAc,YAAY,CAAC;QAE1D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAClC;;;uBAGiB,YAAY;;oBAEf,YAAY;;;;0BAIN,YAAY;;UAE5B,aAAa;;;;;OAKhB,EACD,EAAE,QAAQ,EAAE,CACb,CAAC;QAEF,MAAM,YAAY,GAChB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;YACpD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC;YACtC,CAAC,CAAC;QAEJ,IAAI,YAAY,GAAG,CAAC;YAClB,MAAM,CAAC,KAAK,CACV,0DAA0D,EAC1D,YAAY,EACZ,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,SAAS,CACjB,CAAC;IACN,CAAC;IAED,MAAM,CAAC,KAAK,CACV,iEAAiE,EACjE,MAAM,CAAC,sBAAsB,CAAC,MAAM,CACrC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ /** Reference relationship from a cloned node to a shared/lookup node. */
2
+ export interface SubgraphReferenceRelationship {
3
+ fromLabel: string;
4
+ relationshipType: string;
5
+ direction: 'OUT' | 'IN';
6
+ }
7
+ /** Configuration for clone/delete operations — domain-agnostic blueprint. */
8
+ export interface SubgraphConfig {
9
+ ownedLabels: string[];
10
+ ownedRelationships: string[];
11
+ maxLevel: number;
12
+ referenceRelationships: SubgraphReferenceRelationship[];
13
+ }
14
+ /** Clone result. */
15
+ export interface SubgraphCloneResult {
16
+ clonedRootId: string;
17
+ nodeMapping: Map<string, string>;
18
+ }
19
+ /** Delete result. */
20
+ export interface SubgraphDeleteResult {
21
+ deletedCount: number;
22
+ }
23
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/subgraph/types.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;CACzB;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,6BAA6B,EAAE,CAAC;CACzD;AAED,oBAAoB;AACpB,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,qBAAqB;AACrB,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/subgraph/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Structural Cypher comparison utility that normalizes whitespace
3
+ * and parameter names for deterministic test assertions.
4
+ */
5
+ export declare class CypherAssert {
6
+ /**
7
+ * Normalize a Cypher string for structural comparison:
8
+ * - Collapse all whitespace sequences to a single space
9
+ * - Trim leading/trailing whitespace
10
+ * - Rename params to canonical $p0, $p1, etc. (in order of appearance)
11
+ */
12
+ static normalize(cypher: string): string;
13
+ /**
14
+ * Assert two Cypher strings are structurally equal after normalization.
15
+ * Throws an Error if they differ.
16
+ */
17
+ static assertStructurallyEqual(actual: string, expected: string): void;
18
+ /**
19
+ * Assert that a Cypher string contains a specific clause.
20
+ * @param cypher - The full Cypher string
21
+ * @param clauseType - e.g., 'WHERE', 'MATCH', 'RETURN', 'SET'
22
+ * @param pattern - Substring to search for within the clause
23
+ */
24
+ static assertContainsClause(cypher: string, clauseType: string, pattern: string): void;
25
+ /**
26
+ * Assert that a Cypher string does NOT contain a specific clause/pattern.
27
+ */
28
+ static assertNotContainsClause(cypher: string, clauseTypeOrPattern: string, pattern?: string): void;
29
+ /**
30
+ * Assert parameter values match expected.
31
+ * Only checks the keys present in expected (doesn't require exact match on all params).
32
+ */
33
+ static assertParams(actual: Record<string, unknown>, expected: Record<string, unknown>): void;
34
+ }
35
+ //# sourceMappingURL=cypher-assert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cypher-assert.d.ts","sourceRoot":"","sources":["../../../src/testing/cypher-assert.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,YAAY;IACvB;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAkBxC;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAStE;;;;;OAKG;IACH,MAAM,CAAC,oBAAoB,CACzB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,IAAI;IAYP;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAC5B,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,MAAM,EAC3B,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;IAQP;;;OAGG;IACH,MAAM,CAAC,YAAY,CACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI;CAeR"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Structural Cypher comparison utility that normalizes whitespace
3
+ * and parameter names for deterministic test assertions.
4
+ */
5
+ export class CypherAssert {
6
+ /**
7
+ * Normalize a Cypher string for structural comparison:
8
+ * - Collapse all whitespace sequences to a single space
9
+ * - Trim leading/trailing whitespace
10
+ * - Rename params to canonical $p0, $p1, etc. (in order of appearance)
11
+ */
12
+ static normalize(cypher) {
13
+ const collapsed = cypher.replace(/\s+/g, ' ').trim();
14
+ const seen = new Map();
15
+ let counter = 0;
16
+ const normalized = collapsed.replace(/\$[a-zA-Z_][a-zA-Z0-9_]*/g, (match) => {
17
+ if (!seen.has(match))
18
+ seen.set(match, `$p${counter++}`);
19
+ return seen.get(match);
20
+ });
21
+ return normalized;
22
+ }
23
+ /**
24
+ * Assert two Cypher strings are structurally equal after normalization.
25
+ * Throws an Error if they differ.
26
+ */
27
+ static assertStructurallyEqual(actual, expected) {
28
+ const normalizedActual = CypherAssert.normalize(actual);
29
+ const normalizedExpected = CypherAssert.normalize(expected);
30
+ if (normalizedActual !== normalizedExpected)
31
+ throw new Error(`Cypher mismatch:\n Actual: ${normalizedActual}\n Expected: ${normalizedExpected}`);
32
+ }
33
+ /**
34
+ * Assert that a Cypher string contains a specific clause.
35
+ * @param cypher - The full Cypher string
36
+ * @param clauseType - e.g., 'WHERE', 'MATCH', 'RETURN', 'SET'
37
+ * @param pattern - Substring to search for within the clause
38
+ */
39
+ static assertContainsClause(cypher, clauseType, pattern) {
40
+ if (!cypher.toUpperCase().includes(clauseType.toUpperCase()))
41
+ throw new Error(`Cypher does not contain clause '${clauseType}':\n ${cypher}`);
42
+ if (!cypher.includes(pattern))
43
+ throw new Error(`Cypher does not contain pattern '${pattern}':\n ${cypher}`);
44
+ }
45
+ /**
46
+ * Assert that a Cypher string does NOT contain a specific clause/pattern.
47
+ */
48
+ static assertNotContainsClause(cypher, clauseTypeOrPattern, pattern) {
49
+ const effectivePattern = pattern ?? clauseTypeOrPattern;
50
+ if (cypher.includes(effectivePattern))
51
+ throw new Error(`Cypher unexpectedly contains pattern '${effectivePattern}':\n ${cypher}`);
52
+ }
53
+ /**
54
+ * Assert parameter values match expected.
55
+ * Only checks the keys present in expected (doesn't require exact match on all params).
56
+ */
57
+ static assertParams(actual, expected) {
58
+ for (const key of Object.keys(expected)) {
59
+ if (!(key in actual))
60
+ throw new Error(`Missing param key '${key}' in actual params: ${JSON.stringify(actual)}`);
61
+ const actualVal = JSON.stringify(actual[key]);
62
+ const expectedVal = JSON.stringify(expected[key]);
63
+ if (actualVal !== expectedVal)
64
+ throw new Error(`Param '${key}' mismatch:\n Actual: ${actualVal}\n Expected: ${expectedVal}`);
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=cypher-assert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cypher-assert.js","sourceRoot":"","sources":["../../../src/testing/cypher-assert.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,YAAY;IACvB;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,MAAc;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;QACvC,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAClC,2BAA2B,EAC3B,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC;YAExD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;QAC1B,CAAC,CACF,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAAC,MAAc,EAAE,QAAgB;QAC7D,MAAM,gBAAgB,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,kBAAkB,GAAG,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,gBAAgB,KAAK,kBAAkB;YACzC,MAAM,IAAI,KAAK,CACb,iCAAiC,gBAAgB,iBAAiB,kBAAkB,EAAE,CACvF,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,oBAAoB,CACzB,MAAc,EACd,UAAkB,EAClB,OAAe;QAEf,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,mCAAmC,UAAU,SAAS,MAAM,EAAE,CAC/D,CAAC;QAEJ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,oCAAoC,OAAO,SAAS,MAAM,EAAE,CAC7D,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAC5B,MAAc,EACd,mBAA2B,EAC3B,OAAgB;QAEhB,MAAM,gBAAgB,GAAG,OAAO,IAAI,mBAAmB,CAAC;QACxD,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,yCAAyC,gBAAgB,SAAS,MAAM,EAAE,CAC3E,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY,CACjB,MAA+B,EAC/B,QAAiC;QAEjC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC;gBAClB,MAAM,IAAI,KAAK,CACb,sBAAsB,GAAG,uBAAuB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CACzE,CAAC;YAEJ,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAClD,IAAI,SAAS,KAAK,WAAW;gBAC3B,MAAM,IAAI,KAAK,CACb,UAAU,GAAG,4BAA4B,SAAS,iBAAiB,WAAW,EAAE,CACjF,CAAC;QACN,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export { CypherAssert } from './cypher-assert';
2
+ export { Neo4jRecordFactory } from './neo4j-record-factory';
3
+ export { SelectionSetFactory } from './selection-set-factory';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { CypherAssert } from './cypher-assert';
2
+ export { Neo4jRecordFactory } from './neo4j-record-factory';
3
+ export { SelectionSetFactory } from './selection-set-factory';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { Integer, Record as Neo4jRecord } from 'neo4j-driver';
2
+ /**
3
+ * Factory for creating mock Neo4j Record objects for testing.
4
+ */
5
+ export declare class Neo4jRecordFactory {
6
+ /**
7
+ * Create a Neo4j Record from a plain object.
8
+ * @param data - Object with keys as field names and values as properties
9
+ * @returns A Neo4j Record instance with get(), toObject(), and keys
10
+ */
11
+ static create(data: Record<string, unknown>): Neo4jRecord;
12
+ /**
13
+ * Create a Neo4j Integer value.
14
+ */
15
+ static integer(value: number): Integer;
16
+ /**
17
+ * Create a Neo4j DateTime value from an ISO string.
18
+ */
19
+ static dateTime(isoString: string): unknown;
20
+ /**
21
+ * Create a mock Neo4j Node.
22
+ */
23
+ static node(labels: string[], properties: Record<string, unknown>): unknown;
24
+ }
25
+ //# sourceMappingURL=neo4j-record-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo4j-record-factory.d.ts","sourceRoot":"","sources":["../../../src/testing/neo4j-record-factory.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAMzD;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAc3C;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;CAG5E"}