@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,126 @@
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
+ /**
8
+ * @file Known CSS elements and attributes.
9
+ * TODO: Implement a compatibility table for Extended CSS
10
+ */
11
+ /**
12
+ * Legacy Extended CSS attribute prefix.
13
+ *
14
+ * @example
15
+ * ```css
16
+ * [-ext-<name>=...]
17
+ * ```
18
+ */
19
+ const LEGACY_EXT_CSS_ATTRIBUTE_PREFIX = '-ext-';
20
+ /**
21
+ * ABP Extended CSS prefix.
22
+ *
23
+ * @example
24
+ * ```css
25
+ * [-abp-<name>=...]
26
+ * -abp-<name>(...)
27
+ * ```
28
+ */
29
+ const ABP_EXT_CSS_PREFIX = '-abp';
30
+ /**
31
+ * Known _strict_ Extended CSS pseudo-classes. Please, keep this list sorted.
32
+ * Strict means that these pseudo-classes are not supported by any browser natively,
33
+ * and they always require Extended CSS libraries to work.
34
+ */
35
+ const EXT_CSS_PSEUDO_CLASSES_STRICT = new Set([
36
+ // AdGuard
37
+ // https://github.com/AdguardTeam/ExtendedCss
38
+ 'contains',
39
+ 'if-not',
40
+ 'matches-attr',
41
+ 'matches-css',
42
+ 'matches-property',
43
+ 'nth-ancestor',
44
+ 'remove',
45
+ 'upward',
46
+ 'xpath',
47
+ // uBlock Origin
48
+ // https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#procedural-cosmetic-filters
49
+ 'has-text',
50
+ 'matches-css-after',
51
+ 'matches-css-before',
52
+ 'matches-path',
53
+ 'min-text-length',
54
+ 'watch-attr',
55
+ // Adblock Plus
56
+ // https://help.eyeo.com/adblockplus/how-to-write-filters#elemhide-emulation
57
+ '-abp-contains',
58
+ '-abp-has',
59
+ '-abp-properties',
60
+ ]);
61
+ /**
62
+ * _ALL_ known Extended CSS pseudo-classes. Please, keep this list sorted.
63
+ * It includes strict pseudo-classes and additional pseudo-classes that may be
64
+ * supported by some browsers natively.
65
+ */
66
+ const EXT_CSS_PSEUDO_CLASSES = new Set([
67
+ ...EXT_CSS_PSEUDO_CLASSES_STRICT,
68
+ /**
69
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/:has
70
+ */
71
+ 'has',
72
+ /**
73
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/:is
74
+ */
75
+ 'is',
76
+ ]);
77
+ /**
78
+ * Known legacy Extended CSS attributes. These attributes are deprecated and
79
+ * should be replaced with the corresponding pseudo-classes. In a long term,
80
+ * these attributes will be COMPLETELY removed from the Extended CSS syntax.
81
+ *
82
+ * Please, keep this list sorted.
83
+ */
84
+ const EXT_CSS_LEGACY_ATTRIBUTES = new Set([
85
+ // AdGuard
86
+ '-ext-contains',
87
+ '-ext-has',
88
+ '-ext-if-not',
89
+ '-ext-is',
90
+ '-ext-matches-attr',
91
+ '-ext-matches-css',
92
+ '-ext-matches-property',
93
+ '-ext-nth-ancestor',
94
+ '-ext-remove',
95
+ '-ext-upward',
96
+ '-ext-xpath',
97
+ // uBlock Origin
98
+ '-ext-has-text',
99
+ '-ext-matches-css-after',
100
+ '-ext-matches-css-before',
101
+ '-ext-matches-path',
102
+ '-ext-min-text-length',
103
+ '-ext-watch-attr',
104
+ // Adblock Plus
105
+ '-ext-abp-contains',
106
+ '-ext-abp-has',
107
+ '-ext-abp-properties',
108
+ ]);
109
+ /**
110
+ * Known CSS functions that aren't allowed in CSS injection rules, because they
111
+ * able to load external resources. Please, keep this list sorted.
112
+ */
113
+ const FORBIDDEN_CSS_FUNCTIONS = new Set([
114
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/cross-fade
115
+ '-webkit-cross-fade',
116
+ 'cross-fade',
117
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/image
118
+ 'image',
119
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/image-set
120
+ '-webkit-image-set',
121
+ 'image-set',
122
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/url
123
+ 'url',
124
+ ]);
125
+
126
+ export { ABP_EXT_CSS_PREFIX, EXT_CSS_LEGACY_ATTRIBUTES, EXT_CSS_PSEUDO_CLASSES, EXT_CSS_PSEUDO_CLASSES_STRICT, FORBIDDEN_CSS_FUNCTIONS, LEGACY_EXT_CSS_ATTRIBUTE_PREFIX };
@@ -0,0 +1,88 @@
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 { RuleConverter } from './rule.js';
8
+ import { clone } from '../utils/clone.js';
9
+ import { MultiValueMap } from '../utils/multi-value-map.js';
10
+ import { createConversionResult } from './base-interfaces/conversion-result.js';
11
+ import { BaseConverter } from './base-interfaces/base-converter.js';
12
+
13
+ /**
14
+ * @file Adblock filter list converter
15
+ */
16
+ /**
17
+ * Adblock filter list converter class
18
+ *
19
+ * This class just provides an extra layer on top of the {@link RuleConverter}
20
+ * and can be used to convert entire filter lists.
21
+ *
22
+ * @todo Implement `convertToUbo` and `convertToAbp`
23
+ * @todo Implement tolerant mode, which will allow to convert a filter list
24
+ * even if some of its rules are invalid
25
+ */
26
+ class FilterListConverter extends BaseConverter {
27
+ /**
28
+ * Converts an adblock filter list to AdGuard format, if possible.
29
+ *
30
+ * @param filterListNode Filter list node to convert
31
+ * @param tolerant Indicates whether the converter should be tolerant to invalid rules. If enabled and a rule is
32
+ * invalid, it will be left as is. If disabled and a rule is invalid, the whole filter list will be failed.
33
+ * Defaults to `true`.
34
+ * @returns An object which follows the {@link ConversionResult} interface. Its `result` property contains
35
+ * the converted node, and its `isConverted` flag indicates whether the original node was converted.
36
+ * If the node was not converted, the result will contain the original node with the same object reference
37
+ * @throws If the filter list is invalid or cannot be converted (if the tolerant mode is disabled)
38
+ */
39
+ static convertToAdg(filterListNode, tolerant = true) {
40
+ // Prepare a map to store the converted rules by their index in the filter list
41
+ const conversionMap = new MultiValueMap();
42
+ // Iterate over the filtering rules and convert them one by one, then add them to the result (one conversion may
43
+ // result in multiple rules)
44
+ for (let i = 0; i < filterListNode.children.length; i += 1) {
45
+ try {
46
+ const convertedRules = RuleConverter.convertToAdg(filterListNode.children[i]);
47
+ // Add the converted rules to the map if they were converted
48
+ if (convertedRules.isConverted) {
49
+ conversionMap.add(i, ...convertedRules.result);
50
+ }
51
+ }
52
+ catch (error) {
53
+ // If the tolerant mode is disabled, we should throw an error, this will fail the whole filter list
54
+ // conversion.
55
+ // Otherwise, we just ignore the error and leave the rule as is
56
+ if (!tolerant) {
57
+ throw error;
58
+ }
59
+ }
60
+ }
61
+ // If the conversion map is empty, it means that no rules were converted, so we can return the original filter
62
+ // list
63
+ if (conversionMap.size === 0) {
64
+ return createConversionResult(filterListNode, false);
65
+ }
66
+ // Otherwise, create a new filter list node with the converted rules
67
+ const convertedFilterList = {
68
+ type: 'FilterList',
69
+ children: [],
70
+ };
71
+ // Iterate over the original rules again and add them to the converted filter list, replacing the converted
72
+ // rules with the new ones at the specified indexes
73
+ for (let i = 0; i < filterListNode.children.length; i += 1) {
74
+ const rules = conversionMap.get(i);
75
+ if (rules) {
76
+ convertedFilterList.children.push(...rules);
77
+ }
78
+ else {
79
+ // We clone the unconverted rules to avoid mutating the original filter list if we return the converted
80
+ // one
81
+ convertedFilterList.children.push(clone(filterListNode.children[i]));
82
+ }
83
+ }
84
+ return createConversionResult(convertedFilterList, true);
85
+ }
86
+ }
87
+
88
+ export { FilterListConverter };
@@ -0,0 +1,8 @@
1
+ /*
2
+ * AGTree v3.0.0-alpha.2 (build date: Tue, 17 Dec 2024 16:50:04 GMT)
3
+ * (c) 2024 Adguard Software Ltd.
4
+ * Released under the MIT license
5
+ * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
6
+ */
7
+ export { RawFilterListConverter } from './raw-filter-list.js';
8
+ export { RuleConverter } from './rule.js';
@@ -0,0 +1,311 @@
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 { SEMICOLON, SPACE } from '../../utils/constants.js';
8
+ import { createModifierNode } from '../../ast-utils/modifiers.js';
9
+ import { BaseConverter } from '../base-interfaces/base-converter.js';
10
+ import { RuleConversionError } from '../../errors/rule-conversion-error.js';
11
+ import { MultiValueMap } from '../../utils/multi-value-map.js';
12
+ import { createConversionResult } from '../base-interfaces/conversion-result.js';
13
+ import { cloneModifierListNode } from '../../ast-utils/clone.js';
14
+ import { modifiersCompatibilityTable } from '../../compatibility-tables/modifiers.js';
15
+ import { redirectsCompatibilityTable } from '../../compatibility-tables/redirects.js';
16
+ import '../../compatibility-tables/scriptlets.js';
17
+ import { GenericPlatform } from '../../compatibility-tables/platforms.js';
18
+ import '../../compatibility-tables/schemas/base.js';
19
+ import '../../compatibility-tables/schemas/modifier.js';
20
+ import '../../compatibility-tables/schemas/redirect.js';
21
+ import '../../compatibility-tables/schemas/scriptlet.js';
22
+ import '../../compatibility-tables/schemas/platform.js';
23
+ import '../../compatibility-tables/utils/platform-helpers.js';
24
+ import '../../compatibility-tables/schemas/resource-type.js';
25
+ import { isValidResourceType } from '../../compatibility-tables/utils/resource-type-helpers.js';
26
+ import { isUndefined } from '../../utils/type-guards.js';
27
+
28
+ /**
29
+ * @file Network rule modifier list converter.
30
+ */
31
+ /**
32
+ * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#csp-modifier}
33
+ */
34
+ const CSP_MODIFIER = 'csp';
35
+ const CSP_SEPARATOR = SEMICOLON + SPACE;
36
+ /**
37
+ * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#csp-modifier}
38
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy}
39
+ */
40
+ const COMMON_CSP_PARAMS = '\'self\' \'unsafe-eval\' http: https: data: blob: mediastream: filesystem:';
41
+ /**
42
+ * @see {@link https://help.adblockplus.org/hc/en-us/articles/360062733293#rewrite}
43
+ */
44
+ const ABP_REWRITE_MODIFIER = 'rewrite';
45
+ /**
46
+ * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#redirect-modifier}
47
+ */
48
+ const REDIRECT_MODIFIER = 'redirect';
49
+ /**
50
+ * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#redirect-rule-modifier}
51
+ */
52
+ const REDIRECT_RULE_MODIFIER = 'redirect-rule';
53
+ /**
54
+ * @see {@link https://github.com/gorhill/uBlock/wiki/Resources-Library#empty-redirect-resources}
55
+ */
56
+ const UBO_NOOP_TEXT_RESOURCE = 'noop.txt';
57
+ /**
58
+ * Redirect-related modifiers.
59
+ */
60
+ const REDIRECT_MODIFIERS = new Set([
61
+ ABP_REWRITE_MODIFIER,
62
+ REDIRECT_MODIFIER,
63
+ REDIRECT_RULE_MODIFIER,
64
+ ]);
65
+ /**
66
+ * Conversion map for ADG network rule modifiers.
67
+ */
68
+ const ADG_CONVERSION_MAP = new Map([
69
+ ['1p', [{ name: () => 'third-party', exception: (actual) => !actual }]],
70
+ ['3p', [{ name: () => 'third-party' }]],
71
+ ['css', [{ name: () => 'stylesheet' }]],
72
+ ['doc', [{ name: () => 'document' }]],
73
+ ['ehide', [{ name: () => 'elemhide' }]],
74
+ ['empty', [{ name: () => 'redirect', value: () => 'nooptext' }]],
75
+ ['first-party', [{ name: () => 'third-party', exception: (actual) => !actual }]],
76
+ ['frame', [{ name: () => 'subdocument' }]],
77
+ ['ghide', [{ name: () => 'generichide' }]],
78
+ ['inline-font', [{ name: () => CSP_MODIFIER, value: () => `font-src ${COMMON_CSP_PARAMS}` }]],
79
+ ['inline-script', [{ name: () => CSP_MODIFIER, value: () => `script-src ${COMMON_CSP_PARAMS}` }]],
80
+ ['mp4', [{ name: () => 'redirect', value: () => 'noopmp4-1s' }, { name: () => 'media', value: () => undefined }]],
81
+ ['queryprune', [{ name: () => 'removeparam' }]],
82
+ ['shide', [{ name: () => 'specifichide' }]],
83
+ ['xhr', [{ name: () => 'xmlhttprequest' }]],
84
+ ]);
85
+ /**
86
+ * Helper class for converting network rule modifier lists.
87
+ *
88
+ * @todo Implement `convertToUbo` and `convertToAbp`
89
+ */
90
+ class NetworkRuleModifierListConverter extends BaseConverter {
91
+ /**
92
+ * Converts a network rule modifier list to AdGuard format, if possible.
93
+ *
94
+ * @param modifierList Network rule modifier list node to convert
95
+ * @param isException If `true`, the rule is an exception rule
96
+ * @returns An object which follows the {@link ConversionResult} interface. Its `result` property contains
97
+ * the converted node, and its `isConverted` flag indicates whether the original node was converted.
98
+ * If the node was not converted, the result will contain the original node with the same object reference
99
+ * @throws If the conversion is not possible
100
+ */
101
+ static convertToAdg(modifierList, isException = false) {
102
+ const conversionMap = new MultiValueMap();
103
+ // Special case: $csp modifier
104
+ let cspCount = 0;
105
+ modifierList.children.forEach((modifierNode, index) => {
106
+ const modifierConversions = ADG_CONVERSION_MAP.get(modifierNode.name.value);
107
+ if (modifierConversions) {
108
+ for (const modifierConversion of modifierConversions) {
109
+ const name = modifierConversion.name(modifierNode.name.value);
110
+ const exception = modifierConversion.exception
111
+ // If the exception value is undefined in the original modifier, it
112
+ // means that the modifier isn't negated
113
+ ? modifierConversion.exception(modifierNode.exception || false)
114
+ : modifierNode.exception;
115
+ const value = modifierConversion.value
116
+ ? modifierConversion.value(modifierNode.value?.value)
117
+ : modifierNode.value?.value;
118
+ // Check if the name or the value is different from the original modifier
119
+ // If so, add the converted modifier to the list
120
+ if (name !== modifierNode.name.value || value !== modifierNode.value?.value) {
121
+ conversionMap.add(index, createModifierNode(name, value, exception));
122
+ }
123
+ // Special case: $csp modifier
124
+ if (name === CSP_MODIFIER) {
125
+ cspCount += 1;
126
+ }
127
+ }
128
+ return;
129
+ }
130
+ // Handle special case: resource redirection modifiers
131
+ if (REDIRECT_MODIFIERS.has(modifierNode.name.value)) {
132
+ // Redirect modifiers can't be negated
133
+ if (modifierNode.exception === true) {
134
+ throw new RuleConversionError(`Modifier '${modifierNode.name.value}' cannot be negated`);
135
+ }
136
+ // Convert the redirect resource name to ADG format
137
+ const redirectResource = modifierNode.value?.value;
138
+ // Special case: for exception rules, $redirect without value is allowed,
139
+ // and in this case it means an exception for all redirects
140
+ if (!redirectResource && !isException) {
141
+ throw new RuleConversionError(`No redirect resource specified for '${modifierNode.name.value}' modifier`);
142
+ }
143
+ // Leave $redirect and $redirect-rule modifiers as is, but convert $rewrite to $redirect
144
+ const modifierName = modifierNode.name.value === ABP_REWRITE_MODIFIER
145
+ ? REDIRECT_MODIFIER
146
+ : modifierNode.name.value;
147
+ const convertedRedirectResource = redirectResource
148
+ ? redirectsCompatibilityTable.getFirst(redirectResource, GenericPlatform.AdgAny)?.name
149
+ : undefined;
150
+ // Check if the modifier name or the redirect resource name is different from the original modifier.
151
+ // If so, add the converted modifier to the list
152
+ if (modifierName !== modifierNode.name.value
153
+ || (convertedRedirectResource !== undefined && convertedRedirectResource !== redirectResource)) {
154
+ conversionMap.add(index, createModifierNode(modifierName,
155
+ // If the redirect resource name is unknown, fall back to the original one
156
+ // Later, the validator will throw an error if the resource name is invalid
157
+ convertedRedirectResource || redirectResource, modifierNode.exception));
158
+ }
159
+ }
160
+ });
161
+ // Prepare the result if there are any converted modifiers or $csp modifiers
162
+ if (conversionMap.size || cspCount) {
163
+ const modifierListClone = cloneModifierListNode(modifierList);
164
+ // Replace the original modifiers with the converted ones
165
+ // One modifier may be replaced with multiple modifiers, so we need to flatten the array
166
+ modifierListClone.children = modifierListClone.children.map((modifierNode, index) => {
167
+ const conversionRecord = conversionMap.get(index);
168
+ if (conversionRecord) {
169
+ return conversionRecord;
170
+ }
171
+ return modifierNode;
172
+ }).flat();
173
+ // Special case: $csp modifier: merge multiple $csp modifiers into one
174
+ // and put it at the end of the modifier list
175
+ if (cspCount) {
176
+ const cspValues = [];
177
+ modifierListClone.children = modifierListClone.children.filter((modifierNode) => {
178
+ if (modifierNode.name.value === CSP_MODIFIER) {
179
+ if (!modifierNode.value?.value) {
180
+ throw new RuleConversionError('$csp modifier value is missing');
181
+ }
182
+ cspValues.push(modifierNode.value?.value);
183
+ return false;
184
+ }
185
+ return true;
186
+ });
187
+ modifierListClone.children.push(createModifierNode(CSP_MODIFIER, cspValues.join(CSP_SEPARATOR)));
188
+ }
189
+ // Before returning the result, remove duplicated modifiers
190
+ modifierListClone.children = modifierListClone.children.filter((modifierNode, index, self) => self.findIndex((m) => m.name.value === modifierNode.name.value
191
+ && m.exception === modifierNode.exception
192
+ && m.value?.value === modifierNode.value?.value) === index);
193
+ return createConversionResult(modifierListClone, true);
194
+ }
195
+ return createConversionResult(modifierList, false);
196
+ }
197
+ /**
198
+ * Converts a network rule modifier list to uBlock format, if possible.
199
+ *
200
+ * @param modifierList Network rule modifier list node to convert
201
+ * @param isException If `true`, the rule is an exception rule
202
+ * @returns An object which follows the {@link ConversionResult} interface. Its `result` property contains
203
+ * the converted node, and its `isConverted` flag indicates whether the original node was converted.
204
+ * If the node was not converted, the result will contain the original node with the same object reference
205
+ * @throws If the conversion is not possible
206
+ */
207
+ // TODO: Optimize
208
+ static convertToUbo(modifierList, isException = false) {
209
+ const conversionMap = new MultiValueMap();
210
+ const resourceTypeModifiersToAdd = new Set();
211
+ modifierList.children.forEach((modifierNode, index) => {
212
+ const originalModifierName = modifierNode.name.value;
213
+ const modifierData = modifiersCompatibilityTable.getFirst(originalModifierName, GenericPlatform.UboAny);
214
+ // Handle special case: resource redirection modifiers
215
+ if (REDIRECT_MODIFIERS.has(originalModifierName)) {
216
+ // Redirect modifiers cannot be negated
217
+ if (modifierNode.exception === true) {
218
+ throw new RuleConversionError(`Modifier '${modifierNode.name.value}' cannot be negated`);
219
+ }
220
+ // Convert the redirect resource name to uBO format
221
+ const redirectResourceName = modifierNode.value?.value;
222
+ // Special case: for exception rules, $redirect without value is allowed,
223
+ // and in this case it means an exception for all redirects
224
+ if (!redirectResourceName && !isException) {
225
+ throw new RuleConversionError(`No redirect resource specified for '${modifierNode.name.value}' modifier`);
226
+ }
227
+ if (!redirectResourceName) {
228
+ // Jump to the next modifier if the redirect resource is not specified
229
+ return;
230
+ }
231
+ // Leave $redirect and $redirect-rule modifiers as is, but convert $rewrite to $redirect
232
+ const modifierName = modifierNode.name.value === ABP_REWRITE_MODIFIER
233
+ ? REDIRECT_MODIFIER
234
+ : modifierNode.name.value;
235
+ const convertedRedirectResourceData = redirectsCompatibilityTable.getFirst(redirectResourceName, GenericPlatform.UboAny);
236
+ const convertedRedirectResourceName = convertedRedirectResourceData?.name ?? redirectResourceName;
237
+ // uBlock requires the $redirect modifier to have a resource type
238
+ // https://github.com/AdguardTeam/Scriptlets/issues/101
239
+ if (convertedRedirectResourceData?.resourceTypes?.length) {
240
+ // Convert the resource types to uBO modifiers
241
+ const uboResourceTypeModifiers = redirectsCompatibilityTable.getResourceTypeModifiers(convertedRedirectResourceData, GenericPlatform.UboAny);
242
+ // Special case: noop text resource
243
+ // If any of resource type is already present, we don't need to add other resource types,
244
+ // otherwise, add all resource types
245
+ // TODO: Optimize this logic
246
+ // Check if the current resource is the noop text resource
247
+ const isNoopTextResource = convertedRedirectResourceName === UBO_NOOP_TEXT_RESOURCE;
248
+ // Determine if there are any valid resource types already present
249
+ const hasValidResourceType = modifierList.children.some((modifier) => {
250
+ const name = modifier.name.value;
251
+ if (!isValidResourceType(name)) {
252
+ return false;
253
+ }
254
+ const convertedModifierData = modifiersCompatibilityTable.getFirst(name, GenericPlatform.UboAny);
255
+ return uboResourceTypeModifiers.has(convertedModifierData?.name ?? name);
256
+ });
257
+ // If it's not the noop text resource or if no valid resource types are present
258
+ if (!isNoopTextResource || !hasValidResourceType) {
259
+ uboResourceTypeModifiers.forEach((resourceType) => {
260
+ resourceTypeModifiersToAdd.add(resourceType);
261
+ });
262
+ }
263
+ }
264
+ // Check if the modifier name or the redirect resource name is different from the original modifier.
265
+ // If so, add the converted modifier to the list
266
+ if (modifierName !== originalModifierName
267
+ || (!isUndefined(convertedRedirectResourceName)
268
+ && convertedRedirectResourceName !== redirectResourceName)) {
269
+ conversionMap.add(index, createModifierNode(modifierName,
270
+ // If the redirect resource name is unknown, fall back to the original one
271
+ // Later, the validator will throw an error if the resource name is invalid
272
+ convertedRedirectResourceName || redirectResourceName, modifierNode.exception));
273
+ }
274
+ return;
275
+ }
276
+ // Generic modifier conversion
277
+ if (modifierData && modifierData.name !== originalModifierName) {
278
+ conversionMap.add(index, createModifierNode(modifierData.name, modifierNode.value?.value, modifierNode.exception));
279
+ }
280
+ });
281
+ // Prepare the result if there are any converted modifiers or $csp modifiers
282
+ if (conversionMap.size || resourceTypeModifiersToAdd.size) {
283
+ const modifierListClone = cloneModifierListNode(modifierList);
284
+ // Replace the original modifiers with the converted ones
285
+ // One modifier may be replaced with multiple modifiers, so we need to flatten the array
286
+ modifierListClone.children = modifierListClone.children.map((modifierNode, index) => {
287
+ const conversionRecord = conversionMap.get(index);
288
+ if (conversionRecord) {
289
+ return conversionRecord;
290
+ }
291
+ return modifierNode;
292
+ }).flat();
293
+ // Before returning the result, remove duplicated modifiers
294
+ modifierListClone.children = modifierListClone.children.filter((modifierNode, index, self) => self.findIndex((m) => m.name.value === modifierNode.name.value
295
+ && m.exception === modifierNode.exception
296
+ && m.value?.value === modifierNode.value?.value) === index);
297
+ if (resourceTypeModifiersToAdd.size) {
298
+ const modifierNameSet = new Set(modifierList.children.map((m) => m.name.value));
299
+ resourceTypeModifiersToAdd.forEach((resourceType) => {
300
+ if (!modifierNameSet.has(resourceType)) {
301
+ modifierListClone.children.push(createModifierNode(resourceType));
302
+ }
303
+ });
304
+ }
305
+ return createConversionResult(modifierListClone, true);
306
+ }
307
+ return createConversionResult(modifierList, false);
308
+ }
309
+ }
310
+
311
+ export { NetworkRuleModifierListConverter };
@@ -0,0 +1,99 @@
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 { NetworkRuleType, RuleCategory } from '../../nodes/index.js';
8
+ import { NetworkRuleModifierListConverter } from '../misc/network-rule-modifier.js';
9
+ import { RuleConverterBase } from '../base-interfaces/rule-converter-base.js';
10
+ import { createNodeConversionResult } from '../base-interfaces/conversion-result.js';
11
+
12
+ /**
13
+ * @file Network rule converter
14
+ */
15
+ /**
16
+ * Network rule converter class (also known as "basic rule converter")
17
+ *
18
+ * @todo Implement `convertToUbo` and `convertToAbp`
19
+ */
20
+ class NetworkRuleConverter extends RuleConverterBase {
21
+ /**
22
+ * Converts a network rule to AdGuard format, if possible.
23
+ *
24
+ * @param rule Rule node to convert
25
+ * @returns An object which follows the {@link NodeConversionResult} interface. Its `result` property contains
26
+ * the array of converted rule nodes, and its `isConverted` flag indicates whether the original rule was converted.
27
+ * If the rule was not converted, the result array will contain the original node with the same object reference
28
+ * @throws If the rule is invalid or cannot be converted
29
+ */
30
+ static convertToAdg(rule) {
31
+ // TODO: add support for host rules
32
+ if (rule.type !== NetworkRuleType.NetworkRule) {
33
+ throw new Error(`Invalid rule type: ${rule.type}`);
34
+ }
35
+ if (rule.modifiers) {
36
+ const modifiers = NetworkRuleModifierListConverter.convertToAdg(rule.modifiers, rule.exception);
37
+ // If the object reference is different, it means that the modifiers were converted
38
+ // In this case, we should clone the entire rule and replace the modifiers with the converted ones
39
+ if (modifiers.isConverted) {
40
+ return {
41
+ result: [{
42
+ category: RuleCategory.Network,
43
+ type: NetworkRuleType.NetworkRule,
44
+ syntax: rule.syntax,
45
+ exception: rule.exception,
46
+ pattern: {
47
+ type: 'Value',
48
+ value: rule.pattern.value,
49
+ },
50
+ modifiers: modifiers.result,
51
+ }],
52
+ isConverted: true,
53
+ };
54
+ }
55
+ }
56
+ // If the modifiers were not converted, return the original rule
57
+ return createNodeConversionResult([rule], false);
58
+ }
59
+ /**
60
+ * Converts a network rule to uBlock format, if possible.
61
+ *
62
+ * @param rule Rule node to convert
63
+ * @returns An object which follows the {@link NodeConversionResult} interface. Its `result` property contains
64
+ * the array of converted rule nodes, and its `isConverted` flag indicates whether the original rule was converted.
65
+ * If the rule was not converted, the result array will contain the original node with the same object reference
66
+ * @throws If the rule is invalid or cannot be converted
67
+ */
68
+ static convertToUbo(rule) {
69
+ // TODO: add support for host rules
70
+ if (rule.type !== NetworkRuleType.NetworkRule) {
71
+ throw new Error(`Invalid rule type: ${rule.type}`);
72
+ }
73
+ if (rule.modifiers) {
74
+ const modifiers = NetworkRuleModifierListConverter.convertToUbo(rule.modifiers, rule.exception);
75
+ // If the object reference is different, it means that the modifiers were converted
76
+ // In this case, we should clone the entire rule and replace the modifiers with the converted ones
77
+ if (modifiers.isConverted) {
78
+ return {
79
+ result: [{
80
+ category: RuleCategory.Network,
81
+ type: NetworkRuleType.NetworkRule,
82
+ syntax: rule.syntax,
83
+ exception: rule.exception,
84
+ pattern: {
85
+ type: 'Value',
86
+ value: rule.pattern.value,
87
+ },
88
+ modifiers: modifiers.result,
89
+ }],
90
+ isConverted: true,
91
+ };
92
+ }
93
+ }
94
+ // If the modifiers were not converted, return the original rule
95
+ return createNodeConversionResult([rule], false);
96
+ }
97
+ }
98
+
99
+ export { NetworkRuleConverter };