@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
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compare two snapshots node by node, edge by edge and value by value, for testing a format plugin:
|
|
3
|
+
* read a file, save it, read the saved file back, and compare. Every difference should be one that
|
|
4
|
+
* the save's checkExport() notes announced.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { type Column, type GraphSnapshot } from "@graphty/graph-format";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* One difference between two snapshots.
|
|
11
|
+
* @category Plugin helpers
|
|
12
|
+
*/
|
|
13
|
+
export interface SnapshotDiff {
|
|
14
|
+
/** Where: "directed", "ids[3]", "nodes.label[4]", "edges.weight[0]", "extensions.temporal:node:price.rowCount"... */
|
|
15
|
+
readonly path: string;
|
|
16
|
+
/** The value in the expected snapshot. */
|
|
17
|
+
readonly expected: unknown;
|
|
18
|
+
/** The value in the actual snapshot. */
|
|
19
|
+
readonly actual: unknown;
|
|
20
|
+
/** A one-line description. */
|
|
21
|
+
readonly message: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* What compareSnapshots() compares.
|
|
26
|
+
* @category Plugin helpers
|
|
27
|
+
*/
|
|
28
|
+
export interface CompareOptions {
|
|
29
|
+
/** Column names to skip in every table (format-owned helpers an exporter adds, for instance). */
|
|
30
|
+
readonly ignoreColumns?: readonly string[] | undefined;
|
|
31
|
+
/** Column roles to skip in every table. */
|
|
32
|
+
readonly ignoreRoles?: readonly string[] | undefined;
|
|
33
|
+
/** Whether the actual snapshot may hold columns the expected one lacks (default true). */
|
|
34
|
+
readonly allowExtraColumns?: boolean | undefined;
|
|
35
|
+
/** Whether dtypes must match (default true); false compares values only. */
|
|
36
|
+
readonly dtypes?: boolean | undefined;
|
|
37
|
+
/** Whether roles must match (default true). */
|
|
38
|
+
readonly roles?: boolean | undefined;
|
|
39
|
+
/** Whether origin.type must match (default false). */
|
|
40
|
+
readonly originType?: boolean | undefined;
|
|
41
|
+
/** Absolute tolerance for numeric cell and weight comparisons (default 0: Object.is). */
|
|
42
|
+
readonly tolerance?: number | undefined;
|
|
43
|
+
/** Whether the explicit / defaulted status of weights must match (default true). */
|
|
44
|
+
readonly weightExplicitness?: boolean | undefined;
|
|
45
|
+
/** Whether extension tables are compared (default true). */
|
|
46
|
+
readonly extensions?: boolean | undefined;
|
|
47
|
+
/** Stop after this many differences (default 50). */
|
|
48
|
+
readonly limit?: number | undefined;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Compare two snapshots: the direction, the node ids, the edges, the weights and every attribute
|
|
53
|
+
* value. Use it to test a format plugin: read a file, save it in your format, read the saved file
|
|
54
|
+
* back, and compare the two graphs. Each difference has a `path` ("ids[3]", "nodes.label[4]",
|
|
55
|
+
* "edges.weight[0]") and a one-line `message`; every one should match a note that `checkExport()`
|
|
56
|
+
* returned for the save.
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* const notes = checkExport(original, "pairs");
|
|
60
|
+
* const readBack = (await importGraph(await exportGraphToString(original, "pairs"), { format: "pairs" })).snapshot;
|
|
61
|
+
* console.log(describeDiffs(compareSnapshots(original, readBack)));
|
|
62
|
+
* ```
|
|
63
|
+
* @param expected - the graph you saved
|
|
64
|
+
* @param actual - the graph read back from the saved file
|
|
65
|
+
* @param options - what to compare
|
|
66
|
+
* @returns the differences, empty when the graphs are the same
|
|
67
|
+
* @category Plugin helpers
|
|
68
|
+
*/
|
|
69
|
+
export function compareSnapshots(
|
|
70
|
+
expected: GraphSnapshot,
|
|
71
|
+
actual: GraphSnapshot,
|
|
72
|
+
options: CompareOptions = {},
|
|
73
|
+
): SnapshotDiff[] {
|
|
74
|
+
const diffs: SnapshotDiff[] = [];
|
|
75
|
+
const limit = options.limit ?? 50;
|
|
76
|
+
const tolerance = options.tolerance ?? 0;
|
|
77
|
+
const ctx: CompareContext = {
|
|
78
|
+
options,
|
|
79
|
+
diff: (path, e, a, message) => {
|
|
80
|
+
diffs.push({
|
|
81
|
+
path,
|
|
82
|
+
expected: e,
|
|
83
|
+
actual: a,
|
|
84
|
+
message: message ?? `${path}: expected ${show(e)}, got ${show(a)}`,
|
|
85
|
+
});
|
|
86
|
+
if (diffs.length >= limit) {
|
|
87
|
+
throw new LimitReached();
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
same: (e, a) => valuesEqual(e, a, tolerance),
|
|
91
|
+
};
|
|
92
|
+
try {
|
|
93
|
+
compareGraphs(expected, actual, ctx);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
if (!(err instanceof LimitReached)) {
|
|
96
|
+
throw err;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return diffs;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Thrown by the recorder once the limit of differences is reached, to end the walk. */
|
|
103
|
+
class LimitReached extends Error {}
|
|
104
|
+
|
|
105
|
+
/** What every comparison step shares: the options, the recorder and the value comparator. */
|
|
106
|
+
interface CompareContext {
|
|
107
|
+
readonly options: CompareOptions;
|
|
108
|
+
/** Records a difference (with a default message); throws LimitReached at the limit. */
|
|
109
|
+
readonly diff: (path: string, e: unknown, a: unknown, message?: string) => void;
|
|
110
|
+
/** Value equality under the tolerance. */
|
|
111
|
+
readonly same: (e: unknown, a: unknown) => boolean;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** A table shape both AttributeTable and extension tables satisfy. */
|
|
115
|
+
interface TableLike extends Iterable<Column> {
|
|
116
|
+
readonly rowCount: number;
|
|
117
|
+
names(): readonly string[];
|
|
118
|
+
get(name: string): Column | null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Compare two snapshots step by step: the counts, the ids, the topology, the weights, the tables.
|
|
123
|
+
* @param expected - the reference
|
|
124
|
+
* @param actual - the snapshot under test
|
|
125
|
+
* @param ctx - the comparison context
|
|
126
|
+
*/
|
|
127
|
+
function compareGraphs(expected: GraphSnapshot, actual: GraphSnapshot, ctx: CompareContext): void {
|
|
128
|
+
const { diff } = ctx;
|
|
129
|
+
if (expected.directed !== actual.directed) {
|
|
130
|
+
diff("directed", expected.directed, actual.directed);
|
|
131
|
+
}
|
|
132
|
+
if (expected.nodeCount !== actual.nodeCount) {
|
|
133
|
+
diff("nodeCount", expected.nodeCount, actual.nodeCount);
|
|
134
|
+
}
|
|
135
|
+
if (expected.edgeCount !== actual.edgeCount) {
|
|
136
|
+
diff("edgeCount", expected.edgeCount, actual.edgeCount);
|
|
137
|
+
}
|
|
138
|
+
compareIds(expected, actual, diff);
|
|
139
|
+
if (expected.nodeCount !== actual.nodeCount || expected.edgeCount !== actual.edgeCount) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
compareTopology(expected, actual, diff);
|
|
143
|
+
compareWeights(expected, actual, ctx);
|
|
144
|
+
compareTables("nodes", expected.nodes, actual.nodes, ctx);
|
|
145
|
+
compareTables("edges", expected.edges, actual.edges, ctx);
|
|
146
|
+
compareTables("graph", expected.graph, actual.graph, ctx);
|
|
147
|
+
if (ctx.options.extensions !== false) {
|
|
148
|
+
compareExtensions(expected, actual, ctx);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Compare the node ids in index order.
|
|
154
|
+
* @param expected - the reference
|
|
155
|
+
* @param actual - the snapshot under test
|
|
156
|
+
* @param diff - the recorder
|
|
157
|
+
*/
|
|
158
|
+
function compareIds(expected: GraphSnapshot, actual: GraphSnapshot, diff: CompareContext["diff"]): void {
|
|
159
|
+
const expectedIds = expected.ids.toArray();
|
|
160
|
+
const actualIds = actual.ids.toArray();
|
|
161
|
+
const n = Math.min(expectedIds.length, actualIds.length);
|
|
162
|
+
for (let i = 0; i < n; i++) {
|
|
163
|
+
if (!Object.is(expectedIds[i], actualIds[i])) {
|
|
164
|
+
diff(`ids[${i}]`, expectedIds[i], actualIds[i]);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Compare the topology: the CSR arrays (identical when node order and edge order survived), then the
|
|
171
|
+
* orientation of every logical edge.
|
|
172
|
+
* @param expected - the reference
|
|
173
|
+
* @param actual - the snapshot under test, with as many nodes and edges
|
|
174
|
+
* @param diff - the recorder
|
|
175
|
+
*/
|
|
176
|
+
function compareTopology(expected: GraphSnapshot, actual: GraphSnapshot, diff: CompareContext["diff"]): void {
|
|
177
|
+
if (!typedEqual(expected.rowPtr, actual.rowPtr)) {
|
|
178
|
+
diff("rowPtr", expected.rowPtr, actual.rowPtr, "rowPtr differs");
|
|
179
|
+
}
|
|
180
|
+
if (!typedEqual(expected.colIdx, actual.colIdx)) {
|
|
181
|
+
diff("colIdx", expected.colIdx, actual.colIdx, "colIdx differs");
|
|
182
|
+
}
|
|
183
|
+
const el = expected.edgeList();
|
|
184
|
+
const al = actual.edgeList();
|
|
185
|
+
for (let e = 0; e < expected.edgeCount; e++) {
|
|
186
|
+
if (el.src[e] !== al.src[e] || el.dst[e] !== al.dst[e]) {
|
|
187
|
+
diff(`edge[${e}]`, `${el.src[e]}->${el.dst[e]}`, `${al.src[e]}->${al.dst[e]}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Compare the weights of two snapshots: the exact weight column when both have one, the 32-bit
|
|
194
|
+
* weights otherwise.
|
|
195
|
+
* @param expected - the reference
|
|
196
|
+
* @param actual - the snapshot under test
|
|
197
|
+
* @param ctx - the comparison context
|
|
198
|
+
*/
|
|
199
|
+
function compareWeights(expected: GraphSnapshot, actual: GraphSnapshot, ctx: CompareContext): void {
|
|
200
|
+
if (expected.flags.weighted !== actual.flags.weighted) {
|
|
201
|
+
ctx.diff("flags.weighted", expected.flags.weighted, actual.flags.weighted);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (!expected.flags.weighted) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const eShadow = expected.edges.byRole("weight");
|
|
208
|
+
const aShadow = actual.edges.byRole("weight");
|
|
209
|
+
if (eShadow !== null && aShadow !== null) {
|
|
210
|
+
compareExactWeights(expected.edgeCount, eShadow, aShadow, ctx);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (ctx.options.weightExplicitness !== false && (eShadow === null) !== (aShadow === null)) {
|
|
214
|
+
ctx.diff(
|
|
215
|
+
"weightColumn",
|
|
216
|
+
eShadow !== null,
|
|
217
|
+
aShadow !== null,
|
|
218
|
+
"one snapshot has a role-weight column, the other does not",
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
const ew = expected.edgeList().weights;
|
|
222
|
+
const aw = actual.edgeList().weights;
|
|
223
|
+
for (let e = 0; e < expected.edgeCount; e++) {
|
|
224
|
+
const ev = ew === null ? 1 : ew[e];
|
|
225
|
+
const av = aw === null ? 1 : aw[e];
|
|
226
|
+
if (!ctx.same(ev, av)) {
|
|
227
|
+
ctx.diff(`weight[${e}]`, ev, av);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Compare the exact weight columns of two snapshots: which edges have an explicit weight, and its value.
|
|
234
|
+
* @param edgeCount - the number of edges
|
|
235
|
+
* @param expected - the reference's weight column
|
|
236
|
+
* @param actual - the weight column under test
|
|
237
|
+
* @param ctx - the comparison context
|
|
238
|
+
*/
|
|
239
|
+
function compareExactWeights(edgeCount: number, expected: Column, actual: Column, ctx: CompareContext): void {
|
|
240
|
+
for (let e = 0; e < edgeCount; e++) {
|
|
241
|
+
const eSet = expected.isSet(e);
|
|
242
|
+
const aSet = actual.isSet(e);
|
|
243
|
+
if (ctx.options.weightExplicitness !== false && eSet !== aSet) {
|
|
244
|
+
ctx.diff(`weightExplicit[${e}]`, eSet, aSet);
|
|
245
|
+
} else if (eSet && aSet && !ctx.same(expected.value(e), actual.value(e))) {
|
|
246
|
+
ctx.diff(`weight[${e}]`, expected.value(e), actual.value(e));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Compare the extension tables: which exist, their row counts and their columns.
|
|
253
|
+
* @param expected - the reference
|
|
254
|
+
* @param actual - the snapshot under test
|
|
255
|
+
* @param ctx - the comparison context
|
|
256
|
+
*/
|
|
257
|
+
function compareExtensions(expected: GraphSnapshot, actual: GraphSnapshot, ctx: CompareContext): void {
|
|
258
|
+
for (const [name, table] of expected.extensions) {
|
|
259
|
+
const other = actual.extensions.get(name);
|
|
260
|
+
if (other === undefined) {
|
|
261
|
+
ctx.diff(`extensions.${name}`, "present", "absent");
|
|
262
|
+
} else if (table.rowCount === other.rowCount) {
|
|
263
|
+
compareTables(`extensions.${name}`, table, other, ctx);
|
|
264
|
+
} else {
|
|
265
|
+
ctx.diff(`extensions.${name}.rowCount`, table.rowCount, other.rowCount);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (ctx.options.allowExtraColumns === false) {
|
|
269
|
+
for (const name of actual.extensions.keys()) {
|
|
270
|
+
if (!expected.extensions.has(name)) {
|
|
271
|
+
ctx.diff(`extensions.${name}`, "absent", "present");
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Compare the columns of one table.
|
|
279
|
+
* @param label - the table name for paths
|
|
280
|
+
* @param expected - the reference table
|
|
281
|
+
* @param actual - the table under test
|
|
282
|
+
* @param ctx - the comparison context
|
|
283
|
+
*/
|
|
284
|
+
function compareTables(label: string, expected: TableLike, actual: TableLike, ctx: CompareContext): void {
|
|
285
|
+
const ignoreNames = new Set(ctx.options.ignoreColumns ?? []);
|
|
286
|
+
const ignoreRoles = new Set(ctx.options.ignoreRoles ?? []);
|
|
287
|
+
// the role-weight shadow column is compared by the weights step, not as a declared column
|
|
288
|
+
const skip = (column: Column): boolean => {
|
|
289
|
+
const { name, role } = column.meta;
|
|
290
|
+
return (
|
|
291
|
+
ignoreNames.has(name) ||
|
|
292
|
+
(role !== null && (ignoreRoles.has(role) || (label === "edges" && role === "weight")))
|
|
293
|
+
);
|
|
294
|
+
};
|
|
295
|
+
for (const column of expected) {
|
|
296
|
+
if (skip(column)) {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
const path = `${label}.${column.meta.name}`;
|
|
300
|
+
const other = actual.get(column.meta.name);
|
|
301
|
+
if (other === null) {
|
|
302
|
+
ctx.diff(path, "present", "absent", `${path}: column missing after round trip`);
|
|
303
|
+
} else {
|
|
304
|
+
compareColumn(path, column, other, ctx);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (ctx.options.allowExtraColumns === false) {
|
|
308
|
+
for (const column of actual) {
|
|
309
|
+
if (!skip(column) && expected.get(column.meta.name) === null) {
|
|
310
|
+
const path = `${label}.${column.meta.name}`;
|
|
311
|
+
ctx.diff(path, "absent", "present", `${path}: extra column after round trip`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Compare one column: its declaration, then every cell.
|
|
319
|
+
* @param path - the column's path for messages
|
|
320
|
+
* @param column - the reference column
|
|
321
|
+
* @param other - the column under test
|
|
322
|
+
* @param ctx - the comparison context
|
|
323
|
+
*/
|
|
324
|
+
function compareColumn(path: string, column: Column, other: Column, ctx: CompareContext): void {
|
|
325
|
+
compareDeclaration(path, column, other, ctx);
|
|
326
|
+
if (column.length !== other.length) {
|
|
327
|
+
ctx.diff(`${path}.length`, column.length, other.length);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
for (let r = 0; r < column.length; r++) {
|
|
331
|
+
const eSet = column.isSet(r);
|
|
332
|
+
const aSet = other.isSet(r);
|
|
333
|
+
if (eSet !== aSet) {
|
|
334
|
+
ctx.diff(`${path}[${r}]`, eSet ? column.value(r) : undefined, aSet ? other.value(r) : undefined);
|
|
335
|
+
} else if (eSet) {
|
|
336
|
+
const ev = cellValue(column, r);
|
|
337
|
+
const av = cellValue(other, r);
|
|
338
|
+
if (!ctx.same(ev, av)) {
|
|
339
|
+
ctx.diff(`${path}[${r}]`, ev, av);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Compare what two columns declare: dtype, item dtype, components, role and origin type, as the
|
|
347
|
+
* options ask.
|
|
348
|
+
* @param path - the column's path for messages
|
|
349
|
+
* @param column - the reference column
|
|
350
|
+
* @param other - the column under test
|
|
351
|
+
* @param ctx - the comparison context
|
|
352
|
+
*/
|
|
353
|
+
function compareDeclaration(path: string, column: Column, other: Column, ctx: CompareContext): void {
|
|
354
|
+
const { options, diff } = ctx;
|
|
355
|
+
const e = column.meta;
|
|
356
|
+
const a = other.meta;
|
|
357
|
+
if (options.dtypes !== false) {
|
|
358
|
+
for (const key of ["dtype", "itemDtype", "components"] as const) {
|
|
359
|
+
if (e[key] !== a[key]) {
|
|
360
|
+
diff(`${path}.${key}`, e[key], a[key]);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (options.roles !== false && e.role !== a.role) {
|
|
365
|
+
diff(`${path}.role`, e.role, a.role);
|
|
366
|
+
}
|
|
367
|
+
const eType = e.origin?.type ?? null;
|
|
368
|
+
const aType = a.origin?.type ?? null;
|
|
369
|
+
if (options.originType === true && eType !== aType) {
|
|
370
|
+
diff(`${path}.origin.type`, eType, aType);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* The comparable value of a set cell: list rows through sliceOf, json rows through values, the
|
|
376
|
+
* typed accessor otherwise (a components > 1 subarray becomes a plain array).
|
|
377
|
+
* @param column - the column
|
|
378
|
+
* @param row - the row
|
|
379
|
+
* @returns the value
|
|
380
|
+
*/
|
|
381
|
+
function cellValue(column: Column, row: number): unknown {
|
|
382
|
+
switch (column.dtype) {
|
|
383
|
+
case "list":
|
|
384
|
+
return [...column.sliceOf(row)];
|
|
385
|
+
case "json":
|
|
386
|
+
return column.values[row];
|
|
387
|
+
default: {
|
|
388
|
+
const value = column.value(row);
|
|
389
|
+
return ArrayBuffer.isView(value) ? Array.from(value as ArrayLike<number>) : value;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Deep equality with a numeric tolerance (for the tests).
|
|
396
|
+
* @param e - expected
|
|
397
|
+
* @param a - actual
|
|
398
|
+
* @param tolerance - absolute tolerance for numbers
|
|
399
|
+
* @returns true when equal
|
|
400
|
+
*/
|
|
401
|
+
export function valuesEqual(e: unknown, a: unknown, tolerance: number): boolean {
|
|
402
|
+
if (typeof e === "number" && typeof a === "number") {
|
|
403
|
+
if (Object.is(e, a)) {
|
|
404
|
+
return true;
|
|
405
|
+
}
|
|
406
|
+
return Number.isFinite(e) && Number.isFinite(a) && Math.abs(e - a) <= tolerance;
|
|
407
|
+
}
|
|
408
|
+
if (Array.isArray(e) || ArrayBuffer.isView(e)) {
|
|
409
|
+
const ea = Array.from(e as ArrayLike<unknown>);
|
|
410
|
+
if (!(Array.isArray(a) || ArrayBuffer.isView(a))) {
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
const aa = Array.from(a as ArrayLike<unknown>);
|
|
414
|
+
return ea.length === aa.length && ea.every((v, i) => valuesEqual(v, aa[i], tolerance));
|
|
415
|
+
}
|
|
416
|
+
if (typeof e === "object" && e !== null && typeof a === "object" && a !== null) {
|
|
417
|
+
const eo = e as Record<string, unknown>;
|
|
418
|
+
const ao = a as Record<string, unknown>;
|
|
419
|
+
const keys = Object.keys(eo);
|
|
420
|
+
if (keys.length !== Object.keys(ao).length) {
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
return keys.every((k) => Object.hasOwn(ao, k) && valuesEqual(eo[k], ao[k], tolerance));
|
|
424
|
+
}
|
|
425
|
+
return Object.is(e, a);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Element-wise equality of two typed arrays.
|
|
430
|
+
* @param a - one array
|
|
431
|
+
* @param b - the other
|
|
432
|
+
* @returns true when same length and contents
|
|
433
|
+
*/
|
|
434
|
+
function typedEqual(a: ArrayLike<number>, b: ArrayLike<number>): boolean {
|
|
435
|
+
if (a.length !== b.length) {
|
|
436
|
+
return false;
|
|
437
|
+
}
|
|
438
|
+
for (let i = 0; i < a.length; i++) {
|
|
439
|
+
if (a[i] !== b[i]) {
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* A short text of a value for messages.
|
|
448
|
+
* @param v - the value
|
|
449
|
+
* @returns JSON when possible, else String()
|
|
450
|
+
*/
|
|
451
|
+
function show(v: unknown): string {
|
|
452
|
+
if (ArrayBuffer.isView(v)) {
|
|
453
|
+
const items = Array.from(v as unknown as ArrayLike<number>);
|
|
454
|
+
return `[${items.slice(0, 8).join(", ")}${items.length > 8 ? ", ..." : ""}]`;
|
|
455
|
+
}
|
|
456
|
+
try {
|
|
457
|
+
const text = JSON.stringify(v);
|
|
458
|
+
return text ?? String(v);
|
|
459
|
+
} catch {
|
|
460
|
+
return String(v);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* The differences compareSnapshots() found, one per line, for printing.
|
|
466
|
+
* @param diffs - the differences
|
|
467
|
+
* @returns one line per difference, "no differences" when empty
|
|
468
|
+
* @category Plugin helpers
|
|
469
|
+
*/
|
|
470
|
+
export function describeDiffs(diffs: readonly SnapshotDiff[]): string {
|
|
471
|
+
return diffs.length === 0 ? "no differences" : diffs.map((d) => ` - ${d.message}`).join("\n");
|
|
472
|
+
}
|