@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
@@ -1 +0,0 @@
1
- {"version":3,"file":"emit-CwU8cUmG.js","sources":["../../src/styles/budget.ts","../../src/styles/cyjs/defaults-table.ts","../../src/styles/cyjs/mappers.ts","../../src/styles/cyjs/selector.ts","../../src/styles/cyjs/stylesheet-text.ts","../../src/styles/cyjs/cascade.ts","../../src/styles/cyjs/emit.ts"],"sourcesContent":["/**\n * The one counted work budget of a style extraction: the readers' cascades, the planner, the translation and the\n * replay all spend from it. It counts operations, never time, so the same file always stops at the same place.\n */\n\nimport type { StyleTarget, StyleWorkBudget } from \"./types.js\";\n\n/**\n * Operations one extraction may spend per target (nodes, edges) before what is left is copied per element.\n * @category Styles\n */\nexport const STYLE_WORK_BUDGET = 2e8;\n\n/**\n * A counted work budget per target. `spend()` adds operations and answers whether the target is still within its\n * limit; once a target has spent more than the limit it stays exhausted.\n * @category Styles\n */\nexport class StyleBudget implements StyleWorkBudget {\n /** Operations allowed per target. */\n readonly limit: number;\n readonly #used = { node: 0, edge: 0 };\n\n /**\n * Creates a budget.\n * @param limit - operations allowed per target; defaults to `STYLE_WORK_BUDGET`\n */\n constructor(limit: number = STYLE_WORK_BUDGET) {\n this.limit = limit;\n }\n\n /**\n * Spends operations for a target.\n * @param target - nodes or edges\n * @param operations - how many operations the work costs\n * @returns true while the target has spent at most `limit` operations\n */\n spend(target: StyleTarget, operations: number): boolean {\n this.#used[target] += operations;\n return this.#used[target] <= this.limit;\n }\n\n /**\n * Whether a target has spent more than `limit` operations.\n * @param target - nodes or edges\n * @returns true once the target's budget is exhausted\n */\n exhausted(target: StyleTarget): boolean {\n return this.#used[target] > this.limit;\n }\n\n /**\n * How many operations a target has spent.\n * @param target - nodes or edges\n * @returns the operations spent so far\n */\n used(target: StyleTarget): number {\n return this.#used[target];\n }\n}\n","/**\n * Cytoscape.js 3.34's own defaults for the properties graph-io carries, read from a headless core\n * (`cy.style().getDefaultProperty(name).strValue` and the first `cy.style().defaultLength` entries of its\n * stylesheet).\n *\n * Two tables, because Cytoscape.js uses two kinds of default:\n * - the property defaults: the value a property has when no rule sets it, and the value a `data()` or `mapData()`\n * that fails (a missing field, a value the property refuses) RESETS the property to, whatever the rules beneath say.\n * An edge's width resets to 30px there, not to the 3px edges are drawn with.\n * - the default stylesheet: rules Cytoscape.js puts beneath every stylesheet (edges 3px wide, compound parents drawn\n * as gray rectangles, loops curved, selected elements blue).\n */\n\n/** The property defaults, by Cytoscape.js property name, as Cytoscape.js writes them. */\nexport const CYJS_PROPERTY_DEFAULTS: ReadonlyMap<string, string> = new Map([\n [\"background-color\", \"rgb(153,153,153)\"],\n [\"background-opacity\", \"1\"],\n [\"opacity\", \"1\"],\n [\"border-color\", \"rgb(0,0,0)\"],\n [\"border-width\", \"0px\"],\n [\"border-style\", \"solid\"],\n [\"shape\", \"ellipse\"],\n [\"width\", \"30px\"],\n [\"height\", \"30px\"],\n [\"label\", \"\"],\n [\"color\", \"rgb(0,0,0)\"],\n [\"font-size\", \"16px\"],\n [\"font-family\", \"Helvetica Neue, Helvetica, sans-serif\"],\n [\"font-weight\", \"normal\"],\n [\"font-style\", \"normal\"],\n [\"visibility\", \"visible\"],\n [\"display\", \"element\"],\n [\"text-valign\", \"top\"],\n [\"text-halign\", \"center\"],\n [\"line-color\", \"rgb(153,153,153)\"],\n [\"line-style\", \"solid\"],\n [\"target-arrow-shape\", \"none\"],\n [\"source-arrow-shape\", \"none\"],\n [\"target-arrow-color\", \"rgb(153,153,153)\"],\n [\"source-arrow-color\", \"rgb(153,153,153)\"],\n [\"curve-style\", \"haystack\"],\n [\"arrow-scale\", \"1\"],\n [\"source-label\", \"\"],\n [\"target-label\", \"\"],\n]);\n\n/**\n * The rules of Cytoscape.js's default stylesheet that set a property graph-io carries, in its order. They sit\n * beneath every stylesheet a file gives.\n */\nexport const CYJS_DEFAULT_STYLESHEET: readonly {\n /** The rule's selector. */\n readonly selector: string;\n /** The rule's properties and values, as Cytoscape.js spells them. */\n readonly style: Readonly<Record<string, string>>;\n}[] = [\n {\n selector: \":parent\",\n style: {\n shape: \"rectangle\",\n \"background-color\": \"rgb(238,238,238)\",\n \"border-color\": \"rgb(204,204,204)\",\n \"border-width\": \"1px\",\n },\n },\n { selector: \"edge\", style: { width: \"3px\" } },\n { selector: \":loop\", style: { \"curve-style\": \"bezier\" } },\n { selector: \"edge:compound\", style: { \"curve-style\": \"bezier\" } },\n {\n selector: \":selected\",\n style: {\n \"background-color\": \"rgb(1,105,217)\",\n \"line-color\": \"rgb(1,105,217)\",\n \"source-arrow-color\": \"rgb(1,105,217)\",\n \"target-arrow-color\": \"rgb(1,105,217)\",\n },\n },\n {\n selector: \":parent:selected\",\n style: { \"background-color\": \"rgb(204,225,249)\", \"border-color\": \"rgb(174,200,229)\" },\n },\n];\n","/**\n * Cytoscape.js's property values: the properties graph-io carries, how Cytoscape.js 3.34 parses each value\n * (`style.parse`), the `data()` and `mapData()` mappers and how they evaluate per element, and the neutral value\n * each parsed value is drawn as.\n *\n * What Cytoscape.js does and this module repeats:\n * - a number property takes `px`, `em` or no unit; a value with any other suffix is read with `parseFloat`, so\n * `width: 50%` draws 50 pixels wide. Unitless properties (opacities, `arrow-scale`) are read with `parseFloat`.\n * - a color is a name, `#rgb`, `#rrggbb`, `rgb()`, `rgba()`, `hsl()` or `hsla()` with Cytoscape.js's own limits; its\n * alpha is never drawn (the opacity properties are).\n * - `mapData(field, a, b, x, y)` maps a numeric field linearly from [a, b] to [x, y], clamped at the ends; a reversed\n * range runs backwards, a zero range gives x, equal x and y make it the constant x. A color is interpolated per\n * channel and rounded.\n * - a mapper that fails for an element (no field, a value the property refuses, a non-number for `mapData`) resets the\n * property to its Cytoscape.js default, whatever the rules beneath say.\n */\n\nimport { CSS_COLORS } from \"../canon/color-tables.js\";\nimport { canonEnum } from \"../canon/enums.js\";\nimport { num6 } from \"../canon/number.js\";\nimport type { CanonSite } from \"../canon/site.js\";\nimport { STYLE_ISSUE } from \"../codes.js\";\nimport type { StyleTarget, StyleValue } from \"../types.js\";\n\n/** How Cytoscape.js types a property's value. */\nexport type CyjsValueType =\n \"color\" | \"zeroOne\" | \"size\" | \"nodeSize\" | \"positive\" | \"text\" | \"fontFamily\" | \"fontWeight\" | \"enum\";\n\n/** One property graph-io carries: the neutral property it sets (or a part it combines) and how it is parsed. */\nexport interface CyjsPropertySpec {\n /** The neutral property, or `_valign`, `_halign`, `_visibility`, `_display` for the parts combined afterward. */\n readonly property: string;\n /** The value type. */\n readonly type: CyjsValueType;\n /** The allowed values of an enumeration. */\n readonly enums?: readonly (string | number)[];\n}\n\nconst NODE_SHAPES = [\n \"rectangle\",\n \"roundrectangle\",\n \"round-rectangle\",\n \"cutrectangle\",\n \"cut-rectangle\",\n \"bottomroundrectangle\",\n \"bottom-round-rectangle\",\n \"barrel\",\n \"ellipse\",\n \"triangle\",\n \"round-triangle\",\n \"square\",\n \"pentagon\",\n \"round-pentagon\",\n \"hexagon\",\n \"round-hexagon\",\n \"concavehexagon\",\n \"concave-hexagon\",\n \"heptagon\",\n \"round-heptagon\",\n \"octagon\",\n \"round-octagon\",\n \"tag\",\n \"round-tag\",\n \"star\",\n \"diamond\",\n \"round-diamond\",\n \"vee\",\n \"rhomboid\",\n \"right-rhomboid\",\n \"polygon\",\n];\nconst ARROWS = [\n \"tee\",\n \"triangle\",\n \"triangle-tee\",\n \"circle-triangle\",\n \"triangle-cross\",\n \"triangle-backcurve\",\n \"vee\",\n \"square\",\n \"circle\",\n \"diamond\",\n \"chevron\",\n \"none\",\n];\nconst FONT_WEIGHTS: readonly (string | number)[] = [\n \"normal\",\n \"bold\",\n \"bolder\",\n \"lighter\",\n \"100\",\n \"200\",\n \"300\",\n \"400\",\n \"500\",\n \"600\",\n \"800\",\n \"900\",\n 100,\n 200,\n 300,\n 400,\n 500,\n 600,\n 700,\n 800,\n 900,\n];\nconst CURVES = [\n \"bezier\",\n \"unbundled-bezier\",\n \"haystack\",\n \"segments\",\n \"straight\",\n \"straight-triangle\",\n \"taxi\",\n \"round-segments\",\n \"round-taxi\",\n];\n/** The curve styles Cytoscape.js draws as straight lines or straight pieces: only the beziers bow. */\nconst STRAIGHT: ReadonlySet<string> = new Set([\n \"haystack\",\n \"straight\",\n \"straight-triangle\",\n \"segments\",\n \"taxi\",\n \"round-segments\",\n \"round-taxi\",\n]);\n\nconst LABEL: [string, CyjsPropertySpec][] = [\n [\"label\", { property: \"label\", type: \"text\" }],\n [\"color\", { property: \"labelColor\", type: \"color\" }],\n [\"font-size\", { property: \"labelSize\", type: \"size\" }],\n [\"font-family\", { property: \"labelFont\", type: \"fontFamily\" }],\n [\"font-weight\", { property: \"labelWeight\", type: \"fontWeight\" }],\n [\"font-style\", { property: \"labelItalic\", type: \"enum\", enums: [\"italic\", \"normal\", \"oblique\"] }],\n [\"visibility\", { property: \"_visibility\", type: \"enum\", enums: [\"hidden\", \"visible\"] }],\n [\"display\", { property: \"_display\", type: \"enum\", enums: [\"element\", \"none\"] }],\n [\"opacity\", { property: \"opacity\", type: \"zeroOne\" }],\n];\n\n/** The node properties graph-io carries, by Cytoscape.js name. */\nexport const CYJS_NODE_PROPERTIES: ReadonlyMap<string, CyjsPropertySpec> = new Map<string, CyjsPropertySpec>([\n [\"background-color\", { property: \"fill\", type: \"color\" }],\n [\"background-opacity\", { property: \"fillOpacity\", type: \"zeroOne\" }],\n [\"border-color\", { property: \"borderColor\", type: \"color\" }],\n [\"border-width\", { property: \"borderWidth\", type: \"size\" }],\n [\"border-style\", { property: \"borderStyle\", type: \"enum\", enums: [\"solid\", \"dotted\", \"dashed\", \"double\"] }],\n [\"shape\", { property: \"shape\", type: \"enum\", enums: NODE_SHAPES }],\n [\"corner-radius\", { property: \"cornerRadius\", type: \"size\" }],\n [\"width\", { property: \"width\", type: \"nodeSize\" }],\n [\"height\", { property: \"height\", type: \"nodeSize\" }],\n [\n \"text-valign\",\n { property: \"_valign\", type: \"enum\", enums: [\"top\", \"top-inside\", \"center\", \"bottom\", \"bottom-inside\"] },\n ],\n [\n \"text-halign\",\n { property: \"_halign\", type: \"enum\", enums: [\"left\", \"left-inside\", \"center\", \"right\", \"right-inside\"] },\n ],\n ...LABEL,\n]);\n\n/** The edge properties graph-io carries, by Cytoscape.js name. */\nexport const CYJS_EDGE_PROPERTIES: ReadonlyMap<string, CyjsPropertySpec> = new Map<string, CyjsPropertySpec>([\n [\"line-color\", { property: \"color\", type: \"color\" }],\n [\"width\", { property: \"width\", type: \"nodeSize\" }],\n [\"line-style\", { property: \"lineStyle\", type: \"enum\", enums: [\"solid\", \"dotted\", \"dashed\"] }],\n [\"target-arrow-shape\", { property: \"targetArrow\", type: \"enum\", enums: ARROWS }],\n [\"source-arrow-shape\", { property: \"sourceArrow\", type: \"enum\", enums: ARROWS }],\n [\"target-arrow-color\", { property: \"targetArrowColor\", type: \"color\" }],\n [\"source-arrow-color\", { property: \"sourceArrowColor\", type: \"color\" }],\n [\"curve-style\", { property: \"curved\", type: \"enum\", enums: CURVES }],\n [\"arrow-scale\", { property: \"arrowSize\", type: \"positive\" }],\n [\"source-label\", { property: \"sourceLabel\", type: \"text\" }],\n [\"target-label\", { property: \"targetLabel\", type: \"text\" }],\n ...LABEL,\n]);\n\n/**\n * The carried properties of a target.\n * @param target - nodes or edges\n * @returns Cytoscape.js name to its spec\n */\nexport function cyjsProperties(target: StyleTarget): ReadonlyMap<string, CyjsPropertySpec> {\n return target === \"node\" ? CYJS_NODE_PROPERTIES : CYJS_EDGE_PROPERTIES;\n}\n\n/**\n * A property name in Cytoscape.js's dash form, aliases resolved (`backgroundColor` and `content` are read as\n * `background-color` and `label`).\n * @param name - the name as written\n * @returns the dash-form name\n */\nexport function cyjsPropertyName(name: string): string {\n const dashed = name.replaceAll(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n return dashed === \"content\" ? \"label\" : dashed;\n}\n\n/** A parsed value, ready to draw. */\nexport type CyjsFlat =\n | {\n /** A color. */\n readonly kind: \"color\";\n /** Red, green, blue (0..255, possibly NaN for a malformed hex digit Cytoscape.js accepts). */\n readonly rgb: readonly [number, number, number];\n /** `rgb(r,g,b)`, as Cytoscape.js writes it. */\n readonly str: string;\n }\n | {\n /** A number. */\n readonly kind: \"number\";\n /** The number in its unit. */\n readonly value: number;\n /** `px`, `em`, or null for a value read with `parseFloat` past an unknown suffix. */\n readonly units: \"px\" | \"em\" | null;\n /** As Cytoscape.js writes it. */\n readonly str: string;\n }\n | {\n /** An enumeration value or a text. */\n readonly kind: \"word\";\n /** The value. */\n readonly value: string | number;\n /** As Cytoscape.js writes it. */\n readonly str: string;\n };\n\n/** A parsed property value: a flat value or a mapper. */\nexport type CyjsParsed =\n | CyjsFlat\n | {\n /** `data(field)`. */\n readonly kind: \"data\";\n /** The field, a dotted path. */\n readonly field: string;\n }\n | {\n /** `mapData(field, fieldMin, fieldMax, valueMin, valueMax)`. */\n readonly kind: \"mapData\";\n /** The field, a dotted path. */\n readonly field: string;\n /** The start of the input range. */\n readonly fieldMin: number;\n /** The end of the input range. */\n readonly fieldMax: number;\n /** The value at the start. */\n readonly min: CyjsFlat;\n /** The value at the end. */\n readonly max: CyjsFlat;\n }\n | {\n /** A function, from a live core's stylesheet. */\n readonly kind: \"fn\";\n };\n\n/** Where a value is parsed: a stylesheet rule, an element's own `style` (a bypass), or a mapper's per-element value. */\ntype CyjsParseMode = \"rule\" | \"bypass\" | \"flat\";\n\n/** Thrown by Cytoscape.js itself: a color given as a number makes its parser call `toLowerCase` on a number. */\nexport const CYJS_THROWS = \"throws\";\n\nconst NUM = String.raw`[-+]?(?:(?:\\d+|\\d*\\.\\d+)(?:[Ee][+-]?\\d+)?)`;\nconst NUMBER_UNITS = new RegExp(`^(${NUM})(px|em)?$`);\nconst NUMBER_ONLY = new RegExp(String.raw`^\\s*${NUM}\\s*$`);\nconst RGBA = new RegExp(\n String.raw`^rgb[a]?\\((${NUM}[%]?)\\s*,\\s*(${NUM}[%]?)\\s*,\\s*(${NUM}[%]?)(?:\\s*,\\s*(${NUM}))?\\)$`,\n);\nconst HSLA = new RegExp(String.raw`^hsl[a]?\\((${NUM})\\s*,\\s*(${NUM}[%])\\s*,\\s*(${NUM}[%])(?:\\s*,\\s*(${NUM}))?\\)$`);\nconst MAP_ARG = new RegExp(\n String.raw`^(?:${NUM}|\\w+|rgb[a]?\\((?:${NUM}[%]?)\\s*,\\s*(?:${NUM}[%]?)\\s*,\\s*(?:${NUM}[%]?)(?:\\s*,\\s*(?:${NUM}))?\\)` +\n String.raw`|hsl[a]?\\((?:${NUM})\\s*,\\s*(?:${NUM}[%])\\s*,\\s*(?:${NUM}[%])(?:\\s*,\\s*(?:${NUM}))?\\)` +\n String.raw`|\\#[0-9a-fA-F]{3}|\\#[0-9a-fA-F]{6})$`,\n);\nconst FIELD = /^[\\w.]+$/;\nconst WORD_FONT = /^[\\w\\- \"]$/;\n\n/**\n * Cytoscape.js's color names: the CSS names without `rebeccapurple`, plus `transparent` (black with no alpha).\n * @param name - the lowercased name\n * @returns `#rrggbb`, or undefined\n */\nfunction namedColor(name: string): string | undefined {\n if (name === \"transparent\") {\n return \"#000000\";\n }\n return name === \"rebeccapurple\" ? undefined : CSS_COLORS.get(name);\n}\n\n/**\n * A color as Cytoscape.js reads it (`color2tuple`).\n * @param value - the trimmed text\n * @returns red, green and blue, or null when Cytoscape.js refuses it\n */\nfunction colorTuple(value: string): [number, number, number] | null {\n const named = namedColor(value.toLowerCase());\n if (named !== undefined) {\n return [\n Number.parseInt(named.slice(1, 3), 16),\n Number.parseInt(named.slice(3, 5), 16),\n Number.parseInt(named.slice(5, 7), 16),\n ];\n }\n if ((value.length === 4 || value.length === 7) && value.startsWith(\"#\")) {\n const short = value.length === 4;\n const pair = (k: number): number =>\n Number.parseInt(short ? value[k] + value[k] : value.slice(2 * k - 1, 2 * k + 1), 16);\n return [pair(1), pair(2), pair(3)];\n }\n const m = RGBA.exec(value);\n return m === null ? hslTuple(value) : rgbaTuple(m);\n}\n\n/**\n * `rgb()` and `rgba()` as Cytoscape.js reads them: channels all numbers or all percentages, within 0..255, and an\n * alpha within 0..1.\n * @param m - the match of the pattern\n * @returns red, green and blue, or null\n */\nfunction rgbaTuple(m: RegExpExecArray): [number, number, number] | null {\n const pct = [1, 2, 3].map((k) => m[k].endsWith(\"%\"));\n if (pct.some(Boolean) && !pct.every(Boolean)) {\n return null;\n }\n const channels = [1, 2, 3].map((k) => {\n const c = Number.parseFloat(m[k]);\n return pct[k - 1] ? (c / 100) * 255 : c;\n });\n if (channels.some((c) => c < 0 || c > 255)) {\n return null;\n }\n const alpha = m.at(4);\n if (alpha !== undefined && (Number.parseFloat(alpha) < 0 || Number.parseFloat(alpha) > 1)) {\n return null;\n }\n return [Math.floor(channels[0]), Math.floor(channels[1]), Math.floor(channels[2])];\n}\n\n/**\n * `hsl()` and `hsla()` as Cytoscape.js reads them.\n * @param value - the trimmed text\n * @returns red, green and blue, or null\n */\nfunction hslTuple(value: string): [number, number, number] | null {\n const m = HSLA.exec(value);\n if (m === null) {\n return null;\n }\n let h = Number.parseInt(m[1], 10);\n if (h < 0) {\n h = (360 - ((-1 * h) % 360)) % 360;\n } else if (h > 360) {\n h = h % 360;\n }\n h /= 360;\n const s = Number.parseFloat(m[2]);\n const l = Number.parseFloat(m[3]);\n if (s < 0 || s > 100 || l < 0 || l > 100) {\n return null;\n }\n const alpha = m.at(4);\n if (alpha !== undefined && (Number.parseFloat(alpha) < 0 || Number.parseFloat(alpha) > 1)) {\n return null;\n }\n const sn = s / 100;\n const ln = l / 100;\n if (sn === 0) {\n const g = Math.round(ln * 255);\n return [g, g, g];\n }\n const hue = (p: number, q: number, t0: number): number => {\n let t = t0;\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n };\n const q = ln < 0.5 ? ln * (1 + sn) : ln + sn - ln * sn;\n const p = 2 * ln - q;\n return [\n Math.round(255 * hue(p, q, h + 1 / 3)),\n Math.round(255 * hue(p, q, h)),\n Math.round(255 * hue(p, q, h - 1 / 3)),\n ];\n}\n\n/**\n * Whether a value matches Cytoscape.js's font family pattern `^([\\w- \"]+(?:\\s*,\\s*[\\w- \"]+)*)$`, checked part by\n * part in one pass instead of with the backtracking pattern: items of word characters, `-`, space and `\"`, joined\n * by commas with any whitespace around them.\n * @param value - the text\n * @returns true when Cytoscape.js accepts it\n */\nexport function isFontFamily(value: string): boolean {\n const parts = value.split(\",\");\n if (parts.length === 1) {\n return parts[0].length > 0 && allOf(parts[0], isFontChar);\n }\n return (\n firstFontPart(parts[0]) &&\n lastFontPart(parts.at(-1) ?? \"\") &&\n parts.slice(1, -1).every((part) => middleFontPart(part))\n );\n}\n\n/**\n * Whether a character may be part of a font family item: a word character, `-`, space or `\"`.\n * @param c - the character\n * @returns true when it may\n */\nfunction isFontChar(c: string): boolean {\n return WORD_FONT.test(c);\n}\n\n/**\n * Whether a character is whitespace.\n * @param c - the character\n * @returns true for whitespace\n */\nfunction isSpace(c: string): boolean {\n return /\\s/.test(c);\n}\n\n/**\n * Whether every character of a text passes a test.\n * @param text - the text\n * @param test - the test\n * @returns true when all do (and for an empty text)\n */\nfunction allOf(text: string, test: (c: string) => boolean): boolean {\n return Array.from(text).every(test);\n}\n\n/**\n * The part before the first comma: an item, then whitespace before the comma.\n * @param part - the part\n * @returns true when it is one\n */\nfunction firstFontPart(part: string): boolean {\n let a = 0;\n while (a < part.length && isFontChar(part[a])) {\n a++;\n }\n return a > 0 && allOf(part.slice(a), isSpace);\n}\n\n/**\n * The part after the last comma: whitespace after the comma, then an item to the end.\n * @param part - the part\n * @returns true when it is one\n */\nfunction lastFontPart(part: string): boolean {\n let b = part.length;\n while (b > 0 && isFontChar(part[b - 1])) {\n b--;\n }\n return b < part.length && allOf(part.slice(0, b), isSpace);\n}\n\n/**\n * A part between two commas: whitespace, an item, whitespace; a part of whitespace only holds an item when one of its\n * characters is a space.\n * @param part - the part\n * @returns true when it is one\n */\nfunction middleFontPart(part: string): boolean {\n let a = 0;\n let b = part.length;\n while (a < b && isSpace(part[a])) {\n a++;\n }\n while (b > a && isSpace(part[b - 1])) {\n b--;\n }\n return a === b ? part.includes(\" \") : allOf(part.slice(a, b), isFontChar);\n}\n\n/** A flat value parsed: the value, null when Cytoscape.js refuses it, or `CYJS_THROWS` where Cytoscape.js throws. */\ntype FlatParse = CyjsFlat | null | typeof CYJS_THROWS;\n\n/**\n * Parses a flat value (no mappers) the way Cytoscape.js does.\n * @param spec - the property\n * @param raw - the value\n * @param rendered - the value is one Cytoscape.js reported (`ele.style(name)`), where every enumeration is text\n * @returns the parsed value, null when Cytoscape.js refuses it, or `CYJS_THROWS` where Cytoscape.js itself throws\n */\nfunction parseFlat(spec: CyjsPropertySpec, raw: unknown, rendered = false): FlatParse {\n const value: unknown = typeof raw === \"string\" ? raw.trim() : raw;\n switch (spec.type) {\n case \"color\":\n return parseColorValue(value);\n case \"zeroOne\":\n case \"positive\": {\n const x = Number.parseFloat(String(value));\n const ok = spec.type === \"zeroOne\" ? x >= 0 && x <= 1 : x > 0;\n return ok ? { kind: \"number\", value: x, units: null, str: String(x) } : null;\n }\n case \"size\":\n case \"nodeSize\":\n return parseSizeValue(spec, value, raw);\n case \"text\":\n return { kind: \"word\", value: String(value), str: String(value) };\n case \"fontFamily\": {\n const text = String(value);\n return isFontFamily(text) ? { kind: \"word\", value: text, str: text } : null;\n }\n case \"fontWeight\":\n case \"enum\": {\n const enums = spec.type === \"fontWeight\" ? FONT_WEIGHTS : (spec.enums ?? []);\n const e = enums.find((x) => x === value || (rendered && String(x) === value));\n return e === undefined ? null : { kind: \"word\", value: e, str: String(e) };\n }\n default:\n return null;\n }\n}\n\n/**\n * A color as Cytoscape.js reads it: an `[r, g, b]` array as it is, else text.\n * @param value - the value, trimmed\n * @returns the color, null when refused, or `CYJS_THROWS` for a value that is neither\n */\nfunction parseColorValue(value: unknown): FlatParse {\n if (Array.isArray(value)) {\n const [r, g, b] = value as unknown[];\n const t: [number, number, number] = [Number(r), Number(g), Number(b)];\n return { kind: \"color\", rgb: t, str: `rgb(${t[0]},${t[1]},${t[2]})` };\n }\n if (typeof value !== \"string\") {\n return CYJS_THROWS;\n }\n const t = colorTuple(value);\n return t === null ? null : { kind: \"color\", rgb: t, str: `rgb(${t[0]},${t[1]},${t[2]})` };\n}\n\n/**\n * A size as Cytoscape.js reads it: a non-negative number in `px` or `em`, a number read past an unknown suffix, and\n * a node size of `label`.\n * @param spec - the property\n * @param value - the value, trimmed\n * @param raw - the value as given\n * @returns the size, or null when refused\n */\nfunction parseSizeValue(spec: CyjsPropertySpec, value: unknown, raw: unknown): CyjsFlat | null {\n let units: \"px\" | \"em\" | null = \"px\";\n let text: unknown = value;\n if (typeof value === \"string\") {\n const m = NUMBER_UNITS.exec(value);\n if (m === null) {\n units = null;\n } else {\n text = m[1];\n units = m.at(2) === \"em\" ? \"em\" : \"px\";\n }\n }\n const x = Number.parseFloat(String(text));\n if (Number.isNaN(x)) {\n return spec.type === \"nodeSize\" && raw === \"label\" ? { kind: \"word\", value: \"label\", str: \"label\" } : null;\n }\n return x < 0 ? null : { kind: \"number\", value: x, units, str: `${String(x)}${units ?? \"\"}` };\n}\n\n/**\n * Splits the arguments of `mapData(...)` at the commas outside parentheses.\n * @param inner - the text between the outer parentheses\n * @returns the arguments\n */\nfunction splitArgs(inner: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let start = 0;\n for (let i = 0; i < inner.length; i++) {\n const c = inner[i];\n if (c === \"(\") {\n depth++;\n } else if (c === \")\") {\n depth--;\n } else if (c === \",\" && depth === 0) {\n out.push(inner.slice(start, i));\n start = i + 1;\n }\n }\n out.push(inner.slice(start));\n return out;\n}\n\n/**\n * The text between the parentheses of `name(...)`, found by position: the name, optional whitespace, `(`, and a\n * last character `)`.\n * @param value - the trimmed value\n * @param name - `data` or `mapData`\n * @returns the inner text, or null\n */\nfunction callArgs(value: string, name: string): string | null {\n if (!value.startsWith(name) || !value.endsWith(\")\")) {\n return null;\n }\n let i = name.length;\n while (i < value.length && /\\s/.test(value[i])) {\n i++;\n }\n return value[i] === \"(\" ? value.slice(i + 1, -1) : null;\n}\n\n/**\n * Parses a property value the way Cytoscape.js does: a mapper in a rule, else a flat value.\n * @param spec - the property\n * @param raw - the value as given\n * @param mode - a stylesheet rule, an element bypass, or a mapper's per-element value\n * @returns the parsed value, null when Cytoscape.js refuses it, or `CYJS_THROWS`\n */\nexport function parseCyjsValue(\n spec: CyjsPropertySpec,\n raw: unknown,\n mode: CyjsParseMode,\n): CyjsParsed | null | typeof CYJS_THROWS {\n if (raw === undefined) {\n return null;\n }\n if (typeof raw === \"function\") {\n return mode === \"flat\" ? null : { kind: \"fn\" };\n }\n const value = typeof raw === \"string\" ? raw.trim() : raw;\n if (mode !== \"flat\" && typeof value === \"string\" && value.length >= 7 && value[1] === \"a\") {\n const mapper = parseMapper(spec, value, mode);\n if (mapper !== undefined) {\n return mapper;\n }\n }\n return parseFlat(spec, raw);\n}\n\n/**\n * A `data()` or `mapData()` value.\n * @param spec - the property\n * @param value - the trimmed value\n * @param mode - a rule or a bypass\n * @returns the mapper, null when it is refused (or its constant), or undefined when the value is not a mapper\n */\nfunction parseMapper(spec: CyjsPropertySpec, value: string, mode: CyjsParseMode): CyjsParsed | null | undefined {\n if (value.startsWith(\"d\")) {\n const field = callArgs(value, \"data\")?.trim();\n if (field === undefined || !FIELD.test(field)) {\n return undefined;\n }\n return mode === \"bypass\" ? null : { kind: \"data\", field };\n }\n if (!value.startsWith(\"m\") || value.length < 10) {\n return undefined;\n }\n return parseMapData(spec, value, mode);\n}\n\n/**\n * A `mapData()` value.\n * @param spec - the property\n * @param value - the trimmed value, starting with `m`\n * @param mode - a rule or a bypass\n * @returns the mapper, null when it is refused (or its constant), or undefined when the value is not a mapper\n */\nfunction parseMapData(spec: CyjsPropertySpec, value: string, mode: CyjsParseMode): CyjsParsed | null | undefined {\n const inner = callArgs(value, \"mapData\");\n if (inner === null) {\n return undefined;\n }\n const args = splitArgs(inner);\n if (!isMapDataArgs(args)) {\n return undefined;\n }\n if (mode === \"bypass\") {\n return null;\n }\n const numeric =\n spec.type === \"zeroOne\" || spec.type === \"positive\" || spec.type === \"size\" || spec.type === \"nodeSize\";\n if (spec.type !== \"color\" && !numeric) {\n return null;\n }\n const min = parseFlat(spec, args[3].trim());\n const max = parseFlat(spec, args[4].trim());\n if (min === null || max === null || min === CYJS_THROWS || max === CYJS_THROWS) {\n return null;\n }\n if (min.str === max.str || (min.kind === \"number\" && max.kind === \"number\" && pfValue(min) === pfValue(max))) {\n const constant = parseFlat(spec, min.str);\n return constant === CYJS_THROWS ? null : constant;\n }\n return {\n kind: \"mapData\",\n field: args[0].trim(),\n fieldMin: Number.parseFloat(args[1]),\n fieldMax: Number.parseFloat(args[2]),\n min,\n max,\n };\n}\n\n/**\n * Whether `mapData`'s arguments have Cytoscape.js's shape: a field, two numbers and two values.\n * @param args - the arguments\n * @returns true when they do\n */\nfunction isMapDataArgs(args: readonly string[]): boolean {\n return (\n args.length === 5 &&\n /^[\\w.]+\\s*$/.test(args[0]) &&\n NUMBER_ONLY.test(args[1]) &&\n NUMBER_ONLY.test(args[2]) &&\n MAP_ARG.test(args[3].trim()) &&\n MAP_ARG.test(args[4].replace(/^\\s+/, \"\"))\n );\n}\n\n/**\n * A number's value in pixels as Cytoscape.js normalizes it in a headless core (an `em` is 1 pixel there).\n * @param v - the number\n * @returns the normalized value\n */\nfunction pfValue(v: CyjsFlat & { kind: \"number\" }): number {\n return v.value;\n}\n\n/**\n * A field of an element's data as a mapper reads it: the dotted path walked while each step is truthy.\n * @param data - the element's data object\n * @param field - the field\n * @returns the value\n */\nfunction mapperField(data: unknown, field: string): unknown {\n let v: unknown = data;\n for (const step of field.split(\".\")) {\n if (!v) {\n break;\n }\n v = (v as Record<string, unknown>)[step];\n }\n return v;\n}\n\n/**\n * Evaluates a mapper for one element the way Cytoscape.js applies it.\n * @param spec - the property\n * @param m - the mapper\n * @param data - the element's data object\n * @returns the flat value, null when the mapper fails (the property resets to its default), or `CYJS_THROWS`\n */\nexport function applyCyjsMapper(\n spec: CyjsPropertySpec,\n m: CyjsParsed & { kind: \"data\" | \"mapData\" },\n data: unknown,\n): FlatParse {\n const v = mapperField(data, m.field);\n if (v === null || v === undefined) {\n return null;\n }\n if (m.kind === \"data\") {\n return parseFlat(spec, v);\n }\n if (typeof v !== \"number\" || Number.isNaN(v)) {\n return null;\n }\n const width = m.fieldMax - m.fieldMin;\n const p = Math.min(1, Math.max(0, width === 0 ? 0 : (v - m.fieldMin) / width));\n const { min, max } = m;\n if (min.kind === \"color\" && max.kind === \"color\") {\n const c = [0, 1, 2].map((k) => Math.round(min.rgb[k] + (max.rgb[k] - min.rgb[k]) * p)) as [\n number,\n number,\n number,\n ];\n return { kind: \"color\", rgb: c, str: `rgb(${c[0]}, ${c[1]}, ${c[2]})` };\n }\n if (min.kind === \"number\" && max.kind === \"number\") {\n return parseFlat(spec, min.value + (max.value - min.value) * p);\n }\n return null;\n}\n\n/**\n * The neutral value a flat value is drawn as, for one property. A value Cytoscape.js draws from the page (an `em`\n * size, a node sized to its label) cannot be evaluated: it is noted and undefined is returned.\n * @param spec - the property\n * @param v - the flat value\n * @param site - where it was read\n * @returns the neutral value (for the combined parts, the Cytoscape.js word), or undefined\n */\nexport function cyjsNeutral(spec: CyjsPropertySpec, v: CyjsFlat, site: CanonSite): StyleValue | undefined {\n switch (v.kind) {\n case \"color\": {\n if (v.rgb.some((c) => !Number.isFinite(c) || c < 0 || c > 255)) {\n site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, {\n sample: v.str,\n element: site.element,\n });\n return undefined;\n }\n return `#${v.rgb.map((c) => Math.round(c).toString(16).padStart(2, \"0\")).join(\"\")}`;\n }\n case \"number\":\n if (v.units === \"em\") {\n site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, {\n sample: v.str,\n element: site.element,\n });\n return undefined;\n }\n return num6(v.value);\n default:\n break;\n }\n const word = v.value;\n switch (spec.property) {\n case \"width\":\n case \"height\":\n site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, { sample: v.str, element: site.element });\n return undefined;\n case \"label\":\n case \"sourceLabel\":\n case \"targetLabel\":\n case \"labelFont\":\n return String(word);\n case \"labelItalic\":\n return word === \"italic\" || word === \"oblique\";\n case \"curved\":\n return !STRAIGHT.has(String(word));\n case \"shape\":\n return canonEnum(\"shape\", String(word), \"cytoscape-js\", site) ?? undefined;\n case \"borderStyle\":\n return canonEnum(\"borderStyle\", String(word), \"cytoscape-js\", site) ?? undefined;\n case \"lineStyle\":\n return canonEnum(\"lineStyle\", String(word), \"cytoscape-js\", site) ?? undefined;\n case \"sourceArrow\":\n case \"targetArrow\":\n return canonEnum(\"arrow\", String(word), \"cytoscape-js\", site) ?? undefined;\n case \"labelWeight\":\n return canonEnum(\"weight\", String(word), \"cytoscape-js\", site) ?? undefined;\n default:\n return word;\n }\n}\n\n/**\n * What a value a Cytoscape.js core reports for an element (`ele.style(name)`, always text) is drawn as.\n * @param target - nodes or edges\n * @param name - the Cytoscape.js property name\n * @param str - the reported value\n * @param site - where it was read\n * @returns the neutral value (for the combined parts, the Cytoscape.js word), null when the property is not carried\n * or the value does not parse, or undefined when it cannot be evaluated (noted)\n */\nexport function cyjsRendered(\n target: StyleTarget,\n name: string,\n str: unknown,\n site: CanonSite,\n): StyleValue | null | undefined {\n const spec = cyjsProperties(target).get(cyjsPropertyName(name));\n if (spec === undefined || typeof str !== \"string\") {\n return null;\n }\n const v = parseFlat(spec, str, true);\n if (v === null || v === CYJS_THROWS) {\n return null;\n }\n return cyjsNeutral(spec, v, site);\n}\n","/**\n * Cytoscape.js's selector grammar, parsed the way Cytoscape.js 3.x parses it, by index in one pass. The grammar is\n * Cytoscape.js's own: the same tokens tried in the same order (group, state, `#id`, `.class`, `[a]`, `[a op v]`,\n * `[?a]`, `[[degree op n]]`, then the separators `,` `->` `<->` `>` and a space, and the subject `$`), building the\n * same query structure, so a selector that is valid there is valid here and selects the same elements.\n *\n * Two of Cytoscape.js's behaviors are kept on purpose because files depend on them:\n * - an invalid selector keeps what was parsed before the error. A selector whose first token fails has one empty\n * query and matches every node and edge; `node:not(.a)` keeps `node` and matches every node.\n * - a string value is kept as written between its quotes: `[a = \"x\\\"y\"]` compares with `x\\\"y`.\n */\n\n/** A comparison operator after its `!` and `@` flags are taken off. */\nexport type CyjsCompareOp = \"=\" | \">\" | \">=\" | \"<\" | \"<=\" | \"*=\" | \"^=\" | \"$=\";\n\n/** One check of a query; a query matches when every check does. */\nexport type CyjsCheck =\n | {\n /** The kind of check. */ readonly type: \"group\";\n /** The value compared with or matched. */ readonly value: \"nodes\" | \"edges\" | \"*\";\n }\n | {\n /** The kind of check. */ readonly type: \"state\";\n /** The value compared with or matched. */ readonly value: string;\n }\n | {\n /** The kind of check. */ readonly type: \"id\";\n /** The value compared with or matched. */ readonly value: string;\n }\n | {\n /** The kind of check. */ readonly type: \"class\";\n /** The value compared with or matched. */ readonly value: string;\n }\n | {\n /** The kind of check. */ readonly type: \"exist\";\n /** The data field (or, for `meta`, the degree) the check reads. */ readonly field: string;\n }\n | {\n /** The kind of check. */ readonly type: \"compare\";\n /** The data field (or, for `meta`, the degree) the check reads. */ readonly field: string;\n /** The operator. */ readonly op: CyjsCompareOp;\n /** Whether the comparison is negated (`!`). */ readonly not: boolean;\n /** Whether a string comparison ignores case (`@`). */ readonly ci: boolean;\n /** The value compared with or matched. */ readonly value: string | number;\n }\n | {\n /** The kind of check. */ readonly type: \"bool\";\n /** The data field (or, for `meta`, the degree) the check reads. */ readonly field: string;\n /** The operator. */ readonly op: \"?\" | \"!\" | \"^\";\n }\n | {\n /** The kind of check. */ readonly type: \"meta\";\n /** The data field (or, for `meta`, the degree) the check reads. */ readonly field:\n \"degree\" | \"indegree\" | \"outdegree\";\n /** The operator. */ readonly op: CyjsCompareOp;\n /** Whether the comparison is negated (`!`). */ readonly not: boolean;\n /** Whether a string comparison ignores case (`@`). */ readonly ci: boolean;\n /** The value compared with or matched. */ readonly value: number;\n }\n | {\n /** The kind of check: matches every element. */\n readonly type: \"true\";\n }\n | {\n /** The kind of check. */ readonly type: \"child\";\n /** The query the parent must match. */ readonly parent: CyjsQuery;\n /** The query the child must match. */ readonly child: CyjsQuery;\n }\n | {\n /** The kind of check. */ readonly type: \"descendant\";\n /** The query an ancestor must match. */ readonly ancestor: CyjsQuery;\n /** The query the descendant must match. */ readonly descendant: CyjsQuery;\n }\n | {\n /** The kind of check. */ readonly type: \"parent\";\n /** The query the parent must match. */ readonly parent: CyjsQuery;\n /** The query the child must match. */ readonly child: CyjsQuery;\n }\n | {\n /** The kind of check. */ readonly type: \"ancestor\";\n /** The query an ancestor must match. */ readonly ancestor: CyjsQuery;\n /** The query the descendant must match. */ readonly descendant: CyjsQuery;\n }\n | {\n /** The kind of check. */ readonly type: \"split\";\n /** The query left of the separator. */ readonly left: CyjsQuery;\n /** The query right of the separator. */ readonly right: CyjsQuery;\n /** The query marked as the subject with `$`. */ readonly subject: CyjsQuery;\n }\n | {\n /** The kind of check. */ readonly type: \"directedEdge\";\n /** The query the source node must match. */ readonly source: CyjsQuery;\n /** The query the target node must match. */ readonly target: CyjsQuery;\n }\n | {\n /** The kind of check. */ readonly type: \"undirectedEdge\";\n /** The queries the two end nodes must match, in either order. */ readonly nodes: readonly [\n CyjsQuery,\n CyjsQuery,\n ];\n }\n | {\n /** The kind of check. */ readonly type: \"nodeSource\";\n /** The query the source node must match. */ readonly source: CyjsQuery;\n /** The query the target node must match. */ readonly target: CyjsQuery;\n }\n | {\n /** The kind of check. */ readonly type: \"nodeTarget\";\n /** The query the source node must match. */ readonly source: CyjsQuery;\n /** The query the target node must match. */ readonly target: CyjsQuery;\n }\n | {\n /** The kind of check. */ readonly type: \"nodeNeighbor\";\n /** The query the node itself must match. */ readonly node: CyjsQuery;\n /** The query a neighbor must match. */ readonly neighbor: CyjsQuery;\n };\n\n/** One comma-separated alternative of a selector. */\nexport interface CyjsQuery {\n /** The checks; an empty list matches every element. */\n checks: CyjsCheck[];\n}\n\n/** A parsed selector. */\nexport interface CyjsSelector {\n /** The alternatives; an element matches when any one does. None: the selector matches nothing. */\n readonly queries: readonly CyjsQuery[];\n /** Cytoscape.js rejects the selector; the queries hold what it parsed before the error. */\n readonly invalid: boolean;\n}\n\n/** Every state selector Cytoscape.js 3.x knows. */\nconst CYJS_STATES: ReadonlySet<string> = new Set([\n \"selected\",\n \"unselected\",\n \"selectable\",\n \"unselectable\",\n \"locked\",\n \"unlocked\",\n \"visible\",\n \"hidden\",\n \"transparent\",\n \"grabbed\",\n \"free\",\n \"removed\",\n \"inside\",\n \"grabbable\",\n \"ungrabbable\",\n \"animated\",\n \"unanimated\",\n \"parent\",\n \"childless\",\n \"child\",\n \"orphan\",\n \"nonorphan\",\n \"compound\",\n \"loop\",\n \"simple\",\n \"active\",\n \"inactive\",\n \"backgrounding\",\n \"nonbackgrounding\",\n]);\n\n/** The longest selector parsed; a longer one is treated as invalid (and noted by the caller). */\nconst MAX_SELECTOR_LENGTH = 1 << 22;\n\n/** Cytoscape.js's escapable meta characters. */\nconst META = new Set(\"!\\\"#$%&'()*+,./:;<=>?@[]^`{|}~\");\n/** The base comparison operators, longest first so a scan takes `>=` before `>`. */\nconst BASE_OPS: readonly string[] = [\"!=\", \">=\", \"<=\", \"*=\", \"^=\", \"$=\", \"=\", \">\", \"<\"];\nconst META_FIELDS: readonly (\"indegree\" | \"outdegree\" | \"degree\")[] = [\"indegree\", \"outdegree\", \"degree\"];\n\n/**\n * Whether a character is a JavaScript regular expression word character.\n * @param c - the character\n * @returns true for `[A-Za-z0-9_]`\n */\nfunction isWord(c: string | undefined): boolean {\n if (c === undefined) {\n return false;\n }\n const k = c.codePointAt(0) ?? 0;\n return (k >= 48 && k <= 57) || (k >= 65 && k <= 90) || (k >= 97 && k <= 122) || k === 95;\n}\n\n/**\n * Whether a character is JavaScript regular expression whitespace (`\\s`).\n * @param c - the character\n * @returns true for whitespace\n */\nfunction isSpace(c: string | undefined): boolean {\n return c !== undefined && /\\s/.test(c);\n}\n\n/** The text being parsed and the position reached. */\nclass Cursor {\n pos = 0;\n constructor(readonly text: string) {}\n\n /**\n * The end of a run of whitespace.\n * @param from - where the run starts\n * @returns the first position after it\n */\n spaceEnd(from: number): number {\n let i = from;\n while (i < this.text.length && isSpace(this.text[i])) {\n i++;\n }\n return i;\n }\n\n /**\n * A name at `from`: word characters, `-`, and `.` when `dots` (Cytoscape.js's variable and id tokens), or a\n * backslash before a meta character.\n * @param from - the start\n * @param dots - whether `.` belongs to the name\n * @returns the raw name and its end, or null when there is none\n */\n name(from: number, dots: boolean): { raw: string; end: number } | null {\n let i = from;\n const t = this.text;\n while (i < t.length) {\n const c = t[i];\n if (isWord(c) || c === \"-\" || (dots && c === \".\")) {\n i++;\n } else if (c === \"\\\\\" && i + 1 < t.length && META.has(t[i + 1])) {\n i += 2;\n } else {\n break;\n }\n }\n return i > from ? { raw: t.slice(from, i), end: i } : null;\n }\n\n /**\n * A number literal at `from` (Cytoscape.js's `[-+]?(\\d+|\\d*\\.\\d+)([Ee][+-]?\\d+)?`). Both readings of the\n * mantissa are returned, longest first, because the regular expression backtracks to the shorter one.\n * @param from - the start\n * @returns the possible ends, longest first\n */\n numberEnds(from: number): number[] {\n const t = this.text;\n let i = from;\n if (t[i] === \"+\" || t[i] === \"-\") {\n i++;\n }\n const digits = (k: number): number => {\n let j = k;\n while (j < t.length && t[j] >= \"0\" && t[j] <= \"9\") {\n j++;\n }\n return j;\n };\n const mantissas: number[] = [];\n const intEnd = digits(i);\n if (intEnd > i) {\n mantissas.push(intEnd);\n }\n // \\d*\\.\\d+\n if (t[intEnd] === \".\") {\n const fracEnd = digits(intEnd + 1);\n if (fracEnd > intEnd + 1) {\n mantissas.unshift(fracEnd);\n }\n }\n const ends: number[] = [];\n for (const m of mantissas) {\n if (t[m] === \"e\" || t[m] === \"E\") {\n let j = m + 1;\n if (t[j] === \"+\" || t[j] === \"-\") {\n j++;\n }\n const expEnd = digits(j);\n if (expEnd > j) {\n ends.push(expEnd);\n }\n }\n ends.push(m);\n }\n return ends;\n }\n\n /**\n * The possible ends of a quoted string at `from`: every quote that may close it, longest first (a quote after a\n * backslash may also be escaped; the first quote with no backslash before it must close the string).\n * @param from - the opening quote\n * @returns the possible ends (after the closing quote), longest first\n */\n stringEnds(from: number): number[] {\n const t = this.text;\n const q = t[from];\n const ends: number[] = [];\n for (let i = from + 1; i < t.length; i++) {\n if (t[i] !== q) {\n continue;\n }\n ends.push(i + 1);\n if (t[i - 1] !== \"\\\\\" || i - 1 === from) {\n break;\n }\n }\n return ends.reverse();\n }\n\n /**\n * A comparison operator at `from`: `!` and `@` flags, then a base operator (`!` before a base that holds `!`\n * is not allowed).\n * @param from - the start\n * @returns the operator text and its end, or null\n */\n op(from: number): { text: string; end: number } | null {\n const t = this.text;\n let i = from;\n let prefix = \"\";\n if (t[i] === \"!\" && t[i + 1] !== \"=\") {\n prefix += \"!\";\n i++;\n }\n if (t[i] === \"@\") {\n prefix += \"@\";\n i++;\n }\n for (const base of BASE_OPS) {\n if (t.startsWith(base, i)) {\n if (prefix.includes(\"!\") && base === \"!=\") {\n return null;\n }\n return { text: prefix + base, end: i + base.length };\n }\n }\n return null;\n }\n}\n\n/**\n * A name with its backslash escapes of meta characters removed.\n * @param raw - the name as written\n * @returns the name\n */\nfunction cleanMeta(raw: string): string {\n let out = \"\";\n let i = 0;\n while (i < raw.length) {\n const escaped = raw[i] === \"\\\\\" && i + 1 < raw.length && META.has(raw[i + 1]);\n out += escaped ? raw[i + 1] : raw[i];\n i += escaped ? 2 : 1;\n }\n return out;\n}\n\n/**\n * Splits an operator into its base and its flags.\n * @param text - the operator as written\n * @returns the base operator and the `!` and `@` flags\n */\nfunction splitOp(text: string): { op: CyjsCompareOp; not: boolean; ci: boolean } {\n let op = text;\n let not = false;\n let ci = false;\n if (op.includes(\"!\")) {\n op = op.replace(\"!\", \"\");\n not = true;\n }\n if (op.includes(\"@\")) {\n op = op.replace(\"@\", \"\");\n ci = true;\n }\n return { op: op as CyjsCompareOp, not, ci };\n}\n\n/** The parser's state across queries: Cytoscape.js's selector object while it is filled. */\ninterface Building {\n readonly queries: CyjsQuery[];\n subject: CyjsQuery | null;\n edgeCount: number;\n compoundCount: number;\n readonly counts: { edgeCount: number; compoundCount: number; subject: CyjsQuery | null }[];\n}\n\n/** A token matched at the cursor: how to fill the selector, and where it ends. */\ninterface Token {\n readonly end: number;\n readonly fill: (b: Building, q: CyjsQuery) => CyjsQuery | null | false;\n}\n\n/**\n * Replaces the last query of the selector.\n * @param b - the selector being built\n * @param q - the replacement\n */\nfunction replaceLast(b: Building, q: CyjsQuery): void {\n b.queries[b.queries.length - 1] = q;\n}\n\n/**\n * The last query of the selector (a selector always has one).\n * @param b - the selector being built\n * @returns the query\n */\nfunction lastQuery(b: Building): CyjsQuery {\n return b.queries.at(-1) as CyjsQuery;\n}\n\n/**\n * The compound separators (`>` and a space) as Cytoscape.js fills them.\n * @param kind - child or descendant\n * @returns the fill function\n */\nfunction compoundFill(kind: \"child\" | \"descendant\"): Token[\"fill\"] {\n return (b, query) => {\n if (b.subject === null) {\n const outer: CyjsQuery = { checks: [] };\n const inner: CyjsQuery = { checks: [] };\n const left = lastQuery(b);\n outer.checks.push(\n kind === \"child\"\n ? { type: \"child\", parent: left, child: inner }\n : { type: \"descendant\", ancestor: left, descendant: inner },\n );\n replaceLast(b, outer);\n b.compoundCount++;\n return inner;\n }\n if (b.subject === query) {\n const compound: CyjsQuery = { checks: [] };\n const left = lastQuery(b);\n const right: CyjsQuery = { checks: [] };\n const subject: CyjsQuery = { checks: query.checks };\n const inner: CyjsQuery = { checks: [] };\n const outer: CyjsQuery = { checks: [{ type: \"true\" }] };\n query.checks = [{ type: \"true\" }];\n right.checks.push(\n kind === \"child\"\n ? { type: \"parent\", parent: outer, child: inner }\n : { type: \"ancestor\", ancestor: outer, descendant: inner },\n );\n compound.checks.push({ type: \"split\", left, right, subject });\n replaceLast(b, compound);\n b.subject = subject;\n b.compoundCount++;\n return inner;\n }\n const outer: CyjsQuery = { checks: query.checks };\n const inner: CyjsQuery = { checks: [] };\n query.checks = [\n kind === \"child\"\n ? { type: \"parent\", parent: outer, child: inner }\n : { type: \"ancestor\", ancestor: outer, descendant: inner },\n ];\n b.compoundCount++;\n return inner;\n };\n}\n\n/**\n * The first of Cytoscape.js's expressions that matches at the cursor, in its order.\n * @param c - the cursor\n * @returns the token, or null when none matches (the selector is invalid)\n */\nfunction nextToken(c: Cursor): Token | null {\n const ch = c.text[c.pos];\n return (\n groupToken(c) ??\n (ch === \":\" ? stateToken(c) : null) ??\n (ch === \"#\" || ch === \".\" ? nameToken(c, ch) : null) ??\n (ch === \"[\" ? dataToken(c, c.pos) : null) ??\n separatorToken(c) ??\n (ch === \"$\" ? subjectToken(c) : null)\n );\n}\n\n/**\n * A check that fills the query with a fixed check.\n * @param end - where the token ends\n * @param check - the check\n * @returns the token\n */\nfunction checkToken(end: number, check: CyjsCheck): Token {\n return {\n end,\n fill: (_b, q) => {\n q.checks.push(check);\n return null;\n },\n };\n}\n\n/**\n * A group: `node`, `edge` or `*`.\n * @param c - the cursor\n * @returns the token, or null\n */\nfunction groupToken(c: Cursor): Token | null {\n const i = c.pos;\n for (const [g, value] of [\n [\"node\", \"nodes\"],\n [\"edge\", \"edges\"],\n [\"*\", \"*\"],\n ] as const) {\n if (c.text.startsWith(g, i)) {\n return checkToken(i + g.length, { type: \"group\", value });\n }\n }\n return null;\n}\n\n/**\n * A state: the longest state name that is a prefix after the `:`.\n * @param c - the cursor\n * @returns the token, or null\n */\nfunction stateToken(c: Cursor): Token | null {\n const i = c.pos;\n let best: string | null = null;\n for (const s of CYJS_STATES) {\n if (c.text.startsWith(s, i + 1) && (best === null || s.length > best.length)) {\n best = s;\n }\n }\n return best === null ? null : checkToken(i + 1 + best.length, { type: \"state\", value: best });\n}\n\n/**\n * An id (`#`) or a class (`.`).\n * @param c - the cursor\n * @param ch - the `#` or `.`\n * @returns the token, or null\n */\nfunction nameToken(c: Cursor, ch: \"#\" | \".\"): Token | null {\n const n = c.name(c.pos + 1, ch === \"#\");\n if (n === null) {\n return null;\n }\n return checkToken(n.end, { type: ch === \"#\" ? \"id\" : \"class\", value: cleanMeta(n.raw) });\n}\n\n/**\n * A separator: `\\s*,\\s*`, `\\s+->\\s+`, `\\s+<->\\s+`, `\\s+>\\s+` or `\\s+`.\n * @param c - the cursor\n * @returns the token, or null\n */\nfunction separatorToken(c: Cursor): Token | null {\n const t = c.text;\n const i = c.pos;\n const ws = c.spaceEnd(i);\n if (t[ws] === \",\") {\n return { end: c.spaceEnd(ws + 1), fill: nextQuery };\n }\n if (ws === i) {\n return null;\n }\n for (const [sep, kind] of [\n [\"->\", \"directed\"],\n [\"<->\", \"undirected\"],\n [\">\", \"child\"],\n ] as const) {\n const after = t.startsWith(sep, ws) ? c.spaceEnd(ws + sep.length) : -1;\n if (after > ws + sep.length) {\n return { end: after, fill: kind === \"child\" ? compoundFill(\"child\") : edgeFill(kind) };\n }\n }\n return { end: ws, fill: compoundFill(\"descendant\") };\n}\n\n/**\n * Starts the next query of a selector list (`,`).\n * @param b - the selector being built\n * @returns the new query\n */\nfunction nextQuery(b: Building): CyjsQuery {\n b.counts.push({ edgeCount: b.edgeCount, compoundCount: b.compoundCount, subject: b.subject });\n b.subject = null;\n b.edgeCount = 0;\n b.compoundCount = 0;\n const next: CyjsQuery = { checks: [] };\n b.queries.push(next);\n return next;\n}\n\n/**\n * The subject marker `$`: the query it follows is the one the selector selects.\n * @param c - the cursor\n * @returns the token\n */\nfunction subjectToken(c: Cursor): Token {\n return {\n end: c.pos + 1,\n fill: (b, q) => {\n if (b.subject !== null && b.subject !== q) {\n return false;\n }\n b.subject = q;\n const top = lastQuery(b);\n const first = top.checks.at(0);\n if (first?.type === \"directedEdge\") {\n top.checks[0] = { type: \"nodeTarget\", source: first.source, target: first.target };\n } else if (first?.type === \"undirectedEdge\") {\n top.checks[0] = { type: \"nodeNeighbor\", node: first.nodes[1], neighbor: first.nodes[0] };\n }\n return null;\n },\n };\n}\n\n/**\n * The edge separators (`->`, `<->`) as Cytoscape.js fills them.\n * @param kind - directed or undirected\n * @returns the fill function\n */\nfunction edgeFill(kind: \"directed\" | \"undirected\"): Token[\"fill\"] {\n return (b, query) => {\n const target: CyjsQuery = { checks: [] };\n const outer: CyjsQuery = { checks: [] };\n if (b.subject === null) {\n outer.checks.push(\n kind === \"directed\"\n ? { type: \"directedEdge\", source: query, target }\n : { type: \"undirectedEdge\", nodes: [query, target] },\n );\n replaceLast(b, outer);\n b.edgeCount++;\n return target;\n }\n if (kind === \"directed\") {\n outer.checks.push({ type: \"nodeSource\", source: query, target });\n replaceLast(b, outer);\n b.edgeCount++;\n return target;\n }\n outer.checks.push({ type: \"nodeNeighbor\", node: query, neighbor: target });\n replaceLast(b, outer);\n return target;\n };\n}\n\n/**\n * A `[...]` token at `i`: data existence, a data comparison, a data boolean or a metadata comparison, tried in\n * Cytoscape.js's order.\n * @param c - the cursor\n * @param i - the position of `[`\n * @returns the token, or null\n */\nfunction dataToken(c: Cursor, i: number): Token | null {\n const inner = c.spaceEnd(i + 1);\n return compareToken(c, inner) ?? boolToken(c, inner) ?? (c.text[i + 1] === \"[\" ? metaToken(c, i) : null);\n}\n\n/**\n * `[a]` or `[a op value]`.\n * @param c - the cursor\n * @param inner - the position after `[` and its whitespace\n * @returns the token, or null\n */\nfunction compareToken(c: Cursor, inner: number): Token | null {\n const t = c.text;\n const v = c.name(inner, true);\n if (v === null) {\n return null;\n }\n const field = cleanMeta(v.raw);\n const afterName = c.spaceEnd(v.end);\n if (t[afterName] === \"]\") {\n return checkToken(afterName + 1, { type: \"exist\", field });\n }\n const op = c.op(afterName);\n if (op === null) {\n return null;\n }\n const at = c.spaceEnd(op.end);\n const quoted = t[at] === '\"' || t[at] === \"'\";\n const end = (quoted ? c.stringEnds(at) : c.numberEnds(at)).find((x) => t[c.spaceEnd(x)] === \"]\");\n if (end === undefined) {\n return null;\n }\n const literal = t.slice(at, end);\n const value: string | number = quoted ? literal.slice(1, -1) : Number.parseFloat(literal);\n const { op: base, not, ci } = splitOp(op.text);\n return checkToken(c.spaceEnd(end) + 1, { type: \"compare\", field, op: base, not, ci, value });\n}\n\n/**\n * `[?a]`, `[!a]` or `[^a]`.\n * @param c - the cursor\n * @param inner - the position after `[` and its whitespace\n * @returns the token, or null\n */\nfunction boolToken(c: Cursor, inner: number): Token | null {\n const t = c.text;\n const flag = t[inner];\n if (flag !== \"?\" && flag !== \"!\" && flag !== \"^\") {\n return null;\n }\n const n = c.name(c.spaceEnd(inner + 1), true);\n const close = n === null ? -1 : c.spaceEnd(n.end);\n if (n === null || t[close] !== \"]\") {\n return null;\n }\n return checkToken(close + 1, { type: \"bool\", field: cleanMeta(n.raw), op: flag });\n}\n\n/**\n * `[[degree op n]]`.\n * @param c - the cursor\n * @param i - the position of the first `[`\n * @returns the token, or null\n */\nfunction metaToken(c: Cursor, i: number): Token | null {\n const t = c.text;\n const at = c.spaceEnd(i + 2);\n const field = META_FIELDS.find((f) => t.startsWith(f, at));\n const op = field === undefined ? null : c.op(c.spaceEnd(at + field.length));\n if (field === undefined || op === null) {\n return null;\n }\n const numAt = c.spaceEnd(op.end);\n const end = c.numberEnds(numAt).find((x) => {\n const close = c.spaceEnd(x);\n return t[close] === \"]\" && t[close + 1] === \"]\";\n });\n if (end === undefined) {\n return null;\n }\n const value = Number.parseFloat(t.slice(numAt, end));\n const { op: base, not, ci } = splitOp(op.text);\n return checkToken(c.spaceEnd(end) + 2, { type: \"meta\", field, op: base, not, ci, value });\n}\n\n/**\n * Whether a selector is blank: white space only.\n * @param text - the selector\n * @returns true when blank\n */\nfunction isBlank(text: string): boolean {\n return /^\\s*$/.test(text.length > 1024 ? text.slice(0, 1024) : text) && text.trim() === \"\";\n}\n\n/**\n * Parses a selector the way Cytoscape.js does.\n * @param text - the selector\n * @returns the queries and whether Cytoscape.js rejects the selector\n */\nexport function parseCyjsSelector(text: unknown): CyjsSelector {\n // a missing or blank selector matches nothing\n if (typeof text !== \"string\" || isBlank(text)) {\n return { queries: [], invalid: false };\n }\n if (text.length > MAX_SELECTOR_LENGTH) {\n return { queries: [], invalid: true };\n }\n const c = new Cursor(text);\n const first: CyjsQuery = { checks: [] };\n const b: Building = { queries: [first], subject: null, edgeCount: 0, compoundCount: 0, counts: [] };\n let current = first;\n c.pos = c.spaceEnd(0);\n for (;;) {\n const tok = nextToken(c);\n if (tok === null) {\n return { queries: b.queries, invalid: true };\n }\n const next = tok.fill(b, current);\n if (next === false) {\n return { queries: b.queries, invalid: true };\n }\n if (next !== null) {\n current = next;\n }\n c.pos = tok.end;\n if (c.spaceEnd(c.pos) >= text.length) {\n break;\n }\n }\n b.counts.push({ edgeCount: b.edgeCount, compoundCount: b.compoundCount, subject: b.subject });\n // a query may hold one edge or compound relation, not both and not two edges\n const invalid = b.counts.some((k) => (k.compoundCount > 0 && k.edgeCount > 0) || k.edgeCount > 1);\n return { queries: b.queries, invalid };\n}\n","/**\n * A Cytoscape.js stylesheet written as text (`node { background-color: red; } edge[w > 2] { width: 4 }`), read the\n * way Cytoscape.js 3.34's `appendFromString` reads it, in linear passes instead of its backtracking patterns:\n *\n * - comments `/* ... *\\/` holding at least one character are removed first;\n * - each block is the text before the first `{` (the selector) and the text up to the next `}` (the properties);\n * an empty block takes the `}` and runs to the next one;\n * - a block whose selector Cytoscape.js rejects is skipped; text with no further block stops the reading;\n * - each property is `name: value` ending at `;` or at the end of the block, on one line; a property name is\n * taken as written (no camel case), and a block with a property that does not have this shape stops the reading.\n */\n\nimport { parseCyjsSelector } from \"./selector.js\";\n\n/** One block of a stylesheet: its selector and its properties in order. */\nexport interface CyjsSheetEntry {\n /** The selector as written. */\n readonly selector: unknown;\n /** `[name, value]` in order. */\n readonly properties: readonly (readonly [string, unknown])[];\n /** Whether property names are taken as written (text) or camel case is also read (JSON). */\n readonly dashOnly: boolean;\n}\n\n/**\n * Why reading a text stylesheet stopped early, or null.\n * @category Styles\n */\nexport type CyjsSheetStop = \"NO_BLOCK\" | \"BAD_PROPERTY\" | null;\n\n/** Line terminators, which `.` in Cytoscape.js's patterns does not match. */\nconst LINE = /[\\n\\r\\u2028\\u2029]/;\nconst SPACE = /\\s/;\n\n/**\n * Removes the comments Cytoscape.js removes: `/*`, at least one character, `*\\/`.\n * @param text - the stylesheet\n * @returns the text without comments\n */\nfunction stripComments(text: string): string {\n let out = \"\";\n let from = 0;\n for (;;) {\n const open = text.indexOf(\"/*\", from);\n if (open < 0) {\n break;\n }\n const close = text.indexOf(\"*/\", open + 3);\n if (close < 0) {\n break;\n }\n out += text.slice(from, open);\n from = close + 2;\n }\n return out + text.slice(from);\n}\n\n/**\n * The end of a run of whitespace.\n * @param s - the text\n * @param i - the start\n * @returns the first position that is not whitespace\n */\nfunction skipSpace(s: string, i: number): number {\n let j = i;\n while (j < s.length && SPACE.test(s[j])) {\n j++;\n }\n return j;\n}\n\n/**\n * The text with trailing whitespace removed.\n * @param s - the text\n * @returns the text\n */\nfunction trimEnd(s: string): string {\n let e = s.length;\n while (e > 0 && SPACE.test(s[e - 1])) {\n e--;\n }\n return s.slice(0, e);\n}\n\n/**\n * One `name: value` of a block, starting at `from`.\n * @param block - the block's text\n * @param from - where the remaining text starts\n * @param next - for each position, the first position at or after it that is not whitespace\n * @returns the name, the value and where the remaining text starts after it, or null\n */\nfunction readProperty(\n block: string,\n from: number,\n next: Int32Array,\n): { name: string; value: string; end: number } | null {\n const len = block.length;\n const lead = next[from];\n // the name: at least one character on one line, up to the first ':' after it\n const colon = block.indexOf(\":\", lead + 1);\n if (colon < 0) {\n return null;\n }\n const name = trimEnd(block.slice(lead, colon));\n if (name === \"\" || LINE.test(name)) {\n return null;\n }\n // the value: at least one character on one line, ending where only whitespace precedes ';' or the end\n const start = next[colon + 1];\n for (let e = start + 1; e <= len; e++) {\n if (LINE.test(block[e - 1])) {\n break;\n }\n const nn = next[e];\n if (nn >= len) {\n return { name, value: block.slice(start, e), end: len };\n }\n if (block[nn] === \";\") {\n return { name, value: block.slice(start, e), end: nn + 1 };\n }\n }\n // only whitespace after the colon: a whitespace character on the line is the value\n if (start >= len) {\n for (let i = colon + 1; i < len; i++) {\n if (!LINE.test(block[i])) {\n return { name, value: block[i], end: len };\n }\n }\n }\n return null;\n}\n\n/**\n * For each position of a text, the first position at or after it that is not whitespace.\n * @param s - the text\n * @returns the table (length + 1 entries)\n */\nfunction nextNonSpace(s: string): Int32Array {\n const next = new Int32Array(s.length + 1);\n next[s.length] = s.length;\n for (let i = s.length - 1; i >= 0; i--) {\n next[i] = SPACE.test(s[i]) ? next[i + 1] : i;\n }\n return next;\n}\n\n/**\n * Reads a text stylesheet into blocks the way Cytoscape.js does.\n * @param text - the stylesheet\n * @returns the blocks Cytoscape.js keeps, in order, and why reading stopped early (or null)\n */\nexport function parseCyjsStylesheetText(text: string): {\n /** The blocks Cytoscape.js keeps, in order. */\n entries: CyjsSheetEntry[];\n /** Why reading stopped early, or null. */\n stop: CyjsSheetStop;\n} {\n const s = stripComments(text);\n const entries: CyjsSheetEntry[] = [];\n let pos = 0;\n while (skipSpace(s, pos) < s.length) {\n const lead = skipSpace(s, pos);\n // the selector: the text before the first '{' that leaves it at least one character\n let open = s.indexOf(\"{\", lead + 1);\n let selStart = lead;\n if (s[lead] === \"{\") {\n if (lead > pos) {\n // the leading whitespace gives its last character to the selector\n selStart = lead - 1;\n open = lead;\n }\n }\n if (open < 0) {\n return { entries, stop: \"NO_BLOCK\" };\n }\n // the block: at least one character, up to the next '}'\n const close = s.indexOf(\"}\", open + 2);\n if (close < 0) {\n return { entries, stop: \"NO_BLOCK\" };\n }\n const selector = trimEnd(s.slice(selStart, open));\n const block = s.slice(open + 1, close);\n pos = close + 1;\n if (selector !== \"core\" && parseCyjsSelector(selector).invalid) {\n continue;\n }\n const properties = blockProperties(block);\n if (properties === null) {\n return { entries, stop: \"BAD_PROPERTY\" };\n }\n entries.push({ selector, properties, dashOnly: true });\n }\n return { entries, stop: null };\n}\n\n/**\n * The properties of one block, in order.\n * @param block - the text between the braces\n * @returns the name and value of each, or null when one does not read\n */\nfunction blockProperties(block: string): [string, unknown][] | null {\n const properties: [string, unknown][] = [];\n const next = nextNonSpace(block);\n let from = 0;\n while (next[from] < block.length) {\n const p = readProperty(block, from, next);\n if (p === null) {\n return null;\n }\n properties.push([p.name, p.value]);\n from = p.end;\n }\n return properties;\n}\n","/**\n * The Cytoscape.js style engine: a stylesheet applied to the raw element JSON the way Cytoscape.js 3.34 applies it,\n * giving what Cytoscape.js draws for every node and edge, and the stylesheet's rules as neutral rules.\n *\n * - Elements are taken as `cy.add()` takes them: nodes first, ids made text, duplicates and edges to missing nodes\n * dropped, compound parents linked without cycles.\n * - Comparisons read the RAW element data (a field of mixed types is compared with `===`, not as graph-io's column\n * holds it), and a dotted field reads a nested path.\n * - Beneath the file's rules lie Cytoscape.js's own default rules (edges 3px wide, compound parents gray rectangles,\n * selected elements blue); per property the last matching rule wins; a mapper that fails resets the property to\n * its Cytoscape.js default; an element's own `style` is a bypass over every rule.\n * - Every selector is evaluated through indexes (class, id, value) where one test decides, so a sheet of 20,000\n * per-value rules or a selector of 100,000 class tests costs one pass over the elements it names. Every step spends\n * from the extraction's one counted budget.\n *\n * The rules: a selector a short predicate expresses exactly over graph-io's columns becomes that predicate; any other\n * becomes a membership style column (`member.<n>`) with a short `has` test. A run of three or more rules that each\n * test one class, one id or one value of the same field and only set values becomes ONE mapping rule over a winner\n * column. A `data()` or `mapData()` mapper becomes a passthrough or continuous mapping when graph-io's column gives\n * exactly Cytoscape.js's values, else the mapper's per-element values as a style column.\n */\n\nimport type { GraphSnapshot } from \"@graphty/graph-format\";\n\nimport { StyleBudget } from \"../budget.js\";\nimport type { CanonSite } from \"../canon/site.js\";\nimport { STYLE_ISSUE } from \"../codes.js\";\nimport { StyleNotes } from \"../notes.js\";\nimport { canonicalFor, degreeValues, evalContinuous, numberOf, plainCell } from \"../plan/resolve.js\";\nimport type {\n ColumnRef,\n ContinuousPoint,\n ImporterStyles,\n Mapping,\n Predicate,\n ReaderOutput,\n Scalar,\n StyleColumn,\n StyleRule,\n StyleTarget,\n StyleValue,\n StyleWorkBudget,\n} from \"../types.js\";\nimport { CYJS_DEFAULT_STYLESHEET, CYJS_PROPERTY_DEFAULTS } from \"./defaults-table.js\";\nimport {\n applyCyjsMapper,\n CYJS_THROWS,\n type CyjsFlat,\n cyjsNeutral,\n type CyjsParsed,\n cyjsProperties,\n cyjsPropertyName,\n type CyjsPropertySpec,\n cyjsRendered,\n parseCyjsValue,\n} from \"./mappers.js\";\nimport { type CyjsCheck, type CyjsQuery, type CyjsSelector, parseCyjsSelector } from \"./selector.js\";\nimport { type CyjsSheetEntry, parseCyjsStylesheetText } from \"./stylesheet-text.js\";\n\n// ============================================================ elements\n\n/** One element as a Cytoscape.js core holds it. */\nexport interface CyjsElement {\n /** The element's JSON as given. */\n readonly json: Readonly<Record<string, unknown>>;\n /** Its `data` object as given. */\n readonly data: Readonly<Record<string, unknown>>;\n /** Fields Cytoscape.js rewrites on add: an id made text or generated, endpoints and parent made text. */\n readonly overrides: ReadonlyMap<string, unknown>;\n /** The id. */\n readonly id: string;\n /** The classes. */\n readonly classes: ReadonlySet<unknown>;\n /** `:selected`. */\n readonly selected: boolean;\n /** `:selectable`. */\n readonly selectable: boolean;\n /** `:locked`. */\n readonly locked: boolean;\n /** `:grabbable`. */\n readonly grabbable: boolean;\n}\n\n/** The elements of a Cytoscape.js core, with their links. */\nexport interface CyjsGraph {\n /** Nodes in the order the core holds them. */\n readonly nodes: readonly CyjsElement[];\n /** Edges in the order the core holds them. */\n readonly edges: readonly CyjsElement[];\n /** Each edge's source node. */\n readonly source: Int32Array;\n /** Each edge's target node. */\n readonly target: Int32Array;\n /** Each node's compound parent, or -1. */\n readonly parent: Int32Array;\n /** Each node's children. */\n readonly children: readonly (readonly number[])[];\n /** Each node's incident edges (a loop once). */\n readonly incident: readonly (readonly number[])[];\n}\n\n/**\n * Whether a value is a plain object (not an array).\n * @param v - the value\n * @returns true for an object\n */\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === \"object\" && !Array.isArray(v);\n}\n\n/**\n * An id as Cytoscape.js keeps it: a finite number made text, a non-blank string as it is; null when Cytoscape.js\n * refuses it.\n * @param v - the value\n * @returns the id, or null\n */\nfunction idText(v: unknown): string | null {\n if (typeof v === \"number\" && !Number.isNaN(v)) {\n return String(v);\n }\n if (typeof v === \"string\" && v !== \"\" && !/^\\s+$/.test(v)) {\n return v;\n }\n return null;\n}\n\n/**\n * The flags of an element from its JSON.\n * @param json - the element\n * @param edge - whether it is an edge\n * @returns the selection, lock and grab flags\n */\nfunction flags(\n json: Readonly<Record<string, unknown>>,\n edge: boolean,\n): Pick<CyjsElement, \"selected\" | \"selectable\" | \"locked\" | \"grabbable\"> {\n const pannable = json.pannable === undefined ? edge : Boolean(json.pannable);\n const grabbable = json.grabbable === undefined ? true : Boolean(json.grabbable);\n return {\n selected: Boolean(json.selected),\n selectable: json.selectable === undefined ? true : Boolean(json.selectable),\n locked: Boolean(json.locked),\n grabbable: !pannable && grabbable,\n };\n}\n\n/**\n * An element's classes as Cytoscape.js reads them: an array's truthy items, or a string split at whitespace.\n * @param v - the `classes` field\n * @returns the classes\n */\nfunction classSet(v: unknown): Set<unknown> {\n const out = new Set<unknown>();\n let items: unknown[] = [];\n if (Array.isArray(v)) {\n items = v;\n } else if (typeof v === \"string\") {\n items = v.split(/\\s+/);\n }\n for (const c of items) {\n if (c) {\n out.add(c);\n }\n }\n return out;\n}\n\n/**\n * Each node's compound parent, as Cytoscape.js keeps it: a parent naming no node, an edge, or a descendant of the\n * node itself (which would make a cycle) is dropped. Near-linear in the nodes, however deep the hierarchy.\n * @param nodes - the core's nodes, in order; a dropped parent is recorded in their overrides\n * @param ids - the index of each node id (edge ids map to -1)\n * @returns each node's parent index (-1 for none) and each node's children\n */\nfunction parentsOf(\n nodes: readonly CyjsElement[],\n ids: ReadonlyMap<string, number>,\n): { parent: Int32Array; children: number[][] } {\n const parent = new Int32Array(nodes.length).fill(-1);\n const children: number[][] = nodes.map(() => []);\n // root[x] leads to the root of x's parent chain; paths are halved as they are walked\n const root = Int32Array.from(nodes, (_n, i) => i);\n const rootOf = (x: number): number => {\n while (root[x] !== x) {\n root[x] = root[root[x]];\n x = root[x];\n }\n return x;\n };\n for (let i = 0; i < nodes.length; i++) {\n const raw = nodes[i].data.parent;\n if (raw === undefined || raw === null) {\n continue;\n }\n const text = typeof raw === \"number\" && !Number.isNaN(raw) ? String(raw) : raw;\n const p = typeof text === \"string\" ? ids.get(text) : undefined;\n if (p === undefined || p < 0) {\n (nodes[i].overrides as Map<string, unknown>).set(\"parent\", undefined);\n continue;\n }\n if (typeof raw === \"number\") {\n (nodes[i].overrides as Map<string, unknown>).set(\"parent\", text);\n }\n // a node never becomes its own ancestor: node i has no parent yet, so it is an ancestor of p exactly when it\n // is the root of p's chain, found in near-constant time through the union-find roots\n if (rootOf(p) === i) {\n (nodes[i].overrides as Map<string, unknown>).set(\"parent\", undefined);\n continue;\n }\n parent[i] = p;\n root[i] = p;\n children[p].push(i);\n }\n return { parent, children };\n}\n\n/**\n * The elements a Cytoscape.js core holds after `cy.add(elements)`.\n * @param elements - an array of element JSON, or `{ nodes, edges }`\n * @returns the elements and their links\n */\nexport function cyjsGraph(elements: unknown): CyjsGraph {\n const { nodeJson, edgeJson } = elementGroups(elements);\n const ids = new Map<string, number>();\n const make = elementMaker(ids);\n const nodes: CyjsElement[] = [];\n for (const json of nodeJson) {\n const e = make(json, false, new Map());\n if (e !== null) {\n ids.set(e.id, nodes.length);\n nodes.push(e);\n }\n }\n const edges: CyjsElement[] = [];\n const src: number[] = [];\n const tgt: number[] = [];\n const edgeIds = new Set<string>();\n for (const json of edgeJson) {\n const overrides = new Map<string, unknown>();\n const e = make(json, true, overrides);\n const ends = e === null || edgeIds.has(e.id) ? null : edgeEnds(e, ids, overrides);\n if (e !== null && ends !== null) {\n edgeIds.add(e.id);\n edges.push(e);\n src.push(ends[0]);\n tgt.push(ends[1]);\n }\n }\n for (const id of edgeIds) {\n ids.set(id, -1);\n }\n const { parent, children } = parentsOf(nodes, ids);\n const incident: number[][] = nodes.map(() => []);\n for (let e = 0; e < edges.length; e++) {\n incident[src[e]].push(e);\n if (src[e] !== tgt[e]) {\n incident[tgt[e]].push(e);\n }\n }\n return {\n nodes,\n edges,\n source: Int32Array.from(src),\n target: Int32Array.from(tgt),\n parent,\n children,\n incident,\n };\n}\n\n/**\n * The node and edge JSON of `cy.add(elements)`: an array's items by their `group`, else an edge when they name a\n * source and a target; a `{ nodes, edges }` object's by where they are.\n * @param elements - an array of element JSON, or `{ nodes, edges }`\n * @returns the node and edge JSON, in order\n */\nfunction elementGroups(elements: unknown): {\n nodeJson: Record<string, unknown>[];\n edgeJson: Record<string, unknown>[];\n} {\n const nodeJson: Record<string, unknown>[] = [];\n const edgeJson: Record<string, unknown>[] = [];\n const take = (item: unknown, group: unknown): void => {\n const g = groupOf(item, group);\n if (g === \"nodes\") {\n nodeJson.push(item as Record<string, unknown>);\n } else if (g === \"edges\") {\n edgeJson.push(item as Record<string, unknown>);\n }\n };\n if (Array.isArray(elements)) {\n for (const item of elements) {\n take(item, undefined);\n }\n } else if (isObject(elements)) {\n for (const item of Array.isArray(elements.nodes) ? elements.nodes : []) {\n take(item, \"nodes\");\n }\n for (const item of Array.isArray(elements.edges) ? elements.edges : []) {\n take(item, \"edges\");\n }\n }\n return { nodeJson, edgeJson };\n}\n\n/**\n * The group an element JSON is added to: the one its place gives, else its own `group`, else an edge when its data\n * names a source and a target.\n * @param item - the element JSON\n * @param group - the group its place gives, or undefined\n * @returns the group, or undefined for no element\n */\nfunction groupOf(item: unknown, group: unknown): unknown {\n if (!isObject(item)) {\n return undefined;\n }\n const data = item.data ?? {};\n if (!isObject(data)) {\n return undefined;\n }\n const given = group ?? item.group;\n if (given !== undefined && given !== null) {\n return given;\n }\n const ends = data.source !== undefined && data.source !== null && data.target !== undefined && data.target !== null;\n return ends ? \"edges\" : \"nodes\";\n}\n\n/**\n * Makes the elements of one core: an element without an id gets a generated one; one whose id is taken or not an id\n * is dropped.\n * @param ids - the ids taken so far, by node index\n * @returns the maker: the element of a JSON, or null when it is dropped\n */\nfunction elementMaker(\n ids: ReadonlyMap<string, number>,\n): (json: Record<string, unknown>, edge: boolean, overrides: Map<string, unknown>) => CyjsElement | null {\n let generated = 0;\n return (json, edge, overrides) => {\n const data = isObject(json.data) ? json.data : {};\n let id: string | null;\n if (data.id === undefined) {\n id = `${String.fromCodePoint(0)}generated-${String(generated++)}`;\n overrides.set(\"id\", id);\n } else {\n id = idText(data.id);\n if (id === null || ids.has(id)) {\n return null;\n }\n if (typeof data.id === \"number\") {\n overrides.set(\"id\", id);\n }\n }\n return { json, data, overrides, id, classes: classSet(json.classes), ...flags(json, edge) };\n };\n}\n\n/**\n * An edge's source and target nodes; a number endpoint is read as its text.\n * @param e - the edge\n * @param ids - the node ids\n * @param overrides - the edge's data as Cytoscape.js rewrites it\n * @returns the two node indexes, or null when an endpoint names no node\n */\nfunction edgeEnds(\n e: CyjsElement,\n ids: ReadonlyMap<string, number>,\n overrides: Map<string, unknown>,\n): [number, number] | null {\n const ends: number[] = [];\n for (const field of [\"source\", \"target\"] as const) {\n const raw = e.data[field];\n const text = typeof raw === \"number\" && !Number.isNaN(raw) ? String(raw) : raw;\n if (typeof raw === \"number\") {\n overrides.set(field, text);\n }\n const at = typeof text === \"string\" ? ids.get(text) : undefined;\n if (at !== undefined) {\n ends.push(at);\n }\n }\n return ends.length === 2 ? [ends[0], ends[1]] : null;\n}\n\n/**\n * A data field as a selector reads it (`ele.data(field)`): the field itself, else a dotted path walked step by step.\n * @param e - the element\n * @param field - the field\n * @returns the value, or undefined\n */\nfunction selectorField(e: CyjsElement, field: string): unknown {\n if (e.overrides.has(field)) {\n return e.overrides.get(field);\n }\n const direct = e.data[field];\n if (direct !== undefined || !field.includes(\".\")) {\n return direct;\n }\n let v: unknown = e.data;\n const path = field.split(\".\");\n let k = 0;\n while (v !== null && v !== undefined && k < path.length) {\n v = (v as Record<string, unknown>)[path[k++]];\n }\n return k === path.length ? v : undefined;\n}\n\n/**\n * An element's data as a mapper reads it, with Cytoscape.js's rewrites of id, endpoints and parent.\n * @param e - the element\n * @returns an object to read fields from\n */\nfunction mapperData(e: CyjsElement): unknown {\n if (e.overrides.size === 0) {\n return e.data;\n }\n return new Proxy(e.data, {\n get: (target, key) =>\n typeof key === \"string\" && e.overrides.has(key)\n ? e.overrides.get(key)\n : (target as Record<string | symbol, unknown>)[key],\n });\n}\n\n// ============================================================ the stylesheet\n\n/** One stylesheet entry ready to apply. */\ninterface Entry {\n /** The position in the sheet (default rules first, negative). */\n readonly index: number;\n /** Cytoscape.js's own default rule. */\n readonly tool: boolean;\n /** The selector as written. */\n readonly text: string;\n readonly selector: CyjsSelector;\n readonly properties: readonly (readonly [string, unknown])[];\n readonly dashOnly: boolean;\n}\n\n/**\n * The entries of a stylesheet given as JSON (an array of `{ selector, style }`) or as text.\n * @param style - the stylesheet\n * @param notes - where problems are noted\n * @returns the entries in order\n */\nfunction sheetEntries(style: unknown, notes: StyleNotes): CyjsSheetEntry[] {\n if (typeof style === \"string\") {\n const { entries, stop } = parseCyjsStylesheetText(style);\n if (stop !== null) {\n notes.add(STYLE_ISSUE.UNREADABLE, null, \"stylesheet\", { sample: stop });\n }\n return entries;\n }\n if (!Array.isArray(style)) {\n return [];\n }\n const out: CyjsSheetEntry[] = [];\n for (const item of style) {\n if (!isObject(item)) {\n continue;\n }\n const props = item.style ?? item.css;\n const properties: [string, unknown][] = [];\n if (isObject(props)) {\n for (const name of Object.keys(props)) {\n properties.push([name, props[name]]);\n }\n }\n out.push({ selector: item.selector, properties, dashOnly: false });\n }\n return out;\n}\n\n// ============================================================ matching\n\n/** The most nested combinators a selector may hold before it is noted and matched to nothing. */\nconst MAX_SELECTOR_NESTING = 64;\n\n/**\n * How deep a query nests.\n * @param q - the query\n * @param depth - the depth so far\n * @returns the depth, capped just above the limit\n */\nfunction nesting(q: CyjsQuery, depth = 0): number {\n if (depth > MAX_SELECTOR_NESTING) {\n return depth;\n }\n let max = depth;\n for (const c of q.checks) {\n for (const sub of subQueries(c)) {\n max = Math.max(max, nesting(sub, depth + 1));\n if (max > MAX_SELECTOR_NESTING) {\n return max;\n }\n }\n }\n return max;\n}\n\n/**\n * The queries a check holds.\n * @param c - the check\n * @returns its sub-queries\n */\nfunction subQueries(c: CyjsCheck): CyjsQuery[] {\n switch (c.type) {\n case \"child\":\n case \"parent\":\n return [c.parent, c.child];\n case \"descendant\":\n case \"ancestor\":\n return [c.ancestor, c.descendant];\n case \"split\":\n return [c.left, c.right, c.subject];\n case \"directedEdge\":\n case \"nodeSource\":\n case \"nodeTarget\":\n return [c.source, c.target];\n case \"undirectedEdge\":\n return [c.nodes[0], c.nodes[1]];\n case \"nodeNeighbor\":\n return [c.node, c.neighbor];\n default:\n return [];\n }\n}\n\n/**\n * Cytoscape.js's comparison of a field with a selector's value.\n * @param field - the element's value\n * @param op - the base operator\n * @param not - the `!` flag\n * @param ci - the `@` flag\n * @param value - the selector's value\n * @returns whether it matches\n */\nfunction valCmp(field: unknown, op: string, not: boolean, ci: boolean, value: string | number): boolean {\n let a: unknown = field;\n let b: unknown = value;\n const isFieldStr = typeof field === \"string\";\n const isFieldNum = typeof field === \"number\" && !Number.isNaN(field);\n let fs: string | null = null;\n let vs: string | null = null;\n if (isFieldStr || typeof value === \"string\" || ci) {\n fs = !isFieldStr && !isFieldNum ? \"\" : String(field);\n vs = String(value);\n }\n if (ci && fs !== null && vs !== null) {\n fs = fs.toLowerCase();\n vs = vs.toLowerCase();\n a = fs;\n b = vs;\n }\n let m = false;\n let ineq = false;\n switch (op) {\n case \"*=\":\n m = fs !== null && vs !== null && fs.includes(vs);\n break;\n case \"$=\":\n m = fs !== null && vs !== null && fs.endsWith(vs);\n break;\n case \"^=\":\n m = fs !== null && vs !== null && fs.startsWith(vs);\n break;\n case \"=\":\n m = a === b;\n break;\n case \">\":\n ineq = true;\n m = (a as number) > (b as number);\n break;\n case \">=\":\n ineq = true;\n m = (a as number) >= (b as number);\n break;\n case \"<\":\n ineq = true;\n m = (a as number) < (b as number);\n break;\n case \"<=\":\n ineq = true;\n m = (a as number) <= (b as number);\n break;\n default:\n break;\n }\n if (not && ((field !== null && field !== undefined) || !ineq)) {\n m = !m;\n }\n return m;\n}\n\n/** The checks of an element's place in the graph: its parents, children and edges. */\nconst STRUCTURE_CHECKS: ReadonlySet<string> = new Set([\n \"child\",\n \"parent\",\n \"descendant\",\n \"ancestor\",\n \"split\",\n \"directedEdge\",\n \"undirectedEdge\",\n \"nodeSource\",\n \"nodeTarget\",\n \"nodeNeighbor\",\n]);\n\n/** States whose value changes while Cytoscape.js runs; they are evaluated as at load and noted. */\nconst RUNTIME_STATES: ReadonlySet<string> = new Set([\n \"active\",\n \"inactive\",\n \"grabbed\",\n \"free\",\n \"animated\",\n \"unanimated\",\n \"visible\",\n \"hidden\",\n \"transparent\",\n \"backgrounding\",\n \"nonbackgrounding\",\n]);\n\n/** Thrown inside a selector match when the counted budget runs out partway through it. */\nclass BudgetStop extends Error {}\n\n/** How many units of work a match does between checks of the budget and the signal. */\nconst CHECK_EVERY = 4096;\n\n/** Evaluates selectors over one graph. */\nclass Matcher {\n readonly degree: Int32Array;\n readonly indegree: Int32Array;\n readonly outdegree: Int32Array;\n work = 0;\n /** Where the work is charged while a match runs; null between matches. */\n #charge: { kind: StyleTarget; budget: StyleWorkBudget; signal?: AbortSignal } | null = null;\n #charged = 0;\n /**\n * The answers of nested sub-queries for one match, per element: 0 unknown, 1 true, 2 false. Each sub-query is\n * then evaluated at most once per element, so a nested compound selector costs polynomial, not exponential, time.\n */\n readonly #memo = { node: new Map<CyjsQuery, Uint8Array>(), edge: new Map<CyjsQuery, Uint8Array>() };\n\n constructor(\n readonly g: CyjsGraph,\n readonly notes: StyleNotes,\n ) {\n const n = g.nodes.length;\n this.degree = new Int32Array(n);\n this.indegree = new Int32Array(n);\n this.outdegree = new Int32Array(n);\n for (let e = 0; e < g.edges.length; e++) {\n const s = g.source[e];\n const t = g.target[e];\n this.degree[s] += s === t ? 2 : 1;\n if (s !== t) {\n this.degree[t]++;\n }\n this.outdegree[s]++;\n this.indegree[t]++;\n }\n }\n\n /**\n * Whether an element matches a query.\n * @param q - the query\n * @param kind - the element's kind\n * @param i - the element\n * @returns true when every check matches\n */\n query(q: CyjsQuery, kind: StyleTarget, i: number): boolean {\n for (const c of q.checks) {\n this.work++;\n if (this.#charge !== null && this.work - this.#charged >= CHECK_EVERY) {\n this.settle();\n }\n if (!this.check(c, kind, i)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Starts one selector match: its work is charged to the budget as it runs, and the sub-query answers are fresh.\n * @param kind - the target the work is charged to\n * @param budget - the counted budget\n * @param signal - cancels the match\n */\n begin(kind: StyleTarget, budget: StyleWorkBudget, signal?: AbortSignal): void {\n this.#charge = { kind, budget, signal };\n this.#charged = this.work;\n this.#memo.node.clear();\n this.#memo.edge.clear();\n }\n\n /** Ends a match: its remaining work is charged (never throwing) and its sub-query answers are dropped. */\n end(): void {\n const charge = this.#charge;\n this.#charge = null;\n charge?.budget.spend(charge.kind, this.work - this.#charged);\n this.#charged = this.work;\n this.#memo.node.clear();\n this.#memo.edge.clear();\n }\n\n /**\n * Charges the work done since the last charge; throws BudgetStop once the budget is exhausted.\n * @throws BudgetStop - when the target's budget is exhausted\n */\n settle(): void {\n const charge = this.#charge;\n if (charge === null) {\n return;\n }\n charge.budget.spend(charge.kind, this.work - this.#charged);\n this.#charged = this.work;\n charge.signal?.throwIfAborted();\n if (charge.budget.exhausted(charge.kind)) {\n throw new BudgetStop();\n }\n }\n\n /**\n * Whether an element matches a nested sub-query, remembered for the rest of the match.\n * @param q - the sub-query\n * @param kind - the element's kind\n * @param i - the element\n * @returns true when every check matches\n */\n sub(q: CyjsQuery, kind: StyleTarget, i: number): boolean {\n const memo = this.#memo[kind];\n let seen = memo.get(q);\n if (seen === undefined) {\n seen = new Uint8Array(kind === \"node\" ? this.g.nodes.length : this.g.edges.length);\n memo.set(q, seen);\n }\n if (seen[i] !== 0) {\n return seen[i] === 1;\n }\n const m = this.query(q, kind, i);\n seen[i] = m ? 1 : 2;\n return m;\n }\n\n /**\n * Whether an element matches one check.\n * @param c - the check\n * @param kind - the element's kind\n * @param i - the element\n * @returns true when it matches\n */\n check(c: CyjsCheck, kind: StyleTarget, i: number): boolean {\n return STRUCTURE_CHECKS.has(c.type) ? this.structureCheck(c, kind, i) : this.elementCheck(c, kind, i);\n }\n\n /**\n * Whether an element matches a check of its own: its group, state, id, classes or data.\n * @param c - the check\n * @param kind - the element's kind\n * @param i - the element\n * @returns true when it matches\n */\n private elementCheck(c: CyjsCheck, kind: StyleTarget, i: number): boolean {\n const { g } = this;\n const e = kind === \"node\" ? g.nodes[i] : g.edges[i];\n switch (c.type) {\n case \"group\":\n return c.value === \"*\" || c.value === `${kind}s`;\n case \"state\":\n return this.state(c.value, kind, i, e);\n case \"id\":\n return e.id === c.value;\n case \"class\":\n return e.classes.has(c.value);\n case \"exist\":\n return selectorField(e, c.field) !== undefined;\n case \"bool\": {\n const v = selectorField(e, c.field);\n if (c.op === \"?\") {\n return Boolean(v);\n }\n return c.op === \"!\" ? !v : v === undefined;\n }\n case \"compare\":\n return valCmp(selectorField(e, c.field), c.op, c.not, c.ci, c.value);\n case \"meta\": {\n const v = kind === \"node\" ? this[c.field][i] : undefined;\n return valCmp(v, c.op, c.not, c.ci, c.value);\n }\n case \"true\":\n return true;\n default:\n return false;\n }\n }\n\n /**\n * Whether an element matches a check of its place in the graph: its parents, children and edges.\n * @param c - the check\n * @param kind - the element's kind\n * @param i - the element\n * @returns true when it matches\n */\n private structureCheck(c: CyjsCheck, kind: StyleTarget, i: number): boolean {\n const { g } = this;\n switch (c.type) {\n case \"child\":\n return (\n this.sub(c.child, kind, i) &&\n kind === \"node\" &&\n g.parent[i] >= 0 &&\n this.sub(c.parent, \"node\", g.parent[i])\n );\n case \"parent\":\n return (\n this.sub(c.parent, kind, i) &&\n kind === \"node\" &&\n g.children[i].some((k) => this.sub(c.child, \"node\", k))\n );\n case \"descendant\":\n return this.sub(c.descendant, kind, i) && kind === \"node\" && this.someAncestor(i, c.ancestor);\n case \"ancestor\":\n return this.sub(c.ancestor, kind, i) && kind === \"node\" && this.someDescendant(i, c.descendant);\n case \"split\":\n return this.sub(c.subject, kind, i) && this.sub(c.left, kind, i) && this.sub(c.right, kind, i);\n case \"directedEdge\":\n return (\n kind === \"edge\" &&\n this.sub(c.source, \"node\", g.source[i]) &&\n this.sub(c.target, \"node\", g.target[i])\n );\n case \"undirectedEdge\": {\n if (kind !== \"edge\") {\n return false;\n }\n const [a, b] = c.nodes;\n const s = g.source[i];\n const t = g.target[i];\n return (\n (this.sub(a, \"node\", s) && this.sub(b, \"node\", t)) ||\n (this.sub(b, \"node\", s) && this.sub(a, \"node\", t))\n );\n }\n case \"nodeSource\":\n return (\n kind === \"node\" &&\n this.sub(c.source, kind, i) &&\n g.incident[i].some((ed) => g.source[ed] === i && this.sub(c.target, \"node\", g.target[ed]))\n );\n case \"nodeTarget\":\n return (\n kind === \"node\" &&\n this.sub(c.target, kind, i) &&\n g.incident[i].some((ed) => g.target[ed] === i && this.sub(c.source, \"node\", g.source[ed]))\n );\n case \"nodeNeighbor\":\n return (\n kind === \"node\" &&\n this.sub(c.node, kind, i) &&\n g.incident[i].some((ed) => {\n const other = g.source[ed] === i ? g.target[ed] : g.source[ed];\n return this.sub(c.neighbor, \"node\", other);\n })\n );\n default:\n return false;\n }\n }\n\n /**\n * Whether an ancestor of a node matches a query (cycle-safe: parents never form a cycle).\n * @param i - the node\n * @param q - the query\n * @returns true when one does\n */\n someAncestor(i: number, q: CyjsQuery): boolean {\n for (let a = this.g.parent[i]; a >= 0; a = this.g.parent[a]) {\n if (this.sub(q, \"node\", a)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Whether a descendant of a node matches a query, walked without recursion.\n * @param i - the node\n * @param q - the query\n * @returns true when one does\n */\n someDescendant(i: number, q: CyjsQuery): boolean {\n const stack = [...this.g.children[i]];\n while (stack.length > 0) {\n const k = stack.pop() as number;\n if (this.sub(q, \"node\", k)) {\n return true;\n }\n for (const c of this.g.children[k]) {\n stack.push(c);\n }\n }\n return false;\n }\n\n /**\n * A state selector, evaluated as at load.\n * @param s - the state\n * @param kind - the element's kind\n * @param i - the element\n * @param e - the element\n * @returns whether the element is in the state\n */\n state(s: string, kind: StyleTarget, i: number, e: CyjsElement): boolean {\n const { g } = this;\n if (RUNTIME_STATES.has(s)) {\n this.notes.add(STYLE_ISSUE.STATE_ASSUMED, kind, `:${s}`, { sample: `:${s}` });\n }\n const node = kind === \"node\";\n switch (s) {\n case \"selected\":\n return e.selected;\n case \"unselected\":\n return !e.selected;\n case \"selectable\":\n return e.selectable;\n case \"unselectable\":\n return !e.selectable;\n case \"locked\":\n return e.locked;\n case \"unlocked\":\n return !e.locked;\n case \"grabbable\":\n return e.grabbable;\n case \"ungrabbable\":\n return !e.grabbable;\n case \"free\":\n case \"inside\":\n case \"unanimated\":\n case \"inactive\":\n case \"nonbackgrounding\":\n case \"visible\":\n return true;\n case \"parent\":\n return node && g.children[i].length > 0;\n case \"childless\":\n return node && g.children[i].length === 0;\n case \"child\":\n case \"nonorphan\":\n return node && g.parent[i] >= 0;\n case \"orphan\":\n return node && g.parent[i] < 0;\n case \"compound\":\n return node\n ? g.children[i].length > 0\n : g.children[g.source[i]].length > 0 || g.children[g.target[i]].length > 0;\n case \"loop\":\n return !node && g.source[i] === g.target[i];\n case \"simple\":\n return !node && g.source[i] !== g.target[i];\n default:\n return false;\n }\n }\n}\n\n/** Indexes of one target's elements: by class, by id, and by value per field (built on first use). */\nclass Indexes {\n readonly byClass = new Map<unknown, number[]>();\n readonly byId = new Map<string, number>();\n readonly byValue = new Map<string, Map<string, number[]>>();\n /** Per element, the stamp of the last selector that matched it. */\n readonly marks: Int32Array;\n /** The last stamp handed out. */\n stamp = 0;\n\n constructor(\n readonly elements: readonly CyjsElement[],\n readonly spend: (ops: number) => void,\n ) {\n this.marks = new Int32Array(elements.length);\n for (let i = 0; i < elements.length; i++) {\n for (const c of elements[i].classes) {\n let list = this.byClass.get(c);\n if (list === undefined) {\n list = [];\n this.byClass.set(c, list);\n }\n list.push(i);\n }\n if (!this.byId.has(elements[i].id)) {\n this.byId.set(elements[i].id, i);\n }\n }\n spend(elements.length);\n }\n\n /**\n * The elements whose field is `===` a value.\n * @param field - the field\n * @param value - the value\n * @returns the element indexes\n */\n equal(field: string, value: string | number): readonly number[] {\n let m = this.byValue.get(field);\n if (m === undefined) {\n m = new Map();\n for (let i = 0; i < this.elements.length; i++) {\n const v = selectorField(this.elements[i], field);\n if (typeof v !== \"string\" && typeof v !== \"number\") {\n continue;\n }\n const k = `${typeof v}:${String(v)}`;\n let list = m.get(k);\n if (list === undefined) {\n list = [];\n m.set(k, list);\n }\n list.push(i);\n }\n this.byValue.set(field, m);\n this.spend(this.elements.length);\n }\n if (typeof value === \"number\" && Number.isNaN(value)) {\n return [];\n }\n return m.get(`${typeof value}:${String(value)}`) ?? [];\n }\n}\n\n/**\n * The candidates of one query for a target: the element list of its most selective indexed check, or null when\n * every element must be tested.\n * @param q - the query\n * @param kind - the target\n * @param ix - the target's indexes\n * @returns the candidates, or null\n */\nfunction candidates(q: CyjsQuery, kind: StyleTarget, ix: Indexes): readonly number[] | null {\n let best: readonly number[] | null = null;\n for (const c of q.checks) {\n let list: readonly number[] | null = null;\n if (c.type === \"group\" && c.value !== \"*\" && c.value !== `${kind}s`) {\n return [];\n }\n if (c.type === \"class\") {\n list = ix.byClass.get(c.value) ?? [];\n } else if (c.type === \"id\") {\n const at = ix.byId.get(c.value);\n list = at === undefined ? [] : [at];\n } else if (c.type === \"compare\" && c.op === \"=\" && !c.not && !c.ci) {\n list = ix.equal(c.field, c.value);\n }\n if (list !== null && (best === null || list.length < best.length)) {\n best = list;\n }\n }\n return best;\n}\n\n// ============================================================ the engine\n\n/** A cell of the cascade: a flat value, a failed mapper (the default), or a value Cytoscape.js cannot draw. */\ntype Cell = CyjsFlat | \"reset\" | \"fn\" | typeof CYJS_THROWS;\n\n/** One property of one entry, parsed. */\ninterface EntryProperty {\n readonly name: string;\n readonly spec: CyjsPropertySpec;\n readonly parsed: CyjsParsed;\n}\n\n/** One target's result. */\nexport interface CyjsTargetStyles {\n /** The element count (in snapshot order when a snapshot was given). */\n readonly n: number;\n /** What Cytoscape.js draws, per neutral property, by element index. */\n readonly values: Partial<Record<string, StyleColumn>>;\n /** The stylesheet's rules, bottom to top. */\n readonly rules: StyleRule[];\n /** The style columns the rules read. */\n readonly columns: Map<string, StyleColumn>;\n /** The data columns the rules or the values were read from. */\n readonly rawColumns: string[];\n /** Each element's Cytoscape.js element, by index (null where the core holds none). */\n readonly elements: readonly (CyjsElement | null)[];\n}\n\n/** The input of the engine. */\nexport interface CyjsStyleInput {\n /** The elements: an array of element JSON, or `{ nodes, edges }`. */\n readonly elements: unknown;\n /** The stylesheet: an array of `{ selector, style }` (or `css`), or a stylesheet written as text. */\n readonly style: unknown;\n /**\n * The graph the styles are for. Elements are matched to its nodes by id and to its edges in order, and the\n * values come out indexed like it; its columns let a selector or a mapper become a predicate or a mapping over\n * graph-io's columns. Without it, values are indexed like the core holds the elements.\n */\n readonly snapshot?: GraphSnapshot;\n /** Whether Cytoscape.js's own default rules (edges 3px wide, gray compound parents) are applied; default true. */\n readonly toolDefaults?: boolean;\n /**\n * What a live core draws, per element JSON object (`ele.style()` beside `ele.json()`): taken as the truth over what\n * the stylesheet gives, and the only source for a property whose stylesheet value is a function.\n */\n readonly rendered?: ReadonlyMap<object, Readonly<Record<string, unknown>>>;\n /** Where problems are noted. */\n readonly notes?: StyleNotes;\n /** The counted work budget. */\n readonly budget?: StyleWorkBudget;\n /** Cancels the work. */\n readonly signal?: AbortSignal;\n}\n\n/** The engine's result. */\nexport interface CyjsStyles {\n /** Nodes. */\n readonly node: CyjsTargetStyles;\n /** Edges. */\n readonly edge: CyjsTargetStyles;\n /** The elements as the core holds them. */\n readonly graph: CyjsGraph;\n}\n\nconst POSITIONS: ReadonlyMap<string, string> = new Map([\n [\"top,left\", \"top-left\"],\n [\"top,center\", \"top\"],\n [\"top,right\", \"top-right\"],\n [\"center,left\", \"left\"],\n [\"center,center\", \"center\"],\n [\"center,right\", \"right\"],\n [\"bottom,left\", \"bottom-left\"],\n [\"bottom,center\", \"bottom\"],\n [\"bottom,right\", \"bottom-right\"],\n]);\n\n/**\n * Applies a Cytoscape.js stylesheet to its elements as Cytoscape.js 3.34 does.\n * @param input - the elements, the stylesheet, the graph and the options\n * @returns what is drawn per element and the stylesheet's rules, per target\n */\nexport function evaluateCytoscapeJs(input: CyjsStyleInput): CyjsStyles {\n const notes = input.notes ?? new StyleNotes();\n const budget = input.budget ?? new StyleBudget();\n const graph = cyjsGraph(input.elements);\n const sheet: Entry[] = [];\n if (input.toolDefaults !== false) {\n CYJS_DEFAULT_STYLESHEET.forEach((d, k) => {\n sheet.push({\n index: k - CYJS_DEFAULT_STYLESHEET.length,\n tool: true,\n text: d.selector,\n selector: parseCyjsSelector(d.selector),\n properties: Object.entries(d.style),\n dashOnly: true,\n });\n });\n }\n const raw = sheetEntries(input.style, notes);\n let invalid = 0;\n let deep = 0;\n raw.forEach((r, k) => {\n let selector = parseCyjsSelector(r.selector);\n if (selector.invalid) {\n invalid++;\n }\n if (selector.queries.some((q) => nesting(q) > MAX_SELECTOR_NESTING)) {\n deep++;\n selector = { queries: [], invalid: true };\n }\n sheet.push({\n index: k,\n tool: false,\n text: typeof r.selector === \"string\" ? r.selector : \"\",\n selector,\n properties: r.properties,\n dashOnly: r.dashOnly,\n });\n });\n if (invalid > 0) {\n notes.add(STYLE_ISSUE.SELECTOR, null, \"selector\", { count: invalid, sample: \"invalid\" });\n }\n if (deep > 0) {\n notes.add(STYLE_ISSUE.SELECTOR, null, \"selector\", { count: deep, sample: \"nested too deep\" });\n }\n const matcher = new Matcher(graph, notes);\n const node = evaluateTarget(\"node\", graph, sheet, matcher, input, notes, budget);\n const edge = evaluateTarget(\"edge\", graph, sheet, matcher, input, notes, budget);\n return { node, edge, graph };\n}\n\n/**\n * The order of the output: for each output index, the core's element (or -1).\n * @param kind - the target\n * @param graph - the core's elements\n * @param snapshot - the graph, when given\n * @param notes - where problems are noted\n * @returns the core element of each output index\n */\nfunction outputOrder(\n kind: StyleTarget,\n graph: CyjsGraph,\n snapshot: GraphSnapshot | undefined,\n notes: StyleNotes,\n): Int32Array {\n const els = kind === \"node\" ? graph.nodes : graph.edges;\n if (snapshot === undefined) {\n return Int32Array.from(els, (_e, i) => i);\n }\n if (kind === \"node\") {\n const order = new Int32Array(snapshot.nodeCount).fill(-1);\n for (let i = 0; i < els.length; i++) {\n const at = snapshotIndex(snapshot, els[i].id);\n if (at >= 0 && order[at] < 0) {\n order[at] = i;\n }\n }\n return order;\n }\n const order = new Int32Array(snapshot.edgeCount).fill(-1);\n const nodeAt = outputOrder(\"node\", graph, snapshot, notes);\n const coreToSnap = new Int32Array(graph.nodes.length).fill(-1);\n nodeAt.forEach((c, s) => {\n if (c >= 0) {\n coreToSnap[c] = s;\n }\n });\n let j = 0;\n for (let e = 0; e < els.length && j < snapshot.edgeCount; e++) {\n if (\n coreToSnap[graph.source[e]] === snapshot.edgeSource(j) &&\n coreToSnap[graph.target[e]] === snapshot.edgeTarget(j)\n ) {\n order[j++] = e;\n }\n }\n if (j < snapshot.edgeCount) {\n notes.add(STYLE_ISSUE.UNRESOLVED, \"edge\", \"elements\", { count: snapshot.edgeCount - j, sample: \"edge order\" });\n }\n return order;\n}\n\n/**\n * A node's index in the graph by its Cytoscape.js id (text), trying the id as a number too.\n * @param snapshot - the graph\n * @param id - the id\n * @returns the index, or -1\n */\nfunction snapshotIndex(snapshot: GraphSnapshot, id: string): number {\n if (snapshot.ids.has(id)) {\n return snapshot.ids.indexOf(id);\n }\n const n = Number(id);\n return id.trim() !== \"\" && Number.isFinite(n) && snapshot.ids.has(n) ? snapshot.ids.indexOf(n) : -1;\n}\n\n/** The cascade's winning cells, per Cytoscape.js property, by core element. */\ntype Cells = Map<string, (Cell | undefined)[]>;\n\n/** One entry applied to a target: its elements and its parsed properties. */\ninterface Applied {\n readonly entry: Entry;\n readonly list: readonly number[];\n readonly props: EntryProperty[];\n}\n\n/**\n * A property's cells, created on first use.\n * @param cells - the cells\n * @param name - the Cytoscape.js property\n * @param n - the element count\n * @returns the property's cells\n */\nfunction cellsOf(cells: Cells, name: string, n: number): (Cell | undefined)[] {\n let c = cells.get(name);\n if (c === undefined) {\n c = new Array<Cell | undefined>(n);\n cells.set(name, c);\n }\n return c;\n}\n\n/**\n * Applies the sheet to one target.\n * @param kind - nodes or edges\n * @param graph - the core's elements\n * @param sheet - the entries\n * @param matcher - the selector evaluator\n * @param input - the input\n * @param notes - where problems are noted\n * @param budget - the counted budget\n * @returns the target's values and rules\n */\nfunction evaluateTarget(\n kind: StyleTarget,\n graph: CyjsGraph,\n sheet: readonly Entry[],\n matcher: Matcher,\n input: CyjsStyleInput,\n notes: StyleNotes,\n budget: StyleWorkBudget,\n): CyjsTargetStyles {\n const els = kind === \"node\" ? graph.nodes : graph.edges;\n const spend = (ops: number): void => {\n budget.spend(kind, ops);\n };\n const { cells, applied } = cascade(kind, els, sheet, matcher, input, notes, budget);\n const order = outputOrder(kind, graph, input.snapshot, notes);\n const coreToOut = new Int32Array(els.length).fill(-1);\n order.forEach((c, k) => {\n if (c >= 0) {\n coreToOut[c] = k;\n }\n });\n applyBypasses(kind, els, cells, coreToOut, notes);\n if (kind === \"edge\") {\n forceLoopCurves(graph, cells.get(\"curve-style\"));\n }\n const drawn = drawnValues(kind, els, cells, order, input.rendered, notes, spend);\n if (kind === \"edge\") {\n straightenUnpairedBeziers(graph, curveStyles(graph, cells, input.rendered), coreToOut, drawn.curved);\n }\n const built = buildRules(kind, applied, { els, order, coreToOut }, input, drawn, { matcher, notes, spend });\n return {\n n: order.length,\n values: drawn,\n rules: built.rules,\n columns: built.columns,\n rawColumns: built.rawColumns,\n elements: Array.from(order, (i) => (i >= 0 ? els[i] : null)),\n };\n}\n\n/**\n * The cascade over one target: per property, the cell of the last rule that sets it, per element.\n * @param kind - nodes or edges\n * @param els - the core's elements of the target\n * @param sheet - the entries\n * @param matcher - the selector evaluator\n * @param input - the input\n * @param notes - where problems are noted\n * @param budget - the counted budget\n * @returns the cells and the entries applied\n */\nfunction cascade(\n kind: StyleTarget,\n els: readonly CyjsElement[],\n sheet: readonly Entry[],\n matcher: Matcher,\n input: CyjsStyleInput,\n notes: StyleNotes,\n budget: StyleWorkBudget,\n): { cells: Cells; applied: Applied[] } {\n const n = els.length;\n const specs = cyjsProperties(kind);\n const spend = (ops: number): void => {\n budget.spend(kind, ops);\n };\n const ix = new Indexes(els, spend);\n const cells: Cells = new Map();\n const notCarried = new Map<string, number>();\n const applied: Applied[] = [];\n let stopped = false;\n for (const entry of sheet) {\n input.signal?.throwIfAborted();\n const props = entryProperties(entry, kind, specs, notes, notCarried);\n if (props.length === 0) {\n continue;\n }\n const list = budget.exhausted(kind)\n ? null\n : budgetedMatch(entry.selector, { kind, n }, matcher, ix, input, budget);\n if (list === null) {\n stopped = true;\n break;\n }\n spend(list.length);\n applied.push({ entry, list, props });\n for (const p of props) {\n const col = cellsOf(cells, p.name, n);\n for (const i of list) {\n col[i] = cellFor(p, els[i]);\n }\n spend(list.length);\n }\n }\n if (stopped) {\n notes.add(STYLE_ISSUE.BUDGET, kind, null, { sample: \"stylesheet\" });\n }\n for (const [name, count] of notCarried) {\n notes.add(STYLE_ISSUE.NOT_CARRIED, kind, name, { count, sample: name });\n }\n return { cells, applied };\n}\n\n/**\n * The elements a selector matches, within the counted budget.\n * @param sel - the selector\n * @param target - the target and its element count\n * @param target.kind - nodes or edges\n * @param target.n - the element count\n * @param matcher - the evaluator\n * @param ix - the target's indexes\n * @param input - the input, whose signal cancels the match\n * @param budget - the counted budget\n * @returns the element indexes, or null when the budget ran out partway through\n */\nfunction budgetedMatch(\n sel: CyjsSelector,\n target: { readonly kind: StyleTarget; readonly n: number },\n matcher: Matcher,\n ix: Indexes,\n input: CyjsStyleInput,\n budget: StyleWorkBudget,\n): readonly number[] | null {\n matcher.begin(target.kind, budget, input.signal);\n try {\n return matchList(sel, target.kind, target.n, matcher, ix);\n } catch (error) {\n if (!(error instanceof BudgetStop)) {\n throw error;\n }\n return null;\n } finally {\n matcher.end();\n }\n}\n\n/**\n * Each element's own `style` (a bypass) over every rule; a mapper there is refused, as Cytoscape.js refuses it.\n * @param kind - nodes or edges\n * @param els - the core's elements of the target\n * @param cells - the cells; changed in place\n * @param coreToOut - the output index of each core element\n * @param notes - where problems are noted\n */\nfunction applyBypasses(\n kind: StyleTarget,\n els: readonly CyjsElement[],\n cells: Cells,\n coreToOut: Int32Array,\n notes: StyleNotes,\n): void {\n const specs = cyjsProperties(kind);\n for (let i = 0; i < els.length; i++) {\n const { json } = els[i];\n const bypass = json.style ?? json.css;\n if (!isObject(bypass)) {\n continue;\n }\n for (const name0 of Object.keys(bypass)) {\n const name = cyjsPropertyName(name0);\n const spec = specs.get(name);\n const value = bypass[name0];\n if (spec === undefined || value === \"\" || value === null) {\n continue;\n }\n const parsed = parseCyjsValue(spec, value, \"bypass\");\n if (parsed === null || parsed === CYJS_THROWS || !isFlat(parsed)) {\n notes.add(STYLE_ISSUE.BAD_VALUE, kind, spec.property, { sample: value, element: coreToOut[i] });\n continue;\n }\n cellsOf(cells, name, els.length)[i] = parsed;\n }\n }\n}\n\n/**\n * What is drawn per neutral property, in output order: the cells as neutral values, overridden by what a live core\n * reports, with the label alignments and the visibility parts combined. Properties with no value are left out.\n * @param kind - nodes or edges\n * @param els - the core's elements of the target\n * @param cells - the cascade's cells\n * @param order - the core element of each output index\n * @param rendered - what a live core reports per element JSON, when given\n * @param notes - where problems are noted\n * @param spend - spends from the budget\n * @returns the values by property\n */\nfunction drawnValues(\n kind: StyleTarget,\n els: readonly CyjsElement[],\n cells: Cells,\n order: Int32Array,\n rendered: CyjsStyleInput[\"rendered\"],\n notes: StyleNotes,\n spend: (ops: number) => void,\n): Record<string, (StyleValue | null)[]> {\n const out = order.length;\n const values: Record<string, (StyleValue | null)[]> = {};\n const words = new Map<string, (string | null)[]>();\n const drawnOf: DrawnRead = { kind, els, cells, order, rendered, notes };\n for (const [name, spec] of cyjsProperties(kind)) {\n if (!cells.has(name) && rendered === undefined) {\n continue;\n }\n const col = drawnColumn(drawnOf, name, spec);\n spend(2 * out);\n if (spec.property.startsWith(\"_\")) {\n words.set(\n spec.property,\n col.map((v) => (typeof v === \"string\" ? v : null)),\n );\n continue;\n }\n values[spec.property] ??= new Array<StyleValue | null>(out).fill(null);\n const target = values[spec.property];\n col.forEach((v, k) => {\n if (v !== null && v !== undefined) {\n target[k] = v;\n }\n });\n }\n combineParts(kind, out, words, values, notes);\n const drawn: Record<string, (StyleValue | null)[]> = {};\n for (const [p, col] of Object.entries(values)) {\n if (col.some((v) => v !== null)) {\n drawn[p] = col;\n }\n }\n return drawn;\n}\n\n/** What drawnColumn() reads. */\ninterface DrawnRead {\n readonly kind: StyleTarget;\n readonly els: readonly CyjsElement[];\n readonly cells: Cells;\n readonly order: Int32Array;\n readonly rendered: CyjsStyleInput[\"rendered\"];\n readonly notes: StyleNotes;\n}\n\n/**\n * One Cytoscape.js property's neutral value per output element: its cell, overridden by what a live core reports.\n * @param d - the target's cells and what a live core reports\n * @param name - the property\n * @param spec - its spec\n * @returns the values, in output order\n */\nfunction drawnColumn(d: DrawnRead, name: string, spec: CyjsPropertySpec): (StyleValue | null | undefined)[] {\n const { kind, order, notes, rendered } = d;\n const out = order.length;\n const col = new Array<StyleValue | null | undefined>(out).fill(null);\n const cellCol = d.cells.get(name);\n for (let k = 0; k < out && cellCol !== undefined; k++) {\n const c = order[k] >= 0 ? cellCol[order[k]] : undefined;\n if (c !== undefined) {\n col[k] = neutralOfCell(spec, name, c, { notes, target: kind, property: spec.property, element: k });\n }\n }\n if (rendered !== undefined) {\n overrideRendered(d, rendered, name, spec, col);\n }\n return col;\n}\n\n/**\n * Overrides a property's values with what a live core reports.\n * @param d - the target's cells\n * @param rendered - what a live core reports\n * @param name - the property\n * @param spec - its spec\n * @param col - the values, in output order, changed in place\n */\nfunction overrideRendered(\n d: DrawnRead,\n rendered: NonNullable<CyjsStyleInput[\"rendered\"]>,\n name: string,\n spec: CyjsPropertySpec,\n col: (StyleValue | null | undefined)[],\n): void {\n const { kind, order, notes } = d;\n for (let k = 0; k < order.length; k++) {\n const r = order[k] >= 0 ? rendered.get(d.els[order[k]].json) : undefined;\n if (r !== undefined && Object.hasOwn(r, name)) {\n const site = { notes, target: kind, property: spec.property, element: k };\n const v = cyjsRendered(kind, name, r[name], site);\n // a live core reports \"\" for a label it does not draw\n col[k] = v === undefined || (v === \"\" && spec.type === \"text\") ? null : v;\n }\n }\n}\n\n/**\n * Each edge's curve style as Cytoscape.js draws it: what a live core reports, else the winning cell.\n * @param graph - the core's elements\n * @param cells - the winning cells\n * @param rendered - what a live core reports, when given\n * @returns the curve style per edge, in core order\n */\nfunction curveStyles(graph: CyjsGraph, cells: Cells, rendered: CyjsStyleInput[\"rendered\"]): unknown[] {\n const col = cells.get(\"curve-style\");\n return graph.edges.map((el, e) => {\n const r = rendered?.get(el.json);\n if (r !== undefined && Object.hasOwn(r, \"curve-style\")) {\n return r[\"curve-style\"];\n }\n const c = col?.[e];\n return typeof c === \"object\" && c.kind === \"word\" ? c.value : undefined;\n });\n}\n\n/**\n * Cytoscape.js bows a `bezier` edge only to keep it apart from the other `bezier` edges joining the same two nodes:\n * it draws a lone one, and the middle one of an odd number, straight. Loops stay curved.\n * @param graph - the core's elements\n * @param styles - each edge's curve style, in core order\n * @param coreToOut - each edge's output index, or -1\n * @param curved - the drawn `curved` values in output order, changed in place\n */\nfunction straightenUnpairedBeziers(\n graph: CyjsGraph,\n styles: readonly unknown[],\n coreToOut: Int32Array,\n curved: (StyleValue | null)[] | undefined,\n): void {\n if (curved === undefined) {\n return;\n }\n for (const bundle of bezierBundles(graph, styles)) {\n const k = bundle.length % 2 === 1 ? coreToOut[bundle[(bundle.length - 1) / 2]] : -1;\n if (k >= 0) {\n curved[k] = false;\n }\n }\n}\n\n/**\n * The `bezier` edges that are not loops, grouped by the two nodes they join (either way round), in core order.\n * @param graph - the core's elements\n * @param styles - each edge's curve style, in core order\n * @returns the groups\n */\nfunction bezierBundles(graph: CyjsGraph, styles: readonly unknown[]): Iterable<number[]> {\n const bundles = new Map<string, number[]>();\n for (let e = 0; e < graph.edges.length; e++) {\n const s = graph.source[e];\n const t = graph.target[e];\n if (s === t || styles[e] !== \"bezier\") {\n continue;\n }\n const key = s < t ? `${s} ${t}` : `${t} ${s}`;\n const bundle = bundles.get(key);\n if (bundle === undefined) {\n bundles.set(key, [e]);\n } else {\n bundle.push(e);\n }\n }\n return bundles.values();\n}\n\n/**\n * Cytoscape.js draws every loop curved: a loop whose curve style is anything but `bezier` becomes `bezier`, except\n * `haystack`, which Cytoscape.js leaves as it is because it is the property's own default.\n * @param graph - the core's elements\n * @param col - the winning curve style per edge, if any rule set one\n */\nfunction forceLoopCurves(graph: CyjsGraph, col: (Cell | undefined)[] | undefined): void {\n if (col === undefined) {\n return;\n }\n for (let e = 0; e < graph.edges.length; e++) {\n const c = col[e];\n if (\n graph.source[e] === graph.target[e] &&\n typeof c === \"object\" &&\n c.kind === \"word\" &&\n c.value !== \"bezier\" &&\n c.value !== \"haystack\"\n ) {\n col[e] = { kind: \"word\", value: \"bezier\", str: \"bezier\" };\n }\n }\n}\n\n/**\n * The properties of one entry that apply to a target, parsed.\n * @param entry - the entry\n * @param kind - the target\n * @param specs - the target's carried properties\n * @param notes - where problems are noted\n * @param notCarried - counts of property names not carried\n * @returns the parsed properties, later duplicates last\n */\nfunction entryProperties(\n entry: Entry,\n kind: StyleTarget,\n specs: ReadonlyMap<string, CyjsPropertySpec>,\n notes: StyleNotes,\n notCarried: Map<string, number>,\n): EntryProperty[] {\n const out: EntryProperty[] = [];\n for (const [name0, value] of entry.properties) {\n const name = entry.dashOnly ? dashOnlyName(name0) : cyjsPropertyName(name0);\n const spec = specs.get(name);\n if (spec === undefined) {\n if (kind === \"node\" && !CYJS_EDGE_ONLY.has(name) && !entry.tool) {\n notCarried.set(name, (notCarried.get(name) ?? 0) + 1);\n }\n continue;\n }\n const parsed = parseCyjsValue(spec, value, \"rule\");\n if (parsed === null || parsed === CYJS_THROWS) {\n // a rule's own value: noted for the target as a whole, so per-element notes keep their element lists\n if (!entry.tool) {\n notes.add(STYLE_ISSUE.BAD_VALUE, kind, null, { sample: `${name}: ${String(value)}` });\n }\n continue;\n }\n out.push({ name, spec, parsed });\n }\n return out;\n}\n\n/**\n * A property name of an entry Cytoscape.js reads in dash form only: `content` is `label`, any other name as it is.\n * @param name - the name as written\n * @returns the name\n */\nfunction dashOnlyName(name: string): string {\n return name === \"content\" ? \"label\" : name;\n}\n\n/** Edge properties a node never carries: not noted as dropped on nodes. */\nconst CYJS_EDGE_ONLY: ReadonlySet<string> = new Set([\n \"line-color\",\n \"line-style\",\n \"target-arrow-shape\",\n \"source-arrow-shape\",\n \"target-arrow-color\",\n \"source-arrow-color\",\n \"curve-style\",\n \"arrow-scale\",\n \"source-label\",\n \"target-label\",\n]);\n\n/**\n * The elements of a target a selector matches, in order.\n * @param sel - the selector\n * @param kind - the target\n * @param n - the element count\n * @param matcher - the evaluator\n * @param ix - the target's indexes\n * @returns the element indexes\n */\nfunction matchList(sel: CyjsSelector, kind: StyleTarget, n: number, matcher: Matcher, ix: Indexes): readonly number[] {\n if (sel.queries.length === 0) {\n return [];\n }\n // one stamp per call marks the elements found, so a selector costs what its candidates cost, not the graph\n const stamp = ++ix.stamp;\n const marked = ix.marks;\n const hits: number[] = [];\n let scanned = false;\n const visit = (q: CyjsQuery, i: number): void => {\n if (marked[i] !== stamp && matcher.query(q, kind, i)) {\n marked[i] = stamp;\n hits.push(i);\n }\n };\n for (const q of sel.queries) {\n const cands = candidates(q, kind, ix);\n if (cands === null) {\n scanned = true;\n for (let i = 0; i < n; i++) {\n visit(q, i);\n }\n } else {\n matcher.work += cands.length;\n for (const i of cands) {\n visit(q, i);\n }\n }\n }\n if (scanned || sel.queries.length > 1) {\n hits.sort((a, b) => a - b);\n }\n matcher.work += hits.length;\n return hits;\n}\n\n/**\n * The cell a property gives one element: its constant, or its mapper evaluated.\n * @param p - the property\n * @param e - the element\n * @returns the cell\n */\nfunction cellFor(p: EntryProperty, e: CyjsElement): Cell {\n const v = p.parsed;\n if (v.kind === \"data\" || v.kind === \"mapData\") {\n return applyCyjsMapper(p.spec, v, mapperData(e)) ?? \"reset\";\n }\n if (v.kind === \"fn\") {\n return \"fn\";\n }\n return v;\n}\n\n/** Parsed property defaults, per property name. */\nconst DEFAULT_CELLS = new Map<string, CyjsFlat | null>();\n\n/**\n * A property's Cytoscape.js default as a flat value.\n * @param name - the property\n * @param spec - its spec\n * @returns the default\n */\nfunction defaultCell(name: string, spec: CyjsPropertySpec): CyjsFlat | null {\n const key = `${spec.type}|${name}`;\n if (!DEFAULT_CELLS.has(key)) {\n const raw = CYJS_PROPERTY_DEFAULTS.get(name);\n const parsed = raw === undefined ? null : parseCyjsValue(spec, raw, \"flat\");\n DEFAULT_CELLS.set(key, parsed === null || parsed === CYJS_THROWS || !isFlat(parsed) ? null : parsed);\n }\n return DEFAULT_CELLS.get(key) ?? null;\n}\n\n/**\n * Whether a parsed value is flat.\n * @param v - the value\n * @returns true for a color, number or word\n */\nfunction isFlat(v: CyjsParsed): v is CyjsFlat {\n return v.kind === \"color\" || v.kind === \"number\" || v.kind === \"word\";\n}\n\n/**\n * The neutral value of a cell.\n * @param spec - the property\n * @param name - its Cytoscape.js name\n * @param c - the cell\n * @param site - where it is read\n * @returns the value, null for none, or undefined when it cannot be evaluated (noted)\n */\nfunction neutralOfCell(spec: CyjsPropertySpec, name: string, c: Cell, site: CanonSite): StyleValue | null | undefined {\n if (c === CYJS_THROWS) {\n site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, {\n sample: \"unstyleable\",\n element: site.element,\n });\n return undefined;\n }\n if (c === \"fn\") {\n site.notes.add(STYLE_ISSUE.LAYER_FLATTENED, site.target, site.property, {\n sample: \"FUNCTION\",\n element: site.element,\n });\n return undefined;\n }\n const flat = c === \"reset\" ? defaultCell(name, spec) : c;\n if (flat === null) {\n return null;\n }\n return cyjsNeutral(spec, flat, site);\n}\n\n/**\n * Combines the label alignments into `labelPosition` and `visibility` with `display` into `visible`.\n * @param kind - the target\n * @param n - the element count\n * @param words - the parts by internal name\n * @param values - the values; changed in place\n * @param notes - where problems are noted\n */\nfunction combineParts(\n kind: StyleTarget,\n n: number,\n words: ReadonlyMap<string, (string | null)[]>,\n values: Record<string, (StyleValue | null)[]>,\n notes: StyleNotes,\n): void {\n const va = words.get(\"_valign\");\n const ha = words.get(\"_halign\");\n if (kind === \"node\" && (va !== undefined || ha !== undefined)) {\n values.labelPosition = Array.from({ length: n }, (_, i) =>\n labelPosition(va?.[i] ?? null, ha?.[i] ?? null, (sample) => {\n notes.add(STYLE_ISSUE.UNKNOWN_VALUE, kind, \"labelPosition\", { sample, element: i });\n }),\n );\n }\n const vis = words.get(\"_visibility\");\n const disp = words.get(\"_display\");\n if (vis !== undefined || disp !== undefined) {\n const col = new Array<StyleValue | null>(n).fill(null);\n for (let i = 0; i < n; i++) {\n const a = vis?.[i] ?? null;\n const b = disp?.[i] ?? null;\n if (a === null && b === null) {\n continue;\n }\n col[i] = a !== \"hidden\" && b !== \"none\";\n }\n values.visible = col;\n }\n}\n\n/**\n * A node label's position from its vertical and horizontal alignments; an `-inside` alignment is read as its\n * outside one, noted.\n * @param v - the vertical alignment, or null\n * @param h - the horizontal alignment, or null\n * @param note - notes an alignment read as another\n * @returns the position, or null\n */\nfunction labelPosition(v: string | null, h: string | null, note: (sample: string) => void): StyleValue | null {\n if (v === null && h === null) {\n return null;\n }\n const vv = (v ?? \"top\").replace(\"-inside\", \"\");\n const hh = (h ?? \"center\").replace(\"-inside\", \"\");\n if ((v ?? \"\").endsWith(\"-inside\") || (h ?? \"\").endsWith(\"-inside\")) {\n note(`${v ?? \"\"} ${h ?? \"\"}`);\n }\n return POSITIONS.get(`${vv},${hh}`) ?? null;\n}\n\n// ============================================================ rules\n\n/**\n * The stylesheet as neutral rules over graph-io's columns and the style columns it adds.\n * @param kind - the target\n * @param applied - the entries with their matched elements and properties\n * @param core - the core's elements, the core element of each output index and the output index of each core element\n * (or -1)\n * @param core.els - the core's elements\n * @param core.order - the core element of each output index\n * @param core.coreToOut - the output index of each core element, or -1\n * @param input - the input (the graph, the rendered values)\n * @param truth - what is drawn per property, by output index\n * @param env - the evaluator (degrees), where problems are noted and how the budget is spent\n * @param env.matcher - the evaluator\n * @param env.notes - where problems are noted\n * @param env.spend - spends from the budget\n * @returns the rules, the style columns and the data columns they read\n */\nfunction buildRules(\n kind: StyleTarget,\n applied: readonly { entry: Entry; list: readonly number[]; props: EntryProperty[] }[],\n core: { readonly els: readonly CyjsElement[]; readonly order: Int32Array; readonly coreToOut: Int32Array },\n input: CyjsStyleInput,\n truth: Readonly<Record<string, readonly (StyleValue | null)[]>>,\n env: { readonly matcher: Matcher; readonly notes: StyleNotes; readonly spend: (ops: number) => void },\n): { rules: StyleRule[]; columns: Map<string, StyleColumn>; rawColumns: string[] } {\n const { els, order, coreToOut } = core;\n const { matcher, notes, spend } = env;\n const out = order.length;\n const columns = new Map<string, StyleColumn>();\n const raw = new Set<string>();\n const ctx: RuleContext = {\n kind,\n els,\n coreToOut,\n out,\n snapshot: input.snapshot,\n truth: input.rendered === undefined ? null : truth,\n matcher,\n notes,\n spend,\n columns,\n raw,\n members: new Map(),\n faithful: new Map(),\n degrees: new Map(),\n };\n const drafts: Draft[] = [];\n for (const a of applied) {\n const props = a.props.filter((p) => !p.spec.property.startsWith(\"_\"));\n if (props.length === 0 || a.list.length === 0) {\n continue;\n }\n drafts.push(draftOf(ctx, a.entry, a.list, props));\n }\n const rules = collapse(ctx, drafts);\n return { rules, columns, rawColumns: [...raw] };\n}\n\n/** The state shared while rules are built. */\ninterface RuleContext {\n readonly kind: StyleTarget;\n readonly els: readonly CyjsElement[];\n readonly coreToOut: Int32Array;\n readonly out: number;\n readonly snapshot: GraphSnapshot | undefined;\n /** What a live core drew, when given: the values a function-valued property is copied from. */\n readonly truth: Readonly<Record<string, readonly (StyleValue | null)[]>> | null;\n readonly matcher: Matcher;\n readonly notes: StyleNotes;\n readonly spend: (ops: number) => void;\n readonly columns: Map<string, StyleColumn>;\n readonly raw: Set<string>;\n readonly members: Map<string, string>;\n readonly faithful: Map<string, boolean>;\n readonly degrees: Map<string, boolean>;\n}\n\n/** A rule with what collapsing needs. */\ninterface Draft {\n /** Builds the rule (and its predicate's column) when it stays a rule of its own. */\n readonly rule: () => StyleRule;\n /** The rule's id. */\n readonly id: string;\n /** Its constants. */\n readonly set: Readonly<Record<string, StyleValue>>;\n /** Cytoscape.js's own default rule. */\n readonly tool: boolean;\n /** For a rule of one class, one id or one value test that only sets values: its kind and key. */\n readonly single: { readonly sig: string; readonly key: Scalar } | null;\n /** The matched core elements. */\n readonly list: readonly number[];\n}\n\n/**\n * One entry as a rule.\n * @param ctx - the shared state\n * @param entry - the entry\n * @param list - the matched core elements\n * @param props - the carried properties\n * @returns the draft\n */\nfunction draftOf(ctx: RuleContext, entry: Entry, list: readonly number[], props: readonly EntryProperty[]): Draft {\n const setting = new Map<string, StyleValue>();\n const mapping = new Map<string, Mapping>();\n let flattened = false;\n const id = entry.tool\n ? `${ctx.kind}.cytoscape-js.${String(entry.index + CYJS_DEFAULT_STYLESHEET.length)}`\n : `${ctx.kind}.sheet.${String(entry.index)}`;\n for (const p of props) {\n // a later duplicate of a property replaces the earlier one\n setting.delete(p.spec.property);\n mapping.delete(p.spec.property);\n const v = p.parsed;\n if (v.kind === \"fn\") {\n const copied = functionCopy(ctx, entry, list, p.spec.property);\n if (copied !== null) {\n mapping.set(p.spec.property, copied);\n flattened = true;\n }\n } else if (isFlat(v)) {\n const neutral = cyjsNeutral(p.spec, v, {\n notes: new StyleNotes(),\n target: ctx.kind,\n property: p.spec.property,\n });\n if (neutral !== undefined) {\n setting.set(p.spec.property, neutral);\n }\n } else {\n mapping.set(p.spec.property, mapperMapping(ctx, entry, list, p));\n }\n }\n const set = Object.fromEntries(setting);\n const map = Object.fromEntries(mapping);\n const hasMap = mapping.size > 0;\n // the predicate is built only for a rule that is not collapsed into a run: a run's rules need no column each\n const rule = (): StyleRule => {\n const where = predicateOf(ctx, entry, list);\n return {\n id,\n target: ctx.kind,\n role: roleOf(hasMap, where),\n origin: entry.tool ? \"tool\" : \"declared\",\n where,\n ...(setting.size > 0 ? { set } : {}),\n ...(hasMap ? { map } : {}),\n facts: flattened ? { elements: list.length, reason: \"FUNCTION\" } : { elements: list.length },\n };\n };\n return {\n rule,\n id,\n set,\n tool: entry.tool,\n single: hasMap || entry.tool ? null : singleTest(entry.selector, ctx.kind),\n list,\n };\n}\n\n/**\n * A function-valued property: its values as the live core drew them, copied per element into a style column.\n * @param ctx - the shared state\n * @param entry - the entry\n * @param list - the matched core elements\n * @param property - the neutral property\n * @returns the passthrough of the copy, or null without a live core's values\n */\nfunction functionCopy(ctx: RuleContext, entry: Entry, list: readonly number[], property: string): Mapping | null {\n const drawn = ctx.truth?.[property];\n if (drawn === undefined) {\n return null;\n }\n const key = `function.${String(entry.index)}.${property}`;\n const col = new Array<StyleValue | null>(ctx.out).fill(null);\n for (const i of list) {\n const k = ctx.coreToOut[i];\n if (k >= 0) {\n col[k] = drawn[k];\n }\n }\n ctx.columns.set(key, col);\n return { kind: \"passthrough\", by: { style: key } };\n}\n\n/**\n * A rule's role from what it does.\n * @param hasMap - whether it maps values\n * @param where - its predicate\n * @returns \"mapping\", \"defaults\" (constants on every element) or \"group\"\n */\nfunction roleOf(hasMap: boolean, where: Predicate): string {\n if (hasMap) {\n return \"mapping\";\n }\n return \"all\" in where ? \"defaults\" : \"group\";\n}\n\n/**\n * The varying test of a single-query selector, for collapsing runs: its last class, id or value test, with the other\n * tests (a shared scope such as `[graphty_import = \"a\"]`) in the signature so a run only joins rules that agree on them.\n * @param sel - the selector\n * @param kind - the target\n * @returns the run signature and the rule's key, or null\n */\nfunction singleTest(sel: CyjsSelector, kind: StyleTarget): { sig: string; key: Scalar } | null {\n if (sel.invalid || sel.queries.length !== 1) {\n return null;\n }\n const checks = sel.queries[0].checks.filter(\n (c) => !(c.type === \"group\" && (c.value === \"*\" || c.value === `${kind}s`)),\n );\n const c = checks.at(-1);\n if (c === undefined || checks.slice(0, -1).some((x) => x.type !== \"compare\" && x.type !== \"class\")) {\n return null;\n }\n const context = JSON.stringify(checks.slice(0, -1));\n if (c.type === \"class\" && typeof c.value === \"string\") {\n return { sig: `class\\u0000${context}`, key: c.value };\n }\n if (c.type === \"id\") {\n return { sig: `id\\u0000${context}`, key: c.value };\n }\n if (c.type === \"compare\" && c.op === \"=\" && !c.not && !c.ci) {\n return { sig: `eq\\u0000${context}\\u0000${c.field}`, key: c.value };\n }\n return null;\n}\n\n/**\n * Whether graph-io's column holds exactly what a selector reads for every element: the same value (`===`) where the\n * raw data has a scalar, nothing where it has none, and no raw null or false (a selector sees those, a column does\n * not).\n * @param ctx - the shared state\n * @param field - the field\n * @returns true when a predicate over the column selects what the selector selects\n */\nfunction faithful(ctx: RuleContext, field: string): boolean {\n const known = ctx.faithful.get(field);\n if (known !== undefined) {\n return known;\n }\n let ok = ctx.snapshot !== undefined;\n const table = ctx.kind === \"node\" ? ctx.snapshot?.nodes : ctx.snapshot?.edges;\n const has = table?.names().includes(field) ?? false;\n for (let c = 0; ok && c < ctx.els.length; c++) {\n const k = ctx.coreToOut[c];\n const rv = selectorField(ctx.els[c], field);\n if (rv === null || rv === false) {\n ok = false;\n break;\n }\n const gv = k >= 0 && has && table !== undefined ? plainCell(table.value(field, k)) : null;\n if (rv === undefined ? gv !== null : rv !== gv) {\n ok = false;\n }\n }\n ctx.spend(ctx.els.length);\n ctx.faithful.set(field, ok);\n return ok;\n}\n\n/**\n * Whether the graph's degree equals Cytoscape.js's for every node.\n * @param ctx - the shared state\n * @param which - the degree\n * @returns true when a predicate over the computed degree selects what the selector selects\n */\nfunction degreeAgrees(ctx: RuleContext, which: \"degree\" | \"indegree\" | \"outdegree\"): boolean {\n const known = ctx.degrees.get(which);\n if (known !== undefined) {\n return known;\n }\n let ok = ctx.snapshot !== undefined && ctx.kind === \"node\" && (which === \"degree\" || ctx.snapshot.directed);\n if (ok && ctx.snapshot !== undefined) {\n const mine = degreeValues(ctx.snapshot, which);\n for (let c = 0; c < ctx.els.length; c++) {\n const k = ctx.coreToOut[c];\n if (k < 0 || mine[k] !== ctx.matcher[which][c]) {\n ok = false;\n break;\n }\n }\n ok &&= ctx.els.length === ctx.out;\n }\n ctx.degrees.set(which, ok);\n return ok;\n}\n\n/**\n * A selector as a short predicate when one expresses it exactly, else a membership style column.\n * @param ctx - the shared state\n * @param entry - the entry\n * @param list - the matched core elements\n * @returns the predicate\n */\nfunction predicateOf(ctx: RuleContext, entry: Entry, list: readonly number[]): Predicate {\n const short = shortPredicate(ctx, entry.selector);\n if (short !== null) {\n return short;\n }\n if (list.length === ctx.els.length && ctx.els.length === ctx.out) {\n return { all: true };\n }\n const sig = `${entry.tool ? \"tool\" : \"file\"}\\u0000${entry.text}`;\n let key = ctx.members.get(sig);\n if (key === undefined) {\n key = `member.${String(ctx.members.size + 1)}`;\n ctx.members.set(sig, key);\n const col = new Array<StyleValue | null>(ctx.out).fill(null);\n for (const i of list) {\n const k = ctx.coreToOut[i];\n if (k >= 0) {\n col[k] = true;\n }\n }\n ctx.spend(ctx.out + list.length);\n ctx.columns.set(key, col);\n ctx.notes.add(STYLE_ISSUE.SELECTOR_AS_COLUMN, ctx.kind, key, { sample: entry.text });\n }\n return { has: { style: key } };\n}\n\n/**\n * The short predicate of a selector, or null: every query of one alternative with at most 8 tests, each a group,\n * a value test or an existence test over a column graph-io holds exactly, or a degree test the graph computes the\n * same way; several alternatives only as equal tests of one field (`in`).\n * @param ctx - the shared state\n * @param sel - the selector\n * @returns the predicate, or null\n */\nfunction shortPredicate(ctx: RuleContext, sel: CyjsSelector): Predicate | null {\n if (sel.invalid) {\n return null;\n }\n const alts: Predicate[][] = [];\n for (const q of sel.queries) {\n const terms = queryTerms(ctx, q);\n if (terms === null) {\n return null;\n }\n if (terms !== \"never\") {\n alts.push(terms);\n }\n }\n if (alts.length === 0) {\n return null;\n }\n if (alts.some((t) => t.length === 0)) {\n return ctx.els.length === ctx.out ? { all: true } : null;\n }\n if (alts.length === 1) {\n const t = alts[0];\n if (t.length > 8) {\n return null;\n }\n return t.length === 1 ? t[0] : { and: t };\n }\n return equalTests(alts);\n}\n\n/**\n * A query's checks as short predicate terms.\n * @param ctx - the shared state\n * @param q - the query\n * @returns the terms; \"never\" when its group test excludes the target; null when a check has no short term\n */\nfunction queryTerms(ctx: RuleContext, q: CyjsQuery): Predicate[] | \"never\" | null {\n const terms: Predicate[] = [];\n let never = false;\n for (const c of q.checks) {\n if (c.type === \"group\") {\n never ||= c.value !== \"*\" && c.value !== `${ctx.kind}s`;\n continue;\n }\n const t = termOf(ctx, c);\n if (t === null) {\n return null;\n }\n terms.push(t);\n }\n return never ? \"never\" : terms;\n}\n\n/**\n * Several alternatives as one `in` predicate: only equal tests of one column, at most 8.\n * @param alts - the alternatives' terms\n * @returns the predicate, or null\n */\nfunction equalTests(alts: readonly Predicate[][]): Predicate | null {\n if (alts.length > 8 || !alts.every((t) => t.length === 1 && \"eq\" in t[0])) {\n return null;\n }\n const by = (alts[0][0] as { eq: readonly [ColumnRef, Scalar] }).eq[0];\n const values: Scalar[] = [];\n for (const t of alts) {\n const [r, v] = (t[0] as { eq: readonly [ColumnRef, Scalar] }).eq;\n if (JSON.stringify(r) !== JSON.stringify(by)) {\n return null;\n }\n values.push(v);\n }\n return { in: [by, values] };\n}\n\n/**\n * One check as a short predicate term, or null.\n * @param ctx - the shared state\n * @param c - the check\n * @returns the term, or null\n */\nfunction termOf(ctx: RuleContext, c: CyjsCheck): Predicate | null {\n switch (c.type) {\n case \"compare\":\n if (c.op !== \"=\" || c.ci || !faithful(ctx, c.field)) {\n return null;\n }\n return c.not ? { not: { eq: [{ data: c.field }, c.value] } } : { eq: [{ data: c.field }, c.value] };\n case \"exist\":\n return faithful(ctx, c.field) ? { has: { data: c.field } } : null;\n case \"bool\":\n return c.op === \"^\" && faithful(ctx, c.field) ? { not: { has: { data: c.field } } } : null;\n case \"meta\":\n if (c.ci || !degreeAgrees(ctx, c.field)) {\n return null;\n }\n return degreeTerm(c.field, c.op, c.not, c.value);\n default:\n return null;\n }\n}\n\n/**\n * A degree test as a predicate over the computed degree, so it follows later edits: `=` as `eq`, and an order test\n * as the degrees it keeps or the degrees it leaves out (degrees are whole numbers from 0), at most 8 of them.\n * @param field - the degree\n * @param op - the comparison\n * @param not - whether the test is negated\n * @param value - the number compared with\n * @returns the predicate, or null when it needs more than 8 values\n */\nfunction degreeTerm(\n field: \"degree\" | \"indegree\" | \"outdegree\",\n op: string,\n not: boolean,\n value: number,\n): Predicate | null {\n const ref: ColumnRef = { computed: field };\n if (op === \"=\") {\n return not ? { not: { eq: [ref, value] } } : { eq: [ref, value] };\n }\n // The whole numbers from 0 the test leaves out (`>`, `>=`) or keeps (`<`, `<=`).\n let below: number;\n if (op === \">\" || op === \"<=\") {\n below = Math.floor(value) + 1;\n } else if (op === \">=\" || op === \"<\") {\n below = Math.ceil(value);\n } else {\n return null;\n }\n if (!Number.isFinite(below) || below < 1 || below > 8) {\n return null;\n }\n const values = Array.from({ length: below }, (_, k) => k);\n const keeps = op === \"<\" || op === \"<=\";\n const inSet: Predicate = { in: [ref, values] };\n return keeps !== not ? inSet : { not: inSet };\n}\n\n/**\n * A mapper as a neutral mapping over graph-io's column when that gives Cytoscape.js's values for every element the\n * rule applies to, else the mapper's per-element values as a style column (`value.<rule>.<property>`).\n * @param ctx - the shared state\n * @param entry - the entry\n * @param list - the matched core elements\n * @param p - the property\n * @returns the mapping\n */\nfunction mapperMapping(ctx: RuleContext, entry: Entry, list: readonly number[], p: EntryProperty): Mapping {\n const v = p.parsed as CyjsParsed & { kind: \"data\" | \"mapData\" };\n const want = new Array<StyleValue | null>(list.length);\n const site: CanonSite = { notes: new StyleNotes(), target: ctx.kind, property: p.spec.property };\n for (let k = 0; k < list.length; k++) {\n const c = cellFor(p, ctx.els[list[k]]);\n const neutral = neutralOfCell(p.spec, p.name, c, site);\n want[k] = neutral ?? null;\n }\n ctx.spend(list.length * 2);\n const candidate = candidateMapping(ctx, v, p);\n if (candidate !== null && ctx.snapshot !== undefined) {\n const exact = givesWanted(\n ctx,\n ctx.snapshot,\n candidate,\n { field: v.field, property: p.spec.property },\n list,\n want,\n );\n ctx.spend(list.length);\n if (exact) {\n ctx.raw.add(v.field);\n return candidate;\n }\n }\n const key = `value.${entry.tool ? \"tool\" : String(entry.index)}.${p.spec.property}`;\n const col = new Array<StyleValue | null>(ctx.out).fill(null);\n for (let k = 0; k < list.length; k++) {\n const o = ctx.coreToOut[list[k]];\n if (o >= 0) {\n col[o] = want[k];\n }\n }\n ctx.columns.set(key, col);\n return { kind: \"passthrough\", by: { style: key } };\n}\n\n/**\n * Whether a mapping over graph-io's column gives Cytoscape.js's value for every element a rule applies to.\n * @param ctx - the shared state\n * @param snapshot - the graph\n * @param candidate - the mapping\n * @param what - the column and the neutral property\n * @param what.field - the column\n * @param what.property - the neutral property\n * @param list - the matched core elements\n * @param want - Cytoscape.js's value of each, in list order\n * @returns true when it gives every one\n */\nfunction givesWanted(\n ctx: RuleContext,\n snapshot: GraphSnapshot,\n candidate: (Mapping & { kind: \"passthrough\" }) | (Mapping & { kind: \"continuous\" }),\n what: { readonly field: string; readonly property: string },\n list: readonly number[],\n want: readonly (StyleValue | null)[],\n): boolean {\n const table = ctx.kind === \"node\" ? snapshot.nodes : snapshot.edges;\n if (!table.names().includes(what.field)) {\n return false;\n }\n const canon = canonicalFor(ctx.kind, what.property);\n for (let k = 0; k < list.length; k++) {\n const o = ctx.coreToOut[list[k]];\n const cell = o < 0 ? null : plainCell(table.value(what.field, o));\n let got: StyleValue | null = null;\n if (cell !== null && !Array.isArray(cell)) {\n got = candidate.kind === \"passthrough\" ? canon(cell) : evalContinuous(candidate.points, numberOf(cell));\n }\n if (o >= 0 && got !== want[k]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * The neutral mapping a mapper would be over its field, before it is checked.\n * @param ctx - the shared state\n * @param v - the mapper\n * @param p - the property\n * @returns a passthrough for `data()`, a two-point continuous mapping for `mapData()`, or null\n */\nfunction candidateMapping(\n ctx: RuleContext,\n v: CyjsParsed & { kind: \"data\" | \"mapData\" },\n p: EntryProperty,\n): (Mapping & { kind: \"passthrough\" }) | (Mapping & { kind: \"continuous\" }) | null {\n if (v.kind === \"data\") {\n return { kind: \"passthrough\", by: { data: v.field } };\n }\n if (v.fieldMin === v.fieldMax) {\n return null;\n }\n const site: CanonSite = { notes: new StyleNotes(), target: ctx.kind, property: p.spec.property };\n const a = cyjsNeutral(p.spec, v.min, site);\n const b = cyjsNeutral(p.spec, v.max, site);\n if (a === undefined || b === undefined) {\n return null;\n }\n const lo: ContinuousPoint = { at: v.fieldMin, below: a, value: a, above: a };\n const hi: ContinuousPoint = { at: v.fieldMax, below: b, value: b, above: b };\n return { kind: \"continuous\", by: { data: v.field }, points: v.fieldMin < v.fieldMax ? [lo, hi] : [hi, lo] };\n}\n\n/**\n * Collapses runs of three or more rules that each test one class, one id or one value of the same field and only set\n * values into ONE mapping rule: per property, a winner column holds the key (class, id or value) of the last rule in\n * the run that matches the element and sets the property (the cascade's winner), and a discrete table maps each key\n * to that rule's value. A run keyed by a value whose column graph-io holds exactly reads that column instead.\n * @param ctx - the shared state\n * @param drafts - the rules in order\n * @returns the rules\n */\nfunction collapse(ctx: RuleContext, drafts: readonly Draft[]): StyleRule[] {\n const out: StyleRule[] = [];\n let run = 0;\n let i = 0;\n while (i < drafts.length) {\n const sig = drafts[i].single?.sig ?? null;\n let j = i + 1;\n while (sig !== null && j < drafts.length && drafts[j].single?.sig === sig) {\n j++;\n }\n if (sig === null || j - i < 3) {\n for (const d of drafts.slice(i, j)) {\n const rule = d.rule();\n // Cytoscape.js's own default rule over every element: the writing tool's constants already say it\n if (!(d.tool && \"all\" in rule.where)) {\n out.push(rule);\n }\n }\n } else {\n run++;\n out.push(runRule(ctx, drafts.slice(i, j), sig, run));\n }\n i = j;\n }\n return out;\n}\n\n/**\n * A run of rules collapsed into one mapping rule.\n * @param ctx - the shared state\n * @param members - the run's rules, in order\n * @param sig - their shared signature\n * @param run - the run's number\n * @returns the rule\n */\nfunction runRule(ctx: RuleContext, members: readonly Draft[], sig: string, run: number): StyleRule {\n const props = new Set(members.flatMap((d) => Object.keys(d.set)));\n // a value run with no shared tests may read the field itself\n const parts = sig.split(\"\\u0000\");\n const field = parts[0] === \"eq\" && parts[1] === \"[]\" ? parts[2] : null;\n const map: Record<string, Mapping> = {};\n for (const p of props) {\n map[p] = runMapping(ctx, members, p, { field, key: `winner.${String(run)}.${p}` });\n }\n const first = members[0].id.split(\".\").pop() ?? \"\";\n return {\n id: `${ctx.kind}.sheet.by.${parts[0] === \"eq\" ? \"value\" : parts[0]}.${first}`,\n target: ctx.kind,\n role: \"mapping\",\n origin: \"declared\",\n where: { all: true },\n map,\n facts: { elements: members.reduce((sum, d) => sum + d.list.length, 0) },\n };\n}\n\n/**\n * One property of a collapsed run: a winner column holds the key of the last rule in the run that matches the\n * element and sets the property (the cascade's winner), and a discrete table maps each key to that rule's value; a\n * run keyed by a value whose column graph-io holds exactly reads that column instead.\n * @param ctx - the shared state\n * @param members - the run's rules, in order\n * @param p - the property\n * @param names - the field a value run tests (null for another run) and the winner column's key\n * @param names.field - the field a value run tests, or null\n * @param names.key - the winner column's key\n * @returns the mapping\n */\nfunction runMapping(\n ctx: RuleContext,\n members: readonly Draft[],\n p: string,\n names: { readonly field: string | null; readonly key: string },\n): Mapping {\n const winner = new Array<StyleValue | null>(ctx.out).fill(null);\n const table = new Map<string, [Scalar, StyleValue]>();\n for (const d of members) {\n const value = (d.set as Record<string, StyleValue | undefined>)[p];\n if (value === undefined || d.single === null) {\n continue;\n }\n const { key } = d.single;\n table.set(`${typeof key}:${String(key)}`, [key, value]);\n for (const c of d.list) {\n const k = ctx.coreToOut[c];\n if (k >= 0) {\n winner[k] = key;\n }\n }\n ctx.spend(d.list.length);\n }\n const entries = [...table.values()];\n // a table key that names a later rule's value: the table maps each key to the last rule's value for it\n const byKey = new Map(entries.map(([k, v]) => [`${typeof k}:${String(k)}`, v]));\n const { field } = names;\n if (field !== null && faithful(ctx, field) && sameByData(ctx, field, winner, byKey)) {\n return { kind: \"discrete\", by: { data: field }, table: entries };\n }\n ctx.columns.set(names.key, winner);\n return { kind: \"discrete\", by: { style: names.key }, table: entries };\n}\n\n/**\n * Whether a discrete table keyed by a column's own values gives every element its winner's value.\n * @param ctx - the shared state\n * @param field - the column\n * @param winner - each element's winning key, or null\n * @param byKey - the table\n * @returns true when reading the column gives the same values\n */\nfunction sameByData(\n ctx: RuleContext,\n field: string,\n winner: readonly (StyleValue | null)[],\n byKey: ReadonlyMap<string, StyleValue>,\n): boolean {\n const table = ctx.kind === \"node\" ? ctx.snapshot?.nodes : ctx.snapshot?.edges;\n if (!table?.names().includes(field)) {\n return false;\n }\n for (let k = 0; k < ctx.out; k++) {\n const v = plainCell(table.value(field, k));\n const viaData =\n typeof v === \"string\" || typeof v === \"number\" ? (byKey.get(`${typeof v}:${String(v)}`) ?? null) : null;\n const w = winner[k];\n const viaWinner = w === null ? null : (byKey.get(`${typeof w}:${String(w)}`) ?? null);\n if (viaData !== viaWinner) {\n return false;\n }\n }\n return true;\n}\n\n// ============================================================ the importer path\n\n/**\n * A Cytoscape.js file's styles as an importer's `styles()` returns them: what Cytoscape.js draws per element and the\n * stylesheet's rules, with Cytoscape.js as the writing tool whose defaults fill what the stylesheet leaves unset.\n * @param input - the elements, the stylesheet, the graph and the options\n * @returns the styles for graph-io's planner\n */\nexport function cytoscapeJsStyles(input: CyjsStyleInput & { readonly snapshot: GraphSnapshot }): ImporterStyles {\n const notes = input.notes ?? new StyleNotes();\n const r = evaluateCytoscapeJs({ ...input, notes });\n const output = (t: CyjsTargetStyles): ReaderOutput => ({ values: t.values, rules: t.rules, columns: t.columns });\n return {\n canonical: true,\n dialect: \"cytoscape-js\",\n tool: \"cytoscape-js\",\n units: \"px\",\n node: output(r.node),\n edge: output(r.edge),\n notes: notes.list(),\n };\n}\n","/**\n * Neutral styles written as a Cytoscape.js stylesheet: the rules in order as stylesheet rules, the per-element values\n * those rules read as element data under flat keys, and per-element bypasses for the values no rule gives.\n *\n * - A short predicate becomes a selector (`all`, `has`, `eq`, `in`, `not`, one `and`); a predicate a selector cannot\n * state exactly (a computed degree, a boolean value, a column whose name a selector cannot spell) becomes a\n * membership value written into element data and tested with `[key]`.\n * - A passthrough becomes `data(key)` over the values, written ready for Cytoscape.js; a discrete mapping becomes one\n * rule per table key; a continuous mapping becomes `mapData()`, one per segment; every mapped rule is scoped to the\n * elements it gives a value, because a Cytoscape.js mapper that finds nothing resets the property to its default.\n * - The stylesheet is then applied to the element data with graph-io's own Cytoscape.js engine, and every element\n * whose drawn value still differs from the styles gets a bypass (its own `style`), so the result is exact.\n * - With an import id, every element gets `graphty_import: <id>` and every selector tests it, so two imports in one\n * core never style each other's elements.\n * - Cytoscape.js draws what it draws regardless of any stylesheet: a loop is always curved, and its own default rules\n * (compound parents, selected elements) apply beneath the stylesheet. A file Cytoscape.js wrote keeps those\n * defaults as Cytoscape.js's own; they are not written again.\n */\n\nimport { STYLE_ISSUE } from \"../codes.js\";\nimport { StyleNotes } from \"../notes.js\";\nimport { matches, refSource, resolveRules } from \"../plan/resolve.js\";\nimport type {\n ColumnRef,\n ExtractedStyles,\n Mapping,\n Predicate,\n Scalar,\n StyleNote,\n StyleRule,\n StyleTarget,\n StyleValue,\n} from \"../types.js\";\nimport { STYLE_PROPERTIES } from \"../vocabulary.js\";\nimport { evaluateCytoscapeJs } from \"./cascade.js\";\nimport { CYJS_EDGE_PROPERTIES, CYJS_NODE_PROPERTIES, type CyjsPropertySpec, isFontFamily } from \"./mappers.js\";\nimport { parseCyjsSelector } from \"./selector.js\";\n\n/** One rule of a Cytoscape.js stylesheet. */\nexport interface CytoscapeStylesheetRule {\n /** The selector. */\n readonly selector: string;\n /** Property name to value, as Cytoscape.js reads them. */\n readonly style: Readonly<Record<string, string | number>>;\n}\n\n/** A value written into an element's `data`. */\nexport type CytoscapeDataValue = string | number | boolean;\n\n/** Per target, one object per element (by element index), or null where the element needs nothing. */\nexport interface CytoscapePerElement<T> {\n /** Nodes. */\n readonly node: readonly (Readonly<Record<string, T>> | null)[];\n /** Edges. */\n readonly edge: readonly (Readonly<Record<string, T>> | null)[];\n}\n\n/** Options of `toCytoscapeStylesheet()`. */\nexport interface CytoscapeStylesheetOptions {\n /**\n * Scopes the stylesheet to one import: every element gets `graphty_import: <importId>` in its data and every\n * selector tests it. Quotes and backslashes are replaced with `_`, in the data and the selectors alike.\n */\n readonly importId?: string;\n}\n\n/** The stylesheet, the element data it reads and the bypasses that make it exact. */\nexport interface CytoscapeStylesheetResult {\n /** The rules, in order; append them to a core's stylesheet. */\n readonly stylesheet: CytoscapeStylesheetRule[];\n /** What to merge into each element's `data`. */\n readonly elementData: CytoscapePerElement<CytoscapeDataValue>;\n /** What to give each element as its own `style` (a bypass over every rule). */\n readonly bypass: CytoscapePerElement<string | number>;\n /** Every style that could not be written, or only approximately. */\n readonly notes: readonly StyleNote[];\n}\n\n/** The element data key that holds the import id. */\nexport const CYTOSCAPE_IMPORT_KEY = \"graphty_import\";\n\n/**\n * The flat element data key of a style column: Cytoscape.js reads a dot in a data selector as a nested path, so the\n * key has none (`member.3` is `graphty_style_member_3`).\n * @param key - the style column's key\n * @returns the element data key\n * @category Styles\n */\nexport function cytoscapeStyleKey(key: string): string {\n return `graphty_style_${key.replaceAll(/\\W/g, \"_\")}`;\n}\n\n/** A name a selector and a mapper can both spell without escapes or paths. */\nconst PLAIN_NAME = /^[A-Za-z_]\\w*$/;\n\n/** A neutral value written as Cytoscape.js properties, and whether that is only approximate. */\ninterface Written {\n readonly props: Record<string, string | number>;\n readonly approximate: boolean;\n}\n\nconst SHAPES_TO_CYJS: ReadonlyMap<string, string> = new Map([\n [\"ellipse\", \"ellipse\"],\n [\"rectangle\", \"rectangle\"],\n [\"round-rectangle\", \"round-rectangle\"],\n [\"triangle\", \"triangle\"],\n [\"diamond\", \"diamond\"],\n [\"pentagon\", \"pentagon\"],\n [\"hexagon\", \"hexagon\"],\n [\"octagon\", \"octagon\"],\n [\"parallelogram\", \"rhomboid\"],\n [\"star\", \"star\"],\n [\"vee\", \"vee\"],\n]);\nconst ARROWS_TO_CYJS: ReadonlyMap<string, string> = new Map([\n [\"none\", \"none\"],\n [\"triangle\", \"triangle\"],\n [\"vee\", \"vee\"],\n [\"tee\", \"tee\"],\n [\"diamond\", \"diamond\"],\n [\"circle\", \"circle\"],\n [\"square\", \"square\"],\n]);\nconst ARROWS_NEAREST: ReadonlyMap<string, string> = new Map([\n [\"triangle-open\", \"triangle\"],\n [\"diamond-open\", \"diamond\"],\n [\"circle-open\", \"circle\"],\n [\"half\", \"triangle\"],\n [\"inverted\", \"triangle\"],\n [\"crow\", \"vee\"],\n]);\n\n/**\n * A neutral value as Cytoscape.js properties.\n * @param target - nodes or edges\n * @param property - the neutral property\n * @param value - the value\n * @returns the properties, or null when Cytoscape.js has no place for it\n */\nfunction toCyjs(target: StyleTarget, property: string, value: StyleValue): Written | null {\n const specs = target === \"node\" ? CYJS_NODE_PROPERTIES : CYJS_EDGE_PROPERTIES;\n switch (property) {\n case \"visible\":\n return exact({ display: value === false ? \"none\" : \"element\" });\n case \"labelItalic\":\n return exact({ \"font-style\": value === true ? \"italic\" : \"normal\" });\n case \"curved\":\n // `bezier` bows only parallel edges; `unbundled-bezier` bows every edge\n return exact({ \"curve-style\": value === true ? \"unbundled-bezier\" : \"straight\" });\n case \"labelPosition\":\n return labelPositionToCyjs(String(value));\n case \"shape\":\n return enumToCyjs(\"shape\", String(value), SHAPES_TO_CYJS, specs);\n case \"borderStyle\":\n return borderStyleToCyjs(String(value));\n case \"lineStyle\":\n return lineStyleToCyjs(String(value));\n case \"sourceArrow\":\n case \"targetArrow\":\n return arrowToCyjs(\n property === \"sourceArrow\" ? \"source-arrow-shape\" : \"target-arrow-shape\",\n String(value),\n specs,\n );\n case \"labelFont\":\n return isFontFamily(String(value)) ? exact({ \"font-family\": String(value) }) : null;\n default:\n return propertyToCyjs(property, value, specs);\n }\n}\n\n/**\n * Properties written exactly.\n * @param props - the properties\n * @returns the written value\n */\nfunction exact(props: Record<string, string | number>): Written {\n return { props, approximate: false };\n}\n\n/**\n * Properties written as the nearest Cytoscape.js has.\n * @param props - the properties\n * @returns the written value\n */\nfunction near(props: Record<string, string | number>): Written {\n return { props, approximate: true };\n}\n\n/**\n * A label position as the vertical and horizontal alignments.\n * @param text - the position\n * @returns the written value\n */\nfunction labelPositionToCyjs(text: string): Written {\n const v = [\"top\", \"bottom\"].find((x) => text.startsWith(x)) ?? \"center\";\n const h = [\"left\", \"right\"].find((x) => text.endsWith(x)) ?? \"center\";\n return exact({ \"text-valign\": v, \"text-halign\": h });\n}\n\n/**\n * An enumeration value: Cytoscape.js's name for it, or an `other:` value Cytoscape.js has.\n * @param name - the Cytoscape.js property\n * @param value - the neutral value\n * @param table - the neutral values Cytoscape.js has, by their Cytoscape.js names\n * @param specs - the target's properties\n * @returns the written value, or null when Cytoscape.js has none\n */\nfunction enumToCyjs(\n name: string,\n value: string,\n table: ReadonlyMap<string, string>,\n specs: ReadonlyMap<string, CyjsPropertySpec>,\n): Written | null {\n const cy = table.get(value);\n if (cy !== undefined) {\n return exact({ [name]: cy });\n }\n const other = value.startsWith(\"other:\") ? value.slice(6) : null;\n return other !== null && specs.get(name)?.enums?.includes(other) === true ? exact({ [name]: other }) : null;\n}\n\n/**\n * An arrow, or the nearest arrow Cytoscape.js has.\n * @param name - the Cytoscape.js property\n * @param value - the neutral arrow\n * @param specs - the target's properties\n * @returns the written value, or null when Cytoscape.js has none near\n */\nfunction arrowToCyjs(name: string, value: string, specs: ReadonlyMap<string, CyjsPropertySpec>): Written | null {\n const own = enumToCyjs(name, value, ARROWS_TO_CYJS, specs);\n if (own !== null) {\n return own;\n }\n const nearest = ARROWS_NEAREST.get(value);\n return nearest === undefined ? null : near({ [name]: nearest });\n}\n\n/**\n * A border style: dash-dot is drawn dashed.\n * @param value - the neutral style\n * @returns the written value, or null when Cytoscape.js has none\n */\nfunction borderStyleToCyjs(value: string): Written | null {\n if (value === \"dash-dot\") {\n return near({ \"border-style\": \"dashed\" });\n }\n return [\"solid\", \"dotted\", \"dashed\", \"double\"].includes(value) ? exact({ \"border-style\": value }) : null;\n}\n\n/**\n * A line style: the dashed kinds are drawn dashed, any other solid.\n * @param value - the neutral style\n * @returns the written value\n */\nfunction lineStyleToCyjs(value: string): Written {\n if ([\"solid\", \"dotted\", \"dashed\"].includes(value)) {\n return exact({ \"line-style\": value });\n }\n return near({ \"line-style\": value === \"dash-dot\" || value === \"long-dash\" ? \"dashed\" : \"solid\" });\n}\n\n/**\n * Any other property: the Cytoscape.js property that carries it, the value as it is.\n * @param property - the neutral property\n * @param value - the value\n * @param specs - the target's properties\n * @returns the written value, or null when no property carries it\n */\nfunction propertyToCyjs(\n property: string,\n value: StyleValue,\n specs: ReadonlyMap<string, CyjsPropertySpec>,\n): Written | null {\n const entry = Array.from(specs).find(([, spec]) => spec.property === property);\n if (entry === undefined) {\n return null;\n }\n const [name, spec] = entry;\n if (spec.type === \"positive\" && !(typeof value === \"number\" && value > 0)) {\n return null;\n }\n // Cytoscape.js takes an empty bypass as no bypass at all; a blank, which it trims, draws no text\n if (value === \"\" && /label$/i.test(property)) {\n return exact({ [name]: \" \" });\n }\n return exact({ [name]: typeof value === \"boolean\" ? String(value) : value });\n}\n\n/**\n * A selector value literal: a string in quotes (when it holds no quote of that kind and no backslash) or a number.\n * @param v - the value\n * @returns the literal, or null when a selector cannot state it\n */\nfunction literal(v: Scalar): string | null {\n if (typeof v === \"number\") {\n return Number.isFinite(v) ? String(v) : null;\n }\n if (typeof v !== \"string\" || v.includes(\"\\\\\") || /[\\n\\r\\u2028\\u2029]/.test(v)) {\n return null;\n }\n if (!v.includes('\"')) {\n return `\"${v}\"`;\n }\n return v.includes(\"'\") ? null : `'${v}'`;\n}\n\n/** The state of one emit. */\ninterface Emit {\n readonly extracted: ExtractedStyles;\n readonly notes: StyleNotes;\n readonly scope: string;\n readonly stylesheet: CytoscapeStylesheetRule[];\n readonly data: { node: Record<string, CytoscapeDataValue>[]; edge: Record<string, CytoscapeDataValue>[] };\n /** Per target, the source (a style column key or a generated name) to the flat key written for it. */\n readonly keys: { readonly node: Map<string, string>; readonly edge: Map<string, string> };\n /** Per target, the flat keys in use. */\n readonly used: { readonly node: Set<string>; readonly edge: Set<string> };\n}\n\n/**\n * A flat element data key for a source, unique within the target's data.\n * @param e - the emit\n * @param target - nodes or edges\n * @param source - the source: a style column key, or a generated name\n * @returns the flat key, and whether it is new\n */\nfunction flatKey(e: Emit, target: StyleTarget, source: string): { key: string; fresh: boolean } {\n const known = e.keys[target].get(source);\n if (known !== undefined) {\n return { key: known, fresh: false };\n }\n let key = cytoscapeStyleKey(source);\n let k = 2;\n while (e.used[target].has(key)) {\n key = `${cytoscapeStyleKey(source)}_${String(k)}`;\n k++;\n }\n e.keys[target].set(source, key);\n e.used[target].add(key);\n return { key, fresh: true };\n}\n\n/**\n * Writes a column into element data.\n * @param e - the emit\n * @param target - nodes or edges\n * @param key - the flat key\n * @param values - the values by element index; null and false are not written\n */\nfunction writeColumn(\n e: Emit,\n target: StyleTarget,\n key: string,\n values: ArrayLike<CytoscapeDataValue | null | undefined>,\n): void {\n const rows = e.data[target];\n for (let i = 0; i < rows.length && i < values.length; i++) {\n const v = values[i];\n if (v !== null && v !== undefined && v !== false) {\n rows[i][key] = v;\n }\n }\n}\n\n/**\n * The selector tests of a predicate, as alternatives of conjunctions; null when a selector cannot state it exactly.\n * @param e - the emit\n * @param target - nodes or edges\n * @param where - the predicate\n * @returns the alternatives (each a string of tests), or null\n */\nfunction testsOf(e: Emit, target: StyleTarget, where: Predicate): string[] | null {\n if (\"all\" in where) {\n return where.all ? [\"\"] : null;\n }\n if (\"has\" in where) {\n const k = keyOf(e, target, where.has);\n return k === null || !(\"style\" in where.has) ? null : [`[${k}]`];\n }\n if (\"eq\" in where) {\n return equalTest(e, target, where.eq, \"=\");\n }\n if (\"in\" in where) {\n const k = keyOf(e, target, where.in[0]);\n const values = where.in[1].map((x) => literal(x));\n if (values.length === 0) {\n return [];\n }\n return k === null || values.includes(null) ? null : values.map((v) => `[${k} = ${String(v)}]`);\n }\n if (\"not\" in where) {\n return notTests(e, target, where.not);\n }\n if (\"and\" in where) {\n return andTests(e, target, where.and);\n }\n if (\"or\" in where) {\n return orTests(e, target, where.or);\n }\n return null;\n}\n\n/**\n * An equality test, or its negation.\n * @param e - the emit\n * @param target - nodes or edges\n * @param eq - the column and the value\n * @param op - `=` or `!=`\n * @returns the test, or null when a selector cannot state it\n */\nfunction equalTest(e: Emit, target: StyleTarget, eq: readonly [ColumnRef, Scalar], op: \"=\" | \"!=\"): string[] | null {\n const k = keyOf(e, target, eq[0]);\n const v = literal(eq[1]);\n return k === null || v === null ? null : [`[${k} ${op} ${v}]`];\n}\n\n/**\n * A negated predicate: only a style column's absence and an inequality are stated.\n * @param e - the emit\n * @param target - nodes or edges\n * @param inner - the predicate negated\n * @returns the tests, or null\n */\nfunction notTests(e: Emit, target: StyleTarget, inner: Predicate): string[] | null {\n if (\"has\" in inner && \"style\" in inner.has) {\n const k = keyOf(e, target, inner.has);\n return k === null ? null : [`[^${k}]`];\n }\n return \"eq\" in inner ? equalTest(e, target, inner.eq, \"!=\") : null;\n}\n\n/**\n * A conjunction: every combination of its parts' alternatives, at most 8.\n * @param e - the emit\n * @param target - nodes or edges\n * @param parts - the predicates joined\n * @returns the alternatives, or null\n */\nfunction andTests(e: Emit, target: StyleTarget, parts: readonly Predicate[]): string[] | null {\n let alts = [\"\"];\n for (const p of parts) {\n const t = testsOf(e, target, p);\n if (t === null) {\n return null;\n }\n alts = alts.flatMap((a) => t.map((b) => a + b));\n if (alts.length > 8) {\n return null;\n }\n }\n return alts;\n}\n\n/**\n * A disjunction: its parts' alternatives, at most 8.\n * @param e - the emit\n * @param target - nodes or edges\n * @param parts - the predicates joined\n * @returns the alternatives, or null\n */\nfunction orTests(e: Emit, target: StyleTarget, parts: readonly Predicate[]): string[] | null {\n const out: string[] = [];\n for (const p of parts) {\n const t = testsOf(e, target, p);\n if (t === null) {\n return null;\n }\n out.push(...t);\n }\n return out.length > 8 ? null : out;\n}\n\n/**\n * The element data key a column reference is read from: a style column's flat key (its values written into element\n * data) or a data column's own name when a selector can spell it; null for anything else.\n * @param e - the emit\n * @param target - nodes or edges\n * @param ref - the reference\n * @returns the key, or null\n */\nfunction keyOf(e: Emit, target: StyleTarget, ref: ColumnRef): string | null {\n if (\"style\" in ref) {\n const col = e.extracted.columns[target].get(ref.style);\n if (col === undefined) {\n return null;\n }\n const { key, fresh } = flatKey(e, target, ref.style);\n if (fresh) {\n writeColumn(e, target, key, col);\n }\n return key;\n }\n if (\n \"data\" in ref &&\n PLAIN_NAME.test(ref.data) &&\n ref.data !== CYTOSCAPE_IMPORT_KEY &&\n !ref.data.startsWith(\"graphty_\")\n ) {\n return ref.data;\n }\n return null;\n}\n\n/**\n * The selectors of a rule: its predicate as tests, or a membership value written into element data.\n * @param e - the emit\n * @param rule - the rule\n * @param index - the rule's position\n * @returns the selector prefixes (group and scope included), one per alternative\n */\nfunction selectorsOf(e: Emit, rule: StyleRule, index: number): string[] {\n const head = `${rule.target}${e.scope}`;\n const tests = testsOf(e, rule.target, rule.where);\n if (tests !== null) {\n return tests.map((t) => head + t);\n }\n const src = refSource(\n rule.target,\n e.data[rule.target].length,\n e.extracted.columns[rule.target],\n e.extracted.features[rule.target],\n );\n const { key } = flatKey(e, rule.target, `emit.where.${String(index)}`);\n const col = new Array<boolean | null>(src.n);\n for (let i = 0; i < src.n; i++) {\n col[i] = matches(rule.where, src, i) ? true : null;\n }\n writeColumn(e, rule.target, key, col);\n return [`${head}[${key}]`];\n}\n\n/**\n * Emits one rule's constants and mappings.\n * @param e - the emit\n * @param rule - the rule\n * @param index - the rule's position\n */\nfunction emitRule(e: Emit, rule: StyleRule, index: number): void {\n const { target } = rule;\n const selectors = selectorsOf(e, rule, index);\n const constants: Record<string, string | number> = {};\n for (const [p, v] of Object.entries<StyleValue | undefined>(rule.set ?? {})) {\n if (v === undefined) {\n continue;\n }\n const w = written(e, target, p, v);\n if (w !== null) {\n Object.assign(constants, w);\n }\n }\n if (Object.keys(constants).length > 0) {\n for (const sel of selectors) {\n e.stylesheet.push({ selector: sel, style: constants });\n // Cytoscape.js curves a straight loop, but keeps a loop it is told to draw as a haystack\n if (target === \"edge\" && constants[\"curve-style\"] === \"straight\") {\n e.stylesheet.push({ selector: `${sel}:loop`, style: { \"curve-style\": \"haystack\" } });\n }\n }\n }\n for (const [p, m] of Object.entries<Mapping | undefined>(rule.map ?? {})) {\n if (m !== undefined) {\n emitMapping(e, rule, index, selectors, p, m);\n }\n }\n}\n\n/**\n * Whether Cytoscape.js holds a neutral value exactly: a value it cannot hold, or holds only as a nearest one, reads back\n * as something else.\n * @param target - nodes or edges\n * @param property - the neutral property\n * @param value - the value\n * @returns true when it is written as it is\n */\nexport function cyjsHoldsExactly(target: StyleTarget, property: string, value: StyleValue): boolean {\n const w = toCyjs(target, property, value);\n return w !== null && !w.approximate;\n}\n\n/**\n * A value as Cytoscape.js properties, noted when it cannot be written or only approximately.\n * @param e - the emit\n * @param target - nodes or edges\n * @param property - the neutral property\n * @param value - the value\n * @returns the properties, or null\n */\nfunction written(\n e: Emit,\n target: StyleTarget,\n property: string,\n value: StyleValue,\n): Record<string, string | number> | null {\n const w = toCyjs(target, property, value);\n if (w === null) {\n e.notes.add(STYLE_ISSUE.NOT_WRITTEN, target, property, { sample: value });\n return null;\n }\n if (w.approximate) {\n e.notes.add(STYLE_ISSUE.APPROXIMATED, target, property, { sample: value });\n }\n return w.props;\n}\n\n/**\n * Emits one mapping of a rule.\n * @param e - the emit\n * @param rule - the rule\n * @param index - the rule's position\n * @param selectors - the rule's selectors\n * @param property - the property\n * @param m - the mapping\n */\nfunction emitMapping(\n e: Emit,\n rule: StyleRule,\n index: number,\n selectors: readonly string[],\n property: string,\n m: Mapping,\n): void {\n const { target } = rule;\n if (m.kind === \"discrete\") {\n // one rule per table key, when a selector can state every key; else the per-element values\n const key = keyOf(e, target, m.by);\n const keys = m.table.map(([k]) => literal(k));\n if (key === null || keys.includes(null)) {\n emitValues(e, rule, index, selectors, property);\n return;\n }\n m.table.forEach(([, v], j) => {\n const w = written(e, target, property, v);\n if (w === null) {\n return;\n }\n for (const sel of selectors) {\n e.stylesheet.push({ selector: `${sel}[${key} = ${String(keys[j])}]`, style: w });\n }\n });\n return;\n }\n if (m.kind === \"continuous\" && isNumericOutput(target, property)) {\n const key = numericKey(e, target, m.by, index);\n if (key !== null) {\n emitContinuous(e, target, selectors, property, key, m.points);\n return;\n }\n }\n emitValues(e, rule, index, selectors, property);\n}\n\n/**\n * Whether a property's values are numbers or colors, which `mapData()` interpolates.\n * @param target - nodes or edges\n * @param property - the property\n * @returns true for a number, opacity or color property\n */\nfunction isNumericOutput(target: StyleTarget, property: string): boolean {\n const kind = STYLE_PROPERTIES[target].get(property);\n return kind === \"number\" || kind === \"opacity\" || kind === \"color\";\n}\n\n/**\n * The element data key of a mapping's numeric input: a data column a mapper can spell, or the input copied into\n * element data.\n * @param e - the emit\n * @param target - nodes or edges\n * @param by - the input\n * @param index - the rule's position\n * @returns the key, or null when the input has no values\n */\nfunction numericKey(e: Emit, target: StyleTarget, by: ColumnRef, index: number): string | null {\n const src = refSource(target, e.data[target].length, e.extracted.columns[target], e.extracted.features[target]);\n const col = src.column(by);\n if (col === null) {\n return null;\n }\n if (\"data\" in by && PLAIN_NAME.test(by.data) && !by.data.startsWith(\"graphty_\")) {\n return by.data;\n }\n const { key } = flatKey(e, target, `emit.input.${String(index)}`);\n const values = new Array<number | null>(src.n);\n for (let i = 0; i < src.n; i++) {\n const v = col[i];\n values[i] = typeof v === \"number\" && Number.isFinite(v) ? v : null;\n }\n writeColumn(e, target, key, values);\n return key;\n}\n\n/**\n * A continuous mapping as `mapData()` rules: one per segment, the values below the first point and above the last,\n * and the exact values at the points, each scoped to its input range.\n * @param e - the emit\n * @param target - nodes or edges\n * @param selectors - the rule's selectors\n * @param property - the property\n * @param key - the input's element data key\n * @param points - the points\n */\nfunction emitContinuous(\n e: Emit,\n target: StyleTarget,\n selectors: readonly string[],\n property: string,\n key: string,\n points: readonly { at: number; below: StyleValue; value: StyleValue; above: StyleValue }[],\n): void {\n if (points.length === 0) {\n return;\n }\n const lit = String;\n const push = (test: string, style: Record<string, string | number> | null): void => {\n if (style === null) {\n return;\n }\n for (const sel of selectors) {\n e.stylesheet.push({ selector: `${sel}${test}`, style });\n }\n };\n const first = points[0];\n const last = points.at(-1) ?? first;\n push(`[${key} < ${lit(first.at)}]`, written(e, target, property, first.below));\n for (let k = 0; k + 1 < points.length; k++) {\n const a = points[k];\n const b = points[k + 1];\n const wa = written(e, target, property, a.above);\n const wb = written(e, target, property, b.below);\n if (wa === null || wb === null) {\n continue;\n }\n const style: Record<string, string | number> = {};\n for (const name of Object.keys(wa)) {\n style[name] = `mapData(${key}, ${lit(a.at)}, ${lit(b.at)}, ${String(wa[name])}, ${String(wb[name])})`;\n }\n push(`[${key} > ${lit(a.at)}][${key} < ${lit(b.at)}]`, style);\n }\n push(`[${key} > ${lit(last.at)}]`, written(e, target, property, last.above));\n for (const p of points) {\n push(`[${key} = ${lit(p.at)}]`, written(e, target, property, p.value));\n }\n}\n\n/**\n * A mapping as its per-element values: what the rule gives each element, written ready for Cytoscape.js into element\n * data and read with `data()`, scoped to the elements that have a value.\n * @param e - the emit\n * @param rule - the rule\n * @param index - the rule's position\n * @param selectors - the rule's selectors\n * @param property - the property\n */\nfunction emitValues(e: Emit, rule: StyleRule, index: number, selectors: readonly string[], property: string): void {\n const { target } = rule;\n const n = e.data[target].length;\n const src = refSource(target, n, e.extracted.columns[target], e.extracted.features[target]);\n const mapping = new Map(Object.entries<Mapping | undefined>(rule.map ?? {})).get(property);\n const only: StyleRule = { ...rule, where: { all: true }, set: undefined, map: { [property]: mapping } };\n const values = resolveRules([only], target, property, src);\n const names = new Map<string, (string | number | null)[]>();\n for (let i = 0; i < n; i++) {\n const v = values[i];\n if (v === null) {\n continue;\n }\n const w = written(e, target, property, v);\n if (w === null) {\n continue;\n }\n for (const [name, x] of Object.entries(w)) {\n let col = names.get(name);\n if (col === undefined) {\n col = new Array<string | number | null>(n).fill(null);\n names.set(name, col);\n }\n col[i] = x;\n }\n }\n for (const [name, col] of names) {\n const { key } = flatKey(e, target, `emit.value.${String(index)}.${name}`);\n writeColumn(e, target, key, col);\n for (const sel of selectors) {\n e.stylesheet.push({ selector: `${sel}[${key}]`, style: { [name]: `data(${key})` } });\n }\n }\n}\n\n/**\n * Writes neutral styles as a Cytoscape.js stylesheet, the element data it reads and the bypasses that make it exact.\n * @param extracted - the styles\n * @param options - the import id that scopes the stylesheet\n * @returns the stylesheet, the element data, the bypasses and the notes of what could not be written\n * @category Styles\n */\nexport function toCytoscapeStylesheet(\n extracted: ExtractedStyles,\n options: CytoscapeStylesheetOptions = {},\n): CytoscapeStylesheetResult {\n const notes = new StyleNotes();\n const importId = options.importId?.replaceAll(/[\"'\\\\\\n\\r\\u2028\\u2029]/g, \"_\");\n const { nodes } = extracted.fingerprint;\n const { edges } = extracted.fingerprint;\n const e: Emit = {\n extracted,\n notes,\n scope: importId === undefined ? \"\" : `[${CYTOSCAPE_IMPORT_KEY} = \"${importId}\"]`,\n stylesheet: [],\n data: {\n node: Array.from({ length: nodes }, () => ({})),\n edge: Array.from({ length: edges }, () => ({})),\n },\n keys: { node: new Map(), edge: new Map() },\n // a flat key never takes the name of a data field the elements already hold\n used: {\n node: new Set([CYTOSCAPE_IMPORT_KEY, ...dataNames(extracted, \"node\")]),\n edge: new Set([CYTOSCAPE_IMPORT_KEY, ...dataNames(extracted, \"edge\")]),\n },\n };\n if (importId !== undefined) {\n for (const rows of [e.data.node, e.data.edge]) {\n for (const row of rows) {\n row[CYTOSCAPE_IMPORT_KEY] = importId;\n }\n }\n }\n // Cytoscape.js draws its own defaults: the rules that state them are not written again\n const rules =\n extracted.styles.source.tool === \"cytoscape-js\"\n ? extracted.styles.rules.filter((r) => r.origin !== \"tool\")\n : extracted.styles.rules;\n rules.forEach((rule, k) => {\n if (rule.role !== \"exceptions\") {\n emitRule(e, rule, k);\n }\n });\n const bypass = exactness(e, rules);\n for (const sel of e.stylesheet) {\n if (parseCyjsSelector(sel.selector).invalid) {\n notes.add(STYLE_ISSUE.NOT_WRITTEN, null, \"selector\", { sample: sel.selector });\n }\n }\n const rows = (list: Record<string, CytoscapeDataValue>[]): (Record<string, CytoscapeDataValue> | null)[] =>\n list.map((r) => (Object.keys(r).length > 0 ? r : null));\n return {\n stylesheet: e.stylesheet,\n elementData: { node: rows(e.data.node), edge: rows(e.data.edge) },\n bypass,\n notes: notes.list(),\n };\n}\n\n/**\n * Applies the stylesheet to the element data with graph-io's Cytoscape.js engine and gives every element whose drawn\n * value differs from the styles a bypass with the right value.\n * @param e - the emit\n * @param rules - the rules written (Cytoscape.js's own defaults left out)\n * @returns the bypasses\n */\nfunction exactness(e: Emit, rules: readonly StyleRule[]): CytoscapePerElement<string | number> {\n const { extracted } = e;\n const nodes = e.data.node.length;\n const elements: unknown[] = [];\n for (let i = 0; i < nodes; i++) {\n elements.push({\n group: \"nodes\",\n data: { ...dataColumns(extracted, \"node\", i), ...e.data.node[i], id: `n${String(i)}` },\n });\n }\n // the edges join two nodes (no loops: Cytoscape.js draws a loop curved whatever the stylesheet says)\n const far = nodes > 1 ? \"n1\" : \"n0\";\n for (let i = 0; i < e.data.edge.length && nodes > 0; i++) {\n elements.push({\n group: \"edges\",\n data: {\n ...dataColumns(extracted, \"edge\", i),\n ...e.data.edge[i],\n id: `e${String(i)}`,\n source: \"n0\",\n target: far,\n },\n });\n }\n const drawn = evaluateCytoscapeJs({ elements, style: e.stylesheet, toolDefaults: false });\n const out = {\n node: [] as (Record<string, string | number> | null)[],\n edge: [] as (Record<string, string | number> | null)[],\n };\n for (const target of [\"node\", \"edge\"] as const) {\n const n = e.data[target].length;\n const src = refSource(target, n, extracted.columns[target], extracted.features[target]);\n const rows = new Array<Record<string, string | number> | null>(n).fill(null);\n for (const property of STYLE_PROPERTIES[target].keys()) {\n const want = resolveRules(rules, target, property, src);\n addBypasses(rows, target, property, want, drawn[target].values[property]);\n }\n out[target] = rows;\n }\n return out;\n}\n\n/**\n * A bypass of one property for every element whose drawn value differs from the styles' and that Cytoscape.js can\n * hold exactly.\n * @param rows - the bypasses, changed in place\n * @param target - nodes or edges\n * @param property - the property\n * @param want - the styles' values\n * @param got - what is drawn, or undefined for nothing\n */\nfunction addBypasses(\n rows: (Record<string, string | number> | null)[],\n target: StyleTarget,\n property: string,\n want: readonly (StyleValue | null)[],\n got: readonly (StyleValue | null)[] | undefined,\n): void {\n for (let i = 0; i < rows.length; i++) {\n const w = want[i];\n const conv = w === null || (got?.[i] ?? null) === w ? null : toCyjs(target, property, w);\n if (conv !== null && !conv.approximate) {\n rows[i] = { ...rows[i], ...conv.props };\n }\n }\n}\n\n/**\n * The names of the data columns among the styles' features.\n * @param extracted - the styles\n * @param target - nodes or edges\n * @returns the names\n */\nfunction dataNames(extracted: ExtractedStyles, target: StyleTarget): string[] {\n return extracted.features[target].flatMap((f) => (\"data\" in f.ref ? [f.ref.data] : []));\n}\n\n/**\n * An element's data columns from the styles' features: what a consumer writes into element data from the graph.\n * @param extracted - the styles\n * @param target - nodes or edges\n * @param i - the element\n * @returns the data fields\n */\nfunction dataColumns(extracted: ExtractedStyles, target: StyleTarget, i: number): Record<string, unknown> {\n const out: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n for (const f of extracted.features[target]) {\n if (\"data\" in f.ref && f.values[i] !== null) {\n out[f.ref.data] = f.values[i];\n }\n }\n return out;\n}\n"],"names":["p","q","isSpace","t","outer","inner","literal","order","c","exact","spec","rows"],"mappings":"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"}