@graphty/graph-io 0.3.25 → 0.3.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/README.md +49 -414
  2. package/dist/chunks/children-CL3Cy0ez.js.map +1 -1
  3. package/dist/chunks/choose-DrXtu_96.js +56 -0
  4. package/dist/chunks/choose-DrXtu_96.js.map +1 -0
  5. package/dist/chunks/constants-ikG85dT8.js +231 -0
  6. package/dist/chunks/constants-ikG85dT8.js.map +1 -0
  7. package/dist/chunks/{escape-B-tkk_Cl.js → escape-D1HPTUrP.js} +390 -99
  8. package/dist/chunks/escape-D1HPTUrP.js.map +1 -0
  9. package/dist/chunks/export-CHd4tQE2.js +4333 -0
  10. package/dist/chunks/export-CHd4tQE2.js.map +1 -0
  11. package/dist/chunks/{importer-eUREhBGj.js → exporter-D23CKNqF.js} +4969 -3201
  12. package/dist/chunks/exporter-D23CKNqF.js.map +1 -0
  13. package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-DfWTgrti.js} +23 -21
  14. package/dist/chunks/exporter-DfWTgrti.js.map +1 -0
  15. package/dist/chunks/exporter-DhtW6FxK.js +3465 -0
  16. package/dist/chunks/exporter-DhtW6FxK.js.map +1 -0
  17. package/dist/chunks/{exporter-BGrsWamJ.js → exporter-IHv4nkCm.js} +38 -229
  18. package/dist/chunks/exporter-IHv4nkCm.js.map +1 -0
  19. package/dist/chunks/{importer-BWY2FFc5.js → importer-B1wmPQjr.js} +255 -77
  20. package/dist/chunks/importer-B1wmPQjr.js.map +1 -0
  21. package/dist/chunks/{importer-D_e7e7LX.js → importer-B2W_58pz.js} +399 -146
  22. package/dist/chunks/importer-B2W_58pz.js.map +1 -0
  23. package/dist/chunks/importer-BSALvkui.js +2811 -0
  24. package/dist/chunks/importer-BSALvkui.js.map +1 -0
  25. package/dist/chunks/{importer-vi3bSdtw.js → importer-BVRE--Un.js} +510 -77
  26. package/dist/chunks/importer-BVRE--Un.js.map +1 -0
  27. package/dist/chunks/{importer-DET1tg6s.js → importer-CIAzt-wo.js} +1689 -312
  28. package/dist/chunks/importer-CIAzt-wo.js.map +1 -0
  29. package/dist/chunks/{importer-DIrbbnAf.js → importer-DpEW5zeG.js} +585 -226
  30. package/dist/chunks/importer-DpEW5zeG.js.map +1 -0
  31. package/dist/chunks/{importer-zGLo8Dg_.js → importer-z_FL4VMb.js} +488 -161
  32. package/dist/chunks/importer-z_FL4VMb.js.map +1 -0
  33. package/dist/chunks/json-elements-BAmNBZok.js +1225 -0
  34. package/dist/chunks/json-elements-BAmNBZok.js.map +1 -0
  35. package/dist/chunks/ontology-export-Bab4eUA8.js +357 -0
  36. package/dist/chunks/ontology-export-Bab4eUA8.js.map +1 -0
  37. package/dist/chunks/{records-dbRkxwaq.js → records-CdlvL4RO.js} +298 -114
  38. package/dist/chunks/records-CdlvL4RO.js.map +1 -0
  39. package/dist/chunks/{text-Dr0Ifpag.js → text-DzXjAiTl.js} +29 -11
  40. package/dist/chunks/text-DzXjAiTl.js.map +1 -0
  41. package/dist/chunks/{writer-C7flM-Ih.js → writer-DxjgHwSe.js} +19 -1
  42. package/dist/chunks/writer-DxjgHwSe.js.map +1 -0
  43. package/dist/csv.js +952 -262
  44. package/dist/csv.js.map +1 -1
  45. package/dist/cx.js +6 -3
  46. package/dist/cx2.js +2 -2
  47. package/dist/cys.js +6 -3
  48. package/dist/dot.js +1 -1
  49. package/dist/gexf.js +554 -122
  50. package/dist/gexf.js.map +1 -1
  51. package/dist/gml.js +344 -87
  52. package/dist/gml.js.map +1 -1
  53. package/dist/graph-io.js +1105 -213
  54. package/dist/graph-io.js.map +1 -1
  55. package/dist/graphml.js +3 -2
  56. package/dist/graphml.js.map +1 -1
  57. package/dist/json.js +3 -2
  58. package/dist/neo4j.js +565 -158
  59. package/dist/neo4j.js.map +1 -1
  60. package/dist/obo.js +6 -3
  61. package/dist/pajek.js +1 -1
  62. package/dist/src/children.d.ts +18 -6
  63. package/dist/src/children.d.ts.map +1 -1
  64. package/dist/src/children.js +6 -3
  65. package/dist/src/children.js.map +1 -1
  66. package/dist/src/common/attributes.d.ts +29 -11
  67. package/dist/src/common/attributes.d.ts.map +1 -1
  68. package/dist/src/common/attributes.js +25 -7
  69. package/dist/src/common/attributes.js.map +1 -1
  70. package/dist/src/common/cell-budget.d.ts +9 -2
  71. package/dist/src/common/cell-budget.d.ts.map +1 -1
  72. package/dist/src/common/cell-budget.js +11 -3
  73. package/dist/src/common/cell-budget.js.map +1 -1
  74. package/dist/src/common/choose.d.ts +19 -0
  75. package/dist/src/common/choose.d.ts.map +1 -0
  76. package/dist/src/common/choose.js +72 -0
  77. package/dist/src/common/choose.js.map +1 -0
  78. package/dist/src/common/codes.d.ts +456 -66
  79. package/dist/src/common/codes.d.ts.map +1 -1
  80. package/dist/src/common/codes.js +458 -66
  81. package/dist/src/common/codes.js.map +1 -1
  82. package/dist/src/common/compare.d.ts +81 -0
  83. package/dist/src/common/compare.d.ts.map +1 -0
  84. package/dist/src/common/compare.js +394 -0
  85. package/dist/src/common/compare.js.map +1 -0
  86. package/dist/src/common/cx-export.d.ts +123 -0
  87. package/dist/src/common/cx-export.d.ts.map +1 -0
  88. package/dist/src/common/cx-export.js +334 -0
  89. package/dist/src/common/cx-export.js.map +1 -0
  90. package/dist/src/common/declared-types.d.ts +22 -2
  91. package/dist/src/common/declared-types.d.ts.map +1 -1
  92. package/dist/src/common/declared-types.js +21 -3
  93. package/dist/src/common/declared-types.js.map +1 -1
  94. package/dist/src/common/direction.d.ts +74 -50
  95. package/dist/src/common/direction.d.ts.map +1 -1
  96. package/dist/src/common/direction.js +47 -27
  97. package/dist/src/common/direction.js.map +1 -1
  98. package/dist/src/common/escape.d.ts +21 -9
  99. package/dist/src/common/escape.d.ts.map +1 -1
  100. package/dist/src/common/escape.js +39 -22
  101. package/dist/src/common/escape.js.map +1 -1
  102. package/dist/src/common/export.d.ts +144 -32
  103. package/dist/src/common/export.d.ts.map +1 -1
  104. package/dist/src/common/export.js +216 -42
  105. package/dist/src/common/export.js.map +1 -1
  106. package/dist/src/common/format.d.ts +23 -1
  107. package/dist/src/common/format.d.ts.map +1 -1
  108. package/dist/src/common/format.js +26 -1
  109. package/dist/src/common/format.js.map +1 -1
  110. package/dist/src/common/ids.d.ts +9 -2
  111. package/dist/src/common/ids.d.ts.map +1 -1
  112. package/dist/src/common/ids.js +6 -2
  113. package/dist/src/common/ids.js.map +1 -1
  114. package/dist/src/common/input.d.ts +122 -28
  115. package/dist/src/common/input.d.ts.map +1 -1
  116. package/dist/src/common/input.js +890 -124
  117. package/dist/src/common/input.js.map +1 -1
  118. package/dist/src/common/json-elements.d.ts +144 -20
  119. package/dist/src/common/json-elements.d.ts.map +1 -1
  120. package/dist/src/common/json-elements.js +869 -189
  121. package/dist/src/common/json-elements.js.map +1 -1
  122. package/dist/src/common/line-format.d.ts +90 -0
  123. package/dist/src/common/line-format.d.ts.map +1 -0
  124. package/dist/src/common/line-format.js +185 -0
  125. package/dist/src/common/line-format.js.map +1 -0
  126. package/dist/src/common/lists.d.ts +6 -1
  127. package/dist/src/common/lists.d.ts.map +1 -1
  128. package/dist/src/common/lists.js +3 -1
  129. package/dist/src/common/lists.js.map +1 -1
  130. package/dist/src/common/ontology-export.d.ts +167 -0
  131. package/dist/src/common/ontology-export.d.ts.map +1 -0
  132. package/dist/src/common/ontology-export.js +359 -0
  133. package/dist/src/common/ontology-export.js.map +1 -0
  134. package/dist/src/common/ontology.d.ts +25 -3
  135. package/dist/src/common/ontology.d.ts.map +1 -1
  136. package/dist/src/common/ontology.js +30 -9
  137. package/dist/src/common/ontology.js.map +1 -1
  138. package/dist/src/common/options.d.ts +62 -12
  139. package/dist/src/common/options.d.ts.map +1 -1
  140. package/dist/src/common/options.js +89 -11
  141. package/dist/src/common/options.js.map +1 -1
  142. package/dist/src/common/plural.d.ts +31 -0
  143. package/dist/src/common/plural.d.ts.map +1 -0
  144. package/dist/src/common/plural.js +46 -0
  145. package/dist/src/common/plural.js.map +1 -0
  146. package/dist/src/common/report.d.ts +72 -14
  147. package/dist/src/common/report.d.ts.map +1 -1
  148. package/dist/src/common/report.js +146 -22
  149. package/dist/src/common/report.js.map +1 -1
  150. package/dist/src/common/temporal.d.ts +22 -5
  151. package/dist/src/common/temporal.d.ts.map +1 -1
  152. package/dist/src/common/temporal.js +13 -2
  153. package/dist/src/common/temporal.js.map +1 -1
  154. package/dist/src/common/text.d.ts +39 -23
  155. package/dist/src/common/text.d.ts.map +1 -1
  156. package/dist/src/common/text.js +51 -21
  157. package/dist/src/common/text.js.map +1 -1
  158. package/dist/src/common/weights.d.ts +37 -4
  159. package/dist/src/common/weights.d.ts.map +1 -1
  160. package/dist/src/common/weights.js +61 -2
  161. package/dist/src/common/weights.js.map +1 -1
  162. package/dist/src/common/writer.d.ts +19 -3
  163. package/dist/src/common/writer.d.ts.map +1 -1
  164. package/dist/src/common/writer.js +30 -2
  165. package/dist/src/common/writer.js.map +1 -1
  166. package/dist/src/common/xml.d.ts +125 -9
  167. package/dist/src/common/xml.d.ts.map +1 -1
  168. package/dist/src/common/xml.js +402 -85
  169. package/dist/src/common/xml.js.map +1 -1
  170. package/dist/src/common/zip.d.ts +44 -4
  171. package/dist/src/common/zip.d.ts.map +1 -1
  172. package/dist/src/common/zip.js +134 -5
  173. package/dist/src/common/zip.js.map +1 -1
  174. package/dist/src/formats/csv/exporter.d.ts +80 -24
  175. package/dist/src/formats/csv/exporter.d.ts.map +1 -1
  176. package/dist/src/formats/csv/exporter.js +146 -33
  177. package/dist/src/formats/csv/exporter.js.map +1 -1
  178. package/dist/src/formats/csv/header.d.ts +38 -9
  179. package/dist/src/formats/csv/header.d.ts.map +1 -1
  180. package/dist/src/formats/csv/header.js +46 -10
  181. package/dist/src/formats/csv/header.js.map +1 -1
  182. package/dist/src/formats/csv/importer.d.ts +187 -37
  183. package/dist/src/formats/csv/importer.d.ts.map +1 -1
  184. package/dist/src/formats/csv/importer.js +835 -204
  185. package/dist/src/formats/csv/importer.js.map +1 -1
  186. package/dist/src/formats/csv/index.d.ts +100 -19
  187. package/dist/src/formats/csv/index.d.ts.map +1 -1
  188. package/dist/src/formats/csv/index.js +94 -21
  189. package/dist/src/formats/csv/index.js.map +1 -1
  190. package/dist/src/formats/csv/records.d.ts +95 -10
  191. package/dist/src/formats/csv/records.d.ts.map +1 -1
  192. package/dist/src/formats/csv/records.js +333 -122
  193. package/dist/src/formats/csv/records.js.map +1 -1
  194. package/dist/src/formats/csv/values.d.ts +1 -0
  195. package/dist/src/formats/csv/values.d.ts.map +1 -1
  196. package/dist/src/formats/csv/values.js +1 -0
  197. package/dist/src/formats/csv/values.js.map +1 -1
  198. package/dist/src/formats/cx/exporter.d.ts +102 -0
  199. package/dist/src/formats/cx/exporter.d.ts.map +1 -0
  200. package/dist/src/formats/cx/exporter.js +1217 -0
  201. package/dist/src/formats/cx/exporter.js.map +1 -0
  202. package/dist/src/formats/cx/importer.d.ts +79 -32
  203. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  204. package/dist/src/formats/cx/importer.js +682 -287
  205. package/dist/src/formats/cx/importer.js.map +1 -1
  206. package/dist/src/formats/cx/index.d.ts +4 -3
  207. package/dist/src/formats/cx/index.d.ts.map +1 -1
  208. package/dist/src/formats/cx/index.js +4 -3
  209. package/dist/src/formats/cx/index.js.map +1 -1
  210. package/dist/src/formats/cx2/exporter.d.ts +29 -11
  211. package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
  212. package/dist/src/formats/cx2/exporter.js +39 -268
  213. package/dist/src/formats/cx2/exporter.js.map +1 -1
  214. package/dist/src/formats/cx2/importer.d.ts +78 -28
  215. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  216. package/dist/src/formats/cx2/importer.js +227 -80
  217. package/dist/src/formats/cx2/importer.js.map +1 -1
  218. package/dist/src/formats/cx2/index.d.ts +2 -1
  219. package/dist/src/formats/cx2/index.d.ts.map +1 -1
  220. package/dist/src/formats/cx2/index.js +2 -1
  221. package/dist/src/formats/cx2/index.js.map +1 -1
  222. package/dist/src/formats/cys/constants.d.ts +66 -17
  223. package/dist/src/formats/cys/constants.d.ts.map +1 -1
  224. package/dist/src/formats/cys/constants.js +59 -18
  225. package/dist/src/formats/cys/constants.js.map +1 -1
  226. package/dist/src/formats/cys/exporter.d.ts +118 -0
  227. package/dist/src/formats/cys/exporter.d.ts.map +1 -0
  228. package/dist/src/formats/cys/exporter.js +1072 -0
  229. package/dist/src/formats/cys/exporter.js.map +1 -0
  230. package/dist/src/formats/cys/importer.d.ts +22 -8
  231. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  232. package/dist/src/formats/cys/importer.js +510 -149
  233. package/dist/src/formats/cys/importer.js.map +1 -1
  234. package/dist/src/formats/cys/index.d.ts +4 -2
  235. package/dist/src/formats/cys/index.d.ts.map +1 -1
  236. package/dist/src/formats/cys/index.js +4 -2
  237. package/dist/src/formats/cys/index.js.map +1 -1
  238. package/dist/src/formats/cys/session.d.ts +46 -7
  239. package/dist/src/formats/cys/session.d.ts.map +1 -1
  240. package/dist/src/formats/cys/session.js +101 -27
  241. package/dist/src/formats/cys/session.js.map +1 -1
  242. package/dist/src/formats/cys/tables.d.ts +9 -2
  243. package/dist/src/formats/cys/tables.d.ts.map +1 -1
  244. package/dist/src/formats/cys/tables.js +29 -7
  245. package/dist/src/formats/cys/tables.js.map +1 -1
  246. package/dist/src/formats/dot/exporter.d.ts +42 -14
  247. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  248. package/dist/src/formats/dot/exporter.js +56 -29
  249. package/dist/src/formats/dot/exporter.js.map +1 -1
  250. package/dist/src/formats/dot/importer.d.ts +91 -29
  251. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  252. package/dist/src/formats/dot/importer.js +190 -39
  253. package/dist/src/formats/dot/importer.js.map +1 -1
  254. package/dist/src/formats/dot/index.d.ts +2 -1
  255. package/dist/src/formats/dot/index.d.ts.map +1 -1
  256. package/dist/src/formats/dot/index.js +2 -1
  257. package/dist/src/formats/dot/index.js.map +1 -1
  258. package/dist/src/formats/dot/names.d.ts +44 -11
  259. package/dist/src/formats/dot/names.d.ts.map +1 -1
  260. package/dist/src/formats/dot/names.js +44 -11
  261. package/dist/src/formats/dot/names.js.map +1 -1
  262. package/dist/src/formats/dot/tokenizer.d.ts +9 -2
  263. package/dist/src/formats/dot/tokenizer.d.ts.map +1 -1
  264. package/dist/src/formats/dot/tokenizer.js +20 -5
  265. package/dist/src/formats/dot/tokenizer.js.map +1 -1
  266. package/dist/src/formats/gexf/exporter.d.ts +46 -15
  267. package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
  268. package/dist/src/formats/gexf/exporter.js +45 -15
  269. package/dist/src/formats/gexf/exporter.js.map +1 -1
  270. package/dist/src/formats/gexf/importer.d.ts +87 -23
  271. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  272. package/dist/src/formats/gexf/importer.js +471 -90
  273. package/dist/src/formats/gexf/importer.js.map +1 -1
  274. package/dist/src/formats/gexf/index.d.ts +84 -21
  275. package/dist/src/formats/gexf/index.d.ts.map +1 -1
  276. package/dist/src/formats/gexf/index.js +80 -23
  277. package/dist/src/formats/gexf/index.js.map +1 -1
  278. package/dist/src/formats/gexf/schema.d.ts +67 -15
  279. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  280. package/dist/src/formats/gexf/schema.js +59 -13
  281. package/dist/src/formats/gexf/schema.js.map +1 -1
  282. package/dist/src/formats/gml/exporter.d.ts +69 -21
  283. package/dist/src/formats/gml/exporter.d.ts.map +1 -1
  284. package/dist/src/formats/gml/exporter.js +74 -29
  285. package/dist/src/formats/gml/exporter.js.map +1 -1
  286. package/dist/src/formats/gml/importer.d.ts +116 -25
  287. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  288. package/dist/src/formats/gml/importer.js +290 -61
  289. package/dist/src/formats/gml/importer.js.map +1 -1
  290. package/dist/src/formats/gml/index.d.ts +87 -24
  291. package/dist/src/formats/gml/index.d.ts.map +1 -1
  292. package/dist/src/formats/gml/index.js +79 -26
  293. package/dist/src/formats/gml/index.js.map +1 -1
  294. package/dist/src/formats/gml/syntax.d.ts +67 -18
  295. package/dist/src/formats/gml/syntax.d.ts.map +1 -1
  296. package/dist/src/formats/gml/syntax.js +110 -28
  297. package/dist/src/formats/gml/syntax.js.map +1 -1
  298. package/dist/src/formats/graphml/constants.d.ts +174 -44
  299. package/dist/src/formats/graphml/constants.d.ts.map +1 -1
  300. package/dist/src/formats/graphml/constants.js +165 -44
  301. package/dist/src/formats/graphml/constants.js.map +1 -1
  302. package/dist/src/formats/graphml/exporter.d.ts +17 -9
  303. package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
  304. package/dist/src/formats/graphml/exporter.js +33 -12
  305. package/dist/src/formats/graphml/exporter.js.map +1 -1
  306. package/dist/src/formats/graphml/importer.d.ts +19 -7
  307. package/dist/src/formats/graphml/importer.d.ts.map +1 -1
  308. package/dist/src/formats/graphml/importer.js +466 -39
  309. package/dist/src/formats/graphml/importer.js.map +1 -1
  310. package/dist/src/formats/graphml/index.d.ts +2 -1
  311. package/dist/src/formats/graphml/index.d.ts.map +1 -1
  312. package/dist/src/formats/graphml/index.js +2 -1
  313. package/dist/src/formats/graphml/index.js.map +1 -1
  314. package/dist/src/formats/graphml/tree.d.ts +6 -2
  315. package/dist/src/formats/graphml/tree.d.ts.map +1 -1
  316. package/dist/src/formats/graphml/tree.js +6 -2
  317. package/dist/src/formats/graphml/tree.js.map +1 -1
  318. package/dist/src/formats/graphml/yfiles.d.ts +8 -3
  319. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  320. package/dist/src/formats/graphml/yfiles.js +36 -15
  321. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  322. package/dist/src/formats/json/dialect.d.ts +88 -24
  323. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  324. package/dist/src/formats/json/dialect.js +109 -19
  325. package/dist/src/formats/json/dialect.js.map +1 -1
  326. package/dist/src/formats/json/exporter.d.ts +134 -22
  327. package/dist/src/formats/json/exporter.d.ts.map +1 -1
  328. package/dist/src/formats/json/exporter.js +135 -54
  329. package/dist/src/formats/json/exporter.js.map +1 -1
  330. package/dist/src/formats/json/importer.d.ts +173 -52
  331. package/dist/src/formats/json/importer.d.ts.map +1 -1
  332. package/dist/src/formats/json/importer.js +899 -220
  333. package/dist/src/formats/json/importer.js.map +1 -1
  334. package/dist/src/formats/json/index.d.ts +3 -2
  335. package/dist/src/formats/json/index.d.ts.map +1 -1
  336. package/dist/src/formats/json/index.js +3 -2
  337. package/dist/src/formats/json/index.js.map +1 -1
  338. package/dist/src/formats/json/obographs-export.d.ts +68 -0
  339. package/dist/src/formats/json/obographs-export.d.ts.map +1 -0
  340. package/dist/src/formats/json/obographs-export.js +941 -0
  341. package/dist/src/formats/json/obographs-export.js.map +1 -0
  342. package/dist/src/formats/json/obographs.d.ts +26 -0
  343. package/dist/src/formats/json/obographs.d.ts.map +1 -1
  344. package/dist/src/formats/json/obographs.js +297 -80
  345. package/dist/src/formats/json/obographs.js.map +1 -1
  346. package/dist/src/formats/neo4j/exporter.d.ts +109 -21
  347. package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
  348. package/dist/src/formats/neo4j/exporter.js +239 -86
  349. package/dist/src/formats/neo4j/exporter.js.map +1 -1
  350. package/dist/src/formats/neo4j/header.d.ts +17 -4
  351. package/dist/src/formats/neo4j/header.d.ts.map +1 -1
  352. package/dist/src/formats/neo4j/header.js +36 -4
  353. package/dist/src/formats/neo4j/header.js.map +1 -1
  354. package/dist/src/formats/neo4j/importer.d.ts +107 -27
  355. package/dist/src/formats/neo4j/importer.d.ts.map +1 -1
  356. package/dist/src/formats/neo4j/importer.js +415 -63
  357. package/dist/src/formats/neo4j/importer.js.map +1 -1
  358. package/dist/src/formats/neo4j/index.d.ts +73 -23
  359. package/dist/src/formats/neo4j/index.d.ts.map +1 -1
  360. package/dist/src/formats/neo4j/index.js +65 -25
  361. package/dist/src/formats/neo4j/index.js.map +1 -1
  362. package/dist/src/formats/obo/exporter.d.ts +150 -0
  363. package/dist/src/formats/obo/exporter.d.ts.map +1 -0
  364. package/dist/src/formats/obo/exporter.js +1736 -0
  365. package/dist/src/formats/obo/exporter.js.map +1 -0
  366. package/dist/src/formats/obo/importer.d.ts +95 -19
  367. package/dist/src/formats/obo/importer.d.ts.map +1 -1
  368. package/dist/src/formats/obo/importer.js +475 -104
  369. package/dist/src/formats/obo/importer.js.map +1 -1
  370. package/dist/src/formats/obo/index.d.ts +6 -3
  371. package/dist/src/formats/obo/index.d.ts.map +1 -1
  372. package/dist/src/formats/obo/index.js +6 -3
  373. package/dist/src/formats/obo/index.js.map +1 -1
  374. package/dist/src/formats/obo/syntax.d.ts +108 -4
  375. package/dist/src/formats/obo/syntax.d.ts.map +1 -1
  376. package/dist/src/formats/obo/syntax.js +211 -34
  377. package/dist/src/formats/obo/syntax.js.map +1 -1
  378. package/dist/src/formats/pajek/exporter.d.ts +54 -16
  379. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  380. package/dist/src/formats/pajek/exporter.js +67 -35
  381. package/dist/src/formats/pajek/exporter.js.map +1 -1
  382. package/dist/src/formats/pajek/importer.d.ts +84 -22
  383. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  384. package/dist/src/formats/pajek/importer.js +303 -83
  385. package/dist/src/formats/pajek/importer.js.map +1 -1
  386. package/dist/src/formats/pajek/index.d.ts +2 -1
  387. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  388. package/dist/src/formats/pajek/index.js +2 -1
  389. package/dist/src/formats/pajek/index.js.map +1 -1
  390. package/dist/src/formats/pajek/syntax.d.ts +77 -14
  391. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  392. package/dist/src/formats/pajek/syntax.js +186 -54
  393. package/dist/src/formats/pajek/syntax.js.map +1 -1
  394. package/dist/src/formats/xgmml/columns.d.ts +1 -0
  395. package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
  396. package/dist/src/formats/xgmml/columns.js +4 -0
  397. package/dist/src/formats/xgmml/columns.js.map +1 -1
  398. package/dist/src/formats/xgmml/constants.d.ts +186 -56
  399. package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
  400. package/dist/src/formats/xgmml/constants.js +181 -57
  401. package/dist/src/formats/xgmml/constants.js.map +1 -1
  402. package/dist/src/formats/xgmml/document.d.ts +65 -11
  403. package/dist/src/formats/xgmml/document.d.ts.map +1 -1
  404. package/dist/src/formats/xgmml/document.js +157 -28
  405. package/dist/src/formats/xgmml/document.js.map +1 -1
  406. package/dist/src/formats/xgmml/emit.d.ts +61 -3
  407. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  408. package/dist/src/formats/xgmml/emit.js +129 -26
  409. package/dist/src/formats/xgmml/emit.js.map +1 -1
  410. package/dist/src/formats/xgmml/exporter.d.ts +13 -6
  411. package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
  412. package/dist/src/formats/xgmml/exporter.js +21 -22
  413. package/dist/src/formats/xgmml/exporter.js.map +1 -1
  414. package/dist/src/formats/xgmml/importer.d.ts +33 -12
  415. package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
  416. package/dist/src/formats/xgmml/importer.js +35 -72
  417. package/dist/src/formats/xgmml/importer.js.map +1 -1
  418. package/dist/src/formats/xgmml/index.d.ts +1 -0
  419. package/dist/src/formats/xgmml/index.d.ts.map +1 -1
  420. package/dist/src/formats/xgmml/index.js +1 -0
  421. package/dist/src/formats/xgmml/index.js.map +1 -1
  422. package/dist/src/formats/xgmml/values.d.ts +8 -1
  423. package/dist/src/formats/xgmml/values.d.ts.map +1 -1
  424. package/dist/src/formats/xgmml/values.js +8 -3
  425. package/dist/src/formats/xgmml/values.js.map +1 -1
  426. package/dist/src/index.d.ts +23 -18
  427. package/dist/src/index.d.ts.map +1 -1
  428. package/dist/src/index.js +28 -16
  429. package/dist/src/index.js.map +1 -1
  430. package/dist/src/registry.d.ts +478 -92
  431. package/dist/src/registry.d.ts.map +1 -1
  432. package/dist/src/registry.js +807 -88
  433. package/dist/src/registry.js.map +1 -1
  434. package/dist/src/sniff.d.ts +61 -19
  435. package/dist/src/sniff.d.ts.map +1 -1
  436. package/dist/src/sniff.js +121 -29
  437. package/dist/src/sniff.js.map +1 -1
  438. package/dist/src/types.d.ts +362 -112
  439. package/dist/src/types.d.ts.map +1 -1
  440. package/dist/src/types.js +28 -7
  441. package/dist/src/types.js.map +1 -1
  442. package/dist/xgmml.js +2 -2
  443. package/docs/samples/README.md +25 -0
  444. package/docs/samples/got-edges.csv +353 -0
  445. package/docs/samples/got-network.graphml +1384 -0
  446. package/docs/samples/got-nodes.csv +108 -0
  447. package/docs/samples/got.cx +930 -0
  448. package/docs/samples/got.cx2 +465 -0
  449. package/docs/samples/got.gexf +471 -0
  450. package/docs/samples/got.gml +2650 -0
  451. package/docs/samples/got.json +2546 -0
  452. package/docs/samples/got.net +461 -0
  453. package/docs/samples/movies-nodes.csv +9 -0
  454. package/docs/samples/movies-rels.csv +8 -0
  455. package/docs/samples/networks.cys +0 -0
  456. package/docs/samples/proteins.xgmml +9 -0
  457. package/docs/samples/teams.gv +24 -0
  458. package/docs/samples/vehicles.obo +25 -0
  459. package/package.json +9 -4
  460. package/src/children.ts +18 -6
  461. package/src/common/attributes.ts +29 -11
  462. package/src/common/cell-budget.ts +11 -3
  463. package/src/common/choose.ts +89 -0
  464. package/src/common/codes.ts +490 -66
  465. package/src/common/compare.ts +472 -0
  466. package/src/common/cx-export.ts +432 -0
  467. package/src/common/declared-types.ts +40 -6
  468. package/src/common/direction.ts +78 -51
  469. package/src/common/escape.ts +39 -22
  470. package/src/common/export.ts +284 -47
  471. package/src/common/format.ts +30 -1
  472. package/src/common/ids.ts +14 -3
  473. package/src/common/input.ts +1057 -134
  474. package/src/common/json-elements.ts +1035 -199
  475. package/src/common/line-format.ts +249 -0
  476. package/src/common/lists.ts +7 -2
  477. package/src/common/ontology-export.ts +461 -0
  478. package/src/common/ontology.ts +31 -9
  479. package/src/common/options.ts +110 -15
  480. package/src/common/plural.ts +49 -0
  481. package/src/common/report.ts +168 -25
  482. package/src/common/temporal.ts +22 -5
  483. package/src/common/text.ts +62 -23
  484. package/src/common/weights.ts +74 -4
  485. package/src/common/writer.ts +37 -3
  486. package/src/common/xml.ts +479 -90
  487. package/src/common/zip.ts +169 -7
  488. package/src/formats/csv/exporter.ts +202 -47
  489. package/src/formats/csv/header.ts +50 -11
  490. package/src/formats/csv/importer.ts +1133 -245
  491. package/src/formats/csv/index.ts +106 -19
  492. package/src/formats/csv/records.ts +396 -122
  493. package/src/formats/csv/values.ts +1 -0
  494. package/src/formats/cx/exporter.ts +1483 -0
  495. package/src/formats/cx/importer.ts +890 -302
  496. package/src/formats/cx/index.ts +4 -3
  497. package/src/formats/cx2/exporter.ts +62 -339
  498. package/src/formats/cx2/importer.ts +318 -87
  499. package/src/formats/cx2/index.ts +2 -1
  500. package/src/formats/cys/constants.ts +62 -17
  501. package/src/formats/cys/exporter.ts +1368 -0
  502. package/src/formats/cys/importer.ts +659 -157
  503. package/src/formats/cys/index.ts +4 -2
  504. package/src/formats/cys/session.ts +142 -34
  505. package/src/formats/cys/tables.ts +47 -9
  506. package/src/formats/dot/exporter.ts +83 -37
  507. package/src/formats/dot/importer.ts +248 -54
  508. package/src/formats/dot/index.ts +2 -1
  509. package/src/formats/dot/names.ts +44 -11
  510. package/src/formats/dot/tokenizer.ts +25 -6
  511. package/src/formats/gexf/exporter.ts +57 -18
  512. package/src/formats/gexf/importer.ts +636 -105
  513. package/src/formats/gexf/index.ts +90 -21
  514. package/src/formats/gexf/schema.ts +67 -15
  515. package/src/formats/gml/exporter.ts +90 -36
  516. package/src/formats/gml/importer.ts +388 -67
  517. package/src/formats/gml/index.ts +85 -24
  518. package/src/formats/gml/syntax.ts +113 -28
  519. package/src/formats/graphml/constants.ts +178 -44
  520. package/src/formats/graphml/exporter.ts +52 -18
  521. package/src/formats/graphml/importer.ts +640 -60
  522. package/src/formats/graphml/index.ts +2 -1
  523. package/src/formats/graphml/tree.ts +6 -2
  524. package/src/formats/graphml/yfiles.ts +37 -15
  525. package/src/formats/json/dialect.ts +128 -29
  526. package/src/formats/json/exporter.ts +205 -68
  527. package/src/formats/json/importer.ts +1163 -253
  528. package/src/formats/json/index.ts +3 -1
  529. package/src/formats/json/obographs-export.ts +1197 -0
  530. package/src/formats/json/obographs.ts +353 -92
  531. package/src/formats/neo4j/exporter.ts +321 -102
  532. package/src/formats/neo4j/header.ts +44 -6
  533. package/src/formats/neo4j/importer.ts +512 -73
  534. package/src/formats/neo4j/index.ts +75 -23
  535. package/src/formats/obo/exporter.ts +2210 -0
  536. package/src/formats/obo/importer.ts +622 -109
  537. package/src/formats/obo/index.ts +6 -3
  538. package/src/formats/obo/syntax.ts +232 -37
  539. package/src/formats/pajek/exporter.ts +90 -42
  540. package/src/formats/pajek/importer.ts +407 -93
  541. package/src/formats/pajek/index.ts +2 -1
  542. package/src/formats/pajek/syntax.ts +216 -55
  543. package/src/formats/xgmml/columns.ts +10 -0
  544. package/src/formats/xgmml/constants.ts +183 -56
  545. package/src/formats/xgmml/document.ts +212 -34
  546. package/src/formats/xgmml/emit.ts +175 -34
  547. package/src/formats/xgmml/exporter.ts +36 -28
  548. package/src/formats/xgmml/importer.ts +64 -86
  549. package/src/formats/xgmml/index.ts +1 -0
  550. package/src/formats/xgmml/values.ts +12 -4
  551. package/src/index.ts +81 -11
  552. package/src/registry.ts +1121 -135
  553. package/src/sniff.ts +163 -32
  554. package/src/types.ts +385 -114
  555. package/dist/chunks/escape-B-tkk_Cl.js.map +0 -1
  556. package/dist/chunks/export-Bh60Dv-n.js +0 -582
  557. package/dist/chunks/export-Bh60Dv-n.js.map +0 -1
  558. package/dist/chunks/exporter-BGrsWamJ.js.map +0 -1
  559. package/dist/chunks/exporter-DIeGJXAZ.js.map +0 -1
  560. package/dist/chunks/importer-BWY2FFc5.js.map +0 -1
  561. package/dist/chunks/importer-DD-xv9_Y.js +0 -1471
  562. package/dist/chunks/importer-DD-xv9_Y.js.map +0 -1
  563. package/dist/chunks/importer-DET1tg6s.js.map +0 -1
  564. package/dist/chunks/importer-DEcKhsmQ.js +0 -1614
  565. package/dist/chunks/importer-DEcKhsmQ.js.map +0 -1
  566. package/dist/chunks/importer-DIrbbnAf.js.map +0 -1
  567. package/dist/chunks/importer-D_e7e7LX.js.map +0 -1
  568. package/dist/chunks/importer-eUREhBGj.js.map +0 -1
  569. package/dist/chunks/importer-vi3bSdtw.js.map +0 -1
  570. package/dist/chunks/importer-zGLo8Dg_.js.map +0 -1
  571. package/dist/chunks/json-elements-DDS8N2Dd.js +0 -779
  572. package/dist/chunks/json-elements-DDS8N2Dd.js.map +0 -1
  573. package/dist/chunks/ontology-BnrJ4I98.js +0 -113
  574. package/dist/chunks/ontology-BnrJ4I98.js.map +0 -1
  575. package/dist/chunks/records-dbRkxwaq.js.map +0 -1
  576. package/dist/chunks/report-B1z4WT9e.js +0 -2372
  577. package/dist/chunks/report-B1z4WT9e.js.map +0 -1
  578. package/dist/chunks/text-Dr0Ifpag.js.map +0 -1
  579. package/dist/chunks/weights-Dzba96G3.js +0 -176
  580. package/dist/chunks/weights-Dzba96G3.js.map +0 -1
  581. package/dist/chunks/writer-C7flM-Ih.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The JSON exporter (design section 8.5): one GraphExporter with a `dialect` option writing
3
3
  * NetworkX node-link (the default), d3 (`links`, optional index endpoints), JSON Graph Format v2,
4
- * Cytoscape.js elements, graphology serialisation or vis.js. The dialect defaults to the one the
4
+ * Cytoscape.js elements, graphology serialization or vis.js. The dialect defaults to the one the
5
5
  * importer recorded under `meta.extra.json` so a JSON file re-exported as JSON keeps its shape,
6
6
  * and to node-link for a snapshot from any other source.
7
7
  *
@@ -20,18 +20,21 @@
20
20
 
21
21
  import { type Column, GraphFormatError, type GraphSnapshot, INVALID_INDEX, type NodeId } from "@graphty/graph-format";
22
22
 
23
+ import { DIRECTION_DROPPED_CODE, NODE_ORDER_CODE, NONFINITE_AS_NULL_CODE } from "../../common/codes.js";
23
24
  import { type PairFolding, pairFolding } from "../../common/direction.js";
24
25
  import { checkCapabilities, countMixedEdges, LOSS } from "../../common/export.js";
25
26
  import { formatF32, formatF64 } from "../../common/format.js";
26
27
  import { flipY } from "../../common/json-elements.js";
27
- import { type ResolvedExportOptions, resolveExportOptions } from "../../common/options.js";
28
+ import { otherFormatDialect, type ResolvedExportOptions, resolveExportOptions } from "../../common/options.js";
29
+ import { agree, plural } from "../../common/plural.js";
28
30
  import { explicitWeights } from "../../common/weights.js";
29
- import { encodeChunks, joinText } from "../../common/writer.js";
31
+ import { encodeChunks, indentUnit, joinText } from "../../common/writer.js";
30
32
  import { type CommonExportOptions, type ExportCapabilities, type GraphExporter, type LossNote } from "../../types.js";
31
33
  import {
32
34
  CYTOSCAPE_ELEMENT_KEYS,
33
35
  DIALECT_DEFAULT_DIRECTED,
34
36
  dialectCapabilities,
37
+ exponentIfUnsafe,
35
38
  isJsonDialect,
36
39
  JSON_DIALECTS,
37
40
  type JsonDialect,
@@ -39,48 +42,114 @@ import {
39
42
  shapeMetaOf,
40
43
  SUFFIX,
41
44
  } from "./dialect.js";
45
+ import { OBOGRAPHS_LOSS, OBOGRAPHS_SHARED_LOSS, planObographs } from "./obographs-export.js";
42
46
 
43
- /** The format-specific options of the JSON exporter. */
44
- export interface JsonExportOptions {
45
- /** The dialect to write; default: the dialect the importer recorded, else "node-link". */
47
+ /**
48
+ * The format-specific options of the JSON exporter.
49
+ * @category Built-in formats
50
+ */
51
+ export interface JsonExportOptions extends CommonExportOptions {
52
+ /**
53
+ * The dialect to write. The default is the dialect a JSON import read, else "node-link".
54
+ * Attributes are written under their own names; vis.js shows the `label` attribute, so rename
55
+ * the attribute you want shown to `label` first (`snapshot.nodes.rename("name", "label")`). A CSV
56
+ * dialect name ("gephi", "generic"), from an options object shared with CSV saves, is ignored.
57
+ * @defaultValue as read, else "node-link"
58
+ */
46
59
  dialect?: JsonDialect | undefined;
47
- /** Spaces per indentation level; 0 (default) writes compact JSON. */
48
- indent?: number | undefined;
49
- /** node-link / d3: the key of the edge array; default: the recorded key, else "edges" (d3: "links"). */
60
+ /**
61
+ * The indentation of one level: a number of spaces, or the text itself (spaces or tabs, such as
62
+ * "\t"). 0 or "" writes compact JSON on one line.
63
+ * @defaultValue 0
64
+ */
65
+ indent?: number | string | undefined;
66
+ /**
67
+ * node-link and d3: the key of the edge array. The default is the key a JSON import read, else
68
+ * "edges" ("links" for d3).
69
+ * @defaultValue as read, else "edges"
70
+ */
50
71
  edgesKey?: string | undefined;
51
- /** node-link / d3 / vis: the node id key; default: the recorded key, else "id". */
72
+ /**
73
+ * node-link, d3 and vis: the node id key. The default is the key a JSON import read, else "id".
74
+ * @defaultValue as read, else "id"
75
+ */
52
76
  nodeIdKey?: string | undefined;
53
- /** node-link / d3: write endpoints as node array positions; default: the recorded flag, else false. */
77
+ /**
78
+ * node-link and d3: write edge ends as positions in the node array instead of ids. The default
79
+ * is what a JSON import read, else false.
80
+ * @defaultValue as read, else false
81
+ */
54
82
  indexLinks?: boolean | undefined;
55
- /** node-link / d3 / vis: the source key; default: the recorded key, else "source" (vis: "from"). */
83
+ /**
84
+ * node-link, d3 and vis: the source key. The default is the key a JSON import read, else
85
+ * "source" ("from" for vis). graph-io finds "source", "src" and "from" by itself; for another
86
+ * key, read the file back with the same `sourceKey` import option. Without it every edge is an
87
+ * `E_MISSING_ENDPOINT` error and is skipped, and a file with more edges than `errorLimit` (100 by
88
+ * default) fails to load with an `ImportError`. `checkExport()` does not warn about this.
89
+ * @defaultValue as read, else "source"
90
+ */
56
91
  sourceKey?: string | undefined;
57
- /** node-link / d3 / vis: the target key; default: the recorded key, else "target" (vis: "to"). */
92
+ /**
93
+ * node-link, d3 and vis: the target key. The default is the key a JSON import read, else
94
+ * "target" ("to" for vis). graph-io finds "target", "dst" and "to" by itself; for another key,
95
+ * read the file back with the same `targetKey` import option, as for `sourceKey`.
96
+ * @defaultValue as read, else "target"
97
+ */
58
98
  targetKey?: string | undefined;
59
- /** The key the weight is written under; default: the key the JSON importer read it from, else "weight". */
99
+ /**
100
+ * The key the weight is written under, in every dialect but OBO Graphs, which always writes the
101
+ * weight as "weight" in each edge's `meta` (checkExport() then returns W_OBOGRAPHS_EDGE_COLUMN_AS_META).
102
+ * The default is the key a JSON import read the weights from, else "weight". For another key,
103
+ * read the file back with `weightFrom` set to it, or the weights come back as a plain edge
104
+ * attribute.
105
+ * @defaultValue as read, else "weight"
106
+ */
60
107
  weightKey?: string | undefined;
108
+ /**
109
+ * OBO Graphs: the graph id written when the graph has none. A graph read from an OBO Graphs
110
+ * document keeps its own graph id, which this option does not change. Node ids are written in
111
+ * the form graph-io reads back as the same id: an IRI as it is, a prefixed id such as
112
+ * `GO:0008150` as its OBO address, and an id without a prefix (`a`) under the default OBO
113
+ * address (`http://purl.obolibrary.org/obo/graph.owl#a`), or as it is when you pass another IRI
114
+ * here. The default is `http://purl.obolibrary.org/obo/<ontology>.owl`.
115
+ * @defaultValue the ontology's OBO address
116
+ */
117
+ ontologyIri?: string | undefined;
61
118
  }
62
119
 
63
120
  /**
64
121
  * The LossNote codes of the JSON exporter's check(): the dialect-specific ones and, aliased, the
65
122
  * shared ones it records (`LOSS` holds the rest of the generic pre-flight's codes). A key is the
66
123
  * code without its severity prefix.
124
+ * @category Built-in formats
67
125
  */
68
126
  export const JSON_LOSS = Object.freeze({
69
127
  /** Non-finite numbers (columns, weights) are written as null. */
70
- NONFINITE_AS_NULL: "W_NONFINITE_AS_NULL",
71
- /** Cytoscape, vis and d3 carry no direction; the file re-imports with the dialect's default direction. */
72
- DIRECTION_DROPPED: "W_DIRECTION_DROPPED",
128
+ NONFINITE_AS_NULL: NONFINITE_AS_NULL_CODE,
129
+ /**
130
+ * The file cannot record direction: an undirected graph's edges read back as directed, or the whole graph reads
131
+ * back with the importer's default direction.
132
+ */
133
+ DIRECTION_DROPPED: DIRECTION_DROPPED_CODE,
73
134
  /** GEXF mutual pairs are written as two directed edges. */
74
135
  MUTUAL_EXPANDED: LOSS.MUTUAL_EXPANDED,
75
- /** JGF keys its nodes by string; numeric ids re-import as text unless ids: "canonical". */
136
+ /**
137
+ * JGF keys its nodes by text, so number ids read back as text, unless you read the file with `ids: "canonical"`.
138
+ */
76
139
  NUMERIC_IDS_STRINGIFIED: "W_NUMERIC_IDS_STRINGIFIED",
77
- /** JGF: two ids have the same text; export() throws E_INVALID_ID. */
140
+ /**
141
+ * Two node ids would be written as the same text (the number 5 and the text "5"); the save fails with
142
+ * E_INVALID_ID.
143
+ */
78
144
  ID_TEXT_COLLISION: LOSS.ID_TEXT_COLLISION,
79
- /** JGF: integer-like id keys are enumerated first and ascending by JSON parsers; node order changes on re-import. */
80
- NODE_ORDER: "W_NODE_ORDER",
145
+ /** The nodes read back in a different order. */
146
+ NODE_ORDER: NODE_ORDER_CODE,
81
147
  /** A column named like a reserved key of the dialect (id, source, target, ...) is skipped. */
82
148
  RESERVED_KEY: "W_RESERVED_KEY",
83
- /** A plain edge column named like the weight key reads back as THE weight (or is skipped when weights are written). */
149
+ /**
150
+ * An attribute without the weight role is named like the key weights are written under; it reads back as the edge
151
+ * weight, or is not written when the graph has weights of its own.
152
+ */
84
153
  WEIGHT_KEY_CLASH: LOSS.WEIGHT_KEY_CLASH,
85
154
  /** A position column without a slot (every dialect but Cytoscape) is a plain array attribute; the role is lost. */
86
155
  POSITIONS_DROPPED: LOSS.POSITIONS,
@@ -88,14 +157,59 @@ export const JSON_LOSS = Object.freeze({
88
157
  POSITION_Z_DROPPED: "W_POSITION_Z_DROPPED",
89
158
  /** Cytoscape has a single parent; a `parents` list column cannot be written. */
90
159
  PARENTS_DROPPED: LOSS.PARENTS,
91
- /** node-link / d3 have no edge id slot; the id column is written as a plain attribute. */
160
+ /** Node-link / d3 have no edge id slot; the id column is written as a plain attribute. */
92
161
  EDGE_IDS_DROPPED: LOSS.EDGE_IDS_DROPPED,
93
- /** An f64 column of integral values reads back as i32 (JSON declares no types). */
162
+ /**
163
+ * A number attribute whose values are all whole numbers reads back as integers, because the format does not record
164
+ * the type.
165
+ */
94
166
  INTEGRAL_F64_AS_I32: LOSS.INTEGRAL_F64,
95
- /** A role column the dialect has no slot for is a plain attribute; the role is lost. */
167
+ /** An attribute with a role the format has no place for is written as a plain attribute; the role is lost. */
96
168
  ROLE_DROPPED: LOSS.ROLE,
97
169
  /** A column without a set cell is not written (JSON declares no columns). */
98
170
  EMPTY_COLUMN_DROPPED: LOSS.EMPTY_COLUMN,
171
+ /**
172
+ * Obographs: an edge column (or the explicit weights) is written into each edge's meta and reads back inside the
173
+ * meta column.
174
+ */
175
+ OBOGRAPHS_EDGE_COLUMN_AS_META: OBOGRAPHS_LOSS.EDGE_COLUMN_AS_META,
176
+ /**
177
+ * Obographs: a node id or relation is written as an IRI the importer's default oboIds "curie" reads back as
178
+ * another id.
179
+ */
180
+ OBOGRAPHS_ID_CHANGED: OBOGRAPHS_LOSS.ID_CHANGED,
181
+ /** Obographs: a property_value's xsd datatype has no place in basicPropertyValues and reads back unset. */
182
+ OBOGRAPHS_DATATYPE_DROPPED: OBOGRAPHS_LOSS.DATATYPE_DROPPED,
183
+ /** Obographs: a node column outside the OBO vocabulary reads back inside the property_value column. */
184
+ COLUMN_AS_PROPERTY_VALUE: OBOGRAPHS_SHARED_LOSS.COLUMN_AS_PROPERTY_VALUE,
185
+ /** Obographs: an edge without a relation is written with the pred is_a. */
186
+ RELATION_ASSUMED: OBOGRAPHS_SHARED_LOSS.RELATION_ASSUMED,
187
+ /**
188
+ * Obographs: Typedef nodes are written as PROPERTY nodes, which read back as nodes only under typedefs: "nodes".
189
+ */
190
+ TYPEDEF_NODES: OBOGRAPHS_SHARED_LOSS.TYPEDEF_NODES,
191
+ /**
192
+ * OBO Graphs: a graph attribute is written into the graph's `meta` and reads back in
193
+ * `snapshot.meta.extra.obographs`.
194
+ */
195
+ GRAPH_COLUMN_AS_METADATA: OBOGRAPHS_SHARED_LOSS.GRAPH_COLUMN_AS_METADATA,
196
+ /** Obographs: numeric node ids are written as text and read back as strings. */
197
+ ID_TEXT_TYPE: LOSS.ID_TEXT_TYPE,
198
+ /**
199
+ * An attribute without a role is written where the format keeps a role (for example, a `name` column as the label), and
200
+ * reads back with that role.
201
+ */
202
+ ROLE_ASSUMED: LOSS.ROLE_ASSUMED,
203
+ /**
204
+ * An attribute with a role (for example, the label) is written where the format keeps that role, and reads back under the
205
+ * name the format's importer gives it.
206
+ */
207
+ COLUMN_NAME_CHANGED: LOSS.COLUMN_NAME_CHANGED,
208
+ /**
209
+ * OBO Graphs: an OBO attribute stored as text where graph-io uses a dictionary (or the other way round); it reads
210
+ * back with graph-io's usual type. The values are the same.
211
+ */
212
+ DTYPE_UNSUPPORTED: LOSS.DTYPE,
99
213
  });
100
214
 
101
215
  /** The roles each dialect has a slot for (every other role column is a plain attribute, reported by checkCapabilities()). */
@@ -106,6 +220,7 @@ const SLOT_ROLES: Readonly<Record<JsonDialect, ReadonlySet<string>>> = Object.fr
106
220
  cytoscape: new Set(["classes"]),
107
221
  graphology: new Set<string>(),
108
222
  vis: new Set<string>(),
223
+ obographs: new Set(["label", "kind"]),
109
224
  });
110
225
 
111
226
  /** The element domains. */
@@ -158,7 +273,7 @@ interface ColumnPlan {
158
273
  interface Resolved {
159
274
  readonly common: ResolvedExportOptions;
160
275
  readonly dialect: JsonDialect;
161
- readonly indent: number;
276
+ readonly indent: string;
162
277
  readonly edgesKey: string;
163
278
  readonly nodeIdKey: string | null;
164
279
  readonly indexLinks: boolean;
@@ -166,6 +281,7 @@ interface Resolved {
166
281
  readonly targetKey: string;
167
282
  readonly weightKey: string;
168
283
  readonly shape: JsonShapeMeta;
284
+ readonly ontologyIri: string | null;
169
285
  }
170
286
 
171
287
  /** Everything write() needs, computed once by plan(). */
@@ -198,17 +314,15 @@ function resolve(snapshot: GraphSnapshot, options: (JsonExportOptions & CommonEx
198
314
  const common = resolveExportOptions(options);
199
315
  const shape = shapeMetaOf(snapshot.meta);
200
316
  let dialect: JsonDialect;
201
- if (o.dialect === undefined) {
317
+ if (o.dialect === undefined || otherFormatDialect("json", o.dialect)) {
318
+ // no dialect, or another format's (a CSV "generic" in a shared options object)
202
319
  dialect = shape.dialect ?? "node-link";
203
320
  } else if (isJsonDialect(o.dialect)) {
204
321
  ({ dialect } = o);
205
322
  } else {
206
323
  throw unsupported("dialect", o.dialect, JSON_DIALECTS);
207
324
  }
208
- const indent = o.indent ?? 0;
209
- if (!Number.isInteger(indent) || indent < 0 || indent > 16) {
210
- throw unsupported("indent", indent, ["an integer 0..16"]);
211
- }
325
+ const indent = indentUnit(o.indent, "");
212
326
  const sameDialect = shape.dialect === dialect;
213
327
  const recorded = <T>(value: T | undefined, fallback: T): T =>
214
328
  sameDialect && value !== undefined ? value : fallback;
@@ -240,7 +354,20 @@ function resolve(snapshot: GraphSnapshot, options: (JsonExportOptions & CommonEx
240
354
  (weightOrigin !== null && weightOrigin.format === "json" && weightOrigin.id !== null
241
355
  ? weightOrigin.id
242
356
  : "weight");
243
- return { common, dialect, indent, edgesKey, nodeIdKey, indexLinks, sourceKey, targetKey, weightKey, shape };
357
+ const ontologyIri = keyOption("ontologyIri", o.ontologyIri);
358
+ return {
359
+ common,
360
+ dialect,
361
+ indent,
362
+ edgesKey,
363
+ nodeIdKey,
364
+ indexLinks,
365
+ sourceKey,
366
+ targetKey,
367
+ weightKey,
368
+ shape,
369
+ ontologyIri,
370
+ };
244
371
  }
245
372
 
246
373
  /**
@@ -293,24 +420,6 @@ function numberText(value: number, f32: boolean, nonfinite: Counter): string {
293
420
  return exponentIfUnsafe(f32 ? formatF32(value) : formatF64(value));
294
421
  }
295
422
 
296
- /**
297
- * An integer text beyond 2^53 in exponent form (`100000000000000000000` -> `1e+20`, the same
298
- * digits): the importer reads an integer literal that large as its exact digits (a string), so
299
- * a number must not be written as one.
300
- * @param text - the shortest decimal text of a finite number
301
- * @returns the text, or its exponent form for an integer literal of 16 or more digits
302
- */
303
- function exponentIfUnsafe(text: string): string {
304
- const match = /^(-?)([0-9]{16,})$/.exec(text);
305
- if (match === null || Number.isSafeInteger(Number(text))) {
306
- return text;
307
- }
308
- const [, sign, digits] = match;
309
- const mantissa = digits.replace(/0+$/, "");
310
- const fraction = mantissa.length > 1 ? `.${mantissa.slice(1)}` : "";
311
- return `${sign}${mantissa[0]}${fraction}e+${digits.length - 1}`;
312
- }
313
-
314
423
  /**
315
424
  * The JSON text of any cell value: a number per its dtype, a boolean, a string, an array (a
316
425
  * multi-component subarray or a list row), or a json value.
@@ -416,13 +525,13 @@ class JsonWriter {
416
525
 
417
526
  private readonly firstAtDepth: boolean[] = [];
418
527
 
419
- private readonly indent: number;
528
+ private readonly indent: string;
420
529
 
421
530
  /**
422
531
  * Create a writer.
423
- * @param indent - spaces per level; 0 for compact output
532
+ * @param indent - the text of one level; "" for compact output
424
533
  */
425
- constructor(indent: number) {
534
+ constructor(indent: string) {
426
535
  this.indent = indent;
427
536
  }
428
537
 
@@ -455,7 +564,7 @@ class JsonWriter {
455
564
  */
456
565
  key(name: string): void {
457
566
  this.separator();
458
- this.parts.push(JSON.stringify(name), this.indent > 0 ? ": " : ":");
567
+ this.parts.push(JSON.stringify(name), this.indent !== "" ? ": " : ":");
459
568
  }
460
569
 
461
570
  /** Start an array element: the separator only. */
@@ -507,7 +616,7 @@ class JsonWriter {
507
616
  * @returns the text
508
617
  */
509
618
  private newline(): string {
510
- return this.indent > 0 ? `\n${" ".repeat(this.depth * this.indent)}` : "";
619
+ return this.indent !== "" ? `\n${this.indent.repeat(this.depth)}` : "";
511
620
  }
512
621
  }
513
622
 
@@ -562,7 +671,7 @@ function plan(snapshot: GraphSnapshot, resolved: Resolved): Plan {
562
671
  if (ctx.nonfinite.count > 0) {
563
672
  note(
564
673
  JSON_LOSS.NONFINITE_AS_NULL,
565
- `${ctx.nonfinite.count} non-finite number(s) are written as null`,
674
+ `${ctx.nonfinite.count} non-finite number${plural(ctx.nonfinite.count)} ${agree(ctx.nonfinite.count, "is", "are")} written as null`,
566
675
  null,
567
676
  ctx.nonfinite.count,
568
677
  );
@@ -576,7 +685,7 @@ function plan(snapshot: GraphSnapshot, resolved: Resolved): Plan {
576
685
  if (dialect === "cytoscape" && edgeIds !== null && edgeIds.nullCount > 0) {
577
686
  note(
578
687
  LOSS.EDGE_IDS_GENERATED,
579
- `${edgeIds.nullCount} edge(s) have no id; canonical e<index> ids are generated for them`,
688
+ `${edgeIds.nullCount} edge${plural(edgeIds.nullCount)} ${agree(edgeIds.nullCount, "has", "have")} no id; canonical e<index> ids are generated for them`,
580
689
  edgeIds.meta.name,
581
690
  edgeIds.nullCount,
582
691
  );
@@ -755,7 +864,7 @@ function planSlot(ctx: PlanContext, column: Column, domain: Domain): ColumnPlan
755
864
  if (z > 0) {
756
865
  note(
757
866
  JSON_LOSS.POSITION_Z_DROPPED,
758
- `${z} position(s) have a non-zero z; Cytoscape positions are 2D`,
867
+ `${z} position${plural(z)} ${agree(z, "has", "have")} a non-zero z; Cytoscape positions are 2D`,
759
868
  meta.name,
760
869
  z,
761
870
  );
@@ -849,7 +958,7 @@ function planWeights(ctx: PlanContext, edges: readonly ColumnPlan[]): (e: number
849
958
  if (clash !== undefined) {
850
959
  ctx.note(
851
960
  LOSS.WEIGHT_KEY_CLASH,
852
- `edge column "${clash.column.meta.name}" is written under "${clash.key}", the key the importer reads THE weight from; it reads back as the weight, not as a column`,
961
+ `edge column "${clash.column.meta.name}" is written under "${clash.key}", the key the importer reads edge weights from; it reads back as the weight, not as a column`,
853
962
  clash.column.meta.name,
854
963
  clash.column.length - clash.column.nullCount,
855
964
  );
@@ -883,7 +992,7 @@ function planDirection(ctx: PlanContext): { readonly folding: PairFolding; reado
883
992
  if (folding.mutualCount > 0) {
884
993
  note(
885
994
  LOSS.MUTUAL_EXPANDED,
886
- `${folding.mutualCount} mutual pair(s) are written as two directed edges; the mutual mark is lost`,
995
+ `${folding.mutualCount} mutual pair${plural(folding.mutualCount)} ${agree(folding.mutualCount, "is", "are")} written as two directed edges; the mutual mark is lost`,
887
996
  null,
888
997
  folding.mutualCount,
889
998
  );
@@ -969,7 +1078,7 @@ function jgfIdNotes(
969
1078
  if (numeric > 0) {
970
1079
  note(
971
1080
  JSON_LOSS.NUMERIC_IDS_STRINGIFIED,
972
- `${numeric} numeric node id(s) become JGF object keys (strings); pass ids: "canonical" on re-import`,
1081
+ `${numeric} numeric node id${plural(numeric)} ${agree(numeric, "becomes", "become")} JGF object keys (strings); pass ids: "canonical" on re-import`,
973
1082
  null,
974
1083
  numeric,
975
1084
  );
@@ -977,7 +1086,7 @@ function jgfIdNotes(
977
1086
  if (collisions > 0) {
978
1087
  note(
979
1088
  JSON_LOSS.ID_TEXT_COLLISION,
980
- `${collisions} node id(s) share their text with another id; export() will throw`,
1089
+ `${collisions} node id${plural(collisions)} ${agree(collisions, "shares", "share")} their text with another id; the save fails`,
981
1090
  null,
982
1091
  collisions,
983
1092
  );
@@ -985,7 +1094,7 @@ function jgfIdNotes(
985
1094
  if (!ordered) {
986
1095
  note(
987
1096
  JSON_LOSS.NODE_ORDER,
988
- `${indexLike} integer-like node id(s) are enumerated first and ascending by JSON parsers; node order changes on re-import`,
1097
+ `${indexLike} integer-like node id${plural(indexLike)} ${agree(indexLike, "is", "are")} enumerated first and ascending by JSON parsers; node order changes on re-import`,
989
1098
  null,
990
1099
  indexLike,
991
1100
  );
@@ -1310,7 +1419,7 @@ function* writeVis(snapshot: GraphSnapshot, p: Plan): Generator<string, void, un
1310
1419
  }
1311
1420
 
1312
1421
  /**
1313
- * Write a graphology serialisation.
1422
+ * Write a graphology serialization.
1314
1423
  * @param snapshot - the snapshot
1315
1424
  * @param p - the plan
1316
1425
  * @yields the parts
@@ -1608,11 +1717,35 @@ function edgeIdGenerator(snapshot: GraphSnapshot, p: Plan): (e: number) => strin
1608
1717
  // ============================================================ the plugin
1609
1718
 
1610
1719
  /**
1611
- * The JSON exporter plugin (design section 8.5). `capabilities` is the node-link table (the
1720
+ * The text parts of the document in the resolved dialect.
1721
+ * @param snapshot - the snapshot
1722
+ * @param resolved - the resolved options
1723
+ * @returns the parts
1724
+ */
1725
+ function parts(snapshot: GraphSnapshot, resolved: Resolved): Generator<string, void, undefined> {
1726
+ return resolved.dialect === "obographs"
1727
+ ? planObographs(snapshot, resolved).write()
1728
+ : write(snapshot, plan(snapshot, resolved));
1729
+ }
1730
+
1731
+ /**
1732
+ * The JSON exporter plugin. `capabilities` is the node-link table (the
1612
1733
  * default dialect); check() applies the table of the dialect actually selected.
1734
+ * @category Built-in formats
1613
1735
  */
1614
1736
  export const jsonExporter: GraphExporter<JsonExportOptions> = Object.freeze({
1615
1737
  format: "json",
1738
+ options: Object.freeze([
1739
+ "dialect",
1740
+ "edgesKey",
1741
+ "indent",
1742
+ "indexLinks",
1743
+ "nodeIdKey",
1744
+ "ontologyIri",
1745
+ "sourceKey",
1746
+ "targetKey",
1747
+ "weightKey",
1748
+ ]),
1616
1749
  capabilities: dialectCapabilities("node-link"),
1617
1750
 
1618
1751
  /**
@@ -1622,7 +1755,10 @@ export const jsonExporter: GraphExporter<JsonExportOptions> = Object.freeze({
1622
1755
  * @returns the notes, empty when the export is exact
1623
1756
  */
1624
1757
  check(snapshot: GraphSnapshot, options?: JsonExportOptions & CommonExportOptions): readonly LossNote[] {
1625
- return Object.freeze([...plan(snapshot, resolve(snapshot, options)).notes]);
1758
+ const resolved = resolve(snapshot, options);
1759
+ const notes =
1760
+ resolved.dialect === "obographs" ? planObographs(snapshot, resolved).notes : plan(snapshot, resolved).notes;
1761
+ return Object.freeze([...notes]);
1626
1762
  },
1627
1763
 
1628
1764
  /**
@@ -1632,7 +1768,7 @@ export const jsonExporter: GraphExporter<JsonExportOptions> = Object.freeze({
1632
1768
  * @returns the chunks
1633
1769
  */
1634
1770
  export(snapshot: GraphSnapshot, options?: JsonExportOptions & CommonExportOptions): AsyncIterable<Uint8Array> {
1635
- return encodeChunks(write(snapshot, plan(snapshot, resolve(snapshot, options))));
1771
+ return encodeChunks(parts(snapshot, resolve(snapshot, options)));
1636
1772
  },
1637
1773
 
1638
1774
  /**
@@ -1642,7 +1778,7 @@ export const jsonExporter: GraphExporter<JsonExportOptions> = Object.freeze({
1642
1778
  * @returns the document
1643
1779
  */
1644
1780
  exportToString(snapshot: GraphSnapshot, options?: JsonExportOptions & CommonExportOptions): Promise<string> {
1645
- return joinText(write(snapshot, plan(snapshot, resolve(snapshot, options))));
1781
+ return joinText(parts(snapshot, resolve(snapshot, options)));
1646
1782
  },
1647
1783
  });
1648
1784
 
@@ -1650,6 +1786,7 @@ export const jsonExporter: GraphExporter<JsonExportOptions> = Object.freeze({
1650
1786
  * The capability table of one dialect, for callers that pick a dialect before check().
1651
1787
  * @param dialect - the dialect
1652
1788
  * @returns the frozen table
1789
+ * @category Built-in formats
1653
1790
  */
1654
1791
  export function jsonCapabilities(dialect: JsonDialect): ExportCapabilities {
1655
1792
  return dialectCapabilities(dialect);