@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,793 @@
1
+ /**
2
+ * Running a source (design sections 2, 3 and 5): the checks before any request, the three read
3
+ * paths (`records` through the record methods, `file` through the format importers, `import`
4
+ * straight into the sink), the caps between pages, `idPrefix`, the versioned cursor, and the
5
+ * report's `source` member. graph-io keeps no state between calls.
6
+ */
7
+
8
+ import { type GraphSink, INVALID_INDEX, type NodeId, type U32 } from "@graphty/graph-format";
9
+
10
+ import { MISSING_ID_CODE } from "../common/codes.js";
11
+ import { readBytes, throwIfAborted } from "../common/input.js";
12
+ import { ImportReportBuilder } from "../common/report.js";
13
+ import { readZipDirectory, readZipEntry } from "../common/zip.js";
14
+ import { type FormatRegistry } from "../registry.js";
15
+ import { SNIFF_HEAD_BYTES } from "../sniff.js";
16
+ import { type CommonImportOptions, ImportError, type ImportInput, type ImportReport } from "../types.js";
17
+ import { type CreatedContext, createSourceContext, detectRuntime, LimitStop } from "./context.js";
18
+ import { originOf } from "./credentials.js";
19
+ import { checkParams } from "./define.js";
20
+ import { failOn, warnOn } from "./fail.js";
21
+ import { SOURCE_FORMAT_PREFIX } from "./ids.js";
22
+ import {
23
+ type GraphSource,
24
+ type LoadFromSourceOptions,
25
+ type RecordBatch,
26
+ type SourceCursor,
27
+ type SourceFile,
28
+ } from "./types.js";
29
+
30
+ /** The cursor key graph-io adds, holding the source's descriptor version. */
31
+ const CURSOR_VERSION_KEY = "~v";
32
+
33
+ /** The options that belong to the source functions, never to an importer. */
34
+ const SOURCE_OPTION_KEYS: ReadonlySet<string> = new Set([
35
+ "endpoint",
36
+ "credential",
37
+ "cursor",
38
+ "limits",
39
+ "retry",
40
+ "idPrefix",
41
+ "allowInsecure",
42
+ "fetch",
43
+ "userAgent",
44
+ "builder",
45
+ "freeze",
46
+ "onProgress",
47
+ "signal",
48
+ ]);
49
+
50
+ /** The statuses whose failure on a later page keeps the pages before it. */
51
+ const AUTH_CODES: ReadonlySet<string> = new Set(["E_SOURCE_AUTH", "E_SOURCE_FORBIDDEN"]);
52
+
53
+ /** What a call needs set up before the source runs. */
54
+ interface Prepared {
55
+ /** The load's report. */
56
+ readonly report: ImportReportBuilder;
57
+ /** The context and its controls. */
58
+ readonly created: CreatedContext;
59
+ /** The params with the descriptor's defaults. */
60
+ readonly params: Record<string, unknown>;
61
+ /** The sink wrapper's counters, set once the sink is known. */
62
+ readonly counts: { nodes: Set<number>; edgesAtStart: number; sink: GraphSink | null };
63
+ }
64
+
65
+ /**
66
+ * The report format name of a source load.
67
+ * @param id - the source id
68
+ * @returns `"source:<id>"`
69
+ */
70
+ export function sourceFormat(id: string): string {
71
+ return `${SOURCE_FORMAT_PREFIX}${id}`;
72
+ }
73
+
74
+ /**
75
+ * The cursor handed back to the caller: the source's own, with its version added.
76
+ * @param next - the source's cursor
77
+ * @param version - the descriptor version
78
+ * @returns the caller's cursor
79
+ */
80
+ export function wrapCursor(next: SourceCursor | null | undefined, version: number): SourceCursor | null {
81
+ return next === null || next === undefined ? null : Object.freeze({ ...next, [CURSOR_VERSION_KEY]: version });
82
+ }
83
+
84
+ /**
85
+ * Check every rule that holds before a request is sent and build the context.
86
+ * @param source - the loaded source
87
+ * @param rawParams - the caller's params
88
+ * @param options - the caller's options
89
+ * @param unit - what progress counts
90
+ * @returns the report, context and params
91
+ */
92
+ function prepare(
93
+ source: GraphSource<never>,
94
+ rawParams: Readonly<Record<string, unknown>>,
95
+ options: LoadFromSourceOptions,
96
+ unit: "items" | "bytes",
97
+ ): Prepared {
98
+ const { descriptor } = source;
99
+ const version = descriptor?.version ?? 1;
100
+ const report = new ImportReportBuilder(sourceFormat(source.id), options.errorLimit ?? 100);
101
+ checkRuntime(source, report);
102
+ checkParams(rawParams, descriptor, report);
103
+ const params: Record<string, unknown> = {};
104
+ for (const p of descriptor?.params ?? []) {
105
+ if (p.default !== undefined) {
106
+ params[p.name] = p.default;
107
+ }
108
+ }
109
+ Object.assign(params, rawParams);
110
+
111
+ const endpoint = resolveEndpoint(options.endpoint ?? descriptor?.defaultEndpoint ?? null, report);
112
+ if (options.credential?.origins.length === 0 && endpoint === null) {
113
+ failOn(report, "E_SOURCE_PARAM", "a credential needs an endpoint or its own origins", {
114
+ name: "credential",
115
+ reason: "credential-unbound",
116
+ });
117
+ }
118
+ const cursor = resumeCursor(options.cursor, version, report);
119
+
120
+ const counts: Prepared["counts"] = { nodes: new Set<number>(), edgesAtStart: 0, sink: null };
121
+ const created = createSourceContext({
122
+ id: source.id,
123
+ descriptor,
124
+ options,
125
+ report,
126
+ endpoint,
127
+ cursor,
128
+ unit,
129
+ counts: () => ({
130
+ nodes: counts.nodes.size,
131
+ edges: counts.sink === null ? 0 : counts.sink.edgeCount - counts.edgesAtStart,
132
+ }),
133
+ });
134
+ return { report, created, params, counts };
135
+ }
136
+
137
+ /**
138
+ * Refuse a source that cannot run here: a runtime it does not support, or a secure context it needs.
139
+ * @param source - the loaded source
140
+ * @param report - the load's report
141
+ */
142
+ function checkRuntime(source: GraphSource<never>, report: ImportReportBuilder): void {
143
+ const { descriptor } = source;
144
+ const runtime = detectRuntime();
145
+ const support = descriptor?.runtimes?.[runtime];
146
+ if (support?.supported === false) {
147
+ failOn(report, "E_SOURCE_RUNTIME", `source ${source.id} cannot run in ${runtime}`, {
148
+ runtime,
149
+ reason: support.reason ?? "unsupported",
150
+ });
151
+ }
152
+ if (
153
+ descriptor?.needs?.secureContext === true &&
154
+ runtime === "browser" &&
155
+ (globalThis as { isSecureContext?: boolean }).isSecureContext === false
156
+ ) {
157
+ failOn(report, "E_SOURCE_RUNTIME", `source ${source.id} needs a secure context`, {
158
+ runtime,
159
+ reason: "needs-secure-context",
160
+ });
161
+ }
162
+ }
163
+
164
+ /**
165
+ * The endpoint as a URL, refusing one that is not a URL or carries a user name or password.
166
+ * @param given - the endpoint given, if any
167
+ * @param report - the load's report
168
+ * @returns the URL, or null without one
169
+ */
170
+ function resolveEndpoint(given: string | URL | null, report: ImportReportBuilder): URL | null {
171
+ if (given === null) {
172
+ return null;
173
+ }
174
+ let endpoint: URL;
175
+ try {
176
+ endpoint = new URL(given);
177
+ } catch {
178
+ failOn(report, "E_SOURCE_PARAM", "the endpoint is not a URL", { name: "endpoint", reason: "type" });
179
+ }
180
+ if (endpoint.username !== "" || endpoint.password !== "") {
181
+ failOn(report, "E_SOURCE_PARAM", "the endpoint may not carry a user name or password", {
182
+ name: "endpoint",
183
+ reason: "credentials-in-url",
184
+ });
185
+ }
186
+ return endpoint;
187
+ }
188
+
189
+ /**
190
+ * The source's own cursor from the caller's, refusing one another descriptor version made.
191
+ * @param given - the caller's cursor, if any
192
+ * @param version - the descriptor version
193
+ * @param report - the load's report
194
+ * @returns the source's cursor, or null
195
+ */
196
+ function resumeCursor(
197
+ given: SourceCursor | null | undefined,
198
+ version: number,
199
+ report: ImportReportBuilder,
200
+ ): SourceCursor | null {
201
+ if (given === undefined || given === null) {
202
+ return null;
203
+ }
204
+ const { [CURSOR_VERSION_KEY]: recorded, ...rest } = given;
205
+ if (recorded !== undefined && recorded !== version) {
206
+ failOn(report, "E_SOURCE_PARAM", "the cursor was made by another version of the source", {
207
+ name: "cursor",
208
+ reason: "stale-cursor",
209
+ });
210
+ }
211
+ return Object.freeze(rest);
212
+ }
213
+
214
+ /**
215
+ * Wrap a sink so every node id gets the prefix and the caps can count the distinct nodes written.
216
+ * @param sink - the caller's sink or the builder
217
+ * @param prepared - the call's counters
218
+ * @param prefix - the idPrefix, if any
219
+ * @returns the wrapped sink
220
+ */
221
+ export function wrapSink(sink: GraphSink, prepared: Prepared, prefix: string | undefined): GraphSink {
222
+ prepared.counts.sink = sink;
223
+ prepared.counts.edgesAtStart = sink.edgeCount;
224
+ const seen = prepared.counts.nodes;
225
+ const id = (value: NodeId): NodeId => (prefix === undefined || prefix === "" ? value : `${prefix}${String(value)}`);
226
+ const node = (index: number): number => {
227
+ seen.add(index);
228
+ return index;
229
+ };
230
+ // an edge may add its end nodes (addMissingNodes)
231
+ const ends = (edge: number): number => {
232
+ const [a, b] = sink.edgeEndpoints(edge);
233
+ seen.add(a);
234
+ seen.add(b);
235
+ return edge;
236
+ };
237
+ return new Proxy(sink, {
238
+ get(target, key): unknown {
239
+ switch (key) {
240
+ case "addNode":
241
+ return (v: NodeId): number => node(target.addNode(id(v)));
242
+ case "addNodeRecord":
243
+ return (v: NodeId, attrs: Readonly<Record<string, unknown>>): number =>
244
+ node(target.addNodeRecord(id(v), attrs));
245
+ case "addNodes":
246
+ return (ids: Iterable<NodeId>, out?: U32): U32 => {
247
+ const result = target.addNodes(Array.from(ids, id), out);
248
+ result.forEach((i) => seen.add(i));
249
+ return result;
250
+ };
251
+ case "addEdge":
252
+ return (s: NodeId, t: NodeId, w?: number): number => ends(target.addEdge(id(s), id(t), w));
253
+ case "addEdgeRecord":
254
+ return (
255
+ s: NodeId,
256
+ t: NodeId,
257
+ attrs: Readonly<Record<string, unknown>>,
258
+ weightKey?: string | null,
259
+ ): number => ends(target.addEdgeRecord(id(s), id(t), attrs, weightKey));
260
+ case "indexOf":
261
+ return (v: NodeId): number => target.indexOf(id(v));
262
+ default: {
263
+ const value = Reflect.get(target, key, target) as unknown;
264
+ return typeof value === "function" ? (value as (...a: unknown[]) => unknown).bind(target) : value;
265
+ }
266
+ }
267
+ },
268
+ });
269
+ }
270
+
271
+ /**
272
+ * The options a format importer gets from a file source's load.
273
+ * @param options - the caller's options
274
+ * @param signal - the context's signal
275
+ * @returns the importer options
276
+ */
277
+ function importerOptions(options: LoadFromSourceOptions, signal: AbortSignal): CommonImportOptions {
278
+ const out: Record<string, unknown> = { signal };
279
+ for (const [key, value] of Object.entries(options)) {
280
+ if (!SOURCE_OPTION_KEYS.has(key)) {
281
+ out[key] = value;
282
+ }
283
+ }
284
+ return out;
285
+ }
286
+
287
+ /**
288
+ * Write graph facts: `name`, `description` and `modified` strings to the graph's meta, any other
289
+ * scalar (but `directed`) as a graph value.
290
+ * @param sink - the sink
291
+ * @param meta - the facts
292
+ */
293
+ function writeMeta(sink: GraphSink, meta: Readonly<Record<string, unknown>>): void {
294
+ const patch: Record<string, string> = {};
295
+ for (const [key, value] of Object.entries(meta)) {
296
+ if ((key === "name" || key === "description" || key === "modified") && typeof value === "string") {
297
+ patch[key] = value;
298
+ } else if (
299
+ key !== "directed" &&
300
+ (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
301
+ ) {
302
+ sink.setGraphValue(key, value);
303
+ }
304
+ }
305
+ if (Object.keys(patch).length > 0) {
306
+ sink.setMeta(patch);
307
+ }
308
+ }
309
+
310
+ /**
311
+ * Write one page of records into the sink.
312
+ * @param batch - the page
313
+ * @param sink - the wrapped sink
314
+ * @param source - the source (for its record keys)
315
+ * @param prepared - the call
316
+ * @param first - whether this is the first page
317
+ */
318
+ function writeBatch(
319
+ batch: RecordBatch,
320
+ sink: GraphSink,
321
+ source: GraphSource<never>,
322
+ prepared: Prepared,
323
+ first: boolean,
324
+ ): void {
325
+ const idKey = source.idKey ?? "id";
326
+ const sourceKey = source.sourceKey ?? "source";
327
+ const targetKey = source.targetKey ?? "target";
328
+ const meta = batch.meta ?? {};
329
+ if (first && typeof meta.directed === "boolean" && sink.edgeCount === 0) {
330
+ sink.setDirected(meta.directed);
331
+ }
332
+ writeMeta(sink, meta);
333
+ const n = writeNodes(batch, sink, idKey, prepared);
334
+ writeEdges(batch, sink, sourceKey, targetKey, prepared, n);
335
+ }
336
+
337
+ /**
338
+ * Write a page's node records.
339
+ * @param batch - the page
340
+ * @param sink - the wrapped sink
341
+ * @param idKey - the record key holding the id
342
+ * @param prepared - the call
343
+ * @returns how many records were visited, for the abort check's cadence
344
+ */
345
+ function writeNodes(batch: RecordBatch, sink: GraphSink, idKey: string, prepared: Prepared): number {
346
+ const { report } = prepared;
347
+ const { signal } = prepared.created.ctx;
348
+ let n = 0;
349
+ for (const record of batch.nodes ?? []) {
350
+ if (n++ % 64 === 0) {
351
+ throwIfAborted(signal);
352
+ }
353
+ const { [idKey]: id, ...attrs } = record;
354
+ if (typeof id !== "string" && typeof id !== "number") {
355
+ report.error("missing-value", MISSING_ID_CODE, `a node record has no ${idKey}`);
356
+ report.counts.skippedNodes++;
357
+ continue;
358
+ }
359
+ try {
360
+ sink.addNodeRecord(id, attrs);
361
+ report.counts.nodes++;
362
+ } catch (err) {
363
+ report.recordError(err, { element: String(id) });
364
+ report.counts.skippedNodes++;
365
+ }
366
+ }
367
+ return n;
368
+ }
369
+
370
+ /**
371
+ * Write a page's edge records.
372
+ * @param batch - the page
373
+ * @param sink - the wrapped sink
374
+ * @param sourceKey - the record key holding the source id
375
+ * @param targetKey - the record key holding the target id
376
+ * @param prepared - the call
377
+ * @param start - records visited so far, for the abort check's cadence
378
+ */
379
+ function writeEdges(
380
+ batch: RecordBatch,
381
+ sink: GraphSink,
382
+ sourceKey: string,
383
+ targetKey: string,
384
+ prepared: Prepared,
385
+ start: number,
386
+ ): void {
387
+ const { report } = prepared;
388
+ const { signal } = prepared.created.ctx;
389
+ let n = start;
390
+ let edgeIds: ReturnType<GraphSink["declareEdgeColumn"]> | null = null;
391
+ for (const record of batch.edges ?? []) {
392
+ if (n++ % 64 === 0) {
393
+ throwIfAborted(signal);
394
+ }
395
+ const s = record[sourceKey];
396
+ const t = record[targetKey];
397
+ const edgeId = record.id;
398
+ const fields = Object.fromEntries(
399
+ Object.entries(record).filter(([k]) => k !== sourceKey && k !== targetKey && k !== "id"),
400
+ );
401
+ if ((typeof s !== "string" && typeof s !== "number") || (typeof t !== "string" && typeof t !== "number")) {
402
+ report.error("missing-value", MISSING_ID_CODE, `an edge record has no ${sourceKey} or ${targetKey}`);
403
+ report.counts.skippedEdges++;
404
+ continue;
405
+ }
406
+ try {
407
+ const e = sink.addEdgeRecord(s, t, fields);
408
+ if (typeof edgeId === "string" || typeof edgeId === "number") {
409
+ edgeIds ??= edgeIdColumn(sink);
410
+ sink.setEdgeValue(edgeIds, e, String(edgeId));
411
+ }
412
+ report.counts.edges++;
413
+ } catch (err) {
414
+ report.recordError(err, { element: `${String(s)} -> ${String(t)}` });
415
+ report.counts.skippedEdges++;
416
+ }
417
+ }
418
+ }
419
+
420
+ /**
421
+ * The origin of an endpoint, or "" without one.
422
+ * @param endpoint - the endpoint
423
+ * @returns its origin
424
+ */
425
+ function endpointOrigin(endpoint: URL | null): string {
426
+ return endpoint === null ? "" : originOf(endpoint);
427
+ }
428
+
429
+ /**
430
+ * The edge id column, declared on first use.
431
+ * @param sink - the sink
432
+ * @returns its handle
433
+ */
434
+ function edgeIdColumn(sink: GraphSink): ReturnType<GraphSink["declareEdgeColumn"]> {
435
+ const existing = sink.edgeColumn("id");
436
+ return existing === INVALID_INDEX
437
+ ? sink.declareEdgeColumn({ name: "id", dtype: "string", role: "id", nullable: true })
438
+ : existing;
439
+ }
440
+
441
+ /**
442
+ * The page iterator of a records source: its async iterable, or its one batch.
443
+ * @param out - what `records()` returned
444
+ * @returns an iterator over the pages
445
+ */
446
+ function pages(out: Promise<RecordBatch> | AsyncIterable<RecordBatch>): AsyncIterator<RecordBatch> {
447
+ if (Symbol.asyncIterator in out) {
448
+ return out[Symbol.asyncIterator]();
449
+ }
450
+ let done = false;
451
+ return {
452
+ async next(): Promise<IteratorResult<RecordBatch>> {
453
+ if (done) {
454
+ return { done: true, value: undefined };
455
+ }
456
+ done = true;
457
+ return { done: false, value: await out };
458
+ },
459
+ };
460
+ }
461
+
462
+ /**
463
+ * Decide what a failed page means: a cap reached or a later page needing a credential stops the
464
+ * load and keeps what was read (warning for the credential); anything else is rethrown.
465
+ * @param err - what the page threw
466
+ * @param page - how many pages were written before it
467
+ * @param prepared - the call
468
+ */
469
+ function stopOrThrow(err: unknown, page: number, prepared: Prepared): void {
470
+ if (err instanceof LimitStop) {
471
+ return;
472
+ }
473
+ if (page > 0 && err instanceof ImportError && AUTH_CODES.has(String(err.issue?.code))) {
474
+ const p = err.issue?.params ?? {};
475
+ warnOn(prepared.report, "W_SOURCE_AUTH", "a later page needs a credential; the pages before it are kept", {
476
+ origin: typeof p.origin === "string" ? p.origin : endpointOrigin(prepared.created.ctx.endpoint),
477
+ status: typeof p.status === "number" ? p.status : null,
478
+ });
479
+ return;
480
+ }
481
+ throw err;
482
+ }
483
+
484
+ /**
485
+ * Run a records source into a sink.
486
+ * @param source - the source
487
+ * @param sink - the wrapped sink
488
+ * @param prepared - the call
489
+ * @returns where to resume, as the source gave it
490
+ */
491
+ async function runRecords(
492
+ source: GraphSource<never>,
493
+ sink: GraphSink,
494
+ prepared: Prepared,
495
+ ): Promise<SourceCursor | null> {
496
+ const { ctx } = prepared.created;
497
+ const records = source.records as (p: unknown, c: typeof ctx) => Promise<RecordBatch> | AsyncIterable<RecordBatch>;
498
+ const iterator = pages(records(prepared.params, ctx));
499
+ let next: SourceCursor | null = ctx.cursor;
500
+ let page = 0;
501
+ let stopped = false;
502
+ try {
503
+ for (;;) {
504
+ let step: IteratorResult<RecordBatch>;
505
+ try {
506
+ step = await iterator.next();
507
+ } catch (err) {
508
+ stopOrThrow(err, page, prepared);
509
+ stopped = true;
510
+ return next;
511
+ }
512
+ if (step.done === true) {
513
+ return page === 0 ? null : next;
514
+ }
515
+ writeBatch(step.value, sink, source, prepared, page === 0);
516
+ page++;
517
+ next = step.value.next ?? null;
518
+ ctx.progress(prepared.report.counts.nodes + prepared.report.counts.edges, undefined, "items");
519
+ if (ctx.limits.reached()) {
520
+ stopped = true;
521
+ return next;
522
+ }
523
+ }
524
+ } finally {
525
+ if (stopped) {
526
+ await iterator.return?.().catch(() => undefined);
527
+ }
528
+ }
529
+ }
530
+
531
+ /**
532
+ * The importer input of a file source's body, gunzipped or unzipped when its name says so.
533
+ * @param file - what the source returned
534
+ * @param formats - the registry, for choosing a zip entry
535
+ * @param signal - the signal
536
+ * @returns the input and its hints
537
+ */
538
+ async function fileInput(
539
+ file: SourceFile,
540
+ formats: FormatRegistry,
541
+ signal: AbortSignal,
542
+ ): Promise<{ input: ImportInput; filename: string | undefined; mimeType: string | undefined }> {
543
+ let input: ImportInput = file.body instanceof Response ? (file.body.body ?? new Uint8Array(0)) : file.body;
544
+ let { filename } = file;
545
+ let mimeType =
546
+ file.mimeType ??
547
+ (file.body instanceof Response ? (file.body.headers.get("content-type") ?? undefined) : undefined);
548
+ const gzip = /\.gz$/i.test(filename ?? "") || /gzip/i.test(mimeType ?? "");
549
+ const zip = /\.zip$/i.test(filename ?? "") || /\/(x-)?zip\b/i.test(mimeType ?? "");
550
+ if (gzip) {
551
+ const stream =
552
+ input instanceof ReadableStream
553
+ ? input
554
+ : new Response((await bytesOf(input, signal)) as Uint8Array<ArrayBuffer>).body;
555
+ input = (stream ?? new Response("").body ?? new ReadableStream()).pipeThrough(
556
+ new DecompressionStream("gzip") as unknown as ReadableWritablePair<Uint8Array, Uint8Array>,
557
+ );
558
+ filename = filename?.replace(/\.gz$/i, "");
559
+ mimeType = undefined;
560
+ } else if (zip) {
561
+ const bytes = await bytesOf(input, signal);
562
+ const entry = readZipDirectory(bytes).find((e) => !e.directory && formats.sniff({ filename: e.name }) !== null);
563
+ if (entry === undefined) {
564
+ throw new ImportError("the zip holds no graph file", new ImportReportBuilder("zip", 0).finish());
565
+ }
566
+ input = await readZipEntry(bytes, entry, { signal, maxBytes: Number.MAX_SAFE_INTEGER, maxRatio: 1000 });
567
+ filename = entry.name;
568
+ mimeType = undefined;
569
+ }
570
+ return { input, filename, mimeType };
571
+ }
572
+
573
+ /**
574
+ * The bytes of an input.
575
+ * @param input - the input
576
+ * @param signal - the signal
577
+ * @returns the bytes
578
+ */
579
+ async function bytesOf(input: ImportInput, signal: AbortSignal): Promise<Uint8Array> {
580
+ return (await readBytes(input, { signal })) ?? new TextEncoder().encode(typeof input === "string" ? input : "");
581
+ }
582
+
583
+ /**
584
+ * Run a file source into a sink through the format importers.
585
+ * @param source - the source
586
+ * @param sink - the wrapped sink
587
+ * @param prepared - the call
588
+ * @param formats - the registry
589
+ * @param options - the caller's options
590
+ * @returns the format the file was read as
591
+ */
592
+ async function runFile(
593
+ source: GraphSource<never>,
594
+ sink: GraphSink,
595
+ prepared: Prepared,
596
+ formats: FormatRegistry,
597
+ options: LoadFromSourceOptions,
598
+ ): Promise<string> {
599
+ const { ctx } = prepared.created;
600
+ const read = source.file as (p: unknown, c: typeof ctx) => Promise<SourceFile>;
601
+ const file = await read(prepared.params, ctx);
602
+ const { input, filename, mimeType } = await fileInput(file, formats, ctx.signal);
603
+ let { format } = file;
604
+ let body: ImportInput = input;
605
+ if (format === undefined) {
606
+ const bytes = await bytesOf(input, ctx.signal);
607
+ format = formats.sniff({ filename, mimeType, head: bytes.subarray(0, SNIFF_HEAD_BYTES) })?.format;
608
+ body = bytes;
609
+ if (format === undefined) {
610
+ failOn(prepared.report, "E_SOURCE_RESPONSE", "the file is in no format graph-io reads", {
611
+ expected: "graph-file",
612
+ contentType: mimeType ?? null,
613
+ });
614
+ }
615
+ }
616
+ const importer = formats.importer(format);
617
+ prepared.report.include(await importer.import(body, sink, importerOptions(options, ctx.signal)));
618
+ writeMeta(sink, file.meta ?? {});
619
+ return format;
620
+ }
621
+
622
+ /** What a run into a sink produced. */
623
+ interface SinkRun {
624
+ /** The report, with its `source` member. */
625
+ readonly report: ImportReport;
626
+ /** The format: `source:<id>`, or the format a file source resolved to. */
627
+ readonly format: string;
628
+ }
629
+
630
+ /**
631
+ * Run a source's read method into a sink.
632
+ * @param source - the loaded source
633
+ * @param params - the caller's params
634
+ * @param sink - where to write
635
+ * @param options - the caller's options
636
+ * @param formats - the registry, for file sources
637
+ * @returns the report and the format
638
+ */
639
+ export async function runIntoSink(
640
+ source: GraphSource<never>,
641
+ params: Readonly<Record<string, unknown>>,
642
+ sink: GraphSink,
643
+ options: LoadFromSourceOptions,
644
+ formats: FormatRegistry,
645
+ ): Promise<SinkRun> {
646
+ const prepared = prepare(source, params, options, typeof source.file === "function" ? "bytes" : "items");
647
+ const { ctx } = prepared.created;
648
+ const version = source.descriptor?.version ?? 1;
649
+ const wrapped = wrapSink(sink, prepared, options.idPrefix);
650
+ try {
651
+ if (typeof source.records === "function") {
652
+ const next = await runRecords(source, wrapped, prepared);
653
+ throwIfAborted(ctx.signal);
654
+ return {
655
+ report: withSource(prepared.report.finish(), prepared, wrapCursor(next, version)),
656
+ format: sourceFormat(source.id),
657
+ };
658
+ }
659
+ if (typeof source.file === "function") {
660
+ const format = await runFile(source, wrapped, prepared, formats, options);
661
+ return { report: withSource(prepared.report.finish(), prepared, null), format };
662
+ }
663
+ const run = source.import as (p: unknown, s: GraphSink, c: typeof ctx) => Promise<ImportReport>;
664
+ const report = await stopAtLimit(run(prepared.params, wrapped, ctx), prepared);
665
+ throwIfAborted(ctx.signal);
666
+ return {
667
+ report: withSource(report, prepared, wrapCursor(prepared.created.state.finish?.next, version)),
668
+ format: sourceFormat(source.id),
669
+ };
670
+ } catch (err) {
671
+ throw settle(err, prepared);
672
+ } finally {
673
+ prepared.created.dispose();
674
+ }
675
+ }
676
+
677
+ /**
678
+ * Run an optional method of a source (expand, probe, list, validate) with a context.
679
+ * @param source - the loaded source
680
+ * @param feature - the method name
681
+ * @param params - the params checked against the descriptor
682
+ * @param options - the caller's options
683
+ * @param call - calls the method with the context
684
+ * @returns what the method returned, and the call's state
685
+ */
686
+ export async function runMethod<T>(
687
+ source: GraphSource<never>,
688
+ feature: "expand" | "probe" | "list" | "validate",
689
+ params: Readonly<Record<string, unknown>>,
690
+ options: LoadFromSourceOptions,
691
+ call: (prepared: Prepared) => Promise<T>,
692
+ ): Promise<T> {
693
+ if (typeof source[feature] !== "function") {
694
+ failOn(
695
+ new ImportReportBuilder(sourceFormat(source.id), 0),
696
+ "E_SOURCE_UNSUPPORTED",
697
+ `source ${source.id} has no ${feature}`,
698
+ {
699
+ feature,
700
+ },
701
+ );
702
+ }
703
+ const prepared = prepare(source, params, options, "items");
704
+ try {
705
+ const out = await call(prepared);
706
+ throwIfAborted(prepared.created.ctx.signal);
707
+ return out;
708
+ } catch (err) {
709
+ throw settle(err, prepared);
710
+ } finally {
711
+ prepared.created.dispose();
712
+ }
713
+ }
714
+
715
+ /**
716
+ * Add the `source` member to a report.
717
+ * @param report - the report
718
+ * @param prepared - the call
719
+ * @param next - where to resume, as the caller sees it
720
+ * @returns the report with its source member
721
+ */
722
+ export function withSource(report: ImportReport, prepared: Prepared, next: SourceCursor | null): ImportReport {
723
+ const own = prepared.report.finish();
724
+ // issues the context recorded (retries, limits) that a source's own report does not hold
725
+ const missing = own.issues.filter((i) => !report.issues.includes(i));
726
+ return Object.freeze({
727
+ ...report,
728
+ issues: missing.length === 0 ? report.issues : Object.freeze([...report.issues, ...missing]),
729
+ warningCount: report.warningCount + missing.filter((i) => i.severity === "warning").length,
730
+ errorCount: report.errorCount + missing.filter((i) => i.severity === "error").length,
731
+ source: prepared.created.info(next),
732
+ });
733
+ }
734
+
735
+ /**
736
+ * What a failed call throws: the signal's reason when it aborted, an ImportError with the source
737
+ * info attached, or the error itself.
738
+ * @param err - what was thrown
739
+ * @param prepared - the call
740
+ * @returns the error to throw
741
+ */
742
+ function settle(err: unknown, prepared: Prepared): unknown {
743
+ const { signal } = prepared.created.ctx;
744
+ if (signal.aborted) {
745
+ return signal.reason as unknown;
746
+ }
747
+ if (err instanceof LimitStop) {
748
+ // a cap reached where nothing can be kept (a file cut short): the load fails with the cap
749
+ return settle(limitError(err, prepared), prepared);
750
+ }
751
+ if (err instanceof ImportError && err.report.source === undefined) {
752
+ const withInfo = new ImportError(
753
+ err.message,
754
+ { ...err.report, source: prepared.created.info(null) },
755
+ err.details,
756
+ );
757
+ withInfo.stack = err.stack;
758
+ return withInfo;
759
+ }
760
+ return err;
761
+ }
762
+
763
+ /**
764
+ * The E_SOURCE_LIMIT error of a cap that stopped a load which can keep nothing.
765
+ * @param stop - the cap reached
766
+ * @param prepared - the call
767
+ * @returns the error
768
+ */
769
+ function limitError(stop: LimitStop, prepared: Prepared): unknown {
770
+ try {
771
+ return failOn(prepared.report, "E_SOURCE_LIMIT", stop.message, { limit: stop.limit, value: stop.value });
772
+ } catch (err) {
773
+ return err;
774
+ }
775
+ }
776
+
777
+ /**
778
+ * The report of an import or expand source, or, when a cap stopped it under "stop" (a LimitStop
779
+ * raised by ctx.fetch that the source did not catch), the report of what it wrote so far.
780
+ * @param run - the source's call
781
+ * @param prepared - the call
782
+ * @returns the report
783
+ */
784
+ export async function stopAtLimit(run: Promise<ImportReport>, prepared: Prepared): Promise<ImportReport> {
785
+ try {
786
+ return await run;
787
+ } catch (err) {
788
+ if (err instanceof LimitStop) {
789
+ return prepared.report.finish();
790
+ }
791
+ throw err;
792
+ }
793
+ }