@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,79 @@
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 { RuleConversionError } from '../../../errors/rule-conversion-error.js';
8
+ import { createModifierNode } from '../../../ast-utils/modifiers.js';
9
+ import { RegExpUtils } from '../../../utils/regexp.js';
10
+ import { REGEX_MARKER, OPEN_SQUARE_BRACKET, CLOSE_SQUARE_BRACKET, COMMA, ESCAPE_CHARACTER } from '../../../utils/constants.js';
11
+ import { StringUtils } from '../../../utils/string.js';
12
+ import { MultiValueMap } from '../../../utils/multi-value-map.js';
13
+ import { clone } from '../../../utils/clone.js';
14
+ import { createConversionResult } from '../../base-interfaces/conversion-result.js';
15
+
16
+ /**
17
+ * @file Cosmetic rule modifier converter from uBO to ADG
18
+ */
19
+ const UBO_MATCHES_PATH_OPERATOR = 'matches-path';
20
+ const ADG_PATH_MODIFIER = 'path';
21
+ /**
22
+ * Special characters in modifier regexps that should be escaped
23
+ */
24
+ const SPECIAL_MODIFIER_REGEX_CHARS = new Set([
25
+ OPEN_SQUARE_BRACKET,
26
+ CLOSE_SQUARE_BRACKET,
27
+ COMMA,
28
+ ESCAPE_CHARACTER,
29
+ ]);
30
+ /**
31
+ * Helper class for converting cosmetic rule modifiers from uBO to ADG
32
+ */
33
+ class AdgCosmeticRuleModifierConverter {
34
+ /**
35
+ * Converts a uBO cosmetic rule modifier list to ADG, if possible.
36
+ *
37
+ * @param modifierList Cosmetic rule modifier list node to convert
38
+ * @returns An object which follows the {@link ConversionResult} interface. Its `result` property contains
39
+ * the converted node, and its `isConverted` flag indicates whether the original node was converted.
40
+ * If the node was not converted, the result will contain the original node with the same object reference
41
+ * @throws If the modifier list cannot be converted
42
+ * @see {@link https://github.com/gorhill/uBlock/wiki/Procedural-cosmetic-filters#cosmetic-filter-operators}
43
+ */
44
+ static convertFromUbo(modifierList) {
45
+ const conversionMap = new MultiValueMap();
46
+ modifierList.children.forEach((modifier, index) => {
47
+ // :matches-path
48
+ if (modifier.name.value === UBO_MATCHES_PATH_OPERATOR) {
49
+ if (!modifier.value) {
50
+ throw new RuleConversionError(`'${UBO_MATCHES_PATH_OPERATOR}' operator requires a value`);
51
+ }
52
+ const value = RegExpUtils.isRegexPattern(modifier.value.value)
53
+ ? StringUtils.escapeCharacters(modifier.value.value, SPECIAL_MODIFIER_REGEX_CHARS)
54
+ : modifier.value.value;
55
+ // Convert uBO's `:matches-path(...)` operator to ADG's `$path=...` modifier
56
+ conversionMap.add(index, createModifierNode(ADG_PATH_MODIFIER,
57
+ // We should negate the regexp if the modifier is an exception
58
+ modifier.exception
59
+ // eslint-disable-next-line max-len
60
+ ? `${REGEX_MARKER}${RegExpUtils.negateRegexPattern(RegExpUtils.patternToRegexp(value))}${REGEX_MARKER}`
61
+ : value));
62
+ }
63
+ });
64
+ // Check if we have any converted modifiers
65
+ if (conversionMap.size) {
66
+ const modifierListClone = clone(modifierList);
67
+ // Replace the original modifiers with the converted ones
68
+ modifierListClone.children = modifierListClone.children.map((modifier, index) => {
69
+ const convertedModifier = conversionMap.get(index);
70
+ return convertedModifier ?? modifier;
71
+ }).flat();
72
+ return createConversionResult(modifierListClone, true);
73
+ }
74
+ // Otherwise, just return the original modifier list
75
+ return createConversionResult(modifierList, false);
76
+ }
77
+ }
78
+
79
+ export { AdgCosmeticRuleModifierConverter };
@@ -0,0 +1,354 @@
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 { CosmeticRuleSeparator } from '../../nodes/index.js';
8
+ import { RuleConverterBase } from '../base-interfaces/rule-converter-base.js';
9
+ import { AdblockSyntax } from '../../utils/adblockers.js';
10
+ import { QuoteUtils, QuoteType } from '../../utils/quotes.js';
11
+ import { EMPTY, SPACE } from '../../utils/constants.js';
12
+ import { getScriptletName, setScriptletName, transformAllScriptletArguments, setScriptletQuoteType, transformNthScriptletArgument } from '../../ast-utils/scriptlets.js';
13
+ import { createNodeConversionResult } from '../base-interfaces/conversion-result.js';
14
+ import { cloneScriptletRuleNode, cloneDomainListNode, cloneModifierListNode } from '../../ast-utils/clone.js';
15
+ import '../../compatibility-tables/modifiers.js';
16
+ import '../../compatibility-tables/redirects.js';
17
+ import { scriptletsCompatibilityTable } from '../../compatibility-tables/scriptlets.js';
18
+ import { GenericPlatform } from '../../compatibility-tables/platforms.js';
19
+ import '../../compatibility-tables/schemas/base.js';
20
+ import '../../compatibility-tables/schemas/modifier.js';
21
+ import '../../compatibility-tables/schemas/redirect.js';
22
+ import '../../compatibility-tables/schemas/scriptlet.js';
23
+ import '../../compatibility-tables/schemas/platform.js';
24
+ import '../../compatibility-tables/utils/platform-helpers.js';
25
+ import '../../compatibility-tables/schemas/resource-type.js';
26
+ import '../../compatibility-tables/utils/resource-type-helpers.js';
27
+ import { isUndefined, isNull } from '../../utils/type-guards.js';
28
+
29
+ /**
30
+ * @file Scriptlet injection rule converter
31
+ */
32
+ const ABP_SCRIPTLET_PREFIX = 'abp-';
33
+ const UBO_SCRIPTLET_PREFIX = 'ubo-';
34
+ const UBO_SCRIPTLET_PREFIX_LENGTH = UBO_SCRIPTLET_PREFIX.length;
35
+ const UBO_SCRIPTLET_JS_SUFFIX = '.js';
36
+ const UBO_SCRIPTLET_JS_SUFFIX_LENGTH = UBO_SCRIPTLET_JS_SUFFIX.length;
37
+ const COMMA_SEPARATOR = ',';
38
+ const ADG_SET_CONSTANT_NAME = 'set-constant';
39
+ const ADG_SET_CONSTANT_EMPTY_STRING = '';
40
+ const ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr';
41
+ const ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj';
42
+ const UBO_SET_CONSTANT_EMPTY_STRING = '\'\'';
43
+ const UBO_SET_CONSTANT_EMPTY_ARRAY = '[]';
44
+ const UBO_SET_CONSTANT_EMPTY_OBJECT = '{}';
45
+ const ADG_PREVENT_FETCH_NAME = 'prevent-fetch';
46
+ const ADG_PREVENT_FETCH_EMPTY_STRING = '';
47
+ const ADG_PREVENT_FETCH_WILDCARD = '*';
48
+ const UBO_NO_FETCH_IF_WILDCARD = '/^/';
49
+ const UBO_REMOVE_CLASS_NAME = 'remove-class.js';
50
+ const UBO_REMOVE_ATTR_NAME = 'remove-attr.js';
51
+ const setConstantAdgToUboMap = {
52
+ [ADG_SET_CONSTANT_EMPTY_STRING]: UBO_SET_CONSTANT_EMPTY_STRING,
53
+ [ADG_SET_CONSTANT_EMPTY_ARRAY]: UBO_SET_CONSTANT_EMPTY_ARRAY,
54
+ [ADG_SET_CONSTANT_EMPTY_OBJECT]: UBO_SET_CONSTANT_EMPTY_OBJECT,
55
+ };
56
+ const REMOVE_ATTR_CLASS_APPLYING = new Set([
57
+ 'asap',
58
+ 'stay',
59
+ 'complete',
60
+ ]);
61
+ /**
62
+ * Scriptlet injection rule converter class
63
+ *
64
+ * @todo Implement `convertToUbo` and `convertToAbp`
65
+ */
66
+ class ScriptletRuleConverter extends RuleConverterBase {
67
+ /**
68
+ * Converts a scriptlet injection rule to AdGuard format, if possible.
69
+ *
70
+ * @param rule Rule node to convert
71
+ * @returns An object which follows the {@link NodeConversionResult} interface. Its `result` property contains
72
+ * the array of converted rule nodes, and its `isConverted` flag indicates whether the original rule was converted.
73
+ * If the rule was not converted, the result array will contain the original node with the same object reference
74
+ * @throws If the rule is invalid or cannot be converted
75
+ */
76
+ static convertToAdg(rule) {
77
+ // Ignore AdGuard rules
78
+ if (rule.syntax === AdblockSyntax.Adg) {
79
+ return createNodeConversionResult([rule], false);
80
+ }
81
+ const separator = rule.separator.value;
82
+ let convertedSeparator = separator;
83
+ convertedSeparator = rule.exception
84
+ ? CosmeticRuleSeparator.AdgJsInjectionException
85
+ : CosmeticRuleSeparator.AdgJsInjection;
86
+ const convertedScriptlets = [];
87
+ for (const scriptlet of rule.body.children) {
88
+ // Clone the node to avoid any side effects
89
+ const scriptletClone = cloneScriptletRuleNode(scriptlet);
90
+ // Remove possible quotes just to make it easier to work with the scriptlet name
91
+ const scriptletName = QuoteUtils.setStringQuoteType(getScriptletName(scriptletClone), QuoteType.None);
92
+ // Add prefix if it's not already there
93
+ let prefix;
94
+ // In uBO / ABP syntax, if a parameter contains the separator character, it should be escaped,
95
+ // but during the conversion, we need to unescape them, because AdGuard syntax uses quotes to
96
+ // distinguish between parameters.
97
+ let charToUnescape;
98
+ switch (rule.syntax) {
99
+ case AdblockSyntax.Abp:
100
+ prefix = ABP_SCRIPTLET_PREFIX;
101
+ charToUnescape = SPACE;
102
+ break;
103
+ case AdblockSyntax.Ubo:
104
+ prefix = UBO_SCRIPTLET_PREFIX;
105
+ charToUnescape = COMMA_SEPARATOR;
106
+ break;
107
+ default:
108
+ prefix = EMPTY;
109
+ }
110
+ if (!scriptletName.startsWith(prefix)) {
111
+ setScriptletName(scriptletClone, `${prefix}${scriptletName}`);
112
+ }
113
+ if (!isUndefined(charToUnescape)) {
114
+ transformAllScriptletArguments(scriptletClone, (value) => {
115
+ if (!isNull(value)) {
116
+ return QuoteUtils.unescapeSingleEscapedOccurrences(value, charToUnescape);
117
+ }
118
+ return value;
119
+ });
120
+ }
121
+ if (rule.syntax === AdblockSyntax.Ubo) {
122
+ const scriptletData = scriptletsCompatibilityTable.getFirst(scriptletName, GenericPlatform.UboAny);
123
+ // Some scriptlets have special values that need to be converted
124
+ if (scriptletData
125
+ && (scriptletData.name === UBO_REMOVE_CLASS_NAME
126
+ || scriptletData.name === UBO_REMOVE_ATTR_NAME)
127
+ && scriptletClone.children.length > 2) {
128
+ const selectors = [];
129
+ let applying = null;
130
+ let lastArg = scriptletClone.children.pop();
131
+ // The very last argument might be the 'applying' parameter
132
+ if (lastArg) {
133
+ if (REMOVE_ATTR_CLASS_APPLYING.has(lastArg.value)) {
134
+ applying = lastArg.value;
135
+ }
136
+ else {
137
+ selectors.push(lastArg.value);
138
+ }
139
+ }
140
+ while (scriptletClone.children.length > 2) {
141
+ lastArg = scriptletClone.children.pop();
142
+ if (lastArg) {
143
+ selectors.push(lastArg.value.trim());
144
+ }
145
+ }
146
+ // Set last arg to be the combined selectors (in reverse order, because we popped them)
147
+ if (selectors.length > 0) {
148
+ scriptletClone.children.push({
149
+ type: 'Value',
150
+ value: selectors.reverse().join(', '),
151
+ });
152
+ }
153
+ // Push back the 'applying' parameter if it was found previously
154
+ if (!isNull(applying)) {
155
+ // If we don't have any selectors,
156
+ // we need to add an empty parameter before the 'applying' one
157
+ if (selectors.length === 0) {
158
+ scriptletClone.children.push({
159
+ type: 'Value',
160
+ value: EMPTY,
161
+ });
162
+ }
163
+ scriptletClone.children.push({
164
+ type: 'Value',
165
+ value: applying,
166
+ });
167
+ }
168
+ }
169
+ }
170
+ // ADG scriptlet parameters should be quoted, and single quoted are preferred
171
+ setScriptletQuoteType(scriptletClone, QuoteType.Single);
172
+ convertedScriptlets.push(scriptletClone);
173
+ }
174
+ if (rule.body.children.length === 0) {
175
+ const convertedScriptletNode = {
176
+ category: rule.category,
177
+ type: rule.type,
178
+ syntax: AdblockSyntax.Adg,
179
+ exception: rule.exception,
180
+ domains: cloneDomainListNode(rule.domains),
181
+ separator: {
182
+ type: 'Value',
183
+ value: convertedSeparator,
184
+ },
185
+ body: {
186
+ type: rule.body.type,
187
+ children: [],
188
+ },
189
+ };
190
+ if (rule.modifiers) {
191
+ convertedScriptletNode.modifiers = cloneModifierListNode(rule.modifiers);
192
+ }
193
+ return createNodeConversionResult([convertedScriptletNode], true);
194
+ }
195
+ return createNodeConversionResult(convertedScriptlets.map((scriptlet) => {
196
+ const res = {
197
+ category: rule.category,
198
+ type: rule.type,
199
+ syntax: AdblockSyntax.Adg,
200
+ exception: rule.exception,
201
+ domains: cloneDomainListNode(rule.domains),
202
+ separator: {
203
+ type: 'Value',
204
+ value: convertedSeparator,
205
+ },
206
+ body: {
207
+ type: rule.body.type,
208
+ children: [scriptlet],
209
+ },
210
+ };
211
+ if (rule.modifiers) {
212
+ res.modifiers = cloneModifierListNode(rule.modifiers);
213
+ }
214
+ return res;
215
+ }), true);
216
+ }
217
+ /**
218
+ * Converts a scriptlet injection rule to uBlock format, if possible.
219
+ *
220
+ * @param rule Rule node to convert
221
+ * @returns An object which follows the {@link NodeConversionResult} interface. Its `result` property contains
222
+ * the array of converted rule nodes, and its `isConverted` flag indicates whether the original rule was converted.
223
+ * If the rule was not converted, the result array will contain the original node with the same object reference
224
+ * @throws If the rule is invalid or cannot be converted
225
+ */
226
+ static convertToUbo(rule) {
227
+ // Ignore uBlock rules
228
+ if (rule.syntax === AdblockSyntax.Ubo) {
229
+ return createNodeConversionResult([rule], false);
230
+ }
231
+ const separator = rule.separator.value;
232
+ let convertedSeparator = separator;
233
+ convertedSeparator = rule.exception
234
+ ? CosmeticRuleSeparator.ElementHidingException
235
+ : CosmeticRuleSeparator.ElementHiding;
236
+ const convertedScriptlets = [];
237
+ for (const scriptlet of rule.body.children) {
238
+ // Clone the node to avoid any side effects
239
+ const scriptletClone = cloneScriptletRuleNode(scriptlet);
240
+ // Remove possible quotes just to make it easier to work with the scriptlet name
241
+ const scriptletName = QuoteUtils.setStringQuoteType(getScriptletName(scriptletClone), QuoteType.None);
242
+ let uboScriptletName;
243
+ if (rule.syntax === AdblockSyntax.Adg && scriptletName.startsWith(UBO_SCRIPTLET_PREFIX)) {
244
+ // Special case: AdGuard syntax 'preserves' the original scriptlet name,
245
+ // so we need to convert it back by removing the uBO prefix
246
+ uboScriptletName = scriptletName.slice(UBO_SCRIPTLET_PREFIX_LENGTH);
247
+ }
248
+ else {
249
+ // Otherwise, try to find the corresponding uBO scriptlet name, or use the original one if not found
250
+ const uboScriptlet = scriptletsCompatibilityTable.getFirst(scriptletName, GenericPlatform.UboAny);
251
+ uboScriptletName = uboScriptlet?.name ?? scriptletName;
252
+ }
253
+ // Remove the '.js' suffix if it's there - its presence is not mandatory
254
+ if (uboScriptletName.endsWith(UBO_SCRIPTLET_JS_SUFFIX)) {
255
+ uboScriptletName = uboScriptletName.slice(0, -UBO_SCRIPTLET_JS_SUFFIX_LENGTH);
256
+ }
257
+ setScriptletName(scriptletClone, uboScriptletName);
258
+ setScriptletQuoteType(scriptletClone, QuoteType.None);
259
+ // Escape unescaped commas in parameters, because uBlock Origin uses them as separators.
260
+ // For example, the following AdGuard rule:
261
+ //
262
+ // example.com#%#//scriptlet('spoof-css', '.adsbygoogle, #ads', 'visibility', 'visible')
263
+ //
264
+ // ↓↓ should be converted to ↓↓
265
+ //
266
+ // example.com##+js(spoof-css.js, .adsbygoogle\, #ads, visibility, visible)
267
+ // ------------ ------------------- ---------- -------
268
+ // arg 0 arg 1 arg 2 arg 3
269
+ //
270
+ // and we need to escape the comma in the second argument to prevent it from being treated
271
+ // as two separate arguments.
272
+ transformAllScriptletArguments(scriptletClone, (value) => {
273
+ if (!isNull(value)) {
274
+ return QuoteUtils.escapeUnescapedOccurrences(value, COMMA_SEPARATOR);
275
+ }
276
+ return value;
277
+ });
278
+ // Unescape spaces in parameters, because uBlock Origin doesn't treat them as separators.
279
+ if (rule.syntax === AdblockSyntax.Abp) {
280
+ transformAllScriptletArguments(scriptletClone, (value) => {
281
+ if (!isNull(value)) {
282
+ return QuoteUtils.unescapeSingleEscapedOccurrences(value, SPACE);
283
+ }
284
+ return value;
285
+ });
286
+ }
287
+ // Some scriptlets have special values that need to be converted
288
+ switch (scriptletName) {
289
+ case ADG_SET_CONSTANT_NAME:
290
+ transformNthScriptletArgument(scriptletClone, 2, (value) => {
291
+ if (!isNull(value)) {
292
+ return setConstantAdgToUboMap[value] ?? value;
293
+ }
294
+ return value;
295
+ });
296
+ break;
297
+ case ADG_PREVENT_FETCH_NAME:
298
+ transformNthScriptletArgument(scriptletClone, 1, (value) => {
299
+ if (value === ADG_PREVENT_FETCH_EMPTY_STRING || value === ADG_PREVENT_FETCH_WILDCARD) {
300
+ return UBO_NO_FETCH_IF_WILDCARD;
301
+ }
302
+ return value;
303
+ });
304
+ break;
305
+ }
306
+ convertedScriptlets.push(scriptletClone);
307
+ }
308
+ // TODO: Refactor redundant code
309
+ if (rule.body.children.length === 0) {
310
+ const convertedScriptletNode = {
311
+ category: rule.category,
312
+ type: rule.type,
313
+ syntax: AdblockSyntax.Ubo,
314
+ exception: rule.exception,
315
+ domains: cloneDomainListNode(rule.domains),
316
+ separator: {
317
+ type: 'Value',
318
+ value: convertedSeparator,
319
+ },
320
+ body: {
321
+ type: rule.body.type,
322
+ children: [],
323
+ },
324
+ };
325
+ if (rule.modifiers) {
326
+ convertedScriptletNode.modifiers = cloneModifierListNode(rule.modifiers);
327
+ }
328
+ return createNodeConversionResult([convertedScriptletNode], true);
329
+ }
330
+ return createNodeConversionResult(convertedScriptlets.map((scriptlet) => {
331
+ const res = {
332
+ category: rule.category,
333
+ type: rule.type,
334
+ syntax: AdblockSyntax.Ubo,
335
+ exception: rule.exception,
336
+ domains: cloneDomainListNode(rule.domains),
337
+ separator: {
338
+ type: 'Value',
339
+ value: convertedSeparator,
340
+ },
341
+ body: {
342
+ type: rule.body.type,
343
+ children: [scriptlet],
344
+ },
345
+ };
346
+ if (rule.modifiers) {
347
+ res.modifiers = cloneModifierListNode(rule.modifiers);
348
+ }
349
+ return res;
350
+ }), true);
351
+ }
352
+ }
353
+
354
+ export { ScriptletRuleConverter };
@@ -0,0 +1,188 @@
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 { EQUALS, COLON, CLOSE_PARENTHESIS, OPEN_PARENTHESIS, COMMA, EMPTY } from '../../utils/constants.js';
10
+ import { LEGACY_EXT_CSS_ATTRIBUTE_PREFIX, ABP_EXT_CSS_PREFIX } from '../data/css.js';
11
+ import { BaseConverter } from '../base-interfaces/base-converter.js';
12
+ import { createConversionResult } from '../base-interfaces/conversion-result.js';
13
+ import { CssTokenStream } from '../../parser/css/css-token-stream.js';
14
+
15
+ const ERROR_MESSAGES = {
16
+ // eslint-disable-next-line max-len
17
+ INVALID_ATTRIBUTE_VALUE: `Expected '${getFormattedTokenName(TokenType.Ident)}' or '${getFormattedTokenName(TokenType.String)}' as attribute value, but got '%s' with value '%s`,
18
+ };
19
+ const PseudoClasses = {
20
+ AbpContains: '-abp-contains',
21
+ AbpHas: '-abp-has',
22
+ Contains: 'contains',
23
+ Has: 'has',
24
+ HasText: 'has-text',
25
+ MatchesCss: 'matches-css',
26
+ MatchesCssAfter: 'matches-css-after',
27
+ MatchesCssBefore: 'matches-css-before',
28
+ Not: 'not',
29
+ };
30
+ const PseudoElements = {
31
+ After: 'after',
32
+ Before: 'before',
33
+ };
34
+ const PSEUDO_ELEMENT_NAMES = new Set([
35
+ PseudoElements.After,
36
+ PseudoElements.Before,
37
+ ]);
38
+ /**
39
+ * CSS selector converter
40
+ *
41
+ * @todo Implement `convertToUbo` and `convertToAbp`
42
+ */
43
+ class CssSelectorConverter extends BaseConverter {
44
+ /**
45
+ * Converts Extended CSS elements to AdGuard-compatible ones
46
+ *
47
+ * @param selectorList Selector list to convert
48
+ * @returns An object which follows the {@link ConversionResult} interface. Its `result` property contains
49
+ * the converted node, and its `isConverted` flag indicates whether the original node was converted.
50
+ * If the node was not converted, the result will contain the original node with the same object reference
51
+ * @throws If the rule is invalid or incompatible
52
+ */
53
+ static convertToAdg(selectorList) {
54
+ const stream = selectorList instanceof CssTokenStream
55
+ ? selectorList
56
+ : new CssTokenStream(selectorList);
57
+ const converted = [];
58
+ const convertAndPushPseudo = (pseudo) => {
59
+ switch (pseudo) {
60
+ case PseudoClasses.AbpContains:
61
+ case PseudoClasses.HasText:
62
+ converted.push(PseudoClasses.Contains);
63
+ converted.push(OPEN_PARENTHESIS);
64
+ break;
65
+ case PseudoClasses.AbpHas:
66
+ converted.push(PseudoClasses.Has);
67
+ converted.push(OPEN_PARENTHESIS);
68
+ break;
69
+ // a bit special case:
70
+ // - `:matches-css-before(...)` → `:matches-css(before, ...)`
71
+ // - `:matches-css-after(...)` → `:matches-css(after, ...)`
72
+ case PseudoClasses.MatchesCssBefore:
73
+ case PseudoClasses.MatchesCssAfter:
74
+ converted.push(PseudoClasses.MatchesCss);
75
+ converted.push(OPEN_PARENTHESIS);
76
+ converted.push(pseudo.substring(PseudoClasses.MatchesCss.length + 1));
77
+ converted.push(COMMA);
78
+ break;
79
+ default:
80
+ converted.push(pseudo);
81
+ converted.push(OPEN_PARENTHESIS);
82
+ break;
83
+ }
84
+ };
85
+ while (!stream.isEof()) {
86
+ const token = stream.getOrFail();
87
+ if (token.type === TokenType.Colon) {
88
+ // Advance colon
89
+ stream.advance();
90
+ converted.push(COLON);
91
+ const tempToken = stream.getOrFail();
92
+ // Double colon is a pseudo-element
93
+ if (tempToken.type === TokenType.Colon) {
94
+ stream.advance();
95
+ converted.push(COLON);
96
+ continue;
97
+ }
98
+ if (tempToken.type === TokenType.Ident) {
99
+ const name = stream.source.slice(tempToken.start, tempToken.end);
100
+ if (PSEUDO_ELEMENT_NAMES.has(name)) {
101
+ // Add an extra colon to the name
102
+ converted.push(COLON);
103
+ converted.push(name);
104
+ }
105
+ else {
106
+ // Add the name as is
107
+ converted.push(name);
108
+ }
109
+ // Advance the names
110
+ stream.advance();
111
+ }
112
+ else if (tempToken.type === TokenType.Function) {
113
+ const name = stream.source.slice(tempToken.start, tempToken.end - 1); // omit the last parenthesis
114
+ // :-abp-contains(...) → :contains(...)
115
+ // :has-text(...) → :contains(...)
116
+ // :-abp-has(...) → :has(...)
117
+ convertAndPushPseudo(name);
118
+ // Advance the function name
119
+ stream.advance();
120
+ }
121
+ }
122
+ else if (token.type === TokenType.OpenSquareBracket) {
123
+ let tempToken;
124
+ const { start } = token;
125
+ stream.advance();
126
+ // Converts legacy Extended CSS selectors to the modern Extended CSS syntax.
127
+ // For example:
128
+ // - `[-ext-has=...]` → `:has(...)`
129
+ // - `[-ext-contains=...]` → `:contains(...)`
130
+ // - `[-ext-matches-css-before=...]` → `:matches-css(before, ...)`
131
+ stream.skipWhitespace();
132
+ stream.expect(TokenType.Ident);
133
+ tempToken = stream.getOrFail();
134
+ let attr = stream.source.slice(tempToken.start, tempToken.end);
135
+ // Skip if the attribute name is not a legacy Extended CSS one
136
+ if (!(attr.startsWith(LEGACY_EXT_CSS_ATTRIBUTE_PREFIX) || attr.startsWith(ABP_EXT_CSS_PREFIX))) {
137
+ converted.push(stream.source.slice(start, tempToken.end));
138
+ stream.advance();
139
+ continue;
140
+ }
141
+ if (attr.startsWith(LEGACY_EXT_CSS_ATTRIBUTE_PREFIX)) {
142
+ attr = attr.slice(LEGACY_EXT_CSS_ATTRIBUTE_PREFIX.length);
143
+ }
144
+ stream.advance();
145
+ stream.skipWhitespace();
146
+ // Next token should be an equality operator (=), because Extended CSS attribute selectors
147
+ // do not support other operators
148
+ stream.expect(TokenType.Delim, { value: EQUALS });
149
+ stream.advance();
150
+ // Skip optional whitespace after the operator
151
+ stream.skipWhitespace();
152
+ // Parse attribute value
153
+ tempToken = stream.getOrFail();
154
+ // According to the spec, attribute value should be an identifier or a string
155
+ if (tempToken.type !== TokenType.Ident && tempToken.type !== TokenType.String) {
156
+ throw new Error(sprintf(ERROR_MESSAGES.INVALID_ATTRIBUTE_VALUE, getFormattedTokenName(tempToken.type), stream.source.slice(tempToken.start, tempToken.end)));
157
+ }
158
+ const value = stream.source.slice(tempToken.start, tempToken.end);
159
+ // Advance the attribute value
160
+ stream.advance();
161
+ // Skip optional whitespace after the attribute value
162
+ stream.skipWhitespace();
163
+ // Next character should be a closing square bracket
164
+ // We don't allow flags for Extended CSS attribute selectors
165
+ stream.expect(TokenType.CloseSquareBracket);
166
+ stream.advance();
167
+ converted.push(COLON);
168
+ convertAndPushPseudo(attr);
169
+ let processedValue = value.slice(1, -1); // omit the quotes
170
+ if (attr === PseudoClasses.Has) {
171
+ // TODO: Optimize this to avoid double tokenization
172
+ processedValue = CssSelectorConverter.convertToAdg(processedValue).result;
173
+ }
174
+ converted.push(processedValue);
175
+ converted.push(CLOSE_PARENTHESIS);
176
+ }
177
+ else {
178
+ converted.push(stream.source.slice(token.start, token.end));
179
+ // Advance the token
180
+ stream.advance();
181
+ }
182
+ }
183
+ const convertedSelectorList = converted.join(EMPTY);
184
+ return createConversionResult(convertedSelectorList, stream.source !== convertedSelectorList);
185
+ }
186
+ }
187
+
188
+ export { CssSelectorConverter, ERROR_MESSAGES, PseudoClasses, PseudoElements };