@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.
- 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/types.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The io contract types of @graphty/graph-io
|
|
2
|
+
* The io contract types of @graphty/graph-io: what every importer
|
|
3
3
|
* and exporter implements and what every caller of one programs against. They are declared here
|
|
4
4
|
* rather than in the core because ImportInput and CommonImportOptions reference ReadableStream and
|
|
5
5
|
* AbortSignal, which need the DOM lib (or @types/node >= 18); the core's public types reference only
|
|
6
6
|
* ES2020 globals (decision D-IO-TYPES). Every declaration is transcribed verbatim from the design;
|
|
7
|
-
* the
|
|
7
|
+
* the behavior behind each option is specified in sections 8.4 (import), 8.5 (export) and 8.6
|
|
8
8
|
* (report and error aggregation).
|
|
9
9
|
*/
|
|
10
10
|
|
|
@@ -18,76 +18,188 @@ import {
|
|
|
18
18
|
} from "@graphty/graph-format";
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
|
-
* What an importer reads
|
|
21
|
+
* What an importer reads: whole text, whole bytes, a byte stream (a browser
|
|
22
22
|
* `File.stream()`, a fetch body) or an async iterable of text or byte chunks. Bytes are decoded
|
|
23
23
|
* strictly in the encoding the `encoding` option, a byte order mark or the file's own declaration
|
|
24
24
|
* names, else as UTF-8 (undeclared bytes that are not UTF-8 are read as windows-1252 with a
|
|
25
25
|
* warning), so an invalid sequence is a parse-error and never a silent U+FFFD that could alias two ids.
|
|
26
|
+
* @category Loading
|
|
26
27
|
*/
|
|
27
28
|
export type ImportInput = string | Uint8Array | ReadableStream<Uint8Array> | AsyncIterable<string | Uint8Array>;
|
|
28
29
|
|
|
29
30
|
/**
|
|
30
|
-
* The options every importer accepts next to its format-specific ones
|
|
31
|
+
* The options every importer accepts next to its format-specific ones. The
|
|
31
32
|
* builder-policy fields (`addMissingNodes`, `duplicateEdges`, `selfLoops`, `weightDtype`) seed the
|
|
32
33
|
* registry's builder; on a caller's sink they are read back from `sink.options` and every option the
|
|
33
|
-
* sink cannot
|
|
34
|
+
* sink cannot honor is reported.
|
|
35
|
+
* @category Loading
|
|
34
36
|
*/
|
|
35
37
|
export interface CommonImportOptions {
|
|
36
38
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
+
* How id text becomes a node id. "canonical": integer text such as "42" becomes the number 42
|
|
40
|
+
* and everything else ("042", "4.2", "a") stays text. "string": every id stays text. "number":
|
|
41
|
+
* every id is read as a number, so "042" and "42" become one node (with a warning) and text that
|
|
42
|
+
* is not a number is an error. "keep": ids keep the type the file gives them. The default is
|
|
43
|
+
* "keep" for JSON, OBO, XGMML, CX, CX2 and Cytoscape sessions, and "canonical" for the other
|
|
44
|
+
* formats.
|
|
45
|
+
* @defaultValue per format
|
|
39
46
|
*/
|
|
40
47
|
ids?: IdCoercion | undefined;
|
|
41
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* Which value becomes the node id: the file's own id ("id"), the node's label ("label"), or its
|
|
50
|
+
* position among the nodes, counting from 0 ("index"). Use it when a file's ids are meaningless
|
|
51
|
+
* numbers and the labels are the real names. In d3 JSON, "index" also reads edges whose ends are
|
|
52
|
+
* node positions. In GML and Pajek it only renames: every node still needs its id key or vertex
|
|
53
|
+
* number, because edges refer to nodes by it, and a GML node without an `id` key is skipped
|
|
54
|
+
* with E_MISSING_ID. CSV reads this option only when there is a node table, and it does not
|
|
55
|
+
* just rename: with "label" the node table's label column (`label`, or the `labelColumn`
|
|
56
|
+
* option) gives the ids, so the edge table must name its nodes by those labels.
|
|
57
|
+
* @defaultValue "id"
|
|
58
|
+
*/
|
|
42
59
|
nodeIdFrom?: "id" | "label" | "index" | undefined;
|
|
43
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Whether an edge may name a node the file never declares; that node is then created. When
|
|
62
|
+
* false, such an edge is skipped as an error. The default is false for GEXF, XGMML, CX, CX2 and
|
|
63
|
+
* Cytoscape sessions, whose files must declare every node, and true for the other formats.
|
|
64
|
+
* @defaultValue per format
|
|
65
|
+
*/
|
|
44
66
|
addMissingNodes?: boolean | undefined;
|
|
45
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* What to do with a second edge between the same two nodes: "keep" keeps both, "first" / "last"
|
|
69
|
+
* keep one, "sum" / "min" / "max" keep one with the weights combined, and "error" stops the
|
|
70
|
+
* import. Merged edges are reported once as W_EDGES_MERGED.
|
|
71
|
+
* @defaultValue "keep"
|
|
72
|
+
*/
|
|
46
73
|
duplicateEdges?: DuplicatePolicy | undefined;
|
|
47
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* What to do with an edge from a node to itself: "keep", "drop" (reported once as
|
|
76
|
+
* W_SELF_LOOPS_DROPPED with the number removed), or "error" to stop the import.
|
|
77
|
+
* @defaultValue "keep"
|
|
78
|
+
*/
|
|
48
79
|
selfLoops?: "keep" | "drop" | "error" | undefined;
|
|
49
|
-
/**
|
|
80
|
+
/**
|
|
81
|
+
* How edge direction is read. "expand" (the default) keeps the file's direction, and for a file
|
|
82
|
+
* that has both directed and undirected edges makes a directed graph in which each undirected
|
|
83
|
+
* edge is two edges, marked so an export can write them back as one. "directed" / "undirected"
|
|
84
|
+
* read every edge of any file that way, including a file whose edges all have the other
|
|
85
|
+
* direction, with a W_DIRECTION_FORCED warning. "error" stops the import at the first edge whose
|
|
86
|
+
* direction differs from the file's.
|
|
87
|
+
* @defaultValue "expand"
|
|
88
|
+
*/
|
|
50
89
|
onMixedDirection?: "expand" | "directed" | "undirected" | "error" | undefined;
|
|
51
|
-
/**
|
|
90
|
+
/**
|
|
91
|
+
* Whether the graph is directed when the file does not say. The default is undirected for
|
|
92
|
+
* GraphML, GEXF, GML, JSON and XGMML, and directed for CSV, Pajek and Cytoscape sessions. DOT,
|
|
93
|
+
* Neo4j, CX, CX2 and OBO files always settle the direction themselves (DOT by `graph` or
|
|
94
|
+
* `digraph`; the others are always directed), so those formats do not read this option and
|
|
95
|
+
* report it as W_OPTION_IGNORED.
|
|
96
|
+
* @defaultValue per format
|
|
97
|
+
*/
|
|
52
98
|
defaultDirected?: boolean | undefined;
|
|
53
|
-
/**
|
|
99
|
+
/**
|
|
100
|
+
* The edge attribute read as the edge weight. The default is "weight", except "value" for GML
|
|
101
|
+
* and Pajek and none for OBO. Pass null to read every attribute as a plain attribute and leave
|
|
102
|
+
* the graph unweighted. A name no edge has leaves the graph unweighted, with a W_WEIGHT_NOT_FOUND
|
|
103
|
+
* warning: one options object with `weightFrom: "weight"` shared across formats reads GML and
|
|
104
|
+
* Pajek files, which keep their weights in `value`, without weights. An edge whose weight cell is
|
|
105
|
+
* empty or missing gets the default weight 1, and an export writes no weight for it.
|
|
106
|
+
* @defaultValue per format
|
|
107
|
+
*/
|
|
54
108
|
weightFrom?: string | null | undefined;
|
|
55
|
-
/**
|
|
109
|
+
/**
|
|
110
|
+
* Whether weights a 32-bit float cannot hold exactly are also kept exactly. "f64" keeps them in
|
|
111
|
+
* an edge column that `snapshot.edges.byRole("weight")` finds, so 0.1 and 16777217
|
|
112
|
+
* stay exact. "f32" keeps no such column and uses less memory: the 32-bit weight arrays
|
|
113
|
+
* `snapshot.weights` and `snapshot.edgeList().weights`, which every import fills, are then the
|
|
114
|
+
* only weights.
|
|
115
|
+
* @defaultValue "f64"
|
|
116
|
+
*/
|
|
56
117
|
weightDtype?: "f32" | "f64" | undefined;
|
|
57
|
-
/**
|
|
118
|
+
/**
|
|
119
|
+
* How a column the file declares as a 64-bit integer is stored: "f64" (a number, exact up to
|
|
120
|
+
* 2^53) or "string" (every digit kept, as text). GML declares no types, so there it applies to a
|
|
121
|
+
* key whose integer values go beyond 2^53.
|
|
122
|
+
* @defaultValue "f64"
|
|
123
|
+
*/
|
|
58
124
|
long?: "f64" | "string" | undefined;
|
|
59
|
-
/**
|
|
125
|
+
/**
|
|
126
|
+
* Whether to give back the original ids that an export with `sanitizeIds: "mangle"` had to
|
|
127
|
+
* rewrite. The export writes them to the file in an attribute whose name each format page
|
|
128
|
+
* gives. When false, the rewritten ids stay the ids and the originals are an ordinary node
|
|
129
|
+
* attribute, named after the format's spelling: `graphty.originalId` in GraphML,
|
|
130
|
+
* `graphty_originalId` in GML and Pajek, `graphty:originalId` in CX, CX2 and Cytoscape sessions,
|
|
131
|
+
* and a `graphty:originalId` entry of the `property_value` attribute in OBO.
|
|
132
|
+
* @defaultValue true
|
|
133
|
+
*/
|
|
60
134
|
restoreMangledIds?: boolean | undefined;
|
|
61
|
-
/**
|
|
135
|
+
/**
|
|
136
|
+
* What to do with a GraphML or JGF hyperedge (an edge with more than two ends): "skip" leaves it
|
|
137
|
+
* out with a warning, "error" stops the import, and "star" and "clique" turn it into ordinary
|
|
138
|
+
* edges. "clique" joins every pair of ends. "star" works differently per format: GraphML adds a
|
|
139
|
+
* new hub node joined to every end, while JGF makes the hyperedge's first node the hub, so no
|
|
140
|
+
* node is added. A directed JGF hyperedge (`source` and `target` arrays) becomes one edge from
|
|
141
|
+
* every source to every target under both. In JGF every edge made from a hyperedge carries the
|
|
142
|
+
* hyperedge's id, label, relation and metadata; GraphML drops a hyperedge's `<data>` and its
|
|
143
|
+
* `<desc>`, with a warning.
|
|
144
|
+
* @defaultValue "skip"
|
|
145
|
+
*/
|
|
62
146
|
hyperedges?: "error" | "skip" | "star" | "clique" | undefined;
|
|
63
|
-
/**
|
|
147
|
+
/**
|
|
148
|
+
* How many errors an import tolerates. Each error skips one node, edge or value and is listed in
|
|
149
|
+
* the report; one error more than this stops the import with an ImportError. Pass 0 to stop at
|
|
150
|
+
* the first error.
|
|
151
|
+
* @defaultValue 100
|
|
152
|
+
*/
|
|
64
153
|
errorLimit?: number | undefined;
|
|
65
|
-
/**
|
|
154
|
+
/**
|
|
155
|
+
* Cancels the import. When it aborts, the import stops and rejects with the signal's reason
|
|
156
|
+
* (an AbortError, or a TimeoutError from `AbortSignal.timeout()`).
|
|
157
|
+
*/
|
|
66
158
|
signal?: AbortSignal | undefined;
|
|
67
|
-
/**
|
|
159
|
+
/**
|
|
160
|
+
* Called as the input is read, with the bytes read so far and the total. For a string or a
|
|
161
|
+
* Uint8Array the total is known from the first call. For a stream (which includes loadFromUrl()
|
|
162
|
+
* and loadFromFile()) it is undefined until the last call, which always has
|
|
163
|
+
* `bytesDone === bytesTotal`. Text counts its UTF-8 length.
|
|
164
|
+
*/
|
|
68
165
|
onProgress?: ((bytesDone: number, bytesTotal?: number) => void) | undefined;
|
|
69
166
|
/**
|
|
70
|
-
* The character encoding of byte input
|
|
71
|
-
* "
|
|
72
|
-
*
|
|
73
|
-
*
|
|
167
|
+
* The character encoding of byte input, as a label such as "utf-8", "windows-1252" or
|
|
168
|
+
* "utf-16le". Without it graph-io uses a byte order mark, then the encoding the file declares
|
|
169
|
+
* (an XML declaration, DOT's `charset`), then UTF-8, and reads bytes that are not UTF-8 as
|
|
170
|
+
* windows-1252 with a warning. A byte order mark wins over this option. A string input is
|
|
171
|
+
* already text: setting this option for one adds a W_OPTION_IGNORED warning, once per input (a
|
|
172
|
+
* CSV import with a `nodes` table has two inputs).
|
|
74
173
|
*/
|
|
75
174
|
encoding?: string | undefined;
|
|
76
175
|
}
|
|
77
176
|
|
|
78
177
|
/**
|
|
79
|
-
* Which graph
|
|
80
|
-
*
|
|
81
|
-
*
|
|
178
|
+
* Which graph to read from a file that holds several: by position or by name, never both. Without
|
|
179
|
+
* either, the first graph is read.
|
|
180
|
+
* @category Loading
|
|
82
181
|
*/
|
|
83
182
|
export interface GraphChoiceOptions {
|
|
84
|
-
/**
|
|
183
|
+
/**
|
|
184
|
+
* The 0-based position of the graph to read from a file that holds several (`listGraphs()`
|
|
185
|
+
* gives each graph's `index`). A position past the last graph stops the import with an
|
|
186
|
+
* ImportError whose `issue.code` is E_GRAPH_NOT_FOUND; its message lists the file's graphs.
|
|
187
|
+
* @defaultValue 0
|
|
188
|
+
*/
|
|
85
189
|
graphIndex?: number | undefined;
|
|
86
|
-
/**
|
|
190
|
+
/**
|
|
191
|
+
* The name of the graph to read from a file that holds several (`listGraphs()` gives each
|
|
192
|
+
* graph's `name`). A name no graph has stops the import with an ImportError whose `issue.code`
|
|
193
|
+
* is E_GRAPH_NOT_FOUND, and a name two graphs share with one whose `issue.code` is
|
|
194
|
+
* E_AMBIGUOUS_GRAPH_NAME.
|
|
195
|
+
*/
|
|
87
196
|
graphName?: string | undefined;
|
|
88
197
|
}
|
|
89
198
|
|
|
90
|
-
/**
|
|
199
|
+
/**
|
|
200
|
+
* One graph of an input that can hold several, as an importer's listGraphs() describes it.
|
|
201
|
+
* @category Loading
|
|
202
|
+
*/
|
|
91
203
|
export interface GraphListing {
|
|
92
204
|
/** The value graphIndex takes to read it. */
|
|
93
205
|
readonly index: number;
|
|
@@ -100,37 +212,49 @@ export interface GraphListing {
|
|
|
100
212
|
}
|
|
101
213
|
|
|
102
214
|
/**
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
215
|
+
* A format's reader. It reads the input once, from start to end, and adds each node, edge and
|
|
216
|
+
* attribute to a graph builder (`GraphSink`, which `GraphBuilder` from @graphty/graph-format
|
|
217
|
+
* implements); importGraph() then builds the snapshot. Register one with
|
|
218
|
+
* `registry.registerImporter()` to teach graph-io a new format. `Opts` is the type of the format's
|
|
219
|
+
* own options.
|
|
220
|
+
* @category Writing a format
|
|
106
221
|
*/
|
|
107
222
|
export interface GraphImporter<Opts = unknown> {
|
|
108
|
-
/** The format
|
|
223
|
+
/** The name callers pass as `format`, such as "graphml" or "csv"; lowercase, unique in a registry. */
|
|
109
224
|
readonly format: string;
|
|
110
|
-
/** File extensions with the leading dot. */
|
|
225
|
+
/** File extensions with the leading dot, most common first; used to detect the format from a file name. */
|
|
111
226
|
readonly extensions: readonly string[];
|
|
112
|
-
/** MIME types the format is served as. */
|
|
227
|
+
/** MIME types the format is served as, most specific first; used to detect the format from a Content-Type. */
|
|
113
228
|
readonly mimeTypes: readonly string[];
|
|
114
229
|
/**
|
|
115
|
-
*
|
|
230
|
+
* The names of this format's own options (`["separator"]`), when you want misspelled options
|
|
231
|
+
* reported. While every registered importer lists its options, a load warns `W_UNKNOWN_OPTION` for
|
|
232
|
+
* a name that no format and no load function takes. Leave it out to report nothing.
|
|
233
|
+
*/
|
|
234
|
+
readonly options?: readonly string[] | undefined;
|
|
235
|
+
/**
|
|
236
|
+
* How sure you are that `head`, the first bytes of a file (up to SNIFF_HEAD_BYTES), is this
|
|
237
|
+
* format: 0 for no, up to 1 for certain. Below 0.5 counts as a weak guess, which loses to a
|
|
238
|
+
* file extension another format claims. Without this method the format is detected only by
|
|
239
|
+
* file name and MIME type.
|
|
116
240
|
* @param head - the first bytes of the input
|
|
117
241
|
* @returns a confidence in 0..1
|
|
118
242
|
*/
|
|
119
243
|
sniff?(head: Uint8Array): number;
|
|
120
244
|
/**
|
|
121
|
-
* Read `input` into `sink
|
|
122
|
-
*
|
|
245
|
+
* Read `input` into `sink`. Record each problem in an ImportReportBuilder and skip the element;
|
|
246
|
+
* the builder throws ImportError once there are more errors than `errorLimit`.
|
|
123
247
|
* @param input - the text, bytes or stream to read
|
|
124
|
-
* @param sink - the builder
|
|
125
|
-
* @param options - format
|
|
126
|
-
* @returns the import report
|
|
248
|
+
* @param sink - the graph builder to add nodes, edges and attributes to
|
|
249
|
+
* @param options - the format's own options and the options every importer takes
|
|
250
|
+
* @returns the import report (`report.finish()`)
|
|
127
251
|
*/
|
|
128
252
|
import(input: ImportInput, sink: GraphSink, options?: Opts & CommonImportOptions): Promise<ImportReport>;
|
|
129
253
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
* and
|
|
254
|
+
* Optional, for a format whose files can hold several graphs: read every graph, each into its
|
|
255
|
+
* own sink. importAllGraphs() calls it; with it, importGraph() also honors `graphIndex` and
|
|
256
|
+
* `graphName` by reading every graph and returning the chosen one. `import()` should read the
|
|
257
|
+
* first graph and warn W_MULTIPLE_GRAPHS with the number skipped.
|
|
134
258
|
* @param input - the text, bytes or stream to read
|
|
135
259
|
* @param sinkFor - called once per graph, in document order, before that graph's first push
|
|
136
260
|
* @param options - format-specific and common options
|
|
@@ -142,9 +266,10 @@ export interface GraphImporter<Opts = unknown> {
|
|
|
142
266
|
options?: Opts & CommonImportOptions,
|
|
143
267
|
): Promise<ImportReport[]>;
|
|
144
268
|
/**
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
269
|
+
* Optional: list the graphs of a file without importing them, so a caller can offer a choice.
|
|
270
|
+
* listGraphs() calls it. An importer that has it must also honor `graphIndex` and `graphName`
|
|
271
|
+
* in `import()` itself (`chooseGraph()` resolves them); one without it lists nothing and the
|
|
272
|
+
* registry makes the choice through `importAll()`.
|
|
148
273
|
* @param input - the text, bytes or stream to read
|
|
149
274
|
* @param options - format-specific and common options
|
|
150
275
|
* @returns one listing per graph, in document order
|
|
@@ -153,98 +278,185 @@ export interface GraphImporter<Opts = unknown> {
|
|
|
153
278
|
}
|
|
154
279
|
|
|
155
280
|
/**
|
|
156
|
-
* What a format can
|
|
157
|
-
* note
|
|
281
|
+
* What a format can store exactly. checkCapabilities() compares a graph against it and returns a
|
|
282
|
+
* loss note for everything the graph has that the format cannot store.
|
|
283
|
+
* @category Saving
|
|
158
284
|
*/
|
|
159
285
|
export interface ExportCapabilities {
|
|
160
|
-
/**
|
|
286
|
+
/**
|
|
287
|
+
* Whether one file can hold directed and undirected edges together. When false, a graph with both
|
|
288
|
+
* needs `onMixedDirection` ("directed" or "undirected") to be saved.
|
|
289
|
+
*/
|
|
161
290
|
readonly mixedDirection: boolean;
|
|
162
|
-
/**
|
|
291
|
+
/**
|
|
292
|
+
* Whether the file can hold two edges between the same pair of nodes. When false, the extra
|
|
293
|
+
* edges are not kept as separate edges.
|
|
294
|
+
*/
|
|
163
295
|
readonly multiEdges: boolean;
|
|
164
|
-
/**
|
|
296
|
+
/** Whether the file can hold an edge from a node to itself. When false, such edges are lost. */
|
|
165
297
|
readonly selfLoops: boolean;
|
|
166
|
-
/**
|
|
298
|
+
/**
|
|
299
|
+
* Whether edges carry ids. "required": every edge has one, and ids are made up (e0, e1, ...)
|
|
300
|
+
* for a graph without them. "optional": edge ids are written when the graph has them. "none":
|
|
301
|
+
* edge ids are lost.
|
|
302
|
+
*/
|
|
167
303
|
readonly edgeIds: "required" | "optional" | "none";
|
|
168
|
-
/**
|
|
304
|
+
/**
|
|
305
|
+
* Which node ids the format can write as they are: "any"; "nmtoken" (XML name tokens: letters,
|
|
306
|
+
* digits and `. - _ :`, no spaces); "integer"; or "dense-1-based" (the nodes are always numbered
|
|
307
|
+
* 1 to N). Other ids need `sanitizeIds: "mangle"`, which writes the original ids too.
|
|
308
|
+
*/
|
|
169
309
|
readonly idCharset: "any" | "nmtoken" | "integer" | "dense-1-based";
|
|
170
|
-
/**
|
|
310
|
+
/**
|
|
311
|
+
* The attribute types the format keeps exactly: "bool", "i32" (32-bit integer), "u32" (unsigned
|
|
312
|
+
* 32-bit integer), "u8" (byte), "f32" (32-bit float), "f64" (64-bit float, a JavaScript number),
|
|
313
|
+
* "string" (text), "dict" (text stored as a dictionary of repeated values), "list" and "json".
|
|
314
|
+
* An attribute of another type is written as the nearest one the format has, with a
|
|
315
|
+
* W_DTYPE_UNSUPPORTED note.
|
|
316
|
+
*/
|
|
171
317
|
readonly dtypes: readonly Dtype[];
|
|
172
|
-
/**
|
|
318
|
+
/**
|
|
319
|
+
* Whether an attribute other than the node position can hold several numbers per node or edge
|
|
320
|
+
* (a vector). When false, such an attribute does not read back as one attribute. Positions
|
|
321
|
+
* are covered by `positions`.
|
|
322
|
+
*/
|
|
173
323
|
readonly components: boolean;
|
|
174
|
-
/**
|
|
324
|
+
/** Whether an attribute can hold a list per node or edge. When false, list attributes are lost or flattened. */
|
|
175
325
|
readonly lists: boolean;
|
|
176
|
-
/**
|
|
326
|
+
/**
|
|
327
|
+
* Whether an attribute can hold nested JSON objects and arrays. When false, such attributes are
|
|
328
|
+
* written as text or lost.
|
|
329
|
+
*/
|
|
177
330
|
readonly json: boolean;
|
|
178
|
-
/**
|
|
331
|
+
/** Whether the file can declare a default value for an attribute. When false, declared defaults are lost. */
|
|
179
332
|
readonly defaults: boolean;
|
|
180
|
-
/**
|
|
333
|
+
/**
|
|
334
|
+
* Whether the file can declare the allowed values of an attribute (GEXF `options`). When false,
|
|
335
|
+
* those declarations are lost; the values themselves are kept.
|
|
336
|
+
*/
|
|
181
337
|
readonly options: boolean;
|
|
182
|
-
/**
|
|
338
|
+
/** Whether nodes can sit inside other nodes (groups or clusters). When false, the nesting is lost. */
|
|
183
339
|
readonly hierarchy: boolean;
|
|
184
|
-
/**
|
|
340
|
+
/**
|
|
341
|
+
* What the file can say about time: "none" (time attributes are lost), "intervals" (one start
|
|
342
|
+
* and end per element), "spells" (several intervals per element), or "dynamic-values"
|
|
343
|
+
* (attribute values that change over time, as well).
|
|
344
|
+
*/
|
|
185
345
|
readonly temporal: "none" | "intervals" | "spells" | "dynamic-values";
|
|
186
|
-
/**
|
|
346
|
+
/** Whether the file can hold attributes of the graph itself. When false, graph attributes are lost. */
|
|
187
347
|
readonly graphAttributes: boolean;
|
|
188
|
-
/**
|
|
348
|
+
/** Whether the file can hold node positions. When false, the layout is lost. */
|
|
189
349
|
readonly positions: boolean;
|
|
190
|
-
/**
|
|
350
|
+
/** Whether the file can hold node and edge color, size, shape and thickness. When false, they are lost. */
|
|
191
351
|
readonly viz: boolean;
|
|
192
352
|
}
|
|
193
353
|
|
|
194
|
-
/**
|
|
354
|
+
/**
|
|
355
|
+
* One thing a format cannot store, returned by checkExport() before anything is written.
|
|
356
|
+
* @category Saving
|
|
357
|
+
*/
|
|
195
358
|
export interface LossNote {
|
|
196
|
-
/**
|
|
359
|
+
/**
|
|
360
|
+
* A stable code. Codes starting with "E_" mean the export refuses to write under these options:
|
|
361
|
+
* the exportGraph*() functions throw a GraphFormatError. Codes starting with "W_" mean the file
|
|
362
|
+
* is written, but this part will not read back the same.
|
|
363
|
+
*/
|
|
197
364
|
readonly code: string;
|
|
198
|
-
/** A plain-
|
|
365
|
+
/** A plain-English explanation. */
|
|
199
366
|
readonly message: string;
|
|
200
|
-
/** The
|
|
367
|
+
/** The attribute column involved, or null. */
|
|
201
368
|
readonly column: string | null;
|
|
202
|
-
/** How many
|
|
369
|
+
/** How many nodes, edges or values are affected, or null when not counted. */
|
|
203
370
|
readonly count: number | null;
|
|
204
371
|
}
|
|
205
372
|
|
|
206
|
-
/**
|
|
373
|
+
/**
|
|
374
|
+
* The options every exporter accepts next to its format-specific ones.
|
|
375
|
+
* @category Saving
|
|
376
|
+
*/
|
|
207
377
|
export interface CommonExportOptions {
|
|
208
|
-
/**
|
|
378
|
+
/**
|
|
379
|
+
* What to do with node ids the format cannot hold. "error": the export throws (E_INVALID_ID) and
|
|
380
|
+
* no node is renamed. "mangle": such ids are rewritten and the originals are written to the
|
|
381
|
+
* file too, so an import with `restoreMangledIds` (on by default) reads the original ids back.
|
|
382
|
+
* Pajek is the exception: it always numbers nodes 1 to N and keeps the old ids as labels.
|
|
383
|
+
* @defaultValue "error"
|
|
384
|
+
*/
|
|
209
385
|
sanitizeIds?: "error" | "mangle" | undefined;
|
|
210
|
-
/**
|
|
386
|
+
/**
|
|
387
|
+
* What a format with one direction per file does with a graph that has both directed and
|
|
388
|
+
* undirected edges: "error" throws (E_DIRECTED), "directed" writes every edge as directed (an
|
|
389
|
+
* undirected edge once, as one directed edge), "undirected" writes the whole graph undirected.
|
|
390
|
+
* A format that keeps each edge's own direction (GraphML, GEXF, CSV, Pajek, XGMML, Cytoscape
|
|
391
|
+
* sessions, and the JGF and graphology JSON dialects) ignores it and writes both kinds; to make
|
|
392
|
+
* such a graph all one direction, read it with the import option `onMixedDirection`.
|
|
393
|
+
* @defaultValue "error"
|
|
394
|
+
*/
|
|
211
395
|
onMixedDirection?: "error" | "directed" | "undirected" | undefined;
|
|
212
396
|
}
|
|
213
397
|
|
|
214
398
|
/**
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
*
|
|
399
|
+
* A format's writer. Register one with `registry.registerExporter()` to make a format writable by
|
|
400
|
+
* every save function. `Opts` is the type of the format's own options.
|
|
401
|
+
* @category Writing a format
|
|
218
402
|
*/
|
|
219
403
|
export interface GraphExporter<Opts = unknown> {
|
|
220
|
-
/** The format
|
|
404
|
+
/** The name callers pass as `format`; the same as the importer's when the format has both. */
|
|
221
405
|
readonly format: string;
|
|
222
|
-
/** What the format can
|
|
406
|
+
/** What the format can store exactly; build it with `capabilities()`. */
|
|
223
407
|
readonly capabilities: ExportCapabilities;
|
|
224
408
|
/**
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
|
|
228
|
-
|
|
409
|
+
* File extensions with the leading dot, most common first. Optional; listFormats() uses them
|
|
410
|
+
* when no importer is registered for the format (an export-only format).
|
|
411
|
+
*/
|
|
412
|
+
readonly extensions?: readonly string[] | undefined;
|
|
413
|
+
/** MIME types, most specific first. Optional; used the same way as `extensions`. */
|
|
414
|
+
readonly mimeTypes?: readonly string[] | undefined;
|
|
415
|
+
/**
|
|
416
|
+
* The names of this format's own save options, when you want misspelled options reported. While
|
|
417
|
+
* every registered exporter lists its options, `checkExport()` returns a `W_UNKNOWN_OPTION` note for
|
|
418
|
+
* a name that no format and no save function takes. Leave it out to report nothing.
|
|
419
|
+
*/
|
|
420
|
+
readonly options?: readonly string[] | undefined;
|
|
421
|
+
/**
|
|
422
|
+
* What a save would lose, without writing anything; checkExport(snapshot, format, options) calls
|
|
423
|
+
* it. Start from `checkCapabilities(snapshot, capabilities, resolveExportOptions(options))` and
|
|
424
|
+
* add a note for anything else your format changes. Every difference a re-import would show
|
|
425
|
+
* needs a note.
|
|
426
|
+
* @param snapshot - the graph to check
|
|
427
|
+
* @param options - the format's own options and the options every exporter takes
|
|
428
|
+
* @returns the loss notes, empty when the save is exact
|
|
229
429
|
*/
|
|
230
430
|
check(snapshot: GraphSnapshot, options?: Opts & CommonExportOptions): readonly LossNote[];
|
|
231
431
|
/**
|
|
232
|
-
* Write the
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
* @
|
|
432
|
+
* Write the graph as byte chunks: UTF-8 text for a text format (`encodeChunks()` turns string
|
|
433
|
+
* parts into them), the raw bytes for a binary one. Throw a GraphFormatError before writing for
|
|
434
|
+
* every "E_" note `check()` returns.
|
|
435
|
+
* @param snapshot - the graph to write
|
|
436
|
+
* @param options - the format's own options and the options every exporter takes
|
|
437
|
+
* @returns the file's bytes, chunk by chunk
|
|
236
438
|
*/
|
|
237
439
|
export(snapshot: GraphSnapshot, options?: Opts & CommonExportOptions): AsyncIterable<Uint8Array>;
|
|
238
440
|
/**
|
|
239
|
-
* Write the
|
|
240
|
-
*
|
|
241
|
-
* @param
|
|
242
|
-
* @
|
|
441
|
+
* Write the graph as one string (`joinText()` joins string parts). A binary format rejects with
|
|
442
|
+
* a GraphFormatError E_UNSUPPORTED (`details.reason` "binary") instead.
|
|
443
|
+
* @param snapshot - the graph to write
|
|
444
|
+
* @param options - the format's own options and the options every exporter takes
|
|
445
|
+
* @returns the whole file
|
|
243
446
|
*/
|
|
244
447
|
exportToString(snapshot: GraphSnapshot, options?: Opts & CommonExportOptions): Promise<string>;
|
|
245
448
|
}
|
|
246
449
|
|
|
247
|
-
/**
|
|
450
|
+
/**
|
|
451
|
+
* What an ImportIssue is about, for errors and warnings alike: "parse-error" (the text is not valid
|
|
452
|
+
* in the format), "missing-value" (something required is absent), "validation-error" (a value
|
|
453
|
+
* breaks a rule of the format or of an option; an error skips it, a warning keeps it as written,
|
|
454
|
+
* such as an id with spaces around it), "unsupported" (the file uses something graph-io does not
|
|
455
|
+
* read), "precision" (a value was rounded), "coercion" (a value or id changed type) and "merged"
|
|
456
|
+
* (elements were combined). Sort by `severity` first: the category says what kind of problem it
|
|
457
|
+
* is, not how serious.
|
|
458
|
+
* @category Reports and errors
|
|
459
|
+
*/
|
|
248
460
|
export type IssueCategory =
|
|
249
461
|
| "parse-error"
|
|
250
462
|
| "missing-value"
|
|
@@ -254,37 +466,49 @@ export type IssueCategory =
|
|
|
254
466
|
| "coercion"
|
|
255
467
|
| "merged";
|
|
256
468
|
|
|
257
|
-
/**
|
|
469
|
+
/**
|
|
470
|
+
* One problem found while importing.
|
|
471
|
+
* @category Reports and errors
|
|
472
|
+
*/
|
|
258
473
|
export interface ImportIssue {
|
|
259
474
|
/** The category. */
|
|
260
475
|
readonly category: IssueCategory;
|
|
261
|
-
/**
|
|
476
|
+
/**
|
|
477
|
+
* "error": the element was skipped and counts toward `errorLimit`. "warning": the element was
|
|
478
|
+
* kept, possibly changed.
|
|
479
|
+
*/
|
|
262
480
|
readonly severity: "error" | "warning";
|
|
263
|
-
/** A stable code
|
|
481
|
+
/** A stable code; E_ for errors, W_ for warnings ("E_UNKNOWN_NODE", "W_WIDENED"). */
|
|
264
482
|
readonly code: string;
|
|
265
|
-
/** A plain-
|
|
483
|
+
/** A plain-English message. */
|
|
266
484
|
readonly message: string;
|
|
267
|
-
/** The 1-based
|
|
485
|
+
/** The 1-based line in the input, or null when the format has no lines or it is unknown. */
|
|
268
486
|
readonly line: number | null;
|
|
269
|
-
/** The
|
|
487
|
+
/** The node id, edge id or attribute name involved, or null. */
|
|
270
488
|
readonly element: string | null;
|
|
271
489
|
}
|
|
272
490
|
|
|
273
|
-
/**
|
|
491
|
+
/**
|
|
492
|
+
* What happened while a file was read.
|
|
493
|
+
* @category Reports and errors
|
|
494
|
+
*/
|
|
274
495
|
export interface ImportReport {
|
|
275
|
-
/** The
|
|
496
|
+
/** The format the file was read as. */
|
|
276
497
|
readonly format: string;
|
|
277
|
-
/**
|
|
498
|
+
/**
|
|
499
|
+
* What was read from the file, counted before the graph was built: `duplicateEdges` and
|
|
500
|
+
* `selfLoops: "drop"` can leave fewer edges in the snapshot (each reported as a warning).
|
|
501
|
+
*/
|
|
278
502
|
readonly counts: {
|
|
279
|
-
/** Nodes
|
|
503
|
+
/** Nodes read. */
|
|
280
504
|
readonly nodes: number;
|
|
281
|
-
/**
|
|
505
|
+
/** Edges read (an undirected edge expanded into two by onMixedDirection "expand" counts twice). */
|
|
282
506
|
readonly edges: number;
|
|
283
507
|
/** Nodes skipped after an error. */
|
|
284
508
|
readonly skippedNodes: number;
|
|
285
509
|
/** Edges skipped after an error. */
|
|
286
510
|
readonly skippedEdges: number;
|
|
287
|
-
/**
|
|
511
|
+
/** Undirected edges expanded into two by onMixedDirection "expand". */
|
|
288
512
|
readonly expandedMixed: number;
|
|
289
513
|
};
|
|
290
514
|
/** Every issue recorded, in order. */
|
|
@@ -297,28 +521,75 @@ export interface ImportReport {
|
|
|
297
521
|
readonly truncated: boolean;
|
|
298
522
|
/** What the importer could not represent. */
|
|
299
523
|
readonly lossy: readonly LossNote[];
|
|
300
|
-
/**
|
|
524
|
+
/** How long reading the file took, in milliseconds. */
|
|
301
525
|
readonly durationMs: number;
|
|
302
526
|
}
|
|
303
527
|
|
|
304
528
|
/**
|
|
305
|
-
*
|
|
306
|
-
*
|
|
307
|
-
*
|
|
529
|
+
* What a load function throws when the input cannot be read: the URL failed, the format was not
|
|
530
|
+
* recognized, the file could not be parsed, or there were more errors than `errorLimit`. It is a
|
|
531
|
+
* GraphFormatError with code "E_IMPORT"; `issue` says what stopped the import and `report` holds
|
|
532
|
+
* everything recorded until then.
|
|
533
|
+
* @category Reports and errors
|
|
308
534
|
*/
|
|
309
535
|
export class ImportError extends GraphFormatError {
|
|
310
|
-
/**
|
|
311
|
-
|
|
536
|
+
/**
|
|
537
|
+
* Everything recorded up to the point the import stopped. It is not an enumerable property, so an
|
|
538
|
+
* uncaught ImportError prints its message and issue, not every issue of the report.
|
|
539
|
+
*/
|
|
540
|
+
declare readonly report: ImportReport;
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* The issue that stopped the import: its `code` ("E_FETCH", "E_UNKNOWN_FORMAT", "E_CSV_UNCLOSED_QUOTE", ...),
|
|
544
|
+
* `message`, `line` and `element`. This is the value to branch on; `code` is always "E_IMPORT".
|
|
545
|
+
* Null only for an ImportError constructed by hand without a matching issue.
|
|
546
|
+
* @example
|
|
547
|
+
* ```ts
|
|
548
|
+
* if (err instanceof ImportError) {
|
|
549
|
+
* switch (err.issue?.code) {
|
|
550
|
+
* case "E_FETCH":
|
|
551
|
+
* console.error(`download failed with status ${String(err.details.status)}`);
|
|
552
|
+
* break;
|
|
553
|
+
* case "E_UNKNOWN_FORMAT":
|
|
554
|
+
* console.error("not a graph file this library can read; pass `format`");
|
|
555
|
+
* break;
|
|
556
|
+
* default:
|
|
557
|
+
* console.error(err.message);
|
|
558
|
+
* }
|
|
559
|
+
* }
|
|
560
|
+
* ```
|
|
561
|
+
*/
|
|
562
|
+
readonly issue: ImportIssue | null;
|
|
312
563
|
|
|
313
564
|
/**
|
|
314
565
|
* Create an ImportError.
|
|
315
566
|
* @param message - a plain-ASCII human-readable message
|
|
316
567
|
* @param report - the partial report
|
|
317
|
-
* @param details - optional machine-readable context
|
|
568
|
+
* @param details - optional machine-readable context; its `code` names the issue that stopped the import
|
|
318
569
|
*/
|
|
319
570
|
constructor(message: string, report: ImportReport, details?: Readonly<Record<string, unknown>>) {
|
|
320
571
|
super("E_IMPORT", message, details);
|
|
321
572
|
this.name = "ImportError";
|
|
322
|
-
this
|
|
573
|
+
Object.defineProperty(this, "report", { value: report, enumerable: false });
|
|
574
|
+
this.issue = stoppingIssue(report.issues, details?.code);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* The issue that stopped an import: the last one with the code the abort named, else the last error.
|
|
580
|
+
* @param issues - the report's issues
|
|
581
|
+
* @param code - the code the abort named, if any
|
|
582
|
+
* @returns the issue, or null
|
|
583
|
+
*/
|
|
584
|
+
function stoppingIssue(issues: readonly ImportIssue[], code: unknown): ImportIssue | null {
|
|
585
|
+
let lastError: ImportIssue | null = null;
|
|
586
|
+
for (let i = issues.length - 1; i >= 0; i--) {
|
|
587
|
+
if (issues[i].code === code) {
|
|
588
|
+
return issues[i];
|
|
589
|
+
}
|
|
590
|
+
if (lastError === null && issues[i].severity === "error") {
|
|
591
|
+
lastError = issues[i];
|
|
592
|
+
}
|
|
323
593
|
}
|
|
594
|
+
return lastError;
|
|
324
595
|
}
|