@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.
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
@@ -135,6 +135,7 @@ const POSITIONS: Aliases = {
135
135
  "top-right": ["top-right", "north-east", "northeast"],
136
136
  "bottom-left": ["bottom-left", "south-west", "southwest"],
137
137
  "bottom-right": ["bottom-right", "south-east", "southeast"],
138
+ "inside-top": ["inside-top"],
138
139
  };
139
140
 
140
141
  /** vis-network draws these spellings differently from the common reading. */
@@ -1733,6 +1733,8 @@ const CYJS_EDGE_ONLY: ReadonlySet<string> = new Set([
1733
1733
  "source-arrow-shape",
1734
1734
  "target-arrow-color",
1735
1735
  "source-arrow-color",
1736
+ "target-arrow-fill",
1737
+ "source-arrow-fill",
1736
1738
  "curve-style",
1737
1739
  "arrow-scale",
1738
1740
  "source-label",
@@ -1897,6 +1899,75 @@ function combineParts(
1897
1899
  }
1898
1900
  values.visible = col;
1899
1901
  }
1902
+ if (kind === "edge") {
1903
+ hollowArrows("target", words.get("_targetArrowFill"), values, notes);
1904
+ hollowArrows("source", words.get("_sourceArrowFill"), values, notes);
1905
+ }
1906
+ }
1907
+
1908
+ /**
1909
+ * An entry's arrows drawn open where the same entry sets them hollow. A fill set by another entry is left to the
1910
+ * per-element values the rules are checked against.
1911
+ * @param setting - the entry's constants; changed in place
1912
+ * @param parts - every property of the entry
1913
+ */
1914
+ function openArrows(setting: Map<string, StyleValue>, parts: readonly EntryProperty[]): void {
1915
+ for (const end of ["target", "source"]) {
1916
+ // a later duplicate of a property replaces the earlier one
1917
+ let fill: CyjsParsed | undefined;
1918
+ for (const p of parts) {
1919
+ if (p.spec.property === `_${end}ArrowFill`) {
1920
+ fill = p.parsed;
1921
+ }
1922
+ }
1923
+ const shape = setting.get(`${end}Arrow`);
1924
+ const open = shape === undefined ? undefined : OPEN_ARROWS.get(shape);
1925
+ if (fill?.kind === "word" && fill.value === "hollow" && open !== undefined) {
1926
+ setting.set(`${end}Arrow`, open);
1927
+ }
1928
+ }
1929
+ }
1930
+
1931
+ /** The arrows the vocabulary has an open shape for, by their filled shape. */
1932
+ const OPEN_ARROWS: ReadonlyMap<StyleValue, StyleValue> = new Map([
1933
+ ["triangle", "triangle-open"],
1934
+ ["circle", "circle-open"],
1935
+ ["diamond", "diamond-open"],
1936
+ ]);
1937
+
1938
+ /**
1939
+ * Combines an end's arrow shape with its fill: a hollow arrow is the open shape. A hollow arrow the vocabulary has no
1940
+ * open shape for keeps its filled shape and is noted.
1941
+ * @param end - the edge end
1942
+ * @param fill - the fill per element, or undefined when no rule sets it
1943
+ * @param values - the values; changed in place
1944
+ * @param notes - where problems are noted
1945
+ */
1946
+ function hollowArrows(
1947
+ end: "source" | "target",
1948
+ fill: readonly (string | null)[] | undefined,
1949
+ values: Record<string, (StyleValue | null)[]>,
1950
+ notes: StyleNotes,
1951
+ ): void {
1952
+ const shapes = values[`${end}Arrow`] as (StyleValue | null)[] | undefined;
1953
+ if (fill === undefined || shapes === undefined) {
1954
+ return;
1955
+ }
1956
+ for (let i = 0; i < shapes.length; i++) {
1957
+ const shape = shapes[i];
1958
+ if (fill[i] !== "hollow" || shape === null || shape === "none") {
1959
+ continue;
1960
+ }
1961
+ const open = OPEN_ARROWS.get(shape);
1962
+ if (open === undefined) {
1963
+ notes.add(STYLE_ISSUE.NOT_CARRIED, "edge", `${end}-arrow-fill`, {
1964
+ sample: `hollow ${String(shape)}`,
1965
+ element: i,
1966
+ });
1967
+ } else {
1968
+ shapes[i] = open;
1969
+ }
1970
+ }
1900
1971
  }
1901
1972
 
1902
1973
  /**
@@ -1973,7 +2044,7 @@ function buildRules(
1973
2044
  if (props.length === 0 || a.list.length === 0) {
1974
2045
  continue;
1975
2046
  }
1976
- drafts.push(draftOf(ctx, a.entry, a.list, props));
2047
+ drafts.push(draftOf(ctx, a.entry, a.list, props, a.props));
1977
2048
  }
1978
2049
  const rules = collapse(ctx, drafts);
1979
2050
  return { rules, columns, rawColumns: [...raw] };
@@ -2020,9 +2091,16 @@ interface Draft {
2020
2091
  * @param entry - the entry
2021
2092
  * @param list - the matched core elements
2022
2093
  * @param props - the carried properties
2094
+ * @param parts - every property of the entry, the combined parts too: a hollow fill makes the entry's own arrow open
2023
2095
  * @returns the draft
2024
2096
  */
2025
- function draftOf(ctx: RuleContext, entry: Entry, list: readonly number[], props: readonly EntryProperty[]): Draft {
2097
+ function draftOf(
2098
+ ctx: RuleContext,
2099
+ entry: Entry,
2100
+ list: readonly number[],
2101
+ props: readonly EntryProperty[],
2102
+ parts: readonly EntryProperty[],
2103
+ ): Draft {
2026
2104
  const setting = new Map<string, StyleValue>();
2027
2105
  const mapping = new Map<string, Mapping>();
2028
2106
  let flattened = false;
@@ -2053,6 +2131,7 @@ function draftOf(ctx: RuleContext, entry: Entry, list: readonly number[], props:
2053
2131
  mapping.set(p.spec.property, mapperMapping(ctx, entry, list, p));
2054
2132
  }
2055
2133
  }
2134
+ openArrows(setting, parts);
2056
2135
  const set = Object.fromEntries(setting);
2057
2136
  const map = Object.fromEntries(mapping);
2058
2137
  const hasMap = mapping.size > 0;
@@ -36,6 +36,8 @@ export const CYJS_PROPERTY_DEFAULTS: ReadonlyMap<string, string> = new Map([
36
36
  ["line-style", "solid"],
37
37
  ["target-arrow-shape", "none"],
38
38
  ["source-arrow-shape", "none"],
39
+ ["target-arrow-fill", "filled"],
40
+ ["source-arrow-fill", "filled"],
39
41
  ["target-arrow-color", "rgb(153,153,153)"],
40
42
  ["source-arrow-color", "rgb(153,153,153)"],
41
43
  ["curve-style", "haystack"],
@@ -121,10 +121,13 @@ const ARROWS_TO_CYJS: ReadonlyMap<string, string> = new Map([
121
121
  ["circle", "circle"],
122
122
  ["square", "square"],
123
123
  ]);
124
- const ARROWS_NEAREST: ReadonlyMap<string, string> = new Map([
124
+ /** The open arrows: their shape, drawn hollow. */
125
+ const ARROWS_OPEN: ReadonlyMap<string, string> = new Map([
125
126
  ["triangle-open", "triangle"],
126
127
  ["diamond-open", "diamond"],
127
128
  ["circle-open", "circle"],
129
+ ]);
130
+ const ARROWS_NEAREST: ReadonlyMap<string, string> = new Map([
128
131
  ["half", "triangle"],
129
132
  ["inverted", "triangle"],
130
133
  ["crow", "vee"],
@@ -193,6 +196,10 @@ function near(props: Record<string, string | number>): Written {
193
196
  * @returns the written value
194
197
  */
195
198
  function labelPositionToCyjs(text: string): Written {
199
+ if (text === "inside-top") {
200
+ // Cytoscape.js has no inside alignment but center.
201
+ return near({ "text-valign": "top", "text-halign": "center" });
202
+ }
196
203
  const v = ["top", "bottom"].find((x) => text.startsWith(x)) ?? "center";
197
204
  const h = ["left", "right"].find((x) => text.endsWith(x)) ?? "center";
198
205
  return exact({ "text-valign": v, "text-halign": h });
@@ -221,19 +228,23 @@ function enumToCyjs(
221
228
  }
222
229
 
223
230
  /**
224
- * An arrow, or the nearest arrow Cytoscape.js has.
225
- * @param name - the Cytoscape.js property
231
+ * An arrow, or the nearest arrow Cytoscape.js has, with its fill: an open arrow is its shape drawn hollow, and every
232
+ * other arrow is written filled, so a hollow fill an earlier rule set does not carry over to it.
233
+ * @param name - the Cytoscape.js shape property
226
234
  * @param value - the neutral arrow
227
235
  * @param specs - the target's properties
228
236
  * @returns the written value, or null when Cytoscape.js has none near
229
237
  */
230
238
  function arrowToCyjs(name: string, value: string, specs: ReadonlyMap<string, CyjsPropertySpec>): Written | null {
231
- const own = enumToCyjs(name, value, ARROWS_TO_CYJS, specs);
232
- if (own !== null) {
233
- return own;
239
+ const fill = name.replace("-shape", "-fill");
240
+ const open = ARROWS_OPEN.get(value);
241
+ if (open !== undefined) {
242
+ return exact({ [name]: open, [fill]: "hollow" });
234
243
  }
244
+ const own = enumToCyjs(name, value, ARROWS_TO_CYJS, specs);
235
245
  const nearest = ARROWS_NEAREST.get(value);
236
- return nearest === undefined ? null : near({ [name]: nearest });
246
+ const w = own ?? (nearest === undefined ? null : near({ [name]: nearest }));
247
+ return w === null || value === "none" ? w : { ...w, props: { ...w.props, [fill]: "filled" } };
237
248
  }
238
249
 
239
250
  /**
@@ -28,7 +28,10 @@ export type CyjsValueType =
28
28
 
29
29
  /** One property graph-io carries: the neutral property it sets (or a part it combines) and how it is parsed. */
30
30
  export interface CyjsPropertySpec {
31
- /** The neutral property, or `_valign`, `_halign`, `_visibility`, `_display` for the parts combined afterward. */
31
+ /**
32
+ * The neutral property, or `_valign`, `_halign`, `_visibility`, `_display`, `_sourceArrowFill`, `_targetArrowFill`
33
+ * for the parts combined afterward.
34
+ */
32
35
  readonly property: string;
33
36
  /** The value type. */
34
37
  readonly type: CyjsValueType;
@@ -171,6 +174,8 @@ export const CYJS_EDGE_PROPERTIES: ReadonlyMap<string, CyjsPropertySpec> = new M
171
174
  ["source-arrow-shape", { property: "sourceArrow", type: "enum", enums: ARROWS }],
172
175
  ["target-arrow-color", { property: "targetArrowColor", type: "color" }],
173
176
  ["source-arrow-color", { property: "sourceArrowColor", type: "color" }],
177
+ ["target-arrow-fill", { property: "_targetArrowFill", type: "enum", enums: ["filled", "hollow"] }],
178
+ ["source-arrow-fill", { property: "_sourceArrowFill", type: "enum", enums: ["filled", "hollow"] }],
174
179
  ["curve-style", { property: "curved", type: "enum", enums: CURVES }],
175
180
  ["arrow-scale", { property: "arrowSize", type: "positive" }],
176
181
  ["source-label", { property: "sourceLabel", type: "text" }],
@@ -23,7 +23,7 @@ import type {
23
23
  StyleValue,
24
24
  } from "../types.js";
25
25
  import { STYLE_PROPERTIES } from "../vocabulary.js";
26
- import { JAVA_FONTS } from "./lexicon.js";
26
+ import { JAVA_FONTS, vpStep } from "./lexicon.js";
27
27
  import {
28
28
  type CytoscapeContinuousPoint,
29
29
  type CytoscapeMapping,
@@ -220,6 +220,7 @@ const DESKTOP_POSITIONS = {
220
220
  "top-right": "NE,SW,c,0.00,0.00",
221
221
  "bottom-left": "SW,NE,c,0.00,0.00",
222
222
  "bottom-right": "SE,NW,c,0.00,0.00",
223
+ "inside-top": "N,N,c,0.00,0.00",
223
224
  };
224
225
  const CX2_ANCHORS: Readonly<Record<string, readonly [string, string]>> = {
225
226
  center: ["center", "center"],
@@ -235,6 +236,21 @@ const CX2_ANCHORS: Readonly<Record<string, readonly [string, string]>> = {
235
236
 
236
237
  const desktopNumber: Write = String;
237
238
  const cx2Number: Write = (v) => v;
239
+
240
+ /**
241
+ * A writer for a visual property Cytoscape holds as a whole number (a font size): the value is written as it is, and
242
+ * a fraction is noted, since Cytoscape draws it rounded.
243
+ * @param write - the dialect's number writer
244
+ * @returns the writer
245
+ */
246
+ function whole(write: Write): Write {
247
+ return (v, approx) => {
248
+ if (typeof v === "number" && !Number.isInteger(v)) {
249
+ approx();
250
+ }
251
+ return write(v, approx);
252
+ };
253
+ }
238
254
  const textOut: Write = String;
239
255
  const desktopBool: Write = (v) => String(v === true);
240
256
  const opacity255: Write = (v, approx) => {
@@ -265,7 +281,7 @@ const WRITERS: Readonly<Record<CytoscapeDialect, Readonly<Record<StyleTarget, Re
265
281
  ["height", { vp: "NODE_HEIGHT", write: desktopNumber }],
266
282
  ["label", { vp: "NODE_LABEL", write: textOut }],
267
283
  ["labelColor", { vp: "NODE_LABEL_COLOR", write: colorOut }],
268
- ["labelSize", { vp: "NODE_LABEL_FONT_SIZE", write: desktopNumber }],
284
+ ["labelSize", { vp: "NODE_LABEL_FONT_SIZE", write: whole(desktopNumber) }],
269
285
  ["labelPosition", { vp: "NODE_LABEL_POSITION", write: enumOut(DESKTOP_POSITIONS, {}, false) }],
270
286
  ["tooltip", { vp: "NODE_TOOLTIP", write: textOut }],
271
287
  ["visible", { vp: "NODE_VISIBLE", write: desktopBool }],
@@ -300,7 +316,7 @@ const WRITERS: Readonly<Record<CytoscapeDialect, Readonly<Record<StyleTarget, Re
300
316
  ["curved", { vp: "EDGE_CURVED", write: desktopBool }],
301
317
  ["label", { vp: "EDGE_LABEL", write: textOut }],
302
318
  ["labelColor", { vp: "EDGE_LABEL_COLOR", write: colorOut }],
303
- ["labelSize", { vp: "EDGE_LABEL_FONT_SIZE", write: desktopNumber }],
319
+ ["labelSize", { vp: "EDGE_LABEL_FONT_SIZE", write: whole(desktopNumber) }],
304
320
  ["tooltip", { vp: "EDGE_TOOLTIP", write: textOut }],
305
321
  ["visible", { vp: "EDGE_VISIBLE", write: desktopBool }],
306
322
  ]),
@@ -329,7 +345,7 @@ const WRITERS: Readonly<Record<CytoscapeDialect, Readonly<Record<StyleTarget, Re
329
345
  ["height", { vp: "NODE_HEIGHT", write: cx2Number }],
330
346
  ["label", { vp: "NODE_LABEL", write: textOut }],
331
347
  ["labelColor", { vp: "NODE_LABEL_COLOR", write: colorOut }],
332
- ["labelSize", { vp: "NODE_LABEL_FONT_SIZE", write: cx2Number }],
348
+ ["labelSize", { vp: "NODE_LABEL_FONT_SIZE", write: whole(cx2Number) }],
333
349
  ["labelPosition", { vp: "NODE_LABEL_POSITION", write: cx2Position }],
334
350
  ["visible", { vp: "NODE_VISIBILITY", write: (v) => (v === true ? "element" : "none") }],
335
351
  ]),
@@ -363,18 +379,23 @@ const WRITERS: Readonly<Record<CytoscapeDialect, Readonly<Record<StyleTarget, Re
363
379
  ["curved", { vp: "EDGE_CURVED", write: (v) => v === true }],
364
380
  ["label", { vp: "EDGE_LABEL", write: textOut }],
365
381
  ["labelColor", { vp: "EDGE_LABEL_COLOR", write: colorOut }],
366
- ["labelSize", { vp: "EDGE_LABEL_FONT_SIZE", write: cx2Number }],
382
+ ["labelSize", { vp: "EDGE_LABEL_FONT_SIZE", write: whole(cx2Number) }],
367
383
  ["visible", { vp: "EDGE_VISIBILITY", write: (v) => (v === true ? "element" : "none") }],
368
384
  ]),
369
385
  },
370
386
  };
371
387
 
372
388
  /**
373
- * CX2's label position object.
389
+ * CX2's label position object; `inside-top`, which CX2's anchors cannot tell from `top`, is written as `top`.
374
390
  * @param v - a canonical position
391
+ * @param approx - records the approximation
375
392
  * @returns the object
376
393
  */
377
- function cx2Position(v: StyleValue): unknown {
394
+ function cx2Position(v: StyleValue, approx: () => void): unknown {
395
+ if (v === "inside-top") {
396
+ approx();
397
+ v = "top";
398
+ }
378
399
  const [h, vert] = Object.hasOwn(CX2_ANCHORS, String(v)) ? CX2_ANCHORS[String(v)] : ["center", "center"];
379
400
  return {
380
401
  HORIZONTAL_ALIGN: "center",
@@ -701,16 +722,49 @@ function addBypasses(
701
722
  continue;
702
723
  }
703
724
  const drawn = resolveRules(modelRules, target, p, e.src);
725
+ const step = drawnStep(model.map.get(p), w.vp, STYLE_PROPERTIES[target].get(p));
726
+ let rounded = 0;
704
727
  for (let i = 0; i < e.n; i++) {
705
728
  const v = want[i];
706
729
  if (v !== null && v !== drawn[i]) {
707
730
  bypasses[i] ??= new Map();
708
731
  bypasses[i]?.set(w.vp, w.write(v, e.approx(p)));
732
+ } else if (offStep(v, step)) {
733
+ rounded++;
709
734
  }
710
735
  }
736
+ if (rounded > 0) {
737
+ e.notes.add(STYLE_ISSUE.APPROXIMATED, target, p, { count: rounded });
738
+ }
711
739
  }
712
740
  }
713
741
 
742
+ /**
743
+ * The step Cytoscape rounds the values of a written mapping to: a continuous mapping, or a passthrough written as
744
+ * one, on a visual property that holds whole numbers (a font size, a 0..255 transparency) is drawn rounded, unless
745
+ * the mapping already rounds to it. A passthrough written as a table writes its values through the property's writer,
746
+ * which notes them itself.
747
+ * @param m - the mapping written, if any
748
+ * @param vp - the visual property it sets
749
+ * @param kind - the kind of value the property holds
750
+ * @returns the step, or undefined when Cytoscape draws the mapping's values as they are
751
+ */
752
+ function drawnStep(m: Mapping | undefined, vp: string, kind: string | undefined): number | undefined {
753
+ const ramp = m?.kind === "continuous" && m.step === undefined;
754
+ const passthrough = m?.kind === "passthrough" && PASSTHROUGH_SAFE.has(kind ?? "");
755
+ return ramp || passthrough ? vpStep(vp) : undefined;
756
+ }
757
+
758
+ /**
759
+ * Whether a value is not a multiple of a step, so Cytoscape draws it rounded.
760
+ * @param v - the value
761
+ * @param step - the step, or undefined for none
762
+ * @returns true when the value changes on rounding
763
+ */
764
+ function offStep(v: StyleValue | null | undefined, step: number | undefined): boolean {
765
+ return step !== undefined && typeof v === "number" && num6(Math.round(v / step) * step) !== v;
766
+ }
767
+
714
768
  /**
715
769
  * The defaults and mappings of one target: rules over every element, bottom to top. A constant over every element
716
770
  * hides everything beneath it; of two mappings of one property only the topmost is kept. Every rule that cannot be
@@ -39,6 +39,11 @@ const opacity255: CytoscapeValueParser = (raw, site) => {
39
39
  // CX2's 0..1 opacity.
40
40
  const opacity01: CytoscapeValueParser = (raw, site) => canonOpacity(raw, "css", site);
41
41
  const length: CytoscapeValueParser = (raw, site) => canonNumber(raw, site);
42
+ // Cytoscape desktop holds a font size as a whole number, so every value read for one is drawn rounded.
43
+ const fontSize: CytoscapeValueParser = (raw, site) => {
44
+ const v = canonNumber(raw, site);
45
+ return v === null ? null : Math.round(v);
46
+ };
42
47
  const text: CytoscapeValueParser = (raw, site) => canonText(raw, site);
43
48
  const bool: CytoscapeValueParser = (raw, site) => canonBoolean(raw, site);
44
49
 
@@ -397,7 +402,7 @@ export const CYTOSCAPE_LEXICON: Readonly<
397
402
  ["height", [["NODE_HEIGHT", length]]],
398
403
  ["label", [["NODE_LABEL", text]]],
399
404
  ["labelColor", [["NODE_LABEL_COLOR", color]]],
400
- ["labelSize", [["NODE_LABEL_FONT_SIZE", length]]],
405
+ ["labelSize", [["NODE_LABEL_FONT_SIZE", fontSize]]],
401
406
  ["labelFont", [["NODE_LABEL_FONT_FACE", fontFamily]]],
402
407
  ["labelWeight", [["NODE_LABEL_FONT_FACE", fontWeight]]],
403
408
  ["labelItalic", [["NODE_LABEL_FONT_FACE", fontItalic]]],
@@ -455,7 +460,7 @@ export const CYTOSCAPE_LEXICON: Readonly<
455
460
  ["curved", [["EDGE_CURVED", bool]]],
456
461
  ["label", [["EDGE_LABEL", text]]],
457
462
  ["labelColor", [["EDGE_LABEL_COLOR", color]]],
458
- ["labelSize", [["EDGE_LABEL_FONT_SIZE", length]]],
463
+ ["labelSize", [["EDGE_LABEL_FONT_SIZE", fontSize]]],
459
464
  ["labelFont", [["EDGE_LABEL_FONT_FACE", fontFamily]]],
460
465
  ["labelWeight", [["EDGE_LABEL_FONT_FACE", fontWeight]]],
461
466
  ["labelItalic", [["EDGE_LABEL_FONT_FACE", fontItalic]]],
@@ -656,3 +661,24 @@ export function normalizeVisualProperties(target: StyleTarget, raw: unknown, not
656
661
  }
657
662
  return out;
658
663
  }
664
+
665
+ /**
666
+ * The step a continuous mapping's value is rounded to for the integer visual properties Cytoscape desktop rounds an
667
+ * interpolated value of (cytoscape-api BasicVisualLexicon: the font sizes and the 0..255 transparencies; the latter
668
+ * read as opacities, so 1/255).
669
+ */
670
+ const INTEGER_VP_STEPS: ReadonlyMap<string, number> = new Map([
671
+ ["NODE_LABEL_FONT_SIZE", 1],
672
+ ["EDGE_LABEL_FONT_SIZE", 1],
673
+ ["NODE_TRANSPARENCY", 1 / 255],
674
+ ["EDGE_TRANSPARENCY", 1 / 255],
675
+ ]);
676
+
677
+ /**
678
+ * The step Cytoscape rounds an interpolated value of a visual property to.
679
+ * @param vp - the visual property
680
+ * @returns the step, or undefined for a property that holds fractions
681
+ */
682
+ export function vpStep(vp: string): number | undefined {
683
+ return INTEGER_VP_STEPS.get(vp);
684
+ }
@@ -28,6 +28,7 @@ import {
28
28
  isUncarriedVp,
29
29
  NODE_SIZE_VP,
30
30
  sizeParser,
31
+ vpStep,
31
32
  } from "./lexicon.js";
32
33
  import {
33
34
  type CytoscapeContinuousPoint,
@@ -152,7 +153,13 @@ export function chooseVps(
152
153
  export type ParsedMapping =
153
154
  | { readonly kind: "passthrough"; readonly column: string }
154
155
  | { readonly kind: "discrete"; readonly column: string; readonly table: readonly (readonly [Scalar, StyleValue])[] }
155
- | { readonly kind: "continuous"; readonly column: string; readonly points: readonly ContinuousPoint[] };
156
+ | {
157
+ readonly kind: "continuous";
158
+ readonly column: string;
159
+ readonly points: readonly ContinuousPoint[];
160
+ /** The step Cytoscape rounds a value to, for an integer visual property. */
161
+ readonly step?: number;
162
+ };
156
163
 
157
164
  /**
158
165
  * Reads a mapping's raw values with a property's parser: table entries and points whose values do not parse are
@@ -160,9 +167,15 @@ export type ParsedMapping =
160
167
  * @param m - the mapping
161
168
  * @param parse - the property's parser
162
169
  * @param site - where problems are noted
170
+ * @param vp - the visual property it sets, whose type decides whether an interpolated value is rounded
163
171
  * @returns the mapping with canonical values
164
172
  */
165
- export function parseMapping(m: CytoscapeMapping, parse: CytoscapeValueParser, site: CanonSite): ParsedMapping {
173
+ export function parseMapping(
174
+ m: CytoscapeMapping,
175
+ parse: CytoscapeValueParser,
176
+ site: CanonSite,
177
+ vp: string,
178
+ ): ParsedMapping {
166
179
  switch (m.kind) {
167
180
  case "passthrough":
168
181
  return { kind: "passthrough", column: m.column };
@@ -176,8 +189,11 @@ export function parseMapping(m: CytoscapeMapping, parse: CytoscapeValueParser, s
176
189
  }
177
190
  return { kind: "discrete", column: m.column, table };
178
191
  }
179
- default:
180
- return { kind: "continuous", column: m.column, points: parsePoints(m.points, parse, site) };
192
+ default: {
193
+ const step = vpStep(vp);
194
+ const points = parsePoints(m.points, parse, site);
195
+ return { kind: "continuous", column: m.column, points, ...(step === undefined ? {} : { step }) };
196
+ }
181
197
  }
182
198
  }
183
199
 
@@ -240,7 +256,7 @@ function evalMapping(
240
256
  return j < 0 ? null : m.table[j][1];
241
257
  }
242
258
  default:
243
- return evalContinuous(m.points, numberOf(value));
259
+ return evalContinuous(m.points, numberOf(value), m.step);
244
260
  }
245
261
  }
246
262
 
@@ -296,7 +312,7 @@ function resolver(
296
312
  if (m === undefined) {
297
313
  const entries = raw.kind === "discrete" ? raw.table.length : 0;
298
314
  budget?.spend(target, 1 + entries + (raw.kind === "continuous" ? raw.points.length : 0));
299
- m = parseMapping(raw, parse, ruleSite(property));
315
+ m = parseMapping(raw, parse, ruleSite(property), vp);
300
316
  parsed.set(key, m);
301
317
  }
302
318
  return m;
@@ -9,7 +9,7 @@ import { StyleNotes } from "../notes.js";
9
9
  import { canonicalFor } from "../plan/resolve.js";
10
10
  import type { ColumnRef, Mapping, StyleColumn, StyleRule, StyleTarget, StyleValue, StyleWorkBudget } from "../types.js";
11
11
  import { type CytoscapeValueParser, NODE_SIZE_VP, sizeParser } from "./lexicon.js";
12
- import type { CytoscapeMapping, CytoscapeStyle } from "./mappings.js";
12
+ import type { CytoscapeStyle } from "./mappings.js";
13
13
  import {
14
14
  bendParser,
15
15
  chooseVps,
@@ -86,8 +86,12 @@ export function cytoscapeRules(
86
86
  const columns = new Map<string, StyleColumn>();
87
87
  const byColumn = new Map<string, MappingRule>();
88
88
  const reading: MappingRead = { target, refOf, elements, columns, notes, budget: options.budget };
89
- const add = (props: readonly string[], raw: CytoscapeMapping, parse: CytoscapeValueParser): void => {
90
- const parsed = parseMapping(raw, parse, site(props[0]));
89
+ const add = (props: readonly string[], vp: string, parse: CytoscapeValueParser): void => {
90
+ const raw = s.mappings.get(vp);
91
+ if (raw === undefined) {
92
+ return;
93
+ }
94
+ const parsed = parseMapping(raw, parse, site(props[0]), vp);
91
95
  const mapping = neutralMapping(parsed, props[0], parse, reading);
92
96
  const key = `${raw.kind}\u0000${raw.column}`;
93
97
  let rule = byColumn.get(key);
@@ -100,14 +104,10 @@ export function cytoscapeRules(
100
104
  }
101
105
  };
102
106
  for (const [prop, [vp, parse]] of chosen) {
103
- const raw = s.mappings.get(vp);
104
- if (raw !== undefined) {
105
- add(matched && prop === "color" ? ["color", "sourceArrowColor", "targetArrowColor"] : [prop], raw, parse);
106
- }
107
+ add(matched && prop === "color" ? ["color", "sourceArrowColor", "targetArrowColor"] : [prop], vp, parse);
107
108
  }
108
- const size = locked ? s.mappings.get(NODE_SIZE_VP) : undefined;
109
- if (size !== undefined) {
110
- add(["width", "height"], size, sizeParser);
109
+ if (locked) {
110
+ add(["width", "height"], NODE_SIZE_VP, sizeParser);
111
111
  }
112
112
 
113
113
  const rules: StyleRule[] = [];
@@ -201,7 +201,7 @@ function neutralMapping(
201
201
  return { kind: "discrete", by, table: m.table };
202
202
  }
203
203
  if (m.kind === "continuous") {
204
- return { kind: "continuous", by, points: m.points };
204
+ return { kind: "continuous", by, points: m.points, ...(m.step === undefined ? {} : { step: m.step }) };
205
205
  }
206
206
  const plain = "style" in by ? styleCell : canonicalFor(target, property);
207
207
  const n = elements.count;