@adguard/agtree 2.2.0 → 3.0.0-alpha.2

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 (495) hide show
  1. package/README.md +1 -1
  2. package/dist/ast-utils/clone.js +61 -0
  3. package/dist/ast-utils/modifiers.js +53 -0
  4. package/dist/ast-utils/network-rules.js +41 -0
  5. package/dist/ast-utils/scriptlets.js +87 -0
  6. package/dist/common/abp-snippet-injection-body-common.js +23 -0
  7. package/dist/common/agent-common.js +56 -0
  8. package/dist/common/ubo-selector-common.js +17 -0
  9. package/dist/compatibility-tables/base.js +262 -0
  10. package/dist/compatibility-tables/compatibility-table-data.js +11 -0
  11. package/dist/compatibility-tables/modifiers.js +55 -0
  12. package/dist/compatibility-tables/platforms.js +76 -0
  13. package/dist/compatibility-tables/redirects.js +100 -0
  14. package/dist/compatibility-tables/schemas/base.js +111 -0
  15. package/dist/compatibility-tables/schemas/modifier.js +129 -0
  16. package/dist/compatibility-tables/schemas/platform.js +69 -0
  17. package/dist/compatibility-tables/schemas/redirect.js +29 -0
  18. package/dist/compatibility-tables/schemas/resource-type.js +36 -0
  19. package/dist/compatibility-tables/schemas/scriptlet.js +79 -0
  20. package/dist/compatibility-tables/scriptlets.js +28 -0
  21. package/dist/compatibility-tables/utils/platform-helpers.js +105 -0
  22. package/dist/compatibility-tables/utils/resource-type-helpers.js +61 -0
  23. package/dist/compatibility-tables/utils/zod-camelcase.js +25 -0
  24. package/dist/converter/base-interfaces/base-converter.js +59 -0
  25. package/dist/converter/base-interfaces/conversion-result.js +38 -0
  26. package/dist/converter/base-interfaces/rule-converter-base.js +60 -0
  27. package/dist/converter/comment/index.js +54 -0
  28. package/dist/converter/cosmetic/css.js +69 -0
  29. package/dist/converter/cosmetic/element-hiding.js +62 -0
  30. package/dist/converter/cosmetic/header-removal.js +123 -0
  31. package/dist/converter/cosmetic/html.js +379 -0
  32. package/dist/converter/cosmetic/index.js +118 -0
  33. package/dist/converter/cosmetic/rule-modifiers/adg.js +79 -0
  34. package/dist/converter/cosmetic/scriptlet.js +354 -0
  35. package/dist/converter/css/index.js +188 -0
  36. package/dist/converter/data/css.js +126 -0
  37. package/dist/converter/filter-list.js +88 -0
  38. package/dist/converter/index.js +8 -0
  39. package/dist/converter/misc/network-rule-modifier.js +311 -0
  40. package/dist/converter/network/index.js +99 -0
  41. package/dist/converter/raw-filter-list.js +56 -0
  42. package/dist/converter/rule.js +81 -0
  43. package/dist/deserializer/base-deserializer.js +29 -0
  44. package/dist/deserializer/comment/agent-comment-deserializer.js +79 -0
  45. package/dist/deserializer/comment/agent-deserializer.js +65 -0
  46. package/dist/deserializer/comment/comment-rule-deserializer.js +54 -0
  47. package/dist/deserializer/comment/config-comment-deserializer.js +111 -0
  48. package/dist/deserializer/comment/hint-comment-deserializer.js +72 -0
  49. package/dist/deserializer/comment/hint-deserializer.js +85 -0
  50. package/dist/deserializer/comment/metadata-comment-deserializer.js +69 -0
  51. package/dist/deserializer/comment/pre-processor-comment-deserializer.js +112 -0
  52. package/dist/deserializer/comment/simple-comment-deserializer.js +65 -0
  53. package/dist/deserializer/cosmetic/cosmetic-rule-deserializer.js +131 -0
  54. package/dist/deserializer/cosmetic/css-injection-body-deserializer.js +56 -0
  55. package/dist/deserializer/cosmetic/element-hiding-body-deserializer.js +48 -0
  56. package/dist/deserializer/cosmetic/scriptlet-body/abp-snippet-injection-body-deserializer.js +39 -0
  57. package/dist/deserializer/cosmetic/scriptlet-body/adg-scriptlet-injection-body-deserializer.js +40 -0
  58. package/dist/deserializer/cosmetic/scriptlet-body/scriptlet-body-deserializer.js +54 -0
  59. package/dist/deserializer/cosmetic/scriptlet-body/ubo-scriptlet-injection-body-deserializer.js +38 -0
  60. package/dist/deserializer/empty-rule-deserializer.js +48 -0
  61. package/dist/deserializer/filterlist-deserializer.js +85 -0
  62. package/dist/deserializer/index.js +8 -0
  63. package/dist/deserializer/invalid-rule-deserializer.js +50 -0
  64. package/dist/deserializer/invalid-rule-error-node-deserializer.js +50 -0
  65. package/dist/deserializer/misc/domain-list-deserializer.js +64 -0
  66. package/dist/deserializer/misc/list-item-deserializer.js +69 -0
  67. package/dist/deserializer/misc/list-items-deserializer.js +30 -0
  68. package/dist/deserializer/misc/logical-expression-deserializer.js +196 -0
  69. package/dist/deserializer/misc/modifier-deserializer.js +87 -0
  70. package/dist/deserializer/misc/modifier-list-deserializer.js +61 -0
  71. package/dist/deserializer/misc/parameter-list-deserializer.js +64 -0
  72. package/dist/deserializer/misc/value-deserializer.js +50 -0
  73. package/dist/deserializer/network/host-rule-deserializer.js +67 -0
  74. package/dist/deserializer/network/hostname-list-deserializer.js +56 -0
  75. package/dist/deserializer/network/network-rule-deserializer.js +65 -0
  76. package/dist/deserializer/rule-deserializer.js +65 -0
  77. package/dist/deserializer/syntax-deserialization-map.js +21 -0
  78. package/dist/errors/adblock-syntax-error.js +39 -0
  79. package/dist/errors/binary-schema-mismatch-error.js +37 -0
  80. package/dist/errors/not-implemented-error.js +31 -0
  81. package/dist/errors/rule-conversion-error.js +26 -0
  82. package/dist/generator/base-generator.js +27 -0
  83. package/dist/generator/comment/agent-comment-generator.js +31 -0
  84. package/dist/generator/comment/agent-generator.js +36 -0
  85. package/dist/generator/comment/comment-rule-generator.js +47 -0
  86. package/dist/generator/comment/config-comment-generator.js +45 -0
  87. package/dist/generator/comment/hint-comment-generator.js +28 -0
  88. package/dist/generator/comment/hint-generator.js +33 -0
  89. package/dist/generator/comment/metadata-comment-generator.js +33 -0
  90. package/dist/generator/comment/pre-processor-comment-generator.js +48 -0
  91. package/dist/generator/comment/simple-comment-generator.js +29 -0
  92. package/dist/generator/cosmetic/body/abp-snippet-injection-body-generator.js +38 -0
  93. package/dist/generator/cosmetic/body/adg-scriptlet-injection-body-generator.js +43 -0
  94. package/dist/generator/cosmetic/body/ubo-scriptlet-injection-body-generator.js +45 -0
  95. package/dist/generator/cosmetic/cosmetic-rule-body-generator.js +94 -0
  96. package/dist/generator/cosmetic/cosmetic-rule-generator.js +54 -0
  97. package/dist/generator/cosmetic/cosmetic-rule-pattern-generator.js +42 -0
  98. package/dist/generator/css/adg-css-injection-generator.js +42 -0
  99. package/dist/generator/filterlist-generator.js +67 -0
  100. package/dist/generator/index.js +9 -0
  101. package/dist/generator/misc/domain-list-generator.js +26 -0
  102. package/dist/generator/misc/list-items-generator.js +39 -0
  103. package/dist/generator/misc/logical-expression-generator.js +48 -0
  104. package/dist/generator/misc/modifier-generator.js +34 -0
  105. package/dist/generator/misc/modifier-list-generator.js +29 -0
  106. package/dist/generator/misc/parameter-list-generator.js +41 -0
  107. package/dist/generator/misc/value-generator.js +24 -0
  108. package/dist/generator/network/host-rule-generator.js +39 -0
  109. package/dist/generator/network/network-rule-generator.js +38 -0
  110. package/dist/generator/rule-generator.js +65 -0
  111. package/dist/index.js +70 -0
  112. package/dist/marshalling-utils/comment/agent-comment-common.js +21 -0
  113. package/dist/marshalling-utils/comment/agent-common.js +40 -0
  114. package/dist/marshalling-utils/comment/config-comment-common.js +54 -0
  115. package/dist/marshalling-utils/comment/hint-comment-common.js +22 -0
  116. package/dist/marshalling-utils/comment/hint-common.js +56 -0
  117. package/dist/marshalling-utils/comment/metadata-comment-common.js +41 -0
  118. package/dist/marshalling-utils/comment/pre-processor-comment-common.js +59 -0
  119. package/dist/marshalling-utils/comment/simple-comment-common.js +22 -0
  120. package/dist/marshalling-utils/cosmetic/body/abp-snippet-injection-body-common.js +61 -0
  121. package/dist/marshalling-utils/cosmetic/body/adg-scriptlet-injection-body-common.js +66 -0
  122. package/dist/marshalling-utils/cosmetic/body/css-injection-body-common.js +24 -0
  123. package/dist/marshalling-utils/cosmetic/body/element-hiding-body-common.js +21 -0
  124. package/dist/marshalling-utils/cosmetic/body/ubo-scriptlet-injection-body-common.js +114 -0
  125. package/dist/marshalling-utils/cosmetic/cosmetic-rule-common.js +48 -0
  126. package/dist/marshalling-utils/empty-rule-common.js +20 -0
  127. package/dist/marshalling-utils/filter-list-common.js +21 -0
  128. package/dist/marshalling-utils/invalid-rule-common.js +21 -0
  129. package/dist/marshalling-utils/invalid-rule-error-node-common.js +22 -0
  130. package/dist/marshalling-utils/misc/binary-type-common.js +66 -0
  131. package/dist/marshalling-utils/misc/domain-list-common.js +36 -0
  132. package/dist/marshalling-utils/misc/host-rule-common.js +25 -0
  133. package/dist/marshalling-utils/misc/hostname-list-common.js +21 -0
  134. package/dist/marshalling-utils/misc/list-item-common.js +22 -0
  135. package/dist/marshalling-utils/misc/logical-expression-common.js +83 -0
  136. package/dist/marshalling-utils/misc/modifier-common.js +231 -0
  137. package/dist/marshalling-utils/misc/modifier-list-common.js +21 -0
  138. package/dist/marshalling-utils/misc/parameter-list-common.js +21 -0
  139. package/dist/marshalling-utils/misc/value-common.js +22 -0
  140. package/dist/marshalling-utils/network/network-rule-common.js +25 -0
  141. package/dist/marshalling-utils/syntax-serialization-map.js +30 -0
  142. package/dist/nodes/index.js +168 -0
  143. package/dist/package.json.js +9 -0
  144. package/dist/parser/base-parser.js +30 -0
  145. package/dist/parser/comment/agent-comment-parser.js +119 -0
  146. package/dist/parser/comment/agent-parser.js +110 -0
  147. package/dist/parser/comment/comment-parser.js +108 -0
  148. package/dist/parser/comment/config-comment-parser.js +137 -0
  149. package/dist/parser/comment/hint-comment-parser.js +117 -0
  150. package/dist/parser/comment/hint-parser.js +129 -0
  151. package/dist/parser/comment/metadata-comment-parser.js +129 -0
  152. package/dist/parser/comment/preprocessor-parser.js +199 -0
  153. package/dist/parser/comment/simple-comment-parser.js +106 -0
  154. package/dist/parser/cosmetic/body/abp-snippet-injection-body-parser.js +79 -0
  155. package/dist/parser/cosmetic/body/adg-scriptlet-injection-body-parser.js +149 -0
  156. package/dist/parser/cosmetic/body/ubo-scriptlet-injection-body-parser.js +110 -0
  157. package/dist/parser/cosmetic/cosmetic-rule-parser.js +453 -0
  158. package/dist/parser/css/adg-css-injection-parser.js +208 -0
  159. package/dist/parser/css/balancing.js +94 -0
  160. package/dist/parser/css/constants.js +18 -0
  161. package/dist/parser/css/css-token-stream.js +343 -0
  162. package/dist/parser/css/ubo-selector-parser.js +369 -0
  163. package/dist/parser/filterlist-parser.js +102 -0
  164. package/dist/parser/index.js +12 -0
  165. package/dist/parser/misc/app-list-parser.js +45 -0
  166. package/dist/parser/misc/domain-list-parser.js +52 -0
  167. package/dist/parser/misc/list-items-parser.js +116 -0
  168. package/dist/parser/misc/logical-expression-parser.js +279 -0
  169. package/dist/parser/misc/method-list-parser.js +46 -0
  170. package/dist/parser/misc/modifier-list.js +70 -0
  171. package/dist/parser/misc/modifier-parser.js +89 -0
  172. package/dist/parser/misc/parameter-list-parser.js +75 -0
  173. package/dist/parser/misc/stealth-option-list-parser.js +46 -0
  174. package/dist/parser/misc/ubo-parameter-list-parser.js +149 -0
  175. package/dist/parser/misc/value-parser.js +37 -0
  176. package/dist/parser/network/host-rule-parser.js +130 -0
  177. package/dist/parser/network/network-rule-parser.js +117 -0
  178. package/dist/parser/options.js +23 -0
  179. package/dist/parser/rule-parser.js +192 -0
  180. package/dist/serializer/base-serializer.js +29 -0
  181. package/dist/serializer/comment/agent-comment-serializer.js +74 -0
  182. package/dist/serializer/comment/agent-serializer.js +59 -0
  183. package/dist/serializer/comment/comment-rule-serializer.js +105 -0
  184. package/dist/serializer/comment/config-comment-serializer.js +82 -0
  185. package/dist/serializer/comment/hint-comment-serializer.js +65 -0
  186. package/dist/serializer/comment/hint-serializer.js +54 -0
  187. package/dist/serializer/comment/metadata-comment-serializer.js +73 -0
  188. package/dist/serializer/comment/pre-processor-comment-serializer.js +71 -0
  189. package/dist/serializer/comment/simple-comment-serializer.js +52 -0
  190. package/dist/serializer/cosmetic/body/abp-snippet-injection-body-serializer.js +36 -0
  191. package/dist/serializer/cosmetic/body/adg-scriptlet-injection-body-serializer.js +36 -0
  192. package/dist/serializer/cosmetic/body/scriptlet-body-serializer.js +50 -0
  193. package/dist/serializer/cosmetic/body/ubo-scriptlet-injection-body-serializer.js +36 -0
  194. package/dist/serializer/cosmetic/cosmetic-rule-serializer.js +120 -0
  195. package/dist/serializer/cosmetic/css-injection-body-serializer.js +51 -0
  196. package/dist/serializer/cosmetic/element-hiding-body-serializer.js +40 -0
  197. package/dist/serializer/empty-rule-serializer.js +37 -0
  198. package/dist/serializer/filterlist-serializer.js +45 -0
  199. package/dist/serializer/index.js +7 -0
  200. package/dist/serializer/invalid-rule-error-node-serializer.js +41 -0
  201. package/dist/serializer/invalid-rule-serializer.js +40 -0
  202. package/dist/serializer/misc/domain-list-serializer.js +64 -0
  203. package/dist/serializer/misc/list-item-serializer.js +58 -0
  204. package/dist/serializer/misc/list-items-serializer.js +29 -0
  205. package/dist/serializer/misc/logical-expression-serializer.js +136 -0
  206. package/dist/serializer/misc/modifier-list-serializer.js +58 -0
  207. package/dist/serializer/misc/modifier-serializer.js +49 -0
  208. package/dist/serializer/misc/parameter-list-serializer.js +52 -0
  209. package/dist/serializer/misc/value-serializer.js +50 -0
  210. package/dist/serializer/network/host-rule-serializer.js +70 -0
  211. package/dist/serializer/network/hostname-list-serializer.js +53 -0
  212. package/dist/serializer/network/network-rule-serializer.js +54 -0
  213. package/dist/serializer/rule-serializer.js +61 -0
  214. package/dist/types/ast-utils/clone.d.ts +26 -0
  215. package/dist/types/ast-utils/filter-list.d.ts +11 -0
  216. package/dist/types/ast-utils/modifiers.d.ts +20 -0
  217. package/dist/types/ast-utils/network-rules.d.ts +15 -0
  218. package/dist/types/ast-utils/scriptlets.d.ts +52 -0
  219. package/dist/types/common/abp-snippet-injection-body-common.d.ts +15 -0
  220. package/dist/types/common/agent-common.d.ts +10 -0
  221. package/dist/types/common/ubo-selector-common.d.ts +10 -0
  222. package/dist/types/compatibility-tables/base.d.ts +157 -0
  223. package/dist/types/compatibility-tables/compatibility-table-data.d.ts +68 -0
  224. package/dist/types/compatibility-tables/index.d.ts +13 -0
  225. package/dist/types/compatibility-tables/modifiers.d.ts +22 -0
  226. package/dist/types/compatibility-tables/platforms.d.ts +49 -0
  227. package/dist/types/compatibility-tables/redirects.d.ts +33 -0
  228. package/dist/types/compatibility-tables/schemas/base.d.ts +124 -0
  229. package/dist/types/compatibility-tables/schemas/index.d.ts +8 -0
  230. package/dist/types/compatibility-tables/schemas/modifier.d.ts +36 -0
  231. package/dist/types/compatibility-tables/schemas/platform.d.ts +16 -0
  232. package/dist/types/compatibility-tables/schemas/redirect.d.ts +25 -0
  233. package/dist/types/compatibility-tables/schemas/resource-type.d.ts +41 -0
  234. package/dist/types/compatibility-tables/schemas/scriptlet.d.ts +31 -0
  235. package/dist/types/compatibility-tables/scriptlets.d.ts +15 -0
  236. package/dist/types/compatibility-tables/types.d.ts +34 -0
  237. package/dist/types/compatibility-tables/utils/platform-helpers.d.ts +44 -0
  238. package/dist/types/compatibility-tables/utils/resource-type-helpers.d.ts +20 -0
  239. package/dist/types/compatibility-tables/utils/zod-camelcase.d.ts +15 -0
  240. package/dist/types/converter/base-interfaces/base-converter.d.ts +42 -0
  241. package/dist/types/converter/base-interfaces/conversion-result.d.ts +43 -0
  242. package/dist/types/converter/base-interfaces/rule-converter-base.d.ts +44 -0
  243. package/dist/types/converter/comment/index.d.ts +23 -0
  244. package/dist/types/converter/cosmetic/css.d.ts +23 -0
  245. package/dist/types/converter/cosmetic/element-hiding.d.ts +23 -0
  246. package/dist/types/converter/cosmetic/header-removal.d.ts +37 -0
  247. package/dist/types/converter/cosmetic/html.d.ts +54 -0
  248. package/dist/types/converter/cosmetic/index.d.ts +33 -0
  249. package/dist/types/converter/cosmetic/rule-modifiers/adg.d.ts +21 -0
  250. package/dist/types/converter/cosmetic/scriptlet.d.ts +33 -0
  251. package/dist/types/converter/css/index.d.ts +40 -0
  252. package/dist/types/converter/data/css.d.ts +48 -0
  253. package/dist/types/converter/filter-list.d.ts +31 -0
  254. package/dist/types/converter/index.d.ts +5 -0
  255. package/dist/types/converter/misc/network-rule-modifier.d.ts +35 -0
  256. package/dist/types/converter/network/index.d.ts +33 -0
  257. package/dist/types/converter/raw-filter-list.d.ts +31 -0
  258. package/dist/types/converter/raw-rule.d.ts +28 -0
  259. package/dist/types/converter/rule.d.ts +37 -0
  260. package/dist/types/deserializer/base-deserializer.d.ts +15 -0
  261. package/dist/types/deserializer/comment/agent-comment-deserializer.d.ts +34 -0
  262. package/dist/types/deserializer/comment/agent-deserializer.d.ts +25 -0
  263. package/dist/types/deserializer/comment/comment-rule-deserializer.d.ts +16 -0
  264. package/dist/types/deserializer/comment/config-comment-deserializer.d.ts +27 -0
  265. package/dist/types/deserializer/comment/hint-comment-deserializer.d.ts +24 -0
  266. package/dist/types/deserializer/comment/hint-deserializer.d.ts +26 -0
  267. package/dist/types/deserializer/comment/metadata-comment-deserializer.d.ts +26 -0
  268. package/dist/types/deserializer/comment/pre-processor-comment-deserializer.d.ts +29 -0
  269. package/dist/types/deserializer/comment/simple-comment-deserializer.d.ts +26 -0
  270. package/dist/types/deserializer/cosmetic/cosmetic-rule-deserializer.d.ts +18 -0
  271. package/dist/types/deserializer/cosmetic/css-injection-body-deserializer.d.ts +15 -0
  272. package/dist/types/deserializer/cosmetic/element-hiding-body-deserializer.d.ts +16 -0
  273. package/dist/types/deserializer/cosmetic/scriptlet-body/abp-snippet-injection-body-deserializer.d.ts +17 -0
  274. package/dist/types/deserializer/cosmetic/scriptlet-body/adg-scriptlet-injection-body-deserializer.d.ts +18 -0
  275. package/dist/types/deserializer/cosmetic/scriptlet-body/scriptlet-body-deserializer.d.ts +19 -0
  276. package/dist/types/deserializer/cosmetic/scriptlet-body/ubo-scriptlet-injection-body-deserializer.d.ts +17 -0
  277. package/dist/types/deserializer/empty-rule-deserializer.d.ts +16 -0
  278. package/dist/types/deserializer/filterlist-deserializer.d.ts +34 -0
  279. package/dist/types/deserializer/index.d.ts +2 -0
  280. package/dist/types/deserializer/invalid-rule-deserializer.d.ts +16 -0
  281. package/dist/types/deserializer/invalid-rule-error-node-deserializer.d.ts +16 -0
  282. package/dist/types/deserializer/misc/domain-list-deserializer.d.ts +15 -0
  283. package/dist/types/deserializer/misc/list-item-deserializer.d.ts +19 -0
  284. package/dist/types/deserializer/misc/list-items-deserializer.d.ts +16 -0
  285. package/dist/types/deserializer/misc/logical-expression-deserializer.d.ts +55 -0
  286. package/dist/types/deserializer/misc/modifier-deserializer.d.ts +18 -0
  287. package/dist/types/deserializer/misc/modifier-list-deserializer.d.ts +20 -0
  288. package/dist/types/deserializer/misc/parameter-list-deserializer.d.ts +18 -0
  289. package/dist/types/deserializer/misc/value-deserializer.d.ts +17 -0
  290. package/dist/types/deserializer/network/host-rule-deserializer.d.ts +18 -0
  291. package/dist/types/deserializer/network/hostname-list-deserializer.d.ts +15 -0
  292. package/dist/types/deserializer/network/network-rule-deserializer.d.ts +18 -0
  293. package/dist/types/deserializer/rule-deserializer.d.ts +17 -0
  294. package/dist/types/deserializer/syntax-deserialization-map.d.ts +2 -0
  295. package/dist/types/errors/adblock-syntax-error.d.ts +25 -0
  296. package/dist/types/errors/binary-schema-mismatch-error.d.ts +23 -0
  297. package/dist/types/errors/not-implemented-error.d.ts +14 -0
  298. package/dist/types/errors/rule-conversion-error.d.ts +14 -0
  299. package/dist/types/generator/base-generator.d.ts +12 -0
  300. package/dist/types/generator/comment/agent-comment-generator.d.ts +14 -0
  301. package/dist/types/generator/comment/agent-generator.d.ts +15 -0
  302. package/dist/types/generator/comment/comment-rule-generator.d.ts +14 -0
  303. package/dist/types/generator/comment/config-comment-generator.d.ts +14 -0
  304. package/dist/types/generator/comment/hint-comment-generator.d.ts +14 -0
  305. package/dist/types/generator/comment/hint-generator.d.ts +14 -0
  306. package/dist/types/generator/comment/index.d.ts +1 -0
  307. package/dist/types/generator/comment/metadata-comment-generator.d.ts +14 -0
  308. package/dist/types/generator/comment/pre-processor-comment-generator.d.ts +14 -0
  309. package/dist/types/generator/comment/simple-comment-generator.d.ts +14 -0
  310. package/dist/types/generator/cosmetic/body/abp-snippet-injection-body-generator.d.ts +15 -0
  311. package/dist/types/generator/cosmetic/body/adg-scriptlet-injection-body-generator.d.ts +21 -0
  312. package/dist/types/generator/cosmetic/body/ubo-scriptlet-injection-body-generator.d.ts +21 -0
  313. package/dist/types/generator/cosmetic/cosmetic-rule-body-generator.d.ts +20 -0
  314. package/dist/types/generator/cosmetic/cosmetic-rule-generator.d.ts +28 -0
  315. package/dist/types/generator/cosmetic/cosmetic-rule-pattern-generator.d.ts +18 -0
  316. package/dist/types/generator/cosmetic/index.d.ts +1 -0
  317. package/dist/types/generator/css/adg-css-injection-generator.d.ts +15 -0
  318. package/dist/types/generator/css/ubo-selector-generator.d.ts +14 -0
  319. package/dist/types/generator/filterlist-generator.d.ts +18 -0
  320. package/dist/types/generator/index.d.ts +3 -0
  321. package/dist/types/generator/misc/domain-list-generator.d.ts +15 -0
  322. package/dist/types/generator/misc/list-items-generator.d.ts +25 -0
  323. package/dist/types/generator/misc/logical-expression-generator.d.ts +14 -0
  324. package/dist/types/generator/misc/modifier-generator.d.ts +14 -0
  325. package/dist/types/generator/misc/modifier-list-generator.d.ts +14 -0
  326. package/dist/types/generator/misc/parameter-list-generator.d.ts +15 -0
  327. package/dist/types/generator/misc/value-generator.d.ts +14 -0
  328. package/dist/types/generator/network/host-rule-generator.d.ts +14 -0
  329. package/dist/types/generator/network/index.d.ts +2 -0
  330. package/dist/types/generator/network/network-rule-generator.d.ts +14 -0
  331. package/dist/types/generator/rule-generator.d.ts +24 -0
  332. package/dist/types/index.d.ts +55 -0
  333. package/dist/types/marshalling-utils/comment/agent-comment-common.d.ts +14 -0
  334. package/dist/types/marshalling-utils/comment/agent-common.d.ts +20 -0
  335. package/dist/types/marshalling-utils/comment/config-comment-common.d.ts +42 -0
  336. package/dist/types/marshalling-utils/comment/hint-comment-common.d.ts +15 -0
  337. package/dist/types/marshalling-utils/comment/hint-common.d.ts +33 -0
  338. package/dist/types/marshalling-utils/comment/metadata-comment-common.d.ts +21 -0
  339. package/dist/types/marshalling-utils/comment/pre-processor-comment-common.d.ts +37 -0
  340. package/dist/types/marshalling-utils/comment/simple-comment-common.d.ts +15 -0
  341. package/dist/types/marshalling-utils/cosmetic/body/abp-snippet-injection-body-common.d.ts +23 -0
  342. package/dist/types/marshalling-utils/cosmetic/body/adg-scriptlet-injection-body-common.d.ts +9 -0
  343. package/dist/types/marshalling-utils/cosmetic/body/css-injection-body-common.d.ts +17 -0
  344. package/dist/types/marshalling-utils/cosmetic/body/element-hiding-body-common.d.ts +14 -0
  345. package/dist/types/marshalling-utils/cosmetic/body/ubo-scriptlet-injection-body-common.d.ts +9 -0
  346. package/dist/types/marshalling-utils/cosmetic/cosmetic-rule-common.d.ts +28 -0
  347. package/dist/types/marshalling-utils/empty-rule-common.d.ts +13 -0
  348. package/dist/types/marshalling-utils/filter-list-common.d.ts +14 -0
  349. package/dist/types/marshalling-utils/invalid-rule-common.d.ts +14 -0
  350. package/dist/types/marshalling-utils/invalid-rule-error-node-common.d.ts +15 -0
  351. package/dist/types/marshalling-utils/misc/binary-type-common.d.ts +57 -0
  352. package/dist/types/marshalling-utils/misc/domain-list-common.d.ts +24 -0
  353. package/dist/types/marshalling-utils/misc/host-rule-common.d.ts +18 -0
  354. package/dist/types/marshalling-utils/misc/hostname-list-common.d.ts +14 -0
  355. package/dist/types/marshalling-utils/misc/list-item-common.d.ts +15 -0
  356. package/dist/types/marshalling-utils/misc/logical-expression-common.d.ts +47 -0
  357. package/dist/types/marshalling-utils/misc/modifier-common.d.ts +41 -0
  358. package/dist/types/marshalling-utils/misc/modifier-list-common.d.ts +14 -0
  359. package/dist/types/marshalling-utils/misc/parameter-list-common.d.ts +14 -0
  360. package/dist/types/marshalling-utils/misc/value-common.d.ts +15 -0
  361. package/dist/types/marshalling-utils/network/network-rule-common.d.ts +18 -0
  362. package/dist/types/marshalling-utils/syntax-serialization-map.d.ts +2 -0
  363. package/dist/types/nodes/index.d.ts +1183 -0
  364. package/dist/types/parser/base-parser.d.ts +16 -0
  365. package/dist/types/parser/comment/agent-comment-parser.d.ts +42 -0
  366. package/dist/types/parser/comment/agent-parser.d.ts +33 -0
  367. package/dist/types/parser/comment/comment-parser.d.ts +76 -0
  368. package/dist/types/parser/comment/config-comment-parser.d.ts +31 -0
  369. package/dist/types/parser/comment/hint-comment-parser.d.ts +33 -0
  370. package/dist/types/parser/comment/hint-parser.d.ts +30 -0
  371. package/dist/types/parser/comment/metadata-comment-parser.d.ts +29 -0
  372. package/dist/types/parser/comment/preprocessor-parser.d.ts +43 -0
  373. package/dist/types/parser/comment/simple-comment-parser.d.ts +33 -0
  374. package/dist/types/parser/cosmetic/body/abp-snippet-injection-body-parser.d.ts +34 -0
  375. package/dist/types/parser/cosmetic/body/adg-scriptlet-injection-body-parser.d.ts +47 -0
  376. package/dist/types/parser/cosmetic/body/ubo-scriptlet-injection-body-parser.d.ts +44 -0
  377. package/dist/types/parser/cosmetic/cosmetic-rule-parser.d.ts +51 -0
  378. package/dist/types/parser/css/adg-css-injection-parser.d.ts +28 -0
  379. package/dist/types/parser/css/balancing.d.ts +36 -0
  380. package/dist/types/parser/css/constants.d.ts +10 -0
  381. package/dist/types/parser/css/css-token-stream.d.ts +210 -0
  382. package/dist/types/parser/css/ubo-selector-parser.d.ts +46 -0
  383. package/dist/types/parser/filterlist-parser.d.ts +29 -0
  384. package/dist/types/parser/index.d.ts +6 -0
  385. package/dist/types/parser/misc/app-list-parser.d.ts +22 -0
  386. package/dist/types/parser/misc/domain-list-parser.d.ts +26 -0
  387. package/dist/types/parser/misc/list-items-parser.d.ts +37 -0
  388. package/dist/types/parser/misc/logical-expression-parser.d.ts +42 -0
  389. package/dist/types/parser/misc/method-list-parser.d.ts +22 -0
  390. package/dist/types/parser/misc/modifier-list.d.ts +24 -0
  391. package/dist/types/parser/misc/modifier-parser.d.ts +21 -0
  392. package/dist/types/parser/misc/parameter-list-parser.d.ts +17 -0
  393. package/dist/types/parser/misc/stealth-option-list-parser.d.ts +22 -0
  394. package/dist/types/parser/misc/ubo-parameter-list-parser.d.ts +21 -0
  395. package/dist/types/parser/misc/value-parser.d.ts +18 -0
  396. package/dist/types/parser/network/host-rule-parser.d.ts +35 -0
  397. package/dist/types/parser/network/network-rule-parser.d.ts +31 -0
  398. package/dist/types/parser/options.d.ts +41 -0
  399. package/dist/types/parser/rule-parser.d.ts +78 -0
  400. package/dist/types/serializer/base-serializer.d.ts +15 -0
  401. package/dist/types/serializer/comment/agent-comment-serializer.d.ts +34 -0
  402. package/dist/types/serializer/comment/agent-serializer.d.ts +15 -0
  403. package/dist/types/serializer/comment/comment-rule-serializer.d.ts +68 -0
  404. package/dist/types/serializer/comment/config-comment-serializer.d.ts +25 -0
  405. package/dist/types/serializer/comment/hint-comment-serializer.d.ts +23 -0
  406. package/dist/types/serializer/comment/hint-serializer.d.ts +24 -0
  407. package/dist/types/serializer/comment/metadata-comment-serializer.d.ts +25 -0
  408. package/dist/types/serializer/comment/pre-processor-comment-serializer.d.ts +28 -0
  409. package/dist/types/serializer/comment/simple-comment-serializer.d.ts +24 -0
  410. package/dist/types/serializer/cosmetic/body/abp-snippet-injection-body-serializer.d.ts +25 -0
  411. package/dist/types/serializer/cosmetic/body/adg-scriptlet-injection-body-serializer.d.ts +25 -0
  412. package/dist/types/serializer/cosmetic/body/scriptlet-body-serializer.d.ts +17 -0
  413. package/dist/types/serializer/cosmetic/body/ubo-scriptlet-injection-body-serializer.d.ts +25 -0
  414. package/dist/types/serializer/cosmetic/cosmetic-rule-serializer.d.ts +19 -0
  415. package/dist/types/serializer/cosmetic/css-injection-body-serializer.d.ts +15 -0
  416. package/dist/types/serializer/cosmetic/element-hiding-body-serializer.d.ts +15 -0
  417. package/dist/types/serializer/empty-rule-serializer.d.ts +15 -0
  418. package/dist/types/serializer/filterlist-serializer.d.ts +15 -0
  419. package/dist/types/serializer/index.d.ts +1 -0
  420. package/dist/types/serializer/invalid-rule-error-node-serializer.d.ts +15 -0
  421. package/dist/types/serializer/invalid-rule-serializer.d.ts +15 -0
  422. package/dist/types/serializer/misc/domain-list-serializer.d.ts +21 -0
  423. package/dist/types/serializer/misc/list-item-serializer.d.ts +16 -0
  424. package/dist/types/serializer/misc/list-items-serializer.d.ts +15 -0
  425. package/dist/types/serializer/misc/logical-expression-serializer.d.ts +52 -0
  426. package/dist/types/serializer/misc/modifier-list-serializer.d.ts +20 -0
  427. package/dist/types/serializer/misc/modifier-serializer.d.ts +18 -0
  428. package/dist/types/serializer/misc/parameter-list-serializer.d.ts +17 -0
  429. package/dist/types/serializer/misc/value-serializer.d.ts +17 -0
  430. package/dist/types/serializer/network/host-rule-serializer.d.ts +30 -0
  431. package/dist/types/serializer/network/hostname-list-serializer.d.ts +15 -0
  432. package/dist/types/serializer/network/network-rule-serializer.d.ts +18 -0
  433. package/dist/types/serializer/rule-serializer.d.ts +17 -0
  434. package/dist/types/utils/adblockers.d.ts +49 -0
  435. package/dist/types/utils/binary-schema-version.d.ts +9 -0
  436. package/dist/types/utils/byte-buffer.d.ts +54 -0
  437. package/dist/types/utils/categorizer.d.ts +14 -0
  438. package/dist/types/utils/clone.d.ts +15 -0
  439. package/dist/types/utils/constants.d.ts +188 -0
  440. package/dist/types/utils/cosmetic-rule-separator.d.ts +45 -0
  441. package/dist/types/utils/deep-freeze.d.ts +13 -0
  442. package/dist/types/utils/domain.d.ts +29 -0
  443. package/dist/types/utils/error.d.ts +8 -0
  444. package/dist/types/utils/index.d.ts +15 -0
  445. package/dist/types/utils/input-byte-buffer.d.ts +146 -0
  446. package/dist/types/utils/is-chromium.d.ts +7 -0
  447. package/dist/types/utils/logical-expression.d.ts +45 -0
  448. package/dist/types/utils/multi-value-map.d.ts +16 -0
  449. package/dist/types/utils/output-byte-buffer.d.ts +132 -0
  450. package/dist/types/utils/position-provider.d.ts +46 -0
  451. package/dist/types/utils/quotes.d.ts +94 -0
  452. package/dist/types/utils/regexp.d.ts +54 -0
  453. package/dist/types/utils/storage-interface.d.ts +23 -0
  454. package/dist/types/utils/string.d.ts +280 -0
  455. package/dist/types/utils/text-decoder-polyfill.d.ts +14 -0
  456. package/dist/types/utils/text-encoder-polyfill.d.ts +18 -0
  457. package/dist/types/utils/type-guards.d.ts +47 -0
  458. package/dist/types/validator/constants.d.ts +89 -0
  459. package/dist/types/validator/helpers.d.ts +37 -0
  460. package/dist/types/validator/index.d.ts +38 -0
  461. package/dist/types/validator/value.d.ts +12 -0
  462. package/dist/types/version.d.ts +5 -0
  463. package/dist/utils/adblockers.js +56 -0
  464. package/dist/utils/binary-schema-version.js +17 -0
  465. package/dist/utils/byte-buffer.js +91 -0
  466. package/dist/utils/categorizer.js +44 -0
  467. package/dist/utils/clone.js +28 -0
  468. package/dist/utils/constants.js +249 -0
  469. package/dist/utils/cosmetic-rule-separator.js +127 -0
  470. package/dist/utils/deep-freeze.js +32 -0
  471. package/dist/utils/domain.js +59 -0
  472. package/dist/utils/error.js +49 -0
  473. package/dist/utils/index.js +21 -0
  474. package/dist/utils/input-byte-buffer.js +265 -0
  475. package/dist/utils/is-chromium.js +20 -0
  476. package/dist/utils/logical-expression.js +92 -0
  477. package/dist/utils/multi-value-map.js +33 -0
  478. package/dist/utils/output-byte-buffer.js +231 -0
  479. package/dist/utils/position-provider.js +73 -0
  480. package/dist/utils/quotes.js +214 -0
  481. package/dist/utils/regexp.js +176 -0
  482. package/dist/utils/string.js +559 -0
  483. package/dist/utils/text-decoder-polyfill.js +107 -0
  484. package/dist/utils/text-encoder-polyfill.js +78 -0
  485. package/dist/utils/type-guards.js +47 -0
  486. package/dist/validator/constants.js +210 -0
  487. package/dist/validator/helpers.js +45 -0
  488. package/dist/validator/index.js +174 -0
  489. package/dist/validator/value.js +568 -0
  490. package/dist/version.js +18 -0
  491. package/package.json +61 -39
  492. package/dist/agtree.d.ts +0 -4155
  493. package/dist/agtree.js +0 -15819
  494. package/dist/agtree.mjs +0 -15720
  495. package/dist/compatibility-table-data.js +0 -12782
@@ -0,0 +1,369 @@
1
+ /*
2
+ * AGTree v3.0.0-alpha.2 (build date: Tue, 17 Dec 2024 16:50:04 GMT)
3
+ * (c) 2024 Adguard Software Ltd.
4
+ * Released under the MIT license
5
+ * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
6
+ */
7
+ import { TokenType, getFormattedTokenName } from '@adguard/css-tokenizer';
8
+ import { sprintf } from 'sprintf-js';
9
+ import { AdblockSyntaxError } from '../../errors/adblock-syntax-error.js';
10
+ import { EMPTY, COLON, OPEN_PARENTHESIS, CSS_NOT_PSEUDO, CLOSE_PARENTHESIS } from '../../utils/constants.js';
11
+ import { tokenizeFnBalanced } from './balancing.js';
12
+ import { defaultParserOptions } from '../options.js';
13
+ import { BaseParser } from '../base-parser.js';
14
+ import { UboPseudoName } from '../../common/ubo-selector-common.js';
15
+
16
+ /**
17
+ * @file Parser for special uBO selectors.
18
+ */
19
+ /**
20
+ * Possible error messages for uBO selectors. Formatted with {@link sprintf}.
21
+ */
22
+ const ERROR_MESSAGES = {
23
+ DUPLICATED_UBO_MODIFIER: "uBO modifier '%s' cannot be used more than once",
24
+ EXPECTED_BUT_GOT_BEFORE: "Expected '%s' but got '%s' before '%s'",
25
+ // eslint-disable-next-line max-len
26
+ NEGATED_UBO_MODIFIER_CANNOT_BE_FOLLOWED_BY: "Negated uBO modifier '%s' cannot be followed by anything else than a closing parenthesis or a whitespace",
27
+ NEGATED_UBO_MODIFIER_CANNOT_BE_PRECEDED_BY: "Negated uBO modifier '%s' cannot be preceded by '%s'",
28
+ PSEUDO_CANNOT_BE_NESTED: "uBO modifier '%s' cannot be nested inside '%s', only '%s' is allowed as a wrapper",
29
+ UBO_MODIFIER_CANNOT_BE_NESTED: "uBO modifier '%s' cannot be nested",
30
+ UBO_STYLE_CANNOT_BE_FOLLOWED: 'uBO style injection cannot be followed by anything else than a whitespace',
31
+ };
32
+ /**
33
+ * Dummy parameter for uBO modifiers in error messages.
34
+ */
35
+ const DUMMY_PARAM = '...';
36
+ /**
37
+ * Set of known uBO modifiers.
38
+ *
39
+ * @note We use `string` instead of `UboPseudoName` because we use this set for checking if a modifier is a known uBO,
40
+ * and an unknown sequence is just a string.
41
+ */
42
+ const KNOWN_UBO_MODIFIERS = new Set([
43
+ UboPseudoName.MatchesMedia,
44
+ UboPseudoName.MatchesPath,
45
+ UboPseudoName.Remove,
46
+ UboPseudoName.Style,
47
+ ]);
48
+ /**
49
+ * Helper function to check if the given selector has any uBO modifier. This function should be fast, because it's used
50
+ * in the hot path of the parser.
51
+ *
52
+ * @param raw Raw selector string.
53
+ * @returns `true` if the selector has any uBO modifier, `false` otherwise.
54
+ */
55
+ const hasAnyUboModifier = (raw) => {
56
+ // Find the first colon
57
+ let colonIndex = raw.indexOf(COLON);
58
+ while (colonIndex !== -1) {
59
+ // Find next opening parenthesis
60
+ const openingParenthesisIndex = raw.indexOf(OPEN_PARENTHESIS, colonIndex + 1);
61
+ // If there is no opening parenthesis, then the selector doesn't contain any uBO modifier
62
+ if (openingParenthesisIndex === -1) {
63
+ return false;
64
+ }
65
+ // Check if the modifier is a known uBO modifier
66
+ if (KNOWN_UBO_MODIFIERS.has(raw.slice(colonIndex + 1, openingParenthesisIndex))) {
67
+ return true;
68
+ }
69
+ // Find next colon
70
+ colonIndex = raw.indexOf(COLON, openingParenthesisIndex + 1);
71
+ }
72
+ return false;
73
+ };
74
+ /**
75
+ * A simple helper function to format a pseudo name for error messages.
76
+ *
77
+ * @param name Pseudo name.
78
+ * @param wrapper Wrapper pseudo name (eg. `not`) (optional, defaults to `undefined`).
79
+ * @returns Formatted pseudo name.
80
+ * @example
81
+ * ```ts
82
+ * formatPseudoName('matches-path', 'not'); // => ':not(:matches-path(...))'
83
+ * formatPseudoName('matches-media'); // => ':matches-media(...)'
84
+ * ```
85
+ */
86
+ const formatPseudoName = (name, wrapper) => {
87
+ const result = [];
88
+ if (wrapper) {
89
+ result.push(COLON, wrapper, OPEN_PARENTHESIS);
90
+ }
91
+ result.push(COLON, name, OPEN_PARENTHESIS, DUMMY_PARAM, CLOSE_PARENTHESIS);
92
+ if (wrapper) {
93
+ result.push(CLOSE_PARENTHESIS);
94
+ }
95
+ return result.join(EMPTY);
96
+ };
97
+ /**
98
+ * Parser for uBO selectors.
99
+ */
100
+ class UboSelectorParser extends BaseParser {
101
+ /**
102
+ * Parses a uBO selector list, eg. `div:matches-path(/path)`.
103
+ *
104
+ * @param raw Raw input to parse.
105
+ * @param options Global parser options.
106
+ * @param baseOffset Starting offset of the input. Node locations are calculated relative to this offset.
107
+ *
108
+ * @returns Parsed uBO selector {@link UboSelectorParser}.
109
+ * @throws An {@link AdblockSyntaxError} if the selector list is syntactically invalid.
110
+ */
111
+ static parse(raw, options = defaultParserOptions, baseOffset = 0) {
112
+ // Prepare helper variables
113
+ const modifiers = {
114
+ type: 'ModifierList',
115
+ children: [],
116
+ };
117
+ if (options.isLocIncluded) {
118
+ modifiers.start = baseOffset;
119
+ modifiers.end = baseOffset + raw.length;
120
+ }
121
+ // Do not perform any parsing if the selector doesn't contain any uBO modifier
122
+ // Parsing is a relatively expensive operation, but this check is cheap, so we can avoid unnecessary work
123
+ // TODO: Move this check to the cosmetic parser (adjustable syntaxes - if uBO syntax is disabled, then we don't
124
+ // need to check for uBO modifiers)
125
+ if (!hasAnyUboModifier(raw)) {
126
+ const selector = {
127
+ type: 'Value',
128
+ value: raw,
129
+ };
130
+ if (options.isLocIncluded) {
131
+ selector.start = baseOffset;
132
+ selector.end = baseOffset + raw.length;
133
+ }
134
+ const result = {
135
+ type: 'UboSelector',
136
+ selector,
137
+ modifiers,
138
+ };
139
+ if (options.isLocIncluded) {
140
+ result.start = baseOffset;
141
+ result.end = baseOffset + raw.length;
142
+ }
143
+ return result;
144
+ }
145
+ // Simple way to check if a modifier is already processed to avoid duplicate modifiers
146
+ const processedModifiers = new Set();
147
+ // We need to keep track of the tokens for handling negations properly
148
+ const tokens = [];
149
+ // This array is used to mark the character slots in the selector string that are occupied by uBO modifiers
150
+ const uboIndexes = new Array(raw.length);
151
+ const uboModifierStack = [];
152
+ let i = 0;
153
+ // Helper function to stack a uBO modifier
154
+ const stackModifier = (modifier) => {
155
+ if (processedModifiers.has(modifier.name)) {
156
+ throw new AdblockSyntaxError(sprintf(ERROR_MESSAGES.DUPLICATED_UBO_MODIFIER, formatPseudoName(modifier.name)), baseOffset + modifier.modifierStart, baseOffset + raw.length);
157
+ }
158
+ uboModifierStack.push(modifier);
159
+ };
160
+ // Tokenize the selector, calculate the balance
161
+ tokenizeFnBalanced(raw, (type, start, end, _, balance) => {
162
+ // Special case: style injection (`:style(...)` and `:remove()`) can only be used at the end of the
163
+ // selector, like
164
+ // - `div:style(...)`,
165
+ // - `div:matches-media(...):style(...)`,
166
+ // - `div:remove()`,
167
+ // etc.
168
+ //
169
+ // But not like
170
+ // - `:style(...) div`,
171
+ // - `:matches-media(...):style(...) div`,
172
+ // - `:remove() div`,
173
+ // etc.
174
+ //
175
+ // The one exception is whitespace, which is allowed after style injection, like
176
+ // - `div:style(...) `,
177
+ // - `div:matches-media(...):style(...) `,
178
+ // - `div:remove() `,
179
+ // etc.
180
+ if ((processedModifiers.has(UboPseudoName.Style)
181
+ || processedModifiers.has(UboPseudoName.Remove))
182
+ && type !== TokenType.Whitespace) {
183
+ throw new AdblockSyntaxError(ERROR_MESSAGES.UBO_STYLE_CANNOT_BE_FOLLOWED, baseOffset + start, baseOffset + raw.length);
184
+ }
185
+ // Check for pseudo classes (colon followed by a function)
186
+ if (tokens[i - 1]?.type === TokenType.Colon && type === TokenType.Function) {
187
+ // Since closing parenthesis is always included in the function token, but we only need the function
188
+ // name, we need to cut off the last character, this is why we use `end - 1` here
189
+ const fn = raw.slice(start, end - 1);
190
+ // Check if the pseudo class is a known uBO modifier
191
+ if (KNOWN_UBO_MODIFIERS.has(fn)) {
192
+ // Generally, uBO modifiers cannot be nested, like
193
+ // - `:any(:matches-media(...))`,
194
+ // - `:matches-media(:matches-media(...))`,
195
+ // - `:not(style(...))`,
196
+ // etc.
197
+ if (balance > 1) {
198
+ // However, we have one exception: `:matches-path()` can be nested inside `:not()`s, like:
199
+ // - `:not(:matches-path(...))`,
200
+ // - `:not(:not(:matches-path(...)))`,
201
+ // etc.
202
+ //
203
+ // But it can't be nested inside any other pseudo class, like:
204
+ // - `:anything(:matches-path(...))`,
205
+ // etc.
206
+ //
207
+ // Moreover, :not() can't contain any other data, like
208
+ // - `:not(div:matches-path(...))`,
209
+ // - `:not(:matches-path(...):matches-path(...))`,
210
+ // - `:not(:matches-path(...) div)`,
211
+ // etc.
212
+ if (fn === UboPseudoName.MatchesPath) {
213
+ if (uboModifierStack.length > 0) {
214
+ throw new AdblockSyntaxError(sprintf(ERROR_MESSAGES.PSEUDO_CANNOT_BE_NESTED, formatPseudoName(UboPseudoName.MatchesPath), formatPseudoName(uboModifierStack[uboModifierStack.length - 1].name), formatPseudoName(CSS_NOT_PSEUDO)), baseOffset + start - 1, baseOffset + raw.length);
215
+ }
216
+ let isException = false;
217
+ let modifierBalance = balance;
218
+ let modifierStart = start;
219
+ for (let j = i - 1; j >= 0; j -= 1) {
220
+ // If we have reached the root level, then we should check if the `not` function is
221
+ // preceded by a colon (which means that it's a pseudo class)
222
+ if (tokens[j].balance === 0) {
223
+ modifierStart = tokens[j].start;
224
+ modifierBalance = tokens[j].balance;
225
+ break;
226
+ }
227
+ else if (tokens[j].type === TokenType.Colon
228
+ || tokens[j].type === TokenType.Whitespace) {
229
+ continue;
230
+ }
231
+ else if (tokens[j].type === TokenType.Function) {
232
+ const wrapperFnName = raw.slice(tokens[j].start, tokens[j].end - 1);
233
+ if (wrapperFnName !== CSS_NOT_PSEUDO) {
234
+ throw new AdblockSyntaxError(sprintf(ERROR_MESSAGES.PSEUDO_CANNOT_BE_NESTED, formatPseudoName(UboPseudoName.MatchesPath), formatPseudoName(wrapperFnName), formatPseudoName(CSS_NOT_PSEUDO)), baseOffset + tokens[j].start - 1, baseOffset + raw.length);
235
+ }
236
+ if (tokens[j - 1]?.type !== TokenType.Colon) {
237
+ const got = tokens[j - 1]?.type
238
+ ? getFormattedTokenName(tokens[j - 1]?.type)
239
+ : 'nothing';
240
+ throw new AdblockSyntaxError(sprintf(ERROR_MESSAGES.EXPECTED_BUT_GOT_BEFORE, getFormattedTokenName(TokenType.Colon), got, formatPseudoName(UboPseudoName.MatchesPath, CSS_NOT_PSEUDO)),
241
+ // eslint-disable-next-line no-unsafe-optional-chaining
242
+ baseOffset + tokens[j - 1]?.start || 0, baseOffset + raw.length);
243
+ }
244
+ isException = !isException;
245
+ continue;
246
+ }
247
+ else {
248
+ throw new AdblockSyntaxError(sprintf(ERROR_MESSAGES.NEGATED_UBO_MODIFIER_CANNOT_BE_PRECEDED_BY, formatPseudoName(UboPseudoName.MatchesPath), getFormattedTokenName(tokens[j].type)), baseOffset + tokens[j].start, baseOffset + raw.length);
249
+ }
250
+ }
251
+ stackModifier({
252
+ name: fn,
253
+ modifierStart,
254
+ modifierBalance,
255
+ nameStart: start,
256
+ nameEnd: end - 1, // ignore opening parenthesis
257
+ valueStart: end,
258
+ valueBalance: balance,
259
+ isException,
260
+ });
261
+ }
262
+ else {
263
+ throw new AdblockSyntaxError(sprintf(ERROR_MESSAGES.UBO_MODIFIER_CANNOT_BE_NESTED, formatPseudoName(fn)), baseOffset + start - 1, baseOffset + raw.length);
264
+ }
265
+ }
266
+ else {
267
+ stackModifier({
268
+ name: fn,
269
+ modifierStart: start - 1, // Include the colon
270
+ modifierBalance: balance,
271
+ nameStart: start,
272
+ nameEnd: end - 1, // ignore opening parenthesis
273
+ valueStart: end,
274
+ valueBalance: balance,
275
+ isException: false,
276
+ });
277
+ }
278
+ }
279
+ }
280
+ else {
281
+ // Get the last stacked modifier
282
+ const lastStackedModifier = uboModifierStack[uboModifierStack.length - 1];
283
+ // Do not allow any other token after `:matches-path(...)` inside `:not(...)`
284
+ if (lastStackedModifier?.name === UboPseudoName.MatchesPath && lastStackedModifier?.isException) {
285
+ if (!(type === TokenType.CloseParenthesis || type === TokenType.Whitespace)
286
+ && balance < lastStackedModifier.valueBalance) {
287
+ throw new AdblockSyntaxError(sprintf(ERROR_MESSAGES.NEGATED_UBO_MODIFIER_CANNOT_BE_FOLLOWED_BY, formatPseudoName(UboPseudoName.MatchesPath), getFormattedTokenName(type)), baseOffset + start, baseOffset + raw.length);
288
+ }
289
+ }
290
+ // If we have reached a closing parenthesis, then we should check if it closes the last stacked modifier
291
+ // and if so, pop it from the stack
292
+ if (type === TokenType.CloseParenthesis && lastStackedModifier) {
293
+ if (balance === Math.max(0, lastStackedModifier.valueBalance - 1)) {
294
+ lastStackedModifier.valueEnd = start;
295
+ }
296
+ if (balance === Math.max(0, lastStackedModifier.modifierBalance - 1)) {
297
+ const modifierName = {
298
+ type: 'Value',
299
+ value: lastStackedModifier.name,
300
+ };
301
+ if (options.isLocIncluded) {
302
+ // TODO: Refactor
303
+ modifierName.start = baseOffset + lastStackedModifier.nameStart;
304
+ modifierName.end = baseOffset + lastStackedModifier.nameEnd;
305
+ }
306
+ const value = {
307
+ type: 'Value',
308
+ value: raw.slice(lastStackedModifier.valueStart, lastStackedModifier.valueEnd),
309
+ };
310
+ if (options.isLocIncluded) {
311
+ value.start = baseOffset + lastStackedModifier.valueStart;
312
+ // It's safe to use `!` here, because we determined the value end index in the
313
+ // previous `if` statement
314
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
315
+ value.end = baseOffset + lastStackedModifier.valueEnd;
316
+ }
317
+ const modifier = {
318
+ type: 'Modifier',
319
+ name: modifierName,
320
+ value,
321
+ exception: lastStackedModifier.isException,
322
+ };
323
+ if (options.isLocIncluded) {
324
+ modifier.start = baseOffset + lastStackedModifier.modifierStart;
325
+ modifier.end = baseOffset + end;
326
+ }
327
+ modifiers.children.push(modifier);
328
+ processedModifiers.add(lastStackedModifier.name);
329
+ uboModifierStack.pop();
330
+ // Mark the character slots in the selector string that are occupied by uBO modifiers
331
+ uboIndexes.fill(true, lastStackedModifier.modifierStart, end);
332
+ }
333
+ }
334
+ }
335
+ // Save the token to the history and increase the index
336
+ tokens.push({
337
+ type,
338
+ start,
339
+ end,
340
+ balance,
341
+ });
342
+ i += 1;
343
+ });
344
+ const selector = {
345
+ type: 'Value',
346
+ value: raw
347
+ .split(EMPTY)
348
+ .map((char, p) => (uboIndexes[p] ? EMPTY : char))
349
+ .join(EMPTY)
350
+ .trim(),
351
+ };
352
+ if (options.isLocIncluded) {
353
+ selector.start = baseOffset;
354
+ selector.end = baseOffset + raw.length;
355
+ }
356
+ const result = {
357
+ type: 'UboSelector',
358
+ selector,
359
+ modifiers,
360
+ };
361
+ if (options.isLocIncluded) {
362
+ result.start = baseOffset;
363
+ result.end = baseOffset + raw.length;
364
+ }
365
+ return result;
366
+ }
367
+ }
368
+
369
+ export { ERROR_MESSAGES, UboSelectorParser, formatPseudoName };
@@ -0,0 +1,102 @@
1
+ /*
2
+ * AGTree v3.0.0-alpha.2 (build date: Tue, 17 Dec 2024 16:50:04 GMT)
3
+ * (c) 2024 Adguard Software Ltd.
4
+ * Released under the MIT license
5
+ * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
6
+ */
7
+ import { RuleParser } from './rule-parser.js';
8
+ import { CR, LF } from '../utils/constants.js';
9
+ import { StringUtils } from '../utils/string.js';
10
+ import { defaultParserOptions } from './options.js';
11
+ import { BaseParser } from './base-parser.js';
12
+
13
+ /**
14
+ * `FilterListParser` is responsible for parsing a whole adblock filter list (list of rules).
15
+ * It is a wrapper around `RuleParser` which parses each line separately.
16
+ */
17
+ class FilterListParser extends BaseParser {
18
+ /**
19
+ * Parses a whole adblock filter list (list of rules).
20
+ *
21
+ * @param raw Raw input to parse.
22
+ * @param options Global parser options.
23
+ * @param baseOffset Starting offset of the input. Node locations are calculated relative to this offset.
24
+ * @returns AST of the source code (list of rules)
25
+ * @example
26
+ * ```js
27
+ * import { readFileSync } from 'fs';
28
+ * import { FilterListParser } from '@adguard/agtree';
29
+ *
30
+ * // Read filter list content from file
31
+ * const content = readFileSync('your-adblock-filter-list.txt', 'utf-8');
32
+ *
33
+ * // Parse the filter list content, then do something with the AST
34
+ * const ast = FilterListParser.parse(content);
35
+ * ```
36
+ * @throws If one of the rules is syntactically invalid (if `tolerant` is `false`)
37
+ */
38
+ static parse(raw, options = defaultParserOptions, baseOffset = 0) {
39
+ // Actual position in the source code
40
+ let offset = 0;
41
+ // Collect adblock rules here
42
+ const rules = [];
43
+ // Start offset of the current line (initially it's 0)
44
+ let lineStartOffset = offset;
45
+ while (offset < raw.length) {
46
+ // Check if we found a new line
47
+ if (StringUtils.isEOL(raw[offset])) {
48
+ // Rule text
49
+ const text = raw.slice(lineStartOffset, offset);
50
+ // Parse the rule
51
+ const rule = RuleParser.parse(text, options, lineStartOffset);
52
+ // Get newline type (possible values: 'crlf', 'lf', 'cr' or undefined if no newline found)
53
+ let nl;
54
+ if (raw[offset] === CR) {
55
+ if (raw[offset + 1] === LF) {
56
+ nl = 'crlf';
57
+ }
58
+ else {
59
+ nl = 'cr';
60
+ }
61
+ }
62
+ else if (raw[offset] === LF) {
63
+ nl = 'lf';
64
+ }
65
+ // Add newline type to the rule (rule parser already added raws.text)
66
+ if (!rule.raws) {
67
+ rule.raws = {
68
+ text,
69
+ nl,
70
+ };
71
+ }
72
+ else {
73
+ rule.raws.nl = nl;
74
+ }
75
+ // Add the rule to the list
76
+ rules.push(rule);
77
+ // Update offset: add 2 if we found CRLF, otherwise add 1
78
+ offset += nl === 'crlf' ? 2 : 1;
79
+ // Update line start offset
80
+ lineStartOffset = offset;
81
+ }
82
+ else {
83
+ // No new line found, just increase offset
84
+ offset += 1;
85
+ }
86
+ }
87
+ // Parse the last rule (it doesn't end with a new line)
88
+ rules.push(RuleParser.parse(raw.slice(lineStartOffset, offset), options, baseOffset + lineStartOffset));
89
+ // Return the list of rules (FilterList node)
90
+ const result = {
91
+ type: 'FilterList',
92
+ children: rules,
93
+ };
94
+ if (options.isLocIncluded) {
95
+ result.start = baseOffset;
96
+ result.end = baseOffset + raw.length;
97
+ }
98
+ return result;
99
+ }
100
+ }
101
+
102
+ export { FilterListParser };
@@ -0,0 +1,12 @@
1
+ /*
2
+ * AGTree v3.0.0-alpha.2 (build date: Tue, 17 Dec 2024 16:50:04 GMT)
3
+ * (c) 2024 Adguard Software Ltd.
4
+ * Released under the MIT license
5
+ * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
6
+ */
7
+ export { RuleParser } from './rule-parser.js';
8
+ export { defaultParserOptions } from './options.js';
9
+ export { CosmeticRuleParser } from './cosmetic/cosmetic-rule-parser.js';
10
+ export { DomainListParser } from './misc/domain-list-parser.js';
11
+ export { NetworkRuleParser } from './network/network-rule-parser.js';
12
+ export { FilterListParser } from './filterlist-parser.js';
@@ -0,0 +1,45 @@
1
+ /*
2
+ * AGTree v3.0.0-alpha.2 (build date: Tue, 17 Dec 2024 16:50:04 GMT)
3
+ * (c) 2024 Adguard Software Ltd.
4
+ * Released under the MIT license
5
+ * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
6
+ */
7
+ import { PIPE } from '../../utils/constants.js';
8
+ import { ListNodeType, ListItemNodeType } from '../../nodes/index.js';
9
+ import { defaultParserOptions } from '../options.js';
10
+ import { BaseParser } from '../base-parser.js';
11
+ import { ListItemsParser } from './list-items-parser.js';
12
+
13
+ /**
14
+ * `AppListParser` is responsible for parsing an app list.
15
+ *
16
+ * @see {@link https://adguard.app/kb/general/ad-filtering/create-own-filters/#app-modifier}
17
+ */
18
+ class AppListParser extends BaseParser {
19
+ /**
20
+ * Parses an app list which items are separated by `|`,
21
+ * e.g. `Example.exe|com.example.osx`.
22
+ *
23
+ * @param raw Raw input to parse.
24
+ * @param options Global parser options.
25
+ * @param baseOffset Starting offset of the input. Node locations are calculated relative to this offset.
26
+ *
27
+ * @returns App list AST.
28
+ * @throws An {@link AdblockSyntaxError} if the app list is syntactically invalid.
29
+ * @throws An {@link Error} if the options are invalid.
30
+ */
31
+ static parse(raw, options = defaultParserOptions, baseOffset = 0) {
32
+ const result = {
33
+ type: ListNodeType.AppList,
34
+ separator: PIPE,
35
+ children: ListItemsParser.parse(raw, options, baseOffset, PIPE, ListItemNodeType.App),
36
+ };
37
+ if (options.isLocIncluded) {
38
+ result.start = baseOffset;
39
+ result.end = baseOffset + raw.length;
40
+ }
41
+ return result;
42
+ }
43
+ }
44
+
45
+ export { AppListParser };
@@ -0,0 +1,52 @@
1
+ /*
2
+ * AGTree v3.0.0-alpha.2 (build date: Tue, 17 Dec 2024 16:50:04 GMT)
3
+ * (c) 2024 Adguard Software Ltd.
4
+ * Released under the MIT license
5
+ * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
6
+ */
7
+ import { COMMA, PIPE } from '../../utils/constants.js';
8
+ import { ListNodeType, ListItemNodeType } from '../../nodes/index.js';
9
+ import { defaultParserOptions } from '../options.js';
10
+ import { BaseParser } from '../base-parser.js';
11
+ import { ListItemsParser } from './list-items-parser.js';
12
+
13
+ /**
14
+ * `DomainListParser` is responsible for parsing a domain list.
15
+ *
16
+ * @example
17
+ * - If the rule is `example.com,~example.net##.ads`, the domain list is `example.com,~example.net`.
18
+ * - If the rule is `ads.js^$script,domains=example.com|~example.org`, the domain list is `example.com|~example.org`.
19
+ * This parser is responsible for parsing these domain lists.
20
+ * @see {@link https://help.eyeo.com/adblockplus/how-to-write-filters#elemhide_domains}
21
+ */
22
+ class DomainListParser extends BaseParser {
23
+ /**
24
+ * Parses a domain list, eg. `example.com,example.org,~example.org`
25
+ *
26
+ * @param raw Raw input to parse.
27
+ * @param options Global parser options.
28
+ * @param baseOffset Starting offset of the input. Node locations are calculated relative to this offset.
29
+ * @param separator Separator character (default: comma)
30
+ *
31
+ * @returns Domain list AST.
32
+ * @throws An {@link AdblockSyntaxError} if the domain list is syntactically invalid.
33
+ * @throws An {@link Error} if the options are invalid.
34
+ */
35
+ static parse(raw, options = defaultParserOptions, baseOffset = 0, separator = COMMA) {
36
+ if (separator !== COMMA && separator !== PIPE) {
37
+ throw new Error(`Invalid separator: ${separator}`);
38
+ }
39
+ const result = {
40
+ type: ListNodeType.DomainList,
41
+ separator,
42
+ children: ListItemsParser.parse(raw, options, baseOffset, separator, ListItemNodeType.Domain),
43
+ };
44
+ if (options.isLocIncluded) {
45
+ result.start = baseOffset;
46
+ result.end = baseOffset + raw.length;
47
+ }
48
+ return result;
49
+ }
50
+ }
51
+
52
+ export { DomainListParser };