@graphty/graph-io 0.3.47 → 0.3.49
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/dist/chunks/{approximations-wWjCRzKj.js → approximations-Bzn3L-je.js} +2 -2
- package/dist/chunks/{approximations-wWjCRzKj.js.map → approximations-Bzn3L-je.js.map} +1 -1
- package/dist/chunks/bends-BGXjv_U4.js +129 -0
- package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
- package/dist/chunks/{block-DiGq58c3.js → block-iptrlMBb.js} +947 -134
- package/dist/chunks/block-iptrlMBb.js.map +1 -0
- package/dist/chunks/choose-CczZJaX_.js +717 -0
- package/dist/chunks/choose-CczZJaX_.js.map +1 -0
- package/dist/chunks/codes-BE2xir2k.js +157 -0
- package/dist/chunks/codes-BE2xir2k.js.map +1 -0
- package/dist/chunks/{constants-BKwqelYD.js → constants-CKkYLPtt.js} +2 -2
- package/dist/chunks/{constants-BKwqelYD.js.map → constants-CKkYLPtt.js.map} +1 -1
- package/dist/chunks/context-C3p0RQxR.js +664 -0
- package/dist/chunks/context-C3p0RQxR.js.map +1 -0
- package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
- package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
- package/dist/chunks/credentials-DXHx7nwR.js +349 -0
- package/dist/chunks/credentials-DXHx7nwR.js.map +1 -0
- package/dist/chunks/cx-export-Bt6NoqTQ.js +259 -0
- package/dist/chunks/cx-export-Bt6NoqTQ.js.map +1 -0
- package/dist/chunks/descriptor-B28U25x4.js +60 -0
- package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
- package/dist/chunks/descriptor-C-YDhtsn.js +48 -0
- package/dist/chunks/descriptor-C-YDhtsn.js.map +1 -0
- package/dist/chunks/descriptor-DLA5kINx.js +142 -0
- package/dist/chunks/descriptor-DLA5kINx.js.map +1 -0
- package/dist/chunks/{emit-CwU8cUmG.js → emit-BwHQkZle.js} +1690 -103
- package/dist/chunks/emit-BwHQkZle.js.map +1 -0
- package/dist/chunks/{escape-CgzxiYPg.js → escape-CuCIzNMB.js} +12 -12
- package/dist/chunks/{escape-CgzxiYPg.js.map → escape-CuCIzNMB.js.map} +1 -1
- package/dist/chunks/{export-BvqAXCKh.js → export-Cha4dRFz.js} +48 -1780
- package/dist/chunks/export-Cha4dRFz.js.map +1 -0
- package/dist/chunks/{exporter--Mk9gXCJ.js → exporter-BP6otMO6.js} +6 -4
- package/dist/chunks/{exporter--Mk9gXCJ.js.map → exporter-BP6otMO6.js.map} +1 -1
- package/dist/chunks/{exporter-CrDWIyiq.js → exporter-D2CETOMK.js} +1222 -154
- package/dist/chunks/exporter-D2CETOMK.js.map +1 -0
- package/dist/chunks/{exporter-DndFlGSa.js → exporter-D9yMtocA.js} +7 -6
- package/dist/chunks/{exporter-DndFlGSa.js.map → exporter-D9yMtocA.js.map} +1 -1
- package/dist/chunks/exporter-_jrBTnos.js +1009 -0
- package/dist/chunks/exporter-_jrBTnos.js.map +1 -0
- package/dist/chunks/{exporter-CJgfhF-l.js → exporter-nDfxIK5D.js} +9 -7
- package/dist/chunks/{exporter-CJgfhF-l.js.map → exporter-nDfxIK5D.js.map} +1 -1
- package/dist/chunks/format-BXiAb-1h.js +408 -0
- package/dist/chunks/format-BXiAb-1h.js.map +1 -0
- package/dist/chunks/{generic-Dq1ntt9q.js → generic-ymWCETAJ.js} +387 -31
- package/dist/chunks/generic-ymWCETAJ.js.map +1 -0
- package/dist/chunks/{importer-CMmeMWlC.js → importer-B92x1xY5.js} +15 -263
- package/dist/chunks/importer-B92x1xY5.js.map +1 -0
- package/dist/chunks/{importer-DiZRmOQG.js → importer-CT9mJ1nn.js} +328 -90
- package/dist/chunks/importer-CT9mJ1nn.js.map +1 -0
- package/dist/chunks/{importer-COTK9Tsl.js → importer-DaLTjbds.js} +116 -1099
- package/dist/chunks/importer-DaLTjbds.js.map +1 -0
- package/dist/chunks/{importer-iFYPEKaJ.js → importer-GREKMdIf.js} +28 -16
- package/dist/chunks/importer-GREKMdIf.js.map +1 -0
- package/dist/chunks/{importer-BSvfrX_h.js → importer-PqaaKKnY.js} +23 -1016
- package/dist/chunks/importer-PqaaKKnY.js.map +1 -0
- package/dist/chunks/{importer-yh_aBCU6.js → importer-Vn5QvmmJ.js} +66 -12
- package/dist/chunks/importer-Vn5QvmmJ.js.map +1 -0
- package/dist/chunks/{importer-e6LGpqHB.js → importer-vRq4h3j5.js} +1470 -354
- package/dist/chunks/importer-vRq4h3j5.js.map +1 -0
- package/dist/chunks/input-CAxt_aV-.js +1397 -0
- package/dist/chunks/input-CAxt_aV-.js.map +1 -0
- package/dist/chunks/{json-elements-DJZRZ6jd.js → json-elements-Cq76WjnZ.js} +4 -4
- package/dist/chunks/{json-elements-DJZRZ6jd.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
- package/dist/chunks/{lexicon-CT69Kd87.js → lexicon-Clf4QIyl.js} +299 -77
- package/dist/chunks/lexicon-Clf4QIyl.js.map +1 -0
- package/dist/chunks/{ontology-export-G4MqRdux.js → ontology-export-OMo91mb0.js} +4 -3
- package/dist/chunks/{ontology-export-G4MqRdux.js.map → ontology-export-OMo91mb0.js.map} +1 -1
- package/dist/chunks/{records-CiaWZrFH.js → records-NJiYvekn.js} +2 -2
- package/dist/chunks/{records-CiaWZrFH.js.map → records-NJiYvekn.js.map} +1 -1
- package/dist/chunks/{format-BpQBx8MZ.js → report-CwMfYa9J.js} +70 -127
- package/dist/chunks/report-CwMfYa9J.js.map +1 -0
- package/dist/chunks/round-trip-Zm3_ivgq.js +79 -0
- package/dist/chunks/round-trip-Zm3_ivgq.js.map +1 -0
- package/dist/chunks/sigv4-EokFic1V.js +247 -0
- package/dist/chunks/sigv4-EokFic1V.js.map +1 -0
- package/dist/chunks/{styles-BQnsga7p.js → styles-CCs214_3.js} +1300 -168
- package/dist/chunks/styles-CCs214_3.js.map +1 -0
- package/dist/chunks/styles-Cm62yyQX.js +2812 -0
- package/dist/chunks/styles-Cm62yyQX.js.map +1 -0
- package/dist/chunks/styles-DPQQIig4.js +1928 -0
- package/dist/chunks/styles-DPQQIig4.js.map +1 -0
- package/dist/chunks/styles-yed-UMFdNqze.js +1213 -0
- package/dist/chunks/styles-yed-UMFdNqze.js.map +1 -0
- package/dist/chunks/{text-CzJNFOS9.js → text-ystE2bYi.js} +2 -2
- package/dist/chunks/{text-CzJNFOS9.js.map → text-ystE2bYi.js.map} +1 -1
- package/dist/csv.js +7 -5
- package/dist/csv.js.map +1 -1
- package/dist/cx.js +5 -4
- package/dist/cx.js.map +1 -1
- package/dist/cx2.js +2 -2
- package/dist/cys.js +1 -1
- package/dist/dot.js +5 -4
- package/dist/dot.js.map +1 -1
- package/dist/gexf.js +42 -10
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +850 -193
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +1189 -220
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +3 -3
- package/dist/json.js +3 -2
- package/dist/neo4j.js +6 -4
- package/dist/neo4j.js.map +1 -1
- package/dist/obo.js +1 -1
- package/dist/pajek.js +1 -1
- package/dist/positions.js +45 -3
- package/dist/positions.js.map +1 -1
- package/dist/sources-cypher.d.ts +1 -0
- package/dist/sources-cypher.js +1351 -0
- package/dist/sources-cypher.js.map +1 -0
- package/dist/sources-ndex.d.ts +1 -0
- package/dist/sources-ndex.js +278 -0
- package/dist/sources-ndex.js.map +1 -0
- package/dist/sources-rest.d.ts +1 -0
- package/dist/sources-rest.js +1377 -0
- package/dist/sources-rest.js.map +1 -0
- package/dist/sources-sparql.d.ts +1 -0
- package/dist/sources-sparql.js +405 -0
- package/dist/sources-sparql.js.map +1 -0
- package/dist/src/common/report.d.ts +6 -3
- package/dist/src/common/report.d.ts.map +1 -1
- package/dist/src/common/report.js +15 -9
- package/dist/src/common/report.js.map +1 -1
- package/dist/src/formats/cx/importer.d.ts.map +1 -1
- package/dist/src/formats/cx/importer.js +5 -1
- package/dist/src/formats/cx/importer.js.map +1 -1
- package/dist/src/formats/cx/styles.d.ts +24 -1
- package/dist/src/formats/cx/styles.d.ts.map +1 -1
- package/dist/src/formats/cx/styles.js +118 -11
- package/dist/src/formats/cx/styles.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +1 -0
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/styles.d.ts.map +1 -1
- package/dist/src/formats/cx2/styles.js +3 -1
- package/dist/src/formats/cx2/styles.js.map +1 -1
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +1 -0
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/styles.d.ts +2 -0
- package/dist/src/formats/cys/styles.d.ts.map +1 -1
- package/dist/src/formats/cys/styles.js +15 -7
- package/dist/src/formats/cys/styles.js.map +1 -1
- package/dist/src/formats/dot/drawing.d.ts +98 -0
- package/dist/src/formats/dot/drawing.d.ts.map +1 -0
- package/dist/src/formats/dot/drawing.js +734 -0
- package/dist/src/formats/dot/drawing.js.map +1 -0
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +108 -31
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/label-places.d.ts +34 -0
- package/dist/src/formats/dot/label-places.d.ts.map +1 -0
- package/dist/src/formats/dot/label-places.js +179 -0
- package/dist/src/formats/dot/label-places.js.map +1 -0
- package/dist/src/formats/dot/record.d.ts +50 -0
- package/dist/src/formats/dot/record.d.ts.map +1 -0
- package/dist/src/formats/dot/record.js +275 -0
- package/dist/src/formats/dot/record.js.map +1 -0
- package/dist/src/formats/dot/styles.d.ts +62 -2
- package/dist/src/formats/dot/styles.d.ts.map +1 -1
- package/dist/src/formats/dot/styles.js +1457 -120
- package/dist/src/formats/dot/styles.js.map +1 -1
- package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
- package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
- package/dist/src/formats/gexf/dialog-metrics.js +59 -0
- package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
- package/dist/src/formats/gexf/importer.d.ts +7 -0
- package/dist/src/formats/gexf/importer.d.ts.map +1 -1
- package/dist/src/formats/gexf/importer.js +41 -5
- package/dist/src/formats/gexf/importer.js.map +1 -1
- package/dist/src/formats/gexf/preview.d.ts +77 -0
- package/dist/src/formats/gexf/preview.d.ts.map +1 -0
- package/dist/src/formats/gexf/preview.js +191 -0
- package/dist/src/formats/gexf/preview.js.map +1 -0
- package/dist/src/formats/gexf/schema.d.ts.map +1 -1
- package/dist/src/formats/gexf/schema.js +2 -1
- package/dist/src/formats/gexf/schema.js.map +1 -1
- package/dist/src/formats/gexf/styles.d.ts +60 -16
- package/dist/src/formats/gexf/styles.d.ts.map +1 -1
- package/dist/src/formats/gexf/styles.js +883 -131
- package/dist/src/formats/gexf/styles.js.map +1 -1
- package/dist/src/formats/gml/importer.d.ts +5 -2
- package/dist/src/formats/gml/importer.d.ts.map +1 -1
- package/dist/src/formats/gml/importer.js +258 -71
- package/dist/src/formats/gml/importer.js.map +1 -1
- package/dist/src/formats/gml/index.d.ts +1 -1
- package/dist/src/formats/gml/index.d.ts.map +1 -1
- package/dist/src/formats/gml/index.js +1 -1
- package/dist/src/formats/gml/index.js.map +1 -1
- package/dist/src/formats/gml/positions.d.ts +7 -0
- package/dist/src/formats/gml/positions.d.ts.map +1 -1
- package/dist/src/formats/gml/positions.js +29 -7
- package/dist/src/formats/gml/positions.js.map +1 -1
- package/dist/src/formats/gml/styles.d.ts.map +1 -1
- package/dist/src/formats/gml/styles.js +756 -103
- package/dist/src/formats/gml/styles.js.map +1 -1
- package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-plain.js +8 -12
- package/dist/src/formats/graphml/styles-plain.js.map +1 -1
- package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
- package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yed.js +749 -148
- package/dist/src/formats/graphml/styles-yed.js.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.js +429 -64
- package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +3 -3
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +16 -6
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/dialect.d.ts +3 -2
- package/dist/src/formats/json/dialect.d.ts.map +1 -1
- package/dist/src/formats/json/dialect.js +39 -5
- package/dist/src/formats/json/dialect.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +13 -2
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +42 -6
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/index.d.ts +1 -1
- package/dist/src/formats/json/index.d.ts.map +1 -1
- package/dist/src/formats/json/index.js +1 -1
- package/dist/src/formats/json/index.js.map +1 -1
- package/dist/src/formats/json/positions.d.ts +5 -2
- package/dist/src/formats/json/positions.d.ts.map +1 -1
- package/dist/src/formats/json/positions.js +20 -4
- package/dist/src/formats/json/positions.js.map +1 -1
- package/dist/src/formats/json/styles.d.ts +12 -1
- package/dist/src/formats/json/styles.d.ts.map +1 -1
- package/dist/src/formats/json/styles.js +1755 -136
- package/dist/src/formats/json/styles.js.map +1 -1
- package/dist/src/formats/pajek/draw.d.ts +96 -0
- package/dist/src/formats/pajek/draw.d.ts.map +1 -0
- package/dist/src/formats/pajek/draw.js +372 -0
- package/dist/src/formats/pajek/draw.js.map +1 -0
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +70 -51
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +9 -0
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +233 -102
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +1 -0
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/styles.d.ts +15 -7
- package/dist/src/formats/pajek/styles.d.ts.map +1 -1
- package/dist/src/formats/pajek/styles.js +1279 -114
- package/dist/src/formats/pajek/styles.js.map +1 -1
- package/dist/src/formats/pajek/syntax.d.ts +10 -1
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
- package/dist/src/formats/pajek/syntax.js +26 -2
- package/dist/src/formats/pajek/syntax.js.map +1 -1
- package/dist/src/formats/xgmml/emit.d.ts +1 -0
- package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
- package/dist/src/formats/xgmml/emit.js +65 -5
- package/dist/src/formats/xgmml/emit.js.map +1 -1
- package/dist/src/formats/xgmml/styles.d.ts +23 -3
- package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
- package/dist/src/formats/xgmml/styles.js +278 -60
- package/dist/src/formats/xgmml/styles.js.map +1 -1
- package/dist/src/index.d.ts +10 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/positions/convert.d.ts.map +1 -1
- package/dist/src/positions/convert.js +11 -1
- package/dist/src/positions/convert.js.map +1 -1
- package/dist/src/positions/extract.d.ts.map +1 -1
- package/dist/src/positions/extract.js +53 -1
- package/dist/src/positions/extract.js.map +1 -1
- package/dist/src/positions/index.d.ts +1 -1
- package/dist/src/positions/index.d.ts.map +1 -1
- package/dist/src/positions/types.d.ts +59 -0
- package/dist/src/positions/types.d.ts.map +1 -1
- package/dist/src/registry.d.ts +173 -1
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +196 -1
- package/dist/src/registry.js.map +1 -1
- package/dist/src/sources/builtins.d.ts +11 -0
- package/dist/src/sources/builtins.d.ts.map +1 -0
- package/dist/src/sources/builtins.js +53 -0
- package/dist/src/sources/builtins.js.map +1 -0
- package/dist/src/sources/codes.d.ts +230 -0
- package/dist/src/sources/codes.d.ts.map +1 -0
- package/dist/src/sources/codes.js +58 -0
- package/dist/src/sources/codes.js.map +1 -0
- package/dist/src/sources/context.d.ts +112 -0
- package/dist/src/sources/context.d.ts.map +1 -0
- package/dist/src/sources/context.js +740 -0
- package/dist/src/sources/context.js.map +1 -0
- package/dist/src/sources/credentials.d.ts +179 -0
- package/dist/src/sources/credentials.d.ts.map +1 -0
- package/dist/src/sources/credentials.js +301 -0
- package/dist/src/sources/credentials.js.map +1 -0
- package/dist/src/sources/cypher/descriptor.d.ts +21 -0
- package/dist/src/sources/cypher/descriptor.d.ts.map +1 -0
- package/dist/src/sources/cypher/descriptor.js +124 -0
- package/dist/src/sources/cypher/descriptor.js.map +1 -0
- package/dist/src/sources/cypher/flatten.d.ts +72 -0
- package/dist/src/sources/cypher/flatten.d.ts.map +1 -0
- package/dist/src/sources/cypher/flatten.js +279 -0
- package/dist/src/sources/cypher/flatten.js.map +1 -0
- package/dist/src/sources/cypher/index.d.ts +33 -0
- package/dist/src/sources/cypher/index.d.ts.map +1 -0
- package/dist/src/sources/cypher/index.js +511 -0
- package/dist/src/sources/cypher/index.js.map +1 -0
- package/dist/src/sources/cypher/params.d.ts +40 -0
- package/dist/src/sources/cypher/params.d.ts.map +1 -0
- package/dist/src/sources/cypher/params.js +6 -0
- package/dist/src/sources/cypher/params.js.map +1 -0
- package/dist/src/sources/cypher/profiles.d.ts +44 -0
- package/dist/src/sources/cypher/profiles.d.ts.map +1 -0
- package/dist/src/sources/cypher/profiles.js +61 -0
- package/dist/src/sources/cypher/profiles.js.map +1 -0
- package/dist/src/sources/cypher/query-builder.d.ts +123 -0
- package/dist/src/sources/cypher/query-builder.d.ts.map +1 -0
- package/dist/src/sources/cypher/query-builder.js +267 -0
- package/dist/src/sources/cypher/query-builder.js.map +1 -0
- package/dist/src/sources/cypher/transports/bolt.d.ts +21 -0
- package/dist/src/sources/cypher/transports/bolt.d.ts.map +1 -0
- package/dist/src/sources/cypher/transports/bolt.js +185 -0
- package/dist/src/sources/cypher/transports/bolt.js.map +1 -0
- package/dist/src/sources/cypher/transports/neptune-analytics.d.ts +15 -0
- package/dist/src/sources/cypher/transports/neptune-analytics.d.ts.map +1 -0
- package/dist/src/sources/cypher/transports/neptune-analytics.js +38 -0
- package/dist/src/sources/cypher/transports/neptune-analytics.js.map +1 -0
- package/dist/src/sources/cypher/transports/neptune-https.d.ts +31 -0
- package/dist/src/sources/cypher/transports/neptune-https.d.ts.map +1 -0
- package/dist/src/sources/cypher/transports/neptune-https.js +104 -0
- package/dist/src/sources/cypher/transports/neptune-https.js.map +1 -0
- package/dist/src/sources/cypher/transports/query-api.d.ts +14 -0
- package/dist/src/sources/cypher/transports/query-api.d.ts.map +1 -0
- package/dist/src/sources/cypher/transports/query-api.js +80 -0
- package/dist/src/sources/cypher/transports/query-api.js.map +1 -0
- package/dist/src/sources/cypher/transports/transport.d.ts +78 -0
- package/dist/src/sources/cypher/transports/transport.d.ts.map +1 -0
- package/dist/src/sources/cypher/transports/transport.js +77 -0
- package/dist/src/sources/cypher/transports/transport.js.map +1 -0
- package/dist/src/sources/cypher/types-map.d.ts +91 -0
- package/dist/src/sources/cypher/types-map.d.ts.map +1 -0
- package/dist/src/sources/cypher/types-map.js +306 -0
- package/dist/src/sources/cypher/types-map.js.map +1 -0
- package/dist/src/sources/define.d.ts +47 -0
- package/dist/src/sources/define.d.ts.map +1 -0
- package/dist/src/sources/define.js +173 -0
- package/dist/src/sources/define.js.map +1 -0
- package/dist/src/sources/fail.d.ts +33 -0
- package/dist/src/sources/fail.d.ts.map +1 -0
- package/dist/src/sources/fail.js +49 -0
- package/dist/src/sources/fail.js.map +1 -0
- package/dist/src/sources/ids.d.ts +69 -0
- package/dist/src/sources/ids.d.ts.map +1 -0
- package/dist/src/sources/ids.js +69 -0
- package/dist/src/sources/ids.js.map +1 -0
- package/dist/src/sources/ndex/client.d.ts +31 -0
- package/dist/src/sources/ndex/client.d.ts.map +1 -0
- package/dist/src/sources/ndex/client.js +90 -0
- package/dist/src/sources/ndex/client.js.map +1 -0
- package/dist/src/sources/ndex/descriptor.d.ts +10 -0
- package/dist/src/sources/ndex/descriptor.d.ts.map +1 -0
- package/dist/src/sources/ndex/descriptor.js +55 -0
- package/dist/src/sources/ndex/descriptor.js.map +1 -0
- package/dist/src/sources/ndex/expand.d.ts +20 -0
- package/dist/src/sources/ndex/expand.d.ts.map +1 -0
- package/dist/src/sources/ndex/expand.js +87 -0
- package/dist/src/sources/ndex/expand.js.map +1 -0
- package/dist/src/sources/ndex/index.d.ts +25 -0
- package/dist/src/sources/ndex/index.d.ts.map +1 -0
- package/dist/src/sources/ndex/index.js +191 -0
- package/dist/src/sources/ndex/index.js.map +1 -0
- package/dist/src/sources/ndex/params.d.ts +17 -0
- package/dist/src/sources/ndex/params.d.ts.map +1 -0
- package/dist/src/sources/ndex/params.js +6 -0
- package/dist/src/sources/ndex/params.js.map +1 -0
- package/dist/src/sources/ndex/share-url.d.ts +40 -0
- package/dist/src/sources/ndex/share-url.d.ts.map +1 -0
- package/dist/src/sources/ndex/share-url.js +64 -0
- package/dist/src/sources/ndex/share-url.js.map +1 -0
- package/dist/src/sources/params.d.ts +31 -0
- package/dist/src/sources/params.d.ts.map +1 -0
- package/dist/src/sources/params.js +6 -0
- package/dist/src/sources/params.js.map +1 -0
- package/dist/src/sources/registry.d.ts +118 -0
- package/dist/src/sources/registry.d.ts.map +1 -0
- package/dist/src/sources/registry.js +193 -0
- package/dist/src/sources/registry.js.map +1 -0
- package/dist/src/sources/rest/descriptor.d.ts +16 -0
- package/dist/src/sources/rest/descriptor.d.ts.map +1 -0
- package/dist/src/sources/rest/descriptor.js +76 -0
- package/dist/src/sources/rest/descriptor.js.map +1 -0
- package/dist/src/sources/rest/index.d.ts +14 -0
- package/dist/src/sources/rest/index.d.ts.map +1 -0
- package/dist/src/sources/rest/index.js +13 -0
- package/dist/src/sources/rest/index.js.map +1 -0
- package/dist/src/sources/rest/mapping.d.ts +30 -0
- package/dist/src/sources/rest/mapping.d.ts.map +1 -0
- package/dist/src/sources/rest/mapping.js +362 -0
- package/dist/src/sources/rest/mapping.js.map +1 -0
- package/dist/src/sources/rest/openalex.d.ts +27 -0
- package/dist/src/sources/rest/openalex.d.ts.map +1 -0
- package/dist/src/sources/rest/openalex.js +269 -0
- package/dist/src/sources/rest/openalex.js.map +1 -0
- package/dist/src/sources/rest/paging.d.ts +53 -0
- package/dist/src/sources/rest/paging.d.ts.map +1 -0
- package/dist/src/sources/rest/paging.js +138 -0
- package/dist/src/sources/rest/paging.js.map +1 -0
- package/dist/src/sources/rest/params.d.ts +216 -0
- package/dist/src/sources/rest/params.d.ts.map +1 -0
- package/dist/src/sources/rest/params.js +7 -0
- package/dist/src/sources/rest/params.js.map +1 -0
- package/dist/src/sources/rest/records.d.ts +41 -0
- package/dist/src/sources/rest/records.d.ts.map +1 -0
- package/dist/src/sources/rest/records.js +240 -0
- package/dist/src/sources/rest/records.js.map +1 -0
- package/dist/src/sources/rest/samples/deps-dev.d.ts +10 -0
- package/dist/src/sources/rest/samples/deps-dev.d.ts.map +1 -0
- package/dist/src/sources/rest/samples/deps-dev.js +47 -0
- package/dist/src/sources/rest/samples/deps-dev.js.map +1 -0
- package/dist/src/sources/rest/samples/string.d.ts +9 -0
- package/dist/src/sources/rest/samples/string.d.ts.map +1 -0
- package/dist/src/sources/rest/samples/string.js +42 -0
- package/dist/src/sources/rest/samples/string.js.map +1 -0
- package/dist/src/sources/rest/selectors.d.ts +41 -0
- package/dist/src/sources/rest/selectors.d.ts.map +1 -0
- package/dist/src/sources/rest/selectors.js +81 -0
- package/dist/src/sources/rest/selectors.js.map +1 -0
- package/dist/src/sources/rest/source.d.ts +67 -0
- package/dist/src/sources/rest/source.d.ts.map +1 -0
- package/dist/src/sources/rest/source.js +650 -0
- package/dist/src/sources/rest/source.js.map +1 -0
- package/dist/src/sources/rest/templates.d.ts +38 -0
- package/dist/src/sources/rest/templates.d.ts.map +1 -0
- package/dist/src/sources/rest/templates.js +125 -0
- package/dist/src/sources/rest/templates.js.map +1 -0
- package/dist/src/sources/run.d.ts +93 -0
- package/dist/src/sources/run.d.ts.map +1 -0
- package/dist/src/sources/run.js +673 -0
- package/dist/src/sources/run.js.map +1 -0
- package/dist/src/sources/sha256.d.ts +12 -0
- package/dist/src/sources/sha256.d.ts.map +1 -0
- package/dist/src/sources/sha256.js +95 -0
- package/dist/src/sources/sha256.js.map +1 -0
- package/dist/src/sources/sigv4.d.ts +26 -0
- package/dist/src/sources/sigv4.d.ts.map +1 -0
- package/dist/src/sources/sigv4.js +184 -0
- package/dist/src/sources/sigv4.js.map +1 -0
- package/dist/src/sources/sparql/descriptor.d.ts +10 -0
- package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
- package/dist/src/sources/sparql/descriptor.js +64 -0
- package/dist/src/sources/sparql/descriptor.js.map +1 -0
- package/dist/src/sources/sparql/index.d.ts +28 -0
- package/dist/src/sources/sparql/index.d.ts.map +1 -0
- package/dist/src/sources/sparql/index.js +314 -0
- package/dist/src/sources/sparql/index.js.map +1 -0
- package/dist/src/sources/sparql/ntriples.d.ts +69 -0
- package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
- package/dist/src/sources/sparql/ntriples.js +180 -0
- package/dist/src/sources/sparql/ntriples.js.map +1 -0
- package/dist/src/sources/sparql/params.d.ts +27 -0
- package/dist/src/sources/sparql/params.d.ts.map +1 -0
- package/dist/src/sources/sparql/params.js +5 -0
- package/dist/src/sources/sparql/params.js.map +1 -0
- package/dist/src/sources/sparql/query.d.ts +72 -0
- package/dist/src/sources/sparql/query.d.ts.map +1 -0
- package/dist/src/sources/sparql/query.js +113 -0
- package/dist/src/sources/sparql/query.js.map +1 -0
- package/dist/src/sources/testing.d.ts +96 -0
- package/dist/src/sources/testing.d.ts.map +1 -0
- package/dist/src/sources/testing.js +138 -0
- package/dist/src/sources/testing.js.map +1 -0
- package/dist/src/sources/types.d.ts +696 -0
- package/dist/src/sources/types.d.ts.map +1 -0
- package/dist/src/sources/types.js +10 -0
- package/dist/src/sources/types.js.map +1 -0
- package/dist/src/styles/annotations.d.ts +61 -5
- package/dist/src/styles/annotations.d.ts.map +1 -1
- package/dist/src/styles/annotations.js +130 -22
- package/dist/src/styles/annotations.js.map +1 -1
- package/dist/src/styles/canon/bends.d.ts +46 -0
- package/dist/src/styles/canon/bends.d.ts.map +1 -1
- package/dist/src/styles/canon/bends.js +123 -0
- package/dist/src/styles/canon/bends.js.map +1 -1
- package/dist/src/styles/canon/color-tables.d.ts +6 -1
- package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
- package/dist/src/styles/canon/color-tables.js +10 -4
- package/dist/src/styles/canon/color-tables.js.map +1 -1
- package/dist/src/styles/canon/color.d.ts +3 -1
- package/dist/src/styles/canon/color.d.ts.map +1 -1
- package/dist/src/styles/canon/color.js +103 -3
- package/dist/src/styles/canon/color.js.map +1 -1
- package/dist/src/styles/canon/enums.d.ts +2 -2
- package/dist/src/styles/canon/enums.d.ts.map +1 -1
- package/dist/src/styles/canon/enums.js +82 -7
- package/dist/src/styles/canon/enums.js.map +1 -1
- package/dist/src/styles/canon/graphviz.d.ts +12 -3
- package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
- package/dist/src/styles/canon/graphviz.js +57 -9
- package/dist/src/styles/canon/graphviz.js.map +1 -1
- package/dist/src/styles/canon/number.d.ts +8 -0
- package/dist/src/styles/canon/number.d.ts.map +1 -1
- package/dist/src/styles/canon/number.js +18 -0
- package/dist/src/styles/canon/number.js.map +1 -1
- package/dist/src/styles/canon/text.d.ts +29 -2
- package/dist/src/styles/canon/text.d.ts.map +1 -1
- package/dist/src/styles/canon/text.js +156 -16
- package/dist/src/styles/canon/text.js.map +1 -1
- package/dist/src/styles/codes.d.ts +2 -0
- package/dist/src/styles/codes.d.ts.map +1 -1
- package/dist/src/styles/codes.js +2 -0
- package/dist/src/styles/codes.js.map +1 -1
- package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
- package/dist/src/styles/cyjs/cascade.js +1037 -35
- package/dist/src/styles/cyjs/cascade.js.map +1 -1
- package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
- package/dist/src/styles/cyjs/defaults-table.js +5 -0
- package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
- package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
- package/dist/src/styles/cyjs/emit.js +216 -12
- package/dist/src/styles/cyjs/emit.js.map +1 -1
- package/dist/src/styles/cyjs/face.d.ts +20 -0
- package/dist/src/styles/cyjs/face.d.ts.map +1 -0
- package/dist/src/styles/cyjs/face.js +332 -0
- package/dist/src/styles/cyjs/face.js.map +1 -0
- package/dist/src/styles/cyjs/mappers.d.ts +48 -2
- package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
- package/dist/src/styles/cyjs/mappers.js +463 -26
- package/dist/src/styles/cyjs/mappers.js.map +1 -1
- package/dist/src/styles/cyjs/routes.d.ts +53 -0
- package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
- package/dist/src/styles/cyjs/routes.js +360 -0
- package/dist/src/styles/cyjs/routes.js.map +1 -0
- package/dist/src/styles/cytoscape/charts.d.ts +23 -0
- package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/charts.js +560 -0
- package/dist/src/styles/cytoscape/charts.js.map +1 -0
- package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/emit.js +204 -44
- package/dist/src/styles/cytoscape/emit.js.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.d.ts +97 -3
- package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.js +413 -79
- package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
- package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
- package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/mappings.js +92 -0
- package/dist/src/styles/cytoscape/mappings.js.map +1 -1
- package/dist/src/styles/cytoscape/resolve.d.ts +46 -3
- package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/resolve.js +632 -22
- package/dist/src/styles/cytoscape/resolve.js.map +1 -1
- package/dist/src/styles/cytoscape/translate.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/translate.js +10 -10
- package/dist/src/styles/cytoscape/translate.js.map +1 -1
- package/dist/src/styles/defaults.d.ts +50 -0
- package/dist/src/styles/defaults.d.ts.map +1 -1
- package/dist/src/styles/defaults.js +315 -37
- package/dist/src/styles/defaults.js.map +1 -1
- package/dist/src/styles/index.d.ts +4 -3
- package/dist/src/styles/index.d.ts.map +1 -1
- package/dist/src/styles/index.js +3 -2
- package/dist/src/styles/index.js.map +1 -1
- package/dist/src/styles/internal.d.ts +1 -0
- package/dist/src/styles/internal.d.ts.map +1 -1
- package/dist/src/styles/internal.js +1 -0
- package/dist/src/styles/internal.js.map +1 -1
- package/dist/src/styles/io/block.d.ts.map +1 -1
- package/dist/src/styles/io/block.js +9 -0
- package/dist/src/styles/io/block.js.map +1 -1
- package/dist/src/styles/io/generic.d.ts.map +1 -1
- package/dist/src/styles/io/generic.js +56 -16
- package/dist/src/styles/io/generic.js.map +1 -1
- package/dist/src/styles/io/round-trip.d.ts +56 -0
- package/dist/src/styles/io/round-trip.d.ts.map +1 -0
- package/dist/src/styles/io/round-trip.js +138 -0
- package/dist/src/styles/io/round-trip.js.map +1 -0
- package/dist/src/styles/io/writer.d.ts.map +1 -1
- package/dist/src/styles/io/writer.js +13 -4
- package/dist/src/styles/io/writer.js.map +1 -1
- package/dist/src/styles/notes.d.ts.map +1 -1
- package/dist/src/styles/notes.js +1 -0
- package/dist/src/styles/notes.js.map +1 -1
- package/dist/src/styles/plan/features.d.ts +1 -1
- package/dist/src/styles/plan/features.d.ts.map +1 -1
- package/dist/src/styles/plan/features.js +22 -2
- package/dist/src/styles/plan/features.js.map +1 -1
- package/dist/src/styles/plan/index.d.ts +1 -1
- package/dist/src/styles/plan/index.d.ts.map +1 -1
- package/dist/src/styles/plan/index.js +1 -1
- package/dist/src/styles/plan/index.js.map +1 -1
- package/dist/src/styles/plan/plan.d.ts.map +1 -1
- package/dist/src/styles/plan/plan.js +61 -4
- package/dist/src/styles/plan/plan.js.map +1 -1
- package/dist/src/styles/plan/resolve.d.ts +13 -1
- package/dist/src/styles/plan/resolve.d.ts.map +1 -1
- package/dist/src/styles/plan/resolve.js +53 -6
- package/dist/src/styles/plan/resolve.js.map +1 -1
- package/dist/src/styles/slots.d.ts +14 -0
- package/dist/src/styles/slots.d.ts.map +1 -0
- package/dist/src/styles/slots.js +20 -0
- package/dist/src/styles/slots.js.map +1 -0
- package/dist/src/styles/types.d.ts +638 -5
- package/dist/src/styles/types.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.d.ts +3 -2
- package/dist/src/styles/vocabulary.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.js +218 -1
- package/dist/src/styles/vocabulary.js.map +1 -1
- package/dist/src/types.d.ts +19 -5
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/styles.js +29 -238
- package/dist/styles.js.map +1 -1
- package/dist/xgmml.js +3 -3
- package/docs/samples/people.json +6 -0
- package/package.json +53 -8
- package/src/common/report.ts +27 -7
- package/src/formats/cx/importer.ts +6 -1
- package/src/formats/cx/styles.ts +144 -9
- package/src/formats/cx2/importer.ts +1 -0
- package/src/formats/cx2/styles.ts +3 -1
- package/src/formats/cys/importer.ts +1 -0
- package/src/formats/cys/styles.ts +27 -5
- package/src/formats/dot/drawing.ts +799 -0
- package/src/formats/dot/importer.ts +120 -35
- package/src/formats/dot/label-places.ts +228 -0
- package/src/formats/dot/record.ts +336 -0
- package/src/formats/dot/styles.ts +1657 -154
- package/src/formats/gexf/dialog-metrics.ts +61 -0
- package/src/formats/gexf/importer.ts +50 -5
- package/src/formats/gexf/preview.ts +217 -0
- package/src/formats/gexf/schema.ts +2 -1
- package/src/formats/gexf/styles.ts +1144 -142
- package/src/formats/gml/importer.ts +291 -76
- package/src/formats/gml/index.ts +1 -1
- package/src/formats/gml/positions.ts +29 -7
- package/src/formats/gml/styles.ts +854 -111
- package/src/formats/graphml/styles-plain.ts +8 -23
- package/src/formats/graphml/styles-yed.ts +821 -159
- package/src/formats/graphml/styles-yfiles3.ts +485 -63
- package/src/formats/graphml/yfiles.ts +19 -6
- package/src/formats/json/dialect.ts +41 -5
- package/src/formats/json/importer.ts +59 -7
- package/src/formats/json/index.ts +1 -0
- package/src/formats/json/positions.ts +22 -5
- package/src/formats/json/styles.ts +2041 -185
- package/src/formats/pajek/draw.ts +458 -0
- package/src/formats/pajek/exporter.ts +81 -49
- package/src/formats/pajek/importer.ts +278 -103
- package/src/formats/pajek/index.ts +1 -0
- package/src/formats/pajek/styles.ts +1382 -133
- package/src/formats/pajek/syntax.ts +27 -2
- package/src/formats/xgmml/emit.ts +73 -5
- package/src/formats/xgmml/styles.ts +331 -71
- package/src/index.ts +94 -0
- package/src/positions/convert.ts +12 -1
- package/src/positions/extract.ts +55 -1
- package/src/positions/index.ts +1 -0
- package/src/positions/types.ts +60 -0
- package/src/registry.ts +326 -1
- package/src/sources/builtins.ts +63 -0
- package/src/sources/codes.ts +235 -0
- package/src/sources/context.ts +894 -0
- package/src/sources/credentials.ts +409 -0
- package/src/sources/cypher/descriptor.ts +131 -0
- package/src/sources/cypher/flatten.ts +323 -0
- package/src/sources/cypher/index.ts +628 -0
- package/src/sources/cypher/params.ts +41 -0
- package/src/sources/cypher/profiles.ts +78 -0
- package/src/sources/cypher/query-builder.ts +327 -0
- package/src/sources/cypher/transports/bolt.ts +228 -0
- package/src/sources/cypher/transports/neptune-analytics.ts +41 -0
- package/src/sources/cypher/transports/neptune-https.ts +122 -0
- package/src/sources/cypher/transports/query-api.ts +100 -0
- package/src/sources/cypher/transports/transport.ts +139 -0
- package/src/sources/cypher/types-map.ts +418 -0
- package/src/sources/define.ts +195 -0
- package/src/sources/fail.ts +70 -0
- package/src/sources/ids.ts +80 -0
- package/src/sources/ndex/client.ts +102 -0
- package/src/sources/ndex/descriptor.ts +64 -0
- package/src/sources/ndex/expand.ts +100 -0
- package/src/sources/ndex/index.ts +235 -0
- package/src/sources/ndex/params.ts +17 -0
- package/src/sources/ndex/share-url.ts +84 -0
- package/src/sources/params.ts +32 -0
- package/src/sources/registry.ts +325 -0
- package/src/sources/rest/descriptor.ts +79 -0
- package/src/sources/rest/index.ts +22 -0
- package/src/sources/rest/mapping.ts +401 -0
- package/src/sources/rest/openalex.ts +288 -0
- package/src/sources/rest/paging.ts +180 -0
- package/src/sources/rest/params.ts +243 -0
- package/src/sources/rest/records.ts +289 -0
- package/src/sources/rest/samples/deps-dev.ts +49 -0
- package/src/sources/rest/samples/string.ts +44 -0
- package/src/sources/rest/selectors.ts +91 -0
- package/src/sources/rest/source.ts +776 -0
- package/src/sources/rest/templates.ts +151 -0
- package/src/sources/run.ts +793 -0
- package/src/sources/sha256.ts +99 -0
- package/src/sources/sigv4.ts +209 -0
- package/src/sources/sparql/descriptor.ts +67 -0
- package/src/sources/sparql/index.ts +356 -0
- package/src/sources/sparql/ntriples.ts +219 -0
- package/src/sources/sparql/params.ts +28 -0
- package/src/sources/sparql/query.ts +162 -0
- package/src/sources/testing.ts +210 -0
- package/src/sources/types.ts +776 -0
- package/src/styles/annotations.ts +201 -27
- package/src/styles/canon/bends.ts +137 -0
- package/src/styles/canon/color-tables.ts +10 -4
- package/src/styles/canon/color.ts +105 -3
- package/src/styles/canon/enums.ts +99 -8
- package/src/styles/canon/graphviz.ts +71 -10
- package/src/styles/canon/number.ts +19 -0
- package/src/styles/canon/text.ts +187 -16
- package/src/styles/codes.ts +2 -0
- package/src/styles/cyjs/cascade.ts +1193 -38
- package/src/styles/cyjs/defaults-table.ts +5 -0
- package/src/styles/cyjs/emit.ts +247 -16
- package/src/styles/cyjs/face.ts +372 -0
- package/src/styles/cyjs/mappers.ts +498 -28
- package/src/styles/cyjs/routes.ts +432 -0
- package/src/styles/cytoscape/charts.ts +684 -0
- package/src/styles/cytoscape/emit.ts +220 -44
- package/src/styles/cytoscape/lexicon.ts +459 -80
- package/src/styles/cytoscape/mappings.ts +108 -0
- package/src/styles/cytoscape/resolve.ts +763 -23
- package/src/styles/cytoscape/translate.ts +11 -11
- package/src/styles/defaults.ts +436 -38
- package/src/styles/index.ts +5 -0
- package/src/styles/internal.ts +1 -0
- package/src/styles/io/block.ts +10 -0
- package/src/styles/io/generic.ts +79 -23
- package/src/styles/io/round-trip.ts +202 -0
- package/src/styles/io/writer.ts +14 -4
- package/src/styles/notes.ts +1 -0
- package/src/styles/plan/features.ts +23 -2
- package/src/styles/plan/index.ts +1 -1
- package/src/styles/plan/plan.ts +69 -5
- package/src/styles/plan/resolve.ts +61 -6
- package/src/styles/slots.ts +25 -0
- package/src/styles/types.ts +658 -4
- package/src/styles/vocabulary.ts +226 -3
- package/src/types.ts +19 -5
- package/dist/chunks/block-DiGq58c3.js.map +0 -1
- package/dist/chunks/choose--jM0yYCo.js +0 -57
- package/dist/chunks/choose--jM0yYCo.js.map +0 -1
- package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
- package/dist/chunks/emit-CwU8cUmG.js.map +0 -1
- package/dist/chunks/export-BvqAXCKh.js.map +0 -1
- package/dist/chunks/exporter-CrDWIyiq.js.map +0 -1
- package/dist/chunks/format-BpQBx8MZ.js.map +0 -1
- package/dist/chunks/generic-Dq1ntt9q.js.map +0 -1
- package/dist/chunks/importer-BSvfrX_h.js.map +0 -1
- package/dist/chunks/importer-CMmeMWlC.js.map +0 -1
- package/dist/chunks/importer-COTK9Tsl.js.map +0 -1
- package/dist/chunks/importer-DiZRmOQG.js.map +0 -1
- package/dist/chunks/importer-e6LGpqHB.js.map +0 -1
- package/dist/chunks/importer-iFYPEKaJ.js.map +0 -1
- package/dist/chunks/importer-yh_aBCU6.js.map +0 -1
- package/dist/chunks/lexicon-CT69Kd87.js.map +0 -1
- package/dist/chunks/styles-BQnsga7p.js.map +0 -1
- package/dist/chunks/styles-D3fRphrO.js +0 -690
- package/dist/chunks/styles-D3fRphrO.js.map +0 -1
- package/dist/chunks/styles-yed-BF5x3_Y5.js +0 -842
- package/dist/chunks/styles-yed-BF5x3_Y5.js.map +0 -1
- package/dist/chunks/writer-DMKvthQE.js +0 -448
- package/dist/chunks/writer-DMKvthQE.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"importer-CMmeMWlC.js","sources":["../../src/common/cx-export.ts","../../src/formats/cx2/styles.ts","../../src/formats/cx2/importer.ts"],"sourcesContent":["/**\n * The exporter machinery CX version 1 and CX2 share (design/graph-io/cytoscape-and-obo/design.md\n * sections 1.2 and 1.3): integer node ids (safe integers, or the digits of an integer beyond 2^53\n * written raw), sanitizeIds \"mangle\" renumbering, edge ids from the id role column, the declared\n * type of a column, the direction notes (every CX edge is directed) and the JSON writer that keeps\n * -0 and raw big integers.\n */\n\nimport { type Column, GraphFormatError, type GraphSnapshot, type NodeId } from \"@graphty/graph-format\";\n\nimport { type LossNote } from \"../types.js\";\nimport { type PairFolding } from \"./direction.js\";\nimport { LOSS } from \"./export.js\";\nimport { type ResolvedExportOptions } from \"./options.js\";\nimport { agree, plural } from \"./plural.js\";\n\n/**\n * Records a loss note.\n * @category Plugin helpers\n */\nexport type CxNoteFn = (code: string, message: string, column?: string | null, count?: number | null) => void;\n\n/**\n * The prefix of a string that stands for a raw number literal in the output: -0 (which\n * JSON.stringify writes as 0) and an integer id beyond 2^53 (kept as its digits).\n */\nconst RAW = `${String.fromCodePoint(0)}cx:`;\n\n/** A raw literal as JSON.stringify writes it, to be unquoted. */\nconst RAW_JSON = /\"\\\\u0000cx:(-?\\d+)\"/g;\n\n/** An integer literal beyond 2^53 as text: a CX id graph-io keeps as its digits. */\nconst BIG_INTEGER_TEXT = /^-?[1-9]\\d{15,}$/;\n\n/**\n * The node ids as written: the original, a renumbered one, or a raw big integer.\n * @category Plugin helpers\n */\nexport interface WrittenIds {\n /** How many ids were renumbered (sanitizeIds \"mangle\"). */\n readonly changed: number;\n /**\n * The written id of a node.\n * @param i - the node index\n * @returns a number, or a raw string for a big integer\n */\n idAt(i: number): NodeId;\n /**\n * Whether a node was renumbered.\n * @param i - the node index\n * @returns true when its original goes into graphty:originalId\n */\n isChanged(i: number): boolean;\n /**\n * The original id of a node.\n * @param i - the node index\n * @returns the snapshot's id\n */\n originalAt(i: number): NodeId;\n}\n\n/**\n * Whether an id can be written as a CX id unchanged: a safe integer, or the digits of an integer\n * beyond 2^53 (the CX importers read those back as the same digits).\n * @param id - the id\n * @returns true when writable\n */\nfunction writableId(id: NodeId): boolean {\n return typeof id === \"number\"\n ? Number.isSafeInteger(id)\n : BIG_INTEGER_TEXT.test(id) && !Number.isSafeInteger(Number(id));\n}\n\n/**\n * The written node ids; under \"error\" an id that is not writable throws E_INVALID_ID, under\n * \"mangle\" it gets the next unused integer.\n * @param snapshot - the snapshot\n * @param mode - the sanitizeIds option\n * @param format - the format's display name, for the message\n * @returns the ids\n */\nfunction writtenIds(snapshot: GraphSnapshot, mode: \"error\" | \"mangle\", format: string): WrittenIds {\n const { ids } = snapshot;\n const bad: number[] = [];\n const used = new Set<number>();\n for (let i = 0; i < ids.size; i++) {\n const id = ids.idOf(i);\n if (!writableId(id)) {\n bad.push(i);\n } else if (typeof id === \"number\") {\n used.add(id);\n }\n }\n if (bad.length > 0 && mode === \"error\") {\n const first = ids.idOf(bad[0]);\n throw new GraphFormatError(\n \"E_INVALID_ID\",\n `${bad.length} node id${plural(bad.length)} cannot be written as ${format} integers (first: ${JSON.stringify(first)} at index ${bad[0]}); pass sanitizeIds: \"mangle\" to rewrite them`,\n { reason: \"charset\", charset: \"integer\", count: bad.length, index: bad[0] },\n );\n }\n const renumbered = new Map<number, number>();\n let next = 0;\n for (const i of bad) {\n while (used.has(next)) {\n next++;\n }\n used.add(next);\n renumbered.set(i, next);\n }\n return {\n changed: bad.length,\n idAt: (i: number): NodeId => {\n const id = renumbered.get(i) ?? ids.idOf(i);\n return typeof id === \"string\" ? `${RAW}${id}` : id;\n },\n isChanged: (i: number): boolean => renumbered.has(i),\n originalAt: (i: number): NodeId => ids.idOf(i),\n };\n}\n\n/**\n * The `idCounter` of the node ids as written (the largest id plus one, NDEx's next free id).\n * @param ids - the written ids\n * @param count - the node count\n * @returns the counter: a number, or a raw big integer for stringify()\n * @category Plugin helpers\n */\nexport function nextNodeId(ids: WrittenIds, count: number): NodeId {\n let max = -1n;\n for (let i = 0; i < count; i++) {\n const id = ids.idAt(i);\n const value = typeof id === \"number\" ? BigInt(id) : BigInt(id.slice(RAW.length));\n if (value > max) {\n max = value;\n }\n }\n const next = max + 1n;\n return next <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(next) : `${RAW}${next.toString()}`;\n}\n\n/**\n * How many node ids are not writable unchanged.\n * @param snapshot - the snapshot\n * @returns the count\n */\nfunction unwritableIds(snapshot: GraphSnapshot): number {\n let count = 0;\n for (let i = 0; i < snapshot.ids.size; i++) {\n if (!writableId(snapshot.ids.idOf(i))) {\n count++;\n }\n }\n return count;\n}\n\n/**\n * The id notes and the written ids of a CX export: E_ID_CHARSET (export() throws) or\n * W_ID_MANGLED for the ids that are not integers.\n * @param snapshot - the snapshot\n * @param common - the resolved common options\n * @param format - the format's display name\n * @param attribute - the attribute the originals are kept in\n * @param note - records a note\n * @returns the ids, or the error export() throws\n * @category Plugin helpers\n */\nexport function planNodeIds(\n snapshot: GraphSnapshot,\n common: ResolvedExportOptions,\n format: string,\n attribute: string,\n note: CxNoteFn,\n): WrittenIds | GraphFormatError {\n const unwritable = unwritableIds(snapshot);\n if (unwritable > 0) {\n note(\n common.sanitizeIds === \"mangle\" ? LOSS.ID_MANGLED : LOSS.ID_CHARSET,\n common.sanitizeIds === \"mangle\"\n ? `${unwritable} node id${plural(unwritable)} ${agree(unwritable, \"is\", \"are\")} not integers, so they are renumbered; the original ids are written to the ${attribute} attribute, and an import with restoreMangledIds: true reads them back`\n : `${unwritable} node id${plural(unwritable)} ${agree(unwritable, \"is\", \"are\")} not integers, so the save fails unless sanitizeIds is \"mangle\"`,\n null,\n unwritable,\n );\n }\n try {\n return writtenIds(snapshot, common.sanitizeIds, format);\n } catch (err) {\n if (err instanceof GraphFormatError) {\n return err;\n }\n throw err;\n }\n}\n\n/**\n * The CX type of a scalar dtype.\n * @param dtype - the dtype\n * @param longOrigin - whether the source declared the column long\n * @returns the type text\n */\nfunction scalarType(dtype: string, longOrigin: boolean): string {\n switch (dtype) {\n case \"f64\":\n return longOrigin ? \"long\" : \"double\";\n case \"f32\":\n return \"double\";\n case \"i32\":\n case \"u8\":\n return \"integer\";\n case \"u32\":\n return \"long\";\n case \"bool\":\n return \"boolean\";\n default:\n return \"string\";\n }\n}\n\n/**\n * Whether every set value of an f64 column is integral (so a declared long stays long).\n * @param column - the column\n * @returns true when every set value is a safe integer\n */\nfunction allIntegral(column: Column): boolean {\n for (let i = 0; i < column.length; i++) {\n if (column.isSet(i) && !Number.isSafeInteger(column.value(i))) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * The declared CX type of a column: string / double / long / integer / boolean or a list of one;\n * a json column (and a list of json items) is a string holding JSON text.\n * @param column - the column\n * @returns the type text\n * @category Plugin helpers\n */\nexport function declaredType(column: Column): string {\n const { meta } = column;\n const origin = meta.origin?.type ?? null;\n const longOrigin = origin !== null && origin.endsWith(\"long\") && (meta.dtype !== \"f64\" || allIntegral(column));\n if (meta.dtype === \"list\") {\n return meta.itemDtype === null || meta.itemDtype === \"json\"\n ? \"string\"\n : `list_of_${scalarType(meta.itemDtype, longOrigin)}`;\n }\n // a multi-component column (a color, a 3D vector) is written as a list of its components\n return meta.components > 1 ? `list_of_${scalarType(meta.dtype, false)}` : scalarType(meta.dtype, longOrigin);\n}\n\n/**\n * Count the positions with a non-finite x or y.\n * @param position - the position column\n * @returns the count\n * @category Plugin helpers\n */\nexport function nonFinitePositions(position: Column): number {\n let count = 0;\n for (let i = 0; i < position.length; i++) {\n if (position.isSet(i)) {\n const p = position.value(i) as ArrayLike<number>;\n if (!Number.isFinite(p[0]) || !Number.isFinite(p[1])) {\n count++;\n }\n }\n }\n return count;\n}\n\n/**\n * The edge ids to write: the id role column's values when they are distinct safe integers, next\n * unused integers for edges without one (W_EDGE_IDS_GENERATED). A generated id is never a\n * written node id either: CX keeps node and edge ids apart, but Cytoscape desktop numbers both\n * from one counter, and a reader with one id space (Cytoscape.js) would have to drop the edge's.\n * @param snapshot - the snapshot\n * @param note - records a note\n * @param nodeIds - the written node ids, which generated edge ids avoid\n * @returns one id per edge\n * @category Plugin helpers\n */\nexport function planEdgeIds(snapshot: GraphSnapshot, note: CxNoteFn, nodeIds: WrittenIds | null = null): number[] {\n const column = snapshot.edges.byRole(\"id\");\n const used = new Set<number>();\n let generated = 0;\n const ids: (number | null)[] = keptEdgeIds(column, snapshot.edgeCount, used);\n for (let i = 0; nodeIds !== null && i < snapshot.nodeCount; i++) {\n const id = nodeIds.idAt(i);\n if (typeof id === \"number\") {\n used.add(id);\n }\n }\n let next = 0;\n const out: number[] = [];\n for (let e = 0; e < snapshot.edgeCount; e++) {\n let id = ids[e];\n if (id === null) {\n while (used.has(next)) {\n next++;\n }\n id = next;\n used.add(next);\n generated++;\n }\n out.push(id);\n }\n if (column !== null && generated > 0) {\n note(\n LOSS.EDGE_IDS_GENERATED,\n `${generated} edge${plural(generated)} ${agree(generated, \"has\", \"have\")} no distinct integer id in \"${column.meta.name}\"; they are written with generated ids`,\n column.meta.name,\n generated,\n );\n }\n if (column !== null && column.dtype !== \"f64\") {\n note(\n LOSS.DTYPE,\n `edge id column \"${column.meta.name}\" is ${column.dtype}; CX edge ids are integers and read back as f64`,\n column.meta.name,\n snapshot.edgeCount - column.nullCount,\n );\n }\n return out;\n}\n\n/**\n * The edge ids an id column can keep: its distinct safe integers (numbers, or text that reads as one).\n * @param column - the edge id column, or null\n * @param edgeCount - the number of edges\n * @param used - receives the kept ids\n * @returns the kept id per edge, null where it cannot be kept\n */\nfunction keptEdgeIds(column: Column | null, edgeCount: number, used: Set<number>): (number | null)[] {\n const ids: (number | null)[] = new Array<number | null>(edgeCount).fill(null);\n if (column === null) {\n return ids;\n }\n for (let e = 0; e < edgeCount; e++) {\n const value = column.isSet(e) ? column.value(e) : undefined;\n const n = typeof value === \"number\" || typeof value === \"string\" ? Number(value) : Number.NaN;\n if (Number.isSafeInteger(n) && !used.has(n)) {\n ids[e] = n === 0 ? 0 : n;\n used.add(n);\n }\n }\n return ids;\n}\n\n/**\n * The direction notes: every CX edge is directed, so an undirected snapshot (or the undirected\n * pairs of a mixed one, folded under onMixedDirection) is written directed, and a mutual pair as\n * two edges without its mark.\n * @param snapshot - the snapshot\n * @param folding - the pair folding\n * @param common - the resolved common options\n * @param undirectedCode - the format's \"undirected written as directed\" code\n * @param note - records a note\n * @category Plugin helpers\n */\nexport function directionNotes(\n snapshot: GraphSnapshot,\n folding: PairFolding,\n common: ResolvedExportOptions,\n undirectedCode: string,\n note: CxNoteFn,\n): void {\n if (!snapshot.directed) {\n note(\n undirectedCode,\n `the snapshot is undirected; every edge is written as a directed edge (${snapshot.edgeCount} edge${plural(snapshot.edgeCount)})`,\n null,\n snapshot.edgeCount,\n );\n } else if (common.onMixedDirection !== \"error\") {\n let undirected = 0;\n for (let e = 0; e < snapshot.edgeCount; e++) {\n if (!folding.folded(e) && !folding.sourceDirected(e)) {\n undirected++;\n }\n }\n if (undirected > 0) {\n note(\n undirectedCode,\n `${undirected} undirected edge${plural(undirected)} ${agree(undirected, \"is\", \"are\")} written as one directed edge each (a pair folded to its primary); CX has no undirected edge`,\n null,\n undirected,\n );\n }\n }\n if (folding.mutualCount > 0) {\n note(\n LOSS.MUTUAL_EXPANDED,\n `${folding.mutualCount} mutual pair${plural(folding.mutualCount)} ${agree(folding.mutualCount, \"is\", \"are\")} written as two directed edges; the mutual mark is lost`,\n null,\n folding.mutualCount,\n );\n }\n}\n\n/**\n * The note recorder of a plan and its notes.\n * @returns the notes and the recorder\n * @category Plugin helpers\n */\nexport function noteList(): { notes: LossNote[]; note: CxNoteFn } {\n const notes: LossNote[] = [];\n const note: CxNoteFn = (code, message, column = null, count = null) => {\n notes.push(Object.freeze({ code, message, column, count }));\n };\n return { notes, note };\n}\n\n/**\n * The JSON text of a value, keeping -0 and writing the raw big-integer ids of idAt() as numbers.\n * @param value - the value\n * @returns the text\n * @category Plugin helpers\n */\nexport function stringify(value: unknown): string {\n const text = JSON.stringify(value, (_key, v: unknown) => (Object.is(v, -0) ? `${RAW}-0` : v));\n return text.includes(String.raw`\\u0000cx:`) ? text.replaceAll(RAW_JSON, \"$1\") : text;\n}\n\n/**\n * The text of one aspect block, element by element.\n * @param aspect - the aspect name\n * @param elements - the JSON texts of its elements\n * @yields the block's text\n * @returns nothing\n */\nexport function* aspectBlock(aspect: string, elements: Iterable<string>): Generator<string, void, undefined> {\n yield `{${JSON.stringify(aspect)}:[`;\n let first = true;\n for (const element of elements) {\n yield first ? `\\n${element}` : `,\\n${element}`;\n first = false;\n }\n yield \"]},\\n\";\n}\n","/**\n * The styles of CX2 files: the `visualProperties` aspect (defaults, `nodeMapping`, `edgeMapping`), the dependencies\n * in `visualEditorProperties`, and the `nodeBypasses` / `edgeBypasses` columns, resolved the way Cytoscape draws\n * them with Cytoscape desktop's default style beneath. The reading and writing CX version 1 shares are in\n * `../cx/styles.ts`.\n */\n\nimport type { GraphSnapshot } from \"@graphty/graph-format\";\n\nimport { cytoscapeStyleFromCx2 } from \"../../styles/cytoscape/mappings.js\";\nimport { StyleNotes } from \"../../styles/notes.js\";\nimport type { ImporterStyles, StyleReadContext, StyleWriteCapabilities } from \"../../styles/types.js\";\nimport { type Cx2StyleSource, cytoscapeWriteCapabilities, readDeclaredStyles } from \"../cx/styles.js\";\n\n/** What the CX2 writer holds of a graph's styles. */\nexport const CX2_STYLE_CAPABILITIES: StyleWriteCapabilities = cytoscapeWriteCapabilities(\"cx2\");\n\n/**\n * The styles of an imported CX2 network.\n * @param snapshot - the network\n * @param context - what the import kept, the budget and the cancel signal\n * @returns the styles\n */\nexport function readCx2Styles(snapshot: GraphSnapshot, context: StyleReadContext): ImporterStyles {\n const notes = new StyleNotes();\n const kept = context.kept as Cx2StyleSource | undefined;\n const style = cytoscapeStyleFromCx2(kept?.visualProperties, kept?.visualEditorProperties, notes);\n return readDeclaredStyles(snapshot, context, style, \"cx2.bypass\", notes, \"cx2\");\n}\n","/**\n * The CX2 importer (design/graph-io/cytoscape-and-obo/design.md section 1.3; the feature and error\n * inventory is research-cx2.md): the JSON exchange format of NDEx, Cytoscape 3.10+ and Cytoscape\n * Web. A CX2 document is one array: a descriptor (`CXVersion`), aspect blocks (`nodes`, `edges`,\n * `attributeDeclarations`, `networkAttributes`, `nodeBypasses`, `visualProperties`, opaque\n * aspects) and a final `status`.\n *\n * The document is read through the streaming scanner of common/json-elements.ts, so its text is\n * never held as one string; the parsed aspect elements are collected and the graph is built at the\n * end, which makes every aspect order the format allows (declarations after the nodes, edges\n * before their nodes) read the same.\n *\n * Mapping: every edge is directed (CX2 has no undirected edge); node ids follow the CX id rule\n * (design section 1.0.2); declared attributes become typed columns named by their full name, with\n * the alias in `origin.id` and the declared default in `meta.default`; `name` is the label; node\n * `x` / `y` become the position column with y flipped to y-up, `z` the `z` column; per-element\n * bypasses become one column per visual property (origin namespace \"cx2.bypass\"); style rules\n * (`visualProperties`, `visualEditorProperties`) and every opaque aspect are kept verbatim in\n * `meta.extra.cx2.opaque`. Asked for styles (`importGraph(..., { styles: true })`), the importer reads\n * the style rules and the bypasses (styles.ts), kept for it through the report; otherwise\n * W_STYLES_NOT_IMPORTED. The `graphty.styles` aspect of a file graphty wrote becomes the graph\n * attribute of that name, as in every other format.\n */\n\nimport {\n type ColumnDecl,\n type ColumnHandle,\n type Dtype,\n GraphFormatError,\n type GraphMetaPatch,\n type GraphSink,\n INVALID_INDEX,\n type NodeId,\n type ScalarDtype,\n} from \"@graphty/graph-format\";\n\nimport { declareResolved, uniqueColumnName } from \"../../common/attributes.js\";\nimport {\n ASPECT_ORDER_CODE,\n BAD_ASPECT_BLOCK_CODE,\n BAD_DEFAULT_CODE,\n BAD_VALUE_CODE,\n COLUMN_RENAMED_CODE,\n COUNT_MISMATCH_CODE,\n DANGLING_REFERENCE_CODE,\n DIRECTION_FORCED_CODE,\n DIRECTION_REFUSED_CODE,\n DUPLICATE_ATTRIBUTE_CODE,\n DUPLICATE_EDGE_ID_CODE,\n DUPLICATE_NODE_CODE,\n ELEMENT_ISSUE,\n EMPTY_INPUT_CODE,\n ENCODING_FALLBACK_CODE,\n ID_MERGED_CODE,\n ID_TEXT_TYPE_CODE,\n INPUT_ISSUE,\n INVALID_ENCODING_CODE,\n INVALID_UTF8_CODE,\n JSON_NONSTANDARD_NUMBER_CODE,\n MISSING_ENDPOINT_CODE,\n MISSING_ID_CODE,\n MULTI_ASPECT_FRAGMENT_CODE,\n OPTION_IGNORED_CODE,\n PRECISION_CODE,\n ROLE_TAKEN_CODE,\n SINGLE_OBJECT_ASPECT_CODE,\n SINK_OPTION_CODE,\n STATUS_FAILED_CODE,\n STATUS_WARNING_CODE,\n STYLES_NOT_IMPORTED_CODE,\n SYNTAX_CODE,\n TOO_LARGE_CODE,\n UNKNOWN_ATTR_TYPE_CODE,\n UNKNOWN_ELEMENT_CODE,\n UNKNOWN_ENCODING_CODE,\n} from \"../../common/codes.js\";\nimport { DirectionResolver } from \"../../common/direction.js\";\nimport { IdCoercer } from \"../../common/ids.js\";\nimport { textChunks, throwIfAborted } from \"../../common/input.js\";\nimport {\n cxId,\n CxStructure,\n declareFresh,\n ExactInteger,\n flipY,\n headText,\n inexactLiteral,\n isRecord,\n JsonScanError,\n keptPrecision,\n plainJson,\n positionDecl,\n reportSharedBlock,\n reportTooDeep,\n scanAspects,\n setOwn,\n zDecl,\n} from \"../../common/json-elements.js\";\nimport {\n type ImportFormatDefaults,\n reportSinkOptions,\n reportUnusedOptions,\n type ResolvedImportOptions,\n resolveImportOptions,\n} from \"../../common/options.js\";\nimport { agree, plural } from \"../../common/plural.js\";\nimport { ImportReportBuilder } from \"../../common/report.js\";\nimport { weightFromValue } from \"../../common/weights.js\";\nimport { STYLE_BLOCK_NAME } from \"../../styles/io/block.js\";\nimport { type CommonImportOptions, type GraphImporter, type ImportInput, type ImportReport } from \"../../types.js\";\nimport { blockOfAspect, type Cx2StyleSource } from \"../cx/styles.js\";\nimport { readCx2Styles } from \"./styles.js\";\n\n/**\n * The format name.\n * @category Plugin helpers\n */\nexport const CX2_FORMAT = \"cx2\";\n\n/**\n * The node attribute the exporter's `sanitizeIds: \"mangle\"` keeps an original id in.\n * @category Plugin helpers\n */\nexport const ORIGINAL_ID_ATTRIBUTE = \"graphty:originalId\";\n\n/**\n * The origin namespace of the per-element visual property columns.\n * @category Plugin helpers\n */\nexport const BYPASS_NAMESPACE = \"cx2.bypass\";\n\n/**\n * The format-specific options of the CX2 importer.\n * @category Built-in formats\n */\nexport interface Cx2ImportOptions extends CommonImportOptions {\n /**\n * Where Cytoscape's `z` value (a drawing order, not a depth) goes: \"column\" keeps it as a node\n * attribute named `z`; \"position\" makes it the third coordinate of the position.\n * @defaultValue \"column\"\n */\n zAs?: \"column\" | \"position\" | undefined;\n}\n\n/**\n * The issue codes the CX2 importer records, by name: the codes shared with\n * the other importers and the CX2-specific ones. A key is the code without\n * its severity and format prefixes.\n * @category Built-in formats\n */\nexport const CX2_ISSUE = Object.freeze({\n ...INPUT_ISSUE,\n ...ELEMENT_ISSUE,\n /** The input is empty. The import stops. */\n EMPTY_INPUT: EMPTY_INPUT_CODE,\n /** The text is not valid JSON. The import stops. */\n SYNTAX: SYNTAX_CODE,\n /** The input is not valid UTF-8. The import stops. */\n INVALID_UTF8: INVALID_UTF8_CODE,\n /**\n * Some bytes are not valid in the encoding that was chosen (by a byte order mark or the `encoding` option). The\n * import stops.\n */\n INVALID_ENCODING: INVALID_ENCODING_CODE,\n /** Bytes that are not UTF-8 were read as windows-1252. */\n ENCODING_FALLBACK: ENCODING_FALLBACK_CODE,\n /** An encoding the platform cannot decode was ignored. */\n UNKNOWN_ENCODING: UNKNOWN_ENCODING_CODE,\n /**\n * The document is not a JSON array, or its first element is not the CX2 descriptor with `CXVersion`. The import\n * stops.\n */\n NO_DESCRIPTOR: \"E_CX2_NO_DESCRIPTOR\",\n /** `CXVersion` names a version other than 2 (\"1.x\" means the file is CX1; read it as `cx`). The import stops. */\n VERSION: \"E_CX2_VERSION\",\n /** CXVersion is a 2.x other than \"2.0\" (or not a string); the document is read. */\n MINOR_VERSION: \"W_CX2_MINOR_VERSION\",\n /** The document has no status block, or a malformed one. */\n NO_STATUS: \"E_CX2_NO_STATUS\",\n /** The program that wrote the file marked it as failed, so it is incomplete. The import stops. */\n STATUS_FAILED: STATUS_FAILED_CODE,\n /** The producer marked the document as successful with an error text. */\n STATUS_WARNING: STATUS_WARNING_CODE,\n /** An aspect appears in several blocks although the descriptor does not declare fragments. */\n UNDECLARED_FRAGMENTS: \"W_CX2_UNDECLARED_FRAGMENTS\",\n /** An attribute declared twice with two different types; the first declaration wins. */\n DECLARATION_CONFLICT: \"E_CX2_DECLARATION_CONFLICT\",\n /** An attribute value whose name no declaration covers; its column is inferred. */\n UNDECLARED_ATTRIBUTE: \"W_CX2_UNDECLARED_ATTRIBUTE\",\n /** A node or edge attribute named `id`, which the specification reserves. */\n RESERVED_KEY: \"W_CX2_RESERVED_KEY\",\n /** An alias that is another attribute's name or another attribute's alias; the alias is ignored. */\n ALIAS_CONFLICT: \"E_CX2_ALIAS_CONFLICT\",\n /** A network attribute declaration with an alias or a default, which CX2 forbids; both ignored. */\n NETWORK_DECLARATION: \"W_CX2_NETWORK_DECLARATION\",\n /** An aspect that holds one element holds several; the first is read. */\n EXTRA_ELEMENTS: \"W_CX2_EXTRA_ELEMENTS\",\n /** Some nodes have coordinates and others none, or a node has x without y. */\n PARTIAL_LAYOUT: \"W_CX2_PARTIAL_LAYOUT\",\n /** A full attribute name used where its alias is declared; read as the same attribute. */\n ALIAS_BYPASSED: \"W_CX2_ALIAS_BYPASSED\",\n /** A CX1 cartesianLayout aspect next to node coordinates; kept, not applied. */\n LEGACY_LAYOUT: \"W_CX2_LEGACY_LAYOUT\",\n /** An aspect CX2 defines as an array of elements written as one object; read as one element. */\n SINGLE_OBJECT_ASPECT: SINGLE_OBJECT_ASPECT_CODE,\n /** A member holding several aspects; each array-valued key is read as its own block. */\n MULTI_ASPECT_FRAGMENT: MULTI_ASPECT_FRAGMENT_CODE,\n /** The bare tokens NaN / Infinity / -Infinity (Python's json writes them), read as numbers. */\n JSON_NONSTANDARD_NUMBER: JSON_NONSTANDARD_NUMBER_CODE,\n /** The file's style rules are not applied; they are kept so a CX2 export writes them back. */\n STYLES_NOT_IMPORTED: STYLES_NOT_IMPORTED_CODE,\n /**\n * A member of the file's top-level array that is not a block with one key (`{\"nodes\": [...]}`), or an element of a\n * block that is not an object. It is skipped; the rest of the file is read.\n */\n BAD_ASPECT_BLOCK: BAD_ASPECT_BLOCK_CODE,\n /** An aspect out of its place (after the post-metadata or the status, a third metaData, late declarations). */\n ASPECT_ORDER: ASPECT_ORDER_CODE,\n /** A metaData element count disagrees with what was read. */\n COUNT_MISMATCH: COUNT_MISMATCH_CODE,\n /** A value that does not match its declared type; the cell is unset. */\n BAD_VALUE: BAD_VALUE_CODE,\n /** A declared default that does not match its type. */\n BAD_DEFAULT: BAD_DEFAULT_CODE,\n /** A declared type CX2 does not define; the column is inferred from the values. */\n UNKNOWN_ATTR_TYPE: UNKNOWN_ATTR_TYPE_CODE,\n /** A bypass or a layout entry naming no node or edge. */\n DANGLING_REFERENCE: DANGLING_REFERENCE_CODE,\n /** The same attribute twice on one element (its alias and its full name). */\n DUPLICATE_ATTRIBUTE: DUPLICATE_ATTRIBUTE_CODE,\n /** A node without an id. */\n MISSING_ID: MISSING_ID_CODE,\n /** An edge without s or t. */\n MISSING_ENDPOINT: MISSING_ENDPOINT_CODE,\n /** A node id declared twice; the second merges into the first. */\n DUPLICATE_NODE: DUPLICATE_NODE_CODE,\n /** An edge id declared twice; the second edge is skipped. */\n DUPLICATE_EDGE_ID: DUPLICATE_EDGE_ID_CODE,\n /** An id that is not an integer. */\n INVALID_ID: \"E_INVALID_ID\",\n /** An edge endpoint naming no node (addMissingNodes false, the default). */\n UNKNOWN_NODE: \"E_UNKNOWN_NODE\",\n /** A weight that is not a number. */\n INVALID_WEIGHT: \"E_INVALID_WEIGHT\",\n /** An id spelled as a string or a non-integer literal; read as the integer. */\n ID_TEXT_TYPE: ID_TEXT_TYPE_CODE,\n /** An integer beyond 2^53 was stored as the nearest 64-bit float; pass `long: \"string\"` to keep every digit. */\n PRECISION: PRECISION_CODE,\n /** Two id texts merged under `ids: \"number\"`. */\n ID_MERGED: ID_MERGED_CODE,\n /** An element key CX2 does not define. */\n UNKNOWN_ELEMENT: UNKNOWN_ELEMENT_CODE,\n /**\n * An attribute was renamed `<name>#<suffix>` because another attribute already has its name, for example\n * two attributes declared with the same name.\n */\n COLUMN_RENAMED: COLUMN_RENAMED_CODE,\n /**\n * You read into a graph builder that already has an id, label or position attribute, so this file's one is kept as\n * a plain attribute.\n */\n ROLE_TAKEN: ROLE_TAKEN_CODE,\n /**\n * You read into a graph builder whose direction is already set, or which already holds edges, so the file is read\n * with the builder's direction instead of its own.\n */\n DIRECTION_REFUSED: DIRECTION_REFUSED_CODE,\n /** Edges of the other direction were read with the direction `onMixedDirection` chose. */\n DIRECTION_FORCED: DIRECTION_FORCED_CODE,\n /** You set an option this format does not use; it had no effect. The message names the option. */\n OPTION_IGNORED: OPTION_IGNORED_CODE,\n /**\n * You read into your own graph builder, which was created with a different `addMissingNodes`, `duplicateEdges`,\n * `selfLoops` or `weightDtype` than the option you passed; the builder's setting applies.\n */\n SINK_OPTION: SINK_OPTION_CODE,\n /** The input is larger than graph-io's size limit. The import stops. */\n TOO_LARGE: TOO_LARGE_CODE,\n});\n\nconst USED_OPTIONS: ReadonlySet<keyof CommonImportOptions> = new Set<keyof CommonImportOptions>([\n \"ids\",\n \"addMissingNodes\",\n \"duplicateEdges\",\n \"selfLoops\",\n \"onMixedDirection\",\n \"weightFrom\",\n \"weightDtype\",\n \"long\",\n \"restoreMangledIds\",\n \"errorLimit\",\n \"signal\",\n \"onProgress\",\n]);\n\n/** CX2 has no undirected edge: defaultDirected never applies (reported W_OPTION_IGNORED). */\nconst FORMAT_DEFAULTS: ImportFormatDefaults = {\n ids: \"keep\",\n defaultDirected: true,\n weightFrom: \"weight\",\n addMissingNodes: false,\n};\n\nconst ABORT_CHECK_INTERVAL = 64;\n\n/** The keys a node element defines. */\nconst NODE_KEYS: ReadonlySet<string> = new Set([\"id\", \"x\", \"y\", \"z\", \"v\"]);\n\n/** The keys an edge element defines. */\nconst EDGE_KEYS: ReadonlySet<string> = new Set([\"id\", \"s\", \"t\", \"v\"]);\n\n/** The aspects that hold one element. */\nconst SINGLE_ELEMENT_ASPECTS: readonly string[] = [\"networkAttributes\", \"visualProperties\", \"visualEditorProperties\"];\n\n/** The aspects whose content is a style rule (design section 2). */\nconst STYLE_ASPECTS: readonly string[] = [\n \"visualProperties\",\n \"visualEditorProperties\",\n \"cyVisualProperties\",\n \"tableVisualProperties\",\n \"cyTableVisualProperties\",\n];\n\n/** The aspects the stream structure owns; never kept as opaque. */\nconst STRUCTURE_ASPECTS: ReadonlySet<string> = new Set([\"metaData\", \"status\"]);\n\n/** The aspects CX2 defines as an array of elements, which a reader expects in that form. */\nconst ARRAY_ASPECTS: ReadonlySet<string> = new Set([\n \"nodes\",\n \"edges\",\n \"attributeDeclarations\",\n \"networkAttributes\",\n \"nodeBypasses\",\n \"edgeBypasses\",\n \"status\",\n \"metaData\",\n]);\n\n/** The canonical CX2 scalar types. */\ntype Cx2Scalar = \"string\" | \"long\" | \"integer\" | \"double\" | \"boolean\";\n\n/** A declared CX2 type. */\ninterface Cx2Type {\n /** The canonical type text (`list_of_double`). */\n readonly d: string;\n /** The scalar (or item) type. */\n readonly scalar: Cx2Scalar;\n /** Whether the type is a list. */\n readonly list: boolean;\n}\n\n/** The type spellings CX2 defines, plus the Python spellings ndex2 writes. */\nconst SCALARS: ReadonlyMap<string, Cx2Scalar> = new Map([\n [\"string\", \"string\"],\n [\"long\", \"long\"],\n [\"integer\", \"integer\"],\n [\"double\", \"double\"],\n [\"boolean\", \"boolean\"],\n [\"str\", \"string\"],\n [\"int\", \"integer\"],\n [\"bool\", \"boolean\"],\n [\"float\", \"double\"],\n]);\n\n/**\n * Resolve a declared type text.\n * @param d - the `d` value\n * @returns the type, or null when CX2 does not define it\n * @category Plugin helpers\n */\nexport function cx2Type(d: string): Cx2Type | null {\n const list = d.startsWith(\"list_of_\");\n const scalar = SCALARS.get(list ? d.slice(\"list_of_\".length) : d);\n if (scalar === undefined) {\n return null;\n }\n return { d: list ? `list_of_${scalar}` : scalar, scalar, list };\n}\n\n/**\n * The column dtype of a scalar type.\n * @param scalar - the type\n * @param long - the importer's `long` option\n * @returns the dtype\n */\nfunction scalarDtype(scalar: Cx2Scalar, long: \"f64\" | \"string\"): ScalarDtype {\n switch (scalar) {\n case \"string\":\n return \"string\";\n case \"long\":\n return long === \"string\" ? \"string\" : \"f64\";\n case \"integer\":\n return \"i32\";\n case \"double\":\n return \"f64\";\n case \"boolean\":\n return \"bool\";\n default: {\n const name: string = scalar;\n return name as ScalarDtype;\n }\n }\n}\n\n/** What convertScalar() returns for a value of the wrong type. */\nconst BAD = Symbol(\"bad\");\n\nconst I32_MIN = -2147483648;\nconst I32_MAX = 2147483647;\n\n/**\n * Convert one JSON value (or list item) by a declared scalar type.\n * @param value - the value (never null)\n * @param scalar - the type\n * @param long - the importer's `long` option\n * @param onPrecision - called for a long beyond 2^53\n * @returns the value to store, or BAD\n */\nfunction convertScalar(\n value: unknown,\n scalar: Cx2Scalar,\n long: \"f64\" | \"string\",\n onPrecision: (digits: string) => void,\n): unknown {\n switch (scalar) {\n case \"string\":\n return typeof value === \"string\" ? value : BAD;\n case \"boolean\":\n return typeof value === \"boolean\" ? value : BAD;\n case \"double\":\n if (value instanceof ExactInteger) {\n onPrecision(value.digits);\n return Number(value.digits);\n }\n return typeof value === \"number\" ? value : BAD;\n case \"integer\":\n return typeof value === \"number\" && Number.isInteger(value) && value >= I32_MIN && value <= I32_MAX\n ? value\n : BAD;\n case \"long\":\n if (value instanceof ExactInteger) {\n if (long === \"string\") {\n return value.digits;\n }\n onPrecision(value.digits);\n return Number(value.digits);\n }\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return long === \"string\" ? String(value) : value;\n }\n return BAD;\n default:\n return BAD;\n }\n}\n\n/**\n * Convert one attribute value by its declared type.\n * @param value - the value (never null)\n * @param type - the declared type\n * @param long - the importer's `long` option\n * @param onPrecision - called for a long beyond 2^53\n * @returns the value to store, or BAD\n */\nfunction convertValue(\n value: unknown,\n type: Cx2Type,\n long: \"f64\" | \"string\",\n onPrecision: (digits: string) => void,\n): unknown {\n if (!type.list) {\n return convertScalar(value, type.scalar, long, onPrecision);\n }\n if (!Array.isArray(value)) {\n return BAD;\n }\n const out: unknown[] = [];\n for (const item of value) {\n const converted = item === null ? BAD : convertScalar(item, type.scalar, long, onPrecision);\n if (converted === BAD) {\n return BAD;\n }\n out.push(converted);\n }\n return out;\n}\n\n/**\n * A short JSON rendering of a value for a message.\n * @param value - the value\n * @returns the text, at most 60 characters\n */\nfunction shown(value: unknown): string {\n if (value instanceof ExactInteger) {\n return value.digits;\n }\n let text: string;\n try {\n text = JSON.stringify(value) ?? String(value);\n } catch {\n text = String(value);\n }\n return text.length > 60 ? `${text.slice(0, 57)}...` : text;\n}\n\n// ============================================================ the document as read\n\n/** A parsed aspect element with where it came from. */\ninterface Held {\n readonly value: unknown;\n readonly line: number;\n /** Bit 1: the id, bit 2: s, bit 4: t was written as a non-integer literal. */\n readonly inexact: number;\n}\n\n/** Everything the scan collects. */\ninterface Cx2Document {\n version: string;\n hasFragments: boolean;\n readonly nodes: Held[];\n readonly edges: Held[];\n readonly declarations: Held[];\n readonly networkAttributes: Held[];\n readonly nodeBypasses: Held[];\n readonly edgeBypasses: Held[];\n readonly cartesianLayout: Held[];\n /** Opaque aspects (including the style rules), verbatim, in order of first appearance. */\n readonly opaque: Map<string, unknown[]>;\n readonly structure: CxStructure;\n}\n\n/**\n * The inexact-literal bits of an element.\n * @param text - the element's JSON text\n * @param keys - the id keys to check, bit 1, 2, 4 in order\n * @param depth - the depth of the element's own keys in the text (2: a member's single object)\n * @returns the bits\n */\nfunction inexactBits(text: string, keys: readonly string[], depth = 1): number {\n if (!/\\d[.eE]/.test(text)) {\n return 0;\n }\n let bits = 0;\n keys.forEach((key, i) => {\n if (inexactLiteral(text, key, depth)) {\n bits |= 1 << i;\n }\n });\n return bits;\n}\n\n/**\n * Read the whole document through the streaming scanner, checking its structure.\n * @param input - the input\n * @param report - the report\n * @param options - the resolved options\n * @returns what was read\n */\nasync function readDocument(\n input: ImportInput,\n report: ImportReportBuilder,\n options: ResolvedImportOptions,\n): Promise<Cx2Document> {\n const structure = new CxStructure(report);\n const doc: Cx2Document = {\n version: \"\",\n hasFragments: false,\n nodes: [],\n edges: [],\n declarations: [],\n networkAttributes: [],\n nodeBypasses: [],\n edgeBypasses: [],\n cartesianLayout: [],\n opaque: new Map(),\n structure,\n };\n let descriptor = false;\n let elementsSeen = false;\n let sinceCheck = 0;\n const opaquePrecision = keptPrecision(report, \"meta.extra.cx2.opaque\");\n const collect = (aspect: string, value: unknown, text: string, line: number, exact: boolean, depth = 1): void => {\n structure.element(aspect, value, line);\n switch (aspect) {\n case \"nodes\":\n elementsSeen = true;\n doc.nodes.push({ value, line, inexact: inexactBits(text, [\"id\"], depth) });\n return;\n case \"edges\":\n elementsSeen = true;\n doc.edges.push({ value, line, inexact: inexactBits(text, [\"id\", \"s\", \"t\"], depth) });\n return;\n case \"attributeDeclarations\":\n if (elementsSeen) {\n report.warnOnce(\n \"validation-error\",\n ASPECT_ORDER_CODE,\n \"attributeDeclarations comes after the elements it types; the declarations are applied to them\",\n { line, element: aspect },\n `${ASPECT_ORDER_CODE}:declarations`,\n );\n }\n // not plainJson(): a long default beyond 2^53 keeps its digits for long: \"string\"\n doc.declarations.push({ value, line, inexact: 0 });\n return;\n case \"networkAttributes\":\n elementsSeen = true;\n doc.networkAttributes.push({ value, line, inexact: 0 });\n return;\n case \"nodeBypasses\":\n doc.nodeBypasses.push({ value, line, inexact: 0 });\n return;\n case \"edgeBypasses\":\n doc.edgeBypasses.push({ value, line, inexact: 0 });\n return;\n case \"cartesianLayout\":\n doc.cartesianLayout.push({ value, line, inexact: 0 });\n return;\n default:\n if (STRUCTURE_ASPECTS.has(aspect)) {\n return;\n }\n if (!doc.opaque.has(aspect)) {\n doc.opaque.set(aspect, []);\n }\n doc.opaque.get(aspect)?.push(exact ? plainJson(value, opaquePrecision) : value);\n }\n };\n try {\n for await (const event of scanAspects(textChunks(input, report, options), report)) {\n if (++sinceCheck >= ABORT_CHECK_INTERVAL) {\n sinceCheck = 0;\n throwIfAborted(options.signal);\n }\n switch (event.kind) {\n case \"root\":\n report.fail(\n CX2_ISSUE.NO_DESCRIPTOR,\n `a CX2 document is a JSON array; found ${event.object ? \"an object\" : shown(event.value)}`,\n { line: event.line },\n );\n break;\n case \"member\":\n if (!descriptor) {\n readDescriptor(event.value, event.line, doc, report);\n descriptor = true;\n break;\n }\n memberAspect(event.value, event.line, structure, report, (aspect, value) => {\n collect(aspect, value, event.text, event.line, event.exact, 2);\n });\n break;\n case \"block\":\n reportSharedBlock(report, event);\n if (!descriptor) {\n report.fail(\n CX2_ISSUE.NO_DESCRIPTOR,\n `the document starts with a \"${event.aspect}\" block, not a descriptor with CXVersion${event.aspect === \"numberVerification\" || event.aspect === \"metaData\" ? \"; this looks like CX version 1 (read it with the cx importer)\" : \"\"}`,\n { line: event.line },\n );\n }\n structure.block(event.aspect, event.line);\n break;\n case \"element\":\n collect(event.aspect, event.value, event.text, event.line, event.exact);\n break;\n case \"deep\":\n reportTooDeep(report, event);\n if (!descriptor) {\n readDescriptor(null, event.line, doc, report);\n }\n break;\n case \"extraKeys\":\n report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `the \"${event.aspect}\" block holds more keys (${event.keys.join(\", \")}) whose values are not arrays; an aspect block has one key, the others are skipped`,\n { line: event.line, element: event.aspect },\n );\n break;\n default:\n break;\n }\n }\n } catch (err) {\n if (err instanceof JsonScanError) {\n report.fail(err.empty ? EMPTY_INPUT_CODE : SYNTAX_CODE, err.message, { line: err.line });\n }\n throw err;\n }\n if (!descriptor) {\n report.fail(CX2_ISSUE.NO_DESCRIPTOR, \"the document is an empty array; a CX2 document starts with a descriptor\");\n }\n return doc;\n}\n\n/**\n * Fail the import: the first member of the array is not a descriptor.\n * @param value - the member\n * @param line - its line\n * @param report - the report\n * @returns never: the import fails\n */\nfunction failNoDescriptor(value: unknown, line: number, report: ImportReportBuilder): never {\n const keys = isRecord(value) ? Object.keys(value) : [];\n const keyList = keys.length > 0 ? ` (keys: ${keys.join(\", \")})` : \"\";\n return report.fail(\n CX2_ISSUE.NO_DESCRIPTOR,\n `the first member of the array is not a descriptor with CXVersion${keyList}`,\n {\n line,\n },\n );\n}\n\n/**\n * Check the descriptor, the first member of the array.\n * @param value - the member\n * @param line - its line\n * @param doc - the document, which receives the version and the fragment flag\n * @param report - the report\n */\nfunction readDescriptor(value: unknown, line: number, doc: Cx2Document, report: ImportReportBuilder): void {\n if (!isRecord(value) || !(\"CXVersion\" in value)) {\n failNoDescriptor(value, line, report);\n }\n const raw = value.CXVersion;\n const text = typeof raw === \"string\" || typeof raw === \"number\" ? String(raw) : \"\";\n // the major version: \"2.0\", \"2.1\", \"2.0.1\", \"2.1-beta\", \" 2.0\" are all CX2\n const match = /^\\s*(\\d+)(?=$|[.\\s-])/.exec(text);\n const major = match === null ? Number.NaN : Number(match[1]);\n if (major === 1) {\n report.fail(\n CX2_ISSUE.VERSION,\n `CXVersion ${shown(raw)} is CX version 1, a different document shape; read it with the cx importer`,\n { line, element: \"CXVersion\" },\n );\n }\n if (major !== 2) {\n report.fail(CX2_ISSUE.VERSION, `CXVersion ${shown(raw)} is not a CX2 version`, { line, element: \"CXVersion\" });\n }\n doc.version = text;\n if (raw !== \"2.0\") {\n report.warning(\n \"validation-error\",\n CX2_ISSUE.MINOR_VERSION,\n `CXVersion ${shown(raw)} is not \"2.0\"; the document is read as CX2 2.0`,\n { line, element: \"CXVersion\" },\n );\n }\n for (const key of Object.keys(value)) {\n if (key === \"hasFragments\") {\n if (typeof value.hasFragments === \"boolean\") {\n doc.hasFragments = value.hasFragments;\n } else {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `hasFragments is ${shown(value.hasFragments)}, not a boolean; read as false`,\n { line, element: \"hasFragments\" },\n );\n }\n } else if (key !== \"CXVersion\") {\n report.warning(\"validation-error\", UNKNOWN_ELEMENT_CODE, `the descriptor key \"${key}\" is not defined`, {\n line,\n element: key,\n });\n }\n }\n}\n\n/**\n * Read a member that is not a streamed block: a one-key object holding an object is a\n * one-element aspect (`{\"ndexStatus\": {...}}`); anything else is E_BAD_ASPECT_BLOCK.\n * @param value - the member\n * @param line - its line\n * @param structure - the structure checker\n * @param report - the report\n * @param collect - receives the aspect name and its one element\n */\nfunction memberAspect(\n value: unknown,\n line: number,\n structure: CxStructure,\n report: ImportReportBuilder,\n collect: (aspect: string, value: unknown) => void,\n): void {\n const keys = isRecord(value) ? Object.keys(value) : [];\n if (isRecord(value) && keys.length === 1 && isRecord(value[keys[0]])) {\n if (ARRAY_ASPECTS.has(keys[0])) {\n report.warning(\n \"validation-error\",\n CX2_ISSUE.SINGLE_OBJECT_ASPECT,\n `the \"${keys[0]}\" aspect is one object, not an array of elements; read as one element`,\n { line, element: keys[0] },\n );\n }\n structure.block(keys[0], line);\n collect(keys[0], value[keys[0]]);\n return;\n }\n const what = keys.length > 1 ? `an object with ${keys.length} keys (${keys.join(\", \")})` : shown(value);\n report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `a member of the document is ${what}, not a one-key aspect block; skipped`,\n { line, element: keys[0] ?? null },\n );\n}\n\n// ============================================================ declarations\n\n/** One declared attribute. */\ninterface Declaration {\n readonly name: string;\n /** The type: declared, or inferred from the values (null: nested or mixed values, a json column). */\n type: Cx2Type | null;\n alias: string | null;\n hasDefault: boolean;\n defaultValue: unknown;\n /** The default as written, while the type is still to be inferred (a type CX2 does not define). */\n readonly rawDefault: unknown;\n handle: ColumnHandle;\n /** Whether the file does not declare the attribute (W_CX2_UNDECLARED_ATTRIBUTE). */\n readonly undeclared: boolean;\n}\n\n/**\n * The scalar kind of one value for inference.\n * @param value - the value\n * @returns a CX2 scalar, or null for anything else\n */\nfunction scalarKind(value: unknown): Cx2Scalar | null {\n switch (typeof value) {\n case \"boolean\":\n return \"boolean\";\n case \"string\":\n return \"string\";\n case \"number\":\n return Number.isInteger(value) && value >= I32_MIN && value <= I32_MAX ? \"integer\" : \"double\";\n default:\n return value instanceof ExactInteger ? \"double\" : null;\n }\n}\n\n/** What inference has seen of an attribute's values so far. */\ninterface Seen {\n /** The scalar kind so far (undefined: nothing yet, null: no CX2 type fits). */\n kind: Cx2Scalar | null | undefined;\n /** Whether the values are lists (undefined: nothing yet). */\n list: boolean | undefined;\n}\n\n/**\n * Widen two scalar kinds: integer and double give double; anything else that differs has no\n * CX2 type.\n * @param a - the kind so far\n * @param b - a new kind\n * @returns the widened kind\n */\nfunction widenKind(a: Cx2Scalar | null | undefined, b: Cx2Scalar | null): Cx2Scalar | null {\n if (a === undefined || a === b) {\n return b;\n }\n if (a === null || b === null) {\n return null;\n }\n return (a === \"integer\" && b === \"double\") || (a === \"double\" && b === \"integer\") ? \"double\" : null;\n}\n\n/**\n * Observe one value of an undeclared attribute.\n * @param seen - the state\n * @param value - the value (never null)\n */\nfunction observe(seen: Seen, value: unknown): void {\n const list = Array.isArray(value);\n if (seen.list !== undefined && seen.list !== list) {\n seen.kind = null;\n return;\n }\n seen.list = list;\n if (!list) {\n seen.kind = widenKind(seen.kind, scalarKind(value));\n return;\n }\n for (const item of value as unknown[]) {\n seen.kind = widenKind(seen.kind, item === null || Array.isArray(item) ? null : scalarKind(item));\n }\n}\n\n/**\n * The CX2 type inference settles on.\n * @param seen - the state\n * @returns the type, or null for a json column\n */\nfunction inferredType(seen: Seen): Cx2Type | null {\n if (seen.kind === null) {\n return null;\n }\n const scalar = seen.kind ?? \"string\";\n return cx2Type(seen.list === true ? `list_of_${scalar}` : scalar);\n}\n\n/** The declarations of one table. */\nclass DeclarationTable {\n readonly byName = new Map<string, Declaration>();\n\n readonly byAlias = new Map<string, Declaration>();\n\n /**\n * The declaration a key of an element's `v` names.\n * @param key - the key\n * @returns the declaration and whether the key was its alias, or null\n */\n resolve(key: string): { readonly decl: Declaration; readonly viaAlias: boolean } | null {\n const viaAlias = this.byAlias.get(key);\n if (viaAlias !== undefined) {\n return { decl: viaAlias, viaAlias: true };\n }\n const decl = this.byName.get(key);\n return decl === undefined ? null : { decl, viaAlias: false };\n }\n}\n\n/** The three declaration tables of CX2 and what the declarations element holds besides. */\ninterface Declarations {\n readonly node: DeclarationTable;\n readonly edge: DeclarationTable;\n readonly network: DeclarationTable;\n /** Declarations for opaque aspects, kept verbatim. */\n readonly other: Record<string, unknown>;\n}\n\n/** The domain key of attributeDeclarations for each table. */\nconst DECLARATION_KEYS: ReadonlyMap<string, \"node\" | \"edge\" | \"network\"> = new Map([\n [\"nodes\", \"node\"],\n [\"edges\", \"edge\"],\n [\"networkAttributes\", \"network\"],\n]);\n\n/**\n * Whether an object has an own property (never one of Object.prototype, as `in` would find).\n * @param record - the object\n * @param key - the key\n * @returns true for an own property\n */\nfunction hasOwn(record: Record<string, unknown>, key: string): boolean {\n return Object.hasOwn(record, key);\n}\n\n// ============================================================ the build\n\n/** Reads a collected document into a sink. */\nclass Cx2Reader {\n private readonly sink: GraphSink;\n\n private readonly report: ImportReportBuilder;\n\n private readonly options: ResolvedImportOptions;\n\n private readonly zAs: \"column\" | \"position\";\n\n private readonly doc: Cx2Document;\n\n private readonly direction: DirectionResolver;\n\n private readonly coercer: IdCoercer;\n\n private readonly decls: Declarations = {\n node: new DeclarationTable(),\n edge: new DeclarationTable(),\n network: new DeclarationTable(),\n other: {},\n };\n\n /** CX node id -> sink node index. */\n private readonly nodeRows = new Map<NodeId, number>();\n\n /** CX node id -> the id the sink holds it under (differs when a mangled id is restored). */\n private readonly sinkIds = new Map<NodeId, NodeId>();\n\n /** The original ids restored so far: a second node with one keeps its CX id. */\n private readonly restored = new Set<NodeId>();\n\n /** CX edge id -> sink edge index. */\n private readonly edgeRows = new Map<NodeId, number>();\n\n private positionHandle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n private zHandle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n private edgeIdHandle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n /** The rows that have a position (a set: a duplicate node may carry coordinates twice). */\n private readonly positioned = new Set<number>();\n\n private sinceCheck = 0;\n\n private idType: \"integer\" | \"mixed\" | \"string\" = \"integer\";\n\n private weighted = false;\n\n private readonly dangling = new Map<string, number>();\n\n private readonly point: [number, number, number] = [0, 0, 0];\n\n /**\n * Create the reader.\n * @param sink - the sink\n * @param report - the report\n * @param options - the resolved options\n * @param zAs - where z goes\n * @param doc - the collected document\n */\n constructor(\n sink: GraphSink,\n report: ImportReportBuilder,\n options: ResolvedImportOptions,\n zAs: \"column\" | \"position\",\n doc: Cx2Document,\n ) {\n this.sink = sink;\n this.report = report;\n this.options = options;\n this.zAs = zAs;\n this.doc = doc;\n this.direction = new DirectionResolver(sink, report, options.onMixedDirection);\n this.coercer = new IdCoercer(options.ids);\n }\n\n /** Build the graph. */\n build(): void {\n const { doc, report } = this;\n this.direction.setHeader(true);\n this.readDeclarations();\n this.declareColumns();\n this.sink.reserve(doc.nodes.length, doc.edges.length);\n for (const held of doc.nodes) {\n this.readNode(held);\n }\n this.readLegacyLayout();\n if (this.positioned.size > 0 && this.positioned.size < this.nodeRows.size) {\n report.warnOnce(\n \"missing-value\",\n CX2_ISSUE.PARTIAL_LAYOUT,\n `${this.nodeRows.size - this.positioned.size} of ${this.nodeRows.size} node${plural(this.nodeRows.size)} ${agree(this.nodeRows.size - this.positioned.size, \"has\", \"have\")} no coordinates; their positions are unset`,\n { element: \"nodes\" },\n );\n }\n for (const held of doc.edges) {\n this.readEdge(held);\n }\n this.readNetworkAttributes();\n this.readBypasses(\"node\", doc.nodeBypasses);\n this.readBypasses(\"edge\", doc.edgeBypasses);\n for (const [kind, count] of this.dangling) {\n report.warning(\n \"validation-error\",\n DANGLING_REFERENCE_CODE,\n `${count} ${kind}${plural(count)} ${agree(count, \"names\", \"name\")} no element; ignored`,\n { element: kind },\n );\n }\n this.checkAspects();\n this.setMeta();\n }\n\n // ------------------------------------------------------------ declarations\n\n /** Merge every attributeDeclarations element (fragments in order) into the tables. */\n private readDeclarations(): void {\n const { report } = this;\n for (const held of this.doc.declarations) {\n if (!isRecord(held.value)) {\n report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n \"an attributeDeclarations element is not an object\",\n {\n line: held.line,\n element: \"attributeDeclarations\",\n },\n );\n continue;\n }\n for (const [key, table] of Object.entries(held.value)) {\n const domain = DECLARATION_KEYS.get(key);\n if (domain === undefined) {\n report.warning(\n \"unsupported\",\n UNKNOWN_ELEMENT_CODE,\n `attributeDeclarations holds the table \"${key}\", which CX2 does not define; kept in meta.extra.cx2.declarations, not applied`,\n { line: held.line, element: key },\n );\n setOwn(\n this.decls.other,\n key,\n plainJson(table, (digits) => {\n this.precision(key, digits);\n }),\n );\n continue;\n }\n if (!isRecord(table)) {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `the ${key} declarations are not an object; ignored`,\n { line: held.line, element: key },\n );\n continue;\n }\n for (const [name, decl] of Object.entries(table)) {\n this.declare(domain, name, decl, held.line);\n }\n }\n }\n for (const domain of [\"node\", \"edge\"] as const) {\n this.checkAliases(domain);\n }\n this.inferUndeclared(\"node\", this.doc.nodes);\n this.inferUndeclared(\"edge\", this.doc.edges);\n }\n\n /**\n * Type the attributes no declaration types (undeclared, or declared with a type CX2 does not\n * define) from their values, so every attribute column is declared with its CX2 type.\n * @param domain - node or edge\n * @param elements - the elements\n */\n private inferUndeclared(domain: \"node\" | \"edge\", elements: readonly Held[]): void {\n const table = this.decls[domain];\n const seen = new Map<string, Seen>();\n for (const { value } of elements) {\n if (!isRecord(value) || !isRecord(value.v)) {\n continue;\n }\n for (const [key, raw] of Object.entries(value.v)) {\n const resolved = table.resolve(key);\n if (\n key === \"\" ||\n (resolved !== null && resolved.decl.type !== null) ||\n raw === null ||\n raw === undefined\n ) {\n continue;\n }\n const name = resolved?.decl.name ?? key;\n let state = seen.get(name);\n if (state === undefined) {\n state = { kind: undefined, list: undefined };\n seen.set(name, state);\n }\n observe(state, raw);\n }\n }\n for (const [name, state] of seen) {\n const type = inferredType(state);\n const decl = table.byName.get(name);\n if (decl !== undefined) {\n decl.type = type;\n if (decl.hasDefault && type !== null) {\n // the default of a type CX2 does not define, converted now the values typed the column\n decl.defaultValue = this.convertDefault(name, decl.rawDefault, type, { element: name });\n decl.hasDefault = decl.defaultValue !== BAD;\n }\n continue;\n }\n table.byName.set(name, {\n name,\n type,\n alias: null,\n hasDefault: false,\n defaultValue: undefined,\n rawDefault: undefined,\n handle: INVALID_INDEX as ColumnHandle,\n undeclared: true,\n });\n }\n }\n\n /**\n * Add one declaration to a table.\n * @param domain - the table\n * @param name - the attribute name\n * @param raw - the declaration object\n * @param line - its line\n */\n private declare(domain: \"node\" | \"edge\" | \"network\", name: string, raw: unknown, line: number): void {\n const { report } = this;\n const table = this.decls[domain];\n const where = { line, element: name };\n if (name === \"\") {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `a ${domain} attribute declaration has an empty name; ignored`,\n where,\n );\n return;\n }\n if (!isRecord(raw)) {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `the declaration of \"${name}\" is not an object; ignored`,\n where,\n );\n return;\n }\n let type: Cx2Type | null;\n if (raw.d === undefined) {\n type = cx2Type(\"string\");\n report.warning(\n \"unsupported\",\n UNKNOWN_ATTR_TYPE_CODE,\n `the declaration of \"${name}\" has no type; read as string (the Java reader's rule)`,\n where,\n );\n } else {\n type = typeof raw.d === \"string\" ? cx2Type(raw.d) : null;\n if (type === null) {\n report.warning(\n \"unsupported\",\n UNKNOWN_ATTR_TYPE_CODE,\n `the type ${shown(raw.d)} of \"${name}\" is not a CX2 type; the column is inferred from its values`,\n where,\n );\n }\n }\n const existing = table.byName.get(name);\n if (existing !== undefined) {\n if (existing.type?.d !== type?.d) {\n report.error(\n \"validation-error\",\n CX2_ISSUE.DECLARATION_CONFLICT,\n `\"${name}\" is declared ${existing.type?.d ?? \"untyped\"} and again ${type?.d ?? \"untyped\"}; the first declaration wins`,\n where,\n );\n }\n return;\n }\n if (raw.a !== undefined && raw.a !== null && typeof raw.a !== \"string\") {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `the alias ${shown(raw.a)} of \"${name}\" is not a string; ignored`,\n where,\n );\n }\n let alias = typeof raw.a === \"string\" ? raw.a : null;\n let hasDefault = raw.v !== undefined && raw.v !== null;\n if (domain === \"network\" && (raw.a !== undefined || raw.v !== undefined)) {\n report.warning(\n \"validation-error\",\n CX2_ISSUE.NETWORK_DECLARATION,\n `the network attribute \"${name}\" declares an alias or a default, which CX2 forbids; ignored`,\n where,\n );\n alias = null;\n hasDefault = false;\n }\n let defaultValue: unknown = undefined;\n if (hasDefault && type !== null) {\n defaultValue = this.convertDefault(name, raw.v, type, where);\n hasDefault = defaultValue !== BAD;\n }\n table.byName.set(name, {\n name,\n type,\n alias,\n hasDefault,\n defaultValue,\n rawDefault: hasDefault && type === null ? plainJson(raw.v) : undefined,\n handle: INVALID_INDEX as ColumnHandle,\n undeclared: false,\n });\n }\n\n /**\n * Convert a declared default; a numeric string for a numeric type (the specification's own\n * `\"v\": \"0.0\"`) is coerced, anything else that does not match drops the default.\n * @param name - the attribute\n * @param value - the default\n * @param type - its type\n * @param where - the location\n * @param where.line - the line\n * @param where.element - the attribute\n * @returns the default, or BAD when dropped\n */\n private convertDefault(\n name: string,\n value: unknown,\n type: Cx2Type,\n where: { line?: number; element: string },\n ): unknown {\n const converted = convertValue(value, type, this.options.long, (digits) => {\n this.precision(name, digits);\n });\n if (converted !== BAD) {\n return converted;\n }\n const numeric = type.scalar === \"double\" || type.scalar === \"integer\" || type.scalar === \"long\";\n if (\n !type.list &&\n numeric &&\n typeof value === \"string\" &&\n value.trim() !== \"\" &&\n Number.isFinite(Number(value))\n ) {\n const coerced = convertValue(Number(value), type, this.options.long, () => undefined);\n if (coerced !== BAD) {\n this.report.warning(\n \"validation-error\",\n BAD_DEFAULT_CODE,\n `the default ${shown(value)} of \"${name}\" is a string, not a ${type.d}; read as ${shown(coerced)}`,\n where,\n );\n return coerced;\n }\n }\n this.report.warning(\n \"validation-error\",\n BAD_DEFAULT_CODE,\n `the default ${shown(value)} of \"${name}\" is not a ${type.d}; the column has no default`,\n where,\n );\n return BAD;\n }\n\n /**\n * Check the aliases of a table in declaration order: an alias that is another attribute's\n * name or another attribute's alias is E_CX2_ALIAS_CONFLICT and ignored.\n * @param domain - the table\n */\n private checkAliases(domain: \"node\" | \"edge\"): void {\n const table = this.decls[domain];\n for (const decl of table.byName.values()) {\n const { alias } = decl;\n if (alias === null || alias === decl.name) {\n if (alias !== null) {\n table.byAlias.set(alias, decl);\n }\n continue;\n }\n const other = table.byName.get(alias) ?? table.byAlias.get(alias);\n if (other !== undefined) {\n const clash = other.name === alias ? \"an attribute's name\" : `the alias of \"${other.name}\"`;\n this.report.error(\n \"validation-error\",\n CX2_ISSUE.ALIAS_CONFLICT,\n `the alias \"${alias}\" of the ${domain} attribute \"${decl.name}\" is also ${clash}; the alias is ignored`,\n { element: decl.name },\n );\n decl.alias = null;\n continue;\n }\n table.byAlias.set(alias, decl);\n }\n }\n\n /** Declare the declared node and edge columns. */\n private declareColumns(): void {\n const restore = this.options.restoreMangledIds;\n for (const domain of [\"node\", \"edge\"] as const) {\n for (const decl of this.decls[domain].byName.values()) {\n if (domain === \"node\" && restore && decl.name === ORIGINAL_ID_ATTRIBUTE) {\n continue;\n }\n if (domain === \"edge\" && decl.name === this.options.weightFrom) {\n continue;\n }\n const column: ColumnDecl =\n decl.type === null\n ? {\n name: decl.name,\n dtype: \"json\",\n nullable: true,\n origin: { format: CX2_FORMAT, id: decl.alias },\n }\n : {\n ...this.columnDecl(decl.type),\n name: decl.name,\n origin: { format: CX2_FORMAT, id: decl.alias, type: decl.type.d },\n };\n if (decl.hasDefault) {\n // a type nothing settled (no values) keeps its default as written, in the json column\n column.default = decl.type === null ? decl.rawDefault : decl.defaultValue;\n }\n if (domain === \"node\" && decl.name === \"name\") {\n column.role = \"label\";\n }\n decl.handle = declareResolved(this.sink, domain, column, this.report).handle;\n }\n }\n }\n\n /**\n * The edge id column, declared with the first edge.\n * @returns the handle\n */\n private edgeIdColumn(): ColumnHandle {\n if (this.edgeIdHandle === INVALID_INDEX) {\n const taken = (name: string): boolean => this.sink.edgeColumn(name) !== INVALID_INDEX;\n this.edgeIdHandle = declareResolved(\n this.sink,\n \"edge\",\n { name: uniqueColumnName(\"id\", \"cx2\", taken), dtype: \"f64\", role: \"id\", nullable: true },\n this.report,\n ).handle;\n }\n return this.edgeIdHandle;\n }\n\n /**\n * The dtype part of a declared column.\n * @param type - the CX2 type\n * @returns the dtype and item dtype\n */\n private columnDecl(type: Cx2Type): { name: string; dtype: Dtype; itemDtype?: ScalarDtype; nullable: true } {\n const scalar = scalarDtype(type.scalar, this.options.long);\n return type.list\n ? { name: \"\", dtype: \"list\", itemDtype: scalar, nullable: true }\n : { name: \"\", dtype: scalar, nullable: true };\n }\n\n // ------------------------------------------------------------ ids\n\n /**\n * The id of an element, by the CX id rule and the `ids` option.\n * @param raw - the parsed id\n * @param inexact - whether the literal was not a plain integer\n * @param element - the element name for issues\n * @param line - the element's line\n * @param edgeId - whether this is an edge's own id (stored in the f64 id column, not kept as digits)\n * @returns the id, or null when it was reported\n */\n private idOf(raw: unknown, inexact: boolean, element: string, line: number, edgeId = false): NodeId | null {\n let id: NodeId;\n try {\n const parsed = cxId(raw, inexact);\n if (parsed.note === \"text\") {\n this.report.warnOnce(\n \"coercion\",\n ID_TEXT_TYPE_CODE,\n `${element}: the id ${shown(raw)} is not written as an integer; read as ${String(parsed.id)}`,\n { line, element },\n );\n } else if (parsed.note === \"precision\" && edgeId) {\n // the edge is told apart by its digits, but the id column is f64\n this.report.warnOnce(\n \"precision\",\n PRECISION_CODE,\n `${element}: the edge id ${String(parsed.id)} is beyond 2^53; the id column holds the nearest double`,\n { line, element },\n `${PRECISION_CODE}:edge`,\n );\n } else if (parsed.note === \"precision\") {\n this.idType = \"mixed\";\n this.report.warnOnce(\n \"precision\",\n PRECISION_CODE,\n `${element}: the id ${String(parsed.id)} is beyond 2^53; kept as its digits (a string id)`,\n { line, element },\n );\n }\n id = this.options.ids === \"keep\" ? parsed.id : this.coercer.value(parsed.id);\n } catch (err) {\n this.report.recordError(err, { line, element });\n return null;\n }\n return id;\n }\n\n /**\n * Check the cancellation signal every ABORT_CHECK_INTERVAL elements.\n */\n private checkAbort(): void {\n if (++this.sinceCheck >= ABORT_CHECK_INTERVAL) {\n this.sinceCheck = 0;\n throwIfAborted(this.options.signal);\n }\n }\n\n /**\n * Report the keys of an element CX2 does not define, once per key.\n * @param record - the element\n * @param known - the keys it defines\n * @param what - nodes or edges\n * @param line - its line\n */\n private unknownKeys(record: Record<string, unknown>, known: ReadonlySet<string>, what: string, line: number): void {\n for (const key of Object.keys(record)) {\n if (!known.has(key)) {\n this.report.warnOnce(\n \"unsupported\",\n UNKNOWN_ELEMENT_CODE,\n `the ${what} key \"${key}\" is not defined by CX2; its values are not read`,\n { line, element: key },\n `${UNKNOWN_ELEMENT_CODE}:${what}:${key}`,\n );\n }\n }\n }\n\n // ------------------------------------------------------------ nodes\n\n /**\n * Read one node element.\n * @param held - the element\n */\n private readNode(held: Held): void {\n this.checkAbort();\n const { report, sink } = this;\n const { value, line } = held;\n if (!isRecord(value)) {\n report.error(\"parse-error\", BAD_ASPECT_BLOCK_CODE, `a nodes element is ${shown(value)}, not an object`, {\n line,\n element: \"nodes\",\n });\n report.counts.skippedNodes++;\n return;\n }\n this.unknownKeys(value, NODE_KEYS, \"node\", line);\n if (value.id === undefined || value.id === null) {\n report.error(\"missing-value\", MISSING_ID_CODE, \"a node has no id\", { line, element: \"nodes\" });\n report.counts.skippedNodes++;\n return;\n }\n const element = `node ${shown(value.id)}`;\n const cx = this.idOf(value.id, (held.inexact & 1) !== 0, element, line);\n if (cx === null) {\n report.counts.skippedNodes++;\n return;\n }\n const attrs = isRecord(value.v) ? value.v : null;\n if (value.v !== undefined && value.v !== null && attrs === null) {\n report.error(\"validation-error\", BAD_VALUE_CODE, `${element}: v is ${shown(value.v)}, not an object`, {\n line,\n element,\n });\n }\n let row = this.nodeRows.get(cx);\n if (row !== undefined) {\n report.warning(\n \"merged\",\n DUPLICATE_NODE_CODE,\n `${element} is declared more than once; its attributes are merged (the later values win)`,\n { line, element },\n );\n } else {\n let original = this.originalIdOf(attrs, element, line);\n if (original !== null && this.restored.has(original)) {\n report.warning(\n \"merged\",\n DUPLICATE_NODE_CODE,\n `${element}: its original id ${shown(original)} is already another node's; it keeps its CX id`,\n { line, element },\n );\n original = null;\n }\n if (original !== null) {\n this.restored.add(original);\n }\n this.idTypeOf(original ?? cx);\n try {\n row = sink.addNode(original ?? cx);\n } catch (err) {\n report.recordError(err, { line, element });\n report.counts.skippedNodes++;\n return;\n }\n this.nodeRows.set(cx, row);\n this.sinkIds.set(cx, original ?? cx);\n report.counts.nodes++;\n }\n this.readCoordinates(value, row, element, line);\n if (attrs !== null) {\n this.writeAttributes(\"node\", row, attrs, element, line);\n }\n }\n\n /**\n * The original id the exporter's `sanitizeIds: \"mangle\"` kept, when it is to be restored.\n * @param attrs - the node's v\n * @param element - the element name for issues\n * @param line - its line\n * @returns the original id, or null\n */\n private originalIdOf(attrs: Record<string, unknown> | null, element: string, line: number): NodeId | null {\n if (attrs === null || !this.options.restoreMangledIds) {\n return null;\n }\n const alias = this.decls.node.byName.get(ORIGINAL_ID_ATTRIBUTE)?.alias ?? null;\n const raw = attrs[ORIGINAL_ID_ATTRIBUTE] ?? (alias === null ? undefined : attrs[alias]);\n if (raw !== undefined && raw !== null && typeof raw !== \"string\") {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element}: ${ORIGINAL_ID_ATTRIBUTE} is ${shown(raw)}, not a string; the node keeps its CX id`,\n { line, element },\n );\n }\n return typeof raw === \"string\" ? raw : null;\n }\n\n /**\n * Track the idType of the metadata.\n * @param id - a node id\n */\n private idTypeOf(id: NodeId): void {\n if (typeof id === \"string\" && this.idType === \"integer\") {\n this.idType = \"mixed\";\n }\n }\n\n /**\n * Read a node's x / y / z.\n * @param value - the node element\n * @param row - the node\n * @param element - the element name\n * @param line - its line\n */\n private readCoordinates(value: Record<string, unknown>, row: number, element: string, line: number): void {\n const coordinate = (key: \"x\" | \"y\" | \"z\"): number | null => {\n const raw = value[key];\n if (raw === undefined || raw === null) {\n return null;\n }\n if (typeof raw === \"number\") {\n return raw;\n }\n this.report.error(\"validation-error\", BAD_VALUE_CODE, `${element}: ${key} is ${shown(raw)}, not a number`, {\n line,\n element,\n });\n return null;\n };\n const x = coordinate(\"x\");\n const y = coordinate(\"y\");\n const z = coordinate(\"z\");\n if ((x === null) !== (y === null)) {\n this.report.warnOnce(\n \"missing-value\",\n CX2_ISSUE.PARTIAL_LAYOUT,\n `${element} has ${x === null ? \"y without x\" : \"x without y\"}; its coordinates are dropped`,\n { line, element },\n `${CX2_ISSUE.PARTIAL_LAYOUT}:half`,\n );\n }\n if (z !== null && x === null && y === null) {\n // the specification requires x and y with z\n this.report.warnOnce(\n \"missing-value\",\n CX2_ISSUE.PARTIAL_LAYOUT,\n `${element} has z without x and y; ${this.zAs === \"column\" ? \"z is kept in the z column\" : \"with no position, z is dropped\"}`,\n { line, element },\n `${CX2_ISSUE.PARTIAL_LAYOUT}:z`,\n );\n }\n if (x !== null && y !== null && (!Number.isFinite(x) || !Number.isFinite(y))) {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element}: the coordinates ${String(x)}, ${String(y)} are not both finite; the position is unset`,\n { line, element },\n );\n } else if (x !== null && y !== null) {\n this.setPosition(row, x, y, z);\n }\n if (z !== null && this.zAs === \"column\") {\n if (this.zHandle === INVALID_INDEX) {\n this.zHandle = declareResolved(this.sink, \"node\", zDecl(CX2_FORMAT), this.report).handle;\n }\n this.sink.setNodeValue(this.zHandle, row, z);\n }\n }\n\n /**\n * Write a node's position, y flipped to y-up.\n * @param row - the node\n * @param x - screen x\n * @param y - screen y\n * @param z - z, used only under zAs \"position\"\n */\n private setPosition(row: number, x: number, y: number, z: number | null): void {\n if (this.positionHandle === INVALID_INDEX) {\n this.positionHandle = declareResolved(\n this.sink,\n \"node\",\n positionDecl(CX2_FORMAT, this.zAs === \"position\" ? 3 : 2),\n this.report,\n ).handle;\n }\n this.point[0] = x;\n this.point[1] = flipY(y);\n this.point[2] = this.zAs === \"position\" && z !== null ? z : 0;\n this.sink.setNodeValue(this.positionHandle, row, this.point);\n this.positioned.add(row);\n }\n\n /** Apply a CX1 cartesianLayout aspect when no node carries coordinates; keep and warn otherwise. */\n private readLegacyLayout(): void {\n const { cartesianLayout } = this.doc;\n if (cartesianLayout.length === 0) {\n return;\n }\n if (this.positioned.size > 0) {\n this.doc.opaque.set(\n \"cartesianLayout\",\n cartesianLayout.map((h) => plainJson(h.value)),\n );\n this.report.warning(\n \"unsupported\",\n CX2_ISSUE.LEGACY_LAYOUT,\n `a CX1 cartesianLayout aspect (${cartesianLayout.length} element${plural(cartesianLayout.length)}) next to node coordinates; the node coordinates are used, the aspect is kept in meta.extra.cx2`,\n { element: \"cartesianLayout\" },\n );\n return;\n }\n // the first view named is the layout; a CX1 file with several views keeps the others\n let view: unknown;\n const seen = new Set<number>();\n for (const held of cartesianLayout) {\n const entry = held.value;\n if (!isRecord(entry) || typeof entry.x !== \"number\" || typeof entry.y !== \"number\") {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n \"a cartesianLayout element has no numeric x and y; skipped\",\n { line: held.line, element: \"cartesianLayout\" },\n );\n continue;\n }\n const row = this.rowOf(this.nodeRows, entry.node);\n if (row === undefined) {\n this.dangle(\"cartesianLayout entry\");\n continue;\n }\n view ??= entry.view ?? null;\n if ((entry.view ?? null) !== view) {\n this.doc.opaque.set(\n \"cartesianLayout\",\n cartesianLayout.map((h) => plainJson(h.value)),\n );\n this.report.warnOnce(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `the cartesianLayout aspect names several views; view ${shown(view)} is read, the aspect is kept in meta.extra.cx2`,\n { line: held.line, element: \"cartesianLayout\" },\n `${DUPLICATE_ATTRIBUTE_CODE}:layout:view`,\n );\n continue;\n }\n if (seen.has(row)) {\n this.report.warnOnce(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `node ${shown(entry.node)} has two cartesianLayout entries; the later wins`,\n { line: held.line, element: \"cartesianLayout\" },\n `${DUPLICATE_ATTRIBUTE_CODE}:layout`,\n );\n }\n seen.add(row);\n const z = typeof entry.z === \"number\" ? entry.z : null;\n this.setPosition(row, entry.x, entry.y, z);\n if (z !== null && this.zAs === \"column\") {\n if (this.zHandle === INVALID_INDEX) {\n this.zHandle = declareResolved(this.sink, \"node\", zDecl(CX2_FORMAT), this.report).handle;\n }\n this.sink.setNodeValue(this.zHandle, row, z);\n }\n }\n }\n\n /**\n * The sink row of a referenced id.\n * @param rows - the id map\n * @param raw - the parsed reference\n * @returns the row, or undefined\n */\n private rowOf(rows: ReadonlyMap<NodeId, number>, raw: unknown): number | undefined {\n try {\n const { id } = cxId(raw);\n return rows.get(this.options.ids === \"keep\" ? id : this.coercer.value(id));\n } catch {\n return undefined;\n }\n }\n\n /**\n * Count a reference that names nothing.\n * @param kind - what referred\n */\n private dangle(kind: string): void {\n this.dangling.set(kind, (this.dangling.get(kind) ?? 0) + 1);\n }\n\n // ------------------------------------------------------------ attributes\n\n /**\n * Write the attributes of an element's v.\n * @param domain - node or edge\n * @param row - the row\n * @param attrs - the v object\n * @param element - the element name\n * @param line - its line\n */\n private writeAttributes(\n domain: \"node\" | \"edge\",\n row: number,\n attrs: Record<string, unknown>,\n element: string,\n line: number,\n ): void {\n const { report } = this;\n const table = this.decls[domain];\n for (const key of Object.keys(attrs)) {\n const value = attrs[key];\n if (key === \"\") {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element}: v holds an attribute with an empty name; skipped`,\n { line, element },\n );\n continue;\n }\n const resolved = table.resolve(key);\n const name = resolved?.decl.name ?? key;\n if (domain === \"node\" && this.options.restoreMangledIds && name === ORIGINAL_ID_ATTRIBUTE) {\n continue;\n }\n if (domain === \"edge\" && name === this.options.weightFrom) {\n continue;\n }\n if (key === \"id\") {\n report.warnOnce(\n \"validation-error\",\n CX2_ISSUE.RESERVED_KEY,\n `${element}: the attribute name \"id\" is reserved in v; read as an ordinary attribute`,\n { line, element },\n `${CX2_ISSUE.RESERVED_KEY}:${domain}`,\n );\n }\n if (\n resolved !== null &&\n !resolved.viaAlias &&\n resolved.decl.alias !== null &&\n resolved.decl.alias !== key\n ) {\n if (hasOwn(attrs, resolved.decl.alias)) {\n report.warning(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `${element}: \"${name}\" is given under its alias and its full name; the alias wins`,\n { line, element },\n );\n continue;\n }\n report.warnOnce(\n \"coercion\",\n CX2_ISSUE.ALIAS_BYPASSED,\n `${element}: the full name \"${name}\" is used although its alias \"${resolved.decl.alias}\" is declared; read as the same attribute`,\n { line, element },\n `${CX2_ISSUE.ALIAS_BYPASSED}:${domain}:${name}`,\n );\n }\n if (value === null || value === undefined) {\n continue;\n }\n if (resolved === null) {\n continue;\n }\n const { decl } = resolved;\n if (decl.undeclared) {\n report.warnOnce(\n \"validation-error\",\n CX2_ISSUE.UNDECLARED_ATTRIBUTE,\n `the ${domain} attribute \"${key}\" is not declared; its type is inferred from the values`,\n { line, element: key },\n `${CX2_ISSUE.UNDECLARED_ATTRIBUTE}:${domain}:${key}`,\n );\n }\n const converted =\n decl.type === null\n ? plainJson(value, (digits) => {\n this.precision(name, digits);\n })\n : convertValue(value, decl.type, this.options.long, (digits) => {\n this.precision(name, digits);\n });\n if (converted === BAD) {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element}: \"${name}\" is ${shown(value)}, not a ${decl.type?.d ?? \"value\"}; the cell is unset`,\n { line, element },\n );\n continue;\n }\n try {\n if (domain === \"node\") {\n this.sink.setNodeValue(decl.handle, row, converted);\n } else {\n this.sink.setEdgeValue(decl.handle, row, converted);\n }\n } catch (err) {\n report.recordError(err, { line, element });\n }\n }\n }\n\n /**\n * Record a long value beyond 2^53 (once).\n * @param name - the attribute\n * @param digits - the value\n */\n private precision(name: string, digits: string): void {\n this.report.warnOnce(\n \"precision\",\n PRECISION_CODE,\n `\"${name}\": ${digits} is beyond 2^53; stored as the nearest double`,\n { element: name },\n `${PRECISION_CODE}:value`,\n );\n }\n\n // ------------------------------------------------------------ edges\n\n /**\n * Read one edge element.\n * @param held - the element\n */\n private readEdge(held: Held): void {\n this.checkAbort();\n const { report, sink } = this;\n const { value, line } = held;\n if (!isRecord(value)) {\n report.error(\"parse-error\", BAD_ASPECT_BLOCK_CODE, `an edges element is ${shown(value)}, not an object`, {\n line,\n element: \"edges\",\n });\n report.counts.skippedEdges++;\n return;\n }\n this.unknownKeys(value, EDGE_KEYS, \"edge\", line);\n if (value.id === undefined || value.id === null) {\n report.error(\"missing-value\", MISSING_ID_CODE, \"an edge has no id\", { line, element: \"edges\" });\n report.counts.skippedEdges++;\n return;\n }\n const element = `edge ${shown(value.id)}`;\n for (const key of [\"s\", \"t\"] as const) {\n if (value[key] === undefined || value[key] === null) {\n report.error(\"missing-value\", MISSING_ENDPOINT_CODE, `${element} has no ${key}`, { line, element });\n report.counts.skippedEdges++;\n return;\n }\n }\n const id = this.idOf(value.id, (held.inexact & 1) !== 0, element, line, true);\n const s = id === null ? null : this.idOf(value.s, (held.inexact & 2) !== 0, element, line);\n const t = s === null ? null : this.idOf(value.t, (held.inexact & 4) !== 0, element, line);\n if (id === null || s === null || t === null) {\n report.counts.skippedEdges++;\n return;\n }\n if (this.edgeRows.has(id)) {\n report.error(\n \"validation-error\",\n DUPLICATE_EDGE_ID_CODE,\n `${element} is declared more than once; the later edge is skipped`,\n { line, element },\n );\n report.counts.skippedEdges++;\n return;\n }\n const source = this.endpoint(s, element, line);\n const target = source === null ? null : this.endpoint(t, element, line);\n if (source === null || target === null) {\n report.counts.skippedEdges++;\n return;\n }\n const attrs = isRecord(value.v) ? value.v : null;\n if (value.v !== undefined && value.v !== null && attrs === null) {\n report.error(\"validation-error\", BAD_VALUE_CODE, `${element}: v is ${shown(value.v)}, not an object`, {\n line,\n element,\n });\n }\n let weight: number | undefined;\n const weightKey = this.weightKey(attrs);\n try {\n weight = weightKey === null || attrs === null ? undefined : weightFromValue(plainJson(attrs[weightKey]));\n } catch (err) {\n report.recordError(err, { line, element });\n report.counts.skippedEdges++;\n return;\n }\n if (weight !== undefined) {\n this.weighted = true;\n }\n const before = sink.edgeCount;\n let edge: number;\n try {\n edge = this.direction.addEdge(source, target, \"directed\", weight, { line, element });\n } catch (err) {\n report.recordError(err, { line, element });\n report.counts.skippedEdges++;\n return;\n }\n report.counts.edges += sink.edgeCount - before;\n this.edgeRows.set(id, edge);\n sink.setEdgeValue(this.edgeIdColumn(), edge, typeof id === \"number\" ? id : Number(id));\n if (attrs !== null) {\n this.writeAttributes(\"edge\", edge, attrs, element, line);\n }\n }\n\n /**\n * The key of an edge's v that holds the weight: weightFrom, or its declared alias.\n * @param attrs - the edge's v\n * @returns the key present in attrs, or null\n */\n private weightKey(attrs: Record<string, unknown> | null): string | null {\n const { weightFrom } = this.options;\n if (weightFrom === null || attrs === null) {\n return null;\n }\n const alias = this.decls.edge.byName.get(weightFrom)?.alias ?? null;\n if (alias !== null && hasOwn(attrs, alias)) {\n return alias;\n }\n return hasOwn(attrs, weightFrom) ? weightFrom : null;\n }\n\n /**\n * The sink id of an edge endpoint: a known node, or a node created under addMissingNodes.\n * @param cx - the endpoint's CX id\n * @param element - the edge name\n * @param line - its line\n * @returns the sink id, or null when the endpoint was reported\n */\n private endpoint(cx: NodeId, element: string, line: number): NodeId | null {\n const known = this.sinkIds.get(cx);\n if (known !== undefined) {\n return known;\n }\n if (!this.options.addMissingNodes) {\n this.report.error(\n \"missing-value\",\n CX2_ISSUE.UNKNOWN_NODE,\n `${element}: the endpoint ${String(cx)} is not a node; the edge is skipped`,\n { line, element },\n );\n return null;\n }\n try {\n this.nodeRows.set(cx, this.sink.addNode(cx));\n } catch (err) {\n this.report.recordError(err, { line, element });\n return null;\n }\n this.sinkIds.set(cx, cx);\n this.report.counts.nodes++;\n return cx;\n }\n\n // ------------------------------------------------------------ network attributes, bypasses\n\n /** Write the network attributes (the first element; others are reported). */\n private readNetworkAttributes(): void {\n const { networkAttributes } = this.doc;\n if (networkAttributes.length === 0) {\n return;\n }\n if (networkAttributes.length > 1) {\n this.report.warning(\n \"validation-error\",\n CX2_ISSUE.EXTRA_ELEMENTS,\n `networkAttributes holds ${networkAttributes.length} elements; the first is read`,\n { line: networkAttributes[1].line, element: \"networkAttributes\" },\n );\n }\n const { value, line } = networkAttributes[0];\n if (!isRecord(value)) {\n this.report.error(\"parse-error\", BAD_ASPECT_BLOCK_CODE, \"the networkAttributes element is not an object\", {\n line,\n element: \"networkAttributes\",\n });\n return;\n }\n for (const [name, raw] of Object.entries(value)) {\n if (raw === null || raw === undefined) {\n continue;\n }\n const decl = this.decls.network.byName.get(name);\n const element = `networkAttributes.${name}`;\n if (decl === undefined) {\n this.report.warnOnce(\n \"validation-error\",\n CX2_ISSUE.UNDECLARED_ATTRIBUTE,\n `the network attribute \"${name}\" is not declared; its column is inferred from the value`,\n { line, element: name },\n `${CX2_ISSUE.UNDECLARED_ATTRIBUTE}:network:${name}`,\n );\n }\n if (\n (name === \"name\" || name === \"description\") &&\n typeof raw === \"string\" &&\n decl?.type?.d !== \"list_of_string\"\n ) {\n // the graph's own name and description: GraphMeta, written back from there\n continue;\n }\n try {\n const seen: Seen = { kind: undefined, list: undefined };\n observe(seen, raw);\n const type = decl?.type ?? inferredType(seen);\n if (type === null) {\n this.sink.setGraphValue(\n name,\n plainJson(raw, (digits) => {\n this.precision(name, digits);\n }),\n {\n dtype: \"json\",\n origin: { format: CX2_FORMAT, id: null },\n },\n );\n continue;\n }\n const converted = convertValue(raw, type, this.options.long, (digits) => {\n this.precision(name, digits);\n });\n if (converted === BAD) {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element} is ${shown(raw)}, not a ${type.d}; unset`,\n { line, element },\n );\n continue;\n }\n const scalar = scalarDtype(type.scalar, this.options.long);\n this.sink.setGraphValue(name, converted, {\n dtype: type.list ? \"list\" : scalar,\n ...(type.list ? { itemDtype: scalar } : {}),\n origin: { format: CX2_FORMAT, id: null, type: type.d },\n });\n } catch (err) {\n this.report.recordError(err, { line, element });\n }\n }\n }\n\n /**\n * Write the per-element visual property values: one column per property, typed by its values.\n * @param domain - node or edge\n * @param entries - the bypass elements\n */\n private readBypasses(domain: \"node\" | \"edge\", entries: readonly Held[]): void {\n const rows = domain === \"node\" ? this.nodeRows : this.edgeRows;\n const columns = new Map<string, { rows: number[]; values: unknown[]; at: Map<number, number> }>();\n for (const held of entries) {\n this.checkAbort();\n const { value, line } = held;\n if (!isRecord(value) || !isRecord(value.v)) {\n this.report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `a ${domain}Bypasses element is not an object with an id and a v object; skipped`,\n { line, element: `${domain}Bypasses` },\n );\n continue;\n }\n const row = this.rowOf(rows, value.id);\n if (row === undefined) {\n this.dangle(`${domain} bypass`);\n continue;\n }\n for (const [property, raw] of Object.entries(value.v)) {\n if (raw === null || raw === undefined) {\n continue;\n }\n if (property === \"\") {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `a ${domain}Bypasses element holds a visual property with an empty name; skipped`,\n { line, element: `${domain}Bypasses` },\n );\n continue;\n }\n let column = columns.get(property);\n if (column === undefined) {\n column = { rows: [], values: [], at: new Map() };\n columns.set(property, column);\n }\n const plain = plainJson(raw);\n const index = column.at.get(row);\n if (index === undefined) {\n column.at.set(row, column.rows.length);\n column.rows.push(row);\n column.values.push(plain);\n continue;\n }\n if (JSON.stringify(column.values[index]) !== JSON.stringify(plain)) {\n this.report.warnOnce(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `a ${domain} has the visual property \"${property}\" in two ${domain}Bypasses elements; the later wins`,\n { line, element: property },\n `${DUPLICATE_ATTRIBUTE_CODE}:bypass:${domain}:${property}`,\n );\n }\n column.values[index] = plain;\n }\n }\n for (const [property, { rows: targets, values }] of columns) {\n const decl: ColumnDecl = {\n name: property,\n dtype: bypassDtype(values),\n nullable: true,\n // origin.id keeps the property's name: a column renamed for a clash is written back under it\n origin: { format: CX2_FORMAT, id: property, namespace: BYPASS_NAMESPACE },\n };\n const handle = declareFresh(this.sink, domain, decl, this.report);\n for (let i = 0; i < targets.length; i++) {\n if (domain === \"node\") {\n this.sink.setNodeValue(handle, targets[i], values[i]);\n } else {\n this.sink.setEdgeValue(handle, targets[i], values[i]);\n }\n }\n }\n }\n\n // ------------------------------------------------------------ aspects, status, metadata\n\n /** The style-rule loss, the single-element aspects, the status and the metadata counts. */\n private checkAspects(): void {\n const { doc, report } = this;\n const { structure } = doc;\n const styles: string[] = [];\n for (const aspect of STYLE_ASPECTS) {\n const elements = doc.opaque.get(aspect);\n if (elements !== undefined) {\n styles.push(describeStyle(aspect, elements));\n }\n }\n if (styles.length > 0) {\n report.warning(\n \"unsupported\",\n STYLES_NOT_IMPORTED_CODE,\n `the file's style rules are not applied (${styles.join(\"; \")}); they are kept in meta.extra.cx2.opaque`,\n { element: STYLE_ASPECTS.filter((a) => doc.opaque.has(a)).join(\",\") },\n );\n }\n for (const aspect of SINGLE_ELEMENT_ASPECTS.slice(1)) {\n const count = doc.opaque.get(aspect)?.length ?? 0;\n if (count > 1) {\n report.warning(\n \"validation-error\",\n CX2_ISSUE.EXTRA_ELEMENTS,\n `${aspect} holds ${count} elements where CX2 allows one; all are kept, a reader uses the first`,\n { element: aspect },\n );\n }\n }\n if (!doc.hasFragments) {\n for (const [aspect, blocks] of structure.blocks) {\n if (blocks > 1 && !STRUCTURE_ASPECTS.has(aspect)) {\n report.warnOnce(\n \"validation-error\",\n CX2_ISSUE.UNDECLARED_FRAGMENTS,\n `\"${aspect}\" comes in ${blocks} blocks although the descriptor does not declare hasFragments; the blocks are joined in order`,\n { element: aspect },\n );\n }\n }\n }\n this.checkStatus();\n structure.checkCounts();\n }\n\n /** The status block: present, and exactly one well-formed element. */\n private checkStatus(): void {\n const { report } = this;\n const { structure } = this.doc;\n if (!structure.hasStatus) {\n report.error(\"validation-error\", CX2_ISSUE.NO_STATUS, \"the document ends without a status block\", {\n element: \"status\",\n });\n } else if (!structure.statusWellFormed() || structure.counts.get(\"status\") !== 1) {\n // the specification: exactly one status aspect holding exactly one element\n const count = structure.counts.get(\"status\") ?? 0;\n const found = count === 1 ? shown(structure.status) : `${count} elements`;\n report.error(\n \"validation-error\",\n CX2_ISSUE.NO_STATUS,\n `the status is malformed (${found}): a document ends with one status block holding one object with a boolean success`,\n { element: \"status\" },\n );\n }\n }\n\n /** Record the metadata: source format and version, name, description, id type, the kept aspects. */\n private setMeta(): void {\n const { doc } = this;\n const attrs = doc.networkAttributes[0]?.value;\n const named = isRecord(attrs) ? attrs : {};\n const extra: Record<string, unknown> = {};\n if (doc.opaque.size > 0) {\n extra.opaque = Object.fromEntries(doc.opaque);\n }\n if (Object.keys(this.decls.other).length > 0) {\n extra.declarations = this.decls.other;\n }\n const { weightFrom } = this.options;\n const weightDecl = weightFrom === null ? undefined : this.decls.edge.byName.get(weightFrom);\n const patch: GraphMetaPatch = {\n sourceFormat: CX2_FORMAT,\n sourceVersion: doc.version,\n idType: this.idType,\n ...(typeof named.name === \"string\" ? { name: named.name } : {}),\n ...(typeof named.description === \"string\" ? { description: named.description } : {}),\n ...(this.weighted && weightFrom !== null\n ? {\n weightOrigin: {\n format: CX2_FORMAT,\n id: weightDecl?.alias ?? null,\n title: weightFrom,\n type: weightDecl?.type?.d ?? null,\n namespace: null,\n },\n }\n : {}),\n extra: { cx2: extra },\n };\n this.sink.setMeta(patch);\n }\n}\n\n/**\n * The dtype of a bypass column: f64 when every value is a number, bool when every one is a\n * boolean, string when every one is a string, json otherwise.\n * @param values - the values\n * @returns the dtype\n */\nfunction bypassDtype(values: readonly unknown[]): Dtype {\n if (values.every((v) => typeof v === \"number\")) {\n return \"f64\";\n }\n if (values.every((v) => typeof v === \"boolean\")) {\n return \"bool\";\n }\n if (values.every((v) => typeof v === \"string\")) {\n return \"string\";\n }\n return \"json\";\n}\n\n/**\n * What a style aspect holds, for the W_STYLES_NOT_IMPORTED message.\n * @param aspect - the aspect name\n * @param elements - its elements\n * @returns a short description\n */\nfunction describeStyle(aspect: string, elements: readonly unknown[]): string {\n const first = elements[0];\n if (aspect === \"visualProperties\" && isRecord(first)) {\n const count = (key: string): number => (isRecord(first[key]) ? Object.keys(first[key]).length : 0);\n const defaults = isRecord(first.default)\n ? Object.values(first.default).reduce<number>((n, v) => n + (isRecord(v) ? Object.keys(v).length : 0), 0)\n : 0;\n return `visualProperties: ${defaults} default${plural(defaults)}, ${count(\"nodeMapping\")} node mapping${plural(count(\"nodeMapping\"))}, ${count(\"edgeMapping\")} edge mapping${plural(count(\"edgeMapping\"))}`;\n }\n return `${aspect}: ${elements.length} element${plural(elements.length)}`;\n}\n\n/**\n * Resolve the zAs option.\n * @param value - the option\n * @returns the mode; E_UNSUPPORTED for any other value\n * @category Plugin helpers\n */\nexport function zAsOption(value: unknown): \"column\" | \"position\" {\n if (value === undefined) {\n return \"column\";\n }\n if (value === \"column\" || value === \"position\") {\n return value;\n }\n throw new GraphFormatError(\"E_UNSUPPORTED\", `option zAs: ${shown(value)} is not one of \"column\", \"position\"`, {\n option: \"zAs\",\n found: typeof value === \"string\" ? value : typeof value,\n });\n}\n\n/**\n * The CX2 importer plugin.\n * @category Built-in formats\n */\nexport const cx2Importer: GraphImporter<Cx2ImportOptions> = Object.freeze({\n format: CX2_FORMAT,\n options: Object.freeze([\"zAs\"]),\n extensions: Object.freeze([\".cx2\"]),\n mimeTypes: Object.freeze([\"application/json\"]),\n styles: readCx2Styles,\n\n /**\n * Confidence that the head is CX2: 0.97 when the first member of a top-level array is an\n * object with a CXVersion key, in any key order.\n * @param head - the first bytes\n * @returns the confidence\n */\n sniff(head: Uint8Array): number {\n const text = headText(head);\n return /^\\s*\\[\\s*\\{(?:\\s*\"[^\"]*\"\\s*:\\s*(?:true|false|\"[^\"]*\"|[0-9.]+)\\s*,)*\\s*\"CXVersion\"\\s*:/.test(text)\n ? 0.97\n : 0;\n },\n\n /**\n * Read a CX2 document into the sink.\n * @param input - the text, bytes or stream\n * @param sink - the sink\n * @param options - format-specific and common options\n * @returns the import report; ImportError on a fatal error or beyond the error limit\n */\n async import(\n input: ImportInput,\n sink: GraphSink,\n options?: Cx2ImportOptions & CommonImportOptions,\n ): Promise<ImportReport> {\n const resolved = resolveImportOptions(options, FORMAT_DEFAULTS);\n const zAs = zAsOption(options?.zAs);\n const report = new ImportReportBuilder(CX2_FORMAT, resolved.errorLimit);\n reportSinkOptions(sink, options, report, true);\n reportUnusedOptions(options, report, USED_OPTIONS);\n const doc = await readDocument(input, report, resolved);\n // the graphty.styles block of a file graphty wrote: a graph attribute, as in every other format\n const block = blockOfAspect(doc.opaque.get(STYLE_BLOCK_NAME));\n doc.opaque.delete(STYLE_BLOCK_NAME);\n new Cx2Reader(sink, report, resolved, zAs, doc).build();\n if (block !== null) {\n sink.setGraphValue(STYLE_BLOCK_NAME, block, { dtype: \"string\", origin: { format: CX2_FORMAT, id: null } });\n }\n const kept: Cx2StyleSource = {\n visualProperties: doc.opaque.get(\"visualProperties\"),\n visualEditorProperties: doc.opaque.get(\"visualEditorProperties\"),\n };\n report.keepForStyles(kept);\n throwIfAborted(resolved.signal);\n return report.finish();\n },\n});\n"],"names":[],"mappings":"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"}
|