@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,650 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Running a REST mapping (design section 13.2): `restSource(mapping, info)` turns one into a
|
|
3
|
+
* `records` source with `expand` (breadth-first, batched `{ids}`, depth 0 hydrates), `probe` and
|
|
4
|
+
* `validate`; the generic `rest` source takes the mapping as a parameter. Every request goes through
|
|
5
|
+
* `ctx.fetch`, so the credential, retries, caps and coded errors are the framework's.
|
|
6
|
+
*/
|
|
7
|
+
import { throwIfAborted } from "../../common/input.js";
|
|
8
|
+
import { ImportError } from "../../types.js";
|
|
9
|
+
import { sleep } from "../context.js";
|
|
10
|
+
import { originOf } from "../credentials.js";
|
|
11
|
+
import { defineSource } from "../define.js";
|
|
12
|
+
import { failAlone, failOn, warnOn } from "../fail.js";
|
|
13
|
+
import { REST_SOURCE_ID } from "../ids.js";
|
|
14
|
+
import { REST_DESCRIPTOR } from "./descriptor.js";
|
|
15
|
+
import { checkRestMapping } from "./mapping.js";
|
|
16
|
+
import { firstPageUrl, nextPosition, pageUrl } from "./paging.js";
|
|
17
|
+
import { newState, toRecords } from "./records.js";
|
|
18
|
+
import { selectRecords } from "./selectors.js";
|
|
19
|
+
import { buildRequest } from "./templates.js";
|
|
20
|
+
/** Auth failures a later page may answer with, keeping the pages before it. */
|
|
21
|
+
const AUTH_CODES = new Set(["E_SOURCE_AUTH", "E_SOURCE_FORBIDDEN"]);
|
|
22
|
+
/**
|
|
23
|
+
* How long until a budget resets.
|
|
24
|
+
* @param reset - the reset header's number: past 1e9 an epoch in seconds, otherwise seconds from now
|
|
25
|
+
* @returns milliseconds from now, never negative
|
|
26
|
+
*/
|
|
27
|
+
function resetDelayMs(reset) {
|
|
28
|
+
return Math.max(0, reset > 1e9 ? reset * 1000 - Date.now() : reset * 1000);
|
|
29
|
+
}
|
|
30
|
+
/** One call's running state. */
|
|
31
|
+
class RestRun {
|
|
32
|
+
/**
|
|
33
|
+
* Create one.
|
|
34
|
+
* @param plan - the mapping and values
|
|
35
|
+
* @param ctx - the context
|
|
36
|
+
* @param paced - whether this run paces itself (the generic source, whose descriptor cannot)
|
|
37
|
+
*/
|
|
38
|
+
constructor(plan, ctx, paced) {
|
|
39
|
+
this.plan = plan;
|
|
40
|
+
this.ctx = ctx;
|
|
41
|
+
this.paced = paced;
|
|
42
|
+
this.facts = {};
|
|
43
|
+
this.last = 0;
|
|
44
|
+
this.endpoint = new URL(plan.mapping.endpoint);
|
|
45
|
+
if (ctx.endpoint !== null && originOf(ctx.endpoint) !== this.endpoint.origin) {
|
|
46
|
+
failOn(ctx.report, "E_SOURCE_PARAM", "the endpoint is not the mapping's", {
|
|
47
|
+
name: "endpoint",
|
|
48
|
+
reason: "origin",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Wait out the mapping's own rate limit (the generic source only). */
|
|
53
|
+
async pace() {
|
|
54
|
+
const rate = this.plan.mapping.rateLimit;
|
|
55
|
+
if (!this.paced || rate === undefined) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// ponytail: even spacing, one request at a time; a burst window is the descriptor's pacer
|
|
59
|
+
const wait = this.last + rate.perMs / rate.requests - Date.now();
|
|
60
|
+
if (wait > 0) {
|
|
61
|
+
await sleep(wait, this.ctx.signal);
|
|
62
|
+
}
|
|
63
|
+
this.last = Date.now();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Record the budget headers of a response.
|
|
67
|
+
* @param headers - the response headers
|
|
68
|
+
*/
|
|
69
|
+
noteBudget(headers) {
|
|
70
|
+
const names = this.plan.mapping.budgetHeaders;
|
|
71
|
+
const remaining = names === undefined ? null : headers.get(names.remaining);
|
|
72
|
+
if (names === undefined || remaining === null || !Number.isFinite(Number(remaining))) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const reset = names.reset === undefined ? null : Number(headers.get(names.reset) ?? Number.NaN);
|
|
76
|
+
const resetMs = reset === null || !Number.isFinite(reset) ? undefined : resetDelayMs(reset);
|
|
77
|
+
this.facts.budget = { remaining: Number(remaining), ...(resetMs === undefined ? {} : { resetMs }) };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Read one page of a request.
|
|
81
|
+
* @param name - the request name
|
|
82
|
+
* @param values - the template values
|
|
83
|
+
* @param position - the page's position, or undefined for the first page
|
|
84
|
+
* @param headers - extra request headers (validation)
|
|
85
|
+
* @returns the page
|
|
86
|
+
*/
|
|
87
|
+
async read(name, values, position, headers) {
|
|
88
|
+
const request = this.plan.mapping.requests[name];
|
|
89
|
+
const { report } = this.ctx;
|
|
90
|
+
const built = buildRequest(this.endpoint, request, values, report);
|
|
91
|
+
const url = position === undefined
|
|
92
|
+
? firstPageUrl(built.url, request.paging, this.endpoint, report)
|
|
93
|
+
: pageUrl(built.url, request.paging, position, this.endpoint, report);
|
|
94
|
+
await this.pace();
|
|
95
|
+
const response = await this.ctx.fetch(url, {
|
|
96
|
+
...built.init,
|
|
97
|
+
headers: { accept: "application/json", ...built.init.headers, ...headers },
|
|
98
|
+
allowStatus: [304],
|
|
99
|
+
});
|
|
100
|
+
this.noteBudget(response.headers);
|
|
101
|
+
if (response.status === 304) {
|
|
102
|
+
return { records: [], next: null, headers: response.headers, status: 304 };
|
|
103
|
+
}
|
|
104
|
+
const text = await response.text();
|
|
105
|
+
let body;
|
|
106
|
+
try {
|
|
107
|
+
body = JSON.parse(text);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
failOn(report, "E_SOURCE_RESPONSE", "the response is not JSON", {
|
|
111
|
+
expected: "json",
|
|
112
|
+
contentType: response.headers.get("content-type"),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const records = selectRecords(body, request.records);
|
|
116
|
+
const here = position ?? null;
|
|
117
|
+
const next = nextPosition(request.paging, position ?? (request.paging?.style === "offset" ? (request.paging.base ?? 0) : here), { body, headers: response.headers, url, records: records.length, runtime: this.ctx.runtime }, this.endpoint, report);
|
|
118
|
+
return { records, next, headers: response.headers, status: response.status };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Record what the facts say so far, so the report carries them even when a later page fails.
|
|
122
|
+
* @param state - the load's record state
|
|
123
|
+
* @param next - where to resume, for an expansion
|
|
124
|
+
* @returns the report so far
|
|
125
|
+
*/
|
|
126
|
+
finish(state, next = null) {
|
|
127
|
+
if (state?.modified !== null && state?.modified !== undefined) {
|
|
128
|
+
this.facts.validators = { ...this.facts.validators, modified: state.modified };
|
|
129
|
+
}
|
|
130
|
+
return this.ctx.finish({ ...this.facts, next });
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Note the HTTP validators of a load's first response.
|
|
134
|
+
* @param headers - its headers
|
|
135
|
+
*/
|
|
136
|
+
noteValidators(headers) {
|
|
137
|
+
const etag = headers.get("etag");
|
|
138
|
+
const lastModified = headers.get("last-modified");
|
|
139
|
+
this.facts.validators = {
|
|
140
|
+
...this.facts.validators,
|
|
141
|
+
...(etag === null ? {} : { etag }),
|
|
142
|
+
...(lastModified === null ? {} : { lastModified }),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* The graph facts of a first page.
|
|
147
|
+
* @returns the meta
|
|
148
|
+
*/
|
|
149
|
+
meta() {
|
|
150
|
+
const { directed } = this.plan.mapping;
|
|
151
|
+
return directed === undefined ? undefined : { directed };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The template values of params: every string, number and boolean, as text.
|
|
156
|
+
* @param params - the params
|
|
157
|
+
* @param skip - a key to leave out
|
|
158
|
+
* @returns the values
|
|
159
|
+
*/
|
|
160
|
+
function stringValues(params, skip) {
|
|
161
|
+
const out = {};
|
|
162
|
+
for (const [k, v] of Object.entries(params)) {
|
|
163
|
+
if (k !== skip && (typeof v === "string" || typeof v === "number" || typeof v === "boolean")) {
|
|
164
|
+
out[k] = String(v);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The load: the seed request once, then the load request page by page.
|
|
171
|
+
* @param run - the call
|
|
172
|
+
* @yields one page of nodes and edges
|
|
173
|
+
*/
|
|
174
|
+
async function* loadPages(run) {
|
|
175
|
+
const { mapping, values } = run.plan;
|
|
176
|
+
const { cursor } = run.ctx;
|
|
177
|
+
if (cursor !== null && cursor.r !== mapping.load) {
|
|
178
|
+
failOn(run.ctx.report, "E_SOURCE_PARAM", "the cursor is not this mapping's", {
|
|
179
|
+
name: "cursor",
|
|
180
|
+
reason: "stale-cursor",
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
const state = newState();
|
|
184
|
+
const groups = [];
|
|
185
|
+
if (cursor === null && mapping.seed !== undefined) {
|
|
186
|
+
const seed = await run.read(mapping.seed, values, undefined);
|
|
187
|
+
groups.push({ records: seed.records, entity: mapping.requests[mapping.seed].entity });
|
|
188
|
+
}
|
|
189
|
+
const { entity } = mapping.requests[mapping.load];
|
|
190
|
+
let position = cursor === null ? undefined : cursor.at;
|
|
191
|
+
let first = true;
|
|
192
|
+
for (;;) {
|
|
193
|
+
const page = await run.read(mapping.load, values, position);
|
|
194
|
+
if (first && cursor === null) {
|
|
195
|
+
run.noteValidators(page.headers);
|
|
196
|
+
}
|
|
197
|
+
const out = toRecords(mapping, [...groups.splice(0), { records: page.records, entity }], state);
|
|
198
|
+
run.finish(state);
|
|
199
|
+
const next = page.next === null ? null : { r: mapping.load, at: page.next };
|
|
200
|
+
yield { nodes: out.nodes, edges: out.edges, next, meta: first ? run.meta() : undefined };
|
|
201
|
+
if (page.next === null) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
first = false;
|
|
205
|
+
position = page.next;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Write one page into a sink.
|
|
210
|
+
* @param out - the page
|
|
211
|
+
* @param sink - the sink
|
|
212
|
+
* @param ctx - the context
|
|
213
|
+
* @param types - the relationship types to keep, if any
|
|
214
|
+
*/
|
|
215
|
+
function writePage(out, sink, ctx, types) {
|
|
216
|
+
const { report } = ctx;
|
|
217
|
+
let n = 0;
|
|
218
|
+
for (const { id, ...attrs } of out.nodes) {
|
|
219
|
+
if (n++ % 64 === 0) {
|
|
220
|
+
throwIfAborted(ctx.signal);
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
sink.addNodeRecord(id, attrs);
|
|
224
|
+
report.counts.nodes++;
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
report.recordError(err, { element: String(id) });
|
|
228
|
+
report.counts.skippedNodes++;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
for (const { source, target, ...attrs } of out.edges) {
|
|
232
|
+
if (n++ % 64 === 0) {
|
|
233
|
+
throwIfAborted(ctx.signal);
|
|
234
|
+
}
|
|
235
|
+
if (types !== undefined && !types.has(String(attrs.type))) {
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
try {
|
|
239
|
+
sink.addEdgeRecord(source, target, attrs);
|
|
240
|
+
report.counts.edges++;
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
report.recordError(err, { element: `${String(source)} -> ${String(target)}` });
|
|
244
|
+
report.counts.skippedEdges++;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* The requests an expansion runs for a direction; depth 0 hydrates.
|
|
250
|
+
* @param mapping - the mapping
|
|
251
|
+
* @param request - the expansion
|
|
252
|
+
* @returns the request names
|
|
253
|
+
*/
|
|
254
|
+
function expandRequests(mapping, request) {
|
|
255
|
+
if (request.depth === 0) {
|
|
256
|
+
return mapping.hydrate === undefined ? [] : [mapping.hydrate];
|
|
257
|
+
}
|
|
258
|
+
const { expand } = mapping;
|
|
259
|
+
if (typeof expand === "string" || expand === undefined) {
|
|
260
|
+
return expand === undefined ? [] : [expand];
|
|
261
|
+
}
|
|
262
|
+
const direction = request.direction ?? "both";
|
|
263
|
+
const names = [direction !== "out" ? expand.in : undefined, direction !== "in" ? expand.out : undefined];
|
|
264
|
+
return [...new Set(names.filter((n) => n !== undefined))];
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Split ids into a request's batches.
|
|
268
|
+
* @param ids - the ids
|
|
269
|
+
* @param max - the batch size
|
|
270
|
+
* @returns the batches
|
|
271
|
+
*/
|
|
272
|
+
function batches(ids, max) {
|
|
273
|
+
const out = [];
|
|
274
|
+
for (let i = 0; i < ids.length; i += max) {
|
|
275
|
+
out.push(ids.slice(i, i + max));
|
|
276
|
+
}
|
|
277
|
+
return out;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Breadth-first expansion: each hop runs the direction's requests with the frontier's ids in
|
|
281
|
+
* `{ids}` batches; the nodes it adds are the next frontier. A capped first hop records where it
|
|
282
|
+
* stopped, so expanding again continues from there.
|
|
283
|
+
* @param run - the call
|
|
284
|
+
* @param request - the seeds and how far to go
|
|
285
|
+
* @param sink - where to write
|
|
286
|
+
* @returns the report
|
|
287
|
+
*/
|
|
288
|
+
async function expandInto(run, request, sink) {
|
|
289
|
+
return new Expansion(run, request, sink).expand();
|
|
290
|
+
}
|
|
291
|
+
/** One expansion's running state. */
|
|
292
|
+
class Expansion {
|
|
293
|
+
/**
|
|
294
|
+
* Check the expansion and set the sink's direction.
|
|
295
|
+
* @param run - the call
|
|
296
|
+
* @param request - the seeds and how far to go
|
|
297
|
+
* @param sink - where to write
|
|
298
|
+
*/
|
|
299
|
+
constructor(run, request, sink) {
|
|
300
|
+
this.run = run;
|
|
301
|
+
this.request = request;
|
|
302
|
+
this.sink = sink;
|
|
303
|
+
this.added = 0;
|
|
304
|
+
this.wrote = false;
|
|
305
|
+
const { ctx } = run;
|
|
306
|
+
this.mapping = run.plan.mapping;
|
|
307
|
+
this.names = expandRequests(this.mapping, request);
|
|
308
|
+
if (this.names.length === 0) {
|
|
309
|
+
failOn(ctx.report, "E_SOURCE_UNSUPPORTED", "the mapping has no request for this expansion", {
|
|
310
|
+
feature: request.depth === 0 ? "hydrate" : "expand",
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
if (request.ids.length === 0) {
|
|
314
|
+
failOn(ctx.report, "E_SOURCE_PARAM", "an expansion needs seed ids", { name: "ids", reason: "required" });
|
|
315
|
+
}
|
|
316
|
+
this.state = newState([...request.ids.map(String), ...(request.exclude ?? []).map(String)]);
|
|
317
|
+
this.types = request.relationshipTypes === undefined ? undefined : new Set(request.relationshipTypes);
|
|
318
|
+
if (this.mapping.directed !== undefined && sink.edgeCount === 0) {
|
|
319
|
+
sink.setDirected(this.mapping.directed);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Run every hop.
|
|
324
|
+
* @returns the report
|
|
325
|
+
*/
|
|
326
|
+
async expand() {
|
|
327
|
+
let frontier = this.request.ids.map(String);
|
|
328
|
+
const depth = Math.max(1, this.request.depth ?? 1);
|
|
329
|
+
for (let hop = 1; hop <= depth && frontier.length > 0; hop++) {
|
|
330
|
+
const reached = [];
|
|
331
|
+
const stop = await this.hop(hop, frontier, reached);
|
|
332
|
+
if (stop !== null) {
|
|
333
|
+
return stop;
|
|
334
|
+
}
|
|
335
|
+
frontier = [...new Set(reached)];
|
|
336
|
+
}
|
|
337
|
+
return this.run.finish(this.state, null);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Run one hop: every request over every batch of the frontier.
|
|
341
|
+
* @param hop - the hop, from 1
|
|
342
|
+
* @param frontier - the ids this hop starts from
|
|
343
|
+
* @param reached - collects the ids this hop adds
|
|
344
|
+
* @returns the report when the expansion stopped, else null
|
|
345
|
+
*/
|
|
346
|
+
async hop(hop, frontier, reached) {
|
|
347
|
+
for (const [x, name] of this.names.entries()) {
|
|
348
|
+
const max = this.mapping.requests[name].batch?.max ?? 1;
|
|
349
|
+
for (const [b, batch] of batches(frontier, max).entries()) {
|
|
350
|
+
if (this.skipped({ hop, x, b })) {
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
const stop = await this.readBatch({ hop, x, b }, name, batch, frontier, reached);
|
|
354
|
+
if (stop !== null) {
|
|
355
|
+
return stop;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return null;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Whether a resumed first hop already read this batch.
|
|
363
|
+
* @param at - the batch
|
|
364
|
+
* @returns true to skip it
|
|
365
|
+
*/
|
|
366
|
+
skipped(at) {
|
|
367
|
+
const { hop, x, b } = at;
|
|
368
|
+
const resume = this.run.ctx.cursor;
|
|
369
|
+
if (hop !== 1 || resume === null) {
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
const rx = Number(resume.x);
|
|
373
|
+
return x < rx || (x === rx && b < Number(resume.b));
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Where a batch starts: the recorded position for the batch a first hop stopped in.
|
|
377
|
+
* @param at - the batch
|
|
378
|
+
* @returns the position, or undefined for the first page
|
|
379
|
+
*/
|
|
380
|
+
startPosition(at) {
|
|
381
|
+
const { hop, x, b } = at;
|
|
382
|
+
const resume = this.run.ctx.cursor;
|
|
383
|
+
return hop === 1 && resume !== null && x === Number(resume.x) && b === Number(resume.b)
|
|
384
|
+
? (resume.at ?? undefined)
|
|
385
|
+
: undefined;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Read one batch page by page.
|
|
389
|
+
* @param at - the batch
|
|
390
|
+
* @param name - the request
|
|
391
|
+
* @param batch - its ids
|
|
392
|
+
* @param frontier - the hop's ids
|
|
393
|
+
* @param reached - collects the ids it adds
|
|
394
|
+
* @returns the report when the expansion stopped, else null
|
|
395
|
+
*/
|
|
396
|
+
async readBatch(at, name, batch, frontier, reached) {
|
|
397
|
+
const r = this.mapping.requests[name];
|
|
398
|
+
const own = { ...this.run.plan.values, id: batch[0], ids: batch.join(r.batch?.join ?? ",") };
|
|
399
|
+
let position = this.startPosition(at);
|
|
400
|
+
for (;;) {
|
|
401
|
+
let page;
|
|
402
|
+
try {
|
|
403
|
+
page = await this.run.read(name, own, position);
|
|
404
|
+
}
|
|
405
|
+
catch (err) {
|
|
406
|
+
return this.authStop(err, at.hop === 1 ? { x: at.x, b: at.b, at: position ?? null } : null);
|
|
407
|
+
}
|
|
408
|
+
this.writeNew(page, r.entity, reached);
|
|
409
|
+
const stop = this.capStop(at, page, frontier);
|
|
410
|
+
if (stop !== null || page.next === null) {
|
|
411
|
+
return stop;
|
|
412
|
+
}
|
|
413
|
+
position = page.next;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Keep what was written when a later page needs a credential; rethrow anything else.
|
|
418
|
+
* @param err - what the page threw
|
|
419
|
+
* @param cursor - where to resume
|
|
420
|
+
* @returns the report
|
|
421
|
+
*/
|
|
422
|
+
authStop(err, cursor) {
|
|
423
|
+
if (!this.wrote || !(err instanceof ImportError) || !AUTH_CODES.has(String(err.issue?.code))) {
|
|
424
|
+
throw err;
|
|
425
|
+
}
|
|
426
|
+
const p = err.issue?.params ?? {};
|
|
427
|
+
warnOn(this.run.ctx.report, "W_SOURCE_AUTH", "a later page needs a credential; the pages before it are kept", {
|
|
428
|
+
origin: typeof p.origin === "string" ? p.origin : this.run.endpoint.origin,
|
|
429
|
+
status: typeof p.status === "number" ? p.status : null,
|
|
430
|
+
});
|
|
431
|
+
return this.run.finish(this.state, cursor);
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Write a page and collect the nodes it added.
|
|
435
|
+
* @param page - the page
|
|
436
|
+
* @param entity - its records' entity
|
|
437
|
+
* @param reached - collects the ids it adds
|
|
438
|
+
*/
|
|
439
|
+
writeNew(page, entity, reached) {
|
|
440
|
+
const { state } = this;
|
|
441
|
+
const before = new Set([...state.full, ...state.stubs]);
|
|
442
|
+
const out = toRecords(this.mapping, [{ records: page.records, entity }], state);
|
|
443
|
+
writePage(out, this.sink, this.run.ctx, this.types);
|
|
444
|
+
this.wrote = true;
|
|
445
|
+
for (const node of out.nodes) {
|
|
446
|
+
const id = String(node.id);
|
|
447
|
+
if (!before.has(id) && !state.known.has(id)) {
|
|
448
|
+
reached.push(id);
|
|
449
|
+
this.added++;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Stop at the expansion's limit or the load's caps.
|
|
455
|
+
* @param at - the batch
|
|
456
|
+
* @param page - the page just written
|
|
457
|
+
* @param frontier - the hop's ids
|
|
458
|
+
* @returns the report when a cap was reached, else null
|
|
459
|
+
*/
|
|
460
|
+
capStop(at, page, frontier) {
|
|
461
|
+
const { hop, x, b } = at;
|
|
462
|
+
const { ctx } = this.run;
|
|
463
|
+
const limited = this.request.limit !== undefined && this.added >= this.request.limit;
|
|
464
|
+
if (limited) {
|
|
465
|
+
warnOn(ctx.report, "W_SOURCE_LIMIT", "the expansion reached its limit", {
|
|
466
|
+
limit: "limit",
|
|
467
|
+
value: this.added,
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
if (!limited && !ctx.limits.reached()) {
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
const more = page.next === null ? null : { x, b, at: page.next };
|
|
474
|
+
// ponytail: only a capped first hop can resume; a deeper hop's frontier is not recorded
|
|
475
|
+
return this.run.finish(this.state, hop === 1 ? (more ?? nextBatch(x, b, this.names, frontier, this.mapping)) : null);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Where a first hop continues after a batch that ended on a cap.
|
|
480
|
+
* @param x - the request index
|
|
481
|
+
* @param b - the batch index
|
|
482
|
+
* @param names - the requests
|
|
483
|
+
* @param frontier - the seeds
|
|
484
|
+
* @param mapping - the mapping
|
|
485
|
+
* @returns the cursor, or null when nothing is left
|
|
486
|
+
*/
|
|
487
|
+
function nextBatch(x, b, names, frontier, mapping) {
|
|
488
|
+
const count = Math.ceil(frontier.length / (mapping.requests[names[x]].batch?.max ?? 1));
|
|
489
|
+
if (b + 1 < count) {
|
|
490
|
+
return { x, b: b + 1, at: null };
|
|
491
|
+
}
|
|
492
|
+
return x + 1 < names.length ? { x: x + 1, b: 0, at: null } : null;
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Whether data loaded earlier changed: the load's first page (with the seed), sent with the
|
|
496
|
+
* recorded HTTP validators; a 304 or an equal ETag is current, else the newest modification time
|
|
497
|
+
* is compared.
|
|
498
|
+
* @param run - the call
|
|
499
|
+
* @param seen - the validators recorded then
|
|
500
|
+
* @returns the freshness
|
|
501
|
+
*/
|
|
502
|
+
async function validateRun(run, seen) {
|
|
503
|
+
const { mapping, values } = run.plan;
|
|
504
|
+
const headers = {};
|
|
505
|
+
if (seen.etag !== undefined) {
|
|
506
|
+
headers["if-none-match"] = seen.etag;
|
|
507
|
+
}
|
|
508
|
+
if (seen.lastModified !== undefined) {
|
|
509
|
+
headers["if-modified-since"] = seen.lastModified;
|
|
510
|
+
}
|
|
511
|
+
const state = newState();
|
|
512
|
+
const groups = [];
|
|
513
|
+
if (mapping.seed !== undefined) {
|
|
514
|
+
const seed = await run.read(mapping.seed, values, undefined);
|
|
515
|
+
groups.push({ records: seed.records, entity: mapping.requests[mapping.seed].entity });
|
|
516
|
+
}
|
|
517
|
+
const page = await run.read(mapping.load, values, undefined, headers);
|
|
518
|
+
if (page.status === 304) {
|
|
519
|
+
return { status: "current", via: seen.etag === undefined ? "modified" : "etag", validators: seen };
|
|
520
|
+
}
|
|
521
|
+
toRecords(mapping, [...groups, { records: page.records, entity: mapping.requests[mapping.load].entity }], state);
|
|
522
|
+
run.noteValidators(page.headers);
|
|
523
|
+
const now = {
|
|
524
|
+
...run.facts.validators,
|
|
525
|
+
...(state.modified === null ? {} : { modified: state.modified }),
|
|
526
|
+
};
|
|
527
|
+
if (seen.etag !== undefined && now.etag !== undefined) {
|
|
528
|
+
return { status: seen.etag === now.etag ? "current" : "changed", via: "etag", validators: now };
|
|
529
|
+
}
|
|
530
|
+
if (seen.modified !== undefined && now.modified !== undefined) {
|
|
531
|
+
return now.modified > seen.modified
|
|
532
|
+
? { status: "changed", via: "modified", changedAt: now.modified, validators: now }
|
|
533
|
+
: { status: "current", via: "modified", validators: now };
|
|
534
|
+
}
|
|
535
|
+
return { status: "unverifiable", validators: now };
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* The methods of a source that runs plans.
|
|
539
|
+
* @param plan - turns params into the plan
|
|
540
|
+
* @param paced - whether the run paces itself
|
|
541
|
+
* @returns records, expand, probe and validate
|
|
542
|
+
*/
|
|
543
|
+
export function restMethods(plan, paced) {
|
|
544
|
+
return {
|
|
545
|
+
records: (params, ctx) => loadPages(new RestRun(plan(params, ctx, "load"), ctx, paced)),
|
|
546
|
+
expand: (request, sink, ctx) => expandInto(new RestRun(plan(request.params, ctx, "expand"), ctx, paced), request, sink),
|
|
547
|
+
async probe(params, ctx) {
|
|
548
|
+
const run = new RestRun(plan(params, ctx, "probe"), ctx, paced);
|
|
549
|
+
const page = await run.read(run.plan.mapping.load, run.plan.values, undefined);
|
|
550
|
+
if (page.records.length === 0 && page.status !== 304) {
|
|
551
|
+
failOn(ctx.report, "E_SOURCE_NOT_FOUND", "the load request found no records", {
|
|
552
|
+
what: "records",
|
|
553
|
+
value: run.plan.mapping.load,
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
return { ok: true };
|
|
557
|
+
},
|
|
558
|
+
validate: (params, seen, ctx) => validateRun(new RestRun(plan(params, ctx, "validate"), ctx, paced), seen),
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* The plan of a mapping given as data, after it is checked.
|
|
563
|
+
* @param mapping - the mapping
|
|
564
|
+
* @param ctx - the context
|
|
565
|
+
* @returns the mapping, checked
|
|
566
|
+
*/
|
|
567
|
+
function checkedMapping(mapping, ctx) {
|
|
568
|
+
const [issue] = checkRestMapping(mapping);
|
|
569
|
+
if (issue !== undefined) {
|
|
570
|
+
failOn(ctx.report, "E_SOURCE_PARAM", `the mapping is invalid at ${issue.at}`, {
|
|
571
|
+
name: "mapping",
|
|
572
|
+
reason: issue.code,
|
|
573
|
+
at: issue.at,
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
return mapping;
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* Where a mapping's API key goes, as a descriptor says it.
|
|
580
|
+
* @param auth - the mapping's auth
|
|
581
|
+
* @returns `{ apiKey }`, or nothing when the mapping takes no key or does not say where
|
|
582
|
+
*/
|
|
583
|
+
function apiKeyOf(auth) {
|
|
584
|
+
if (auth?.kind !== "api-key") {
|
|
585
|
+
return {};
|
|
586
|
+
}
|
|
587
|
+
if (auth.header !== undefined) {
|
|
588
|
+
return { apiKey: { header: auth.header } };
|
|
589
|
+
}
|
|
590
|
+
return auth.query === undefined ? {} : { apiKey: { query: auth.query } };
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Turn a REST mapping into a source: a `records` source that loads the mapping's `load` request
|
|
594
|
+
* page by page, with `expand` (breadth-first over the `expand` requests, `{ids}` batched; depth 0
|
|
595
|
+
* fetches the seeds' own records through `hydrate`), `probe` and `validate`. The descriptor is
|
|
596
|
+
* derived from the mapping (its endpoint, params, auth and rate limit), and `info` may set any of
|
|
597
|
+
* its fields. A mapping with a problem is refused: E_SOURCE_INVALID with `reason: "mapping"`.
|
|
598
|
+
* Experimental.
|
|
599
|
+
* @param mapping - the mapping
|
|
600
|
+
* @param info - the id and descriptor fields
|
|
601
|
+
* @returns the source
|
|
602
|
+
* @example
|
|
603
|
+
* ```ts
|
|
604
|
+
* const people = restSource(mapping, { id: "people", plainName: "People" });
|
|
605
|
+
* registerSource(people);
|
|
606
|
+
* const { snapshot } = await loadFromSource("people", { team: "core" });
|
|
607
|
+
* ```
|
|
608
|
+
* @category Network sources
|
|
609
|
+
*/
|
|
610
|
+
export function restSource(mapping, info) {
|
|
611
|
+
const [issue] = checkRestMapping(mapping);
|
|
612
|
+
if (issue !== undefined) {
|
|
613
|
+
failAlone("E_SOURCE_INVALID", `the mapping of ${info.id} is invalid at ${issue.at}`, {
|
|
614
|
+
id: info.id,
|
|
615
|
+
reason: "mapping",
|
|
616
|
+
at: issue.at,
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
const { id, ...fields } = info;
|
|
620
|
+
const auth = mapping.auth === undefined ? [] : [mapping.auth.kind];
|
|
621
|
+
const descriptor = Object.freeze({
|
|
622
|
+
plainName: id,
|
|
623
|
+
kind: "rest",
|
|
624
|
+
params: mapping.params ?? [],
|
|
625
|
+
defaultEndpoint: mapping.endpoint,
|
|
626
|
+
auth,
|
|
627
|
+
authRequired: auth.length === 0 ? "none" : "optional",
|
|
628
|
+
...apiKeyOf(mapping.auth),
|
|
629
|
+
...(mapping.rateLimit === undefined ? {} : { rateLimit: mapping.rateLimit }),
|
|
630
|
+
...fields,
|
|
631
|
+
});
|
|
632
|
+
return defineSource({
|
|
633
|
+
id,
|
|
634
|
+
descriptor,
|
|
635
|
+
...restMethods((params) => ({ mapping, values: stringValues(params) }), false),
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* The generic REST mapping source: `params.mapping` says how to read the API, and the other params
|
|
640
|
+
* fill its templates. The mapping is checked before any request (E_SOURCE_PARAM, `name:
|
|
641
|
+
* "mapping"`, `reason` the problem's code, `at` where it is). With a credential, pass the mapping's
|
|
642
|
+
* endpoint as `endpoint`, so the credential is bound to it. Experimental.
|
|
643
|
+
* @category Network sources
|
|
644
|
+
*/
|
|
645
|
+
export const restMappingSource = defineSource({
|
|
646
|
+
id: REST_SOURCE_ID,
|
|
647
|
+
descriptor: REST_DESCRIPTOR,
|
|
648
|
+
...restMethods((params, ctx) => ({ mapping: checkedMapping(params.mapping, ctx), values: stringValues(params, "mapping") }), true),
|
|
649
|
+
});
|
|
650
|
+
//# sourceMappingURL=source.js.map
|