@graphty/graph-io 0.3.47 → 0.3.48
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-C2riR4NT.js} +2 -2
- package/dist/chunks/{approximations-wWjCRzKj.js.map → approximations-C2riR4NT.js.map} +1 -1
- package/dist/chunks/{block-DiGq58c3.js → block-Cu22ewuS.js} +92 -21
- package/dist/chunks/block-Cu22ewuS.js.map +1 -0
- package/dist/chunks/{choose--jM0yYCo.js → choose-Cdx6Enl2.js} +3 -3
- package/dist/chunks/{choose--jM0yYCo.js.map → choose-Cdx6Enl2.js.map} +1 -1
- package/dist/chunks/codes-CV_Bhcyi.js +153 -0
- package/dist/chunks/codes-CV_Bhcyi.js.map +1 -0
- package/dist/chunks/{constants-BKwqelYD.js → constants-D0LqcsLJ.js} +2 -2
- package/dist/chunks/{constants-BKwqelYD.js.map → constants-D0LqcsLJ.js.map} +1 -1
- package/dist/chunks/context-cgmmOxZ2.js +663 -0
- package/dist/chunks/context-cgmmOxZ2.js.map +1 -0
- package/dist/chunks/credentials-BiQsnMTb.js +347 -0
- package/dist/chunks/credentials-BiQsnMTb.js.map +1 -0
- package/dist/chunks/cx-export-BEeF6ymo.js +259 -0
- package/dist/chunks/cx-export-BEeF6ymo.js.map +1 -0
- package/dist/chunks/descriptor-BJ-W0Jd-.js +137 -0
- package/dist/chunks/descriptor-BJ-W0Jd-.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/{emit-CwU8cUmG.js → emit-CD8xnY8s.js} +70 -10
- package/dist/chunks/emit-CD8xnY8s.js.map +1 -0
- package/dist/chunks/{escape-CgzxiYPg.js → escape-DH2Egt-l.js} +12 -12
- package/dist/chunks/{escape-CgzxiYPg.js.map → escape-DH2Egt-l.js.map} +1 -1
- package/dist/chunks/{export-BvqAXCKh.js → export-CZ7VRm4I.js} +53 -1443
- package/dist/chunks/export-CZ7VRm4I.js.map +1 -0
- package/dist/chunks/{exporter-DndFlGSa.js → exporter-BIdaoIgh.js} +7 -6
- package/dist/chunks/{exporter-DndFlGSa.js.map → exporter-BIdaoIgh.js.map} +1 -1
- package/dist/chunks/{exporter-CJgfhF-l.js → exporter-ChjL5fmP.js} +8 -7
- package/dist/chunks/{exporter-CJgfhF-l.js.map → exporter-ChjL5fmP.js.map} +1 -1
- package/dist/chunks/{exporter--Mk9gXCJ.js → exporter-Dcw7Ldtq.js} +6 -4
- package/dist/chunks/{exporter--Mk9gXCJ.js.map → exporter-Dcw7Ldtq.js.map} +1 -1
- package/dist/chunks/exporter-DtVU80Fa.js +1008 -0
- package/dist/chunks/exporter-DtVU80Fa.js.map +1 -0
- package/dist/chunks/{exporter-CrDWIyiq.js → exporter-bxxjOrDZ.js} +11 -9
- package/dist/chunks/{exporter-CrDWIyiq.js.map → exporter-bxxjOrDZ.js.map} +1 -1
- package/dist/chunks/format-BMS-1Nxb.js +64 -0
- package/dist/chunks/format-BMS-1Nxb.js.map +1 -0
- package/dist/chunks/{generic-Dq1ntt9q.js → generic-CP6YD34u.js} +4 -4
- package/dist/chunks/{generic-Dq1ntt9q.js.map → generic-CP6YD34u.js.map} +1 -1
- package/dist/chunks/{importer-DiZRmOQG.js → importer-B87_fmVx.js} +13 -17
- package/dist/chunks/importer-B87_fmVx.js.map +1 -0
- package/dist/chunks/{importer-BSvfrX_h.js → importer-Bji2MeWr.js} +18 -1014
- package/dist/chunks/importer-Bji2MeWr.js.map +1 -0
- package/dist/chunks/{importer-COTK9Tsl.js → importer-CB_zV5_L.js} +14 -11
- package/dist/chunks/importer-CB_zV5_L.js.map +1 -0
- package/dist/chunks/{importer-e6LGpqHB.js → importer-CVT-JyDE.js} +12 -9
- package/dist/chunks/importer-CVT-JyDE.js.map +1 -0
- package/dist/chunks/{importer-yh_aBCU6.js → importer-Cyy6UseH.js} +7 -6
- package/dist/chunks/{importer-yh_aBCU6.js.map → importer-Cyy6UseH.js.map} +1 -1
- package/dist/chunks/{importer-iFYPEKaJ.js → importer-DPZDN40-.js} +14 -10
- package/dist/chunks/{importer-iFYPEKaJ.js.map → importer-DPZDN40-.js.map} +1 -1
- package/dist/chunks/{importer-CMmeMWlC.js → importer-e3huMZbm.js} +8 -260
- package/dist/chunks/importer-e3huMZbm.js.map +1 -0
- package/dist/chunks/input-Ccg9I22A.js +1397 -0
- package/dist/chunks/input-Ccg9I22A.js.map +1 -0
- package/dist/chunks/{json-elements-DJZRZ6jd.js → json-elements-By172SVq.js} +4 -4
- package/dist/chunks/{json-elements-DJZRZ6jd.js.map → json-elements-By172SVq.js.map} +1 -1
- package/dist/chunks/{lexicon-CT69Kd87.js → lexicon-u2SI5xcx.js} +19 -5
- package/dist/chunks/lexicon-u2SI5xcx.js.map +1 -0
- package/dist/chunks/{ontology-export-G4MqRdux.js → ontology-export-BwgMyuF0.js} +4 -3
- package/dist/chunks/{ontology-export-G4MqRdux.js.map → ontology-export-BwgMyuF0.js.map} +1 -1
- package/dist/chunks/{records-CiaWZrFH.js → records-Cgvxz-Vx.js} +2 -2
- package/dist/chunks/{records-CiaWZrFH.js.map → records-Cgvxz-Vx.js.map} +1 -1
- package/dist/chunks/{format-BpQBx8MZ.js → report-CgdsL9Hb.js} +72 -129
- package/dist/chunks/report-CgdsL9Hb.js.map +1 -0
- package/dist/chunks/sigv4-LkAzsLAu.js +247 -0
- package/dist/chunks/sigv4-LkAzsLAu.js.map +1 -0
- package/dist/chunks/{styles-BQnsga7p.js → styles-CaABMoO1.js} +76 -43
- package/dist/chunks/styles-CaABMoO1.js.map +1 -0
- package/dist/chunks/{styles-D3fRphrO.js → styles-P_gmFAOi.js} +101 -21
- package/dist/chunks/styles-P_gmFAOi.js.map +1 -0
- package/dist/chunks/{styles-yed-BF5x3_Y5.js → styles-yed-Cs1nmrjn.js} +60 -20
- package/dist/chunks/styles-yed-Cs1nmrjn.js.map +1 -0
- package/dist/chunks/{text-CzJNFOS9.js → text-BuKQVMz2.js} +2 -2
- package/dist/chunks/{text-CzJNFOS9.js.map → text-BuKQVMz2.js.map} +1 -1
- package/dist/chunks/{writer-DMKvthQE.js → writer-DvHTl36J.js} +5 -4
- package/dist/chunks/writer-DvHTl36J.js.map +1 -0
- 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 +2 -2
- package/dist/gexf.js +7 -5
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +16 -13
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +1181 -224
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +3 -3
- package/dist/json.js +1 -1
- 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/sources-cypher.d.ts +1 -0
- package/dist/sources-cypher.js +1236 -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 +1367 -0
- package/dist/sources-rest.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/styles.d.ts.map +1 -1
- package/dist/src/formats/cx/styles.js +1 -0
- package/dist/src/formats/cx/styles.js.map +1 -1
- package/dist/src/formats/dot/styles.d.ts.map +1 -1
- package/dist/src/formats/dot/styles.js +3 -1
- package/dist/src/formats/dot/styles.js.map +1 -1
- package/dist/src/formats/gexf/styles.d.ts +29 -12
- package/dist/src/formats/gexf/styles.d.ts.map +1 -1
- package/dist/src/formats/gexf/styles.js +160 -31
- package/dist/src/formats/gexf/styles.js.map +1 -1
- package/dist/src/formats/gml/styles.d.ts.map +1 -1
- package/dist/src/formats/gml/styles.js +5 -4
- 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 +3 -3
- package/dist/src/formats/graphml/styles-plain.js.map +1 -1
- package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yed.js +89 -19
- package/dist/src/formats/graphml/styles-yed.js.map +1 -1
- package/dist/src/formats/pajek/styles.d.ts.map +1 -1
- package/dist/src/formats/pajek/styles.js +1 -0
- package/dist/src/formats/pajek/styles.js.map +1 -1
- package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
- package/dist/src/formats/xgmml/styles.js +1 -0
- package/dist/src/formats/xgmml/styles.js.map +1 -1
- package/dist/src/index.d.ts +8 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -1
- package/dist/src/index.js.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 +47 -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 +739 -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 +119 -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 +405 -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 +106 -0
- package/dist/src/sources/cypher/query-builder.d.ts.map +1 -0
- package/dist/src/sources/cypher/query-builder.js +236 -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 +64 -0
- package/dist/src/sources/ids.d.ts.map +1 -0
- package/dist/src/sources/ids.js +64 -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 +28 -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 +71 -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 +635 -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 +24 -0
- package/dist/src/sources/sigv4.d.ts.map +1 -0
- package/dist/src/sources/sigv4.js +182 -0
- package/dist/src/sources/sigv4.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 +665 -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/canon/enums.d.ts.map +1 -1
- package/dist/src/styles/canon/enums.js +1 -0
- package/dist/src/styles/canon/enums.js.map +1 -1
- package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
- package/dist/src/styles/cyjs/cascade.js +68 -2
- 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 +2 -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 +18 -7
- package/dist/src/styles/cyjs/emit.js.map +1 -1
- package/dist/src/styles/cyjs/mappers.d.ts +4 -1
- package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
- package/dist/src/styles/cyjs/mappers.js +2 -0
- package/dist/src/styles/cyjs/mappers.js.map +1 -1
- package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/emit.js +59 -7
- package/dist/src/styles/cytoscape/emit.js.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.d.ts +6 -0
- package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.js +26 -2
- package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
- package/dist/src/styles/cytoscape/resolve.d.ts +4 -1
- package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/resolve.js +10 -6
- 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 +30 -0
- package/dist/src/styles/defaults.d.ts.map +1 -1
- package/dist/src/styles/defaults.js +45 -4
- package/dist/src/styles/defaults.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/writer.d.ts.map +1 -1
- package/dist/src/styles/io/writer.js +7 -3
- package/dist/src/styles/io/writer.js.map +1 -1
- package/dist/src/styles/plan/resolve.d.ts +2 -1
- package/dist/src/styles/plan/resolve.d.ts.map +1 -1
- package/dist/src/styles/plan/resolve.js +13 -2
- package/dist/src/styles/plan/resolve.js.map +1 -1
- package/dist/src/styles/types.d.ts +19 -2
- package/dist/src/styles/types.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.js +15 -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 +11 -11
- package/dist/xgmml.js +3 -3
- package/docs/samples/people.json +6 -0
- package/package.json +29 -4
- package/src/common/report.ts +27 -7
- package/src/formats/cx/styles.ts +1 -0
- package/src/formats/dot/styles.ts +3 -1
- package/src/formats/gexf/styles.ts +185 -37
- package/src/formats/gml/styles.ts +5 -4
- package/src/formats/graphml/styles-plain.ts +3 -9
- package/src/formats/graphml/styles-yed.ts +93 -20
- package/src/formats/pajek/styles.ts +1 -0
- package/src/formats/xgmml/styles.ts +1 -0
- package/src/index.ts +90 -0
- package/src/registry.ts +326 -1
- package/src/sources/builtins.ts +56 -0
- package/src/sources/codes.ts +235 -0
- package/src/sources/context.ts +893 -0
- package/src/sources/credentials.ts +409 -0
- package/src/sources/cypher/descriptor.ts +125 -0
- package/src/sources/cypher/flatten.ts +323 -0
- package/src/sources/cypher/index.ts +498 -0
- package/src/sources/cypher/params.ts +41 -0
- package/src/sources/cypher/profiles.ts +78 -0
- package/src/sources/cypher/query-builder.ts +294 -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 +74 -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 +29 -0
- package/src/sources/registry.ts +325 -0
- package/src/sources/rest/descriptor.ts +74 -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 +760 -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 +207 -0
- package/src/sources/testing.ts +210 -0
- package/src/sources/types.ts +741 -0
- package/src/styles/canon/enums.ts +1 -0
- package/src/styles/cyjs/cascade.ts +81 -2
- package/src/styles/cyjs/defaults-table.ts +2 -0
- package/src/styles/cyjs/emit.ts +18 -7
- package/src/styles/cyjs/mappers.ts +6 -1
- package/src/styles/cytoscape/emit.ts +61 -7
- package/src/styles/cytoscape/lexicon.ts +28 -2
- package/src/styles/cytoscape/resolve.ts +22 -6
- package/src/styles/cytoscape/translate.ts +11 -11
- package/src/styles/defaults.ts +93 -4
- package/src/styles/io/block.ts +10 -0
- package/src/styles/io/writer.ts +8 -3
- package/src/styles/plan/resolve.ts +14 -2
- package/src/styles/types.ts +28 -2
- package/src/styles/vocabulary.ts +15 -1
- package/src/types.ts +19 -5
- package/dist/chunks/block-DiGq58c3.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/format-BpQBx8MZ.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/lexicon-CT69Kd87.js.map +0 -1
- package/dist/chunks/styles-BQnsga7p.js.map +0 -1
- package/dist/chunks/styles-D3fRphrO.js.map +0 -1
- package/dist/chunks/styles-yed-BF5x3_Y5.js.map +0 -1
- package/dist/chunks/writer-DMKvthQE.js.map +0 -1
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The REST mapping format and the parameters of the `rest` source and its `openalex` preset (design
|
|
3
|
+
* sections 13.2 and 13.3). Experimental: the mapping carries `version: 1`. The REST work may add
|
|
4
|
+
* optional fields only.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { type SourceParamDescriptor } from "../types.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* How a paged request moves to its next page. Experimental.
|
|
11
|
+
* @category Network sources
|
|
12
|
+
*/
|
|
13
|
+
export type RestPaging =
|
|
14
|
+
| {
|
|
15
|
+
/** The paging style. */
|
|
16
|
+
readonly style: "cursor";
|
|
17
|
+
/** The query parameter that carries the position. */
|
|
18
|
+
readonly param: string;
|
|
19
|
+
/** The position of the first page. */
|
|
20
|
+
readonly first: string;
|
|
21
|
+
/** The selector of the next position in the body. */
|
|
22
|
+
readonly next: string;
|
|
23
|
+
}
|
|
24
|
+
| {
|
|
25
|
+
/** The paging style. */
|
|
26
|
+
readonly style: "offset";
|
|
27
|
+
/** The query parameter that carries the position. */
|
|
28
|
+
readonly param: string;
|
|
29
|
+
/** The page size and its query parameter. */
|
|
30
|
+
readonly size: {
|
|
31
|
+
/** The query parameter that carries the page size. */
|
|
32
|
+
readonly param: string;
|
|
33
|
+
/** The page size. */
|
|
34
|
+
readonly value: number;
|
|
35
|
+
};
|
|
36
|
+
/** Whether the offset counts items or pages. */
|
|
37
|
+
readonly unit?: "items" | "pages" | undefined;
|
|
38
|
+
/** The first offset. */
|
|
39
|
+
readonly base?: 0 | 1 | undefined;
|
|
40
|
+
}
|
|
41
|
+
| {
|
|
42
|
+
/** The paging style. */
|
|
43
|
+
readonly style: "link-header";
|
|
44
|
+
/** The link relation of the next page. */
|
|
45
|
+
readonly rel?: string | undefined;
|
|
46
|
+
}
|
|
47
|
+
| {
|
|
48
|
+
/** The paging style. */
|
|
49
|
+
readonly style: "next-url";
|
|
50
|
+
/** The selector of the next position in the body. */
|
|
51
|
+
readonly next: string;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* One named request of a mapping. Experimental.
|
|
56
|
+
* @category Network sources
|
|
57
|
+
*/
|
|
58
|
+
export interface RestRequest {
|
|
59
|
+
/** GET (default) or POST. */
|
|
60
|
+
readonly method?: "GET" | "POST" | undefined;
|
|
61
|
+
/** A path template: "/works/{id}". */
|
|
62
|
+
readonly path: string;
|
|
63
|
+
/** Query templates: `{ filter: "cites:{work}" }`. */
|
|
64
|
+
readonly query?: Readonly<Record<string, string>> | undefined;
|
|
65
|
+
/** A POST body; templates in string leaves. */
|
|
66
|
+
readonly body?: unknown;
|
|
67
|
+
/** The selector of the record array, "." for one record. */
|
|
68
|
+
readonly records: string;
|
|
69
|
+
/** Which entity the records are. */
|
|
70
|
+
readonly entity: string;
|
|
71
|
+
/** How it pages. */
|
|
72
|
+
readonly paging?: RestPaging | undefined;
|
|
73
|
+
/** `{ids}` holds up to `max` ids joined by `join`. */
|
|
74
|
+
readonly batch?:
|
|
75
|
+
| {
|
|
76
|
+
/** At most this many ids per request. */
|
|
77
|
+
readonly max: number;
|
|
78
|
+
/** What joins the ids. */
|
|
79
|
+
readonly join: string;
|
|
80
|
+
}
|
|
81
|
+
| undefined;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* One rule that makes edges from a record. Experimental.
|
|
86
|
+
* @category Network sources
|
|
87
|
+
*/
|
|
88
|
+
export type RestEdgeRule =
|
|
89
|
+
| {
|
|
90
|
+
/** A selector the rule repeats over. */
|
|
91
|
+
readonly each?: string | undefined;
|
|
92
|
+
/** The selector of the edge's source; the record's id by default. */
|
|
93
|
+
readonly from?: string | undefined;
|
|
94
|
+
/** The selector of the edge's target ids. */
|
|
95
|
+
readonly to: string;
|
|
96
|
+
/** The edge type. */
|
|
97
|
+
readonly type: string;
|
|
98
|
+
/** The entity the target or record is. */
|
|
99
|
+
readonly entity?: string | undefined;
|
|
100
|
+
/** Attribute name to selector. */
|
|
101
|
+
readonly fields?: Readonly<Record<string, string>> | undefined;
|
|
102
|
+
}
|
|
103
|
+
| {
|
|
104
|
+
/** A selector the rule repeats over. */
|
|
105
|
+
readonly each?: string | undefined;
|
|
106
|
+
/** A selector of ids joined pairwise, undirected. */
|
|
107
|
+
readonly pairs: string;
|
|
108
|
+
/** The edge type. */
|
|
109
|
+
readonly type: string;
|
|
110
|
+
/** The entity the ids are, for its `stripPrefix` and for stubs; the record's own by default. */
|
|
111
|
+
readonly entity?: string | undefined;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* How records of one kind become nodes and edges. Experimental.
|
|
116
|
+
* @category Network sources
|
|
117
|
+
*/
|
|
118
|
+
export interface RestEntity {
|
|
119
|
+
/** The id selector within the record; `#` is the record's position in its array. */
|
|
120
|
+
readonly id: string;
|
|
121
|
+
/**
|
|
122
|
+
* false: the records are containers, not nodes; only their edge rules and embedded records
|
|
123
|
+
* count (a body holding a node array and an edge array).
|
|
124
|
+
*/
|
|
125
|
+
readonly node?: false | undefined;
|
|
126
|
+
/** The node label; the entity's name by default. */
|
|
127
|
+
readonly label?: string | undefined;
|
|
128
|
+
/** A prefix stripped from ids ("https://openalex.org/"). */
|
|
129
|
+
readonly stripPrefix?: string | undefined;
|
|
130
|
+
/** Attribute name to selector; without it every top-level scalar is kept. */
|
|
131
|
+
readonly fields?: Readonly<Record<string, string>> | undefined;
|
|
132
|
+
/** The edge rules. */
|
|
133
|
+
readonly edges?: readonly RestEdgeRule[] | undefined;
|
|
134
|
+
/** Nested records that are nodes of their own entity. */
|
|
135
|
+
readonly embedded?:
|
|
136
|
+
| readonly {
|
|
137
|
+
/** The selector of the nested records. */
|
|
138
|
+
readonly at: string;
|
|
139
|
+
/** The entity the target or record is. */
|
|
140
|
+
readonly entity: string;
|
|
141
|
+
}[]
|
|
142
|
+
| undefined;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* A declarative mapping from a REST API to a graph, as JSON data. Experimental.
|
|
147
|
+
* @category Network sources
|
|
148
|
+
*/
|
|
149
|
+
export interface RestMapping {
|
|
150
|
+
/** The format version. */
|
|
151
|
+
readonly version: 1;
|
|
152
|
+
/** Every request must stay on this origin. */
|
|
153
|
+
readonly endpoint: string;
|
|
154
|
+
/** The named requests. */
|
|
155
|
+
readonly requests: Readonly<Record<string, RestRequest>>;
|
|
156
|
+
/** How records become nodes and edges. */
|
|
157
|
+
readonly entities: Readonly<Record<string, RestEntity>>;
|
|
158
|
+
/** The request a load runs. */
|
|
159
|
+
readonly load: string;
|
|
160
|
+
/** The request an expansion runs per batch of seeds. */
|
|
161
|
+
readonly expand?:
|
|
162
|
+
| string
|
|
163
|
+
| {
|
|
164
|
+
/** The request for incoming edges. */
|
|
165
|
+
readonly in?: string | undefined;
|
|
166
|
+
/** The request for outgoing edges. */
|
|
167
|
+
readonly out?: string | undefined;
|
|
168
|
+
}
|
|
169
|
+
| undefined;
|
|
170
|
+
/** The request that fetches stub nodes' full records (an expansion of depth 0). */
|
|
171
|
+
readonly hydrate?: string | undefined;
|
|
172
|
+
/** A request run once before the load, for the seeds' own records. */
|
|
173
|
+
readonly seed?: string | undefined;
|
|
174
|
+
/** Whether the graph is directed; the builder's default when absent. */
|
|
175
|
+
readonly directed?: boolean | undefined;
|
|
176
|
+
/**
|
|
177
|
+
* The selector of a record's modification time (ISO-8601). The newest one loaded becomes
|
|
178
|
+
* `report.source.validators.modified`, which `validateSource` compares against.
|
|
179
|
+
*/
|
|
180
|
+
readonly modified?: string | undefined;
|
|
181
|
+
/** What credential a form should ask for. */
|
|
182
|
+
readonly auth?:
|
|
183
|
+
| {
|
|
184
|
+
/** The credential kind. */
|
|
185
|
+
readonly kind: "bearer";
|
|
186
|
+
}
|
|
187
|
+
| {
|
|
188
|
+
/** The credential kind. */
|
|
189
|
+
readonly kind: "api-key";
|
|
190
|
+
/** The request header the key goes in. */
|
|
191
|
+
readonly header?: string | undefined;
|
|
192
|
+
/** The query parameter the key goes in. */
|
|
193
|
+
readonly query?: string | undefined;
|
|
194
|
+
}
|
|
195
|
+
| undefined;
|
|
196
|
+
/** Paces requests. */
|
|
197
|
+
readonly rateLimit?:
|
|
198
|
+
| {
|
|
199
|
+
/** At most this many requests per period. */
|
|
200
|
+
readonly requests: number;
|
|
201
|
+
/** The period, in milliseconds. */
|
|
202
|
+
readonly perMs: number;
|
|
203
|
+
/** At most this many requests at once. */
|
|
204
|
+
readonly concurrent?: number;
|
|
205
|
+
}
|
|
206
|
+
| undefined;
|
|
207
|
+
/** Response headers telling what budget is left. */
|
|
208
|
+
readonly budgetHeaders?:
|
|
209
|
+
| {
|
|
210
|
+
/** What the service says is left. */
|
|
211
|
+
readonly remaining: string;
|
|
212
|
+
/** The header naming when the budget resets. */
|
|
213
|
+
readonly reset?: string | undefined;
|
|
214
|
+
}
|
|
215
|
+
| undefined;
|
|
216
|
+
/** What a form asks for. */
|
|
217
|
+
readonly params?: readonly SourceParamDescriptor[] | undefined;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* The params of the generic `rest` source: the mapping and the values its templates use.
|
|
222
|
+
* Experimental.
|
|
223
|
+
* @category Network sources
|
|
224
|
+
*/
|
|
225
|
+
export type RestParams = {
|
|
226
|
+
/** The mapping. */
|
|
227
|
+
readonly mapping: RestMapping;
|
|
228
|
+
} & Readonly<Record<string, unknown>>;
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* The params of the `openalex` preset. Experimental.
|
|
232
|
+
* @category Network sources
|
|
233
|
+
*/
|
|
234
|
+
export interface OpenAlexParams {
|
|
235
|
+
/** The seed work ("W2112090702"). */
|
|
236
|
+
readonly work?: string | undefined;
|
|
237
|
+
/** The seed author. */
|
|
238
|
+
readonly author?: string | undefined;
|
|
239
|
+
/** "citation" (default) or "coauthorship". */
|
|
240
|
+
readonly graph?: "citation" | "coauthorship" | undefined;
|
|
241
|
+
/** What else becomes nodes, as a list or a comma-separated string. @defaultValue [] */
|
|
242
|
+
readonly include?: readonly ("authors" | "institutions" | "topics")[] | string | undefined;
|
|
243
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turning a REST API's records into nodes and edges (design section 13.2): each record of an
|
|
3
|
+
* entity is a node, each edge rule makes edges, a target with no record yet becomes a stub, and
|
|
4
|
+
* embedded records are nodes of their own entity. A stub never overwrites a full record.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { SOURCE_ENTITY_ATTR, SOURCE_STUB_ATTR } from "../ids.js";
|
|
8
|
+
import { type EdgeRecord, type NodeRecord } from "../types.js";
|
|
9
|
+
import { type RestEdgeRule, type RestEntity, type RestMapping } from "./params.js";
|
|
10
|
+
import { select, selectOne } from "./selectors.js";
|
|
11
|
+
|
|
12
|
+
/** What one load or expansion knows about the ids it wrote, across its pages. */
|
|
13
|
+
export interface RecordState {
|
|
14
|
+
/** Ids written with a full record. */
|
|
15
|
+
readonly full: Set<string>;
|
|
16
|
+
/** Ids written as stubs. */
|
|
17
|
+
readonly stubs: Set<string>;
|
|
18
|
+
/** Ids the caller already holds (an expansion's seeds and `exclude`): never stubbed. */
|
|
19
|
+
readonly known: ReadonlySet<string>;
|
|
20
|
+
/** The newest modification time seen, for the validators. */
|
|
21
|
+
modified: string | null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** The nodes and edges of one page. */
|
|
25
|
+
export interface PageRecords {
|
|
26
|
+
readonly nodes: NodeRecord[];
|
|
27
|
+
readonly edges: EdgeRecord[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* A fresh state.
|
|
32
|
+
* @param known - ids the caller holds already
|
|
33
|
+
* @returns the state
|
|
34
|
+
*/
|
|
35
|
+
export function newState(known: Iterable<string> = []): RecordState {
|
|
36
|
+
return { full: new Set(), stubs: new Set(), known: new Set(known), modified: null };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* An id as text, with the entity's prefix stripped.
|
|
41
|
+
* @param value - what a selector reached
|
|
42
|
+
* @param entity - the entity whose prefix applies
|
|
43
|
+
* @returns the id, or null when the value is not one
|
|
44
|
+
*/
|
|
45
|
+
function idText(value: unknown, entity: RestEntity | undefined): string | null {
|
|
46
|
+
if (typeof value !== "string" && typeof value !== "number") {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const text = String(value);
|
|
50
|
+
const prefix = entity?.stripPrefix;
|
|
51
|
+
return prefix !== undefined && prefix !== "" && text.startsWith(prefix) ? text.slice(prefix.length) : text;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The value of a field selector: every value for a selector with `[]`, else the first.
|
|
56
|
+
* @param record - the record
|
|
57
|
+
* @param selector - the selector
|
|
58
|
+
* @param index - the record's position, for `#`
|
|
59
|
+
* @returns the value
|
|
60
|
+
*/
|
|
61
|
+
function fieldValue(record: unknown, selector: string, index: number): unknown {
|
|
62
|
+
if (selector === "#") {
|
|
63
|
+
return index;
|
|
64
|
+
}
|
|
65
|
+
return selector.includes("[]") ? select(record, selector) : selectOne(record, selector);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Converts the records of one page. */
|
|
69
|
+
class PageWriter {
|
|
70
|
+
readonly out: PageRecords = { nodes: [], edges: [] };
|
|
71
|
+
/** Edge rules to run once every node of the page is known, so a target on this page is no stub. */
|
|
72
|
+
private readonly pending: { record: unknown; entity: string; id: string | null }[] = [];
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Create one.
|
|
76
|
+
* @param mapping - the mapping
|
|
77
|
+
* @param state - the load's state
|
|
78
|
+
*/
|
|
79
|
+
constructor(
|
|
80
|
+
private readonly mapping: RestMapping,
|
|
81
|
+
private readonly state: RecordState,
|
|
82
|
+
) {}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Add the records of an entity, and their embedded records.
|
|
86
|
+
* @param records - the records
|
|
87
|
+
* @param entityName - their entity
|
|
88
|
+
*/
|
|
89
|
+
addRecords(records: readonly unknown[], entityName: string): void {
|
|
90
|
+
const entity = this.mapping.entities[entityName];
|
|
91
|
+
records.forEach((record, index) => {
|
|
92
|
+
const id = entity.node === false ? null : idText(fieldValue(record, entity.id, index), entity);
|
|
93
|
+
if (entity.node !== false) {
|
|
94
|
+
if (id === null) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this.addNode(record, index, id, entityName, entity);
|
|
98
|
+
}
|
|
99
|
+
const modified = this.mapping.modified === undefined ? undefined : selectOne(record, this.mapping.modified);
|
|
100
|
+
if (typeof modified === "string" && (this.state.modified === null || modified > this.state.modified)) {
|
|
101
|
+
this.state.modified = modified;
|
|
102
|
+
}
|
|
103
|
+
this.pending.push({ record, entity: entityName, id });
|
|
104
|
+
for (const em of entity.embedded ?? []) {
|
|
105
|
+
this.addRecords(select(record, em.at), em.entity);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Write a full record.
|
|
112
|
+
* @param record - the record
|
|
113
|
+
* @param index - its position
|
|
114
|
+
* @param id - its id
|
|
115
|
+
* @param entityName - its entity
|
|
116
|
+
* @param entity - the entity
|
|
117
|
+
*/
|
|
118
|
+
private addNode(record: unknown, index: number, id: string, entityName: string, entity: RestEntity): void {
|
|
119
|
+
const attrs: Record<string, unknown> = { labels: [entity.label ?? entityName] };
|
|
120
|
+
if (entity.fields === undefined) {
|
|
121
|
+
// without fields every top-level scalar is kept
|
|
122
|
+
for (const [k, v] of Object.entries(record as Record<string, unknown>)) {
|
|
123
|
+
if (
|
|
124
|
+
k !== "id" &&
|
|
125
|
+
k !== "labels" &&
|
|
126
|
+
(typeof v === "string" || typeof v === "number" || typeof v === "boolean")
|
|
127
|
+
) {
|
|
128
|
+
attrs[k] = v;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
for (const [name, selector] of Object.entries(entity.fields)) {
|
|
133
|
+
const v = fieldValue(record, selector, index);
|
|
134
|
+
if (v !== undefined) {
|
|
135
|
+
attrs[name] = v;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (this.state.stubs.has(id)) {
|
|
140
|
+
// the full record replaces a stub written earlier
|
|
141
|
+
attrs[SOURCE_STUB_ATTR] = false;
|
|
142
|
+
}
|
|
143
|
+
this.state.full.add(id);
|
|
144
|
+
this.out.nodes.push({ id, ...attrs });
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Make sure an edge end exists: a stub when no record of it was written and the caller does not
|
|
149
|
+
* hold it.
|
|
150
|
+
* @param id - the id
|
|
151
|
+
* @param entity - its entity, when known
|
|
152
|
+
*/
|
|
153
|
+
private end(id: string, entity: string | undefined): void {
|
|
154
|
+
const { full, stubs, known } = this.state;
|
|
155
|
+
if (full.has(id) || stubs.has(id) || known.has(id)) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
stubs.add(id);
|
|
159
|
+
this.out.nodes.push({
|
|
160
|
+
id,
|
|
161
|
+
[SOURCE_STUB_ATTR]: true,
|
|
162
|
+
...(entity === undefined ? {} : { [SOURCE_ENTITY_ATTR]: entity }),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Run one edge rule over a record.
|
|
168
|
+
* @param rule - the rule
|
|
169
|
+
* @param record - the record
|
|
170
|
+
* @param entityName - the record's entity
|
|
171
|
+
* @param recordId - the record's id (null for a container)
|
|
172
|
+
*/
|
|
173
|
+
private runRule(rule: RestEdgeRule, record: unknown, entityName: string, recordId: string | null): void {
|
|
174
|
+
const scopes = rule.each === undefined ? [record] : select(record, rule.each);
|
|
175
|
+
if ("pairs" in rule) {
|
|
176
|
+
this.runPairsRule(rule, scopes, entityName);
|
|
177
|
+
} else {
|
|
178
|
+
this.runLinkRule(rule, scopes, entityName, recordId);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Run a pairs rule: an edge between every two distinct ids in each scope.
|
|
184
|
+
* @param rule - the rule
|
|
185
|
+
* @param scopes - the scopes it runs over
|
|
186
|
+
* @param entityName - the record's entity
|
|
187
|
+
*/
|
|
188
|
+
private runPairsRule(
|
|
189
|
+
rule: Extract<RestEdgeRule, { pairs: string }>,
|
|
190
|
+
scopes: readonly unknown[],
|
|
191
|
+
entityName: string,
|
|
192
|
+
): void {
|
|
193
|
+
const entityOf = rule.entity ?? entityName;
|
|
194
|
+
const entity = this.mapping.entities[entityOf];
|
|
195
|
+
for (const scope of scopes) {
|
|
196
|
+
const ids = [...new Set(select(scope, rule.pairs).map((v) => idText(v, entity)))].filter(
|
|
197
|
+
(v): v is string => v !== null,
|
|
198
|
+
);
|
|
199
|
+
for (let i = 0; i < ids.length; i++) {
|
|
200
|
+
for (let j = i + 1; j < ids.length; j++) {
|
|
201
|
+
this.end(ids[i], entityOf);
|
|
202
|
+
this.end(ids[j], entityOf);
|
|
203
|
+
this.out.edges.push({ source: ids[i], target: ids[j], type: rule.type });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Run a from/to rule: an edge from the record (or a selected id) to each selected id.
|
|
211
|
+
* @param rule - the rule
|
|
212
|
+
* @param scopes - the scopes it runs over
|
|
213
|
+
* @param entityName - the record's entity
|
|
214
|
+
* @param recordId - the record's id (null for a container)
|
|
215
|
+
*/
|
|
216
|
+
private runLinkRule(
|
|
217
|
+
rule: Exclude<RestEdgeRule, { pairs: string }>,
|
|
218
|
+
scopes: readonly unknown[],
|
|
219
|
+
entityName: string,
|
|
220
|
+
recordId: string | null,
|
|
221
|
+
): void {
|
|
222
|
+
const own = this.mapping.entities[entityName];
|
|
223
|
+
const targetEntity = rule.entity === undefined ? own : this.mapping.entities[rule.entity];
|
|
224
|
+
for (const scope of scopes) {
|
|
225
|
+
const from = rule.from === undefined ? recordId : idText(selectOne(scope, rule.from), own);
|
|
226
|
+
if (from === null) {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
const tos = select(scope, rule.to)
|
|
230
|
+
.map((t) => idText(t, targetEntity))
|
|
231
|
+
.filter((v): v is string => v !== null);
|
|
232
|
+
for (const to of tos) {
|
|
233
|
+
this.end(from, rule.from === undefined ? entityName : undefined);
|
|
234
|
+
this.end(to, rule.entity);
|
|
235
|
+
this.out.edges.push({ ...edgeFields(rule.fields, scope), source: from, target: to, type: rule.type });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Run the edge rules of every record added.
|
|
242
|
+
* @returns the page
|
|
243
|
+
*/
|
|
244
|
+
finish(): PageRecords {
|
|
245
|
+
for (const { record, entity, id } of this.pending) {
|
|
246
|
+
for (const rule of this.mapping.entities[entity].edges ?? []) {
|
|
247
|
+
this.runRule(rule, record, entity, id);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
this.pending.length = 0;
|
|
251
|
+
return this.out;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* An edge's fields, read from its scope.
|
|
257
|
+
* @param fields - the rule's field selectors
|
|
258
|
+
* @param scope - the scope the edge came from
|
|
259
|
+
* @returns the fields that have a value
|
|
260
|
+
*/
|
|
261
|
+
function edgeFields(fields: Readonly<Record<string, string>> | undefined, scope: unknown): Record<string, unknown> {
|
|
262
|
+
const out: Record<string, unknown> = {};
|
|
263
|
+
for (const [name, selector] of Object.entries(fields ?? {})) {
|
|
264
|
+
const v = fieldValue(scope, selector, 0);
|
|
265
|
+
if (v !== undefined) {
|
|
266
|
+
out[name] = v;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return out;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* The nodes and edges of one page of records.
|
|
274
|
+
* @param mapping - the mapping
|
|
275
|
+
* @param groups - the page's records, by entity (a seed's records first)
|
|
276
|
+
* @param state - the load's state, updated
|
|
277
|
+
* @returns the nodes and edges
|
|
278
|
+
*/
|
|
279
|
+
export function toRecords(
|
|
280
|
+
mapping: RestMapping,
|
|
281
|
+
groups: readonly { readonly records: readonly unknown[]; readonly entity: string }[],
|
|
282
|
+
state: RecordState,
|
|
283
|
+
): PageRecords {
|
|
284
|
+
const writer = new PageWriter(mapping, state);
|
|
285
|
+
for (const g of groups) {
|
|
286
|
+
writer.addRecords(g.records, g.entity);
|
|
287
|
+
}
|
|
288
|
+
return writer.finish();
|
|
289
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A sample mapping: the resolved dependency graph of one package version from deps.dev
|
|
3
|
+
* (https://deps.dev). The body already holds a node array and an edge array whose ends are node
|
|
4
|
+
* positions, so the body is a container and `#` gives each package its position as its id.
|
|
5
|
+
* Catalog data for the `rest` source's samples.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { type RestMapping } from "../params.js";
|
|
9
|
+
|
|
10
|
+
/** The deps.dev dependencies mapping: `system` (npm, pypi, ...), `package` and `version`. */
|
|
11
|
+
export const DEPS_DEV_MAPPING: RestMapping = Object.freeze<RestMapping>({
|
|
12
|
+
version: 1,
|
|
13
|
+
endpoint: "https://api.deps.dev",
|
|
14
|
+
load: "dependencies",
|
|
15
|
+
directed: true,
|
|
16
|
+
requests: {
|
|
17
|
+
dependencies: {
|
|
18
|
+
path: "/v3/systems/{system}/packages/{package}/versions/{version}:dependencies",
|
|
19
|
+
records: ".",
|
|
20
|
+
entity: "graph",
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
entities: {
|
|
24
|
+
graph: {
|
|
25
|
+
id: "nodes",
|
|
26
|
+
node: false,
|
|
27
|
+
edges: [
|
|
28
|
+
{
|
|
29
|
+
each: "edges[]",
|
|
30
|
+
from: "fromNode",
|
|
31
|
+
to: "toNode",
|
|
32
|
+
type: "depends_on",
|
|
33
|
+
entity: "package",
|
|
34
|
+
fields: { requirement: "requirement" },
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
embedded: [{ at: "nodes[]", entity: "package" }],
|
|
38
|
+
},
|
|
39
|
+
package: {
|
|
40
|
+
id: "#",
|
|
41
|
+
fields: {
|
|
42
|
+
name: "versionKey.name",
|
|
43
|
+
version: "versionKey.version",
|
|
44
|
+
system: "versionKey.system",
|
|
45
|
+
relation: "relation",
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A sample mapping: STRING's functional partners of a protein (https://string-db.org). Each
|
|
3
|
+
* interaction record names both proteins, so both are embedded nodes and the record itself is only
|
|
4
|
+
* the edge. Catalog data for the `rest` source's samples.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { type RestMapping } from "../params.js";
|
|
8
|
+
|
|
9
|
+
/** The STRING network mapping: `identifiers`, `species` (NCBI taxon) and `add_nodes`. */
|
|
10
|
+
export const STRING_MAPPING: RestMapping = Object.freeze<RestMapping>({
|
|
11
|
+
version: 1,
|
|
12
|
+
endpoint: "https://string-db.org",
|
|
13
|
+
load: "network",
|
|
14
|
+
directed: false,
|
|
15
|
+
requests: {
|
|
16
|
+
network: {
|
|
17
|
+
path: "/api/json/network",
|
|
18
|
+
query: { identifiers: "{identifiers}", species: "{species}", add_nodes: "{add_nodes}" },
|
|
19
|
+
records: ".",
|
|
20
|
+
entity: "interaction",
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
entities: {
|
|
24
|
+
interaction: {
|
|
25
|
+
id: "stringId_A",
|
|
26
|
+
node: false,
|
|
27
|
+
edges: [
|
|
28
|
+
{
|
|
29
|
+
from: "stringId_A",
|
|
30
|
+
to: "stringId_B",
|
|
31
|
+
type: "interacts_with",
|
|
32
|
+
entity: "protein-b",
|
|
33
|
+
fields: { score: "score" },
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
embedded: [
|
|
37
|
+
{ at: ".", entity: "protein-a" },
|
|
38
|
+
{ at: ".", entity: "protein-b" },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
"protein-a": { id: "stringId_A", label: "protein", fields: { name: "preferredName_A" } },
|
|
42
|
+
"protein-b": { id: "stringId_B", label: "protein", fields: { name: "preferredName_B" } },
|
|
43
|
+
},
|
|
44
|
+
});
|