@graphty/graph-io 0.3.47 → 0.3.48

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 (460) hide show
  1. package/dist/chunks/{approximations-wWjCRzKj.js → approximations-C2riR4NT.js} +2 -2
  2. package/dist/chunks/{approximations-wWjCRzKj.js.map → approximations-C2riR4NT.js.map} +1 -1
  3. package/dist/chunks/{block-DiGq58c3.js → block-Cu22ewuS.js} +92 -21
  4. package/dist/chunks/block-Cu22ewuS.js.map +1 -0
  5. package/dist/chunks/{choose--jM0yYCo.js → choose-Cdx6Enl2.js} +3 -3
  6. package/dist/chunks/{choose--jM0yYCo.js.map → choose-Cdx6Enl2.js.map} +1 -1
  7. package/dist/chunks/codes-CV_Bhcyi.js +153 -0
  8. package/dist/chunks/codes-CV_Bhcyi.js.map +1 -0
  9. package/dist/chunks/{constants-BKwqelYD.js → constants-D0LqcsLJ.js} +2 -2
  10. package/dist/chunks/{constants-BKwqelYD.js.map → constants-D0LqcsLJ.js.map} +1 -1
  11. package/dist/chunks/context-cgmmOxZ2.js +663 -0
  12. package/dist/chunks/context-cgmmOxZ2.js.map +1 -0
  13. package/dist/chunks/credentials-BiQsnMTb.js +347 -0
  14. package/dist/chunks/credentials-BiQsnMTb.js.map +1 -0
  15. package/dist/chunks/cx-export-BEeF6ymo.js +259 -0
  16. package/dist/chunks/cx-export-BEeF6ymo.js.map +1 -0
  17. package/dist/chunks/descriptor-BJ-W0Jd-.js +137 -0
  18. package/dist/chunks/descriptor-BJ-W0Jd-.js.map +1 -0
  19. package/dist/chunks/descriptor-C-YDhtsn.js +48 -0
  20. package/dist/chunks/descriptor-C-YDhtsn.js.map +1 -0
  21. package/dist/chunks/{emit-CwU8cUmG.js → emit-CD8xnY8s.js} +70 -10
  22. package/dist/chunks/emit-CD8xnY8s.js.map +1 -0
  23. package/dist/chunks/{escape-CgzxiYPg.js → escape-DH2Egt-l.js} +12 -12
  24. package/dist/chunks/{escape-CgzxiYPg.js.map → escape-DH2Egt-l.js.map} +1 -1
  25. package/dist/chunks/{export-BvqAXCKh.js → export-CZ7VRm4I.js} +53 -1443
  26. package/dist/chunks/export-CZ7VRm4I.js.map +1 -0
  27. package/dist/chunks/{exporter-DndFlGSa.js → exporter-BIdaoIgh.js} +7 -6
  28. package/dist/chunks/{exporter-DndFlGSa.js.map → exporter-BIdaoIgh.js.map} +1 -1
  29. package/dist/chunks/{exporter-CJgfhF-l.js → exporter-ChjL5fmP.js} +8 -7
  30. package/dist/chunks/{exporter-CJgfhF-l.js.map → exporter-ChjL5fmP.js.map} +1 -1
  31. package/dist/chunks/{exporter--Mk9gXCJ.js → exporter-Dcw7Ldtq.js} +6 -4
  32. package/dist/chunks/{exporter--Mk9gXCJ.js.map → exporter-Dcw7Ldtq.js.map} +1 -1
  33. package/dist/chunks/exporter-DtVU80Fa.js +1008 -0
  34. package/dist/chunks/exporter-DtVU80Fa.js.map +1 -0
  35. package/dist/chunks/{exporter-CrDWIyiq.js → exporter-bxxjOrDZ.js} +11 -9
  36. package/dist/chunks/{exporter-CrDWIyiq.js.map → exporter-bxxjOrDZ.js.map} +1 -1
  37. package/dist/chunks/format-BMS-1Nxb.js +64 -0
  38. package/dist/chunks/format-BMS-1Nxb.js.map +1 -0
  39. package/dist/chunks/{generic-Dq1ntt9q.js → generic-CP6YD34u.js} +4 -4
  40. package/dist/chunks/{generic-Dq1ntt9q.js.map → generic-CP6YD34u.js.map} +1 -1
  41. package/dist/chunks/{importer-DiZRmOQG.js → importer-B87_fmVx.js} +13 -17
  42. package/dist/chunks/importer-B87_fmVx.js.map +1 -0
  43. package/dist/chunks/{importer-BSvfrX_h.js → importer-Bji2MeWr.js} +18 -1014
  44. package/dist/chunks/importer-Bji2MeWr.js.map +1 -0
  45. package/dist/chunks/{importer-COTK9Tsl.js → importer-CB_zV5_L.js} +14 -11
  46. package/dist/chunks/importer-CB_zV5_L.js.map +1 -0
  47. package/dist/chunks/{importer-e6LGpqHB.js → importer-CVT-JyDE.js} +12 -9
  48. package/dist/chunks/importer-CVT-JyDE.js.map +1 -0
  49. package/dist/chunks/{importer-yh_aBCU6.js → importer-Cyy6UseH.js} +7 -6
  50. package/dist/chunks/{importer-yh_aBCU6.js.map → importer-Cyy6UseH.js.map} +1 -1
  51. package/dist/chunks/{importer-iFYPEKaJ.js → importer-DPZDN40-.js} +14 -10
  52. package/dist/chunks/{importer-iFYPEKaJ.js.map → importer-DPZDN40-.js.map} +1 -1
  53. package/dist/chunks/{importer-CMmeMWlC.js → importer-e3huMZbm.js} +8 -260
  54. package/dist/chunks/importer-e3huMZbm.js.map +1 -0
  55. package/dist/chunks/input-Ccg9I22A.js +1397 -0
  56. package/dist/chunks/input-Ccg9I22A.js.map +1 -0
  57. package/dist/chunks/{json-elements-DJZRZ6jd.js → json-elements-By172SVq.js} +4 -4
  58. package/dist/chunks/{json-elements-DJZRZ6jd.js.map → json-elements-By172SVq.js.map} +1 -1
  59. package/dist/chunks/{lexicon-CT69Kd87.js → lexicon-u2SI5xcx.js} +19 -5
  60. package/dist/chunks/lexicon-u2SI5xcx.js.map +1 -0
  61. package/dist/chunks/{ontology-export-G4MqRdux.js → ontology-export-BwgMyuF0.js} +4 -3
  62. package/dist/chunks/{ontology-export-G4MqRdux.js.map → ontology-export-BwgMyuF0.js.map} +1 -1
  63. package/dist/chunks/{records-CiaWZrFH.js → records-Cgvxz-Vx.js} +2 -2
  64. package/dist/chunks/{records-CiaWZrFH.js.map → records-Cgvxz-Vx.js.map} +1 -1
  65. package/dist/chunks/{format-BpQBx8MZ.js → report-CgdsL9Hb.js} +72 -129
  66. package/dist/chunks/report-CgdsL9Hb.js.map +1 -0
  67. package/dist/chunks/sigv4-LkAzsLAu.js +247 -0
  68. package/dist/chunks/sigv4-LkAzsLAu.js.map +1 -0
  69. package/dist/chunks/{styles-BQnsga7p.js → styles-CaABMoO1.js} +76 -43
  70. package/dist/chunks/styles-CaABMoO1.js.map +1 -0
  71. package/dist/chunks/{styles-D3fRphrO.js → styles-P_gmFAOi.js} +101 -21
  72. package/dist/chunks/styles-P_gmFAOi.js.map +1 -0
  73. package/dist/chunks/{styles-yed-BF5x3_Y5.js → styles-yed-Cs1nmrjn.js} +60 -20
  74. package/dist/chunks/styles-yed-Cs1nmrjn.js.map +1 -0
  75. package/dist/chunks/{text-CzJNFOS9.js → text-BuKQVMz2.js} +2 -2
  76. package/dist/chunks/{text-CzJNFOS9.js.map → text-BuKQVMz2.js.map} +1 -1
  77. package/dist/chunks/{writer-DMKvthQE.js → writer-DvHTl36J.js} +5 -4
  78. package/dist/chunks/writer-DvHTl36J.js.map +1 -0
  79. package/dist/csv.js +7 -5
  80. package/dist/csv.js.map +1 -1
  81. package/dist/cx.js +5 -4
  82. package/dist/cx.js.map +1 -1
  83. package/dist/cx2.js +2 -2
  84. package/dist/cys.js +1 -1
  85. package/dist/dot.js +2 -2
  86. package/dist/gexf.js +7 -5
  87. package/dist/gexf.js.map +1 -1
  88. package/dist/gml.js +16 -13
  89. package/dist/gml.js.map +1 -1
  90. package/dist/graph-io.js +1181 -224
  91. package/dist/graph-io.js.map +1 -1
  92. package/dist/graphml.js +3 -3
  93. package/dist/json.js +1 -1
  94. package/dist/neo4j.js +6 -4
  95. package/dist/neo4j.js.map +1 -1
  96. package/dist/obo.js +1 -1
  97. package/dist/pajek.js +1 -1
  98. package/dist/sources-cypher.d.ts +1 -0
  99. package/dist/sources-cypher.js +1236 -0
  100. package/dist/sources-cypher.js.map +1 -0
  101. package/dist/sources-ndex.d.ts +1 -0
  102. package/dist/sources-ndex.js +278 -0
  103. package/dist/sources-ndex.js.map +1 -0
  104. package/dist/sources-rest.d.ts +1 -0
  105. package/dist/sources-rest.js +1367 -0
  106. package/dist/sources-rest.js.map +1 -0
  107. package/dist/src/common/report.d.ts +6 -3
  108. package/dist/src/common/report.d.ts.map +1 -1
  109. package/dist/src/common/report.js +15 -9
  110. package/dist/src/common/report.js.map +1 -1
  111. package/dist/src/formats/cx/styles.d.ts.map +1 -1
  112. package/dist/src/formats/cx/styles.js +1 -0
  113. package/dist/src/formats/cx/styles.js.map +1 -1
  114. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  115. package/dist/src/formats/dot/styles.js +3 -1
  116. package/dist/src/formats/dot/styles.js.map +1 -1
  117. package/dist/src/formats/gexf/styles.d.ts +29 -12
  118. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  119. package/dist/src/formats/gexf/styles.js +160 -31
  120. package/dist/src/formats/gexf/styles.js.map +1 -1
  121. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  122. package/dist/src/formats/gml/styles.js +5 -4
  123. package/dist/src/formats/gml/styles.js.map +1 -1
  124. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  125. package/dist/src/formats/graphml/styles-plain.js +3 -3
  126. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  127. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  128. package/dist/src/formats/graphml/styles-yed.js +89 -19
  129. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  130. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  131. package/dist/src/formats/pajek/styles.js +1 -0
  132. package/dist/src/formats/pajek/styles.js.map +1 -1
  133. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  134. package/dist/src/formats/xgmml/styles.js +1 -0
  135. package/dist/src/formats/xgmml/styles.js.map +1 -1
  136. package/dist/src/index.d.ts +8 -1
  137. package/dist/src/index.d.ts.map +1 -1
  138. package/dist/src/index.js +9 -1
  139. package/dist/src/index.js.map +1 -1
  140. package/dist/src/registry.d.ts +173 -1
  141. package/dist/src/registry.d.ts.map +1 -1
  142. package/dist/src/registry.js +196 -1
  143. package/dist/src/registry.js.map +1 -1
  144. package/dist/src/sources/builtins.d.ts +11 -0
  145. package/dist/src/sources/builtins.d.ts.map +1 -0
  146. package/dist/src/sources/builtins.js +47 -0
  147. package/dist/src/sources/builtins.js.map +1 -0
  148. package/dist/src/sources/codes.d.ts +230 -0
  149. package/dist/src/sources/codes.d.ts.map +1 -0
  150. package/dist/src/sources/codes.js +58 -0
  151. package/dist/src/sources/codes.js.map +1 -0
  152. package/dist/src/sources/context.d.ts +112 -0
  153. package/dist/src/sources/context.d.ts.map +1 -0
  154. package/dist/src/sources/context.js +739 -0
  155. package/dist/src/sources/context.js.map +1 -0
  156. package/dist/src/sources/credentials.d.ts +179 -0
  157. package/dist/src/sources/credentials.d.ts.map +1 -0
  158. package/dist/src/sources/credentials.js +301 -0
  159. package/dist/src/sources/credentials.js.map +1 -0
  160. package/dist/src/sources/cypher/descriptor.d.ts +21 -0
  161. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -0
  162. package/dist/src/sources/cypher/descriptor.js +119 -0
  163. package/dist/src/sources/cypher/descriptor.js.map +1 -0
  164. package/dist/src/sources/cypher/flatten.d.ts +72 -0
  165. package/dist/src/sources/cypher/flatten.d.ts.map +1 -0
  166. package/dist/src/sources/cypher/flatten.js +279 -0
  167. package/dist/src/sources/cypher/flatten.js.map +1 -0
  168. package/dist/src/sources/cypher/index.d.ts +33 -0
  169. package/dist/src/sources/cypher/index.d.ts.map +1 -0
  170. package/dist/src/sources/cypher/index.js +405 -0
  171. package/dist/src/sources/cypher/index.js.map +1 -0
  172. package/dist/src/sources/cypher/params.d.ts +40 -0
  173. package/dist/src/sources/cypher/params.d.ts.map +1 -0
  174. package/dist/src/sources/cypher/params.js +6 -0
  175. package/dist/src/sources/cypher/params.js.map +1 -0
  176. package/dist/src/sources/cypher/profiles.d.ts +44 -0
  177. package/dist/src/sources/cypher/profiles.d.ts.map +1 -0
  178. package/dist/src/sources/cypher/profiles.js +61 -0
  179. package/dist/src/sources/cypher/profiles.js.map +1 -0
  180. package/dist/src/sources/cypher/query-builder.d.ts +106 -0
  181. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -0
  182. package/dist/src/sources/cypher/query-builder.js +236 -0
  183. package/dist/src/sources/cypher/query-builder.js.map +1 -0
  184. package/dist/src/sources/cypher/transports/bolt.d.ts +21 -0
  185. package/dist/src/sources/cypher/transports/bolt.d.ts.map +1 -0
  186. package/dist/src/sources/cypher/transports/bolt.js +185 -0
  187. package/dist/src/sources/cypher/transports/bolt.js.map +1 -0
  188. package/dist/src/sources/cypher/transports/neptune-analytics.d.ts +15 -0
  189. package/dist/src/sources/cypher/transports/neptune-analytics.d.ts.map +1 -0
  190. package/dist/src/sources/cypher/transports/neptune-analytics.js +38 -0
  191. package/dist/src/sources/cypher/transports/neptune-analytics.js.map +1 -0
  192. package/dist/src/sources/cypher/transports/neptune-https.d.ts +31 -0
  193. package/dist/src/sources/cypher/transports/neptune-https.d.ts.map +1 -0
  194. package/dist/src/sources/cypher/transports/neptune-https.js +104 -0
  195. package/dist/src/sources/cypher/transports/neptune-https.js.map +1 -0
  196. package/dist/src/sources/cypher/transports/query-api.d.ts +14 -0
  197. package/dist/src/sources/cypher/transports/query-api.d.ts.map +1 -0
  198. package/dist/src/sources/cypher/transports/query-api.js +80 -0
  199. package/dist/src/sources/cypher/transports/query-api.js.map +1 -0
  200. package/dist/src/sources/cypher/transports/transport.d.ts +78 -0
  201. package/dist/src/sources/cypher/transports/transport.d.ts.map +1 -0
  202. package/dist/src/sources/cypher/transports/transport.js +77 -0
  203. package/dist/src/sources/cypher/transports/transport.js.map +1 -0
  204. package/dist/src/sources/cypher/types-map.d.ts +91 -0
  205. package/dist/src/sources/cypher/types-map.d.ts.map +1 -0
  206. package/dist/src/sources/cypher/types-map.js +306 -0
  207. package/dist/src/sources/cypher/types-map.js.map +1 -0
  208. package/dist/src/sources/define.d.ts +47 -0
  209. package/dist/src/sources/define.d.ts.map +1 -0
  210. package/dist/src/sources/define.js +173 -0
  211. package/dist/src/sources/define.js.map +1 -0
  212. package/dist/src/sources/fail.d.ts +33 -0
  213. package/dist/src/sources/fail.d.ts.map +1 -0
  214. package/dist/src/sources/fail.js +49 -0
  215. package/dist/src/sources/fail.js.map +1 -0
  216. package/dist/src/sources/ids.d.ts +64 -0
  217. package/dist/src/sources/ids.d.ts.map +1 -0
  218. package/dist/src/sources/ids.js +64 -0
  219. package/dist/src/sources/ids.js.map +1 -0
  220. package/dist/src/sources/ndex/client.d.ts +31 -0
  221. package/dist/src/sources/ndex/client.d.ts.map +1 -0
  222. package/dist/src/sources/ndex/client.js +90 -0
  223. package/dist/src/sources/ndex/client.js.map +1 -0
  224. package/dist/src/sources/ndex/descriptor.d.ts +10 -0
  225. package/dist/src/sources/ndex/descriptor.d.ts.map +1 -0
  226. package/dist/src/sources/ndex/descriptor.js +55 -0
  227. package/dist/src/sources/ndex/descriptor.js.map +1 -0
  228. package/dist/src/sources/ndex/expand.d.ts +20 -0
  229. package/dist/src/sources/ndex/expand.d.ts.map +1 -0
  230. package/dist/src/sources/ndex/expand.js +87 -0
  231. package/dist/src/sources/ndex/expand.js.map +1 -0
  232. package/dist/src/sources/ndex/index.d.ts +25 -0
  233. package/dist/src/sources/ndex/index.d.ts.map +1 -0
  234. package/dist/src/sources/ndex/index.js +191 -0
  235. package/dist/src/sources/ndex/index.js.map +1 -0
  236. package/dist/src/sources/ndex/params.d.ts +17 -0
  237. package/dist/src/sources/ndex/params.d.ts.map +1 -0
  238. package/dist/src/sources/ndex/params.js +6 -0
  239. package/dist/src/sources/ndex/params.js.map +1 -0
  240. package/dist/src/sources/ndex/share-url.d.ts +40 -0
  241. package/dist/src/sources/ndex/share-url.d.ts.map +1 -0
  242. package/dist/src/sources/ndex/share-url.js +64 -0
  243. package/dist/src/sources/ndex/share-url.js.map +1 -0
  244. package/dist/src/sources/params.d.ts +28 -0
  245. package/dist/src/sources/params.d.ts.map +1 -0
  246. package/dist/src/sources/params.js +6 -0
  247. package/dist/src/sources/params.js.map +1 -0
  248. package/dist/src/sources/registry.d.ts +118 -0
  249. package/dist/src/sources/registry.d.ts.map +1 -0
  250. package/dist/src/sources/registry.js +193 -0
  251. package/dist/src/sources/registry.js.map +1 -0
  252. package/dist/src/sources/rest/descriptor.d.ts +16 -0
  253. package/dist/src/sources/rest/descriptor.d.ts.map +1 -0
  254. package/dist/src/sources/rest/descriptor.js +71 -0
  255. package/dist/src/sources/rest/descriptor.js.map +1 -0
  256. package/dist/src/sources/rest/index.d.ts +14 -0
  257. package/dist/src/sources/rest/index.d.ts.map +1 -0
  258. package/dist/src/sources/rest/index.js +13 -0
  259. package/dist/src/sources/rest/index.js.map +1 -0
  260. package/dist/src/sources/rest/mapping.d.ts +30 -0
  261. package/dist/src/sources/rest/mapping.d.ts.map +1 -0
  262. package/dist/src/sources/rest/mapping.js +362 -0
  263. package/dist/src/sources/rest/mapping.js.map +1 -0
  264. package/dist/src/sources/rest/openalex.d.ts +27 -0
  265. package/dist/src/sources/rest/openalex.d.ts.map +1 -0
  266. package/dist/src/sources/rest/openalex.js +269 -0
  267. package/dist/src/sources/rest/openalex.js.map +1 -0
  268. package/dist/src/sources/rest/paging.d.ts +53 -0
  269. package/dist/src/sources/rest/paging.d.ts.map +1 -0
  270. package/dist/src/sources/rest/paging.js +138 -0
  271. package/dist/src/sources/rest/paging.js.map +1 -0
  272. package/dist/src/sources/rest/params.d.ts +216 -0
  273. package/dist/src/sources/rest/params.d.ts.map +1 -0
  274. package/dist/src/sources/rest/params.js +7 -0
  275. package/dist/src/sources/rest/params.js.map +1 -0
  276. package/dist/src/sources/rest/records.d.ts +41 -0
  277. package/dist/src/sources/rest/records.d.ts.map +1 -0
  278. package/dist/src/sources/rest/records.js +240 -0
  279. package/dist/src/sources/rest/records.js.map +1 -0
  280. package/dist/src/sources/rest/samples/deps-dev.d.ts +10 -0
  281. package/dist/src/sources/rest/samples/deps-dev.d.ts.map +1 -0
  282. package/dist/src/sources/rest/samples/deps-dev.js +47 -0
  283. package/dist/src/sources/rest/samples/deps-dev.js.map +1 -0
  284. package/dist/src/sources/rest/samples/string.d.ts +9 -0
  285. package/dist/src/sources/rest/samples/string.d.ts.map +1 -0
  286. package/dist/src/sources/rest/samples/string.js +42 -0
  287. package/dist/src/sources/rest/samples/string.js.map +1 -0
  288. package/dist/src/sources/rest/selectors.d.ts +41 -0
  289. package/dist/src/sources/rest/selectors.d.ts.map +1 -0
  290. package/dist/src/sources/rest/selectors.js +81 -0
  291. package/dist/src/sources/rest/selectors.js.map +1 -0
  292. package/dist/src/sources/rest/source.d.ts +67 -0
  293. package/dist/src/sources/rest/source.d.ts.map +1 -0
  294. package/dist/src/sources/rest/source.js +635 -0
  295. package/dist/src/sources/rest/source.js.map +1 -0
  296. package/dist/src/sources/rest/templates.d.ts +38 -0
  297. package/dist/src/sources/rest/templates.d.ts.map +1 -0
  298. package/dist/src/sources/rest/templates.js +125 -0
  299. package/dist/src/sources/rest/templates.js.map +1 -0
  300. package/dist/src/sources/run.d.ts +93 -0
  301. package/dist/src/sources/run.d.ts.map +1 -0
  302. package/dist/src/sources/run.js +673 -0
  303. package/dist/src/sources/run.js.map +1 -0
  304. package/dist/src/sources/sha256.d.ts +12 -0
  305. package/dist/src/sources/sha256.d.ts.map +1 -0
  306. package/dist/src/sources/sha256.js +95 -0
  307. package/dist/src/sources/sha256.js.map +1 -0
  308. package/dist/src/sources/sigv4.d.ts +24 -0
  309. package/dist/src/sources/sigv4.d.ts.map +1 -0
  310. package/dist/src/sources/sigv4.js +182 -0
  311. package/dist/src/sources/sigv4.js.map +1 -0
  312. package/dist/src/sources/testing.d.ts +96 -0
  313. package/dist/src/sources/testing.d.ts.map +1 -0
  314. package/dist/src/sources/testing.js +138 -0
  315. package/dist/src/sources/testing.js.map +1 -0
  316. package/dist/src/sources/types.d.ts +665 -0
  317. package/dist/src/sources/types.d.ts.map +1 -0
  318. package/dist/src/sources/types.js +10 -0
  319. package/dist/src/sources/types.js.map +1 -0
  320. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  321. package/dist/src/styles/canon/enums.js +1 -0
  322. package/dist/src/styles/canon/enums.js.map +1 -1
  323. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  324. package/dist/src/styles/cyjs/cascade.js +68 -2
  325. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  326. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  327. package/dist/src/styles/cyjs/defaults-table.js +2 -0
  328. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  329. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  330. package/dist/src/styles/cyjs/emit.js +18 -7
  331. package/dist/src/styles/cyjs/emit.js.map +1 -1
  332. package/dist/src/styles/cyjs/mappers.d.ts +4 -1
  333. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  334. package/dist/src/styles/cyjs/mappers.js +2 -0
  335. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  336. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  337. package/dist/src/styles/cytoscape/emit.js +59 -7
  338. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  339. package/dist/src/styles/cytoscape/lexicon.d.ts +6 -0
  340. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  341. package/dist/src/styles/cytoscape/lexicon.js +26 -2
  342. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  343. package/dist/src/styles/cytoscape/resolve.d.ts +4 -1
  344. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  345. package/dist/src/styles/cytoscape/resolve.js +10 -6
  346. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  347. package/dist/src/styles/cytoscape/translate.d.ts.map +1 -1
  348. package/dist/src/styles/cytoscape/translate.js +10 -10
  349. package/dist/src/styles/cytoscape/translate.js.map +1 -1
  350. package/dist/src/styles/defaults.d.ts +30 -0
  351. package/dist/src/styles/defaults.d.ts.map +1 -1
  352. package/dist/src/styles/defaults.js +45 -4
  353. package/dist/src/styles/defaults.js.map +1 -1
  354. package/dist/src/styles/io/block.d.ts.map +1 -1
  355. package/dist/src/styles/io/block.js +9 -0
  356. package/dist/src/styles/io/block.js.map +1 -1
  357. package/dist/src/styles/io/writer.d.ts.map +1 -1
  358. package/dist/src/styles/io/writer.js +7 -3
  359. package/dist/src/styles/io/writer.js.map +1 -1
  360. package/dist/src/styles/plan/resolve.d.ts +2 -1
  361. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  362. package/dist/src/styles/plan/resolve.js +13 -2
  363. package/dist/src/styles/plan/resolve.js.map +1 -1
  364. package/dist/src/styles/types.d.ts +19 -2
  365. package/dist/src/styles/types.d.ts.map +1 -1
  366. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  367. package/dist/src/styles/vocabulary.js +15 -1
  368. package/dist/src/styles/vocabulary.js.map +1 -1
  369. package/dist/src/types.d.ts +19 -5
  370. package/dist/src/types.d.ts.map +1 -1
  371. package/dist/src/types.js.map +1 -1
  372. package/dist/styles.js +11 -11
  373. package/dist/xgmml.js +3 -3
  374. package/docs/samples/people.json +6 -0
  375. package/package.json +29 -4
  376. package/src/common/report.ts +27 -7
  377. package/src/formats/cx/styles.ts +1 -0
  378. package/src/formats/dot/styles.ts +3 -1
  379. package/src/formats/gexf/styles.ts +185 -37
  380. package/src/formats/gml/styles.ts +5 -4
  381. package/src/formats/graphml/styles-plain.ts +3 -9
  382. package/src/formats/graphml/styles-yed.ts +93 -20
  383. package/src/formats/pajek/styles.ts +1 -0
  384. package/src/formats/xgmml/styles.ts +1 -0
  385. package/src/index.ts +90 -0
  386. package/src/registry.ts +326 -1
  387. package/src/sources/builtins.ts +56 -0
  388. package/src/sources/codes.ts +235 -0
  389. package/src/sources/context.ts +893 -0
  390. package/src/sources/credentials.ts +409 -0
  391. package/src/sources/cypher/descriptor.ts +125 -0
  392. package/src/sources/cypher/flatten.ts +323 -0
  393. package/src/sources/cypher/index.ts +498 -0
  394. package/src/sources/cypher/params.ts +41 -0
  395. package/src/sources/cypher/profiles.ts +78 -0
  396. package/src/sources/cypher/query-builder.ts +294 -0
  397. package/src/sources/cypher/transports/bolt.ts +228 -0
  398. package/src/sources/cypher/transports/neptune-analytics.ts +41 -0
  399. package/src/sources/cypher/transports/neptune-https.ts +122 -0
  400. package/src/sources/cypher/transports/query-api.ts +100 -0
  401. package/src/sources/cypher/transports/transport.ts +139 -0
  402. package/src/sources/cypher/types-map.ts +418 -0
  403. package/src/sources/define.ts +195 -0
  404. package/src/sources/fail.ts +70 -0
  405. package/src/sources/ids.ts +74 -0
  406. package/src/sources/ndex/client.ts +102 -0
  407. package/src/sources/ndex/descriptor.ts +64 -0
  408. package/src/sources/ndex/expand.ts +100 -0
  409. package/src/sources/ndex/index.ts +235 -0
  410. package/src/sources/ndex/params.ts +17 -0
  411. package/src/sources/ndex/share-url.ts +84 -0
  412. package/src/sources/params.ts +29 -0
  413. package/src/sources/registry.ts +325 -0
  414. package/src/sources/rest/descriptor.ts +74 -0
  415. package/src/sources/rest/index.ts +22 -0
  416. package/src/sources/rest/mapping.ts +401 -0
  417. package/src/sources/rest/openalex.ts +288 -0
  418. package/src/sources/rest/paging.ts +180 -0
  419. package/src/sources/rest/params.ts +243 -0
  420. package/src/sources/rest/records.ts +289 -0
  421. package/src/sources/rest/samples/deps-dev.ts +49 -0
  422. package/src/sources/rest/samples/string.ts +44 -0
  423. package/src/sources/rest/selectors.ts +91 -0
  424. package/src/sources/rest/source.ts +760 -0
  425. package/src/sources/rest/templates.ts +151 -0
  426. package/src/sources/run.ts +793 -0
  427. package/src/sources/sha256.ts +99 -0
  428. package/src/sources/sigv4.ts +207 -0
  429. package/src/sources/testing.ts +210 -0
  430. package/src/sources/types.ts +741 -0
  431. package/src/styles/canon/enums.ts +1 -0
  432. package/src/styles/cyjs/cascade.ts +81 -2
  433. package/src/styles/cyjs/defaults-table.ts +2 -0
  434. package/src/styles/cyjs/emit.ts +18 -7
  435. package/src/styles/cyjs/mappers.ts +6 -1
  436. package/src/styles/cytoscape/emit.ts +61 -7
  437. package/src/styles/cytoscape/lexicon.ts +28 -2
  438. package/src/styles/cytoscape/resolve.ts +22 -6
  439. package/src/styles/cytoscape/translate.ts +11 -11
  440. package/src/styles/defaults.ts +93 -4
  441. package/src/styles/io/block.ts +10 -0
  442. package/src/styles/io/writer.ts +8 -3
  443. package/src/styles/plan/resolve.ts +14 -2
  444. package/src/styles/types.ts +28 -2
  445. package/src/styles/vocabulary.ts +15 -1
  446. package/src/types.ts +19 -5
  447. package/dist/chunks/block-DiGq58c3.js.map +0 -1
  448. package/dist/chunks/emit-CwU8cUmG.js.map +0 -1
  449. package/dist/chunks/export-BvqAXCKh.js.map +0 -1
  450. package/dist/chunks/format-BpQBx8MZ.js.map +0 -1
  451. package/dist/chunks/importer-BSvfrX_h.js.map +0 -1
  452. package/dist/chunks/importer-CMmeMWlC.js.map +0 -1
  453. package/dist/chunks/importer-COTK9Tsl.js.map +0 -1
  454. package/dist/chunks/importer-DiZRmOQG.js.map +0 -1
  455. package/dist/chunks/importer-e6LGpqHB.js.map +0 -1
  456. package/dist/chunks/lexicon-CT69Kd87.js.map +0 -1
  457. package/dist/chunks/styles-BQnsga7p.js.map +0 -1
  458. package/dist/chunks/styles-D3fRphrO.js.map +0 -1
  459. package/dist/chunks/styles-yed-BF5x3_Y5.js.map +0 -1
  460. package/dist/chunks/writer-DMKvthQE.js.map +0 -1
@@ -0,0 +1,106 @@
1
+ /**
2
+ * The one query builder of the Cypher source (design sections 11 and 12.2). Caller values travel
3
+ * as query parameters, never spliced. What Cypher cannot parameterize -- labels, relationship
4
+ * types, property keys, variable-length bounds and LIMIT -- is either backtick-quoted (an
5
+ * identifier, a backtick inside doubled) or inlined as a checked integer. The generated queries
6
+ * differ between servers only in the id expression.
7
+ */
8
+ import { type ImportReportBuilder } from "../../common/report.js";
9
+ import { type CypherProfile } from "./profiles.js";
10
+ /** The deepest neighborhood a generated query asks for. */
11
+ export declare const MAX_DEPTH = 10;
12
+ /** The largest page of mode "all". */
13
+ export declare const MAX_PAGE_SIZE = 100000;
14
+ /** The page size of mode "all" when the caller gives none. */
15
+ export declare const DEFAULT_PAGE_SIZE = 1000;
16
+ /**
17
+ * Quote one Cypher identifier (a label, relationship type or property key) for a query: wrapped in
18
+ * backticks, with every backtick inside doubled, so no value can end the identifier early. An
19
+ * empty name, or one with a NUL character, is refused (E_SOURCE_PARAM, reason "identifier").
20
+ * Experimental.
21
+ * @param name - the identifier
22
+ * @returns the quoted identifier
23
+ * @example
24
+ * ```ts
25
+ * cypherIdentifier("Person"); // "`Person`"
26
+ * cypherIdentifier("odd`name"); // "`odd``name`"
27
+ * ```
28
+ * @category Network sources
29
+ */
30
+ export declare function cypherIdentifier(name: string): string;
31
+ /**
32
+ * Quote an identifier a parameter gave, failing the load when it cannot be.
33
+ * @param name - the identifier
34
+ * @param param - the parameter it came from
35
+ * @param report - the load's report
36
+ * @returns the quoted identifier
37
+ */
38
+ export declare function quoted(name: unknown, param: string, report: ImportReportBuilder): string;
39
+ /**
40
+ * An integer to inline, checked to lie in its range.
41
+ * @param value - the value
42
+ * @param name - the parameter it came from
43
+ * @param min - the smallest allowed
44
+ * @param max - the largest allowed
45
+ * @param report - the load's report
46
+ * @returns the integer, as query text
47
+ */
48
+ export declare function checkedInteger(value: unknown, name: string, min: number, max: number, report: ImportReportBuilder): string;
49
+ /** What narrows a generated query: compiled into it, so filtering happens at the source. */
50
+ export interface QueryFilters {
51
+ /** Quoted labels; a node must have one of them. */
52
+ readonly labels: readonly string[];
53
+ /** Quoted relationship types. */
54
+ readonly relationshipTypes: readonly string[];
55
+ /** The quoted id property, or null for the server's id. */
56
+ readonly idProperty: string | null;
57
+ }
58
+ /**
59
+ * One page of the nodes of mode "all", ordered by the id expression (keyset paging, never SKIP).
60
+ * @param profile - the server's profile
61
+ * @param filters - the filters
62
+ * @param pageSize - the checked page size, as text
63
+ * @param after - whether the page starts after `$after`
64
+ * @param degree - whether to add the degree hint
65
+ * @returns the statement; it reads `$after`
66
+ */
67
+ export declare function nodePage(profile: CypherProfile, filters: QueryFilters, pageSize: string, after: boolean, degree: boolean): string;
68
+ /**
69
+ * One page of the relationships of mode "all", with their end nodes, ordered by the relationship
70
+ * id expression.
71
+ * @param profile - the server's profile
72
+ * @param filters - the filters
73
+ * @param pageSize - the checked page size, as text
74
+ * @param after - whether the page starts after `$after`
75
+ * @returns the statement; it reads `$after`
76
+ */
77
+ export declare function edgePage(profile: CypherProfile, filters: QueryFilters, pageSize: string, after: boolean): string;
78
+ /** How far a neighborhood reaches. */
79
+ interface NeighborhoodShape {
80
+ /** The checked depth, as text. */
81
+ readonly depth: string;
82
+ /** Which way relationships are followed. */
83
+ readonly direction: "out" | "in" | "both";
84
+ /** The checked path limit, as text, or null for none. */
85
+ readonly limit: string | null;
86
+ /** Whether the page starts after the neighbor key `$after` (a capped expansion's next page). */
87
+ readonly after?: boolean;
88
+ }
89
+ /**
90
+ * The neighborhood of the seeds `$ids`: every path up to `depth` hops, each seed included even with
91
+ * no neighbor, plus the degree of every node returned.
92
+ * @param profile - the server's profile
93
+ * @param filters - the filters
94
+ * @param shape - depth, direction and limit
95
+ * @param degree - whether to add the degree hint
96
+ * @returns the statement; it reads `$ids`
97
+ */
98
+ export declare function neighborhood(profile: CypherProfile, filters: QueryFilters, shape: NeighborhoodShape, degree: boolean): string;
99
+ /**
100
+ * The counts of mode "all", for a progress total.
101
+ * @param filters - the filters
102
+ * @returns two statements: the nodes, then the relationships
103
+ */
104
+ export declare function counts(filters: QueryFilters): readonly [string, string];
105
+ export {};
106
+ //# sourceMappingURL=query-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../../../src/sources/cypher/query-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,2DAA2D;AAC3D,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,sCAAsC;AACtC,eAAO,MAAM,aAAa,SAAU,CAAC;AAErC,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAWtC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQrD;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAQxF;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC1B,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,mBAAmB,GAC5B,MAAM,CAWR;AAED,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IACzB,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,iCAAiC;IACjC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAwDD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CACpB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO,GAChB,MAAM,CAYR;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAchH;AAED,sCAAsC;AACtC,UAAU,iBAAiB;IACvB,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;IAC1C,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gGAAgG;IAChG,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CACxB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,OAAO,GAChB,MAAM,CA2BR;AAWD;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAOvE"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * The one query builder of the Cypher source (design sections 11 and 12.2). Caller values travel
3
+ * as query parameters, never spliced. What Cypher cannot parameterize -- labels, relationship
4
+ * types, property keys, variable-length bounds and LIMIT -- is either backtick-quoted (an
5
+ * identifier, a backtick inside doubled) or inlined as a checked integer. The generated queries
6
+ * differ between servers only in the id expression.
7
+ */
8
+ import { failAlone, failOn } from "../fail.js";
9
+ /** The deepest neighborhood a generated query asks for. */
10
+ export const MAX_DEPTH = 10;
11
+ /** The largest page of mode "all". */
12
+ export const MAX_PAGE_SIZE = 100000;
13
+ /** The page size of mode "all" when the caller gives none. */
14
+ export const DEFAULT_PAGE_SIZE = 1000;
15
+ /**
16
+ * Why an identifier cannot be quoted, or null when it can.
17
+ * @param name - the identifier
18
+ * @returns the reason, or null
19
+ */
20
+ function identifierProblem(name) {
21
+ return typeof name !== "string" || name === "" || name.includes("\u0000") ? "identifier" : null;
22
+ }
23
+ /**
24
+ * Quote one Cypher identifier (a label, relationship type or property key) for a query: wrapped in
25
+ * backticks, with every backtick inside doubled, so no value can end the identifier early. An
26
+ * empty name, or one with a NUL character, is refused (E_SOURCE_PARAM, reason "identifier").
27
+ * Experimental.
28
+ * @param name - the identifier
29
+ * @returns the quoted identifier
30
+ * @example
31
+ * ```ts
32
+ * cypherIdentifier("Person"); // "`Person`"
33
+ * cypherIdentifier("odd`name"); // "`odd``name`"
34
+ * ```
35
+ * @category Network sources
36
+ */
37
+ export function cypherIdentifier(name) {
38
+ if (identifierProblem(name) !== null) {
39
+ failAlone("E_SOURCE_PARAM", "a Cypher identifier must be a non-empty string without NUL", {
40
+ name: "identifier",
41
+ reason: "identifier",
42
+ });
43
+ }
44
+ return `\`${name.replaceAll("`", "``")}\``;
45
+ }
46
+ /**
47
+ * Quote an identifier a parameter gave, failing the load when it cannot be.
48
+ * @param name - the identifier
49
+ * @param param - the parameter it came from
50
+ * @param report - the load's report
51
+ * @returns the quoted identifier
52
+ */
53
+ export function quoted(name, param, report) {
54
+ if (identifierProblem(name) !== null) {
55
+ failOn(report, "E_SOURCE_PARAM", `parameter ${param}: not a Cypher identifier`, {
56
+ name: param,
57
+ reason: "identifier",
58
+ });
59
+ }
60
+ return cypherIdentifier(name);
61
+ }
62
+ /**
63
+ * An integer to inline, checked to lie in its range.
64
+ * @param value - the value
65
+ * @param name - the parameter it came from
66
+ * @param min - the smallest allowed
67
+ * @param max - the largest allowed
68
+ * @param report - the load's report
69
+ * @returns the integer, as query text
70
+ */
71
+ export function checkedInteger(value, name, min, max, report) {
72
+ if (typeof value !== "number" || !Number.isInteger(value)) {
73
+ failOn(report, "E_SOURCE_PARAM", `parameter ${name}: not an integer`, { name, reason: "type" });
74
+ }
75
+ if (value < min || value > max) {
76
+ failOn(report, "E_SOURCE_PARAM", `parameter ${name}: outside ${String(min)} to ${String(max)}`, {
77
+ name,
78
+ reason: "range",
79
+ });
80
+ }
81
+ return String(value);
82
+ }
83
+ /**
84
+ * The id expression of a node or relationship variable.
85
+ * @param v - the variable
86
+ * @param profile - the server's profile
87
+ * @param filters - the id property, for a node
88
+ * @param node - whether `v` is a node
89
+ * @returns the expression
90
+ */
91
+ function idExpression(v, profile, filters, node = true) {
92
+ if (node && filters.idProperty !== null) {
93
+ return `${v}.${filters.idProperty}`;
94
+ }
95
+ return profile.elementIds ? `elementId(${v})` : `id(${v})`;
96
+ }
97
+ /**
98
+ * The node predicate of the label and id property filters, or null.
99
+ * @param v - the node variable
100
+ * @param filters - the filters
101
+ * @returns the predicate
102
+ */
103
+ function nodePredicate(v, filters) {
104
+ const parts = [];
105
+ if (filters.labels.length > 0) {
106
+ const prefix = `${v}:`;
107
+ parts.push(`(${filters.labels.map((l) => prefix + l).join(" OR ")})`);
108
+ }
109
+ if (filters.idProperty !== null) {
110
+ parts.push(`${v}.${filters.idProperty} IS NOT NULL`);
111
+ }
112
+ return parts.length === 0 ? null : parts.join(" AND ");
113
+ }
114
+ /**
115
+ * The relationship type part of a pattern: `:`A`|`B``, or "".
116
+ * @param filters - the filters
117
+ * @returns the pattern text
118
+ */
119
+ function typesPattern(filters) {
120
+ return filters.relationshipTypes.length === 0 ? "" : `:${filters.relationshipTypes.join("|")}`;
121
+ }
122
+ /**
123
+ * The degree hint of a node variable: its relationship count, by pattern comprehension.
124
+ * @param v - the variable
125
+ * @returns the expression
126
+ */
127
+ function degreeOf(v) {
128
+ return `size([(${v})--() | 1])`;
129
+ }
130
+ /** The arrows of each direction around a relationship pattern. */
131
+ const ARROWS = { out: ["-", "->"], in: ["<-", "-"], both: ["-", "-"] };
132
+ /**
133
+ * One page of the nodes of mode "all", ordered by the id expression (keyset paging, never SKIP).
134
+ * @param profile - the server's profile
135
+ * @param filters - the filters
136
+ * @param pageSize - the checked page size, as text
137
+ * @param after - whether the page starts after `$after`
138
+ * @param degree - whether to add the degree hint
139
+ * @returns the statement; it reads `$after`
140
+ */
141
+ export function nodePage(profile, filters, pageSize, after, degree) {
142
+ const where = nodePredicate("n", filters);
143
+ return [
144
+ "MATCH (n)",
145
+ where === null ? null : `WHERE ${where}`,
146
+ `WITH n, ${idExpression("n", profile, filters)} AS key`,
147
+ after ? "WHERE key > $after" : null,
148
+ degree ? `RETURN n, key, ${degreeOf("n")} AS degree` : "RETURN n, key",
149
+ `ORDER BY key LIMIT ${pageSize}`,
150
+ ]
151
+ .filter((l) => l !== null)
152
+ .join(" ");
153
+ }
154
+ /**
155
+ * One page of the relationships of mode "all", with their end nodes, ordered by the relationship
156
+ * id expression.
157
+ * @param profile - the server's profile
158
+ * @param filters - the filters
159
+ * @param pageSize - the checked page size, as text
160
+ * @param after - whether the page starts after `$after`
161
+ * @returns the statement; it reads `$after`
162
+ */
163
+ export function edgePage(profile, filters, pageSize, after) {
164
+ const a = nodePredicate("a", filters);
165
+ const b = nodePredicate("b", filters);
166
+ const where = [a, b].filter((p) => p !== null);
167
+ return [
168
+ `MATCH (a)-[r${typesPattern(filters)}]->(b)`,
169
+ where.length === 0 ? null : `WHERE ${where.join(" AND ")}`,
170
+ `WITH a, r, b, ${idExpression("r", profile, filters, false)} AS key`,
171
+ after ? "WHERE key > $after" : null,
172
+ "RETURN a, r, b, key",
173
+ `ORDER BY key LIMIT ${pageSize}`,
174
+ ]
175
+ .filter((l) => l !== null)
176
+ .join(" ");
177
+ }
178
+ /**
179
+ * The neighborhood of the seeds `$ids`: every path up to `depth` hops, each seed included even with
180
+ * no neighbor, plus the degree of every node returned.
181
+ * @param profile - the server's profile
182
+ * @param filters - the filters
183
+ * @param shape - depth, direction and limit
184
+ * @param degree - whether to add the degree hint
185
+ * @returns the statement; it reads `$ids`
186
+ */
187
+ export function neighborhood(profile, filters, shape, degree) {
188
+ const rel = `[${typesPattern(filters)}*1..${shape.depth}]`;
189
+ const [left, right] = ARROWS[shape.direction];
190
+ const pattern = `${left}${rel}${right}`;
191
+ const x = nodePredicate("x", filters);
192
+ const degrees = degree
193
+ ? `, [m IN CASE WHEN p IS NULL THEN [s] ELSE nodes(p) END | [${idExpression("m", profile, filters)}, ${degreeOf("m")}]] AS degrees`
194
+ : "";
195
+ // A capped expansion is ordered by the neighbor's key, so its next page starts after the last
196
+ // key it returned. ponytail: a page boundary falling between two paths to the same neighbor
197
+ // (parallel relationships, or depth > 1) drops the later paths; page on (key, path) if that matters.
198
+ const head = [
199
+ `MATCH (s) WHERE ${idExpression("s", profile, filters)} IN $ids`,
200
+ `OPTIONAL MATCH p = (s)${pattern}(x)${whereClause(x)}`,
201
+ ];
202
+ if (shape.limit === null) {
203
+ return [...head, "WITH s, p", `RETURN s, p${degrees}`].join(" ");
204
+ }
205
+ return [
206
+ ...head,
207
+ `WITH s, p, ${idExpression("x", profile, filters)} AS key`,
208
+ shape.after === true ? "WHERE key > $after" : null,
209
+ `WITH s, p, key ORDER BY key LIMIT ${shape.limit}`,
210
+ `RETURN s, p, key${degrees}`,
211
+ ]
212
+ .filter((l) => l !== null)
213
+ .join(" ");
214
+ }
215
+ /**
216
+ * A ` WHERE` clause for a predicate.
217
+ * @param predicate - the predicate, or null
218
+ * @returns the clause with its leading space, or "" for no predicate
219
+ */
220
+ function whereClause(predicate) {
221
+ return predicate === null ? "" : ` WHERE ${predicate}`;
222
+ }
223
+ /**
224
+ * The counts of mode "all", for a progress total.
225
+ * @param filters - the filters
226
+ * @returns two statements: the nodes, then the relationships
227
+ */
228
+ export function counts(filters) {
229
+ const n = nodePredicate("n", filters);
230
+ const where = [nodePredicate("a", filters), nodePredicate("b", filters)].filter((p) => p !== null);
231
+ return [
232
+ `MATCH (n)${whereClause(n)} RETURN count(n) AS c`,
233
+ `MATCH (a)-[r${typesPattern(filters)}]->(b)${whereClause(where.length === 0 ? null : where.join(" AND "))} RETURN count(r) AS c`,
234
+ ];
235
+ }
236
+ //# sourceMappingURL=query-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../../../src/sources/cypher/query-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The `bolt` transport (design sections 9 and 12.2): the official neo4j-driver, an optional peer
3
+ * dependency imported only here. Absent, a load fails with E_SOURCE_RUNTIME (`reason:
4
+ * "needs-peer-dependency"`). It is the only path to a Neo4j older than 5.26, such as Hetionet's 3.5.
5
+ *
6
+ * - Direct connections only (`bolt:`, `bolt+s:`, `bolt+ssc:`): a routing scheme would send the
7
+ * credential to every host the routing table lists, so `neo4j:` schemes are refused.
8
+ * - `+ssc` accepts any certificate, so it is refused with a credential; plain `bolt:` is refused
9
+ * with one unless the host is this machine or `allowInsecure` is set.
10
+ * - Statements run as auto-commit `session.run` in a READ session, never as managed transactions,
11
+ * which retry a server timeout for 30 s.
12
+ * - Integers stay lossless and are converted by the type mapper; the signal closes the session.
13
+ */
14
+ import { type Transport, type TransportInput } from "./transport.js";
15
+ /**
16
+ * Make the transport: import the driver, check the endpoint and credential, open a READ session.
17
+ * @param input - the context, params and mapper
18
+ * @returns the transport
19
+ */
20
+ export declare function boltTransport(input: TransportInput): Promise<Transport>;
21
+ //# sourceMappingURL=bolt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bolt.d.ts","sourceRoot":"","sources":["../../../../../src/sources/cypher/transports/bolt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,OAAO,EAAe,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAqHlF;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAoF7E"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * The `bolt` transport (design sections 9 and 12.2): the official neo4j-driver, an optional peer
3
+ * dependency imported only here. Absent, a load fails with E_SOURCE_RUNTIME (`reason:
4
+ * "needs-peer-dependency"`). It is the only path to a Neo4j older than 5.26, such as Hetionet's 3.5.
5
+ *
6
+ * - Direct connections only (`bolt:`, `bolt+s:`, `bolt+ssc:`): a routing scheme would send the
7
+ * credential to every host the routing table lists, so `neo4j:` schemes are refused.
8
+ * - `+ssc` accepts any certificate, so it is refused with a credential; plain `bolt:` is refused
9
+ * with one unless the host is this machine or `allowInsecure` is set.
10
+ * - Statements run as auto-commit `session.run` in a READ session, never as managed transactions,
11
+ * which retry a server timeout for 30 s.
12
+ * - Integers stay lossless and are converted by the type mapper; the signal closes the session.
13
+ */
14
+ import { throwIfAborted } from "../../../common/input.js";
15
+ import { isLoopback, transportOptions } from "../../context.js";
16
+ import { originOf, unwrapCredential } from "../../credentials.js";
17
+ import { failOn } from "../../fail.js";
18
+ import { profileFromAgent } from "../profiles.js";
19
+ import { fromDriver } from "../types-map.js";
20
+ import { serverError } from "./transport.js";
21
+ /** The optional peer dependency. */
22
+ const DRIVER_PACKAGE = "neo4j-driver";
23
+ /** The URL schemes of a direct Bolt connection. */
24
+ const DIRECT_SCHEMES = new Set(["bolt:", "bolt+s:", "bolt+ssc:"]);
25
+ /**
26
+ * Import the optional peer dependency.
27
+ * @param input - the transport input
28
+ * @returns the driver module
29
+ */
30
+ async function loadDriver(input) {
31
+ let mod;
32
+ try {
33
+ mod = (await import("neo4j-driver"));
34
+ }
35
+ catch {
36
+ return failOn(input.ctx.report, "E_SOURCE_RUNTIME", `the bolt transport needs ${DRIVER_PACKAGE} installed`, {
37
+ runtime: input.ctx.runtime,
38
+ reason: "needs-peer-dependency",
39
+ package: DRIVER_PACKAGE,
40
+ });
41
+ }
42
+ return mod.default ?? mod;
43
+ }
44
+ /**
45
+ * Fail when an https page would open a plain Bolt WebSocket to another machine, which the browser
46
+ * blocks.
47
+ * @param ctx - the context
48
+ * @param url - the endpoint
49
+ */
50
+ function refuseMixedContent(ctx, url) {
51
+ const page = globalThis.location;
52
+ if (ctx.runtime === "browser" &&
53
+ page?.protocol === "https:" &&
54
+ url.protocol === "bolt:" &&
55
+ !isLoopback(url.hostname)) {
56
+ failOn(ctx.report, "E_SOURCE_RUNTIME", "an https page cannot open a plain Bolt WebSocket", {
57
+ runtime: ctx.runtime,
58
+ reason: "insecure-endpoint",
59
+ });
60
+ }
61
+ }
62
+ /**
63
+ * Check the endpoint and the credential before connecting, and turn the credential into the
64
+ * driver's auth token.
65
+ * @param input - the transport input
66
+ * @param neo4j - the driver module
67
+ * @returns the URL and auth token
68
+ */
69
+ async function connection(input, neo4j) {
70
+ const { ctx } = input;
71
+ const { report } = ctx;
72
+ const bad = (reason, message) => failOn(report, "E_SOURCE_PARAM", message, { name: "endpoint", reason });
73
+ const url = ctx.endpoint ?? bad("missing", "the bolt transport needs an endpoint");
74
+ if (!DIRECT_SCHEMES.has(url.protocol)) {
75
+ bad(url.protocol.startsWith("neo4j") ? "routing" : "scheme", `${url.protocol} is not a direct Bolt scheme`);
76
+ }
77
+ refuseMixedContent(ctx, url);
78
+ const { credential, allowInsecure } = transportOptions(ctx);
79
+ const origin = originOf(url);
80
+ const bound = credential !== undefined && (credential.origins.length === 0 || credential.origins.includes(origin));
81
+ if (!bound || credential === undefined) {
82
+ return { url, auth: undefined };
83
+ }
84
+ if (url.protocol === "bolt+ssc:") {
85
+ bad("unverified-tls", "bolt+ssc accepts any certificate, so no credential is sent over it");
86
+ }
87
+ if (url.protocol === "bolt:" && !isLoopback(url.hostname) && allowInsecure !== true) {
88
+ bad("insecure-endpoint", "a credential is never sent without TLS");
89
+ }
90
+ const secret = unwrapCredential(credential);
91
+ if (secret !== undefined && "username" in secret) {
92
+ return { url, auth: neo4j.auth.basic(secret.username, secret.password) };
93
+ }
94
+ if (secret !== undefined && "token" in secret) {
95
+ const token = typeof secret.token === "string" ? secret.token : await secret.token();
96
+ return { url, auth: neo4j.auth.bearer(token) };
97
+ }
98
+ return failOn(report, "E_SOURCE_PARAM", "the bolt transport takes a basic or bearer credential", {
99
+ name: "credential",
100
+ reason: "kind",
101
+ });
102
+ }
103
+ /**
104
+ * Make the transport: import the driver, check the endpoint and credential, open a READ session.
105
+ * @param input - the context, params and mapper
106
+ * @returns the transport
107
+ */
108
+ export async function boltTransport(input) {
109
+ const { ctx, params, m } = input;
110
+ throwIfAborted(ctx.signal);
111
+ const neo4j = await loadDriver(input);
112
+ const { url, auth } = await connection(input, neo4j);
113
+ throwIfAborted(ctx.signal);
114
+ const origin = originOf(url);
115
+ const { userAgent } = transportOptions(ctx);
116
+ const driver = neo4j.driver(`${url.protocol}//${url.host}`, auth, userAgent === undefined ? {} : { userAgent });
117
+ const session = driver.session({
118
+ defaultAccessMode: neo4j.session.READ,
119
+ ...(params.database === undefined ? {} : { database: params.database }),
120
+ });
121
+ let closed = null;
122
+ const close = () => {
123
+ closed ?? (closed = session
124
+ .close()
125
+ .catch(() => undefined)
126
+ .then(() => driver.close())
127
+ .catch(() => undefined));
128
+ return closed;
129
+ };
130
+ const onAbort = () => {
131
+ void close();
132
+ };
133
+ ctx.signal.addEventListener("abort", onAbort, { once: true });
134
+ const fail = (err) => {
135
+ throwIfAborted(ctx.signal);
136
+ const e = err;
137
+ const code = typeof e.code === "string" ? e.code : null;
138
+ if (code === null || code === "ServiceUnavailable" || code === "SessionExpired") {
139
+ return ctx.runtime === "browser"
140
+ ? failOn(ctx.report, "E_SOURCE_BLOCKED", `${origin} could not be reached over Bolt`, {
141
+ url: origin,
142
+ cause: "unknown",
143
+ })
144
+ : failOn(ctx.report, "E_FETCH", `${origin} could not be reached over Bolt`, {
145
+ url: origin,
146
+ status: null,
147
+ });
148
+ }
149
+ return serverError(ctx.report, {
150
+ code,
151
+ message: typeof e.message === "string" ? e.message : "",
152
+ status: null,
153
+ showable: code.startsWith("Neo.ClientError."),
154
+ }, origin, params.database);
155
+ };
156
+ let detected = null;
157
+ const profile = async () => {
158
+ if (detected === null) {
159
+ const info = await driver.getServerInfo().catch(fail);
160
+ detected = profileFromAgent(info.agent ?? "");
161
+ }
162
+ return detected;
163
+ };
164
+ const timeout = ctx.limits.timeoutMs;
165
+ return {
166
+ async run(statement, parameters) {
167
+ throwIfAborted(ctx.signal);
168
+ const result = await session
169
+ .run(statement, parameters, timeout === undefined ? undefined : { timeout })
170
+ .catch(fail);
171
+ const fields = (result.records[0]?.keys ?? []).map(String);
172
+ return {
173
+ fields,
174
+ rows: result.records.map((r) => fields.map((k) => fromDriver(r.get(k), k, m, neo4j))),
175
+ };
176
+ },
177
+ profile,
178
+ probe: profile,
179
+ close: async () => {
180
+ ctx.signal.removeEventListener("abort", onAbort);
181
+ await close();
182
+ },
183
+ };
184
+ }
185
+ //# sourceMappingURL=bolt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bolt.js","sourceRoot":"","sources":["../../../../../src/sources/cypher/transports/bolt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The `neptune-analytics` transport (design section 12.4): `POST /queries` on the graph's host
3
+ * (`<graph-id>.<region>.neptune-graph.amazonaws.com`), JSON `{ query, language: "OPEN_CYPHER",
4
+ * parameters }`, always signed with `credentials.awsSigV4` for the service "neptune-graph".
5
+ * Results share Neptune Database's `~id` shape. Node only until CORS on a graph host is shown to
6
+ * work: a browser is refused before any request (E_SOURCE_RUNTIME, reason "cors").
7
+ */
8
+ import { type Transport, type TransportInput } from "./transport.js";
9
+ /**
10
+ * Make the transport.
11
+ * @param input - the context, params and mapper
12
+ * @returns the transport
13
+ */
14
+ export declare function neptuneAnalyticsTransport(input: TransportInput): Transport;
15
+ //# sourceMappingURL=neptune-analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neptune-analytics.d.ts","sourceRoot":"","sources":["../../../../../src/sources/cypher/transports/neptune-analytics.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErE;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAsB1E"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The `neptune-analytics` transport (design section 12.4): `POST /queries` on the graph's host
3
+ * (`<graph-id>.<region>.neptune-graph.amazonaws.com`), JSON `{ query, language: "OPEN_CYPHER",
4
+ * parameters }`, always signed with `credentials.awsSigV4` for the service "neptune-graph".
5
+ * Results share Neptune Database's `~id` shape. Node only until CORS on a graph host is shown to
6
+ * work: a browser is refused before any request (E_SOURCE_RUNTIME, reason "cors").
7
+ */
8
+ import { neptuneProfile } from "../profiles.js";
9
+ import { neptuneResult, nodeOnly } from "./neptune-https.js";
10
+ /**
11
+ * Make the transport.
12
+ * @param input - the context, params and mapper
13
+ * @returns the transport
14
+ */
15
+ export function neptuneAnalyticsTransport(input) {
16
+ const { ctx } = input;
17
+ nodeOnly(ctx, "neptune-analytics");
18
+ const run = async (statement, parameters) => {
19
+ const response = await ctx.fetch("queries", {
20
+ method: "POST",
21
+ idempotent: true,
22
+ allowStatus: [400, 500],
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify({ query: statement, language: "OPEN_CYPHER", parameters }),
25
+ });
26
+ return neptuneResult(input, response);
27
+ };
28
+ return {
29
+ run,
30
+ profile: () => Promise.resolve(neptuneProfile()),
31
+ probe: async () => {
32
+ await run("RETURN 1 AS ok", {});
33
+ return neptuneProfile();
34
+ },
35
+ close: () => Promise.resolve(),
36
+ };
37
+ }
38
+ //# sourceMappingURL=neptune-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neptune-analytics.js","sourceRoot":"","sources":["../../../../../src/sources/cypher/transports/neptune-analytics.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG7D;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAqB;IAC3D,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,KAAK,EAAE,SAAiB,EAAE,UAA6C,EAAwB,EAAE;QACzG,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE;YACxC,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;YACvB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;SAClF,CAAC,CAAC;QACH,OAAO,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,OAAO;QACH,GAAG;QACH,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAChD,KAAK,EAAE,KAAK,IAAI,EAAE;YACd,MAAM,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO,cAAc,EAAE,CAAC;QAC5B,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;KACjC,CAAC;AACN,CAAC"}