@graphty/graph-io 0.3.43 → 0.3.44

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 (674) hide show
  1. package/dist/chunks/approximations-3Q4TsdTh.js +40 -0
  2. package/dist/chunks/approximations-3Q4TsdTh.js.map +1 -0
  3. package/dist/chunks/block-JQiwViEt.js +2777 -0
  4. package/dist/chunks/block-JQiwViEt.js.map +1 -0
  5. package/dist/chunks/{choose-DvpbdRuz.js → choose-BemygfH8.js} +3 -2
  6. package/dist/chunks/{choose-DvpbdRuz.js.map → choose-BemygfH8.js.map} +1 -1
  7. package/dist/chunks/{constants-fT3E8JYY.js → constants-BFUR_CtU.js} +6 -2
  8. package/dist/chunks/constants-BFUR_CtU.js.map +1 -0
  9. package/dist/chunks/convert-BcQ8_jMo.js +59 -0
  10. package/dist/chunks/convert-BcQ8_jMo.js.map +1 -0
  11. package/dist/chunks/emit-DCwFLts5.js +3456 -0
  12. package/dist/chunks/emit-DCwFLts5.js.map +1 -0
  13. package/dist/chunks/{escape-B62ZGM_a.js → escape-B1rMftd9.js} +43 -20
  14. package/dist/chunks/escape-B1rMftd9.js.map +1 -0
  15. package/dist/chunks/{export-rKLeGQMo.js → export-D7IGzTG4.js} +196 -792
  16. package/dist/chunks/export-D7IGzTG4.js.map +1 -0
  17. package/dist/chunks/{exporter-BWwEuOPT.js → exporter-BtnqYuuj.js} +22 -12
  18. package/dist/chunks/exporter-BtnqYuuj.js.map +1 -0
  19. package/dist/chunks/{exporter-yLxKBvLE.js → exporter-ChPyhBOv.js} +4 -3
  20. package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter-ChPyhBOv.js.map} +1 -1
  21. package/dist/chunks/{exporter-8hLNemFk.js → exporter-KEPxYUXD.js} +133 -74
  22. package/dist/chunks/exporter-KEPxYUXD.js.map +1 -0
  23. package/dist/chunks/{exporter-RVtXVetw.js → exporter-quPUCBiC.js} +1805 -287
  24. package/dist/chunks/exporter-quPUCBiC.js.map +1 -0
  25. package/dist/chunks/format-GDmO6m6Q.js +676 -0
  26. package/dist/chunks/format-GDmO6m6Q.js.map +1 -0
  27. package/dist/chunks/generic-BL06jrJf.js +1347 -0
  28. package/dist/chunks/generic-BL06jrJf.js.map +1 -0
  29. package/dist/chunks/{importer-WrGRZb0N.js → importer-B7r2owVf.js} +449 -102
  30. package/dist/chunks/importer-B7r2owVf.js.map +1 -0
  31. package/dist/chunks/{importer-Ht7LNg8L.js → importer-BFmOP96W.js} +116 -296
  32. package/dist/chunks/importer-BFmOP96W.js.map +1 -0
  33. package/dist/chunks/{importer-BbNb7eNg.js → importer-C2nzGhdV.js} +1390 -129
  34. package/dist/chunks/importer-C2nzGhdV.js.map +1 -0
  35. package/dist/chunks/{importer-Dz7tI8Sa.js → importer-CbX2_rNF.js} +617 -115
  36. package/dist/chunks/importer-CbX2_rNF.js.map +1 -0
  37. package/dist/chunks/{importer-D794XUTe.js → importer-CdzeN6X4.js} +31 -8
  38. package/dist/chunks/importer-CdzeN6X4.js.map +1 -0
  39. package/dist/chunks/{importer-xZ-3suY1.js → importer-ChKNC_GN.js} +791 -135
  40. package/dist/chunks/importer-ChKNC_GN.js.map +1 -0
  41. package/dist/chunks/{importer-C98dpSH4.js → importer-dwoYpSqb.js} +141 -82
  42. package/dist/chunks/importer-dwoYpSqb.js.map +1 -0
  43. package/dist/chunks/index-B9fdNpTA.js +4310 -0
  44. package/dist/chunks/index-B9fdNpTA.js.map +1 -0
  45. package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-C4FwgnH5.js} +123 -32
  46. package/dist/chunks/json-elements-C4FwgnH5.js.map +1 -0
  47. package/dist/chunks/lexicon-B-knUi-l.js +508 -0
  48. package/dist/chunks/lexicon-B-knUi-l.js.map +1 -0
  49. package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-BSpbY5FL.js} +3 -2
  50. package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-BSpbY5FL.js.map} +1 -1
  51. package/dist/chunks/{records-Cu4bxYOm.js → records-Nwz_rbNt.js} +2 -2
  52. package/dist/chunks/{records-Cu4bxYOm.js.map → records-Nwz_rbNt.js.map} +1 -1
  53. package/dist/chunks/styles-Brt9JMfs.js +690 -0
  54. package/dist/chunks/styles-Brt9JMfs.js.map +1 -0
  55. package/dist/chunks/styles-_N-C8S-U.js +2102 -0
  56. package/dist/chunks/styles-_N-C8S-U.js.map +1 -0
  57. package/dist/chunks/styles-yed-DAfcIkf7.js +842 -0
  58. package/dist/chunks/styles-yed-DAfcIkf7.js.map +1 -0
  59. package/dist/chunks/{text-DHOJXnED.js → text-CgzMqHQb.js} +2 -2
  60. package/dist/chunks/{text-DHOJXnED.js.map → text-CgzMqHQb.js.map} +1 -1
  61. package/dist/chunks/units-XMZFIFe1.js +19 -0
  62. package/dist/chunks/units-XMZFIFe1.js.map +1 -0
  63. package/dist/csv.js +5 -4
  64. package/dist/csv.js.map +1 -1
  65. package/dist/cx.js +1 -1
  66. package/dist/cx2.js +2 -2
  67. package/dist/cys.js +1 -1
  68. package/dist/dot.js +5 -2
  69. package/dist/dot.js.map +1 -1
  70. package/dist/gexf.js +292 -412
  71. package/dist/gexf.js.map +1 -1
  72. package/dist/gml.js +8 -3031
  73. package/dist/gml.js.map +1 -1
  74. package/dist/graph-io.js +354 -240
  75. package/dist/graph-io.js.map +1 -1
  76. package/dist/graphml.js +4 -2
  77. package/dist/graphml.js.map +1 -1
  78. package/dist/json.js +1 -1
  79. package/dist/neo4j.js +4 -3
  80. package/dist/neo4j.js.map +1 -1
  81. package/dist/obo.js +1 -1
  82. package/dist/pajek.js +4 -2
  83. package/dist/positions.d.ts +1 -0
  84. package/dist/positions.js +427 -0
  85. package/dist/positions.js.map +1 -0
  86. package/dist/src/common/codes.d.ts +6 -0
  87. package/dist/src/common/codes.d.ts.map +1 -1
  88. package/dist/src/common/codes.js +6 -0
  89. package/dist/src/common/codes.js.map +1 -1
  90. package/dist/src/common/escape.d.ts.map +1 -1
  91. package/dist/src/common/escape.js +4 -2
  92. package/dist/src/common/escape.js.map +1 -1
  93. package/dist/src/common/export.d.ts +10 -0
  94. package/dist/src/common/export.d.ts.map +1 -1
  95. package/dist/src/common/export.js +123 -100
  96. package/dist/src/common/export.js.map +1 -1
  97. package/dist/src/common/input.d.ts.map +1 -1
  98. package/dist/src/common/input.js +8 -1
  99. package/dist/src/common/input.js.map +1 -1
  100. package/dist/src/common/json-elements.d.ts +12 -9
  101. package/dist/src/common/json-elements.d.ts.map +1 -1
  102. package/dist/src/common/json-elements.js +160 -37
  103. package/dist/src/common/json-elements.js.map +1 -1
  104. package/dist/src/common/notes.d.ts +42 -0
  105. package/dist/src/common/notes.d.ts.map +1 -0
  106. package/dist/src/common/notes.js +72 -0
  107. package/dist/src/common/notes.js.map +1 -0
  108. package/dist/src/common/report.d.ts +18 -0
  109. package/dist/src/common/report.d.ts.map +1 -1
  110. package/dist/src/common/report.js +36 -1
  111. package/dist/src/common/report.js.map +1 -1
  112. package/dist/src/common/units.d.ts +24 -0
  113. package/dist/src/common/units.d.ts.map +1 -0
  114. package/dist/src/common/units.js +26 -0
  115. package/dist/src/common/units.js.map +1 -0
  116. package/dist/src/common/xml.d.ts +18 -0
  117. package/dist/src/common/xml.d.ts.map +1 -1
  118. package/dist/src/common/xml.js +42 -5
  119. package/dist/src/common/xml.js.map +1 -1
  120. package/dist/src/formats/cx/exporter.d.ts +6 -0
  121. package/dist/src/formats/cx/exporter.d.ts.map +1 -1
  122. package/dist/src/formats/cx/exporter.js +71 -8
  123. package/dist/src/formats/cx/exporter.js.map +1 -1
  124. package/dist/src/formats/cx/importer.d.ts +5 -2
  125. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cx/importer.js +102 -72
  127. package/dist/src/formats/cx/importer.js.map +1 -1
  128. package/dist/src/formats/cx/styles.d.ts +102 -0
  129. package/dist/src/formats/cx/styles.d.ts.map +1 -0
  130. package/dist/src/formats/cx/styles.js +225 -0
  131. package/dist/src/formats/cx/styles.js.map +1 -0
  132. package/dist/src/formats/cx2/exporter.d.ts +5 -0
  133. package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
  134. package/dist/src/formats/cx2/exporter.js +181 -71
  135. package/dist/src/formats/cx2/exporter.js.map +1 -1
  136. package/dist/src/formats/cx2/importer.d.ts +4 -1
  137. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  138. package/dist/src/formats/cx2/importer.js +19 -1
  139. package/dist/src/formats/cx2/importer.js.map +1 -1
  140. package/dist/src/formats/cx2/styles.d.ts +18 -0
  141. package/dist/src/formats/cx2/styles.d.ts.map +1 -0
  142. package/dist/src/formats/cx2/styles.js +24 -0
  143. package/dist/src/formats/cx2/styles.js.map +1 -0
  144. package/dist/src/formats/cys/constants.d.ts +2 -0
  145. package/dist/src/formats/cys/constants.d.ts.map +1 -1
  146. package/dist/src/formats/cys/constants.js +2 -0
  147. package/dist/src/formats/cys/constants.js.map +1 -1
  148. package/dist/src/formats/cys/exporter.d.ts +6 -2
  149. package/dist/src/formats/cys/exporter.d.ts.map +1 -1
  150. package/dist/src/formats/cys/exporter.js +215 -53
  151. package/dist/src/formats/cys/exporter.js.map +1 -1
  152. package/dist/src/formats/cys/importer.d.ts +2 -1
  153. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  154. package/dist/src/formats/cys/importer.js +119 -6
  155. package/dist/src/formats/cys/importer.js.map +1 -1
  156. package/dist/src/formats/cys/session.d.ts +2 -0
  157. package/dist/src/formats/cys/session.d.ts.map +1 -1
  158. package/dist/src/formats/cys/session.js +5 -0
  159. package/dist/src/formats/cys/session.js.map +1 -1
  160. package/dist/src/formats/cys/styles.d.ts +38 -0
  161. package/dist/src/formats/cys/styles.d.ts.map +1 -0
  162. package/dist/src/formats/cys/styles.js +213 -0
  163. package/dist/src/formats/cys/styles.js.map +1 -0
  164. package/dist/src/formats/cys/tables.d.ts +8 -3
  165. package/dist/src/formats/cys/tables.d.ts.map +1 -1
  166. package/dist/src/formats/cys/tables.js +88 -34
  167. package/dist/src/formats/cys/tables.js.map +1 -1
  168. package/dist/src/formats/dot/exporter.d.ts +2 -0
  169. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  170. package/dist/src/formats/dot/exporter.js +195 -81
  171. package/dist/src/formats/dot/exporter.js.map +1 -1
  172. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  173. package/dist/src/formats/dot/importer.js +100 -20
  174. package/dist/src/formats/dot/importer.js.map +1 -1
  175. package/dist/src/formats/dot/index.d.ts +1 -0
  176. package/dist/src/formats/dot/index.d.ts.map +1 -1
  177. package/dist/src/formats/dot/index.js +1 -0
  178. package/dist/src/formats/dot/index.js.map +1 -1
  179. package/dist/src/formats/dot/positions.d.ts +14 -0
  180. package/dist/src/formats/dot/positions.d.ts.map +1 -0
  181. package/dist/src/formats/dot/positions.js +70 -0
  182. package/dist/src/formats/dot/positions.js.map +1 -0
  183. package/dist/src/formats/dot/styles.d.ts +82 -0
  184. package/dist/src/formats/dot/styles.d.ts.map +1 -0
  185. package/dist/src/formats/dot/styles.js +1484 -0
  186. package/dist/src/formats/dot/styles.js.map +1 -0
  187. package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
  188. package/dist/src/formats/gexf/exporter.js +20 -5
  189. package/dist/src/formats/gexf/exporter.js.map +1 -1
  190. package/dist/src/formats/gexf/importer.d.ts +8 -1
  191. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  192. package/dist/src/formats/gexf/importer.js +251 -131
  193. package/dist/src/formats/gexf/importer.js.map +1 -1
  194. package/dist/src/formats/gexf/index.d.ts +8 -0
  195. package/dist/src/formats/gexf/index.d.ts.map +1 -1
  196. package/dist/src/formats/gexf/index.js +10 -2
  197. package/dist/src/formats/gexf/index.js.map +1 -1
  198. package/dist/src/formats/gexf/schema.d.ts +5 -0
  199. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  200. package/dist/src/formats/gexf/schema.js +5 -0
  201. package/dist/src/formats/gexf/schema.js.map +1 -1
  202. package/dist/src/formats/gexf/styles.d.ts +74 -0
  203. package/dist/src/formats/gexf/styles.d.ts.map +1 -0
  204. package/dist/src/formats/gexf/styles.js +604 -0
  205. package/dist/src/formats/gexf/styles.js.map +1 -0
  206. package/dist/src/formats/gml/exporter.d.ts +1 -5
  207. package/dist/src/formats/gml/exporter.d.ts.map +1 -1
  208. package/dist/src/formats/gml/exporter.js +19 -8
  209. package/dist/src/formats/gml/exporter.js.map +1 -1
  210. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  211. package/dist/src/formats/gml/importer.js +4 -0
  212. package/dist/src/formats/gml/importer.js.map +1 -1
  213. package/dist/src/formats/gml/index.d.ts +2 -1
  214. package/dist/src/formats/gml/index.d.ts.map +1 -1
  215. package/dist/src/formats/gml/index.js +2 -1
  216. package/dist/src/formats/gml/index.js.map +1 -1
  217. package/dist/src/formats/gml/positions.d.ts +14 -0
  218. package/dist/src/formats/gml/positions.d.ts.map +1 -0
  219. package/dist/src/formats/gml/positions.js +46 -0
  220. package/dist/src/formats/gml/positions.js.map +1 -0
  221. package/dist/src/formats/gml/styles.d.ts +59 -0
  222. package/dist/src/formats/gml/styles.d.ts.map +1 -0
  223. package/dist/src/formats/gml/styles.js +1056 -0
  224. package/dist/src/formats/gml/styles.js.map +1 -0
  225. package/dist/src/formats/gml/syntax.d.ts +11 -0
  226. package/dist/src/formats/gml/syntax.d.ts.map +1 -1
  227. package/dist/src/formats/gml/syntax.js +151 -62
  228. package/dist/src/formats/gml/syntax.js.map +1 -1
  229. package/dist/src/formats/graphml/constants.d.ts +4 -0
  230. package/dist/src/formats/graphml/constants.d.ts.map +1 -1
  231. package/dist/src/formats/graphml/constants.js +5 -1
  232. package/dist/src/formats/graphml/constants.js.map +1 -1
  233. package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
  234. package/dist/src/formats/graphml/exporter.js +133 -65
  235. package/dist/src/formats/graphml/exporter.js.map +1 -1
  236. package/dist/src/formats/graphml/importer.d.ts +4 -1
  237. package/dist/src/formats/graphml/importer.d.ts.map +1 -1
  238. package/dist/src/formats/graphml/importer.js +100 -44
  239. package/dist/src/formats/graphml/importer.js.map +1 -1
  240. package/dist/src/formats/graphml/index.d.ts +1 -0
  241. package/dist/src/formats/graphml/index.d.ts.map +1 -1
  242. package/dist/src/formats/graphml/index.js +1 -0
  243. package/dist/src/formats/graphml/index.js.map +1 -1
  244. package/dist/src/formats/graphml/styles-plain.d.ts +19 -0
  245. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -0
  246. package/dist/src/formats/graphml/styles-plain.js +187 -0
  247. package/dist/src/formats/graphml/styles-plain.js.map +1 -0
  248. package/dist/src/formats/graphml/styles-yed.d.ts +179 -0
  249. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -0
  250. package/dist/src/formats/graphml/styles-yed.js +1086 -0
  251. package/dist/src/formats/graphml/styles-yed.js.map +1 -0
  252. package/dist/src/formats/graphml/styles-yfiles3.d.ts +19 -0
  253. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -0
  254. package/dist/src/formats/graphml/styles-yfiles3.js +508 -0
  255. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -0
  256. package/dist/src/formats/graphml/tree.d.ts.map +1 -1
  257. package/dist/src/formats/graphml/tree.js +34 -19
  258. package/dist/src/formats/graphml/tree.js.map +1 -1
  259. package/dist/src/formats/graphml/yfiles.d.ts +16 -2
  260. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  261. package/dist/src/formats/graphml/yfiles.js +83 -12
  262. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  263. package/dist/src/formats/json/exporter.d.ts +5 -0
  264. package/dist/src/formats/json/exporter.d.ts.map +1 -1
  265. package/dist/src/formats/json/exporter.js +68 -25
  266. package/dist/src/formats/json/exporter.js.map +1 -1
  267. package/dist/src/formats/json/importer.d.ts +22 -3
  268. package/dist/src/formats/json/importer.d.ts.map +1 -1
  269. package/dist/src/formats/json/importer.js +439 -264
  270. package/dist/src/formats/json/importer.js.map +1 -1
  271. package/dist/src/formats/json/positions.d.ts +16 -0
  272. package/dist/src/formats/json/positions.d.ts.map +1 -0
  273. package/dist/src/formats/json/positions.js +44 -0
  274. package/dist/src/formats/json/positions.js.map +1 -0
  275. package/dist/src/formats/json/styles.d.ts +102 -0
  276. package/dist/src/formats/json/styles.d.ts.map +1 -0
  277. package/dist/src/formats/json/styles.js +1753 -0
  278. package/dist/src/formats/json/styles.js.map +1 -0
  279. package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
  280. package/dist/src/formats/neo4j/exporter.js +2 -1
  281. package/dist/src/formats/neo4j/exporter.js.map +1 -1
  282. package/dist/src/formats/pajek/exporter.d.ts +2 -0
  283. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  284. package/dist/src/formats/pajek/exporter.js +142 -76
  285. package/dist/src/formats/pajek/exporter.js.map +1 -1
  286. package/dist/src/formats/pajek/importer.d.ts +4 -0
  287. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  288. package/dist/src/formats/pajek/importer.js +60 -6
  289. package/dist/src/formats/pajek/importer.js.map +1 -1
  290. package/dist/src/formats/pajek/index.d.ts +2 -0
  291. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  292. package/dist/src/formats/pajek/index.js +2 -0
  293. package/dist/src/formats/pajek/index.js.map +1 -1
  294. package/dist/src/formats/pajek/styles.d.ts +50 -0
  295. package/dist/src/formats/pajek/styles.d.ts.map +1 -0
  296. package/dist/src/formats/pajek/styles.js +569 -0
  297. package/dist/src/formats/pajek/styles.js.map +1 -0
  298. package/dist/src/formats/pajek/syntax.d.ts +6 -0
  299. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  300. package/dist/src/formats/pajek/syntax.js +6 -0
  301. package/dist/src/formats/pajek/syntax.js.map +1 -1
  302. package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
  303. package/dist/src/formats/xgmml/columns.js +34 -9
  304. package/dist/src/formats/xgmml/columns.js.map +1 -1
  305. package/dist/src/formats/xgmml/constants.d.ts +2 -0
  306. package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
  307. package/dist/src/formats/xgmml/constants.js +3 -1
  308. package/dist/src/formats/xgmml/constants.js.map +1 -1
  309. package/dist/src/formats/xgmml/document.d.ts +12 -8
  310. package/dist/src/formats/xgmml/document.d.ts.map +1 -1
  311. package/dist/src/formats/xgmml/document.js +56 -13
  312. package/dist/src/formats/xgmml/document.js.map +1 -1
  313. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  314. package/dist/src/formats/xgmml/emit.js +12 -6
  315. package/dist/src/formats/xgmml/emit.js.map +1 -1
  316. package/dist/src/formats/xgmml/exporter.d.ts +3 -1
  317. package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
  318. package/dist/src/formats/xgmml/exporter.js +22 -9
  319. package/dist/src/formats/xgmml/exporter.js.map +1 -1
  320. package/dist/src/formats/xgmml/importer.d.ts +2 -1
  321. package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
  322. package/dist/src/formats/xgmml/importer.js +31 -24
  323. package/dist/src/formats/xgmml/importer.js.map +1 -1
  324. package/dist/src/formats/xgmml/styles.d.ts +104 -0
  325. package/dist/src/formats/xgmml/styles.d.ts.map +1 -0
  326. package/dist/src/formats/xgmml/styles.js +310 -0
  327. package/dist/src/formats/xgmml/styles.js.map +1 -0
  328. package/dist/src/index.d.ts +9 -7
  329. package/dist/src/index.d.ts.map +1 -1
  330. package/dist/src/index.js +7 -7
  331. package/dist/src/index.js.map +1 -1
  332. package/dist/src/positions/codes.d.ts +31 -0
  333. package/dist/src/positions/codes.d.ts.map +1 -0
  334. package/dist/src/positions/codes.js +26 -0
  335. package/dist/src/positions/codes.js.map +1 -0
  336. package/dist/src/positions/convert.d.ts +58 -0
  337. package/dist/src/positions/convert.d.ts.map +1 -0
  338. package/dist/src/positions/convert.js +107 -0
  339. package/dist/src/positions/convert.js.map +1 -0
  340. package/dist/src/positions/extract.d.ts +27 -0
  341. package/dist/src/positions/extract.d.ts.map +1 -0
  342. package/dist/src/positions/extract.js +526 -0
  343. package/dist/src/positions/extract.js.map +1 -0
  344. package/dist/src/positions/index.d.ts +10 -0
  345. package/dist/src/positions/index.d.ts.map +1 -0
  346. package/dist/src/positions/index.js +9 -0
  347. package/dist/src/positions/index.js.map +1 -0
  348. package/dist/src/positions/types.d.ts +208 -0
  349. package/dist/src/positions/types.d.ts.map +1 -0
  350. package/dist/src/positions/types.js +10 -0
  351. package/dist/src/positions/types.js.map +1 -0
  352. package/dist/src/registry.d.ts +30 -0
  353. package/dist/src/registry.d.ts.map +1 -1
  354. package/dist/src/registry.js +130 -9
  355. package/dist/src/registry.js.map +1 -1
  356. package/dist/src/styles/annotations.d.ts +132 -0
  357. package/dist/src/styles/annotations.d.ts.map +1 -0
  358. package/dist/src/styles/annotations.js +320 -0
  359. package/dist/src/styles/annotations.js.map +1 -0
  360. package/dist/src/styles/budget.d.ts +45 -0
  361. package/dist/src/styles/budget.d.ts.map +1 -0
  362. package/dist/src/styles/budget.js +58 -0
  363. package/dist/src/styles/budget.js.map +1 -0
  364. package/dist/src/styles/canon/bends.d.ts +32 -0
  365. package/dist/src/styles/canon/bends.d.ts.map +1 -0
  366. package/dist/src/styles/canon/bends.js +74 -0
  367. package/dist/src/styles/canon/bends.js.map +1 -0
  368. package/dist/src/styles/canon/color-tables.d.ts +22 -0
  369. package/dist/src/styles/canon/color-tables.d.ts.map +1 -0
  370. package/dist/src/styles/canon/color-tables.js +369 -0
  371. package/dist/src/styles/canon/color-tables.js.map +1 -0
  372. package/dist/src/styles/canon/color.d.ts +66 -0
  373. package/dist/src/styles/canon/color.d.ts.map +1 -0
  374. package/dist/src/styles/canon/color.js +548 -0
  375. package/dist/src/styles/canon/color.js.map +1 -0
  376. package/dist/src/styles/canon/enums.d.ts +25 -0
  377. package/dist/src/styles/canon/enums.d.ts.map +1 -0
  378. package/dist/src/styles/canon/enums.js +187 -0
  379. package/dist/src/styles/canon/enums.js.map +1 -0
  380. package/dist/src/styles/canon/graphviz.d.ts +48 -0
  381. package/dist/src/styles/canon/graphviz.d.ts.map +1 -0
  382. package/dist/src/styles/canon/graphviz.js +160 -0
  383. package/dist/src/styles/canon/graphviz.js.map +1 -0
  384. package/dist/src/styles/canon/index.d.ts +13 -0
  385. package/dist/src/styles/canon/index.d.ts.map +1 -0
  386. package/dist/src/styles/canon/index.js +13 -0
  387. package/dist/src/styles/canon/index.js.map +1 -0
  388. package/dist/src/styles/canon/number.d.ts +59 -0
  389. package/dist/src/styles/canon/number.d.ts.map +1 -0
  390. package/dist/src/styles/canon/number.js +142 -0
  391. package/dist/src/styles/canon/number.js.map +1 -0
  392. package/dist/src/styles/canon/site.d.ts +51 -0
  393. package/dist/src/styles/canon/site.d.ts.map +1 -0
  394. package/dist/src/styles/canon/site.js +63 -0
  395. package/dist/src/styles/canon/site.js.map +1 -0
  396. package/dist/src/styles/canon/text.d.ts +61 -0
  397. package/dist/src/styles/canon/text.d.ts.map +1 -0
  398. package/dist/src/styles/canon/text.js +199 -0
  399. package/dist/src/styles/canon/text.js.map +1 -0
  400. package/dist/src/styles/codes.d.ts +95 -0
  401. package/dist/src/styles/codes.d.ts.map +1 -0
  402. package/dist/src/styles/codes.js +97 -0
  403. package/dist/src/styles/codes.js.map +1 -0
  404. package/dist/src/styles/cyjs/cascade.d.ts +134 -0
  405. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -0
  406. package/dist/src/styles/cyjs/cascade.js +2252 -0
  407. package/dist/src/styles/cyjs/cascade.js.map +1 -0
  408. package/dist/src/styles/cyjs/defaults-table.d.ts +25 -0
  409. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -0
  410. package/dist/src/styles/cyjs/defaults-table.js +76 -0
  411. package/dist/src/styles/cyjs/defaults-table.js.map +1 -0
  412. package/dist/src/styles/cyjs/emit.d.ts +82 -0
  413. package/dist/src/styles/cyjs/emit.d.ts.map +1 -0
  414. package/dist/src/styles/cyjs/emit.js +790 -0
  415. package/dist/src/styles/cyjs/emit.js.map +1 -0
  416. package/dist/src/styles/cyjs/index.d.ts +13 -0
  417. package/dist/src/styles/cyjs/index.d.ts.map +1 -0
  418. package/dist/src/styles/cyjs/index.js +13 -0
  419. package/dist/src/styles/cyjs/index.js.map +1 -0
  420. package/dist/src/styles/cyjs/live.d.ts +46 -0
  421. package/dist/src/styles/cyjs/live.d.ts.map +1 -0
  422. package/dist/src/styles/cyjs/live.js +108 -0
  423. package/dist/src/styles/cyjs/live.js.map +1 -0
  424. package/dist/src/styles/cyjs/mappers.d.ts +147 -0
  425. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -0
  426. package/dist/src/styles/cyjs/mappers.js +744 -0
  427. package/dist/src/styles/cyjs/mappers.js.map +1 -0
  428. package/dist/src/styles/cyjs/selector.d.ts +113 -0
  429. package/dist/src/styles/cyjs/selector.d.ts.map +1 -0
  430. package/dist/src/styles/cyjs/selector.js +611 -0
  431. package/dist/src/styles/cyjs/selector.js.map +1 -0
  432. package/dist/src/styles/cyjs/stylesheet-text.d.ts +37 -0
  433. package/dist/src/styles/cyjs/stylesheet-text.d.ts.map +1 -0
  434. package/dist/src/styles/cyjs/stylesheet-text.js +181 -0
  435. package/dist/src/styles/cyjs/stylesheet-text.js.map +1 -0
  436. package/dist/src/styles/cytoscape/emit.d.ts +125 -0
  437. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -0
  438. package/dist/src/styles/cytoscape/emit.js +1025 -0
  439. package/dist/src/styles/cytoscape/emit.js.map +1 -0
  440. package/dist/src/styles/cytoscape/index.d.ts +10 -0
  441. package/dist/src/styles/cytoscape/index.d.ts.map +1 -0
  442. package/dist/src/styles/cytoscape/index.js +10 -0
  443. package/dist/src/styles/cytoscape/index.js.map +1 -0
  444. package/dist/src/styles/cytoscape/lexicon.d.ts +49 -0
  445. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -0
  446. package/dist/src/styles/cytoscape/lexicon.js +603 -0
  447. package/dist/src/styles/cytoscape/lexicon.js.map +1 -0
  448. package/dist/src/styles/cytoscape/mappings.d.ts +171 -0
  449. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -0
  450. package/dist/src/styles/cytoscape/mappings.js +460 -0
  451. package/dist/src/styles/cytoscape/mappings.js.map +1 -0
  452. package/dist/src/styles/cytoscape/resolve.d.ts +137 -0
  453. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -0
  454. package/dist/src/styles/cytoscape/resolve.js +381 -0
  455. package/dist/src/styles/cytoscape/resolve.js.map +1 -0
  456. package/dist/src/styles/cytoscape/translate.d.ts +50 -0
  457. package/dist/src/styles/cytoscape/translate.d.ts.map +1 -0
  458. package/dist/src/styles/cytoscape/translate.js +156 -0
  459. package/dist/src/styles/cytoscape/translate.js.map +1 -0
  460. package/dist/src/styles/defaults.d.ts +90 -0
  461. package/dist/src/styles/defaults.d.ts.map +1 -0
  462. package/dist/src/styles/defaults.js +414 -0
  463. package/dist/src/styles/defaults.js.map +1 -0
  464. package/dist/src/styles/index.d.ts +15 -0
  465. package/dist/src/styles/index.d.ts.map +1 -0
  466. package/dist/src/styles/index.js +14 -0
  467. package/dist/src/styles/index.js.map +1 -0
  468. package/dist/src/styles/internal.d.ts +17 -0
  469. package/dist/src/styles/internal.d.ts.map +1 -0
  470. package/dist/src/styles/internal.js +16 -0
  471. package/dist/src/styles/internal.js.map +1 -0
  472. package/dist/src/styles/io/approximations.d.ts +24 -0
  473. package/dist/src/styles/io/approximations.d.ts.map +1 -0
  474. package/dist/src/styles/io/approximations.js +51 -0
  475. package/dist/src/styles/io/approximations.js.map +1 -0
  476. package/dist/src/styles/io/block.d.ts +166 -0
  477. package/dist/src/styles/io/block.d.ts.map +1 -0
  478. package/dist/src/styles/io/block.js +930 -0
  479. package/dist/src/styles/io/block.js.map +1 -0
  480. package/dist/src/styles/io/generic.d.ts +88 -0
  481. package/dist/src/styles/io/generic.d.ts.map +1 -0
  482. package/dist/src/styles/io/generic.js +516 -0
  483. package/dist/src/styles/io/generic.js.map +1 -0
  484. package/dist/src/styles/io/index.d.ts +8 -0
  485. package/dist/src/styles/io/index.d.ts.map +1 -0
  486. package/dist/src/styles/io/index.js +7 -0
  487. package/dist/src/styles/io/index.js.map +1 -0
  488. package/dist/src/styles/io/writer.d.ts +80 -0
  489. package/dist/src/styles/io/writer.d.ts.map +1 -0
  490. package/dist/src/styles/io/writer.js +596 -0
  491. package/dist/src/styles/io/writer.js.map +1 -0
  492. package/dist/src/styles/notes.d.ts +47 -0
  493. package/dist/src/styles/notes.d.ts.map +1 -0
  494. package/dist/src/styles/notes.js +140 -0
  495. package/dist/src/styles/notes.js.map +1 -0
  496. package/dist/src/styles/plan/classes.d.ts +31 -0
  497. package/dist/src/styles/plan/classes.d.ts.map +1 -0
  498. package/dist/src/styles/plan/classes.js +139 -0
  499. package/dist/src/styles/plan/classes.js.map +1 -0
  500. package/dist/src/styles/plan/continuous.d.ts +32 -0
  501. package/dist/src/styles/plan/continuous.d.ts.map +1 -0
  502. package/dist/src/styles/plan/continuous.js +165 -0
  503. package/dist/src/styles/plan/continuous.js.map +1 -0
  504. package/dist/src/styles/plan/discrete.d.ts +39 -0
  505. package/dist/src/styles/plan/discrete.d.ts.map +1 -0
  506. package/dist/src/styles/plan/discrete.js +127 -0
  507. package/dist/src/styles/plan/discrete.js.map +1 -0
  508. package/dist/src/styles/plan/families.d.ts +31 -0
  509. package/dist/src/styles/plan/families.d.ts.map +1 -0
  510. package/dist/src/styles/plan/families.js +95 -0
  511. package/dist/src/styles/plan/families.js.map +1 -0
  512. package/dist/src/styles/plan/features.d.ts +58 -0
  513. package/dist/src/styles/plan/features.d.ts.map +1 -0
  514. package/dist/src/styles/plan/features.js +185 -0
  515. package/dist/src/styles/plan/features.js.map +1 -0
  516. package/dist/src/styles/plan/index.d.ts +7 -0
  517. package/dist/src/styles/plan/index.d.ts.map +1 -0
  518. package/dist/src/styles/plan/index.js +7 -0
  519. package/dist/src/styles/plan/index.js.map +1 -0
  520. package/dist/src/styles/plan/plan.d.ts +71 -0
  521. package/dist/src/styles/plan/plan.d.ts.map +1 -0
  522. package/dist/src/styles/plan/plan.js +893 -0
  523. package/dist/src/styles/plan/plan.js.map +1 -0
  524. package/dist/src/styles/plan/resolve.d.ts +137 -0
  525. package/dist/src/styles/plan/resolve.d.ts.map +1 -0
  526. package/dist/src/styles/plan/resolve.js +587 -0
  527. package/dist/src/styles/plan/resolve.js.map +1 -0
  528. package/dist/src/styles/types.d.ts +702 -0
  529. package/dist/src/styles/types.d.ts.map +1 -0
  530. package/dist/src/styles/types.js +10 -0
  531. package/dist/src/styles/types.js.map +1 -0
  532. package/dist/src/styles/vocabulary.d.ts +41 -0
  533. package/dist/src/styles/vocabulary.d.ts.map +1 -0
  534. package/dist/src/styles/vocabulary.js +140 -0
  535. package/dist/src/styles/vocabulary.js.map +1 -0
  536. package/dist/src/types.d.ts +64 -1
  537. package/dist/src/types.d.ts.map +1 -1
  538. package/dist/src/types.js.map +1 -1
  539. package/dist/styles.d.ts +1 -0
  540. package/dist/styles.js +322 -0
  541. package/dist/styles.js.map +1 -0
  542. package/dist/xgmml.js +5 -4
  543. package/dist/xgmml.js.map +1 -1
  544. package/package.json +13 -2
  545. package/src/common/codes.ts +7 -0
  546. package/src/common/escape.ts +5 -2
  547. package/src/common/export.ts +179 -140
  548. package/src/common/input.ts +8 -4
  549. package/src/common/json-elements.ts +169 -38
  550. package/src/common/notes.ts +94 -0
  551. package/src/common/report.ts +41 -1
  552. package/src/common/units.ts +42 -0
  553. package/src/common/xml.ts +45 -5
  554. package/src/formats/cx/exporter.ts +95 -11
  555. package/src/formats/cx/importer.ts +126 -90
  556. package/src/formats/cx/styles.ts +304 -0
  557. package/src/formats/cx2/exporter.ts +234 -77
  558. package/src/formats/cx2/importer.ts +19 -1
  559. package/src/formats/cx2/styles.ts +29 -0
  560. package/src/formats/cys/constants.ts +3 -0
  561. package/src/formats/cys/exporter.ts +246 -60
  562. package/src/formats/cys/importer.ts +125 -9
  563. package/src/formats/cys/session.ts +6 -0
  564. package/src/formats/cys/styles.ts +254 -0
  565. package/src/formats/cys/tables.ts +117 -48
  566. package/src/formats/dot/exporter.ts +262 -126
  567. package/src/formats/dot/importer.ts +111 -20
  568. package/src/formats/dot/index.ts +1 -0
  569. package/src/formats/dot/positions.ts +77 -0
  570. package/src/formats/dot/styles.ts +1741 -0
  571. package/src/formats/gexf/exporter.ts +27 -11
  572. package/src/formats/gexf/importer.ts +308 -158
  573. package/src/formats/gexf/index.ts +10 -0
  574. package/src/formats/gexf/schema.ts +5 -0
  575. package/src/formats/gexf/styles.ts +719 -0
  576. package/src/formats/gml/exporter.ts +33 -14
  577. package/src/formats/gml/importer.ts +4 -0
  578. package/src/formats/gml/index.ts +2 -1
  579. package/src/formats/gml/positions.ts +52 -0
  580. package/src/formats/gml/styles.ts +1248 -0
  581. package/src/formats/gml/syntax.ts +173 -62
  582. package/src/formats/graphml/constants.ts +5 -0
  583. package/src/formats/graphml/exporter.ts +163 -71
  584. package/src/formats/graphml/importer.ts +119 -45
  585. package/src/formats/graphml/index.ts +1 -0
  586. package/src/formats/graphml/styles-plain.ts +236 -0
  587. package/src/formats/graphml/styles-yed.ts +1221 -0
  588. package/src/formats/graphml/styles-yfiles3.ts +573 -0
  589. package/src/formats/graphml/tree.ts +36 -20
  590. package/src/formats/graphml/yfiles.ts +89 -13
  591. package/src/formats/json/exporter.ts +76 -26
  592. package/src/formats/json/importer.ts +541 -322
  593. package/src/formats/json/positions.ts +50 -0
  594. package/src/formats/json/styles.ts +2082 -0
  595. package/src/formats/neo4j/exporter.ts +2 -1
  596. package/src/formats/pajek/exporter.ts +195 -106
  597. package/src/formats/pajek/importer.ts +78 -9
  598. package/src/formats/pajek/index.ts +2 -0
  599. package/src/formats/pajek/styles.ts +685 -0
  600. package/src/formats/pajek/syntax.ts +7 -0
  601. package/src/formats/xgmml/columns.ts +39 -9
  602. package/src/formats/xgmml/constants.ts +3 -0
  603. package/src/formats/xgmml/document.ts +54 -12
  604. package/src/formats/xgmml/emit.ts +11 -6
  605. package/src/formats/xgmml/exporter.ts +32 -13
  606. package/src/formats/xgmml/importer.ts +43 -29
  607. package/src/formats/xgmml/styles.ts +400 -0
  608. package/src/index.ts +16 -0
  609. package/src/positions/codes.ts +32 -0
  610. package/src/positions/convert.ts +123 -0
  611. package/src/positions/extract.ts +619 -0
  612. package/src/positions/index.ts +23 -0
  613. package/src/positions/types.ts +221 -0
  614. package/src/registry.ts +179 -8
  615. package/src/styles/annotations.ts +478 -0
  616. package/src/styles/budget.ts +60 -0
  617. package/src/styles/canon/bends.ts +84 -0
  618. package/src/styles/canon/color-tables.ts +386 -0
  619. package/src/styles/canon/color.ts +624 -0
  620. package/src/styles/canon/enums.ts +211 -0
  621. package/src/styles/canon/graphviz.ts +189 -0
  622. package/src/styles/canon/index.ts +13 -0
  623. package/src/styles/canon/number.ts +152 -0
  624. package/src/styles/canon/site.ts +87 -0
  625. package/src/styles/canon/text.ts +221 -0
  626. package/src/styles/codes.ts +104 -0
  627. package/src/styles/cyjs/cascade.ts +2670 -0
  628. package/src/styles/cyjs/defaults-table.ts +82 -0
  629. package/src/styles/cyjs/emit.ts +951 -0
  630. package/src/styles/cyjs/index.ts +37 -0
  631. package/src/styles/cyjs/live.ts +147 -0
  632. package/src/styles/cyjs/mappers.ts +879 -0
  633. package/src/styles/cyjs/selector.ts +778 -0
  634. package/src/styles/cyjs/stylesheet-text.ts +214 -0
  635. package/src/styles/cytoscape/emit.ts +1264 -0
  636. package/src/styles/cytoscape/index.ts +40 -0
  637. package/src/styles/cytoscape/lexicon.ts +656 -0
  638. package/src/styles/cytoscape/mappings.ts +603 -0
  639. package/src/styles/cytoscape/resolve.ts +521 -0
  640. package/src/styles/cytoscape/translate.ts +237 -0
  641. package/src/styles/defaults.ts +504 -0
  642. package/src/styles/index.ts +57 -0
  643. package/src/styles/internal.ts +17 -0
  644. package/src/styles/io/approximations.ts +47 -0
  645. package/src/styles/io/block.ts +1138 -0
  646. package/src/styles/io/generic.ts +687 -0
  647. package/src/styles/io/index.ts +18 -0
  648. package/src/styles/io/writer.ts +745 -0
  649. package/src/styles/notes.ts +165 -0
  650. package/src/styles/plan/classes.ts +166 -0
  651. package/src/styles/plan/continuous.ts +218 -0
  652. package/src/styles/plan/discrete.ts +165 -0
  653. package/src/styles/plan/families.ts +115 -0
  654. package/src/styles/plan/features.ts +234 -0
  655. package/src/styles/plan/index.ts +7 -0
  656. package/src/styles/plan/plan.ts +1129 -0
  657. package/src/styles/plan/resolve.ts +685 -0
  658. package/src/styles/types.ts +814 -0
  659. package/src/styles/vocabulary.ts +172 -0
  660. package/src/types.ts +76 -1
  661. package/dist/chunks/constants-fT3E8JYY.js.map +0 -1
  662. package/dist/chunks/escape-B62ZGM_a.js.map +0 -1
  663. package/dist/chunks/export-rKLeGQMo.js.map +0 -1
  664. package/dist/chunks/exporter-8hLNemFk.js.map +0 -1
  665. package/dist/chunks/exporter-BWwEuOPT.js.map +0 -1
  666. package/dist/chunks/exporter-RVtXVetw.js.map +0 -1
  667. package/dist/chunks/importer-BbNb7eNg.js.map +0 -1
  668. package/dist/chunks/importer-C98dpSH4.js.map +0 -1
  669. package/dist/chunks/importer-D794XUTe.js.map +0 -1
  670. package/dist/chunks/importer-Dz7tI8Sa.js.map +0 -1
  671. package/dist/chunks/importer-Ht7LNg8L.js.map +0 -1
  672. package/dist/chunks/importer-WrGRZb0N.js.map +0 -1
  673. package/dist/chunks/importer-xZ-3suY1.js.map +0 -1
  674. package/dist/chunks/json-elements-DKSqpNW1.js.map +0 -1
@@ -0,0 +1,778 @@
1
+ /**
2
+ * Cytoscape.js's selector grammar, parsed the way Cytoscape.js 3.x parses it, by index in one pass. The grammar is
3
+ * Cytoscape.js's own: the same tokens tried in the same order (group, state, `#id`, `.class`, `[a]`, `[a op v]`,
4
+ * `[?a]`, `[[degree op n]]`, then the separators `,` `->` `<->` `>` and a space, and the subject `$`), building the
5
+ * same query structure, so a selector that is valid there is valid here and selects the same elements.
6
+ *
7
+ * Two of Cytoscape.js's behaviors are kept on purpose because files depend on them:
8
+ * - an invalid selector keeps what was parsed before the error. A selector whose first token fails has one empty
9
+ * query and matches every node and edge; `node:not(.a)` keeps `node` and matches every node.
10
+ * - a string value is kept as written between its quotes: `[a = "x\"y"]` compares with `x\"y`.
11
+ */
12
+
13
+ /** A comparison operator after its `!` and `@` flags are taken off. */
14
+ export type CyjsCompareOp = "=" | ">" | ">=" | "<" | "<=" | "*=" | "^=" | "$=";
15
+
16
+ /** One check of a query; a query matches when every check does. */
17
+ export type CyjsCheck =
18
+ | {
19
+ /** The kind of check. */ readonly type: "group";
20
+ /** The value compared with or matched. */ readonly value: "nodes" | "edges" | "*";
21
+ }
22
+ | {
23
+ /** The kind of check. */ readonly type: "state";
24
+ /** The value compared with or matched. */ readonly value: string;
25
+ }
26
+ | {
27
+ /** The kind of check. */ readonly type: "id";
28
+ /** The value compared with or matched. */ readonly value: string;
29
+ }
30
+ | {
31
+ /** The kind of check. */ readonly type: "class";
32
+ /** The value compared with or matched. */ readonly value: string;
33
+ }
34
+ | {
35
+ /** The kind of check. */ readonly type: "exist";
36
+ /** The data field (or, for `meta`, the degree) the check reads. */ readonly field: string;
37
+ }
38
+ | {
39
+ /** The kind of check. */ readonly type: "compare";
40
+ /** The data field (or, for `meta`, the degree) the check reads. */ readonly field: string;
41
+ /** The operator. */ readonly op: CyjsCompareOp;
42
+ /** Whether the comparison is negated (`!`). */ readonly not: boolean;
43
+ /** Whether a string comparison ignores case (`@`). */ readonly ci: boolean;
44
+ /** The value compared with or matched. */ readonly value: string | number;
45
+ }
46
+ | {
47
+ /** The kind of check. */ readonly type: "bool";
48
+ /** The data field (or, for `meta`, the degree) the check reads. */ readonly field: string;
49
+ /** The operator. */ readonly op: "?" | "!" | "^";
50
+ }
51
+ | {
52
+ /** The kind of check. */ readonly type: "meta";
53
+ /** The data field (or, for `meta`, the degree) the check reads. */ readonly field:
54
+ "degree" | "indegree" | "outdegree";
55
+ /** The operator. */ readonly op: CyjsCompareOp;
56
+ /** Whether the comparison is negated (`!`). */ readonly not: boolean;
57
+ /** Whether a string comparison ignores case (`@`). */ readonly ci: boolean;
58
+ /** The value compared with or matched. */ readonly value: number;
59
+ }
60
+ | {
61
+ /** The kind of check: matches every element. */
62
+ readonly type: "true";
63
+ }
64
+ | {
65
+ /** The kind of check. */ readonly type: "child";
66
+ /** The query the parent must match. */ readonly parent: CyjsQuery;
67
+ /** The query the child must match. */ readonly child: CyjsQuery;
68
+ }
69
+ | {
70
+ /** The kind of check. */ readonly type: "descendant";
71
+ /** The query an ancestor must match. */ readonly ancestor: CyjsQuery;
72
+ /** The query the descendant must match. */ readonly descendant: CyjsQuery;
73
+ }
74
+ | {
75
+ /** The kind of check. */ readonly type: "parent";
76
+ /** The query the parent must match. */ readonly parent: CyjsQuery;
77
+ /** The query the child must match. */ readonly child: CyjsQuery;
78
+ }
79
+ | {
80
+ /** The kind of check. */ readonly type: "ancestor";
81
+ /** The query an ancestor must match. */ readonly ancestor: CyjsQuery;
82
+ /** The query the descendant must match. */ readonly descendant: CyjsQuery;
83
+ }
84
+ | {
85
+ /** The kind of check. */ readonly type: "split";
86
+ /** The query left of the separator. */ readonly left: CyjsQuery;
87
+ /** The query right of the separator. */ readonly right: CyjsQuery;
88
+ /** The query marked as the subject with `$`. */ readonly subject: CyjsQuery;
89
+ }
90
+ | {
91
+ /** The kind of check. */ readonly type: "directedEdge";
92
+ /** The query the source node must match. */ readonly source: CyjsQuery;
93
+ /** The query the target node must match. */ readonly target: CyjsQuery;
94
+ }
95
+ | {
96
+ /** The kind of check. */ readonly type: "undirectedEdge";
97
+ /** The queries the two end nodes must match, in either order. */ readonly nodes: readonly [
98
+ CyjsQuery,
99
+ CyjsQuery,
100
+ ];
101
+ }
102
+ | {
103
+ /** The kind of check. */ readonly type: "nodeSource";
104
+ /** The query the source node must match. */ readonly source: CyjsQuery;
105
+ /** The query the target node must match. */ readonly target: CyjsQuery;
106
+ }
107
+ | {
108
+ /** The kind of check. */ readonly type: "nodeTarget";
109
+ /** The query the source node must match. */ readonly source: CyjsQuery;
110
+ /** The query the target node must match. */ readonly target: CyjsQuery;
111
+ }
112
+ | {
113
+ /** The kind of check. */ readonly type: "nodeNeighbor";
114
+ /** The query the node itself must match. */ readonly node: CyjsQuery;
115
+ /** The query a neighbor must match. */ readonly neighbor: CyjsQuery;
116
+ };
117
+
118
+ /** One comma-separated alternative of a selector. */
119
+ export interface CyjsQuery {
120
+ /** The checks; an empty list matches every element. */
121
+ checks: CyjsCheck[];
122
+ }
123
+
124
+ /** A parsed selector. */
125
+ export interface CyjsSelector {
126
+ /** The alternatives; an element matches when any one does. None: the selector matches nothing. */
127
+ readonly queries: readonly CyjsQuery[];
128
+ /** Cytoscape.js rejects the selector; the queries hold what it parsed before the error. */
129
+ readonly invalid: boolean;
130
+ }
131
+
132
+ /** Every state selector Cytoscape.js 3.x knows. */
133
+ const CYJS_STATES: ReadonlySet<string> = new Set([
134
+ "selected",
135
+ "unselected",
136
+ "selectable",
137
+ "unselectable",
138
+ "locked",
139
+ "unlocked",
140
+ "visible",
141
+ "hidden",
142
+ "transparent",
143
+ "grabbed",
144
+ "free",
145
+ "removed",
146
+ "inside",
147
+ "grabbable",
148
+ "ungrabbable",
149
+ "animated",
150
+ "unanimated",
151
+ "parent",
152
+ "childless",
153
+ "child",
154
+ "orphan",
155
+ "nonorphan",
156
+ "compound",
157
+ "loop",
158
+ "simple",
159
+ "active",
160
+ "inactive",
161
+ "backgrounding",
162
+ "nonbackgrounding",
163
+ ]);
164
+
165
+ /** The longest selector parsed; a longer one is treated as invalid (and noted by the caller). */
166
+ const MAX_SELECTOR_LENGTH = 1 << 22;
167
+
168
+ /** Cytoscape.js's escapable meta characters. */
169
+ const META = new Set("!\"#$%&'()*+,./:;<=>?@[]^`{|}~");
170
+ /** The base comparison operators, longest first so a scan takes `>=` before `>`. */
171
+ const BASE_OPS: readonly string[] = ["!=", ">=", "<=", "*=", "^=", "$=", "=", ">", "<"];
172
+ const META_FIELDS: readonly ("indegree" | "outdegree" | "degree")[] = ["indegree", "outdegree", "degree"];
173
+
174
+ /**
175
+ * Whether a character is a JavaScript regular expression word character.
176
+ * @param c - the character
177
+ * @returns true for `[A-Za-z0-9_]`
178
+ */
179
+ function isWord(c: string | undefined): boolean {
180
+ if (c === undefined) {
181
+ return false;
182
+ }
183
+ const k = c.codePointAt(0) ?? 0;
184
+ return (k >= 48 && k <= 57) || (k >= 65 && k <= 90) || (k >= 97 && k <= 122) || k === 95;
185
+ }
186
+
187
+ /**
188
+ * Whether a character is JavaScript regular expression whitespace (`\s`).
189
+ * @param c - the character
190
+ * @returns true for whitespace
191
+ */
192
+ function isSpace(c: string | undefined): boolean {
193
+ return c !== undefined && /\s/.test(c);
194
+ }
195
+
196
+ /** The text being parsed and the position reached. */
197
+ class Cursor {
198
+ pos = 0;
199
+ constructor(readonly text: string) {}
200
+
201
+ /**
202
+ * The end of a run of whitespace.
203
+ * @param from - where the run starts
204
+ * @returns the first position after it
205
+ */
206
+ spaceEnd(from: number): number {
207
+ let i = from;
208
+ while (i < this.text.length && isSpace(this.text[i])) {
209
+ i++;
210
+ }
211
+ return i;
212
+ }
213
+
214
+ /**
215
+ * A name at `from`: word characters, `-`, and `.` when `dots` (Cytoscape.js's variable and id tokens), or a
216
+ * backslash before a meta character.
217
+ * @param from - the start
218
+ * @param dots - whether `.` belongs to the name
219
+ * @returns the raw name and its end, or null when there is none
220
+ */
221
+ name(from: number, dots: boolean): { raw: string; end: number } | null {
222
+ let i = from;
223
+ const t = this.text;
224
+ while (i < t.length) {
225
+ const c = t[i];
226
+ if (isWord(c) || c === "-" || (dots && c === ".")) {
227
+ i++;
228
+ } else if (c === "\\" && i + 1 < t.length && META.has(t[i + 1])) {
229
+ i += 2;
230
+ } else {
231
+ break;
232
+ }
233
+ }
234
+ return i > from ? { raw: t.slice(from, i), end: i } : null;
235
+ }
236
+
237
+ /**
238
+ * A number literal at `from` (Cytoscape.js's `[-+]?(\d+|\d*\.\d+)([Ee][+-]?\d+)?`). Both readings of the
239
+ * mantissa are returned, longest first, because the regular expression backtracks to the shorter one.
240
+ * @param from - the start
241
+ * @returns the possible ends, longest first
242
+ */
243
+ numberEnds(from: number): number[] {
244
+ const t = this.text;
245
+ let i = from;
246
+ if (t[i] === "+" || t[i] === "-") {
247
+ i++;
248
+ }
249
+ const digits = (k: number): number => {
250
+ let j = k;
251
+ while (j < t.length && t[j] >= "0" && t[j] <= "9") {
252
+ j++;
253
+ }
254
+ return j;
255
+ };
256
+ const mantissas: number[] = [];
257
+ const intEnd = digits(i);
258
+ if (intEnd > i) {
259
+ mantissas.push(intEnd);
260
+ }
261
+ // \d*\.\d+
262
+ if (t[intEnd] === ".") {
263
+ const fracEnd = digits(intEnd + 1);
264
+ if (fracEnd > intEnd + 1) {
265
+ mantissas.unshift(fracEnd);
266
+ }
267
+ }
268
+ const ends: number[] = [];
269
+ for (const m of mantissas) {
270
+ if (t[m] === "e" || t[m] === "E") {
271
+ let j = m + 1;
272
+ if (t[j] === "+" || t[j] === "-") {
273
+ j++;
274
+ }
275
+ const expEnd = digits(j);
276
+ if (expEnd > j) {
277
+ ends.push(expEnd);
278
+ }
279
+ }
280
+ ends.push(m);
281
+ }
282
+ return ends;
283
+ }
284
+
285
+ /**
286
+ * The possible ends of a quoted string at `from`: every quote that may close it, longest first (a quote after a
287
+ * backslash may also be escaped; the first quote with no backslash before it must close the string).
288
+ * @param from - the opening quote
289
+ * @returns the possible ends (after the closing quote), longest first
290
+ */
291
+ stringEnds(from: number): number[] {
292
+ const t = this.text;
293
+ const q = t[from];
294
+ const ends: number[] = [];
295
+ for (let i = from + 1; i < t.length; i++) {
296
+ if (t[i] !== q) {
297
+ continue;
298
+ }
299
+ ends.push(i + 1);
300
+ if (t[i - 1] !== "\\" || i - 1 === from) {
301
+ break;
302
+ }
303
+ }
304
+ return ends.reverse();
305
+ }
306
+
307
+ /**
308
+ * A comparison operator at `from`: `!` and `@` flags, then a base operator (`!` before a base that holds `!`
309
+ * is not allowed).
310
+ * @param from - the start
311
+ * @returns the operator text and its end, or null
312
+ */
313
+ op(from: number): { text: string; end: number } | null {
314
+ const t = this.text;
315
+ let i = from;
316
+ let prefix = "";
317
+ if (t[i] === "!" && t[i + 1] !== "=") {
318
+ prefix += "!";
319
+ i++;
320
+ }
321
+ if (t[i] === "@") {
322
+ prefix += "@";
323
+ i++;
324
+ }
325
+ for (const base of BASE_OPS) {
326
+ if (t.startsWith(base, i)) {
327
+ if (prefix.includes("!") && base === "!=") {
328
+ return null;
329
+ }
330
+ return { text: prefix + base, end: i + base.length };
331
+ }
332
+ }
333
+ return null;
334
+ }
335
+ }
336
+
337
+ /**
338
+ * A name with its backslash escapes of meta characters removed.
339
+ * @param raw - the name as written
340
+ * @returns the name
341
+ */
342
+ function cleanMeta(raw: string): string {
343
+ let out = "";
344
+ let i = 0;
345
+ while (i < raw.length) {
346
+ const escaped = raw[i] === "\\" && i + 1 < raw.length && META.has(raw[i + 1]);
347
+ out += escaped ? raw[i + 1] : raw[i];
348
+ i += escaped ? 2 : 1;
349
+ }
350
+ return out;
351
+ }
352
+
353
+ /**
354
+ * Splits an operator into its base and its flags.
355
+ * @param text - the operator as written
356
+ * @returns the base operator and the `!` and `@` flags
357
+ */
358
+ function splitOp(text: string): { op: CyjsCompareOp; not: boolean; ci: boolean } {
359
+ let op = text;
360
+ let not = false;
361
+ let ci = false;
362
+ if (op.includes("!")) {
363
+ op = op.replace("!", "");
364
+ not = true;
365
+ }
366
+ if (op.includes("@")) {
367
+ op = op.replace("@", "");
368
+ ci = true;
369
+ }
370
+ return { op: op as CyjsCompareOp, not, ci };
371
+ }
372
+
373
+ /** The parser's state across queries: Cytoscape.js's selector object while it is filled. */
374
+ interface Building {
375
+ readonly queries: CyjsQuery[];
376
+ subject: CyjsQuery | null;
377
+ edgeCount: number;
378
+ compoundCount: number;
379
+ readonly counts: { edgeCount: number; compoundCount: number; subject: CyjsQuery | null }[];
380
+ }
381
+
382
+ /** A token matched at the cursor: how to fill the selector, and where it ends. */
383
+ interface Token {
384
+ readonly end: number;
385
+ readonly fill: (b: Building, q: CyjsQuery) => CyjsQuery | null | false;
386
+ }
387
+
388
+ /**
389
+ * Replaces the last query of the selector.
390
+ * @param b - the selector being built
391
+ * @param q - the replacement
392
+ */
393
+ function replaceLast(b: Building, q: CyjsQuery): void {
394
+ b.queries[b.queries.length - 1] = q;
395
+ }
396
+
397
+ /**
398
+ * The last query of the selector (a selector always has one).
399
+ * @param b - the selector being built
400
+ * @returns the query
401
+ */
402
+ function lastQuery(b: Building): CyjsQuery {
403
+ return b.queries.at(-1) as CyjsQuery;
404
+ }
405
+
406
+ /**
407
+ * The compound separators (`>` and a space) as Cytoscape.js fills them.
408
+ * @param kind - child or descendant
409
+ * @returns the fill function
410
+ */
411
+ function compoundFill(kind: "child" | "descendant"): Token["fill"] {
412
+ return (b, query) => {
413
+ if (b.subject === null) {
414
+ const outer: CyjsQuery = { checks: [] };
415
+ const inner: CyjsQuery = { checks: [] };
416
+ const left = lastQuery(b);
417
+ outer.checks.push(
418
+ kind === "child"
419
+ ? { type: "child", parent: left, child: inner }
420
+ : { type: "descendant", ancestor: left, descendant: inner },
421
+ );
422
+ replaceLast(b, outer);
423
+ b.compoundCount++;
424
+ return inner;
425
+ }
426
+ if (b.subject === query) {
427
+ const compound: CyjsQuery = { checks: [] };
428
+ const left = lastQuery(b);
429
+ const right: CyjsQuery = { checks: [] };
430
+ const subject: CyjsQuery = { checks: query.checks };
431
+ const inner: CyjsQuery = { checks: [] };
432
+ const outer: CyjsQuery = { checks: [{ type: "true" }] };
433
+ query.checks = [{ type: "true" }];
434
+ right.checks.push(
435
+ kind === "child"
436
+ ? { type: "parent", parent: outer, child: inner }
437
+ : { type: "ancestor", ancestor: outer, descendant: inner },
438
+ );
439
+ compound.checks.push({ type: "split", left, right, subject });
440
+ replaceLast(b, compound);
441
+ b.subject = subject;
442
+ b.compoundCount++;
443
+ return inner;
444
+ }
445
+ const outer: CyjsQuery = { checks: query.checks };
446
+ const inner: CyjsQuery = { checks: [] };
447
+ query.checks = [
448
+ kind === "child"
449
+ ? { type: "parent", parent: outer, child: inner }
450
+ : { type: "ancestor", ancestor: outer, descendant: inner },
451
+ ];
452
+ b.compoundCount++;
453
+ return inner;
454
+ };
455
+ }
456
+
457
+ /**
458
+ * The first of Cytoscape.js's expressions that matches at the cursor, in its order.
459
+ * @param c - the cursor
460
+ * @returns the token, or null when none matches (the selector is invalid)
461
+ */
462
+ function nextToken(c: Cursor): Token | null {
463
+ const ch = c.text[c.pos];
464
+ return (
465
+ groupToken(c) ??
466
+ (ch === ":" ? stateToken(c) : null) ??
467
+ (ch === "#" || ch === "." ? nameToken(c, ch) : null) ??
468
+ (ch === "[" ? dataToken(c, c.pos) : null) ??
469
+ separatorToken(c) ??
470
+ (ch === "$" ? subjectToken(c) : null)
471
+ );
472
+ }
473
+
474
+ /**
475
+ * A check that fills the query with a fixed check.
476
+ * @param end - where the token ends
477
+ * @param check - the check
478
+ * @returns the token
479
+ */
480
+ function checkToken(end: number, check: CyjsCheck): Token {
481
+ return {
482
+ end,
483
+ fill: (_b, q) => {
484
+ q.checks.push(check);
485
+ return null;
486
+ },
487
+ };
488
+ }
489
+
490
+ /**
491
+ * A group: `node`, `edge` or `*`.
492
+ * @param c - the cursor
493
+ * @returns the token, or null
494
+ */
495
+ function groupToken(c: Cursor): Token | null {
496
+ const i = c.pos;
497
+ for (const [g, value] of [
498
+ ["node", "nodes"],
499
+ ["edge", "edges"],
500
+ ["*", "*"],
501
+ ] as const) {
502
+ if (c.text.startsWith(g, i)) {
503
+ return checkToken(i + g.length, { type: "group", value });
504
+ }
505
+ }
506
+ return null;
507
+ }
508
+
509
+ /**
510
+ * A state: the longest state name that is a prefix after the `:`.
511
+ * @param c - the cursor
512
+ * @returns the token, or null
513
+ */
514
+ function stateToken(c: Cursor): Token | null {
515
+ const i = c.pos;
516
+ let best: string | null = null;
517
+ for (const s of CYJS_STATES) {
518
+ if (c.text.startsWith(s, i + 1) && (best === null || s.length > best.length)) {
519
+ best = s;
520
+ }
521
+ }
522
+ return best === null ? null : checkToken(i + 1 + best.length, { type: "state", value: best });
523
+ }
524
+
525
+ /**
526
+ * An id (`#`) or a class (`.`).
527
+ * @param c - the cursor
528
+ * @param ch - the `#` or `.`
529
+ * @returns the token, or null
530
+ */
531
+ function nameToken(c: Cursor, ch: "#" | "."): Token | null {
532
+ const n = c.name(c.pos + 1, ch === "#");
533
+ if (n === null) {
534
+ return null;
535
+ }
536
+ return checkToken(n.end, { type: ch === "#" ? "id" : "class", value: cleanMeta(n.raw) });
537
+ }
538
+
539
+ /**
540
+ * A separator: `\s*,\s*`, `\s+->\s+`, `\s+<->\s+`, `\s+>\s+` or `\s+`.
541
+ * @param c - the cursor
542
+ * @returns the token, or null
543
+ */
544
+ function separatorToken(c: Cursor): Token | null {
545
+ const t = c.text;
546
+ const i = c.pos;
547
+ const ws = c.spaceEnd(i);
548
+ if (t[ws] === ",") {
549
+ return { end: c.spaceEnd(ws + 1), fill: nextQuery };
550
+ }
551
+ if (ws === i) {
552
+ return null;
553
+ }
554
+ for (const [sep, kind] of [
555
+ ["->", "directed"],
556
+ ["<->", "undirected"],
557
+ [">", "child"],
558
+ ] as const) {
559
+ const after = t.startsWith(sep, ws) ? c.spaceEnd(ws + sep.length) : -1;
560
+ if (after > ws + sep.length) {
561
+ return { end: after, fill: kind === "child" ? compoundFill("child") : edgeFill(kind) };
562
+ }
563
+ }
564
+ return { end: ws, fill: compoundFill("descendant") };
565
+ }
566
+
567
+ /**
568
+ * Starts the next query of a selector list (`,`).
569
+ * @param b - the selector being built
570
+ * @returns the new query
571
+ */
572
+ function nextQuery(b: Building): CyjsQuery {
573
+ b.counts.push({ edgeCount: b.edgeCount, compoundCount: b.compoundCount, subject: b.subject });
574
+ b.subject = null;
575
+ b.edgeCount = 0;
576
+ b.compoundCount = 0;
577
+ const next: CyjsQuery = { checks: [] };
578
+ b.queries.push(next);
579
+ return next;
580
+ }
581
+
582
+ /**
583
+ * The subject marker `$`: the query it follows is the one the selector selects.
584
+ * @param c - the cursor
585
+ * @returns the token
586
+ */
587
+ function subjectToken(c: Cursor): Token {
588
+ return {
589
+ end: c.pos + 1,
590
+ fill: (b, q) => {
591
+ if (b.subject !== null && b.subject !== q) {
592
+ return false;
593
+ }
594
+ b.subject = q;
595
+ const top = lastQuery(b);
596
+ const first = top.checks.at(0);
597
+ if (first?.type === "directedEdge") {
598
+ top.checks[0] = { type: "nodeTarget", source: first.source, target: first.target };
599
+ } else if (first?.type === "undirectedEdge") {
600
+ top.checks[0] = { type: "nodeNeighbor", node: first.nodes[1], neighbor: first.nodes[0] };
601
+ }
602
+ return null;
603
+ },
604
+ };
605
+ }
606
+
607
+ /**
608
+ * The edge separators (`->`, `<->`) as Cytoscape.js fills them.
609
+ * @param kind - directed or undirected
610
+ * @returns the fill function
611
+ */
612
+ function edgeFill(kind: "directed" | "undirected"): Token["fill"] {
613
+ return (b, query) => {
614
+ const target: CyjsQuery = { checks: [] };
615
+ const outer: CyjsQuery = { checks: [] };
616
+ if (b.subject === null) {
617
+ outer.checks.push(
618
+ kind === "directed"
619
+ ? { type: "directedEdge", source: query, target }
620
+ : { type: "undirectedEdge", nodes: [query, target] },
621
+ );
622
+ replaceLast(b, outer);
623
+ b.edgeCount++;
624
+ return target;
625
+ }
626
+ if (kind === "directed") {
627
+ outer.checks.push({ type: "nodeSource", source: query, target });
628
+ replaceLast(b, outer);
629
+ b.edgeCount++;
630
+ return target;
631
+ }
632
+ outer.checks.push({ type: "nodeNeighbor", node: query, neighbor: target });
633
+ replaceLast(b, outer);
634
+ return target;
635
+ };
636
+ }
637
+
638
+ /**
639
+ * A `[...]` token at `i`: data existence, a data comparison, a data boolean or a metadata comparison, tried in
640
+ * Cytoscape.js's order.
641
+ * @param c - the cursor
642
+ * @param i - the position of `[`
643
+ * @returns the token, or null
644
+ */
645
+ function dataToken(c: Cursor, i: number): Token | null {
646
+ const inner = c.spaceEnd(i + 1);
647
+ return compareToken(c, inner) ?? boolToken(c, inner) ?? (c.text[i + 1] === "[" ? metaToken(c, i) : null);
648
+ }
649
+
650
+ /**
651
+ * `[a]` or `[a op value]`.
652
+ * @param c - the cursor
653
+ * @param inner - the position after `[` and its whitespace
654
+ * @returns the token, or null
655
+ */
656
+ function compareToken(c: Cursor, inner: number): Token | null {
657
+ const t = c.text;
658
+ const v = c.name(inner, true);
659
+ if (v === null) {
660
+ return null;
661
+ }
662
+ const field = cleanMeta(v.raw);
663
+ const afterName = c.spaceEnd(v.end);
664
+ if (t[afterName] === "]") {
665
+ return checkToken(afterName + 1, { type: "exist", field });
666
+ }
667
+ const op = c.op(afterName);
668
+ if (op === null) {
669
+ return null;
670
+ }
671
+ const at = c.spaceEnd(op.end);
672
+ const quoted = t[at] === '"' || t[at] === "'";
673
+ const end = (quoted ? c.stringEnds(at) : c.numberEnds(at)).find((x) => t[c.spaceEnd(x)] === "]");
674
+ if (end === undefined) {
675
+ return null;
676
+ }
677
+ const literal = t.slice(at, end);
678
+ const value: string | number = quoted ? literal.slice(1, -1) : Number.parseFloat(literal);
679
+ const { op: base, not, ci } = splitOp(op.text);
680
+ return checkToken(c.spaceEnd(end) + 1, { type: "compare", field, op: base, not, ci, value });
681
+ }
682
+
683
+ /**
684
+ * `[?a]`, `[!a]` or `[^a]`.
685
+ * @param c - the cursor
686
+ * @param inner - the position after `[` and its whitespace
687
+ * @returns the token, or null
688
+ */
689
+ function boolToken(c: Cursor, inner: number): Token | null {
690
+ const t = c.text;
691
+ const flag = t[inner];
692
+ if (flag !== "?" && flag !== "!" && flag !== "^") {
693
+ return null;
694
+ }
695
+ const n = c.name(c.spaceEnd(inner + 1), true);
696
+ const close = n === null ? -1 : c.spaceEnd(n.end);
697
+ if (n === null || t[close] !== "]") {
698
+ return null;
699
+ }
700
+ return checkToken(close + 1, { type: "bool", field: cleanMeta(n.raw), op: flag });
701
+ }
702
+
703
+ /**
704
+ * `[[degree op n]]`.
705
+ * @param c - the cursor
706
+ * @param i - the position of the first `[`
707
+ * @returns the token, or null
708
+ */
709
+ function metaToken(c: Cursor, i: number): Token | null {
710
+ const t = c.text;
711
+ const at = c.spaceEnd(i + 2);
712
+ const field = META_FIELDS.find((f) => t.startsWith(f, at));
713
+ const op = field === undefined ? null : c.op(c.spaceEnd(at + field.length));
714
+ if (field === undefined || op === null) {
715
+ return null;
716
+ }
717
+ const numAt = c.spaceEnd(op.end);
718
+ const end = c.numberEnds(numAt).find((x) => {
719
+ const close = c.spaceEnd(x);
720
+ return t[close] === "]" && t[close + 1] === "]";
721
+ });
722
+ if (end === undefined) {
723
+ return null;
724
+ }
725
+ const value = Number.parseFloat(t.slice(numAt, end));
726
+ const { op: base, not, ci } = splitOp(op.text);
727
+ return checkToken(c.spaceEnd(end) + 2, { type: "meta", field, op: base, not, ci, value });
728
+ }
729
+
730
+ /**
731
+ * Whether a selector is blank: white space only.
732
+ * @param text - the selector
733
+ * @returns true when blank
734
+ */
735
+ function isBlank(text: string): boolean {
736
+ return /^\s*$/.test(text.length > 1024 ? text.slice(0, 1024) : text) && text.trim() === "";
737
+ }
738
+
739
+ /**
740
+ * Parses a selector the way Cytoscape.js does.
741
+ * @param text - the selector
742
+ * @returns the queries and whether Cytoscape.js rejects the selector
743
+ */
744
+ export function parseCyjsSelector(text: unknown): CyjsSelector {
745
+ // a missing or blank selector matches nothing
746
+ if (typeof text !== "string" || isBlank(text)) {
747
+ return { queries: [], invalid: false };
748
+ }
749
+ if (text.length > MAX_SELECTOR_LENGTH) {
750
+ return { queries: [], invalid: true };
751
+ }
752
+ const c = new Cursor(text);
753
+ const first: CyjsQuery = { checks: [] };
754
+ const b: Building = { queries: [first], subject: null, edgeCount: 0, compoundCount: 0, counts: [] };
755
+ let current = first;
756
+ c.pos = c.spaceEnd(0);
757
+ for (;;) {
758
+ const tok = nextToken(c);
759
+ if (tok === null) {
760
+ return { queries: b.queries, invalid: true };
761
+ }
762
+ const next = tok.fill(b, current);
763
+ if (next === false) {
764
+ return { queries: b.queries, invalid: true };
765
+ }
766
+ if (next !== null) {
767
+ current = next;
768
+ }
769
+ c.pos = tok.end;
770
+ if (c.spaceEnd(c.pos) >= text.length) {
771
+ break;
772
+ }
773
+ }
774
+ b.counts.push({ edgeCount: b.edgeCount, compoundCount: b.compoundCount, subject: b.subject });
775
+ // a query may hold one edge or compound relation, not both and not two edges
776
+ const invalid = b.counts.some((k) => (k.compoundCount > 0 && k.edgeCount > 0) || k.edgeCount > 1);
777
+ return { queries: b.queries, invalid };
778
+ }