@graphty/graph-io 0.3.25 → 0.3.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/README.md +49 -414
  2. package/dist/chunks/children-CL3Cy0ez.js.map +1 -1
  3. package/dist/chunks/choose-BbJI55dx.js +56 -0
  4. package/dist/chunks/choose-BbJI55dx.js.map +1 -0
  5. package/dist/chunks/constants-BCsFsMj4.js +231 -0
  6. package/dist/chunks/constants-BCsFsMj4.js.map +1 -0
  7. package/dist/chunks/{escape-B-tkk_Cl.js → escape-D0g6NNUy.js} +382 -92
  8. package/dist/chunks/escape-D0g6NNUy.js.map +1 -0
  9. package/dist/chunks/export-BTI4yQgy.js +4333 -0
  10. package/dist/chunks/export-BTI4yQgy.js.map +1 -0
  11. package/dist/chunks/exporter-BMqk5oxW.js +3465 -0
  12. package/dist/chunks/exporter-BMqk5oxW.js.map +1 -0
  13. package/dist/chunks/{importer-eUREhBGj.js → exporter-Cra2GYcN.js} +4969 -3201
  14. package/dist/chunks/exporter-Cra2GYcN.js.map +1 -0
  15. package/dist/chunks/{exporter-BGrsWamJ.js → exporter-Dxh231ZF.js} +38 -229
  16. package/dist/chunks/exporter-Dxh231ZF.js.map +1 -0
  17. package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-tne475KK.js} +22 -20
  18. package/dist/chunks/exporter-tne475KK.js.map +1 -0
  19. package/dist/chunks/importer-90YWhJoF.js +2811 -0
  20. package/dist/chunks/importer-90YWhJoF.js.map +1 -0
  21. package/dist/chunks/{importer-D_e7e7LX.js → importer-Bcl1d4xH.js} +398 -145
  22. package/dist/chunks/importer-Bcl1d4xH.js.map +1 -0
  23. package/dist/chunks/{importer-BWY2FFc5.js → importer-BfIsp1f9.js} +255 -77
  24. package/dist/chunks/importer-BfIsp1f9.js.map +1 -0
  25. package/dist/chunks/{importer-zGLo8Dg_.js → importer-C_TEA1zJ.js} +484 -157
  26. package/dist/chunks/importer-C_TEA1zJ.js.map +1 -0
  27. package/dist/chunks/{importer-DET1tg6s.js → importer-DCjOvO7U.js} +1687 -310
  28. package/dist/chunks/importer-DCjOvO7U.js.map +1 -0
  29. package/dist/chunks/{importer-vi3bSdtw.js → importer-DfVu6j59.js} +509 -76
  30. package/dist/chunks/importer-DfVu6j59.js.map +1 -0
  31. package/dist/chunks/{importer-DIrbbnAf.js → importer-Dku_VAIY.js} +585 -226
  32. package/dist/chunks/importer-Dku_VAIY.js.map +1 -0
  33. package/dist/chunks/json-elements-3tnyt5uZ.js +1225 -0
  34. package/dist/chunks/json-elements-3tnyt5uZ.js.map +1 -0
  35. package/dist/chunks/ontology-export-B9Tcf37D.js +357 -0
  36. package/dist/chunks/ontology-export-B9Tcf37D.js.map +1 -0
  37. package/dist/chunks/{records-dbRkxwaq.js → records-CQXT__mY.js} +298 -114
  38. package/dist/chunks/records-CQXT__mY.js.map +1 -0
  39. package/dist/chunks/{text-Dr0Ifpag.js → text-DmcUs5_Q.js} +29 -11
  40. package/dist/chunks/text-DmcUs5_Q.js.map +1 -0
  41. package/dist/chunks/{writer-C7flM-Ih.js → writer-DxjgHwSe.js} +19 -1
  42. package/dist/chunks/writer-DxjgHwSe.js.map +1 -0
  43. package/dist/csv.js +951 -261
  44. package/dist/csv.js.map +1 -1
  45. package/dist/cx.js +6 -3
  46. package/dist/cx2.js +2 -2
  47. package/dist/cys.js +6 -3
  48. package/dist/dot.js +1 -1
  49. package/dist/gexf.js +554 -122
  50. package/dist/gexf.js.map +1 -1
  51. package/dist/gml.js +342 -85
  52. package/dist/gml.js.map +1 -1
  53. package/dist/graph-io.js +1105 -213
  54. package/dist/graph-io.js.map +1 -1
  55. package/dist/graphml.js +3 -2
  56. package/dist/graphml.js.map +1 -1
  57. package/dist/json.js +3 -2
  58. package/dist/neo4j.js +564 -157
  59. package/dist/neo4j.js.map +1 -1
  60. package/dist/obo.js +6 -3
  61. package/dist/pajek.js +1 -1
  62. package/dist/src/children.d.ts +18 -6
  63. package/dist/src/children.d.ts.map +1 -1
  64. package/dist/src/children.js +6 -3
  65. package/dist/src/children.js.map +1 -1
  66. package/dist/src/common/attributes.d.ts +29 -11
  67. package/dist/src/common/attributes.d.ts.map +1 -1
  68. package/dist/src/common/attributes.js +25 -7
  69. package/dist/src/common/attributes.js.map +1 -1
  70. package/dist/src/common/cell-budget.d.ts +9 -2
  71. package/dist/src/common/cell-budget.d.ts.map +1 -1
  72. package/dist/src/common/cell-budget.js +11 -3
  73. package/dist/src/common/cell-budget.js.map +1 -1
  74. package/dist/src/common/choose.d.ts +19 -0
  75. package/dist/src/common/choose.d.ts.map +1 -0
  76. package/dist/src/common/choose.js +72 -0
  77. package/dist/src/common/choose.js.map +1 -0
  78. package/dist/src/common/codes.d.ts +456 -66
  79. package/dist/src/common/codes.d.ts.map +1 -1
  80. package/dist/src/common/codes.js +458 -66
  81. package/dist/src/common/codes.js.map +1 -1
  82. package/dist/src/common/compare.d.ts +81 -0
  83. package/dist/src/common/compare.d.ts.map +1 -0
  84. package/dist/src/common/compare.js +394 -0
  85. package/dist/src/common/compare.js.map +1 -0
  86. package/dist/src/common/cx-export.d.ts +123 -0
  87. package/dist/src/common/cx-export.d.ts.map +1 -0
  88. package/dist/src/common/cx-export.js +334 -0
  89. package/dist/src/common/cx-export.js.map +1 -0
  90. package/dist/src/common/declared-types.d.ts +22 -2
  91. package/dist/src/common/declared-types.d.ts.map +1 -1
  92. package/dist/src/common/declared-types.js +19 -1
  93. package/dist/src/common/declared-types.js.map +1 -1
  94. package/dist/src/common/direction.d.ts +74 -50
  95. package/dist/src/common/direction.d.ts.map +1 -1
  96. package/dist/src/common/direction.js +47 -27
  97. package/dist/src/common/direction.js.map +1 -1
  98. package/dist/src/common/escape.d.ts +21 -9
  99. package/dist/src/common/escape.d.ts.map +1 -1
  100. package/dist/src/common/escape.js +33 -17
  101. package/dist/src/common/escape.js.map +1 -1
  102. package/dist/src/common/export.d.ts +144 -32
  103. package/dist/src/common/export.d.ts.map +1 -1
  104. package/dist/src/common/export.js +216 -42
  105. package/dist/src/common/export.js.map +1 -1
  106. package/dist/src/common/format.d.ts +23 -1
  107. package/dist/src/common/format.d.ts.map +1 -1
  108. package/dist/src/common/format.js +26 -1
  109. package/dist/src/common/format.js.map +1 -1
  110. package/dist/src/common/ids.d.ts +9 -2
  111. package/dist/src/common/ids.d.ts.map +1 -1
  112. package/dist/src/common/ids.js +6 -2
  113. package/dist/src/common/ids.js.map +1 -1
  114. package/dist/src/common/input.d.ts +122 -28
  115. package/dist/src/common/input.d.ts.map +1 -1
  116. package/dist/src/common/input.js +890 -124
  117. package/dist/src/common/input.js.map +1 -1
  118. package/dist/src/common/json-elements.d.ts +144 -20
  119. package/dist/src/common/json-elements.d.ts.map +1 -1
  120. package/dist/src/common/json-elements.js +868 -188
  121. package/dist/src/common/json-elements.js.map +1 -1
  122. package/dist/src/common/line-format.d.ts +90 -0
  123. package/dist/src/common/line-format.d.ts.map +1 -0
  124. package/dist/src/common/line-format.js +185 -0
  125. package/dist/src/common/line-format.js.map +1 -0
  126. package/dist/src/common/lists.d.ts +6 -1
  127. package/dist/src/common/lists.d.ts.map +1 -1
  128. package/dist/src/common/lists.js +2 -0
  129. package/dist/src/common/lists.js.map +1 -1
  130. package/dist/src/common/ontology-export.d.ts +167 -0
  131. package/dist/src/common/ontology-export.d.ts.map +1 -0
  132. package/dist/src/common/ontology-export.js +359 -0
  133. package/dist/src/common/ontology-export.js.map +1 -0
  134. package/dist/src/common/ontology.d.ts +25 -3
  135. package/dist/src/common/ontology.d.ts.map +1 -1
  136. package/dist/src/common/ontology.js +30 -9
  137. package/dist/src/common/ontology.js.map +1 -1
  138. package/dist/src/common/options.d.ts +62 -12
  139. package/dist/src/common/options.d.ts.map +1 -1
  140. package/dist/src/common/options.js +89 -11
  141. package/dist/src/common/options.js.map +1 -1
  142. package/dist/src/common/plural.d.ts +31 -0
  143. package/dist/src/common/plural.d.ts.map +1 -0
  144. package/dist/src/common/plural.js +46 -0
  145. package/dist/src/common/plural.js.map +1 -0
  146. package/dist/src/common/report.d.ts +72 -14
  147. package/dist/src/common/report.d.ts.map +1 -1
  148. package/dist/src/common/report.js +146 -22
  149. package/dist/src/common/report.js.map +1 -1
  150. package/dist/src/common/temporal.d.ts +22 -5
  151. package/dist/src/common/temporal.d.ts.map +1 -1
  152. package/dist/src/common/temporal.js +13 -2
  153. package/dist/src/common/temporal.js.map +1 -1
  154. package/dist/src/common/text.d.ts +39 -23
  155. package/dist/src/common/text.d.ts.map +1 -1
  156. package/dist/src/common/text.js +51 -21
  157. package/dist/src/common/text.js.map +1 -1
  158. package/dist/src/common/weights.d.ts +37 -4
  159. package/dist/src/common/weights.d.ts.map +1 -1
  160. package/dist/src/common/weights.js +61 -2
  161. package/dist/src/common/weights.js.map +1 -1
  162. package/dist/src/common/writer.d.ts +19 -3
  163. package/dist/src/common/writer.d.ts.map +1 -1
  164. package/dist/src/common/writer.js +30 -2
  165. package/dist/src/common/writer.js.map +1 -1
  166. package/dist/src/common/xml.d.ts +125 -9
  167. package/dist/src/common/xml.d.ts.map +1 -1
  168. package/dist/src/common/xml.js +400 -83
  169. package/dist/src/common/xml.js.map +1 -1
  170. package/dist/src/common/zip.d.ts +44 -4
  171. package/dist/src/common/zip.d.ts.map +1 -1
  172. package/dist/src/common/zip.js +134 -5
  173. package/dist/src/common/zip.js.map +1 -1
  174. package/dist/src/formats/csv/exporter.d.ts +80 -24
  175. package/dist/src/formats/csv/exporter.d.ts.map +1 -1
  176. package/dist/src/formats/csv/exporter.js +145 -32
  177. package/dist/src/formats/csv/exporter.js.map +1 -1
  178. package/dist/src/formats/csv/header.d.ts +38 -9
  179. package/dist/src/formats/csv/header.d.ts.map +1 -1
  180. package/dist/src/formats/csv/header.js +46 -10
  181. package/dist/src/formats/csv/header.js.map +1 -1
  182. package/dist/src/formats/csv/importer.d.ts +187 -37
  183. package/dist/src/formats/csv/importer.d.ts.map +1 -1
  184. package/dist/src/formats/csv/importer.js +835 -204
  185. package/dist/src/formats/csv/importer.js.map +1 -1
  186. package/dist/src/formats/csv/index.d.ts +100 -19
  187. package/dist/src/formats/csv/index.d.ts.map +1 -1
  188. package/dist/src/formats/csv/index.js +94 -21
  189. package/dist/src/formats/csv/index.js.map +1 -1
  190. package/dist/src/formats/csv/records.d.ts +95 -10
  191. package/dist/src/formats/csv/records.d.ts.map +1 -1
  192. package/dist/src/formats/csv/records.js +333 -122
  193. package/dist/src/formats/csv/records.js.map +1 -1
  194. package/dist/src/formats/csv/values.d.ts +1 -0
  195. package/dist/src/formats/csv/values.d.ts.map +1 -1
  196. package/dist/src/formats/csv/values.js +1 -0
  197. package/dist/src/formats/csv/values.js.map +1 -1
  198. package/dist/src/formats/cx/exporter.d.ts +102 -0
  199. package/dist/src/formats/cx/exporter.d.ts.map +1 -0
  200. package/dist/src/formats/cx/exporter.js +1217 -0
  201. package/dist/src/formats/cx/exporter.js.map +1 -0
  202. package/dist/src/formats/cx/importer.d.ts +79 -32
  203. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  204. package/dist/src/formats/cx/importer.js +680 -285
  205. package/dist/src/formats/cx/importer.js.map +1 -1
  206. package/dist/src/formats/cx/index.d.ts +4 -3
  207. package/dist/src/formats/cx/index.d.ts.map +1 -1
  208. package/dist/src/formats/cx/index.js +4 -3
  209. package/dist/src/formats/cx/index.js.map +1 -1
  210. package/dist/src/formats/cx2/exporter.d.ts +29 -11
  211. package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
  212. package/dist/src/formats/cx2/exporter.js +39 -268
  213. package/dist/src/formats/cx2/exporter.js.map +1 -1
  214. package/dist/src/formats/cx2/importer.d.ts +78 -28
  215. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  216. package/dist/src/formats/cx2/importer.js +226 -79
  217. package/dist/src/formats/cx2/importer.js.map +1 -1
  218. package/dist/src/formats/cx2/index.d.ts +2 -1
  219. package/dist/src/formats/cx2/index.d.ts.map +1 -1
  220. package/dist/src/formats/cx2/index.js +2 -1
  221. package/dist/src/formats/cx2/index.js.map +1 -1
  222. package/dist/src/formats/cys/constants.d.ts +66 -17
  223. package/dist/src/formats/cys/constants.d.ts.map +1 -1
  224. package/dist/src/formats/cys/constants.js +59 -18
  225. package/dist/src/formats/cys/constants.js.map +1 -1
  226. package/dist/src/formats/cys/exporter.d.ts +118 -0
  227. package/dist/src/formats/cys/exporter.d.ts.map +1 -0
  228. package/dist/src/formats/cys/exporter.js +1072 -0
  229. package/dist/src/formats/cys/exporter.js.map +1 -0
  230. package/dist/src/formats/cys/importer.d.ts +22 -8
  231. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  232. package/dist/src/formats/cys/importer.js +510 -149
  233. package/dist/src/formats/cys/importer.js.map +1 -1
  234. package/dist/src/formats/cys/index.d.ts +4 -2
  235. package/dist/src/formats/cys/index.d.ts.map +1 -1
  236. package/dist/src/formats/cys/index.js +4 -2
  237. package/dist/src/formats/cys/index.js.map +1 -1
  238. package/dist/src/formats/cys/session.d.ts +46 -7
  239. package/dist/src/formats/cys/session.d.ts.map +1 -1
  240. package/dist/src/formats/cys/session.js +98 -24
  241. package/dist/src/formats/cys/session.js.map +1 -1
  242. package/dist/src/formats/cys/tables.d.ts +9 -2
  243. package/dist/src/formats/cys/tables.d.ts.map +1 -1
  244. package/dist/src/formats/cys/tables.js +29 -7
  245. package/dist/src/formats/cys/tables.js.map +1 -1
  246. package/dist/src/formats/dot/exporter.d.ts +42 -14
  247. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  248. package/dist/src/formats/dot/exporter.js +56 -29
  249. package/dist/src/formats/dot/exporter.js.map +1 -1
  250. package/dist/src/formats/dot/importer.d.ts +91 -29
  251. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  252. package/dist/src/formats/dot/importer.js +190 -39
  253. package/dist/src/formats/dot/importer.js.map +1 -1
  254. package/dist/src/formats/dot/index.d.ts +2 -1
  255. package/dist/src/formats/dot/index.d.ts.map +1 -1
  256. package/dist/src/formats/dot/index.js +2 -1
  257. package/dist/src/formats/dot/index.js.map +1 -1
  258. package/dist/src/formats/dot/names.d.ts +44 -11
  259. package/dist/src/formats/dot/names.d.ts.map +1 -1
  260. package/dist/src/formats/dot/names.js +44 -11
  261. package/dist/src/formats/dot/names.js.map +1 -1
  262. package/dist/src/formats/dot/tokenizer.d.ts +9 -2
  263. package/dist/src/formats/dot/tokenizer.d.ts.map +1 -1
  264. package/dist/src/formats/dot/tokenizer.js +20 -5
  265. package/dist/src/formats/dot/tokenizer.js.map +1 -1
  266. package/dist/src/formats/gexf/exporter.d.ts +46 -15
  267. package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
  268. package/dist/src/formats/gexf/exporter.js +45 -15
  269. package/dist/src/formats/gexf/exporter.js.map +1 -1
  270. package/dist/src/formats/gexf/importer.d.ts +87 -23
  271. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  272. package/dist/src/formats/gexf/importer.js +471 -90
  273. package/dist/src/formats/gexf/importer.js.map +1 -1
  274. package/dist/src/formats/gexf/index.d.ts +84 -21
  275. package/dist/src/formats/gexf/index.d.ts.map +1 -1
  276. package/dist/src/formats/gexf/index.js +80 -23
  277. package/dist/src/formats/gexf/index.js.map +1 -1
  278. package/dist/src/formats/gexf/schema.d.ts +67 -15
  279. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  280. package/dist/src/formats/gexf/schema.js +59 -13
  281. package/dist/src/formats/gexf/schema.js.map +1 -1
  282. package/dist/src/formats/gml/exporter.d.ts +69 -21
  283. package/dist/src/formats/gml/exporter.d.ts.map +1 -1
  284. package/dist/src/formats/gml/exporter.js +74 -29
  285. package/dist/src/formats/gml/exporter.js.map +1 -1
  286. package/dist/src/formats/gml/importer.d.ts +116 -25
  287. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  288. package/dist/src/formats/gml/importer.js +290 -61
  289. package/dist/src/formats/gml/importer.js.map +1 -1
  290. package/dist/src/formats/gml/index.d.ts +87 -24
  291. package/dist/src/formats/gml/index.d.ts.map +1 -1
  292. package/dist/src/formats/gml/index.js +79 -26
  293. package/dist/src/formats/gml/index.js.map +1 -1
  294. package/dist/src/formats/gml/syntax.d.ts +67 -18
  295. package/dist/src/formats/gml/syntax.d.ts.map +1 -1
  296. package/dist/src/formats/gml/syntax.js +108 -26
  297. package/dist/src/formats/gml/syntax.js.map +1 -1
  298. package/dist/src/formats/graphml/constants.d.ts +174 -44
  299. package/dist/src/formats/graphml/constants.d.ts.map +1 -1
  300. package/dist/src/formats/graphml/constants.js +165 -44
  301. package/dist/src/formats/graphml/constants.js.map +1 -1
  302. package/dist/src/formats/graphml/exporter.d.ts +17 -9
  303. package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
  304. package/dist/src/formats/graphml/exporter.js +33 -12
  305. package/dist/src/formats/graphml/exporter.js.map +1 -1
  306. package/dist/src/formats/graphml/importer.d.ts +19 -7
  307. package/dist/src/formats/graphml/importer.d.ts.map +1 -1
  308. package/dist/src/formats/graphml/importer.js +466 -39
  309. package/dist/src/formats/graphml/importer.js.map +1 -1
  310. package/dist/src/formats/graphml/index.d.ts +2 -1
  311. package/dist/src/formats/graphml/index.d.ts.map +1 -1
  312. package/dist/src/formats/graphml/index.js +2 -1
  313. package/dist/src/formats/graphml/index.js.map +1 -1
  314. package/dist/src/formats/graphml/tree.d.ts +6 -2
  315. package/dist/src/formats/graphml/tree.d.ts.map +1 -1
  316. package/dist/src/formats/graphml/tree.js +6 -2
  317. package/dist/src/formats/graphml/tree.js.map +1 -1
  318. package/dist/src/formats/graphml/yfiles.d.ts +8 -3
  319. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  320. package/dist/src/formats/graphml/yfiles.js +36 -15
  321. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  322. package/dist/src/formats/json/dialect.d.ts +88 -24
  323. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  324. package/dist/src/formats/json/dialect.js +109 -19
  325. package/dist/src/formats/json/dialect.js.map +1 -1
  326. package/dist/src/formats/json/exporter.d.ts +134 -22
  327. package/dist/src/formats/json/exporter.d.ts.map +1 -1
  328. package/dist/src/formats/json/exporter.js +135 -54
  329. package/dist/src/formats/json/exporter.js.map +1 -1
  330. package/dist/src/formats/json/importer.d.ts +173 -52
  331. package/dist/src/formats/json/importer.d.ts.map +1 -1
  332. package/dist/src/formats/json/importer.js +899 -220
  333. package/dist/src/formats/json/importer.js.map +1 -1
  334. package/dist/src/formats/json/index.d.ts +3 -2
  335. package/dist/src/formats/json/index.d.ts.map +1 -1
  336. package/dist/src/formats/json/index.js +3 -2
  337. package/dist/src/formats/json/index.js.map +1 -1
  338. package/dist/src/formats/json/obographs-export.d.ts +68 -0
  339. package/dist/src/formats/json/obographs-export.d.ts.map +1 -0
  340. package/dist/src/formats/json/obographs-export.js +941 -0
  341. package/dist/src/formats/json/obographs-export.js.map +1 -0
  342. package/dist/src/formats/json/obographs.d.ts +26 -0
  343. package/dist/src/formats/json/obographs.d.ts.map +1 -1
  344. package/dist/src/formats/json/obographs.js +297 -80
  345. package/dist/src/formats/json/obographs.js.map +1 -1
  346. package/dist/src/formats/neo4j/exporter.d.ts +109 -21
  347. package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
  348. package/dist/src/formats/neo4j/exporter.js +238 -85
  349. package/dist/src/formats/neo4j/exporter.js.map +1 -1
  350. package/dist/src/formats/neo4j/header.d.ts +17 -4
  351. package/dist/src/formats/neo4j/header.d.ts.map +1 -1
  352. package/dist/src/formats/neo4j/header.js +36 -4
  353. package/dist/src/formats/neo4j/header.js.map +1 -1
  354. package/dist/src/formats/neo4j/importer.d.ts +107 -27
  355. package/dist/src/formats/neo4j/importer.d.ts.map +1 -1
  356. package/dist/src/formats/neo4j/importer.js +415 -63
  357. package/dist/src/formats/neo4j/importer.js.map +1 -1
  358. package/dist/src/formats/neo4j/index.d.ts +73 -23
  359. package/dist/src/formats/neo4j/index.d.ts.map +1 -1
  360. package/dist/src/formats/neo4j/index.js +65 -25
  361. package/dist/src/formats/neo4j/index.js.map +1 -1
  362. package/dist/src/formats/obo/exporter.d.ts +150 -0
  363. package/dist/src/formats/obo/exporter.d.ts.map +1 -0
  364. package/dist/src/formats/obo/exporter.js +1736 -0
  365. package/dist/src/formats/obo/exporter.js.map +1 -0
  366. package/dist/src/formats/obo/importer.d.ts +95 -19
  367. package/dist/src/formats/obo/importer.d.ts.map +1 -1
  368. package/dist/src/formats/obo/importer.js +475 -104
  369. package/dist/src/formats/obo/importer.js.map +1 -1
  370. package/dist/src/formats/obo/index.d.ts +6 -3
  371. package/dist/src/formats/obo/index.d.ts.map +1 -1
  372. package/dist/src/formats/obo/index.js +6 -3
  373. package/dist/src/formats/obo/index.js.map +1 -1
  374. package/dist/src/formats/obo/syntax.d.ts +108 -4
  375. package/dist/src/formats/obo/syntax.d.ts.map +1 -1
  376. package/dist/src/formats/obo/syntax.js +211 -34
  377. package/dist/src/formats/obo/syntax.js.map +1 -1
  378. package/dist/src/formats/pajek/exporter.d.ts +54 -16
  379. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  380. package/dist/src/formats/pajek/exporter.js +66 -34
  381. package/dist/src/formats/pajek/exporter.js.map +1 -1
  382. package/dist/src/formats/pajek/importer.d.ts +84 -22
  383. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  384. package/dist/src/formats/pajek/importer.js +303 -83
  385. package/dist/src/formats/pajek/importer.js.map +1 -1
  386. package/dist/src/formats/pajek/index.d.ts +2 -1
  387. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  388. package/dist/src/formats/pajek/index.js +2 -1
  389. package/dist/src/formats/pajek/index.js.map +1 -1
  390. package/dist/src/formats/pajek/syntax.d.ts +77 -14
  391. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  392. package/dist/src/formats/pajek/syntax.js +183 -51
  393. package/dist/src/formats/pajek/syntax.js.map +1 -1
  394. package/dist/src/formats/xgmml/columns.d.ts +1 -0
  395. package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
  396. package/dist/src/formats/xgmml/columns.js +4 -0
  397. package/dist/src/formats/xgmml/columns.js.map +1 -1
  398. package/dist/src/formats/xgmml/constants.d.ts +186 -56
  399. package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
  400. package/dist/src/formats/xgmml/constants.js +181 -57
  401. package/dist/src/formats/xgmml/constants.js.map +1 -1
  402. package/dist/src/formats/xgmml/document.d.ts +65 -11
  403. package/dist/src/formats/xgmml/document.d.ts.map +1 -1
  404. package/dist/src/formats/xgmml/document.js +157 -28
  405. package/dist/src/formats/xgmml/document.js.map +1 -1
  406. package/dist/src/formats/xgmml/emit.d.ts +61 -3
  407. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  408. package/dist/src/formats/xgmml/emit.js +129 -26
  409. package/dist/src/formats/xgmml/emit.js.map +1 -1
  410. package/dist/src/formats/xgmml/exporter.d.ts +13 -6
  411. package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
  412. package/dist/src/formats/xgmml/exporter.js +20 -21
  413. package/dist/src/formats/xgmml/exporter.js.map +1 -1
  414. package/dist/src/formats/xgmml/importer.d.ts +33 -12
  415. package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
  416. package/dist/src/formats/xgmml/importer.js +35 -72
  417. package/dist/src/formats/xgmml/importer.js.map +1 -1
  418. package/dist/src/formats/xgmml/index.d.ts +1 -0
  419. package/dist/src/formats/xgmml/index.d.ts.map +1 -1
  420. package/dist/src/formats/xgmml/index.js +1 -0
  421. package/dist/src/formats/xgmml/index.js.map +1 -1
  422. package/dist/src/formats/xgmml/values.d.ts +8 -1
  423. package/dist/src/formats/xgmml/values.d.ts.map +1 -1
  424. package/dist/src/formats/xgmml/values.js +7 -2
  425. package/dist/src/formats/xgmml/values.js.map +1 -1
  426. package/dist/src/index.d.ts +23 -18
  427. package/dist/src/index.d.ts.map +1 -1
  428. package/dist/src/index.js +28 -16
  429. package/dist/src/index.js.map +1 -1
  430. package/dist/src/registry.d.ts +478 -92
  431. package/dist/src/registry.d.ts.map +1 -1
  432. package/dist/src/registry.js +807 -88
  433. package/dist/src/registry.js.map +1 -1
  434. package/dist/src/sniff.d.ts +61 -19
  435. package/dist/src/sniff.d.ts.map +1 -1
  436. package/dist/src/sniff.js +121 -29
  437. package/dist/src/sniff.js.map +1 -1
  438. package/dist/src/types.d.ts +362 -112
  439. package/dist/src/types.d.ts.map +1 -1
  440. package/dist/src/types.js +28 -7
  441. package/dist/src/types.js.map +1 -1
  442. package/dist/xgmml.js +2 -2
  443. package/docs/samples/README.md +25 -0
  444. package/docs/samples/got-edges.csv +353 -0
  445. package/docs/samples/got-network.graphml +1384 -0
  446. package/docs/samples/got-nodes.csv +108 -0
  447. package/docs/samples/got.cx +930 -0
  448. package/docs/samples/got.cx2 +465 -0
  449. package/docs/samples/got.gexf +471 -0
  450. package/docs/samples/got.gml +2650 -0
  451. package/docs/samples/got.json +2546 -0
  452. package/docs/samples/got.net +461 -0
  453. package/docs/samples/movies-nodes.csv +9 -0
  454. package/docs/samples/movies-rels.csv +8 -0
  455. package/docs/samples/networks.cys +0 -0
  456. package/docs/samples/proteins.xgmml +9 -0
  457. package/docs/samples/teams.gv +24 -0
  458. package/docs/samples/vehicles.obo +25 -0
  459. package/package.json +9 -4
  460. package/src/children.ts +18 -6
  461. package/src/common/attributes.ts +29 -11
  462. package/src/common/cell-budget.ts +11 -3
  463. package/src/common/choose.ts +89 -0
  464. package/src/common/codes.ts +490 -66
  465. package/src/common/compare.ts +472 -0
  466. package/src/common/cx-export.ts +432 -0
  467. package/src/common/declared-types.ts +38 -4
  468. package/src/common/direction.ts +78 -51
  469. package/src/common/escape.ts +33 -17
  470. package/src/common/export.ts +284 -47
  471. package/src/common/format.ts +30 -1
  472. package/src/common/ids.ts +14 -3
  473. package/src/common/input.ts +1057 -134
  474. package/src/common/json-elements.ts +1034 -198
  475. package/src/common/line-format.ts +249 -0
  476. package/src/common/lists.ts +6 -1
  477. package/src/common/ontology-export.ts +461 -0
  478. package/src/common/ontology.ts +31 -9
  479. package/src/common/options.ts +110 -15
  480. package/src/common/plural.ts +49 -0
  481. package/src/common/report.ts +168 -25
  482. package/src/common/temporal.ts +22 -5
  483. package/src/common/text.ts +62 -23
  484. package/src/common/weights.ts +74 -4
  485. package/src/common/writer.ts +37 -3
  486. package/src/common/xml.ts +477 -88
  487. package/src/common/zip.ts +169 -7
  488. package/src/formats/csv/exporter.ts +201 -46
  489. package/src/formats/csv/header.ts +50 -11
  490. package/src/formats/csv/importer.ts +1133 -245
  491. package/src/formats/csv/index.ts +106 -19
  492. package/src/formats/csv/records.ts +396 -122
  493. package/src/formats/csv/values.ts +1 -0
  494. package/src/formats/cx/exporter.ts +1483 -0
  495. package/src/formats/cx/importer.ts +888 -300
  496. package/src/formats/cx/index.ts +4 -3
  497. package/src/formats/cx2/exporter.ts +61 -338
  498. package/src/formats/cx2/importer.ts +317 -86
  499. package/src/formats/cx2/index.ts +2 -1
  500. package/src/formats/cys/constants.ts +62 -17
  501. package/src/formats/cys/exporter.ts +1368 -0
  502. package/src/formats/cys/importer.ts +659 -157
  503. package/src/formats/cys/index.ts +4 -2
  504. package/src/formats/cys/session.ts +139 -31
  505. package/src/formats/cys/tables.ts +47 -9
  506. package/src/formats/dot/exporter.ts +83 -37
  507. package/src/formats/dot/importer.ts +248 -54
  508. package/src/formats/dot/index.ts +2 -1
  509. package/src/formats/dot/names.ts +44 -11
  510. package/src/formats/dot/tokenizer.ts +25 -6
  511. package/src/formats/gexf/exporter.ts +57 -18
  512. package/src/formats/gexf/importer.ts +636 -105
  513. package/src/formats/gexf/index.ts +90 -21
  514. package/src/formats/gexf/schema.ts +67 -15
  515. package/src/formats/gml/exporter.ts +90 -36
  516. package/src/formats/gml/importer.ts +388 -67
  517. package/src/formats/gml/index.ts +85 -24
  518. package/src/formats/gml/syntax.ts +111 -26
  519. package/src/formats/graphml/constants.ts +178 -44
  520. package/src/formats/graphml/exporter.ts +52 -18
  521. package/src/formats/graphml/importer.ts +640 -60
  522. package/src/formats/graphml/index.ts +2 -1
  523. package/src/formats/graphml/tree.ts +6 -2
  524. package/src/formats/graphml/yfiles.ts +37 -15
  525. package/src/formats/json/dialect.ts +128 -29
  526. package/src/formats/json/exporter.ts +205 -68
  527. package/src/formats/json/importer.ts +1163 -253
  528. package/src/formats/json/index.ts +3 -1
  529. package/src/formats/json/obographs-export.ts +1197 -0
  530. package/src/formats/json/obographs.ts +353 -92
  531. package/src/formats/neo4j/exporter.ts +320 -101
  532. package/src/formats/neo4j/header.ts +44 -6
  533. package/src/formats/neo4j/importer.ts +512 -73
  534. package/src/formats/neo4j/index.ts +75 -23
  535. package/src/formats/obo/exporter.ts +2210 -0
  536. package/src/formats/obo/importer.ts +622 -109
  537. package/src/formats/obo/index.ts +6 -3
  538. package/src/formats/obo/syntax.ts +232 -37
  539. package/src/formats/pajek/exporter.ts +89 -41
  540. package/src/formats/pajek/importer.ts +407 -93
  541. package/src/formats/pajek/index.ts +2 -1
  542. package/src/formats/pajek/syntax.ts +213 -52
  543. package/src/formats/xgmml/columns.ts +10 -0
  544. package/src/formats/xgmml/constants.ts +183 -56
  545. package/src/formats/xgmml/document.ts +212 -34
  546. package/src/formats/xgmml/emit.ts +175 -34
  547. package/src/formats/xgmml/exporter.ts +35 -27
  548. package/src/formats/xgmml/importer.ts +64 -86
  549. package/src/formats/xgmml/index.ts +1 -0
  550. package/src/formats/xgmml/values.ts +11 -3
  551. package/src/index.ts +81 -11
  552. package/src/registry.ts +1121 -135
  553. package/src/sniff.ts +163 -32
  554. package/src/types.ts +385 -114
  555. package/dist/chunks/escape-B-tkk_Cl.js.map +0 -1
  556. package/dist/chunks/export-Bh60Dv-n.js +0 -582
  557. package/dist/chunks/export-Bh60Dv-n.js.map +0 -1
  558. package/dist/chunks/exporter-BGrsWamJ.js.map +0 -1
  559. package/dist/chunks/exporter-DIeGJXAZ.js.map +0 -1
  560. package/dist/chunks/importer-BWY2FFc5.js.map +0 -1
  561. package/dist/chunks/importer-DD-xv9_Y.js +0 -1471
  562. package/dist/chunks/importer-DD-xv9_Y.js.map +0 -1
  563. package/dist/chunks/importer-DET1tg6s.js.map +0 -1
  564. package/dist/chunks/importer-DEcKhsmQ.js +0 -1614
  565. package/dist/chunks/importer-DEcKhsmQ.js.map +0 -1
  566. package/dist/chunks/importer-DIrbbnAf.js.map +0 -1
  567. package/dist/chunks/importer-D_e7e7LX.js.map +0 -1
  568. package/dist/chunks/importer-eUREhBGj.js.map +0 -1
  569. package/dist/chunks/importer-vi3bSdtw.js.map +0 -1
  570. package/dist/chunks/importer-zGLo8Dg_.js.map +0 -1
  571. package/dist/chunks/json-elements-DDS8N2Dd.js +0 -779
  572. package/dist/chunks/json-elements-DDS8N2Dd.js.map +0 -1
  573. package/dist/chunks/ontology-BnrJ4I98.js +0 -113
  574. package/dist/chunks/ontology-BnrJ4I98.js.map +0 -1
  575. package/dist/chunks/records-dbRkxwaq.js.map +0 -1
  576. package/dist/chunks/report-B1z4WT9e.js +0 -2372
  577. package/dist/chunks/report-B1z4WT9e.js.map +0 -1
  578. package/dist/chunks/text-Dr0Ifpag.js.map +0 -1
  579. package/dist/chunks/weights-Dzba96G3.js +0 -176
  580. package/dist/chunks/weights-Dzba96G3.js.map +0 -1
  581. package/dist/chunks/writer-C7flM-Ih.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { GraphFormatError } from "@graphty/graph-format";
2
- import { x as textChunks } from "./report-B1z4WT9e.js";
2
+ import { a4 as textChunks, a5 as MAX_TEXT_LENGTH, a6 as tooLarge } from "./export-BTI4yQgy.js";
3
3
  const UNCLOSED_QUOTE_CODE = "E_CSV_UNCLOSED_QUOTE";
4
4
  const BAD_QUOTE_CODE = "E_CSV_QUOTE";
5
5
  const DELIMITER_CANDIDATES = Object.freeze([",", " ", ";", "|", " "]);
@@ -7,6 +7,9 @@ const PREVIEW_ROWS = 10;
7
7
  const PREVIEW_CHARS = 64 * 1024;
8
8
  const LF = 10;
9
9
  const CR = 13;
10
+ const TAB = 9;
11
+ const SPACE = 32;
12
+ const SEP_DIRECTIVE = /^sep=([^\r\n])(?:\r\n|\n|\r|$)/i;
10
13
  const START = 0;
11
14
  const UNQUOTED = 1;
12
15
  const QUOTED = 2;
@@ -40,108 +43,181 @@ function checkRecordSyntax(syntax) {
40
43
  function sniffNewline(text) {
41
44
  return !text.includes("\n") && text.includes("\r") ? "\r" : "\n";
42
45
  }
43
- function splitRecords(text, delimiter, quote, maxRows, strictQuotes = false) {
44
- const rows = [];
45
- const delimiterCode = delimiter.charCodeAt(0);
46
- const quoteCode = quote.charCodeAt(0);
47
- let cells = [];
48
- let state = START;
49
- let segment = 0;
50
- let field = "";
51
- const n = text.length;
52
- for (let i = 0; i < n && rows.length < maxRows; i++) {
53
- const c = text.charCodeAt(i);
54
- if (state === QUOTED) {
55
- if (c === quoteCode) {
56
- field += text.slice(segment, i);
57
- state = CLOSING;
58
- }
59
- continue;
46
+ function splitRecords(text, delimiter, quote, maxRows, strictQuotes = false, collapse = false) {
47
+ const delimiterCode = delimiter.codePointAt(0);
48
+ const splitter = new RecordSplitter(text, quote, delimiterCode, collapse && delimiterCode === SPACE, strictQuotes);
49
+ let i = 0;
50
+ while (i < text.length && splitter.rows.length < maxRows) {
51
+ i = splitter.step(i);
52
+ if (i < 0) {
53
+ return null;
60
54
  }
61
- if (state === CLOSING) {
62
- if (c === quoteCode) {
63
- field += quote;
64
- segment = i + 1;
65
- state = QUOTED;
66
- continue;
67
- }
68
- if (strictQuotes && c !== delimiterCode && c !== LF && c !== CR) {
69
- return null;
55
+ }
56
+ if (splitter.rows.length < maxRows) {
57
+ splitter.finish();
58
+ }
59
+ return splitter.rows;
60
+ }
61
+ class RecordSplitter {
62
+ /**
63
+ * Create a splitter.
64
+ * @param text - the text
65
+ * @param quote - the quote character
66
+ * @param delimiterCode - the delimiter's code
67
+ * @param whitespace - whether runs of spaces and tabs are one separator
68
+ * @param strictQuotes - whether text after a closing quote gives up
69
+ */
70
+ constructor(text, quote, delimiterCode, whitespace, strictQuotes) {
71
+ this.text = text;
72
+ this.quote = quote;
73
+ this.delimiterCode = delimiterCode;
74
+ this.whitespace = whitespace;
75
+ this.strictQuotes = strictQuotes;
76
+ this.rows = [];
77
+ this.cells = [];
78
+ this.state = START;
79
+ this.segment = 0;
80
+ this.field = "";
81
+ this.quoteCode = quote.codePointAt(0);
82
+ }
83
+ /**
84
+ * Read one character.
85
+ * @param i - its index
86
+ * @returns the index of the next character to read, or -1 to give up (strictQuotes)
87
+ */
88
+ step(i) {
89
+ const c = this.text.codePointAt(i);
90
+ if (this.state === QUOTED) {
91
+ if (c === this.quoteCode) {
92
+ this.field += this.text.slice(this.segment, i);
93
+ this.state = CLOSING;
70
94
  }
71
- state = AFTER_QUOTED;
72
- segment = i;
95
+ return i + 1;
73
96
  }
74
- if (c === delimiterCode || c === LF || c === CR) {
75
- if (state === UNQUOTED || state === AFTER_QUOTED) {
76
- field += text.slice(segment, i);
97
+ const isDelimiter = c === this.delimiterCode || this.whitespace && c === TAB;
98
+ if (this.state === CLOSING) {
99
+ const next = this.afterQuote(i, c, isDelimiter || c === LF || c === CR);
100
+ if (next !== null) {
101
+ return next;
77
102
  }
78
- if (c === delimiterCode) {
79
- cells.push(field);
80
- field = "";
81
- state = START;
82
- } else {
83
- if (state !== START || cells.length > 0) {
84
- cells.push(field);
85
- rows.push(cells);
86
- cells = [];
87
- field = "";
88
- }
89
- state = START;
90
- if (c === CR && text.charCodeAt(i + 1) === LF) {
91
- i++;
92
- }
93
- }
94
- segment = i + 1;
95
- continue;
96
103
  }
97
- if (state === START) {
98
- if (c === quoteCode) {
99
- state = QUOTED;
100
- segment = i + 1;
101
- } else {
102
- state = UNQUOTED;
103
- segment = i;
104
+ if (isDelimiter || c === LF || c === CR) {
105
+ return this.separator(i, isDelimiter);
106
+ }
107
+ if (this.state === START) {
108
+ const quoted = c === this.quoteCode;
109
+ this.state = quoted ? QUOTED : UNQUOTED;
110
+ this.segment = quoted ? i + 1 : i;
111
+ }
112
+ return i + 1;
113
+ }
114
+ /**
115
+ * Read the character after a quote that may close a quoted field: a second quote is a quote
116
+ * character in the field; anything else closes it.
117
+ * @param i - its index
118
+ * @param c - its code
119
+ * @param separates - whether it is a delimiter or a line break
120
+ * @returns the index of the next character to read, -1 to give up (strictQuotes), or null to
121
+ * read this character as the one after the field
122
+ */
123
+ afterQuote(i, c, separates) {
124
+ if (c === this.quoteCode) {
125
+ this.field += this.quote;
126
+ this.segment = i + 1;
127
+ this.state = QUOTED;
128
+ return i + 1;
129
+ }
130
+ if (this.strictQuotes && !separates) {
131
+ return -1;
132
+ }
133
+ this.state = AFTER_QUOTED;
134
+ this.segment = i;
135
+ return null;
136
+ }
137
+ /**
138
+ * Read a delimiter or a line break: end the field, and at a line break the row.
139
+ * @param i - its index
140
+ * @param isDelimiter - whether it is a delimiter
141
+ * @returns the index of the next character to read
142
+ */
143
+ separator(i, isDelimiter) {
144
+ if (this.state === UNQUOTED || this.state === AFTER_QUOTED) {
145
+ this.field += this.text.slice(this.segment, i);
146
+ }
147
+ let next = i + 1;
148
+ if (isDelimiter && this.whitespace && this.state === START) ;
149
+ else if (isDelimiter) {
150
+ this.cells.push(this.field);
151
+ this.field = "";
152
+ this.state = START;
153
+ } else {
154
+ this.endRow();
155
+ this.state = START;
156
+ if (this.text.codePointAt(i) === CR && this.text.codePointAt(i + 1) === LF) {
157
+ next = i + 2;
104
158
  }
105
159
  }
160
+ this.segment = next;
161
+ return next;
106
162
  }
107
- if (rows.length < maxRows && (state !== START || cells.length > 0)) {
108
- if (state === UNQUOTED || state === AFTER_QUOTED || state === QUOTED) {
109
- field += text.slice(segment, n);
163
+ /** End the row at a line break; a blank line is no row. */
164
+ endRow() {
165
+ if (this.state === START && this.cells.length === 0) {
166
+ return;
167
+ }
168
+ if (!(this.whitespace && this.state === START)) {
169
+ this.cells.push(this.field);
110
170
  }
111
- cells.push(field);
112
- rows.push(cells);
171
+ this.rows.push(this.cells);
172
+ this.cells = [];
173
+ this.field = "";
174
+ }
175
+ /** End the text: the last row, when it has no line break after it. */
176
+ finish() {
177
+ if (this.state === START && this.cells.length === 0) {
178
+ return;
179
+ }
180
+ if (this.state === UNQUOTED || this.state === AFTER_QUOTED || this.state === QUOTED) {
181
+ this.field += this.text.slice(this.segment);
182
+ }
183
+ if (!(this.whitespace && this.state === START)) {
184
+ this.cells.push(this.field);
185
+ }
186
+ this.rows.push(this.cells);
113
187
  }
114
- return rows;
115
188
  }
116
189
  function stripLeadingComments(text, comments) {
117
190
  if (comments.length === 0) {
118
191
  return text;
119
192
  }
120
193
  let at = 0;
121
- while (at < text.length && comments.includes(text[at])) {
194
+ while (at < text.length) {
195
+ if (text[at] === "\n" || text[at] === "\r") {
196
+ at++;
197
+ continue;
198
+ }
199
+ if (!comments.includes(text[at])) {
200
+ break;
201
+ }
122
202
  const lf = text.indexOf("\n", at);
123
203
  const cr = text.indexOf("\r", at);
124
204
  const end = Math.min(lf < 0 ? Infinity : lf, cr < 0 ? Infinity : cr);
125
205
  if (end === Infinity) {
126
206
  return "";
127
207
  }
128
- at = end + 1;
129
- if (text[at - 1] === "\r" && text[at] === "\n") {
130
- at++;
131
- }
208
+ at = end;
132
209
  }
133
210
  return at === 0 ? text : text.slice(at);
134
211
  }
135
- function sniffDelimiter(text, newline = "\n", candidates = DELIMITER_CANDIDATES, quote = '"', skipQuoteErrors = false) {
212
+ function sniffDelimiter(text, newline = "\n", candidates = DELIMITER_CANDIDATES, quote = '"', skipQuoteErrors = false, collapse = false) {
136
213
  let best = null;
137
214
  let bestDelta = Infinity;
138
- let bestAverage = 0;
139
215
  const terminated = text.endsWith("\n") || text.endsWith("\r");
140
216
  for (const delimiter of candidates) {
141
217
  if (delimiter === quote || delimiter === newline) {
142
218
  continue;
143
219
  }
144
- const split = splitRecords(text, delimiter, quote, PREVIEW_ROWS, skipQuoteErrors);
220
+ const split = splitRecords(text, delimiter, quote, PREVIEW_ROWS, skipQuoteErrors, collapse);
145
221
  if (split === null) {
146
222
  continue;
147
223
  }
@@ -162,10 +238,9 @@ function sniffDelimiter(text, newline = "\n", candidates = DELIMITER_CANDIDATES,
162
238
  }
163
239
  }
164
240
  const average = total / rows.length;
165
- if (average > 1.99 && (delta < bestDelta || delta === bestDelta && average > bestAverage)) {
241
+ if (average > 1.99 && delta < bestDelta) {
166
242
  best = delimiter;
167
243
  bestDelta = delta;
168
- bestAverage = average;
169
244
  }
170
245
  }
171
246
  return best;
@@ -185,6 +260,9 @@ class RecordReader {
185
260
  this.cells = [];
186
261
  this.quoted = [];
187
262
  this.leadingComments = [];
263
+ this.leadingCommentLines = [];
264
+ this.strayQuoteLine = 0;
265
+ this.sepDirective = false;
188
266
  this.recordLine = 0;
189
267
  this.input = input;
190
268
  this.report = report;
@@ -235,12 +313,15 @@ class RecordReader {
235
313
  /**
236
314
  * Record a text-after-quote error (fatal).
237
315
  * @param line - the line the field started on
316
+ * @param field - the 1-based position of the field in its record
238
317
  * @returns never
239
318
  */
240
- badQuote(line) {
241
- return this.report.fail(BAD_QUOTE_CODE, `line ${line}: text after the closing quote of a quoted field`, {
242
- line
243
- });
319
+ badQuote(line, field) {
320
+ return this.report.fail(
321
+ BAD_QUOTE_CODE,
322
+ `text after the closing quote of quoted field ${field} (a quote inside a quoted field is written as two quotes)`,
323
+ { line }
324
+ );
244
325
  }
245
326
  /**
246
327
  * Record an unclosed-quote error (fatal).
@@ -270,6 +351,10 @@ class RecordReader {
270
351
  let breaks = 0;
271
352
  let lastWasCr = false;
272
353
  let sniffed = false;
354
+ const commentCodes = (this.syntax.comments ?? []).map((c) => c.codePointAt(0));
355
+ let leading = commentCodes.length > 0;
356
+ let lineStart = true;
357
+ let inComment = false;
273
358
  for await (const chunk of source) {
274
359
  if (sniffed) {
275
360
  yield chunk;
@@ -279,12 +364,18 @@ class RecordReader {
279
364
  length += chunk.length;
280
365
  for (let i = 0; i < chunk.length && breaks < PREVIEW_ROWS; i++) {
281
366
  const c = chunk.charCodeAt(i);
282
- if (c === LF) {
283
- if (!lastWasCr) {
367
+ if (c === LF || c === CR) {
368
+ if (!(c === LF && lastWasCr) && !inComment) {
284
369
  breaks++;
285
370
  }
286
- } else if (c === CR) {
287
- breaks++;
371
+ inComment = false;
372
+ lineStart = true;
373
+ } else {
374
+ if (lineStart && leading) {
375
+ inComment = commentCodes.includes(c);
376
+ leading = inComment;
377
+ }
378
+ lineStart = false;
288
379
  }
289
380
  lastWasCr = c === CR;
290
381
  }
@@ -310,9 +401,27 @@ class RecordReader {
310
401
  * @param text - the preview
311
402
  */
312
403
  sniff(text) {
404
+ const preview = text.slice(0, PREVIEW_CHARS);
405
+ const body = stripLeadingComments(preview, this.syntax.comments ?? []);
406
+ if (this.syntax.inspect !== void 0) {
407
+ const skipped = preview.slice(0, preview.length - body.length).match(/\r\n|\r|\n/g)?.length ?? 0;
408
+ this.syntax.inspect(body, skipped + 1);
409
+ }
410
+ const directive = this.syntax.sepDirective === true ? SEP_DIRECTIVE.exec(text) : null;
411
+ if (directive !== null && directive[1] !== this.syntax.quote) {
412
+ this.delimiterText = directive[1];
413
+ this.sepDirective = true;
414
+ return;
415
+ }
313
416
  const candidates = this.syntax.candidates ?? DELIMITER_CANDIDATES;
314
- const body = stripLeadingComments(text.slice(0, PREVIEW_CHARS), this.syntax.comments ?? []);
315
- this.delimiterText = sniffDelimiter(body, sniffNewline(body), candidates, this.syntax.quote, this.syntax.skipQuoteErrors) ?? candidates[0];
417
+ this.delimiterText = sniffDelimiter(
418
+ body,
419
+ sniffNewline(body),
420
+ candidates,
421
+ this.syntax.quote,
422
+ this.syntax.skipQuoteErrors,
423
+ this.syntax.collapseSpaces
424
+ ) ?? candidates[0];
316
425
  }
317
426
  }
318
427
  class RecordScanner {
@@ -326,6 +435,7 @@ class RecordScanner {
326
435
  this.recordLine = 1;
327
436
  this.startLine = 1;
328
437
  this.delimiterCode = -1;
438
+ this.collapse = false;
329
439
  this.state = START;
330
440
  this.field = "";
331
441
  this.fieldQuoted = false;
@@ -346,6 +456,7 @@ class RecordScanner {
346
456
  setDelimiter(code) {
347
457
  if (this.delimiterCode < 0) {
348
458
  this.delimiterCode = code;
459
+ this.collapse = code === SPACE && this.reader.syntax.collapseSpaces === true;
349
460
  }
350
461
  }
351
462
  /**
@@ -363,8 +474,9 @@ class RecordScanner {
363
474
  const c = chunk.charCodeAt(i);
364
475
  if (this.state === COMMENT) {
365
476
  if (c === LF || c === CR) {
366
- this.comment += chunk.slice(this.segment, i);
477
+ this.comment = this.grow(this.comment, chunk.slice(this.segment, i));
367
478
  this.reader.leadingComments.push(this.comment);
479
+ this.reader.leadingCommentLines.push(this.line);
368
480
  this.comment = "";
369
481
  this.state = START;
370
482
  this.endLine(c);
@@ -383,28 +495,29 @@ class RecordScanner {
383
495
  i = n;
384
496
  break;
385
497
  }
386
- this.field += chunk.slice(this.segment, q);
498
+ this.field = this.grow(this.field, chunk.slice(this.segment, q));
387
499
  this.state = CLOSING;
388
500
  this.lastWasCr = false;
389
501
  i = q + 1;
390
502
  continue;
391
503
  }
504
+ const isDelimiter = c === delimiterCode || this.collapse && c === TAB;
392
505
  if (this.state === CLOSING) {
393
506
  if (c === quoteCode) {
394
- this.field += this.quoteText;
507
+ this.field = this.grow(this.field, this.quoteText);
395
508
  this.segment = i + 1;
396
509
  this.state = QUOTED;
397
510
  this.lastWasCr = false;
398
511
  i++;
399
512
  continue;
400
513
  }
401
- if (c !== delimiterCode && c !== LF && c !== CR) {
402
- this.reader.badQuote(this.startLine);
514
+ if (!isDelimiter && c !== LF && c !== CR) {
515
+ this.reader.badQuote(this.startLine, this.count + 1);
403
516
  }
404
517
  this.state = AFTER_QUOTED;
405
518
  this.segment = i;
406
519
  }
407
- if (c === delimiterCode || c === LF || c === CR) {
520
+ if (isDelimiter || c === LF || c === CR) {
408
521
  if (c === LF && this.lastWasCr) {
409
522
  this.lastWasCr = false;
410
523
  this.segment = i + 1;
@@ -412,9 +525,15 @@ class RecordScanner {
412
525
  continue;
413
526
  }
414
527
  if (this.state === UNQUOTED) {
415
- this.field += chunk.slice(this.segment, i);
528
+ this.field = this.grow(this.field, chunk.slice(this.segment, i));
416
529
  }
417
- if (c === delimiterCode) {
530
+ if (isDelimiter && this.collapse && this.state === START) {
531
+ this.lastWasCr = false;
532
+ this.segment = i + 1;
533
+ i++;
534
+ continue;
535
+ }
536
+ if (isDelimiter) {
418
537
  this.push();
419
538
  this.state = START;
420
539
  this.lastWasCr = false;
@@ -422,9 +541,10 @@ class RecordScanner {
422
541
  i++;
423
542
  continue;
424
543
  }
425
- const blank = this.state === START && this.count === 0;
426
- if (!blank) {
544
+ if (!(this.state === START && (this.count === 0 || this.collapse))) {
427
545
  this.push();
546
+ }
547
+ if (this.count > 0) {
428
548
  this.ready = true;
429
549
  this.recordLine = this.startLine;
430
550
  }
@@ -454,6 +574,8 @@ class RecordScanner {
454
574
  this.state = UNQUOTED;
455
575
  this.segment = i;
456
576
  }
577
+ } else if (c === quoteCode && this.state === UNQUOTED && this.reader.strayQuoteLine === 0) {
578
+ this.reader.strayQuoteLine = this.startLine;
457
579
  }
458
580
  i++;
459
581
  }
@@ -469,9 +591,9 @@ class RecordScanner {
469
591
  return;
470
592
  }
471
593
  if (this.state === COMMENT) {
472
- this.comment += chunk.slice(this.segment, n);
594
+ this.comment = this.grow(this.comment, chunk.slice(this.segment, n));
473
595
  } else if (this.state === QUOTED || this.state === UNQUOTED) {
474
- this.field += chunk.slice(this.segment, n);
596
+ this.field = this.grow(this.field, chunk.slice(this.segment, n));
475
597
  }
476
598
  this.segment = n;
477
599
  }
@@ -484,13 +606,16 @@ class RecordScanner {
484
606
  const { state } = this;
485
607
  if (state === COMMENT) {
486
608
  this.reader.leadingComments.push(this.comment);
609
+ this.reader.leadingCommentLines.push(this.line);
487
610
  return false;
488
611
  }
489
612
  if (state === QUOTED) {
490
613
  this.reader.unclosedQuote(this.startLine);
491
614
  }
492
615
  if (state !== START || this.count > 0) {
493
- this.push();
616
+ if (!(state === START && this.collapse)) {
617
+ this.push();
618
+ }
494
619
  this.recordLine = this.startLine;
495
620
  return true;
496
621
  }
@@ -503,23 +628,42 @@ class RecordScanner {
503
628
  * @param to - the index after the run
504
629
  */
505
630
  countLineBreaks(chunk, from, to) {
506
- let { line, lastWasCr } = this;
507
- for (let i = from; i < to; i++) {
508
- const c = chunk.charCodeAt(i);
509
- if (c === LF) {
510
- if (!lastWasCr) {
511
- line++;
512
- }
513
- lastWasCr = false;
514
- } else if (c === CR) {
631
+ const run = chunk.slice(from, to);
632
+ let { line } = this;
633
+ let lastCr = this.lastWasCr ? -1 : -2;
634
+ let lf = run.indexOf("\n");
635
+ let cr = run.indexOf("\r");
636
+ while (lf >= 0 || cr >= 0) {
637
+ if (lf < 0 || cr >= 0 && cr < lf) {
515
638
  line++;
516
- lastWasCr = true;
639
+ lastCr = cr;
640
+ cr = run.indexOf("\r", cr + 1);
517
641
  } else {
518
- lastWasCr = false;
642
+ if (lf !== lastCr + 1) {
643
+ line++;
644
+ }
645
+ lf = run.indexOf("\n", lf + 1);
519
646
  }
520
647
  }
521
648
  this.line = line;
522
- this.lastWasCr = lastWasCr;
649
+ this.lastWasCr = lastCr === run.length - 1;
650
+ }
651
+ /**
652
+ * Append to the field or comment in progress, failing with E_TOO_LARGE instead of a RangeError
653
+ * when the result would be longer than one JavaScript string can hold.
654
+ * @param text - the text so far
655
+ * @param piece - the text to append
656
+ * @returns the joined text
657
+ */
658
+ grow(text, piece) {
659
+ if (text.length + piece.length > MAX_TEXT_LENGTH) {
660
+ tooLarge(
661
+ this.reader.report,
662
+ `a cell is longer than ${MAX_TEXT_LENGTH} characters, the most one JavaScript string holds`,
663
+ this.startLine
664
+ );
665
+ }
666
+ return text + piece;
523
667
  }
524
668
  /** Store the field in progress as the next cell. */
525
669
  push() {
@@ -557,9 +701,18 @@ class CsvRecordReader {
557
701
  delimiter: options.delimiter ?? null,
558
702
  quote: '"',
559
703
  comments: options.comments,
560
- skipQuoteErrors: options.skipQuoteErrors
704
+ skipQuoteErrors: options.skipQuoteErrors,
705
+ collapseSpaces: true,
706
+ sepDirective: true,
707
+ inspect: options.inspect
561
708
  },
562
- { signal: options.signal, onProgress: options.onProgress, encoding: options.encoding }
709
+ {
710
+ signal: options.signal,
711
+ onProgress: options.onProgress,
712
+ encoding: options.encoding,
713
+ allowEmpty: options.allowEmpty,
714
+ nulIsBinary: true
715
+ }
563
716
  );
564
717
  }
565
718
  /**
@@ -569,6 +722,13 @@ class CsvRecordReader {
569
722
  get leadingComments() {
570
723
  return this.inner.leadingComments;
571
724
  }
725
+ /**
726
+ * The 1-based line of each leading comment, parallel to `leadingComments`.
727
+ * @returns the lines
728
+ */
729
+ get leadingCommentLines() {
730
+ return this.inner.leadingCommentLines;
731
+ }
572
732
  /**
573
733
  * The 1-based line the most recently yielded row starts on.
574
734
  * @returns the line; 0 before the first row
@@ -590,6 +750,20 @@ class CsvRecordReader {
590
750
  get quoted() {
591
751
  return this.inner.quoted;
592
752
  }
753
+ /**
754
+ * The line of the first quote inside an unquoted field.
755
+ * @returns the line, or 0 when there was none
756
+ */
757
+ get strayQuoteLine() {
758
+ return this.inner.strayQuoteLine;
759
+ }
760
+ /**
761
+ * Whether the first record is an Excel `sep=X` line the delimiter was taken from.
762
+ * @returns true when it is
763
+ */
764
+ get sepDirective() {
765
+ return this.inner.sepDirective;
766
+ }
593
767
  /**
594
768
  * Iterate the rows.
595
769
  * @yields one row at a time as its cell texts
@@ -598,21 +772,31 @@ class CsvRecordReader {
598
772
  async *[Symbol.asyncIterator]() {
599
773
  const { inner } = this;
600
774
  for await (const count of inner) {
601
- if (count === 1 && !inner.quoted[0] && inner.cells[0].trim().length === 0) {
775
+ if (isBlankRecord(inner.cells, inner.quoted, count)) {
602
776
  continue;
603
777
  }
604
778
  yield inner.cells.slice(0, count);
605
779
  }
606
780
  }
607
781
  }
782
+ function isBlankRecord(cells, quoted, count) {
783
+ for (let k = 0; k < count; k++) {
784
+ if (quoted[k] || cells[k].trim().length > 0) {
785
+ return false;
786
+ }
787
+ }
788
+ return true;
789
+ }
608
790
  export {
609
791
  BAD_QUOTE_CODE as B,
610
792
  CsvRecordReader as C,
611
793
  DELIMITER_CANDIDATES as D,
612
794
  RecordReader as R,
613
795
  UNCLOSED_QUOTE_CODE as U,
614
- sniffDelimiter as a,
796
+ sniffNewline as a,
797
+ sniffDelimiter as b,
615
798
  checkRecordSyntax as c,
616
- sniffNewline as s
799
+ splitRecords as d,
800
+ stripLeadingComments as s
617
801
  };
618
- //# sourceMappingURL=records-dbRkxwaq.js.map
802
+ //# sourceMappingURL=records-CQXT__mY.js.map