@graphty/graph-io 0.3.25 → 0.3.27

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 (581) hide show
  1. package/README.md +49 -414
  2. package/dist/chunks/children-CL3Cy0ez.js.map +1 -1
  3. package/dist/chunks/choose-DrXtu_96.js +56 -0
  4. package/dist/chunks/choose-DrXtu_96.js.map +1 -0
  5. package/dist/chunks/constants-ikG85dT8.js +231 -0
  6. package/dist/chunks/constants-ikG85dT8.js.map +1 -0
  7. package/dist/chunks/{escape-B-tkk_Cl.js → escape-D1HPTUrP.js} +390 -99
  8. package/dist/chunks/escape-D1HPTUrP.js.map +1 -0
  9. package/dist/chunks/export-CHd4tQE2.js +4333 -0
  10. package/dist/chunks/export-CHd4tQE2.js.map +1 -0
  11. package/dist/chunks/{importer-eUREhBGj.js → exporter-D23CKNqF.js} +4969 -3201
  12. package/dist/chunks/exporter-D23CKNqF.js.map +1 -0
  13. package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-DfWTgrti.js} +23 -21
  14. package/dist/chunks/exporter-DfWTgrti.js.map +1 -0
  15. package/dist/chunks/exporter-DhtW6FxK.js +3465 -0
  16. package/dist/chunks/exporter-DhtW6FxK.js.map +1 -0
  17. package/dist/chunks/{exporter-BGrsWamJ.js → exporter-IHv4nkCm.js} +38 -229
  18. package/dist/chunks/exporter-IHv4nkCm.js.map +1 -0
  19. package/dist/chunks/{importer-BWY2FFc5.js → importer-B1wmPQjr.js} +255 -77
  20. package/dist/chunks/importer-B1wmPQjr.js.map +1 -0
  21. package/dist/chunks/{importer-D_e7e7LX.js → importer-B2W_58pz.js} +399 -146
  22. package/dist/chunks/importer-B2W_58pz.js.map +1 -0
  23. package/dist/chunks/importer-BSALvkui.js +2811 -0
  24. package/dist/chunks/importer-BSALvkui.js.map +1 -0
  25. package/dist/chunks/{importer-vi3bSdtw.js → importer-BVRE--Un.js} +510 -77
  26. package/dist/chunks/importer-BVRE--Un.js.map +1 -0
  27. package/dist/chunks/{importer-DET1tg6s.js → importer-CIAzt-wo.js} +1689 -312
  28. package/dist/chunks/importer-CIAzt-wo.js.map +1 -0
  29. package/dist/chunks/{importer-DIrbbnAf.js → importer-DpEW5zeG.js} +585 -226
  30. package/dist/chunks/importer-DpEW5zeG.js.map +1 -0
  31. package/dist/chunks/{importer-zGLo8Dg_.js → importer-z_FL4VMb.js} +488 -161
  32. package/dist/chunks/importer-z_FL4VMb.js.map +1 -0
  33. package/dist/chunks/json-elements-BAmNBZok.js +1225 -0
  34. package/dist/chunks/json-elements-BAmNBZok.js.map +1 -0
  35. package/dist/chunks/ontology-export-Bab4eUA8.js +357 -0
  36. package/dist/chunks/ontology-export-Bab4eUA8.js.map +1 -0
  37. package/dist/chunks/{records-dbRkxwaq.js → records-CdlvL4RO.js} +298 -114
  38. package/dist/chunks/records-CdlvL4RO.js.map +1 -0
  39. package/dist/chunks/{text-Dr0Ifpag.js → text-DzXjAiTl.js} +29 -11
  40. package/dist/chunks/text-DzXjAiTl.js.map +1 -0
  41. package/dist/chunks/{writer-C7flM-Ih.js → writer-DxjgHwSe.js} +19 -1
  42. package/dist/chunks/writer-DxjgHwSe.js.map +1 -0
  43. package/dist/csv.js +952 -262
  44. package/dist/csv.js.map +1 -1
  45. package/dist/cx.js +6 -3
  46. package/dist/cx2.js +2 -2
  47. package/dist/cys.js +6 -3
  48. package/dist/dot.js +1 -1
  49. package/dist/gexf.js +554 -122
  50. package/dist/gexf.js.map +1 -1
  51. package/dist/gml.js +344 -87
  52. package/dist/gml.js.map +1 -1
  53. package/dist/graph-io.js +1105 -213
  54. package/dist/graph-io.js.map +1 -1
  55. package/dist/graphml.js +3 -2
  56. package/dist/graphml.js.map +1 -1
  57. package/dist/json.js +3 -2
  58. package/dist/neo4j.js +565 -158
  59. package/dist/neo4j.js.map +1 -1
  60. package/dist/obo.js +6 -3
  61. package/dist/pajek.js +1 -1
  62. package/dist/src/children.d.ts +18 -6
  63. package/dist/src/children.d.ts.map +1 -1
  64. package/dist/src/children.js +6 -3
  65. package/dist/src/children.js.map +1 -1
  66. package/dist/src/common/attributes.d.ts +29 -11
  67. package/dist/src/common/attributes.d.ts.map +1 -1
  68. package/dist/src/common/attributes.js +25 -7
  69. package/dist/src/common/attributes.js.map +1 -1
  70. package/dist/src/common/cell-budget.d.ts +9 -2
  71. package/dist/src/common/cell-budget.d.ts.map +1 -1
  72. package/dist/src/common/cell-budget.js +11 -3
  73. package/dist/src/common/cell-budget.js.map +1 -1
  74. package/dist/src/common/choose.d.ts +19 -0
  75. package/dist/src/common/choose.d.ts.map +1 -0
  76. package/dist/src/common/choose.js +72 -0
  77. package/dist/src/common/choose.js.map +1 -0
  78. package/dist/src/common/codes.d.ts +456 -66
  79. package/dist/src/common/codes.d.ts.map +1 -1
  80. package/dist/src/common/codes.js +458 -66
  81. package/dist/src/common/codes.js.map +1 -1
  82. package/dist/src/common/compare.d.ts +81 -0
  83. package/dist/src/common/compare.d.ts.map +1 -0
  84. package/dist/src/common/compare.js +394 -0
  85. package/dist/src/common/compare.js.map +1 -0
  86. package/dist/src/common/cx-export.d.ts +123 -0
  87. package/dist/src/common/cx-export.d.ts.map +1 -0
  88. package/dist/src/common/cx-export.js +334 -0
  89. package/dist/src/common/cx-export.js.map +1 -0
  90. package/dist/src/common/declared-types.d.ts +22 -2
  91. package/dist/src/common/declared-types.d.ts.map +1 -1
  92. package/dist/src/common/declared-types.js +21 -3
  93. package/dist/src/common/declared-types.js.map +1 -1
  94. package/dist/src/common/direction.d.ts +74 -50
  95. package/dist/src/common/direction.d.ts.map +1 -1
  96. package/dist/src/common/direction.js +47 -27
  97. package/dist/src/common/direction.js.map +1 -1
  98. package/dist/src/common/escape.d.ts +21 -9
  99. package/dist/src/common/escape.d.ts.map +1 -1
  100. package/dist/src/common/escape.js +39 -22
  101. package/dist/src/common/escape.js.map +1 -1
  102. package/dist/src/common/export.d.ts +144 -32
  103. package/dist/src/common/export.d.ts.map +1 -1
  104. package/dist/src/common/export.js +216 -42
  105. package/dist/src/common/export.js.map +1 -1
  106. package/dist/src/common/format.d.ts +23 -1
  107. package/dist/src/common/format.d.ts.map +1 -1
  108. package/dist/src/common/format.js +26 -1
  109. package/dist/src/common/format.js.map +1 -1
  110. package/dist/src/common/ids.d.ts +9 -2
  111. package/dist/src/common/ids.d.ts.map +1 -1
  112. package/dist/src/common/ids.js +6 -2
  113. package/dist/src/common/ids.js.map +1 -1
  114. package/dist/src/common/input.d.ts +122 -28
  115. package/dist/src/common/input.d.ts.map +1 -1
  116. package/dist/src/common/input.js +890 -124
  117. package/dist/src/common/input.js.map +1 -1
  118. package/dist/src/common/json-elements.d.ts +144 -20
  119. package/dist/src/common/json-elements.d.ts.map +1 -1
  120. package/dist/src/common/json-elements.js +869 -189
  121. package/dist/src/common/json-elements.js.map +1 -1
  122. package/dist/src/common/line-format.d.ts +90 -0
  123. package/dist/src/common/line-format.d.ts.map +1 -0
  124. package/dist/src/common/line-format.js +185 -0
  125. package/dist/src/common/line-format.js.map +1 -0
  126. package/dist/src/common/lists.d.ts +6 -1
  127. package/dist/src/common/lists.d.ts.map +1 -1
  128. package/dist/src/common/lists.js +3 -1
  129. package/dist/src/common/lists.js.map +1 -1
  130. package/dist/src/common/ontology-export.d.ts +167 -0
  131. package/dist/src/common/ontology-export.d.ts.map +1 -0
  132. package/dist/src/common/ontology-export.js +359 -0
  133. package/dist/src/common/ontology-export.js.map +1 -0
  134. package/dist/src/common/ontology.d.ts +25 -3
  135. package/dist/src/common/ontology.d.ts.map +1 -1
  136. package/dist/src/common/ontology.js +30 -9
  137. package/dist/src/common/ontology.js.map +1 -1
  138. package/dist/src/common/options.d.ts +62 -12
  139. package/dist/src/common/options.d.ts.map +1 -1
  140. package/dist/src/common/options.js +89 -11
  141. package/dist/src/common/options.js.map +1 -1
  142. package/dist/src/common/plural.d.ts +31 -0
  143. package/dist/src/common/plural.d.ts.map +1 -0
  144. package/dist/src/common/plural.js +46 -0
  145. package/dist/src/common/plural.js.map +1 -0
  146. package/dist/src/common/report.d.ts +72 -14
  147. package/dist/src/common/report.d.ts.map +1 -1
  148. package/dist/src/common/report.js +146 -22
  149. package/dist/src/common/report.js.map +1 -1
  150. package/dist/src/common/temporal.d.ts +22 -5
  151. package/dist/src/common/temporal.d.ts.map +1 -1
  152. package/dist/src/common/temporal.js +13 -2
  153. package/dist/src/common/temporal.js.map +1 -1
  154. package/dist/src/common/text.d.ts +39 -23
  155. package/dist/src/common/text.d.ts.map +1 -1
  156. package/dist/src/common/text.js +51 -21
  157. package/dist/src/common/text.js.map +1 -1
  158. package/dist/src/common/weights.d.ts +37 -4
  159. package/dist/src/common/weights.d.ts.map +1 -1
  160. package/dist/src/common/weights.js +61 -2
  161. package/dist/src/common/weights.js.map +1 -1
  162. package/dist/src/common/writer.d.ts +19 -3
  163. package/dist/src/common/writer.d.ts.map +1 -1
  164. package/dist/src/common/writer.js +30 -2
  165. package/dist/src/common/writer.js.map +1 -1
  166. package/dist/src/common/xml.d.ts +125 -9
  167. package/dist/src/common/xml.d.ts.map +1 -1
  168. package/dist/src/common/xml.js +402 -85
  169. package/dist/src/common/xml.js.map +1 -1
  170. package/dist/src/common/zip.d.ts +44 -4
  171. package/dist/src/common/zip.d.ts.map +1 -1
  172. package/dist/src/common/zip.js +134 -5
  173. package/dist/src/common/zip.js.map +1 -1
  174. package/dist/src/formats/csv/exporter.d.ts +80 -24
  175. package/dist/src/formats/csv/exporter.d.ts.map +1 -1
  176. package/dist/src/formats/csv/exporter.js +146 -33
  177. package/dist/src/formats/csv/exporter.js.map +1 -1
  178. package/dist/src/formats/csv/header.d.ts +38 -9
  179. package/dist/src/formats/csv/header.d.ts.map +1 -1
  180. package/dist/src/formats/csv/header.js +46 -10
  181. package/dist/src/formats/csv/header.js.map +1 -1
  182. package/dist/src/formats/csv/importer.d.ts +187 -37
  183. package/dist/src/formats/csv/importer.d.ts.map +1 -1
  184. package/dist/src/formats/csv/importer.js +835 -204
  185. package/dist/src/formats/csv/importer.js.map +1 -1
  186. package/dist/src/formats/csv/index.d.ts +100 -19
  187. package/dist/src/formats/csv/index.d.ts.map +1 -1
  188. package/dist/src/formats/csv/index.js +94 -21
  189. package/dist/src/formats/csv/index.js.map +1 -1
  190. package/dist/src/formats/csv/records.d.ts +95 -10
  191. package/dist/src/formats/csv/records.d.ts.map +1 -1
  192. package/dist/src/formats/csv/records.js +333 -122
  193. package/dist/src/formats/csv/records.js.map +1 -1
  194. package/dist/src/formats/csv/values.d.ts +1 -0
  195. package/dist/src/formats/csv/values.d.ts.map +1 -1
  196. package/dist/src/formats/csv/values.js +1 -0
  197. package/dist/src/formats/csv/values.js.map +1 -1
  198. package/dist/src/formats/cx/exporter.d.ts +102 -0
  199. package/dist/src/formats/cx/exporter.d.ts.map +1 -0
  200. package/dist/src/formats/cx/exporter.js +1217 -0
  201. package/dist/src/formats/cx/exporter.js.map +1 -0
  202. package/dist/src/formats/cx/importer.d.ts +79 -32
  203. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  204. package/dist/src/formats/cx/importer.js +682 -287
  205. package/dist/src/formats/cx/importer.js.map +1 -1
  206. package/dist/src/formats/cx/index.d.ts +4 -3
  207. package/dist/src/formats/cx/index.d.ts.map +1 -1
  208. package/dist/src/formats/cx/index.js +4 -3
  209. package/dist/src/formats/cx/index.js.map +1 -1
  210. package/dist/src/formats/cx2/exporter.d.ts +29 -11
  211. package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
  212. package/dist/src/formats/cx2/exporter.js +39 -268
  213. package/dist/src/formats/cx2/exporter.js.map +1 -1
  214. package/dist/src/formats/cx2/importer.d.ts +78 -28
  215. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  216. package/dist/src/formats/cx2/importer.js +227 -80
  217. package/dist/src/formats/cx2/importer.js.map +1 -1
  218. package/dist/src/formats/cx2/index.d.ts +2 -1
  219. package/dist/src/formats/cx2/index.d.ts.map +1 -1
  220. package/dist/src/formats/cx2/index.js +2 -1
  221. package/dist/src/formats/cx2/index.js.map +1 -1
  222. package/dist/src/formats/cys/constants.d.ts +66 -17
  223. package/dist/src/formats/cys/constants.d.ts.map +1 -1
  224. package/dist/src/formats/cys/constants.js +59 -18
  225. package/dist/src/formats/cys/constants.js.map +1 -1
  226. package/dist/src/formats/cys/exporter.d.ts +118 -0
  227. package/dist/src/formats/cys/exporter.d.ts.map +1 -0
  228. package/dist/src/formats/cys/exporter.js +1072 -0
  229. package/dist/src/formats/cys/exporter.js.map +1 -0
  230. package/dist/src/formats/cys/importer.d.ts +22 -8
  231. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  232. package/dist/src/formats/cys/importer.js +510 -149
  233. package/dist/src/formats/cys/importer.js.map +1 -1
  234. package/dist/src/formats/cys/index.d.ts +4 -2
  235. package/dist/src/formats/cys/index.d.ts.map +1 -1
  236. package/dist/src/formats/cys/index.js +4 -2
  237. package/dist/src/formats/cys/index.js.map +1 -1
  238. package/dist/src/formats/cys/session.d.ts +46 -7
  239. package/dist/src/formats/cys/session.d.ts.map +1 -1
  240. package/dist/src/formats/cys/session.js +101 -27
  241. package/dist/src/formats/cys/session.js.map +1 -1
  242. package/dist/src/formats/cys/tables.d.ts +9 -2
  243. package/dist/src/formats/cys/tables.d.ts.map +1 -1
  244. package/dist/src/formats/cys/tables.js +29 -7
  245. package/dist/src/formats/cys/tables.js.map +1 -1
  246. package/dist/src/formats/dot/exporter.d.ts +42 -14
  247. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  248. package/dist/src/formats/dot/exporter.js +56 -29
  249. package/dist/src/formats/dot/exporter.js.map +1 -1
  250. package/dist/src/formats/dot/importer.d.ts +91 -29
  251. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  252. package/dist/src/formats/dot/importer.js +190 -39
  253. package/dist/src/formats/dot/importer.js.map +1 -1
  254. package/dist/src/formats/dot/index.d.ts +2 -1
  255. package/dist/src/formats/dot/index.d.ts.map +1 -1
  256. package/dist/src/formats/dot/index.js +2 -1
  257. package/dist/src/formats/dot/index.js.map +1 -1
  258. package/dist/src/formats/dot/names.d.ts +44 -11
  259. package/dist/src/formats/dot/names.d.ts.map +1 -1
  260. package/dist/src/formats/dot/names.js +44 -11
  261. package/dist/src/formats/dot/names.js.map +1 -1
  262. package/dist/src/formats/dot/tokenizer.d.ts +9 -2
  263. package/dist/src/formats/dot/tokenizer.d.ts.map +1 -1
  264. package/dist/src/formats/dot/tokenizer.js +20 -5
  265. package/dist/src/formats/dot/tokenizer.js.map +1 -1
  266. package/dist/src/formats/gexf/exporter.d.ts +46 -15
  267. package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
  268. package/dist/src/formats/gexf/exporter.js +45 -15
  269. package/dist/src/formats/gexf/exporter.js.map +1 -1
  270. package/dist/src/formats/gexf/importer.d.ts +87 -23
  271. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  272. package/dist/src/formats/gexf/importer.js +471 -90
  273. package/dist/src/formats/gexf/importer.js.map +1 -1
  274. package/dist/src/formats/gexf/index.d.ts +84 -21
  275. package/dist/src/formats/gexf/index.d.ts.map +1 -1
  276. package/dist/src/formats/gexf/index.js +80 -23
  277. package/dist/src/formats/gexf/index.js.map +1 -1
  278. package/dist/src/formats/gexf/schema.d.ts +67 -15
  279. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  280. package/dist/src/formats/gexf/schema.js +59 -13
  281. package/dist/src/formats/gexf/schema.js.map +1 -1
  282. package/dist/src/formats/gml/exporter.d.ts +69 -21
  283. package/dist/src/formats/gml/exporter.d.ts.map +1 -1
  284. package/dist/src/formats/gml/exporter.js +74 -29
  285. package/dist/src/formats/gml/exporter.js.map +1 -1
  286. package/dist/src/formats/gml/importer.d.ts +116 -25
  287. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  288. package/dist/src/formats/gml/importer.js +290 -61
  289. package/dist/src/formats/gml/importer.js.map +1 -1
  290. package/dist/src/formats/gml/index.d.ts +87 -24
  291. package/dist/src/formats/gml/index.d.ts.map +1 -1
  292. package/dist/src/formats/gml/index.js +79 -26
  293. package/dist/src/formats/gml/index.js.map +1 -1
  294. package/dist/src/formats/gml/syntax.d.ts +67 -18
  295. package/dist/src/formats/gml/syntax.d.ts.map +1 -1
  296. package/dist/src/formats/gml/syntax.js +110 -28
  297. package/dist/src/formats/gml/syntax.js.map +1 -1
  298. package/dist/src/formats/graphml/constants.d.ts +174 -44
  299. package/dist/src/formats/graphml/constants.d.ts.map +1 -1
  300. package/dist/src/formats/graphml/constants.js +165 -44
  301. package/dist/src/formats/graphml/constants.js.map +1 -1
  302. package/dist/src/formats/graphml/exporter.d.ts +17 -9
  303. package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
  304. package/dist/src/formats/graphml/exporter.js +33 -12
  305. package/dist/src/formats/graphml/exporter.js.map +1 -1
  306. package/dist/src/formats/graphml/importer.d.ts +19 -7
  307. package/dist/src/formats/graphml/importer.d.ts.map +1 -1
  308. package/dist/src/formats/graphml/importer.js +466 -39
  309. package/dist/src/formats/graphml/importer.js.map +1 -1
  310. package/dist/src/formats/graphml/index.d.ts +2 -1
  311. package/dist/src/formats/graphml/index.d.ts.map +1 -1
  312. package/dist/src/formats/graphml/index.js +2 -1
  313. package/dist/src/formats/graphml/index.js.map +1 -1
  314. package/dist/src/formats/graphml/tree.d.ts +6 -2
  315. package/dist/src/formats/graphml/tree.d.ts.map +1 -1
  316. package/dist/src/formats/graphml/tree.js +6 -2
  317. package/dist/src/formats/graphml/tree.js.map +1 -1
  318. package/dist/src/formats/graphml/yfiles.d.ts +8 -3
  319. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  320. package/dist/src/formats/graphml/yfiles.js +36 -15
  321. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  322. package/dist/src/formats/json/dialect.d.ts +88 -24
  323. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  324. package/dist/src/formats/json/dialect.js +109 -19
  325. package/dist/src/formats/json/dialect.js.map +1 -1
  326. package/dist/src/formats/json/exporter.d.ts +134 -22
  327. package/dist/src/formats/json/exporter.d.ts.map +1 -1
  328. package/dist/src/formats/json/exporter.js +135 -54
  329. package/dist/src/formats/json/exporter.js.map +1 -1
  330. package/dist/src/formats/json/importer.d.ts +173 -52
  331. package/dist/src/formats/json/importer.d.ts.map +1 -1
  332. package/dist/src/formats/json/importer.js +899 -220
  333. package/dist/src/formats/json/importer.js.map +1 -1
  334. package/dist/src/formats/json/index.d.ts +3 -2
  335. package/dist/src/formats/json/index.d.ts.map +1 -1
  336. package/dist/src/formats/json/index.js +3 -2
  337. package/dist/src/formats/json/index.js.map +1 -1
  338. package/dist/src/formats/json/obographs-export.d.ts +68 -0
  339. package/dist/src/formats/json/obographs-export.d.ts.map +1 -0
  340. package/dist/src/formats/json/obographs-export.js +941 -0
  341. package/dist/src/formats/json/obographs-export.js.map +1 -0
  342. package/dist/src/formats/json/obographs.d.ts +26 -0
  343. package/dist/src/formats/json/obographs.d.ts.map +1 -1
  344. package/dist/src/formats/json/obographs.js +297 -80
  345. package/dist/src/formats/json/obographs.js.map +1 -1
  346. package/dist/src/formats/neo4j/exporter.d.ts +109 -21
  347. package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
  348. package/dist/src/formats/neo4j/exporter.js +239 -86
  349. package/dist/src/formats/neo4j/exporter.js.map +1 -1
  350. package/dist/src/formats/neo4j/header.d.ts +17 -4
  351. package/dist/src/formats/neo4j/header.d.ts.map +1 -1
  352. package/dist/src/formats/neo4j/header.js +36 -4
  353. package/dist/src/formats/neo4j/header.js.map +1 -1
  354. package/dist/src/formats/neo4j/importer.d.ts +107 -27
  355. package/dist/src/formats/neo4j/importer.d.ts.map +1 -1
  356. package/dist/src/formats/neo4j/importer.js +415 -63
  357. package/dist/src/formats/neo4j/importer.js.map +1 -1
  358. package/dist/src/formats/neo4j/index.d.ts +73 -23
  359. package/dist/src/formats/neo4j/index.d.ts.map +1 -1
  360. package/dist/src/formats/neo4j/index.js +65 -25
  361. package/dist/src/formats/neo4j/index.js.map +1 -1
  362. package/dist/src/formats/obo/exporter.d.ts +150 -0
  363. package/dist/src/formats/obo/exporter.d.ts.map +1 -0
  364. package/dist/src/formats/obo/exporter.js +1736 -0
  365. package/dist/src/formats/obo/exporter.js.map +1 -0
  366. package/dist/src/formats/obo/importer.d.ts +95 -19
  367. package/dist/src/formats/obo/importer.d.ts.map +1 -1
  368. package/dist/src/formats/obo/importer.js +475 -104
  369. package/dist/src/formats/obo/importer.js.map +1 -1
  370. package/dist/src/formats/obo/index.d.ts +6 -3
  371. package/dist/src/formats/obo/index.d.ts.map +1 -1
  372. package/dist/src/formats/obo/index.js +6 -3
  373. package/dist/src/formats/obo/index.js.map +1 -1
  374. package/dist/src/formats/obo/syntax.d.ts +108 -4
  375. package/dist/src/formats/obo/syntax.d.ts.map +1 -1
  376. package/dist/src/formats/obo/syntax.js +211 -34
  377. package/dist/src/formats/obo/syntax.js.map +1 -1
  378. package/dist/src/formats/pajek/exporter.d.ts +54 -16
  379. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  380. package/dist/src/formats/pajek/exporter.js +67 -35
  381. package/dist/src/formats/pajek/exporter.js.map +1 -1
  382. package/dist/src/formats/pajek/importer.d.ts +84 -22
  383. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  384. package/dist/src/formats/pajek/importer.js +303 -83
  385. package/dist/src/formats/pajek/importer.js.map +1 -1
  386. package/dist/src/formats/pajek/index.d.ts +2 -1
  387. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  388. package/dist/src/formats/pajek/index.js +2 -1
  389. package/dist/src/formats/pajek/index.js.map +1 -1
  390. package/dist/src/formats/pajek/syntax.d.ts +77 -14
  391. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  392. package/dist/src/formats/pajek/syntax.js +186 -54
  393. package/dist/src/formats/pajek/syntax.js.map +1 -1
  394. package/dist/src/formats/xgmml/columns.d.ts +1 -0
  395. package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
  396. package/dist/src/formats/xgmml/columns.js +4 -0
  397. package/dist/src/formats/xgmml/columns.js.map +1 -1
  398. package/dist/src/formats/xgmml/constants.d.ts +186 -56
  399. package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
  400. package/dist/src/formats/xgmml/constants.js +181 -57
  401. package/dist/src/formats/xgmml/constants.js.map +1 -1
  402. package/dist/src/formats/xgmml/document.d.ts +65 -11
  403. package/dist/src/formats/xgmml/document.d.ts.map +1 -1
  404. package/dist/src/formats/xgmml/document.js +157 -28
  405. package/dist/src/formats/xgmml/document.js.map +1 -1
  406. package/dist/src/formats/xgmml/emit.d.ts +61 -3
  407. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  408. package/dist/src/formats/xgmml/emit.js +129 -26
  409. package/dist/src/formats/xgmml/emit.js.map +1 -1
  410. package/dist/src/formats/xgmml/exporter.d.ts +13 -6
  411. package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
  412. package/dist/src/formats/xgmml/exporter.js +21 -22
  413. package/dist/src/formats/xgmml/exporter.js.map +1 -1
  414. package/dist/src/formats/xgmml/importer.d.ts +33 -12
  415. package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
  416. package/dist/src/formats/xgmml/importer.js +35 -72
  417. package/dist/src/formats/xgmml/importer.js.map +1 -1
  418. package/dist/src/formats/xgmml/index.d.ts +1 -0
  419. package/dist/src/formats/xgmml/index.d.ts.map +1 -1
  420. package/dist/src/formats/xgmml/index.js +1 -0
  421. package/dist/src/formats/xgmml/index.js.map +1 -1
  422. package/dist/src/formats/xgmml/values.d.ts +8 -1
  423. package/dist/src/formats/xgmml/values.d.ts.map +1 -1
  424. package/dist/src/formats/xgmml/values.js +8 -3
  425. package/dist/src/formats/xgmml/values.js.map +1 -1
  426. package/dist/src/index.d.ts +23 -18
  427. package/dist/src/index.d.ts.map +1 -1
  428. package/dist/src/index.js +28 -16
  429. package/dist/src/index.js.map +1 -1
  430. package/dist/src/registry.d.ts +478 -92
  431. package/dist/src/registry.d.ts.map +1 -1
  432. package/dist/src/registry.js +807 -88
  433. package/dist/src/registry.js.map +1 -1
  434. package/dist/src/sniff.d.ts +61 -19
  435. package/dist/src/sniff.d.ts.map +1 -1
  436. package/dist/src/sniff.js +121 -29
  437. package/dist/src/sniff.js.map +1 -1
  438. package/dist/src/types.d.ts +362 -112
  439. package/dist/src/types.d.ts.map +1 -1
  440. package/dist/src/types.js +28 -7
  441. package/dist/src/types.js.map +1 -1
  442. package/dist/xgmml.js +2 -2
  443. package/docs/samples/README.md +25 -0
  444. package/docs/samples/got-edges.csv +353 -0
  445. package/docs/samples/got-network.graphml +1384 -0
  446. package/docs/samples/got-nodes.csv +108 -0
  447. package/docs/samples/got.cx +930 -0
  448. package/docs/samples/got.cx2 +465 -0
  449. package/docs/samples/got.gexf +471 -0
  450. package/docs/samples/got.gml +2650 -0
  451. package/docs/samples/got.json +2546 -0
  452. package/docs/samples/got.net +461 -0
  453. package/docs/samples/movies-nodes.csv +9 -0
  454. package/docs/samples/movies-rels.csv +8 -0
  455. package/docs/samples/networks.cys +0 -0
  456. package/docs/samples/proteins.xgmml +9 -0
  457. package/docs/samples/teams.gv +24 -0
  458. package/docs/samples/vehicles.obo +25 -0
  459. package/package.json +9 -4
  460. package/src/children.ts +18 -6
  461. package/src/common/attributes.ts +29 -11
  462. package/src/common/cell-budget.ts +11 -3
  463. package/src/common/choose.ts +89 -0
  464. package/src/common/codes.ts +490 -66
  465. package/src/common/compare.ts +472 -0
  466. package/src/common/cx-export.ts +432 -0
  467. package/src/common/declared-types.ts +40 -6
  468. package/src/common/direction.ts +78 -51
  469. package/src/common/escape.ts +39 -22
  470. package/src/common/export.ts +284 -47
  471. package/src/common/format.ts +30 -1
  472. package/src/common/ids.ts +14 -3
  473. package/src/common/input.ts +1057 -134
  474. package/src/common/json-elements.ts +1035 -199
  475. package/src/common/line-format.ts +249 -0
  476. package/src/common/lists.ts +7 -2
  477. package/src/common/ontology-export.ts +461 -0
  478. package/src/common/ontology.ts +31 -9
  479. package/src/common/options.ts +110 -15
  480. package/src/common/plural.ts +49 -0
  481. package/src/common/report.ts +168 -25
  482. package/src/common/temporal.ts +22 -5
  483. package/src/common/text.ts +62 -23
  484. package/src/common/weights.ts +74 -4
  485. package/src/common/writer.ts +37 -3
  486. package/src/common/xml.ts +479 -90
  487. package/src/common/zip.ts +169 -7
  488. package/src/formats/csv/exporter.ts +202 -47
  489. package/src/formats/csv/header.ts +50 -11
  490. package/src/formats/csv/importer.ts +1133 -245
  491. package/src/formats/csv/index.ts +106 -19
  492. package/src/formats/csv/records.ts +396 -122
  493. package/src/formats/csv/values.ts +1 -0
  494. package/src/formats/cx/exporter.ts +1483 -0
  495. package/src/formats/cx/importer.ts +890 -302
  496. package/src/formats/cx/index.ts +4 -3
  497. package/src/formats/cx2/exporter.ts +62 -339
  498. package/src/formats/cx2/importer.ts +318 -87
  499. package/src/formats/cx2/index.ts +2 -1
  500. package/src/formats/cys/constants.ts +62 -17
  501. package/src/formats/cys/exporter.ts +1368 -0
  502. package/src/formats/cys/importer.ts +659 -157
  503. package/src/formats/cys/index.ts +4 -2
  504. package/src/formats/cys/session.ts +142 -34
  505. package/src/formats/cys/tables.ts +47 -9
  506. package/src/formats/dot/exporter.ts +83 -37
  507. package/src/formats/dot/importer.ts +248 -54
  508. package/src/formats/dot/index.ts +2 -1
  509. package/src/formats/dot/names.ts +44 -11
  510. package/src/formats/dot/tokenizer.ts +25 -6
  511. package/src/formats/gexf/exporter.ts +57 -18
  512. package/src/formats/gexf/importer.ts +636 -105
  513. package/src/formats/gexf/index.ts +90 -21
  514. package/src/formats/gexf/schema.ts +67 -15
  515. package/src/formats/gml/exporter.ts +90 -36
  516. package/src/formats/gml/importer.ts +388 -67
  517. package/src/formats/gml/index.ts +85 -24
  518. package/src/formats/gml/syntax.ts +113 -28
  519. package/src/formats/graphml/constants.ts +178 -44
  520. package/src/formats/graphml/exporter.ts +52 -18
  521. package/src/formats/graphml/importer.ts +640 -60
  522. package/src/formats/graphml/index.ts +2 -1
  523. package/src/formats/graphml/tree.ts +6 -2
  524. package/src/formats/graphml/yfiles.ts +37 -15
  525. package/src/formats/json/dialect.ts +128 -29
  526. package/src/formats/json/exporter.ts +205 -68
  527. package/src/formats/json/importer.ts +1163 -253
  528. package/src/formats/json/index.ts +3 -1
  529. package/src/formats/json/obographs-export.ts +1197 -0
  530. package/src/formats/json/obographs.ts +353 -92
  531. package/src/formats/neo4j/exporter.ts +321 -102
  532. package/src/formats/neo4j/header.ts +44 -6
  533. package/src/formats/neo4j/importer.ts +512 -73
  534. package/src/formats/neo4j/index.ts +75 -23
  535. package/src/formats/obo/exporter.ts +2210 -0
  536. package/src/formats/obo/importer.ts +622 -109
  537. package/src/formats/obo/index.ts +6 -3
  538. package/src/formats/obo/syntax.ts +232 -37
  539. package/src/formats/pajek/exporter.ts +90 -42
  540. package/src/formats/pajek/importer.ts +407 -93
  541. package/src/formats/pajek/index.ts +2 -1
  542. package/src/formats/pajek/syntax.ts +216 -55
  543. package/src/formats/xgmml/columns.ts +10 -0
  544. package/src/formats/xgmml/constants.ts +183 -56
  545. package/src/formats/xgmml/document.ts +212 -34
  546. package/src/formats/xgmml/emit.ts +175 -34
  547. package/src/formats/xgmml/exporter.ts +36 -28
  548. package/src/formats/xgmml/importer.ts +64 -86
  549. package/src/formats/xgmml/index.ts +1 -0
  550. package/src/formats/xgmml/values.ts +12 -4
  551. package/src/index.ts +81 -11
  552. package/src/registry.ts +1121 -135
  553. package/src/sniff.ts +163 -32
  554. package/src/types.ts +385 -114
  555. package/dist/chunks/escape-B-tkk_Cl.js.map +0 -1
  556. package/dist/chunks/export-Bh60Dv-n.js +0 -582
  557. package/dist/chunks/export-Bh60Dv-n.js.map +0 -1
  558. package/dist/chunks/exporter-BGrsWamJ.js.map +0 -1
  559. package/dist/chunks/exporter-DIeGJXAZ.js.map +0 -1
  560. package/dist/chunks/importer-BWY2FFc5.js.map +0 -1
  561. package/dist/chunks/importer-DD-xv9_Y.js +0 -1471
  562. package/dist/chunks/importer-DD-xv9_Y.js.map +0 -1
  563. package/dist/chunks/importer-DET1tg6s.js.map +0 -1
  564. package/dist/chunks/importer-DEcKhsmQ.js +0 -1614
  565. package/dist/chunks/importer-DEcKhsmQ.js.map +0 -1
  566. package/dist/chunks/importer-DIrbbnAf.js.map +0 -1
  567. package/dist/chunks/importer-D_e7e7LX.js.map +0 -1
  568. package/dist/chunks/importer-eUREhBGj.js.map +0 -1
  569. package/dist/chunks/importer-vi3bSdtw.js.map +0 -1
  570. package/dist/chunks/importer-zGLo8Dg_.js.map +0 -1
  571. package/dist/chunks/json-elements-DDS8N2Dd.js +0 -779
  572. package/dist/chunks/json-elements-DDS8N2Dd.js.map +0 -1
  573. package/dist/chunks/ontology-BnrJ4I98.js +0 -113
  574. package/dist/chunks/ontology-BnrJ4I98.js.map +0 -1
  575. package/dist/chunks/records-dbRkxwaq.js.map +0 -1
  576. package/dist/chunks/report-B1z4WT9e.js +0 -2372
  577. package/dist/chunks/report-B1z4WT9e.js.map +0 -1
  578. package/dist/chunks/text-Dr0Ifpag.js.map +0 -1
  579. package/dist/chunks/weights-Dzba96G3.js +0 -176
  580. package/dist/chunks/weights-Dzba96G3.js.map +0 -1
  581. package/dist/chunks/writer-C7flM-Ih.js.map +0 -1
@@ -1,81 +1,193 @@
1
1
  /**
2
- * The io contract types of @graphty/graph-io (design section 12.4, normative): what every importer
2
+ * The io contract types of @graphty/graph-io: what every importer
3
3
  * and exporter implements and what every caller of one programs against. They are declared here
4
4
  * rather than in the core because ImportInput and CommonImportOptions reference ReadableStream and
5
5
  * AbortSignal, which need the DOM lib (or @types/node >= 18); the core's public types reference only
6
6
  * ES2020 globals (decision D-IO-TYPES). Every declaration is transcribed verbatim from the design;
7
- * the behaviour behind each option is specified in sections 8.4 (import), 8.5 (export) and 8.6
7
+ * the behavior behind each option is specified in sections 8.4 (import), 8.5 (export) and 8.6
8
8
  * (report and error aggregation).
9
9
  */
10
10
  import { type Dtype, type DuplicatePolicy, GraphFormatError, type GraphSink, type GraphSnapshot, type IdCoercion } from "@graphty/graph-format";
11
11
  /**
12
- * What an importer reads (design section 8.4): whole text, whole bytes, a byte stream (a browser
12
+ * What an importer reads: whole text, whole bytes, a byte stream (a browser
13
13
  * `File.stream()`, a fetch body) or an async iterable of text or byte chunks. Bytes are decoded
14
14
  * strictly in the encoding the `encoding` option, a byte order mark or the file's own declaration
15
15
  * names, else as UTF-8 (undeclared bytes that are not UTF-8 are read as windows-1252 with a
16
16
  * warning), so an invalid sequence is a parse-error and never a silent U+FFFD that could alias two ids.
17
+ * @category Loading
17
18
  */
18
19
  export type ImportInput = string | Uint8Array | ReadableStream<Uint8Array> | AsyncIterable<string | Uint8Array>;
19
20
  /**
20
- * The options every importer accepts next to its format-specific ones (design section 8.4). The
21
+ * The options every importer accepts next to its format-specific ones. The
21
22
  * builder-policy fields (`addMissingNodes`, `duplicateEdges`, `selfLoops`, `weightDtype`) seed the
22
23
  * registry's builder; on a caller's sink they are read back from `sink.options` and every option the
23
- * sink cannot honour is reported.
24
+ * sink cannot honor is reported.
25
+ * @category Loading
24
26
  */
25
27
  export interface CommonImportOptions {
26
28
  /**
27
- * Id coercion rule applied before an id reaches the sink (design section 4.1): "canonical" by default for
28
- * text-cell formats, "keep" for JSON.
29
+ * How id text becomes a node id. "canonical": integer text such as "42" becomes the number 42
30
+ * and everything else ("042", "4.2", "a") stays text. "string": every id stays text. "number":
31
+ * every id is read as a number, so "042" and "42" become one node (with a warning) and text that
32
+ * is not a number is an error. "keep": ids keep the type the file gives them. The default is
33
+ * "keep" for JSON, OBO, XGMML, CX, CX2 and Cytoscape sessions, and "canonical" for the other
34
+ * formats.
35
+ * @defaultValue per format
29
36
  */
30
37
  ids?: IdCoercion | undefined;
31
- /** Which field becomes the node id; "id" by default; "label" / "index" resolve the GML / Pajek / d3 ambiguity. */
38
+ /**
39
+ * Which value becomes the node id: the file's own id ("id"), the node's label ("label"), or its
40
+ * position among the nodes, counting from 0 ("index"). Use it when a file's ids are meaningless
41
+ * numbers and the labels are the real names. In d3 JSON, "index" also reads edges whose ends are
42
+ * node positions. In GML and Pajek it only renames: every node still needs its id key or vertex
43
+ * number, because edges refer to nodes by it, and a GML node without an `id` key is skipped
44
+ * with E_MISSING_ID. CSV reads this option only when there is a node table, and it does not
45
+ * just rename: with "label" the node table's label column (`label`, or the `labelColumn`
46
+ * option) gives the ids, so the edge table must name its nodes by those labels.
47
+ * @defaultValue "id"
48
+ */
32
49
  nodeIdFrom?: "id" | "label" | "index" | undefined;
33
- /** Whether an edge may reference an undeclared node (default true; the GEXF importer defaults false for edges). */
50
+ /**
51
+ * Whether an edge may name a node the file never declares; that node is then created. When
52
+ * false, such an edge is skipped as an error. The default is false for GEXF, XGMML, CX, CX2 and
53
+ * Cytoscape sessions, whose files must declare every node, and true for the other formats.
54
+ * @defaultValue per format
55
+ */
34
56
  addMissingNodes?: boolean | undefined;
35
- /** The builder's duplicate-edge policy seed; default "keep". */
57
+ /**
58
+ * What to do with a second edge between the same two nodes: "keep" keeps both, "first" / "last"
59
+ * keep one, "sum" / "min" / "max" keep one with the weights combined, and "error" stops the
60
+ * import. Merged edges are reported once as W_EDGES_MERGED.
61
+ * @defaultValue "keep"
62
+ */
36
63
  duplicateEdges?: DuplicatePolicy | undefined;
37
- /** The builder's self-loop policy seed; default "keep". */
64
+ /**
65
+ * What to do with an edge from a node to itself: "keep", "drop" (reported once as
66
+ * W_SELF_LOOPS_DROPPED with the number removed), or "error" to stop the import.
67
+ * @defaultValue "keep"
68
+ */
38
69
  selfLoops?: "keep" | "drop" | "error" | undefined;
39
- /** What to do with a file whose edges disagree on direction (design section 3.6); default "expand". */
70
+ /**
71
+ * How edge direction is read. "expand" (the default) keeps the file's direction, and for a file
72
+ * that has both directed and undirected edges makes a directed graph in which each undirected
73
+ * edge is two edges, marked so an export can write them back as one. "directed" / "undirected"
74
+ * read every edge of any file that way, including a file whose edges all have the other
75
+ * direction, with a W_DIRECTION_FORCED warning. "error" stops the import at the first edge whose
76
+ * direction differs from the file's.
77
+ * @defaultValue "expand"
78
+ */
40
79
  onMixedDirection?: "expand" | "directed" | "undirected" | "error" | undefined;
41
- /** The direction assumed for a file that declares none (GEXF: undirected per spec). */
80
+ /**
81
+ * Whether the graph is directed when the file does not say. The default is undirected for
82
+ * GraphML, GEXF, GML, JSON and XGMML, and directed for CSV, Pajek and Cytoscape sessions. DOT,
83
+ * Neo4j, CX, CX2 and OBO files always settle the direction themselves (DOT by `graph` or
84
+ * `digraph`; the others are always directed), so those formats do not read this option and
85
+ * report it as W_OPTION_IGNORED.
86
+ * @defaultValue per format
87
+ */
42
88
  defaultDirected?: boolean | undefined;
43
- /** The attribute that becomes THE weight (per-format default: "weight", GML "value"); null = unweighted. */
89
+ /**
90
+ * The edge attribute read as the edge weight. The default is "weight", except "value" for GML
91
+ * and Pajek and none for OBO. Pass null to read every attribute as a plain attribute and leave
92
+ * the graph unweighted. A name no edge has leaves the graph unweighted, with a W_WEIGHT_NOT_FOUND
93
+ * warning: one options object with `weightFrom: "weight"` shared across formats reads GML and
94
+ * Pajek files, which keep their weights in `value`, without weights. An edge whose weight cell is
95
+ * empty or missing gets the default weight 1, and an export writes no weight for it.
96
+ * @defaultValue per format
97
+ */
44
98
  weightFrom?: string | null | undefined;
45
- /** Weight staging precision; "f64" for every importer by default so 0.1 and 16777217 survive. */
99
+ /**
100
+ * Whether weights a 32-bit float cannot hold exactly are also kept exactly. "f64" keeps them in
101
+ * an edge column that `snapshot.edges.byRole("weight")` finds, so 0.1 and 16777217
102
+ * stay exact. "f32" keeps no such column and uses less memory: the 32-bit weight arrays
103
+ * `snapshot.weights` and `snapshot.edgeList().weights`, which every import fills, are then the
104
+ * only weights.
105
+ * @defaultValue "f64"
106
+ */
46
107
  weightDtype?: "f32" | "f64" | undefined;
47
- /** How a declared `long` column is stored: "f64" (default) or "string" (design section 5.1). */
108
+ /**
109
+ * How a column the file declares as a 64-bit integer is stored: "f64" (a number, exact up to
110
+ * 2^53) or "string" (every digit kept, as text). GML declares no types, so there it applies to a
111
+ * key whose integer values go beyond 2^53.
112
+ * @defaultValue "f64"
113
+ */
48
114
  long?: "f64" | "string" | undefined;
49
- /** Restore ids mangled by sanitizeIds "mangle" from the graphty:originalId attribute (default true). */
115
+ /**
116
+ * Whether to give back the original ids that an export with `sanitizeIds: "mangle"` had to
117
+ * rewrite. The export writes them to the file in an attribute whose name each format page
118
+ * gives. When false, the rewritten ids stay the ids and the originals are an ordinary node
119
+ * attribute, named after the format's spelling: `graphty.originalId` in GraphML,
120
+ * `graphty_originalId` in GML and Pajek, `graphty:originalId` in CX, CX2 and Cytoscape sessions,
121
+ * and a `graphty:originalId` entry of the `property_value` attribute in OBO.
122
+ * @defaultValue true
123
+ */
50
124
  restoreMangledIds?: boolean | undefined;
51
- /** GraphML / JGF hyperedges: refuse, skip with a report entry (default), or expand to a star / clique. */
125
+ /**
126
+ * What to do with a GraphML or JGF hyperedge (an edge with more than two ends): "skip" leaves it
127
+ * out with a warning, "error" stops the import, and "star" and "clique" turn it into ordinary
128
+ * edges. "clique" joins every pair of ends. "star" works differently per format: GraphML adds a
129
+ * new hub node joined to every end, while JGF makes the hyperedge's first node the hub, so no
130
+ * node is added. A directed JGF hyperedge (`source` and `target` arrays) becomes one edge from
131
+ * every source to every target under both. In JGF every edge made from a hyperedge carries the
132
+ * hyperedge's id, label, relation and metadata; GraphML drops a hyperedge's `<data>` and its
133
+ * `<desc>`, with a warning.
134
+ * @defaultValue "skip"
135
+ */
52
136
  hyperedges?: "error" | "skip" | "star" | "clique" | undefined;
53
- /** Errors tolerated before the importer aborts with E_IMPORT (default 100). */
137
+ /**
138
+ * How many errors an import tolerates. Each error skips one node, edge or value and is listed in
139
+ * the report; one error more than this stops the import with an ImportError. Pass 0 to stop at
140
+ * the first error.
141
+ * @defaultValue 100
142
+ */
54
143
  errorLimit?: number | undefined;
55
- /** Cancellation; the importer stops between chunks and rejects with the signal's reason. */
144
+ /**
145
+ * Cancels the import. When it aborts, the import stops and rejects with the signal's reason
146
+ * (an AbortError, or a TimeoutError from `AbortSignal.timeout()`).
147
+ */
56
148
  signal?: AbortSignal | undefined;
57
- /** Progress in bytes; `bytesTotal` is known for in-memory input only. */
149
+ /**
150
+ * Called as the input is read, with the bytes read so far and the total. For a string or a
151
+ * Uint8Array the total is known from the first call. For a stream (which includes loadFromUrl()
152
+ * and loadFromFile()) it is undefined until the last call, which always has
153
+ * `bytesDone === bytesTotal`. Text counts its UTF-8 length.
154
+ */
58
155
  onProgress?: ((bytesDone: number, bytesTotal?: number) => void) | undefined;
59
156
  /**
60
- * The character encoding of byte input (a WHATWG label such as "utf-8", "windows-1252",
61
- * "iso-8859-1", "utf-16le"); overrides the byte order mark and any encoding the file declares.
62
- * Absent: a BOM decides, else the declaration (XML prolog, DOT `charset`), else UTF-8, and
63
- * bytes that are not valid UTF-8 are read as windows-1252 with a warning. Ignored for text input.
157
+ * The character encoding of byte input, as a label such as "utf-8", "windows-1252" or
158
+ * "utf-16le". Without it graph-io uses a byte order mark, then the encoding the file declares
159
+ * (an XML declaration, DOT's `charset`), then UTF-8, and reads bytes that are not UTF-8 as
160
+ * windows-1252 with a warning. A byte order mark wins over this option. A string input is
161
+ * already text: setting this option for one adds a W_OPTION_IGNORED warning, once per input (a
162
+ * CSV import with a `nodes` table has two inputs).
64
163
  */
65
164
  encoding?: string | undefined;
66
165
  }
67
166
  /**
68
- * Which graph of an input that holds several to read: by position or by name, never both. An
69
- * importer of a format that can hold several graphs (a Cytoscape session, a CX collection, a JGF
70
- * or OBO Graphs `graphs` array) accepts these next to its own options; absent, it reads the first.
167
+ * Which graph to read from a file that holds several: by position or by name, never both. Without
168
+ * either, the first graph is read.
169
+ * @category Loading
71
170
  */
72
171
  export interface GraphChoiceOptions {
73
- /** The 0-based position of the graph, as `GraphListing.index` gives it. */
172
+ /**
173
+ * The 0-based position of the graph to read from a file that holds several (`listGraphs()`
174
+ * gives each graph's `index`). A position past the last graph stops the import with an
175
+ * ImportError whose `issue.code` is E_GRAPH_NOT_FOUND; its message lists the file's graphs.
176
+ * @defaultValue 0
177
+ */
74
178
  graphIndex?: number | undefined;
75
- /** The name of the graph, as `GraphListing.name` gives it; a name two graphs share is refused. */
179
+ /**
180
+ * The name of the graph to read from a file that holds several (`listGraphs()` gives each
181
+ * graph's `name`). A name no graph has stops the import with an ImportError whose `issue.code`
182
+ * is E_GRAPH_NOT_FOUND, and a name two graphs share with one whose `issue.code` is
183
+ * E_AMBIGUOUS_GRAPH_NAME.
184
+ */
76
185
  graphName?: string | undefined;
77
186
  }
78
- /** One graph of an input that can hold several, as an importer's listGraphs() describes it. */
187
+ /**
188
+ * One graph of an input that can hold several, as an importer's listGraphs() describes it.
189
+ * @category Loading
190
+ */
79
191
  export interface GraphListing {
80
192
  /** The value graphIndex takes to read it. */
81
193
  readonly index: number;
@@ -87,37 +199,49 @@ export interface GraphListing {
87
199
  readonly edges: number | null;
88
200
  }
89
201
  /**
90
- * An importer plugin (design section 8.4): pushes scalars into the caller's sink in one pass and
91
- * never freezes. `Opts` is its format-specific option set; the default `unknown` lets a caller pass
92
- * the common options to an importer typed without one.
202
+ * A format's reader. It reads the input once, from start to end, and adds each node, edge and
203
+ * attribute to a graph builder (`GraphSink`, which `GraphBuilder` from @graphty/graph-format
204
+ * implements); importGraph() then builds the snapshot. Register one with
205
+ * `registry.registerImporter()` to teach graph-io a new format. `Opts` is the type of the format's
206
+ * own options.
207
+ * @category Writing a format
93
208
  */
94
209
  export interface GraphImporter<Opts = unknown> {
95
- /** The format name: "gexf", "graphml", "gml", "dot", "pajek", "csv", "json", "neo4j". */
210
+ /** The name callers pass as `format`, such as "graphml" or "csv"; lowercase, unique in a registry. */
96
211
  readonly format: string;
97
- /** File extensions with the leading dot. */
212
+ /** File extensions with the leading dot, most common first; used to detect the format from a file name. */
98
213
  readonly extensions: readonly string[];
99
- /** MIME types the format is served as. */
214
+ /** MIME types the format is served as, most specific first; used to detect the format from a Content-Type. */
100
215
  readonly mimeTypes: readonly string[];
101
216
  /**
102
- * Confidence that `head` is this format, for the registry's sniff().
217
+ * The names of this format's own options (`["separator"]`), when you want misspelled options
218
+ * reported. While every registered importer lists its options, a load warns `W_UNKNOWN_OPTION` for
219
+ * a name that no format and no load function takes. Leave it out to report nothing.
220
+ */
221
+ readonly options?: readonly string[] | undefined;
222
+ /**
223
+ * How sure you are that `head`, the first bytes of a file (up to SNIFF_HEAD_BYTES), is this
224
+ * format: 0 for no, up to 1 for certain. Below 0.5 counts as a weak guess, which loses to a
225
+ * file extension another format claims. Without this method the format is detected only by
226
+ * file name and MIME type.
103
227
  * @param head - the first bytes of the input
104
228
  * @returns a confidence in 0..1
105
229
  */
106
230
  sniff?(head: Uint8Array): number;
107
231
  /**
108
- * Read `input` into `sink`; per-element errors are aggregated into the report until the error
109
- * limit, then the importer throws ImportError with the partial report.
232
+ * Read `input` into `sink`. Record each problem in an ImportReportBuilder and skip the element;
233
+ * the builder throws ImportError once there are more errors than `errorLimit`.
110
234
  * @param input - the text, bytes or stream to read
111
- * @param sink - the builder (or a recording sink) to push into
112
- * @param options - format-specific and common options
113
- * @returns the import report
235
+ * @param sink - the graph builder to add nodes, edges and attributes to
236
+ * @param options - the format's own options and the options every importer takes
237
+ * @returns the import report (`report.finish()`)
114
238
  */
115
239
  import(input: ImportInput, sink: GraphSink, options?: Opts & CommonImportOptions): Promise<ImportReport>;
116
240
  /**
117
- * Read every graph of an input that can hold several (a DOT file with several graphs, a
118
- * Pajek project with several networks, a JGF `graphs` array), each into its own sink. An
119
- * importer without this method reads one graph per input. `import()` reads the first graph
120
- * and warns how many it skipped.
241
+ * Optional, for a format whose files can hold several graphs: read every graph, each into its
242
+ * own sink. importAllGraphs() calls it; with it, importGraph() also honors `graphIndex` and
243
+ * `graphName` by reading every graph and returning the chosen one. `import()` should read the
244
+ * first graph and warn W_MULTIPLE_GRAPHS with the number skipped.
121
245
  * @param input - the text, bytes or stream to read
122
246
  * @param sinkFor - called once per graph, in document order, before that graph's first push
123
247
  * @param options - format-specific and common options
@@ -125,9 +249,10 @@ export interface GraphImporter<Opts = unknown> {
125
249
  */
126
250
  importAll?(input: ImportInput, sinkFor: (index: number) => GraphSink, options?: Opts & CommonImportOptions): Promise<ImportReport[]>;
127
251
  /**
128
- * List the graphs of an input that can hold several without importing them, so a caller can
129
- * offer a choice before reading one with `graphIndex` or `graphName`. An importer without this
130
- * method does not list its graphs; `import()` reads the first.
252
+ * Optional: list the graphs of a file without importing them, so a caller can offer a choice.
253
+ * listGraphs() calls it. An importer that has it must also honor `graphIndex` and `graphName`
254
+ * in `import()` itself (`chooseGraph()` resolves them); one without it lists nothing and the
255
+ * registry makes the choice through `importAll()`.
131
256
  * @param input - the text, bytes or stream to read
132
257
  * @param options - format-specific and common options
133
258
  * @returns one listing per graph, in document order
@@ -135,125 +260,224 @@ export interface GraphImporter<Opts = unknown> {
135
260
  listGraphs?(input: ImportInput, options?: Opts & CommonImportOptions): Promise<readonly GraphListing[]>;
136
261
  }
137
262
  /**
138
- * What a format can express without loss (design section 8.5): the fidelity matrix of research
139
- * note 07 section 9 as a table, and the acceptance test list for check().
263
+ * What a format can store exactly. checkCapabilities() compares a graph against it and returns a
264
+ * loss note for everything the graph has that the format cannot store.
265
+ * @category Saving
140
266
  */
141
267
  export interface ExportCapabilities {
142
- /** Directed and undirected edges in one file. */
268
+ /**
269
+ * Whether one file can hold directed and undirected edges together. When false, a graph with both
270
+ * needs `onMixedDirection` ("directed" or "undirected") to be saved.
271
+ */
143
272
  readonly mixedDirection: boolean;
144
- /** Parallel edges. */
273
+ /**
274
+ * Whether the file can hold two edges between the same pair of nodes. When false, the extra
275
+ * edges are not kept as separate edges.
276
+ */
145
277
  readonly multiEdges: boolean;
146
- /** Self-loops. */
278
+ /** Whether the file can hold an edge from a node to itself. When false, such edges are lost. */
147
279
  readonly selfLoops: boolean;
148
- /** Whether edge ids are required (generated when absent), optional or unsupported. */
280
+ /**
281
+ * Whether edges carry ids. "required": every edge has one, and ids are made up (e0, e1, ...)
282
+ * for a graph without them. "optional": edge ids are written when the graph has them. "none":
283
+ * edge ids are lost.
284
+ */
149
285
  readonly edgeIds: "required" | "optional" | "none";
150
- /** Which node ids can be written unchanged. */
286
+ /**
287
+ * Which node ids the format can write as they are: "any"; "nmtoken" (XML name tokens: letters,
288
+ * digits and `. - _ :`, no spaces); "integer"; or "dense-1-based" (the nodes are always numbered
289
+ * 1 to N). Other ids need `sanitizeIds: "mangle"`, which writes the original ids too.
290
+ */
151
291
  readonly idCharset: "any" | "nmtoken" | "integer" | "dense-1-based";
152
- /** The column dtypes the format keeps as declared. */
292
+ /**
293
+ * The attribute types the format keeps exactly: "bool", "i32" (32-bit integer), "u32" (unsigned
294
+ * 32-bit integer), "u8" (byte), "f32" (32-bit float), "f64" (64-bit float, a JavaScript number),
295
+ * "string" (text), "dict" (text stored as a dictionary of repeated values), "list" and "json".
296
+ * An attribute of another type is written as the nearest one the format has, with a
297
+ * W_DTYPE_UNSUPPORTED note.
298
+ */
153
299
  readonly dtypes: readonly Dtype[];
154
- /** Multi-component (stride) columns. */
300
+ /**
301
+ * Whether an attribute other than the node position can hold several numbers per node or edge
302
+ * (a vector). When false, such an attribute does not read back as one attribute. Positions
303
+ * are covered by `positions`.
304
+ */
155
305
  readonly components: boolean;
156
- /** List columns. */
306
+ /** Whether an attribute can hold a list per node or edge. When false, list attributes are lost or flattened. */
157
307
  readonly lists: boolean;
158
- /** Nested json columns. */
308
+ /**
309
+ * Whether an attribute can hold nested JSON objects and arrays. When false, such attributes are
310
+ * written as text or lost.
311
+ */
159
312
  readonly json: boolean;
160
- /** Declared defaults. */
313
+ /** Whether the file can declare a default value for an attribute. When false, declared defaults are lost. */
161
314
  readonly defaults: boolean;
162
- /** Declared enumerations (GEXF options). */
315
+ /**
316
+ * Whether the file can declare the allowed values of an attribute (GEXF `options`). When false,
317
+ * those declarations are lost; the values themselves are kept.
318
+ */
163
319
  readonly options: boolean;
164
- /** Containment (parent / parents roles). */
320
+ /** Whether nodes can sit inside other nodes (groups or clusters). When false, the nesting is lost. */
165
321
  readonly hierarchy: boolean;
166
- /** Temporal support level. */
322
+ /**
323
+ * What the file can say about time: "none" (time attributes are lost), "intervals" (one start
324
+ * and end per element), "spells" (several intervals per element), or "dynamic-values"
325
+ * (attribute values that change over time, as well).
326
+ */
167
327
  readonly temporal: "none" | "intervals" | "spells" | "dynamic-values";
168
- /** Graph-level attributes. */
328
+ /** Whether the file can hold attributes of the graph itself. When false, graph attributes are lost. */
169
329
  readonly graphAttributes: boolean;
170
- /** The position role. */
330
+ /** Whether the file can hold node positions. When false, the layout is lost. */
171
331
  readonly positions: boolean;
172
- /** The visual roles (color, size, shape, thickness). */
332
+ /** Whether the file can hold node and edge color, size, shape and thickness. When false, they are lost. */
173
333
  readonly viz: boolean;
174
334
  }
175
- /** One thing an exporter cannot represent, reported by check() before anything is written (design section 8.5). */
335
+ /**
336
+ * One thing a format cannot store, returned by checkExport() before anything is written.
337
+ * @category Saving
338
+ */
176
339
  export interface LossNote {
177
- /** A stable code such as "W_OPEN_INTERVAL". */
340
+ /**
341
+ * A stable code. Codes starting with "E_" mean the export refuses to write under these options:
342
+ * the exportGraph*() functions throw a GraphFormatError. Codes starting with "W_" mean the file
343
+ * is written, but this part will not read back the same.
344
+ */
178
345
  readonly code: string;
179
- /** A plain-ASCII human-readable explanation. */
346
+ /** A plain-English explanation. */
180
347
  readonly message: string;
181
- /** The affected column, or null when the note is not about a column. */
348
+ /** The attribute column involved, or null. */
182
349
  readonly column: string | null;
183
- /** How many rows or elements are affected, or null when not counted. */
350
+ /** How many nodes, edges or values are affected, or null when not counted. */
184
351
  readonly count: number | null;
185
352
  }
186
- /** The options every exporter accepts next to its format-specific ones (design section 8.5). */
353
+ /**
354
+ * The options every exporter accepts next to its format-specific ones.
355
+ * @category Saving
356
+ */
187
357
  export interface CommonExportOptions {
188
- /** "error" (default): never rename a node; "mangle": rewrite ids the format cannot hold and keep the original. */
358
+ /**
359
+ * What to do with node ids the format cannot hold. "error": the export throws (E_INVALID_ID) and
360
+ * no node is renamed. "mangle": such ids are rewritten and the originals are written to the
361
+ * file too, so an import with `restoreMangledIds` (on by default) reads the original ids back.
362
+ * Pajek is the exception: it always numbers nodes 1 to N and keeps the old ids as labels.
363
+ * @defaultValue "error"
364
+ */
189
365
  sanitizeIds?: "error" | "mangle" | undefined;
190
- /** For formats without mixed-direction support: refuse (default) or write every edge one way. */
366
+ /**
367
+ * What a format with one direction per file does with a graph that has both directed and
368
+ * undirected edges: "error" throws (E_DIRECTED), "directed" writes every edge as directed (an
369
+ * undirected edge once, as one directed edge), "undirected" writes the whole graph undirected.
370
+ * A format that keeps each edge's own direction (GraphML, GEXF, CSV, Pajek, XGMML, Cytoscape
371
+ * sessions, and the JGF and graphology JSON dialects) ignores it and writes both kinds; to make
372
+ * such a graph all one direction, read it with the import option `onMixedDirection`.
373
+ * @defaultValue "error"
374
+ */
191
375
  onMixedDirection?: "error" | "directed" | "undirected" | undefined;
192
376
  }
193
377
  /**
194
- * An exporter plugin (design section 8.5): iterates nodes and logical edges (never arcs) in index
195
- * order and reads the role columns of section 3.6 / 3.7 to fold expanded pairs and emit explicit
196
- * weights only.
378
+ * A format's writer. Register one with `registry.registerExporter()` to make a format writable by
379
+ * every save function. `Opts` is the type of the format's own options.
380
+ * @category Writing a format
197
381
  */
198
382
  export interface GraphExporter<Opts = unknown> {
199
- /** The format name. */
383
+ /** The name callers pass as `format`; the same as the importer's when the format has both. */
200
384
  readonly format: string;
201
- /** What the format can express. */
385
+ /** What the format can store exactly; build it with `capabilities()`. */
202
386
  readonly capabilities: ExportCapabilities;
203
387
  /**
204
- * Pre-flight: what export() would lose, without writing anything.
205
- * @param snapshot - the snapshot to check
206
- * @param options - format-specific and common options
207
- * @returns the loss notes, empty when the export is exact
388
+ * File extensions with the leading dot, most common first. Optional; listFormats() uses them
389
+ * when no importer is registered for the format (an export-only format).
390
+ */
391
+ readonly extensions?: readonly string[] | undefined;
392
+ /** MIME types, most specific first. Optional; used the same way as `extensions`. */
393
+ readonly mimeTypes?: readonly string[] | undefined;
394
+ /**
395
+ * The names of this format's own save options, when you want misspelled options reported. While
396
+ * every registered exporter lists its options, `checkExport()` returns a `W_UNKNOWN_OPTION` note for
397
+ * a name that no format and no save function takes. Leave it out to report nothing.
398
+ */
399
+ readonly options?: readonly string[] | undefined;
400
+ /**
401
+ * What a save would lose, without writing anything; checkExport(snapshot, format, options) calls
402
+ * it. Start from `checkCapabilities(snapshot, capabilities, resolveExportOptions(options))` and
403
+ * add a note for anything else your format changes. Every difference a re-import would show
404
+ * needs a note.
405
+ * @param snapshot - the graph to check
406
+ * @param options - the format's own options and the options every exporter takes
407
+ * @returns the loss notes, empty when the save is exact
208
408
  */
209
409
  check(snapshot: GraphSnapshot, options?: Opts & CommonExportOptions): readonly LossNote[];
210
410
  /**
211
- * Write the snapshot as UTF-8 chunks.
212
- * @param snapshot - the snapshot to write
213
- * @param options - format-specific and common options
214
- * @returns the encoded chunks
411
+ * Write the graph as byte chunks: UTF-8 text for a text format (`encodeChunks()` turns string
412
+ * parts into them), the raw bytes for a binary one. Throw a GraphFormatError before writing for
413
+ * every "E_" note `check()` returns.
414
+ * @param snapshot - the graph to write
415
+ * @param options - the format's own options and the options every exporter takes
416
+ * @returns the file's bytes, chunk by chunk
215
417
  */
216
418
  export(snapshot: GraphSnapshot, options?: Opts & CommonExportOptions): AsyncIterable<Uint8Array>;
217
419
  /**
218
- * Write the snapshot as one string.
219
- * @param snapshot - the snapshot to write
220
- * @param options - format-specific and common options
221
- * @returns the whole document
420
+ * Write the graph as one string (`joinText()` joins string parts). A binary format rejects with
421
+ * a GraphFormatError E_UNSUPPORTED (`details.reason` "binary") instead.
422
+ * @param snapshot - the graph to write
423
+ * @param options - the format's own options and the options every exporter takes
424
+ * @returns the whole file
222
425
  */
223
426
  exportToString(snapshot: GraphSnapshot, options?: Opts & CommonExportOptions): Promise<string>;
224
427
  }
225
- /** The categories of an ImportIssue (design section 8.6). */
428
+ /**
429
+ * What an ImportIssue is about, for errors and warnings alike: "parse-error" (the text is not valid
430
+ * in the format), "missing-value" (something required is absent), "validation-error" (a value
431
+ * breaks a rule of the format or of an option; an error skips it, a warning keeps it as written,
432
+ * such as an id with spaces around it), "unsupported" (the file uses something graph-io does not
433
+ * read), "precision" (a value was rounded), "coercion" (a value or id changed type) and "merged"
434
+ * (elements were combined). Sort by `severity` first: the category says what kind of problem it
435
+ * is, not how serious.
436
+ * @category Reports and errors
437
+ */
226
438
  export type IssueCategory = "parse-error" | "missing-value" | "validation-error" | "unsupported" | "precision" | "coercion" | "merged";
227
- /** One problem found while importing (design section 8.6). */
439
+ /**
440
+ * One problem found while importing.
441
+ * @category Reports and errors
442
+ */
228
443
  export interface ImportIssue {
229
444
  /** The category. */
230
445
  readonly category: IssueCategory;
231
- /** Errors count toward the error limit; warnings do not. */
446
+ /**
447
+ * "error": the element was skipped and counts toward `errorLimit`. "warning": the element was
448
+ * kept, possibly changed.
449
+ */
232
450
  readonly severity: "error" | "warning";
233
- /** A stable code such as "E_UNKNOWN_NODE" or "W_WIDENED". */
451
+ /** A stable code; E_ for errors, W_ for warnings ("E_UNKNOWN_NODE", "W_WIDENED"). */
234
452
  readonly code: string;
235
- /** A plain-ASCII human-readable message. */
453
+ /** A plain-English message. */
236
454
  readonly message: string;
237
- /** The 1-based source line, or null when unknown. */
455
+ /** The 1-based line in the input, or null when the format has no lines or it is unknown. */
238
456
  readonly line: number | null;
239
- /** The element (a node or edge id, an attribute name), or null when unknown. */
457
+ /** The node id, edge id or attribute name involved, or null. */
240
458
  readonly element: string | null;
241
459
  }
242
- /** What an import produced besides the sink's contents (design section 8.6). */
460
+ /**
461
+ * What happened while a file was read.
462
+ * @category Reports and errors
463
+ */
243
464
  export interface ImportReport {
244
- /** The importer's format name. */
465
+ /** The format the file was read as. */
245
466
  readonly format: string;
246
- /** Element counts. */
467
+ /**
468
+ * What was read from the file, counted before the graph was built: `duplicateEdges` and
469
+ * `selfLoops: "drop"` can leave fewer edges in the snapshot (each reported as a warning).
470
+ */
247
471
  readonly counts: {
248
- /** Nodes pushed. */
472
+ /** Nodes read. */
249
473
  readonly nodes: number;
250
- /** Logical edges pushed (both halves of an expanded edge count). */
474
+ /** Edges read (an undirected edge expanded into two by onMixedDirection "expand" counts twice). */
251
475
  readonly edges: number;
252
476
  /** Nodes skipped after an error. */
253
477
  readonly skippedNodes: number;
254
478
  /** Edges skipped after an error. */
255
479
  readonly skippedEdges: number;
256
- /** Edges expanded under onMixedDirection "expand" (design section 3.6). */
480
+ /** Undirected edges expanded into two by onMixedDirection "expand". */
257
481
  readonly expandedMixed: number;
258
482
  };
259
483
  /** Every issue recorded, in order. */
@@ -266,22 +490,48 @@ export interface ImportReport {
266
490
  readonly truncated: boolean;
267
491
  /** What the importer could not represent. */
268
492
  readonly lossy: readonly LossNote[];
269
- /** Wall time of the parse phase; the caller's freeze reports separately. */
493
+ /** How long reading the file took, in milliseconds. */
270
494
  readonly durationMs: number;
271
495
  }
272
496
  /**
273
- * The error an importer throws when the error limit is reached or the input cannot be read at all
274
- * (design section 8.6): a GraphFormatError with code "E_IMPORT" (reserved in the core's union so
275
- * `err.code === "E_IMPORT"` narrows) carrying the partial report.
497
+ * What a load function throws when the input cannot be read: the URL failed, the format was not
498
+ * recognized, the file could not be parsed, or there were more errors than `errorLimit`. It is a
499
+ * GraphFormatError with code "E_IMPORT"; `issue` says what stopped the import and `report` holds
500
+ * everything recorded until then.
501
+ * @category Reports and errors
276
502
  */
277
503
  export declare class ImportError extends GraphFormatError {
278
- /** The report as it stood when the import aborted. */
504
+ /**
505
+ * Everything recorded up to the point the import stopped. It is not an enumerable property, so an
506
+ * uncaught ImportError prints its message and issue, not every issue of the report.
507
+ */
279
508
  readonly report: ImportReport;
509
+ /**
510
+ * The issue that stopped the import: its `code` ("E_FETCH", "E_UNKNOWN_FORMAT", "E_CSV_UNCLOSED_QUOTE", ...),
511
+ * `message`, `line` and `element`. This is the value to branch on; `code` is always "E_IMPORT".
512
+ * Null only for an ImportError constructed by hand without a matching issue.
513
+ * @example
514
+ * ```ts
515
+ * if (err instanceof ImportError) {
516
+ * switch (err.issue?.code) {
517
+ * case "E_FETCH":
518
+ * console.error(`download failed with status ${String(err.details.status)}`);
519
+ * break;
520
+ * case "E_UNKNOWN_FORMAT":
521
+ * console.error("not a graph file this library can read; pass `format`");
522
+ * break;
523
+ * default:
524
+ * console.error(err.message);
525
+ * }
526
+ * }
527
+ * ```
528
+ */
529
+ readonly issue: ImportIssue | null;
280
530
  /**
281
531
  * Create an ImportError.
282
532
  * @param message - a plain-ASCII human-readable message
283
533
  * @param report - the partial report
284
- * @param details - optional machine-readable context
534
+ * @param details - optional machine-readable context; its `code` names the issue that stopped the import
285
535
  */
286
536
  constructor(message: string, report: ImportReport, details?: Readonly<Record<string, unknown>>);
287
537
  }