@graphty/graph-io 0.3.24 → 0.3.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/README.md +49 -414
  2. package/dist/chunks/children-CL3Cy0ez.js.map +1 -1
  3. package/dist/chunks/choose-BbJI55dx.js +56 -0
  4. package/dist/chunks/choose-BbJI55dx.js.map +1 -0
  5. package/dist/chunks/constants-BCsFsMj4.js +231 -0
  6. package/dist/chunks/constants-BCsFsMj4.js.map +1 -0
  7. package/dist/chunks/{escape-B-tkk_Cl.js → escape-D0g6NNUy.js} +382 -92
  8. package/dist/chunks/escape-D0g6NNUy.js.map +1 -0
  9. package/dist/chunks/export-BTI4yQgy.js +4333 -0
  10. package/dist/chunks/export-BTI4yQgy.js.map +1 -0
  11. package/dist/chunks/exporter-BMqk5oxW.js +3465 -0
  12. package/dist/chunks/exporter-BMqk5oxW.js.map +1 -0
  13. package/dist/chunks/{importer-eUREhBGj.js → exporter-Cra2GYcN.js} +4969 -3201
  14. package/dist/chunks/exporter-Cra2GYcN.js.map +1 -0
  15. package/dist/chunks/{exporter-BGrsWamJ.js → exporter-Dxh231ZF.js} +38 -229
  16. package/dist/chunks/exporter-Dxh231ZF.js.map +1 -0
  17. package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-tne475KK.js} +22 -20
  18. package/dist/chunks/exporter-tne475KK.js.map +1 -0
  19. package/dist/chunks/importer-90YWhJoF.js +2811 -0
  20. package/dist/chunks/importer-90YWhJoF.js.map +1 -0
  21. package/dist/chunks/{importer-D_e7e7LX.js → importer-Bcl1d4xH.js} +398 -145
  22. package/dist/chunks/importer-Bcl1d4xH.js.map +1 -0
  23. package/dist/chunks/{importer-BWY2FFc5.js → importer-BfIsp1f9.js} +255 -77
  24. package/dist/chunks/importer-BfIsp1f9.js.map +1 -0
  25. package/dist/chunks/{importer-zGLo8Dg_.js → importer-C_TEA1zJ.js} +484 -157
  26. package/dist/chunks/importer-C_TEA1zJ.js.map +1 -0
  27. package/dist/chunks/{importer-DET1tg6s.js → importer-DCjOvO7U.js} +1687 -310
  28. package/dist/chunks/importer-DCjOvO7U.js.map +1 -0
  29. package/dist/chunks/{importer-vi3bSdtw.js → importer-DfVu6j59.js} +509 -76
  30. package/dist/chunks/importer-DfVu6j59.js.map +1 -0
  31. package/dist/chunks/{importer-DIrbbnAf.js → importer-Dku_VAIY.js} +585 -226
  32. package/dist/chunks/importer-Dku_VAIY.js.map +1 -0
  33. package/dist/chunks/json-elements-3tnyt5uZ.js +1225 -0
  34. package/dist/chunks/json-elements-3tnyt5uZ.js.map +1 -0
  35. package/dist/chunks/ontology-export-B9Tcf37D.js +357 -0
  36. package/dist/chunks/ontology-export-B9Tcf37D.js.map +1 -0
  37. package/dist/chunks/{records-dbRkxwaq.js → records-CQXT__mY.js} +298 -114
  38. package/dist/chunks/records-CQXT__mY.js.map +1 -0
  39. package/dist/chunks/{text-Dr0Ifpag.js → text-DmcUs5_Q.js} +29 -11
  40. package/dist/chunks/text-DmcUs5_Q.js.map +1 -0
  41. package/dist/chunks/{writer-C7flM-Ih.js → writer-DxjgHwSe.js} +19 -1
  42. package/dist/chunks/writer-DxjgHwSe.js.map +1 -0
  43. package/dist/csv.js +951 -261
  44. package/dist/csv.js.map +1 -1
  45. package/dist/cx.js +6 -3
  46. package/dist/cx2.js +2 -2
  47. package/dist/cys.js +6 -3
  48. package/dist/dot.js +1 -1
  49. package/dist/gexf.js +554 -122
  50. package/dist/gexf.js.map +1 -1
  51. package/dist/gml.js +342 -85
  52. package/dist/gml.js.map +1 -1
  53. package/dist/graph-io.js +1105 -213
  54. package/dist/graph-io.js.map +1 -1
  55. package/dist/graphml.js +3 -2
  56. package/dist/graphml.js.map +1 -1
  57. package/dist/json.js +3 -2
  58. package/dist/neo4j.js +564 -157
  59. package/dist/neo4j.js.map +1 -1
  60. package/dist/obo.js +6 -3
  61. package/dist/pajek.js +1 -1
  62. package/dist/src/children.d.ts +18 -6
  63. package/dist/src/children.d.ts.map +1 -1
  64. package/dist/src/children.js +6 -3
  65. package/dist/src/children.js.map +1 -1
  66. package/dist/src/common/attributes.d.ts +29 -11
  67. package/dist/src/common/attributes.d.ts.map +1 -1
  68. package/dist/src/common/attributes.js +25 -7
  69. package/dist/src/common/attributes.js.map +1 -1
  70. package/dist/src/common/cell-budget.d.ts +9 -2
  71. package/dist/src/common/cell-budget.d.ts.map +1 -1
  72. package/dist/src/common/cell-budget.js +11 -3
  73. package/dist/src/common/cell-budget.js.map +1 -1
  74. package/dist/src/common/choose.d.ts +19 -0
  75. package/dist/src/common/choose.d.ts.map +1 -0
  76. package/dist/src/common/choose.js +72 -0
  77. package/dist/src/common/choose.js.map +1 -0
  78. package/dist/src/common/codes.d.ts +456 -66
  79. package/dist/src/common/codes.d.ts.map +1 -1
  80. package/dist/src/common/codes.js +458 -66
  81. package/dist/src/common/codes.js.map +1 -1
  82. package/dist/src/common/compare.d.ts +81 -0
  83. package/dist/src/common/compare.d.ts.map +1 -0
  84. package/dist/src/common/compare.js +394 -0
  85. package/dist/src/common/compare.js.map +1 -0
  86. package/dist/src/common/cx-export.d.ts +123 -0
  87. package/dist/src/common/cx-export.d.ts.map +1 -0
  88. package/dist/src/common/cx-export.js +334 -0
  89. package/dist/src/common/cx-export.js.map +1 -0
  90. package/dist/src/common/declared-types.d.ts +22 -2
  91. package/dist/src/common/declared-types.d.ts.map +1 -1
  92. package/dist/src/common/declared-types.js +19 -1
  93. package/dist/src/common/declared-types.js.map +1 -1
  94. package/dist/src/common/direction.d.ts +74 -50
  95. package/dist/src/common/direction.d.ts.map +1 -1
  96. package/dist/src/common/direction.js +47 -27
  97. package/dist/src/common/direction.js.map +1 -1
  98. package/dist/src/common/escape.d.ts +21 -9
  99. package/dist/src/common/escape.d.ts.map +1 -1
  100. package/dist/src/common/escape.js +33 -17
  101. package/dist/src/common/escape.js.map +1 -1
  102. package/dist/src/common/export.d.ts +144 -32
  103. package/dist/src/common/export.d.ts.map +1 -1
  104. package/dist/src/common/export.js +216 -42
  105. package/dist/src/common/export.js.map +1 -1
  106. package/dist/src/common/format.d.ts +23 -1
  107. package/dist/src/common/format.d.ts.map +1 -1
  108. package/dist/src/common/format.js +26 -1
  109. package/dist/src/common/format.js.map +1 -1
  110. package/dist/src/common/ids.d.ts +9 -2
  111. package/dist/src/common/ids.d.ts.map +1 -1
  112. package/dist/src/common/ids.js +6 -2
  113. package/dist/src/common/ids.js.map +1 -1
  114. package/dist/src/common/input.d.ts +122 -28
  115. package/dist/src/common/input.d.ts.map +1 -1
  116. package/dist/src/common/input.js +890 -124
  117. package/dist/src/common/input.js.map +1 -1
  118. package/dist/src/common/json-elements.d.ts +144 -20
  119. package/dist/src/common/json-elements.d.ts.map +1 -1
  120. package/dist/src/common/json-elements.js +868 -188
  121. package/dist/src/common/json-elements.js.map +1 -1
  122. package/dist/src/common/line-format.d.ts +90 -0
  123. package/dist/src/common/line-format.d.ts.map +1 -0
  124. package/dist/src/common/line-format.js +185 -0
  125. package/dist/src/common/line-format.js.map +1 -0
  126. package/dist/src/common/lists.d.ts +6 -1
  127. package/dist/src/common/lists.d.ts.map +1 -1
  128. package/dist/src/common/lists.js +2 -0
  129. package/dist/src/common/lists.js.map +1 -1
  130. package/dist/src/common/ontology-export.d.ts +167 -0
  131. package/dist/src/common/ontology-export.d.ts.map +1 -0
  132. package/dist/src/common/ontology-export.js +359 -0
  133. package/dist/src/common/ontology-export.js.map +1 -0
  134. package/dist/src/common/ontology.d.ts +25 -3
  135. package/dist/src/common/ontology.d.ts.map +1 -1
  136. package/dist/src/common/ontology.js +30 -9
  137. package/dist/src/common/ontology.js.map +1 -1
  138. package/dist/src/common/options.d.ts +62 -12
  139. package/dist/src/common/options.d.ts.map +1 -1
  140. package/dist/src/common/options.js +89 -11
  141. package/dist/src/common/options.js.map +1 -1
  142. package/dist/src/common/plural.d.ts +31 -0
  143. package/dist/src/common/plural.d.ts.map +1 -0
  144. package/dist/src/common/plural.js +46 -0
  145. package/dist/src/common/plural.js.map +1 -0
  146. package/dist/src/common/report.d.ts +72 -14
  147. package/dist/src/common/report.d.ts.map +1 -1
  148. package/dist/src/common/report.js +146 -22
  149. package/dist/src/common/report.js.map +1 -1
  150. package/dist/src/common/temporal.d.ts +22 -5
  151. package/dist/src/common/temporal.d.ts.map +1 -1
  152. package/dist/src/common/temporal.js +13 -2
  153. package/dist/src/common/temporal.js.map +1 -1
  154. package/dist/src/common/text.d.ts +39 -23
  155. package/dist/src/common/text.d.ts.map +1 -1
  156. package/dist/src/common/text.js +51 -21
  157. package/dist/src/common/text.js.map +1 -1
  158. package/dist/src/common/weights.d.ts +37 -4
  159. package/dist/src/common/weights.d.ts.map +1 -1
  160. package/dist/src/common/weights.js +61 -2
  161. package/dist/src/common/weights.js.map +1 -1
  162. package/dist/src/common/writer.d.ts +19 -3
  163. package/dist/src/common/writer.d.ts.map +1 -1
  164. package/dist/src/common/writer.js +30 -2
  165. package/dist/src/common/writer.js.map +1 -1
  166. package/dist/src/common/xml.d.ts +125 -9
  167. package/dist/src/common/xml.d.ts.map +1 -1
  168. package/dist/src/common/xml.js +400 -83
  169. package/dist/src/common/xml.js.map +1 -1
  170. package/dist/src/common/zip.d.ts +44 -4
  171. package/dist/src/common/zip.d.ts.map +1 -1
  172. package/dist/src/common/zip.js +134 -5
  173. package/dist/src/common/zip.js.map +1 -1
  174. package/dist/src/formats/csv/exporter.d.ts +80 -24
  175. package/dist/src/formats/csv/exporter.d.ts.map +1 -1
  176. package/dist/src/formats/csv/exporter.js +145 -32
  177. package/dist/src/formats/csv/exporter.js.map +1 -1
  178. package/dist/src/formats/csv/header.d.ts +38 -9
  179. package/dist/src/formats/csv/header.d.ts.map +1 -1
  180. package/dist/src/formats/csv/header.js +46 -10
  181. package/dist/src/formats/csv/header.js.map +1 -1
  182. package/dist/src/formats/csv/importer.d.ts +187 -37
  183. package/dist/src/formats/csv/importer.d.ts.map +1 -1
  184. package/dist/src/formats/csv/importer.js +835 -204
  185. package/dist/src/formats/csv/importer.js.map +1 -1
  186. package/dist/src/formats/csv/index.d.ts +100 -19
  187. package/dist/src/formats/csv/index.d.ts.map +1 -1
  188. package/dist/src/formats/csv/index.js +94 -21
  189. package/dist/src/formats/csv/index.js.map +1 -1
  190. package/dist/src/formats/csv/records.d.ts +95 -10
  191. package/dist/src/formats/csv/records.d.ts.map +1 -1
  192. package/dist/src/formats/csv/records.js +333 -122
  193. package/dist/src/formats/csv/records.js.map +1 -1
  194. package/dist/src/formats/csv/values.d.ts +1 -0
  195. package/dist/src/formats/csv/values.d.ts.map +1 -1
  196. package/dist/src/formats/csv/values.js +1 -0
  197. package/dist/src/formats/csv/values.js.map +1 -1
  198. package/dist/src/formats/cx/exporter.d.ts +102 -0
  199. package/dist/src/formats/cx/exporter.d.ts.map +1 -0
  200. package/dist/src/formats/cx/exporter.js +1217 -0
  201. package/dist/src/formats/cx/exporter.js.map +1 -0
  202. package/dist/src/formats/cx/importer.d.ts +79 -32
  203. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  204. package/dist/src/formats/cx/importer.js +680 -285
  205. package/dist/src/formats/cx/importer.js.map +1 -1
  206. package/dist/src/formats/cx/index.d.ts +4 -3
  207. package/dist/src/formats/cx/index.d.ts.map +1 -1
  208. package/dist/src/formats/cx/index.js +4 -3
  209. package/dist/src/formats/cx/index.js.map +1 -1
  210. package/dist/src/formats/cx2/exporter.d.ts +29 -11
  211. package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
  212. package/dist/src/formats/cx2/exporter.js +39 -268
  213. package/dist/src/formats/cx2/exporter.js.map +1 -1
  214. package/dist/src/formats/cx2/importer.d.ts +78 -28
  215. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  216. package/dist/src/formats/cx2/importer.js +226 -79
  217. package/dist/src/formats/cx2/importer.js.map +1 -1
  218. package/dist/src/formats/cx2/index.d.ts +2 -1
  219. package/dist/src/formats/cx2/index.d.ts.map +1 -1
  220. package/dist/src/formats/cx2/index.js +2 -1
  221. package/dist/src/formats/cx2/index.js.map +1 -1
  222. package/dist/src/formats/cys/constants.d.ts +66 -17
  223. package/dist/src/formats/cys/constants.d.ts.map +1 -1
  224. package/dist/src/formats/cys/constants.js +59 -18
  225. package/dist/src/formats/cys/constants.js.map +1 -1
  226. package/dist/src/formats/cys/exporter.d.ts +118 -0
  227. package/dist/src/formats/cys/exporter.d.ts.map +1 -0
  228. package/dist/src/formats/cys/exporter.js +1072 -0
  229. package/dist/src/formats/cys/exporter.js.map +1 -0
  230. package/dist/src/formats/cys/importer.d.ts +22 -8
  231. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  232. package/dist/src/formats/cys/importer.js +510 -149
  233. package/dist/src/formats/cys/importer.js.map +1 -1
  234. package/dist/src/formats/cys/index.d.ts +4 -2
  235. package/dist/src/formats/cys/index.d.ts.map +1 -1
  236. package/dist/src/formats/cys/index.js +4 -2
  237. package/dist/src/formats/cys/index.js.map +1 -1
  238. package/dist/src/formats/cys/session.d.ts +46 -7
  239. package/dist/src/formats/cys/session.d.ts.map +1 -1
  240. package/dist/src/formats/cys/session.js +98 -24
  241. package/dist/src/formats/cys/session.js.map +1 -1
  242. package/dist/src/formats/cys/tables.d.ts +9 -2
  243. package/dist/src/formats/cys/tables.d.ts.map +1 -1
  244. package/dist/src/formats/cys/tables.js +29 -7
  245. package/dist/src/formats/cys/tables.js.map +1 -1
  246. package/dist/src/formats/dot/exporter.d.ts +42 -14
  247. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  248. package/dist/src/formats/dot/exporter.js +56 -29
  249. package/dist/src/formats/dot/exporter.js.map +1 -1
  250. package/dist/src/formats/dot/importer.d.ts +91 -29
  251. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  252. package/dist/src/formats/dot/importer.js +190 -39
  253. package/dist/src/formats/dot/importer.js.map +1 -1
  254. package/dist/src/formats/dot/index.d.ts +2 -1
  255. package/dist/src/formats/dot/index.d.ts.map +1 -1
  256. package/dist/src/formats/dot/index.js +2 -1
  257. package/dist/src/formats/dot/index.js.map +1 -1
  258. package/dist/src/formats/dot/names.d.ts +44 -11
  259. package/dist/src/formats/dot/names.d.ts.map +1 -1
  260. package/dist/src/formats/dot/names.js +44 -11
  261. package/dist/src/formats/dot/names.js.map +1 -1
  262. package/dist/src/formats/dot/tokenizer.d.ts +9 -2
  263. package/dist/src/formats/dot/tokenizer.d.ts.map +1 -1
  264. package/dist/src/formats/dot/tokenizer.js +20 -5
  265. package/dist/src/formats/dot/tokenizer.js.map +1 -1
  266. package/dist/src/formats/gexf/exporter.d.ts +46 -15
  267. package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
  268. package/dist/src/formats/gexf/exporter.js +45 -15
  269. package/dist/src/formats/gexf/exporter.js.map +1 -1
  270. package/dist/src/formats/gexf/importer.d.ts +87 -23
  271. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  272. package/dist/src/formats/gexf/importer.js +471 -90
  273. package/dist/src/formats/gexf/importer.js.map +1 -1
  274. package/dist/src/formats/gexf/index.d.ts +84 -21
  275. package/dist/src/formats/gexf/index.d.ts.map +1 -1
  276. package/dist/src/formats/gexf/index.js +80 -23
  277. package/dist/src/formats/gexf/index.js.map +1 -1
  278. package/dist/src/formats/gexf/schema.d.ts +67 -15
  279. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  280. package/dist/src/formats/gexf/schema.js +59 -13
  281. package/dist/src/formats/gexf/schema.js.map +1 -1
  282. package/dist/src/formats/gml/exporter.d.ts +69 -21
  283. package/dist/src/formats/gml/exporter.d.ts.map +1 -1
  284. package/dist/src/formats/gml/exporter.js +74 -29
  285. package/dist/src/formats/gml/exporter.js.map +1 -1
  286. package/dist/src/formats/gml/importer.d.ts +116 -25
  287. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  288. package/dist/src/formats/gml/importer.js +290 -61
  289. package/dist/src/formats/gml/importer.js.map +1 -1
  290. package/dist/src/formats/gml/index.d.ts +87 -24
  291. package/dist/src/formats/gml/index.d.ts.map +1 -1
  292. package/dist/src/formats/gml/index.js +79 -26
  293. package/dist/src/formats/gml/index.js.map +1 -1
  294. package/dist/src/formats/gml/syntax.d.ts +67 -18
  295. package/dist/src/formats/gml/syntax.d.ts.map +1 -1
  296. package/dist/src/formats/gml/syntax.js +108 -26
  297. package/dist/src/formats/gml/syntax.js.map +1 -1
  298. package/dist/src/formats/graphml/constants.d.ts +174 -44
  299. package/dist/src/formats/graphml/constants.d.ts.map +1 -1
  300. package/dist/src/formats/graphml/constants.js +165 -44
  301. package/dist/src/formats/graphml/constants.js.map +1 -1
  302. package/dist/src/formats/graphml/exporter.d.ts +17 -9
  303. package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
  304. package/dist/src/formats/graphml/exporter.js +33 -12
  305. package/dist/src/formats/graphml/exporter.js.map +1 -1
  306. package/dist/src/formats/graphml/importer.d.ts +19 -7
  307. package/dist/src/formats/graphml/importer.d.ts.map +1 -1
  308. package/dist/src/formats/graphml/importer.js +466 -39
  309. package/dist/src/formats/graphml/importer.js.map +1 -1
  310. package/dist/src/formats/graphml/index.d.ts +2 -1
  311. package/dist/src/formats/graphml/index.d.ts.map +1 -1
  312. package/dist/src/formats/graphml/index.js +2 -1
  313. package/dist/src/formats/graphml/index.js.map +1 -1
  314. package/dist/src/formats/graphml/tree.d.ts +6 -2
  315. package/dist/src/formats/graphml/tree.d.ts.map +1 -1
  316. package/dist/src/formats/graphml/tree.js +6 -2
  317. package/dist/src/formats/graphml/tree.js.map +1 -1
  318. package/dist/src/formats/graphml/yfiles.d.ts +8 -3
  319. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  320. package/dist/src/formats/graphml/yfiles.js +36 -15
  321. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  322. package/dist/src/formats/json/dialect.d.ts +88 -24
  323. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  324. package/dist/src/formats/json/dialect.js +109 -19
  325. package/dist/src/formats/json/dialect.js.map +1 -1
  326. package/dist/src/formats/json/exporter.d.ts +134 -22
  327. package/dist/src/formats/json/exporter.d.ts.map +1 -1
  328. package/dist/src/formats/json/exporter.js +135 -54
  329. package/dist/src/formats/json/exporter.js.map +1 -1
  330. package/dist/src/formats/json/importer.d.ts +173 -52
  331. package/dist/src/formats/json/importer.d.ts.map +1 -1
  332. package/dist/src/formats/json/importer.js +899 -220
  333. package/dist/src/formats/json/importer.js.map +1 -1
  334. package/dist/src/formats/json/index.d.ts +3 -2
  335. package/dist/src/formats/json/index.d.ts.map +1 -1
  336. package/dist/src/formats/json/index.js +3 -2
  337. package/dist/src/formats/json/index.js.map +1 -1
  338. package/dist/src/formats/json/obographs-export.d.ts +68 -0
  339. package/dist/src/formats/json/obographs-export.d.ts.map +1 -0
  340. package/dist/src/formats/json/obographs-export.js +941 -0
  341. package/dist/src/formats/json/obographs-export.js.map +1 -0
  342. package/dist/src/formats/json/obographs.d.ts +26 -0
  343. package/dist/src/formats/json/obographs.d.ts.map +1 -1
  344. package/dist/src/formats/json/obographs.js +297 -80
  345. package/dist/src/formats/json/obographs.js.map +1 -1
  346. package/dist/src/formats/neo4j/exporter.d.ts +109 -21
  347. package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
  348. package/dist/src/formats/neo4j/exporter.js +238 -85
  349. package/dist/src/formats/neo4j/exporter.js.map +1 -1
  350. package/dist/src/formats/neo4j/header.d.ts +17 -4
  351. package/dist/src/formats/neo4j/header.d.ts.map +1 -1
  352. package/dist/src/formats/neo4j/header.js +36 -4
  353. package/dist/src/formats/neo4j/header.js.map +1 -1
  354. package/dist/src/formats/neo4j/importer.d.ts +107 -27
  355. package/dist/src/formats/neo4j/importer.d.ts.map +1 -1
  356. package/dist/src/formats/neo4j/importer.js +415 -63
  357. package/dist/src/formats/neo4j/importer.js.map +1 -1
  358. package/dist/src/formats/neo4j/index.d.ts +73 -23
  359. package/dist/src/formats/neo4j/index.d.ts.map +1 -1
  360. package/dist/src/formats/neo4j/index.js +65 -25
  361. package/dist/src/formats/neo4j/index.js.map +1 -1
  362. package/dist/src/formats/obo/exporter.d.ts +150 -0
  363. package/dist/src/formats/obo/exporter.d.ts.map +1 -0
  364. package/dist/src/formats/obo/exporter.js +1736 -0
  365. package/dist/src/formats/obo/exporter.js.map +1 -0
  366. package/dist/src/formats/obo/importer.d.ts +95 -19
  367. package/dist/src/formats/obo/importer.d.ts.map +1 -1
  368. package/dist/src/formats/obo/importer.js +475 -104
  369. package/dist/src/formats/obo/importer.js.map +1 -1
  370. package/dist/src/formats/obo/index.d.ts +6 -3
  371. package/dist/src/formats/obo/index.d.ts.map +1 -1
  372. package/dist/src/formats/obo/index.js +6 -3
  373. package/dist/src/formats/obo/index.js.map +1 -1
  374. package/dist/src/formats/obo/syntax.d.ts +108 -4
  375. package/dist/src/formats/obo/syntax.d.ts.map +1 -1
  376. package/dist/src/formats/obo/syntax.js +211 -34
  377. package/dist/src/formats/obo/syntax.js.map +1 -1
  378. package/dist/src/formats/pajek/exporter.d.ts +54 -16
  379. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  380. package/dist/src/formats/pajek/exporter.js +66 -34
  381. package/dist/src/formats/pajek/exporter.js.map +1 -1
  382. package/dist/src/formats/pajek/importer.d.ts +84 -22
  383. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  384. package/dist/src/formats/pajek/importer.js +303 -83
  385. package/dist/src/formats/pajek/importer.js.map +1 -1
  386. package/dist/src/formats/pajek/index.d.ts +2 -1
  387. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  388. package/dist/src/formats/pajek/index.js +2 -1
  389. package/dist/src/formats/pajek/index.js.map +1 -1
  390. package/dist/src/formats/pajek/syntax.d.ts +77 -14
  391. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  392. package/dist/src/formats/pajek/syntax.js +183 -51
  393. package/dist/src/formats/pajek/syntax.js.map +1 -1
  394. package/dist/src/formats/xgmml/columns.d.ts +1 -0
  395. package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
  396. package/dist/src/formats/xgmml/columns.js +4 -0
  397. package/dist/src/formats/xgmml/columns.js.map +1 -1
  398. package/dist/src/formats/xgmml/constants.d.ts +186 -56
  399. package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
  400. package/dist/src/formats/xgmml/constants.js +181 -57
  401. package/dist/src/formats/xgmml/constants.js.map +1 -1
  402. package/dist/src/formats/xgmml/document.d.ts +65 -11
  403. package/dist/src/formats/xgmml/document.d.ts.map +1 -1
  404. package/dist/src/formats/xgmml/document.js +157 -28
  405. package/dist/src/formats/xgmml/document.js.map +1 -1
  406. package/dist/src/formats/xgmml/emit.d.ts +61 -3
  407. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  408. package/dist/src/formats/xgmml/emit.js +129 -26
  409. package/dist/src/formats/xgmml/emit.js.map +1 -1
  410. package/dist/src/formats/xgmml/exporter.d.ts +13 -6
  411. package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
  412. package/dist/src/formats/xgmml/exporter.js +20 -21
  413. package/dist/src/formats/xgmml/exporter.js.map +1 -1
  414. package/dist/src/formats/xgmml/importer.d.ts +33 -12
  415. package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
  416. package/dist/src/formats/xgmml/importer.js +35 -72
  417. package/dist/src/formats/xgmml/importer.js.map +1 -1
  418. package/dist/src/formats/xgmml/index.d.ts +1 -0
  419. package/dist/src/formats/xgmml/index.d.ts.map +1 -1
  420. package/dist/src/formats/xgmml/index.js +1 -0
  421. package/dist/src/formats/xgmml/index.js.map +1 -1
  422. package/dist/src/formats/xgmml/values.d.ts +8 -1
  423. package/dist/src/formats/xgmml/values.d.ts.map +1 -1
  424. package/dist/src/formats/xgmml/values.js +7 -2
  425. package/dist/src/formats/xgmml/values.js.map +1 -1
  426. package/dist/src/index.d.ts +23 -18
  427. package/dist/src/index.d.ts.map +1 -1
  428. package/dist/src/index.js +28 -16
  429. package/dist/src/index.js.map +1 -1
  430. package/dist/src/registry.d.ts +478 -92
  431. package/dist/src/registry.d.ts.map +1 -1
  432. package/dist/src/registry.js +807 -88
  433. package/dist/src/registry.js.map +1 -1
  434. package/dist/src/sniff.d.ts +61 -19
  435. package/dist/src/sniff.d.ts.map +1 -1
  436. package/dist/src/sniff.js +121 -29
  437. package/dist/src/sniff.js.map +1 -1
  438. package/dist/src/types.d.ts +362 -112
  439. package/dist/src/types.d.ts.map +1 -1
  440. package/dist/src/types.js +28 -7
  441. package/dist/src/types.js.map +1 -1
  442. package/dist/xgmml.js +2 -2
  443. package/docs/samples/README.md +25 -0
  444. package/docs/samples/got-edges.csv +353 -0
  445. package/docs/samples/got-network.graphml +1384 -0
  446. package/docs/samples/got-nodes.csv +108 -0
  447. package/docs/samples/got.cx +930 -0
  448. package/docs/samples/got.cx2 +465 -0
  449. package/docs/samples/got.gexf +471 -0
  450. package/docs/samples/got.gml +2650 -0
  451. package/docs/samples/got.json +2546 -0
  452. package/docs/samples/got.net +461 -0
  453. package/docs/samples/movies-nodes.csv +9 -0
  454. package/docs/samples/movies-rels.csv +8 -0
  455. package/docs/samples/networks.cys +0 -0
  456. package/docs/samples/proteins.xgmml +9 -0
  457. package/docs/samples/teams.gv +24 -0
  458. package/docs/samples/vehicles.obo +25 -0
  459. package/package.json +9 -4
  460. package/src/children.ts +18 -6
  461. package/src/common/attributes.ts +29 -11
  462. package/src/common/cell-budget.ts +11 -3
  463. package/src/common/choose.ts +89 -0
  464. package/src/common/codes.ts +490 -66
  465. package/src/common/compare.ts +472 -0
  466. package/src/common/cx-export.ts +432 -0
  467. package/src/common/declared-types.ts +38 -4
  468. package/src/common/direction.ts +78 -51
  469. package/src/common/escape.ts +33 -17
  470. package/src/common/export.ts +284 -47
  471. package/src/common/format.ts +30 -1
  472. package/src/common/ids.ts +14 -3
  473. package/src/common/input.ts +1057 -134
  474. package/src/common/json-elements.ts +1034 -198
  475. package/src/common/line-format.ts +249 -0
  476. package/src/common/lists.ts +6 -1
  477. package/src/common/ontology-export.ts +461 -0
  478. package/src/common/ontology.ts +31 -9
  479. package/src/common/options.ts +110 -15
  480. package/src/common/plural.ts +49 -0
  481. package/src/common/report.ts +168 -25
  482. package/src/common/temporal.ts +22 -5
  483. package/src/common/text.ts +62 -23
  484. package/src/common/weights.ts +74 -4
  485. package/src/common/writer.ts +37 -3
  486. package/src/common/xml.ts +477 -88
  487. package/src/common/zip.ts +169 -7
  488. package/src/formats/csv/exporter.ts +201 -46
  489. package/src/formats/csv/header.ts +50 -11
  490. package/src/formats/csv/importer.ts +1133 -245
  491. package/src/formats/csv/index.ts +106 -19
  492. package/src/formats/csv/records.ts +396 -122
  493. package/src/formats/csv/values.ts +1 -0
  494. package/src/formats/cx/exporter.ts +1483 -0
  495. package/src/formats/cx/importer.ts +888 -300
  496. package/src/formats/cx/index.ts +4 -3
  497. package/src/formats/cx2/exporter.ts +61 -338
  498. package/src/formats/cx2/importer.ts +317 -86
  499. package/src/formats/cx2/index.ts +2 -1
  500. package/src/formats/cys/constants.ts +62 -17
  501. package/src/formats/cys/exporter.ts +1368 -0
  502. package/src/formats/cys/importer.ts +659 -157
  503. package/src/formats/cys/index.ts +4 -2
  504. package/src/formats/cys/session.ts +139 -31
  505. package/src/formats/cys/tables.ts +47 -9
  506. package/src/formats/dot/exporter.ts +83 -37
  507. package/src/formats/dot/importer.ts +248 -54
  508. package/src/formats/dot/index.ts +2 -1
  509. package/src/formats/dot/names.ts +44 -11
  510. package/src/formats/dot/tokenizer.ts +25 -6
  511. package/src/formats/gexf/exporter.ts +57 -18
  512. package/src/formats/gexf/importer.ts +636 -105
  513. package/src/formats/gexf/index.ts +90 -21
  514. package/src/formats/gexf/schema.ts +67 -15
  515. package/src/formats/gml/exporter.ts +90 -36
  516. package/src/formats/gml/importer.ts +388 -67
  517. package/src/formats/gml/index.ts +85 -24
  518. package/src/formats/gml/syntax.ts +111 -26
  519. package/src/formats/graphml/constants.ts +178 -44
  520. package/src/formats/graphml/exporter.ts +52 -18
  521. package/src/formats/graphml/importer.ts +640 -60
  522. package/src/formats/graphml/index.ts +2 -1
  523. package/src/formats/graphml/tree.ts +6 -2
  524. package/src/formats/graphml/yfiles.ts +37 -15
  525. package/src/formats/json/dialect.ts +128 -29
  526. package/src/formats/json/exporter.ts +205 -68
  527. package/src/formats/json/importer.ts +1163 -253
  528. package/src/formats/json/index.ts +3 -1
  529. package/src/formats/json/obographs-export.ts +1197 -0
  530. package/src/formats/json/obographs.ts +353 -92
  531. package/src/formats/neo4j/exporter.ts +320 -101
  532. package/src/formats/neo4j/header.ts +44 -6
  533. package/src/formats/neo4j/importer.ts +512 -73
  534. package/src/formats/neo4j/index.ts +75 -23
  535. package/src/formats/obo/exporter.ts +2210 -0
  536. package/src/formats/obo/importer.ts +622 -109
  537. package/src/formats/obo/index.ts +6 -3
  538. package/src/formats/obo/syntax.ts +232 -37
  539. package/src/formats/pajek/exporter.ts +89 -41
  540. package/src/formats/pajek/importer.ts +407 -93
  541. package/src/formats/pajek/index.ts +2 -1
  542. package/src/formats/pajek/syntax.ts +213 -52
  543. package/src/formats/xgmml/columns.ts +10 -0
  544. package/src/formats/xgmml/constants.ts +183 -56
  545. package/src/formats/xgmml/document.ts +212 -34
  546. package/src/formats/xgmml/emit.ts +175 -34
  547. package/src/formats/xgmml/exporter.ts +35 -27
  548. package/src/formats/xgmml/importer.ts +64 -86
  549. package/src/formats/xgmml/index.ts +1 -0
  550. package/src/formats/xgmml/values.ts +11 -3
  551. package/src/index.ts +81 -11
  552. package/src/registry.ts +1121 -135
  553. package/src/sniff.ts +163 -32
  554. package/src/types.ts +385 -114
  555. package/dist/chunks/escape-B-tkk_Cl.js.map +0 -1
  556. package/dist/chunks/export-Bh60Dv-n.js +0 -582
  557. package/dist/chunks/export-Bh60Dv-n.js.map +0 -1
  558. package/dist/chunks/exporter-BGrsWamJ.js.map +0 -1
  559. package/dist/chunks/exporter-DIeGJXAZ.js.map +0 -1
  560. package/dist/chunks/importer-BWY2FFc5.js.map +0 -1
  561. package/dist/chunks/importer-DD-xv9_Y.js +0 -1471
  562. package/dist/chunks/importer-DD-xv9_Y.js.map +0 -1
  563. package/dist/chunks/importer-DET1tg6s.js.map +0 -1
  564. package/dist/chunks/importer-DEcKhsmQ.js +0 -1614
  565. package/dist/chunks/importer-DEcKhsmQ.js.map +0 -1
  566. package/dist/chunks/importer-DIrbbnAf.js.map +0 -1
  567. package/dist/chunks/importer-D_e7e7LX.js.map +0 -1
  568. package/dist/chunks/importer-eUREhBGj.js.map +0 -1
  569. package/dist/chunks/importer-vi3bSdtw.js.map +0 -1
  570. package/dist/chunks/importer-zGLo8Dg_.js.map +0 -1
  571. package/dist/chunks/json-elements-DDS8N2Dd.js +0 -779
  572. package/dist/chunks/json-elements-DDS8N2Dd.js.map +0 -1
  573. package/dist/chunks/ontology-BnrJ4I98.js +0 -113
  574. package/dist/chunks/ontology-BnrJ4I98.js.map +0 -1
  575. package/dist/chunks/records-dbRkxwaq.js.map +0 -1
  576. package/dist/chunks/report-B1z4WT9e.js +0 -2372
  577. package/dist/chunks/report-B1z4WT9e.js.map +0 -1
  578. package/dist/chunks/text-Dr0Ifpag.js.map +0 -1
  579. package/dist/chunks/weights-Dzba96G3.js +0 -176
  580. package/dist/chunks/weights-Dzba96G3.js.map +0 -1
  581. package/dist/chunks/writer-C7flM-Ih.js.map +0 -1
@@ -12,17 +12,23 @@
12
12
 
13
13
  import { type ColumnDecl, type ColumnRole, GraphFormatError } from "@graphty/graph-format";
14
14
 
15
- /** The temporal kinds a declared type can map to; each fixes the parse grammar and the canonical text. */
15
+ /**
16
+ * The temporal kinds a declared type can map to; each fixes the parse grammar and the canonical text.
17
+ * @category Plugin helpers
18
+ */
16
19
  export type TemporalKind = "date" | "dateTime" | "localDateTime" | "time" | "localTime";
17
20
 
18
21
  /**
19
22
  * The GEXF `timeformat` values (design section 5.9).
20
- * Consumed by the per-format importers and exporters under src/formats.
21
23
  * @public
24
+ * @category Plugin helpers
22
25
  */
23
26
  export type TimeFormat = "integer" | "double" | "date" | "dateTime";
24
27
 
25
- /** A parsed temporal value: the number stored in the column and the source text when it must be kept. */
28
+ /**
29
+ * A parsed temporal value: the number stored in the column and the source text when it must be kept.
30
+ * @category Plugin helpers
31
+ */
26
32
  export interface TemporalValue {
27
33
  /** Epoch milliseconds (date, dateTime, localDateTime), milliseconds since midnight (time, localTime), or the raw number. */
28
34
  readonly value: number;
@@ -30,10 +36,16 @@ export interface TemporalValue {
30
36
  readonly text: string | null;
31
37
  }
32
38
 
33
- /** The role of a companion text column. */
39
+ /**
40
+ * The role of a companion text column.
41
+ * @category Plugin helpers
42
+ */
34
43
  export const TIME_TEXT_ROLE: ColumnRole = "timeText";
35
44
 
36
- /** The suffix of a companion text column's name. */
45
+ /**
46
+ * The suffix of a companion text column's name.
47
+ * @category Plugin helpers
48
+ */
37
49
  export const TIME_TEXT_SUFFIX = ".text";
38
50
 
39
51
  const DATE_TIME =
@@ -49,6 +61,7 @@ const MS_PER_DAY = 86_400_000;
49
61
  * @param text - the source text (already trimmed)
50
62
  * @param kind - the temporal kind
51
63
  * @returns the value and, when the canonical form differs, the source text; E_COLUMN_TYPE when the text is not of the kind
64
+ * @category Plugin helpers
52
65
  */
53
66
  export function parseTemporal(text: string, kind: TemporalKind): TemporalValue {
54
67
  let value: number;
@@ -79,6 +92,7 @@ export function parseTemporal(text: string, kind: TemporalKind): TemporalValue {
79
92
  * @param text - the source text
80
93
  * @param timeFormat - the graph's timeformat, or null when the file declares none
81
94
  * @returns the value and the source text when it must be kept
95
+ * @category Plugin helpers
82
96
  */
83
97
  export function parseTimeText(text: string, timeFormat: TimeFormat | null): TemporalValue {
84
98
  const trimmed = text.trim();
@@ -105,6 +119,7 @@ export function parseTimeText(text: string, timeFormat: TimeFormat | null): Temp
105
119
  * @param kind - the temporal kind
106
120
  * @returns the canonical text: `YYYY-MM-DD`, `YYYY-MM-DDTHH:MM:SS[.mmm]Z`, `YYYY-MM-DDTHH:MM:SS[.mmm]`,
107
121
  * `HH:MM:SS[.mmm]Z` or `HH:MM:SS[.mmm]`
122
+ * @category Plugin helpers
108
123
  */
109
124
  export function formatTemporal(value: number, kind: TemporalKind): string {
110
125
  switch (kind) {
@@ -141,6 +156,7 @@ export function formatTemporal(value: number, kind: TemporalKind): string {
141
156
  * @param value - the value as stored
142
157
  * @param timeFormat - the graph's timeformat, or null for a file that declares none (double)
143
158
  * @returns the text
159
+ * @category Plugin helpers
144
160
  */
145
161
  export function formatTimeValue(value: number, timeFormat: TimeFormat | null): string {
146
162
  switch (timeFormat) {
@@ -163,6 +179,7 @@ export function formatTimeValue(value: number, timeFormat: TimeFormat | null): s
163
179
  * The declaration of the companion text column of a temporal column (design section 5.1).
164
180
  * @param column - the temporal column's name
165
181
  * @returns a string column named `<column>.text` with role timeText and `extra.for` naming the column
182
+ * @category Plugin helpers
166
183
  */
167
184
  export function timeTextCompanion(column: string): ColumnDecl {
168
185
  return {
@@ -15,6 +15,7 @@
15
15
 
16
16
  import { type ColumnHandle, GraphFormatError, type GraphSink, INVALID_INDEX } from "@graphty/graph-format";
17
17
 
18
+ import { PRECISION_CODE } from "./codes.js";
18
19
  import { type ImportReportBuilder } from "./report.js";
19
20
 
20
21
  const I32_TEXT = /^-?(0|[1-9][0-9]*)$/;
@@ -23,16 +24,30 @@ const I32_MIN = -2147483648;
23
24
  const I32_MAX = 2147483647;
24
25
 
25
26
  /**
26
- * The dtype a text cell parses as under the design section 5.1 grammar.
27
- * Consumed by the per-format importers and exporters under src/formats.
27
+ * The dtype a text cell parses as under the fixed text grammar.
28
28
  * @public
29
+ * @category Plugin helpers
29
30
  */
30
31
  export type TextDtype = "bool" | "i32" | "f64" | "string";
31
32
 
33
+ /**
34
+ * A digit string without its trailing zeros (`"1200"` becomes `"12"`).
35
+ * @param digits - the digits
36
+ * @returns the digits up to the last one that is not 0
37
+ */
38
+ export function trimTrailingZeros(digits: string): string {
39
+ let end = digits.length;
40
+ while (end > 0 && digits[end - 1] === "0") {
41
+ end--;
42
+ }
43
+ return digits.slice(0, end);
44
+ }
45
+
32
46
  /**
33
47
  * Classify one text cell by the fixed grammar.
34
48
  * @param text - the cell text, exactly as read (no trimming)
35
49
  * @returns bool, i32, f64 or string
50
+ * @category Plugin helpers
36
51
  */
37
52
  export function inferTextDtype(text: string): TextDtype {
38
53
  if (text === "true" || text === "false") {
@@ -56,6 +71,7 @@ export function inferTextDtype(text: string): TextDtype {
56
71
  * i32 / f64, the text itself for string. The sink infers the column dtype from the value.
57
72
  * @param text - the cell text, exactly as read
58
73
  * @returns the value
74
+ * @category Plugin helpers
59
75
  */
60
76
  export function parseTextCell(text: string): boolean | number | string {
61
77
  switch (inferTextDtype(text)) {
@@ -75,6 +91,7 @@ export function parseTextCell(text: string): boolean | number | string {
75
91
  * Whether a text cell is a number under the f64 grammar (an i32 or f64 literal).
76
92
  * @param text - the cell text
77
93
  * @returns true when parseTextCell(text) returns a number
94
+ * @category Plugin helpers
78
95
  */
79
96
  export function isNumericText(text: string): boolean {
80
97
  const dtype = inferTextDtype(text);
@@ -115,20 +132,23 @@ function textDtypeRank(dtype: TextDtype): number {
115
132
  }
116
133
 
117
134
  /**
118
- * The inferred-column writer of the untyped text formats (CSV, DOT, Pajek; design section 5.1):
119
- * parses every cell by the fixed grammar and pushes the scalar, and keeps the COLUMN's dtype the
120
- * one the grammar implies rather than the one the values happen to imply:
135
+ * Writes the cells of one attribute of a text format whose values carry no type (CSV, DOT, Pajek):
136
+ * you hand it each cell's text and it stores a number, a boolean or text, choosing one type for the
137
+ * whole attribute. A column of `2.0`, `3.5` stays a number column with decimals even though `2.0`
138
+ * alone looks like an integer, and once one cell turns out to be text, earlier cells such as `1e5`
139
+ * are kept as written instead of as `100000`. Create one writer per attribute name and per kind
140
+ * ("node" or "edge"), and call `write(index, text)` with the node or edge index the sink gave you:
121
141
  *
122
- * - a column whose cells are all `2.0`-style f64 text is widened to f64 through the sink's
123
- * widening call even though every value is integral (the values alone would infer i32);
124
- * - a numeric cell whose text is not the canonical spelling of its value (`1e5`, `-0`, `1.0`) is
125
- * remembered, and when a later cell widens the column to string the original texts are written
126
- * back, so the lexical form is never rewritten by the widening.
142
+ * ```ts
143
+ * const color = new TextCellWriter("color", "node", sink, report);
144
+ * color.write(sink.addNode("a"), "red");
145
+ * ```
127
146
  *
128
- * A sink without the optional widening call keeps the value-inferred dtype and the writer records
129
- * one W_WIDENING_UNSUPPORTED warning per column.
130
- * Consumed by the per-format importers under src/formats.
147
+ * A sink that cannot change a column's type after the fact (one of your own without
148
+ * `widenNodeColumn` / `widenEdgeColumn`) keeps the type the first values implied, with one W_WIDENING_UNSUPPORTED warning
149
+ * per attribute.
131
150
  * @public
151
+ * @category Writing a format
132
152
  */
133
153
  export class TextCellWriter {
134
154
  /** The column name in the sink. */
@@ -153,11 +173,11 @@ export class TextCellWriter {
153
173
  private readonly keptTexts: string[] = [];
154
174
 
155
175
  /**
156
- * Create a writer; the column is declared by the sink's inference on the first write.
157
- * @param name - the column name
158
- * @param domain - node or edge
159
- * @param sink - the sink
160
- * @param report - the report the widening warning is recorded in
176
+ * Create a writer. The attribute is added to the sink on the first write.
177
+ * @param name - the attribute name
178
+ * @param domain - "node" for a node attribute, "edge" for an edge attribute
179
+ * @param sink - the sink the importer fills
180
+ * @param report - the import report, for warnings about the values
161
181
  */
162
182
  constructor(name: string, domain: "node" | "edge", sink: GraphSink, report: ImportReportBuilder) {
163
183
  this.name = name;
@@ -167,7 +187,7 @@ export class TextCellWriter {
167
187
  }
168
188
 
169
189
  /**
170
- * The column handle once the first cell was written.
190
+ * The sink's handle of the attribute's column, for reading it back.
171
191
  * @returns the handle, or INVALID_INDEX before the first write
172
192
  */
173
193
  get column(): ColumnHandle {
@@ -175,13 +195,28 @@ export class TextCellWriter {
175
195
  }
176
196
 
177
197
  /**
178
- * Write one cell text.
179
- * @param row - the node or edge index
180
- * @param text - the cell text, exactly as read
198
+ * Write one cell.
199
+ * @param row - the node or edge index, as the sink's addNode() or addEdge() returned it
200
+ * @param text - the cell text, exactly as read from the file
181
201
  */
182
202
  write(row: number, text: string): void {
183
203
  const kind = inferTextDtype(text);
184
204
  const value = parseTextCell(text);
205
+ if (
206
+ typeof value === "number" &&
207
+ !Number.isSafeInteger(value) &&
208
+ I32_TEXT.test(text) &&
209
+ BigInt(text) !== BigInt(value)
210
+ ) {
211
+ // an integer beyond 2^53 is stored as the nearest double; say so once per column
212
+ this.report.warnOnce(
213
+ "precision",
214
+ PRECISION_CODE,
215
+ `${this.domain} column "${this.name}": integers beyond 2^53 are stored as the nearest double (first: ${text})`,
216
+ { element: this.name },
217
+ `${PRECISION_CODE}:${this.domain}:${this.name}`,
218
+ );
219
+ }
185
220
  const wasString = this.textDtype === "string";
186
221
  const textDtype =
187
222
  this.textDtype === null || textDtypeRank(kind) > textDtypeRank(this.textDtype) ? kind : this.textDtype;
@@ -273,7 +308,11 @@ export class TextCellWriter {
273
308
  }
274
309
  }
275
310
 
276
- /** Issue code: the sink has no widening call, so a text column keeps the dtype its values imply. */
311
+ /**
312
+ * Your graph builder cannot change an attribute's type after its first value, so a text column keeps the type of its
313
+ * first values.
314
+ * @category Issue and loss codes
315
+ */
277
316
  export const WIDENING_UNSUPPORTED_CODE = "W_WIDENING_UNSUPPORTED";
278
317
 
279
318
  /**
@@ -12,10 +12,15 @@
12
12
 
13
13
  import { type Column, GraphFormatError, type GraphSnapshot } from "@graphty/graph-format";
14
14
 
15
+ import { PRECISION_CODE } from "./codes.js";
15
16
  import { parseDecimalText } from "./declared-types.js";
16
17
  import { formatF32, formatF64, formatInteger } from "./format.js";
18
+ import { type ImportReportBuilder } from "./report.js";
17
19
 
18
- /** The weight of an edge added without one (design section 3.7). */
20
+ /**
21
+ * The weight of an edge added without one (design section 3.7).
22
+ * @category Plugin helpers
23
+ */
19
24
  export const DEFAULT_WEIGHT = 1;
20
25
 
21
26
  /**
@@ -23,6 +28,7 @@ export const DEFAULT_WEIGHT = 1;
23
28
  * @param name - the field name (attribute title, CSV header, JSON key)
24
29
  * @param weightFrom - the resolved option; null means unweighted
25
30
  * @returns true when the field is THE weight
31
+ * @category Plugin helpers
26
32
  */
27
33
  export function isWeightField(name: string, weightFrom: string | null): boolean {
28
34
  return weightFrom !== null && name === weightFrom;
@@ -32,9 +38,12 @@ export function isWeightField(name: string, weightFrom: string | null): boolean
32
38
  * The weight argument of addEdge from a text cell: undefined for a blank cell (the weight is
33
39
  * omitted), the number otherwise.
34
40
  * @param text - the cell text
41
+ * @param report - the import report; when given, an integer beyond 2^53 that the nearest double
42
+ * changes is reported once as W_PRECISION
35
43
  * @returns the weight, or undefined when blank; E_INVALID_WEIGHT for NaN or non-numeric text
44
+ * @category Writing a format
36
45
  */
37
- export function parseWeightText(text: string): number | undefined {
46
+ export function parseWeightText(text: string, report?: ImportReportBuilder): number | undefined {
38
47
  const trimmed = text.trim();
39
48
  if (trimmed.length === 0) {
40
49
  return undefined;
@@ -48,14 +57,42 @@ export function parseWeightText(text: string): number | undefined {
48
57
  if (Number.isNaN(value)) {
49
58
  throw invalidWeight(text, null);
50
59
  }
60
+ if (report !== undefined) {
61
+ reportWeightPrecision(trimmed, value, report);
62
+ }
51
63
  return value;
52
64
  }
53
65
 
66
+ /**
67
+ * Report once (W_PRECISION) an integer weight beyond 2^53 that the nearest double changes, which
68
+ * the weights and the exact `graphty.weight` column would otherwise hold silently.
69
+ * @param text - the weight as written in the file
70
+ * @param value - the number it was read as
71
+ * @param report - the import report
72
+ */
73
+ export function reportWeightPrecision(text: string, value: number, report: ImportReportBuilder): void {
74
+ if (
75
+ !Number.isSafeInteger(value) &&
76
+ Number.isFinite(value) &&
77
+ /^[+-]?\d+$/.test(text) &&
78
+ BigInt(text) !== BigInt(value)
79
+ ) {
80
+ report.warnOnce(
81
+ "precision",
82
+ PRECISION_CODE,
83
+ `edge weights: integers beyond 2^53 are stored as the nearest double (first: ${text})`,
84
+ undefined,
85
+ `${PRECISION_CODE}:edge weight`,
86
+ );
87
+ }
88
+ }
89
+
54
90
  /**
55
91
  * The weight argument of addEdge from a typed value (JSON, a record field): undefined for null /
56
92
  * undefined, the number for a finite or infinite number, the parsed number for numeric text.
57
93
  * @param value - the field value
58
94
  * @returns the weight, or undefined when absent; E_INVALID_WEIGHT for NaN, a boolean, an object or non-numeric text
95
+ * @category Plugin helpers
59
96
  */
60
97
  export function weightFromValue(value: unknown): number | undefined {
61
98
  if (value === undefined || value === null) {
@@ -100,12 +137,12 @@ function invalidWeight(value: unknown, cause: unknown): GraphFormatError {
100
137
  // ============================================================ the exporter side
101
138
 
102
139
  /**
103
- * The explicit weights of a snapshot for exporters (design sections 3.7 and 8.5): the weight
140
+ * The explicit weights of a snapshot for exporters: the weight
104
141
  * role column when present (its validity says which edges had an explicit weight, its dtype how
105
142
  * the value is written), else `edgeList().weights` as f32 for every edge of a weighted snapshot;
106
143
  * nothing for an unweighted one. One implementation for every exporter.
107
- * Consumed by the per-format exporters under src/formats.
108
144
  * @public
145
+ * @category Plugin helpers
109
146
  */
110
147
  export interface ExplicitWeights {
111
148
  /** Whether any edge can have an explicit weight (the snapshot is weighted). */
@@ -161,6 +198,7 @@ function weightFormatter(dtype: string): (value: number) => string {
161
198
  * Build the explicit-weight view of a snapshot.
162
199
  * @param snapshot - the snapshot
163
200
  * @returns the view
201
+ * @category Writing a format
164
202
  */
165
203
  export function explicitWeights(snapshot: GraphSnapshot): ExplicitWeights {
166
204
  const shadowColumn = snapshot.edges.byRole("weight");
@@ -209,3 +247,35 @@ export function explicitWeights(snapshot: GraphSnapshot): ExplicitWeights {
209
247
  },
210
248
  };
211
249
  }
250
+
251
+ /**
252
+ * The weight of every edge, in edge order (`weights[e]` is edge `e`'s weight), exactly as the file
253
+ * wrote it, or null for a graph without weights. `snapshot.edgeList().weights` holds the same
254
+ * weights as 32-bit floats, in which 0.1 reads back as 0.10000000149011612; this reads the exact
255
+ * values the import also kept. An edge without a weight of its own has the weight 1.
256
+ * @example
257
+ * ```ts
258
+ * const { snapshot } = await importGraph("source,target,weight\na,b,0.1\n", { format: "csv" });
259
+ * edgeWeights(snapshot); // Float64Array [ 0.1 ]
260
+ * ```
261
+ * @param snapshot - the graph
262
+ * @returns one weight per edge, or null when the graph has no weights
263
+ * @category Loading
264
+ */
265
+ export function edgeWeights(snapshot: GraphSnapshot): Float64Array | null {
266
+ const { weights } = snapshot.edgeList();
267
+ if (weights === null) {
268
+ return null;
269
+ }
270
+ const out = Float64Array.from(weights);
271
+ const exact = snapshot.edges.byRole("weight");
272
+ if (exact !== null) {
273
+ for (let e = 0; e < out.length; e++) {
274
+ const v = exact.value(e);
275
+ if (typeof v === "number") {
276
+ out[e] = v;
277
+ }
278
+ }
279
+ }
280
+ return out;
281
+ }
@@ -6,14 +6,19 @@
6
6
  * `ReadableStream<Uint8Array>` for a caller that wants a stream.
7
7
  */
8
8
 
9
+ import { GraphFormatError } from "@graphty/graph-format";
10
+
9
11
  /**
10
12
  * Text parts an exporter produces.
11
- * Consumed by the per-format importers and exporters under src/formats.
12
13
  * @public
14
+ * @category Plugin helpers
13
15
  */
14
16
  export type TextParts = Iterable<string> | AsyncIterable<string>;
15
17
 
16
- /** The target size of one encoded chunk; parts are coalesced up to it and never split. */
18
+ /**
19
+ * The target size of one encoded chunk; parts are coalesced up to it and never split.
20
+ * @category Plugin helpers
21
+ */
17
22
  export const DEFAULT_CHUNK_BYTES = 64 * 1024;
18
23
 
19
24
  /**
@@ -24,6 +29,7 @@ export const DEFAULT_CHUNK_BYTES = 64 * 1024;
24
29
  * @param chunkBytes - the target chunk size in bytes
25
30
  * @yields UTF-8 chunks
26
31
  * @returns nothing
32
+ * @category Writing a format
27
33
  */
28
34
  export async function* encodeChunks(
29
35
  parts: TextParts,
@@ -54,6 +60,7 @@ export async function* encodeChunks(
54
60
  * Join text parts into one string.
55
61
  * @param parts - the text parts
56
62
  * @returns the whole document
63
+ * @category Writing a format
57
64
  */
58
65
  export async function joinText(parts: TextParts): Promise<string> {
59
66
  const collected: string[] = [];
@@ -67,6 +74,7 @@ export async function joinText(parts: TextParts): Promise<string> {
67
74
  * Decode UTF-8 chunks back into one string (for tests and for callers holding an export() result).
68
75
  * @param chunks - the chunks
69
76
  * @returns the decoded text
77
+ * @category Plugin helpers
70
78
  */
71
79
  export async function decodeChunks(chunks: AsyncIterable<Uint8Array>): Promise<string> {
72
80
  const decoder = new TextDecoder("utf-8", { fatal: true });
@@ -82,6 +90,7 @@ export async function decodeChunks(chunks: AsyncIterable<Uint8Array>): Promise<s
82
90
  * Collect UTF-8 chunks into one Uint8Array.
83
91
  * @param chunks - the chunks
84
92
  * @returns the concatenated bytes
93
+ * @category Plugin helpers
85
94
  */
86
95
  export async function collectBytes(chunks: AsyncIterable<Uint8Array>): Promise<Uint8Array> {
87
96
  const parts: Uint8Array[] = [];
@@ -101,9 +110,10 @@ export async function collectBytes(chunks: AsyncIterable<Uint8Array>): Promise<U
101
110
 
102
111
  /**
103
112
  * Wrap an async iterable of chunks as a ReadableStream, pulling one chunk per read and cancelling
104
- * the iterable when the stream is cancelled.
113
+ * the iterable when the stream is canceled.
105
114
  * @param chunks - the chunks
106
115
  * @returns a byte stream
116
+ * @category Saving
107
117
  */
108
118
  export function toReadableStream(chunks: AsyncIterable<Uint8Array>): ReadableStream<Uint8Array> {
109
119
  const iterator = chunks[Symbol.asyncIterator]();
@@ -121,3 +131,27 @@ export function toReadableStream(chunks: AsyncIterable<Uint8Array>): ReadableStr
121
131
  },
122
132
  });
123
133
  }
134
+
135
+ /**
136
+ * The indentation of one nesting level from an `indent` option: a number of spaces (0 to 16), or
137
+ * the text itself (spaces or tabs). The JSON and DOT exporters take the same option this way.
138
+ * @param value - the option value
139
+ * @param fallback - the indentation when the option is not given
140
+ * @returns the text of one level; "" for none
141
+ */
142
+ export function indentUnit(value: unknown, fallback: string): string {
143
+ if (value === undefined) {
144
+ return fallback;
145
+ }
146
+ if (typeof value === "number" && Number.isInteger(value) && value >= 0 && value <= 16) {
147
+ return " ".repeat(value);
148
+ }
149
+ if (typeof value === "string" && /^[ \t]{0,16}$/.test(value)) {
150
+ return value;
151
+ }
152
+ throw new GraphFormatError(
153
+ "E_UNSUPPORTED",
154
+ `option indent: ${typeof value === "string" || typeof value === "number" ? JSON.stringify(value) : typeof value} is not a number of spaces (0 to 16) or a string of spaces or tabs`,
155
+ { option: "indent", found: typeof value === "string" || typeof value === "number" ? value : typeof value },
156
+ );
157
+ }