@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.
- package/README.md +1 -1
- package/dist/ast-utils/clone.js +61 -0
- package/dist/ast-utils/modifiers.js +53 -0
- package/dist/ast-utils/network-rules.js +41 -0
- package/dist/ast-utils/scriptlets.js +87 -0
- package/dist/common/abp-snippet-injection-body-common.js +23 -0
- package/dist/common/agent-common.js +56 -0
- package/dist/common/ubo-selector-common.js +17 -0
- package/dist/compatibility-tables/base.js +262 -0
- package/dist/compatibility-tables/compatibility-table-data.js +11 -0
- package/dist/compatibility-tables/modifiers.js +55 -0
- package/dist/compatibility-tables/platforms.js +76 -0
- package/dist/compatibility-tables/redirects.js +100 -0
- package/dist/compatibility-tables/schemas/base.js +111 -0
- package/dist/compatibility-tables/schemas/modifier.js +129 -0
- package/dist/compatibility-tables/schemas/platform.js +69 -0
- package/dist/compatibility-tables/schemas/redirect.js +29 -0
- package/dist/compatibility-tables/schemas/resource-type.js +36 -0
- package/dist/compatibility-tables/schemas/scriptlet.js +79 -0
- package/dist/compatibility-tables/scriptlets.js +28 -0
- package/dist/compatibility-tables/utils/platform-helpers.js +105 -0
- package/dist/compatibility-tables/utils/resource-type-helpers.js +61 -0
- package/dist/compatibility-tables/utils/zod-camelcase.js +25 -0
- package/dist/converter/base-interfaces/base-converter.js +59 -0
- package/dist/converter/base-interfaces/conversion-result.js +38 -0
- package/dist/converter/base-interfaces/rule-converter-base.js +60 -0
- package/dist/converter/comment/index.js +54 -0
- package/dist/converter/cosmetic/css.js +69 -0
- package/dist/converter/cosmetic/element-hiding.js +62 -0
- package/dist/converter/cosmetic/header-removal.js +123 -0
- package/dist/converter/cosmetic/html.js +379 -0
- package/dist/converter/cosmetic/index.js +118 -0
- package/dist/converter/cosmetic/rule-modifiers/adg.js +79 -0
- package/dist/converter/cosmetic/scriptlet.js +354 -0
- package/dist/converter/css/index.js +188 -0
- package/dist/converter/data/css.js +126 -0
- package/dist/converter/filter-list.js +88 -0
- package/dist/converter/index.js +8 -0
- package/dist/converter/misc/network-rule-modifier.js +311 -0
- package/dist/converter/network/index.js +99 -0
- package/dist/converter/raw-filter-list.js +56 -0
- package/dist/converter/rule.js +81 -0
- package/dist/deserializer/base-deserializer.js +29 -0
- package/dist/deserializer/comment/agent-comment-deserializer.js +79 -0
- package/dist/deserializer/comment/agent-deserializer.js +65 -0
- package/dist/deserializer/comment/comment-rule-deserializer.js +54 -0
- package/dist/deserializer/comment/config-comment-deserializer.js +111 -0
- package/dist/deserializer/comment/hint-comment-deserializer.js +72 -0
- package/dist/deserializer/comment/hint-deserializer.js +85 -0
- package/dist/deserializer/comment/metadata-comment-deserializer.js +69 -0
- package/dist/deserializer/comment/pre-processor-comment-deserializer.js +112 -0
- package/dist/deserializer/comment/simple-comment-deserializer.js +65 -0
- package/dist/deserializer/cosmetic/cosmetic-rule-deserializer.js +131 -0
- package/dist/deserializer/cosmetic/css-injection-body-deserializer.js +56 -0
- package/dist/deserializer/cosmetic/element-hiding-body-deserializer.js +48 -0
- package/dist/deserializer/cosmetic/scriptlet-body/abp-snippet-injection-body-deserializer.js +39 -0
- package/dist/deserializer/cosmetic/scriptlet-body/adg-scriptlet-injection-body-deserializer.js +40 -0
- package/dist/deserializer/cosmetic/scriptlet-body/scriptlet-body-deserializer.js +54 -0
- package/dist/deserializer/cosmetic/scriptlet-body/ubo-scriptlet-injection-body-deserializer.js +38 -0
- package/dist/deserializer/empty-rule-deserializer.js +48 -0
- package/dist/deserializer/filterlist-deserializer.js +85 -0
- package/dist/deserializer/index.js +8 -0
- package/dist/deserializer/invalid-rule-deserializer.js +50 -0
- package/dist/deserializer/invalid-rule-error-node-deserializer.js +50 -0
- package/dist/deserializer/misc/domain-list-deserializer.js +64 -0
- package/dist/deserializer/misc/list-item-deserializer.js +69 -0
- package/dist/deserializer/misc/list-items-deserializer.js +30 -0
- package/dist/deserializer/misc/logical-expression-deserializer.js +196 -0
- package/dist/deserializer/misc/modifier-deserializer.js +87 -0
- package/dist/deserializer/misc/modifier-list-deserializer.js +61 -0
- package/dist/deserializer/misc/parameter-list-deserializer.js +64 -0
- package/dist/deserializer/misc/value-deserializer.js +50 -0
- package/dist/deserializer/network/host-rule-deserializer.js +67 -0
- package/dist/deserializer/network/hostname-list-deserializer.js +56 -0
- package/dist/deserializer/network/network-rule-deserializer.js +65 -0
- package/dist/deserializer/rule-deserializer.js +65 -0
- package/dist/deserializer/syntax-deserialization-map.js +21 -0
- package/dist/errors/adblock-syntax-error.js +39 -0
- package/dist/errors/binary-schema-mismatch-error.js +37 -0
- package/dist/errors/not-implemented-error.js +31 -0
- package/dist/errors/rule-conversion-error.js +26 -0
- package/dist/generator/base-generator.js +27 -0
- package/dist/generator/comment/agent-comment-generator.js +31 -0
- package/dist/generator/comment/agent-generator.js +36 -0
- package/dist/generator/comment/comment-rule-generator.js +47 -0
- package/dist/generator/comment/config-comment-generator.js +45 -0
- package/dist/generator/comment/hint-comment-generator.js +28 -0
- package/dist/generator/comment/hint-generator.js +33 -0
- package/dist/generator/comment/metadata-comment-generator.js +33 -0
- package/dist/generator/comment/pre-processor-comment-generator.js +48 -0
- package/dist/generator/comment/simple-comment-generator.js +29 -0
- package/dist/generator/cosmetic/body/abp-snippet-injection-body-generator.js +38 -0
- package/dist/generator/cosmetic/body/adg-scriptlet-injection-body-generator.js +43 -0
- package/dist/generator/cosmetic/body/ubo-scriptlet-injection-body-generator.js +45 -0
- package/dist/generator/cosmetic/cosmetic-rule-body-generator.js +94 -0
- package/dist/generator/cosmetic/cosmetic-rule-generator.js +54 -0
- package/dist/generator/cosmetic/cosmetic-rule-pattern-generator.js +42 -0
- package/dist/generator/css/adg-css-injection-generator.js +42 -0
- package/dist/generator/filterlist-generator.js +67 -0
- package/dist/generator/index.js +9 -0
- package/dist/generator/misc/domain-list-generator.js +26 -0
- package/dist/generator/misc/list-items-generator.js +39 -0
- package/dist/generator/misc/logical-expression-generator.js +48 -0
- package/dist/generator/misc/modifier-generator.js +34 -0
- package/dist/generator/misc/modifier-list-generator.js +29 -0
- package/dist/generator/misc/parameter-list-generator.js +41 -0
- package/dist/generator/misc/value-generator.js +24 -0
- package/dist/generator/network/host-rule-generator.js +39 -0
- package/dist/generator/network/network-rule-generator.js +38 -0
- package/dist/generator/rule-generator.js +65 -0
- package/dist/index.js +70 -0
- package/dist/marshalling-utils/comment/agent-comment-common.js +21 -0
- package/dist/marshalling-utils/comment/agent-common.js +40 -0
- package/dist/marshalling-utils/comment/config-comment-common.js +54 -0
- package/dist/marshalling-utils/comment/hint-comment-common.js +22 -0
- package/dist/marshalling-utils/comment/hint-common.js +56 -0
- package/dist/marshalling-utils/comment/metadata-comment-common.js +41 -0
- package/dist/marshalling-utils/comment/pre-processor-comment-common.js +59 -0
- package/dist/marshalling-utils/comment/simple-comment-common.js +22 -0
- package/dist/marshalling-utils/cosmetic/body/abp-snippet-injection-body-common.js +61 -0
- package/dist/marshalling-utils/cosmetic/body/adg-scriptlet-injection-body-common.js +66 -0
- package/dist/marshalling-utils/cosmetic/body/css-injection-body-common.js +24 -0
- package/dist/marshalling-utils/cosmetic/body/element-hiding-body-common.js +21 -0
- package/dist/marshalling-utils/cosmetic/body/ubo-scriptlet-injection-body-common.js +114 -0
- package/dist/marshalling-utils/cosmetic/cosmetic-rule-common.js +48 -0
- package/dist/marshalling-utils/empty-rule-common.js +20 -0
- package/dist/marshalling-utils/filter-list-common.js +21 -0
- package/dist/marshalling-utils/invalid-rule-common.js +21 -0
- package/dist/marshalling-utils/invalid-rule-error-node-common.js +22 -0
- package/dist/marshalling-utils/misc/binary-type-common.js +66 -0
- package/dist/marshalling-utils/misc/domain-list-common.js +36 -0
- package/dist/marshalling-utils/misc/host-rule-common.js +25 -0
- package/dist/marshalling-utils/misc/hostname-list-common.js +21 -0
- package/dist/marshalling-utils/misc/list-item-common.js +22 -0
- package/dist/marshalling-utils/misc/logical-expression-common.js +83 -0
- package/dist/marshalling-utils/misc/modifier-common.js +231 -0
- package/dist/marshalling-utils/misc/modifier-list-common.js +21 -0
- package/dist/marshalling-utils/misc/parameter-list-common.js +21 -0
- package/dist/marshalling-utils/misc/value-common.js +22 -0
- package/dist/marshalling-utils/network/network-rule-common.js +25 -0
- package/dist/marshalling-utils/syntax-serialization-map.js +30 -0
- package/dist/nodes/index.js +168 -0
- package/dist/package.json.js +9 -0
- package/dist/parser/base-parser.js +30 -0
- package/dist/parser/comment/agent-comment-parser.js +119 -0
- package/dist/parser/comment/agent-parser.js +110 -0
- package/dist/parser/comment/comment-parser.js +108 -0
- package/dist/parser/comment/config-comment-parser.js +137 -0
- package/dist/parser/comment/hint-comment-parser.js +117 -0
- package/dist/parser/comment/hint-parser.js +129 -0
- package/dist/parser/comment/metadata-comment-parser.js +129 -0
- package/dist/parser/comment/preprocessor-parser.js +199 -0
- package/dist/parser/comment/simple-comment-parser.js +106 -0
- package/dist/parser/cosmetic/body/abp-snippet-injection-body-parser.js +79 -0
- package/dist/parser/cosmetic/body/adg-scriptlet-injection-body-parser.js +149 -0
- package/dist/parser/cosmetic/body/ubo-scriptlet-injection-body-parser.js +110 -0
- package/dist/parser/cosmetic/cosmetic-rule-parser.js +453 -0
- package/dist/parser/css/adg-css-injection-parser.js +208 -0
- package/dist/parser/css/balancing.js +94 -0
- package/dist/parser/css/constants.js +18 -0
- package/dist/parser/css/css-token-stream.js +343 -0
- package/dist/parser/css/ubo-selector-parser.js +369 -0
- package/dist/parser/filterlist-parser.js +102 -0
- package/dist/parser/index.js +12 -0
- package/dist/parser/misc/app-list-parser.js +45 -0
- package/dist/parser/misc/domain-list-parser.js +52 -0
- package/dist/parser/misc/list-items-parser.js +116 -0
- package/dist/parser/misc/logical-expression-parser.js +279 -0
- package/dist/parser/misc/method-list-parser.js +46 -0
- package/dist/parser/misc/modifier-list.js +70 -0
- package/dist/parser/misc/modifier-parser.js +89 -0
- package/dist/parser/misc/parameter-list-parser.js +75 -0
- package/dist/parser/misc/stealth-option-list-parser.js +46 -0
- package/dist/parser/misc/ubo-parameter-list-parser.js +149 -0
- package/dist/parser/misc/value-parser.js +37 -0
- package/dist/parser/network/host-rule-parser.js +130 -0
- package/dist/parser/network/network-rule-parser.js +117 -0
- package/dist/parser/options.js +23 -0
- package/dist/parser/rule-parser.js +192 -0
- package/dist/serializer/base-serializer.js +29 -0
- package/dist/serializer/comment/agent-comment-serializer.js +74 -0
- package/dist/serializer/comment/agent-serializer.js +59 -0
- package/dist/serializer/comment/comment-rule-serializer.js +105 -0
- package/dist/serializer/comment/config-comment-serializer.js +82 -0
- package/dist/serializer/comment/hint-comment-serializer.js +65 -0
- package/dist/serializer/comment/hint-serializer.js +54 -0
- package/dist/serializer/comment/metadata-comment-serializer.js +73 -0
- package/dist/serializer/comment/pre-processor-comment-serializer.js +71 -0
- package/dist/serializer/comment/simple-comment-serializer.js +52 -0
- package/dist/serializer/cosmetic/body/abp-snippet-injection-body-serializer.js +36 -0
- package/dist/serializer/cosmetic/body/adg-scriptlet-injection-body-serializer.js +36 -0
- package/dist/serializer/cosmetic/body/scriptlet-body-serializer.js +50 -0
- package/dist/serializer/cosmetic/body/ubo-scriptlet-injection-body-serializer.js +36 -0
- package/dist/serializer/cosmetic/cosmetic-rule-serializer.js +120 -0
- package/dist/serializer/cosmetic/css-injection-body-serializer.js +51 -0
- package/dist/serializer/cosmetic/element-hiding-body-serializer.js +40 -0
- package/dist/serializer/empty-rule-serializer.js +37 -0
- package/dist/serializer/filterlist-serializer.js +45 -0
- package/dist/serializer/index.js +7 -0
- package/dist/serializer/invalid-rule-error-node-serializer.js +41 -0
- package/dist/serializer/invalid-rule-serializer.js +40 -0
- package/dist/serializer/misc/domain-list-serializer.js +64 -0
- package/dist/serializer/misc/list-item-serializer.js +58 -0
- package/dist/serializer/misc/list-items-serializer.js +29 -0
- package/dist/serializer/misc/logical-expression-serializer.js +136 -0
- package/dist/serializer/misc/modifier-list-serializer.js +58 -0
- package/dist/serializer/misc/modifier-serializer.js +49 -0
- package/dist/serializer/misc/parameter-list-serializer.js +52 -0
- package/dist/serializer/misc/value-serializer.js +50 -0
- package/dist/serializer/network/host-rule-serializer.js +70 -0
- package/dist/serializer/network/hostname-list-serializer.js +53 -0
- package/dist/serializer/network/network-rule-serializer.js +54 -0
- package/dist/serializer/rule-serializer.js +61 -0
- package/dist/types/ast-utils/clone.d.ts +26 -0
- package/dist/types/ast-utils/filter-list.d.ts +11 -0
- package/dist/types/ast-utils/modifiers.d.ts +20 -0
- package/dist/types/ast-utils/network-rules.d.ts +15 -0
- package/dist/types/ast-utils/scriptlets.d.ts +52 -0
- package/dist/types/common/abp-snippet-injection-body-common.d.ts +15 -0
- package/dist/types/common/agent-common.d.ts +10 -0
- package/dist/types/common/ubo-selector-common.d.ts +10 -0
- package/dist/types/compatibility-tables/base.d.ts +157 -0
- package/dist/types/compatibility-tables/compatibility-table-data.d.ts +68 -0
- package/dist/types/compatibility-tables/index.d.ts +13 -0
- package/dist/types/compatibility-tables/modifiers.d.ts +22 -0
- package/dist/types/compatibility-tables/platforms.d.ts +49 -0
- package/dist/types/compatibility-tables/redirects.d.ts +33 -0
- package/dist/types/compatibility-tables/schemas/base.d.ts +124 -0
- package/dist/types/compatibility-tables/schemas/index.d.ts +8 -0
- package/dist/types/compatibility-tables/schemas/modifier.d.ts +36 -0
- package/dist/types/compatibility-tables/schemas/platform.d.ts +16 -0
- package/dist/types/compatibility-tables/schemas/redirect.d.ts +25 -0
- package/dist/types/compatibility-tables/schemas/resource-type.d.ts +41 -0
- package/dist/types/compatibility-tables/schemas/scriptlet.d.ts +31 -0
- package/dist/types/compatibility-tables/scriptlets.d.ts +15 -0
- package/dist/types/compatibility-tables/types.d.ts +34 -0
- package/dist/types/compatibility-tables/utils/platform-helpers.d.ts +44 -0
- package/dist/types/compatibility-tables/utils/resource-type-helpers.d.ts +20 -0
- package/dist/types/compatibility-tables/utils/zod-camelcase.d.ts +15 -0
- package/dist/types/converter/base-interfaces/base-converter.d.ts +42 -0
- package/dist/types/converter/base-interfaces/conversion-result.d.ts +43 -0
- package/dist/types/converter/base-interfaces/rule-converter-base.d.ts +44 -0
- package/dist/types/converter/comment/index.d.ts +23 -0
- package/dist/types/converter/cosmetic/css.d.ts +23 -0
- package/dist/types/converter/cosmetic/element-hiding.d.ts +23 -0
- package/dist/types/converter/cosmetic/header-removal.d.ts +37 -0
- package/dist/types/converter/cosmetic/html.d.ts +54 -0
- package/dist/types/converter/cosmetic/index.d.ts +33 -0
- package/dist/types/converter/cosmetic/rule-modifiers/adg.d.ts +21 -0
- package/dist/types/converter/cosmetic/scriptlet.d.ts +33 -0
- package/dist/types/converter/css/index.d.ts +40 -0
- package/dist/types/converter/data/css.d.ts +48 -0
- package/dist/types/converter/filter-list.d.ts +31 -0
- package/dist/types/converter/index.d.ts +5 -0
- package/dist/types/converter/misc/network-rule-modifier.d.ts +35 -0
- package/dist/types/converter/network/index.d.ts +33 -0
- package/dist/types/converter/raw-filter-list.d.ts +31 -0
- package/dist/types/converter/raw-rule.d.ts +28 -0
- package/dist/types/converter/rule.d.ts +37 -0
- package/dist/types/deserializer/base-deserializer.d.ts +15 -0
- package/dist/types/deserializer/comment/agent-comment-deserializer.d.ts +34 -0
- package/dist/types/deserializer/comment/agent-deserializer.d.ts +25 -0
- package/dist/types/deserializer/comment/comment-rule-deserializer.d.ts +16 -0
- package/dist/types/deserializer/comment/config-comment-deserializer.d.ts +27 -0
- package/dist/types/deserializer/comment/hint-comment-deserializer.d.ts +24 -0
- package/dist/types/deserializer/comment/hint-deserializer.d.ts +26 -0
- package/dist/types/deserializer/comment/metadata-comment-deserializer.d.ts +26 -0
- package/dist/types/deserializer/comment/pre-processor-comment-deserializer.d.ts +29 -0
- package/dist/types/deserializer/comment/simple-comment-deserializer.d.ts +26 -0
- package/dist/types/deserializer/cosmetic/cosmetic-rule-deserializer.d.ts +18 -0
- package/dist/types/deserializer/cosmetic/css-injection-body-deserializer.d.ts +15 -0
- package/dist/types/deserializer/cosmetic/element-hiding-body-deserializer.d.ts +16 -0
- package/dist/types/deserializer/cosmetic/scriptlet-body/abp-snippet-injection-body-deserializer.d.ts +17 -0
- package/dist/types/deserializer/cosmetic/scriptlet-body/adg-scriptlet-injection-body-deserializer.d.ts +18 -0
- package/dist/types/deserializer/cosmetic/scriptlet-body/scriptlet-body-deserializer.d.ts +19 -0
- package/dist/types/deserializer/cosmetic/scriptlet-body/ubo-scriptlet-injection-body-deserializer.d.ts +17 -0
- package/dist/types/deserializer/empty-rule-deserializer.d.ts +16 -0
- package/dist/types/deserializer/filterlist-deserializer.d.ts +34 -0
- package/dist/types/deserializer/index.d.ts +2 -0
- package/dist/types/deserializer/invalid-rule-deserializer.d.ts +16 -0
- package/dist/types/deserializer/invalid-rule-error-node-deserializer.d.ts +16 -0
- package/dist/types/deserializer/misc/domain-list-deserializer.d.ts +15 -0
- package/dist/types/deserializer/misc/list-item-deserializer.d.ts +19 -0
- package/dist/types/deserializer/misc/list-items-deserializer.d.ts +16 -0
- package/dist/types/deserializer/misc/logical-expression-deserializer.d.ts +55 -0
- package/dist/types/deserializer/misc/modifier-deserializer.d.ts +18 -0
- package/dist/types/deserializer/misc/modifier-list-deserializer.d.ts +20 -0
- package/dist/types/deserializer/misc/parameter-list-deserializer.d.ts +18 -0
- package/dist/types/deserializer/misc/value-deserializer.d.ts +17 -0
- package/dist/types/deserializer/network/host-rule-deserializer.d.ts +18 -0
- package/dist/types/deserializer/network/hostname-list-deserializer.d.ts +15 -0
- package/dist/types/deserializer/network/network-rule-deserializer.d.ts +18 -0
- package/dist/types/deserializer/rule-deserializer.d.ts +17 -0
- package/dist/types/deserializer/syntax-deserialization-map.d.ts +2 -0
- package/dist/types/errors/adblock-syntax-error.d.ts +25 -0
- package/dist/types/errors/binary-schema-mismatch-error.d.ts +23 -0
- package/dist/types/errors/not-implemented-error.d.ts +14 -0
- package/dist/types/errors/rule-conversion-error.d.ts +14 -0
- package/dist/types/generator/base-generator.d.ts +12 -0
- package/dist/types/generator/comment/agent-comment-generator.d.ts +14 -0
- package/dist/types/generator/comment/agent-generator.d.ts +15 -0
- package/dist/types/generator/comment/comment-rule-generator.d.ts +14 -0
- package/dist/types/generator/comment/config-comment-generator.d.ts +14 -0
- package/dist/types/generator/comment/hint-comment-generator.d.ts +14 -0
- package/dist/types/generator/comment/hint-generator.d.ts +14 -0
- package/dist/types/generator/comment/index.d.ts +1 -0
- package/dist/types/generator/comment/metadata-comment-generator.d.ts +14 -0
- package/dist/types/generator/comment/pre-processor-comment-generator.d.ts +14 -0
- package/dist/types/generator/comment/simple-comment-generator.d.ts +14 -0
- package/dist/types/generator/cosmetic/body/abp-snippet-injection-body-generator.d.ts +15 -0
- package/dist/types/generator/cosmetic/body/adg-scriptlet-injection-body-generator.d.ts +21 -0
- package/dist/types/generator/cosmetic/body/ubo-scriptlet-injection-body-generator.d.ts +21 -0
- package/dist/types/generator/cosmetic/cosmetic-rule-body-generator.d.ts +20 -0
- package/dist/types/generator/cosmetic/cosmetic-rule-generator.d.ts +28 -0
- package/dist/types/generator/cosmetic/cosmetic-rule-pattern-generator.d.ts +18 -0
- package/dist/types/generator/cosmetic/index.d.ts +1 -0
- package/dist/types/generator/css/adg-css-injection-generator.d.ts +15 -0
- package/dist/types/generator/css/ubo-selector-generator.d.ts +14 -0
- package/dist/types/generator/filterlist-generator.d.ts +18 -0
- package/dist/types/generator/index.d.ts +3 -0
- package/dist/types/generator/misc/domain-list-generator.d.ts +15 -0
- package/dist/types/generator/misc/list-items-generator.d.ts +25 -0
- package/dist/types/generator/misc/logical-expression-generator.d.ts +14 -0
- package/dist/types/generator/misc/modifier-generator.d.ts +14 -0
- package/dist/types/generator/misc/modifier-list-generator.d.ts +14 -0
- package/dist/types/generator/misc/parameter-list-generator.d.ts +15 -0
- package/dist/types/generator/misc/value-generator.d.ts +14 -0
- package/dist/types/generator/network/host-rule-generator.d.ts +14 -0
- package/dist/types/generator/network/index.d.ts +2 -0
- package/dist/types/generator/network/network-rule-generator.d.ts +14 -0
- package/dist/types/generator/rule-generator.d.ts +24 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/marshalling-utils/comment/agent-comment-common.d.ts +14 -0
- package/dist/types/marshalling-utils/comment/agent-common.d.ts +20 -0
- package/dist/types/marshalling-utils/comment/config-comment-common.d.ts +42 -0
- package/dist/types/marshalling-utils/comment/hint-comment-common.d.ts +15 -0
- package/dist/types/marshalling-utils/comment/hint-common.d.ts +33 -0
- package/dist/types/marshalling-utils/comment/metadata-comment-common.d.ts +21 -0
- package/dist/types/marshalling-utils/comment/pre-processor-comment-common.d.ts +37 -0
- package/dist/types/marshalling-utils/comment/simple-comment-common.d.ts +15 -0
- package/dist/types/marshalling-utils/cosmetic/body/abp-snippet-injection-body-common.d.ts +23 -0
- package/dist/types/marshalling-utils/cosmetic/body/adg-scriptlet-injection-body-common.d.ts +9 -0
- package/dist/types/marshalling-utils/cosmetic/body/css-injection-body-common.d.ts +17 -0
- package/dist/types/marshalling-utils/cosmetic/body/element-hiding-body-common.d.ts +14 -0
- package/dist/types/marshalling-utils/cosmetic/body/ubo-scriptlet-injection-body-common.d.ts +9 -0
- package/dist/types/marshalling-utils/cosmetic/cosmetic-rule-common.d.ts +28 -0
- package/dist/types/marshalling-utils/empty-rule-common.d.ts +13 -0
- package/dist/types/marshalling-utils/filter-list-common.d.ts +14 -0
- package/dist/types/marshalling-utils/invalid-rule-common.d.ts +14 -0
- package/dist/types/marshalling-utils/invalid-rule-error-node-common.d.ts +15 -0
- package/dist/types/marshalling-utils/misc/binary-type-common.d.ts +57 -0
- package/dist/types/marshalling-utils/misc/domain-list-common.d.ts +24 -0
- package/dist/types/marshalling-utils/misc/host-rule-common.d.ts +18 -0
- package/dist/types/marshalling-utils/misc/hostname-list-common.d.ts +14 -0
- package/dist/types/marshalling-utils/misc/list-item-common.d.ts +15 -0
- package/dist/types/marshalling-utils/misc/logical-expression-common.d.ts +47 -0
- package/dist/types/marshalling-utils/misc/modifier-common.d.ts +41 -0
- package/dist/types/marshalling-utils/misc/modifier-list-common.d.ts +14 -0
- package/dist/types/marshalling-utils/misc/parameter-list-common.d.ts +14 -0
- package/dist/types/marshalling-utils/misc/value-common.d.ts +15 -0
- package/dist/types/marshalling-utils/network/network-rule-common.d.ts +18 -0
- package/dist/types/marshalling-utils/syntax-serialization-map.d.ts +2 -0
- package/dist/types/nodes/index.d.ts +1183 -0
- package/dist/types/parser/base-parser.d.ts +16 -0
- package/dist/types/parser/comment/agent-comment-parser.d.ts +42 -0
- package/dist/types/parser/comment/agent-parser.d.ts +33 -0
- package/dist/types/parser/comment/comment-parser.d.ts +76 -0
- package/dist/types/parser/comment/config-comment-parser.d.ts +31 -0
- package/dist/types/parser/comment/hint-comment-parser.d.ts +33 -0
- package/dist/types/parser/comment/hint-parser.d.ts +30 -0
- package/dist/types/parser/comment/metadata-comment-parser.d.ts +29 -0
- package/dist/types/parser/comment/preprocessor-parser.d.ts +43 -0
- package/dist/types/parser/comment/simple-comment-parser.d.ts +33 -0
- package/dist/types/parser/cosmetic/body/abp-snippet-injection-body-parser.d.ts +34 -0
- package/dist/types/parser/cosmetic/body/adg-scriptlet-injection-body-parser.d.ts +47 -0
- package/dist/types/parser/cosmetic/body/ubo-scriptlet-injection-body-parser.d.ts +44 -0
- package/dist/types/parser/cosmetic/cosmetic-rule-parser.d.ts +51 -0
- package/dist/types/parser/css/adg-css-injection-parser.d.ts +28 -0
- package/dist/types/parser/css/balancing.d.ts +36 -0
- package/dist/types/parser/css/constants.d.ts +10 -0
- package/dist/types/parser/css/css-token-stream.d.ts +210 -0
- package/dist/types/parser/css/ubo-selector-parser.d.ts +46 -0
- package/dist/types/parser/filterlist-parser.d.ts +29 -0
- package/dist/types/parser/index.d.ts +6 -0
- package/dist/types/parser/misc/app-list-parser.d.ts +22 -0
- package/dist/types/parser/misc/domain-list-parser.d.ts +26 -0
- package/dist/types/parser/misc/list-items-parser.d.ts +37 -0
- package/dist/types/parser/misc/logical-expression-parser.d.ts +42 -0
- package/dist/types/parser/misc/method-list-parser.d.ts +22 -0
- package/dist/types/parser/misc/modifier-list.d.ts +24 -0
- package/dist/types/parser/misc/modifier-parser.d.ts +21 -0
- package/dist/types/parser/misc/parameter-list-parser.d.ts +17 -0
- package/dist/types/parser/misc/stealth-option-list-parser.d.ts +22 -0
- package/dist/types/parser/misc/ubo-parameter-list-parser.d.ts +21 -0
- package/dist/types/parser/misc/value-parser.d.ts +18 -0
- package/dist/types/parser/network/host-rule-parser.d.ts +35 -0
- package/dist/types/parser/network/network-rule-parser.d.ts +31 -0
- package/dist/types/parser/options.d.ts +41 -0
- package/dist/types/parser/rule-parser.d.ts +78 -0
- package/dist/types/serializer/base-serializer.d.ts +15 -0
- package/dist/types/serializer/comment/agent-comment-serializer.d.ts +34 -0
- package/dist/types/serializer/comment/agent-serializer.d.ts +15 -0
- package/dist/types/serializer/comment/comment-rule-serializer.d.ts +68 -0
- package/dist/types/serializer/comment/config-comment-serializer.d.ts +25 -0
- package/dist/types/serializer/comment/hint-comment-serializer.d.ts +23 -0
- package/dist/types/serializer/comment/hint-serializer.d.ts +24 -0
- package/dist/types/serializer/comment/metadata-comment-serializer.d.ts +25 -0
- package/dist/types/serializer/comment/pre-processor-comment-serializer.d.ts +28 -0
- package/dist/types/serializer/comment/simple-comment-serializer.d.ts +24 -0
- package/dist/types/serializer/cosmetic/body/abp-snippet-injection-body-serializer.d.ts +25 -0
- package/dist/types/serializer/cosmetic/body/adg-scriptlet-injection-body-serializer.d.ts +25 -0
- package/dist/types/serializer/cosmetic/body/scriptlet-body-serializer.d.ts +17 -0
- package/dist/types/serializer/cosmetic/body/ubo-scriptlet-injection-body-serializer.d.ts +25 -0
- package/dist/types/serializer/cosmetic/cosmetic-rule-serializer.d.ts +19 -0
- package/dist/types/serializer/cosmetic/css-injection-body-serializer.d.ts +15 -0
- package/dist/types/serializer/cosmetic/element-hiding-body-serializer.d.ts +15 -0
- package/dist/types/serializer/empty-rule-serializer.d.ts +15 -0
- package/dist/types/serializer/filterlist-serializer.d.ts +15 -0
- package/dist/types/serializer/index.d.ts +1 -0
- package/dist/types/serializer/invalid-rule-error-node-serializer.d.ts +15 -0
- package/dist/types/serializer/invalid-rule-serializer.d.ts +15 -0
- package/dist/types/serializer/misc/domain-list-serializer.d.ts +21 -0
- package/dist/types/serializer/misc/list-item-serializer.d.ts +16 -0
- package/dist/types/serializer/misc/list-items-serializer.d.ts +15 -0
- package/dist/types/serializer/misc/logical-expression-serializer.d.ts +52 -0
- package/dist/types/serializer/misc/modifier-list-serializer.d.ts +20 -0
- package/dist/types/serializer/misc/modifier-serializer.d.ts +18 -0
- package/dist/types/serializer/misc/parameter-list-serializer.d.ts +17 -0
- package/dist/types/serializer/misc/value-serializer.d.ts +17 -0
- package/dist/types/serializer/network/host-rule-serializer.d.ts +30 -0
- package/dist/types/serializer/network/hostname-list-serializer.d.ts +15 -0
- package/dist/types/serializer/network/network-rule-serializer.d.ts +18 -0
- package/dist/types/serializer/rule-serializer.d.ts +17 -0
- package/dist/types/utils/adblockers.d.ts +49 -0
- package/dist/types/utils/binary-schema-version.d.ts +9 -0
- package/dist/types/utils/byte-buffer.d.ts +54 -0
- package/dist/types/utils/categorizer.d.ts +14 -0
- package/dist/types/utils/clone.d.ts +15 -0
- package/dist/types/utils/constants.d.ts +188 -0
- package/dist/types/utils/cosmetic-rule-separator.d.ts +45 -0
- package/dist/types/utils/deep-freeze.d.ts +13 -0
- package/dist/types/utils/domain.d.ts +29 -0
- package/dist/types/utils/error.d.ts +8 -0
- package/dist/types/utils/index.d.ts +15 -0
- package/dist/types/utils/input-byte-buffer.d.ts +146 -0
- package/dist/types/utils/is-chromium.d.ts +7 -0
- package/dist/types/utils/logical-expression.d.ts +45 -0
- package/dist/types/utils/multi-value-map.d.ts +16 -0
- package/dist/types/utils/output-byte-buffer.d.ts +132 -0
- package/dist/types/utils/position-provider.d.ts +46 -0
- package/dist/types/utils/quotes.d.ts +94 -0
- package/dist/types/utils/regexp.d.ts +54 -0
- package/dist/types/utils/storage-interface.d.ts +23 -0
- package/dist/types/utils/string.d.ts +280 -0
- package/dist/types/utils/text-decoder-polyfill.d.ts +14 -0
- package/dist/types/utils/text-encoder-polyfill.d.ts +18 -0
- package/dist/types/utils/type-guards.d.ts +47 -0
- package/dist/types/validator/constants.d.ts +89 -0
- package/dist/types/validator/helpers.d.ts +37 -0
- package/dist/types/validator/index.d.ts +38 -0
- package/dist/types/validator/value.d.ts +12 -0
- package/dist/types/version.d.ts +5 -0
- package/dist/utils/adblockers.js +56 -0
- package/dist/utils/binary-schema-version.js +17 -0
- package/dist/utils/byte-buffer.js +91 -0
- package/dist/utils/categorizer.js +44 -0
- package/dist/utils/clone.js +28 -0
- package/dist/utils/constants.js +249 -0
- package/dist/utils/cosmetic-rule-separator.js +127 -0
- package/dist/utils/deep-freeze.js +32 -0
- package/dist/utils/domain.js +59 -0
- package/dist/utils/error.js +49 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/input-byte-buffer.js +265 -0
- package/dist/utils/is-chromium.js +20 -0
- package/dist/utils/logical-expression.js +92 -0
- package/dist/utils/multi-value-map.js +33 -0
- package/dist/utils/output-byte-buffer.js +231 -0
- package/dist/utils/position-provider.js +73 -0
- package/dist/utils/quotes.js +214 -0
- package/dist/utils/regexp.js +176 -0
- package/dist/utils/string.js +559 -0
- package/dist/utils/text-decoder-polyfill.js +107 -0
- package/dist/utils/text-encoder-polyfill.js +78 -0
- package/dist/utils/type-guards.js +47 -0
- package/dist/validator/constants.js +210 -0
- package/dist/validator/helpers.js +45 -0
- package/dist/validator/index.js +174 -0
- package/dist/validator/value.js +568 -0
- package/dist/version.js +18 -0
- package/package.json +61 -39
- package/dist/agtree.d.ts +0 -4155
- package/dist/agtree.js +0 -15819
- package/dist/agtree.mjs +0 -15720
- 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 };
|