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