@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,123 @@
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 { RuleConversionError } from '../../errors/rule-conversion-error.js';
10
+ import { RuleCategory, CosmeticRuleType } from '../../nodes/index.js';
11
+ import { RuleConverterBase } from '../base-interfaces/rule-converter-base.js';
12
+ import { createModifierListNode, createModifierNode } from '../../ast-utils/modifiers.js';
13
+ import { UBO_HTML_MASK, EMPTY } from '../../utils/constants.js';
14
+ import { ADBLOCK_URL_START, ADBLOCK_URL_SEPARATOR } from '../../utils/regexp.js';
15
+ import { createNetworkRuleNode } from '../../ast-utils/network-rules.js';
16
+ import { AdblockSyntax } from '../../utils/adblockers.js';
17
+ import { createNodeConversionResult } from '../base-interfaces/conversion-result.js';
18
+ import { CssTokenStream } from '../../parser/css/css-token-stream.js';
19
+
20
+ /**
21
+ * @file Converter for request header removal rules
22
+ */
23
+ const UBO_RESPONSEHEADER_FN = 'responseheader';
24
+ const ADG_REMOVEHEADER_MODIFIER = 'removeheader';
25
+ const ERROR_MESSAGES = {
26
+ EMPTY_PARAMETER: `Empty parameter for '${UBO_RESPONSEHEADER_FN}' function`,
27
+ EXPECTED_END_OF_RULE: "Expected end of rule, but got '%s'",
28
+ MULTIPLE_DOMAINS_NOT_SUPPORTED: 'Multiple domains are not supported yet',
29
+ };
30
+ /**
31
+ * Converter for request header removal rules
32
+ *
33
+ * @todo Implement `convertToUbo` (ABP currently doesn't support header removal rules)
34
+ */
35
+ class HeaderRemovalRuleConverter extends RuleConverterBase {
36
+ /**
37
+ * Converts a header removal rule to AdGuard syntax, if possible.
38
+ *
39
+ * @param rule Rule node to convert
40
+ * @returns An object which follows the {@link NodeConversionResult} interface. Its `result` property contains
41
+ * the array of converted rule nodes, and its `isConverted` flag indicates whether the original rule was converted.
42
+ * If the rule was not converted, the result array will contain the original node with the same object reference
43
+ * @throws If the rule is invalid or cannot be converted
44
+ * @example
45
+ * If the input rule is:
46
+ * ```adblock
47
+ * example.com##^responseheader(header-name)
48
+ * ```
49
+ * The output will be:
50
+ * ```adblock
51
+ * ||example.com^$removeheader=header-name
52
+ * ```
53
+ */
54
+ static convertToAdg(rule) {
55
+ // TODO: Add support for ABP syntax once it starts supporting header removal rules
56
+ // Leave the rule as is if it's not a header removal rule
57
+ if (rule.category !== RuleCategory.Cosmetic || rule.type !== CosmeticRuleType.HtmlFilteringRule) {
58
+ return createNodeConversionResult([rule], false);
59
+ }
60
+ const stream = new CssTokenStream(rule.body.value);
61
+ let token;
62
+ // Skip leading whitespace
63
+ stream.skipWhitespace();
64
+ // Next token should be the `^` followed by a `responseheader` function
65
+ token = stream.get();
66
+ if (!token || token.type !== TokenType.Delim || rule.body.value[token.start] !== UBO_HTML_MASK) {
67
+ return createNodeConversionResult([rule], false);
68
+ }
69
+ stream.advance();
70
+ token = stream.get();
71
+ if (!token) {
72
+ return createNodeConversionResult([rule], false);
73
+ }
74
+ const functionName = rule.body.value.slice(token.start, token.end - 1);
75
+ if (functionName !== UBO_RESPONSEHEADER_FN) {
76
+ return createNodeConversionResult([rule], false);
77
+ }
78
+ // Parse the parameter
79
+ const paramStart = token.end;
80
+ stream.skipUntilBalanced();
81
+ const paramEnd = stream.getOrFail().end;
82
+ const param = rule.body.value.slice(paramStart, paramEnd - 1).trim();
83
+ // Do not allow empty parameter
84
+ if (param.length === 0) {
85
+ throw new RuleConversionError(ERROR_MESSAGES.EMPTY_PARAMETER);
86
+ }
87
+ stream.expect(TokenType.CloseParenthesis);
88
+ stream.advance();
89
+ // Skip trailing whitespace after the function call
90
+ stream.skipWhitespace();
91
+ // Expect the end of the rule - so nothing should be left in the stream
92
+ if (!stream.isEof()) {
93
+ token = stream.getOrFail();
94
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.EXPECTED_END_OF_RULE, getFormattedTokenName(token.type)));
95
+ }
96
+ // Prepare network rule pattern
97
+ const pattern = [];
98
+ if (rule.domains.children.length === 1) {
99
+ // If the rule has only one domain, we can use a simple network rule pattern:
100
+ // ||single-domain-from-the-rule^
101
+ pattern.push(ADBLOCK_URL_START, rule.domains.children[0].value, ADBLOCK_URL_SEPARATOR);
102
+ }
103
+ else if (rule.domains.children.length > 1) {
104
+ // TODO: Add support for multiple domains, for example:
105
+ // example.com,example.org,example.net##^responseheader(header-name)
106
+ // We should consider allowing $domain with $removeheader modifier,
107
+ // for example:
108
+ // $removeheader=header-name,domain=example.com|example.org|example.net
109
+ throw new RuleConversionError(ERROR_MESSAGES.MULTIPLE_DOMAINS_NOT_SUPPORTED);
110
+ }
111
+ // Prepare network rule modifiers
112
+ const modifiers = createModifierListNode();
113
+ modifiers.children.push(createModifierNode(ADG_REMOVEHEADER_MODIFIER, param));
114
+ // Construct the network rule
115
+ return createNodeConversionResult([
116
+ createNetworkRuleNode(pattern.join(EMPTY), modifiers,
117
+ // Copy the exception flag
118
+ rule.exception, AdblockSyntax.Adg),
119
+ ], true);
120
+ }
121
+ }
122
+
123
+ export { ERROR_MESSAGES, HeaderRemovalRuleConverter };
@@ -0,0 +1,379 @@
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 { getFormattedTokenName, TokenType } from '@adguard/css-tokenizer';
8
+ import { sprintf } from 'sprintf-js';
9
+ import { RuleCategory, CosmeticRuleType, CosmeticRuleSeparator } from '../../nodes/index.js';
10
+ import { AdblockSyntax } from '../../utils/adblockers.js';
11
+ import { RuleConversionError } from '../../errors/rule-conversion-error.js';
12
+ import { RuleConverterBase } from '../base-interfaces/rule-converter-base.js';
13
+ import { RegExpUtils } from '../../utils/regexp.js';
14
+ import { createNodeConversionResult } from '../base-interfaces/conversion-result.js';
15
+ import { cloneDomainListNode } from '../../ast-utils/clone.js';
16
+ import { CssTokenStream } from '../../parser/css/css-token-stream.js';
17
+ import { UBO_HTML_MASK, EQUALS, ESCAPE_CHARACTER, EMPTY, OPEN_SQUARE_BRACKET, CLOSE_SQUARE_BRACKET } from '../../utils/constants.js';
18
+ import { StringUtils, DOUBLE_QUOTE_MARKER } from '../../utils/string.js';
19
+
20
+ /**
21
+ * @file HTML filtering rule converter
22
+ */
23
+ /**
24
+ * From the AdGuard docs:
25
+ * Specifies the maximum length for content of HTML element. If this parameter is
26
+ * set and the content length exceeds the value, a rule does not apply to the element.
27
+ * If this parameter is not specified, the max-length is considered to be 8192 (8 KB).
28
+ * When converting from other formats, we set the max-length to 262144 (256 KB).
29
+ *
30
+ * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#html-filtering-rules}
31
+ */
32
+ const ADG_HTML_DEFAULT_MAX_LENGTH = 8192;
33
+ const ADG_HTML_CONVERSION_MAX_LENGTH = ADG_HTML_DEFAULT_MAX_LENGTH * 32;
34
+ const NOT_SPECIFIED = -1;
35
+ const PseudoClasses = {
36
+ Contains: 'contains',
37
+ HasText: 'has-text',
38
+ MinTextLength: 'min-text-length',
39
+ };
40
+ const AttributeSelectors = {
41
+ MaxLength: 'max-length',
42
+ MinLength: 'min-length',
43
+ TagContent: 'tag-content',
44
+ Wildcard: 'wildcard',
45
+ };
46
+ const SUPPORTED_UBO_PSEUDO_CLASSES = new Set([
47
+ PseudoClasses.Contains,
48
+ PseudoClasses.HasText,
49
+ PseudoClasses.MinTextLength,
50
+ ]);
51
+ const ERROR_MESSAGES = {
52
+ ABP_NOT_SUPPORTED: 'Invalid rule, ABP does not support HTML filtering rules',
53
+ TAG_SHOULD_BE_FIRST_CHILD: "Unexpected token '%s' with value '%s', tag selector should be the first child",
54
+ EXPECTED_BUT_GOT_WITH_VALUE: "Expected '%s', but got '%s' with value '%s'",
55
+ INVALID_ATTRIBUTE_NAME: "Attribute name should be an identifier, but got '%s' with value '%s'",
56
+ // eslint-disable-next-line max-len
57
+ INVALID_ATTRIBUTE_VALUE: `Expected '${getFormattedTokenName(TokenType.Ident)}' or '${getFormattedTokenName(TokenType.String)}' as attribute value, but got '%s' with value '%s`,
58
+ INVALID_FLAG: "Unsupported attribute selector flag '%s'",
59
+ INVALID_OPERATOR_FOR_ATTR: "Unsupported operator '%s' for '%s' attribute",
60
+ VALUE_FOR_ATTR_SHOULD_BE_INT: "Value for '%s' attribute should be an integer, but got '%s'",
61
+ INVALID_PSEUDO_CLASS: "Unsupported pseudo class '%s'",
62
+ VALUE_FOR_PSEUDO_CLASS_SHOULD_BE_INT: "Value for '%s' pseudo class should be an integer, but got '%s'",
63
+ // eslint-disable-next-line max-len
64
+ REGEXP_NOT_SUPPORTED: "Cannot convert RegExp parameter '%s' from '%s' pseudo class, because converting RegExp patterns are not supported yet",
65
+ ATTRIBUTE_SELECTOR_REQUIRES_VALUE: "Attribute selector '%s' requires a value",
66
+ INVALID_ATTRIBUTE_SELECTOR_OPERATOR: "Unsupported attribute selector operator '%s'",
67
+ VALUE_SHOULD_BE_SPECIFIED: 'Value should be specified if operator is specified',
68
+ OPERATOR_SHOULD_BE_SPECIFIED: 'Operator should be specified if value is specified',
69
+ UNEXPECTED_TOKEN_WITH_VALUE: "Unexpected token '%s' with value '%s'",
70
+ FLAGS_NOT_SUPPORTED: 'Flags are not supported for attribute selectors',
71
+ };
72
+ /**
73
+ * Convert `""` to `\"` within strings, because it does not compatible with the standard CSS syntax.
74
+ *
75
+ * @param selector CSS selector string
76
+ * @returns Escaped CSS selector
77
+ * @note In the legacy syntax, `""` is used to escape double quotes, but it cannot be used in the standard CSS syntax,
78
+ * so we use conversion functions to handle this.
79
+ * @see {@link https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#tag-content}
80
+ */
81
+ function escapeDoubleQuotes(selector) {
82
+ let withinString = false;
83
+ const buffer = [];
84
+ for (let i = 0; i < selector.length; i += 1) {
85
+ if (!withinString && selector[i] === DOUBLE_QUOTE_MARKER) {
86
+ withinString = true;
87
+ buffer.push(selector[i]);
88
+ }
89
+ else if (withinString && selector[i] === DOUBLE_QUOTE_MARKER && selector[i + 1] === DOUBLE_QUOTE_MARKER) {
90
+ buffer.push(ESCAPE_CHARACTER);
91
+ buffer.push(DOUBLE_QUOTE_MARKER);
92
+ i += 1;
93
+ }
94
+ else if (withinString && selector[i] === DOUBLE_QUOTE_MARKER && selector[i + 1] !== DOUBLE_QUOTE_MARKER) {
95
+ buffer.push(DOUBLE_QUOTE_MARKER);
96
+ withinString = false;
97
+ }
98
+ else {
99
+ buffer.push(selector[i]);
100
+ }
101
+ }
102
+ return buffer.join(EMPTY);
103
+ }
104
+ /**
105
+ * Convert escaped double quotes `\"` to `""` within strings.
106
+ *
107
+ * @param selector CSS selector string
108
+ * @returns Unescaped CSS selector
109
+ * @note In the legacy syntax, `""` is used to escape double quotes, but it cannot be used in the standard CSS syntax,
110
+ * so we use conversion functions to handle this.
111
+ * @see {@link https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#tag-content}
112
+ */
113
+ function unescapeDoubleQuotes(selector) {
114
+ let withinString = false;
115
+ const buffer = [];
116
+ for (let i = 0; i < selector.length; i += 1) {
117
+ if (selector[i] === DOUBLE_QUOTE_MARKER && selector[i - 1] !== ESCAPE_CHARACTER) {
118
+ withinString = !withinString;
119
+ buffer.push(selector[i]);
120
+ }
121
+ else if (withinString && selector[i] === ESCAPE_CHARACTER && selector[i + 1] === DOUBLE_QUOTE_MARKER) {
122
+ buffer.push(DOUBLE_QUOTE_MARKER);
123
+ }
124
+ else {
125
+ buffer.push(selector[i]);
126
+ }
127
+ }
128
+ return buffer.join(EMPTY);
129
+ }
130
+ /**
131
+ * Helper function to render an attribute selector
132
+ *
133
+ * @param attr Attribute name
134
+ * @param op Operator (optional)
135
+ * @param value Attribute value (optional)
136
+ * @param flags Attribute flags (optional)
137
+ * @returns Rendered attribute selector string
138
+ */
139
+ function renderAttrSelector(attr, op, value, flags) {
140
+ const result = [];
141
+ result.push(OPEN_SQUARE_BRACKET);
142
+ result.push(attr);
143
+ {
144
+ if (value === undefined) {
145
+ throw new Error(ERROR_MESSAGES.VALUE_SHOULD_BE_SPECIFIED);
146
+ }
147
+ result.push(op);
148
+ }
149
+ if (value !== undefined) {
150
+ result.push(DOUBLE_QUOTE_MARKER);
151
+ result.push(value);
152
+ result.push(DOUBLE_QUOTE_MARKER);
153
+ }
154
+ result.push(CLOSE_SQUARE_BRACKET);
155
+ return result.join(EMPTY);
156
+ }
157
+ /**
158
+ * HTML filtering rule converter class
159
+ *
160
+ * @todo Implement `convertToUbo` (ABP currently doesn't support HTML filtering rules)
161
+ */
162
+ class HtmlRuleConverter extends RuleConverterBase {
163
+ /**
164
+ * Converts a HTML rule to AdGuard syntax, if possible. Also can be used to convert
165
+ * AdGuard rules to AdGuard syntax to validate them.
166
+ *
167
+ * _Note:_ uBlock Origin supports multiple selectors within a single rule, but AdGuard doesn't,
168
+ * so the following rule
169
+ * ```
170
+ * example.com##^div[attr1="value1"][attr2="value2"], script:has-text(value)
171
+ * ```
172
+ * will be converted to multiple AdGuard rules:
173
+ * ```
174
+ * example.com$$div[attr1="value1"][attr2="value2"][max-length="262144"]
175
+ * example.com$$script[tag-content="value"][max-length="262144"]
176
+ * ```
177
+ *
178
+ * @param rule Rule node to convert
179
+ * @returns An object which follows the {@link NodeConversionResult} interface. Its `result` property contains
180
+ * the array of converted rule nodes, and its `isConverted` flag indicates whether the original rule was converted.
181
+ * If the rule was not converted, the result array will contain the original node with the same object reference
182
+ * @throws If the rule is invalid or cannot be converted
183
+ */
184
+ static convertToAdg(rule) {
185
+ // Ignore AdGuard rules
186
+ if (rule.syntax === AdblockSyntax.Adg) {
187
+ return createNodeConversionResult([rule], false);
188
+ }
189
+ if (rule.syntax === AdblockSyntax.Abp) {
190
+ throw new RuleConversionError(ERROR_MESSAGES.ABP_NOT_SUPPORTED);
191
+ }
192
+ const source = escapeDoubleQuotes(rule.body.value);
193
+ const stream = new CssTokenStream(source);
194
+ const convertedSelector = [];
195
+ const convertedSelectorList = [];
196
+ let minLen = NOT_SPECIFIED;
197
+ let maxLen = NOT_SPECIFIED;
198
+ // Skip leading whitespace
199
+ stream.skipWhitespace();
200
+ // Skip ^
201
+ stream.expect(TokenType.Delim, { value: UBO_HTML_MASK });
202
+ stream.advance();
203
+ while (!stream.isEof()) {
204
+ const token = stream.getOrFail();
205
+ if (token.type === TokenType.Ident) {
206
+ // Tag selector should be the first child, if present, but whitespace is allowed before it
207
+ if (convertedSelector.length !== 0 && stream.lookbehindForNonWs() !== undefined) {
208
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.TAG_SHOULD_BE_FIRST_CHILD, getFormattedTokenName(token.type), source.slice(token.start, token.end)));
209
+ }
210
+ convertedSelector.push(source.slice(token.start, token.end));
211
+ stream.advance();
212
+ }
213
+ else if (token.type === TokenType.OpenSquareBracket) {
214
+ // Attribute selectors: https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors#syntax
215
+ const { start } = token;
216
+ let tempToken;
217
+ // Advance opening square bracket
218
+ stream.advance();
219
+ // Skip optional whitespace after the opening square bracket
220
+ stream.skipWhitespace();
221
+ // Parse attribute name
222
+ tempToken = stream.getOrFail();
223
+ if (tempToken.type !== TokenType.Ident) {
224
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.INVALID_ATTRIBUTE_NAME, getFormattedTokenName(tempToken.type), source.slice(tempToken.start, tempToken.end)));
225
+ }
226
+ const attr = source.slice(tempToken.start, tempToken.end);
227
+ stream.advance();
228
+ // Skip optional whitespace after the attribute name
229
+ stream.skipWhitespace();
230
+ // Maybe attribute selector ends here, because value is not required, like in '[disabled]'
231
+ tempToken = stream.getOrFail();
232
+ // So check if the next non whitespace token is a closing square bracket
233
+ if (tempToken.type === TokenType.CloseSquareBracket) {
234
+ const { end } = tempToken;
235
+ stream.advance();
236
+ // Special case for min-length and max-length attributes
237
+ if (attr === AttributeSelectors.MinLength || attr === AttributeSelectors.MaxLength) {
238
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.ATTRIBUTE_SELECTOR_REQUIRES_VALUE, attr));
239
+ }
240
+ convertedSelector.push(source.slice(start, end));
241
+ continue;
242
+ }
243
+ // Next token should be a valid attribute selector operator
244
+ // Only '=' operator is supported
245
+ stream.expect(TokenType.Delim, { value: EQUALS });
246
+ // Advance the operator
247
+ stream.advance();
248
+ // Skip optional whitespace after the operator
249
+ stream.skipWhitespace();
250
+ // Parse attribute value
251
+ tempToken = stream.getOrFail();
252
+ // According to the spec, attribute value should be an identifier or a string
253
+ if (tempToken.type !== TokenType.Ident && tempToken.type !== TokenType.String) {
254
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.INVALID_ATTRIBUTE_VALUE, getFormattedTokenName(tempToken.type), source.slice(tempToken.start, tempToken.end)));
255
+ }
256
+ const value = source.slice(tempToken.start, tempToken.end);
257
+ // Advance the attribute value
258
+ stream.advance();
259
+ // Skip optional whitespace after the attribute value
260
+ stream.skipWhitespace();
261
+ // Attribute selector may have flags - but AdGuard HTML filtering does not support them
262
+ tempToken = stream.getOrFail();
263
+ if (tempToken.type === TokenType.Ident) {
264
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.FLAGS_NOT_SUPPORTED));
265
+ }
266
+ // Next token should be a closing square bracket
267
+ stream.expect(TokenType.CloseSquareBracket);
268
+ const { end } = stream.getOrFail();
269
+ stream.advance();
270
+ if (attr === AttributeSelectors.MinLength) {
271
+ // Min length attribute
272
+ const parsed = parseInt(value, 10);
273
+ if (Number.isNaN(parsed)) {
274
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.VALUE_FOR_ATTR_SHOULD_BE_INT, attr, value));
275
+ }
276
+ minLen = parsed;
277
+ }
278
+ else if (attr === AttributeSelectors.MaxLength) {
279
+ // Max length attribute
280
+ const parsed = parseInt(value, 10);
281
+ if (Number.isNaN(parsed)) {
282
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.VALUE_FOR_ATTR_SHOULD_BE_INT, attr, value));
283
+ }
284
+ maxLen = parsed;
285
+ }
286
+ else {
287
+ convertedSelector.push(source.slice(start, end));
288
+ }
289
+ }
290
+ else if (token.type === TokenType.Colon) {
291
+ let tempToken;
292
+ // Pseudo classes: https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes#syntax
293
+ stream.advance();
294
+ // Next token should be a pseudo class name
295
+ stream.expect(TokenType.Function);
296
+ tempToken = stream.getOrFail();
297
+ const fn = source.slice(tempToken.start, tempToken.end - 1); // do not include '('
298
+ // Pseudo class should be supported
299
+ if (!SUPPORTED_UBO_PSEUDO_CLASSES.has(fn)) {
300
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.INVALID_PSEUDO_CLASS, fn));
301
+ }
302
+ const paramStart = tempToken.end;
303
+ // Find the closing paren
304
+ stream.skipUntilBalanced();
305
+ tempToken = stream.getOrFail();
306
+ const paramEnd = tempToken.end;
307
+ // Get the parameter
308
+ const param = source.slice(paramStart, paramEnd - 1);
309
+ if (fn === PseudoClasses.MinTextLength) {
310
+ // Min text length pseudo class
311
+ // Parameter should be parsed as an integer
312
+ const parsed = parseInt(param, 10);
313
+ if (Number.isNaN(parsed)) {
314
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.VALUE_FOR_PSEUDO_CLASS_SHOULD_BE_INT, fn, param));
315
+ }
316
+ minLen = parsed;
317
+ }
318
+ else if (fn === PseudoClasses.Contains || fn === PseudoClasses.HasText) {
319
+ // Contains and has-text pseudo classes
320
+ // Check if the argument is a RegExp
321
+ if (RegExpUtils.isRegexPattern(param)) {
322
+ // TODO: Add some support for RegExp patterns later
323
+ // Need to find a way to convert some RegExp patterns to glob patterns
324
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.REGEXP_NOT_SUPPORTED, param, fn));
325
+ }
326
+ // Escape unescaped double quotes in the parameter
327
+ const paramEscaped = StringUtils.escapeCharacter(param, DOUBLE_QUOTE_MARKER);
328
+ convertedSelector.push(renderAttrSelector(AttributeSelectors.TagContent, EQUALS, paramEscaped));
329
+ }
330
+ stream.advance();
331
+ }
332
+ else if (token.type === TokenType.Comma && token.balance === 0) {
333
+ if (minLen !== NOT_SPECIFIED) {
334
+ convertedSelector.push(renderAttrSelector(AttributeSelectors.MinLength, EQUALS, minLen.toString()));
335
+ }
336
+ convertedSelector.push(renderAttrSelector(AttributeSelectors.MaxLength, EQUALS, maxLen !== NOT_SPECIFIED ? maxLen.toString() : ADG_HTML_CONVERSION_MAX_LENGTH.toString()));
337
+ convertedSelectorList.push(convertedSelector.join(EMPTY));
338
+ convertedSelector.length = 0;
339
+ stream.advance();
340
+ }
341
+ else if (token.type === TokenType.Whitespace) {
342
+ stream.advance();
343
+ }
344
+ else {
345
+ throw new RuleConversionError(sprintf(ERROR_MESSAGES.UNEXPECTED_TOKEN_WITH_VALUE, getFormattedTokenName(token.type), source.slice(token.start, token.end)));
346
+ }
347
+ }
348
+ if (convertedSelector.length !== 0) {
349
+ if (minLen !== NOT_SPECIFIED) {
350
+ convertedSelector.push(renderAttrSelector(AttributeSelectors.MinLength, EQUALS, minLen.toString()));
351
+ }
352
+ convertedSelector.push(renderAttrSelector(AttributeSelectors.MaxLength, EQUALS, maxLen !== NOT_SPECIFIED ? maxLen.toString() : ADG_HTML_CONVERSION_MAX_LENGTH.toString()));
353
+ convertedSelectorList.push(convertedSelector.join(EMPTY));
354
+ }
355
+ return createNodeConversionResult(
356
+ // Since AdGuard HTML filtering rules do not support multiple selectors, we need to split each selector
357
+ // into a separate rule node.
358
+ convertedSelectorList.map((selector) => ({
359
+ category: RuleCategory.Cosmetic,
360
+ type: CosmeticRuleType.HtmlFilteringRule,
361
+ syntax: AdblockSyntax.Adg,
362
+ exception: rule.exception,
363
+ domains: cloneDomainListNode(rule.domains),
364
+ // Convert the separator based on the exception status
365
+ separator: {
366
+ type: 'Value',
367
+ value: rule.exception
368
+ ? CosmeticRuleSeparator.AdgHtmlFilteringException
369
+ : CosmeticRuleSeparator.AdgHtmlFiltering,
370
+ },
371
+ body: {
372
+ type: 'Value',
373
+ value: unescapeDoubleQuotes(selector),
374
+ },
375
+ })), true);
376
+ }
377
+ }
378
+
379
+ export { ERROR_MESSAGES, HtmlRuleConverter };
@@ -0,0 +1,118 @@
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 { CosmeticRuleType, RuleCategory } from '../../nodes/index.js';
8
+ import { AdblockSyntax } from '../../utils/adblockers.js';
9
+ import { HtmlRuleConverter } from './html.js';
10
+ import { ScriptletRuleConverter } from './scriptlet.js';
11
+ import { RuleConversionError } from '../../errors/rule-conversion-error.js';
12
+ import { RuleConverterBase } from '../base-interfaces/rule-converter-base.js';
13
+ import { AdgCosmeticRuleModifierConverter } from './rule-modifiers/adg.js';
14
+ import { CssInjectionRuleConverter } from './css.js';
15
+ import { ElementHidingRuleConverter } from './element-hiding.js';
16
+ import { HeaderRemovalRuleConverter } from './header-removal.js';
17
+ import { createNodeConversionResult } from '../base-interfaces/conversion-result.js';
18
+
19
+ /**
20
+ * @file Cosmetic rule converter
21
+ */
22
+ /**
23
+ * Cosmetic rule converter class (also known as "non-basic rule converter")
24
+ *
25
+ * @todo Implement `convertToUbo` and `convertToAbp`
26
+ */
27
+ class CosmeticRuleConverter extends RuleConverterBase {
28
+ /**
29
+ * Converts a cosmetic rule to AdGuard syntax, if possible.
30
+ *
31
+ * @param rule Rule node to convert
32
+ * @returns An object which follows the {@link NodeConversionResult} interface. Its `result` property contains
33
+ * the array of converted rule nodes, and its `isConverted` flag indicates whether the original rule was converted.
34
+ * If the rule was not converted, the result array will contain the original node with the same object reference
35
+ * @throws If the rule is invalid or cannot be converted
36
+ */
37
+ static convertToAdg(rule) {
38
+ let subconverterResult;
39
+ // Convert cosmetic rule based on its type
40
+ switch (rule.type) {
41
+ case CosmeticRuleType.ElementHidingRule:
42
+ subconverterResult = ElementHidingRuleConverter.convertToAdg(rule);
43
+ break;
44
+ case CosmeticRuleType.ScriptletInjectionRule:
45
+ subconverterResult = ScriptletRuleConverter.convertToAdg(rule);
46
+ break;
47
+ case CosmeticRuleType.CssInjectionRule:
48
+ subconverterResult = CssInjectionRuleConverter.convertToAdg(rule);
49
+ break;
50
+ case CosmeticRuleType.HtmlFilteringRule:
51
+ // Handle special case: uBO response header filtering rule
52
+ // TODO: Optimize double CSS tokenization here
53
+ subconverterResult = HeaderRemovalRuleConverter.convertToAdg(rule);
54
+ if (subconverterResult.isConverted) {
55
+ break;
56
+ }
57
+ subconverterResult = HtmlRuleConverter.convertToAdg(rule);
58
+ break;
59
+ // Note: Currently, only ADG supports JS injection rules, so we don't need to convert them
60
+ case CosmeticRuleType.JsInjectionRule:
61
+ subconverterResult = createNodeConversionResult([rule], false);
62
+ break;
63
+ default:
64
+ throw new RuleConversionError('Unsupported cosmetic rule type');
65
+ }
66
+ let convertedModifiers;
67
+ // Convert cosmetic rule modifiers, if any
68
+ if (rule.modifiers) {
69
+ if (rule.syntax === AdblockSyntax.Ubo) {
70
+ // uBO doesn't support this rule:
71
+ // example.com##+js(set-constant.js, foo, bar):matches-path(/baz)
72
+ if (rule.type === CosmeticRuleType.ScriptletInjectionRule) {
73
+ throw new RuleConversionError('uBO scriptlet injection rules don\'t support cosmetic rule modifiers');
74
+ }
75
+ convertedModifiers = AdgCosmeticRuleModifierConverter.convertFromUbo(rule.modifiers);
76
+ }
77
+ else if (rule.syntax === AdblockSyntax.Abp) {
78
+ // TODO: Implement once ABP starts supporting cosmetic rule modifiers
79
+ throw new RuleConversionError('ABP don\'t support cosmetic rule modifiers');
80
+ }
81
+ }
82
+ if ((subconverterResult.result.length > 1 || subconverterResult.isConverted)
83
+ || (convertedModifiers && convertedModifiers.isConverted)) {
84
+ // Add modifier list to the subconverter result rules
85
+ subconverterResult.result.forEach((subconverterRule) => {
86
+ if (convertedModifiers && subconverterRule.category === RuleCategory.Cosmetic) {
87
+ // eslint-disable-next-line no-param-reassign
88
+ subconverterRule.modifiers = convertedModifiers.result;
89
+ }
90
+ });
91
+ return subconverterResult;
92
+ }
93
+ return createNodeConversionResult([rule], false);
94
+ }
95
+ /**
96
+ * Converts a cosmetic rule to uBlock Origin syntax, if possible.
97
+ *
98
+ * @param rule Rule node to convert
99
+ * @returns An object which follows the {@link NodeConversionResult} interface. Its `result` property contains
100
+ * the array of converted rule nodes, and its `isConverted` flag indicates whether the original rule was converted.
101
+ * If the rule was not converted, the result array will contain the original node with the same object reference
102
+ * @throws If the rule is invalid or cannot be converted
103
+ */
104
+ // TODO: Add support for other cosmetic rule types
105
+ static convertToUbo(rule) {
106
+ // Convert cosmetic rule based on its type
107
+ if (rule.type === CosmeticRuleType.ScriptletInjectionRule) {
108
+ if (rule.syntax === AdblockSyntax.Adg && rule.modifiers?.children.length) {
109
+ // e.g. example.com##+js(set-constant.js, foo, bar):matches-path(/baz)
110
+ throw new RuleConversionError('uBO scriptlet injection rules do not support cosmetic rule modifiers');
111
+ }
112
+ return ScriptletRuleConverter.convertToUbo(rule);
113
+ }
114
+ return createNodeConversionResult([rule], false);
115
+ }
116
+ }
117
+
118
+ export { CosmeticRuleConverter };