@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
@@ -29,27 +29,53 @@ import { capabilities, checkCapabilities, LOSS } from "../../common/export.js";
29
29
  import { formatF32, formatF64, formatInteger } from "../../common/format.js";
30
30
  import { isCanonicalIntegerText } from "../../common/ids.js";
31
31
  import { resolveExportOptions } from "../../common/options.js";
32
+ import { agree, plural } from "../../common/plural.js";
32
33
  import { formatTemporal } from "../../common/temporal.js";
33
34
  import { explicitWeights } from "../../common/weights.js";
34
35
  import { encodeChunks, joinText } from "../../common/writer.js";
35
36
  import { checkRecordSyntax } from "../csv/records.js";
36
37
  import { formatHeaderField } from "./header.js";
37
38
  import { ID_SPACE_COLUMN, LABELS_COLUMN, TYPE_COLUMN } from "./importer.js";
38
- /** Loss code: undirected edges (an undirected snapshot, or the folded pairs of a mixed one) written as directed relationships. */
39
+ /**
40
+ * Neo4j relationships are always directed, so the edges of an undirected graph, and the undirected edges of a mixed
41
+ * graph, read back as directed.
42
+ * @category Built-in formats
43
+ */
39
44
  export const UNDIRECTED_LOSS = "W_NEO4J_UNDIRECTED_AS_DIRECTED";
40
- /** Loss code: node ids whose text re-imports as another type under the canonical id rule. */
45
+ /**
46
+ * Node ids that read back as a different type, such as the text "7" as the number 7.
47
+ * @category Built-in formats
48
+ */
41
49
  export const ID_TEXT_TYPE_LOSS = ID_TEXT_TYPE_CODE;
42
- /** Loss code: two node ids share one text; export() throws E_INVALID_ID. */
50
+ /**
51
+ * Two node ids share one text; export() throws E_INVALID_ID.
52
+ * @category Built-in formats
53
+ */
43
54
  export const ID_TEXT_COLLISION_LOSS = ID_TEXT_COLLISION_CODE;
44
- /** Loss code: an edge property column already uses the weight column name; export() throws E_COLUMN_EXISTS. */
55
+ /**
56
+ * The `weightColumn` name is already an edge attribute; the save fails.
57
+ * @category Built-in formats
58
+ */
45
59
  export const WEIGHT_COLUMN_TAKEN_LOSS = "E_NEO4J_WEIGHT_COLUMN_TAKEN";
46
- /** Loss code: a node property column already uses the idColumn name; export() throws E_COLUMN_EXISTS. */
60
+ /**
61
+ * The `idColumn` name is already a node attribute; the save fails.
62
+ * @category Built-in formats
63
+ */
47
64
  export const ID_COLUMN_TAKEN_LOSS = "E_NEO4J_ID_COLUMN_TAKEN";
48
- /** Loss code: a node has more than one stored-id column set; only the first is written. */
65
+ /**
66
+ * A node has more than one stored-id column set; only the first is written.
67
+ * @category Built-in formats
68
+ */
49
69
  export const MULTIPLE_ID_PROPERTIES_LOSS = "W_NEO4J_MULTIPLE_ID_PROPERTIES";
50
- /** Loss code: a declared integer type holds non-integral values and is written as double. */
70
+ /**
71
+ * A declared integer type holds non-integral values and is written as double.
72
+ * @category Built-in formats
73
+ */
51
74
  export const DECLARED_TYPE_CHANGED_LOSS = "W_NEO4J_DECLARED_TYPE_CHANGED";
52
- /** Loss code: a list item contains the array delimiter, which Neo4j cannot escape. */
75
+ /**
76
+ * A list item contains the array delimiter, which Neo4j cannot escape.
77
+ * @category Built-in formats
78
+ */
53
79
  export const ARRAY_DELIMITER_LOSS = "W_NEO4J_ARRAY_DELIMITER";
54
80
  /** The roles Neo4j has a slot for: `:TYPE`, `:LABEL` and the id space of `:ID(Space)`. */
55
81
  const SLOT_ROLES = new Set(["kind", "labels", "idSpace"]);
@@ -64,10 +90,11 @@ const ROLE_NAMES = Object.freeze({
64
90
  idSpace: ID_SPACE_COLUMN,
65
91
  });
66
92
  /**
67
- * The capabilities of neo4j-admin CSV (research note 07 section 9): declared scalar types and
93
+ * The capabilities of neo4j-admin CSV: declared scalar types and
68
94
  * arrays; a dict column reads back as string (the header has no enumeration type); a position or
69
95
  * visual column is written as a plain property (a point for a 2- or 3-component position) and
70
96
  * reads back without its role.
97
+ * @category Built-in formats
71
98
  */
72
99
  export const NEO4J_CAPABILITIES = capabilities({
73
100
  mixedDirection: false,
@@ -130,9 +157,10 @@ const PARTS = new Set(["all", "nodes", "relationships"]);
130
157
  /**
131
158
  * Resolve the format options.
132
159
  * @param options - the caller's options
160
+ * @param readFrom - the property a Neo4j import read the weights from, the default weightColumn
133
161
  * @returns the resolved options; E_UNSUPPORTED for an invalid value
134
162
  */
135
- function resolveNeo4jExportOptions(options) {
163
+ function resolveNeo4jExportOptions(options, readFrom) {
136
164
  const o = options ?? {};
137
165
  const part = o.part ?? "all";
138
166
  if (!PARTS.has(part)) {
@@ -148,12 +176,12 @@ function resolveNeo4jExportOptions(options) {
148
176
  const delimiter = o.delimiter ?? ",";
149
177
  const syntax = { ...checkRecordSyntax({ delimiter, quote: o.quote ?? '"' }), delimiter };
150
178
  if (syntax.delimiter === arrayDelimiter) {
151
- throw new GraphFormatError("E_UNSUPPORTED", "options delimiter and arrayDelimiter must differ", {
179
+ throw new GraphFormatError("E_UNSUPPORTED", `options delimiter and arrayDelimiter must differ: both are ${JSON.stringify(arrayDelimiter)}; pass another arrayDelimiter (";", "," or "|")`, {
152
180
  option: "arrayDelimiter",
153
181
  found: arrayDelimiter,
154
182
  });
155
183
  }
156
- const weightColumn = o.weightColumn === undefined ? "weight" : o.weightColumn;
184
+ const weightColumn = o.weightColumn === undefined ? (readFrom ?? "weight") : o.weightColumn;
157
185
  if (weightColumn !== null && (typeof weightColumn !== "string" || weightColumn.length === 0)) {
158
186
  throw new GraphFormatError("E_UNSUPPORTED", "option weightColumn: expected a non-empty name or null", {
159
187
  option: "weightColumn",
@@ -211,6 +239,7 @@ class ExportPlan {
211
239
  roles: SLOT_ROLES,
212
240
  roleNames: ROLE_NAMES,
213
241
  temporalText: true,
242
+ weights: options.weightColumn !== null,
214
243
  });
215
244
  this.planColumns("node", snapshot.nodes, this.nodeColumns);
216
245
  this.planColumns("edge", snapshot.edges, this.edgeColumns);
@@ -257,7 +286,7 @@ class ExportPlan {
257
286
  directionNotes() {
258
287
  const { snapshot, folding } = this;
259
288
  if (!snapshot.directed) {
260
- this.note(UNDIRECTED_LOSS, `the snapshot is undirected; every edge is written as a directed relationship (${snapshot.edgeCount} edge(s))`, null, snapshot.edgeCount);
289
+ this.note(UNDIRECTED_LOSS, `the snapshot is undirected; every edge is written as a directed relationship (${snapshot.edgeCount} edge${plural(snapshot.edgeCount)})`, null, snapshot.edgeCount);
261
290
  }
262
291
  else if (this.common.onMixedDirection !== "error") {
263
292
  let undirected = 0;
@@ -267,11 +296,11 @@ class ExportPlan {
267
296
  }
268
297
  }
269
298
  if (undirected > 0) {
270
- this.note(UNDIRECTED_LOSS, `${undirected} undirected edge(s) are written as one directed relationship each (source to target, a pair folded to its primary); Neo4j has no undirected relationship`, null, undirected);
299
+ this.note(UNDIRECTED_LOSS, `${undirected} undirected edge${plural(undirected)} ${agree(undirected, "is", "are")} written as one directed relationship each (source to target, a pair folded to its primary); Neo4j has no undirected relationship`, null, undirected);
271
300
  }
272
301
  }
273
302
  if (folding.mutualCount > 0) {
274
- this.note(LOSS.MUTUAL_EXPANDED, `${folding.mutualCount} mutual pair(s) are written as two directed relationships; the mutual mark is lost`, null, folding.mutualCount);
303
+ this.note(LOSS.MUTUAL_EXPANDED, `${folding.mutualCount} mutual pair${plural(folding.mutualCount)} ${agree(folding.mutualCount, "is", "are")} written as two directed relationships; the mutual mark is lost`, null, folding.mutualCount);
275
304
  }
276
305
  }
277
306
  /**
@@ -444,7 +473,7 @@ class ExportPlan {
444
473
  }
445
474
  }
446
475
  if (rows > 0) {
447
- this.note(ARRAY_DELIMITER_LOSS, `${label}: ${rows} row(s) hold an item containing the array delimiter "${arrayDelimiter}", which Neo4j cannot escape`, column.meta.name, rows);
476
+ this.note(ARRAY_DELIMITER_LOSS, `${label}: ${rows} row${plural(rows)} ${agree(rows, "holds", "hold")} an item containing the array delimiter "${arrayDelimiter}", which Neo4j cannot escape`, column.meta.name, rows);
448
477
  }
449
478
  }
450
479
  /**
@@ -466,7 +495,7 @@ class ExportPlan {
466
495
  }
467
496
  }
468
497
  else if (taken !== undefined && name === DEFAULT_WEIGHT_COLUMN) {
469
- this.note(LOSS.WEIGHT_KEY_CLASH, `edge column "${name}" is written under the property the importer reads THE weight from (weightFrom "${name}"); it reads back as the weight, not as a column`, name, taken.column.length - taken.column.nullCount);
498
+ this.note(LOSS.WEIGHT_KEY_CLASH, `edge column "${name}" is written under the property the importer reads edge weights from (weightFrom "${name}"); it reads back as the weight, not as a column`, name, taken.column.length - taken.column.nullCount);
470
499
  }
471
500
  return weights.weighted ? weights : null;
472
501
  }
@@ -516,11 +545,11 @@ class ExportPlan {
516
545
  }
517
546
  }
518
547
  if (typeChanges > 0) {
519
- this.note(ID_TEXT_TYPE_LOSS, `${typeChanges} node id(s) re-import as another type under the canonical id rule (a string of canonical integer text, or a non-integer number)`, null, typeChanges);
548
+ this.note(ID_TEXT_TYPE_LOSS, `${typeChanges} node id${plural(typeChanges)} re-import as another type under the canonical id rule (a string of canonical integer text, or a non-integer number)`, null, typeChanges);
520
549
  }
521
550
  if (collisions > 0) {
522
- this.note(ID_TEXT_COLLISION_LOSS, `${collisions} node id(s) share their text with another id (a number and a string); export() will throw`, null, collisions);
523
- this.fatalAll = new GraphFormatError("E_INVALID_ID", `${collisions} node id(s) share their text with another id; Neo4j ids are text`, { reason: "text collision", count: collisions });
551
+ this.note(ID_TEXT_COLLISION_LOSS, `${collisions} node id${plural(collisions)} ${agree(collisions, "shares", "share")} their text with another id (a number and a string); the save fails`, null, collisions);
552
+ this.fatalAll = new GraphFormatError("E_INVALID_ID", `${collisions} node id${plural(collisions)} ${agree(collisions, "shares", "share")} their text with another id; Neo4j ids are text`, { reason: "text collision", count: collisions });
524
553
  }
525
554
  }
526
555
  /** Check that the idColumn option does not name an existing node property. */
@@ -557,7 +586,7 @@ class ExportPlan {
557
586
  }
558
587
  }
559
588
  if (count > 0) {
560
- this.note(MULTIPLE_ID_PROPERTIES_LOSS, `${count} node(s) have more than one stored-id column set; only the first in declaration order is written`, null, count);
589
+ this.note(MULTIPLE_ID_PROPERTIES_LOSS, `${count} node${plural(count)} ${agree(count, "has", "have")} more than one stored-id column set; only the first in declaration order is written`, null, count);
561
590
  }
562
591
  }
563
592
  /**
@@ -654,6 +683,16 @@ class ExportPlan {
654
683
  * @returns nothing
655
684
  */
656
685
  *lines() {
686
+ for (const row of this.rows()) {
687
+ yield row.line;
688
+ }
689
+ }
690
+ /**
691
+ * The lines of the requested part, each header line tagged with the file it starts.
692
+ * @yields one line at a time, with the file name on a header line
693
+ * @returns nothing
694
+ */
695
+ *rows() {
657
696
  if (this.fatal !== null) {
658
697
  throw this.fatal;
659
698
  }
@@ -665,19 +704,51 @@ class ExportPlan {
665
704
  yield* this.relationshipLines();
666
705
  }
667
706
  }
707
+ /**
708
+ * The requested part as one file per section kind: a node file per id space (and stored-id
709
+ * property), a relationship file per pair of endpoint id spaces, rows of one kind gathered
710
+ * under one header.
711
+ * @returns the files, node files first
712
+ */
713
+ files() {
714
+ // keyed by the header row: sections with the same header are one file
715
+ const files = new Map();
716
+ const names = new Set();
717
+ let current = null;
718
+ for (const row of this.rows()) {
719
+ if (row.file !== null) {
720
+ let file = files.get(row.line);
721
+ if (file === undefined) {
722
+ let name = `${row.file.name}.csv`;
723
+ let k = 2;
724
+ while (names.has(name)) {
725
+ name = `${row.file.name}-${k}.csv`;
726
+ k++;
727
+ }
728
+ names.add(name);
729
+ file = { name, kind: row.file.kind, rows: [] };
730
+ files.set(row.line, file);
731
+ }
732
+ current = file;
733
+ }
734
+ else if (current !== null) {
735
+ current.rows.push(row.line);
736
+ }
737
+ }
738
+ // a part with no rows (a graph without edges) is a header alone, which neo4j-admin does not need
739
+ const written = [...files].filter(([, f], i) => f.rows.length > 0 || (i === 0 && files.size === 1));
740
+ return written.map(([header, f]) => Object.freeze({ name: f.name, kind: f.kind, text: header + f.rows.join("") }));
741
+ }
668
742
  /**
669
743
  * The node sections.
670
744
  * @yields one line at a time
671
745
  * @returns nothing
672
746
  */
673
747
  *nodeLines() {
674
- const { snapshot, labels, nodeColumns } = this;
675
- const { delimiter } = this.options.syntax;
676
- const propertyHeaders = nodeColumns.map((plan) => plan.header).join(delimiter);
748
+ const { snapshot } = this;
677
749
  let sections = 0;
678
750
  let sectionSpace = null;
679
751
  let sectionIdName = null;
680
- const cells = [];
681
752
  for (let i = 0; i < snapshot.nodeCount; i++) {
682
753
  const space = this.spaceOf(i);
683
754
  const stored = this.storedIdOf(i);
@@ -686,36 +757,48 @@ class ExportPlan {
686
757
  sections++;
687
758
  sectionSpace = space;
688
759
  sectionIdName = idName;
689
- const header = [formatHeaderField(idName, ID_TYPE, space)];
690
- if (labels !== null) {
691
- header.push(":LABEL");
692
- }
693
- if (propertyHeaders.length > 0) {
694
- header.push(propertyHeaders);
695
- }
696
- yield `${header.join(delimiter)}\n`;
760
+ yield this.nodeHeader(idName, space, space ?? idName);
697
761
  }
698
- cells.length = 0;
699
- cells.push(this.cell(this.idTextOf(i)));
700
- if (labels !== null) {
701
- cells.push(this.cell(this.labelsText(i)));
702
- }
703
- for (const plan of nodeColumns) {
704
- cells.push(this.cell(this.valueText(plan, i)));
705
- }
706
- yield `${cells.join(delimiter)}\n`;
762
+ yield { line: this.nodeRow(i), file: null };
707
763
  }
708
764
  if (sections === 0) {
709
765
  // no nodes: one header so the section (and its columns) still exists
710
- const header = [formatHeaderField(this.options.idColumn ?? "", ID_TYPE, null)];
711
- if (labels !== null) {
712
- header.push(":LABEL");
713
- }
714
- if (propertyHeaders.length > 0) {
715
- header.push(propertyHeaders);
716
- }
717
- yield `${header.join(delimiter)}\n`;
766
+ yield this.nodeHeader(this.options.idColumn ?? "", null, null);
767
+ }
768
+ }
769
+ /**
770
+ * The header line of a node section, which starts its file.
771
+ * @param idName - the id column's name
772
+ * @param space - the id space, or null
773
+ * @param fileKey - what names the file, or null for the default name
774
+ * @returns the line
775
+ */
776
+ nodeHeader(idName, space, fileKey) {
777
+ const { delimiter } = this.options.syntax;
778
+ const header = [formatHeaderField(idName, ID_TYPE, space)];
779
+ if (this.labels !== null) {
780
+ header.push(":LABEL");
781
+ }
782
+ const properties = this.nodeColumns.map((plan) => plan.header).join(delimiter);
783
+ if (properties.length > 0) {
784
+ header.push(properties);
718
785
  }
786
+ return { line: `${header.join(delimiter)}\n`, file: { kind: "nodes", name: fileName("nodes", fileKey, null) } };
787
+ }
788
+ /**
789
+ * One node's line: the id, the labels, the properties.
790
+ * @param i - the node
791
+ * @returns the line
792
+ */
793
+ nodeRow(i) {
794
+ const cells = [this.cell(this.idTextOf(i))];
795
+ if (this.labels !== null) {
796
+ cells.push(this.cell(this.labelsText(i)));
797
+ }
798
+ for (const plan of this.nodeColumns) {
799
+ cells.push(this.cell(this.valueText(plan, i)));
800
+ }
801
+ return `${cells.join(this.options.syntax.delimiter)}\n`;
719
802
  }
720
803
  /**
721
804
  * The relationship sections.
@@ -723,28 +806,11 @@ class ExportPlan {
723
806
  * @returns nothing
724
807
  */
725
808
  *relationshipLines() {
726
- const { snapshot, kind, weights, edgeColumns, folding } = this;
727
- const { delimiter } = this.options.syntax;
809
+ const { snapshot, folding } = this;
728
810
  const list = snapshot.edgeList();
729
- const propertyHeaders = edgeColumns.map((plan) => plan.header).join(delimiter);
730
- const weightHeader = weights === null ? null : formatHeaderField(this.options.weightColumn ?? "weight", "double", null);
731
811
  let sections = 0;
732
812
  let sectionStart = null;
733
813
  let sectionEnd = null;
734
- const cells = [];
735
- const headerOf = (startSpace, endSpace) => {
736
- const header = [formatHeaderField("", "START_ID", startSpace), formatHeaderField("", "END_ID", endSpace)];
737
- if (kind !== null) {
738
- header.push(":TYPE");
739
- }
740
- if (weightHeader !== null) {
741
- header.push(weightHeader);
742
- }
743
- if (propertyHeaders.length > 0) {
744
- header.push(propertyHeaders);
745
- }
746
- return `${header.join(delimiter)}\n`;
747
- };
748
814
  for (let e = 0; e < snapshot.edgeCount; e++) {
749
815
  if (folding.folded(e)) {
750
816
  continue;
@@ -757,24 +823,58 @@ class ExportPlan {
757
823
  sections++;
758
824
  sectionStart = startSpace;
759
825
  sectionEnd = endSpace;
760
- yield headerOf(startSpace, endSpace);
826
+ yield this.relationshipHeader(startSpace, endSpace);
761
827
  }
762
- cells.length = 0;
763
- cells.push(this.cell(this.idTextOf(u)), this.cell(this.idTextOf(v)));
764
- if (kind !== null) {
765
- cells.push(this.cell(kind.isSet(e) ? textOf(kind, e) : null));
766
- }
767
- if (weights !== null) {
768
- cells.push(this.cell(weights.text(e)));
769
- }
770
- for (const plan of edgeColumns) {
771
- cells.push(this.cell(this.valueText(plan, e)));
772
- }
773
- yield `${cells.join(delimiter)}\n`;
828
+ yield { line: this.relationshipRow(e, u, v), file: null };
774
829
  }
775
830
  if (sections === 0) {
776
- yield headerOf(null, null);
831
+ yield this.relationshipHeader(null, null);
832
+ }
833
+ }
834
+ /**
835
+ * The header line of a relationship section, which starts its file.
836
+ * @param startSpace - the id space of the start nodes, or null
837
+ * @param endSpace - the id space of the end nodes, or null
838
+ * @returns the line
839
+ */
840
+ relationshipHeader(startSpace, endSpace) {
841
+ const { delimiter } = this.options.syntax;
842
+ const header = [formatHeaderField("", "START_ID", startSpace), formatHeaderField("", "END_ID", endSpace)];
843
+ if (this.kind !== null) {
844
+ header.push(":TYPE");
845
+ }
846
+ if (this.weights !== null) {
847
+ header.push(formatHeaderField(this.options.weightColumn ?? "weight", "double", null));
848
+ }
849
+ const properties = this.edgeColumns.map((plan) => plan.header).join(delimiter);
850
+ if (properties.length > 0) {
851
+ header.push(properties);
777
852
  }
853
+ return {
854
+ line: `${header.join(delimiter)}\n`,
855
+ file: { kind: "relationships", name: fileName("relationships", startSpace, endSpace) },
856
+ };
857
+ }
858
+ /**
859
+ * One relationship's line: the ends, the type, the weight, the properties.
860
+ * @param e - the edge
861
+ * @param u - its source
862
+ * @param v - its target
863
+ * @returns the line
864
+ */
865
+ relationshipRow(e, u, v) {
866
+ const { kind, weights } = this;
867
+ const cells = [this.cell(this.idTextOf(u)), this.cell(this.idTextOf(v))];
868
+ if (kind !== null) {
869
+ cells.push(this.cell(kind.isSet(e) ? textOf(kind, e) : null));
870
+ }
871
+ if (weights !== null) {
872
+ cells.push(this.cell(weights.text(e)));
873
+ }
874
+ for (const plan of this.edgeColumns) {
875
+ cells.push(this.cell(this.valueText(plan, e)));
876
+ }
877
+ return `${cells.join(this.options.syntax.delimiter)}\n`;
778
878
  }
779
879
  /**
780
880
  * A CSV cell: empty for an unset value, a quoted empty string for a set empty string, the
@@ -790,7 +890,7 @@ class ExportPlan {
790
890
  if (text.length === 0) {
791
891
  return quote + quote;
792
892
  }
793
- return quoteCsvCell(text, this.options.syntax.delimiter);
893
+ return quoteCsvCell(text, this.options.syntax.delimiter, quote);
794
894
  }
795
895
  /**
796
896
  * The `:LABEL` cell of a node.
@@ -1040,9 +1140,13 @@ function textOf(column, row) {
1040
1140
  }
1041
1141
  }
1042
1142
  }
1043
- /** The Neo4j exporter. */
1143
+ /**
1144
+ * The Neo4j exporter.
1145
+ * @category Built-in formats
1146
+ */
1044
1147
  export const neo4jExporter = Object.freeze({
1045
1148
  format: NEO4J,
1149
+ options: Object.freeze(["arrayDelimiter", "delimiter", "idColumn", "part", "quote", "weightColumn"]),
1046
1150
  capabilities: NEO4J_CAPABILITIES,
1047
1151
  /**
1048
1152
  * Pre-flight: what export() would lose.
@@ -1072,6 +1176,45 @@ export const neo4jExporter = Object.freeze({
1072
1176
  return joinText(plan(snapshot, options).lines());
1073
1177
  },
1074
1178
  });
1179
+ /**
1180
+ * The file name of a section, without ".csv": the kind, then the id spaces that set it apart.
1181
+ * @param kind - "nodes" or "relationships"
1182
+ * @param first - the id space or id property (nodes), or the start id space (relationships)
1183
+ * @param second - the end id space (relationships)
1184
+ * @returns the name, with characters outside letters, digits, "." , "_" and "-" replaced by "_"
1185
+ */
1186
+ function fileName(kind, first, second) {
1187
+ const parts = [kind, first ?? "", second ?? ""].filter((p) => p !== "");
1188
+ return parts.join("-").replaceAll(/[^\w.-]/g, "_");
1189
+ }
1190
+ /**
1191
+ * Write a graph as the separate CSV files `neo4j-admin database import` takes: one node file per id
1192
+ * space and one relationship file per pair of endpoint id spaces, each with a single header row.
1193
+ * `exportGraph(snapshot, "neo4j")` writes the same sections into one file, which graph-io reads
1194
+ * back but neo4j-admin does not, since it reads one header per file. The options are the Neo4j
1195
+ * export options (`part` limits the result to the node or the relationship files), and
1196
+ * `checkExport(snapshot, "neo4j", options)` returns what the files lose.
1197
+ * @param snapshot - the graph to write
1198
+ * @param options - the Neo4j export options
1199
+ * @returns the files, node files first
1200
+ * @category Built-in formats
1201
+ * @example
1202
+ * ```ts
1203
+ * for (const file of await exportNeo4jFiles(snapshot)) {
1204
+ * await writeFile(file.name, file.text);
1205
+ * }
1206
+ * // neo4j-admin database import full --nodes=nodes-Movie.csv --nodes=nodes-Person.csv \
1207
+ * // --relationships=relationships-Person-Movie.csv neo4j
1208
+ * ```
1209
+ */
1210
+ export function exportNeo4jFiles(snapshot, options) {
1211
+ try {
1212
+ return Promise.resolve(plan(snapshot, options).files());
1213
+ }
1214
+ catch (err) {
1215
+ return Promise.reject(err);
1216
+ }
1217
+ }
1075
1218
  /**
1076
1219
  * Build the export plan of a snapshot.
1077
1220
  * @param snapshot - the snapshot
@@ -1079,6 +1222,16 @@ export const neo4jExporter = Object.freeze({
1079
1222
  * @returns the plan
1080
1223
  */
1081
1224
  function plan(snapshot, options) {
1082
- return new ExportPlan(snapshot, resolveNeo4jExportOptions(options), resolveExportOptions(options));
1225
+ return new ExportPlan(snapshot, resolveNeo4jExportOptions(options, weightPropertyOf(snapshot)), resolveExportOptions(options));
1226
+ }
1227
+ /**
1228
+ * The relationship property a Neo4j import read the weights from, when it was not "weight".
1229
+ * @param snapshot - the snapshot
1230
+ * @returns the property name, or null
1231
+ */
1232
+ function weightPropertyOf(snapshot) {
1233
+ const neo4j = snapshot.meta.extra?.neo4j;
1234
+ const name = neo4j?.weightProperty;
1235
+ return typeof name === "string" && name !== "" ? name : null;
1083
1236
  }
1084
1237
  //# sourceMappingURL=exporter.js.map