@graphty/graph-io 0.3.25 → 0.3.27
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-DrXtu_96.js +56 -0
- package/dist/chunks/choose-DrXtu_96.js.map +1 -0
- package/dist/chunks/constants-ikG85dT8.js +231 -0
- package/dist/chunks/constants-ikG85dT8.js.map +1 -0
- package/dist/chunks/{escape-B-tkk_Cl.js → escape-D1HPTUrP.js} +390 -99
- package/dist/chunks/escape-D1HPTUrP.js.map +1 -0
- package/dist/chunks/export-CHd4tQE2.js +4333 -0
- package/dist/chunks/export-CHd4tQE2.js.map +1 -0
- package/dist/chunks/{importer-eUREhBGj.js → exporter-D23CKNqF.js} +4969 -3201
- package/dist/chunks/exporter-D23CKNqF.js.map +1 -0
- package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-DfWTgrti.js} +23 -21
- package/dist/chunks/exporter-DfWTgrti.js.map +1 -0
- package/dist/chunks/exporter-DhtW6FxK.js +3465 -0
- package/dist/chunks/exporter-DhtW6FxK.js.map +1 -0
- package/dist/chunks/{exporter-BGrsWamJ.js → exporter-IHv4nkCm.js} +38 -229
- package/dist/chunks/exporter-IHv4nkCm.js.map +1 -0
- package/dist/chunks/{importer-BWY2FFc5.js → importer-B1wmPQjr.js} +255 -77
- package/dist/chunks/importer-B1wmPQjr.js.map +1 -0
- package/dist/chunks/{importer-D_e7e7LX.js → importer-B2W_58pz.js} +399 -146
- package/dist/chunks/importer-B2W_58pz.js.map +1 -0
- package/dist/chunks/importer-BSALvkui.js +2811 -0
- package/dist/chunks/importer-BSALvkui.js.map +1 -0
- package/dist/chunks/{importer-vi3bSdtw.js → importer-BVRE--Un.js} +510 -77
- package/dist/chunks/importer-BVRE--Un.js.map +1 -0
- package/dist/chunks/{importer-DET1tg6s.js → importer-CIAzt-wo.js} +1689 -312
- package/dist/chunks/importer-CIAzt-wo.js.map +1 -0
- package/dist/chunks/{importer-DIrbbnAf.js → importer-DpEW5zeG.js} +585 -226
- package/dist/chunks/importer-DpEW5zeG.js.map +1 -0
- package/dist/chunks/{importer-zGLo8Dg_.js → importer-z_FL4VMb.js} +488 -161
- package/dist/chunks/importer-z_FL4VMb.js.map +1 -0
- package/dist/chunks/json-elements-BAmNBZok.js +1225 -0
- package/dist/chunks/json-elements-BAmNBZok.js.map +1 -0
- package/dist/chunks/ontology-export-Bab4eUA8.js +357 -0
- package/dist/chunks/ontology-export-Bab4eUA8.js.map +1 -0
- package/dist/chunks/{records-dbRkxwaq.js → records-CdlvL4RO.js} +298 -114
- package/dist/chunks/records-CdlvL4RO.js.map +1 -0
- package/dist/chunks/{text-Dr0Ifpag.js → text-DzXjAiTl.js} +29 -11
- package/dist/chunks/text-DzXjAiTl.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 +952 -262
- 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 +344 -87
- 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 +565 -158
- 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 +21 -3
- 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 +39 -22
- 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 +869 -189
- 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 +3 -1
- 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 +402 -85
- 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 +146 -33
- 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 +682 -287
- 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 +227 -80
- 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 +101 -27
- 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 +110 -28
- 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 +239 -86
- 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 +67 -35
- 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 +186 -54
- 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 +21 -22
- 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 +8 -3
- 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 +40 -6
- package/src/common/direction.ts +78 -51
- package/src/common/escape.ts +39 -22
- 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 +1035 -199
- package/src/common/line-format.ts +249 -0
- package/src/common/lists.ts +7 -2
- 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 +479 -90
- package/src/common/zip.ts +169 -7
- package/src/formats/csv/exporter.ts +202 -47
- 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 +890 -302
- package/src/formats/cx/index.ts +4 -3
- package/src/formats/cx2/exporter.ts +62 -339
- package/src/formats/cx2/importer.ts +318 -87
- 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 +142 -34
- 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 +113 -28
- 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 +321 -102
- 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 +90 -42
- package/src/formats/pajek/importer.ts +407 -93
- package/src/formats/pajek/index.ts +2 -1
- package/src/formats/pajek/syntax.ts +216 -55
- 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 +36 -28
- package/src/formats/xgmml/importer.ts +64 -86
- package/src/formats/xgmml/index.ts +1 -0
- package/src/formats/xgmml/values.ts +12 -4
- 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/formats/cx/index.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The `@graphty/graph-io/cx` subpath
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* The `@graphty/graph-io/cx` subpath: the CX version 1 importer and exporter with their option
|
|
3
|
+
* types and code tables.
|
|
4
|
+
* @module @graphty/graph-io/cx
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
export { CX_CAPABILITIES, CX_LOSS, cxExporter, type CxExportOptions } from "./exporter.js";
|
|
7
8
|
export { CX_ISSUE, cxImporter, type CxImportOptions } from "./importer.js";
|
|
@@ -13,26 +13,44 @@
|
|
|
13
13
|
* the infinities as null (W_CX2_NONFINITE_AS_NULL), and the generic notes of checkCapabilities().
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import { type Column, GraphFormatError, type GraphSnapshot
|
|
17
|
-
|
|
16
|
+
import { type Column, GraphFormatError, type GraphSnapshot } from "@graphty/graph-format";
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
aspectBlock,
|
|
20
|
+
declaredType,
|
|
21
|
+
directionNotes,
|
|
22
|
+
nonFinitePositions,
|
|
23
|
+
planEdgeIds,
|
|
24
|
+
planNodeIds,
|
|
25
|
+
stringify,
|
|
26
|
+
type WrittenIds,
|
|
27
|
+
} from "../../common/cx-export.js";
|
|
18
28
|
import { type PairFolding, pairFolding } from "../../common/direction.js";
|
|
19
29
|
import { capabilities, checkCapabilities, LOSS } from "../../common/export.js";
|
|
20
30
|
import { isRecord, POSITION_COLUMN } from "../../common/json-elements.js";
|
|
21
31
|
import { type ResolvedExportOptions, resolveExportOptions } from "../../common/options.js";
|
|
32
|
+
import { plural } from "../../common/plural.js";
|
|
22
33
|
import { type ExplicitWeights, explicitWeights } from "../../common/weights.js";
|
|
23
34
|
import { encodeChunks, joinText } from "../../common/writer.js";
|
|
24
35
|
import { type CommonExportOptions, type ExportCapabilities, type GraphExporter, type LossNote } from "../../types.js";
|
|
25
36
|
import { BYPASS_NAMESPACE, CX2_FORMAT, cx2Type, ORIGINAL_ID_ATTRIBUTE } from "./importer.js";
|
|
26
37
|
|
|
27
|
-
/**
|
|
28
|
-
export
|
|
38
|
+
/**
|
|
39
|
+
* The options of the CX2 exporter: the common export options; it has none of its own.
|
|
40
|
+
* @category Built-in formats
|
|
41
|
+
*/
|
|
42
|
+
export type Cx2ExportOptions = CommonExportOptions;
|
|
29
43
|
|
|
30
44
|
/**
|
|
31
|
-
* The loss notes the CX2 exporter's check() returns
|
|
45
|
+
* The loss notes the CX2 exporter's check() returns, by name. A key is the
|
|
32
46
|
* code without its severity and format prefixes.
|
|
47
|
+
* @category Built-in formats
|
|
33
48
|
*/
|
|
34
49
|
export const CX2_LOSS = Object.freeze({
|
|
35
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* Every edge is written as directed, so an undirected graph, or the undirected edges of a mixed graph, read back
|
|
52
|
+
* as directed.
|
|
53
|
+
*/
|
|
36
54
|
UNDIRECTED_AS_DIRECTED: "W_CX2_UNDIRECTED_AS_DIRECTED",
|
|
37
55
|
/** A nested (json) column is written as a string attribute holding its JSON text. */
|
|
38
56
|
JSON_AS_STRING: "W_CX2_JSON_AS_STRING",
|
|
@@ -40,17 +58,26 @@ export const CX2_LOSS = Object.freeze({
|
|
|
40
58
|
NONFINITE_AS_NULL: "W_CX2_NONFINITE_AS_NULL",
|
|
41
59
|
/** A mutual pair is written as two directed edges without its mark. */
|
|
42
60
|
MUTUAL_EXPANDED: LOSS.MUTUAL_EXPANDED,
|
|
43
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* An attribute without the weight role is named like the key weights are written under; it reads back as the edge
|
|
63
|
+
* weight, or is not written when the graph has weights of its own.
|
|
64
|
+
*/
|
|
44
65
|
WEIGHT_KEY_CLASH: LOSS.WEIGHT_KEY_CLASH,
|
|
45
66
|
/** A parent / parents column: CX2 has no containment. */
|
|
46
67
|
HIERARCHY_DROPPED: LOSS.HIERARCHY,
|
|
47
68
|
/** A start / end / timestamp column: CX2 has no time. */
|
|
48
69
|
TEMPORAL_DROPPED: LOSS.TEMPORAL,
|
|
49
|
-
/**
|
|
70
|
+
/** An attribute with a role the format has no place for is written as a plain attribute; the role is lost. */
|
|
50
71
|
ROLE_DROPPED: LOSS.ROLE,
|
|
51
|
-
/**
|
|
72
|
+
/**
|
|
73
|
+
* An attribute type CX2 stores as another (a 32-bit float as double, an unsigned integer as long, a dictionary as
|
|
74
|
+
* string); it reads back with that type.
|
|
75
|
+
*/
|
|
52
76
|
DTYPE_UNSUPPORTED: LOSS.DTYPE,
|
|
53
|
-
/**
|
|
77
|
+
/**
|
|
78
|
+
* Node ids the format cannot write, under `sanitizeIds: "error"`; the save fails with E_INVALID_ID. Pass
|
|
79
|
+
* `sanitizeIds: "mangle"` to rewrite them.
|
|
80
|
+
*/
|
|
54
81
|
ID_CHARSET: LOSS.ID_CHARSET,
|
|
55
82
|
/** Node ids that are not integers under sanitizeIds "mangle": renumbered, originals kept. */
|
|
56
83
|
ID_MANGLED: LOSS.ID_MANGLED,
|
|
@@ -59,10 +86,11 @@ export const CX2_LOSS = Object.freeze({
|
|
|
59
86
|
});
|
|
60
87
|
|
|
61
88
|
/**
|
|
62
|
-
* What CX2 keeps
|
|
89
|
+
* What CX2 keeps: directed multigraphs with self-loops, integer node ids,
|
|
63
90
|
* required integer edge ids, declared string / double / integer / boolean columns and lists of
|
|
64
91
|
* them, declared defaults, network attributes and the position role. f32, u32, u8 and dict columns
|
|
65
92
|
* are written as the nearest declared type and read back as it.
|
|
93
|
+
* @category Built-in formats
|
|
66
94
|
*/
|
|
67
95
|
export const CX2_CAPABILITIES: ExportCapabilities = capabilities({
|
|
68
96
|
mixedDirection: false,
|
|
@@ -129,104 +157,6 @@ const CORE_ASPECTS: ReadonlySet<string> = new Set([
|
|
|
129
157
|
/** The weight attribute name. */
|
|
130
158
|
const WEIGHT_ATTRIBUTE = "weight";
|
|
131
159
|
|
|
132
|
-
/**
|
|
133
|
-
* The prefix of a string that stands for a raw number literal in the output: -0 (which
|
|
134
|
-
* JSON.stringify writes as 0) and an integer id beyond 2^53 (kept as its digits).
|
|
135
|
-
*/
|
|
136
|
-
const RAW = `${String.fromCharCode(0)}cx2:`;
|
|
137
|
-
|
|
138
|
-
/** A raw literal as JSON.stringify writes it, to be unquoted. */
|
|
139
|
-
const RAW_JSON = /"\\u0000cx2:(-?[0-9]+)"/g;
|
|
140
|
-
|
|
141
|
-
/** An integer literal beyond 2^53 as text: a CX2 id graph-io keeps as its digits. */
|
|
142
|
-
const BIG_INTEGER_TEXT = /^-?[1-9][0-9]{15,}$/;
|
|
143
|
-
|
|
144
|
-
/** The node ids as written: the original, a renumbered one, or a raw big integer. */
|
|
145
|
-
interface WrittenIds {
|
|
146
|
-
/** How many ids were renumbered (sanitizeIds "mangle"). */
|
|
147
|
-
readonly changed: number;
|
|
148
|
-
/** The written id of node i (a number, or a RAW string for a big integer). */
|
|
149
|
-
idAt(i: number): NodeId;
|
|
150
|
-
/** Whether node i was renumbered. */
|
|
151
|
-
isChanged(i: number): boolean;
|
|
152
|
-
/** The original id of node i. */
|
|
153
|
-
originalAt(i: number): NodeId;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Whether an id can be written as a CX2 id unchanged: a safe integer, or the digits of an integer
|
|
158
|
-
* beyond 2^53 (the CX2 importer reads those back as the same digits).
|
|
159
|
-
* @param id - the id
|
|
160
|
-
* @returns true when writable
|
|
161
|
-
*/
|
|
162
|
-
function writableId(id: NodeId): boolean {
|
|
163
|
-
return typeof id === "number"
|
|
164
|
-
? Number.isSafeInteger(id)
|
|
165
|
-
: BIG_INTEGER_TEXT.test(id) && !Number.isSafeInteger(Number(id));
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* The written node ids; under "error" an id that is not writable throws E_INVALID_ID, under
|
|
170
|
-
* "mangle" it gets the next unused integer.
|
|
171
|
-
* @param snapshot - the snapshot
|
|
172
|
-
* @param mode - the sanitizeIds option
|
|
173
|
-
* @returns the ids
|
|
174
|
-
*/
|
|
175
|
-
function writtenIds(snapshot: GraphSnapshot, mode: "error" | "mangle"): WrittenIds {
|
|
176
|
-
const { ids } = snapshot;
|
|
177
|
-
const bad: number[] = [];
|
|
178
|
-
const used = new Set<number>();
|
|
179
|
-
for (let i = 0; i < ids.size; i++) {
|
|
180
|
-
const id = ids.idOf(i);
|
|
181
|
-
if (!writableId(id)) {
|
|
182
|
-
bad.push(i);
|
|
183
|
-
} else if (typeof id === "number") {
|
|
184
|
-
used.add(id);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
if (bad.length > 0 && mode === "error") {
|
|
188
|
-
const first = ids.idOf(bad[0]);
|
|
189
|
-
throw new GraphFormatError(
|
|
190
|
-
"E_INVALID_ID",
|
|
191
|
-
`${bad.length} node id(s) cannot be written as CX2 integers (first: ${JSON.stringify(first)} at index ${bad[0]}); pass sanitizeIds: "mangle" to rewrite them`,
|
|
192
|
-
{ reason: "charset", charset: "integer", count: bad.length, index: bad[0] },
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
const renumbered = new Map<number, number>();
|
|
196
|
-
let next = 0;
|
|
197
|
-
for (const i of bad) {
|
|
198
|
-
while (used.has(next)) {
|
|
199
|
-
next++;
|
|
200
|
-
}
|
|
201
|
-
used.add(next);
|
|
202
|
-
renumbered.set(i, next);
|
|
203
|
-
}
|
|
204
|
-
return {
|
|
205
|
-
changed: bad.length,
|
|
206
|
-
idAt: (i: number): NodeId => {
|
|
207
|
-
const id = renumbered.get(i) ?? ids.idOf(i);
|
|
208
|
-
return typeof id === "string" ? `${RAW}${id}` : id;
|
|
209
|
-
},
|
|
210
|
-
isChanged: (i: number): boolean => renumbered.has(i),
|
|
211
|
-
originalAt: (i: number): NodeId => ids.idOf(i),
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* How many node ids are not writable unchanged.
|
|
217
|
-
* @param snapshot - the snapshot
|
|
218
|
-
* @returns the count
|
|
219
|
-
*/
|
|
220
|
-
function unwritableIds(snapshot: GraphSnapshot): number {
|
|
221
|
-
let count = 0;
|
|
222
|
-
for (let i = 0; i < snapshot.ids.size; i++) {
|
|
223
|
-
if (!writableId(snapshot.ids.idOf(i))) {
|
|
224
|
-
count++;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
return count;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
160
|
/** One attribute column as it will be written. */
|
|
231
161
|
interface AttributePlan {
|
|
232
162
|
readonly column: Column;
|
|
@@ -277,62 +207,6 @@ function isZ(column: Column): boolean {
|
|
|
277
207
|
return column.meta.extra.cytoscape === "z";
|
|
278
208
|
}
|
|
279
209
|
|
|
280
|
-
/**
|
|
281
|
-
* The CX2 type of a scalar dtype.
|
|
282
|
-
* @param dtype - the dtype
|
|
283
|
-
* @param longOrigin - whether the source declared the column long
|
|
284
|
-
* @returns the type text
|
|
285
|
-
*/
|
|
286
|
-
function scalarType(dtype: string, longOrigin: boolean): string {
|
|
287
|
-
switch (dtype) {
|
|
288
|
-
case "f64":
|
|
289
|
-
return longOrigin ? "long" : "double";
|
|
290
|
-
case "f32":
|
|
291
|
-
return "double";
|
|
292
|
-
case "i32":
|
|
293
|
-
case "u8":
|
|
294
|
-
return "integer";
|
|
295
|
-
case "u32":
|
|
296
|
-
return "long";
|
|
297
|
-
case "bool":
|
|
298
|
-
return "boolean";
|
|
299
|
-
default:
|
|
300
|
-
return "string";
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Whether every set value of an f64 column is integral (so a declared long stays long).
|
|
306
|
-
* @param column - the column
|
|
307
|
-
* @returns true when every set value is a safe integer
|
|
308
|
-
*/
|
|
309
|
-
function allIntegral(column: Column): boolean {
|
|
310
|
-
for (let i = 0; i < column.length; i++) {
|
|
311
|
-
if (column.isSet(i) && !Number.isSafeInteger(column.value(i))) {
|
|
312
|
-
return false;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
return true;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* The declared type of a column.
|
|
320
|
-
* @param column - the column
|
|
321
|
-
* @returns the CX2 type text
|
|
322
|
-
*/
|
|
323
|
-
function declaredType(column: Column): string {
|
|
324
|
-
const { meta } = column;
|
|
325
|
-
const origin = meta.origin?.type ?? null;
|
|
326
|
-
const longOrigin = origin !== null && /long$/.test(origin) && (meta.dtype !== "f64" || allIntegral(column));
|
|
327
|
-
if (meta.dtype === "list") {
|
|
328
|
-
return meta.itemDtype === null || meta.itemDtype === "json"
|
|
329
|
-
? "string"
|
|
330
|
-
: `list_of_${scalarType(meta.itemDtype, longOrigin)}`;
|
|
331
|
-
}
|
|
332
|
-
// a multi-component column (a color, a 3D vector) is written as a list of its components
|
|
333
|
-
return meta.components > 1 ? `list_of_${scalarType(meta.dtype, false)}` : scalarType(meta.dtype, longOrigin);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
210
|
/**
|
|
337
211
|
* Count the non-finite numbers of a column.
|
|
338
212
|
* @param column - the column
|
|
@@ -355,7 +229,7 @@ function nonFiniteCount(column: Column): number {
|
|
|
355
229
|
if ((value as readonly number[]).some((v) => !Number.isFinite(v))) {
|
|
356
230
|
count++;
|
|
357
231
|
}
|
|
358
|
-
} else if (!Number.isFinite(value
|
|
232
|
+
} else if (!Number.isFinite(value)) {
|
|
359
233
|
count++;
|
|
360
234
|
}
|
|
361
235
|
}
|
|
@@ -439,27 +313,12 @@ function plan(snapshot: GraphSnapshot, common: ResolvedExportOptions): Plan {
|
|
|
439
313
|
}
|
|
440
314
|
|
|
441
315
|
const folding = pairFolding(snapshot);
|
|
442
|
-
directionNotes(snapshot, folding, common, note);
|
|
316
|
+
directionNotes(snapshot, folding, common, CX2_LOSS.UNDIRECTED_AS_DIRECTED, note);
|
|
443
317
|
|
|
444
|
-
const
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
common.sanitizeIds === "mangle"
|
|
449
|
-
? `${unwritable} node id(s) that are not integers are renumbered; the originals are kept in the ${ORIGINAL_ID_ATTRIBUTE} attribute (restored by restoreMangledIds)`
|
|
450
|
-
: `${unwritable} node id(s) that are not integers; export() will throw unless sanitizeIds is "mangle"`,
|
|
451
|
-
null,
|
|
452
|
-
unwritable,
|
|
453
|
-
);
|
|
454
|
-
}
|
|
455
|
-
let ids: WrittenIds | null = null;
|
|
456
|
-
try {
|
|
457
|
-
ids = writtenIds(snapshot, common.sanitizeIds);
|
|
458
|
-
} catch (err) {
|
|
459
|
-
if (!(err instanceof GraphFormatError)) {
|
|
460
|
-
throw err;
|
|
461
|
-
}
|
|
462
|
-
fatal ??= err;
|
|
318
|
+
const planned = planNodeIds(snapshot, common, "CX2", ORIGINAL_ID_ATTRIBUTE, note);
|
|
319
|
+
const ids = planned instanceof GraphFormatError ? null : planned;
|
|
320
|
+
if (planned instanceof GraphFormatError) {
|
|
321
|
+
fatal ??= planned;
|
|
463
322
|
}
|
|
464
323
|
|
|
465
324
|
const weights = explicitWeights(snapshot);
|
|
@@ -513,22 +372,13 @@ function plan(snapshot: GraphSnapshot, common: ResolvedExportOptions): Plan {
|
|
|
513
372
|
if (nonfinite > 0) {
|
|
514
373
|
note(
|
|
515
374
|
CX2_LOSS.NONFINITE_AS_NULL,
|
|
516
|
-
`${nonfinite} NaN or infinite value(
|
|
375
|
+
`${nonfinite} NaN or infinite value${plural(nonfinite)} cannot be written in CX2; written as null, they read back unset`,
|
|
517
376
|
null,
|
|
518
377
|
nonfinite,
|
|
519
378
|
);
|
|
520
379
|
}
|
|
521
380
|
|
|
522
381
|
const edgeIds = planEdgeIds(snapshot, note);
|
|
523
|
-
const idColumn = snapshot.edges.byRole("id");
|
|
524
|
-
if (idColumn !== null && idColumn.dtype !== "f64") {
|
|
525
|
-
note(
|
|
526
|
-
LOSS.DTYPE,
|
|
527
|
-
`edge id column "${idColumn.meta.name}" is ${idColumn.dtype}; CX2 edge ids are integers and read back as f64`,
|
|
528
|
-
idColumn.meta.name,
|
|
529
|
-
snapshot.edgeCount - idColumn.nullCount,
|
|
530
|
-
);
|
|
531
|
-
}
|
|
532
382
|
const z = [...snapshot.nodes].find(isZ) ?? null;
|
|
533
383
|
const positionZ = position !== null && z === null && position.meta.extra.sourceDims === 3;
|
|
534
384
|
return {
|
|
@@ -550,139 +400,8 @@ function plan(snapshot: GraphSnapshot, common: ResolvedExportOptions): Plan {
|
|
|
550
400
|
};
|
|
551
401
|
}
|
|
552
402
|
|
|
553
|
-
/**
|
|
554
|
-
* The direction notes: every CX2 edge is directed, so an undirected snapshot (or the undirected
|
|
555
|
-
* pairs of a mixed one, folded under onMixedDirection) is written directed, and a mutual pair as
|
|
556
|
-
* two edges without its mark.
|
|
557
|
-
* @param snapshot - the snapshot
|
|
558
|
-
* @param folding - the pair folding
|
|
559
|
-
* @param common - the resolved common options
|
|
560
|
-
* @param note - records a note
|
|
561
|
-
*/
|
|
562
|
-
function directionNotes(
|
|
563
|
-
snapshot: GraphSnapshot,
|
|
564
|
-
folding: PairFolding,
|
|
565
|
-
common: ResolvedExportOptions,
|
|
566
|
-
note: (code: string, message: string, column?: string | null, count?: number | null) => void,
|
|
567
|
-
): void {
|
|
568
|
-
if (!snapshot.directed) {
|
|
569
|
-
note(
|
|
570
|
-
CX2_LOSS.UNDIRECTED_AS_DIRECTED,
|
|
571
|
-
`the snapshot is undirected; every edge is written as a directed CX2 edge (${snapshot.edgeCount} edge(s))`,
|
|
572
|
-
null,
|
|
573
|
-
snapshot.edgeCount,
|
|
574
|
-
);
|
|
575
|
-
} else if (common.onMixedDirection !== "error") {
|
|
576
|
-
let undirected = 0;
|
|
577
|
-
for (let e = 0; e < snapshot.edgeCount; e++) {
|
|
578
|
-
if (!folding.folded(e) && !folding.sourceDirected(e)) {
|
|
579
|
-
undirected++;
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
if (undirected > 0) {
|
|
583
|
-
note(
|
|
584
|
-
CX2_LOSS.UNDIRECTED_AS_DIRECTED,
|
|
585
|
-
`${undirected} undirected edge(s) are written as one directed edge each (a pair folded to its primary); CX2 has no undirected edge`,
|
|
586
|
-
null,
|
|
587
|
-
undirected,
|
|
588
|
-
);
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
if (folding.mutualCount > 0) {
|
|
592
|
-
note(
|
|
593
|
-
LOSS.MUTUAL_EXPANDED,
|
|
594
|
-
`${folding.mutualCount} mutual pair(s) are written as two directed edges; the mutual mark is lost`,
|
|
595
|
-
null,
|
|
596
|
-
folding.mutualCount,
|
|
597
|
-
);
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
/**
|
|
602
|
-
* Count the positions with a non-finite x or y.
|
|
603
|
-
* @param position - the position column
|
|
604
|
-
* @returns the count
|
|
605
|
-
*/
|
|
606
|
-
function nonFinitePositions(position: Column): number {
|
|
607
|
-
let count = 0;
|
|
608
|
-
for (let i = 0; i < position.length; i++) {
|
|
609
|
-
if (position.isSet(i)) {
|
|
610
|
-
const p = position.value(i) as ArrayLike<number>;
|
|
611
|
-
if (!Number.isFinite(p[0]) || !Number.isFinite(p[1])) {
|
|
612
|
-
count++;
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
return count;
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
/**
|
|
620
|
-
* The edge ids to write: the id role column's values when they are distinct safe integers,
|
|
621
|
-
* next unused integers for edges without one.
|
|
622
|
-
* @param snapshot - the snapshot
|
|
623
|
-
* @param note - records a note
|
|
624
|
-
* @returns one id per edge
|
|
625
|
-
*/
|
|
626
|
-
function planEdgeIds(
|
|
627
|
-
snapshot: GraphSnapshot,
|
|
628
|
-
note: (code: string, message: string, column?: string | null, count?: number | null) => void,
|
|
629
|
-
): number[] {
|
|
630
|
-
const column = snapshot.edges.byRole("id");
|
|
631
|
-
const ids: (number | null)[] = new Array<number | null>(snapshot.edgeCount).fill(null);
|
|
632
|
-
const used = new Set<number>();
|
|
633
|
-
let generated = 0;
|
|
634
|
-
if (column !== null) {
|
|
635
|
-
for (let e = 0; e < snapshot.edgeCount; e++) {
|
|
636
|
-
const value = column.isSet(e) ? column.value(e) : undefined;
|
|
637
|
-
let n = NaN;
|
|
638
|
-
if (typeof value === "number") {
|
|
639
|
-
n = value;
|
|
640
|
-
} else if (typeof value === "string") {
|
|
641
|
-
n = Number(value);
|
|
642
|
-
}
|
|
643
|
-
if (Number.isSafeInteger(n) && !used.has(n)) {
|
|
644
|
-
ids[e] = n === 0 ? 0 : n;
|
|
645
|
-
used.add(n);
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
let next = 0;
|
|
650
|
-
const out: number[] = [];
|
|
651
|
-
for (let e = 0; e < snapshot.edgeCount; e++) {
|
|
652
|
-
let id = ids[e];
|
|
653
|
-
if (id === null) {
|
|
654
|
-
while (used.has(next)) {
|
|
655
|
-
next++;
|
|
656
|
-
}
|
|
657
|
-
id = next;
|
|
658
|
-
used.add(next);
|
|
659
|
-
generated++;
|
|
660
|
-
}
|
|
661
|
-
out.push(id);
|
|
662
|
-
}
|
|
663
|
-
if (column !== null && generated > 0) {
|
|
664
|
-
note(
|
|
665
|
-
LOSS.EDGE_IDS_GENERATED,
|
|
666
|
-
`${generated} edge(s) have no distinct integer id in "${column.meta.name}"; they are written with generated ids`,
|
|
667
|
-
column.meta.name,
|
|
668
|
-
generated,
|
|
669
|
-
);
|
|
670
|
-
}
|
|
671
|
-
return out;
|
|
672
|
-
}
|
|
673
|
-
|
|
674
403
|
// ============================================================ writing
|
|
675
404
|
|
|
676
|
-
/**
|
|
677
|
-
* The JSON text of a value, keeping -0.
|
|
678
|
-
* @param value - the value
|
|
679
|
-
* @returns the text
|
|
680
|
-
*/
|
|
681
|
-
function stringify(value: unknown): string {
|
|
682
|
-
const text = JSON.stringify(value, (_key, v: unknown) => (Object.is(v, -0) ? `${RAW}-0` : v));
|
|
683
|
-
return text.includes("\\u0000cx2:") ? text.replace(RAW_JSON, "$1") : text;
|
|
684
|
-
}
|
|
685
|
-
|
|
686
405
|
/**
|
|
687
406
|
* The value written for one cell.
|
|
688
407
|
* @param p - the attribute plan
|
|
@@ -913,15 +632,17 @@ function* write(snapshot: GraphSnapshot, p: Plan): Generator<string, void, undef
|
|
|
913
632
|
* @param aspect - the aspect name
|
|
914
633
|
* @param count - its element count
|
|
915
634
|
* @param element - the JSON text of element k
|
|
916
|
-
* @
|
|
917
|
-
* @returns nothing
|
|
635
|
+
* @returns the block's text parts
|
|
918
636
|
*/
|
|
919
|
-
function
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
637
|
+
function block(aspect: string, count: number, element: (k: number) => string): Generator<string, void, undefined> {
|
|
638
|
+
return aspectBlock(
|
|
639
|
+
aspect,
|
|
640
|
+
(function* elements(): Generator<string, void, undefined> {
|
|
641
|
+
for (let k = 0; k < count; k++) {
|
|
642
|
+
yield element(k);
|
|
643
|
+
}
|
|
644
|
+
})(),
|
|
645
|
+
);
|
|
925
646
|
}
|
|
926
647
|
|
|
927
648
|
/**
|
|
@@ -998,10 +719,12 @@ function bypassValues(columns: readonly Column[], row: number): Record<string, u
|
|
|
998
719
|
}
|
|
999
720
|
|
|
1000
721
|
/**
|
|
1001
|
-
* The CX2 exporter plugin
|
|
722
|
+
* The CX2 exporter plugin.
|
|
723
|
+
* @category Built-in formats
|
|
1002
724
|
*/
|
|
1003
725
|
export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
|
|
1004
726
|
format: CX2_FORMAT,
|
|
727
|
+
options: Object.freeze([]),
|
|
1005
728
|
capabilities: CX2_CAPABILITIES,
|
|
1006
729
|
|
|
1007
730
|
/**
|
|
@@ -1010,7 +733,7 @@ export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
|
|
|
1010
733
|
* @param options - the common options
|
|
1011
734
|
* @returns the notes, empty when the export is exact
|
|
1012
735
|
*/
|
|
1013
|
-
check(snapshot: GraphSnapshot, options?: Cx2ExportOptions
|
|
736
|
+
check(snapshot: GraphSnapshot, options?: Cx2ExportOptions): readonly LossNote[] {
|
|
1014
737
|
return Object.freeze([...plan(snapshot, resolveExportOptions(options)).notes]);
|
|
1015
738
|
},
|
|
1016
739
|
|
|
@@ -1020,7 +743,7 @@ export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
|
|
|
1020
743
|
* @param options - the common options
|
|
1021
744
|
* @returns the chunks
|
|
1022
745
|
*/
|
|
1023
|
-
export(snapshot: GraphSnapshot, options?: Cx2ExportOptions
|
|
746
|
+
export(snapshot: GraphSnapshot, options?: Cx2ExportOptions): AsyncIterable<Uint8Array> {
|
|
1024
747
|
return encodeChunks(write(snapshot, plan(snapshot, resolveExportOptions(options))));
|
|
1025
748
|
},
|
|
1026
749
|
|
|
@@ -1030,7 +753,7 @@ export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
|
|
|
1030
753
|
* @param options - the common options
|
|
1031
754
|
* @returns the document
|
|
1032
755
|
*/
|
|
1033
|
-
exportToString(snapshot: GraphSnapshot, options?: Cx2ExportOptions
|
|
756
|
+
exportToString(snapshot: GraphSnapshot, options?: Cx2ExportOptions): Promise<string> {
|
|
1034
757
|
return joinText(write(snapshot, plan(snapshot, resolveExportOptions(options))));
|
|
1035
758
|
},
|
|
1036
759
|
});
|