@graphty/graph-io 0.3.46 → 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.
Files changed (460) hide show
  1. package/dist/chunks/{approximations-wWjCRzKj.js → approximations-C2riR4NT.js} +2 -2
  2. package/dist/chunks/{approximations-wWjCRzKj.js.map → approximations-C2riR4NT.js.map} +1 -1
  3. package/dist/chunks/{block-DiGq58c3.js → block-Cu22ewuS.js} +92 -21
  4. package/dist/chunks/block-Cu22ewuS.js.map +1 -0
  5. package/dist/chunks/{choose--jM0yYCo.js → choose-Cdx6Enl2.js} +3 -3
  6. package/dist/chunks/{choose--jM0yYCo.js.map → choose-Cdx6Enl2.js.map} +1 -1
  7. package/dist/chunks/codes-CV_Bhcyi.js +153 -0
  8. package/dist/chunks/codes-CV_Bhcyi.js.map +1 -0
  9. package/dist/chunks/{constants-BKwqelYD.js → constants-D0LqcsLJ.js} +2 -2
  10. package/dist/chunks/{constants-BKwqelYD.js.map → constants-D0LqcsLJ.js.map} +1 -1
  11. package/dist/chunks/context-cgmmOxZ2.js +663 -0
  12. package/dist/chunks/context-cgmmOxZ2.js.map +1 -0
  13. package/dist/chunks/credentials-BiQsnMTb.js +347 -0
  14. package/dist/chunks/credentials-BiQsnMTb.js.map +1 -0
  15. package/dist/chunks/cx-export-BEeF6ymo.js +259 -0
  16. package/dist/chunks/cx-export-BEeF6ymo.js.map +1 -0
  17. package/dist/chunks/descriptor-BJ-W0Jd-.js +137 -0
  18. package/dist/chunks/descriptor-BJ-W0Jd-.js.map +1 -0
  19. package/dist/chunks/descriptor-C-YDhtsn.js +48 -0
  20. package/dist/chunks/descriptor-C-YDhtsn.js.map +1 -0
  21. package/dist/chunks/{emit-CwU8cUmG.js → emit-CD8xnY8s.js} +70 -10
  22. package/dist/chunks/emit-CD8xnY8s.js.map +1 -0
  23. package/dist/chunks/{escape-CgzxiYPg.js → escape-DH2Egt-l.js} +12 -12
  24. package/dist/chunks/{escape-CgzxiYPg.js.map → escape-DH2Egt-l.js.map} +1 -1
  25. package/dist/chunks/{export-BvqAXCKh.js → export-CZ7VRm4I.js} +53 -1443
  26. package/dist/chunks/export-CZ7VRm4I.js.map +1 -0
  27. package/dist/chunks/{exporter-DndFlGSa.js → exporter-BIdaoIgh.js} +7 -6
  28. package/dist/chunks/{exporter-DndFlGSa.js.map → exporter-BIdaoIgh.js.map} +1 -1
  29. package/dist/chunks/{exporter-CJgfhF-l.js → exporter-ChjL5fmP.js} +8 -7
  30. package/dist/chunks/{exporter-CJgfhF-l.js.map → exporter-ChjL5fmP.js.map} +1 -1
  31. package/dist/chunks/{exporter--Mk9gXCJ.js → exporter-Dcw7Ldtq.js} +6 -4
  32. package/dist/chunks/{exporter--Mk9gXCJ.js.map → exporter-Dcw7Ldtq.js.map} +1 -1
  33. package/dist/chunks/exporter-DtVU80Fa.js +1008 -0
  34. package/dist/chunks/exporter-DtVU80Fa.js.map +1 -0
  35. package/dist/chunks/{exporter-CrDWIyiq.js → exporter-bxxjOrDZ.js} +11 -9
  36. package/dist/chunks/{exporter-CrDWIyiq.js.map → exporter-bxxjOrDZ.js.map} +1 -1
  37. package/dist/chunks/format-BMS-1Nxb.js +64 -0
  38. package/dist/chunks/format-BMS-1Nxb.js.map +1 -0
  39. package/dist/chunks/{generic-Dq1ntt9q.js → generic-CP6YD34u.js} +4 -4
  40. package/dist/chunks/{generic-Dq1ntt9q.js.map → generic-CP6YD34u.js.map} +1 -1
  41. package/dist/chunks/{importer-DiZRmOQG.js → importer-B87_fmVx.js} +13 -17
  42. package/dist/chunks/importer-B87_fmVx.js.map +1 -0
  43. package/dist/chunks/{importer-BSvfrX_h.js → importer-Bji2MeWr.js} +18 -1014
  44. package/dist/chunks/importer-Bji2MeWr.js.map +1 -0
  45. package/dist/chunks/{importer-COTK9Tsl.js → importer-CB_zV5_L.js} +14 -11
  46. package/dist/chunks/importer-CB_zV5_L.js.map +1 -0
  47. package/dist/chunks/{importer-e6LGpqHB.js → importer-CVT-JyDE.js} +12 -9
  48. package/dist/chunks/importer-CVT-JyDE.js.map +1 -0
  49. package/dist/chunks/{importer-yh_aBCU6.js → importer-Cyy6UseH.js} +7 -6
  50. package/dist/chunks/{importer-yh_aBCU6.js.map → importer-Cyy6UseH.js.map} +1 -1
  51. package/dist/chunks/{importer-iFYPEKaJ.js → importer-DPZDN40-.js} +14 -10
  52. package/dist/chunks/{importer-iFYPEKaJ.js.map → importer-DPZDN40-.js.map} +1 -1
  53. package/dist/chunks/{importer-CMmeMWlC.js → importer-e3huMZbm.js} +8 -260
  54. package/dist/chunks/importer-e3huMZbm.js.map +1 -0
  55. package/dist/chunks/input-Ccg9I22A.js +1397 -0
  56. package/dist/chunks/input-Ccg9I22A.js.map +1 -0
  57. package/dist/chunks/{json-elements-DJZRZ6jd.js → json-elements-By172SVq.js} +4 -4
  58. package/dist/chunks/{json-elements-DJZRZ6jd.js.map → json-elements-By172SVq.js.map} +1 -1
  59. package/dist/chunks/{lexicon-CT69Kd87.js → lexicon-u2SI5xcx.js} +19 -5
  60. package/dist/chunks/lexicon-u2SI5xcx.js.map +1 -0
  61. package/dist/chunks/{ontology-export-G4MqRdux.js → ontology-export-BwgMyuF0.js} +4 -3
  62. package/dist/chunks/{ontology-export-G4MqRdux.js.map → ontology-export-BwgMyuF0.js.map} +1 -1
  63. package/dist/chunks/{records-CiaWZrFH.js → records-Cgvxz-Vx.js} +2 -2
  64. package/dist/chunks/{records-CiaWZrFH.js.map → records-Cgvxz-Vx.js.map} +1 -1
  65. package/dist/chunks/{format-BpQBx8MZ.js → report-CgdsL9Hb.js} +72 -129
  66. package/dist/chunks/report-CgdsL9Hb.js.map +1 -0
  67. package/dist/chunks/sigv4-LkAzsLAu.js +247 -0
  68. package/dist/chunks/sigv4-LkAzsLAu.js.map +1 -0
  69. package/dist/chunks/{styles-BQnsga7p.js → styles-CaABMoO1.js} +76 -43
  70. package/dist/chunks/styles-CaABMoO1.js.map +1 -0
  71. package/dist/chunks/{styles-D3fRphrO.js → styles-P_gmFAOi.js} +101 -21
  72. package/dist/chunks/styles-P_gmFAOi.js.map +1 -0
  73. package/dist/chunks/{styles-yed-BF5x3_Y5.js → styles-yed-Cs1nmrjn.js} +60 -20
  74. package/dist/chunks/styles-yed-Cs1nmrjn.js.map +1 -0
  75. package/dist/chunks/{text-CzJNFOS9.js → text-BuKQVMz2.js} +2 -2
  76. package/dist/chunks/{text-CzJNFOS9.js.map → text-BuKQVMz2.js.map} +1 -1
  77. package/dist/chunks/{writer-DMKvthQE.js → writer-DvHTl36J.js} +5 -4
  78. package/dist/chunks/writer-DvHTl36J.js.map +1 -0
  79. package/dist/csv.js +7 -5
  80. package/dist/csv.js.map +1 -1
  81. package/dist/cx.js +5 -4
  82. package/dist/cx.js.map +1 -1
  83. package/dist/cx2.js +2 -2
  84. package/dist/cys.js +1 -1
  85. package/dist/dot.js +2 -2
  86. package/dist/gexf.js +7 -5
  87. package/dist/gexf.js.map +1 -1
  88. package/dist/gml.js +16 -13
  89. package/dist/gml.js.map +1 -1
  90. package/dist/graph-io.js +1181 -224
  91. package/dist/graph-io.js.map +1 -1
  92. package/dist/graphml.js +3 -3
  93. package/dist/json.js +1 -1
  94. package/dist/neo4j.js +6 -4
  95. package/dist/neo4j.js.map +1 -1
  96. package/dist/obo.js +1 -1
  97. package/dist/pajek.js +1 -1
  98. package/dist/sources-cypher.d.ts +1 -0
  99. package/dist/sources-cypher.js +1236 -0
  100. package/dist/sources-cypher.js.map +1 -0
  101. package/dist/sources-ndex.d.ts +1 -0
  102. package/dist/sources-ndex.js +278 -0
  103. package/dist/sources-ndex.js.map +1 -0
  104. package/dist/sources-rest.d.ts +1 -0
  105. package/dist/sources-rest.js +1367 -0
  106. package/dist/sources-rest.js.map +1 -0
  107. package/dist/src/common/report.d.ts +6 -3
  108. package/dist/src/common/report.d.ts.map +1 -1
  109. package/dist/src/common/report.js +15 -9
  110. package/dist/src/common/report.js.map +1 -1
  111. package/dist/src/formats/cx/styles.d.ts.map +1 -1
  112. package/dist/src/formats/cx/styles.js +1 -0
  113. package/dist/src/formats/cx/styles.js.map +1 -1
  114. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  115. package/dist/src/formats/dot/styles.js +3 -1
  116. package/dist/src/formats/dot/styles.js.map +1 -1
  117. package/dist/src/formats/gexf/styles.d.ts +29 -12
  118. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  119. package/dist/src/formats/gexf/styles.js +160 -31
  120. package/dist/src/formats/gexf/styles.js.map +1 -1
  121. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  122. package/dist/src/formats/gml/styles.js +5 -4
  123. package/dist/src/formats/gml/styles.js.map +1 -1
  124. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  125. package/dist/src/formats/graphml/styles-plain.js +3 -3
  126. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  127. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  128. package/dist/src/formats/graphml/styles-yed.js +89 -19
  129. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  130. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  131. package/dist/src/formats/pajek/styles.js +1 -0
  132. package/dist/src/formats/pajek/styles.js.map +1 -1
  133. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  134. package/dist/src/formats/xgmml/styles.js +1 -0
  135. package/dist/src/formats/xgmml/styles.js.map +1 -1
  136. package/dist/src/index.d.ts +8 -1
  137. package/dist/src/index.d.ts.map +1 -1
  138. package/dist/src/index.js +9 -1
  139. package/dist/src/index.js.map +1 -1
  140. package/dist/src/registry.d.ts +173 -1
  141. package/dist/src/registry.d.ts.map +1 -1
  142. package/dist/src/registry.js +196 -1
  143. package/dist/src/registry.js.map +1 -1
  144. package/dist/src/sources/builtins.d.ts +11 -0
  145. package/dist/src/sources/builtins.d.ts.map +1 -0
  146. package/dist/src/sources/builtins.js +47 -0
  147. package/dist/src/sources/builtins.js.map +1 -0
  148. package/dist/src/sources/codes.d.ts +230 -0
  149. package/dist/src/sources/codes.d.ts.map +1 -0
  150. package/dist/src/sources/codes.js +58 -0
  151. package/dist/src/sources/codes.js.map +1 -0
  152. package/dist/src/sources/context.d.ts +112 -0
  153. package/dist/src/sources/context.d.ts.map +1 -0
  154. package/dist/src/sources/context.js +739 -0
  155. package/dist/src/sources/context.js.map +1 -0
  156. package/dist/src/sources/credentials.d.ts +179 -0
  157. package/dist/src/sources/credentials.d.ts.map +1 -0
  158. package/dist/src/sources/credentials.js +301 -0
  159. package/dist/src/sources/credentials.js.map +1 -0
  160. package/dist/src/sources/cypher/descriptor.d.ts +21 -0
  161. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -0
  162. package/dist/src/sources/cypher/descriptor.js +119 -0
  163. package/dist/src/sources/cypher/descriptor.js.map +1 -0
  164. package/dist/src/sources/cypher/flatten.d.ts +72 -0
  165. package/dist/src/sources/cypher/flatten.d.ts.map +1 -0
  166. package/dist/src/sources/cypher/flatten.js +279 -0
  167. package/dist/src/sources/cypher/flatten.js.map +1 -0
  168. package/dist/src/sources/cypher/index.d.ts +33 -0
  169. package/dist/src/sources/cypher/index.d.ts.map +1 -0
  170. package/dist/src/sources/cypher/index.js +405 -0
  171. package/dist/src/sources/cypher/index.js.map +1 -0
  172. package/dist/src/sources/cypher/params.d.ts +40 -0
  173. package/dist/src/sources/cypher/params.d.ts.map +1 -0
  174. package/dist/src/sources/cypher/params.js +6 -0
  175. package/dist/src/sources/cypher/params.js.map +1 -0
  176. package/dist/src/sources/cypher/profiles.d.ts +44 -0
  177. package/dist/src/sources/cypher/profiles.d.ts.map +1 -0
  178. package/dist/src/sources/cypher/profiles.js +61 -0
  179. package/dist/src/sources/cypher/profiles.js.map +1 -0
  180. package/dist/src/sources/cypher/query-builder.d.ts +106 -0
  181. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -0
  182. package/dist/src/sources/cypher/query-builder.js +236 -0
  183. package/dist/src/sources/cypher/query-builder.js.map +1 -0
  184. package/dist/src/sources/cypher/transports/bolt.d.ts +21 -0
  185. package/dist/src/sources/cypher/transports/bolt.d.ts.map +1 -0
  186. package/dist/src/sources/cypher/transports/bolt.js +185 -0
  187. package/dist/src/sources/cypher/transports/bolt.js.map +1 -0
  188. package/dist/src/sources/cypher/transports/neptune-analytics.d.ts +15 -0
  189. package/dist/src/sources/cypher/transports/neptune-analytics.d.ts.map +1 -0
  190. package/dist/src/sources/cypher/transports/neptune-analytics.js +38 -0
  191. package/dist/src/sources/cypher/transports/neptune-analytics.js.map +1 -0
  192. package/dist/src/sources/cypher/transports/neptune-https.d.ts +31 -0
  193. package/dist/src/sources/cypher/transports/neptune-https.d.ts.map +1 -0
  194. package/dist/src/sources/cypher/transports/neptune-https.js +104 -0
  195. package/dist/src/sources/cypher/transports/neptune-https.js.map +1 -0
  196. package/dist/src/sources/cypher/transports/query-api.d.ts +14 -0
  197. package/dist/src/sources/cypher/transports/query-api.d.ts.map +1 -0
  198. package/dist/src/sources/cypher/transports/query-api.js +80 -0
  199. package/dist/src/sources/cypher/transports/query-api.js.map +1 -0
  200. package/dist/src/sources/cypher/transports/transport.d.ts +78 -0
  201. package/dist/src/sources/cypher/transports/transport.d.ts.map +1 -0
  202. package/dist/src/sources/cypher/transports/transport.js +77 -0
  203. package/dist/src/sources/cypher/transports/transport.js.map +1 -0
  204. package/dist/src/sources/cypher/types-map.d.ts +91 -0
  205. package/dist/src/sources/cypher/types-map.d.ts.map +1 -0
  206. package/dist/src/sources/cypher/types-map.js +306 -0
  207. package/dist/src/sources/cypher/types-map.js.map +1 -0
  208. package/dist/src/sources/define.d.ts +47 -0
  209. package/dist/src/sources/define.d.ts.map +1 -0
  210. package/dist/src/sources/define.js +173 -0
  211. package/dist/src/sources/define.js.map +1 -0
  212. package/dist/src/sources/fail.d.ts +33 -0
  213. package/dist/src/sources/fail.d.ts.map +1 -0
  214. package/dist/src/sources/fail.js +49 -0
  215. package/dist/src/sources/fail.js.map +1 -0
  216. package/dist/src/sources/ids.d.ts +64 -0
  217. package/dist/src/sources/ids.d.ts.map +1 -0
  218. package/dist/src/sources/ids.js +64 -0
  219. package/dist/src/sources/ids.js.map +1 -0
  220. package/dist/src/sources/ndex/client.d.ts +31 -0
  221. package/dist/src/sources/ndex/client.d.ts.map +1 -0
  222. package/dist/src/sources/ndex/client.js +90 -0
  223. package/dist/src/sources/ndex/client.js.map +1 -0
  224. package/dist/src/sources/ndex/descriptor.d.ts +10 -0
  225. package/dist/src/sources/ndex/descriptor.d.ts.map +1 -0
  226. package/dist/src/sources/ndex/descriptor.js +55 -0
  227. package/dist/src/sources/ndex/descriptor.js.map +1 -0
  228. package/dist/src/sources/ndex/expand.d.ts +20 -0
  229. package/dist/src/sources/ndex/expand.d.ts.map +1 -0
  230. package/dist/src/sources/ndex/expand.js +87 -0
  231. package/dist/src/sources/ndex/expand.js.map +1 -0
  232. package/dist/src/sources/ndex/index.d.ts +25 -0
  233. package/dist/src/sources/ndex/index.d.ts.map +1 -0
  234. package/dist/src/sources/ndex/index.js +191 -0
  235. package/dist/src/sources/ndex/index.js.map +1 -0
  236. package/dist/src/sources/ndex/params.d.ts +17 -0
  237. package/dist/src/sources/ndex/params.d.ts.map +1 -0
  238. package/dist/src/sources/ndex/params.js +6 -0
  239. package/dist/src/sources/ndex/params.js.map +1 -0
  240. package/dist/src/sources/ndex/share-url.d.ts +40 -0
  241. package/dist/src/sources/ndex/share-url.d.ts.map +1 -0
  242. package/dist/src/sources/ndex/share-url.js +64 -0
  243. package/dist/src/sources/ndex/share-url.js.map +1 -0
  244. package/dist/src/sources/params.d.ts +28 -0
  245. package/dist/src/sources/params.d.ts.map +1 -0
  246. package/dist/src/sources/params.js +6 -0
  247. package/dist/src/sources/params.js.map +1 -0
  248. package/dist/src/sources/registry.d.ts +118 -0
  249. package/dist/src/sources/registry.d.ts.map +1 -0
  250. package/dist/src/sources/registry.js +193 -0
  251. package/dist/src/sources/registry.js.map +1 -0
  252. package/dist/src/sources/rest/descriptor.d.ts +16 -0
  253. package/dist/src/sources/rest/descriptor.d.ts.map +1 -0
  254. package/dist/src/sources/rest/descriptor.js +71 -0
  255. package/dist/src/sources/rest/descriptor.js.map +1 -0
  256. package/dist/src/sources/rest/index.d.ts +14 -0
  257. package/dist/src/sources/rest/index.d.ts.map +1 -0
  258. package/dist/src/sources/rest/index.js +13 -0
  259. package/dist/src/sources/rest/index.js.map +1 -0
  260. package/dist/src/sources/rest/mapping.d.ts +30 -0
  261. package/dist/src/sources/rest/mapping.d.ts.map +1 -0
  262. package/dist/src/sources/rest/mapping.js +362 -0
  263. package/dist/src/sources/rest/mapping.js.map +1 -0
  264. package/dist/src/sources/rest/openalex.d.ts +27 -0
  265. package/dist/src/sources/rest/openalex.d.ts.map +1 -0
  266. package/dist/src/sources/rest/openalex.js +269 -0
  267. package/dist/src/sources/rest/openalex.js.map +1 -0
  268. package/dist/src/sources/rest/paging.d.ts +53 -0
  269. package/dist/src/sources/rest/paging.d.ts.map +1 -0
  270. package/dist/src/sources/rest/paging.js +138 -0
  271. package/dist/src/sources/rest/paging.js.map +1 -0
  272. package/dist/src/sources/rest/params.d.ts +216 -0
  273. package/dist/src/sources/rest/params.d.ts.map +1 -0
  274. package/dist/src/sources/rest/params.js +7 -0
  275. package/dist/src/sources/rest/params.js.map +1 -0
  276. package/dist/src/sources/rest/records.d.ts +41 -0
  277. package/dist/src/sources/rest/records.d.ts.map +1 -0
  278. package/dist/src/sources/rest/records.js +240 -0
  279. package/dist/src/sources/rest/records.js.map +1 -0
  280. package/dist/src/sources/rest/samples/deps-dev.d.ts +10 -0
  281. package/dist/src/sources/rest/samples/deps-dev.d.ts.map +1 -0
  282. package/dist/src/sources/rest/samples/deps-dev.js +47 -0
  283. package/dist/src/sources/rest/samples/deps-dev.js.map +1 -0
  284. package/dist/src/sources/rest/samples/string.d.ts +9 -0
  285. package/dist/src/sources/rest/samples/string.d.ts.map +1 -0
  286. package/dist/src/sources/rest/samples/string.js +42 -0
  287. package/dist/src/sources/rest/samples/string.js.map +1 -0
  288. package/dist/src/sources/rest/selectors.d.ts +41 -0
  289. package/dist/src/sources/rest/selectors.d.ts.map +1 -0
  290. package/dist/src/sources/rest/selectors.js +81 -0
  291. package/dist/src/sources/rest/selectors.js.map +1 -0
  292. package/dist/src/sources/rest/source.d.ts +67 -0
  293. package/dist/src/sources/rest/source.d.ts.map +1 -0
  294. package/dist/src/sources/rest/source.js +635 -0
  295. package/dist/src/sources/rest/source.js.map +1 -0
  296. package/dist/src/sources/rest/templates.d.ts +38 -0
  297. package/dist/src/sources/rest/templates.d.ts.map +1 -0
  298. package/dist/src/sources/rest/templates.js +125 -0
  299. package/dist/src/sources/rest/templates.js.map +1 -0
  300. package/dist/src/sources/run.d.ts +93 -0
  301. package/dist/src/sources/run.d.ts.map +1 -0
  302. package/dist/src/sources/run.js +673 -0
  303. package/dist/src/sources/run.js.map +1 -0
  304. package/dist/src/sources/sha256.d.ts +12 -0
  305. package/dist/src/sources/sha256.d.ts.map +1 -0
  306. package/dist/src/sources/sha256.js +95 -0
  307. package/dist/src/sources/sha256.js.map +1 -0
  308. package/dist/src/sources/sigv4.d.ts +24 -0
  309. package/dist/src/sources/sigv4.d.ts.map +1 -0
  310. package/dist/src/sources/sigv4.js +182 -0
  311. package/dist/src/sources/sigv4.js.map +1 -0
  312. package/dist/src/sources/testing.d.ts +96 -0
  313. package/dist/src/sources/testing.d.ts.map +1 -0
  314. package/dist/src/sources/testing.js +138 -0
  315. package/dist/src/sources/testing.js.map +1 -0
  316. package/dist/src/sources/types.d.ts +665 -0
  317. package/dist/src/sources/types.d.ts.map +1 -0
  318. package/dist/src/sources/types.js +10 -0
  319. package/dist/src/sources/types.js.map +1 -0
  320. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  321. package/dist/src/styles/canon/enums.js +1 -0
  322. package/dist/src/styles/canon/enums.js.map +1 -1
  323. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  324. package/dist/src/styles/cyjs/cascade.js +68 -2
  325. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  326. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  327. package/dist/src/styles/cyjs/defaults-table.js +2 -0
  328. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  329. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  330. package/dist/src/styles/cyjs/emit.js +18 -7
  331. package/dist/src/styles/cyjs/emit.js.map +1 -1
  332. package/dist/src/styles/cyjs/mappers.d.ts +4 -1
  333. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  334. package/dist/src/styles/cyjs/mappers.js +2 -0
  335. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  336. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  337. package/dist/src/styles/cytoscape/emit.js +59 -7
  338. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  339. package/dist/src/styles/cytoscape/lexicon.d.ts +6 -0
  340. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  341. package/dist/src/styles/cytoscape/lexicon.js +26 -2
  342. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  343. package/dist/src/styles/cytoscape/resolve.d.ts +4 -1
  344. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  345. package/dist/src/styles/cytoscape/resolve.js +10 -6
  346. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  347. package/dist/src/styles/cytoscape/translate.d.ts.map +1 -1
  348. package/dist/src/styles/cytoscape/translate.js +10 -10
  349. package/dist/src/styles/cytoscape/translate.js.map +1 -1
  350. package/dist/src/styles/defaults.d.ts +30 -0
  351. package/dist/src/styles/defaults.d.ts.map +1 -1
  352. package/dist/src/styles/defaults.js +45 -4
  353. package/dist/src/styles/defaults.js.map +1 -1
  354. package/dist/src/styles/io/block.d.ts.map +1 -1
  355. package/dist/src/styles/io/block.js +9 -0
  356. package/dist/src/styles/io/block.js.map +1 -1
  357. package/dist/src/styles/io/writer.d.ts.map +1 -1
  358. package/dist/src/styles/io/writer.js +7 -3
  359. package/dist/src/styles/io/writer.js.map +1 -1
  360. package/dist/src/styles/plan/resolve.d.ts +2 -1
  361. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  362. package/dist/src/styles/plan/resolve.js +13 -2
  363. package/dist/src/styles/plan/resolve.js.map +1 -1
  364. package/dist/src/styles/types.d.ts +19 -2
  365. package/dist/src/styles/types.d.ts.map +1 -1
  366. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  367. package/dist/src/styles/vocabulary.js +15 -1
  368. package/dist/src/styles/vocabulary.js.map +1 -1
  369. package/dist/src/types.d.ts +19 -5
  370. package/dist/src/types.d.ts.map +1 -1
  371. package/dist/src/types.js.map +1 -1
  372. package/dist/styles.js +11 -11
  373. package/dist/xgmml.js +3 -3
  374. package/docs/samples/people.json +6 -0
  375. package/package.json +29 -4
  376. package/src/common/report.ts +27 -7
  377. package/src/formats/cx/styles.ts +1 -0
  378. package/src/formats/dot/styles.ts +3 -1
  379. package/src/formats/gexf/styles.ts +185 -37
  380. package/src/formats/gml/styles.ts +5 -4
  381. package/src/formats/graphml/styles-plain.ts +3 -9
  382. package/src/formats/graphml/styles-yed.ts +93 -20
  383. package/src/formats/pajek/styles.ts +1 -0
  384. package/src/formats/xgmml/styles.ts +1 -0
  385. package/src/index.ts +90 -0
  386. package/src/registry.ts +326 -1
  387. package/src/sources/builtins.ts +56 -0
  388. package/src/sources/codes.ts +235 -0
  389. package/src/sources/context.ts +893 -0
  390. package/src/sources/credentials.ts +409 -0
  391. package/src/sources/cypher/descriptor.ts +125 -0
  392. package/src/sources/cypher/flatten.ts +323 -0
  393. package/src/sources/cypher/index.ts +498 -0
  394. package/src/sources/cypher/params.ts +41 -0
  395. package/src/sources/cypher/profiles.ts +78 -0
  396. package/src/sources/cypher/query-builder.ts +294 -0
  397. package/src/sources/cypher/transports/bolt.ts +228 -0
  398. package/src/sources/cypher/transports/neptune-analytics.ts +41 -0
  399. package/src/sources/cypher/transports/neptune-https.ts +122 -0
  400. package/src/sources/cypher/transports/query-api.ts +100 -0
  401. package/src/sources/cypher/transports/transport.ts +139 -0
  402. package/src/sources/cypher/types-map.ts +418 -0
  403. package/src/sources/define.ts +195 -0
  404. package/src/sources/fail.ts +70 -0
  405. package/src/sources/ids.ts +74 -0
  406. package/src/sources/ndex/client.ts +102 -0
  407. package/src/sources/ndex/descriptor.ts +64 -0
  408. package/src/sources/ndex/expand.ts +100 -0
  409. package/src/sources/ndex/index.ts +235 -0
  410. package/src/sources/ndex/params.ts +17 -0
  411. package/src/sources/ndex/share-url.ts +84 -0
  412. package/src/sources/params.ts +29 -0
  413. package/src/sources/registry.ts +325 -0
  414. package/src/sources/rest/descriptor.ts +74 -0
  415. package/src/sources/rest/index.ts +22 -0
  416. package/src/sources/rest/mapping.ts +401 -0
  417. package/src/sources/rest/openalex.ts +288 -0
  418. package/src/sources/rest/paging.ts +180 -0
  419. package/src/sources/rest/params.ts +243 -0
  420. package/src/sources/rest/records.ts +289 -0
  421. package/src/sources/rest/samples/deps-dev.ts +49 -0
  422. package/src/sources/rest/samples/string.ts +44 -0
  423. package/src/sources/rest/selectors.ts +91 -0
  424. package/src/sources/rest/source.ts +760 -0
  425. package/src/sources/rest/templates.ts +151 -0
  426. package/src/sources/run.ts +793 -0
  427. package/src/sources/sha256.ts +99 -0
  428. package/src/sources/sigv4.ts +207 -0
  429. package/src/sources/testing.ts +210 -0
  430. package/src/sources/types.ts +741 -0
  431. package/src/styles/canon/enums.ts +1 -0
  432. package/src/styles/cyjs/cascade.ts +81 -2
  433. package/src/styles/cyjs/defaults-table.ts +2 -0
  434. package/src/styles/cyjs/emit.ts +18 -7
  435. package/src/styles/cyjs/mappers.ts +6 -1
  436. package/src/styles/cytoscape/emit.ts +61 -7
  437. package/src/styles/cytoscape/lexicon.ts +28 -2
  438. package/src/styles/cytoscape/resolve.ts +22 -6
  439. package/src/styles/cytoscape/translate.ts +11 -11
  440. package/src/styles/defaults.ts +93 -4
  441. package/src/styles/io/block.ts +10 -0
  442. package/src/styles/io/writer.ts +8 -3
  443. package/src/styles/plan/resolve.ts +14 -2
  444. package/src/styles/types.ts +28 -2
  445. package/src/styles/vocabulary.ts +15 -1
  446. package/src/types.ts +19 -5
  447. package/dist/chunks/block-DiGq58c3.js.map +0 -1
  448. package/dist/chunks/emit-CwU8cUmG.js.map +0 -1
  449. package/dist/chunks/export-BvqAXCKh.js.map +0 -1
  450. package/dist/chunks/format-BpQBx8MZ.js.map +0 -1
  451. package/dist/chunks/importer-BSvfrX_h.js.map +0 -1
  452. package/dist/chunks/importer-CMmeMWlC.js.map +0 -1
  453. package/dist/chunks/importer-COTK9Tsl.js.map +0 -1
  454. package/dist/chunks/importer-DiZRmOQG.js.map +0 -1
  455. package/dist/chunks/importer-e6LGpqHB.js.map +0 -1
  456. package/dist/chunks/lexicon-CT69Kd87.js.map +0 -1
  457. package/dist/chunks/styles-BQnsga7p.js.map +0 -1
  458. package/dist/chunks/styles-D3fRphrO.js.map +0 -1
  459. package/dist/chunks/styles-yed-BF5x3_Y5.js.map +0 -1
  460. package/dist/chunks/writer-DMKvthQE.js.map +0 -1
@@ -0,0 +1,74 @@
1
+ /**
2
+ * The descriptors of the REST mapping source and its `openalex` preset: catalog data, available
3
+ * without loading the sources' code.
4
+ */
5
+
6
+ import { type SourceDescriptor } from "../types.js";
7
+ import { DEPS_DEV_MAPPING } from "./samples/deps-dev.js";
8
+ import { STRING_MAPPING } from "./samples/string.js";
9
+
10
+ /**
11
+ * The descriptor of the generic `rest` source. Experimental.
12
+ * @category Network sources
13
+ */
14
+ export const REST_DESCRIPTOR: SourceDescriptor = Object.freeze({
15
+ plainName: "REST API",
16
+ kind: "rest",
17
+ version: 1,
18
+ auth: ["bearer", "api-key"],
19
+ authRequired: "optional",
20
+ params: [{ name: "mapping", plainName: "Mapping", type: "text", required: true }],
21
+ samples: [
22
+ {
23
+ id: "string-tp53",
24
+ plainName: "STRING: TP53's functional partners",
25
+ params: { mapping: STRING_MAPPING, identifiers: "TP53", species: "9606", add_nodes: "20" },
26
+ endpoint: STRING_MAPPING.endpoint,
27
+ counts: { nodes: 21, edges: 113 },
28
+ },
29
+ {
30
+ id: "deps-dev-webpack",
31
+ plainName: "deps.dev: webpack 5.90.0",
32
+ params: { mapping: DEPS_DEV_MAPPING, system: "npm", package: "webpack", version: "5.90.0" },
33
+ endpoint: DEPS_DEV_MAPPING.endpoint,
34
+ counts: { nodes: 84, edges: 121 },
35
+ },
36
+ ],
37
+ });
38
+
39
+ /**
40
+ * The descriptor of the `openalex` preset. Experimental.
41
+ * @category Network sources
42
+ */
43
+ export const OPENALEX_DESCRIPTOR: SourceDescriptor = Object.freeze({
44
+ plainName: "OpenAlex",
45
+ kind: "rest",
46
+ version: 1,
47
+ defaultEndpoint: "https://api.openalex.org",
48
+ auth: ["api-key"],
49
+ authRequired: "optional",
50
+ rateLimit: { requests: 10, perMs: 1000 },
51
+ params: [
52
+ { name: "work", plainName: "Work", type: "string" },
53
+ { name: "author", plainName: "Author", type: "string" },
54
+ {
55
+ name: "graph",
56
+ plainName: "Graph",
57
+ type: "enum",
58
+ default: "citation",
59
+ values: [
60
+ { value: "citation", label: "Citations" },
61
+ { value: "coauthorship", label: "Co-authors" },
62
+ ],
63
+ },
64
+ { name: "include", plainName: "Include", type: "string", advanced: true },
65
+ ],
66
+ samples: [
67
+ {
68
+ id: "openalex-watts-strogatz",
69
+ plainName: "Watts-Strogatz paper's citations",
70
+ params: { work: "W2112090702" },
71
+ whole: false,
72
+ },
73
+ ],
74
+ });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * `@graphty/graph-io/sources/rest`: the REST mapping source, `restSource()` for turning a mapping
3
+ * into a source of its own, and the `openalex` preset. Experimental: the mapping format carries
4
+ * `version: 1`.
5
+ * @module @graphty/graph-io/sources/rest
6
+ */
7
+
8
+ export { OPENALEX_DESCRIPTOR, REST_DESCRIPTOR } from "./descriptor.js";
9
+ export { checkRestMapping, type RestMappingIssue, type RestMappingIssueCode } from "./mapping.js";
10
+ export { OPENALEX_MAPPING, openalexSource } from "./openalex.js";
11
+ export {
12
+ type OpenAlexParams,
13
+ type RestEdgeRule,
14
+ type RestEntity,
15
+ type RestMapping,
16
+ type RestPaging,
17
+ type RestParams,
18
+ type RestRequest,
19
+ } from "./params.js";
20
+ export { DEPS_DEV_MAPPING } from "./samples/deps-dev.js";
21
+ export { STRING_MAPPING } from "./samples/string.js";
22
+ export { restMappingSource, restSource, type RestSourceInfo } from "./source.js";
@@ -0,0 +1,401 @@
1
+ /**
2
+ * Checking a REST mapping before it runs (design section 13.2). A mapping is JSON data, typed into
3
+ * a form or read from a project file, so every field is checked and every problem is a coded
4
+ * issue naming where it is.
5
+ */
6
+
7
+ import { type RestEdgeRule, type RestEntity, type RestMapping, type RestRequest } from "./params.js";
8
+ import { parseSelector } from "./selectors.js";
9
+ import { templateNames } from "./templates.js";
10
+
11
+ /**
12
+ * What is wrong with one field of a mapping. Open union.
13
+ * @category Network sources
14
+ */
15
+ export type RestMappingIssueCode =
16
+ | "version" // version is not 1
17
+ | "endpoint" // not an http(s) URL, or one holding a user, query or fragment
18
+ | "missing" // a required field is absent or of the wrong type
19
+ | "unknown-request" // names a request the mapping lacks
20
+ | "unknown-entity" // names an entity the mapping lacks
21
+ | "selector" // not a selector
22
+ | "template" // malformed braces or slot names
23
+ | "paging" // an unknown paging style or a bad paging field
24
+ | "batch" // batch.max is not a positive integer, or join is not a string
25
+ | "number" // not a positive number
26
+ | (string & {}); // NOSONAR(S4335): the open-union idiom keeps the listed codes in editor completion
27
+
28
+ /**
29
+ * One problem `checkRestMapping` found. Experimental.
30
+ * @category Network sources
31
+ */
32
+ export interface RestMappingIssue {
33
+ /** What is wrong. */
34
+ readonly code: RestMappingIssueCode;
35
+ /** Where, as a dotted path into the mapping (`requests.citing.paging.next`). */
36
+ readonly at: string;
37
+ }
38
+
39
+ /** The checks' accumulator. */
40
+ type Push = (code: RestMappingIssueCode, at: string) => void;
41
+
42
+ /**
43
+ * Whether a value is a plain object.
44
+ * @param v - the value
45
+ * @returns true for an object that is not an array
46
+ */
47
+ function isObject(v: unknown): v is Record<string, unknown> {
48
+ return typeof v === "object" && v !== null && !Array.isArray(v);
49
+ }
50
+
51
+ /**
52
+ * Check a selector field.
53
+ * @param value - the field
54
+ * @param at - where it is
55
+ * @param push - the accumulator
56
+ * @param required - whether it must be present
57
+ * @param index - whether `#` (the record's position) is allowed
58
+ */
59
+ function checkSelector(value: unknown, at: string, push: Push, required: boolean, index = false): void {
60
+ if (value === undefined && !required) {
61
+ return;
62
+ }
63
+ if (typeof value !== "string") {
64
+ push("missing", at);
65
+ } else if (!(index && value === "#") && parseSelector(value) === null) {
66
+ push("selector", at);
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Check a template field.
72
+ * @param value - the field
73
+ * @param at - where it is
74
+ * @param push - the accumulator
75
+ */
76
+ function checkTemplate(value: unknown, at: string, push: Push): void {
77
+ if (typeof value !== "string") {
78
+ push("missing", at);
79
+ } else if (templateNames(value) === null) {
80
+ push("template", at);
81
+ }
82
+ }
83
+
84
+ /**
85
+ * Check a request's query templates.
86
+ * @param query - the query field
87
+ * @param at - where the request is
88
+ * @param push - the accumulator
89
+ */
90
+ function checkQuery(query: RestRequest["query"], at: string, push: Push): void {
91
+ if (query === undefined) {
92
+ return;
93
+ }
94
+ if (!isObject(query)) {
95
+ push("missing", `${at}.query`);
96
+ return;
97
+ }
98
+ for (const [k, v] of Object.entries(query)) {
99
+ checkTemplate(v, `${at}.query.${k}`, push);
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Whether a batch field is well formed: a positive integer max and a string join.
105
+ * @param batch - the batch field
106
+ * @returns true when it is
107
+ */
108
+ function isBatch(batch: RestRequest["batch"]): boolean {
109
+ return isObject(batch) && Number.isInteger(batch.max) && batch.max >= 1 && typeof batch.join === "string";
110
+ }
111
+
112
+ /**
113
+ * Check one request.
114
+ * @param r - the request
115
+ * @param at - where it is
116
+ * @param entities - the mapping's entity names
117
+ * @param push - the accumulator
118
+ */
119
+ function checkRequest(r: RestRequest, at: string, entities: ReadonlySet<string>, push: Push): void {
120
+ if (!isObject(r)) {
121
+ push("missing", at);
122
+ return;
123
+ }
124
+ if (r.method !== undefined && r.method !== "GET" && r.method !== "POST") {
125
+ push("missing", `${at}.method`);
126
+ }
127
+ checkTemplate(r.path, `${at}.path`, push);
128
+ if (typeof r.path === "string" && !r.path.startsWith("/")) {
129
+ push("template", `${at}.path`);
130
+ }
131
+ checkQuery(r.query, at, push);
132
+ checkSelector(r.records, `${at}.records`, push, true);
133
+ if (typeof r.entity !== "string") {
134
+ push("missing", `${at}.entity`);
135
+ } else if (!entities.has(r.entity)) {
136
+ push("unknown-entity", `${at}.entity`);
137
+ }
138
+ if (r.batch !== undefined && !isBatch(r.batch)) {
139
+ push("batch", `${at}.batch`);
140
+ }
141
+ if (r.paging !== undefined) {
142
+ checkPaging(r.paging, `${at}.paging`, push);
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Check a paging field.
148
+ * @param p - the paging
149
+ * @param at - where it is
150
+ * @param push - the accumulator
151
+ */
152
+ function checkPaging(p: RestRequest["paging"], at: string, push: Push): void {
153
+ const paging = p as Record<string, unknown> | undefined;
154
+ if (!isObject(paging)) {
155
+ push("paging", at);
156
+ return;
157
+ }
158
+ switch (paging.style) {
159
+ case "cursor":
160
+ if (typeof paging.param !== "string" || typeof paging.first !== "string") {
161
+ push("paging", at);
162
+ }
163
+ checkSelector(paging.next, `${at}.next`, push, true);
164
+ break;
165
+ case "offset": {
166
+ const size = paging.size as Record<string, unknown> | undefined;
167
+ const ok =
168
+ typeof paging.param === "string" &&
169
+ isObject(size) &&
170
+ typeof size.param === "string" &&
171
+ Number.isInteger(size.value) &&
172
+ (size.value as number) > 0 &&
173
+ (paging.unit === undefined || paging.unit === "items" || paging.unit === "pages") &&
174
+ (paging.base === undefined || paging.base === 0 || paging.base === 1);
175
+ if (!ok) {
176
+ push("paging", at);
177
+ }
178
+ break;
179
+ }
180
+ case "link-header":
181
+ if (paging.rel !== undefined && typeof paging.rel !== "string") {
182
+ push("paging", at);
183
+ }
184
+ break;
185
+ case "next-url":
186
+ checkSelector(paging.next, `${at}.next`, push, true);
187
+ break;
188
+ default:
189
+ push("paging", `${at}.style`);
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Check one edge rule.
195
+ * @param rule - the rule
196
+ * @param at - where it is
197
+ * @param entities - the mapping's entity names
198
+ * @param push - the accumulator
199
+ */
200
+ function checkEdgeRule(rule: RestEdgeRule, at: string, entities: ReadonlySet<string>, push: Push): void {
201
+ if (!isObject(rule)) {
202
+ push("missing", at);
203
+ return;
204
+ }
205
+ const r = rule as Record<string, unknown>;
206
+ if (typeof r.type !== "string") {
207
+ push("missing", `${at}.type`);
208
+ }
209
+ checkSelector(r.each, `${at}.each`, push, false);
210
+ if ("pairs" in r) {
211
+ checkSelector(r.pairs, `${at}.pairs`, push, true);
212
+ } else {
213
+ checkSelector(r.to, `${at}.to`, push, true);
214
+ checkSelector(r.from, `${at}.from`, push, false);
215
+ if (isObject(r.fields)) {
216
+ for (const [k, v] of Object.entries(r.fields)) {
217
+ checkSelector(v, `${at}.fields.${k}`, push, true);
218
+ }
219
+ } else if (r.fields !== undefined) {
220
+ push("missing", `${at}.fields`);
221
+ }
222
+ }
223
+ if (r.entity !== undefined && (typeof r.entity !== "string" || !entities.has(r.entity))) {
224
+ push("unknown-entity", `${at}.entity`);
225
+ }
226
+ }
227
+
228
+ /**
229
+ * Check one entity.
230
+ * @param e - the entity
231
+ * @param at - where it is
232
+ * @param entities - the mapping's entity names
233
+ * @param push - the accumulator
234
+ */
235
+ function checkEntity(e: RestEntity, at: string, entities: ReadonlySet<string>, push: Push): void {
236
+ if (!isObject(e)) {
237
+ push("missing", at);
238
+ return;
239
+ }
240
+ checkSelector(e.id, `${at}.id`, push, true, true);
241
+ if (e.stripPrefix !== undefined && typeof e.stripPrefix !== "string") {
242
+ push("missing", `${at}.stripPrefix`);
243
+ }
244
+ if (e.label !== undefined && typeof e.label !== "string") {
245
+ push("missing", `${at}.label`);
246
+ }
247
+ if (e.node !== undefined && e.node) {
248
+ push("missing", `${at}.node`);
249
+ }
250
+ if (isObject(e.fields)) {
251
+ for (const [k, v] of Object.entries(e.fields)) {
252
+ checkSelector(v, `${at}.fields.${k}`, push, true, true);
253
+ }
254
+ } else if (e.fields !== undefined) {
255
+ push("missing", `${at}.fields`);
256
+ }
257
+ if (Array.isArray(e.edges)) {
258
+ (e.edges as readonly RestEdgeRule[]).forEach((rule, i) => {
259
+ checkEdgeRule(rule, `${at}.edges.${String(i)}`, entities, push);
260
+ });
261
+ } else if (e.edges !== undefined) {
262
+ push("missing", `${at}.edges`);
263
+ }
264
+ if (Array.isArray(e.embedded)) {
265
+ e.embedded.forEach((em, i) => {
266
+ const where = `${at}.embedded.${String(i)}`;
267
+ if (!isObject(em)) {
268
+ push("missing", where);
269
+ return;
270
+ }
271
+ checkSelector(em.at, `${where}.at`, push, true);
272
+ if (typeof em.entity !== "string" || !entities.has(em.entity)) {
273
+ push("unknown-entity", `${where}.entity`);
274
+ }
275
+ });
276
+ } else if (e.embedded !== undefined) {
277
+ push("missing", `${at}.embedded`);
278
+ }
279
+ }
280
+
281
+ /**
282
+ * Check the mapping's top-level names of requests.
283
+ * @param m - the mapping
284
+ * @param requests - its request names
285
+ * @param push - the accumulator
286
+ */
287
+ function checkRequestNames(m: RestMapping, requests: ReadonlySet<string>, push: Push): void {
288
+ const names: [string, unknown][] = [
289
+ ["load", m.load],
290
+ ["hydrate", m.hydrate],
291
+ ["seed", m.seed],
292
+ ];
293
+ if (isObject(m.expand)) {
294
+ names.push(["expand.in", m.expand.in], ["expand.out", m.expand.out]);
295
+ } else {
296
+ names.push(["expand", m.expand]);
297
+ }
298
+ for (const [at, name] of names) {
299
+ if (name === undefined && at !== "load") {
300
+ continue;
301
+ }
302
+ if (typeof name !== "string") {
303
+ push("missing", at);
304
+ } else if (!requests.has(name)) {
305
+ push("unknown-request", at);
306
+ }
307
+ }
308
+ }
309
+
310
+ /**
311
+ * Check the endpoint.
312
+ * @param endpoint - the field
313
+ * @param push - the accumulator
314
+ */
315
+ function checkEndpoint(endpoint: unknown, push: Push): void {
316
+ let url: URL | null = null;
317
+ try {
318
+ url = new URL(typeof endpoint === "string" ? endpoint : "");
319
+ } catch {
320
+ // not a URL
321
+ }
322
+ if (
323
+ url === null ||
324
+ (url.protocol !== "https:" && url.protocol !== "http:") ||
325
+ url.username !== "" ||
326
+ url.password !== "" ||
327
+ url.search !== "" ||
328
+ url.hash !== ""
329
+ ) {
330
+ push("endpoint", "endpoint");
331
+ }
332
+ }
333
+
334
+ /**
335
+ * Check a REST mapping without running it: the version, the endpoint, every request (templates,
336
+ * selectors, paging, batching) and entity (selectors, edge rules, embedded records), and that every
337
+ * name it uses exists. Experimental.
338
+ * @param mapping - the mapping, as data from anywhere
339
+ * @returns every problem found; empty when the mapping can run
340
+ * @category Network sources
341
+ */
342
+ export function checkRestMapping(mapping: unknown): readonly RestMappingIssue[] {
343
+ const issues: RestMappingIssue[] = [];
344
+ const push: Push = (code, at) => {
345
+ issues.push(Object.freeze({ code, at }));
346
+ };
347
+ if (!isObject(mapping)) {
348
+ push("missing", "");
349
+ return issues;
350
+ }
351
+ const m = mapping as unknown as RestMapping;
352
+ if (m.version !== 1) {
353
+ push("version", "version");
354
+ }
355
+ checkEndpoint(m.endpoint, push);
356
+ const requests = isObject(m.requests) ? m.requests : {};
357
+ const entities = isObject(m.entities) ? m.entities : {};
358
+ if (!isObject(m.requests)) {
359
+ push("missing", "requests");
360
+ }
361
+ if (!isObject(m.entities)) {
362
+ push("missing", "entities");
363
+ }
364
+ const entityNames = new Set(Object.keys(entities));
365
+ for (const [name, r] of Object.entries(requests)) {
366
+ checkRequest(r, `requests.${name}`, entityNames, push);
367
+ }
368
+ for (const [name, e] of Object.entries(entities)) {
369
+ checkEntity(e, `entities.${name}`, entityNames, push);
370
+ }
371
+ checkRequestNames(m, new Set(Object.keys(requests)), push);
372
+ checkLimits(m, push);
373
+ checkSelector(m.modified, "modified", push, false);
374
+ if (m.directed !== undefined && typeof m.directed !== "boolean") {
375
+ push("missing", "directed");
376
+ }
377
+ return issues;
378
+ }
379
+
380
+ /**
381
+ * Check the rate limit and the budget headers.
382
+ * @param m - the mapping
383
+ * @param push - the accumulator
384
+ */
385
+ function checkLimits(m: RestMapping, push: Push): void {
386
+ for (const [at, value] of [
387
+ ["rateLimit.requests", m.rateLimit?.requests],
388
+ ["rateLimit.perMs", m.rateLimit?.perMs],
389
+ ] as const) {
390
+ if (m.rateLimit !== undefined && !(typeof value === "number" && value > 0)) {
391
+ push("number", at);
392
+ }
393
+ }
394
+ if (
395
+ m.budgetHeaders !== undefined &&
396
+ (typeof m.budgetHeaders.remaining !== "string" ||
397
+ (m.budgetHeaders.reset !== undefined && typeof m.budgetHeaders.reset !== "string"))
398
+ ) {
399
+ push("missing", "budgetHeaders");
400
+ }
401
+ }