@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
@@ -1,22 +1,30 @@
1
1
  /**
2
2
  * What the GraphML importer and exporter share: the namespace, the format facts, the reserved
3
- * column names of the XML-attribute-derived columns (design section 5.6), the `meta.extra`
3
+ * column names of the XML-attribute-derived columns, the `meta.extra`
4
4
  * keys the importer records for the exporter, and the issue and loss codes.
5
5
  */
6
6
 
7
7
  import {
8
8
  BAD_DEFAULT_CODE,
9
9
  COLUMN_RENAMED_CODE,
10
+ COLUMN_TYPE_CODE,
10
11
  COUNT_HINT_CODE,
12
+ COUNT_MISMATCH_CODE,
13
+ DANGLING_REFERENCE_CODE,
11
14
  DIRECTION_FORCED_CODE,
12
15
  DIRECTION_REFUSED_CODE,
16
+ DUPLICATE_ATTRIBUTE_CODE,
13
17
  DUPLICATE_EDGE_ID_CODE,
14
18
  DUPLICATE_KEY_CODE,
15
19
  DUPLICATE_NODE_CODE,
20
+ ELEMENT_ISSUE,
21
+ EMPTY_INPUT_CODE,
22
+ ENCODING_CONFLICT_CODE,
16
23
  ENCODING_FALLBACK_CODE,
17
24
  HYPEREDGE_CODE,
18
25
  ID_MERGED_CODE,
19
26
  ID_TEXT_TYPE_CODE,
27
+ INPUT_ISSUE,
20
28
  INVALID_ENCODING_CODE,
21
29
  INVALID_UTF8_CODE,
22
30
  MISSING_ENDPOINT_CODE,
@@ -35,69 +43,128 @@ import {
35
43
  UNKNOWN_ATTR_TYPE_CODE,
36
44
  UNKNOWN_ELEMENT_CODE,
37
45
  UNKNOWN_ENCODING_CODE,
46
+ UNKNOWN_PARENT_CODE,
47
+ UNKNOWN_XML_ATTRIBUTE_CODE,
38
48
  XML_SYNTAX_CODE,
39
49
  } from "../../common/codes.js";
40
50
 
41
- /** The GraphML namespace. */
51
+ /**
52
+ * The GraphML namespace.
53
+ * @category Plugin helpers
54
+ */
42
55
  export const GRAPHML_NAMESPACE = "http://graphml.graphdrawing.org/xmlns";
43
56
 
44
- /** The yFiles extension namespace, declared as `xmlns:y` when a yfiles column is written. */
57
+ /**
58
+ * The yFiles extension namespace, declared as `xmlns:y` when a yfiles column is written.
59
+ * @category Plugin helpers
60
+ */
45
61
  export const YFILES_NAMESPACE = "http://www.yworks.com/xml/graphml";
46
62
 
47
- /** The XML Schema instance namespace and the schema location the exporter writes. */
63
+ /**
64
+ * The XML Schema instance namespace and the schema location the exporter writes.
65
+ * @category Plugin helpers
66
+ */
48
67
  export const XSI_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance";
49
68
 
50
- /** The GraphML schema location written by the exporter. */
69
+ /**
70
+ * The GraphML schema location written by the exporter.
71
+ * @category Plugin helpers
72
+ */
51
73
  export const SCHEMA_LOCATION =
52
74
  "http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd";
53
75
 
54
- /** The format name. */
76
+ /**
77
+ * The format name.
78
+ * @category Plugin helpers
79
+ */
55
80
  export const FORMAT = "graphml";
56
81
 
57
- /** File extensions. */
82
+ /**
83
+ * File extensions.
84
+ * @category Plugin helpers
85
+ */
58
86
  export const EXTENSIONS: readonly string[] = Object.freeze([".graphml", ".xml"]);
59
87
 
60
- /** MIME types. */
88
+ /**
89
+ * MIME types.
90
+ * @category Plugin helpers
91
+ */
61
92
  export const MIME_TYPES: readonly string[] = Object.freeze(["application/graphml+xml", "application/xml", "text/xml"]);
62
93
 
63
- /** The `attr.name` of the node key that carries ids rewritten by `sanitizeIds: "mangle"` (design section 8.5). */
94
+ /**
95
+ * The `attr.name` of the node key that carries ids rewritten by `sanitizeIds: "mangle"`.
96
+ * @category Plugin helpers
97
+ */
64
98
  export const ORIGINAL_ID_ATTRIBUTE = "graphty:originalId";
65
99
 
66
- /** The node column that keeps original ids when `restoreMangledIds` is off (design section 5.6). */
100
+ /**
101
+ * The node column that keeps original ids when `restoreMangledIds` is off.
102
+ * @category Plugin helpers
103
+ */
67
104
  export const ORIGINAL_ID_COLUMN = "graphty.originalId";
68
105
 
69
- /** The edge column of the `id` XML attribute (role id, unique). */
106
+ /**
107
+ * The edge column of the `id` XML attribute (role id, unique).
108
+ * @category Plugin helpers
109
+ */
70
110
  export const EDGE_ID_COLUMN = "id";
71
111
 
72
- /** The edge columns of the `sourceport` / `targetport` XML attributes (roles sourcePort / targetPort). */
112
+ /**
113
+ * The edge columns of the `sourceport` / `targetport` XML attributes (roles sourcePort / targetPort).
114
+ * @category Plugin helpers
115
+ */
73
116
  export const SOURCE_PORT_COLUMN = "sourceport";
74
117
 
75
- /** The edge column of the `targetport` XML attribute. */
118
+ /**
119
+ * The edge column of the `targetport` XML attribute.
120
+ * @category Plugin helpers
121
+ */
76
122
  export const TARGET_PORT_COLUMN = "targetport";
77
123
 
78
- /** The node column of the containing node of a nested graph (u32, role parent, refersTo node). */
124
+ /**
125
+ * The node column of the containing node of a nested graph (u32, role parent, refersTo node).
126
+ * @category Plugin helpers
127
+ */
79
128
  export const PARENT_COLUMN = "parent";
80
129
 
81
- /** The bool node column marking the hub nodes synthesised for hyperedges under `hyperedges: "star"`. */
130
+ /**
131
+ * The bool node column marking the hub nodes synthesized for hyperedges under `hyperedges: "star"`.
132
+ * @category Plugin helpers
133
+ */
82
134
  export const HYPEREDGE_HUB_COLUMN = "graphty.hyperedge";
83
135
 
84
- /** The column name a node key titled `label` receives the `label` role under. */
136
+ /**
137
+ * The column name a node key titled `label` receives the `label` role under.
138
+ * @category Plugin helpers
139
+ */
85
140
  export const LABEL_COLUMN = "label";
86
141
 
87
- /** Edge column names reserved for the XML-attribute-derived columns; a key titled like one is renamed `<name>#<id>`. */
142
+ /**
143
+ * Edge column names reserved for the XML-attribute-derived columns; a key titled like one is renamed `<name>#<id>`.
144
+ * @category Plugin helpers
145
+ */
88
146
  export const RESERVED_EDGE_NAMES: ReadonlySet<string> = new Set([
89
147
  EDGE_ID_COLUMN,
90
148
  SOURCE_PORT_COLUMN,
91
149
  TARGET_PORT_COLUMN,
92
150
  ]);
93
151
 
94
- /** Node column names reserved for the XML-derived columns. */
152
+ /**
153
+ * Node column names reserved for the XML-derived columns.
154
+ * @category Plugin helpers
155
+ */
95
156
  export const RESERVED_NODE_NAMES: ReadonlySet<string> = new Set([PARENT_COLUMN]);
96
157
 
97
- /** The `meta.extra` key under which the importer records what the exporter needs. */
158
+ /**
159
+ * The `meta.extra` key under which the importer records what the exporter needs.
160
+ * @category Plugin helpers
161
+ */
98
162
  export const META_KEY = "graphml";
99
163
 
100
- /** What the importer stores under `meta.extra.graphml`. */
164
+ /**
165
+ * What the importer stores under `meta.extra.graphml`.
166
+ * @category Plugin helpers
167
+ */
101
168
  export interface GraphmlMeta {
102
169
  /** The top-level `<graph id>`, or null. */
103
170
  readonly graphId: string | null;
@@ -108,24 +175,41 @@ export interface GraphmlMeta {
108
175
  }
109
176
 
110
177
  /**
111
- * The issue codes the GraphML importer records (design section 8.6), by name: the codes shared
112
- * with the other importers (src/common/codes.ts) and the GraphML-specific ones. A key is the code
178
+ * The issue codes the GraphML importer records, by name: the codes shared
179
+ * with the other importers and the GraphML-specific ones. A key is the code
113
180
  * without its severity and format prefixes.
181
+ * @category Built-in formats
114
182
  */
115
183
  export const GRAPHML_ISSUE = Object.freeze({
116
- /** Fatal: the input is not well-formed XML. */
184
+ ...INPUT_ISSUE,
185
+ ...ELEMENT_ISSUE,
186
+ /**
187
+ * A value that does not parse as the type its attribute declares ("x" in an integer attribute). The value is
188
+ * left unset; the node or edge is kept.
189
+ */
190
+ COLUMN_TYPE: COLUMN_TYPE_CODE,
191
+ /** The input is not well-formed XML. The import stops. */
117
192
  XML_SYNTAX: XML_SYNTAX_CODE,
118
- /** Fatal: the input holds invalid UTF-8. */
193
+ /** The input is not valid UTF-8. The import stops. */
119
194
  INVALID_UTF8: INVALID_UTF8_CODE,
120
- /** Invalid bytes in the encoding a BOM, a declaration or the encoding option chose (fatal). */
195
+ /**
196
+ * Some bytes are not valid in the encoding that was chosen (by a byte order mark, the file's declaration or the
197
+ * `encoding` option). The import stops.
198
+ */
121
199
  INVALID_ENCODING: INVALID_ENCODING_CODE,
122
200
  /** Bytes that are not UTF-8 and declare no encoding were read as windows-1252. */
123
201
  ENCODING_FALLBACK: ENCODING_FALLBACK_CODE,
124
202
  /** A declared encoding the platform cannot decode was ignored. */
125
203
  UNKNOWN_ENCODING: UNKNOWN_ENCODING_CODE,
126
- /** Fatal: the root element is not `<graphml>`. */
204
+ /** A declared encoding the byte order mark contradicts (the mark wins). */
205
+ ENCODING_CONFLICT: ENCODING_CONFLICT_CODE,
206
+ /** The input holds no XML at all: it is empty, whitespace or a byte order mark only. The import stops. */
207
+ EMPTY_INPUT: EMPTY_INPUT_CODE,
208
+ /** The root element is not `<graphml>`. The import stops. */
127
209
  NOT_GRAPHML: "E_NOT_GRAPHML",
128
- /** Fatal: the document has no `<graph>`. */
210
+ /** The `<graphml>` root is in a namespace other than GraphML's; it is read as GraphML. */
211
+ NAMESPACE: "W_GRAPHML_NAMESPACE",
212
+ /** The document has no `<graph>`. The import stops. */
129
213
  NO_GRAPH: NO_GRAPH_CODE,
130
214
  /** A `<key>` without an id. */
131
215
  KEY_MISSING_ID: "E_GRAPHML_KEY_MISSING_ID",
@@ -137,8 +221,18 @@ export const GRAPHML_ISSUE = Object.freeze({
137
221
  MISSING_ID: MISSING_ID_CODE,
138
222
  /** An `<edge>` without a source or a target. */
139
223
  MISSING_ENDPOINT: MISSING_ENDPOINT_CODE,
224
+ /** An edge endpoint that names no declared node under `addMissingNodes: false`; the edge is skipped. */
225
+ UNKNOWN_NODE: "E_UNKNOWN_NODE",
226
+ /** An edge endpoint that names a nested `<graph>`, not a node; a node of that id is created. */
227
+ GRAPH_ENDPOINT: "W_GRAPHML_GRAPH_ENDPOINT",
228
+ /** The nodes of a nested graph whose container node was skipped lose their parent. */
229
+ UNKNOWN_PARENT: UNKNOWN_PARENT_CODE,
230
+ /** Two `<data>` of one key on one element, two `<default>` in one key, or two weight keys; one is kept. */
231
+ DUPLICATE_ATTRIBUTE: DUPLICATE_ATTRIBUTE_CODE,
140
232
  /** A `<data>` whose key was never declared. */
141
233
  UNKNOWN_KEY: "E_GRAPHML_UNKNOWN_KEY",
234
+ /** A `<key>` declared after `<data>` that used it; those values were already reported and dropped. */
235
+ KEY_DECLARED_LATE: "W_GRAPHML_KEY_DECLARED_LATE",
142
236
  /** A `<data>` whose key is declared for another domain. */
143
237
  KEY_DOMAIN: "W_GRAPHML_KEY_DOMAIN",
144
238
  /** A `<data>` without a key attribute. */
@@ -161,10 +255,20 @@ export const GRAPHML_ISSUE = Object.freeze({
161
255
  INVALID_EDGEDEFAULT: "E_GRAPHML_INVALID_EDGEDEFAULT",
162
256
  /** A `<graph>` without edgedefault; the `defaultDirected` option applies. */
163
257
  EDGEDEFAULT_MISSING: "W_GRAPHML_EDGEDEFAULT_MISSING",
164
- /** A second top-level `<graph>`; its nodes and edges are merged into the first. */
258
+ /**
259
+ * The file holds more than one top-level `<graph>`; their nodes and edges are merged into one graph.
260
+ * `importAllGraphs()` reads every one.
261
+ */
165
262
  MULTIPLE_GRAPHS: MULTIPLE_GRAPHS_CODE,
166
- /** A `parse.nodes` / `parse.edges` hint the sink cannot reserve (ignored). */
263
+ /**
264
+ * A node or edge count the file announces is too large to reserve room for; it is ignored and the elements are
265
+ * read as they come.
266
+ */
167
267
  COUNT_HINT: COUNT_HINT_CODE,
268
+ /**
269
+ * A `parse.nodes` or `parse.edges` count disagrees with what the graph holds. The elements are read as they are.
270
+ */
271
+ COUNT_MISMATCH: COUNT_MISMATCH_CODE,
168
272
  /** A hyperedge under `hyperedges: "error"`. */
169
273
  HYPEREDGE: HYPEREDGE_CODE,
170
274
  /** Hyperedges skipped under `hyperedges: "skip"`. */
@@ -173,10 +277,23 @@ export const GRAPHML_ISSUE = Object.freeze({
173
277
  HYPEREDGE_ENDPOINT: "E_GRAPHML_HYPEREDGE_ENDPOINT",
174
278
  /** `<port>` declarations (and their data) are not kept; sourceport / targetport edge attributes are. */
175
279
  PORT_DECLARATION: "W_GRAPHML_PORT_DECLARATION",
176
- /** A GraphML `parse.*` hint on `<graph>`, `<node>` or `<edge>` the importer does not act on (parse.nodeids, parse.order, ...). */
280
+ /** A `sourceport` / `targetport` naming a port its node does not declare (once, with the count). */
281
+ DANGLING_REFERENCE: DANGLING_REFERENCE_CODE,
282
+ /** A `<graph>` inside an `<edge>` (legal GraphML): it and the nodes and edges it holds are dropped. */
283
+ EDGE_GRAPH_DROPPED: "W_GRAPHML_EDGE_GRAPH_DROPPED",
284
+ /** A `<node>` whose id is that of a hub `hyperedges: "star"` created; the node is merged into the hub. */
285
+ HUB_ID_CLASH: "W_GRAPHML_HUB_ID_CLASH",
286
+ /** A `graphty:originalId` value that is not text, or arrives after the node was added (after its nested graph). */
287
+ ORIGINAL_ID_IGNORED: "W_GRAPHML_ORIGINAL_ID_IGNORED",
288
+ /** A yFiles graphics value (a geometry coordinate, a width) that is not a number; it is not mapped. */
289
+ YFILES_VALUE: "W_GRAPHML_YFILES_VALUE",
290
+ /**
291
+ * A GraphML `parse.*` attribute (`parse.nodeids`, `parse.order`, ...) that graph-io does not act on; the file is
292
+ * read normally.
293
+ */
177
294
  PARSE_HINT_IGNORED: "W_GRAPHML_PARSE_HINT_IGNORED",
178
- /** An XML attribute GraphML does not define on `<graph>`, `<node>` or `<edge>`; it is not kept. */
179
- UNKNOWN_XML_ATTRIBUTE: "W_GRAPHML_UNKNOWN_XML_ATTRIBUTE",
295
+ /** An XML attribute GraphML does not define (or the importer does not keep) on an element; it is not kept. */
296
+ UNKNOWN_XML_ATTRIBUTE: UNKNOWN_XML_ATTRIBUTE_CODE,
180
297
  /** A `<locator>` element. */
181
298
  LOCATOR_DROPPED: "W_GRAPHML_LOCATOR_DROPPED",
182
299
  /** A `<desc>` of a node, an edge or a hyperedge. */
@@ -187,27 +304,43 @@ export const GRAPHML_ISSUE = Object.freeze({
187
304
  STRAY_TEXT: STRAY_TEXT_CODE,
188
305
  /** Two distinct id texts merged into one number under `ids: "number"`. */
189
306
  ID_MERGED: ID_MERGED_CODE,
190
- /** An option GraphML has no use for (`nodeIdFrom`: nodes are identified by their id attribute). */
307
+ /** You set an option this format does not use; it had no effect. The message names the option. */
191
308
  OPTION_IGNORED: OPTION_IGNORED_CODE,
192
309
  /** A yFiles key under `yfiles: "skip"`. */
193
310
  YFILES_SKIPPED: "W_GRAPHML_YFILES_SKIPPED",
194
- /** A key renamed `<name>#<id>` because the name was taken (design section 5.6). */
311
+ /**
312
+ * An attribute was renamed `<name>#<suffix>` because another attribute already has its name, for example
313
+ * two attributes declared with the same name.
314
+ */
195
315
  COLUMN_RENAMED: COLUMN_RENAMED_CODE,
196
- /** A key declared without its role because the table already holds it. */
316
+ /**
317
+ * You read into a graph builder that already has an id, label or position attribute, so this file's one is kept as
318
+ * a plain attribute.
319
+ */
197
320
  ROLE_TAKEN: ROLE_TAKEN_CODE,
198
321
  /** A declared type the format does not define (kept as string). */
199
322
  UNKNOWN_ATTR_TYPE: UNKNOWN_ATTR_TYPE_CODE,
200
323
  /** A default that does not parse as the declared type. */
201
324
  BAD_DEFAULT: BAD_DEFAULT_CODE,
202
- /** A long value beyond 2^53 rounded. */
325
+ /** An integer beyond 2^53 was stored as the nearest 64-bit float; pass `long: "string"` to keep every digit. */
203
326
  PRECISION: PRECISION_CODE,
204
- /** A builder-policy option the sink does not honour. */
327
+ /**
328
+ * You read into your own graph builder, which was created with a different `addMissingNodes`, `duplicateEdges`,
329
+ * `selfLoops` or `weightDtype` than the option you passed; the builder's setting applies.
330
+ */
205
331
  SINK_OPTION: SINK_OPTION_CODE,
206
- /** The sink refused the file's direction. */
332
+ /**
333
+ * You read into a graph builder whose direction is already set, or which already holds edges, so the file is read
334
+ * with the builder's direction instead of its own.
335
+ */
207
336
  DIRECTION_REFUSED: DIRECTION_REFUSED_CODE,
208
- /** Edges forced to the policy's direction. */
337
+ /** Edges of the other direction were read with the direction `onMixedDirection` chose. */
209
338
  DIRECTION_FORCED: DIRECTION_FORCED_CODE,
210
- /** A mixed file under onMixedDirection "error" (fatal). */
339
+ /**
340
+ * The graph has both directed and undirected edges and `onMixedDirection` is "error". An import stops; a save to a
341
+ * format that holds one direction per file fails with E_DIRECTED. Pass "directed" or "undirected" to read or write
342
+ * it anyway.
343
+ */
211
344
  MIXED_DIRECTION: MIXED_DIRECTION_CODE,
212
345
  });
213
346
 
@@ -215,26 +348,27 @@ export const GRAPHML_ISSUE = Object.freeze({
215
348
  * Loss note codes of the GraphML importer (report.lossy) and exporter (check()): the GraphML
216
349
  * ones; the generic ones (dtypes, lists, json text, positions, visual and temporal roles,
217
350
  * extension tables, id charsets, the weight key clash, name changes) are those of `LOSS`.
351
+ * @category Built-in formats
218
352
  */
219
353
  export const GRAPHML_LOSS = Object.freeze({
220
- /** yFiles nested XML kept as a JSON tree: structure preserved, not byte-exact. */
354
+ /** YFiles nested XML kept as a JSON tree: structure preserved, not byte-exact. */
221
355
  YFILES_JSON: "W_GRAPHML_YFILES_JSON",
222
356
  /** A mutual pair written as one undirected edge; the mark is lost. */
223
357
  MUTUAL_AS_UNDIRECTED: MUTUAL_AS_UNDIRECTED_CODE,
224
358
  /** A `parents` (multi-parent) column cannot be written as nested graphs. */
225
359
  PARENTS_DROPPED: PARENTS_DROPPED_CODE,
226
- /** A role column GraphML has no slot for (kind, node ids, ...) written as a plain attribute. */
360
+ /** An attribute with a role the format has no place for is written as a plain attribute; the role is lost. */
227
361
  ROLE_DROPPED: ROLE_DROPPED_CODE,
228
362
  /** Containment order differs from index order; node indices change after a round trip. */
229
363
  HIERARCHY_REORDERED: "W_GRAPHML_HIERARCHY_REORDERED",
230
364
  /** Nodes whose parent chain never reaches a root are written at the top level. */
231
365
  PARENT_CYCLE: "W_GRAPHML_PARENT_CYCLE",
232
- /** Node ids that change type after a round trip under the canonical rule (design section 4.1). */
366
+ /** Node ids that read back as a different type, such as the text "7" as the number 7. */
233
367
  ID_TEXT_TYPE: ID_TEXT_TYPE_CODE,
234
368
  /** A numeric edge id column reads back as string. */
235
369
  EDGE_ID_TEXT: "W_GRAPHML_EDGE_ID_TEXT",
236
370
  /** A `yfiles.*` graphics column that no longer matches its yFiles tree: only the tree is written. */
237
371
  YFILES_GRAPHICS_STALE: "W_GRAPHML_YFILES_GRAPHICS_STALE",
238
- /** A yfiles json value that is not a serialisable tree: export() will throw E_COLUMN_TYPE. */
372
+ /** A yEd graphics value that is not valid XML; the save fails with E_COLUMN_TYPE. */
239
373
  YFILES_TREE: "E_GRAPHML_YFILES_TREE",
240
374
  });
@@ -13,7 +13,7 @@
13
13
  * temporal roles, extension tables) plus the GraphML-specific ones (mutual edges written as
14
14
  * undirected, json columns without a yfiles origin written as JSON text, multi-parent columns,
15
15
  * containment order, ids that change type under the canonical rule, edge ids that read back as
16
- * strings, roles GraphML cannot express, yfiles values that are not serialisable trees).
16
+ * strings, roles GraphML cannot express, yfiles values that are not serializable trees).
17
17
  */
18
18
 
19
19
  import { type Column, GraphFormatError, type GraphSnapshot, INVALID_INDEX } from "@graphty/graph-format";
@@ -33,6 +33,7 @@ import {
33
33
  import { formatF32, formatF64, formatInteger } from "../../common/format.js";
34
34
  import { isCanonicalIntegerText } from "../../common/ids.js";
35
35
  import { type ResolvedExportOptions, resolveExportOptions } from "../../common/options.js";
36
+ import { agree, plural } from "../../common/plural.js";
36
37
  import { type ExplicitWeights, explicitWeights } from "../../common/weights.js";
37
38
  import { encodeChunks, joinText } from "../../common/writer.js";
38
39
  import { xmlIllegalTextNotes } from "../../common/xml.js";
@@ -58,14 +59,21 @@ import {
58
59
  import { treeProblem, writeXmlTree } from "./tree.js";
59
60
  import { isGraphicsColumn, staleGraphicsRows } from "./yfiles.js";
60
61
 
61
- /** The format-specific options of the GraphML exporter. */
62
- export interface GraphmlExportOptions {
63
- /** Indent nested elements (default true); false writes one element per line without indentation. */
62
+ /**
63
+ * The format-specific options of the GraphML exporter.
64
+ * @category Built-in formats
65
+ */
66
+ export interface GraphmlExportOptions extends CommonExportOptions {
67
+ /**
68
+ * Indent nested elements; false writes one element per line without indentation.
69
+ * @defaultValue true
70
+ */
64
71
  pretty?: boolean | undefined;
65
72
  /**
66
- * The top-level `edgedefault`. By default the one the importer recorded in
67
- * `meta.extra.graphml` (so a mixed file re-imports with the same edge layout), else the
68
- * snapshot's direction, with the majority direction for a mixed snapshot.
73
+ * The `edgedefault` of the graph element. The default is the one a GraphML import read, so a
74
+ * file with both directions reads back with the same edges marked, else the graph's direction
75
+ * (for a graph with both, the direction most edges have).
76
+ * @defaultValue as read
69
77
  */
70
78
  edgedefault?: "directed" | "undirected" | undefined;
71
79
  }
@@ -326,7 +334,7 @@ function planExport(snapshot: GraphSnapshot, options: ResolvedExportOptions, for
326
334
  if (idTypeChanges > 0) {
327
335
  note(
328
336
  GRAPHML_LOSS.ID_TEXT_TYPE,
329
- `${idTypeChanges} node id(s) change type when read back under ids: "canonical" (string ids that are integer text, non-integer numbers)`,
337
+ `${idTypeChanges} node id${plural(idTypeChanges)} ${agree(idTypeChanges, "changes", "change")} type when read back under ids: "canonical" (string ids that are integer text, non-integer numbers)`,
330
338
  null,
331
339
  idTypeChanges,
332
340
  );
@@ -344,7 +352,7 @@ function planExport(snapshot: GraphSnapshot, options: ResolvedExportOptions, for
344
352
  if (folding.mutualCount > 0) {
345
353
  note(
346
354
  GRAPHML_LOSS.MUTUAL_AS_UNDIRECTED,
347
- `${folding.mutualCount} mutual pair(s) are written as undirected edges; the mutual mark is lost`,
355
+ `${folding.mutualCount} mutual pair${plural(folding.mutualCount)} ${agree(folding.mutualCount, "is", "are")} written as undirected edges; the mutual mark is lost`,
348
356
  null,
349
357
  folding.mutualCount,
350
358
  );
@@ -363,7 +371,7 @@ function planExport(snapshot: GraphSnapshot, options: ResolvedExportOptions, for
363
371
  if (hierarchy.unreachable > 0) {
364
372
  note(
365
373
  GRAPHML_LOSS.PARENT_CYCLE,
366
- `${hierarchy.unreachable} node(s) whose parent chain never reaches a root are written at the top level`,
374
+ `${hierarchy.unreachable} node${plural(hierarchy.unreachable)} whose parent chain never reaches a root ${agree(hierarchy.unreachable, "is", "are")} written at the top level`,
367
375
  hierarchy.parent?.meta.name ?? null,
368
376
  hierarchy.unreachable,
369
377
  );
@@ -520,7 +528,7 @@ function planWeight(
520
528
  if (plan.attrName === attrName) {
521
529
  note(
522
530
  LOSS.WEIGHT_KEY_CLASH,
523
- `edge column "${plan.column.meta.name}" is written as a key titled "${attrName}", which the importer reads as THE weight (weightFrom); it reads back as the weight, not as a column`,
531
+ `edge column "${plan.column.meta.name}" is written as a key titled "${attrName}", which the importer reads as the edge weight (weightFrom); it reads back as the weight, not as a column`,
524
532
  plan.column.meta.name,
525
533
  plan.column.length - plan.column.nullCount,
526
534
  );
@@ -567,11 +575,16 @@ function planEdgeIds(snapshot: GraphSnapshot, column: Column, options: ResolvedE
567
575
  return;
568
576
  }
569
577
  if (options.sanitizeIds === "mangle") {
570
- note(LOSS.ID_MANGLED, `${bad} edge id(s) outside the nmtoken charset are rewritten`, column.meta.name, bad);
578
+ note(
579
+ LOSS.ID_MANGLED,
580
+ `${bad} edge id${plural(bad)} outside the nmtoken charset ${agree(bad, "is", "are")} rewritten`,
581
+ column.meta.name,
582
+ bad,
583
+ );
571
584
  } else {
572
585
  note(
573
586
  LOSS.ID_CHARSET,
574
- `${bad} edge id(s) outside the nmtoken charset; export() will throw unless sanitizeIds is "mangle"`,
587
+ `${bad} edge id${plural(bad)} outside the nmtoken charset; the save fails unless sanitizeIds is "mangle"`,
575
588
  column.meta.name,
576
589
  bad,
577
590
  );
@@ -661,7 +674,7 @@ function planTable(table: Iterable<Column>, domain: Domain, notes: LossNote[], n
661
674
  if (stale > 0) {
662
675
  note(
663
676
  GRAPHML_LOSS.YFILES_GRAPHICS_STALE,
664
- `${stale} value(s) of ${domain} column "${name}" differ from the yFiles tree it was read from; only the tree is written, so they are lost`,
677
+ `${stale} value${plural(stale)} of ${domain} column "${name}" differ from the yFiles tree it was read from; only the tree is written, so they are lost`,
665
678
  name,
666
679
  stale,
667
680
  );
@@ -707,7 +720,7 @@ function planTable(table: Iterable<Column>, domain: Domain, notes: LossNote[], n
707
720
  if (bad > 0) {
708
721
  note(
709
722
  GRAPHML_LOSS.YFILES_TREE,
710
- `${bad} value(s) of yfiles column "${name}" are not XML trees; export() will throw E_COLUMN_TYPE`,
723
+ `${bad} value${plural(bad)} of yfiles column "${name}" ${agree(bad, "is", "are")} not XML trees; the save fails with E_COLUMN_TYPE`,
711
724
  name,
712
725
  bad,
713
726
  );
@@ -819,6 +832,10 @@ function attrTypeFor(column: Column): string {
819
832
  case "u32":
820
833
  return columnMax(column) <= I32_MAX ? "int" : "long";
821
834
  case "string":
835
+ if (declared !== null && declared.trim().toLowerCase() === "long" && columnIntegerText(column)) {
836
+ // a long column read with long: "string" keeps its declared type, for other readers
837
+ return "long";
838
+ }
822
839
  if (declared !== null && TYPE_DTYPES[declared.trim().toLowerCase()] === undefined) {
823
840
  // an unknown declared type kept as text (W_UNKNOWN_ATTR_TYPE on import) is restored as declared
824
841
  return declared;
@@ -835,6 +852,21 @@ function attrTypeFor(column: Column): string {
835
852
  }
836
853
  }
837
854
 
855
+ /**
856
+ * Whether every set value of a string column is integer text, as a long column read with
857
+ * `long: "string"` holds.
858
+ * @param column - a string column
859
+ * @returns true when all set values are integer text
860
+ */
861
+ function columnIntegerText(column: Column): boolean {
862
+ for (let r = 0; r < column.length; r++) {
863
+ if (column.isSet(r) && !/^[+-]?\d+$/.test(String(column.value(r)))) {
864
+ return false;
865
+ }
866
+ }
867
+ return true;
868
+ }
869
+
838
870
  /**
839
871
  * Whether every set value of a numeric column is an integer.
840
872
  * @param column - an f64 column
@@ -888,7 +920,7 @@ function weightsIntegral(snapshot: GraphSnapshot, weights: ExplicitWeights): boo
888
920
  }
889
921
 
890
922
  /**
891
- * How many values of a yfiles column are not serialisable trees.
923
+ * How many values of a yfiles column are not serializable trees.
892
924
  * @param column - a json column
893
925
  * @returns the count
894
926
  */
@@ -1199,7 +1231,7 @@ function sanitizeEdgeIds(column: Column | null, mode: "error" | "mangle", edgeCo
1199
1231
  if (bad.length > 0 && mode === "error") {
1200
1232
  throw new GraphFormatError(
1201
1233
  "E_INVALID_ID",
1202
- `${bad.length} edge id(s) cannot be written as nmtoken (first: ${JSON.stringify(edgeIdText(column, bad[0]))} at edge ${bad[0]}); pass sanitizeIds: "mangle" to rewrite them`,
1234
+ `${bad.length} edge id${plural(bad.length)} ${agree(bad.length, "is", "are")} not XML name tokens (first: ${JSON.stringify(edgeIdText(column, bad[0]))} at edge ${bad[0]}); pass sanitizeIds: "mangle" to rewrite them`,
1203
1235
  { reason: "charset", charset: "nmtoken", count: bad.length, edge: bad[0] },
1204
1236
  );
1205
1237
  }
@@ -1439,10 +1471,12 @@ function* writeNodeSubtree(
1439
1471
  }
1440
1472
 
1441
1473
  /**
1442
- * The GraphML exporter (design section 8.5).
1474
+ * The GraphML exporter.
1475
+ * @category Built-in formats
1443
1476
  */
1444
1477
  export const graphmlExporter: GraphExporter<GraphmlExportOptions> = Object.freeze({
1445
1478
  format: FORMAT,
1479
+ options: Object.freeze(["edgedefault", "pretty"]),
1446
1480
  capabilities: CAPABILITIES,
1447
1481
  /**
1448
1482
  * Pre-flight: every loss the export would incur.