@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,461 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the two ontology exporters share (the OBO flat file and the JSON exporter's `obographs`
|
|
3
|
+
* dialect): the snapshot columns that fill the OBO slots (the label as `name`, the edge kind as
|
|
4
|
+
* `relation`), the placeholder nodes a re-import makes again by itself, the order a re-import gives
|
|
5
|
+
* the nodes, and the text of a cell. Both read the snapshot through the column vocabulary of
|
|
6
|
+
* ontology.ts, so a column means the same thing in both files.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { type Column, GraphFormatError, type GraphSnapshot } from "@graphty/graph-format";
|
|
10
|
+
|
|
11
|
+
import { type ExportCapabilities, type LossNote } from "../types.js";
|
|
12
|
+
import { COLUMN_AS_PROPERTY_VALUE_CODE, ROLE_ASSUMED_CODE } from "./codes.js";
|
|
13
|
+
import { checkCapabilities, LOSS } from "./export.js";
|
|
14
|
+
import { formatNumber } from "./format.js";
|
|
15
|
+
import { PLACEHOLDER_COLUMN } from "./ontology.js";
|
|
16
|
+
import { type ResolvedExportOptions } from "./options.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A note recorder.
|
|
20
|
+
* @category Plugin helpers
|
|
21
|
+
*/
|
|
22
|
+
export type NoteFn = (code: string, message: string, column?: string | null, count?: number | null) => void;
|
|
23
|
+
|
|
24
|
+
/** The generic notes the ontology formats replace with their own (see capabilityNotes()). */
|
|
25
|
+
const SUPERSEDED: ReadonlySet<string> = new Set([
|
|
26
|
+
LOSS.DTYPE,
|
|
27
|
+
LOSS.LIST,
|
|
28
|
+
LOSS.JSON,
|
|
29
|
+
LOSS.COMPONENTS,
|
|
30
|
+
LOSS.GRAPH_ATTRIBUTES,
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
/** The roles the ontology formats have a slot for, and the column names their importers give them. */
|
|
34
|
+
const SLOT_ROLES: ReadonlySet<string> = new Set(["label", "kind"]);
|
|
35
|
+
const ROLE_NAMES: Readonly<Record<string, string>> = Object.freeze({ label: "name", kind: "relation" });
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The roles whose columns are never written as values (their loss notes come from checkCapabilities()).
|
|
39
|
+
* @category Plugin helpers
|
|
40
|
+
*/
|
|
41
|
+
export const UNWRITTEN_ROLES: ReadonlySet<string> = new Set([
|
|
42
|
+
"directed",
|
|
43
|
+
"pair",
|
|
44
|
+
"mutual",
|
|
45
|
+
"weight",
|
|
46
|
+
"timeText",
|
|
47
|
+
"originalId",
|
|
48
|
+
"parent",
|
|
49
|
+
"parents",
|
|
50
|
+
"start",
|
|
51
|
+
"end",
|
|
52
|
+
"timestamp",
|
|
53
|
+
"timestamps",
|
|
54
|
+
"spells",
|
|
55
|
+
"open",
|
|
56
|
+
"spellsOpen",
|
|
57
|
+
"position",
|
|
58
|
+
"color",
|
|
59
|
+
"size",
|
|
60
|
+
"shape",
|
|
61
|
+
"thickness",
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The OBO frame types.
|
|
66
|
+
* @category Plugin helpers
|
|
67
|
+
*/
|
|
68
|
+
export type FrameKind = "Term" | "Instance" | "Typedef";
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The frame types as a set, for checking a `type` cell.
|
|
72
|
+
* @category Plugin helpers
|
|
73
|
+
*/
|
|
74
|
+
export const FRAME_KINDS: ReadonlySet<string> = new Set(["Term", "Instance", "Typedef"]);
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The value of a set cell (a multi-component value as a plain array), or undefined when unset; a
|
|
78
|
+
* declared default is not a value here (the formats have no defaults and say so).
|
|
79
|
+
* @param column - the column
|
|
80
|
+
* @param row - the row
|
|
81
|
+
* @returns the value or undefined
|
|
82
|
+
* @category Plugin helpers
|
|
83
|
+
*/
|
|
84
|
+
export function cellOf(column: Column, row: number): unknown {
|
|
85
|
+
if (!column.isSet(row)) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
const value: unknown = column.value(row);
|
|
89
|
+
return ArrayBuffer.isView(value) ? Array.from(value as unknown as ArrayLike<number>) : value;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The text of a scalar value: a number by its dtype's shortest round-tripping form (`-0` kept), a
|
|
94
|
+
* boolean as `true` / `false`, a string as it is, anything else as its JSON text.
|
|
95
|
+
* @param value - the value
|
|
96
|
+
* @param dtype - the dtype it came from (the item dtype for a list item)
|
|
97
|
+
* @returns the text
|
|
98
|
+
* @category Plugin helpers
|
|
99
|
+
*/
|
|
100
|
+
export function textOf(value: unknown, dtype: string): string {
|
|
101
|
+
switch (typeof value) {
|
|
102
|
+
case "string":
|
|
103
|
+
return value;
|
|
104
|
+
case "boolean":
|
|
105
|
+
return value ? "true" : "false";
|
|
106
|
+
case "number":
|
|
107
|
+
return formatNumber(
|
|
108
|
+
value,
|
|
109
|
+
dtype === "f32" || dtype === "i32" || dtype === "u32" || dtype === "u8" ? dtype : "f64",
|
|
110
|
+
);
|
|
111
|
+
default:
|
|
112
|
+
return JSON.stringify(value) ?? "null";
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Whether a column has the dtype of a vocabulary column (string and dict both fit a text column;
|
|
118
|
+
* the other text dtype is reported, not refused).
|
|
119
|
+
* @param want - the vocabulary dtype
|
|
120
|
+
* @param column - the column
|
|
121
|
+
* @returns true when the column can be written into the vocabulary slot
|
|
122
|
+
* @category Plugin helpers
|
|
123
|
+
*/
|
|
124
|
+
export function fitsVocabulary(want: string, column: Column): boolean {
|
|
125
|
+
switch (want) {
|
|
126
|
+
case "list":
|
|
127
|
+
case "bool":
|
|
128
|
+
case "json":
|
|
129
|
+
return column.dtype === want;
|
|
130
|
+
default:
|
|
131
|
+
return isText(column);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The values of a cell that may hold one value or a list of them.
|
|
137
|
+
* @param value - the cell value, or undefined
|
|
138
|
+
* @returns the values
|
|
139
|
+
* @category Plugin helpers
|
|
140
|
+
*/
|
|
141
|
+
export function valuesOf(value: unknown): readonly unknown[] {
|
|
142
|
+
if (value === undefined) {
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
return Array.isArray(value) ? value : [value];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** A column chosen for an OBO slot. */
|
|
149
|
+
interface Slot {
|
|
150
|
+
/** The column, or null when the snapshot has none for the slot. */
|
|
151
|
+
readonly column: Column | null;
|
|
152
|
+
/** Whether a role-less column was chosen by its name; it reads back with the role (W_ROLE_ASSUMED). */
|
|
153
|
+
readonly assumed: boolean;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* The column of a slot: the column with the role when it holds text, else a role-less text column
|
|
158
|
+
* of the slot's name (which the importer reads back with the role).
|
|
159
|
+
* @param table - the node or edge table
|
|
160
|
+
* @param role - the role (`label` for `name`, `kind` for `relation`)
|
|
161
|
+
* @param name - the name the importer gives the slot
|
|
162
|
+
* @returns the column and whether its role is assumed
|
|
163
|
+
* @category Plugin helpers
|
|
164
|
+
*/
|
|
165
|
+
export function slotColumn(table: GraphSnapshot["nodes"], role: "label" | "kind", name: string): Slot {
|
|
166
|
+
const byRole = table.byRole(role);
|
|
167
|
+
if (byRole !== null) {
|
|
168
|
+
return { column: isText(byRole) ? byRole : null, assumed: false };
|
|
169
|
+
}
|
|
170
|
+
const byName = table.get(name);
|
|
171
|
+
if (byName !== null && byName.meta.role === null && isText(byName)) {
|
|
172
|
+
return { column: byName, assumed: true };
|
|
173
|
+
}
|
|
174
|
+
return { column: null, assumed: false };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Whether a column holds text (string or dict).
|
|
179
|
+
* @param column - the column
|
|
180
|
+
* @returns true for string and dict
|
|
181
|
+
*/
|
|
182
|
+
function isText(column: Column): boolean {
|
|
183
|
+
return column.dtype === "string" || column.dtype === "dict";
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* The placeholder column (`graphty.placeholder`, a bool), or null.
|
|
188
|
+
* @param snapshot - the snapshot
|
|
189
|
+
* @returns the column
|
|
190
|
+
*/
|
|
191
|
+
function placeholderColumn(snapshot: GraphSnapshot): Column | null {
|
|
192
|
+
const column = snapshot.nodes.get(PLACEHOLDER_COLUMN);
|
|
193
|
+
return column !== null && column.dtype === "bool" ? column : null;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* The nodes written without a frame (OBO) or a node record (OBO Graphs) because the re-import makes
|
|
198
|
+
* them again as placeholders: a `graphty.placeholder` true cell, no other set cell, an id written
|
|
199
|
+
* as it is, an edge that references it, and (in the flat file, where an edge is written on its
|
|
200
|
+
* source's frame) no edge of its own.
|
|
201
|
+
* @param snapshot - the snapshot
|
|
202
|
+
* @param written - the logical edges written
|
|
203
|
+
* @param options - `outgoingAllowed`: whether a placeholder may be an edge's source; `changed`: whether a node's id is rewritten
|
|
204
|
+
* @param options.outgoingAllowed - whether a placeholder may be an edge's source
|
|
205
|
+
* @param options.changed - whether a node's id is rewritten
|
|
206
|
+
* @returns one flag per node, 1 for a node written without a frame
|
|
207
|
+
* @category Plugin helpers
|
|
208
|
+
*/
|
|
209
|
+
export function framelessNodes(
|
|
210
|
+
snapshot: GraphSnapshot,
|
|
211
|
+
written: readonly number[],
|
|
212
|
+
options: { readonly outgoingAllowed: boolean; readonly changed: (i: number) => boolean },
|
|
213
|
+
): Uint8Array {
|
|
214
|
+
const flags = new Uint8Array(snapshot.nodeCount);
|
|
215
|
+
const placeholder = placeholderColumn(snapshot);
|
|
216
|
+
if (placeholder === null) {
|
|
217
|
+
return flags;
|
|
218
|
+
}
|
|
219
|
+
const { src, dst } = snapshot.edgeList();
|
|
220
|
+
const referenced = new Uint8Array(snapshot.nodeCount);
|
|
221
|
+
const sources = new Uint8Array(snapshot.nodeCount);
|
|
222
|
+
for (const e of written) {
|
|
223
|
+
referenced[dst[e]] = 1;
|
|
224
|
+
if (options.outgoingAllowed) {
|
|
225
|
+
referenced[src[e]] = 1;
|
|
226
|
+
} else {
|
|
227
|
+
sources[src[e]] = 1;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const others = [...snapshot.nodes].filter((c) => c !== placeholder);
|
|
231
|
+
for (let i = 0; i < snapshot.nodeCount; i++) {
|
|
232
|
+
if (
|
|
233
|
+
placeholder.isSet(i) &&
|
|
234
|
+
placeholder.value(i) === true &&
|
|
235
|
+
referenced[i] === 1 &&
|
|
236
|
+
sources[i] === 0 &&
|
|
237
|
+
!options.changed(i) &&
|
|
238
|
+
others.every((c) => !c.isSet(i))
|
|
239
|
+
) {
|
|
240
|
+
flags[i] = 1;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return flags;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* How many nodes a re-import puts at another index: the written nodes keep their order and the
|
|
248
|
+
* placeholders follow in the order the edges first reference them.
|
|
249
|
+
* @param frameless - the framelessNodes() flags
|
|
250
|
+
* @param references - the node indices in the order the written edges reference them
|
|
251
|
+
* @returns the number of nodes whose index changes
|
|
252
|
+
* @category Plugin helpers
|
|
253
|
+
*/
|
|
254
|
+
export function movedNodes(frameless: Uint8Array, references: Iterable<number>): number {
|
|
255
|
+
const order: number[] = [];
|
|
256
|
+
for (let i = 0; i < frameless.length; i++) {
|
|
257
|
+
if (frameless[i] === 0) {
|
|
258
|
+
order.push(i);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const seen = new Uint8Array(frameless.length);
|
|
262
|
+
for (const i of references) {
|
|
263
|
+
if (frameless[i] === 1 && seen[i] === 0) {
|
|
264
|
+
seen[i] = 1;
|
|
265
|
+
order.push(i);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
let moved = 0;
|
|
269
|
+
for (let k = 0; k < order.length; k++) {
|
|
270
|
+
if (order[k] !== k) {
|
|
271
|
+
moved++;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return moved;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Whether a value is a qualifier record as the importers make it: a non-empty object of names to a
|
|
279
|
+
* text or a list of two or more texts (a name given once reads back as a text, never as a
|
|
280
|
+
* one-item list), every name passing `nameOk`.
|
|
281
|
+
* @param value - the value
|
|
282
|
+
* @param nameOk - the name rule
|
|
283
|
+
* @returns true when the record is written and read back unchanged
|
|
284
|
+
* @category Plugin helpers
|
|
285
|
+
*/
|
|
286
|
+
export function isQualifierRecord(value: unknown, nameOk: (name: string) => boolean): boolean {
|
|
287
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
const entries = Object.entries(value);
|
|
291
|
+
return (
|
|
292
|
+
entries.length > 0 &&
|
|
293
|
+
entries.every(
|
|
294
|
+
([name, v]) =>
|
|
295
|
+
nameOk(name) &&
|
|
296
|
+
(typeof v === "string" ||
|
|
297
|
+
(Array.isArray(v) && v.length >= 2 && v.every((item) => typeof item === "string"))),
|
|
298
|
+
)
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/** What capabilityNotes() needs to know about the export. */
|
|
303
|
+
interface CapabilityNoteSpec {
|
|
304
|
+
/** The format's capabilities. */
|
|
305
|
+
readonly caps: ExportCapabilities;
|
|
306
|
+
/** The label column written as the name, or null. */
|
|
307
|
+
readonly label: Column | null;
|
|
308
|
+
/** Whether the label is a role-less `name` column. */
|
|
309
|
+
readonly labelAssumed: boolean;
|
|
310
|
+
/** Where an edge column without a slot goes, for messages ("a qualifier"). */
|
|
311
|
+
readonly edgeSlot: string;
|
|
312
|
+
/** Records a note. */
|
|
313
|
+
readonly note: NoteFn;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* The generic notes of checkCapabilities() as the ontology formats see them. No column of the
|
|
318
|
+
* snapshot's own survives as a column (the formats keep only the OBO vocabulary), so the generic
|
|
319
|
+
* dtype, list, json, strides and graph-attribute notes give way to the formats' own, which say
|
|
320
|
+
* where each column goes (a vocabulary column written into its slot needs no note; any other
|
|
321
|
+
* becomes property values, edge qualifiers or metadata). The name-change notes stand only for the
|
|
322
|
+
* label and kind columns actually written into their slot. Added: the roles without a slot (a
|
|
323
|
+
* node kind, an edge label) and a role-less `name` column taking the label role.
|
|
324
|
+
* @param snapshot - the snapshot
|
|
325
|
+
* @param common - the common options
|
|
326
|
+
* @param spec - the export's facts
|
|
327
|
+
* @returns the fatal error of a mixed graph under onMixedDirection "error", or null
|
|
328
|
+
* @category Plugin helpers
|
|
329
|
+
*/
|
|
330
|
+
export function capabilityNotes(
|
|
331
|
+
snapshot: GraphSnapshot,
|
|
332
|
+
common: ResolvedExportOptions,
|
|
333
|
+
spec: CapabilityNoteSpec,
|
|
334
|
+
): GraphFormatError | null {
|
|
335
|
+
const { label, note } = spec;
|
|
336
|
+
let fatal: GraphFormatError | null = null;
|
|
337
|
+
const kind = snapshot.edges.byRole("kind");
|
|
338
|
+
for (const gen of checkCapabilities(snapshot, spec.caps, common, { roles: SLOT_ROLES, roleNames: ROLE_NAMES })) {
|
|
339
|
+
if (SUPERSEDED.has(gen.code) || (gen.code === LOSS.COLUMN_NAME_CHANGED && !isSlotRename(gen, label, kind))) {
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
if (gen.code === LOSS.MIXED_DIRECTION_ERROR && fatal === null) {
|
|
343
|
+
fatal = new GraphFormatError("E_DIRECTED", gen.message, { reason: "mixed direction" });
|
|
344
|
+
}
|
|
345
|
+
note(gen.code, gen.message, gen.column, gen.count);
|
|
346
|
+
}
|
|
347
|
+
slotlessRoleNotes(snapshot, spec);
|
|
348
|
+
return fatal;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Note the roles the ontology formats have no slot for (a node kind, an edge label), and a
|
|
353
|
+
* role-less `name` column taking the label role.
|
|
354
|
+
* @param snapshot - the snapshot
|
|
355
|
+
* @param spec - the export's facts
|
|
356
|
+
*/
|
|
357
|
+
function slotlessRoleNotes(snapshot: GraphSnapshot, spec: CapabilityNoteSpec): void {
|
|
358
|
+
const { label, note } = spec;
|
|
359
|
+
const nodeKind = snapshot.nodes.byRole("kind");
|
|
360
|
+
if (nodeKind !== null) {
|
|
361
|
+
note(
|
|
362
|
+
LOSS.ROLE,
|
|
363
|
+
`node column "${nodeKind.meta.name}" (kind) is written as property values; the format has no node kind slot`,
|
|
364
|
+
nodeKind.meta.name,
|
|
365
|
+
nodeKind.length - nodeKind.nullCount,
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
const edgeLabel = snapshot.edges.byRole("label");
|
|
369
|
+
if (edgeLabel !== null) {
|
|
370
|
+
note(
|
|
371
|
+
LOSS.ROLE,
|
|
372
|
+
`edge column "${edgeLabel.meta.name}" (label) is written as ${spec.edgeSlot}; the format has no edge label slot`,
|
|
373
|
+
edgeLabel.meta.name,
|
|
374
|
+
edgeLabel.length - edgeLabel.nullCount,
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
if (label !== null && spec.labelAssumed) {
|
|
378
|
+
note(
|
|
379
|
+
ROLE_ASSUMED_CODE,
|
|
380
|
+
`node column "name" is written as each node's name and reads back as the label`,
|
|
381
|
+
"name",
|
|
382
|
+
label.length - label.nullCount,
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Whether a name-change note is about a column written into its slot: the node label, or a text
|
|
389
|
+
* edge kind column.
|
|
390
|
+
* @param gen - the note
|
|
391
|
+
* @param label - the node label column, or null
|
|
392
|
+
* @param kind - the edge kind column, or null
|
|
393
|
+
* @returns true when it is
|
|
394
|
+
*/
|
|
395
|
+
function isSlotRename(gen: LossNote, label: Column | null, kind: Column | null): boolean {
|
|
396
|
+
const isLabel = label !== null && gen.column === label.meta.name;
|
|
397
|
+
return isLabel || (kind !== null && gen.column === kind.meta.name && isText(kind));
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Record the columns that read back absent: a node or edge column without a set cell on a written
|
|
402
|
+
* element (the importers declare a column when a value needs it).
|
|
403
|
+
* @param snapshot - the snapshot
|
|
404
|
+
* @param rows - the written nodes
|
|
405
|
+
* @param frameless - the frameless flags (a placeholder column set only there reads back)
|
|
406
|
+
* @param written - the written edges
|
|
407
|
+
* @param note - records a note
|
|
408
|
+
* @category Plugin helpers
|
|
409
|
+
*/
|
|
410
|
+
export function emptyColumnNotes(
|
|
411
|
+
snapshot: GraphSnapshot,
|
|
412
|
+
rows: readonly number[],
|
|
413
|
+
frameless: Uint8Array,
|
|
414
|
+
written: readonly number[],
|
|
415
|
+
note: NoteFn,
|
|
416
|
+
): void {
|
|
417
|
+
const tables = [
|
|
418
|
+
[
|
|
419
|
+
"node",
|
|
420
|
+
snapshot.nodes,
|
|
421
|
+
(c: Column): boolean =>
|
|
422
|
+
rows.some((i) => c.isSet(i)) ||
|
|
423
|
+
(c.meta.name === PLACEHOLDER_COLUMN && frameless.some((f, i) => f === 1 && c.isSet(i))),
|
|
424
|
+
],
|
|
425
|
+
["edge", snapshot.edges, (c: Column): boolean => written.some((e) => c.isSet(e))],
|
|
426
|
+
] as const;
|
|
427
|
+
for (const [domain, table, used] of tables) {
|
|
428
|
+
for (const column of table) {
|
|
429
|
+
const { role, name } = column.meta;
|
|
430
|
+
if (
|
|
431
|
+
(role !== null && (UNWRITTEN_ROLES.has(role) || (domain === "edge" && role === "id"))) ||
|
|
432
|
+
used(column)
|
|
433
|
+
) {
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
note(LOSS.EMPTY_COLUMN, `${domain} column "${name}" has no value to write; it reads back absent`, name, 0);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Record the note of a node column written as property values.
|
|
443
|
+
* @param note - the recorder
|
|
444
|
+
* @param column - the column
|
|
445
|
+
* @param rows - the written nodes
|
|
446
|
+
* @param how - how the values are written, for the message
|
|
447
|
+
* @category Plugin helpers
|
|
448
|
+
*/
|
|
449
|
+
export function notePropertyColumn(note: NoteFn, column: Column, rows: readonly number[], how: string): void {
|
|
450
|
+
const count = rows.filter((i) => column.isSet(i)).length;
|
|
451
|
+
if (count === 0) {
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
const role = column.meta.role === null ? "" : ` (its ${column.meta.role} role is lost)`;
|
|
455
|
+
note(
|
|
456
|
+
COLUMN_AS_PROPERTY_VALUE_CODE,
|
|
457
|
+
`node column "${column.meta.name}" is written as ${how} and reads back inside the property_value column, not as its own column${role}`,
|
|
458
|
+
column.meta.name,
|
|
459
|
+
count,
|
|
460
|
+
);
|
|
461
|
+
}
|
package/src/common/ontology.ts
CHANGED
|
@@ -22,6 +22,7 @@ interface OboColumnSpec {
|
|
|
22
22
|
* The node columns of the OBO vocabulary, keyed by column name (design section 4.2). The names are
|
|
23
23
|
* the OBO tag names, so a Gene Ontology user finds `namespace`, `def` and `is_obsolete` under the
|
|
24
24
|
* names the GO documentation uses.
|
|
25
|
+
* @category Plugin helpers
|
|
25
26
|
*/
|
|
26
27
|
export const OBO_NODE_COLUMNS: Readonly<Record<string, OboColumnSpec>> = Object.freeze({
|
|
27
28
|
type: { dtype: "dict" },
|
|
@@ -81,7 +82,10 @@ const OBO_EDGE_COLUMNS: Readonly<Record<string, OboColumnSpec>> = Object.freeze(
|
|
|
81
82
|
meta: { dtype: "json" },
|
|
82
83
|
});
|
|
83
84
|
|
|
84
|
-
/**
|
|
85
|
+
/**
|
|
86
|
+
* The node column that marks a node made for an undeclared reference (design section 4.2).
|
|
87
|
+
* @category Plugin helpers
|
|
88
|
+
*/
|
|
85
89
|
export const PLACEHOLDER_COLUMN = "graphty.placeholder";
|
|
86
90
|
|
|
87
91
|
/**
|
|
@@ -89,6 +93,7 @@ export const PLACEHOLDER_COLUMN = "graphty.placeholder";
|
|
|
89
93
|
* @param domain - node or edge
|
|
90
94
|
* @param name - the column name (a key of OBO_NODE_COLUMNS / OBO_EDGE_COLUMNS, or the placeholder column)
|
|
91
95
|
* @returns the declaration, nullable, with origin `{ format: "obo", id: name }`
|
|
96
|
+
* @category Plugin helpers
|
|
92
97
|
*/
|
|
93
98
|
export function oboColumnDecl(domain: "node" | "edge", name: string): ColumnDecl {
|
|
94
99
|
if (name === PLACEHOLDER_COLUMN) {
|
|
@@ -105,26 +110,38 @@ export function oboColumnDecl(domain: "node" | "edge", name: string): ColumnDecl
|
|
|
105
110
|
return decl;
|
|
106
111
|
}
|
|
107
112
|
|
|
108
|
-
/**
|
|
109
|
-
|
|
113
|
+
/**
|
|
114
|
+
* The OBO PURL base every OBO Foundry IRI starts with.
|
|
115
|
+
* @category Plugin helpers
|
|
116
|
+
*/
|
|
117
|
+
export const OBO_PURL = "http://purl.obolibrary.org/obo/"; // NOSONAR(S5332): an identifier the OBO standard fixes, never fetched
|
|
110
118
|
|
|
111
|
-
/** The
|
|
112
|
-
const
|
|
119
|
+
/** The same base under https, which newer OBO Graphs writers use. */
|
|
120
|
+
const OBO_PURL_HTTPS = "https://purl.obolibrary.org/obo/";
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* The oboInOwl namespace of the OBO-to-OWL mapping's annotation properties.
|
|
124
|
+
* @category Plugin helpers
|
|
125
|
+
*/
|
|
126
|
+
export const OBO_IN_OWL = "http://www.geneontology.org/formats/oboInOwl#"; // NOSONAR(S5332): an identifier the OBO standard fixes, never fetched
|
|
113
127
|
|
|
114
128
|
/**
|
|
115
129
|
* An IRI as the identifier the `.obo` file writes (the OBO 1.4 mapping, section 5.9, read
|
|
116
130
|
* backwards): `http://purl.obolibrary.org/obo/GO_0008150` is `GO:0008150` (the prefix is the text
|
|
117
131
|
* before the first underscore), and `http://purl.obolibrary.org/obo/go#regulates` (how the OWL
|
|
118
|
-
* translation writes an unprefixed OBO id: subsets, relations, synonym types) is `regulates
|
|
132
|
+
* translation writes an unprefixed OBO id: subsets, relations, synonym types) is `regulates`; the
|
|
133
|
+
* same under `https://purl.obolibrary.org/obo/`.
|
|
119
134
|
* Every other IRI, and an OBO PURL that fits neither form (`.../obo/T/Female`), is kept.
|
|
120
135
|
* @param iri - the IRI
|
|
121
136
|
* @returns the CURIE or local id, or the IRI unchanged
|
|
137
|
+
* @category Plugin helpers
|
|
122
138
|
*/
|
|
123
139
|
export function compactOboIri(iri: string): string {
|
|
124
|
-
|
|
140
|
+
const base = [OBO_PURL, OBO_PURL_HTTPS].find((b) => iri.startsWith(b));
|
|
141
|
+
if (base === undefined) {
|
|
125
142
|
return iri;
|
|
126
143
|
}
|
|
127
|
-
const rest = iri.slice(
|
|
144
|
+
const rest = iri.slice(base.length);
|
|
128
145
|
const hash = rest.indexOf("#");
|
|
129
146
|
if (hash > 0) {
|
|
130
147
|
const local = rest.slice(hash + 1);
|
|
@@ -137,7 +154,10 @@ export function compactOboIri(iri: string): string {
|
|
|
137
154
|
return `${rest.slice(0, underscore)}:${rest.slice(underscore + 1)}`;
|
|
138
155
|
}
|
|
139
156
|
|
|
140
|
-
/**
|
|
157
|
+
/**
|
|
158
|
+
* The OBO synonym scopes.
|
|
159
|
+
* @category Plugin helpers
|
|
160
|
+
*/
|
|
141
161
|
export const SYNONYM_SCOPES: ReadonlySet<string> = new Set(["EXACT", "BROAD", "NARROW", "RELATED"]);
|
|
142
162
|
|
|
143
163
|
/**
|
|
@@ -145,6 +165,7 @@ export const SYNONYM_SCOPES: ReadonlySet<string> = new Set(["EXACT", "BROAD", "N
|
|
|
145
165
|
* oboInOwl namespace).
|
|
146
166
|
* @param pred - the predicate
|
|
147
167
|
* @returns the scope, or null for a predicate that is not one of the four
|
|
168
|
+
* @category Plugin helpers
|
|
148
169
|
*/
|
|
149
170
|
export function synonymScopeOf(pred: string): string | null {
|
|
150
171
|
const local = pred.startsWith(OBO_IN_OWL) ? pred.slice(OBO_IN_OWL.length) : pred;
|
|
@@ -157,6 +178,7 @@ export function synonymScopeOf(pred: string): string | null {
|
|
|
157
178
|
* the tags that are annotations), so the `.json` of an ontology fills the same columns as its
|
|
158
179
|
* `.obo`. `shorthand` is the relation's short name; every predicate not listed is a
|
|
159
180
|
* `property_value`.
|
|
181
|
+
* @category Plugin helpers
|
|
160
182
|
*/
|
|
161
183
|
export const OBOGRAPHS_PREDICATE_TAGS: ReadonlyMap<string, string> = new Map([
|
|
162
184
|
[`${OBO_IN_OWL}hasOBONamespace`, "namespace"],
|