@graphty/graph-io 0.3.48 → 0.3.50

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 (600) hide show
  1. package/dist/chunks/{approximations-C2riR4NT.js → approximations-BRXsll0T.js} +2 -2
  2. package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-BRXsll0T.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-yl0f_qLO.js} +931 -164
  6. package/dist/chunks/block-yl0f_qLO.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-DizmppHy.js} +5 -4
  14. package/dist/chunks/{context-cgmmOxZ2.js.map → context-DizmppHy.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-CmvJXYeH.js} +67 -16
  18. package/dist/chunks/credentials-CmvJXYeH.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-Dhez_Cew.js} +11 -2
  24. package/dist/chunks/descriptor-Dhez_Cew.js.map +1 -0
  25. package/dist/chunks/{emit-CD8xnY8s.js → emit-7Jkpg0yd.js} +1788 -133
  26. package/dist/chunks/emit-7Jkpg0yd.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-ChjL5fmP.js → exporter-1Ajud15J.js} +9 -8
  32. package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-1Ajud15J.js.map} +1 -1
  33. package/dist/chunks/{exporter-BIdaoIgh.js → exporter-B6yvL3wy.js} +7 -7
  34. package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-B6yvL3wy.js.map} +1 -1
  35. package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
  36. package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
  37. package/dist/chunks/{exporter-DtVU80Fa.js → exporter-CA5q8ROP.js} +9 -8
  38. package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-CA5q8ROP.js.map} +1 -1
  39. package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-CQQZFJ2v.js} +1284 -156
  40. package/dist/chunks/exporter-CQQZFJ2v.js.map +1 -0
  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-Dc21MAdg.js} +387 -31
  44. package/dist/chunks/generic-Dc21MAdg.js.map +1 -0
  45. package/dist/chunks/{importer-B87_fmVx.js → importer-C6NVpCXp.js} +327 -84
  46. package/dist/chunks/importer-C6NVpCXp.js.map +1 -0
  47. package/dist/chunks/{importer-DPZDN40-.js → importer-CKFe4q54.js} +25 -17
  48. package/dist/chunks/importer-CKFe4q54.js.map +1 -0
  49. package/dist/chunks/{importer-Bji2MeWr.js → importer-CKbUbsJA.js} +13 -10
  50. package/dist/chunks/{importer-Bji2MeWr.js.map → importer-CKbUbsJA.js.map} +1 -1
  51. package/dist/chunks/{importer-CB_zV5_L.js → importer-ClCsdgTJ.js} +208 -1104
  52. package/dist/chunks/importer-ClCsdgTJ.js.map +1 -0
  53. package/dist/chunks/{importer-e3huMZbm.js → importer-CyVZTrf0.js} +14 -10
  54. package/dist/chunks/importer-CyVZTrf0.js.map +1 -0
  55. package/dist/chunks/{importer-CVT-JyDE.js → importer-DgG4v1Ms.js} +1537 -355
  56. package/dist/chunks/importer-DgG4v1Ms.js.map +1 -0
  57. package/dist/chunks/{importer-Cyy6UseH.js → importer-asFUrIsj.js} +66 -13
  58. package/dist/chunks/importer-asFUrIsj.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-IVRq2Uoo.js} +282 -74
  64. package/dist/chunks/lexicon-IVRq2Uoo.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-Cy3_SHRZ.js +79 -0
  72. package/dist/chunks/round-trip-Cy3_SHRZ.js.map +1 -0
  73. package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-BXwVbza3.js} +5 -5
  74. package/dist/chunks/sigv4-BXwVbza3.js.map +1 -0
  75. package/dist/chunks/{styles-CaABMoO1.js → styles-CAVmBLgp.js} +1237 -138
  76. package/dist/chunks/styles-CAVmBLgp.js.map +1 -0
  77. package/dist/chunks/styles-CPczw1Jz.js +1928 -0
  78. package/dist/chunks/styles-CPczw1Jz.js.map +1 -0
  79. package/dist/chunks/styles-boK6Ln54.js +2847 -0
  80. package/dist/chunks/styles-boK6Ln54.js.map +1 -0
  81. package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-XeFBQ6VS.js} +506 -175
  82. package/dist/chunks/styles-yed-XeFBQ6VS.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 +8 -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 +848 -194
  94. package/dist/gml.js.map +1 -1
  95. package/dist/graph-io.js +230 -193
  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 +141 -23
  105. package/dist/sources-cypher.js.map +1 -1
  106. package/dist/sources-ndex.js +2 -2
  107. package/dist/sources-rest.js +32 -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 +439 -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/exporter.d.ts.map +1 -1
  137. package/dist/src/formats/dot/exporter.js +34 -2
  138. package/dist/src/formats/dot/exporter.js.map +1 -1
  139. package/dist/src/formats/dot/importer.d.ts +6 -1
  140. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  141. package/dist/src/formats/dot/importer.js +170 -33
  142. package/dist/src/formats/dot/importer.js.map +1 -1
  143. package/dist/src/formats/dot/index.d.ts +3 -1
  144. package/dist/src/formats/dot/index.d.ts.map +1 -1
  145. package/dist/src/formats/dot/index.js +2 -1
  146. package/dist/src/formats/dot/index.js.map +1 -1
  147. package/dist/src/formats/dot/label-places.d.ts +41 -0
  148. package/dist/src/formats/dot/label-places.d.ts.map +1 -0
  149. package/dist/src/formats/dot/label-places.js +185 -0
  150. package/dist/src/formats/dot/label-places.js.map +1 -0
  151. package/dist/src/formats/dot/names.d.ts +13 -0
  152. package/dist/src/formats/dot/names.d.ts.map +1 -1
  153. package/dist/src/formats/dot/names.js +13 -0
  154. package/dist/src/formats/dot/names.js.map +1 -1
  155. package/dist/src/formats/dot/record.d.ts +50 -0
  156. package/dist/src/formats/dot/record.d.ts.map +1 -0
  157. package/dist/src/formats/dot/record.js +275 -0
  158. package/dist/src/formats/dot/record.js.map +1 -0
  159. package/dist/src/formats/dot/styles.d.ts +72 -2
  160. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  161. package/dist/src/formats/dot/styles.js +1500 -119
  162. package/dist/src/formats/dot/styles.js.map +1 -1
  163. package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
  164. package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
  165. package/dist/src/formats/gexf/dialog-metrics.js +59 -0
  166. package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
  167. package/dist/src/formats/gexf/importer.d.ts +7 -0
  168. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  169. package/dist/src/formats/gexf/importer.js +41 -5
  170. package/dist/src/formats/gexf/importer.js.map +1 -1
  171. package/dist/src/formats/gexf/preview.d.ts +77 -0
  172. package/dist/src/formats/gexf/preview.d.ts.map +1 -0
  173. package/dist/src/formats/gexf/preview.js +191 -0
  174. package/dist/src/formats/gexf/preview.js.map +1 -0
  175. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  176. package/dist/src/formats/gexf/schema.js +2 -1
  177. package/dist/src/formats/gexf/schema.js.map +1 -1
  178. package/dist/src/formats/gexf/styles.d.ts +58 -31
  179. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  180. package/dist/src/formats/gexf/styles.js +848 -225
  181. package/dist/src/formats/gexf/styles.js.map +1 -1
  182. package/dist/src/formats/gml/importer.d.ts +5 -2
  183. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  184. package/dist/src/formats/gml/importer.js +258 -71
  185. package/dist/src/formats/gml/importer.js.map +1 -1
  186. package/dist/src/formats/gml/index.d.ts +1 -1
  187. package/dist/src/formats/gml/index.d.ts.map +1 -1
  188. package/dist/src/formats/gml/index.js +1 -1
  189. package/dist/src/formats/gml/index.js.map +1 -1
  190. package/dist/src/formats/gml/positions.d.ts +7 -0
  191. package/dist/src/formats/gml/positions.d.ts.map +1 -1
  192. package/dist/src/formats/gml/positions.js +29 -7
  193. package/dist/src/formats/gml/positions.js.map +1 -1
  194. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  195. package/dist/src/formats/gml/styles.js +754 -102
  196. package/dist/src/formats/gml/styles.js.map +1 -1
  197. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  198. package/dist/src/formats/graphml/styles-plain.js +6 -10
  199. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  200. package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
  201. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  202. package/dist/src/formats/graphml/styles-yed.js +695 -164
  203. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  204. package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
  205. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
  206. package/dist/src/formats/graphml/styles-yfiles3.js +431 -64
  207. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
  208. package/dist/src/formats/graphml/yfiles.d.ts +3 -3
  209. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  210. package/dist/src/formats/graphml/yfiles.js +16 -6
  211. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  212. package/dist/src/formats/json/dialect.d.ts +3 -2
  213. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  214. package/dist/src/formats/json/dialect.js +39 -5
  215. package/dist/src/formats/json/dialect.js.map +1 -1
  216. package/dist/src/formats/json/importer.d.ts +13 -2
  217. package/dist/src/formats/json/importer.d.ts.map +1 -1
  218. package/dist/src/formats/json/importer.js +42 -6
  219. package/dist/src/formats/json/importer.js.map +1 -1
  220. package/dist/src/formats/json/index.d.ts +1 -1
  221. package/dist/src/formats/json/index.d.ts.map +1 -1
  222. package/dist/src/formats/json/index.js +1 -1
  223. package/dist/src/formats/json/index.js.map +1 -1
  224. package/dist/src/formats/json/positions.d.ts +5 -2
  225. package/dist/src/formats/json/positions.d.ts.map +1 -1
  226. package/dist/src/formats/json/positions.js +20 -4
  227. package/dist/src/formats/json/positions.js.map +1 -1
  228. package/dist/src/formats/json/styles.d.ts +12 -1
  229. package/dist/src/formats/json/styles.d.ts.map +1 -1
  230. package/dist/src/formats/json/styles.js +1843 -136
  231. package/dist/src/formats/json/styles.js.map +1 -1
  232. package/dist/src/formats/pajek/draw.d.ts +104 -0
  233. package/dist/src/formats/pajek/draw.d.ts.map +1 -0
  234. package/dist/src/formats/pajek/draw.js +382 -0
  235. package/dist/src/formats/pajek/draw.js.map +1 -0
  236. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  237. package/dist/src/formats/pajek/exporter.js +70 -51
  238. package/dist/src/formats/pajek/exporter.js.map +1 -1
  239. package/dist/src/formats/pajek/importer.d.ts +9 -0
  240. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  241. package/dist/src/formats/pajek/importer.js +233 -102
  242. package/dist/src/formats/pajek/importer.js.map +1 -1
  243. package/dist/src/formats/pajek/index.d.ts +1 -0
  244. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  245. package/dist/src/formats/pajek/index.js.map +1 -1
  246. package/dist/src/formats/pajek/styles.d.ts +15 -7
  247. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  248. package/dist/src/formats/pajek/styles.js +1395 -114
  249. package/dist/src/formats/pajek/styles.js.map +1 -1
  250. package/dist/src/formats/pajek/syntax.d.ts +10 -1
  251. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  252. package/dist/src/formats/pajek/syntax.js +26 -2
  253. package/dist/src/formats/pajek/syntax.js.map +1 -1
  254. package/dist/src/formats/xgmml/emit.d.ts +1 -0
  255. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  256. package/dist/src/formats/xgmml/emit.js +65 -5
  257. package/dist/src/formats/xgmml/emit.js.map +1 -1
  258. package/dist/src/formats/xgmml/styles.d.ts +23 -3
  259. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  260. package/dist/src/formats/xgmml/styles.js +277 -60
  261. package/dist/src/formats/xgmml/styles.js.map +1 -1
  262. package/dist/src/index.d.ts +6 -5
  263. package/dist/src/index.d.ts.map +1 -1
  264. package/dist/src/index.js +6 -5
  265. package/dist/src/index.js.map +1 -1
  266. package/dist/src/positions/convert.d.ts.map +1 -1
  267. package/dist/src/positions/convert.js +11 -1
  268. package/dist/src/positions/convert.js.map +1 -1
  269. package/dist/src/positions/extract.d.ts.map +1 -1
  270. package/dist/src/positions/extract.js +53 -1
  271. package/dist/src/positions/extract.js.map +1 -1
  272. package/dist/src/positions/index.d.ts +1 -1
  273. package/dist/src/positions/index.d.ts.map +1 -1
  274. package/dist/src/positions/types.d.ts +59 -0
  275. package/dist/src/positions/types.d.ts.map +1 -1
  276. package/dist/src/sources/builtins.d.ts +1 -1
  277. package/dist/src/sources/builtins.d.ts.map +1 -1
  278. package/dist/src/sources/builtins.js +8 -2
  279. package/dist/src/sources/builtins.js.map +1 -1
  280. package/dist/src/sources/context.d.ts.map +1 -1
  281. package/dist/src/sources/context.js +1 -0
  282. package/dist/src/sources/context.js.map +1 -1
  283. package/dist/src/sources/credentials.d.ts +50 -1
  284. package/dist/src/sources/credentials.d.ts.map +1 -1
  285. package/dist/src/sources/credentials.js +69 -0
  286. package/dist/src/sources/credentials.js.map +1 -1
  287. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
  288. package/dist/src/sources/cypher/descriptor.js +5 -0
  289. package/dist/src/sources/cypher/descriptor.js.map +1 -1
  290. package/dist/src/sources/cypher/index.d.ts.map +1 -1
  291. package/dist/src/sources/cypher/index.js +125 -18
  292. package/dist/src/sources/cypher/index.js.map +1 -1
  293. package/dist/src/sources/cypher/params.d.ts +1 -1
  294. package/dist/src/sources/cypher/params.d.ts.map +1 -1
  295. package/dist/src/sources/cypher/query-builder.d.ts +17 -0
  296. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
  297. package/dist/src/sources/cypher/query-builder.js +31 -0
  298. package/dist/src/sources/cypher/query-builder.js.map +1 -1
  299. package/dist/src/sources/ids.d.ts +5 -0
  300. package/dist/src/sources/ids.d.ts.map +1 -1
  301. package/dist/src/sources/ids.js +5 -0
  302. package/dist/src/sources/ids.js.map +1 -1
  303. package/dist/src/sources/params.d.ts +3 -0
  304. package/dist/src/sources/params.d.ts.map +1 -1
  305. package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
  306. package/dist/src/sources/rest/descriptor.js +9 -0
  307. package/dist/src/sources/rest/descriptor.js.map +1 -1
  308. package/dist/src/sources/rest/openalex.d.ts +4 -2
  309. package/dist/src/sources/rest/openalex.d.ts.map +1 -1
  310. package/dist/src/sources/rest/openalex.js +4 -2
  311. package/dist/src/sources/rest/openalex.js.map +1 -1
  312. package/dist/src/sources/rest/source.d.ts.map +1 -1
  313. package/dist/src/sources/rest/source.js +38 -0
  314. package/dist/src/sources/rest/source.js.map +1 -1
  315. package/dist/src/sources/run.d.ts +2 -0
  316. package/dist/src/sources/run.d.ts.map +1 -1
  317. package/dist/src/sources/run.js +30 -3
  318. package/dist/src/sources/run.js.map +1 -1
  319. package/dist/src/sources/sigv4.d.ts +5 -3
  320. package/dist/src/sources/sigv4.d.ts.map +1 -1
  321. package/dist/src/sources/sigv4.js +6 -4
  322. package/dist/src/sources/sigv4.js.map +1 -1
  323. package/dist/src/sources/sparql/descriptor.d.ts +10 -0
  324. package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
  325. package/dist/src/sources/sparql/descriptor.js +64 -0
  326. package/dist/src/sources/sparql/descriptor.js.map +1 -0
  327. package/dist/src/sources/sparql/index.d.ts +28 -0
  328. package/dist/src/sources/sparql/index.d.ts.map +1 -0
  329. package/dist/src/sources/sparql/index.js +327 -0
  330. package/dist/src/sources/sparql/index.js.map +1 -0
  331. package/dist/src/sources/sparql/ntriples.d.ts +69 -0
  332. package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
  333. package/dist/src/sources/sparql/ntriples.js +180 -0
  334. package/dist/src/sources/sparql/ntriples.js.map +1 -0
  335. package/dist/src/sources/sparql/params.d.ts +27 -0
  336. package/dist/src/sources/sparql/params.d.ts.map +1 -0
  337. package/dist/src/sources/sparql/params.js +5 -0
  338. package/dist/src/sources/sparql/params.js.map +1 -0
  339. package/dist/src/sources/sparql/query.d.ts +73 -0
  340. package/dist/src/sources/sparql/query.d.ts.map +1 -0
  341. package/dist/src/sources/sparql/query.js +164 -0
  342. package/dist/src/sources/sparql/query.js.map +1 -0
  343. package/dist/src/sources/types.d.ts +60 -0
  344. package/dist/src/sources/types.d.ts.map +1 -1
  345. package/dist/src/styles/annotations.d.ts +61 -5
  346. package/dist/src/styles/annotations.d.ts.map +1 -1
  347. package/dist/src/styles/annotations.js +130 -22
  348. package/dist/src/styles/annotations.js.map +1 -1
  349. package/dist/src/styles/canon/bends.d.ts +46 -0
  350. package/dist/src/styles/canon/bends.d.ts.map +1 -1
  351. package/dist/src/styles/canon/bends.js +123 -0
  352. package/dist/src/styles/canon/bends.js.map +1 -1
  353. package/dist/src/styles/canon/color-tables.d.ts +6 -1
  354. package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
  355. package/dist/src/styles/canon/color-tables.js +10 -4
  356. package/dist/src/styles/canon/color-tables.js.map +1 -1
  357. package/dist/src/styles/canon/color.d.ts +3 -1
  358. package/dist/src/styles/canon/color.d.ts.map +1 -1
  359. package/dist/src/styles/canon/color.js +103 -3
  360. package/dist/src/styles/canon/color.js.map +1 -1
  361. package/dist/src/styles/canon/enums.d.ts +2 -2
  362. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  363. package/dist/src/styles/canon/enums.js +89 -7
  364. package/dist/src/styles/canon/enums.js.map +1 -1
  365. package/dist/src/styles/canon/graphviz.d.ts +12 -3
  366. package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
  367. package/dist/src/styles/canon/graphviz.js +57 -9
  368. package/dist/src/styles/canon/graphviz.js.map +1 -1
  369. package/dist/src/styles/canon/number.d.ts +8 -0
  370. package/dist/src/styles/canon/number.d.ts.map +1 -1
  371. package/dist/src/styles/canon/number.js +18 -0
  372. package/dist/src/styles/canon/number.js.map +1 -1
  373. package/dist/src/styles/canon/text.d.ts +29 -2
  374. package/dist/src/styles/canon/text.d.ts.map +1 -1
  375. package/dist/src/styles/canon/text.js +156 -16
  376. package/dist/src/styles/canon/text.js.map +1 -1
  377. package/dist/src/styles/codes.d.ts +2 -0
  378. package/dist/src/styles/codes.d.ts.map +1 -1
  379. package/dist/src/styles/codes.js +2 -0
  380. package/dist/src/styles/codes.js.map +1 -1
  381. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  382. package/dist/src/styles/cyjs/cascade.js +1139 -79
  383. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  384. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  385. package/dist/src/styles/cyjs/defaults-table.js +4 -0
  386. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  387. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  388. package/dist/src/styles/cyjs/emit.js +232 -10
  389. package/dist/src/styles/cyjs/emit.js.map +1 -1
  390. package/dist/src/styles/cyjs/face.d.ts +20 -0
  391. package/dist/src/styles/cyjs/face.d.ts.map +1 -0
  392. package/dist/src/styles/cyjs/face.js +332 -0
  393. package/dist/src/styles/cyjs/face.js.map +1 -0
  394. package/dist/src/styles/cyjs/mappers.d.ts +44 -1
  395. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  396. package/dist/src/styles/cyjs/mappers.js +475 -26
  397. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  398. package/dist/src/styles/cyjs/routes.d.ts +53 -0
  399. package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
  400. package/dist/src/styles/cyjs/routes.js +360 -0
  401. package/dist/src/styles/cyjs/routes.js.map +1 -0
  402. package/dist/src/styles/cytoscape/charts.d.ts +23 -0
  403. package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
  404. package/dist/src/styles/cytoscape/charts.js +560 -0
  405. package/dist/src/styles/cytoscape/charts.js.map +1 -0
  406. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  407. package/dist/src/styles/cytoscape/emit.js +156 -48
  408. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  409. package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
  410. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  411. package/dist/src/styles/cytoscape/lexicon.js +387 -77
  412. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  413. package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
  414. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
  415. package/dist/src/styles/cytoscape/mappings.js +92 -0
  416. package/dist/src/styles/cytoscape/mappings.js.map +1 -1
  417. package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
  418. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  419. package/dist/src/styles/cytoscape/resolve.js +623 -17
  420. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  421. package/dist/src/styles/defaults.d.ts +46 -26
  422. package/dist/src/styles/defaults.d.ts.map +1 -1
  423. package/dist/src/styles/defaults.js +308 -71
  424. package/dist/src/styles/defaults.js.map +1 -1
  425. package/dist/src/styles/index.d.ts +4 -3
  426. package/dist/src/styles/index.d.ts.map +1 -1
  427. package/dist/src/styles/index.js +3 -2
  428. package/dist/src/styles/index.js.map +1 -1
  429. package/dist/src/styles/internal.d.ts +1 -0
  430. package/dist/src/styles/internal.d.ts.map +1 -1
  431. package/dist/src/styles/internal.js +1 -0
  432. package/dist/src/styles/internal.js.map +1 -1
  433. package/dist/src/styles/io/generic.d.ts.map +1 -1
  434. package/dist/src/styles/io/generic.js +56 -16
  435. package/dist/src/styles/io/generic.js.map +1 -1
  436. package/dist/src/styles/io/round-trip.d.ts +56 -0
  437. package/dist/src/styles/io/round-trip.d.ts.map +1 -0
  438. package/dist/src/styles/io/round-trip.js +138 -0
  439. package/dist/src/styles/io/round-trip.js.map +1 -0
  440. package/dist/src/styles/io/writer.d.ts.map +1 -1
  441. package/dist/src/styles/io/writer.js +6 -1
  442. package/dist/src/styles/io/writer.js.map +1 -1
  443. package/dist/src/styles/notes.d.ts.map +1 -1
  444. package/dist/src/styles/notes.js +1 -0
  445. package/dist/src/styles/notes.js.map +1 -1
  446. package/dist/src/styles/plan/features.d.ts +1 -1
  447. package/dist/src/styles/plan/features.d.ts.map +1 -1
  448. package/dist/src/styles/plan/features.js +22 -2
  449. package/dist/src/styles/plan/features.js.map +1 -1
  450. package/dist/src/styles/plan/index.d.ts +1 -1
  451. package/dist/src/styles/plan/index.d.ts.map +1 -1
  452. package/dist/src/styles/plan/index.js +1 -1
  453. package/dist/src/styles/plan/index.js.map +1 -1
  454. package/dist/src/styles/plan/plan.d.ts.map +1 -1
  455. package/dist/src/styles/plan/plan.js +61 -4
  456. package/dist/src/styles/plan/plan.js.map +1 -1
  457. package/dist/src/styles/plan/resolve.d.ts +11 -0
  458. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  459. package/dist/src/styles/plan/resolve.js +40 -4
  460. package/dist/src/styles/plan/resolve.js.map +1 -1
  461. package/dist/src/styles/slots.d.ts +14 -0
  462. package/dist/src/styles/slots.d.ts.map +1 -0
  463. package/dist/src/styles/slots.js +20 -0
  464. package/dist/src/styles/slots.js.map +1 -0
  465. package/dist/src/styles/types.d.ts +687 -6
  466. package/dist/src/styles/types.d.ts.map +1 -1
  467. package/dist/src/styles/vocabulary.d.ts +3 -2
  468. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  469. package/dist/src/styles/vocabulary.js +224 -0
  470. package/dist/src/styles/vocabulary.js.map +1 -1
  471. package/dist/styles.js +30 -239
  472. package/dist/styles.js.map +1 -1
  473. package/dist/xgmml.js +3 -3
  474. package/package.json +27 -7
  475. package/src/formats/cx/importer.ts +6 -1
  476. package/src/formats/cx/styles.ts +143 -9
  477. package/src/formats/cx2/importer.ts +1 -0
  478. package/src/formats/cx2/styles.ts +3 -1
  479. package/src/formats/cys/importer.ts +1 -0
  480. package/src/formats/cys/styles.ts +27 -5
  481. package/src/formats/dot/drawing.ts +799 -0
  482. package/src/formats/dot/exporter.ts +37 -1
  483. package/src/formats/dot/importer.ts +192 -36
  484. package/src/formats/dot/index.ts +3 -1
  485. package/src/formats/dot/label-places.ts +241 -0
  486. package/src/formats/dot/names.ts +15 -0
  487. package/src/formats/dot/record.ts +336 -0
  488. package/src/formats/dot/styles.ts +1702 -149
  489. package/src/formats/gexf/dialog-metrics.ts +61 -0
  490. package/src/formats/gexf/importer.ts +50 -5
  491. package/src/formats/gexf/preview.ts +217 -0
  492. package/src/formats/gexf/schema.ts +2 -1
  493. package/src/formats/gexf/styles.ts +1099 -245
  494. package/src/formats/gml/importer.ts +291 -76
  495. package/src/formats/gml/index.ts +1 -1
  496. package/src/formats/gml/positions.ts +29 -7
  497. package/src/formats/gml/styles.ts +852 -110
  498. package/src/formats/graphml/styles-plain.ts +6 -15
  499. package/src/formats/graphml/styles-yed.ts +765 -176
  500. package/src/formats/graphml/styles-yfiles3.ts +487 -63
  501. package/src/formats/graphml/yfiles.ts +19 -6
  502. package/src/formats/json/dialect.ts +41 -5
  503. package/src/formats/json/importer.ts +59 -7
  504. package/src/formats/json/index.ts +1 -0
  505. package/src/formats/json/positions.ts +22 -5
  506. package/src/formats/json/styles.ts +2123 -171
  507. package/src/formats/pajek/draw.ts +469 -0
  508. package/src/formats/pajek/exporter.ts +81 -49
  509. package/src/formats/pajek/importer.ts +278 -103
  510. package/src/formats/pajek/index.ts +1 -0
  511. package/src/formats/pajek/styles.ts +1506 -133
  512. package/src/formats/pajek/syntax.ts +27 -2
  513. package/src/formats/xgmml/emit.ts +73 -5
  514. package/src/formats/xgmml/styles.ts +330 -71
  515. package/src/index.ts +12 -1
  516. package/src/positions/convert.ts +12 -1
  517. package/src/positions/extract.ts +55 -1
  518. package/src/positions/index.ts +1 -0
  519. package/src/positions/types.ts +60 -0
  520. package/src/sources/builtins.ts +8 -1
  521. package/src/sources/context.ts +1 -0
  522. package/src/sources/credentials.ts +90 -1
  523. package/src/sources/cypher/descriptor.ts +7 -1
  524. package/src/sources/cypher/index.ts +149 -18
  525. package/src/sources/cypher/params.ts +1 -1
  526. package/src/sources/cypher/query-builder.ts +33 -0
  527. package/src/sources/ids.ts +6 -0
  528. package/src/sources/params.ts +3 -0
  529. package/src/sources/rest/descriptor.ts +9 -0
  530. package/src/sources/rest/openalex.ts +4 -2
  531. package/src/sources/rest/source.ts +41 -0
  532. package/src/sources/run.ts +35 -3
  533. package/src/sources/sigv4.ts +6 -4
  534. package/src/sources/sparql/descriptor.ts +67 -0
  535. package/src/sources/sparql/index.ts +371 -0
  536. package/src/sources/sparql/ntriples.ts +219 -0
  537. package/src/sources/sparql/params.ts +28 -0
  538. package/src/sources/sparql/query.ts +216 -0
  539. package/src/sources/types.ts +68 -0
  540. package/src/styles/annotations.ts +201 -27
  541. package/src/styles/canon/bends.ts +137 -0
  542. package/src/styles/canon/color-tables.ts +10 -4
  543. package/src/styles/canon/color.ts +105 -3
  544. package/src/styles/canon/enums.ts +107 -8
  545. package/src/styles/canon/graphviz.ts +71 -10
  546. package/src/styles/canon/number.ts +19 -0
  547. package/src/styles/canon/text.ts +187 -16
  548. package/src/styles/codes.ts +2 -0
  549. package/src/styles/cyjs/cascade.ts +1303 -84
  550. package/src/styles/cyjs/defaults-table.ts +4 -0
  551. package/src/styles/cyjs/emit.ts +268 -14
  552. package/src/styles/cyjs/face.ts +372 -0
  553. package/src/styles/cyjs/mappers.ts +506 -27
  554. package/src/styles/cyjs/routes.ts +432 -0
  555. package/src/styles/cytoscape/charts.ts +684 -0
  556. package/src/styles/cytoscape/emit.ts +170 -48
  557. package/src/styles/cytoscape/lexicon.ts +431 -78
  558. package/src/styles/cytoscape/mappings.ts +108 -0
  559. package/src/styles/cytoscape/resolve.ts +741 -17
  560. package/src/styles/defaults.ts +417 -108
  561. package/src/styles/index.ts +5 -0
  562. package/src/styles/internal.ts +1 -0
  563. package/src/styles/io/generic.ts +79 -23
  564. package/src/styles/io/round-trip.ts +202 -0
  565. package/src/styles/io/writer.ts +6 -1
  566. package/src/styles/notes.ts +1 -0
  567. package/src/styles/plan/features.ts +23 -2
  568. package/src/styles/plan/index.ts +1 -1
  569. package/src/styles/plan/plan.ts +69 -5
  570. package/src/styles/plan/resolve.ts +47 -4
  571. package/src/styles/slots.ts +25 -0
  572. package/src/styles/types.ts +698 -5
  573. package/src/styles/vocabulary.ts +232 -2
  574. package/dist/chunks/block-Cu22ewuS.js.map +0 -1
  575. package/dist/chunks/choose-Cdx6Enl2.js +0 -57
  576. package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
  577. package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
  578. package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
  579. package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
  580. package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
  581. package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
  582. package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
  583. package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
  584. package/dist/chunks/format-BMS-1Nxb.js +0 -64
  585. package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
  586. package/dist/chunks/generic-CP6YD34u.js.map +0 -1
  587. package/dist/chunks/importer-B87_fmVx.js.map +0 -1
  588. package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
  589. package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
  590. package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
  591. package/dist/chunks/importer-DPZDN40-.js.map +0 -1
  592. package/dist/chunks/importer-e3huMZbm.js.map +0 -1
  593. package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
  594. package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
  595. package/dist/chunks/styles-CaABMoO1.js.map +0 -1
  596. package/dist/chunks/styles-P_gmFAOi.js +0 -770
  597. package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
  598. package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
  599. package/dist/chunks/writer-DvHTl36J.js +0 -449
  600. package/dist/chunks/writer-DvHTl36J.js.map +0 -1
@@ -22,6 +22,7 @@ import {
22
22
  GraphFormatError,
23
23
  type GraphMetaPatch,
24
24
  type GraphSink,
25
+ type GraphSnapshot,
25
26
  INVALID_INDEX,
26
27
  type NodeId,
27
28
  type U32,
@@ -61,6 +62,7 @@ import { agree, plural } from "../../common/plural.js";
61
62
  import { ImportReportBuilder } from "../../common/report.js";
62
63
  import { isNumericText, TextCellWriter, WIDENING_UNSUPPORTED_CODE } from "../../common/text.js";
63
64
  import { isWeightField, parseWeightText } from "../../common/weights.js";
65
+ import type { ImporterPositions } from "../../positions/types.js";
64
66
  import {
65
67
  type CommonImportOptions,
66
68
  type GraphChoiceOptions,
@@ -68,7 +70,8 @@ import {
68
70
  type ImportInput,
69
71
  type ImportReport,
70
72
  } from "../../types.js";
71
- import { pajekStyles } from "./styles.js";
73
+ import { type DrawWindow, type PajekDrawOptions, resolvePajekDraw } from "./draw.js";
74
+ import { PAJEK_POINTS_PER_UNIT, pajekStyles } from "./styles.js";
72
75
  import {
73
76
  decodeCharacterReferences,
74
77
  isCommentOrBlank,
@@ -93,6 +96,7 @@ import {
93
96
  VALUE_COLUMN,
94
97
  VALUE_FIELD,
95
98
  VECTOR_COLUMN,
99
+ VOIDING_KEYS,
96
100
  } from "./syntax.js";
97
101
 
98
102
  /**
@@ -106,6 +110,14 @@ export interface PajekImportOptions extends GraphChoiceOptions, CommonImportOpti
106
110
  * @defaultValue "auto"
107
111
  */
108
112
  firstVertex?: 0 | 1 | "auto" | undefined;
113
+ /**
114
+ * How the network is drawn, which Pajek keeps in its ini file and Draw menu rather than in the file: the Draw
115
+ * window's size (Pajek stretches the 0..1 coordinates across it, one axis at a time), the partition and vectors of
116
+ * Draw > Network + Partition (+ Vector), and the Draw window's options by their ini names. Read for the
117
+ * coordinates' scale and the file's styles; without it a file is drawn as Pajek's defaults draw it in a 500 x 500
118
+ * window.
119
+ */
120
+ pajekDraw?: PajekDrawOptions | undefined;
109
121
  }
110
122
 
111
123
  /**
@@ -302,9 +314,10 @@ function spellsDecl(): ColumnDecl {
302
314
  * The position column declaration (design section 5.2: f64 x 3, role position, units "file"), with
303
315
  * its spelling for `extractPositions()`.
304
316
  * @param sourceDims - 2 or 3, the coordinate count of the first vertex line with coordinates
317
+ * @param window - the Draw window the coordinates are stretched to
305
318
  * @returns a fresh declaration
306
319
  */
307
- function positionDecl(sourceDims: number): ColumnDecl {
320
+ function positionDecl(sourceDims: number, window: DrawWindow): ColumnDecl {
308
321
  return {
309
322
  name: POSITION_COLUMN,
310
323
  dtype: "f64",
@@ -313,11 +326,24 @@ function positionDecl(sourceDims: number): ColumnDecl {
313
326
  role: "position",
314
327
  origin: { format: "pajek", id: "coordinates" },
315
328
  // Pajek draws y downward (USAir97.net has Deadhorse, Alaska at y 0.10 and Miami at 0.53),
316
- // centers depth on 0.5, and NetworkX writes "0.0 0.0" for a node with no position
317
- extra: { sourceDims, units: "file", yAxis: "down", zOrigin: 0.5, zeroUnplaced: true },
329
+ // centers depth on 0.5, and NetworkX writes "0.0 0.0" for a node with no position; one unit
330
+ // is the Draw window's width in points across and its height down (500 each by default,
331
+ // PAJEK_POINTS_PER_UNIT): Pajek stretches 0..1 to the window one axis at a time
332
+ extra: {
333
+ sourceDims,
334
+ units: "file",
335
+ pxPerUnit: window.width,
336
+ ...(window.height === window.width ? {} : { pxPerUnitY: window.height }),
337
+ yAxis: "down",
338
+ zOrigin: 0.5,
339
+ zeroUnplaced: true,
340
+ },
318
341
  };
319
342
  }
320
343
 
344
+ /** The Draw window a file is drawn in without `pajekDraw`: the square Pajek's EPS export maps 0..1 to. */
345
+ const DEFAULT_WINDOW: DrawWindow = { width: PAJEK_POINTS_PER_UNIT, height: PAJEK_POINTS_PER_UNIT };
346
+
321
347
  /** A problem with one line, recorded as an issue by the per-line catch. */
322
348
  class LineError extends Error {
323
349
  readonly category: "parse-error" | "validation-error" | "missing-value";
@@ -401,6 +427,17 @@ class PajekParser {
401
427
 
402
428
  private readonly firstVertex: NonNullable<PajekImportOptions["firstVertex"]>;
403
429
 
430
+ /** The Draw window the coordinates are stretched to. */
431
+ private readonly window: DrawWindow;
432
+
433
+ /** The `% graphty.styles` block kept for the styles, or null. */
434
+ keptBlock: string | null = null;
435
+
436
+ /**
437
+ * The vertices whose line Pajek 6.02 draws with none of its parameters (`VOIDING_KEYS`), by index, for the styles.
438
+ */
439
+ readonly voided: number[] = [];
440
+
404
441
  private section: Section = "none";
405
442
 
406
443
  /** The direction of the current line section. */
@@ -505,13 +542,16 @@ class PajekParser {
505
542
  * @param report - the report
506
543
  * @param options - the resolved common options
507
544
  * @param firstVertex - the firstVertex format option
545
+ * @param window - the Draw window the coordinates are stretched to
508
546
  */
509
547
  constructor(
510
548
  sink: GraphSink,
511
549
  report: ImportReportBuilder,
512
550
  options: ResolvedImportOptions,
513
551
  firstVertex: 0 | 1 | "auto",
552
+ window: DrawWindow = DEFAULT_WINDOW,
514
553
  ) {
554
+ this.window = window;
515
555
  this.sink = sink;
516
556
  this.report = report;
517
557
  this.options = options;
@@ -532,7 +572,8 @@ class PajekParser {
532
572
  const trimmed = text.trimStart();
533
573
  if (trimmed.startsWith(PAJEK_STYLE_COMMENT)) {
534
574
  this.styleBlockKept = true;
535
- this.report.keepForStyles(trimmed.slice(PAJEK_STYLE_COMMENT.length));
575
+ this.keptBlock = trimmed.slice(PAJEK_STYLE_COMMENT.length);
576
+ this.report.keepForStyles(this.keptBlock);
536
577
  }
537
578
  }
538
579
 
@@ -1025,6 +1066,58 @@ class PajekParser {
1025
1066
  */
1026
1067
  private vertexLine(text: string, line: number): void {
1027
1068
  const tokens = this.tokens(text, "node", line);
1069
+ const { k, pos } = this.vertexNumber(tokens, line);
1070
+ // parse everything before writing anything
1071
+ let i = 1;
1072
+ let label: string | null = null;
1073
+ if (tokens.length > 1 && !startsWithCoordinates(text, tokens)) {
1074
+ label = this.labelOf(tokens[1], k, line);
1075
+ i = 2;
1076
+ }
1077
+ const { xyz, dims, next } = this.vertexCoordinates(tokens, i, k);
1078
+ i = next;
1079
+ this.checkCoordinates(text, tokens, i, dims === 2 && label !== null, k, line);
1080
+ let shape: string | null = null;
1081
+ if (i < tokens.length && isShapeKeyword(tokens[i])) {
1082
+ shape = tokens[i].toLowerCase();
1083
+ i++;
1084
+ }
1085
+ const extras = this.extras(tokens, i, "node", line);
1086
+ shape = extras.shape ?? shape;
1087
+ const restored = this.restoredId(extras);
1088
+ this.createNodes();
1089
+ // write
1090
+ const repeated = this.markVertexSeen(pos, k, line);
1091
+ const index = this.vertexIndex(pos, k, label, restored, repeated, line);
1092
+ if (shape === null && dims > 0 && extras.keys.length > 0 && VOIDING_KEYS.has(extras.keys[0])) {
1093
+ this.voided.push(index);
1094
+ }
1095
+ if (label !== null) {
1096
+ this.labelHandle = this.nodeHandle(this.labelHandle, LABEL_DECL, line);
1097
+ this.sink.setNodeValue(this.labelHandle, index, label);
1098
+ }
1099
+ if (dims > 0) {
1100
+ this.writePosition(index, dims, xyz, k, line);
1101
+ }
1102
+ if (shape !== null) {
1103
+ this.writeShape(index, shape, line);
1104
+ }
1105
+ for (let p = 0; p < extras.keys.length; p++) {
1106
+ this.writeParameter("node", extras.keys[p], index, extras.values[p]);
1107
+ }
1108
+ if (extras.spells !== null) {
1109
+ this.nodeSpellsHandle = this.nodeHandle(this.nodeSpellsHandle, spellsDecl(), line);
1110
+ this.sink.setNodeValue(this.nodeSpellsHandle, index, extras.spells);
1111
+ }
1112
+ }
1113
+
1114
+ /**
1115
+ * A vertex line's number, checked: it starts the line and is in the declared range.
1116
+ * @param tokens - the line's tokens
1117
+ * @param line - the line number
1118
+ * @returns the vertex number and its position
1119
+ */
1120
+ private vertexNumber(tokens: readonly string[], line: number): { k: number; pos: number } {
1028
1121
  if (!isVertexNumber(tokens[0])) {
1029
1122
  this.report.counts.skippedNodes++;
1030
1123
  throw new LineError(
@@ -1047,28 +1140,30 @@ class PajekParser {
1047
1140
  `vertex ${k} is outside ${this.base}..${this.base + this.vertexCount - 1}`,
1048
1141
  );
1049
1142
  }
1050
- // parse everything before writing anything
1051
- let i = 1;
1052
- let label: string | null = null;
1053
- if (tokens.length > 1 && !startsWithCoordinates(text, tokens)) {
1054
- label = this.labelOf(tokens[1], k, line);
1055
- i = 2;
1056
- }
1057
- let x = 0;
1058
- let y = 0;
1059
- let z = 0;
1060
- let dims = 0;
1143
+ return { k, pos };
1144
+ }
1145
+
1146
+ /**
1147
+ * A vertex line's coordinates: two or three numbers, or none; a single one is an error.
1148
+ * @param tokens - the line's tokens
1149
+ * @param i - where the coordinates would start
1150
+ * @param k - the vertex number
1151
+ * @returns x, y and z (0 when absent), how many were read, and the index after them
1152
+ */
1153
+ private vertexCoordinates(
1154
+ tokens: readonly string[],
1155
+ i: number,
1156
+ k: number,
1157
+ ): { xyz: [number, number, number]; dims: number; next: number } {
1061
1158
  if (i + 1 < tokens.length && isNumericText(tokens[i]) && isNumericText(tokens[i + 1])) {
1062
- x = Number(tokens[i]);
1063
- y = Number(tokens[i + 1]);
1064
- i += 2;
1065
- dims = 2;
1066
- if (i < tokens.length && isNumericText(tokens[i])) {
1067
- z = Number(tokens[i]);
1068
- i++;
1069
- dims = 3;
1159
+ const x = Number(tokens[i]);
1160
+ const y = Number(tokens[i + 1]);
1161
+ if (i + 2 < tokens.length && isNumericText(tokens[i + 2])) {
1162
+ return { xyz: [x, y, Number(tokens[i + 2])], dims: 3, next: i + 3 };
1070
1163
  }
1071
- } else if (i < tokens.length && isNumericText(tokens[i])) {
1164
+ return { xyz: [x, y, 0], dims: 2, next: i + 2 };
1165
+ }
1166
+ if (i < tokens.length && isNumericText(tokens[i])) {
1072
1167
  this.report.counts.skippedNodes++;
1073
1168
  throw new LineError(
1074
1169
  "parse-error",
@@ -1076,39 +1171,60 @@ class PajekParser {
1076
1171
  `vertex ${k}: a single coordinate "${tokens[i]}"; coordinates are x y [z]`,
1077
1172
  );
1078
1173
  }
1079
- this.checkCoordinates(text, tokens, i, dims === 2 && label !== null, k, line);
1080
- let shape: string | null = null;
1081
- if (i < tokens.length && isShapeKeyword(tokens[i])) {
1082
- shape = tokens[i].toLowerCase();
1083
- i++;
1084
- }
1085
- const extras = this.extras(tokens, i, "node", line);
1086
- shape = extras.shape ?? shape;
1087
- const restored = this.restoredId(extras);
1088
- this.createNodes();
1089
- // write
1090
- const repeated = this.seen[pos] !== 0;
1091
- if (repeated) {
1174
+ return { xyz: [0, 0, 0], dims: 0, next: i };
1175
+ }
1176
+
1177
+ /**
1178
+ * Marks a vertex's position as having a line, warning when it already had one.
1179
+ * @param pos - the vertex's position
1180
+ * @param k - the vertex number
1181
+ * @param line - the line number
1182
+ * @returns whether the vertex already had a line
1183
+ */
1184
+ private markVertexSeen(pos: number, k: number, line: number): boolean {
1185
+ if (this.seen[pos] !== 0) {
1092
1186
  this.report.warning(
1093
1187
  "merged",
1094
1188
  PAJEK_ISSUE.DUPLICATE_NODE,
1095
1189
  `vertex ${k} has more than one line; the later values overwrite`,
1096
1190
  { line, element: String(k) },
1097
1191
  );
1098
- } else {
1099
- this.seen[pos] = 1;
1100
- this.seenCount++;
1192
+ return true;
1101
1193
  }
1102
- let index: number;
1103
- if (this.idOfPos !== null && !repeated && this.options.nodeIdFrom === "label") {
1104
- index = this.deferredNode(this.idOfPos, pos, k, label, line, "label");
1105
- } else if (this.idOfPos !== null && this.idOfPos[pos] === undefined) {
1194
+ this.seen[pos] = 1;
1195
+ this.seenCount++;
1196
+ return false;
1197
+ }
1198
+
1199
+ /**
1200
+ * The node index a vertex line writes to, creating the node when its id is deferred to its line.
1201
+ * @param pos - the vertex's position
1202
+ * @param k - the vertex number
1203
+ * @param label - the line's label, or null
1204
+ * @param restored - the original id the line carries, or null
1205
+ * @param repeated - whether the vertex already had a line
1206
+ * @param line - the line number
1207
+ * @returns the node index
1208
+ */
1209
+ private vertexIndex(
1210
+ pos: number,
1211
+ k: number,
1212
+ label: string | null,
1213
+ restored: string | null,
1214
+ repeated: boolean,
1215
+ line: number,
1216
+ ): number {
1217
+ const { idOfPos } = this;
1218
+ if (idOfPos !== null && !repeated && this.options.nodeIdFrom === "label") {
1219
+ return this.deferredNode(idOfPos, pos, k, label, line, "label");
1220
+ }
1221
+ if (idOfPos !== null && idOfPos[pos] === undefined) {
1106
1222
  // restore mode: the earlier positions without a line yet get their numbers first, so the
1107
1223
  // index order is the vertex number order whatever the line order (the identity id map
1108
1224
  // of an ordered file); then this vertex with its original id, or its number
1109
1225
  for (let p = this.filledBelow; p < pos; p++) {
1110
- if (this.idOfPos[p] === undefined) {
1111
- this.numberedNode(this.idOfPos, p);
1226
+ if (idOfPos[p] === undefined) {
1227
+ this.numberedNode(idOfPos, p);
1112
1228
  }
1113
1229
  }
1114
1230
  // after the loop on purpose: a throw part-way leaves the mark at its smaller, still
@@ -1116,49 +1232,47 @@ class PajekParser {
1116
1232
  if (pos > this.filledBelow) {
1117
1233
  this.filledBelow = pos;
1118
1234
  }
1119
- index = this.deferredNode(this.idOfPos, pos, k, restored, line, "originalId");
1120
- } else {
1121
- index = this.indexOfPos[pos];
1122
- if (restored !== null && !repeated) {
1123
- // an out-of-order line: the vertex already exists under its number
1124
- this.report.warning(
1125
- "coercion",
1126
- PAJEK_ISSUE.ORIGINAL_ID_UNRESTORED,
1127
- `vertex ${k} carries ${ORIGINAL_ID_KEY} ${JSON.stringify(restored)} but a later vertex's line came first and created it under its number; the original id is not restored`,
1128
- { line, element: String(k) },
1129
- );
1130
- }
1131
- }
1132
- const { sink } = this;
1133
- if (label !== null) {
1134
- if (this.labelHandle === INVALID_INDEX) {
1135
- this.labelHandle = declareResolved(sink, "node", LABEL_DECL, this.report, { line }).handle;
1136
- }
1137
- sink.setNodeValue(this.labelHandle, index, label);
1235
+ return this.deferredNode(idOfPos, pos, k, restored, line, "originalId");
1138
1236
  }
1139
- if (dims > 0) {
1140
- this.writePosition(index, dims, [x, y, z], k, line);
1141
- }
1142
- if (shape !== null) {
1143
- if (this.shapeHandle === INVALID_INDEX && this.nodeParams.has(SHAPE_COLUMN)) {
1144
- // an earlier `shape "<text>"` parameter owns the column: the keyword is written there
1145
- this.writeParameter("node", SHAPE_COLUMN, index, shape);
1146
- } else {
1147
- if (this.shapeHandle === INVALID_INDEX) {
1148
- this.shapeHandle = declareResolved(sink, "node", SHAPE_DECL, this.report, { line }).handle;
1149
- }
1150
- sink.setNodeValue(this.shapeHandle, index, shape);
1151
- }
1152
- }
1153
- for (let p = 0; p < extras.keys.length; p++) {
1154
- this.writeParameter("node", extras.keys[p], index, extras.values[p]);
1237
+ if (restored !== null && !repeated) {
1238
+ // an out-of-order line: the vertex already exists under its number
1239
+ this.report.warning(
1240
+ "coercion",
1241
+ PAJEK_ISSUE.ORIGINAL_ID_UNRESTORED,
1242
+ `vertex ${k} carries ${ORIGINAL_ID_KEY} ${JSON.stringify(restored)} but a later vertex's line came first and created it under its number; the original id is not restored`,
1243
+ { line, element: String(k) },
1244
+ );
1155
1245
  }
1156
- if (extras.spells !== null) {
1157
- if (this.nodeSpellsHandle === INVALID_INDEX) {
1158
- this.nodeSpellsHandle = declareResolved(sink, "node", spellsDecl(), this.report, { line }).handle;
1159
- }
1160
- sink.setNodeValue(this.nodeSpellsHandle, index, extras.spells);
1246
+ return this.indexOfPos[pos];
1247
+ }
1248
+
1249
+ /**
1250
+ * A node column's handle, declared on first use.
1251
+ * @param handle - the handle so far, or INVALID_INDEX
1252
+ * @param decl - the column's declaration
1253
+ * @param line - the line number
1254
+ * @returns the handle
1255
+ */
1256
+ private nodeHandle(handle: ColumnHandle, decl: Parameters<typeof declareResolved>[2], line: number): ColumnHandle {
1257
+ return handle === INVALID_INDEX
1258
+ ? declareResolved(this.sink, "node", decl, this.report, { line }).handle
1259
+ : handle;
1260
+ }
1261
+
1262
+ /**
1263
+ * Writes a vertex's shape keyword: to the shape column, or to an earlier `shape "<text>"` parameter's column.
1264
+ * @param index - the node index
1265
+ * @param shape - the keyword
1266
+ * @param line - the line number
1267
+ */
1268
+ private writeShape(index: number, shape: string, line: number): void {
1269
+ if (this.shapeHandle === INVALID_INDEX && this.nodeParams.has(SHAPE_COLUMN)) {
1270
+ // an earlier `shape "<text>"` parameter owns the column: the keyword is written there
1271
+ this.writeParameter("node", SHAPE_COLUMN, index, shape);
1272
+ return;
1161
1273
  }
1274
+ this.shapeHandle = this.nodeHandle(this.shapeHandle, SHAPE_DECL, line);
1275
+ this.sink.setNodeValue(this.shapeHandle, index, shape);
1162
1276
  }
1163
1277
 
1164
1278
  /**
@@ -1238,7 +1352,9 @@ class PajekParser {
1238
1352
  private writePosition(index: number, dims: number, point: readonly number[], k: number, line: number): void {
1239
1353
  if (this.positionHandle === INVALID_INDEX) {
1240
1354
  this.coordDims = dims;
1241
- this.positionHandle = declareResolved(this.sink, "node", positionDecl(dims), this.report, { line }).handle;
1355
+ this.positionHandle = declareResolved(this.sink, "node", positionDecl(dims, this.window), this.report, {
1356
+ line,
1357
+ }).handle;
1242
1358
  } else if (dims !== this.coordDims) {
1243
1359
  this.report.warnOnce(
1244
1360
  "validation-error",
@@ -1654,7 +1770,7 @@ class PajekParser {
1654
1770
  for (let i = start; i < tokens.length;) {
1655
1771
  const token = tokens[i];
1656
1772
  if (token.startsWith("[")) {
1657
- extras.spells = this.intervals(token, domain);
1773
+ extras.spells = this.intervals(token, domain, line);
1658
1774
  i++;
1659
1775
  continue;
1660
1776
  }
@@ -1677,8 +1793,12 @@ class PajekParser {
1677
1793
  }
1678
1794
  seen.add(token);
1679
1795
  extras.keys.push(token);
1680
- extras.values.push(tokens[i + 1]);
1681
- i += 2;
1796
+ // a color written as three fractions, `c 0.700 0.700 0.700` (Pajek's course data, 1CRN.NET), is one
1797
+ // value, kept as written; a key is never a number, so the reading is unambiguous. Pajek 6.02 reads no
1798
+ // color from it (the style reader leaves the line its carried or default color)
1799
+ const triple = COLOR_KEYS.has(token) ? colorTriple(tokens, i + 1) : null;
1800
+ extras.values.push(triple ?? tokens[i + 1]);
1801
+ i += triple === null ? 2 : 4;
1682
1802
  }
1683
1803
  return extras;
1684
1804
  }
@@ -1709,12 +1829,15 @@ class PajekParser {
1709
1829
  }
1710
1830
 
1711
1831
  /**
1712
- * The spells of a row's interval token; a malformed one skips the row.
1832
+ * The spells of a row's interval token. A token not closed by "]" skips the row; a closed one
1833
+ * whose times cannot be read (`[287-?]`, lin-rel4.net) is reported and dropped, and the rest of
1834
+ * the row (its label, coordinates and parameters) is kept.
1713
1835
  * @param token - the token, starting with "["
1714
- * @param domain - what is skipped when the token is malformed
1715
- * @returns the spells, or null for an empty `[]`, which is no spell at all
1836
+ * @param domain - what is skipped when the token is not closed
1837
+ * @param line - the line number
1838
+ * @returns the spells, or null for an empty `[]`, which is no spell at all, and for a dropped one
1716
1839
  */
1717
- private intervals(token: string, domain: "node" | "edge"): [number, number][] | null {
1840
+ private intervals(token: string, domain: "node" | "edge", line: number): [number, number][] | null {
1718
1841
  if (!isIntervalToken(token)) {
1719
1842
  this.skip(domain);
1720
1843
  throw new LineError(
@@ -1727,12 +1850,13 @@ class PajekParser {
1727
1850
  const spells = parseIntervals(token);
1728
1851
  return spells.length === 0 ? null : spells;
1729
1852
  } catch (err) {
1730
- this.skip(domain);
1731
- throw new LineError(
1853
+ this.report.error(
1732
1854
  "validation-error",
1733
1855
  PAJEK_ISSUE.INTERVAL,
1734
- err instanceof Error ? err.message : String(err),
1856
+ `${err instanceof Error ? err.message : String(err)}; the interval is dropped and the rest of the line kept`,
1857
+ { line },
1735
1858
  );
1859
+ return null;
1736
1860
  }
1737
1861
  }
1738
1862
 
@@ -1773,6 +1897,21 @@ class PajekParser {
1773
1897
  }
1774
1898
  }
1775
1899
 
1900
+ /** The parameters that hold a color, which a file may also write as three fractions `r g b`. */
1901
+ const COLOR_KEYS: ReadonlySet<string> = new Set(["ic", "bc", "lc", "c"]);
1902
+
1903
+ /**
1904
+ * A color written as three numbers from 0 to 1 at a row's tokens, as one value `r g b`.
1905
+ * @param tokens - the row's tokens
1906
+ * @param at - the first of the three
1907
+ * @returns the color text, or null when the three tokens are not such numbers
1908
+ */
1909
+ function colorTriple(tokens: readonly string[], at: number): string | null {
1910
+ const parts = tokens.slice(at, at + 3);
1911
+ const fraction = (t: string): boolean => /^[01]?(?:\.\d+)?$/.test(t) && t !== "" && Number(t) <= 1;
1912
+ return parts.length === 3 && parts.every(fraction) ? parts.join(" ") : null;
1913
+ }
1914
+
1776
1915
  /**
1777
1916
  * Whether a vertex line has coordinates but no label: the token after the vertex number is bare
1778
1917
  * (not quoted) and starts a run of exactly two numbers, which cannot be a label and one
@@ -1845,11 +1984,31 @@ function headSection(text: string): string | null {
1845
1984
  */
1846
1985
  export const pajekImporter: GraphImporter<PajekImportOptions> = Object.freeze({
1847
1986
  format: "pajek",
1848
- options: Object.freeze(["firstVertex"]),
1987
+ options: Object.freeze(["firstVertex", "pajekDraw"]),
1849
1988
  extensions: Object.freeze([".net", ".paj"]),
1850
1989
  mimeTypes: Object.freeze(["text/x-pajek", "text/plain"]),
1851
1990
  styles: pajekStyles,
1852
1991
 
1992
+ /**
1993
+ * Where Pajek 6.02 draws a network whose vertices have no coordinates: round a circle in vertex order, the first
1994
+ * on the left, the rest going clockwise on screen (y down), at radius 0.4 about the middle of the Draw window
1995
+ * (pajek-iliad: 311 vertices 200 points from the middle of its 500-point window). A file with coordinates is read
1996
+ * from its position column.
1997
+ * @param snapshot - the imported graph
1998
+ * @returns the circle for a file with no coordinates, else null
1999
+ */
2000
+ positions(snapshot: GraphSnapshot): ImporterPositions | null {
2001
+ if (snapshot.nodes.byRole("position") !== null) {
2002
+ return null;
2003
+ }
2004
+ return {
2005
+ units: "file",
2006
+ pxPerUnit: PAJEK_POINTS_PER_UNIT,
2007
+ yAxis: "down",
2008
+ unplacedCircle: { center: [0.5, 0.5], radius: 0.4, startDegrees: 180, direction: 1 },
2009
+ };
2010
+ },
2011
+
1853
2012
  /**
1854
2013
  * Confidence that the input is a Pajek network: it starts with `*Vertices` (or `*Network`),
1855
2014
  * after any `%` comment lines.
@@ -1883,10 +2042,11 @@ export const pajekImporter: GraphImporter<PajekImportOptions> = Object.freeze({
1883
2042
  }
1884
2043
  const resolved = resolveImportOptions(options, DEFAULTS);
1885
2044
  const firstVertex = firstVertexOption(options?.firstVertex);
2045
+ const draw = resolvePajekDraw(options?.pajekDraw);
1886
2046
  const report = new ImportReportBuilder("pajek", resolved.errorLimit);
1887
2047
  reportSinkOptions(sink, options, report);
1888
2048
  reportUnusedOptions(options, report, USED_OPTIONS);
1889
- const parser = new PajekParser(sink, report, resolved, firstVertex);
2049
+ const parser = new PajekParser(sink, report, resolved, firstVertex, draw ?? DEFAULT_WINDOW);
1890
2050
  const reader = new LineReader(input, report, resolved);
1891
2051
  // after the first network: only its successors' headers are counted
1892
2052
  let rest: NetworkCounter | null = null;
@@ -1907,6 +2067,9 @@ export const pajekImporter: GraphImporter<PajekImportOptions> = Object.freeze({
1907
2067
  }
1908
2068
  }
1909
2069
  parser.finish();
2070
+ if (draw !== null || parser.voided.length > 0) {
2071
+ report.keepForStyles({ block: parser.keptBlock, pajekDraw: draw ?? undefined, voided: parser.voided });
2072
+ }
1910
2073
  if (rest !== null) {
1911
2074
  const objects =
1912
2075
  rest.objects > 0 ? `; ${rest.objects} *Partition / *Vector object(s) after them are not read` : "";
@@ -1937,13 +2100,25 @@ export const pajekImporter: GraphImporter<PajekImportOptions> = Object.freeze({
1937
2100
  ): Promise<ImportReport[]> {
1938
2101
  const resolved = resolveImportOptions(options, DEFAULTS);
1939
2102
  const firstVertex = firstVertexOption(options?.firstVertex);
2103
+ const draw = resolvePajekDraw(options?.pajekDraw);
1940
2104
  const reports = [new ImportReportBuilder("pajek", resolved.errorLimit)];
1941
2105
  reportUnusedOptions(options, reports[0], USED_OPTIONS);
1942
2106
  const open = (): PajekParser => {
1943
2107
  const report = reports[reports.length - 1];
1944
2108
  const sink = sinkFor(reports.length - 1);
1945
2109
  reportSinkOptions(sink, options, report);
1946
- return new PajekParser(sink, report, resolved, firstVertex);
2110
+ return new PajekParser(sink, report, resolved, firstVertex, draw ?? DEFAULT_WINDOW);
2111
+ };
2112
+ const close = (p: PajekParser): void => {
2113
+ p.finish();
2114
+ const last = reports.at(-1);
2115
+ if (last !== undefined && (draw !== null || p.voided.length > 0)) {
2116
+ last.keepForStyles({
2117
+ block: p.keptBlock,
2118
+ pajekDraw: draw ?? undefined,
2119
+ voided: p.voided,
2120
+ });
2121
+ }
1947
2122
  };
1948
2123
  let parser = open();
1949
2124
  // decoding issues belong to the file, so they go to the first network's report
@@ -1952,7 +2127,7 @@ export const pajekImporter: GraphImporter<PajekImportOptions> = Object.freeze({
1952
2127
  for await (const raw of reader) {
1953
2128
  const text = withoutStrayBom(raw);
1954
2129
  if (parser.line(text, reader.line)) {
1955
- parser.finish();
2130
+ close(parser);
1956
2131
  reports.push(new ImportReportBuilder("pajek", resolved.errorLimit));
1957
2132
  parser = open();
1958
2133
  parser.line(text, reader.line);
@@ -1962,7 +2137,7 @@ export const pajekImporter: GraphImporter<PajekImportOptions> = Object.freeze({
1962
2137
  throwIfAborted(resolved.signal);
1963
2138
  }
1964
2139
  }
1965
- parser.finish();
2140
+ close(parser);
1966
2141
  throwIfAborted(resolved.signal);
1967
2142
  return reports.map((r) => r.finish());
1968
2143
  },
@@ -4,6 +4,7 @@
4
4
  * @module @graphty/graph-io/pajek
5
5
  */
6
6
 
7
+ export type { PajekDrawOptions } from "./draw.js";
7
8
  export { PAJEK_LOSS, pajekExporter, type PajekExportOptions } from "./exporter.js";
8
9
  export { PAJEK_ISSUE, pajekImporter, type PajekImportOptions } from "./importer.js";
9
10
  export { PAJEK_STYLE_CAPABILITIES } from "./styles.js";