@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.
- package/README.md +49 -414
- package/dist/chunks/children-CL3Cy0ez.js.map +1 -1
- package/dist/chunks/choose-BbJI55dx.js +56 -0
- package/dist/chunks/choose-BbJI55dx.js.map +1 -0
- package/dist/chunks/constants-BCsFsMj4.js +231 -0
- package/dist/chunks/constants-BCsFsMj4.js.map +1 -0
- package/dist/chunks/{escape-B-tkk_Cl.js → escape-D0g6NNUy.js} +382 -92
- package/dist/chunks/escape-D0g6NNUy.js.map +1 -0
- package/dist/chunks/export-BTI4yQgy.js +4333 -0
- package/dist/chunks/export-BTI4yQgy.js.map +1 -0
- package/dist/chunks/exporter-BMqk5oxW.js +3465 -0
- package/dist/chunks/exporter-BMqk5oxW.js.map +1 -0
- package/dist/chunks/{importer-eUREhBGj.js → exporter-Cra2GYcN.js} +4969 -3201
- package/dist/chunks/exporter-Cra2GYcN.js.map +1 -0
- package/dist/chunks/{exporter-BGrsWamJ.js → exporter-Dxh231ZF.js} +38 -229
- package/dist/chunks/exporter-Dxh231ZF.js.map +1 -0
- package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-tne475KK.js} +22 -20
- package/dist/chunks/exporter-tne475KK.js.map +1 -0
- package/dist/chunks/importer-90YWhJoF.js +2811 -0
- package/dist/chunks/importer-90YWhJoF.js.map +1 -0
- package/dist/chunks/{importer-D_e7e7LX.js → importer-Bcl1d4xH.js} +398 -145
- package/dist/chunks/importer-Bcl1d4xH.js.map +1 -0
- package/dist/chunks/{importer-BWY2FFc5.js → importer-BfIsp1f9.js} +255 -77
- package/dist/chunks/importer-BfIsp1f9.js.map +1 -0
- package/dist/chunks/{importer-zGLo8Dg_.js → importer-C_TEA1zJ.js} +484 -157
- package/dist/chunks/importer-C_TEA1zJ.js.map +1 -0
- package/dist/chunks/{importer-DET1tg6s.js → importer-DCjOvO7U.js} +1687 -310
- package/dist/chunks/importer-DCjOvO7U.js.map +1 -0
- package/dist/chunks/{importer-vi3bSdtw.js → importer-DfVu6j59.js} +509 -76
- package/dist/chunks/importer-DfVu6j59.js.map +1 -0
- package/dist/chunks/{importer-DIrbbnAf.js → importer-Dku_VAIY.js} +585 -226
- package/dist/chunks/importer-Dku_VAIY.js.map +1 -0
- package/dist/chunks/json-elements-3tnyt5uZ.js +1225 -0
- package/dist/chunks/json-elements-3tnyt5uZ.js.map +1 -0
- package/dist/chunks/ontology-export-B9Tcf37D.js +357 -0
- package/dist/chunks/ontology-export-B9Tcf37D.js.map +1 -0
- package/dist/chunks/{records-dbRkxwaq.js → records-CQXT__mY.js} +298 -114
- package/dist/chunks/records-CQXT__mY.js.map +1 -0
- package/dist/chunks/{text-Dr0Ifpag.js → text-DmcUs5_Q.js} +29 -11
- package/dist/chunks/text-DmcUs5_Q.js.map +1 -0
- package/dist/chunks/{writer-C7flM-Ih.js → writer-DxjgHwSe.js} +19 -1
- package/dist/chunks/writer-DxjgHwSe.js.map +1 -0
- package/dist/csv.js +951 -261
- package/dist/csv.js.map +1 -1
- package/dist/cx.js +6 -3
- package/dist/cx2.js +2 -2
- package/dist/cys.js +6 -3
- package/dist/dot.js +1 -1
- package/dist/gexf.js +554 -122
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +342 -85
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +1105 -213
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +3 -2
- package/dist/graphml.js.map +1 -1
- package/dist/json.js +3 -2
- package/dist/neo4j.js +564 -157
- package/dist/neo4j.js.map +1 -1
- package/dist/obo.js +6 -3
- package/dist/pajek.js +1 -1
- package/dist/src/children.d.ts +18 -6
- package/dist/src/children.d.ts.map +1 -1
- package/dist/src/children.js +6 -3
- package/dist/src/children.js.map +1 -1
- package/dist/src/common/attributes.d.ts +29 -11
- package/dist/src/common/attributes.d.ts.map +1 -1
- package/dist/src/common/attributes.js +25 -7
- package/dist/src/common/attributes.js.map +1 -1
- package/dist/src/common/cell-budget.d.ts +9 -2
- package/dist/src/common/cell-budget.d.ts.map +1 -1
- package/dist/src/common/cell-budget.js +11 -3
- package/dist/src/common/cell-budget.js.map +1 -1
- package/dist/src/common/choose.d.ts +19 -0
- package/dist/src/common/choose.d.ts.map +1 -0
- package/dist/src/common/choose.js +72 -0
- package/dist/src/common/choose.js.map +1 -0
- package/dist/src/common/codes.d.ts +456 -66
- package/dist/src/common/codes.d.ts.map +1 -1
- package/dist/src/common/codes.js +458 -66
- package/dist/src/common/codes.js.map +1 -1
- package/dist/src/common/compare.d.ts +81 -0
- package/dist/src/common/compare.d.ts.map +1 -0
- package/dist/src/common/compare.js +394 -0
- package/dist/src/common/compare.js.map +1 -0
- package/dist/src/common/cx-export.d.ts +123 -0
- package/dist/src/common/cx-export.d.ts.map +1 -0
- package/dist/src/common/cx-export.js +334 -0
- package/dist/src/common/cx-export.js.map +1 -0
- package/dist/src/common/declared-types.d.ts +22 -2
- package/dist/src/common/declared-types.d.ts.map +1 -1
- package/dist/src/common/declared-types.js +19 -1
- package/dist/src/common/declared-types.js.map +1 -1
- package/dist/src/common/direction.d.ts +74 -50
- package/dist/src/common/direction.d.ts.map +1 -1
- package/dist/src/common/direction.js +47 -27
- package/dist/src/common/direction.js.map +1 -1
- package/dist/src/common/escape.d.ts +21 -9
- package/dist/src/common/escape.d.ts.map +1 -1
- package/dist/src/common/escape.js +33 -17
- package/dist/src/common/escape.js.map +1 -1
- package/dist/src/common/export.d.ts +144 -32
- package/dist/src/common/export.d.ts.map +1 -1
- package/dist/src/common/export.js +216 -42
- package/dist/src/common/export.js.map +1 -1
- package/dist/src/common/format.d.ts +23 -1
- package/dist/src/common/format.d.ts.map +1 -1
- package/dist/src/common/format.js +26 -1
- package/dist/src/common/format.js.map +1 -1
- package/dist/src/common/ids.d.ts +9 -2
- package/dist/src/common/ids.d.ts.map +1 -1
- package/dist/src/common/ids.js +6 -2
- package/dist/src/common/ids.js.map +1 -1
- package/dist/src/common/input.d.ts +122 -28
- package/dist/src/common/input.d.ts.map +1 -1
- package/dist/src/common/input.js +890 -124
- package/dist/src/common/input.js.map +1 -1
- package/dist/src/common/json-elements.d.ts +144 -20
- package/dist/src/common/json-elements.d.ts.map +1 -1
- package/dist/src/common/json-elements.js +868 -188
- package/dist/src/common/json-elements.js.map +1 -1
- package/dist/src/common/line-format.d.ts +90 -0
- package/dist/src/common/line-format.d.ts.map +1 -0
- package/dist/src/common/line-format.js +185 -0
- package/dist/src/common/line-format.js.map +1 -0
- package/dist/src/common/lists.d.ts +6 -1
- package/dist/src/common/lists.d.ts.map +1 -1
- package/dist/src/common/lists.js +2 -0
- package/dist/src/common/lists.js.map +1 -1
- package/dist/src/common/ontology-export.d.ts +167 -0
- package/dist/src/common/ontology-export.d.ts.map +1 -0
- package/dist/src/common/ontology-export.js +359 -0
- package/dist/src/common/ontology-export.js.map +1 -0
- package/dist/src/common/ontology.d.ts +25 -3
- package/dist/src/common/ontology.d.ts.map +1 -1
- package/dist/src/common/ontology.js +30 -9
- package/dist/src/common/ontology.js.map +1 -1
- package/dist/src/common/options.d.ts +62 -12
- package/dist/src/common/options.d.ts.map +1 -1
- package/dist/src/common/options.js +89 -11
- package/dist/src/common/options.js.map +1 -1
- package/dist/src/common/plural.d.ts +31 -0
- package/dist/src/common/plural.d.ts.map +1 -0
- package/dist/src/common/plural.js +46 -0
- package/dist/src/common/plural.js.map +1 -0
- package/dist/src/common/report.d.ts +72 -14
- package/dist/src/common/report.d.ts.map +1 -1
- package/dist/src/common/report.js +146 -22
- package/dist/src/common/report.js.map +1 -1
- package/dist/src/common/temporal.d.ts +22 -5
- package/dist/src/common/temporal.d.ts.map +1 -1
- package/dist/src/common/temporal.js +13 -2
- package/dist/src/common/temporal.js.map +1 -1
- package/dist/src/common/text.d.ts +39 -23
- package/dist/src/common/text.d.ts.map +1 -1
- package/dist/src/common/text.js +51 -21
- package/dist/src/common/text.js.map +1 -1
- package/dist/src/common/weights.d.ts +37 -4
- package/dist/src/common/weights.d.ts.map +1 -1
- package/dist/src/common/weights.js +61 -2
- package/dist/src/common/weights.js.map +1 -1
- package/dist/src/common/writer.d.ts +19 -3
- package/dist/src/common/writer.d.ts.map +1 -1
- package/dist/src/common/writer.js +30 -2
- package/dist/src/common/writer.js.map +1 -1
- package/dist/src/common/xml.d.ts +125 -9
- package/dist/src/common/xml.d.ts.map +1 -1
- package/dist/src/common/xml.js +400 -83
- package/dist/src/common/xml.js.map +1 -1
- package/dist/src/common/zip.d.ts +44 -4
- package/dist/src/common/zip.d.ts.map +1 -1
- package/dist/src/common/zip.js +134 -5
- package/dist/src/common/zip.js.map +1 -1
- package/dist/src/formats/csv/exporter.d.ts +80 -24
- package/dist/src/formats/csv/exporter.d.ts.map +1 -1
- package/dist/src/formats/csv/exporter.js +145 -32
- package/dist/src/formats/csv/exporter.js.map +1 -1
- package/dist/src/formats/csv/header.d.ts +38 -9
- package/dist/src/formats/csv/header.d.ts.map +1 -1
- package/dist/src/formats/csv/header.js +46 -10
- package/dist/src/formats/csv/header.js.map +1 -1
- package/dist/src/formats/csv/importer.d.ts +187 -37
- package/dist/src/formats/csv/importer.d.ts.map +1 -1
- package/dist/src/formats/csv/importer.js +835 -204
- package/dist/src/formats/csv/importer.js.map +1 -1
- package/dist/src/formats/csv/index.d.ts +100 -19
- package/dist/src/formats/csv/index.d.ts.map +1 -1
- package/dist/src/formats/csv/index.js +94 -21
- package/dist/src/formats/csv/index.js.map +1 -1
- package/dist/src/formats/csv/records.d.ts +95 -10
- package/dist/src/formats/csv/records.d.ts.map +1 -1
- package/dist/src/formats/csv/records.js +333 -122
- package/dist/src/formats/csv/records.js.map +1 -1
- package/dist/src/formats/csv/values.d.ts +1 -0
- package/dist/src/formats/csv/values.d.ts.map +1 -1
- package/dist/src/formats/csv/values.js +1 -0
- package/dist/src/formats/csv/values.js.map +1 -1
- package/dist/src/formats/cx/exporter.d.ts +102 -0
- package/dist/src/formats/cx/exporter.d.ts.map +1 -0
- package/dist/src/formats/cx/exporter.js +1217 -0
- package/dist/src/formats/cx/exporter.js.map +1 -0
- package/dist/src/formats/cx/importer.d.ts +79 -32
- package/dist/src/formats/cx/importer.d.ts.map +1 -1
- package/dist/src/formats/cx/importer.js +680 -285
- package/dist/src/formats/cx/importer.js.map +1 -1
- package/dist/src/formats/cx/index.d.ts +4 -3
- package/dist/src/formats/cx/index.d.ts.map +1 -1
- package/dist/src/formats/cx/index.js +4 -3
- package/dist/src/formats/cx/index.js.map +1 -1
- package/dist/src/formats/cx2/exporter.d.ts +29 -11
- package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
- package/dist/src/formats/cx2/exporter.js +39 -268
- package/dist/src/formats/cx2/exporter.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts +78 -28
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +226 -79
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/index.d.ts +2 -1
- package/dist/src/formats/cx2/index.d.ts.map +1 -1
- package/dist/src/formats/cx2/index.js +2 -1
- package/dist/src/formats/cx2/index.js.map +1 -1
- package/dist/src/formats/cys/constants.d.ts +66 -17
- package/dist/src/formats/cys/constants.d.ts.map +1 -1
- package/dist/src/formats/cys/constants.js +59 -18
- package/dist/src/formats/cys/constants.js.map +1 -1
- package/dist/src/formats/cys/exporter.d.ts +118 -0
- package/dist/src/formats/cys/exporter.d.ts.map +1 -0
- package/dist/src/formats/cys/exporter.js +1072 -0
- package/dist/src/formats/cys/exporter.js.map +1 -0
- package/dist/src/formats/cys/importer.d.ts +22 -8
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +510 -149
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/index.d.ts +4 -2
- package/dist/src/formats/cys/index.d.ts.map +1 -1
- package/dist/src/formats/cys/index.js +4 -2
- package/dist/src/formats/cys/index.js.map +1 -1
- package/dist/src/formats/cys/session.d.ts +46 -7
- package/dist/src/formats/cys/session.d.ts.map +1 -1
- package/dist/src/formats/cys/session.js +98 -24
- package/dist/src/formats/cys/session.js.map +1 -1
- package/dist/src/formats/cys/tables.d.ts +9 -2
- package/dist/src/formats/cys/tables.d.ts.map +1 -1
- package/dist/src/formats/cys/tables.js +29 -7
- package/dist/src/formats/cys/tables.js.map +1 -1
- package/dist/src/formats/dot/exporter.d.ts +42 -14
- package/dist/src/formats/dot/exporter.d.ts.map +1 -1
- package/dist/src/formats/dot/exporter.js +56 -29
- package/dist/src/formats/dot/exporter.js.map +1 -1
- package/dist/src/formats/dot/importer.d.ts +91 -29
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +190 -39
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/index.d.ts +2 -1
- package/dist/src/formats/dot/index.d.ts.map +1 -1
- package/dist/src/formats/dot/index.js +2 -1
- package/dist/src/formats/dot/index.js.map +1 -1
- package/dist/src/formats/dot/names.d.ts +44 -11
- package/dist/src/formats/dot/names.d.ts.map +1 -1
- package/dist/src/formats/dot/names.js +44 -11
- package/dist/src/formats/dot/names.js.map +1 -1
- package/dist/src/formats/dot/tokenizer.d.ts +9 -2
- package/dist/src/formats/dot/tokenizer.d.ts.map +1 -1
- package/dist/src/formats/dot/tokenizer.js +20 -5
- package/dist/src/formats/dot/tokenizer.js.map +1 -1
- package/dist/src/formats/gexf/exporter.d.ts +46 -15
- package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
- package/dist/src/formats/gexf/exporter.js +45 -15
- package/dist/src/formats/gexf/exporter.js.map +1 -1
- package/dist/src/formats/gexf/importer.d.ts +87 -23
- package/dist/src/formats/gexf/importer.d.ts.map +1 -1
- package/dist/src/formats/gexf/importer.js +471 -90
- package/dist/src/formats/gexf/importer.js.map +1 -1
- package/dist/src/formats/gexf/index.d.ts +84 -21
- package/dist/src/formats/gexf/index.d.ts.map +1 -1
- package/dist/src/formats/gexf/index.js +80 -23
- package/dist/src/formats/gexf/index.js.map +1 -1
- package/dist/src/formats/gexf/schema.d.ts +67 -15
- package/dist/src/formats/gexf/schema.d.ts.map +1 -1
- package/dist/src/formats/gexf/schema.js +59 -13
- package/dist/src/formats/gexf/schema.js.map +1 -1
- package/dist/src/formats/gml/exporter.d.ts +69 -21
- package/dist/src/formats/gml/exporter.d.ts.map +1 -1
- package/dist/src/formats/gml/exporter.js +74 -29
- package/dist/src/formats/gml/exporter.js.map +1 -1
- package/dist/src/formats/gml/importer.d.ts +116 -25
- package/dist/src/formats/gml/importer.d.ts.map +1 -1
- package/dist/src/formats/gml/importer.js +290 -61
- package/dist/src/formats/gml/importer.js.map +1 -1
- package/dist/src/formats/gml/index.d.ts +87 -24
- package/dist/src/formats/gml/index.d.ts.map +1 -1
- package/dist/src/formats/gml/index.js +79 -26
- package/dist/src/formats/gml/index.js.map +1 -1
- package/dist/src/formats/gml/syntax.d.ts +67 -18
- package/dist/src/formats/gml/syntax.d.ts.map +1 -1
- package/dist/src/formats/gml/syntax.js +108 -26
- package/dist/src/formats/gml/syntax.js.map +1 -1
- package/dist/src/formats/graphml/constants.d.ts +174 -44
- package/dist/src/formats/graphml/constants.d.ts.map +1 -1
- package/dist/src/formats/graphml/constants.js +165 -44
- package/dist/src/formats/graphml/constants.js.map +1 -1
- package/dist/src/formats/graphml/exporter.d.ts +17 -9
- package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
- package/dist/src/formats/graphml/exporter.js +33 -12
- package/dist/src/formats/graphml/exporter.js.map +1 -1
- package/dist/src/formats/graphml/importer.d.ts +19 -7
- package/dist/src/formats/graphml/importer.d.ts.map +1 -1
- package/dist/src/formats/graphml/importer.js +466 -39
- package/dist/src/formats/graphml/importer.js.map +1 -1
- package/dist/src/formats/graphml/index.d.ts +2 -1
- package/dist/src/formats/graphml/index.d.ts.map +1 -1
- package/dist/src/formats/graphml/index.js +2 -1
- package/dist/src/formats/graphml/index.js.map +1 -1
- package/dist/src/formats/graphml/tree.d.ts +6 -2
- package/dist/src/formats/graphml/tree.d.ts.map +1 -1
- package/dist/src/formats/graphml/tree.js +6 -2
- package/dist/src/formats/graphml/tree.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +8 -3
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +36 -15
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/dialect.d.ts +88 -24
- package/dist/src/formats/json/dialect.d.ts.map +1 -1
- package/dist/src/formats/json/dialect.js +109 -19
- package/dist/src/formats/json/dialect.js.map +1 -1
- package/dist/src/formats/json/exporter.d.ts +134 -22
- package/dist/src/formats/json/exporter.d.ts.map +1 -1
- package/dist/src/formats/json/exporter.js +135 -54
- package/dist/src/formats/json/exporter.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +173 -52
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +899 -220
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/index.d.ts +3 -2
- package/dist/src/formats/json/index.d.ts.map +1 -1
- package/dist/src/formats/json/index.js +3 -2
- package/dist/src/formats/json/index.js.map +1 -1
- package/dist/src/formats/json/obographs-export.d.ts +68 -0
- package/dist/src/formats/json/obographs-export.d.ts.map +1 -0
- package/dist/src/formats/json/obographs-export.js +941 -0
- package/dist/src/formats/json/obographs-export.js.map +1 -0
- package/dist/src/formats/json/obographs.d.ts +26 -0
- package/dist/src/formats/json/obographs.d.ts.map +1 -1
- package/dist/src/formats/json/obographs.js +297 -80
- package/dist/src/formats/json/obographs.js.map +1 -1
- package/dist/src/formats/neo4j/exporter.d.ts +109 -21
- package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
- package/dist/src/formats/neo4j/exporter.js +238 -85
- package/dist/src/formats/neo4j/exporter.js.map +1 -1
- package/dist/src/formats/neo4j/header.d.ts +17 -4
- package/dist/src/formats/neo4j/header.d.ts.map +1 -1
- package/dist/src/formats/neo4j/header.js +36 -4
- package/dist/src/formats/neo4j/header.js.map +1 -1
- package/dist/src/formats/neo4j/importer.d.ts +107 -27
- package/dist/src/formats/neo4j/importer.d.ts.map +1 -1
- package/dist/src/formats/neo4j/importer.js +415 -63
- package/dist/src/formats/neo4j/importer.js.map +1 -1
- package/dist/src/formats/neo4j/index.d.ts +73 -23
- package/dist/src/formats/neo4j/index.d.ts.map +1 -1
- package/dist/src/formats/neo4j/index.js +65 -25
- package/dist/src/formats/neo4j/index.js.map +1 -1
- package/dist/src/formats/obo/exporter.d.ts +150 -0
- package/dist/src/formats/obo/exporter.d.ts.map +1 -0
- package/dist/src/formats/obo/exporter.js +1736 -0
- package/dist/src/formats/obo/exporter.js.map +1 -0
- package/dist/src/formats/obo/importer.d.ts +95 -19
- package/dist/src/formats/obo/importer.d.ts.map +1 -1
- package/dist/src/formats/obo/importer.js +475 -104
- package/dist/src/formats/obo/importer.js.map +1 -1
- package/dist/src/formats/obo/index.d.ts +6 -3
- package/dist/src/formats/obo/index.d.ts.map +1 -1
- package/dist/src/formats/obo/index.js +6 -3
- package/dist/src/formats/obo/index.js.map +1 -1
- package/dist/src/formats/obo/syntax.d.ts +108 -4
- package/dist/src/formats/obo/syntax.d.ts.map +1 -1
- package/dist/src/formats/obo/syntax.js +211 -34
- package/dist/src/formats/obo/syntax.js.map +1 -1
- package/dist/src/formats/pajek/exporter.d.ts +54 -16
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +66 -34
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +84 -22
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +303 -83
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +2 -1
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js +2 -1
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/syntax.d.ts +77 -14
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
- package/dist/src/formats/pajek/syntax.js +183 -51
- package/dist/src/formats/pajek/syntax.js.map +1 -1
- package/dist/src/formats/xgmml/columns.d.ts +1 -0
- package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
- package/dist/src/formats/xgmml/columns.js +4 -0
- package/dist/src/formats/xgmml/columns.js.map +1 -1
- package/dist/src/formats/xgmml/constants.d.ts +186 -56
- package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
- package/dist/src/formats/xgmml/constants.js +181 -57
- package/dist/src/formats/xgmml/constants.js.map +1 -1
- package/dist/src/formats/xgmml/document.d.ts +65 -11
- package/dist/src/formats/xgmml/document.d.ts.map +1 -1
- package/dist/src/formats/xgmml/document.js +157 -28
- package/dist/src/formats/xgmml/document.js.map +1 -1
- package/dist/src/formats/xgmml/emit.d.ts +61 -3
- package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
- package/dist/src/formats/xgmml/emit.js +129 -26
- package/dist/src/formats/xgmml/emit.js.map +1 -1
- package/dist/src/formats/xgmml/exporter.d.ts +13 -6
- package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
- package/dist/src/formats/xgmml/exporter.js +20 -21
- package/dist/src/formats/xgmml/exporter.js.map +1 -1
- package/dist/src/formats/xgmml/importer.d.ts +33 -12
- package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
- package/dist/src/formats/xgmml/importer.js +35 -72
- package/dist/src/formats/xgmml/importer.js.map +1 -1
- package/dist/src/formats/xgmml/index.d.ts +1 -0
- package/dist/src/formats/xgmml/index.d.ts.map +1 -1
- package/dist/src/formats/xgmml/index.js +1 -0
- package/dist/src/formats/xgmml/index.js.map +1 -1
- package/dist/src/formats/xgmml/values.d.ts +8 -1
- package/dist/src/formats/xgmml/values.d.ts.map +1 -1
- package/dist/src/formats/xgmml/values.js +7 -2
- package/dist/src/formats/xgmml/values.js.map +1 -1
- package/dist/src/index.d.ts +23 -18
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +28 -16
- package/dist/src/index.js.map +1 -1
- package/dist/src/registry.d.ts +478 -92
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +807 -88
- package/dist/src/registry.js.map +1 -1
- package/dist/src/sniff.d.ts +61 -19
- package/dist/src/sniff.d.ts.map +1 -1
- package/dist/src/sniff.js +121 -29
- package/dist/src/sniff.js.map +1 -1
- package/dist/src/types.d.ts +362 -112
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +28 -7
- package/dist/src/types.js.map +1 -1
- package/dist/xgmml.js +2 -2
- package/docs/samples/README.md +25 -0
- package/docs/samples/got-edges.csv +353 -0
- package/docs/samples/got-network.graphml +1384 -0
- package/docs/samples/got-nodes.csv +108 -0
- package/docs/samples/got.cx +930 -0
- package/docs/samples/got.cx2 +465 -0
- package/docs/samples/got.gexf +471 -0
- package/docs/samples/got.gml +2650 -0
- package/docs/samples/got.json +2546 -0
- package/docs/samples/got.net +461 -0
- package/docs/samples/movies-nodes.csv +9 -0
- package/docs/samples/movies-rels.csv +8 -0
- package/docs/samples/networks.cys +0 -0
- package/docs/samples/proteins.xgmml +9 -0
- package/docs/samples/teams.gv +24 -0
- package/docs/samples/vehicles.obo +25 -0
- package/package.json +9 -4
- package/src/children.ts +18 -6
- package/src/common/attributes.ts +29 -11
- package/src/common/cell-budget.ts +11 -3
- package/src/common/choose.ts +89 -0
- package/src/common/codes.ts +490 -66
- package/src/common/compare.ts +472 -0
- package/src/common/cx-export.ts +432 -0
- package/src/common/declared-types.ts +38 -4
- package/src/common/direction.ts +78 -51
- package/src/common/escape.ts +33 -17
- package/src/common/export.ts +284 -47
- package/src/common/format.ts +30 -1
- package/src/common/ids.ts +14 -3
- package/src/common/input.ts +1057 -134
- package/src/common/json-elements.ts +1034 -198
- package/src/common/line-format.ts +249 -0
- package/src/common/lists.ts +6 -1
- package/src/common/ontology-export.ts +461 -0
- package/src/common/ontology.ts +31 -9
- package/src/common/options.ts +110 -15
- package/src/common/plural.ts +49 -0
- package/src/common/report.ts +168 -25
- package/src/common/temporal.ts +22 -5
- package/src/common/text.ts +62 -23
- package/src/common/weights.ts +74 -4
- package/src/common/writer.ts +37 -3
- package/src/common/xml.ts +477 -88
- package/src/common/zip.ts +169 -7
- package/src/formats/csv/exporter.ts +201 -46
- package/src/formats/csv/header.ts +50 -11
- package/src/formats/csv/importer.ts +1133 -245
- package/src/formats/csv/index.ts +106 -19
- package/src/formats/csv/records.ts +396 -122
- package/src/formats/csv/values.ts +1 -0
- package/src/formats/cx/exporter.ts +1483 -0
- package/src/formats/cx/importer.ts +888 -300
- package/src/formats/cx/index.ts +4 -3
- package/src/formats/cx2/exporter.ts +61 -338
- package/src/formats/cx2/importer.ts +317 -86
- package/src/formats/cx2/index.ts +2 -1
- package/src/formats/cys/constants.ts +62 -17
- package/src/formats/cys/exporter.ts +1368 -0
- package/src/formats/cys/importer.ts +659 -157
- package/src/formats/cys/index.ts +4 -2
- package/src/formats/cys/session.ts +139 -31
- package/src/formats/cys/tables.ts +47 -9
- package/src/formats/dot/exporter.ts +83 -37
- package/src/formats/dot/importer.ts +248 -54
- package/src/formats/dot/index.ts +2 -1
- package/src/formats/dot/names.ts +44 -11
- package/src/formats/dot/tokenizer.ts +25 -6
- package/src/formats/gexf/exporter.ts +57 -18
- package/src/formats/gexf/importer.ts +636 -105
- package/src/formats/gexf/index.ts +90 -21
- package/src/formats/gexf/schema.ts +67 -15
- package/src/formats/gml/exporter.ts +90 -36
- package/src/formats/gml/importer.ts +388 -67
- package/src/formats/gml/index.ts +85 -24
- package/src/formats/gml/syntax.ts +111 -26
- package/src/formats/graphml/constants.ts +178 -44
- package/src/formats/graphml/exporter.ts +52 -18
- package/src/formats/graphml/importer.ts +640 -60
- package/src/formats/graphml/index.ts +2 -1
- package/src/formats/graphml/tree.ts +6 -2
- package/src/formats/graphml/yfiles.ts +37 -15
- package/src/formats/json/dialect.ts +128 -29
- package/src/formats/json/exporter.ts +205 -68
- package/src/formats/json/importer.ts +1163 -253
- package/src/formats/json/index.ts +3 -1
- package/src/formats/json/obographs-export.ts +1197 -0
- package/src/formats/json/obographs.ts +353 -92
- package/src/formats/neo4j/exporter.ts +320 -101
- package/src/formats/neo4j/header.ts +44 -6
- package/src/formats/neo4j/importer.ts +512 -73
- package/src/formats/neo4j/index.ts +75 -23
- package/src/formats/obo/exporter.ts +2210 -0
- package/src/formats/obo/importer.ts +622 -109
- package/src/formats/obo/index.ts +6 -3
- package/src/formats/obo/syntax.ts +232 -37
- package/src/formats/pajek/exporter.ts +89 -41
- package/src/formats/pajek/importer.ts +407 -93
- package/src/formats/pajek/index.ts +2 -1
- package/src/formats/pajek/syntax.ts +213 -52
- package/src/formats/xgmml/columns.ts +10 -0
- package/src/formats/xgmml/constants.ts +183 -56
- package/src/formats/xgmml/document.ts +212 -34
- package/src/formats/xgmml/emit.ts +175 -34
- package/src/formats/xgmml/exporter.ts +35 -27
- package/src/formats/xgmml/importer.ts +64 -86
- package/src/formats/xgmml/index.ts +1 -0
- package/src/formats/xgmml/values.ts +11 -3
- package/src/index.ts +81 -11
- package/src/registry.ts +1121 -135
- package/src/sniff.ts +163 -32
- package/src/types.ts +385 -114
- package/dist/chunks/escape-B-tkk_Cl.js.map +0 -1
- package/dist/chunks/export-Bh60Dv-n.js +0 -582
- package/dist/chunks/export-Bh60Dv-n.js.map +0 -1
- package/dist/chunks/exporter-BGrsWamJ.js.map +0 -1
- package/dist/chunks/exporter-DIeGJXAZ.js.map +0 -1
- package/dist/chunks/importer-BWY2FFc5.js.map +0 -1
- package/dist/chunks/importer-DD-xv9_Y.js +0 -1471
- package/dist/chunks/importer-DD-xv9_Y.js.map +0 -1
- package/dist/chunks/importer-DET1tg6s.js.map +0 -1
- package/dist/chunks/importer-DEcKhsmQ.js +0 -1614
- package/dist/chunks/importer-DEcKhsmQ.js.map +0 -1
- package/dist/chunks/importer-DIrbbnAf.js.map +0 -1
- package/dist/chunks/importer-D_e7e7LX.js.map +0 -1
- package/dist/chunks/importer-eUREhBGj.js.map +0 -1
- package/dist/chunks/importer-vi3bSdtw.js.map +0 -1
- package/dist/chunks/importer-zGLo8Dg_.js.map +0 -1
- package/dist/chunks/json-elements-DDS8N2Dd.js +0 -779
- package/dist/chunks/json-elements-DDS8N2Dd.js.map +0 -1
- package/dist/chunks/ontology-BnrJ4I98.js +0 -113
- package/dist/chunks/ontology-BnrJ4I98.js.map +0 -1
- package/dist/chunks/records-dbRkxwaq.js.map +0 -1
- package/dist/chunks/report-B1z4WT9e.js +0 -2372
- package/dist/chunks/report-B1z4WT9e.js.map +0 -1
- package/dist/chunks/text-Dr0Ifpag.js.map +0 -1
- package/dist/chunks/weights-Dzba96G3.js +0 -176
- package/dist/chunks/weights-Dzba96G3.js.map +0 -1
- package/dist/chunks/writer-C7flM-Ih.js.map +0 -1
package/src/common/temporal.ts
CHANGED
|
@@ -12,17 +12,23 @@
|
|
|
12
12
|
|
|
13
13
|
import { type ColumnDecl, type ColumnRole, GraphFormatError } from "@graphty/graph-format";
|
|
14
14
|
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* The temporal kinds a declared type can map to; each fixes the parse grammar and the canonical text.
|
|
17
|
+
* @category Plugin helpers
|
|
18
|
+
*/
|
|
16
19
|
export type TemporalKind = "date" | "dateTime" | "localDateTime" | "time" | "localTime";
|
|
17
20
|
|
|
18
21
|
/**
|
|
19
22
|
* The GEXF `timeformat` values (design section 5.9).
|
|
20
|
-
* Consumed by the per-format importers and exporters under src/formats.
|
|
21
23
|
* @public
|
|
24
|
+
* @category Plugin helpers
|
|
22
25
|
*/
|
|
23
26
|
export type TimeFormat = "integer" | "double" | "date" | "dateTime";
|
|
24
27
|
|
|
25
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* A parsed temporal value: the number stored in the column and the source text when it must be kept.
|
|
30
|
+
* @category Plugin helpers
|
|
31
|
+
*/
|
|
26
32
|
export interface TemporalValue {
|
|
27
33
|
/** Epoch milliseconds (date, dateTime, localDateTime), milliseconds since midnight (time, localTime), or the raw number. */
|
|
28
34
|
readonly value: number;
|
|
@@ -30,10 +36,16 @@ export interface TemporalValue {
|
|
|
30
36
|
readonly text: string | null;
|
|
31
37
|
}
|
|
32
38
|
|
|
33
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* The role of a companion text column.
|
|
41
|
+
* @category Plugin helpers
|
|
42
|
+
*/
|
|
34
43
|
export const TIME_TEXT_ROLE: ColumnRole = "timeText";
|
|
35
44
|
|
|
36
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* The suffix of a companion text column's name.
|
|
47
|
+
* @category Plugin helpers
|
|
48
|
+
*/
|
|
37
49
|
export const TIME_TEXT_SUFFIX = ".text";
|
|
38
50
|
|
|
39
51
|
const DATE_TIME =
|
|
@@ -49,6 +61,7 @@ const MS_PER_DAY = 86_400_000;
|
|
|
49
61
|
* @param text - the source text (already trimmed)
|
|
50
62
|
* @param kind - the temporal kind
|
|
51
63
|
* @returns the value and, when the canonical form differs, the source text; E_COLUMN_TYPE when the text is not of the kind
|
|
64
|
+
* @category Plugin helpers
|
|
52
65
|
*/
|
|
53
66
|
export function parseTemporal(text: string, kind: TemporalKind): TemporalValue {
|
|
54
67
|
let value: number;
|
|
@@ -79,6 +92,7 @@ export function parseTemporal(text: string, kind: TemporalKind): TemporalValue {
|
|
|
79
92
|
* @param text - the source text
|
|
80
93
|
* @param timeFormat - the graph's timeformat, or null when the file declares none
|
|
81
94
|
* @returns the value and the source text when it must be kept
|
|
95
|
+
* @category Plugin helpers
|
|
82
96
|
*/
|
|
83
97
|
export function parseTimeText(text: string, timeFormat: TimeFormat | null): TemporalValue {
|
|
84
98
|
const trimmed = text.trim();
|
|
@@ -105,6 +119,7 @@ export function parseTimeText(text: string, timeFormat: TimeFormat | null): Temp
|
|
|
105
119
|
* @param kind - the temporal kind
|
|
106
120
|
* @returns the canonical text: `YYYY-MM-DD`, `YYYY-MM-DDTHH:MM:SS[.mmm]Z`, `YYYY-MM-DDTHH:MM:SS[.mmm]`,
|
|
107
121
|
* `HH:MM:SS[.mmm]Z` or `HH:MM:SS[.mmm]`
|
|
122
|
+
* @category Plugin helpers
|
|
108
123
|
*/
|
|
109
124
|
export function formatTemporal(value: number, kind: TemporalKind): string {
|
|
110
125
|
switch (kind) {
|
|
@@ -141,6 +156,7 @@ export function formatTemporal(value: number, kind: TemporalKind): string {
|
|
|
141
156
|
* @param value - the value as stored
|
|
142
157
|
* @param timeFormat - the graph's timeformat, or null for a file that declares none (double)
|
|
143
158
|
* @returns the text
|
|
159
|
+
* @category Plugin helpers
|
|
144
160
|
*/
|
|
145
161
|
export function formatTimeValue(value: number, timeFormat: TimeFormat | null): string {
|
|
146
162
|
switch (timeFormat) {
|
|
@@ -163,6 +179,7 @@ export function formatTimeValue(value: number, timeFormat: TimeFormat | null): s
|
|
|
163
179
|
* The declaration of the companion text column of a temporal column (design section 5.1).
|
|
164
180
|
* @param column - the temporal column's name
|
|
165
181
|
* @returns a string column named `<column>.text` with role timeText and `extra.for` naming the column
|
|
182
|
+
* @category Plugin helpers
|
|
166
183
|
*/
|
|
167
184
|
export function timeTextCompanion(column: string): ColumnDecl {
|
|
168
185
|
return {
|
package/src/common/text.ts
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import { type ColumnHandle, GraphFormatError, type GraphSink, INVALID_INDEX } from "@graphty/graph-format";
|
|
17
17
|
|
|
18
|
+
import { PRECISION_CODE } from "./codes.js";
|
|
18
19
|
import { type ImportReportBuilder } from "./report.js";
|
|
19
20
|
|
|
20
21
|
const I32_TEXT = /^-?(0|[1-9][0-9]*)$/;
|
|
@@ -23,16 +24,30 @@ const I32_MIN = -2147483648;
|
|
|
23
24
|
const I32_MAX = 2147483647;
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
|
-
* The dtype a text cell parses as under the
|
|
27
|
-
* Consumed by the per-format importers and exporters under src/formats.
|
|
27
|
+
* The dtype a text cell parses as under the fixed text grammar.
|
|
28
28
|
* @public
|
|
29
|
+
* @category Plugin helpers
|
|
29
30
|
*/
|
|
30
31
|
export type TextDtype = "bool" | "i32" | "f64" | "string";
|
|
31
32
|
|
|
33
|
+
/**
|
|
34
|
+
* A digit string without its trailing zeros (`"1200"` becomes `"12"`).
|
|
35
|
+
* @param digits - the digits
|
|
36
|
+
* @returns the digits up to the last one that is not 0
|
|
37
|
+
*/
|
|
38
|
+
export function trimTrailingZeros(digits: string): string {
|
|
39
|
+
let end = digits.length;
|
|
40
|
+
while (end > 0 && digits[end - 1] === "0") {
|
|
41
|
+
end--;
|
|
42
|
+
}
|
|
43
|
+
return digits.slice(0, end);
|
|
44
|
+
}
|
|
45
|
+
|
|
32
46
|
/**
|
|
33
47
|
* Classify one text cell by the fixed grammar.
|
|
34
48
|
* @param text - the cell text, exactly as read (no trimming)
|
|
35
49
|
* @returns bool, i32, f64 or string
|
|
50
|
+
* @category Plugin helpers
|
|
36
51
|
*/
|
|
37
52
|
export function inferTextDtype(text: string): TextDtype {
|
|
38
53
|
if (text === "true" || text === "false") {
|
|
@@ -56,6 +71,7 @@ export function inferTextDtype(text: string): TextDtype {
|
|
|
56
71
|
* i32 / f64, the text itself for string. The sink infers the column dtype from the value.
|
|
57
72
|
* @param text - the cell text, exactly as read
|
|
58
73
|
* @returns the value
|
|
74
|
+
* @category Plugin helpers
|
|
59
75
|
*/
|
|
60
76
|
export function parseTextCell(text: string): boolean | number | string {
|
|
61
77
|
switch (inferTextDtype(text)) {
|
|
@@ -75,6 +91,7 @@ export function parseTextCell(text: string): boolean | number | string {
|
|
|
75
91
|
* Whether a text cell is a number under the f64 grammar (an i32 or f64 literal).
|
|
76
92
|
* @param text - the cell text
|
|
77
93
|
* @returns true when parseTextCell(text) returns a number
|
|
94
|
+
* @category Plugin helpers
|
|
78
95
|
*/
|
|
79
96
|
export function isNumericText(text: string): boolean {
|
|
80
97
|
const dtype = inferTextDtype(text);
|
|
@@ -115,20 +132,23 @@ function textDtypeRank(dtype: TextDtype): number {
|
|
|
115
132
|
}
|
|
116
133
|
|
|
117
134
|
/**
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
135
|
+
* Writes the cells of one attribute of a text format whose values carry no type (CSV, DOT, Pajek):
|
|
136
|
+
* you hand it each cell's text and it stores a number, a boolean or text, choosing one type for the
|
|
137
|
+
* whole attribute. A column of `2.0`, `3.5` stays a number column with decimals even though `2.0`
|
|
138
|
+
* alone looks like an integer, and once one cell turns out to be text, earlier cells such as `1e5`
|
|
139
|
+
* are kept as written instead of as `100000`. Create one writer per attribute name and per kind
|
|
140
|
+
* ("node" or "edge"), and call `write(index, text)` with the node or edge index the sink gave you:
|
|
121
141
|
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* back, so the lexical form is never rewritten by the widening.
|
|
142
|
+
* ```ts
|
|
143
|
+
* const color = new TextCellWriter("color", "node", sink, report);
|
|
144
|
+
* color.write(sink.addNode("a"), "red");
|
|
145
|
+
* ```
|
|
127
146
|
*
|
|
128
|
-
* A sink
|
|
129
|
-
* one W_WIDENING_UNSUPPORTED warning
|
|
130
|
-
*
|
|
147
|
+
* A sink that cannot change a column's type after the fact (one of your own without
|
|
148
|
+
* `widenNodeColumn` / `widenEdgeColumn`) keeps the type the first values implied, with one W_WIDENING_UNSUPPORTED warning
|
|
149
|
+
* per attribute.
|
|
131
150
|
* @public
|
|
151
|
+
* @category Writing a format
|
|
132
152
|
*/
|
|
133
153
|
export class TextCellWriter {
|
|
134
154
|
/** The column name in the sink. */
|
|
@@ -153,11 +173,11 @@ export class TextCellWriter {
|
|
|
153
173
|
private readonly keptTexts: string[] = [];
|
|
154
174
|
|
|
155
175
|
/**
|
|
156
|
-
* Create a writer
|
|
157
|
-
* @param name - the
|
|
158
|
-
* @param domain - node
|
|
159
|
-
* @param sink - the sink
|
|
160
|
-
* @param report - the report
|
|
176
|
+
* Create a writer. The attribute is added to the sink on the first write.
|
|
177
|
+
* @param name - the attribute name
|
|
178
|
+
* @param domain - "node" for a node attribute, "edge" for an edge attribute
|
|
179
|
+
* @param sink - the sink the importer fills
|
|
180
|
+
* @param report - the import report, for warnings about the values
|
|
161
181
|
*/
|
|
162
182
|
constructor(name: string, domain: "node" | "edge", sink: GraphSink, report: ImportReportBuilder) {
|
|
163
183
|
this.name = name;
|
|
@@ -167,7 +187,7 @@ export class TextCellWriter {
|
|
|
167
187
|
}
|
|
168
188
|
|
|
169
189
|
/**
|
|
170
|
-
* The
|
|
190
|
+
* The sink's handle of the attribute's column, for reading it back.
|
|
171
191
|
* @returns the handle, or INVALID_INDEX before the first write
|
|
172
192
|
*/
|
|
173
193
|
get column(): ColumnHandle {
|
|
@@ -175,13 +195,28 @@ export class TextCellWriter {
|
|
|
175
195
|
}
|
|
176
196
|
|
|
177
197
|
/**
|
|
178
|
-
* Write one cell
|
|
179
|
-
* @param row - the node or edge index
|
|
180
|
-
* @param text - the cell text, exactly as read
|
|
198
|
+
* Write one cell.
|
|
199
|
+
* @param row - the node or edge index, as the sink's addNode() or addEdge() returned it
|
|
200
|
+
* @param text - the cell text, exactly as read from the file
|
|
181
201
|
*/
|
|
182
202
|
write(row: number, text: string): void {
|
|
183
203
|
const kind = inferTextDtype(text);
|
|
184
204
|
const value = parseTextCell(text);
|
|
205
|
+
if (
|
|
206
|
+
typeof value === "number" &&
|
|
207
|
+
!Number.isSafeInteger(value) &&
|
|
208
|
+
I32_TEXT.test(text) &&
|
|
209
|
+
BigInt(text) !== BigInt(value)
|
|
210
|
+
) {
|
|
211
|
+
// an integer beyond 2^53 is stored as the nearest double; say so once per column
|
|
212
|
+
this.report.warnOnce(
|
|
213
|
+
"precision",
|
|
214
|
+
PRECISION_CODE,
|
|
215
|
+
`${this.domain} column "${this.name}": integers beyond 2^53 are stored as the nearest double (first: ${text})`,
|
|
216
|
+
{ element: this.name },
|
|
217
|
+
`${PRECISION_CODE}:${this.domain}:${this.name}`,
|
|
218
|
+
);
|
|
219
|
+
}
|
|
185
220
|
const wasString = this.textDtype === "string";
|
|
186
221
|
const textDtype =
|
|
187
222
|
this.textDtype === null || textDtypeRank(kind) > textDtypeRank(this.textDtype) ? kind : this.textDtype;
|
|
@@ -273,7 +308,11 @@ export class TextCellWriter {
|
|
|
273
308
|
}
|
|
274
309
|
}
|
|
275
310
|
|
|
276
|
-
/**
|
|
311
|
+
/**
|
|
312
|
+
* Your graph builder cannot change an attribute's type after its first value, so a text column keeps the type of its
|
|
313
|
+
* first values.
|
|
314
|
+
* @category Issue and loss codes
|
|
315
|
+
*/
|
|
277
316
|
export const WIDENING_UNSUPPORTED_CODE = "W_WIDENING_UNSUPPORTED";
|
|
278
317
|
|
|
279
318
|
/**
|
package/src/common/weights.ts
CHANGED
|
@@ -12,10 +12,15 @@
|
|
|
12
12
|
|
|
13
13
|
import { type Column, GraphFormatError, type GraphSnapshot } from "@graphty/graph-format";
|
|
14
14
|
|
|
15
|
+
import { PRECISION_CODE } from "./codes.js";
|
|
15
16
|
import { parseDecimalText } from "./declared-types.js";
|
|
16
17
|
import { formatF32, formatF64, formatInteger } from "./format.js";
|
|
18
|
+
import { type ImportReportBuilder } from "./report.js";
|
|
17
19
|
|
|
18
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* The weight of an edge added without one (design section 3.7).
|
|
22
|
+
* @category Plugin helpers
|
|
23
|
+
*/
|
|
19
24
|
export const DEFAULT_WEIGHT = 1;
|
|
20
25
|
|
|
21
26
|
/**
|
|
@@ -23,6 +28,7 @@ export const DEFAULT_WEIGHT = 1;
|
|
|
23
28
|
* @param name - the field name (attribute title, CSV header, JSON key)
|
|
24
29
|
* @param weightFrom - the resolved option; null means unweighted
|
|
25
30
|
* @returns true when the field is THE weight
|
|
31
|
+
* @category Plugin helpers
|
|
26
32
|
*/
|
|
27
33
|
export function isWeightField(name: string, weightFrom: string | null): boolean {
|
|
28
34
|
return weightFrom !== null && name === weightFrom;
|
|
@@ -32,9 +38,12 @@ export function isWeightField(name: string, weightFrom: string | null): boolean
|
|
|
32
38
|
* The weight argument of addEdge from a text cell: undefined for a blank cell (the weight is
|
|
33
39
|
* omitted), the number otherwise.
|
|
34
40
|
* @param text - the cell text
|
|
41
|
+
* @param report - the import report; when given, an integer beyond 2^53 that the nearest double
|
|
42
|
+
* changes is reported once as W_PRECISION
|
|
35
43
|
* @returns the weight, or undefined when blank; E_INVALID_WEIGHT for NaN or non-numeric text
|
|
44
|
+
* @category Writing a format
|
|
36
45
|
*/
|
|
37
|
-
export function parseWeightText(text: string): number | undefined {
|
|
46
|
+
export function parseWeightText(text: string, report?: ImportReportBuilder): number | undefined {
|
|
38
47
|
const trimmed = text.trim();
|
|
39
48
|
if (trimmed.length === 0) {
|
|
40
49
|
return undefined;
|
|
@@ -48,14 +57,42 @@ export function parseWeightText(text: string): number | undefined {
|
|
|
48
57
|
if (Number.isNaN(value)) {
|
|
49
58
|
throw invalidWeight(text, null);
|
|
50
59
|
}
|
|
60
|
+
if (report !== undefined) {
|
|
61
|
+
reportWeightPrecision(trimmed, value, report);
|
|
62
|
+
}
|
|
51
63
|
return value;
|
|
52
64
|
}
|
|
53
65
|
|
|
66
|
+
/**
|
|
67
|
+
* Report once (W_PRECISION) an integer weight beyond 2^53 that the nearest double changes, which
|
|
68
|
+
* the weights and the exact `graphty.weight` column would otherwise hold silently.
|
|
69
|
+
* @param text - the weight as written in the file
|
|
70
|
+
* @param value - the number it was read as
|
|
71
|
+
* @param report - the import report
|
|
72
|
+
*/
|
|
73
|
+
export function reportWeightPrecision(text: string, value: number, report: ImportReportBuilder): void {
|
|
74
|
+
if (
|
|
75
|
+
!Number.isSafeInteger(value) &&
|
|
76
|
+
Number.isFinite(value) &&
|
|
77
|
+
/^[+-]?\d+$/.test(text) &&
|
|
78
|
+
BigInt(text) !== BigInt(value)
|
|
79
|
+
) {
|
|
80
|
+
report.warnOnce(
|
|
81
|
+
"precision",
|
|
82
|
+
PRECISION_CODE,
|
|
83
|
+
`edge weights: integers beyond 2^53 are stored as the nearest double (first: ${text})`,
|
|
84
|
+
undefined,
|
|
85
|
+
`${PRECISION_CODE}:edge weight`,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
54
90
|
/**
|
|
55
91
|
* The weight argument of addEdge from a typed value (JSON, a record field): undefined for null /
|
|
56
92
|
* undefined, the number for a finite or infinite number, the parsed number for numeric text.
|
|
57
93
|
* @param value - the field value
|
|
58
94
|
* @returns the weight, or undefined when absent; E_INVALID_WEIGHT for NaN, a boolean, an object or non-numeric text
|
|
95
|
+
* @category Plugin helpers
|
|
59
96
|
*/
|
|
60
97
|
export function weightFromValue(value: unknown): number | undefined {
|
|
61
98
|
if (value === undefined || value === null) {
|
|
@@ -100,12 +137,12 @@ function invalidWeight(value: unknown, cause: unknown): GraphFormatError {
|
|
|
100
137
|
// ============================================================ the exporter side
|
|
101
138
|
|
|
102
139
|
/**
|
|
103
|
-
* The explicit weights of a snapshot for exporters
|
|
140
|
+
* The explicit weights of a snapshot for exporters: the weight
|
|
104
141
|
* role column when present (its validity says which edges had an explicit weight, its dtype how
|
|
105
142
|
* the value is written), else `edgeList().weights` as f32 for every edge of a weighted snapshot;
|
|
106
143
|
* nothing for an unweighted one. One implementation for every exporter.
|
|
107
|
-
* Consumed by the per-format exporters under src/formats.
|
|
108
144
|
* @public
|
|
145
|
+
* @category Plugin helpers
|
|
109
146
|
*/
|
|
110
147
|
export interface ExplicitWeights {
|
|
111
148
|
/** Whether any edge can have an explicit weight (the snapshot is weighted). */
|
|
@@ -161,6 +198,7 @@ function weightFormatter(dtype: string): (value: number) => string {
|
|
|
161
198
|
* Build the explicit-weight view of a snapshot.
|
|
162
199
|
* @param snapshot - the snapshot
|
|
163
200
|
* @returns the view
|
|
201
|
+
* @category Writing a format
|
|
164
202
|
*/
|
|
165
203
|
export function explicitWeights(snapshot: GraphSnapshot): ExplicitWeights {
|
|
166
204
|
const shadowColumn = snapshot.edges.byRole("weight");
|
|
@@ -209,3 +247,35 @@ export function explicitWeights(snapshot: GraphSnapshot): ExplicitWeights {
|
|
|
209
247
|
},
|
|
210
248
|
};
|
|
211
249
|
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* The weight of every edge, in edge order (`weights[e]` is edge `e`'s weight), exactly as the file
|
|
253
|
+
* wrote it, or null for a graph without weights. `snapshot.edgeList().weights` holds the same
|
|
254
|
+
* weights as 32-bit floats, in which 0.1 reads back as 0.10000000149011612; this reads the exact
|
|
255
|
+
* values the import also kept. An edge without a weight of its own has the weight 1.
|
|
256
|
+
* @example
|
|
257
|
+
* ```ts
|
|
258
|
+
* const { snapshot } = await importGraph("source,target,weight\na,b,0.1\n", { format: "csv" });
|
|
259
|
+
* edgeWeights(snapshot); // Float64Array [ 0.1 ]
|
|
260
|
+
* ```
|
|
261
|
+
* @param snapshot - the graph
|
|
262
|
+
* @returns one weight per edge, or null when the graph has no weights
|
|
263
|
+
* @category Loading
|
|
264
|
+
*/
|
|
265
|
+
export function edgeWeights(snapshot: GraphSnapshot): Float64Array | null {
|
|
266
|
+
const { weights } = snapshot.edgeList();
|
|
267
|
+
if (weights === null) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
const out = Float64Array.from(weights);
|
|
271
|
+
const exact = snapshot.edges.byRole("weight");
|
|
272
|
+
if (exact !== null) {
|
|
273
|
+
for (let e = 0; e < out.length; e++) {
|
|
274
|
+
const v = exact.value(e);
|
|
275
|
+
if (typeof v === "number") {
|
|
276
|
+
out[e] = v;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return out;
|
|
281
|
+
}
|
package/src/common/writer.ts
CHANGED
|
@@ -6,14 +6,19 @@
|
|
|
6
6
|
* `ReadableStream<Uint8Array>` for a caller that wants a stream.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { GraphFormatError } from "@graphty/graph-format";
|
|
10
|
+
|
|
9
11
|
/**
|
|
10
12
|
* Text parts an exporter produces.
|
|
11
|
-
* Consumed by the per-format importers and exporters under src/formats.
|
|
12
13
|
* @public
|
|
14
|
+
* @category Plugin helpers
|
|
13
15
|
*/
|
|
14
16
|
export type TextParts = Iterable<string> | AsyncIterable<string>;
|
|
15
17
|
|
|
16
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* The target size of one encoded chunk; parts are coalesced up to it and never split.
|
|
20
|
+
* @category Plugin helpers
|
|
21
|
+
*/
|
|
17
22
|
export const DEFAULT_CHUNK_BYTES = 64 * 1024;
|
|
18
23
|
|
|
19
24
|
/**
|
|
@@ -24,6 +29,7 @@ export const DEFAULT_CHUNK_BYTES = 64 * 1024;
|
|
|
24
29
|
* @param chunkBytes - the target chunk size in bytes
|
|
25
30
|
* @yields UTF-8 chunks
|
|
26
31
|
* @returns nothing
|
|
32
|
+
* @category Writing a format
|
|
27
33
|
*/
|
|
28
34
|
export async function* encodeChunks(
|
|
29
35
|
parts: TextParts,
|
|
@@ -54,6 +60,7 @@ export async function* encodeChunks(
|
|
|
54
60
|
* Join text parts into one string.
|
|
55
61
|
* @param parts - the text parts
|
|
56
62
|
* @returns the whole document
|
|
63
|
+
* @category Writing a format
|
|
57
64
|
*/
|
|
58
65
|
export async function joinText(parts: TextParts): Promise<string> {
|
|
59
66
|
const collected: string[] = [];
|
|
@@ -67,6 +74,7 @@ export async function joinText(parts: TextParts): Promise<string> {
|
|
|
67
74
|
* Decode UTF-8 chunks back into one string (for tests and for callers holding an export() result).
|
|
68
75
|
* @param chunks - the chunks
|
|
69
76
|
* @returns the decoded text
|
|
77
|
+
* @category Plugin helpers
|
|
70
78
|
*/
|
|
71
79
|
export async function decodeChunks(chunks: AsyncIterable<Uint8Array>): Promise<string> {
|
|
72
80
|
const decoder = new TextDecoder("utf-8", { fatal: true });
|
|
@@ -82,6 +90,7 @@ export async function decodeChunks(chunks: AsyncIterable<Uint8Array>): Promise<s
|
|
|
82
90
|
* Collect UTF-8 chunks into one Uint8Array.
|
|
83
91
|
* @param chunks - the chunks
|
|
84
92
|
* @returns the concatenated bytes
|
|
93
|
+
* @category Plugin helpers
|
|
85
94
|
*/
|
|
86
95
|
export async function collectBytes(chunks: AsyncIterable<Uint8Array>): Promise<Uint8Array> {
|
|
87
96
|
const parts: Uint8Array[] = [];
|
|
@@ -101,9 +110,10 @@ export async function collectBytes(chunks: AsyncIterable<Uint8Array>): Promise<U
|
|
|
101
110
|
|
|
102
111
|
/**
|
|
103
112
|
* Wrap an async iterable of chunks as a ReadableStream, pulling one chunk per read and cancelling
|
|
104
|
-
* the iterable when the stream is
|
|
113
|
+
* the iterable when the stream is canceled.
|
|
105
114
|
* @param chunks - the chunks
|
|
106
115
|
* @returns a byte stream
|
|
116
|
+
* @category Saving
|
|
107
117
|
*/
|
|
108
118
|
export function toReadableStream(chunks: AsyncIterable<Uint8Array>): ReadableStream<Uint8Array> {
|
|
109
119
|
const iterator = chunks[Symbol.asyncIterator]();
|
|
@@ -121,3 +131,27 @@ export function toReadableStream(chunks: AsyncIterable<Uint8Array>): ReadableStr
|
|
|
121
131
|
},
|
|
122
132
|
});
|
|
123
133
|
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The indentation of one nesting level from an `indent` option: a number of spaces (0 to 16), or
|
|
137
|
+
* the text itself (spaces or tabs). The JSON and DOT exporters take the same option this way.
|
|
138
|
+
* @param value - the option value
|
|
139
|
+
* @param fallback - the indentation when the option is not given
|
|
140
|
+
* @returns the text of one level; "" for none
|
|
141
|
+
*/
|
|
142
|
+
export function indentUnit(value: unknown, fallback: string): string {
|
|
143
|
+
if (value === undefined) {
|
|
144
|
+
return fallback;
|
|
145
|
+
}
|
|
146
|
+
if (typeof value === "number" && Number.isInteger(value) && value >= 0 && value <= 16) {
|
|
147
|
+
return " ".repeat(value);
|
|
148
|
+
}
|
|
149
|
+
if (typeof value === "string" && /^[ \t]{0,16}$/.test(value)) {
|
|
150
|
+
return value;
|
|
151
|
+
}
|
|
152
|
+
throw new GraphFormatError(
|
|
153
|
+
"E_UNSUPPORTED",
|
|
154
|
+
`option indent: ${typeof value === "string" || typeof value === "number" ? JSON.stringify(value) : typeof value} is not a number of spaces (0 to 16) or a string of spaces or tabs`,
|
|
155
|
+
{ option: "indent", found: typeof value === "string" || typeof value === "number" ? value : typeof value },
|
|
156
|
+
);
|
|
157
|
+
}
|