@graphty/graph-io 0.3.48 → 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 (570) hide show
  1. package/dist/chunks/{approximations-C2riR4NT.js → approximations-Bzn3L-je.js} +2 -2
  2. package/dist/chunks/{approximations-C2riR4NT.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-Cu22ewuS.js → block-iptrlMBb.js} +906 -164
  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-CV_Bhcyi.js → codes-BE2xir2k.js} +6 -2
  10. package/dist/chunks/codes-BE2xir2k.js.map +1 -0
  11. package/dist/chunks/{constants-D0LqcsLJ.js → constants-CKkYLPtt.js} +2 -2
  12. package/dist/chunks/{constants-D0LqcsLJ.js.map → constants-CKkYLPtt.js.map} +1 -1
  13. package/dist/chunks/{context-cgmmOxZ2.js → context-C3p0RQxR.js} +5 -4
  14. package/dist/chunks/{context-cgmmOxZ2.js.map → context-C3p0RQxR.js.map} +1 -1
  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-BiQsnMTb.js → credentials-DXHx7nwR.js} +16 -14
  18. package/dist/chunks/credentials-DXHx7nwR.js.map +1 -0
  19. package/dist/chunks/{cx-export-BEeF6ymo.js → cx-export-Bt6NoqTQ.js} +3 -3
  20. package/dist/chunks/{cx-export-BEeF6ymo.js.map → cx-export-Bt6NoqTQ.js.map} +1 -1
  21. package/dist/chunks/descriptor-B28U25x4.js +60 -0
  22. package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
  23. package/dist/chunks/{descriptor-BJ-W0Jd-.js → descriptor-DLA5kINx.js} +7 -2
  24. package/dist/chunks/descriptor-DLA5kINx.js.map +1 -0
  25. package/dist/chunks/{emit-CD8xnY8s.js → emit-BwHQkZle.js} +1660 -133
  26. package/dist/chunks/emit-BwHQkZle.js.map +1 -0
  27. package/dist/chunks/{escape-DH2Egt-l.js → escape-CuCIzNMB.js} +8 -8
  28. package/dist/chunks/{escape-DH2Egt-l.js.map → escape-CuCIzNMB.js.map} +1 -1
  29. package/dist/chunks/{export-CZ7VRm4I.js → export-Cha4dRFz.js} +45 -387
  30. package/dist/chunks/export-Cha4dRFz.js.map +1 -0
  31. package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
  32. package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
  33. package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-D2CETOMK.js} +1222 -156
  34. package/dist/chunks/exporter-D2CETOMK.js.map +1 -0
  35. package/dist/chunks/{exporter-BIdaoIgh.js → exporter-D9yMtocA.js} +7 -7
  36. package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-D9yMtocA.js.map} +1 -1
  37. package/dist/chunks/{exporter-DtVU80Fa.js → exporter-_jrBTnos.js} +9 -8
  38. package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-_jrBTnos.js.map} +1 -1
  39. package/dist/chunks/{exporter-ChjL5fmP.js → exporter-nDfxIK5D.js} +9 -8
  40. package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-nDfxIK5D.js.map} +1 -1
  41. package/dist/chunks/format-BXiAb-1h.js +408 -0
  42. package/dist/chunks/format-BXiAb-1h.js.map +1 -0
  43. package/dist/chunks/{generic-CP6YD34u.js → generic-ymWCETAJ.js} +387 -31
  44. package/dist/chunks/generic-ymWCETAJ.js.map +1 -0
  45. package/dist/chunks/{importer-e3huMZbm.js → importer-B92x1xY5.js} +14 -10
  46. package/dist/chunks/importer-B92x1xY5.js.map +1 -0
  47. package/dist/chunks/{importer-B87_fmVx.js → importer-CT9mJ1nn.js} +326 -84
  48. package/dist/chunks/importer-CT9mJ1nn.js.map +1 -0
  49. package/dist/chunks/{importer-CB_zV5_L.js → importer-DaLTjbds.js} +116 -1102
  50. package/dist/chunks/importer-DaLTjbds.js.map +1 -0
  51. package/dist/chunks/{importer-DPZDN40-.js → importer-GREKMdIf.js} +25 -17
  52. package/dist/chunks/importer-GREKMdIf.js.map +1 -0
  53. package/dist/chunks/{importer-Bji2MeWr.js → importer-PqaaKKnY.js} +13 -10
  54. package/dist/chunks/{importer-Bji2MeWr.js.map → importer-PqaaKKnY.js.map} +1 -1
  55. package/dist/chunks/{importer-Cyy6UseH.js → importer-Vn5QvmmJ.js} +66 -13
  56. package/dist/chunks/importer-Vn5QvmmJ.js.map +1 -0
  57. package/dist/chunks/{importer-CVT-JyDE.js → importer-vRq4h3j5.js} +1469 -356
  58. package/dist/chunks/importer-vRq4h3j5.js.map +1 -0
  59. package/dist/chunks/{input-Ccg9I22A.js → input-CAxt_aV-.js} +4 -4
  60. package/dist/chunks/{input-Ccg9I22A.js.map → input-CAxt_aV-.js.map} +1 -1
  61. package/dist/chunks/{json-elements-By172SVq.js → json-elements-Cq76WjnZ.js} +4 -4
  62. package/dist/chunks/{json-elements-By172SVq.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
  63. package/dist/chunks/{lexicon-u2SI5xcx.js → lexicon-Clf4QIyl.js} +282 -74
  64. package/dist/chunks/lexicon-Clf4QIyl.js.map +1 -0
  65. package/dist/chunks/{ontology-export-BwgMyuF0.js → ontology-export-OMo91mb0.js} +4 -4
  66. package/dist/chunks/{ontology-export-BwgMyuF0.js.map → ontology-export-OMo91mb0.js.map} +1 -1
  67. package/dist/chunks/{records-Cgvxz-Vx.js → records-NJiYvekn.js} +2 -2
  68. package/dist/chunks/{records-Cgvxz-Vx.js.map → records-NJiYvekn.js.map} +1 -1
  69. package/dist/chunks/{report-CgdsL9Hb.js → report-CwMfYa9J.js} +23 -23
  70. package/dist/chunks/{report-CgdsL9Hb.js.map → report-CwMfYa9J.js.map} +1 -1
  71. package/dist/chunks/round-trip-Zm3_ivgq.js +79 -0
  72. package/dist/chunks/round-trip-Zm3_ivgq.js.map +1 -0
  73. package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-EokFic1V.js} +5 -5
  74. package/dist/chunks/sigv4-EokFic1V.js.map +1 -0
  75. package/dist/chunks/{styles-CaABMoO1.js → styles-CCs214_3.js} +1237 -138
  76. package/dist/chunks/styles-CCs214_3.js.map +1 -0
  77. package/dist/chunks/styles-Cm62yyQX.js +2812 -0
  78. package/dist/chunks/styles-Cm62yyQX.js.map +1 -0
  79. package/dist/chunks/styles-DPQQIig4.js +1928 -0
  80. package/dist/chunks/styles-DPQQIig4.js.map +1 -0
  81. package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-UMFdNqze.js} +503 -172
  82. package/dist/chunks/styles-yed-UMFdNqze.js.map +1 -0
  83. package/dist/chunks/{text-BuKQVMz2.js → text-ystE2bYi.js} +2 -2
  84. package/dist/chunks/{text-BuKQVMz2.js.map → text-ystE2bYi.js.map} +1 -1
  85. package/dist/csv.js +7 -7
  86. package/dist/cx.js +2 -2
  87. package/dist/cx2.js +2 -2
  88. package/dist/cys.js +1 -1
  89. package/dist/dot.js +5 -4
  90. package/dist/dot.js.map +1 -1
  91. package/dist/gexf.js +42 -12
  92. package/dist/gexf.js.map +1 -1
  93. package/dist/gml.js +847 -193
  94. package/dist/gml.js.map +1 -1
  95. package/dist/graph-io.js +232 -220
  96. package/dist/graph-io.js.map +1 -1
  97. package/dist/graphml.js +3 -3
  98. package/dist/json.js +3 -2
  99. package/dist/neo4j.js +6 -6
  100. package/dist/obo.js +1 -1
  101. package/dist/pajek.js +1 -1
  102. package/dist/positions.js +45 -3
  103. package/dist/positions.js.map +1 -1
  104. package/dist/sources-cypher.js +138 -23
  105. package/dist/sources-cypher.js.map +1 -1
  106. package/dist/sources-ndex.js +2 -2
  107. package/dist/sources-rest.js +16 -6
  108. package/dist/sources-rest.js.map +1 -1
  109. package/dist/sources-sparql.d.ts +1 -0
  110. package/dist/sources-sparql.js +405 -0
  111. package/dist/sources-sparql.js.map +1 -0
  112. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  113. package/dist/src/formats/cx/importer.js +5 -1
  114. package/dist/src/formats/cx/importer.js.map +1 -1
  115. package/dist/src/formats/cx/styles.d.ts +24 -1
  116. package/dist/src/formats/cx/styles.d.ts.map +1 -1
  117. package/dist/src/formats/cx/styles.js +117 -11
  118. package/dist/src/formats/cx/styles.js.map +1 -1
  119. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  120. package/dist/src/formats/cx2/importer.js +1 -0
  121. package/dist/src/formats/cx2/importer.js.map +1 -1
  122. package/dist/src/formats/cx2/styles.d.ts.map +1 -1
  123. package/dist/src/formats/cx2/styles.js +3 -1
  124. package/dist/src/formats/cx2/styles.js.map +1 -1
  125. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cys/importer.js +1 -0
  127. package/dist/src/formats/cys/importer.js.map +1 -1
  128. package/dist/src/formats/cys/styles.d.ts +2 -0
  129. package/dist/src/formats/cys/styles.d.ts.map +1 -1
  130. package/dist/src/formats/cys/styles.js +15 -7
  131. package/dist/src/formats/cys/styles.js.map +1 -1
  132. package/dist/src/formats/dot/drawing.d.ts +98 -0
  133. package/dist/src/formats/dot/drawing.d.ts.map +1 -0
  134. package/dist/src/formats/dot/drawing.js +734 -0
  135. package/dist/src/formats/dot/drawing.js.map +1 -0
  136. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  137. package/dist/src/formats/dot/importer.js +108 -31
  138. package/dist/src/formats/dot/importer.js.map +1 -1
  139. package/dist/src/formats/dot/label-places.d.ts +34 -0
  140. package/dist/src/formats/dot/label-places.d.ts.map +1 -0
  141. package/dist/src/formats/dot/label-places.js +179 -0
  142. package/dist/src/formats/dot/label-places.js.map +1 -0
  143. package/dist/src/formats/dot/record.d.ts +50 -0
  144. package/dist/src/formats/dot/record.d.ts.map +1 -0
  145. package/dist/src/formats/dot/record.js +275 -0
  146. package/dist/src/formats/dot/record.js.map +1 -0
  147. package/dist/src/formats/dot/styles.d.ts +62 -2
  148. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  149. package/dist/src/formats/dot/styles.js +1454 -119
  150. package/dist/src/formats/dot/styles.js.map +1 -1
  151. package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
  152. package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
  153. package/dist/src/formats/gexf/dialog-metrics.js +59 -0
  154. package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
  155. package/dist/src/formats/gexf/importer.d.ts +7 -0
  156. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  157. package/dist/src/formats/gexf/importer.js +41 -5
  158. package/dist/src/formats/gexf/importer.js.map +1 -1
  159. package/dist/src/formats/gexf/preview.d.ts +77 -0
  160. package/dist/src/formats/gexf/preview.d.ts.map +1 -0
  161. package/dist/src/formats/gexf/preview.js +191 -0
  162. package/dist/src/formats/gexf/preview.js.map +1 -0
  163. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  164. package/dist/src/formats/gexf/schema.js +2 -1
  165. package/dist/src/formats/gexf/schema.js.map +1 -1
  166. package/dist/src/formats/gexf/styles.d.ts +58 -31
  167. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  168. package/dist/src/formats/gexf/styles.js +848 -225
  169. package/dist/src/formats/gexf/styles.js.map +1 -1
  170. package/dist/src/formats/gml/importer.d.ts +5 -2
  171. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  172. package/dist/src/formats/gml/importer.js +258 -71
  173. package/dist/src/formats/gml/importer.js.map +1 -1
  174. package/dist/src/formats/gml/index.d.ts +1 -1
  175. package/dist/src/formats/gml/index.d.ts.map +1 -1
  176. package/dist/src/formats/gml/index.js +1 -1
  177. package/dist/src/formats/gml/index.js.map +1 -1
  178. package/dist/src/formats/gml/positions.d.ts +7 -0
  179. package/dist/src/formats/gml/positions.d.ts.map +1 -1
  180. package/dist/src/formats/gml/positions.js +29 -7
  181. package/dist/src/formats/gml/positions.js.map +1 -1
  182. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  183. package/dist/src/formats/gml/styles.js +753 -101
  184. package/dist/src/formats/gml/styles.js.map +1 -1
  185. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  186. package/dist/src/formats/graphml/styles-plain.js +6 -10
  187. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  188. package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
  189. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  190. package/dist/src/formats/graphml/styles-yed.js +692 -161
  191. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  192. package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
  193. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
  194. package/dist/src/formats/graphml/styles-yfiles3.js +429 -64
  195. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
  196. package/dist/src/formats/graphml/yfiles.d.ts +3 -3
  197. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  198. package/dist/src/formats/graphml/yfiles.js +16 -6
  199. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  200. package/dist/src/formats/json/dialect.d.ts +3 -2
  201. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  202. package/dist/src/formats/json/dialect.js +39 -5
  203. package/dist/src/formats/json/dialect.js.map +1 -1
  204. package/dist/src/formats/json/importer.d.ts +13 -2
  205. package/dist/src/formats/json/importer.d.ts.map +1 -1
  206. package/dist/src/formats/json/importer.js +42 -6
  207. package/dist/src/formats/json/importer.js.map +1 -1
  208. package/dist/src/formats/json/index.d.ts +1 -1
  209. package/dist/src/formats/json/index.d.ts.map +1 -1
  210. package/dist/src/formats/json/index.js +1 -1
  211. package/dist/src/formats/json/index.js.map +1 -1
  212. package/dist/src/formats/json/positions.d.ts +5 -2
  213. package/dist/src/formats/json/positions.d.ts.map +1 -1
  214. package/dist/src/formats/json/positions.js +20 -4
  215. package/dist/src/formats/json/positions.js.map +1 -1
  216. package/dist/src/formats/json/styles.d.ts +12 -1
  217. package/dist/src/formats/json/styles.d.ts.map +1 -1
  218. package/dist/src/formats/json/styles.js +1755 -136
  219. package/dist/src/formats/json/styles.js.map +1 -1
  220. package/dist/src/formats/pajek/draw.d.ts +96 -0
  221. package/dist/src/formats/pajek/draw.d.ts.map +1 -0
  222. package/dist/src/formats/pajek/draw.js +372 -0
  223. package/dist/src/formats/pajek/draw.js.map +1 -0
  224. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  225. package/dist/src/formats/pajek/exporter.js +70 -51
  226. package/dist/src/formats/pajek/exporter.js.map +1 -1
  227. package/dist/src/formats/pajek/importer.d.ts +9 -0
  228. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  229. package/dist/src/formats/pajek/importer.js +233 -102
  230. package/dist/src/formats/pajek/importer.js.map +1 -1
  231. package/dist/src/formats/pajek/index.d.ts +1 -0
  232. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  233. package/dist/src/formats/pajek/index.js.map +1 -1
  234. package/dist/src/formats/pajek/styles.d.ts +15 -7
  235. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  236. package/dist/src/formats/pajek/styles.js +1278 -114
  237. package/dist/src/formats/pajek/styles.js.map +1 -1
  238. package/dist/src/formats/pajek/syntax.d.ts +10 -1
  239. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  240. package/dist/src/formats/pajek/syntax.js +26 -2
  241. package/dist/src/formats/pajek/syntax.js.map +1 -1
  242. package/dist/src/formats/xgmml/emit.d.ts +1 -0
  243. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  244. package/dist/src/formats/xgmml/emit.js +65 -5
  245. package/dist/src/formats/xgmml/emit.js.map +1 -1
  246. package/dist/src/formats/xgmml/styles.d.ts +23 -3
  247. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  248. package/dist/src/formats/xgmml/styles.js +277 -60
  249. package/dist/src/formats/xgmml/styles.js.map +1 -1
  250. package/dist/src/index.d.ts +4 -3
  251. package/dist/src/index.d.ts.map +1 -1
  252. package/dist/src/index.js +4 -3
  253. package/dist/src/index.js.map +1 -1
  254. package/dist/src/positions/convert.d.ts.map +1 -1
  255. package/dist/src/positions/convert.js +11 -1
  256. package/dist/src/positions/convert.js.map +1 -1
  257. package/dist/src/positions/extract.d.ts.map +1 -1
  258. package/dist/src/positions/extract.js +53 -1
  259. package/dist/src/positions/extract.js.map +1 -1
  260. package/dist/src/positions/index.d.ts +1 -1
  261. package/dist/src/positions/index.d.ts.map +1 -1
  262. package/dist/src/positions/types.d.ts +59 -0
  263. package/dist/src/positions/types.d.ts.map +1 -1
  264. package/dist/src/sources/builtins.d.ts +1 -1
  265. package/dist/src/sources/builtins.d.ts.map +1 -1
  266. package/dist/src/sources/builtins.js +8 -2
  267. package/dist/src/sources/builtins.js.map +1 -1
  268. package/dist/src/sources/context.d.ts.map +1 -1
  269. package/dist/src/sources/context.js +1 -0
  270. package/dist/src/sources/context.js.map +1 -1
  271. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
  272. package/dist/src/sources/cypher/descriptor.js +5 -0
  273. package/dist/src/sources/cypher/descriptor.js.map +1 -1
  274. package/dist/src/sources/cypher/index.d.ts.map +1 -1
  275. package/dist/src/sources/cypher/index.js +124 -18
  276. package/dist/src/sources/cypher/index.js.map +1 -1
  277. package/dist/src/sources/cypher/params.d.ts +1 -1
  278. package/dist/src/sources/cypher/params.d.ts.map +1 -1
  279. package/dist/src/sources/cypher/query-builder.d.ts +17 -0
  280. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
  281. package/dist/src/sources/cypher/query-builder.js +31 -0
  282. package/dist/src/sources/cypher/query-builder.js.map +1 -1
  283. package/dist/src/sources/ids.d.ts +5 -0
  284. package/dist/src/sources/ids.d.ts.map +1 -1
  285. package/dist/src/sources/ids.js +5 -0
  286. package/dist/src/sources/ids.js.map +1 -1
  287. package/dist/src/sources/params.d.ts +3 -0
  288. package/dist/src/sources/params.d.ts.map +1 -1
  289. package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
  290. package/dist/src/sources/rest/descriptor.js +5 -0
  291. package/dist/src/sources/rest/descriptor.js.map +1 -1
  292. package/dist/src/sources/rest/source.d.ts.map +1 -1
  293. package/dist/src/sources/rest/source.js +15 -0
  294. package/dist/src/sources/rest/source.js.map +1 -1
  295. package/dist/src/sources/sigv4.d.ts +5 -3
  296. package/dist/src/sources/sigv4.d.ts.map +1 -1
  297. package/dist/src/sources/sigv4.js +6 -4
  298. package/dist/src/sources/sigv4.js.map +1 -1
  299. package/dist/src/sources/sparql/descriptor.d.ts +10 -0
  300. package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
  301. package/dist/src/sources/sparql/descriptor.js +64 -0
  302. package/dist/src/sources/sparql/descriptor.js.map +1 -0
  303. package/dist/src/sources/sparql/index.d.ts +28 -0
  304. package/dist/src/sources/sparql/index.d.ts.map +1 -0
  305. package/dist/src/sources/sparql/index.js +314 -0
  306. package/dist/src/sources/sparql/index.js.map +1 -0
  307. package/dist/src/sources/sparql/ntriples.d.ts +69 -0
  308. package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
  309. package/dist/src/sources/sparql/ntriples.js +180 -0
  310. package/dist/src/sources/sparql/ntriples.js.map +1 -0
  311. package/dist/src/sources/sparql/params.d.ts +27 -0
  312. package/dist/src/sources/sparql/params.d.ts.map +1 -0
  313. package/dist/src/sources/sparql/params.js +5 -0
  314. package/dist/src/sources/sparql/params.js.map +1 -0
  315. package/dist/src/sources/sparql/query.d.ts +72 -0
  316. package/dist/src/sources/sparql/query.d.ts.map +1 -0
  317. package/dist/src/sources/sparql/query.js +113 -0
  318. package/dist/src/sources/sparql/query.js.map +1 -0
  319. package/dist/src/sources/types.d.ts +31 -0
  320. package/dist/src/sources/types.d.ts.map +1 -1
  321. package/dist/src/styles/annotations.d.ts +61 -5
  322. package/dist/src/styles/annotations.d.ts.map +1 -1
  323. package/dist/src/styles/annotations.js +130 -22
  324. package/dist/src/styles/annotations.js.map +1 -1
  325. package/dist/src/styles/canon/bends.d.ts +46 -0
  326. package/dist/src/styles/canon/bends.d.ts.map +1 -1
  327. package/dist/src/styles/canon/bends.js +123 -0
  328. package/dist/src/styles/canon/bends.js.map +1 -1
  329. package/dist/src/styles/canon/color-tables.d.ts +6 -1
  330. package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
  331. package/dist/src/styles/canon/color-tables.js +10 -4
  332. package/dist/src/styles/canon/color-tables.js.map +1 -1
  333. package/dist/src/styles/canon/color.d.ts +3 -1
  334. package/dist/src/styles/canon/color.d.ts.map +1 -1
  335. package/dist/src/styles/canon/color.js +103 -3
  336. package/dist/src/styles/canon/color.js.map +1 -1
  337. package/dist/src/styles/canon/enums.d.ts +2 -2
  338. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  339. package/dist/src/styles/canon/enums.js +81 -7
  340. package/dist/src/styles/canon/enums.js.map +1 -1
  341. package/dist/src/styles/canon/graphviz.d.ts +12 -3
  342. package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
  343. package/dist/src/styles/canon/graphviz.js +57 -9
  344. package/dist/src/styles/canon/graphviz.js.map +1 -1
  345. package/dist/src/styles/canon/number.d.ts +8 -0
  346. package/dist/src/styles/canon/number.d.ts.map +1 -1
  347. package/dist/src/styles/canon/number.js +18 -0
  348. package/dist/src/styles/canon/number.js.map +1 -1
  349. package/dist/src/styles/canon/text.d.ts +29 -2
  350. package/dist/src/styles/canon/text.d.ts.map +1 -1
  351. package/dist/src/styles/canon/text.js +156 -16
  352. package/dist/src/styles/canon/text.js.map +1 -1
  353. package/dist/src/styles/codes.d.ts +2 -0
  354. package/dist/src/styles/codes.d.ts.map +1 -1
  355. package/dist/src/styles/codes.js +2 -0
  356. package/dist/src/styles/codes.js.map +1 -1
  357. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  358. package/dist/src/styles/cyjs/cascade.js +1015 -79
  359. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  360. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  361. package/dist/src/styles/cyjs/defaults-table.js +3 -0
  362. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  363. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  364. package/dist/src/styles/cyjs/emit.js +202 -9
  365. package/dist/src/styles/cyjs/emit.js.map +1 -1
  366. package/dist/src/styles/cyjs/face.d.ts +20 -0
  367. package/dist/src/styles/cyjs/face.d.ts.map +1 -0
  368. package/dist/src/styles/cyjs/face.js +332 -0
  369. package/dist/src/styles/cyjs/face.js.map +1 -0
  370. package/dist/src/styles/cyjs/mappers.d.ts +44 -1
  371. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  372. package/dist/src/styles/cyjs/mappers.js +461 -26
  373. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  374. package/dist/src/styles/cyjs/routes.d.ts +53 -0
  375. package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
  376. package/dist/src/styles/cyjs/routes.js +360 -0
  377. package/dist/src/styles/cyjs/routes.js.map +1 -0
  378. package/dist/src/styles/cytoscape/charts.d.ts +23 -0
  379. package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
  380. package/dist/src/styles/cytoscape/charts.js +560 -0
  381. package/dist/src/styles/cytoscape/charts.js.map +1 -0
  382. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  383. package/dist/src/styles/cytoscape/emit.js +156 -48
  384. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  385. package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
  386. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  387. package/dist/src/styles/cytoscape/lexicon.js +387 -77
  388. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  389. package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
  390. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
  391. package/dist/src/styles/cytoscape/mappings.js +92 -0
  392. package/dist/src/styles/cytoscape/mappings.js.map +1 -1
  393. package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
  394. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  395. package/dist/src/styles/cytoscape/resolve.js +623 -17
  396. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  397. package/dist/src/styles/defaults.d.ts +46 -26
  398. package/dist/src/styles/defaults.d.ts.map +1 -1
  399. package/dist/src/styles/defaults.js +308 -71
  400. package/dist/src/styles/defaults.js.map +1 -1
  401. package/dist/src/styles/index.d.ts +4 -3
  402. package/dist/src/styles/index.d.ts.map +1 -1
  403. package/dist/src/styles/index.js +3 -2
  404. package/dist/src/styles/index.js.map +1 -1
  405. package/dist/src/styles/internal.d.ts +1 -0
  406. package/dist/src/styles/internal.d.ts.map +1 -1
  407. package/dist/src/styles/internal.js +1 -0
  408. package/dist/src/styles/internal.js.map +1 -1
  409. package/dist/src/styles/io/generic.d.ts.map +1 -1
  410. package/dist/src/styles/io/generic.js +56 -16
  411. package/dist/src/styles/io/generic.js.map +1 -1
  412. package/dist/src/styles/io/round-trip.d.ts +56 -0
  413. package/dist/src/styles/io/round-trip.d.ts.map +1 -0
  414. package/dist/src/styles/io/round-trip.js +138 -0
  415. package/dist/src/styles/io/round-trip.js.map +1 -0
  416. package/dist/src/styles/io/writer.d.ts.map +1 -1
  417. package/dist/src/styles/io/writer.js +6 -1
  418. package/dist/src/styles/io/writer.js.map +1 -1
  419. package/dist/src/styles/notes.d.ts.map +1 -1
  420. package/dist/src/styles/notes.js +1 -0
  421. package/dist/src/styles/notes.js.map +1 -1
  422. package/dist/src/styles/plan/features.d.ts +1 -1
  423. package/dist/src/styles/plan/features.d.ts.map +1 -1
  424. package/dist/src/styles/plan/features.js +22 -2
  425. package/dist/src/styles/plan/features.js.map +1 -1
  426. package/dist/src/styles/plan/index.d.ts +1 -1
  427. package/dist/src/styles/plan/index.d.ts.map +1 -1
  428. package/dist/src/styles/plan/index.js +1 -1
  429. package/dist/src/styles/plan/index.js.map +1 -1
  430. package/dist/src/styles/plan/plan.d.ts.map +1 -1
  431. package/dist/src/styles/plan/plan.js +61 -4
  432. package/dist/src/styles/plan/plan.js.map +1 -1
  433. package/dist/src/styles/plan/resolve.d.ts +11 -0
  434. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  435. package/dist/src/styles/plan/resolve.js +40 -4
  436. package/dist/src/styles/plan/resolve.js.map +1 -1
  437. package/dist/src/styles/slots.d.ts +14 -0
  438. package/dist/src/styles/slots.d.ts.map +1 -0
  439. package/dist/src/styles/slots.js +20 -0
  440. package/dist/src/styles/slots.js.map +1 -0
  441. package/dist/src/styles/types.d.ts +622 -6
  442. package/dist/src/styles/types.d.ts.map +1 -1
  443. package/dist/src/styles/vocabulary.d.ts +3 -2
  444. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  445. package/dist/src/styles/vocabulary.js +203 -0
  446. package/dist/src/styles/vocabulary.js.map +1 -1
  447. package/dist/styles.js +30 -239
  448. package/dist/styles.js.map +1 -1
  449. package/dist/xgmml.js +3 -3
  450. package/package.json +27 -7
  451. package/src/formats/cx/importer.ts +6 -1
  452. package/src/formats/cx/styles.ts +143 -9
  453. package/src/formats/cx2/importer.ts +1 -0
  454. package/src/formats/cx2/styles.ts +3 -1
  455. package/src/formats/cys/importer.ts +1 -0
  456. package/src/formats/cys/styles.ts +27 -5
  457. package/src/formats/dot/drawing.ts +799 -0
  458. package/src/formats/dot/importer.ts +120 -35
  459. package/src/formats/dot/label-places.ts +228 -0
  460. package/src/formats/dot/record.ts +336 -0
  461. package/src/formats/dot/styles.ts +1654 -153
  462. package/src/formats/gexf/dialog-metrics.ts +61 -0
  463. package/src/formats/gexf/importer.ts +50 -5
  464. package/src/formats/gexf/preview.ts +217 -0
  465. package/src/formats/gexf/schema.ts +2 -1
  466. package/src/formats/gexf/styles.ts +1099 -245
  467. package/src/formats/gml/importer.ts +291 -76
  468. package/src/formats/gml/index.ts +1 -1
  469. package/src/formats/gml/positions.ts +29 -7
  470. package/src/formats/gml/styles.ts +851 -109
  471. package/src/formats/graphml/styles-plain.ts +6 -15
  472. package/src/formats/graphml/styles-yed.ts +762 -173
  473. package/src/formats/graphml/styles-yfiles3.ts +485 -63
  474. package/src/formats/graphml/yfiles.ts +19 -6
  475. package/src/formats/json/dialect.ts +41 -5
  476. package/src/formats/json/importer.ts +59 -7
  477. package/src/formats/json/index.ts +1 -0
  478. package/src/formats/json/positions.ts +22 -5
  479. package/src/formats/json/styles.ts +2041 -185
  480. package/src/formats/pajek/draw.ts +458 -0
  481. package/src/formats/pajek/exporter.ts +81 -49
  482. package/src/formats/pajek/importer.ts +278 -103
  483. package/src/formats/pajek/index.ts +1 -0
  484. package/src/formats/pajek/styles.ts +1381 -133
  485. package/src/formats/pajek/syntax.ts +27 -2
  486. package/src/formats/xgmml/emit.ts +73 -5
  487. package/src/formats/xgmml/styles.ts +330 -71
  488. package/src/index.ts +5 -1
  489. package/src/positions/convert.ts +12 -1
  490. package/src/positions/extract.ts +55 -1
  491. package/src/positions/index.ts +1 -0
  492. package/src/positions/types.ts +60 -0
  493. package/src/sources/builtins.ts +8 -1
  494. package/src/sources/context.ts +1 -0
  495. package/src/sources/cypher/descriptor.ts +7 -1
  496. package/src/sources/cypher/index.ts +148 -18
  497. package/src/sources/cypher/params.ts +1 -1
  498. package/src/sources/cypher/query-builder.ts +33 -0
  499. package/src/sources/ids.ts +6 -0
  500. package/src/sources/params.ts +3 -0
  501. package/src/sources/rest/descriptor.ts +5 -0
  502. package/src/sources/rest/source.ts +16 -0
  503. package/src/sources/sigv4.ts +6 -4
  504. package/src/sources/sparql/descriptor.ts +67 -0
  505. package/src/sources/sparql/index.ts +356 -0
  506. package/src/sources/sparql/ntriples.ts +219 -0
  507. package/src/sources/sparql/params.ts +28 -0
  508. package/src/sources/sparql/query.ts +162 -0
  509. package/src/sources/types.ts +35 -0
  510. package/src/styles/annotations.ts +201 -27
  511. package/src/styles/canon/bends.ts +137 -0
  512. package/src/styles/canon/color-tables.ts +10 -4
  513. package/src/styles/canon/color.ts +105 -3
  514. package/src/styles/canon/enums.ts +98 -8
  515. package/src/styles/canon/graphviz.ts +71 -10
  516. package/src/styles/canon/number.ts +19 -0
  517. package/src/styles/canon/text.ts +187 -16
  518. package/src/styles/codes.ts +2 -0
  519. package/src/styles/cyjs/cascade.ts +1160 -84
  520. package/src/styles/cyjs/defaults-table.ts +3 -0
  521. package/src/styles/cyjs/emit.ts +233 -13
  522. package/src/styles/cyjs/face.ts +372 -0
  523. package/src/styles/cyjs/mappers.ts +492 -27
  524. package/src/styles/cyjs/routes.ts +432 -0
  525. package/src/styles/cytoscape/charts.ts +684 -0
  526. package/src/styles/cytoscape/emit.ts +170 -48
  527. package/src/styles/cytoscape/lexicon.ts +431 -78
  528. package/src/styles/cytoscape/mappings.ts +108 -0
  529. package/src/styles/cytoscape/resolve.ts +741 -17
  530. package/src/styles/defaults.ts +417 -108
  531. package/src/styles/index.ts +5 -0
  532. package/src/styles/internal.ts +1 -0
  533. package/src/styles/io/generic.ts +79 -23
  534. package/src/styles/io/round-trip.ts +202 -0
  535. package/src/styles/io/writer.ts +6 -1
  536. package/src/styles/notes.ts +1 -0
  537. package/src/styles/plan/features.ts +23 -2
  538. package/src/styles/plan/index.ts +1 -1
  539. package/src/styles/plan/plan.ts +69 -5
  540. package/src/styles/plan/resolve.ts +47 -4
  541. package/src/styles/slots.ts +25 -0
  542. package/src/styles/types.ts +633 -5
  543. package/src/styles/vocabulary.ts +211 -2
  544. package/dist/chunks/block-Cu22ewuS.js.map +0 -1
  545. package/dist/chunks/choose-Cdx6Enl2.js +0 -57
  546. package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
  547. package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
  548. package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
  549. package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
  550. package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
  551. package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
  552. package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
  553. package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
  554. package/dist/chunks/format-BMS-1Nxb.js +0 -64
  555. package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
  556. package/dist/chunks/generic-CP6YD34u.js.map +0 -1
  557. package/dist/chunks/importer-B87_fmVx.js.map +0 -1
  558. package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
  559. package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
  560. package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
  561. package/dist/chunks/importer-DPZDN40-.js.map +0 -1
  562. package/dist/chunks/importer-e3huMZbm.js.map +0 -1
  563. package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
  564. package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
  565. package/dist/chunks/styles-CaABMoO1.js.map +0 -1
  566. package/dist/chunks/styles-P_gmFAOi.js +0 -770
  567. package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
  568. package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
  569. package/dist/chunks/writer-DvHTl36J.js +0 -449
  570. package/dist/chunks/writer-DvHTl36J.js.map +0 -1
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Reading the N-Triples a CONSTRUCT or DESCRIBE answers, and turning triples into nodes and edges:
3
+ * an IRI or blank-node object is an edge from the subject, a literal is an attribute of the
4
+ * subject named by the predicate's local name.
5
+ */
6
+
7
+ /** One RDF term. */
8
+ export type Term =
9
+ | { readonly kind: "iri"; readonly value: string }
10
+ | { readonly kind: "bnode"; readonly value: string }
11
+ | { readonly kind: "literal"; readonly value: string; readonly lang: string; readonly datatype: string };
12
+
13
+ /** One triple. */
14
+ export interface Triple {
15
+ /** The subject: an IRI or a blank node. */
16
+ readonly s: Term;
17
+ /** The predicate IRI. */
18
+ readonly p: string;
19
+ /** The object. */
20
+ readonly o: Term;
21
+ }
22
+
23
+ /** One term at the sticky position: an IRI, a blank node, or a literal with its tag or type. */
24
+ const TERM = /\s*(?:<([^<>]*)>|_:([\w.-]*[\w-])|"((?:[^"\\]|\\.)*)"(?:@([A-Za-z][\w-]*)|\^\^<([^<>]*)>)?)/y;
25
+
26
+ /** The end of a statement: a dot, then an optional comment. */
27
+ const END = /\s*\.\s*(?:#.*)?$/y;
28
+
29
+ /** The XSD namespace. */
30
+ const XSD = "http://www.w3.org/2001/XMLSchema#";
31
+
32
+ /** The XSD numeric types, read as numbers. */
33
+ const NUMERIC: ReadonlySet<string> = new Set(
34
+ [
35
+ "integer",
36
+ "decimal",
37
+ "double",
38
+ "float",
39
+ "int",
40
+ "long",
41
+ "short",
42
+ "byte",
43
+ "nonNegativeInteger",
44
+ "nonPositiveInteger",
45
+ "positiveInteger",
46
+ "negativeInteger",
47
+ "unsignedInt",
48
+ "unsignedLong",
49
+ "unsignedShort",
50
+ "unsignedByte",
51
+ ].map((t) => XSD + t),
52
+ );
53
+
54
+ /**
55
+ * Undo N-Triples escapes.
56
+ * @param text - escaped text
57
+ * @returns the text
58
+ */
59
+ function unescape(text: string): string {
60
+ if (!text.includes("\\")) {
61
+ return text;
62
+ }
63
+ const simple: Readonly<Record<string, string>> = { t: "\t", b: "\b", n: "\n", r: "\r", f: "\f" };
64
+ return text.replaceAll(
65
+ /\\(?:u([\da-fA-F]{4})|U([\da-fA-F]{8})|(.))/g,
66
+ (_m, u4?: string, u8?: string, c?: string) => {
67
+ const hex = u4 ?? u8;
68
+ if (hex !== undefined) {
69
+ return String.fromCodePoint(Number.parseInt(hex, 16));
70
+ }
71
+ return simple[c ?? ""] ?? c ?? "";
72
+ },
73
+ );
74
+ }
75
+
76
+ /**
77
+ * Read one term at `at`.
78
+ * @param line - the line
79
+ * @param at - where to start
80
+ * @returns the term and where it ended, or null when there is none
81
+ */
82
+ function readTerm(line: string, at: number): { term: Term; end: number } | null {
83
+ TERM.lastIndex = at;
84
+ const m = TERM.exec(line);
85
+ if (m === null) {
86
+ return null;
87
+ }
88
+ const [, iri, bnode, lexical, lang, datatype] = m;
89
+ let term: Term;
90
+ if (iri !== undefined) {
91
+ term = { kind: "iri", value: unescape(iri) };
92
+ } else if (bnode === undefined) {
93
+ term = {
94
+ kind: "literal",
95
+ value: unescape(lexical ?? ""),
96
+ lang: lang?.toLowerCase() ?? "",
97
+ datatype: datatype ?? "",
98
+ };
99
+ } else {
100
+ term = { kind: "bnode", value: `_:${bnode}` };
101
+ }
102
+ return { term, end: TERM.lastIndex };
103
+ }
104
+
105
+ /**
106
+ * Parse N-Triples.
107
+ * @param text - the document
108
+ * @returns the triples, or the 1-based number of the first line that is not a triple
109
+ */
110
+ export function parseNTriples(text: string): { triples: Triple[]; badLine: number | null } {
111
+ const triples: Triple[] = [];
112
+ const lines = text.split(/\r?\n/);
113
+ for (let i = 0; i < lines.length; i++) {
114
+ const line = lines[i];
115
+ const trimmed = line.trim();
116
+ if (trimmed === "" || trimmed.startsWith("#")) {
117
+ continue;
118
+ }
119
+ const s = readTerm(line, 0);
120
+ const p = s === null ? null : readTerm(line, s.end);
121
+ const o = p === null ? null : readTerm(line, p.end);
122
+ END.lastIndex = o?.end ?? 0;
123
+ if (
124
+ s === null ||
125
+ p === null ||
126
+ o === null ||
127
+ s.term.kind === "literal" ||
128
+ p.term.kind !== "iri" ||
129
+ !END.test(line)
130
+ ) {
131
+ return { triples, badLine: i + 1 };
132
+ }
133
+ triples.push({ s: s.term, p: p.term.value, o: o.term });
134
+ }
135
+ return { triples, badLine: null };
136
+ }
137
+
138
+ /**
139
+ * The local name of an IRI: what follows its last `#`, else its last `/`, else its last `:`.
140
+ * @param iri - the IRI
141
+ * @returns the local name, or the whole IRI when nothing follows
142
+ */
143
+ export function localName(iri: string): string {
144
+ const cut = Math.max(iri.lastIndexOf("#"), iri.lastIndexOf("/"), iri.lastIndexOf(":"));
145
+ const name = iri.slice(cut + 1);
146
+ return name === "" ? iri : name;
147
+ }
148
+
149
+ /**
150
+ * A literal's value: numbers and booleans as such, everything else as its text.
151
+ * @param term - the literal
152
+ * @returns the value
153
+ */
154
+ function literalValue(term: Extract<Term, { kind: "literal" }>): string | number | boolean {
155
+ if (NUMERIC.has(term.datatype)) {
156
+ const n = Number(term.value);
157
+ return Number.isFinite(n) ? n : term.value;
158
+ }
159
+ if (term.datatype === `${XSD}boolean`) {
160
+ return term.value === "true" || term.value === "1";
161
+ }
162
+ return term.value;
163
+ }
164
+
165
+ /**
166
+ * Whether a literal's language tag passes a language filter (SPARQL's langMatches, plus untagged).
167
+ * @param lang - the literal's tag, lowercase
168
+ * @param want - the filter, lowercase, or "" for none
169
+ * @returns whether to keep it
170
+ */
171
+ function languageMatches(lang: string, want: string): boolean {
172
+ return want === "" || lang === "" || lang === want || lang.startsWith(`${want}-`);
173
+ }
174
+
175
+ /** The nodes and edges of some triples. */
176
+ export interface Graphed {
177
+ /** Each subject's literal attributes, by subject id; a predicate's first value wins. */
178
+ readonly nodes: Map<string, Record<string, string | number | boolean>>;
179
+ /** One edge per IRI or blank-node object. */
180
+ readonly edges: { source: string; target: string; type: string; predicate: string }[];
181
+ }
182
+
183
+ /**
184
+ * Turn triples into nodes and edges.
185
+ * @param triples - the triples
186
+ * @param language - the language filter, lowercase, or ""
187
+ * @param into - nodes and edges to add to
188
+ * @returns the nodes and edges
189
+ */
190
+ export function graphTriples(triples: readonly Triple[], language: string, into?: Graphed): Graphed {
191
+ const out: Graphed = into ?? { nodes: new Map(), edges: [] };
192
+ for (const { s, p, o } of triples) {
193
+ let attrs = out.nodes.get(s.value);
194
+ if (attrs === undefined) {
195
+ attrs = {};
196
+ out.nodes.set(s.value, attrs);
197
+ }
198
+ if (o.kind === "literal") {
199
+ const key = localName(p);
200
+ // ponytail: one value per predicate (the first); a list column if multi-valued literals matter
201
+ if (languageMatches(o.lang, language) && !(key in attrs)) {
202
+ attrs[key] = literalValue(o);
203
+ }
204
+ } else {
205
+ out.edges.push({ source: s.value, target: o.value, type: localName(p), predicate: p });
206
+ }
207
+ }
208
+ return out;
209
+ }
210
+
211
+ /**
212
+ * One canonical line per triple, for the content hash.
213
+ * @param t - the triple
214
+ * @returns the line
215
+ */
216
+ export function canonicalTriple(t: Triple): string {
217
+ const o = t.o.kind === "literal" ? JSON.stringify([t.o.value, t.o.lang, t.o.datatype]) : t.o.value;
218
+ return `${t.s.value} ${t.p} ${o}`;
219
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The parameters of the SPARQL source. Experimental.
3
+ */
4
+
5
+ import { type NodeId } from "@graphty/graph-format";
6
+
7
+ /**
8
+ * What to read from a SPARQL endpoint. Experimental.
9
+ * @category Network sources
10
+ */
11
+ export interface SparqlParams {
12
+ /** The caller's CONSTRUCT or DESCRIBE query; without one a query is generated from `mode`. */
13
+ readonly query?: string | undefined;
14
+ /** "query" (the caller's), "all" (every triple, paged) or "neighborhood" (the triples of `ids`). */
15
+ readonly mode?: "query" | "all" | "neighborhood" | undefined;
16
+ /** The seed IRIs of "neighborhood". */
17
+ readonly ids?: readonly NodeId[] | undefined;
18
+ /** Keep literals tagged with this language (`en`) or with none; default every literal. */
19
+ readonly language?: string | undefined;
20
+ /**
21
+ * Generated queries and expansions follow only predicates starting with one of these IRIs
22
+ * (Wikidata's direct claims: `http://www.wikidata.org/prop/direct/`); literals are always kept.
23
+ * Default every predicate.
24
+ */
25
+ readonly predicates?: readonly string[] | string | undefined;
26
+ /** Solutions per page, 1 to 10000. A load stops between pages. @defaultValue 1000 */
27
+ readonly pageSize?: number | undefined;
28
+ }
@@ -0,0 +1,162 @@
1
+ /**
2
+ * The SPARQL the source sends: the caller's CONSTRUCT or DESCRIBE with the paging the source
3
+ * adds (`ORDER BY` the template's variables, `LIMIT` and `OFFSET`), and the generated queries of
4
+ * "all", "neighborhood" and expand (`VALUES ?s { ... }`).
5
+ */
6
+
7
+ /** Characters an IRIREF may not hold. */
8
+ const NOT_IRI = /[\s<>"{}|^`\\]/;
9
+
10
+ /** A language tag a filter may name. */
11
+ const LANGUAGE = /^[a-z]{1,8}(-[a-z\d]{1,8})*$/i;
12
+
13
+ /** The query forms, as the first keyword after the prologue. */
14
+ type QueryForm = "construct" | "describe" | "select" | "ask" | null;
15
+
16
+ /** What paging the caller's query takes. */
17
+ interface UserQuery {
18
+ /** Its form. */
19
+ readonly form: QueryForm;
20
+ /** Whether it sets its own LIMIT or OFFSET, so the source sends it as written. */
21
+ readonly ownLimit: boolean;
22
+ /** Whether it orders its solutions itself. */
23
+ readonly ordered: boolean;
24
+ /** The variables of a CONSTRUCT template, in order, for ORDER BY. */
25
+ readonly templateVars: readonly string[];
26
+ }
27
+
28
+ /**
29
+ * The query with IRIs, strings and comments blanked out, so keywords and braces can be found.
30
+ * @param query - the query
31
+ * @returns the bare text
32
+ */
33
+ function bare(query: string): string {
34
+ return query
35
+ .replaceAll(/<[^<>\s]*>/g, "<>")
36
+ .replaceAll(/"""[\s\S]*?"""|'''[\s\S]*?'''|"(?:[^"\\\n]|\\.)*"|'(?:[^'\\\n]|\\.)*'/g, '""')
37
+ .replaceAll(/#[^\n]*/g, "");
38
+ }
39
+
40
+ /**
41
+ * Read what paging a caller's query takes.
42
+ * @param query - the query
43
+ * @returns its form, its own modifiers and its template variables
44
+ */
45
+ export function readQuery(query: string): UserQuery {
46
+ const text = bare(query);
47
+ const form = /\b(CONSTRUCT|DESCRIBE|SELECT|ASK)\b/i.exec(text)?.[1]?.toLowerCase() ?? null;
48
+ // the solution modifiers follow the last closing brace (a trailing VALUES block is not handled)
49
+ const tail = text.slice(text.lastIndexOf("}") + 1);
50
+ let templateVars: string[] = [];
51
+ if (form === "construct") {
52
+ const template = /\bCONSTRUCT\s*\{([^}]*)\}/i.exec(text)?.[1] ?? "";
53
+ templateVars = [...new Set(template.match(/[?$]\w+/g) ?? [])].map((v) => `?${v.slice(1)}`);
54
+ }
55
+ return {
56
+ form: form as QueryForm,
57
+ ownLimit: /\b(LIMIT|OFFSET)\b/i.test(tail),
58
+ ordered: /\bORDER\s+BY\b/i.test(tail),
59
+ templateVars,
60
+ };
61
+ }
62
+
63
+ /**
64
+ * The caller's query with one page's modifiers added.
65
+ * @param query - the query
66
+ * @param shape - what readQuery found
67
+ * @param limit - solutions per page
68
+ * @param offset - solutions to skip
69
+ * @returns the query to send
70
+ */
71
+ export function pagedQuery(query: string, shape: UserQuery, limit: number, offset: number): string {
72
+ const order = shape.ordered || shape.templateVars.length === 0 ? "" : `\nORDER BY ${shape.templateVars.join(" ")}`;
73
+ const skip = offset > 0 ? ` OFFSET ${String(offset)}` : "";
74
+ return `${query.trimEnd()}${order}\nLIMIT ${String(limit)}${skip}`;
75
+ }
76
+
77
+ /**
78
+ * An IRI as a SPARQL term, or null when it cannot be one.
79
+ * @param id - the id
80
+ * @returns `<iri>`, or null
81
+ */
82
+ export function iriTerm(id: unknown): string | null {
83
+ const text = String(id);
84
+ return /^[a-z][\w+.-]*:/i.test(text) && !NOT_IRI.test(text) ? `<${text}>` : null;
85
+ }
86
+
87
+ /** What generated queries keep: literals in a language, edges along some predicates. */
88
+ interface TripleFilter {
89
+ /** Keep literals tagged with this language or untagged; "" keeps every literal. */
90
+ readonly language: string;
91
+ /** Keep edges whose predicate starts with one of these IRIs; empty keeps every edge. */
92
+ readonly predicates: readonly string[];
93
+ }
94
+
95
+ /**
96
+ * The FILTERs of generated queries, or "" for none. Both values are checked by the caller.
97
+ * @param filter - the language and the predicate prefixes
98
+ * @returns the FILTER clauses
99
+ */
100
+ function filters(filter: TripleFilter): string {
101
+ const { language, predicates } = filter;
102
+ const lang =
103
+ language === "" ? "" : ` FILTER(!isLiteral(?o) || lang(?o) = "" || langMatches(lang(?o), "${language}"))`;
104
+ const along = predicates.map((p) => `STRSTARTS(STR(?p), "${p}")`).join(" || ");
105
+ return predicates.length === 0 ? lang : `${lang} FILTER(isLiteral(?o) || ${along})`;
106
+ }
107
+
108
+ /**
109
+ * Whether a language tag may go into a FILTER.
110
+ * @param language - the tag
111
+ * @returns whether it is well formed
112
+ */
113
+ export function validLanguage(language: string): boolean {
114
+ return LANGUAGE.test(language);
115
+ }
116
+
117
+ /**
118
+ * Mode "all": every triple, ordered so pages are stable.
119
+ * @param filter - what to keep
120
+ * @param limit - solutions per page
121
+ * @param offset - solutions to skip
122
+ * @returns the query
123
+ */
124
+ export function allQuery(filter: TripleFilter, limit: number, offset: number): string {
125
+ return pagedQuery(
126
+ `CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o .${filters(filter)} }`,
127
+ { form: "construct", ownLimit: false, ordered: false, templateVars: ["?s", "?p", "?o"] },
128
+ limit,
129
+ offset,
130
+ );
131
+ }
132
+
133
+ /**
134
+ * The triples around some IRIs: out (`VALUES ?s`), in (`VALUES ?o`) or both.
135
+ * @param iris - the IRIs as terms
136
+ * @param direction - which triples
137
+ * @param filter - what to keep
138
+ * @param limit - solutions per page
139
+ * @param offset - solutions to skip
140
+ * @returns the query
141
+ */
142
+ export function aroundQuery(
143
+ iris: readonly string[],
144
+ direction: "out" | "in" | "both",
145
+ filter: TripleFilter,
146
+ limit: number,
147
+ offset: number,
148
+ ): string {
149
+ const values = iris.join(" ");
150
+ const out = `{ VALUES ?s { ${values} } ?s ?p ?o .${filters(filter)} }`;
151
+ const inward = `{ VALUES ?o { ${values} } ?s ?p ?o .${filters({ ...filter, language: "" })} }`;
152
+ let where = `${out} UNION ${inward}`;
153
+ if (direction !== "both") {
154
+ where = direction === "out" ? out : inward;
155
+ }
156
+ return pagedQuery(
157
+ `CONSTRUCT { ?s ?p ?o } WHERE { ${where} }`,
158
+ { form: "construct", ownLimit: false, ordered: false, templateVars: ["?s", "?p", "?o"] },
159
+ limit,
160
+ offset,
161
+ );
162
+ }
@@ -223,6 +223,18 @@ export interface RetryOptions {
223
223
  readonly maxDelayMs?: number | undefined;
224
224
  }
225
225
 
226
+ /**
227
+ * How much a source holds for a load, as it counted it, so a caller can show "100 of 28,455".
228
+ * Experimental.
229
+ * @category Network sources
230
+ */
231
+ export interface SourceTotal {
232
+ /** The nodes the load's params match at the source. */
233
+ readonly nodes?: number | undefined;
234
+ /** The edges the load's params match at the source. */
235
+ readonly edges?: number | undefined;
236
+ }
237
+
226
238
  /**
227
239
  * Facts a source reports with `ctx.finish()`. Experimental.
228
240
  * @category Network sources
@@ -243,6 +255,8 @@ export interface SourceFinish {
243
255
  | undefined;
244
256
  /** What lets a later call tell whether the data changed. */
245
257
  readonly validators?: SourceValidators | undefined;
258
+ /** What the source holds for this load, when it counted: the nodes and edges it matches. */
259
+ readonly total?: SourceTotal | undefined;
246
260
  }
247
261
 
248
262
  /**
@@ -357,6 +371,11 @@ export interface SourceSample {
357
371
  | undefined;
358
372
  /** false: too big to load whole; start from a neighborhood. */
359
373
  readonly whole?: boolean | undefined;
374
+ /**
375
+ * A node cap for loading the sample when the caller gives none, for a sample too big to load
376
+ * whole that pages: the load stops at the first page past it, and its cursor reads on.
377
+ */
378
+ readonly firstPage?: number | undefined;
360
379
  }
361
380
 
362
381
  /**
@@ -377,6 +396,20 @@ export interface SourceDescriptor {
377
396
  readonly auth?: readonly CredentialKind[] | undefined;
378
397
  /** Whether a credential is needed. @defaultValue "none" */
379
398
  readonly authRequired?: "required" | "optional" | "none" | undefined;
399
+ /**
400
+ * Where an `api-key` credential goes, for a form that asks for the key alone: pass it to
401
+ * `credentials.apiKey(descriptor.apiKey, key)`. Absent when the caller must say.
402
+ */
403
+ readonly apiKey?:
404
+ | {
405
+ /** The request header that carries the key. */
406
+ readonly header: string;
407
+ }
408
+ | {
409
+ /** The query parameter that carries the key. */
410
+ readonly query: string;
411
+ }
412
+ | undefined;
380
413
  /** The endpoint used when the caller names none. @defaultValue null */
381
414
  readonly defaultEndpoint?: string | null | undefined;
382
415
  /** Where it runs; a runtime marked unsupported is refused with E_SOURCE_RUNTIME before any request. */
@@ -584,6 +617,8 @@ export interface SourceReportInfo {
584
617
  | undefined;
585
618
  /** What lets a later call tell whether the data changed. */
586
619
  readonly validators?: SourceValidators | undefined;
620
+ /** What the source holds for this load, when it counted: the nodes and edges it matches. */
621
+ readonly total?: SourceTotal | undefined;
587
622
  }
588
623
 
589
624
  /**