@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
@@ -8,7 +8,7 @@
8
8
  * every node block first, then every edge block, so node indices follow the file's node order
9
9
  * and forward edge references resolve.
10
10
  *
11
- * Conventions honoured: NetworkX's `_networkx_list_start` marker and `"[]"` empty lists, `&#NN;`
11
+ * Conventions honored: NetworkX's `_networkx_list_start` marker and `"[]"` empty lists, `&#NN;`
12
12
  * character references in strings, `Creator` / `Version` top-level metadata, `directed 0|1` and
13
13
  * `multigraph 0|1` graph flags, comments, keys and values on one line or split across lines, and
14
14
  * a `graphics [ x y z ]` node record mapped to the `position` role (note 07 section 9) with the
@@ -23,49 +23,129 @@
23
23
  */
24
24
  import { GraphFormatError, INVALID_INDEX, } from "@graphty/graph-format";
25
25
  import { declareResolved, DictHeuristic, uniqueColumnName } from "../../common/attributes.js";
26
- import { COLUMN_RENAMED_CODE, DUPLICATE_NODE_CODE as SHARED_DUPLICATE_NODE_CODE, MISSING_ENDPOINT_CODE as SHARED_MISSING_ENDPOINT_CODE, MISSING_ID_CODE as SHARED_MISSING_ID_CODE, MULTIPLE_GRAPHS_CODE, NO_GRAPH_CODE as SHARED_NO_GRAPH_CODE, PRECISION_CODE as SHARED_PRECISION_CODE, ROLE_TAKEN_CODE as SHARED_ROLE_TAKEN_CODE, } from "../../common/codes.js";
26
+ import { importChosenGraph } from "../../common/choose.js";
27
+ import { COLUMN_RENAMED_CODE, DUPLICATE_NODE_CODE as SHARED_DUPLICATE_NODE_CODE, MISSING_ENDPOINT_CODE as SHARED_MISSING_ENDPOINT_CODE, MISSING_ID_CODE as SHARED_MISSING_ID_CODE, MULTIPLE_GRAPHS_CODE, NO_GRAPH_CODE as SHARED_NO_GRAPH_CODE, PRECISION_CODE as SHARED_PRECISION_CODE, ROLE_TAKEN_CODE as SHARED_ROLE_TAKEN_CODE, WIDENED_CODE as SHARED_WIDENED_CODE, } from "../../common/codes.js";
27
28
  import { DirectionResolver } from "../../common/direction.js";
28
29
  import { IdCoercer } from "../../common/ids.js";
29
30
  import { readText, throwIfAborted } from "../../common/input.js";
30
- import { reportSinkOptions, reportUnusedOptions, resolveImportOptions, } from "../../common/options.js";
31
+ import { graphChosen, reportSinkOptions, reportUnusedOptions, resolveImportOptions, } from "../../common/options.js";
32
+ import { plural } from "../../common/plural.js";
31
33
  import { ImportReportBuilder } from "../../common/report.js";
32
- import { parseWeightText, weightFromValue } from "../../common/weights.js";
34
+ import { parseWeightText, reportWeightPrecision, weightFromValue } from "../../common/weights.js";
33
35
  import { EMPTY_LIST_TEXT, EMPTY_TUPLE_TEXT, GmlSyntaxError, LIST_START_MARKER, numberOfText, ORIGINAL_ID_KEY, parseRecord, scalarOrRecord, TOKEN_INT, TOKEN_OPEN, TOKEN_REAL, TOKEN_STRING, TOKEN_WORD, tokenizeGml, } from "./syntax.js";
34
- /** Issue code: the text holds no `graph [ ... ]` block. */
36
+ /**
37
+ * The text holds no `graph [ ... ]` block.
38
+ * @category Issue and loss codes
39
+ */
35
40
  export const NO_GRAPH_CODE = SHARED_NO_GRAPH_CODE;
36
- /** Issue code: the text holds more than one `graph [ ... ]` block; import() reads the first, importAll() every one. */
41
+ /**
42
+ * The text holds more than one `graph [ ... ]` block; import() reads the first, importAll() every one.
43
+ * @category Issue and loss codes
44
+ */
37
45
  export const SECOND_GRAPH_CODE = MULTIPLE_GRAPHS_CODE;
38
- /** Issue code: a node block has no `id` key. */
46
+ /**
47
+ * A node block has no `id` key.
48
+ * @category Issue and loss codes
49
+ */
39
50
  export const MISSING_ID_CODE = SHARED_MISSING_ID_CODE;
40
- /** Issue code: a node block has no `label` key under `nodeIdFrom: "label"`. */
51
+ /**
52
+ * A node block has no `label` key under `nodeIdFrom: "label"`.
53
+ * @category Issue and loss codes
54
+ */
41
55
  export const MISSING_LABEL_CODE = "E_GML_MISSING_LABEL";
42
- /** Issue code: an edge block has no `source` or no `target` key. */
56
+ /**
57
+ * An edge block has no `source` or no `target` key.
58
+ * @category Issue and loss codes
59
+ */
43
60
  export const MISSING_ENDPOINT_CODE = SHARED_MISSING_ENDPOINT_CODE;
44
- /** Issue code: an `id`, `source` or `target` value is neither an integer nor a string. */
61
+ /**
62
+ * An `id`, `source` or `target` value is neither an integer nor a string.
63
+ * @category Issue and loss codes
64
+ */
45
65
  export const ID_TYPE_CODE = "E_GML_ID_TYPE";
46
- /** Issue code: string `id`, `source` or `target` values, outside the GML spec's integer ids; warned once per file. */
66
+ /**
67
+ * Node ids, sources or targets are text, where GML expects integers. They are read under the `ids` option. Reported
68
+ * once per file.
69
+ * @category Issue and loss codes
70
+ */
47
71
  export const STRING_ID_CODE = "W_GML_STRING_ID";
48
- /** Issue code: a node id (or label under `nodeIdFrom: "label"`) is declared twice; later keys overwrite. */
72
+ /**
73
+ * A node id (or label under `nodeIdFrom: "label"`) is declared twice; later keys overwrite.
74
+ * @category Issue and loss codes
75
+ */
49
76
  export const DUPLICATE_NODE_CODE = SHARED_DUPLICATE_NODE_CODE;
50
- /** Issue code: a structural key (`id`, `source`, `target`) appears twice in one block. */
77
+ /**
78
+ * A structural key (`id`, `source`, `target`) appears twice in one block.
79
+ * @category Issue and loss codes
80
+ */
51
81
  export const REPEATED_KEY_CODE = "E_GML_REPEATED_KEY";
52
- /** Issue code: a `node` or `edge` key whose value is not a `[ ... ]` block. */
82
+ /**
83
+ * A `node` or `edge` key whose value is not a `[ ... ]` block.
84
+ * @category Issue and loss codes
85
+ */
53
86
  export const ELEMENT_TYPE_CODE = "E_GML_ELEMENT_TYPE";
54
- /** Issue code: a `directed` or `multigraph` flag that is not an integer. */
87
+ /**
88
+ * A `directed` or `multigraph` flag that is not an integer.
89
+ * @category Issue and loss codes
90
+ */
55
91
  export const FLAG_TYPE_CODE = "E_GML_FLAG_TYPE";
56
- /** Issue code: a `directed` / `multigraph` flag that is not 0 or 1 (read as its truth value), one written as a quoted integer, or one repeated. */
92
+ /**
93
+ * A `directed` / `multigraph` flag that is not 0 or 1 (read as its truth value), one written as a quoted integer, or
94
+ * one repeated.
95
+ * @category Issue and loss codes
96
+ */
57
97
  export const FLAG_VALUE_CODE = "W_GML_FLAG_VALUE";
58
98
  /** A flag written as a quoted integer, surrounding spaces allowed. */
59
99
  const QUOTED_INT = /^\s*[+-]?[0-9]+\s*$/;
60
- /** Issue code: a named entity in a string that is neither an XML nor an ISO-8859-1 HTML entity; it is kept as written. */
100
+ /**
101
+ * A named entity in a string that is neither an XML nor an ISO-8859-1 HTML entity, or a numeric reference beyond
102
+ * U+10FFFF; it is kept as written.
103
+ * @category Issue and loss codes
104
+ */
61
105
  export const UNKNOWN_ENTITY_CODE = "W_GML_UNKNOWN_ENTITY";
62
- /** Issue code: an integer beyond 2^53 stored as the nearest f64 (design section 5.1). */
106
+ /**
107
+ * A node's `graphics` value cannot give a position as written (not a record, repeated in the node, or with an x / y /
108
+ * z that is not one number); the value is kept in the graphics json column. Warned once per kind of problem, naming
109
+ * the first node.
110
+ * @category Issue and loss codes
111
+ */
112
+ export const GRAPHICS_CODE = "W_GML_GRAPHICS";
113
+ /**
114
+ * A `graph`, `node` or `edge` record inside a node or edge; kept as a json column, not read as structure.
115
+ * @category Issue and loss codes
116
+ */
117
+ export const NESTED_ELEMENT_CODE = "W_GML_NESTED_ELEMENT";
118
+ /**
119
+ * YEd's group keys (`isGroup`, `gid`); kept as plain node columns, the hierarchy is not read as containment.
120
+ * @category Issue and loss codes
121
+ */
122
+ export const GROUPS_CODE = "W_GML_GROUPS";
123
+ /**
124
+ * A key whose values mix numbers and strings; the column is string, the numbers kept as written.
125
+ * @category Issue and loss codes
126
+ */
127
+ export const WIDENED_CODE = SHARED_WIDENED_CODE;
128
+ /**
129
+ * An integer above 2^53 was stored as the nearest JavaScript number, so its last digits may differ. Pass `long:
130
+ * "string"` to keep every digit as text.
131
+ * @category Issue and loss codes
132
+ */
63
133
  export const PRECISION_CODE = SHARED_PRECISION_CODE;
64
- /** Issue code: the sink already holds a column of the name with another declaration; renamed `<name>#<key>`. */
134
+ /**
135
+ * Two attributes would have had the same name, so this one was renamed `<name>#<key>`.
136
+ * @category Plugin helpers
137
+ */
65
138
  export const COLUMN_RENAMED_CODE_GML = COLUMN_RENAMED_CODE;
66
- /** Issue code: the sink already holds a column with the role; the column is declared without it. */
139
+ /**
140
+ * You read into a graph builder that already has an attribute with this role, so this file's attribute is kept without
141
+ * the role.
142
+ * @category Issue and loss codes
143
+ */
67
144
  export const ROLE_TAKEN_CODE = SHARED_ROLE_TAKEN_CODE;
68
- /** Loss code: under `nodeIdFrom` "label" / "index" the integer `id` keys are not kept. */
145
+ /**
146
+ * Under `nodeIdFrom` "label" / "index" the integer `id` keys are not kept.
147
+ * @category Issue and loss codes
148
+ */
69
149
  export const ID_DROPPED_CODE = "W_GML_ID_DROPPED";
70
150
  const FORMAT_DEFAULTS = { ids: "canonical", defaultDirected: false, weightFrom: "value" };
71
151
  const KIND_INT = 1;
@@ -88,6 +168,7 @@ const USED_OPTIONS = new Set([
88
168
  "weightFrom",
89
169
  "weightDtype",
90
170
  "restoreMangledIds",
171
+ "long",
91
172
  "errorLimit",
92
173
  "signal",
93
174
  "onProgress",
@@ -96,6 +177,23 @@ const USED_OPTIONS = new Set([
96
177
  const GRAPH_SEQ = -1;
97
178
  /** The element sequence number of the top-level keys. */
98
179
  const TOP_SEQ = -2;
180
+ /**
181
+ * Whether a key is the label of a node or edge (text, never a NetworkX list marker).
182
+ * @param domain - the table
183
+ * @param key - the key
184
+ * @returns true for a node or edge label
185
+ */
186
+ function isLabel(domain, key) {
187
+ return roleOf(domain, key) === "label";
188
+ }
189
+ /**
190
+ * Whether a parsed value is a GML record.
191
+ * @param value - the value
192
+ * @returns true for a record object
193
+ */
194
+ function isRecord(value) {
195
+ return typeof value === "object" && value !== null && !Array.isArray(value);
196
+ }
99
197
  /**
100
198
  * Whether a key gets a role in its table (design section 5.6 applied to GML keys).
101
199
  * @param domain - the table
@@ -156,6 +254,8 @@ class GmlImport {
156
254
  this.elementsSinceCheck = 0;
157
255
  /** The sink id every file id maps to when they differ (label / index / restored ids), else null. */
158
256
  this.idMap = null;
257
+ /** The file ids of node blocks that were skipped: an edge naming one is skipped too, never given a new node. */
258
+ this.skippedIds = new Set();
159
259
  /** Node indices declared by a node block of this import, for duplicate detection. */
160
260
  this.declared = new Uint32Array(64);
161
261
  /** The list plans touched by the current node or edge. */
@@ -178,7 +278,7 @@ class GmlImport {
178
278
  run(tokens) {
179
279
  this.tokens = tokens;
180
280
  tokens.onUnknownEntity = (entity, line) => {
181
- this.report.warnOnce("parse-error", UNKNOWN_ENTITY_CODE, `unknown character entity ${entity} is kept as written`, { line, element: entity }, `${UNKNOWN_ENTITY_CODE}:${entity}`);
281
+ this.report.warnOnce("parse-error", UNKNOWN_ENTITY_CODE, `character entity ${entity} cannot be decoded; it is kept as written`, { line, element: entity }, `${UNKNOWN_ENTITY_CODE}:${entity}`);
182
282
  };
183
283
  this.scan();
184
284
  this.push();
@@ -190,10 +290,14 @@ class GmlImport {
190
290
  */
191
291
  scan() {
192
292
  const t = this.requireTokens();
293
+ let scalarGraph = -1;
193
294
  for (let p = 0; p < t.count; p = t.nextPair(p)) {
194
295
  const key = t.textOf(p);
195
296
  const v = p + 1;
196
297
  const record = t.kind[v] === TOKEN_OPEN;
298
+ if (key === "graph" && !record && scalarGraph < 0) {
299
+ scalarGraph = v;
300
+ }
197
301
  if (key === "graph" && record) {
198
302
  if (this.graphCount++ === this.which) {
199
303
  this.graphOpen = v;
@@ -211,6 +315,9 @@ class GmlImport {
211
315
  }
212
316
  }
213
317
  if (this.graphOpen < 0) {
318
+ if (scalarGraph >= 0) {
319
+ this.report.fail(NO_GRAPH_CODE, `the graph key at line ${t.line[scalarGraph]} holds ${describeValue(t, scalarGraph)}, not a [ ... ] block; the input contains no graph block`, { line: t.line[scalarGraph] });
320
+ }
214
321
  this.report.fail(NO_GRAPH_CODE, "the input contains no graph [ ... ] block", { line: null });
215
322
  }
216
323
  }
@@ -297,7 +404,9 @@ class GmlImport {
297
404
  */
298
405
  observe(schema, domain, key, v, seq) {
299
406
  const t = this.requireTokens();
407
+ this.noteStructure(domain, key, v);
300
408
  let entry = schema.get(key);
409
+ const graphics = domain === "node" && key === "graphics" && this.positions;
301
410
  if (entry === undefined) {
302
411
  entry = {
303
412
  key,
@@ -314,14 +423,21 @@ class GmlImport {
314
423
  }
315
424
  else if (entry.lastSeq === seq) {
316
425
  entry.list = true;
426
+ // a repeated graphics record: the extra records go to the json column
427
+ entry.rest || (entry.rest = graphics);
317
428
  }
318
429
  else {
319
430
  entry.lastSeq = seq;
320
431
  }
432
+ if (graphics && t.kind[v] !== TOKEN_OPEN) {
433
+ entry.rest = true;
434
+ }
321
435
  switch (t.kind[v]) {
322
436
  case TOKEN_STRING: {
323
437
  const raw = t.textOf(v);
324
- if (raw === LIST_START_MARKER || raw === EMPTY_LIST_TEXT || raw === EMPTY_TUPLE_TEXT) {
438
+ // a label is text: "[]" there is a label, never NetworkX's empty list
439
+ if (raw === LIST_START_MARKER ||
440
+ (!isLabel(domain, key) && (raw === EMPTY_LIST_TEXT || raw === EMPTY_TUPLE_TEXT))) {
325
441
  entry.list = true;
326
442
  return;
327
443
  }
@@ -348,8 +464,32 @@ class GmlImport {
348
464
  this.inspectGraphics(entry, v);
349
465
  }
350
466
  return;
351
- default:
467
+ default: {
352
468
  entry.kinds |= KIND_REAL;
469
+ const text = t.textOf(v);
470
+ if (/\d/.test(text) && !Number.isFinite(Number(text))) {
471
+ this.report.warnOnce("precision", PRECISION_CODE, `${domain} key "${key}" holds the real ${text}, beyond the f64 range; it is stored as ${numberOfText(text) > 0 ? "" : "-"}Infinity`, { line: t.line[v], element: key }, `${PRECISION_CODE}:overflow:${domain}:${key}`);
472
+ }
473
+ }
474
+ }
475
+ }
476
+ /**
477
+ * Warn about keys of a node or edge whose meaning GML readers give but this import does not:
478
+ * a nested graph / node / edge record, and yEd's group hierarchy.
479
+ * @param domain - the table
480
+ * @param key - the key
481
+ * @param v - the value token
482
+ */
483
+ noteStructure(domain, key, v) {
484
+ const t = this.requireTokens();
485
+ if (domain === "graph") {
486
+ return;
487
+ }
488
+ if ((key === "graph" || key === "node" || key === "edge") && t.kind[v] === TOKEN_OPEN) {
489
+ this.report.warnOnce("unsupported", NESTED_ELEMENT_CODE, `a nested ${key} record inside a ${domain} is kept as the json column "${key}"; it is not read as structure`, { line: t.line[v], element: key }, `${NESTED_ELEMENT_CODE}:${domain}:${key}`);
490
+ }
491
+ else if (domain === "node" && (key === "isGroup" || key === "gid")) {
492
+ this.report.warnOnce("unsupported", GROUPS_CODE, "yEd group keys (isGroup, gid) are kept as plain node columns; the group hierarchy is not read as containment", { line: t.line[v], element: key });
353
493
  }
354
494
  }
355
495
  /**
@@ -428,7 +568,9 @@ class GmlImport {
428
568
  * @returns the plan
429
569
  */
430
570
  planOf(domain, entry, top = false) {
431
- const kind = kindOf(entry);
571
+ // long: "string" keeps every digit of an integer key that holds values beyond 2^53, as text
572
+ const asText = entry.unsafe && this.options.long === "string" && kindOf(entry) === "int";
573
+ const kind = asText ? "string" : kindOf(entry);
432
574
  let scalar = dtypeOfKind(kind, entry);
433
575
  if (scalar === "string" &&
434
576
  !entry.list &&
@@ -437,8 +579,13 @@ class GmlImport {
437
579
  entry.dict.decide() === "dict") {
438
580
  scalar = "dict";
439
581
  }
440
- if (entry.unsafe) {
441
- this.report.warnOnce("precision", PRECISION_CODE, `${domain} key "${entry.key}" holds integers beyond 2^53; they are stored as the nearest f64`, { element: entry.key }, `${PRECISION_CODE}:${domain}:${entry.key}`);
582
+ if ((entry.kinds & KIND_STRING) !== 0 &&
583
+ (entry.kinds & (KIND_INT | KIND_REAL)) !== 0 &&
584
+ (entry.kinds & KIND_RECORD) === 0) {
585
+ this.report.warnOnce("coercion", WIDENED_CODE, `${domain} key "${entry.key}" mixes numbers and strings; the column is string and the numbers are kept as written`, { element: entry.key }, `${WIDENED_CODE}:${domain}:${entry.key}`);
586
+ }
587
+ if (entry.unsafe && !asText) {
588
+ this.report.warnOnce("precision", PRECISION_CODE, `${domain} key "${entry.key}" holds integers beyond 2^53; they are stored as the nearest f64 (pass long: "string" to keep every digit as text)`, { element: entry.key }, `${PRECISION_CODE}:${domain}:${entry.key}`);
442
589
  }
443
590
  const name = domain === "graph" ? this.uniqueGraphName(entry.key) : entry.key;
444
591
  let itemDtype = null;
@@ -461,11 +608,7 @@ class GmlImport {
461
608
  items: null,
462
609
  seq: Number.NEGATIVE_INFINITY,
463
610
  };
464
- if (domain === "node" &&
465
- entry.key === "graphics" &&
466
- entry.position &&
467
- entry.kinds === KIND_RECORD &&
468
- !entry.list) {
611
+ if (domain === "node" && entry.key === "graphics" && this.positions && (entry.kinds & KIND_RECORD) !== 0) {
469
612
  const taken = (candidate) => this.nodeSchema.has(candidate) || this.sink.nodeColumn(candidate) !== INVALID_INDEX;
470
613
  const position = {
471
614
  ...plan,
@@ -473,9 +616,12 @@ class GmlImport {
473
616
  dtype: "f64",
474
617
  itemDtype: null,
475
618
  kind: "real",
619
+ list: false,
476
620
  role: "position",
477
621
  };
478
- const rest = entry.rest ? { ...plan } : null;
622
+ const rest = entry.rest
623
+ ? { ...plan, dtype: "json", itemDtype: null, kind: "record", list: false }
624
+ : null;
479
625
  return { ...plan, position, rest };
480
626
  }
481
627
  return plan;
@@ -488,6 +634,9 @@ class GmlImport {
488
634
  uniqueGraphName(key) {
489
635
  const name = uniqueColumnName(key, key, (candidate) => this.graphNames.has(candidate));
490
636
  this.graphNames.add(name);
637
+ if (name !== key) {
638
+ this.report.warning("coercion", COLUMN_RENAMED_CODE_GML, `the top-level key "${key}" and a key of the graph block share the graph column name; the top-level value is stored as "${name}"`, { element: key });
639
+ }
491
640
  return name;
492
641
  }
493
642
  /** Set the graph metadata: source format, creator, version, multigraph flag, weight origin. */
@@ -633,6 +782,7 @@ class GmlImport {
633
782
  this.checkAbort();
634
783
  let index;
635
784
  let sinkId;
785
+ let fileId;
636
786
  try {
637
787
  let idTok = -1;
638
788
  let labelTok = -1;
@@ -654,7 +804,7 @@ class GmlImport {
654
804
  }
655
805
  // the file id under the ids rule, so `id 1` and `source "1"` meet in idMap (except under
656
806
  // "keep", where the integer 1 and the string "1" are different ids by design)
657
- const fileId = this.coerceFileId(idTok, this.fileIdOf(idTok, "id"));
807
+ fileId = this.coerceFileId(idTok, this.fileIdOf(idTok, "id"));
658
808
  if (originalTok >= 0) {
659
809
  sinkId = this.restoredId(originalTok);
660
810
  }
@@ -675,14 +825,21 @@ class GmlImport {
675
825
  sinkId = fileId;
676
826
  }
677
827
  }
828
+ index = sink.addNode(sinkId);
678
829
  if (this.idMap !== null) {
830
+ const before = this.idMap.get(fileId);
831
+ if (before !== undefined && before !== sinkId) {
832
+ report.warning("merged", DUPLICATE_NODE_CODE, `file id ${JSON.stringify(fileId)} is declared twice (nodes ${JSON.stringify(before)} and ${JSON.stringify(sinkId)}); edges to it resolve to the later`, { line, element: String(fileId) });
833
+ }
679
834
  this.idMap.set(fileId, sinkId);
680
835
  }
681
- index = sink.addNode(sinkId);
682
836
  }
683
837
  catch (err) {
684
838
  this.recordNodeError(err, line);
685
839
  report.counts.skippedNodes++;
840
+ if (fileId !== undefined) {
841
+ this.skippedIds.add(fileId);
842
+ }
686
843
  return;
687
844
  }
688
845
  if (this.isDeclared(index)) {
@@ -694,16 +851,28 @@ class GmlImport {
694
851
  }
695
852
  this.beginElement(this.seq++);
696
853
  try {
854
+ const graphics = [];
855
+ let graphicsPlan = null;
697
856
  for (let p = open + 1; p < close; p = t.nextPair(p)) {
698
857
  const key = t.textOf(p);
699
858
  if (key === "id" || (key === ORIGINAL_ID_KEY && options.restoreMangledIds)) {
700
859
  continue;
701
860
  }
702
861
  const plan = this.nodePlans.get(key);
703
- if (plan !== undefined) {
862
+ if (plan !== undefined && plan.position !== null) {
863
+ graphicsPlan = plan;
864
+ graphics.push(p + 1);
865
+ }
866
+ else if (plan !== undefined) {
704
867
  this.writeNode(plan, index, p + 1);
705
868
  }
706
869
  }
870
+ if (graphicsPlan !== null) {
871
+ this.writeGraphics(graphicsPlan, index, graphics, {
872
+ line: t.line[graphics[0]],
873
+ element: String(sinkId),
874
+ });
875
+ }
707
876
  this.flushLists("node", index);
708
877
  }
709
878
  catch (err) {
@@ -898,7 +1067,16 @@ class GmlImport {
898
1067
  */
899
1068
  endpoint(v, key) {
900
1069
  const id = this.coerceFileId(v, this.fileIdOf(v, key));
901
- return this.idMap?.get(id) ?? id;
1070
+ const mapped = this.idMap?.get(id);
1071
+ if (mapped !== undefined) {
1072
+ return mapped;
1073
+ }
1074
+ if (this.skippedIds.has(id)) {
1075
+ // the node block was skipped: creating the endpoint would bring the node back under
1076
+ // its raw file id (beside label ids under nodeIdFrom "label")
1077
+ throw new GraphFormatError("E_UNKNOWN_NODE", `${key} ${JSON.stringify(id)} names a node block that was skipped after an error`, { reason: "skipped node", id });
1078
+ }
1079
+ return id;
902
1080
  }
903
1081
  /**
904
1082
  * The weight of an edge from its weight token.
@@ -909,11 +1087,17 @@ class GmlImport {
909
1087
  const t = this.requireTokens();
910
1088
  switch (t.kind[v]) {
911
1089
  case TOKEN_STRING:
912
- return parseWeightText(t.stringOf(v));
1090
+ return parseWeightText(t.stringOf(v), this.report);
913
1091
  case TOKEN_OPEN:
914
1092
  throw new GraphFormatError("E_INVALID_WEIGHT", "edge weight is a record", { value: "[...]" });
915
- default:
916
- return weightFromValue(numberOfText(t.textOf(v)));
1093
+ default: {
1094
+ const text = t.textOf(v);
1095
+ const weight = weightFromValue(numberOfText(text));
1096
+ if (weight !== undefined) {
1097
+ reportWeightPrecision(text, weight, this.report);
1098
+ }
1099
+ return weight;
1100
+ }
917
1101
  }
918
1102
  }
919
1103
  /**
@@ -977,10 +1161,6 @@ class GmlImport {
977
1161
  * @param v - the value token
978
1162
  */
979
1163
  writeNode(plan, index, v) {
980
- if (plan.position !== null) {
981
- this.writeGraphics(plan, index, v);
982
- return;
983
- }
984
1164
  if (plan.list) {
985
1165
  this.collectItem(plan, v, this.seqNow, this.touched);
986
1166
  return;
@@ -1011,36 +1191,77 @@ class GmlImport {
1011
1191
  this.collectItem(plan, v, seq, this.graphTouched);
1012
1192
  return;
1013
1193
  }
1014
- this.sink.setGraphValue(plan.name, this.scalarOf(plan, v), graphDecl(plan));
1194
+ const value = this.scalarOf(plan, v);
1195
+ this.sink.setGraphValue(plan.name, value, graphDecl(plan));
1196
+ if (seq === GRAPH_SEQ && plan.key === "name" && typeof value === "string") {
1197
+ // the graph block's `name` is the graph's name too (snapshot.meta.name, and what graphName matches)
1198
+ this.sink.setMeta({ name: value });
1199
+ }
1015
1200
  }
1016
1201
  /**
1017
- * Write a node's graphics record: the position column from x / y / z, the remaining keys to
1018
- * the json column.
1202
+ * Write a node's graphics values: the position column from the x / y / z of the first record,
1203
+ * everything else (the remaining keys, a value that is not a record, a repeated record) to the
1204
+ * json column, with a warning when the value cannot give a position as written.
1019
1205
  * @param plan - the graphics plan
1020
1206
  * @param index - the node index
1021
- * @param v - the value token (a record)
1207
+ * @param vs - the value tokens of the node's graphics keys, in order
1208
+ * @param where - the line and the node, for issues
1022
1209
  */
1023
- writeGraphics(plan, index, v) {
1210
+ writeGraphics(plan, index, vs, where) {
1024
1211
  const t = this.requireTokens();
1025
1212
  const { sink } = this;
1026
- const record = parseRecord(t, v);
1027
- const { x, y, z } = record;
1213
+ const values = vs.map((v) => (t.kind[v] === TOKEN_OPEN ? parseRecord(t, v) : this.scalarOf(plan, v)));
1214
+ const first = values[0];
1028
1215
  const positionPlan = plan.position;
1029
- if (positionPlan !== null && typeof x === "number" && typeof y === "number") {
1030
- sink.setNodeValue(this.handleOf(positionPlan, "node"), index, [x, y, typeof z === "number" ? z : 0]);
1216
+ let rest = first;
1217
+ if (isRecord(first) && positionPlan !== null) {
1218
+ rest = this.writePosition(positionPlan, index, first, where);
1219
+ }
1220
+ else if (!isRecord(first)) {
1221
+ this.graphicsWarning("scalar", `node ${where.element}'s graphics is not a record`, where);
1222
+ }
1223
+ if (values.length > 1) {
1224
+ this.graphicsWarning("repeated", `node ${where.element} has ${values.length} graphics records; the position comes from the first`, where);
1225
+ rest = values;
1226
+ }
1227
+ if (rest !== undefined && plan.rest !== null) {
1228
+ sink.setNodeValue(this.handleOf(plan.rest, "node"), index, rest);
1229
+ }
1230
+ }
1231
+ /**
1232
+ * Write a node's position from the x / y / z of its graphics record, taking them out of it.
1233
+ * @param positionPlan - the position column's plan
1234
+ * @param index - the node index
1235
+ * @param record - the graphics record
1236
+ * @param where - the line and the node, for issues
1237
+ * @returns what is left of the record for the json column, or undefined when nothing is
1238
+ */
1239
+ writePosition(positionPlan, index, record, where) {
1240
+ const { x, y, z } = record;
1241
+ let rest = record;
1242
+ if (typeof x === "number" && typeof y === "number") {
1243
+ const depth = typeof z === "number" ? z : 0;
1244
+ this.sink.setNodeValue(this.handleOf(positionPlan, "node"), index, [x, y, depth]);
1031
1245
  delete record.x;
1032
1246
  delete record.y;
1033
1247
  if (typeof z === "number") {
1034
1248
  delete record.z;
1035
1249
  }
1036
- if (plan.rest !== null && Object.keys(record).length > 0) {
1037
- sink.setNodeValue(this.handleOf(plan.rest, "node"), index, record);
1038
- }
1039
- return;
1250
+ rest = Object.keys(record).length > 0 ? record : undefined;
1040
1251
  }
1041
- if (plan.rest !== null) {
1042
- sink.setNodeValue(this.handleOf(plan.rest, "node"), index, record);
1252
+ if ("x" in record || "y" in record || "z" in record) {
1253
+ this.graphicsWarning("coordinate", `node ${where.element}'s graphics x / y / z is not one number each`, where);
1043
1254
  }
1255
+ return rest;
1256
+ }
1257
+ /**
1258
+ * Warn once per kind of graphics problem.
1259
+ * @param kind - the problem
1260
+ * @param what - the message start, naming the node
1261
+ * @param where - the line and the node
1262
+ */
1263
+ graphicsWarning(kind, what, where) {
1264
+ this.report.warnOnce("validation-error", GRAPHICS_CODE, `${what}; the value is kept in the graphics json column (warned once for every such node)`, where, `${GRAPHICS_CODE}:${kind}`);
1044
1265
  }
1045
1266
  /**
1046
1267
  * Collect one list item.
@@ -1331,9 +1552,13 @@ function sniffGml(head) {
1331
1552
  }
1332
1553
  return 0;
1333
1554
  }
1334
- /** The GML importer plugin. */
1555
+ /**
1556
+ * The GML importer plugin.
1557
+ * @category Built-in formats
1558
+ */
1335
1559
  export const gmlImporter = Object.freeze({
1336
1560
  format: "gml",
1561
+ options: Object.freeze(["dictionaries", "positions"]),
1337
1562
  extensions: Object.freeze([".gml"]),
1338
1563
  mimeTypes: Object.freeze(["text/x-gml", "text/plain"]),
1339
1564
  sniff: sniffGml,
@@ -1345,6 +1570,10 @@ export const gmlImporter = Object.freeze({
1345
1570
  * @returns the report
1346
1571
  */
1347
1572
  async import(input, sink, options) {
1573
+ if (graphChosen(options)) {
1574
+ // the choice is honored here too, not only by the registry
1575
+ return importChosenGraph(gmlImporter, input, sink, options);
1576
+ }
1348
1577
  const resolved = resolveImportOptions(options, FORMAT_DEFAULTS);
1349
1578
  const report = new ImportReportBuilder("gml", resolved.errorLimit);
1350
1579
  reportSinkOptions(sink, options, report);
@@ -1354,7 +1583,7 @@ export const gmlImporter = Object.freeze({
1354
1583
  const gml = new GmlImport(sink, report, resolved, options);
1355
1584
  gml.run(tokens);
1356
1585
  if (gml.graphCount > 1) {
1357
- report.warning("unsupported", SECOND_GRAPH_CODE, `the input holds ${gml.graphCount - 1} more graph block(s) after the first; import() reads the first, importAll() reads every one`);
1586
+ report.warning("unsupported", SECOND_GRAPH_CODE, `the input holds ${gml.graphCount - 1} more graph block${plural(gml.graphCount - 1)} after the first; the first is read (graphIndex or graphName chooses another; importAllGraphs() reads every one)`);
1358
1587
  }
1359
1588
  // an abort raised during the last few elements (after the last periodic check) still rejects
1360
1589
  throwIfAborted(resolved.signal);