@graphty/graph-io 0.3.47 → 0.3.49

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 (770) hide show
  1. package/dist/chunks/{approximations-wWjCRzKj.js → approximations-Bzn3L-je.js} +2 -2
  2. package/dist/chunks/{approximations-wWjCRzKj.js.map → approximations-Bzn3L-je.js.map} +1 -1
  3. package/dist/chunks/bends-BGXjv_U4.js +129 -0
  4. package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
  5. package/dist/chunks/{block-DiGq58c3.js → block-iptrlMBb.js} +947 -134
  6. package/dist/chunks/block-iptrlMBb.js.map +1 -0
  7. package/dist/chunks/choose-CczZJaX_.js +717 -0
  8. package/dist/chunks/choose-CczZJaX_.js.map +1 -0
  9. package/dist/chunks/codes-BE2xir2k.js +157 -0
  10. package/dist/chunks/codes-BE2xir2k.js.map +1 -0
  11. package/dist/chunks/{constants-BKwqelYD.js → constants-CKkYLPtt.js} +2 -2
  12. package/dist/chunks/{constants-BKwqelYD.js.map → constants-CKkYLPtt.js.map} +1 -1
  13. package/dist/chunks/context-C3p0RQxR.js +664 -0
  14. package/dist/chunks/context-C3p0RQxR.js.map +1 -0
  15. package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
  16. package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
  17. package/dist/chunks/credentials-DXHx7nwR.js +349 -0
  18. package/dist/chunks/credentials-DXHx7nwR.js.map +1 -0
  19. package/dist/chunks/cx-export-Bt6NoqTQ.js +259 -0
  20. package/dist/chunks/cx-export-Bt6NoqTQ.js.map +1 -0
  21. package/dist/chunks/descriptor-B28U25x4.js +60 -0
  22. package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
  23. package/dist/chunks/descriptor-C-YDhtsn.js +48 -0
  24. package/dist/chunks/descriptor-C-YDhtsn.js.map +1 -0
  25. package/dist/chunks/descriptor-DLA5kINx.js +142 -0
  26. package/dist/chunks/descriptor-DLA5kINx.js.map +1 -0
  27. package/dist/chunks/{emit-CwU8cUmG.js → emit-BwHQkZle.js} +1690 -103
  28. package/dist/chunks/emit-BwHQkZle.js.map +1 -0
  29. package/dist/chunks/{escape-CgzxiYPg.js → escape-CuCIzNMB.js} +12 -12
  30. package/dist/chunks/{escape-CgzxiYPg.js.map → escape-CuCIzNMB.js.map} +1 -1
  31. package/dist/chunks/{export-BvqAXCKh.js → export-Cha4dRFz.js} +48 -1780
  32. package/dist/chunks/export-Cha4dRFz.js.map +1 -0
  33. package/dist/chunks/{exporter--Mk9gXCJ.js → exporter-BP6otMO6.js} +6 -4
  34. package/dist/chunks/{exporter--Mk9gXCJ.js.map → exporter-BP6otMO6.js.map} +1 -1
  35. package/dist/chunks/{exporter-CrDWIyiq.js → exporter-D2CETOMK.js} +1222 -154
  36. package/dist/chunks/exporter-D2CETOMK.js.map +1 -0
  37. package/dist/chunks/{exporter-DndFlGSa.js → exporter-D9yMtocA.js} +7 -6
  38. package/dist/chunks/{exporter-DndFlGSa.js.map → exporter-D9yMtocA.js.map} +1 -1
  39. package/dist/chunks/exporter-_jrBTnos.js +1009 -0
  40. package/dist/chunks/exporter-_jrBTnos.js.map +1 -0
  41. package/dist/chunks/{exporter-CJgfhF-l.js → exporter-nDfxIK5D.js} +9 -7
  42. package/dist/chunks/{exporter-CJgfhF-l.js.map → exporter-nDfxIK5D.js.map} +1 -1
  43. package/dist/chunks/format-BXiAb-1h.js +408 -0
  44. package/dist/chunks/format-BXiAb-1h.js.map +1 -0
  45. package/dist/chunks/{generic-Dq1ntt9q.js → generic-ymWCETAJ.js} +387 -31
  46. package/dist/chunks/generic-ymWCETAJ.js.map +1 -0
  47. package/dist/chunks/{importer-CMmeMWlC.js → importer-B92x1xY5.js} +15 -263
  48. package/dist/chunks/importer-B92x1xY5.js.map +1 -0
  49. package/dist/chunks/{importer-DiZRmOQG.js → importer-CT9mJ1nn.js} +328 -90
  50. package/dist/chunks/importer-CT9mJ1nn.js.map +1 -0
  51. package/dist/chunks/{importer-COTK9Tsl.js → importer-DaLTjbds.js} +116 -1099
  52. package/dist/chunks/importer-DaLTjbds.js.map +1 -0
  53. package/dist/chunks/{importer-iFYPEKaJ.js → importer-GREKMdIf.js} +28 -16
  54. package/dist/chunks/importer-GREKMdIf.js.map +1 -0
  55. package/dist/chunks/{importer-BSvfrX_h.js → importer-PqaaKKnY.js} +23 -1016
  56. package/dist/chunks/importer-PqaaKKnY.js.map +1 -0
  57. package/dist/chunks/{importer-yh_aBCU6.js → importer-Vn5QvmmJ.js} +66 -12
  58. package/dist/chunks/importer-Vn5QvmmJ.js.map +1 -0
  59. package/dist/chunks/{importer-e6LGpqHB.js → importer-vRq4h3j5.js} +1470 -354
  60. package/dist/chunks/importer-vRq4h3j5.js.map +1 -0
  61. package/dist/chunks/input-CAxt_aV-.js +1397 -0
  62. package/dist/chunks/input-CAxt_aV-.js.map +1 -0
  63. package/dist/chunks/{json-elements-DJZRZ6jd.js → json-elements-Cq76WjnZ.js} +4 -4
  64. package/dist/chunks/{json-elements-DJZRZ6jd.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
  65. package/dist/chunks/{lexicon-CT69Kd87.js → lexicon-Clf4QIyl.js} +299 -77
  66. package/dist/chunks/lexicon-Clf4QIyl.js.map +1 -0
  67. package/dist/chunks/{ontology-export-G4MqRdux.js → ontology-export-OMo91mb0.js} +4 -3
  68. package/dist/chunks/{ontology-export-G4MqRdux.js.map → ontology-export-OMo91mb0.js.map} +1 -1
  69. package/dist/chunks/{records-CiaWZrFH.js → records-NJiYvekn.js} +2 -2
  70. package/dist/chunks/{records-CiaWZrFH.js.map → records-NJiYvekn.js.map} +1 -1
  71. package/dist/chunks/{format-BpQBx8MZ.js → report-CwMfYa9J.js} +70 -127
  72. package/dist/chunks/report-CwMfYa9J.js.map +1 -0
  73. package/dist/chunks/round-trip-Zm3_ivgq.js +79 -0
  74. package/dist/chunks/round-trip-Zm3_ivgq.js.map +1 -0
  75. package/dist/chunks/sigv4-EokFic1V.js +247 -0
  76. package/dist/chunks/sigv4-EokFic1V.js.map +1 -0
  77. package/dist/chunks/{styles-BQnsga7p.js → styles-CCs214_3.js} +1300 -168
  78. package/dist/chunks/styles-CCs214_3.js.map +1 -0
  79. package/dist/chunks/styles-Cm62yyQX.js +2812 -0
  80. package/dist/chunks/styles-Cm62yyQX.js.map +1 -0
  81. package/dist/chunks/styles-DPQQIig4.js +1928 -0
  82. package/dist/chunks/styles-DPQQIig4.js.map +1 -0
  83. package/dist/chunks/styles-yed-UMFdNqze.js +1213 -0
  84. package/dist/chunks/styles-yed-UMFdNqze.js.map +1 -0
  85. package/dist/chunks/{text-CzJNFOS9.js → text-ystE2bYi.js} +2 -2
  86. package/dist/chunks/{text-CzJNFOS9.js.map → text-ystE2bYi.js.map} +1 -1
  87. package/dist/csv.js +7 -5
  88. package/dist/csv.js.map +1 -1
  89. package/dist/cx.js +5 -4
  90. package/dist/cx.js.map +1 -1
  91. package/dist/cx2.js +2 -2
  92. package/dist/cys.js +1 -1
  93. package/dist/dot.js +5 -4
  94. package/dist/dot.js.map +1 -1
  95. package/dist/gexf.js +42 -10
  96. package/dist/gexf.js.map +1 -1
  97. package/dist/gml.js +850 -193
  98. package/dist/gml.js.map +1 -1
  99. package/dist/graph-io.js +1189 -220
  100. package/dist/graph-io.js.map +1 -1
  101. package/dist/graphml.js +3 -3
  102. package/dist/json.js +3 -2
  103. package/dist/neo4j.js +6 -4
  104. package/dist/neo4j.js.map +1 -1
  105. package/dist/obo.js +1 -1
  106. package/dist/pajek.js +1 -1
  107. package/dist/positions.js +45 -3
  108. package/dist/positions.js.map +1 -1
  109. package/dist/sources-cypher.d.ts +1 -0
  110. package/dist/sources-cypher.js +1351 -0
  111. package/dist/sources-cypher.js.map +1 -0
  112. package/dist/sources-ndex.d.ts +1 -0
  113. package/dist/sources-ndex.js +278 -0
  114. package/dist/sources-ndex.js.map +1 -0
  115. package/dist/sources-rest.d.ts +1 -0
  116. package/dist/sources-rest.js +1377 -0
  117. package/dist/sources-rest.js.map +1 -0
  118. package/dist/sources-sparql.d.ts +1 -0
  119. package/dist/sources-sparql.js +405 -0
  120. package/dist/sources-sparql.js.map +1 -0
  121. package/dist/src/common/report.d.ts +6 -3
  122. package/dist/src/common/report.d.ts.map +1 -1
  123. package/dist/src/common/report.js +15 -9
  124. package/dist/src/common/report.js.map +1 -1
  125. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cx/importer.js +5 -1
  127. package/dist/src/formats/cx/importer.js.map +1 -1
  128. package/dist/src/formats/cx/styles.d.ts +24 -1
  129. package/dist/src/formats/cx/styles.d.ts.map +1 -1
  130. package/dist/src/formats/cx/styles.js +118 -11
  131. package/dist/src/formats/cx/styles.js.map +1 -1
  132. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  133. package/dist/src/formats/cx2/importer.js +1 -0
  134. package/dist/src/formats/cx2/importer.js.map +1 -1
  135. package/dist/src/formats/cx2/styles.d.ts.map +1 -1
  136. package/dist/src/formats/cx2/styles.js +3 -1
  137. package/dist/src/formats/cx2/styles.js.map +1 -1
  138. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  139. package/dist/src/formats/cys/importer.js +1 -0
  140. package/dist/src/formats/cys/importer.js.map +1 -1
  141. package/dist/src/formats/cys/styles.d.ts +2 -0
  142. package/dist/src/formats/cys/styles.d.ts.map +1 -1
  143. package/dist/src/formats/cys/styles.js +15 -7
  144. package/dist/src/formats/cys/styles.js.map +1 -1
  145. package/dist/src/formats/dot/drawing.d.ts +98 -0
  146. package/dist/src/formats/dot/drawing.d.ts.map +1 -0
  147. package/dist/src/formats/dot/drawing.js +734 -0
  148. package/dist/src/formats/dot/drawing.js.map +1 -0
  149. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  150. package/dist/src/formats/dot/importer.js +108 -31
  151. package/dist/src/formats/dot/importer.js.map +1 -1
  152. package/dist/src/formats/dot/label-places.d.ts +34 -0
  153. package/dist/src/formats/dot/label-places.d.ts.map +1 -0
  154. package/dist/src/formats/dot/label-places.js +179 -0
  155. package/dist/src/formats/dot/label-places.js.map +1 -0
  156. package/dist/src/formats/dot/record.d.ts +50 -0
  157. package/dist/src/formats/dot/record.d.ts.map +1 -0
  158. package/dist/src/formats/dot/record.js +275 -0
  159. package/dist/src/formats/dot/record.js.map +1 -0
  160. package/dist/src/formats/dot/styles.d.ts +62 -2
  161. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  162. package/dist/src/formats/dot/styles.js +1457 -120
  163. package/dist/src/formats/dot/styles.js.map +1 -1
  164. package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
  165. package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
  166. package/dist/src/formats/gexf/dialog-metrics.js +59 -0
  167. package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
  168. package/dist/src/formats/gexf/importer.d.ts +7 -0
  169. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  170. package/dist/src/formats/gexf/importer.js +41 -5
  171. package/dist/src/formats/gexf/importer.js.map +1 -1
  172. package/dist/src/formats/gexf/preview.d.ts +77 -0
  173. package/dist/src/formats/gexf/preview.d.ts.map +1 -0
  174. package/dist/src/formats/gexf/preview.js +191 -0
  175. package/dist/src/formats/gexf/preview.js.map +1 -0
  176. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  177. package/dist/src/formats/gexf/schema.js +2 -1
  178. package/dist/src/formats/gexf/schema.js.map +1 -1
  179. package/dist/src/formats/gexf/styles.d.ts +60 -16
  180. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  181. package/dist/src/formats/gexf/styles.js +883 -131
  182. package/dist/src/formats/gexf/styles.js.map +1 -1
  183. package/dist/src/formats/gml/importer.d.ts +5 -2
  184. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  185. package/dist/src/formats/gml/importer.js +258 -71
  186. package/dist/src/formats/gml/importer.js.map +1 -1
  187. package/dist/src/formats/gml/index.d.ts +1 -1
  188. package/dist/src/formats/gml/index.d.ts.map +1 -1
  189. package/dist/src/formats/gml/index.js +1 -1
  190. package/dist/src/formats/gml/index.js.map +1 -1
  191. package/dist/src/formats/gml/positions.d.ts +7 -0
  192. package/dist/src/formats/gml/positions.d.ts.map +1 -1
  193. package/dist/src/formats/gml/positions.js +29 -7
  194. package/dist/src/formats/gml/positions.js.map +1 -1
  195. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  196. package/dist/src/formats/gml/styles.js +756 -103
  197. package/dist/src/formats/gml/styles.js.map +1 -1
  198. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  199. package/dist/src/formats/graphml/styles-plain.js +8 -12
  200. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  201. package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
  202. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  203. package/dist/src/formats/graphml/styles-yed.js +749 -148
  204. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  205. package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
  206. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
  207. package/dist/src/formats/graphml/styles-yfiles3.js +429 -64
  208. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
  209. package/dist/src/formats/graphml/yfiles.d.ts +3 -3
  210. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  211. package/dist/src/formats/graphml/yfiles.js +16 -6
  212. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  213. package/dist/src/formats/json/dialect.d.ts +3 -2
  214. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  215. package/dist/src/formats/json/dialect.js +39 -5
  216. package/dist/src/formats/json/dialect.js.map +1 -1
  217. package/dist/src/formats/json/importer.d.ts +13 -2
  218. package/dist/src/formats/json/importer.d.ts.map +1 -1
  219. package/dist/src/formats/json/importer.js +42 -6
  220. package/dist/src/formats/json/importer.js.map +1 -1
  221. package/dist/src/formats/json/index.d.ts +1 -1
  222. package/dist/src/formats/json/index.d.ts.map +1 -1
  223. package/dist/src/formats/json/index.js +1 -1
  224. package/dist/src/formats/json/index.js.map +1 -1
  225. package/dist/src/formats/json/positions.d.ts +5 -2
  226. package/dist/src/formats/json/positions.d.ts.map +1 -1
  227. package/dist/src/formats/json/positions.js +20 -4
  228. package/dist/src/formats/json/positions.js.map +1 -1
  229. package/dist/src/formats/json/styles.d.ts +12 -1
  230. package/dist/src/formats/json/styles.d.ts.map +1 -1
  231. package/dist/src/formats/json/styles.js +1755 -136
  232. package/dist/src/formats/json/styles.js.map +1 -1
  233. package/dist/src/formats/pajek/draw.d.ts +96 -0
  234. package/dist/src/formats/pajek/draw.d.ts.map +1 -0
  235. package/dist/src/formats/pajek/draw.js +372 -0
  236. package/dist/src/formats/pajek/draw.js.map +1 -0
  237. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  238. package/dist/src/formats/pajek/exporter.js +70 -51
  239. package/dist/src/formats/pajek/exporter.js.map +1 -1
  240. package/dist/src/formats/pajek/importer.d.ts +9 -0
  241. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  242. package/dist/src/formats/pajek/importer.js +233 -102
  243. package/dist/src/formats/pajek/importer.js.map +1 -1
  244. package/dist/src/formats/pajek/index.d.ts +1 -0
  245. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  246. package/dist/src/formats/pajek/index.js.map +1 -1
  247. package/dist/src/formats/pajek/styles.d.ts +15 -7
  248. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  249. package/dist/src/formats/pajek/styles.js +1279 -114
  250. package/dist/src/formats/pajek/styles.js.map +1 -1
  251. package/dist/src/formats/pajek/syntax.d.ts +10 -1
  252. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  253. package/dist/src/formats/pajek/syntax.js +26 -2
  254. package/dist/src/formats/pajek/syntax.js.map +1 -1
  255. package/dist/src/formats/xgmml/emit.d.ts +1 -0
  256. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  257. package/dist/src/formats/xgmml/emit.js +65 -5
  258. package/dist/src/formats/xgmml/emit.js.map +1 -1
  259. package/dist/src/formats/xgmml/styles.d.ts +23 -3
  260. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  261. package/dist/src/formats/xgmml/styles.js +278 -60
  262. package/dist/src/formats/xgmml/styles.js.map +1 -1
  263. package/dist/src/index.d.ts +10 -2
  264. package/dist/src/index.d.ts.map +1 -1
  265. package/dist/src/index.js +11 -2
  266. package/dist/src/index.js.map +1 -1
  267. package/dist/src/positions/convert.d.ts.map +1 -1
  268. package/dist/src/positions/convert.js +11 -1
  269. package/dist/src/positions/convert.js.map +1 -1
  270. package/dist/src/positions/extract.d.ts.map +1 -1
  271. package/dist/src/positions/extract.js +53 -1
  272. package/dist/src/positions/extract.js.map +1 -1
  273. package/dist/src/positions/index.d.ts +1 -1
  274. package/dist/src/positions/index.d.ts.map +1 -1
  275. package/dist/src/positions/types.d.ts +59 -0
  276. package/dist/src/positions/types.d.ts.map +1 -1
  277. package/dist/src/registry.d.ts +173 -1
  278. package/dist/src/registry.d.ts.map +1 -1
  279. package/dist/src/registry.js +196 -1
  280. package/dist/src/registry.js.map +1 -1
  281. package/dist/src/sources/builtins.d.ts +11 -0
  282. package/dist/src/sources/builtins.d.ts.map +1 -0
  283. package/dist/src/sources/builtins.js +53 -0
  284. package/dist/src/sources/builtins.js.map +1 -0
  285. package/dist/src/sources/codes.d.ts +230 -0
  286. package/dist/src/sources/codes.d.ts.map +1 -0
  287. package/dist/src/sources/codes.js +58 -0
  288. package/dist/src/sources/codes.js.map +1 -0
  289. package/dist/src/sources/context.d.ts +112 -0
  290. package/dist/src/sources/context.d.ts.map +1 -0
  291. package/dist/src/sources/context.js +740 -0
  292. package/dist/src/sources/context.js.map +1 -0
  293. package/dist/src/sources/credentials.d.ts +179 -0
  294. package/dist/src/sources/credentials.d.ts.map +1 -0
  295. package/dist/src/sources/credentials.js +301 -0
  296. package/dist/src/sources/credentials.js.map +1 -0
  297. package/dist/src/sources/cypher/descriptor.d.ts +21 -0
  298. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -0
  299. package/dist/src/sources/cypher/descriptor.js +124 -0
  300. package/dist/src/sources/cypher/descriptor.js.map +1 -0
  301. package/dist/src/sources/cypher/flatten.d.ts +72 -0
  302. package/dist/src/sources/cypher/flatten.d.ts.map +1 -0
  303. package/dist/src/sources/cypher/flatten.js +279 -0
  304. package/dist/src/sources/cypher/flatten.js.map +1 -0
  305. package/dist/src/sources/cypher/index.d.ts +33 -0
  306. package/dist/src/sources/cypher/index.d.ts.map +1 -0
  307. package/dist/src/sources/cypher/index.js +511 -0
  308. package/dist/src/sources/cypher/index.js.map +1 -0
  309. package/dist/src/sources/cypher/params.d.ts +40 -0
  310. package/dist/src/sources/cypher/params.d.ts.map +1 -0
  311. package/dist/src/sources/cypher/params.js +6 -0
  312. package/dist/src/sources/cypher/params.js.map +1 -0
  313. package/dist/src/sources/cypher/profiles.d.ts +44 -0
  314. package/dist/src/sources/cypher/profiles.d.ts.map +1 -0
  315. package/dist/src/sources/cypher/profiles.js +61 -0
  316. package/dist/src/sources/cypher/profiles.js.map +1 -0
  317. package/dist/src/sources/cypher/query-builder.d.ts +123 -0
  318. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -0
  319. package/dist/src/sources/cypher/query-builder.js +267 -0
  320. package/dist/src/sources/cypher/query-builder.js.map +1 -0
  321. package/dist/src/sources/cypher/transports/bolt.d.ts +21 -0
  322. package/dist/src/sources/cypher/transports/bolt.d.ts.map +1 -0
  323. package/dist/src/sources/cypher/transports/bolt.js +185 -0
  324. package/dist/src/sources/cypher/transports/bolt.js.map +1 -0
  325. package/dist/src/sources/cypher/transports/neptune-analytics.d.ts +15 -0
  326. package/dist/src/sources/cypher/transports/neptune-analytics.d.ts.map +1 -0
  327. package/dist/src/sources/cypher/transports/neptune-analytics.js +38 -0
  328. package/dist/src/sources/cypher/transports/neptune-analytics.js.map +1 -0
  329. package/dist/src/sources/cypher/transports/neptune-https.d.ts +31 -0
  330. package/dist/src/sources/cypher/transports/neptune-https.d.ts.map +1 -0
  331. package/dist/src/sources/cypher/transports/neptune-https.js +104 -0
  332. package/dist/src/sources/cypher/transports/neptune-https.js.map +1 -0
  333. package/dist/src/sources/cypher/transports/query-api.d.ts +14 -0
  334. package/dist/src/sources/cypher/transports/query-api.d.ts.map +1 -0
  335. package/dist/src/sources/cypher/transports/query-api.js +80 -0
  336. package/dist/src/sources/cypher/transports/query-api.js.map +1 -0
  337. package/dist/src/sources/cypher/transports/transport.d.ts +78 -0
  338. package/dist/src/sources/cypher/transports/transport.d.ts.map +1 -0
  339. package/dist/src/sources/cypher/transports/transport.js +77 -0
  340. package/dist/src/sources/cypher/transports/transport.js.map +1 -0
  341. package/dist/src/sources/cypher/types-map.d.ts +91 -0
  342. package/dist/src/sources/cypher/types-map.d.ts.map +1 -0
  343. package/dist/src/sources/cypher/types-map.js +306 -0
  344. package/dist/src/sources/cypher/types-map.js.map +1 -0
  345. package/dist/src/sources/define.d.ts +47 -0
  346. package/dist/src/sources/define.d.ts.map +1 -0
  347. package/dist/src/sources/define.js +173 -0
  348. package/dist/src/sources/define.js.map +1 -0
  349. package/dist/src/sources/fail.d.ts +33 -0
  350. package/dist/src/sources/fail.d.ts.map +1 -0
  351. package/dist/src/sources/fail.js +49 -0
  352. package/dist/src/sources/fail.js.map +1 -0
  353. package/dist/src/sources/ids.d.ts +69 -0
  354. package/dist/src/sources/ids.d.ts.map +1 -0
  355. package/dist/src/sources/ids.js +69 -0
  356. package/dist/src/sources/ids.js.map +1 -0
  357. package/dist/src/sources/ndex/client.d.ts +31 -0
  358. package/dist/src/sources/ndex/client.d.ts.map +1 -0
  359. package/dist/src/sources/ndex/client.js +90 -0
  360. package/dist/src/sources/ndex/client.js.map +1 -0
  361. package/dist/src/sources/ndex/descriptor.d.ts +10 -0
  362. package/dist/src/sources/ndex/descriptor.d.ts.map +1 -0
  363. package/dist/src/sources/ndex/descriptor.js +55 -0
  364. package/dist/src/sources/ndex/descriptor.js.map +1 -0
  365. package/dist/src/sources/ndex/expand.d.ts +20 -0
  366. package/dist/src/sources/ndex/expand.d.ts.map +1 -0
  367. package/dist/src/sources/ndex/expand.js +87 -0
  368. package/dist/src/sources/ndex/expand.js.map +1 -0
  369. package/dist/src/sources/ndex/index.d.ts +25 -0
  370. package/dist/src/sources/ndex/index.d.ts.map +1 -0
  371. package/dist/src/sources/ndex/index.js +191 -0
  372. package/dist/src/sources/ndex/index.js.map +1 -0
  373. package/dist/src/sources/ndex/params.d.ts +17 -0
  374. package/dist/src/sources/ndex/params.d.ts.map +1 -0
  375. package/dist/src/sources/ndex/params.js +6 -0
  376. package/dist/src/sources/ndex/params.js.map +1 -0
  377. package/dist/src/sources/ndex/share-url.d.ts +40 -0
  378. package/dist/src/sources/ndex/share-url.d.ts.map +1 -0
  379. package/dist/src/sources/ndex/share-url.js +64 -0
  380. package/dist/src/sources/ndex/share-url.js.map +1 -0
  381. package/dist/src/sources/params.d.ts +31 -0
  382. package/dist/src/sources/params.d.ts.map +1 -0
  383. package/dist/src/sources/params.js +6 -0
  384. package/dist/src/sources/params.js.map +1 -0
  385. package/dist/src/sources/registry.d.ts +118 -0
  386. package/dist/src/sources/registry.d.ts.map +1 -0
  387. package/dist/src/sources/registry.js +193 -0
  388. package/dist/src/sources/registry.js.map +1 -0
  389. package/dist/src/sources/rest/descriptor.d.ts +16 -0
  390. package/dist/src/sources/rest/descriptor.d.ts.map +1 -0
  391. package/dist/src/sources/rest/descriptor.js +76 -0
  392. package/dist/src/sources/rest/descriptor.js.map +1 -0
  393. package/dist/src/sources/rest/index.d.ts +14 -0
  394. package/dist/src/sources/rest/index.d.ts.map +1 -0
  395. package/dist/src/sources/rest/index.js +13 -0
  396. package/dist/src/sources/rest/index.js.map +1 -0
  397. package/dist/src/sources/rest/mapping.d.ts +30 -0
  398. package/dist/src/sources/rest/mapping.d.ts.map +1 -0
  399. package/dist/src/sources/rest/mapping.js +362 -0
  400. package/dist/src/sources/rest/mapping.js.map +1 -0
  401. package/dist/src/sources/rest/openalex.d.ts +27 -0
  402. package/dist/src/sources/rest/openalex.d.ts.map +1 -0
  403. package/dist/src/sources/rest/openalex.js +269 -0
  404. package/dist/src/sources/rest/openalex.js.map +1 -0
  405. package/dist/src/sources/rest/paging.d.ts +53 -0
  406. package/dist/src/sources/rest/paging.d.ts.map +1 -0
  407. package/dist/src/sources/rest/paging.js +138 -0
  408. package/dist/src/sources/rest/paging.js.map +1 -0
  409. package/dist/src/sources/rest/params.d.ts +216 -0
  410. package/dist/src/sources/rest/params.d.ts.map +1 -0
  411. package/dist/src/sources/rest/params.js +7 -0
  412. package/dist/src/sources/rest/params.js.map +1 -0
  413. package/dist/src/sources/rest/records.d.ts +41 -0
  414. package/dist/src/sources/rest/records.d.ts.map +1 -0
  415. package/dist/src/sources/rest/records.js +240 -0
  416. package/dist/src/sources/rest/records.js.map +1 -0
  417. package/dist/src/sources/rest/samples/deps-dev.d.ts +10 -0
  418. package/dist/src/sources/rest/samples/deps-dev.d.ts.map +1 -0
  419. package/dist/src/sources/rest/samples/deps-dev.js +47 -0
  420. package/dist/src/sources/rest/samples/deps-dev.js.map +1 -0
  421. package/dist/src/sources/rest/samples/string.d.ts +9 -0
  422. package/dist/src/sources/rest/samples/string.d.ts.map +1 -0
  423. package/dist/src/sources/rest/samples/string.js +42 -0
  424. package/dist/src/sources/rest/samples/string.js.map +1 -0
  425. package/dist/src/sources/rest/selectors.d.ts +41 -0
  426. package/dist/src/sources/rest/selectors.d.ts.map +1 -0
  427. package/dist/src/sources/rest/selectors.js +81 -0
  428. package/dist/src/sources/rest/selectors.js.map +1 -0
  429. package/dist/src/sources/rest/source.d.ts +67 -0
  430. package/dist/src/sources/rest/source.d.ts.map +1 -0
  431. package/dist/src/sources/rest/source.js +650 -0
  432. package/dist/src/sources/rest/source.js.map +1 -0
  433. package/dist/src/sources/rest/templates.d.ts +38 -0
  434. package/dist/src/sources/rest/templates.d.ts.map +1 -0
  435. package/dist/src/sources/rest/templates.js +125 -0
  436. package/dist/src/sources/rest/templates.js.map +1 -0
  437. package/dist/src/sources/run.d.ts +93 -0
  438. package/dist/src/sources/run.d.ts.map +1 -0
  439. package/dist/src/sources/run.js +673 -0
  440. package/dist/src/sources/run.js.map +1 -0
  441. package/dist/src/sources/sha256.d.ts +12 -0
  442. package/dist/src/sources/sha256.d.ts.map +1 -0
  443. package/dist/src/sources/sha256.js +95 -0
  444. package/dist/src/sources/sha256.js.map +1 -0
  445. package/dist/src/sources/sigv4.d.ts +26 -0
  446. package/dist/src/sources/sigv4.d.ts.map +1 -0
  447. package/dist/src/sources/sigv4.js +184 -0
  448. package/dist/src/sources/sigv4.js.map +1 -0
  449. package/dist/src/sources/sparql/descriptor.d.ts +10 -0
  450. package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
  451. package/dist/src/sources/sparql/descriptor.js +64 -0
  452. package/dist/src/sources/sparql/descriptor.js.map +1 -0
  453. package/dist/src/sources/sparql/index.d.ts +28 -0
  454. package/dist/src/sources/sparql/index.d.ts.map +1 -0
  455. package/dist/src/sources/sparql/index.js +314 -0
  456. package/dist/src/sources/sparql/index.js.map +1 -0
  457. package/dist/src/sources/sparql/ntriples.d.ts +69 -0
  458. package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
  459. package/dist/src/sources/sparql/ntriples.js +180 -0
  460. package/dist/src/sources/sparql/ntriples.js.map +1 -0
  461. package/dist/src/sources/sparql/params.d.ts +27 -0
  462. package/dist/src/sources/sparql/params.d.ts.map +1 -0
  463. package/dist/src/sources/sparql/params.js +5 -0
  464. package/dist/src/sources/sparql/params.js.map +1 -0
  465. package/dist/src/sources/sparql/query.d.ts +72 -0
  466. package/dist/src/sources/sparql/query.d.ts.map +1 -0
  467. package/dist/src/sources/sparql/query.js +113 -0
  468. package/dist/src/sources/sparql/query.js.map +1 -0
  469. package/dist/src/sources/testing.d.ts +96 -0
  470. package/dist/src/sources/testing.d.ts.map +1 -0
  471. package/dist/src/sources/testing.js +138 -0
  472. package/dist/src/sources/testing.js.map +1 -0
  473. package/dist/src/sources/types.d.ts +696 -0
  474. package/dist/src/sources/types.d.ts.map +1 -0
  475. package/dist/src/sources/types.js +10 -0
  476. package/dist/src/sources/types.js.map +1 -0
  477. package/dist/src/styles/annotations.d.ts +61 -5
  478. package/dist/src/styles/annotations.d.ts.map +1 -1
  479. package/dist/src/styles/annotations.js +130 -22
  480. package/dist/src/styles/annotations.js.map +1 -1
  481. package/dist/src/styles/canon/bends.d.ts +46 -0
  482. package/dist/src/styles/canon/bends.d.ts.map +1 -1
  483. package/dist/src/styles/canon/bends.js +123 -0
  484. package/dist/src/styles/canon/bends.js.map +1 -1
  485. package/dist/src/styles/canon/color-tables.d.ts +6 -1
  486. package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
  487. package/dist/src/styles/canon/color-tables.js +10 -4
  488. package/dist/src/styles/canon/color-tables.js.map +1 -1
  489. package/dist/src/styles/canon/color.d.ts +3 -1
  490. package/dist/src/styles/canon/color.d.ts.map +1 -1
  491. package/dist/src/styles/canon/color.js +103 -3
  492. package/dist/src/styles/canon/color.js.map +1 -1
  493. package/dist/src/styles/canon/enums.d.ts +2 -2
  494. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  495. package/dist/src/styles/canon/enums.js +82 -7
  496. package/dist/src/styles/canon/enums.js.map +1 -1
  497. package/dist/src/styles/canon/graphviz.d.ts +12 -3
  498. package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
  499. package/dist/src/styles/canon/graphviz.js +57 -9
  500. package/dist/src/styles/canon/graphviz.js.map +1 -1
  501. package/dist/src/styles/canon/number.d.ts +8 -0
  502. package/dist/src/styles/canon/number.d.ts.map +1 -1
  503. package/dist/src/styles/canon/number.js +18 -0
  504. package/dist/src/styles/canon/number.js.map +1 -1
  505. package/dist/src/styles/canon/text.d.ts +29 -2
  506. package/dist/src/styles/canon/text.d.ts.map +1 -1
  507. package/dist/src/styles/canon/text.js +156 -16
  508. package/dist/src/styles/canon/text.js.map +1 -1
  509. package/dist/src/styles/codes.d.ts +2 -0
  510. package/dist/src/styles/codes.d.ts.map +1 -1
  511. package/dist/src/styles/codes.js +2 -0
  512. package/dist/src/styles/codes.js.map +1 -1
  513. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  514. package/dist/src/styles/cyjs/cascade.js +1037 -35
  515. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  516. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  517. package/dist/src/styles/cyjs/defaults-table.js +5 -0
  518. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  519. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  520. package/dist/src/styles/cyjs/emit.js +216 -12
  521. package/dist/src/styles/cyjs/emit.js.map +1 -1
  522. package/dist/src/styles/cyjs/face.d.ts +20 -0
  523. package/dist/src/styles/cyjs/face.d.ts.map +1 -0
  524. package/dist/src/styles/cyjs/face.js +332 -0
  525. package/dist/src/styles/cyjs/face.js.map +1 -0
  526. package/dist/src/styles/cyjs/mappers.d.ts +48 -2
  527. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  528. package/dist/src/styles/cyjs/mappers.js +463 -26
  529. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  530. package/dist/src/styles/cyjs/routes.d.ts +53 -0
  531. package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
  532. package/dist/src/styles/cyjs/routes.js +360 -0
  533. package/dist/src/styles/cyjs/routes.js.map +1 -0
  534. package/dist/src/styles/cytoscape/charts.d.ts +23 -0
  535. package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
  536. package/dist/src/styles/cytoscape/charts.js +560 -0
  537. package/dist/src/styles/cytoscape/charts.js.map +1 -0
  538. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  539. package/dist/src/styles/cytoscape/emit.js +204 -44
  540. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  541. package/dist/src/styles/cytoscape/lexicon.d.ts +97 -3
  542. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  543. package/dist/src/styles/cytoscape/lexicon.js +413 -79
  544. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  545. package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
  546. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
  547. package/dist/src/styles/cytoscape/mappings.js +92 -0
  548. package/dist/src/styles/cytoscape/mappings.js.map +1 -1
  549. package/dist/src/styles/cytoscape/resolve.d.ts +46 -3
  550. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  551. package/dist/src/styles/cytoscape/resolve.js +632 -22
  552. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  553. package/dist/src/styles/cytoscape/translate.d.ts.map +1 -1
  554. package/dist/src/styles/cytoscape/translate.js +10 -10
  555. package/dist/src/styles/cytoscape/translate.js.map +1 -1
  556. package/dist/src/styles/defaults.d.ts +50 -0
  557. package/dist/src/styles/defaults.d.ts.map +1 -1
  558. package/dist/src/styles/defaults.js +315 -37
  559. package/dist/src/styles/defaults.js.map +1 -1
  560. package/dist/src/styles/index.d.ts +4 -3
  561. package/dist/src/styles/index.d.ts.map +1 -1
  562. package/dist/src/styles/index.js +3 -2
  563. package/dist/src/styles/index.js.map +1 -1
  564. package/dist/src/styles/internal.d.ts +1 -0
  565. package/dist/src/styles/internal.d.ts.map +1 -1
  566. package/dist/src/styles/internal.js +1 -0
  567. package/dist/src/styles/internal.js.map +1 -1
  568. package/dist/src/styles/io/block.d.ts.map +1 -1
  569. package/dist/src/styles/io/block.js +9 -0
  570. package/dist/src/styles/io/block.js.map +1 -1
  571. package/dist/src/styles/io/generic.d.ts.map +1 -1
  572. package/dist/src/styles/io/generic.js +56 -16
  573. package/dist/src/styles/io/generic.js.map +1 -1
  574. package/dist/src/styles/io/round-trip.d.ts +56 -0
  575. package/dist/src/styles/io/round-trip.d.ts.map +1 -0
  576. package/dist/src/styles/io/round-trip.js +138 -0
  577. package/dist/src/styles/io/round-trip.js.map +1 -0
  578. package/dist/src/styles/io/writer.d.ts.map +1 -1
  579. package/dist/src/styles/io/writer.js +13 -4
  580. package/dist/src/styles/io/writer.js.map +1 -1
  581. package/dist/src/styles/notes.d.ts.map +1 -1
  582. package/dist/src/styles/notes.js +1 -0
  583. package/dist/src/styles/notes.js.map +1 -1
  584. package/dist/src/styles/plan/features.d.ts +1 -1
  585. package/dist/src/styles/plan/features.d.ts.map +1 -1
  586. package/dist/src/styles/plan/features.js +22 -2
  587. package/dist/src/styles/plan/features.js.map +1 -1
  588. package/dist/src/styles/plan/index.d.ts +1 -1
  589. package/dist/src/styles/plan/index.d.ts.map +1 -1
  590. package/dist/src/styles/plan/index.js +1 -1
  591. package/dist/src/styles/plan/index.js.map +1 -1
  592. package/dist/src/styles/plan/plan.d.ts.map +1 -1
  593. package/dist/src/styles/plan/plan.js +61 -4
  594. package/dist/src/styles/plan/plan.js.map +1 -1
  595. package/dist/src/styles/plan/resolve.d.ts +13 -1
  596. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  597. package/dist/src/styles/plan/resolve.js +53 -6
  598. package/dist/src/styles/plan/resolve.js.map +1 -1
  599. package/dist/src/styles/slots.d.ts +14 -0
  600. package/dist/src/styles/slots.d.ts.map +1 -0
  601. package/dist/src/styles/slots.js +20 -0
  602. package/dist/src/styles/slots.js.map +1 -0
  603. package/dist/src/styles/types.d.ts +638 -5
  604. package/dist/src/styles/types.d.ts.map +1 -1
  605. package/dist/src/styles/vocabulary.d.ts +3 -2
  606. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  607. package/dist/src/styles/vocabulary.js +218 -1
  608. package/dist/src/styles/vocabulary.js.map +1 -1
  609. package/dist/src/types.d.ts +19 -5
  610. package/dist/src/types.d.ts.map +1 -1
  611. package/dist/src/types.js.map +1 -1
  612. package/dist/styles.js +29 -238
  613. package/dist/styles.js.map +1 -1
  614. package/dist/xgmml.js +3 -3
  615. package/docs/samples/people.json +6 -0
  616. package/package.json +53 -8
  617. package/src/common/report.ts +27 -7
  618. package/src/formats/cx/importer.ts +6 -1
  619. package/src/formats/cx/styles.ts +144 -9
  620. package/src/formats/cx2/importer.ts +1 -0
  621. package/src/formats/cx2/styles.ts +3 -1
  622. package/src/formats/cys/importer.ts +1 -0
  623. package/src/formats/cys/styles.ts +27 -5
  624. package/src/formats/dot/drawing.ts +799 -0
  625. package/src/formats/dot/importer.ts +120 -35
  626. package/src/formats/dot/label-places.ts +228 -0
  627. package/src/formats/dot/record.ts +336 -0
  628. package/src/formats/dot/styles.ts +1657 -154
  629. package/src/formats/gexf/dialog-metrics.ts +61 -0
  630. package/src/formats/gexf/importer.ts +50 -5
  631. package/src/formats/gexf/preview.ts +217 -0
  632. package/src/formats/gexf/schema.ts +2 -1
  633. package/src/formats/gexf/styles.ts +1144 -142
  634. package/src/formats/gml/importer.ts +291 -76
  635. package/src/formats/gml/index.ts +1 -1
  636. package/src/formats/gml/positions.ts +29 -7
  637. package/src/formats/gml/styles.ts +854 -111
  638. package/src/formats/graphml/styles-plain.ts +8 -23
  639. package/src/formats/graphml/styles-yed.ts +821 -159
  640. package/src/formats/graphml/styles-yfiles3.ts +485 -63
  641. package/src/formats/graphml/yfiles.ts +19 -6
  642. package/src/formats/json/dialect.ts +41 -5
  643. package/src/formats/json/importer.ts +59 -7
  644. package/src/formats/json/index.ts +1 -0
  645. package/src/formats/json/positions.ts +22 -5
  646. package/src/formats/json/styles.ts +2041 -185
  647. package/src/formats/pajek/draw.ts +458 -0
  648. package/src/formats/pajek/exporter.ts +81 -49
  649. package/src/formats/pajek/importer.ts +278 -103
  650. package/src/formats/pajek/index.ts +1 -0
  651. package/src/formats/pajek/styles.ts +1382 -133
  652. package/src/formats/pajek/syntax.ts +27 -2
  653. package/src/formats/xgmml/emit.ts +73 -5
  654. package/src/formats/xgmml/styles.ts +331 -71
  655. package/src/index.ts +94 -0
  656. package/src/positions/convert.ts +12 -1
  657. package/src/positions/extract.ts +55 -1
  658. package/src/positions/index.ts +1 -0
  659. package/src/positions/types.ts +60 -0
  660. package/src/registry.ts +326 -1
  661. package/src/sources/builtins.ts +63 -0
  662. package/src/sources/codes.ts +235 -0
  663. package/src/sources/context.ts +894 -0
  664. package/src/sources/credentials.ts +409 -0
  665. package/src/sources/cypher/descriptor.ts +131 -0
  666. package/src/sources/cypher/flatten.ts +323 -0
  667. package/src/sources/cypher/index.ts +628 -0
  668. package/src/sources/cypher/params.ts +41 -0
  669. package/src/sources/cypher/profiles.ts +78 -0
  670. package/src/sources/cypher/query-builder.ts +327 -0
  671. package/src/sources/cypher/transports/bolt.ts +228 -0
  672. package/src/sources/cypher/transports/neptune-analytics.ts +41 -0
  673. package/src/sources/cypher/transports/neptune-https.ts +122 -0
  674. package/src/sources/cypher/transports/query-api.ts +100 -0
  675. package/src/sources/cypher/transports/transport.ts +139 -0
  676. package/src/sources/cypher/types-map.ts +418 -0
  677. package/src/sources/define.ts +195 -0
  678. package/src/sources/fail.ts +70 -0
  679. package/src/sources/ids.ts +80 -0
  680. package/src/sources/ndex/client.ts +102 -0
  681. package/src/sources/ndex/descriptor.ts +64 -0
  682. package/src/sources/ndex/expand.ts +100 -0
  683. package/src/sources/ndex/index.ts +235 -0
  684. package/src/sources/ndex/params.ts +17 -0
  685. package/src/sources/ndex/share-url.ts +84 -0
  686. package/src/sources/params.ts +32 -0
  687. package/src/sources/registry.ts +325 -0
  688. package/src/sources/rest/descriptor.ts +79 -0
  689. package/src/sources/rest/index.ts +22 -0
  690. package/src/sources/rest/mapping.ts +401 -0
  691. package/src/sources/rest/openalex.ts +288 -0
  692. package/src/sources/rest/paging.ts +180 -0
  693. package/src/sources/rest/params.ts +243 -0
  694. package/src/sources/rest/records.ts +289 -0
  695. package/src/sources/rest/samples/deps-dev.ts +49 -0
  696. package/src/sources/rest/samples/string.ts +44 -0
  697. package/src/sources/rest/selectors.ts +91 -0
  698. package/src/sources/rest/source.ts +776 -0
  699. package/src/sources/rest/templates.ts +151 -0
  700. package/src/sources/run.ts +793 -0
  701. package/src/sources/sha256.ts +99 -0
  702. package/src/sources/sigv4.ts +209 -0
  703. package/src/sources/sparql/descriptor.ts +67 -0
  704. package/src/sources/sparql/index.ts +356 -0
  705. package/src/sources/sparql/ntriples.ts +219 -0
  706. package/src/sources/sparql/params.ts +28 -0
  707. package/src/sources/sparql/query.ts +162 -0
  708. package/src/sources/testing.ts +210 -0
  709. package/src/sources/types.ts +776 -0
  710. package/src/styles/annotations.ts +201 -27
  711. package/src/styles/canon/bends.ts +137 -0
  712. package/src/styles/canon/color-tables.ts +10 -4
  713. package/src/styles/canon/color.ts +105 -3
  714. package/src/styles/canon/enums.ts +99 -8
  715. package/src/styles/canon/graphviz.ts +71 -10
  716. package/src/styles/canon/number.ts +19 -0
  717. package/src/styles/canon/text.ts +187 -16
  718. package/src/styles/codes.ts +2 -0
  719. package/src/styles/cyjs/cascade.ts +1193 -38
  720. package/src/styles/cyjs/defaults-table.ts +5 -0
  721. package/src/styles/cyjs/emit.ts +247 -16
  722. package/src/styles/cyjs/face.ts +372 -0
  723. package/src/styles/cyjs/mappers.ts +498 -28
  724. package/src/styles/cyjs/routes.ts +432 -0
  725. package/src/styles/cytoscape/charts.ts +684 -0
  726. package/src/styles/cytoscape/emit.ts +220 -44
  727. package/src/styles/cytoscape/lexicon.ts +459 -80
  728. package/src/styles/cytoscape/mappings.ts +108 -0
  729. package/src/styles/cytoscape/resolve.ts +763 -23
  730. package/src/styles/cytoscape/translate.ts +11 -11
  731. package/src/styles/defaults.ts +436 -38
  732. package/src/styles/index.ts +5 -0
  733. package/src/styles/internal.ts +1 -0
  734. package/src/styles/io/block.ts +10 -0
  735. package/src/styles/io/generic.ts +79 -23
  736. package/src/styles/io/round-trip.ts +202 -0
  737. package/src/styles/io/writer.ts +14 -4
  738. package/src/styles/notes.ts +1 -0
  739. package/src/styles/plan/features.ts +23 -2
  740. package/src/styles/plan/index.ts +1 -1
  741. package/src/styles/plan/plan.ts +69 -5
  742. package/src/styles/plan/resolve.ts +61 -6
  743. package/src/styles/slots.ts +25 -0
  744. package/src/styles/types.ts +658 -4
  745. package/src/styles/vocabulary.ts +226 -3
  746. package/src/types.ts +19 -5
  747. package/dist/chunks/block-DiGq58c3.js.map +0 -1
  748. package/dist/chunks/choose--jM0yYCo.js +0 -57
  749. package/dist/chunks/choose--jM0yYCo.js.map +0 -1
  750. package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
  751. package/dist/chunks/emit-CwU8cUmG.js.map +0 -1
  752. package/dist/chunks/export-BvqAXCKh.js.map +0 -1
  753. package/dist/chunks/exporter-CrDWIyiq.js.map +0 -1
  754. package/dist/chunks/format-BpQBx8MZ.js.map +0 -1
  755. package/dist/chunks/generic-Dq1ntt9q.js.map +0 -1
  756. package/dist/chunks/importer-BSvfrX_h.js.map +0 -1
  757. package/dist/chunks/importer-CMmeMWlC.js.map +0 -1
  758. package/dist/chunks/importer-COTK9Tsl.js.map +0 -1
  759. package/dist/chunks/importer-DiZRmOQG.js.map +0 -1
  760. package/dist/chunks/importer-e6LGpqHB.js.map +0 -1
  761. package/dist/chunks/importer-iFYPEKaJ.js.map +0 -1
  762. package/dist/chunks/importer-yh_aBCU6.js.map +0 -1
  763. package/dist/chunks/lexicon-CT69Kd87.js.map +0 -1
  764. package/dist/chunks/styles-BQnsga7p.js.map +0 -1
  765. package/dist/chunks/styles-D3fRphrO.js +0 -690
  766. package/dist/chunks/styles-D3fRphrO.js.map +0 -1
  767. package/dist/chunks/styles-yed-BF5x3_Y5.js +0 -842
  768. package/dist/chunks/styles-yed-BF5x3_Y5.js.map +0 -1
  769. package/dist/chunks/writer-DMKvthQE.js +0 -448
  770. package/dist/chunks/writer-DMKvthQE.js.map +0 -1
@@ -0,0 +1,78 @@
1
+ /**
2
+ * What differs between openCypher servers (design section 12.2, "the profile"): the id
3
+ * expression, and the server facts `probe` reports. Everything else in the Cypher source is shared.
4
+ */
5
+
6
+ /** The facts of one server the Cypher source talks to. */
7
+ export interface CypherProfile {
8
+ /** "neo4j" or "neptune". */
9
+ readonly name: "neo4j" | "neptune";
10
+ /** true: ids are `elementId(n)` (Neo4j 5 and later); false: `id(n)` (Neo4j before 5, Neptune's `~id`). */
11
+ readonly elementIds: boolean;
12
+ /** The product, as the server names it. */
13
+ readonly product: string;
14
+ /** The server's version, when known. */
15
+ readonly version: string | null;
16
+ /** "enforced": the server refuses writes in this session; "not-enforced": nothing in the request does. */
17
+ readonly readOnly: "enforced" | "not-enforced";
18
+ }
19
+
20
+ /**
21
+ * The Neo4j profile for a version: `elementId()` from 5.0, `id()` before.
22
+ * @param version - the server's version, or null when not known (assumed 5 or later)
23
+ * @param product - the product name
24
+ * @returns the profile
25
+ */
26
+ export function neo4jProfile(version: string | null, product = "Neo4j"): CypherProfile {
27
+ const major = version === null ? Number.NaN : Number.parseInt(version, 10);
28
+ return {
29
+ name: "neo4j",
30
+ elementIds: Number.isNaN(major) || major >= 5,
31
+ product,
32
+ version,
33
+ readOnly: "enforced",
34
+ };
35
+ }
36
+
37
+ /**
38
+ * The profile of a Bolt server from its agent string ("Neo4j/3.5.12"). A server that is not Neo4j
39
+ * gets `id()`, which every openCypher server has.
40
+ * @param agent - the server agent
41
+ * @returns the profile
42
+ */
43
+ export function profileFromAgent(agent: string): CypherProfile {
44
+ const [product = "", version = ""] = agent.split("/");
45
+ if (product.toLowerCase() === "neo4j") {
46
+ return neo4jProfile(version === "" ? null : version);
47
+ }
48
+ return {
49
+ name: "neo4j",
50
+ elementIds: false,
51
+ product,
52
+ version: version === "" ? null : version,
53
+ readOnly: "enforced",
54
+ };
55
+ }
56
+
57
+ /**
58
+ * The Neptune profile: ids are `id(n)`, the `~id` string, never reused.
59
+ * @param version - the engine version, when known
60
+ * @returns the profile
61
+ */
62
+ export function neptuneProfile(version: string | null = null): CypherProfile {
63
+ return { name: "neptune", elementIds: false, product: "Neptune", version, readOnly: "not-enforced" };
64
+ }
65
+
66
+ /**
67
+ * The server facts of a profile, as `probe` and `report.source.server` give them.
68
+ * @param profile - the profile
69
+ * @returns the facts
70
+ */
71
+ export function serverFacts(profile: CypherProfile): Readonly<Record<string, string>> {
72
+ return {
73
+ product: profile.product,
74
+ profile: profile.name,
75
+ readOnly: profile.readOnly,
76
+ ...(profile.version === null ? {} : { version: profile.version }),
77
+ };
78
+ }
@@ -0,0 +1,327 @@
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
+
9
+ import { type ImportReportBuilder } from "../../common/report.js";
10
+ import { failAlone, failOn } from "../fail.js";
11
+ import { type CypherProfile } from "./profiles.js";
12
+
13
+ /** The deepest neighborhood a generated query asks for. */
14
+ export const MAX_DEPTH = 10;
15
+
16
+ /** The largest page of mode "all". */
17
+ export const MAX_PAGE_SIZE = 100_000;
18
+
19
+ /** The page size of mode "all" when the caller gives none. */
20
+ export const DEFAULT_PAGE_SIZE = 1000;
21
+
22
+ /**
23
+ * Why an identifier cannot be quoted, or null when it can.
24
+ * @param name - the identifier
25
+ * @returns the reason, or null
26
+ */
27
+ function identifierProblem(name: unknown): string | null {
28
+ return typeof name !== "string" || name === "" || name.includes("\u0000") ? "identifier" : null;
29
+ }
30
+
31
+ /**
32
+ * Quote one Cypher identifier (a label, relationship type or property key) for a query: wrapped in
33
+ * backticks, with every backtick inside doubled, so no value can end the identifier early. An
34
+ * empty name, or one with a NUL character, is refused (E_SOURCE_PARAM, reason "identifier").
35
+ * Experimental.
36
+ * @param name - the identifier
37
+ * @returns the quoted identifier
38
+ * @example
39
+ * ```ts
40
+ * cypherIdentifier("Person"); // "`Person`"
41
+ * cypherIdentifier("odd`name"); // "`odd``name`"
42
+ * ```
43
+ * @category Network sources
44
+ */
45
+ export function cypherIdentifier(name: string): string {
46
+ if (identifierProblem(name) !== null) {
47
+ failAlone("E_SOURCE_PARAM", "a Cypher identifier must be a non-empty string without NUL", {
48
+ name: "identifier",
49
+ reason: "identifier",
50
+ });
51
+ }
52
+ return `\`${name.replaceAll("`", "``")}\``;
53
+ }
54
+
55
+ /**
56
+ * Quote an identifier a parameter gave, failing the load when it cannot be.
57
+ * @param name - the identifier
58
+ * @param param - the parameter it came from
59
+ * @param report - the load's report
60
+ * @returns the quoted identifier
61
+ */
62
+ export function quoted(name: unknown, param: string, report: ImportReportBuilder): string {
63
+ if (identifierProblem(name) !== null) {
64
+ failOn(report, "E_SOURCE_PARAM", `parameter ${param}: not a Cypher identifier`, {
65
+ name: param,
66
+ reason: "identifier",
67
+ });
68
+ }
69
+ return cypherIdentifier(name as string);
70
+ }
71
+
72
+ /**
73
+ * An integer to inline, checked to lie in its range.
74
+ * @param value - the value
75
+ * @param name - the parameter it came from
76
+ * @param min - the smallest allowed
77
+ * @param max - the largest allowed
78
+ * @param report - the load's report
79
+ * @returns the integer, as query text
80
+ */
81
+ export function checkedInteger(
82
+ value: unknown,
83
+ name: string,
84
+ min: number,
85
+ max: number,
86
+ report: ImportReportBuilder,
87
+ ): string {
88
+ if (typeof value !== "number" || !Number.isInteger(value)) {
89
+ failOn(report, "E_SOURCE_PARAM", `parameter ${name}: not an integer`, { name, reason: "type" });
90
+ }
91
+ if (value < min || value > max) {
92
+ failOn(report, "E_SOURCE_PARAM", `parameter ${name}: outside ${String(min)} to ${String(max)}`, {
93
+ name,
94
+ reason: "range",
95
+ });
96
+ }
97
+ return String(value);
98
+ }
99
+
100
+ /** What narrows a generated query: compiled into it, so filtering happens at the source. */
101
+ export interface QueryFilters {
102
+ /** Quoted labels; a node must have one of them. */
103
+ readonly labels: readonly string[];
104
+ /** Quoted relationship types. */
105
+ readonly relationshipTypes: readonly string[];
106
+ /** The quoted id property, or null for the server's id. */
107
+ readonly idProperty: string | null;
108
+ }
109
+
110
+ /**
111
+ * The id expression of a node or relationship variable.
112
+ * @param v - the variable
113
+ * @param profile - the server's profile
114
+ * @param filters - the id property, for a node
115
+ * @param node - whether `v` is a node
116
+ * @returns the expression
117
+ */
118
+ function idExpression(v: string, profile: CypherProfile, filters: QueryFilters, node = true): string {
119
+ if (node && filters.idProperty !== null) {
120
+ return `${v}.${filters.idProperty}`;
121
+ }
122
+ return profile.elementIds ? `elementId(${v})` : `id(${v})`;
123
+ }
124
+
125
+ /**
126
+ * The node predicate of the label and id property filters, or null.
127
+ * @param v - the node variable
128
+ * @param filters - the filters
129
+ * @returns the predicate
130
+ */
131
+ function nodePredicate(v: string, filters: QueryFilters): string | null {
132
+ const parts: string[] = [];
133
+ if (filters.labels.length > 0) {
134
+ const prefix = `${v}:`;
135
+ parts.push(`(${filters.labels.map((l) => prefix + l).join(" OR ")})`);
136
+ }
137
+ if (filters.idProperty !== null) {
138
+ parts.push(`${v}.${filters.idProperty} IS NOT NULL`);
139
+ }
140
+ return parts.length === 0 ? null : parts.join(" AND ");
141
+ }
142
+
143
+ /**
144
+ * The relationship type part of a pattern: `:`A`|`B``, or "".
145
+ * @param filters - the filters
146
+ * @returns the pattern text
147
+ */
148
+ function typesPattern(filters: QueryFilters): string {
149
+ return filters.relationshipTypes.length === 0 ? "" : `:${filters.relationshipTypes.join("|")}`;
150
+ }
151
+
152
+ /**
153
+ * The degree hint of a node variable: its relationship count, by pattern comprehension.
154
+ * @param v - the variable
155
+ * @returns the expression
156
+ */
157
+ function degreeOf(v: string): string {
158
+ return `size([(${v})--() | 1])`;
159
+ }
160
+
161
+ /** The arrows of each direction around a relationship pattern. */
162
+ const ARROWS = { out: ["-", "->"], in: ["<-", "-"], both: ["-", "-"] } as const;
163
+
164
+ /**
165
+ * One page of the nodes of mode "all", ordered by the id expression (keyset paging, never SKIP).
166
+ * @param profile - the server's profile
167
+ * @param filters - the filters
168
+ * @param pageSize - the checked page size, as text
169
+ * @param after - whether the page starts after `$after`
170
+ * @param degree - whether to add the degree hint
171
+ * @returns the statement; it reads `$after`
172
+ */
173
+ export function nodePage(
174
+ profile: CypherProfile,
175
+ filters: QueryFilters,
176
+ pageSize: string,
177
+ after: boolean,
178
+ degree: boolean,
179
+ ): string {
180
+ const where = nodePredicate("n", filters);
181
+ return [
182
+ "MATCH (n)",
183
+ where === null ? null : `WHERE ${where}`,
184
+ `WITH n, ${idExpression("n", profile, filters)} AS key`,
185
+ after ? "WHERE key > $after" : null,
186
+ degree ? `RETURN n, key, ${degreeOf("n")} AS degree` : "RETURN n, key",
187
+ `ORDER BY key LIMIT ${pageSize}`,
188
+ ]
189
+ .filter((l) => l !== null)
190
+ .join(" ");
191
+ }
192
+
193
+ /**
194
+ * One page of the relationships of mode "all", with their end nodes, ordered by the relationship
195
+ * id expression.
196
+ * @param profile - the server's profile
197
+ * @param filters - the filters
198
+ * @param pageSize - the checked page size, as text
199
+ * @param after - whether the page starts after `$after`
200
+ * @returns the statement; it reads `$after`
201
+ */
202
+ export function edgePage(profile: CypherProfile, filters: QueryFilters, pageSize: string, after: boolean): string {
203
+ const a = nodePredicate("a", filters);
204
+ const b = nodePredicate("b", filters);
205
+ const where = [a, b].filter((p) => p !== null);
206
+ return [
207
+ `MATCH (a)-[r${typesPattern(filters)}]->(b)`,
208
+ where.length === 0 ? null : `WHERE ${where.join(" AND ")}`,
209
+ `WITH a, r, b, ${idExpression("r", profile, filters, false)} AS key`,
210
+ after ? "WHERE key > $after" : null,
211
+ "RETURN a, r, b, key",
212
+ `ORDER BY key LIMIT ${pageSize}`,
213
+ ]
214
+ .filter((l) => l !== null)
215
+ .join(" ");
216
+ }
217
+
218
+ /**
219
+ * The relationships among the nodes a capped mode "all" has loaded: both ends at or before the
220
+ * node page's last key `$last`, and, after the first page, one end past the previous page's last
221
+ * key `$after`, so each relationship arrives with the page that loads its later end.
222
+ * @param profile - the server's profile
223
+ * @param filters - the filters
224
+ * @param after - whether earlier pages were loaded
225
+ * @returns the statement; it reads `$last` and `$after`
226
+ */
227
+ export function edgesAmong(profile: CypherProfile, filters: QueryFilters, after: boolean): string {
228
+ const where = [nodePredicate("a", filters), nodePredicate("b", filters)].filter((p) => p !== null);
229
+ return [
230
+ `MATCH (a)-[r${typesPattern(filters)}]->(b)`,
231
+ where.length === 0 ? null : `WHERE ${where.join(" AND ")}`,
232
+ `WITH a, r, b, ${idExpression("a", profile, filters)} AS ka, ${idExpression("b", profile, filters)} AS kb`,
233
+ `WHERE ka <= $last AND kb <= $last${after ? " AND (ka > $after OR kb > $after)" : ""}`,
234
+ "RETURN a, r, b",
235
+ ]
236
+ .filter((l) => l !== null)
237
+ .join(" ");
238
+ }
239
+
240
+ /** How far a neighborhood reaches. */
241
+ interface NeighborhoodShape {
242
+ /** The checked depth, as text. */
243
+ readonly depth: string;
244
+ /** Which way relationships are followed. */
245
+ readonly direction: "out" | "in" | "both";
246
+ /** The checked path limit, as text, or null for none. */
247
+ readonly limit: string | null;
248
+ /** Whether the page starts after the neighbor key `$after` (a capped expansion's next page). */
249
+ readonly after?: boolean;
250
+ }
251
+
252
+ /**
253
+ * The neighborhood of the seeds `$ids`: every path up to `depth` hops, each seed included even with
254
+ * no neighbor, plus the degree of every node returned.
255
+ * @param profile - the server's profile
256
+ * @param filters - the filters
257
+ * @param shape - depth, direction and limit
258
+ * @param degree - whether to add the degree hint
259
+ * @returns the statement; it reads `$ids`
260
+ */
261
+ export function neighborhood(
262
+ profile: CypherProfile,
263
+ filters: QueryFilters,
264
+ shape: NeighborhoodShape,
265
+ degree: boolean,
266
+ ): string {
267
+ const rel = `[${typesPattern(filters)}*1..${shape.depth}]`;
268
+ const [left, right] = ARROWS[shape.direction];
269
+ const pattern = `${left}${rel}${right}`;
270
+ const x = nodePredicate("x", filters);
271
+ const degrees = degree
272
+ ? `, [m IN CASE WHEN p IS NULL THEN [s] ELSE nodes(p) END | [${idExpression("m", profile, filters)}, ${degreeOf("m")}]] AS degrees`
273
+ : "";
274
+ // A capped expansion is ordered by the neighbor's key, so its next page starts after the last
275
+ // key it returned. ponytail: a page boundary falling between two paths to the same neighbor
276
+ // (parallel relationships, or depth > 1) drops the later paths; page on (key, path) if that matters.
277
+ const head = [
278
+ `MATCH (s) WHERE ${idExpression("s", profile, filters)} IN $ids`,
279
+ `OPTIONAL MATCH p = (s)${pattern}(x)${whereClause(x)}`,
280
+ ];
281
+ if (shape.limit === null) {
282
+ return [...head, "WITH s, p", `RETURN s, p${degrees}`].join(" ");
283
+ }
284
+ return [
285
+ ...head,
286
+ `WITH s, p, ${idExpression("x", profile, filters)} AS key`,
287
+ shape.after === true ? "WHERE key > $after" : null,
288
+ `WITH s, p, key ORDER BY key LIMIT ${shape.limit}`,
289
+ `RETURN s, p, key${degrees}`,
290
+ ]
291
+ .filter((l) => l !== null)
292
+ .join(" ");
293
+ }
294
+
295
+ /**
296
+ * A ` WHERE` clause for a predicate.
297
+ * @param predicate - the predicate, or null
298
+ * @returns the clause with its leading space, or "" for no predicate
299
+ */
300
+ function whereClause(predicate: string | null): string {
301
+ return predicate === null ? "" : ` WHERE ${predicate}`;
302
+ }
303
+
304
+ /**
305
+ * The counts of mode "all", for a progress total.
306
+ * @param filters - the filters
307
+ * @returns two statements: the nodes, then the relationships
308
+ */
309
+ export function counts(filters: QueryFilters): readonly [string, string] {
310
+ const n = nodePredicate("n", filters);
311
+ const where = [nodePredicate("a", filters), nodePredicate("b", filters)].filter((p) => p !== null);
312
+ return [
313
+ `MATCH (n)${whereClause(n)} RETURN count(n) AS c`,
314
+ `MATCH (a)-[r${typesPattern(filters)}]->(b)${whereClause(where.length === 0 ? null : where.join(" AND "))} RETURN count(r) AS c`,
315
+ ];
316
+ }
317
+
318
+ /**
319
+ * The node count of a mode "all" load with at most one label and the server's ids: a pattern
320
+ * Neo4j answers from its count store in one cheap lookup, whatever the graph's size.
321
+ * @param label - the quoted label, or undefined for every node
322
+ * @returns the statement
323
+ */
324
+ export function storeCount(label: string | undefined): string {
325
+ const pattern = label === undefined ? "n" : `n:${label}`;
326
+ return `MATCH (${pattern}) RETURN count(n) AS c`;
327
+ }
@@ -0,0 +1,228 @@
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
+
15
+ import { throwIfAborted } from "../../../common/input.js";
16
+ import { isLoopback, transportOptions } from "../../context.js";
17
+ import { originOf, unwrapCredential } from "../../credentials.js";
18
+ import { failOn } from "../../fail.js";
19
+ import { type QueryResult } from "../flatten.js";
20
+ import { type CypherProfile, profileFromAgent } from "../profiles.js";
21
+ import { type DriverTypes, fromDriver } from "../types-map.js";
22
+ import { serverError, type Transport, type TransportInput } from "./transport.js";
23
+
24
+ /** The optional peer dependency. */
25
+ const DRIVER_PACKAGE = "neo4j-driver";
26
+
27
+ /** The URL schemes of a direct Bolt connection. */
28
+ const DIRECT_SCHEMES = new Set(["bolt:", "bolt+s:", "bolt+ssc:"]);
29
+
30
+ /** The parts of a neo4j-driver session this transport uses. */
31
+ interface DriverSession {
32
+ run(
33
+ statement: string,
34
+ parameters: Readonly<Record<string, unknown>>,
35
+ config?: { readonly timeout?: number },
36
+ ): Promise<{
37
+ readonly records: readonly { readonly keys: readonly PropertyKey[]; get(key: PropertyKey): unknown }[];
38
+ }>;
39
+ close(): Promise<void>;
40
+ }
41
+
42
+ /** The parts of a neo4j-driver driver this transport uses. */
43
+ interface Driver {
44
+ session(config: { readonly defaultAccessMode: string; readonly database?: string }): DriverSession;
45
+ getServerInfo(): Promise<{ readonly agent?: string }>;
46
+ close(): Promise<void>;
47
+ }
48
+
49
+ /** The parts of the neo4j-driver module this transport uses. */
50
+ interface DriverModule extends DriverTypes {
51
+ driver(url: string, auth?: unknown, config?: Readonly<Record<string, unknown>>): Driver;
52
+ readonly auth: { basic(user: string, password: string): unknown; bearer(token: string): unknown };
53
+ readonly session: { readonly READ: string };
54
+ }
55
+
56
+ /**
57
+ * Import the optional peer dependency.
58
+ * @param input - the transport input
59
+ * @returns the driver module
60
+ */
61
+ async function loadDriver(input: TransportInput): Promise<DriverModule> {
62
+ let mod: { default?: DriverModule } & Partial<DriverModule>;
63
+ try {
64
+ mod = (await import("neo4j-driver")) as unknown as typeof mod;
65
+ } catch {
66
+ return failOn(input.ctx.report, "E_SOURCE_RUNTIME", `the bolt transport needs ${DRIVER_PACKAGE} installed`, {
67
+ runtime: input.ctx.runtime,
68
+ reason: "needs-peer-dependency",
69
+ package: DRIVER_PACKAGE,
70
+ });
71
+ }
72
+ return mod.default ?? (mod as DriverModule);
73
+ }
74
+
75
+ /**
76
+ * Fail when an https page would open a plain Bolt WebSocket to another machine, which the browser
77
+ * blocks.
78
+ * @param ctx - the context
79
+ * @param url - the endpoint
80
+ */
81
+ function refuseMixedContent(ctx: TransportInput["ctx"], url: URL): void {
82
+ const page = (globalThis as { location?: { protocol?: string } }).location;
83
+ if (
84
+ ctx.runtime === "browser" &&
85
+ page?.protocol === "https:" &&
86
+ url.protocol === "bolt:" &&
87
+ !isLoopback(url.hostname)
88
+ ) {
89
+ failOn(ctx.report, "E_SOURCE_RUNTIME", "an https page cannot open a plain Bolt WebSocket", {
90
+ runtime: ctx.runtime,
91
+ reason: "insecure-endpoint",
92
+ });
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Check the endpoint and the credential before connecting, and turn the credential into the
98
+ * driver's auth token.
99
+ * @param input - the transport input
100
+ * @param neo4j - the driver module
101
+ * @returns the URL and auth token
102
+ */
103
+ async function connection(input: TransportInput, neo4j: DriverModule): Promise<{ url: URL; auth: unknown }> {
104
+ const { ctx } = input;
105
+ const { report } = ctx;
106
+ const bad = (reason: string, message: string): never =>
107
+ failOn(report, "E_SOURCE_PARAM", message, { name: "endpoint", reason });
108
+ const url = ctx.endpoint ?? bad("missing", "the bolt transport needs an endpoint");
109
+ if (!DIRECT_SCHEMES.has(url.protocol)) {
110
+ bad(url.protocol.startsWith("neo4j") ? "routing" : "scheme", `${url.protocol} is not a direct Bolt scheme`);
111
+ }
112
+ refuseMixedContent(ctx, url);
113
+ const { credential, allowInsecure } = transportOptions(ctx);
114
+ const origin = originOf(url);
115
+ const bound = credential !== undefined && (credential.origins.length === 0 || credential.origins.includes(origin));
116
+ if (!bound || credential === undefined) {
117
+ return { url, auth: undefined };
118
+ }
119
+ if (url.protocol === "bolt+ssc:") {
120
+ bad("unverified-tls", "bolt+ssc accepts any certificate, so no credential is sent over it");
121
+ }
122
+ if (url.protocol === "bolt:" && !isLoopback(url.hostname) && allowInsecure !== true) {
123
+ bad("insecure-endpoint", "a credential is never sent without TLS");
124
+ }
125
+ const secret = unwrapCredential(credential);
126
+ if (secret !== undefined && "username" in secret) {
127
+ return { url, auth: neo4j.auth.basic(secret.username, secret.password) };
128
+ }
129
+ if (secret !== undefined && "token" in secret) {
130
+ const token = typeof secret.token === "string" ? secret.token : await secret.token();
131
+ return { url, auth: neo4j.auth.bearer(token) };
132
+ }
133
+ return failOn(report, "E_SOURCE_PARAM", "the bolt transport takes a basic or bearer credential", {
134
+ name: "credential",
135
+ reason: "kind",
136
+ });
137
+ }
138
+
139
+ /**
140
+ * Make the transport: import the driver, check the endpoint and credential, open a READ session.
141
+ * @param input - the context, params and mapper
142
+ * @returns the transport
143
+ */
144
+ export async function boltTransport(input: TransportInput): Promise<Transport> {
145
+ const { ctx, params, m } = input;
146
+ throwIfAborted(ctx.signal);
147
+ const neo4j = await loadDriver(input);
148
+ const { url, auth } = await connection(input, neo4j);
149
+ throwIfAborted(ctx.signal);
150
+ const origin = originOf(url);
151
+ const { userAgent } = transportOptions(ctx);
152
+ const driver = neo4j.driver(`${url.protocol}//${url.host}`, auth, userAgent === undefined ? {} : { userAgent });
153
+ const session = driver.session({
154
+ defaultAccessMode: neo4j.session.READ,
155
+ ...(params.database === undefined ? {} : { database: params.database }),
156
+ });
157
+ let closed: Promise<void> | null = null;
158
+ const close = (): Promise<void> => {
159
+ closed ??= session
160
+ .close()
161
+ .catch(() => undefined)
162
+ .then(() => driver.close())
163
+ .catch(() => undefined);
164
+ return closed;
165
+ };
166
+ const onAbort = (): void => {
167
+ void close();
168
+ };
169
+ ctx.signal.addEventListener("abort", onAbort, { once: true });
170
+
171
+ const fail = (err: unknown): never => {
172
+ throwIfAborted(ctx.signal);
173
+ const e = err as { code?: unknown; message?: unknown };
174
+ const code = typeof e.code === "string" ? e.code : null;
175
+ if (code === null || code === "ServiceUnavailable" || code === "SessionExpired") {
176
+ return ctx.runtime === "browser"
177
+ ? failOn(ctx.report, "E_SOURCE_BLOCKED", `${origin} could not be reached over Bolt`, {
178
+ url: origin,
179
+ cause: "unknown",
180
+ })
181
+ : failOn(ctx.report, "E_FETCH", `${origin} could not be reached over Bolt`, {
182
+ url: origin,
183
+ status: null,
184
+ });
185
+ }
186
+ return serverError(
187
+ ctx.report,
188
+ {
189
+ code,
190
+ message: typeof e.message === "string" ? e.message : "",
191
+ status: null,
192
+ showable: code.startsWith("Neo.ClientError."),
193
+ },
194
+ origin,
195
+ params.database,
196
+ );
197
+ };
198
+
199
+ let detected: CypherProfile | null = null;
200
+ const profile = async (): Promise<CypherProfile> => {
201
+ if (detected === null) {
202
+ const info = await driver.getServerInfo().catch(fail);
203
+ detected = profileFromAgent(info.agent ?? "");
204
+ }
205
+ return detected;
206
+ };
207
+ const timeout = ctx.limits.timeoutMs;
208
+
209
+ return {
210
+ async run(statement, parameters): Promise<QueryResult> {
211
+ throwIfAborted(ctx.signal);
212
+ const result = await session
213
+ .run(statement, parameters, timeout === undefined ? undefined : { timeout })
214
+ .catch(fail);
215
+ const fields = (result.records[0]?.keys ?? []).map(String);
216
+ return {
217
+ fields,
218
+ rows: result.records.map((r) => fields.map((k) => fromDriver(r.get(k), k, m, neo4j))),
219
+ };
220
+ },
221
+ profile,
222
+ probe: profile,
223
+ close: async (): Promise<void> => {
224
+ ctx.signal.removeEventListener("abort", onAbort);
225
+ await close();
226
+ },
227
+ };
228
+ }
@@ -0,0 +1,41 @@
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
+
9
+ import { type QueryResult } from "../flatten.js";
10
+ import { neptuneProfile } from "../profiles.js";
11
+ import { neptuneResult, nodeOnly } from "./neptune-https.js";
12
+ import { type Transport, type TransportInput } from "./transport.js";
13
+
14
+ /**
15
+ * Make the transport.
16
+ * @param input - the context, params and mapper
17
+ * @returns the transport
18
+ */
19
+ export function neptuneAnalyticsTransport(input: TransportInput): Transport {
20
+ const { ctx } = input;
21
+ nodeOnly(ctx, "neptune-analytics");
22
+ const run = async (statement: string, parameters: Readonly<Record<string, unknown>>): Promise<QueryResult> => {
23
+ const response = await ctx.fetch("queries", {
24
+ method: "POST",
25
+ idempotent: true,
26
+ allowStatus: [400, 500],
27
+ headers: { "Content-Type": "application/json" },
28
+ body: JSON.stringify({ query: statement, language: "OPEN_CYPHER", parameters }),
29
+ });
30
+ return neptuneResult(input, response);
31
+ };
32
+ return {
33
+ run,
34
+ profile: () => Promise.resolve(neptuneProfile()),
35
+ probe: async () => {
36
+ await run("RETURN 1 AS ok", {});
37
+ return neptuneProfile();
38
+ },
39
+ close: () => Promise.resolve(),
40
+ };
41
+ }