@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,8 @@
1
1
  /**
2
- * The `@graphty/graph-io/cx` subpath (design/graph-io/cytoscape-and-obo/design.md section 1.2):
3
- * the CX version 1 importer with its option type and code table. CX1 is read only: CX2 is what
4
- * NDEx and Cytoscape write today, and `@graphty/graph-io/cx2` writes it.
2
+ * The `@graphty/graph-io/cx` subpath: the CX version 1 importer and exporter with their option
3
+ * types and code tables.
4
+ * @module @graphty/graph-io/cx
5
5
  */
6
6
 
7
+ export { CX_CAPABILITIES, CX_LOSS, cxExporter, type CxExportOptions } from "./exporter.js";
7
8
  export { CX_ISSUE, cxImporter, type CxImportOptions } from "./importer.js";
@@ -13,26 +13,44 @@
13
13
  * the infinities as null (W_CX2_NONFINITE_AS_NULL), and the generic notes of checkCapabilities().
14
14
  */
15
15
 
16
- import { type Column, GraphFormatError, type GraphSnapshot, type NodeId } from "@graphty/graph-format";
17
-
16
+ import { type Column, GraphFormatError, type GraphSnapshot } from "@graphty/graph-format";
17
+
18
+ import {
19
+ aspectBlock,
20
+ declaredType,
21
+ directionNotes,
22
+ nonFinitePositions,
23
+ planEdgeIds,
24
+ planNodeIds,
25
+ stringify,
26
+ type WrittenIds,
27
+ } from "../../common/cx-export.js";
18
28
  import { type PairFolding, pairFolding } from "../../common/direction.js";
19
29
  import { capabilities, checkCapabilities, LOSS } from "../../common/export.js";
20
30
  import { isRecord, POSITION_COLUMN } from "../../common/json-elements.js";
21
31
  import { type ResolvedExportOptions, resolveExportOptions } from "../../common/options.js";
32
+ import { plural } from "../../common/plural.js";
22
33
  import { type ExplicitWeights, explicitWeights } from "../../common/weights.js";
23
34
  import { encodeChunks, joinText } from "../../common/writer.js";
24
35
  import { type CommonExportOptions, type ExportCapabilities, type GraphExporter, type LossNote } from "../../types.js";
25
36
  import { BYPASS_NAMESPACE, CX2_FORMAT, cx2Type, ORIGINAL_ID_ATTRIBUTE } from "./importer.js";
26
37
 
27
- /** The format-specific options of the CX2 exporter: none yet. */
28
- export type Cx2ExportOptions = Readonly<Record<never, never>>;
38
+ /**
39
+ * The options of the CX2 exporter: the common export options; it has none of its own.
40
+ * @category Built-in formats
41
+ */
42
+ export type Cx2ExportOptions = CommonExportOptions;
29
43
 
30
44
  /**
31
- * The loss notes the CX2 exporter's check() returns (design section 1.3), by name. A key is the
45
+ * The loss notes the CX2 exporter's check() returns, by name. A key is the
32
46
  * code without its severity and format prefixes.
47
+ * @category Built-in formats
33
48
  */
34
49
  export const CX2_LOSS = Object.freeze({
35
- /** Every edge is written directed: an undirected snapshot, or the undirected pairs of a mixed one. */
50
+ /**
51
+ * Every edge is written as directed, so an undirected graph, or the undirected edges of a mixed graph, read back
52
+ * as directed.
53
+ */
36
54
  UNDIRECTED_AS_DIRECTED: "W_CX2_UNDIRECTED_AS_DIRECTED",
37
55
  /** A nested (json) column is written as a string attribute holding its JSON text. */
38
56
  JSON_AS_STRING: "W_CX2_JSON_AS_STRING",
@@ -40,17 +58,26 @@ export const CX2_LOSS = Object.freeze({
40
58
  NONFINITE_AS_NULL: "W_CX2_NONFINITE_AS_NULL",
41
59
  /** A mutual pair is written as two directed edges without its mark. */
42
60
  MUTUAL_EXPANDED: LOSS.MUTUAL_EXPANDED,
43
- /** A plain edge column named like the weight key reads back as THE weight (or is skipped when weights are written). */
61
+ /**
62
+ * An attribute without the weight role is named like the key weights are written under; it reads back as the edge
63
+ * weight, or is not written when the graph has weights of its own.
64
+ */
44
65
  WEIGHT_KEY_CLASH: LOSS.WEIGHT_KEY_CLASH,
45
66
  /** A parent / parents column: CX2 has no containment. */
46
67
  HIERARCHY_DROPPED: LOSS.HIERARCHY,
47
68
  /** A start / end / timestamp column: CX2 has no time. */
48
69
  TEMPORAL_DROPPED: LOSS.TEMPORAL,
49
- /** A role column written as a plain attribute. */
70
+ /** An attribute with a role the format has no place for is written as a plain attribute; the role is lost. */
50
71
  ROLE_DROPPED: LOSS.ROLE,
51
- /** A dtype CX2 declares as another (f32 as double, u32 as long, dict as string, ...). */
72
+ /**
73
+ * An attribute type CX2 stores as another (a 32-bit float as double, an unsigned integer as long, a dictionary as
74
+ * string); it reads back with that type.
75
+ */
52
76
  DTYPE_UNSUPPORTED: LOSS.DTYPE,
53
- /** Node ids that are not integers under the default sanitizeIds "error": export() throws E_INVALID_ID. */
77
+ /**
78
+ * Node ids the format cannot write, under `sanitizeIds: "error"`; the save fails with E_INVALID_ID. Pass
79
+ * `sanitizeIds: "mangle"` to rewrite them.
80
+ */
54
81
  ID_CHARSET: LOSS.ID_CHARSET,
55
82
  /** Node ids that are not integers under sanitizeIds "mangle": renumbered, originals kept. */
56
83
  ID_MANGLED: LOSS.ID_MANGLED,
@@ -59,10 +86,11 @@ export const CX2_LOSS = Object.freeze({
59
86
  });
60
87
 
61
88
  /**
62
- * What CX2 keeps (design section 1.3): directed multigraphs with self-loops, integer node ids,
89
+ * What CX2 keeps: directed multigraphs with self-loops, integer node ids,
63
90
  * required integer edge ids, declared string / double / integer / boolean columns and lists of
64
91
  * them, declared defaults, network attributes and the position role. f32, u32, u8 and dict columns
65
92
  * are written as the nearest declared type and read back as it.
93
+ * @category Built-in formats
66
94
  */
67
95
  export const CX2_CAPABILITIES: ExportCapabilities = capabilities({
68
96
  mixedDirection: false,
@@ -129,104 +157,6 @@ const CORE_ASPECTS: ReadonlySet<string> = new Set([
129
157
  /** The weight attribute name. */
130
158
  const WEIGHT_ATTRIBUTE = "weight";
131
159
 
132
- /**
133
- * The prefix of a string that stands for a raw number literal in the output: -0 (which
134
- * JSON.stringify writes as 0) and an integer id beyond 2^53 (kept as its digits).
135
- */
136
- const RAW = `${String.fromCharCode(0)}cx2:`;
137
-
138
- /** A raw literal as JSON.stringify writes it, to be unquoted. */
139
- const RAW_JSON = /"\\u0000cx2:(-?[0-9]+)"/g;
140
-
141
- /** An integer literal beyond 2^53 as text: a CX2 id graph-io keeps as its digits. */
142
- const BIG_INTEGER_TEXT = /^-?[1-9][0-9]{15,}$/;
143
-
144
- /** The node ids as written: the original, a renumbered one, or a raw big integer. */
145
- interface WrittenIds {
146
- /** How many ids were renumbered (sanitizeIds "mangle"). */
147
- readonly changed: number;
148
- /** The written id of node i (a number, or a RAW string for a big integer). */
149
- idAt(i: number): NodeId;
150
- /** Whether node i was renumbered. */
151
- isChanged(i: number): boolean;
152
- /** The original id of node i. */
153
- originalAt(i: number): NodeId;
154
- }
155
-
156
- /**
157
- * Whether an id can be written as a CX2 id unchanged: a safe integer, or the digits of an integer
158
- * beyond 2^53 (the CX2 importer reads those back as the same digits).
159
- * @param id - the id
160
- * @returns true when writable
161
- */
162
- function writableId(id: NodeId): boolean {
163
- return typeof id === "number"
164
- ? Number.isSafeInteger(id)
165
- : BIG_INTEGER_TEXT.test(id) && !Number.isSafeInteger(Number(id));
166
- }
167
-
168
- /**
169
- * The written node ids; under "error" an id that is not writable throws E_INVALID_ID, under
170
- * "mangle" it gets the next unused integer.
171
- * @param snapshot - the snapshot
172
- * @param mode - the sanitizeIds option
173
- * @returns the ids
174
- */
175
- function writtenIds(snapshot: GraphSnapshot, mode: "error" | "mangle"): WrittenIds {
176
- const { ids } = snapshot;
177
- const bad: number[] = [];
178
- const used = new Set<number>();
179
- for (let i = 0; i < ids.size; i++) {
180
- const id = ids.idOf(i);
181
- if (!writableId(id)) {
182
- bad.push(i);
183
- } else if (typeof id === "number") {
184
- used.add(id);
185
- }
186
- }
187
- if (bad.length > 0 && mode === "error") {
188
- const first = ids.idOf(bad[0]);
189
- throw new GraphFormatError(
190
- "E_INVALID_ID",
191
- `${bad.length} node id(s) cannot be written as CX2 integers (first: ${JSON.stringify(first)} at index ${bad[0]}); pass sanitizeIds: "mangle" to rewrite them`,
192
- { reason: "charset", charset: "integer", count: bad.length, index: bad[0] },
193
- );
194
- }
195
- const renumbered = new Map<number, number>();
196
- let next = 0;
197
- for (const i of bad) {
198
- while (used.has(next)) {
199
- next++;
200
- }
201
- used.add(next);
202
- renumbered.set(i, next);
203
- }
204
- return {
205
- changed: bad.length,
206
- idAt: (i: number): NodeId => {
207
- const id = renumbered.get(i) ?? ids.idOf(i);
208
- return typeof id === "string" ? `${RAW}${id}` : id;
209
- },
210
- isChanged: (i: number): boolean => renumbered.has(i),
211
- originalAt: (i: number): NodeId => ids.idOf(i),
212
- };
213
- }
214
-
215
- /**
216
- * How many node ids are not writable unchanged.
217
- * @param snapshot - the snapshot
218
- * @returns the count
219
- */
220
- function unwritableIds(snapshot: GraphSnapshot): number {
221
- let count = 0;
222
- for (let i = 0; i < snapshot.ids.size; i++) {
223
- if (!writableId(snapshot.ids.idOf(i))) {
224
- count++;
225
- }
226
- }
227
- return count;
228
- }
229
-
230
160
  /** One attribute column as it will be written. */
231
161
  interface AttributePlan {
232
162
  readonly column: Column;
@@ -277,62 +207,6 @@ function isZ(column: Column): boolean {
277
207
  return column.meta.extra.cytoscape === "z";
278
208
  }
279
209
 
280
- /**
281
- * The CX2 type of a scalar dtype.
282
- * @param dtype - the dtype
283
- * @param longOrigin - whether the source declared the column long
284
- * @returns the type text
285
- */
286
- function scalarType(dtype: string, longOrigin: boolean): string {
287
- switch (dtype) {
288
- case "f64":
289
- return longOrigin ? "long" : "double";
290
- case "f32":
291
- return "double";
292
- case "i32":
293
- case "u8":
294
- return "integer";
295
- case "u32":
296
- return "long";
297
- case "bool":
298
- return "boolean";
299
- default:
300
- return "string";
301
- }
302
- }
303
-
304
- /**
305
- * Whether every set value of an f64 column is integral (so a declared long stays long).
306
- * @param column - the column
307
- * @returns true when every set value is a safe integer
308
- */
309
- function allIntegral(column: Column): boolean {
310
- for (let i = 0; i < column.length; i++) {
311
- if (column.isSet(i) && !Number.isSafeInteger(column.value(i))) {
312
- return false;
313
- }
314
- }
315
- return true;
316
- }
317
-
318
- /**
319
- * The declared type of a column.
320
- * @param column - the column
321
- * @returns the CX2 type text
322
- */
323
- function declaredType(column: Column): string {
324
- const { meta } = column;
325
- const origin = meta.origin?.type ?? null;
326
- const longOrigin = origin !== null && /long$/.test(origin) && (meta.dtype !== "f64" || allIntegral(column));
327
- if (meta.dtype === "list") {
328
- return meta.itemDtype === null || meta.itemDtype === "json"
329
- ? "string"
330
- : `list_of_${scalarType(meta.itemDtype, longOrigin)}`;
331
- }
332
- // a multi-component column (a color, a 3D vector) is written as a list of its components
333
- return meta.components > 1 ? `list_of_${scalarType(meta.dtype, false)}` : scalarType(meta.dtype, longOrigin);
334
- }
335
-
336
210
  /**
337
211
  * Count the non-finite numbers of a column.
338
212
  * @param column - the column
@@ -355,7 +229,7 @@ function nonFiniteCount(column: Column): number {
355
229
  if ((value as readonly number[]).some((v) => !Number.isFinite(v))) {
356
230
  count++;
357
231
  }
358
- } else if (!Number.isFinite(value as number)) {
232
+ } else if (!Number.isFinite(value)) {
359
233
  count++;
360
234
  }
361
235
  }
@@ -439,27 +313,12 @@ function plan(snapshot: GraphSnapshot, common: ResolvedExportOptions): Plan {
439
313
  }
440
314
 
441
315
  const folding = pairFolding(snapshot);
442
- directionNotes(snapshot, folding, common, note);
316
+ directionNotes(snapshot, folding, common, CX2_LOSS.UNDIRECTED_AS_DIRECTED, note);
443
317
 
444
- const unwritable = unwritableIds(snapshot);
445
- if (unwritable > 0) {
446
- note(
447
- common.sanitizeIds === "mangle" ? LOSS.ID_MANGLED : LOSS.ID_CHARSET,
448
- common.sanitizeIds === "mangle"
449
- ? `${unwritable} node id(s) that are not integers are renumbered; the originals are kept in the ${ORIGINAL_ID_ATTRIBUTE} attribute (restored by restoreMangledIds)`
450
- : `${unwritable} node id(s) that are not integers; export() will throw unless sanitizeIds is "mangle"`,
451
- null,
452
- unwritable,
453
- );
454
- }
455
- let ids: WrittenIds | null = null;
456
- try {
457
- ids = writtenIds(snapshot, common.sanitizeIds);
458
- } catch (err) {
459
- if (!(err instanceof GraphFormatError)) {
460
- throw err;
461
- }
462
- fatal ??= err;
318
+ const planned = planNodeIds(snapshot, common, "CX2", ORIGINAL_ID_ATTRIBUTE, note);
319
+ const ids = planned instanceof GraphFormatError ? null : planned;
320
+ if (planned instanceof GraphFormatError) {
321
+ fatal ??= planned;
463
322
  }
464
323
 
465
324
  const weights = explicitWeights(snapshot);
@@ -513,22 +372,13 @@ function plan(snapshot: GraphSnapshot, common: ResolvedExportOptions): Plan {
513
372
  if (nonfinite > 0) {
514
373
  note(
515
374
  CX2_LOSS.NONFINITE_AS_NULL,
516
- `${nonfinite} NaN or infinite value(s) cannot be written in CX2; written as null, they read back unset`,
375
+ `${nonfinite} NaN or infinite value${plural(nonfinite)} cannot be written in CX2; written as null, they read back unset`,
517
376
  null,
518
377
  nonfinite,
519
378
  );
520
379
  }
521
380
 
522
381
  const edgeIds = planEdgeIds(snapshot, note);
523
- const idColumn = snapshot.edges.byRole("id");
524
- if (idColumn !== null && idColumn.dtype !== "f64") {
525
- note(
526
- LOSS.DTYPE,
527
- `edge id column "${idColumn.meta.name}" is ${idColumn.dtype}; CX2 edge ids are integers and read back as f64`,
528
- idColumn.meta.name,
529
- snapshot.edgeCount - idColumn.nullCount,
530
- );
531
- }
532
382
  const z = [...snapshot.nodes].find(isZ) ?? null;
533
383
  const positionZ = position !== null && z === null && position.meta.extra.sourceDims === 3;
534
384
  return {
@@ -550,139 +400,8 @@ function plan(snapshot: GraphSnapshot, common: ResolvedExportOptions): Plan {
550
400
  };
551
401
  }
552
402
 
553
- /**
554
- * The direction notes: every CX2 edge is directed, so an undirected snapshot (or the undirected
555
- * pairs of a mixed one, folded under onMixedDirection) is written directed, and a mutual pair as
556
- * two edges without its mark.
557
- * @param snapshot - the snapshot
558
- * @param folding - the pair folding
559
- * @param common - the resolved common options
560
- * @param note - records a note
561
- */
562
- function directionNotes(
563
- snapshot: GraphSnapshot,
564
- folding: PairFolding,
565
- common: ResolvedExportOptions,
566
- note: (code: string, message: string, column?: string | null, count?: number | null) => void,
567
- ): void {
568
- if (!snapshot.directed) {
569
- note(
570
- CX2_LOSS.UNDIRECTED_AS_DIRECTED,
571
- `the snapshot is undirected; every edge is written as a directed CX2 edge (${snapshot.edgeCount} edge(s))`,
572
- null,
573
- snapshot.edgeCount,
574
- );
575
- } else if (common.onMixedDirection !== "error") {
576
- let undirected = 0;
577
- for (let e = 0; e < snapshot.edgeCount; e++) {
578
- if (!folding.folded(e) && !folding.sourceDirected(e)) {
579
- undirected++;
580
- }
581
- }
582
- if (undirected > 0) {
583
- note(
584
- CX2_LOSS.UNDIRECTED_AS_DIRECTED,
585
- `${undirected} undirected edge(s) are written as one directed edge each (a pair folded to its primary); CX2 has no undirected edge`,
586
- null,
587
- undirected,
588
- );
589
- }
590
- }
591
- if (folding.mutualCount > 0) {
592
- note(
593
- LOSS.MUTUAL_EXPANDED,
594
- `${folding.mutualCount} mutual pair(s) are written as two directed edges; the mutual mark is lost`,
595
- null,
596
- folding.mutualCount,
597
- );
598
- }
599
- }
600
-
601
- /**
602
- * Count the positions with a non-finite x or y.
603
- * @param position - the position column
604
- * @returns the count
605
- */
606
- function nonFinitePositions(position: Column): number {
607
- let count = 0;
608
- for (let i = 0; i < position.length; i++) {
609
- if (position.isSet(i)) {
610
- const p = position.value(i) as ArrayLike<number>;
611
- if (!Number.isFinite(p[0]) || !Number.isFinite(p[1])) {
612
- count++;
613
- }
614
- }
615
- }
616
- return count;
617
- }
618
-
619
- /**
620
- * The edge ids to write: the id role column's values when they are distinct safe integers,
621
- * next unused integers for edges without one.
622
- * @param snapshot - the snapshot
623
- * @param note - records a note
624
- * @returns one id per edge
625
- */
626
- function planEdgeIds(
627
- snapshot: GraphSnapshot,
628
- note: (code: string, message: string, column?: string | null, count?: number | null) => void,
629
- ): number[] {
630
- const column = snapshot.edges.byRole("id");
631
- const ids: (number | null)[] = new Array<number | null>(snapshot.edgeCount).fill(null);
632
- const used = new Set<number>();
633
- let generated = 0;
634
- if (column !== null) {
635
- for (let e = 0; e < snapshot.edgeCount; e++) {
636
- const value = column.isSet(e) ? column.value(e) : undefined;
637
- let n = NaN;
638
- if (typeof value === "number") {
639
- n = value;
640
- } else if (typeof value === "string") {
641
- n = Number(value);
642
- }
643
- if (Number.isSafeInteger(n) && !used.has(n)) {
644
- ids[e] = n === 0 ? 0 : n;
645
- used.add(n);
646
- }
647
- }
648
- }
649
- let next = 0;
650
- const out: number[] = [];
651
- for (let e = 0; e < snapshot.edgeCount; e++) {
652
- let id = ids[e];
653
- if (id === null) {
654
- while (used.has(next)) {
655
- next++;
656
- }
657
- id = next;
658
- used.add(next);
659
- generated++;
660
- }
661
- out.push(id);
662
- }
663
- if (column !== null && generated > 0) {
664
- note(
665
- LOSS.EDGE_IDS_GENERATED,
666
- `${generated} edge(s) have no distinct integer id in "${column.meta.name}"; they are written with generated ids`,
667
- column.meta.name,
668
- generated,
669
- );
670
- }
671
- return out;
672
- }
673
-
674
403
  // ============================================================ writing
675
404
 
676
- /**
677
- * The JSON text of a value, keeping -0.
678
- * @param value - the value
679
- * @returns the text
680
- */
681
- function stringify(value: unknown): string {
682
- const text = JSON.stringify(value, (_key, v: unknown) => (Object.is(v, -0) ? `${RAW}-0` : v));
683
- return text.includes("\\u0000cx2:") ? text.replace(RAW_JSON, "$1") : text;
684
- }
685
-
686
405
  /**
687
406
  * The value written for one cell.
688
407
  * @param p - the attribute plan
@@ -913,15 +632,17 @@ function* write(snapshot: GraphSnapshot, p: Plan): Generator<string, void, undef
913
632
  * @param aspect - the aspect name
914
633
  * @param count - its element count
915
634
  * @param element - the JSON text of element k
916
- * @yields the block's text
917
- * @returns nothing
635
+ * @returns the block's text parts
918
636
  */
919
- function* block(aspect: string, count: number, element: (k: number) => string): Generator<string, void, undefined> {
920
- yield `{${JSON.stringify(aspect)}:[`;
921
- for (let k = 0; k < count; k++) {
922
- yield k === 0 ? `\n${element(k)}` : `,\n${element(k)}`;
923
- }
924
- yield "]},\n";
637
+ function block(aspect: string, count: number, element: (k: number) => string): Generator<string, void, undefined> {
638
+ return aspectBlock(
639
+ aspect,
640
+ (function* elements(): Generator<string, void, undefined> {
641
+ for (let k = 0; k < count; k++) {
642
+ yield element(k);
643
+ }
644
+ })(),
645
+ );
925
646
  }
926
647
 
927
648
  /**
@@ -998,10 +719,12 @@ function bypassValues(columns: readonly Column[], row: number): Record<string, u
998
719
  }
999
720
 
1000
721
  /**
1001
- * The CX2 exporter plugin (design section 1.3).
722
+ * The CX2 exporter plugin.
723
+ * @category Built-in formats
1002
724
  */
1003
725
  export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
1004
726
  format: CX2_FORMAT,
727
+ options: Object.freeze([]),
1005
728
  capabilities: CX2_CAPABILITIES,
1006
729
 
1007
730
  /**
@@ -1010,7 +733,7 @@ export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
1010
733
  * @param options - the common options
1011
734
  * @returns the notes, empty when the export is exact
1012
735
  */
1013
- check(snapshot: GraphSnapshot, options?: Cx2ExportOptions & CommonExportOptions): readonly LossNote[] {
736
+ check(snapshot: GraphSnapshot, options?: Cx2ExportOptions): readonly LossNote[] {
1014
737
  return Object.freeze([...plan(snapshot, resolveExportOptions(options)).notes]);
1015
738
  },
1016
739
 
@@ -1020,7 +743,7 @@ export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
1020
743
  * @param options - the common options
1021
744
  * @returns the chunks
1022
745
  */
1023
- export(snapshot: GraphSnapshot, options?: Cx2ExportOptions & CommonExportOptions): AsyncIterable<Uint8Array> {
746
+ export(snapshot: GraphSnapshot, options?: Cx2ExportOptions): AsyncIterable<Uint8Array> {
1024
747
  return encodeChunks(write(snapshot, plan(snapshot, resolveExportOptions(options))));
1025
748
  },
1026
749
 
@@ -1030,7 +753,7 @@ export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
1030
753
  * @param options - the common options
1031
754
  * @returns the document
1032
755
  */
1033
- exportToString(snapshot: GraphSnapshot, options?: Cx2ExportOptions & CommonExportOptions): Promise<string> {
756
+ exportToString(snapshot: GraphSnapshot, options?: Cx2ExportOptions): Promise<string> {
1034
757
  return joinText(write(snapshot, plan(snapshot, resolveExportOptions(options))));
1035
758
  },
1036
759
  });