@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
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@graphty/graph-io/sources/sparql`: the SPARQL source. It sends CONSTRUCT (or DESCRIBE) queries
|
|
3
|
+
* over the SPARQL 1.1 protocol (a form POST, N-Triples back) and reads the triples as a graph: an
|
|
4
|
+
* IRI or blank-node object is an edge from the subject (`type` is the predicate's local name,
|
|
5
|
+
* `predicate` the full IRI), a literal is an attribute of the subject named by the predicate's
|
|
6
|
+
* local name. Node ids are the IRIs.
|
|
7
|
+
*
|
|
8
|
+
* - Paging: the source adds `ORDER BY` (the template's variables) and `LIMIT` / `OFFSET` to the
|
|
9
|
+
* caller's query, unless it sets its own; a load stops between pages at a cap and hands back
|
|
10
|
+
* `{ offset }` as its cursor. A page is `pageSize` solutions, so its triple count varies; the
|
|
11
|
+
* first empty page ends the load.
|
|
12
|
+
* - Expand: the triples of the seeds, `VALUES ?s { ... }` out and `VALUES ?o { ... }` in.
|
|
13
|
+
* - Validate: SHA-256 of the first page's triples.
|
|
14
|
+
*
|
|
15
|
+
* Experimental.
|
|
16
|
+
* @module @graphty/graph-io/sources/sparql
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { type GraphSink } from "@graphty/graph-format";
|
|
20
|
+
|
|
21
|
+
import { throwIfAborted } from "../../common/input.js";
|
|
22
|
+
import { type ImportReport } from "../../types.js";
|
|
23
|
+
import { defineSource } from "../define.js";
|
|
24
|
+
import { failOn } from "../fail.js";
|
|
25
|
+
import { SPARQL_SOURCE_ID } from "../ids.js";
|
|
26
|
+
import { sha256Hex } from "../sigv4.js";
|
|
27
|
+
import {
|
|
28
|
+
type ExpandRequest,
|
|
29
|
+
type GraphSource,
|
|
30
|
+
type SourceContext,
|
|
31
|
+
type SourceCursor,
|
|
32
|
+
type SourceFreshness,
|
|
33
|
+
type SourceProbe,
|
|
34
|
+
} from "../types.js";
|
|
35
|
+
import { SPARQL_DESCRIPTOR } from "./descriptor.js";
|
|
36
|
+
import { canonicalTriple, type Graphed, graphTriples, parseNTriples, type Triple } from "./ntriples.js";
|
|
37
|
+
import { type SparqlParams } from "./params.js";
|
|
38
|
+
import { allQuery, aroundQuery, iriTerm, pagedQuery, readQuery, validLanguage } from "./query.js";
|
|
39
|
+
|
|
40
|
+
export { SPARQL_DESCRIPTOR } from "./descriptor.js";
|
|
41
|
+
export { type SparqlParams } from "./params.js";
|
|
42
|
+
|
|
43
|
+
/** Solutions per page when the params name none. */
|
|
44
|
+
const DEFAULT_PAGE_SIZE = 1000;
|
|
45
|
+
|
|
46
|
+
/** Triples per hop of an expansion when the request names no limit. */
|
|
47
|
+
const DEFAULT_EXPAND_LIMIT = 500;
|
|
48
|
+
|
|
49
|
+
/** The deepest expansion, as for every built-in source. */
|
|
50
|
+
const MAX_DEPTH = 10;
|
|
51
|
+
|
|
52
|
+
/** What CONSTRUCT and DESCRIBE are asked to answer. */
|
|
53
|
+
const ACCEPT_TRIPLES = "application/n-triples, text/plain;q=0.9";
|
|
54
|
+
|
|
55
|
+
/** One page's query, by offset; `paged` false when the query is sent once, as written. */
|
|
56
|
+
interface Plan {
|
|
57
|
+
/** The query of the page at an offset. */
|
|
58
|
+
readonly at: (offset: number) => string;
|
|
59
|
+
/** Whether the source pages it. */
|
|
60
|
+
readonly paged: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Send a query and read the answer as N-Triples.
|
|
65
|
+
* @param ctx - the context
|
|
66
|
+
* @param query - the query
|
|
67
|
+
* @returns the triples
|
|
68
|
+
*/
|
|
69
|
+
async function send(ctx: SourceContext, query: string): Promise<Triple[]> {
|
|
70
|
+
throwIfAborted(ctx.signal);
|
|
71
|
+
const response = await ctx.fetch(ctx.endpoint ?? "", {
|
|
72
|
+
method: "POST",
|
|
73
|
+
idempotent: true,
|
|
74
|
+
headers: { Accept: ACCEPT_TRIPLES, "Content-Type": "application/x-www-form-urlencoded" },
|
|
75
|
+
body: new URLSearchParams({ query }).toString(),
|
|
76
|
+
allowStatus: [400],
|
|
77
|
+
});
|
|
78
|
+
if (response.status === 400) {
|
|
79
|
+
const text = (await response.text()).trim().slice(0, 500);
|
|
80
|
+
failOn(ctx.report, "E_SOURCE_QUERY", "the endpoint refused the query", {
|
|
81
|
+
serverCode: null,
|
|
82
|
+
line: null,
|
|
83
|
+
column: null,
|
|
84
|
+
serverMessage: text === "" ? null : text,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const contentType = response.headers.get("content-type");
|
|
88
|
+
const notTriples = (): never =>
|
|
89
|
+
failOn(ctx.report, "E_SOURCE_RESPONSE", "the endpoint did not answer N-Triples", {
|
|
90
|
+
expected: "n-triples",
|
|
91
|
+
contentType,
|
|
92
|
+
});
|
|
93
|
+
if (contentType !== null && /html|json|xml/i.test(contentType)) {
|
|
94
|
+
notTriples();
|
|
95
|
+
}
|
|
96
|
+
const { triples, badLine } = parseNTriples(await response.text());
|
|
97
|
+
if (badLine !== null) {
|
|
98
|
+
notTriples();
|
|
99
|
+
}
|
|
100
|
+
return triples;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* A whole-number param, checked.
|
|
105
|
+
* @param value - the value
|
|
106
|
+
* @param name - the param
|
|
107
|
+
* @param max - the largest allowed
|
|
108
|
+
* @param ctx - the context
|
|
109
|
+
* @returns the number
|
|
110
|
+
*/
|
|
111
|
+
function integer(value: number, name: string, max: number, ctx: SourceContext): number {
|
|
112
|
+
if (!Number.isInteger(value) || value < 1 || value > max) {
|
|
113
|
+
failOn(ctx.report, "E_SOURCE_PARAM", `${name} is an integer from 1 to ${String(max)}`, {
|
|
114
|
+
name,
|
|
115
|
+
reason: "range",
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return value;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* The language filter, lowercase and checked, or "" for none.
|
|
123
|
+
* @param params - the params
|
|
124
|
+
* @param ctx - the context
|
|
125
|
+
* @returns the tag
|
|
126
|
+
*/
|
|
127
|
+
function languageOf(params: SparqlParams, ctx: SourceContext): string {
|
|
128
|
+
const language = params.language ?? "";
|
|
129
|
+
if (language !== "" && !validLanguage(language)) {
|
|
130
|
+
failOn(ctx.report, "E_SOURCE_PARAM", "language is a language tag", { name: "language", reason: "type" });
|
|
131
|
+
}
|
|
132
|
+
return language.toLowerCase();
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The predicate prefixes generated queries follow, checked.
|
|
137
|
+
* @param params - the params
|
|
138
|
+
* @param ctx - the context
|
|
139
|
+
* @returns the prefixes; empty means every predicate
|
|
140
|
+
*/
|
|
141
|
+
function predicatesOf(params: SparqlParams, ctx: SourceContext): readonly string[] {
|
|
142
|
+
const list = params.predicates ?? [];
|
|
143
|
+
const prefixes = typeof list === "string" ? [list] : list;
|
|
144
|
+
for (const p of prefixes) {
|
|
145
|
+
if (typeof p !== "string" || iriTerm(p) === null) {
|
|
146
|
+
failOn(ctx.report, "E_SOURCE_PARAM", "predicates are IRI prefixes", { name: "predicates", reason: "iri" });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return prefixes;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Seed ids as IRI terms; a blank node or anything else that is not an IRI is refused.
|
|
154
|
+
* @param ids - the ids
|
|
155
|
+
* @param name - the param, for the error
|
|
156
|
+
* @param ctx - the context
|
|
157
|
+
* @returns the terms
|
|
158
|
+
*/
|
|
159
|
+
function irisOf(ids: readonly unknown[] | undefined, name: string, ctx: SourceContext): string[] {
|
|
160
|
+
if (ids === undefined || ids.length === 0) {
|
|
161
|
+
failOn(ctx.report, "E_SOURCE_PARAM", `${name} needs at least one IRI`, { name, reason: "required" });
|
|
162
|
+
}
|
|
163
|
+
return ids.map(
|
|
164
|
+
(id) => iriTerm(id) ?? failOn(ctx.report, "E_SOURCE_PARAM", `${name}: not an IRI`, { name, reason: "iri" }),
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* What a load sends, from its mode.
|
|
170
|
+
* @param params - the params
|
|
171
|
+
* @param ctx - the context
|
|
172
|
+
* @returns the plan
|
|
173
|
+
*/
|
|
174
|
+
function planOf(params: SparqlParams, ctx: SourceContext): Plan {
|
|
175
|
+
const size = integer(params.pageSize ?? DEFAULT_PAGE_SIZE, "pageSize", 10_000, ctx);
|
|
176
|
+
const filter = { language: languageOf(params, ctx), predicates: predicatesOf(params, ctx) };
|
|
177
|
+
const query = params.query?.trim() ?? "";
|
|
178
|
+
const mode = params.mode ?? (query === "" ? "all" : "query");
|
|
179
|
+
if (mode === "neighborhood") {
|
|
180
|
+
const iris = irisOf(params.ids, "ids", ctx);
|
|
181
|
+
return { at: (offset) => aroundQuery(iris, "both", filter, size, offset), paged: true };
|
|
182
|
+
}
|
|
183
|
+
if (mode === "all") {
|
|
184
|
+
return { at: (offset) => allQuery(filter, size, offset), paged: true };
|
|
185
|
+
}
|
|
186
|
+
if (query === "") {
|
|
187
|
+
failOn(ctx.report, "E_SOURCE_PARAM", "mode query needs a query", { name: "query", reason: "required" });
|
|
188
|
+
}
|
|
189
|
+
const shape = readQuery(query);
|
|
190
|
+
if (shape.form !== "construct" && shape.form !== "describe") {
|
|
191
|
+
failOn(ctx.report, "E_SOURCE_PARAM", "the query must be CONSTRUCT or DESCRIBE", {
|
|
192
|
+
name: "query",
|
|
193
|
+
reason: "form",
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
if (shape.ownLimit) {
|
|
197
|
+
return { at: () => query, paged: false };
|
|
198
|
+
}
|
|
199
|
+
return { at: (offset) => pagedQuery(query, shape, size, offset), paged: true };
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Write nodes and edges into the sink, counting them on the report.
|
|
204
|
+
* @param graphed - the nodes and edges
|
|
205
|
+
* @param sink - where to write
|
|
206
|
+
* @param ctx - the context
|
|
207
|
+
*/
|
|
208
|
+
function write(graphed: Graphed, sink: GraphSink, ctx: SourceContext): void {
|
|
209
|
+
const { report } = ctx;
|
|
210
|
+
if (sink.edgeCount === 0) {
|
|
211
|
+
sink.setDirected(true);
|
|
212
|
+
}
|
|
213
|
+
for (const [id, attrs] of graphed.nodes) {
|
|
214
|
+
try {
|
|
215
|
+
sink.addNodeRecord(id, attrs);
|
|
216
|
+
report.counts.nodes++;
|
|
217
|
+
} catch (err) {
|
|
218
|
+
report.recordError(err, { element: id });
|
|
219
|
+
report.counts.skippedNodes++;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
for (const { source, target, ...attrs } of graphed.edges) {
|
|
223
|
+
try {
|
|
224
|
+
sink.addEdgeRecord(source, target, attrs, null);
|
|
225
|
+
report.counts.edges++;
|
|
226
|
+
} catch (err) {
|
|
227
|
+
report.recordError(err, { element: `${source} -> ${target}` });
|
|
228
|
+
report.counts.skippedEdges++;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* The content hash of some triples, in any order.
|
|
235
|
+
* @param triples - the triples
|
|
236
|
+
* @returns the SHA-256, hex
|
|
237
|
+
*/
|
|
238
|
+
function hashOf(triples: readonly Triple[]): Promise<string> {
|
|
239
|
+
return sha256Hex(triples.map(canonicalTriple).sort().join("\n")); // NOSONAR(S2871): code-unit order is the point: a locale-free, stable order for the hash
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Load pages into the sink from the cursor's offset until an empty page or a cap.
|
|
244
|
+
* @param params - the params
|
|
245
|
+
* @param sink - where to write
|
|
246
|
+
* @param ctx - the context
|
|
247
|
+
* @returns the report
|
|
248
|
+
*/
|
|
249
|
+
async function load(params: SparqlParams, sink: GraphSink, ctx: SourceContext): Promise<ImportReport> {
|
|
250
|
+
const plan = planOf(params, ctx);
|
|
251
|
+
const size = params.pageSize ?? DEFAULT_PAGE_SIZE;
|
|
252
|
+
const start = Number(ctx.cursor?.offset ?? 0);
|
|
253
|
+
const language = languageOf(params, ctx);
|
|
254
|
+
let offset = start;
|
|
255
|
+
let next: SourceCursor | null = null;
|
|
256
|
+
let contentHash: string | undefined;
|
|
257
|
+
for (;;) {
|
|
258
|
+
const triples = await send(ctx, plan.at(offset));
|
|
259
|
+
if (offset === 0) {
|
|
260
|
+
contentHash = await hashOf(triples);
|
|
261
|
+
}
|
|
262
|
+
write(graphTriples(triples, language), sink, ctx);
|
|
263
|
+
const { counts } = ctx.report;
|
|
264
|
+
ctx.progress(counts.nodes + counts.edges, undefined, "items");
|
|
265
|
+
if (!plan.paged || triples.length === 0) {
|
|
266
|
+
next = null;
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
offset += size;
|
|
270
|
+
next = { offset };
|
|
271
|
+
if (ctx.limits.reached()) {
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return ctx.finish({ next, ...(contentHash === undefined ? {} : { validators: { contentHash } }) });
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Fetch the triples around some IRIs into the sink, hop by hop.
|
|
280
|
+
* @param request - the seeds, direction, depth, limit and predicate filter
|
|
281
|
+
* @param sink - where to write
|
|
282
|
+
* @param ctx - the context
|
|
283
|
+
* @returns the report
|
|
284
|
+
*/
|
|
285
|
+
async function expand(
|
|
286
|
+
request: ExpandRequest<SparqlParams>,
|
|
287
|
+
sink: GraphSink,
|
|
288
|
+
ctx: SourceContext,
|
|
289
|
+
): Promise<ImportReport> {
|
|
290
|
+
const direction = request.direction ?? "both";
|
|
291
|
+
if (!["out", "in", "both"].includes(direction)) {
|
|
292
|
+
failOn(ctx.report, "E_SOURCE_PARAM", "direction must be out, in or both", {
|
|
293
|
+
name: "direction",
|
|
294
|
+
reason: "enum",
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
const depth = integer(request.depth ?? 1, "depth", MAX_DEPTH, ctx);
|
|
298
|
+
const limit = integer(request.limit ?? DEFAULT_EXPAND_LIMIT, "limit", Number.MAX_SAFE_INTEGER, ctx);
|
|
299
|
+
const language = languageOf(request.params, ctx);
|
|
300
|
+
const filter = { language, predicates: predicatesOf(request.params, ctx) };
|
|
301
|
+
const types = request.relationshipTypes === undefined ? null : new Set(request.relationshipTypes);
|
|
302
|
+
// a capped one-hop expansion resumes at its offset; deeper ones are read whole per hop
|
|
303
|
+
const offset = depth === 1 ? Number(ctx.cursor?.offset ?? 0) : 0;
|
|
304
|
+
const seen = new Set<string>(request.ids.map(String));
|
|
305
|
+
let frontier = irisOf(request.ids, "ids", ctx);
|
|
306
|
+
let next: SourceCursor | null = null;
|
|
307
|
+
const graphed: Graphed = { nodes: new Map(), edges: [] };
|
|
308
|
+
for (let hop = 0; hop < depth && frontier.length > 0; hop++) {
|
|
309
|
+
const triples = await send(ctx, aroundQuery(frontier, direction, filter, limit, offset));
|
|
310
|
+
const before = graphed.edges.length;
|
|
311
|
+
graphTriples(triples, language, graphed);
|
|
312
|
+
if (types !== null) {
|
|
313
|
+
const kept = graphed.edges.slice(before).filter((e) => types.has(e.type) || types.has(e.predicate));
|
|
314
|
+
graphed.edges.splice(before, Infinity, ...kept);
|
|
315
|
+
}
|
|
316
|
+
if (depth === 1 && triples.length > 0) {
|
|
317
|
+
next = { offset: offset + limit };
|
|
318
|
+
}
|
|
319
|
+
const reached = graphed.edges.slice(before).flatMap((e) => [e.source, e.target]);
|
|
320
|
+
frontier = [...new Set(reached)]
|
|
321
|
+
.filter((id) => !seen.has(id))
|
|
322
|
+
.flatMap((id) => {
|
|
323
|
+
seen.add(id);
|
|
324
|
+
const term = iriTerm(id);
|
|
325
|
+
return term === null ? [] : [term];
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
write(graphed, sink, ctx);
|
|
329
|
+
return ctx.finish({ next });
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* The SPARQL source: CONSTRUCT or DESCRIBE queries against any SPARQL 1.1 endpoint, paged by
|
|
334
|
+
* `LIMIT` and `OFFSET`, expanded by `VALUES`, validated by a hash of the first page. Experimental.
|
|
335
|
+
* @category Network sources
|
|
336
|
+
*/
|
|
337
|
+
export const sparqlSource: GraphSource<SparqlParams> = defineSource<SparqlParams>({
|
|
338
|
+
id: SPARQL_SOURCE_ID,
|
|
339
|
+
descriptor: SPARQL_DESCRIPTOR,
|
|
340
|
+
import: load,
|
|
341
|
+
expand,
|
|
342
|
+
probe: async (params, ctx): Promise<SourceProbe> => {
|
|
343
|
+
// the endpoint answers a one-solution query: it is up, it reads SPARQL, the credential works
|
|
344
|
+
await send(ctx, "CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o } LIMIT 1");
|
|
345
|
+
languageOf(params, ctx);
|
|
346
|
+
return { ok: true };
|
|
347
|
+
},
|
|
348
|
+
validate: async (params, seen, ctx): Promise<SourceFreshness> => {
|
|
349
|
+
const contentHash = await hashOf(await send(ctx, planOf(params, ctx).at(0)));
|
|
350
|
+
let status: SourceFreshness["status"] = "unverifiable";
|
|
351
|
+
if (seen.contentHash !== undefined) {
|
|
352
|
+
status = seen.contentHash === contentHash ? "current" : "changed";
|
|
353
|
+
}
|
|
354
|
+
return { status, via: "hash", validators: { contentHash } };
|
|
355
|
+
},
|
|
356
|
+
});
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading the N-Triples a CONSTRUCT or DESCRIBE answers, and turning triples into nodes and edges:
|
|
3
|
+
* an IRI or blank-node object is an edge from the subject, a literal is an attribute of the
|
|
4
|
+
* subject named by the predicate's local name.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** One RDF term. */
|
|
8
|
+
export type Term =
|
|
9
|
+
| { readonly kind: "iri"; readonly value: string }
|
|
10
|
+
| { readonly kind: "bnode"; readonly value: string }
|
|
11
|
+
| { readonly kind: "literal"; readonly value: string; readonly lang: string; readonly datatype: string };
|
|
12
|
+
|
|
13
|
+
/** One triple. */
|
|
14
|
+
export interface Triple {
|
|
15
|
+
/** The subject: an IRI or a blank node. */
|
|
16
|
+
readonly s: Term;
|
|
17
|
+
/** The predicate IRI. */
|
|
18
|
+
readonly p: string;
|
|
19
|
+
/** The object. */
|
|
20
|
+
readonly o: Term;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** One term at the sticky position: an IRI, a blank node, or a literal with its tag or type. */
|
|
24
|
+
const TERM = /\s*(?:<([^<>]*)>|_:([\w.-]*[\w-])|"((?:[^"\\]|\\.)*)"(?:@([A-Za-z][\w-]*)|\^\^<([^<>]*)>)?)/y;
|
|
25
|
+
|
|
26
|
+
/** The end of a statement: a dot, then an optional comment. */
|
|
27
|
+
const END = /\s*\.\s*(?:#.*)?$/y;
|
|
28
|
+
|
|
29
|
+
/** The XSD namespace. */
|
|
30
|
+
const XSD = "http://www.w3.org/2001/XMLSchema#";
|
|
31
|
+
|
|
32
|
+
/** The XSD numeric types, read as numbers. */
|
|
33
|
+
const NUMERIC: ReadonlySet<string> = new Set(
|
|
34
|
+
[
|
|
35
|
+
"integer",
|
|
36
|
+
"decimal",
|
|
37
|
+
"double",
|
|
38
|
+
"float",
|
|
39
|
+
"int",
|
|
40
|
+
"long",
|
|
41
|
+
"short",
|
|
42
|
+
"byte",
|
|
43
|
+
"nonNegativeInteger",
|
|
44
|
+
"nonPositiveInteger",
|
|
45
|
+
"positiveInteger",
|
|
46
|
+
"negativeInteger",
|
|
47
|
+
"unsignedInt",
|
|
48
|
+
"unsignedLong",
|
|
49
|
+
"unsignedShort",
|
|
50
|
+
"unsignedByte",
|
|
51
|
+
].map((t) => XSD + t),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Undo N-Triples escapes.
|
|
56
|
+
* @param text - escaped text
|
|
57
|
+
* @returns the text
|
|
58
|
+
*/
|
|
59
|
+
function unescape(text: string): string {
|
|
60
|
+
if (!text.includes("\\")) {
|
|
61
|
+
return text;
|
|
62
|
+
}
|
|
63
|
+
const simple: Readonly<Record<string, string>> = { t: "\t", b: "\b", n: "\n", r: "\r", f: "\f" };
|
|
64
|
+
return text.replaceAll(
|
|
65
|
+
/\\(?:u([\da-fA-F]{4})|U([\da-fA-F]{8})|(.))/g,
|
|
66
|
+
(_m, u4?: string, u8?: string, c?: string) => {
|
|
67
|
+
const hex = u4 ?? u8;
|
|
68
|
+
if (hex !== undefined) {
|
|
69
|
+
return String.fromCodePoint(Number.parseInt(hex, 16));
|
|
70
|
+
}
|
|
71
|
+
return simple[c ?? ""] ?? c ?? "";
|
|
72
|
+
},
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Read one term at `at`.
|
|
78
|
+
* @param line - the line
|
|
79
|
+
* @param at - where to start
|
|
80
|
+
* @returns the term and where it ended, or null when there is none
|
|
81
|
+
*/
|
|
82
|
+
function readTerm(line: string, at: number): { term: Term; end: number } | null {
|
|
83
|
+
TERM.lastIndex = at;
|
|
84
|
+
const m = TERM.exec(line);
|
|
85
|
+
if (m === null) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const [, iri, bnode, lexical, lang, datatype] = m;
|
|
89
|
+
let term: Term;
|
|
90
|
+
if (iri !== undefined) {
|
|
91
|
+
term = { kind: "iri", value: unescape(iri) };
|
|
92
|
+
} else if (bnode === undefined) {
|
|
93
|
+
term = {
|
|
94
|
+
kind: "literal",
|
|
95
|
+
value: unescape(lexical ?? ""),
|
|
96
|
+
lang: lang?.toLowerCase() ?? "",
|
|
97
|
+
datatype: datatype ?? "",
|
|
98
|
+
};
|
|
99
|
+
} else {
|
|
100
|
+
term = { kind: "bnode", value: `_:${bnode}` };
|
|
101
|
+
}
|
|
102
|
+
return { term, end: TERM.lastIndex };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Parse N-Triples.
|
|
107
|
+
* @param text - the document
|
|
108
|
+
* @returns the triples, or the 1-based number of the first line that is not a triple
|
|
109
|
+
*/
|
|
110
|
+
export function parseNTriples(text: string): { triples: Triple[]; badLine: number | null } {
|
|
111
|
+
const triples: Triple[] = [];
|
|
112
|
+
const lines = text.split(/\r?\n/);
|
|
113
|
+
for (let i = 0; i < lines.length; i++) {
|
|
114
|
+
const line = lines[i];
|
|
115
|
+
const trimmed = line.trim();
|
|
116
|
+
if (trimmed === "" || trimmed.startsWith("#")) {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const s = readTerm(line, 0);
|
|
120
|
+
const p = s === null ? null : readTerm(line, s.end);
|
|
121
|
+
const o = p === null ? null : readTerm(line, p.end);
|
|
122
|
+
END.lastIndex = o?.end ?? 0;
|
|
123
|
+
if (
|
|
124
|
+
s === null ||
|
|
125
|
+
p === null ||
|
|
126
|
+
o === null ||
|
|
127
|
+
s.term.kind === "literal" ||
|
|
128
|
+
p.term.kind !== "iri" ||
|
|
129
|
+
!END.test(line)
|
|
130
|
+
) {
|
|
131
|
+
return { triples, badLine: i + 1 };
|
|
132
|
+
}
|
|
133
|
+
triples.push({ s: s.term, p: p.term.value, o: o.term });
|
|
134
|
+
}
|
|
135
|
+
return { triples, badLine: null };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* The local name of an IRI: what follows its last `#`, else its last `/`, else its last `:`.
|
|
140
|
+
* @param iri - the IRI
|
|
141
|
+
* @returns the local name, or the whole IRI when nothing follows
|
|
142
|
+
*/
|
|
143
|
+
export function localName(iri: string): string {
|
|
144
|
+
const cut = Math.max(iri.lastIndexOf("#"), iri.lastIndexOf("/"), iri.lastIndexOf(":"));
|
|
145
|
+
const name = iri.slice(cut + 1);
|
|
146
|
+
return name === "" ? iri : name;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* A literal's value: numbers and booleans as such, everything else as its text.
|
|
151
|
+
* @param term - the literal
|
|
152
|
+
* @returns the value
|
|
153
|
+
*/
|
|
154
|
+
function literalValue(term: Extract<Term, { kind: "literal" }>): string | number | boolean {
|
|
155
|
+
if (NUMERIC.has(term.datatype)) {
|
|
156
|
+
const n = Number(term.value);
|
|
157
|
+
return Number.isFinite(n) ? n : term.value;
|
|
158
|
+
}
|
|
159
|
+
if (term.datatype === `${XSD}boolean`) {
|
|
160
|
+
return term.value === "true" || term.value === "1";
|
|
161
|
+
}
|
|
162
|
+
return term.value;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Whether a literal's language tag passes a language filter (SPARQL's langMatches, plus untagged).
|
|
167
|
+
* @param lang - the literal's tag, lowercase
|
|
168
|
+
* @param want - the filter, lowercase, or "" for none
|
|
169
|
+
* @returns whether to keep it
|
|
170
|
+
*/
|
|
171
|
+
function languageMatches(lang: string, want: string): boolean {
|
|
172
|
+
return want === "" || lang === "" || lang === want || lang.startsWith(`${want}-`);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** The nodes and edges of some triples. */
|
|
176
|
+
export interface Graphed {
|
|
177
|
+
/** Each subject's literal attributes, by subject id; a predicate's first value wins. */
|
|
178
|
+
readonly nodes: Map<string, Record<string, string | number | boolean>>;
|
|
179
|
+
/** One edge per IRI or blank-node object. */
|
|
180
|
+
readonly edges: { source: string; target: string; type: string; predicate: string }[];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Turn triples into nodes and edges.
|
|
185
|
+
* @param triples - the triples
|
|
186
|
+
* @param language - the language filter, lowercase, or ""
|
|
187
|
+
* @param into - nodes and edges to add to
|
|
188
|
+
* @returns the nodes and edges
|
|
189
|
+
*/
|
|
190
|
+
export function graphTriples(triples: readonly Triple[], language: string, into?: Graphed): Graphed {
|
|
191
|
+
const out: Graphed = into ?? { nodes: new Map(), edges: [] };
|
|
192
|
+
for (const { s, p, o } of triples) {
|
|
193
|
+
let attrs = out.nodes.get(s.value);
|
|
194
|
+
if (attrs === undefined) {
|
|
195
|
+
attrs = {};
|
|
196
|
+
out.nodes.set(s.value, attrs);
|
|
197
|
+
}
|
|
198
|
+
if (o.kind === "literal") {
|
|
199
|
+
const key = localName(p);
|
|
200
|
+
// ponytail: one value per predicate (the first); a list column if multi-valued literals matter
|
|
201
|
+
if (languageMatches(o.lang, language) && !(key in attrs)) {
|
|
202
|
+
attrs[key] = literalValue(o);
|
|
203
|
+
}
|
|
204
|
+
} else {
|
|
205
|
+
out.edges.push({ source: s.value, target: o.value, type: localName(p), predicate: p });
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return out;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* One canonical line per triple, for the content hash.
|
|
213
|
+
* @param t - the triple
|
|
214
|
+
* @returns the line
|
|
215
|
+
*/
|
|
216
|
+
export function canonicalTriple(t: Triple): string {
|
|
217
|
+
const o = t.o.kind === "literal" ? JSON.stringify([t.o.value, t.o.lang, t.o.datatype]) : t.o.value;
|
|
218
|
+
return `${t.s.value} ${t.p} ${o}`;
|
|
219
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The parameters of the SPARQL source. Experimental.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { type NodeId } from "@graphty/graph-format";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* What to read from a SPARQL endpoint. Experimental.
|
|
9
|
+
* @category Network sources
|
|
10
|
+
*/
|
|
11
|
+
export interface SparqlParams {
|
|
12
|
+
/** The caller's CONSTRUCT or DESCRIBE query; without one a query is generated from `mode`. */
|
|
13
|
+
readonly query?: string | undefined;
|
|
14
|
+
/** "query" (the caller's), "all" (every triple, paged) or "neighborhood" (the triples of `ids`). */
|
|
15
|
+
readonly mode?: "query" | "all" | "neighborhood" | undefined;
|
|
16
|
+
/** The seed IRIs of "neighborhood". */
|
|
17
|
+
readonly ids?: readonly NodeId[] | undefined;
|
|
18
|
+
/** Keep literals tagged with this language (`en`) or with none; default every literal. */
|
|
19
|
+
readonly language?: string | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Generated queries and expansions follow only predicates starting with one of these IRIs
|
|
22
|
+
* (Wikidata's direct claims: `http://www.wikidata.org/prop/direct/`); literals are always kept.
|
|
23
|
+
* Default every predicate.
|
|
24
|
+
*/
|
|
25
|
+
readonly predicates?: readonly string[] | string | undefined;
|
|
26
|
+
/** Solutions per page, 1 to 10000. A load stops between pages. @defaultValue 1000 */
|
|
27
|
+
readonly pageSize?: number | undefined;
|
|
28
|
+
}
|