@graphty/graph-io 0.3.25 → 0.3.26

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-BbJI55dx.js +56 -0
  4. package/dist/chunks/choose-BbJI55dx.js.map +1 -0
  5. package/dist/chunks/constants-BCsFsMj4.js +231 -0
  6. package/dist/chunks/constants-BCsFsMj4.js.map +1 -0
  7. package/dist/chunks/{escape-B-tkk_Cl.js → escape-D0g6NNUy.js} +382 -92
  8. package/dist/chunks/escape-D0g6NNUy.js.map +1 -0
  9. package/dist/chunks/export-BTI4yQgy.js +4333 -0
  10. package/dist/chunks/export-BTI4yQgy.js.map +1 -0
  11. package/dist/chunks/exporter-BMqk5oxW.js +3465 -0
  12. package/dist/chunks/exporter-BMqk5oxW.js.map +1 -0
  13. package/dist/chunks/{importer-eUREhBGj.js → exporter-Cra2GYcN.js} +4969 -3201
  14. package/dist/chunks/exporter-Cra2GYcN.js.map +1 -0
  15. package/dist/chunks/{exporter-BGrsWamJ.js → exporter-Dxh231ZF.js} +38 -229
  16. package/dist/chunks/exporter-Dxh231ZF.js.map +1 -0
  17. package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-tne475KK.js} +22 -20
  18. package/dist/chunks/exporter-tne475KK.js.map +1 -0
  19. package/dist/chunks/importer-90YWhJoF.js +2811 -0
  20. package/dist/chunks/importer-90YWhJoF.js.map +1 -0
  21. package/dist/chunks/{importer-D_e7e7LX.js → importer-Bcl1d4xH.js} +398 -145
  22. package/dist/chunks/importer-Bcl1d4xH.js.map +1 -0
  23. package/dist/chunks/{importer-BWY2FFc5.js → importer-BfIsp1f9.js} +255 -77
  24. package/dist/chunks/importer-BfIsp1f9.js.map +1 -0
  25. package/dist/chunks/{importer-zGLo8Dg_.js → importer-C_TEA1zJ.js} +484 -157
  26. package/dist/chunks/importer-C_TEA1zJ.js.map +1 -0
  27. package/dist/chunks/{importer-DET1tg6s.js → importer-DCjOvO7U.js} +1687 -310
  28. package/dist/chunks/importer-DCjOvO7U.js.map +1 -0
  29. package/dist/chunks/{importer-vi3bSdtw.js → importer-DfVu6j59.js} +509 -76
  30. package/dist/chunks/importer-DfVu6j59.js.map +1 -0
  31. package/dist/chunks/{importer-DIrbbnAf.js → importer-Dku_VAIY.js} +585 -226
  32. package/dist/chunks/importer-Dku_VAIY.js.map +1 -0
  33. package/dist/chunks/json-elements-3tnyt5uZ.js +1225 -0
  34. package/dist/chunks/json-elements-3tnyt5uZ.js.map +1 -0
  35. package/dist/chunks/ontology-export-B9Tcf37D.js +357 -0
  36. package/dist/chunks/ontology-export-B9Tcf37D.js.map +1 -0
  37. package/dist/chunks/{records-dbRkxwaq.js → records-CQXT__mY.js} +298 -114
  38. package/dist/chunks/records-CQXT__mY.js.map +1 -0
  39. package/dist/chunks/{text-Dr0Ifpag.js → text-DmcUs5_Q.js} +29 -11
  40. package/dist/chunks/text-DmcUs5_Q.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 +951 -261
  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 +342 -85
  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 +564 -157
  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 +19 -1
  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 +33 -17
  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 +868 -188
  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 +2 -0
  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 +400 -83
  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 +145 -32
  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 +680 -285
  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 +226 -79
  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 +98 -24
  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 +108 -26
  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 +238 -85
  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 +66 -34
  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 +183 -51
  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 +20 -21
  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 +7 -2
  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 +38 -4
  468. package/src/common/direction.ts +78 -51
  469. package/src/common/escape.ts +33 -17
  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 +1034 -198
  475. package/src/common/line-format.ts +249 -0
  476. package/src/common/lists.ts +6 -1
  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 +477 -88
  487. package/src/common/zip.ts +169 -7
  488. package/src/formats/csv/exporter.ts +201 -46
  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 +888 -300
  496. package/src/formats/cx/index.ts +4 -3
  497. package/src/formats/cx2/exporter.ts +61 -338
  498. package/src/formats/cx2/importer.ts +317 -86
  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 +139 -31
  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 +111 -26
  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 +320 -101
  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 +89 -41
  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 +213 -52
  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 +35 -27
  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 +11 -3
  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
@@ -17,12 +17,14 @@ import { GraphFormatError, type GraphSink } from "@graphty/graph-format";
17
17
  import { textChunks, throwIfAborted } from "../../common/input.js";
18
18
  import {
19
19
  chooseGraph,
20
+ graphChosen,
20
21
  type ImportFormatDefaults,
21
22
  reportSinkOptions,
22
23
  reportUnusedOptions,
23
24
  type ResolvedImportOptions,
24
25
  resolveImportOptions,
25
26
  } from "../../common/options.js";
27
+ import { agree, elementCount } from "../../common/plural.js";
26
28
  import { ImportReportBuilder } from "../../common/report.js";
27
29
  import { isWhitespace, tokenizeXml, xmlDeclaredEncoding, type XmlRepairs, XmlSyntaxError } from "../../common/xml.js";
28
30
  import {
@@ -45,24 +47,41 @@ import {
45
47
  type XgmmlSettings,
46
48
  } from "./emit.js";
47
49
 
48
- /** The format-specific options of the XGMML importer. */
49
- export interface XgmmlImportOptions extends GraphChoiceOptions {
50
+ /**
51
+ * The format-specific options of the XGMML importer.
52
+ * @category Built-in formats
53
+ */
54
+ export interface XgmmlImportOptions extends GraphChoiceOptions, CommonImportOptions {
50
55
  /**
51
- * Resolve an edge endpoint that is missing or names no node through Cytoscape's
52
- * `"source (interaction) target"` edge label, and fill a missing interaction from it. Default:
53
- * on for files that use the Cytoscape (`cy`) namespace, off otherwise.
56
+ * Find an edge end that is missing, or names no node, from Cytoscape's `"source (interaction)
57
+ * target"` edge label, and fill a missing interaction from it. The default is on for files that
58
+ * use Cytoscape's (`cy`) namespace, off for others.
59
+ * @defaultValue on for Cytoscape files
54
60
  */
55
61
  labelAliases?: boolean | undefined;
56
62
  /**
57
- * Decode Cytoscape's two-character `\n` and `\t` escapes in string values. Default: on for
58
- * files that use the Cytoscape namespace, off otherwise.
63
+ * Decode Cytoscape's two-character `\n` and `\t` escapes in text values. The default is on for
64
+ * files that use Cytoscape's namespace, off for others.
65
+ * @defaultValue on for Cytoscape files
59
66
  */
60
67
  cytoscapeEscapes?: boolean | undefined;
61
- /** Read an `&` not followed by `;` within 7 characters as `&` (warned per occurrence). Default false. */
68
+ /**
69
+ * Read an `&` that is not followed by `;` within 7 characters as `&`, with a warning for
70
+ * each, instead of failing on the invalid XML.
71
+ * @defaultValue false
72
+ */
62
73
  repairBareAmpersands?: boolean | undefined;
63
- /** Join two surrogate character references into one character (warned per pair). Default false. */
74
+ /**
75
+ * Join two character references that each hold half of a character (`��`) into
76
+ * that character, with a warning for each pair, instead of failing.
77
+ * @defaultValue false
78
+ */
64
79
  pairSurrogateReferences?: boolean | undefined;
65
- /** Where Cytoscape's z (a stacking order) goes: the `z` column (default) or the position. */
80
+ /**
81
+ * Where Cytoscape's `z` value (a drawing order, not a depth) goes: "column" keeps it as a node
82
+ * attribute named `z`; "position" makes it the third coordinate of the position.
83
+ * @defaultValue "column"
84
+ */
66
85
  zAs?: "column" | "position" | undefined;
67
86
  }
68
87
 
@@ -91,12 +110,6 @@ const USED_OPTIONS: ReadonlySet<keyof CommonImportOptions> = new Set<keyof Commo
91
110
  "encoding",
92
111
  ]);
93
112
 
94
- /** Bytes inspected by sniff(). */
95
- const SNIFF_BYTES = 4096;
96
-
97
- /** The head of the document kept for the DOCTYPE check. */
98
- const HEAD_CHARS = 2048;
99
-
100
113
  /** An XGMML DOCTYPE (Cytoscape's file filter tests the same). */
101
114
  const XGMML_DOCTYPE = /<!DOCTYPE\s+graph\s[^<>]*xgmml\.dtd/i;
102
115
 
@@ -105,6 +118,7 @@ const XGMML_DOCTYPE = /<!DOCTYPE\s+graph\s[^<>]*xgmml\.dtd/i;
105
118
  * @param options - the caller's options
106
119
  * @param cytoscape - whether the document uses the Cytoscape namespace
107
120
  * @returns the settings; E_UNSUPPORTED for a value of the wrong type
121
+ * @category Plugin helpers
108
122
  */
109
123
  export function resolveSettings(options: XgmmlImportOptions | undefined, cytoscape: boolean): XgmmlSettings {
110
124
  const zAs = options?.zAs ?? "column";
@@ -178,10 +192,10 @@ export async function parseXgmml(
178
192
  : undefined,
179
193
  };
180
194
  const parser = new XgmmlParser(report);
181
- const seen = { head: "", content: false };
195
+ const seen = { content: false };
182
196
  try {
183
197
  await tokenizeXml(
184
- watch(textChunks(input, report, { ...common, declaredEncoding: xmlDeclaredEncoding }), seen),
198
+ watch(textChunks(input, report, { ...common, declaredEncoding: xmlDeclaredEncoding, xml: true }), seen),
185
199
  parser,
186
200
  repairs,
187
201
  );
@@ -195,7 +209,7 @@ export async function parseXgmml(
195
209
  throw err;
196
210
  }
197
211
  const doc = parser.document();
198
- if (!doc.xgmmlNamespace && !XGMML_DOCTYPE.test(seen.head)) {
212
+ if (!doc.xgmmlNamespace && !XGMML_DOCTYPE.test(doc.doctype ?? "")) {
199
213
  report.warning(
200
214
  "validation-error",
201
215
  XGMML_ISSUE.NO_NAMESPACE,
@@ -207,22 +221,18 @@ export async function parseXgmml(
207
221
  }
208
222
 
209
223
  /**
210
- * Pass text chunks through while keeping the head and noting non-whitespace content.
224
+ * Pass text chunks through while noting non-whitespace content.
211
225
  * @param chunks - the chunks
212
- * @param seen - where the head and the content flag are kept
213
- * @param seen.head - the first characters of the document
226
+ * @param seen - where the content flag is kept
214
227
  * @param seen.content - whether non-whitespace text was seen
215
228
  * @yields the chunks unchanged
216
229
  * @returns nothing
217
230
  */
218
231
  async function* watch(
219
232
  chunks: AsyncIterable<string>,
220
- seen: { head: string; content: boolean },
233
+ seen: { content: boolean },
221
234
  ): AsyncGenerator<string, void, undefined> {
222
235
  for await (const chunk of chunks) {
223
- if (seen.head.length < HEAD_CHARS) {
224
- seen.head += chunk.slice(0, HEAD_CHARS - seen.head.length);
225
- }
226
236
  seen.content ||= !isWhitespace(chunk);
227
237
  yield chunk;
228
238
  }
@@ -313,7 +323,7 @@ function reportRootOnly(prepared: Prepared): void {
313
323
  prepared.report.warning(
314
324
  "unsupported",
315
325
  XGMML_ISSUE.ROOT_ONLY_ELEMENTS,
316
- `${nodes} node(s) and ${edges} edge(s) belong to no registered network (group meta-edges, collapsed group members) and were not read`,
326
+ `${elementCount(nodes, edges)} ${agree(nodes + edges, "belongs", "belong")} to none of the file's networks (group meta-edges or collapsed group members) and ${agree(nodes + edges, "was", "were")} not read`,
317
327
  );
318
328
  }
319
329
  }
@@ -336,11 +346,11 @@ async function importXgmml(
336
346
  options,
337
347
  prepared.report,
338
348
  );
339
- if (prepared.graphs.length > 1) {
349
+ if (prepared.graphs.length > 1 && !graphChosen(options)) {
340
350
  prepared.report.warning(
341
351
  "unsupported",
342
352
  XGMML_ISSUE.MULTIPLE_GRAPHS,
343
- `the session network document holds ${prepared.graphs.length} registered networks; ${prepared.graphs.length - 1} were not read (use importAll, graphIndex or graphName)`,
353
+ `the session network document holds ${prepared.graphs.length} registered networks; only the first is read (importAllGraphs() reads every one; graphIndex or graphName chooses one)`,
344
354
  );
345
355
  }
346
356
  return emitOne(prepared, prepared.graphs[index], sink);
@@ -359,12 +369,13 @@ async function importAllXgmml(
359
369
  sinkFor: (index: number) => GraphSink,
360
370
  options?: XgmmlImportOptions & CommonImportOptions,
361
371
  ): Promise<ImportReport[]> {
362
- const bytes = await reread(input);
363
- const first = await prepare(bytes, null, options);
372
+ const first = await prepare(input, null, options);
373
+ // the document is read once; every graph's report starts from what reading it recorded
374
+ const parsed = first.report.fork();
364
375
  const reports: ImportReport[] = [];
365
376
  for (let i = 0; i < first.graphs.length; i++) {
366
377
  const sink = sinkFor(i);
367
- const prepared = i === 0 ? first : await prepare(bytes, null, options);
378
+ const prepared = i === 0 ? first : { ...first, report: parsed.fork() };
368
379
  reportSinkOptions(sink, options, prepared.report, true);
369
380
  reportUnusedOptions(options, prepared.report, USED_OPTIONS);
370
381
  reports.push(emitOne(prepared, prepared.graphs[i], sink));
@@ -404,57 +415,6 @@ function graphName(graph: GraphRec, doc: XgmmlDocument): string | null {
404
415
  return graph.label ?? (graph === doc.root ? (doc.rdf.title ?? null) : null) ?? graph.id ?? null;
405
416
  }
406
417
 
407
- /**
408
- * The input in a form that can be read more than once (a stream is read into bytes).
409
- * @param input - the input
410
- * @returns the same input when it is a string or bytes, else the collected bytes
411
- */
412
- async function reread(input: ImportInput): Promise<string | Uint8Array> {
413
- if (typeof input === "string" || input instanceof Uint8Array) {
414
- return input;
415
- }
416
- const parts: (string | Uint8Array)[] = [];
417
- const iterable: AsyncIterable<string | Uint8Array> =
418
- typeof (input as { getReader?: unknown }).getReader === "function"
419
- ? streamIterable(input as ReadableStream<Uint8Array>)
420
- : (input as AsyncIterable<string | Uint8Array>);
421
- for await (const chunk of iterable) {
422
- parts.push(chunk);
423
- }
424
- if (parts.every((p) => typeof p === "string")) {
425
- return parts.join("");
426
- }
427
- const bytes = parts.map((p) => (typeof p === "string" ? new TextEncoder().encode(p) : p));
428
- const out = new Uint8Array(bytes.reduce((n, b) => n + b.byteLength, 0));
429
- let at = 0;
430
- for (const b of bytes) {
431
- out.set(b, at);
432
- at += b.byteLength;
433
- }
434
- return out;
435
- }
436
-
437
- /**
438
- * A ReadableStream as an async iterable.
439
- * @param stream - the stream
440
- * @yields its chunks
441
- * @returns nothing
442
- */
443
- async function* streamIterable(stream: ReadableStream<Uint8Array>): AsyncGenerator<Uint8Array, void, undefined> {
444
- const reader = stream.getReader();
445
- try {
446
- for (;;) {
447
- const { done, value } = await reader.read();
448
- if (done) {
449
- return;
450
- }
451
- yield value;
452
- }
453
- } finally {
454
- reader.releaseLock();
455
- }
456
- }
457
-
458
418
  /**
459
419
  * Confidence that a head of bytes is XGMML: 0.95 for a root `graph` in the XGMML namespace or an
460
420
  * XGMML DOCTYPE (Cytoscape's file filter tests the same two things, and a session view file still
@@ -463,14 +423,22 @@ async function* streamIterable(stream: ReadableStream<Uint8Array>): AsyncGenerat
463
423
  * @returns the confidence
464
424
  */
465
425
  function sniffXgmml(head: Uint8Array): number {
466
- const text = new TextDecoder("utf-8", { fatal: false }).decode(head.subarray(0, SNIFF_BYTES));
426
+ let encoding = "utf-8";
427
+ if ((head[0] === 0xff && head[1] === 0xfe) || (head[0] === 0x3c && head[1] === 0 && head[2] === 0x3f)) {
428
+ encoding = "utf-16le";
429
+ } else if ((head[0] === 0xfe && head[1] === 0xff) || (head[0] === 0 && head[1] === 0x3c && head[2] === 0)) {
430
+ encoding = "utf-16be";
431
+ }
432
+ const text = new TextDecoder(encoding, { fatal: false }).decode(head);
467
433
  if (!/^\uFEFF?\s*</.test(text)) {
468
434
  return 0;
469
435
  }
470
436
  if (XGMML_DOCTYPE.test(text)) {
471
437
  return 0.95;
472
438
  }
473
- const root = /<(?!\?|!)([A-Za-z_][\w.-]*:)?([A-Za-z_][\w.-]*)[\s/>]/.exec(text.replace(/<!--[\s\S]*?-->/g, ""));
439
+ const root = /<(?![?!])([A-Za-z_][\w.-]*:)?([A-Za-z_][\w.-]*)[\s/>]/.exec(
440
+ text.replaceAll(/<!--[\s\S]*?(-->|$)/g, ""),
441
+ );
474
442
  if (root === null || root[2] !== "graph") {
475
443
  return 0;
476
444
  }
@@ -479,9 +447,19 @@ function sniffXgmml(head: Uint8Array): number {
479
447
  return tag.includes("http://www.cs.rpi.edu/XGMML") ? 0.95 : 0.5;
480
448
  }
481
449
 
482
- /** The XGMML importer. */
450
+ /**
451
+ * The XGMML importer.
452
+ * @category Built-in formats
453
+ */
483
454
  export const xgmmlImporter: GraphImporter<XgmmlImportOptions> = Object.freeze({
484
455
  format: FORMAT,
456
+ options: Object.freeze([
457
+ "cytoscapeEscapes",
458
+ "labelAliases",
459
+ "pairSurrogateReferences",
460
+ "repairBareAmpersands",
461
+ "zAs",
462
+ ]),
485
463
  extensions: EXTENSIONS,
486
464
  mimeTypes: MIME_TYPES,
487
465
  sniff: sniffXgmml,
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * The `@graphty/graph-io/xgmml` subpath: the XGMML importer and exporter, their option types and
3
3
  * their issue and loss-note code tables.
4
+ * @module @graphty/graph-io/xgmml
4
5
  */
5
6
 
6
7
  export { XGMML_ISSUE, XGMML_LOSS } from "./constants.js";
@@ -7,7 +7,10 @@
7
7
 
8
8
  import { type AttRec } from "./document.js";
9
9
 
10
- /** The scalar kinds of a column, in widening order (string beats everything). */
10
+ /**
11
+ * The scalar kinds of a column, in widening order (string beats everything).
12
+ * @category Plugin helpers
13
+ */
11
14
  export type ScalarKind = "bool" | "int" | "long" | "real" | "string";
12
15
 
13
16
  /** What one att declares. */
@@ -49,6 +52,7 @@ const XGMML_TYPES: Readonly<Record<string, DeclaredKind>> = {
49
52
  * whose name ends in `.SUID` is a long (Cytoscape keeps SUID references as Long).
50
53
  * @param att - the att
51
54
  * @returns the declared kind
55
+ * @category Plugin helpers
52
56
  */
53
57
  export function attType(att: AttRec): AttType {
54
58
  let kind: DeclaredKind | undefined;
@@ -77,6 +81,7 @@ export function attType(att: AttRec): AttType {
77
81
  * The scalar kind a list element type names (`cy:elementType`), or null when it names none.
78
82
  * @param text - the element type text
79
83
  * @returns the kind, or null
84
+ * @category Plugin helpers
80
85
  */
81
86
  export function elementKind(text: string | null): ScalarKind | null {
82
87
  if (text === null) {
@@ -92,6 +97,7 @@ export function elementKind(text: string | null): ScalarKind | null {
92
97
  * @param a - one kind
93
98
  * @param b - the other
94
99
  * @returns the kind both fit
100
+ * @category Plugin helpers
95
101
  */
96
102
  export function widenScalar(a: ScalarKind, b: ScalarKind): ScalarKind {
97
103
  if (a === b) {
@@ -109,7 +115,8 @@ export function widenScalar(a: ScalarKind, b: ScalarKind): ScalarKind {
109
115
  const INTEGER_TEXT = /^[+-]?[0-9]+$/;
110
116
 
111
117
  /** Java's Double.valueOf forms that Cytoscape writes: no hex, no `d` / `f` suffix. */
112
- const REAL_TEXT = /^[+-]?(NaN|Infinity|([0-9]+\.?[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?)$/;
118
+ const REAL_TEXT = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/;
119
+ const NON_FINITE_TEXT = /^[+-]?(?:NaN|Infinity)$/;
113
120
 
114
121
  const I32_MIN = -2147483648;
115
122
  const I32_MAX = 2147483647;
@@ -129,6 +136,7 @@ interface ParsedScalar {
129
136
  * @param kind - the declared kind
130
137
  * @param unescape - decode Cytoscape's two-character `\n` and `\t` in strings
131
138
  * @returns the value, or null when the text does not parse as the kind
139
+ * @category Plugin helpers
132
140
  */
133
141
  export function parseScalar(text: string, kind: ScalarKind, unescape: boolean): ParsedScalar | null {
134
142
  switch (kind) {
@@ -158,7 +166,7 @@ export function parseScalar(text: string, kind: ScalarKind, unescape: boolean):
158
166
  }
159
167
  case "real": {
160
168
  const t = text.trim();
161
- if (!REAL_TEXT.test(t)) {
169
+ if (!REAL_TEXT.test(t) && !NON_FINITE_TEXT.test(t)) {
162
170
  return null;
163
171
  }
164
172
  const n = Number(t);
package/src/index.ts CHANGED
@@ -1,13 +1,35 @@
1
1
  /**
2
- * The public barrel of @graphty/graph-io (design sections 8.2, 12.4 and 13.1): the io contract
3
- * types and ImportError, the registry with `importGraph()` / `exportGraph()` / `sniff()`, the
4
- * `children` CSR helper, every built-in importer and exporter (also reachable through the per-format
5
- * subpath exports `@graphty/graph-io/<format>`), and the shared helpers a third-party importer or
6
- * exporter builds on (report builder, input reader, option resolution, direction resolver, id
7
- * coercion, the capability check and the loss / issue codes callers branch on). Named exports
8
- * only; no default export.
2
+ * Read and write graph files as `@graphty/graph-format` snapshots.
3
+ *
4
+ * Most programs need eight functions: `loadFromUrl()`, `loadFromFile()` and `importGraph()` to read
5
+ * a graph; `exportGraphToBytes()`, `exportGraphToString()`, `exportGraphToBlob()` and
6
+ * `downloadGraph()` to write one; and `checkExport()` to see what a format would not keep. They are
7
+ * under Loading and Saving. Each format's importer, exporter, options and codes are in its own
8
+ * module, `@graphty/graph-io/<format>`, and are also exported here. Writing a format and Plugin
9
+ * helpers are for adding a format of your own. The guide is at https://graphty.app/docs/graph-io/.
10
+ * @module @graphty/graph-io
9
11
  */
10
12
 
13
+ // ============================================================ graph-format re-exports
14
+ // The error class every deliberate graph-io failure extends, the graph type every function takes
15
+ // or returns, the column type its attribute tables hold, the builder that copies or combines graphs,
16
+ // the graph an importer fills, and the "no such index" value a plugin compares with, so a caller
17
+ // needs no second import.
18
+ export {
19
+ type Column,
20
+ GraphBuilder,
21
+ GraphFormatError,
22
+ type GraphSink,
23
+ type GraphSnapshot,
24
+ INVALID_INDEX,
25
+ } from "@graphty/graph-format";
26
+
27
+ // ============================================================ a line format in one function
28
+ export { defineLineFormat, type LineAttributes, type LineFormat, type LineGraph } from "./common/line-format.js";
29
+
30
+ // ============================================================ testing a plugin
31
+ export { type CompareOptions, compareSnapshots, describeDiffs, type SnapshotDiff } from "./common/compare.js";
32
+
11
33
  // ============================================================ io contract types (12.4)
12
34
  export {
13
35
  type CommonExportOptions,
@@ -38,21 +60,32 @@ export {
38
60
  type BuilderSeed,
39
61
  checkExport,
40
62
  createRegistry,
63
+ downloadGraph,
64
+ type DownloadGraphOptions,
41
65
  exportGraph,
42
66
  type ExportGraphOptions,
67
+ exportGraphToBlob,
68
+ exportGraphToBytes,
43
69
  exportGraphToString,
70
+ type FormatInfo,
44
71
  FormatRegistry,
45
72
  importAllGraphs,
46
73
  importGraph,
47
74
  type ImportGraphOptions,
48
75
  type ImportGraphResult,
76
+ listFormats,
49
77
  listGraphs,
78
+ loadFromFile,
79
+ loadFromUrl,
80
+ type LoadFromUrlOptions,
50
81
  registry,
51
82
  sniff,
83
+ SNIFF_FAILED_CODE,
52
84
  UNKNOWN_FORMAT_CODE,
53
85
  } from "./registry.js";
54
86
  export {
55
87
  extensionOf,
88
+ type FormatName,
56
89
  GRAPH_FORMATS,
57
90
  type GraphFormatName,
58
91
  headBytes,
@@ -76,7 +109,15 @@ export {
76
109
  csvImporter,
77
110
  type CsvImportOptions,
78
111
  } from "./formats/csv/index.js";
79
- export { CX_ISSUE, cxImporter, type CxImportOptions } from "./formats/cx/index.js";
112
+ export {
113
+ CX_CAPABILITIES,
114
+ CX_ISSUE,
115
+ CX_LOSS,
116
+ cxExporter,
117
+ type CxExportOptions,
118
+ cxImporter,
119
+ type CxImportOptions,
120
+ } from "./formats/cx/index.js";
80
121
  export {
81
122
  CX2_CAPABILITIES,
82
123
  CX2_ISSUE,
@@ -86,7 +127,15 @@ export {
86
127
  cx2Importer,
87
128
  type Cx2ImportOptions,
88
129
  } from "./formats/cx2/index.js";
89
- export { CYS_ISSUE, cysImporter, type CysImportOptions } from "./formats/cys/index.js";
130
+ export {
131
+ CYS_CAPABILITIES,
132
+ CYS_ISSUE,
133
+ CYS_LOSS,
134
+ cysExporter,
135
+ type CysExportOptions,
136
+ cysImporter,
137
+ type CysImportOptions,
138
+ } from "./formats/cys/index.js";
90
139
  export {
91
140
  DOT_ISSUE,
92
141
  DOT_LOSS,
@@ -134,8 +183,10 @@ export {
134
183
  jsonImporter,
135
184
  type JsonImportOptions,
136
185
  type JsonShapeMeta,
186
+ jsonShapeOf,
137
187
  } from "./formats/json/index.js";
138
188
  export {
189
+ exportNeo4jFiles,
139
190
  ID_SPACE_COLUMN,
140
191
  LABELS_COLUMN,
141
192
  NEO4J_CAPABILITIES,
@@ -143,12 +194,21 @@ export {
143
194
  NEO4J_LOSS,
144
195
  neo4jExporter,
145
196
  type Neo4jExportOptions,
197
+ type Neo4jFile,
146
198
  neo4jImporter,
147
199
  type Neo4jImportOptions,
148
200
  ORIGINAL_ID_COLUMN,
149
201
  TYPE_COLUMN,
150
202
  } from "./formats/neo4j/index.js";
151
- export { OBO_ISSUE, oboImporter, type OboImportOptions } from "./formats/obo/index.js";
203
+ export {
204
+ OBO_CAPABILITIES,
205
+ OBO_ISSUE,
206
+ OBO_LOSS,
207
+ oboExporter,
208
+ type OboExportOptions,
209
+ oboImporter,
210
+ type OboImportOptions,
211
+ } from "./formats/obo/index.js";
152
212
  export {
153
213
  PAJEK_ISSUE,
154
214
  PAJEK_LOSS,
@@ -202,6 +262,7 @@ export {
202
262
  LOSS,
203
263
  mangleNmtoken,
204
264
  NO_CAPABILITIES,
265
+ refusedSave,
205
266
  type SanitizedIds,
206
267
  sanitizeIds,
207
268
  } from "./common/export.js";
@@ -228,6 +289,8 @@ export {
228
289
  export {
229
290
  chooseGraph,
230
291
  DEFAULT_ERROR_LIMIT,
292
+ forDecodedText,
293
+ graphChosen,
231
294
  type ImportFormatDefaults,
232
295
  reportSinkOptions,
233
296
  reportUnusedOptions,
@@ -252,7 +315,13 @@ export {
252
315
  type TextDtype,
253
316
  WIDENING_UNSUPPORTED_CODE,
254
317
  } from "./common/text.js";
255
- export { type ExplicitWeights, explicitWeights, isWeightField, parseWeightText } from "./common/weights.js";
318
+ export {
319
+ edgeWeights,
320
+ type ExplicitWeights,
321
+ explicitWeights,
322
+ isWeightField,
323
+ parseWeightText,
324
+ } from "./common/weights.js";
256
325
  export {
257
326
  collectBytes,
258
327
  decodeChunks,
@@ -267,6 +336,7 @@ export {
267
336
  tokenizeXml,
268
337
  type XmlHandler,
269
338
  xmlIllegalTextNotes,
339
+ type XmlRepairs,
270
340
  XmlSyntaxError,
271
341
  XmlTokenizer,
272
342
  } from "./common/xml.js";