@jesscss/core 2.0.0-alpha.1
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/LICENSE +21 -0
- package/README.md +9 -0
- package/lib/context.d.ts +352 -0
- package/lib/context.d.ts.map +1 -0
- package/lib/context.js +636 -0
- package/lib/context.js.map +1 -0
- package/lib/conversions.d.ts +73 -0
- package/lib/conversions.d.ts.map +1 -0
- package/lib/conversions.js +253 -0
- package/lib/conversions.js.map +1 -0
- package/lib/debug-log.d.ts +2 -0
- package/lib/debug-log.d.ts.map +1 -0
- package/lib/debug-log.js +27 -0
- package/lib/debug-log.js.map +1 -0
- package/lib/define-function.d.ts +587 -0
- package/lib/define-function.d.ts.map +1 -0
- package/lib/define-function.js +726 -0
- package/lib/define-function.js.map +1 -0
- package/lib/deprecation.d.ts +34 -0
- package/lib/deprecation.d.ts.map +1 -0
- package/lib/deprecation.js +57 -0
- package/lib/deprecation.js.map +1 -0
- package/lib/index.d.ts +22 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +23 -0
- package/lib/index.js.map +1 -0
- package/lib/jess-error.d.ts +343 -0
- package/lib/jess-error.d.ts.map +1 -0
- package/lib/jess-error.js +508 -0
- package/lib/jess-error.js.map +1 -0
- package/lib/logger/deprecation-processing.d.ts +41 -0
- package/lib/logger/deprecation-processing.d.ts.map +1 -0
- package/lib/logger/deprecation-processing.js +81 -0
- package/lib/logger/deprecation-processing.js.map +1 -0
- package/lib/logger.d.ts +10 -0
- package/lib/logger.d.ts.map +1 -0
- package/lib/logger.js +20 -0
- package/lib/logger.js.map +1 -0
- package/lib/plugin.d.ts +94 -0
- package/lib/plugin.d.ts.map +1 -0
- package/lib/plugin.js +174 -0
- package/lib/plugin.js.map +1 -0
- package/lib/tree/ampersand.d.ts +94 -0
- package/lib/tree/ampersand.d.ts.map +1 -0
- package/lib/tree/ampersand.js +269 -0
- package/lib/tree/ampersand.js.map +1 -0
- package/lib/tree/any.d.ts +58 -0
- package/lib/tree/any.d.ts.map +1 -0
- package/lib/tree/any.js +101 -0
- package/lib/tree/any.js.map +1 -0
- package/lib/tree/at-rule.d.ts +53 -0
- package/lib/tree/at-rule.d.ts.map +1 -0
- package/lib/tree/at-rule.js +503 -0
- package/lib/tree/at-rule.js.map +1 -0
- package/lib/tree/block.d.ts +22 -0
- package/lib/tree/block.d.ts.map +1 -0
- package/lib/tree/block.js +24 -0
- package/lib/tree/block.js.map +1 -0
- package/lib/tree/bool.d.ts +17 -0
- package/lib/tree/bool.d.ts.map +1 -0
- package/lib/tree/bool.js +24 -0
- package/lib/tree/bool.js.map +1 -0
- package/lib/tree/call.d.ts +66 -0
- package/lib/tree/call.d.ts.map +1 -0
- package/lib/tree/call.js +306 -0
- package/lib/tree/call.js.map +1 -0
- package/lib/tree/collection.d.ts +30 -0
- package/lib/tree/collection.d.ts.map +1 -0
- package/lib/tree/collection.js +37 -0
- package/lib/tree/collection.js.map +1 -0
- package/lib/tree/color.d.ts +101 -0
- package/lib/tree/color.d.ts.map +1 -0
- package/lib/tree/color.js +513 -0
- package/lib/tree/color.js.map +1 -0
- package/lib/tree/combinator.d.ts +12 -0
- package/lib/tree/combinator.d.ts.map +1 -0
- package/lib/tree/combinator.js +8 -0
- package/lib/tree/combinator.js.map +1 -0
- package/lib/tree/comment.d.ts +20 -0
- package/lib/tree/comment.d.ts.map +1 -0
- package/lib/tree/comment.js +18 -0
- package/lib/tree/comment.js.map +1 -0
- package/lib/tree/condition.d.ts +31 -0
- package/lib/tree/condition.d.ts.map +1 -0
- package/lib/tree/condition.js +103 -0
- package/lib/tree/condition.js.map +1 -0
- package/lib/tree/control.d.ts +104 -0
- package/lib/tree/control.d.ts.map +1 -0
- package/lib/tree/control.js +430 -0
- package/lib/tree/control.js.map +1 -0
- package/lib/tree/declaration-custom.d.ts +18 -0
- package/lib/tree/declaration-custom.d.ts.map +1 -0
- package/lib/tree/declaration-custom.js +24 -0
- package/lib/tree/declaration-custom.js.map +1 -0
- package/lib/tree/declaration-var.d.ts +36 -0
- package/lib/tree/declaration-var.d.ts.map +1 -0
- package/lib/tree/declaration-var.js +63 -0
- package/lib/tree/declaration-var.js.map +1 -0
- package/lib/tree/declaration.d.ts +78 -0
- package/lib/tree/declaration.d.ts.map +1 -0
- package/lib/tree/declaration.js +289 -0
- package/lib/tree/declaration.js.map +1 -0
- package/lib/tree/default-guard.d.ts +15 -0
- package/lib/tree/default-guard.d.ts.map +1 -0
- package/lib/tree/default-guard.js +19 -0
- package/lib/tree/default-guard.js.map +1 -0
- package/lib/tree/dimension.d.ts +33 -0
- package/lib/tree/dimension.d.ts.map +1 -0
- package/lib/tree/dimension.js +291 -0
- package/lib/tree/dimension.js.map +1 -0
- package/lib/tree/expression.d.ts +24 -0
- package/lib/tree/expression.d.ts.map +1 -0
- package/lib/tree/expression.js +28 -0
- package/lib/tree/expression.js.map +1 -0
- package/lib/tree/extend-list.d.ts +23 -0
- package/lib/tree/extend-list.d.ts.map +1 -0
- package/lib/tree/extend-list.js +20 -0
- package/lib/tree/extend-list.js.map +1 -0
- package/lib/tree/extend.d.ts +47 -0
- package/lib/tree/extend.d.ts.map +1 -0
- package/lib/tree/extend.js +292 -0
- package/lib/tree/extend.js.map +1 -0
- package/lib/tree/function.d.ts +48 -0
- package/lib/tree/function.d.ts.map +1 -0
- package/lib/tree/function.js +74 -0
- package/lib/tree/function.js.map +1 -0
- package/lib/tree/import-js.d.ts +35 -0
- package/lib/tree/import-js.d.ts.map +1 -0
- package/lib/tree/import-js.js +45 -0
- package/lib/tree/import-js.js.map +1 -0
- package/lib/tree/import-style.d.ts +156 -0
- package/lib/tree/import-style.d.ts.map +1 -0
- package/lib/tree/import-style.js +556 -0
- package/lib/tree/import-style.js.map +1 -0
- package/lib/tree/index.d.ts +71 -0
- package/lib/tree/index.d.ts.map +1 -0
- package/lib/tree/index.js +95 -0
- package/lib/tree/index.js.map +1 -0
- package/lib/tree/interpolated-reference.d.ts +24 -0
- package/lib/tree/interpolated-reference.d.ts.map +1 -0
- package/lib/tree/interpolated-reference.js +37 -0
- package/lib/tree/interpolated-reference.js.map +1 -0
- package/lib/tree/interpolated.d.ts +62 -0
- package/lib/tree/interpolated.d.ts.map +1 -0
- package/lib/tree/interpolated.js +204 -0
- package/lib/tree/interpolated.js.map +1 -0
- package/lib/tree/js-array.d.ts +10 -0
- package/lib/tree/js-array.d.ts.map +1 -0
- package/lib/tree/js-array.js +10 -0
- package/lib/tree/js-array.js.map +1 -0
- package/lib/tree/js-expr.d.ts +23 -0
- package/lib/tree/js-expr.d.ts.map +1 -0
- package/lib/tree/js-expr.js +28 -0
- package/lib/tree/js-expr.js.map +1 -0
- package/lib/tree/js-function.d.ts +20 -0
- package/lib/tree/js-function.d.ts.map +1 -0
- package/lib/tree/js-function.js +16 -0
- package/lib/tree/js-function.js.map +1 -0
- package/lib/tree/js-object.d.ts +10 -0
- package/lib/tree/js-object.d.ts.map +1 -0
- package/lib/tree/js-object.js +10 -0
- package/lib/tree/js-object.js.map +1 -0
- package/lib/tree/list.d.ts +38 -0
- package/lib/tree/list.d.ts.map +1 -0
- package/lib/tree/list.js +83 -0
- package/lib/tree/list.js.map +1 -0
- package/lib/tree/log.d.ts +29 -0
- package/lib/tree/log.d.ts.map +1 -0
- package/lib/tree/log.js +56 -0
- package/lib/tree/log.js.map +1 -0
- package/lib/tree/mixin.d.ts +87 -0
- package/lib/tree/mixin.d.ts.map +1 -0
- package/lib/tree/mixin.js +112 -0
- package/lib/tree/mixin.js.map +1 -0
- package/lib/tree/negative.d.ts +17 -0
- package/lib/tree/negative.d.ts.map +1 -0
- package/lib/tree/negative.js +22 -0
- package/lib/tree/negative.js.map +1 -0
- package/lib/tree/nil.d.ts +31 -0
- package/lib/tree/nil.d.ts.map +1 -0
- package/lib/tree/nil.js +36 -0
- package/lib/tree/nil.js.map +1 -0
- package/lib/tree/node-base.d.ts +359 -0
- package/lib/tree/node-base.d.ts.map +1 -0
- package/lib/tree/node-base.js +884 -0
- package/lib/tree/node-base.js.map +1 -0
- package/lib/tree/node.d.ts +10 -0
- package/lib/tree/node.d.ts.map +1 -0
- package/lib/tree/node.js +45 -0
- package/lib/tree/node.js.map +1 -0
- package/lib/tree/number.d.ts +21 -0
- package/lib/tree/number.d.ts.map +1 -0
- package/lib/tree/number.js +27 -0
- package/lib/tree/number.js.map +1 -0
- package/lib/tree/operation.d.ts +26 -0
- package/lib/tree/operation.d.ts.map +1 -0
- package/lib/tree/operation.js +103 -0
- package/lib/tree/operation.js.map +1 -0
- package/lib/tree/paren.d.ts +18 -0
- package/lib/tree/paren.d.ts.map +1 -0
- package/lib/tree/paren.js +86 -0
- package/lib/tree/paren.js.map +1 -0
- package/lib/tree/query-condition.d.ts +17 -0
- package/lib/tree/query-condition.d.ts.map +1 -0
- package/lib/tree/query-condition.js +39 -0
- package/lib/tree/query-condition.js.map +1 -0
- package/lib/tree/quoted.d.ts +27 -0
- package/lib/tree/quoted.d.ts.map +1 -0
- package/lib/tree/quoted.js +66 -0
- package/lib/tree/quoted.js.map +1 -0
- package/lib/tree/range.d.ts +33 -0
- package/lib/tree/range.d.ts.map +1 -0
- package/lib/tree/range.js +47 -0
- package/lib/tree/range.js.map +1 -0
- package/lib/tree/reference.d.ts +76 -0
- package/lib/tree/reference.d.ts.map +1 -0
- package/lib/tree/reference.js +521 -0
- package/lib/tree/reference.js.map +1 -0
- package/lib/tree/rest.d.ts +15 -0
- package/lib/tree/rest.d.ts.map +1 -0
- package/lib/tree/rest.js +32 -0
- package/lib/tree/rest.js.map +1 -0
- package/lib/tree/rules-raw.d.ts +17 -0
- package/lib/tree/rules-raw.d.ts.map +1 -0
- package/lib/tree/rules-raw.js +37 -0
- package/lib/tree/rules-raw.js.map +1 -0
- package/lib/tree/rules.d.ts +255 -0
- package/lib/tree/rules.d.ts.map +1 -0
- package/lib/tree/rules.js +2293 -0
- package/lib/tree/rules.js.map +1 -0
- package/lib/tree/ruleset.d.ts +91 -0
- package/lib/tree/ruleset.d.ts.map +1 -0
- package/lib/tree/ruleset.js +506 -0
- package/lib/tree/ruleset.js.map +1 -0
- package/lib/tree/selector-attr.d.ts +31 -0
- package/lib/tree/selector-attr.d.ts.map +1 -0
- package/lib/tree/selector-attr.js +99 -0
- package/lib/tree/selector-attr.js.map +1 -0
- package/lib/tree/selector-basic.d.ts +23 -0
- package/lib/tree/selector-basic.d.ts.map +1 -0
- package/lib/tree/selector-basic.js +34 -0
- package/lib/tree/selector-basic.js.map +1 -0
- package/lib/tree/selector-capture.d.ts +23 -0
- package/lib/tree/selector-capture.d.ts.map +1 -0
- package/lib/tree/selector-capture.js +34 -0
- package/lib/tree/selector-capture.js.map +1 -0
- package/lib/tree/selector-complex.d.ts +40 -0
- package/lib/tree/selector-complex.d.ts.map +1 -0
- package/lib/tree/selector-complex.js +143 -0
- package/lib/tree/selector-complex.js.map +1 -0
- package/lib/tree/selector-compound.d.ts +16 -0
- package/lib/tree/selector-compound.d.ts.map +1 -0
- package/lib/tree/selector-compound.js +114 -0
- package/lib/tree/selector-compound.js.map +1 -0
- package/lib/tree/selector-interpolated.d.ts +23 -0
- package/lib/tree/selector-interpolated.d.ts.map +1 -0
- package/lib/tree/selector-interpolated.js +27 -0
- package/lib/tree/selector-interpolated.js.map +1 -0
- package/lib/tree/selector-list.d.ts +17 -0
- package/lib/tree/selector-list.d.ts.map +1 -0
- package/lib/tree/selector-list.js +184 -0
- package/lib/tree/selector-list.js.map +1 -0
- package/lib/tree/selector-pseudo.d.ts +42 -0
- package/lib/tree/selector-pseudo.d.ts.map +1 -0
- package/lib/tree/selector-pseudo.js +191 -0
- package/lib/tree/selector-pseudo.js.map +1 -0
- package/lib/tree/selector-simple.d.ts +5 -0
- package/lib/tree/selector-simple.d.ts.map +1 -0
- package/lib/tree/selector-simple.js +6 -0
- package/lib/tree/selector-simple.js.map +1 -0
- package/lib/tree/selector.d.ts +43 -0
- package/lib/tree/selector.d.ts.map +1 -0
- package/lib/tree/selector.js +56 -0
- package/lib/tree/selector.js.map +1 -0
- package/lib/tree/sequence.d.ts +43 -0
- package/lib/tree/sequence.d.ts.map +1 -0
- package/lib/tree/sequence.js +148 -0
- package/lib/tree/sequence.js.map +1 -0
- package/lib/tree/tree.d.ts +87 -0
- package/lib/tree/tree.d.ts.map +1 -0
- package/lib/tree/tree.js +2 -0
- package/lib/tree/tree.js.map +1 -0
- package/lib/tree/url.d.ts +18 -0
- package/lib/tree/url.d.ts.map +1 -0
- package/lib/tree/url.js +35 -0
- package/lib/tree/url.js.map +1 -0
- package/lib/tree/util/__tests__/debug-log.d.ts +1 -0
- package/lib/tree/util/__tests__/debug-log.d.ts.map +1 -0
- package/lib/tree/util/__tests__/debug-log.js +36 -0
- package/lib/tree/util/__tests__/debug-log.js.map +1 -0
- package/lib/tree/util/calculate.d.ts +3 -0
- package/lib/tree/util/calculate.d.ts.map +1 -0
- package/lib/tree/util/calculate.js +10 -0
- package/lib/tree/util/calculate.js.map +1 -0
- package/lib/tree/util/cast.d.ts +10 -0
- package/lib/tree/util/cast.d.ts.map +1 -0
- package/lib/tree/util/cast.js +87 -0
- package/lib/tree/util/cast.js.map +1 -0
- package/lib/tree/util/cloning.d.ts +4 -0
- package/lib/tree/util/cloning.d.ts.map +1 -0
- package/lib/tree/util/cloning.js +8 -0
- package/lib/tree/util/cloning.js.map +1 -0
- package/lib/tree/util/collections.d.ts +57 -0
- package/lib/tree/util/collections.d.ts.map +1 -0
- package/lib/tree/util/collections.js +136 -0
- package/lib/tree/util/collections.js.map +1 -0
- package/lib/tree/util/compare.d.ts +11 -0
- package/lib/tree/util/compare.d.ts.map +1 -0
- package/lib/tree/util/compare.js +89 -0
- package/lib/tree/util/compare.js.map +1 -0
- package/lib/tree/util/extend-helpers.d.ts +2 -0
- package/lib/tree/util/extend-helpers.d.ts.map +1 -0
- package/lib/tree/util/extend-helpers.js +2 -0
- package/lib/tree/util/extend-helpers.js.map +1 -0
- package/lib/tree/util/extend-roots.d.ts +37 -0
- package/lib/tree/util/extend-roots.d.ts.map +1 -0
- package/lib/tree/util/extend-roots.js +682 -0
- package/lib/tree/util/extend-roots.js.map +1 -0
- package/lib/tree/util/extend-roots.old.d.ts +132 -0
- package/lib/tree/util/extend-roots.old.d.ts.map +1 -0
- package/lib/tree/util/extend-roots.old.js +2272 -0
- package/lib/tree/util/extend-roots.old.js.map +1 -0
- package/lib/tree/util/extend-trace-debug.d.ts +13 -0
- package/lib/tree/util/extend-trace-debug.d.ts.map +1 -0
- package/lib/tree/util/extend-trace-debug.js +34 -0
- package/lib/tree/util/extend-trace-debug.js.map +1 -0
- package/lib/tree/util/extend.d.ts +218 -0
- package/lib/tree/util/extend.d.ts.map +1 -0
- package/lib/tree/util/extend.js +3033 -0
- package/lib/tree/util/extend.js.map +1 -0
- package/lib/tree/util/find-extendable-locations.d.ts +2 -0
- package/lib/tree/util/find-extendable-locations.d.ts.map +1 -0
- package/lib/tree/util/find-extendable-locations.js +2 -0
- package/lib/tree/util/find-extendable-locations.js.map +1 -0
- package/lib/tree/util/format.d.ts +20 -0
- package/lib/tree/util/format.d.ts.map +1 -0
- package/lib/tree/util/format.js +67 -0
- package/lib/tree/util/format.js.map +1 -0
- package/lib/tree/util/is-node.d.ts +13 -0
- package/lib/tree/util/is-node.d.ts.map +1 -0
- package/lib/tree/util/is-node.js +43 -0
- package/lib/tree/util/is-node.js.map +1 -0
- package/lib/tree/util/print.d.ts +80 -0
- package/lib/tree/util/print.d.ts.map +1 -0
- package/lib/tree/util/print.js +205 -0
- package/lib/tree/util/print.js.map +1 -0
- package/lib/tree/util/process-leading-is.d.ts +25 -0
- package/lib/tree/util/process-leading-is.d.ts.map +1 -0
- package/lib/tree/util/process-leading-is.js +364 -0
- package/lib/tree/util/process-leading-is.js.map +1 -0
- package/lib/tree/util/recursion-helper.d.ts +15 -0
- package/lib/tree/util/recursion-helper.d.ts.map +1 -0
- package/lib/tree/util/recursion-helper.js +43 -0
- package/lib/tree/util/recursion-helper.js.map +1 -0
- package/lib/tree/util/regex.d.ts +4 -0
- package/lib/tree/util/regex.d.ts.map +1 -0
- package/lib/tree/util/regex.js +4 -0
- package/lib/tree/util/regex.js.map +1 -0
- package/lib/tree/util/registry-utils.d.ts +192 -0
- package/lib/tree/util/registry-utils.d.ts.map +1 -0
- package/lib/tree/util/registry-utils.js +1242 -0
- package/lib/tree/util/registry-utils.js.map +1 -0
- package/lib/tree/util/ruleset-trace.d.ts +4 -0
- package/lib/tree/util/ruleset-trace.d.ts.map +1 -0
- package/lib/tree/util/ruleset-trace.js +14 -0
- package/lib/tree/util/ruleset-trace.js.map +1 -0
- package/lib/tree/util/selector-compare.d.ts +2 -0
- package/lib/tree/util/selector-compare.d.ts.map +1 -0
- package/lib/tree/util/selector-compare.js +2 -0
- package/lib/tree/util/selector-compare.js.map +1 -0
- package/lib/tree/util/selector-match-core.d.ts +171 -0
- package/lib/tree/util/selector-match-core.d.ts.map +1 -0
- package/lib/tree/util/selector-match-core.js +1578 -0
- package/lib/tree/util/selector-match-core.js.map +1 -0
- package/lib/tree/util/selector-utils.d.ts +30 -0
- package/lib/tree/util/selector-utils.d.ts.map +1 -0
- package/lib/tree/util/selector-utils.js +100 -0
- package/lib/tree/util/selector-utils.js.map +1 -0
- package/lib/tree/util/serialize-helper.d.ts +13 -0
- package/lib/tree/util/serialize-helper.d.ts.map +1 -0
- package/lib/tree/util/serialize-helper.js +387 -0
- package/lib/tree/util/serialize-helper.js.map +1 -0
- package/lib/tree/util/serialize-types.d.ts +9 -0
- package/lib/tree/util/serialize-types.d.ts.map +1 -0
- package/lib/tree/util/serialize-types.js +216 -0
- package/lib/tree/util/serialize-types.js.map +1 -0
- package/lib/tree/util/should-operate.d.ts +23 -0
- package/lib/tree/util/should-operate.d.ts.map +1 -0
- package/lib/tree/util/should-operate.js +46 -0
- package/lib/tree/util/should-operate.js.map +1 -0
- package/lib/tree/util/sourcemap.d.ts +7 -0
- package/lib/tree/util/sourcemap.d.ts.map +1 -0
- package/lib/tree/util/sourcemap.js +25 -0
- package/lib/tree/util/sourcemap.js.map +1 -0
- package/lib/types/config.d.ts +205 -0
- package/lib/types/config.d.ts.map +1 -0
- package/lib/types/config.js +2 -0
- package/lib/types/config.js.map +1 -0
- package/lib/types/index.d.ts +15 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +3 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/modes.d.ts +24 -0
- package/lib/types/modes.d.ts.map +1 -0
- package/lib/types/modes.js +2 -0
- package/lib/types/modes.js.map +1 -0
- package/lib/types.d.ts +61 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/use-webpack-resolver.d.ts +9 -0
- package/lib/use-webpack-resolver.d.ts.map +1 -0
- package/lib/use-webpack-resolver.js +41 -0
- package/lib/use-webpack-resolver.js.map +1 -0
- package/lib/visitor/index.d.ts +136 -0
- package/lib/visitor/index.d.ts.map +1 -0
- package/lib/visitor/index.js +135 -0
- package/lib/visitor/index.js.map +1 -0
- package/lib/visitor/less-visitor.d.ts +7 -0
- package/lib/visitor/less-visitor.d.ts.map +1 -0
- package/lib/visitor/less-visitor.js +7 -0
- package/lib/visitor/less-visitor.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,682 @@
|
|
|
1
|
+
import { WARN, toDiagnostic } from '../../jess-error.js';
|
|
2
|
+
import { Combinator } from '../combinator.js';
|
|
3
|
+
import { ComplexSelector } from '../selector-complex.js';
|
|
4
|
+
import { SelectorList } from '../selector-list.js';
|
|
5
|
+
import { PseudoSelector } from '../selector-pseudo.js';
|
|
6
|
+
import { applyExtendsToSelector } from './extend.js';
|
|
7
|
+
import { findExtendableLocations } from './extend-helpers.js';
|
|
8
|
+
import { isNode } from './is-node.js';
|
|
9
|
+
import { Nil } from '../nil.js';
|
|
10
|
+
import { F_EXTENDED, F_VISIBLE } from '../node.js';
|
|
11
|
+
import { getOptionalRulesetTraceId } from './ruleset-trace.js';
|
|
12
|
+
export class ExtendRootRegistry {
|
|
13
|
+
parentRoot = new WeakMap();
|
|
14
|
+
childrenRoots = new WeakMap();
|
|
15
|
+
layerName = new WeakMap();
|
|
16
|
+
isProtected = new WeakMap();
|
|
17
|
+
isCompose = new WeakMap();
|
|
18
|
+
rootsByLayerName = new Map();
|
|
19
|
+
rootsByNamespace = new Map();
|
|
20
|
+
layerNames = new WeakMap();
|
|
21
|
+
allRoots = new Set();
|
|
22
|
+
root;
|
|
23
|
+
extendRootStack = [];
|
|
24
|
+
getCurrentExtendRoot() {
|
|
25
|
+
return this.extendRootStack[this.extendRootStack.length - 1];
|
|
26
|
+
}
|
|
27
|
+
registerRoot(rules, parent, options) {
|
|
28
|
+
this.allRoots.add(rules);
|
|
29
|
+
if (parent) {
|
|
30
|
+
this.allRoots.add(parent);
|
|
31
|
+
}
|
|
32
|
+
if (!this.root) {
|
|
33
|
+
this.root = rules;
|
|
34
|
+
}
|
|
35
|
+
if (parent) {
|
|
36
|
+
this.parentRoot.set(rules, parent);
|
|
37
|
+
let children = this.childrenRoots.get(parent);
|
|
38
|
+
if (!children) {
|
|
39
|
+
children = new Set();
|
|
40
|
+
this.childrenRoots.set(parent, children);
|
|
41
|
+
}
|
|
42
|
+
children.add(rules);
|
|
43
|
+
}
|
|
44
|
+
if (options?.layerName) {
|
|
45
|
+
this.layerName.set(rules, options.layerName);
|
|
46
|
+
let layerRoots = this.rootsByLayerName.get(options.layerName);
|
|
47
|
+
if (!layerRoots) {
|
|
48
|
+
layerRoots = new Set();
|
|
49
|
+
this.rootsByLayerName.set(options.layerName, layerRoots);
|
|
50
|
+
}
|
|
51
|
+
layerRoots.add(rules);
|
|
52
|
+
}
|
|
53
|
+
if (options?.namespace) {
|
|
54
|
+
let nsRoots = this.rootsByNamespace.get(options.namespace);
|
|
55
|
+
if (!nsRoots) {
|
|
56
|
+
nsRoots = new Set();
|
|
57
|
+
this.rootsByNamespace.set(options.namespace, nsRoots);
|
|
58
|
+
}
|
|
59
|
+
nsRoots.add(rules);
|
|
60
|
+
}
|
|
61
|
+
if (options?.isProtected) {
|
|
62
|
+
this.isProtected.set(rules, true);
|
|
63
|
+
}
|
|
64
|
+
if (options?.isCompose) {
|
|
65
|
+
this.isCompose.set(rules, true);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
pushExtendRoot(rules) {
|
|
69
|
+
this.extendRootStack.push(rules);
|
|
70
|
+
}
|
|
71
|
+
popExtendRoot() {
|
|
72
|
+
this.extendRootStack.pop();
|
|
73
|
+
}
|
|
74
|
+
getVisibleRoots(root) {
|
|
75
|
+
return this.getAccessibleRoots(root);
|
|
76
|
+
}
|
|
77
|
+
getAccessibleRoots(root) {
|
|
78
|
+
const accessible = new Set();
|
|
79
|
+
const visited = new Set();
|
|
80
|
+
const traverseChildren = (currentRoot) => {
|
|
81
|
+
if (visited.has(currentRoot)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
visited.add(currentRoot);
|
|
85
|
+
accessible.add(currentRoot);
|
|
86
|
+
if (this.isProtected.get(currentRoot)) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const children = this.childrenRoots.get(currentRoot);
|
|
90
|
+
if (children) {
|
|
91
|
+
for (const child of children) {
|
|
92
|
+
if (this.isProtected.get(child)) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
traverseChildren(child);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (currentRoot.value?.length) {
|
|
99
|
+
for (const node of currentRoot.value) {
|
|
100
|
+
if (node && isNode(node, 'Ruleset') && node.value?.rules && isNode(node.value.rules, 'Rules')) {
|
|
101
|
+
const innerRules = node.value.rules;
|
|
102
|
+
if (!visited.has(innerRules)) {
|
|
103
|
+
accessible.add(innerRules);
|
|
104
|
+
traverseChildren(innerRules);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (node && isNode(node, 'Rules')) {
|
|
108
|
+
const innerRules = node;
|
|
109
|
+
if (!visited.has(innerRules)) {
|
|
110
|
+
accessible.add(innerRules);
|
|
111
|
+
traverseChildren(innerRules);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const layer = this.layerName.get(currentRoot);
|
|
117
|
+
if (layer) {
|
|
118
|
+
const sameLayerRoots = this.rootsByLayerName.get(layer);
|
|
119
|
+
if (sameLayerRoots) {
|
|
120
|
+
for (const layerRoot of sameLayerRoots) {
|
|
121
|
+
if (layerRoot !== currentRoot && !visited.has(layerRoot) && !this.isProtected.get(layerRoot)) {
|
|
122
|
+
accessible.add(layerRoot);
|
|
123
|
+
traverseChildren(layerRoot);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
traverseChildren(root);
|
|
130
|
+
return accessible;
|
|
131
|
+
}
|
|
132
|
+
isSameOrDescendantRoot(rulesetRoot, extendRoot) {
|
|
133
|
+
if (rulesetRoot === extendRoot) {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
if (this.isProtected.get(rulesetRoot)) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
const layerA = this.layerName.get(rulesetRoot);
|
|
140
|
+
const layerB = this.layerName.get(extendRoot);
|
|
141
|
+
if (layerA && layerB && layerA === layerB) {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
const children = this.childrenRoots.get(extendRoot);
|
|
145
|
+
if (!children) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
for (const child of children) {
|
|
149
|
+
if (this.isProtected.get(child)) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (this.isSameOrDescendantRoot(rulesetRoot, child)) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
setLayerName(atRule, layerName) {
|
|
159
|
+
this.layerNames.set(atRule, layerName);
|
|
160
|
+
}
|
|
161
|
+
getLayerName(atRule) {
|
|
162
|
+
return this.layerNames.get(atRule);
|
|
163
|
+
}
|
|
164
|
+
takeLayerName(atRule) {
|
|
165
|
+
const layer = this.layerNames.get(atRule);
|
|
166
|
+
if (layer) {
|
|
167
|
+
this.layerNames.delete(atRule);
|
|
168
|
+
}
|
|
169
|
+
return layer;
|
|
170
|
+
}
|
|
171
|
+
getAllRoots() {
|
|
172
|
+
return new Set(this.allRoots);
|
|
173
|
+
}
|
|
174
|
+
isProtectedRoot(rules) {
|
|
175
|
+
return this.isProtected.get(rules) === true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const rulesetsByRoot = new Map();
|
|
179
|
+
function getSourceNodeTraceId(ruleset) {
|
|
180
|
+
const sourceNode = ruleset.sourceNode;
|
|
181
|
+
if (!sourceNode) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
return getOptionalRulesetTraceId(sourceNode) ?? null;
|
|
185
|
+
}
|
|
186
|
+
export function registerRulesetWithRoot(root, ruleset) {
|
|
187
|
+
if (!root || !ruleset) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
let set = rulesetsByRoot.get(root);
|
|
191
|
+
if (!set) {
|
|
192
|
+
set = new Set();
|
|
193
|
+
rulesetsByRoot.set(root, set);
|
|
194
|
+
}
|
|
195
|
+
set.add(ruleset);
|
|
196
|
+
const sourceNode = ruleset.sourceNode;
|
|
197
|
+
}
|
|
198
|
+
function isInstructionVisibleForRoot(context, rootRules, instruction) {
|
|
199
|
+
if (!instruction.extendRoot) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
if (instruction.fromReferenceScope === true) {
|
|
203
|
+
// Less parity: extends declared while evaluating a reference import are non-side-effecting.
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
if (context.extendRoots.isProtectedRoot(rootRules) && instruction.extendRoot !== rootRules) {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
if (instruction.extendRoot === rootRules) {
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
if (context.extendRoots.isSameOrDescendantRoot(rootRules, instruction.extendRoot)) {
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
const visibleRoots = context.extendRoots.getVisibleRoots(instruction.extendRoot);
|
|
216
|
+
return visibleRoots.has(rootRules);
|
|
217
|
+
}
|
|
218
|
+
function rootHasTargetMatch(root, target, partial) {
|
|
219
|
+
const targetValue = target.valueOf();
|
|
220
|
+
const stack = [...root.value];
|
|
221
|
+
while (stack.length > 0) {
|
|
222
|
+
const node = stack.pop();
|
|
223
|
+
if (!node || typeof node !== 'object') {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (isNode(node, 'Ruleset')) {
|
|
227
|
+
const selector = node.value.selector;
|
|
228
|
+
if (!selector || isNode(selector, 'Nil')) {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const selectorValue = selector.valueOf();
|
|
232
|
+
if (selectorValue.includes(targetValue)) {
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
if (findExtendableLocations(selector, target).hasMatches) {
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
const rules = node.value.rules;
|
|
239
|
+
if (rules && isNode(rules, 'Rules')) {
|
|
240
|
+
stack.push(...rules.value);
|
|
241
|
+
}
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (isNode(node, 'Rules')) {
|
|
245
|
+
stack.push(...node.value);
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (isNode(node, 'AtRule')) {
|
|
249
|
+
const value = node.value;
|
|
250
|
+
if (value && isNode(value, 'Rules')) {
|
|
251
|
+
stack.push(...value.value);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
export function processExtends(context) {
|
|
258
|
+
const instructions = context.extends.map(([target, selectorWithExtend, partial, extendRoot, extendNode, , fromReferenceScope]) => ({
|
|
259
|
+
target,
|
|
260
|
+
extendWith: selectorWithExtend,
|
|
261
|
+
partial,
|
|
262
|
+
extendRoot,
|
|
263
|
+
extendNode,
|
|
264
|
+
fromReferenceScope: fromReferenceScope === true
|
|
265
|
+
}));
|
|
266
|
+
if (!instructions.length) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const instructionStats = new Map(instructions.map(i => [i, { visibleMatchCount: 0, blockedMatchCount: 0 }]));
|
|
270
|
+
for (const [rootRules, rulesetSet] of rulesetsByRoot) {
|
|
271
|
+
if (!rootRules) {
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
const visibleExtendSet = new Set(instructions.filter(instruction => isInstructionVisibleForRoot(context, rootRules, instruction)));
|
|
275
|
+
for (const instruction of instructions) {
|
|
276
|
+
const selectorDiagnostics = [];
|
|
277
|
+
const matchedInRoot = Array.from(rulesetSet).some((ruleset) => {
|
|
278
|
+
const selector = ruleset.value.selector;
|
|
279
|
+
if (!selector || isNode(selector, 'Nil')) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
const locations = findExtendableLocations(selector, instruction.target);
|
|
283
|
+
if (instruction.target.valueOf() === '.base') {
|
|
284
|
+
selectorDiagnostics.push({ selector: selector.valueOf(), hasMatches: locations.hasMatches });
|
|
285
|
+
}
|
|
286
|
+
return locations.hasMatches;
|
|
287
|
+
});
|
|
288
|
+
if (!matchedInRoot) {
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
const stats = instructionStats.get(instruction);
|
|
292
|
+
if (!stats) {
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
if (visibleExtendSet.has(instruction)) {
|
|
296
|
+
stats.visibleMatchCount += 1;
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
stats.blockedMatchCount += 1;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
const visibleExtends = Array.from(visibleExtendSet);
|
|
303
|
+
if (!visibleExtends.length) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const activatingExtends = visibleExtends;
|
|
307
|
+
for (const ruleset of rulesetSet) {
|
|
308
|
+
const selector = ruleset.value.selector;
|
|
309
|
+
if (!selector || isNode(selector, 'Nil')) {
|
|
310
|
+
ruleset.removeFlag(F_EXTENDED);
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
const isActivatedByVisibleExtend = activatingExtends.some(instruction => (!instruction.partial
|
|
314
|
+
|| instruction.target.valueOf() === instruction.extendWith.valueOf())
|
|
315
|
+
&& findExtendableLocations(selector, instruction.target).hasMatches);
|
|
316
|
+
if (isActivatedByVisibleExtend) {
|
|
317
|
+
ruleset.addFlag(F_EXTENDED);
|
|
318
|
+
// If a reference-scoped/import-scoped ruleset is externally extended, it must become
|
|
319
|
+
// visible in output so the merged selector can render.
|
|
320
|
+
ruleset.addFlag(F_VISIBLE);
|
|
321
|
+
if (isNode(selector, 'SelectorList')) {
|
|
322
|
+
for (const item of selector.value) {
|
|
323
|
+
item.addFlag(F_EXTENDED);
|
|
324
|
+
item.addFlag(F_VISIBLE);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
selector.addFlag(F_EXTENDED);
|
|
329
|
+
selector.addFlag(F_VISIBLE);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
ruleset.removeFlag(F_EXTENDED);
|
|
334
|
+
}
|
|
335
|
+
const ownSelector = ruleset.options?.ownSelector;
|
|
336
|
+
const hasResolvedNestedSelector = Boolean(ownSelector
|
|
337
|
+
&& ownSelector.valueOf() !== selector.valueOf());
|
|
338
|
+
const hasOnlyPartialExtends = visibleExtends.length > 0 && visibleExtends.every(instruction => instruction.partial);
|
|
339
|
+
if (ownSelector && hasResolvedNestedSelector && hasOnlyPartialExtends) {
|
|
340
|
+
const ownNewSelector = applyExtendsToSelector(ownSelector, visibleExtends);
|
|
341
|
+
const fullNewSelector = applyExtendsToSelector(selector, visibleExtends);
|
|
342
|
+
const ownBefore = ownSelector.valueOf();
|
|
343
|
+
const ownAfter = ownNewSelector.valueOf();
|
|
344
|
+
const fullBefore = selector.valueOf();
|
|
345
|
+
const fullAfter = fullNewSelector.valueOf();
|
|
346
|
+
if (ownNewSelector !== ownSelector && ownAfter !== ownBefore) {
|
|
347
|
+
ruleset.value.selector = ownNewSelector;
|
|
348
|
+
ruleset.options.ownSelector = ownNewSelector;
|
|
349
|
+
ruleset.invalidateSelectorValueCache();
|
|
350
|
+
if (ownNewSelector.hoistToRoot) {
|
|
351
|
+
ruleset.hoistToRoot = true;
|
|
352
|
+
}
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
if (fullAfter === fullBefore) {
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (ownSelector && hasResolvedNestedSelector) {
|
|
360
|
+
const partialOnly = visibleExtends.filter(instruction => instruction.partial);
|
|
361
|
+
const nonPartialOnly = visibleExtends.filter(instruction => !instruction.partial);
|
|
362
|
+
if (partialOnly.length > 0 && nonPartialOnly.length === 0) {
|
|
363
|
+
const ownAfterPartialOnly = applyExtendsToSelector(ownSelector, partialOnly);
|
|
364
|
+
const fullAfterPartialOnly = applyExtendsToSelector(selector, partialOnly);
|
|
365
|
+
const ownChangedByPartialOnly = ownAfterPartialOnly.valueOf() !== ownSelector.valueOf();
|
|
366
|
+
const fullChangedByPartialOnly = fullAfterPartialOnly.valueOf() !== selector.valueOf();
|
|
367
|
+
const parentSelector = (ruleset.parent?.parent && isNode(ruleset.parent.parent, 'Ruleset')
|
|
368
|
+
? ruleset.parent.parent.value.selector
|
|
369
|
+
: null);
|
|
370
|
+
const canDeriveOwnFromGeneratedIs = Boolean(!ownChangedByPartialOnly
|
|
371
|
+
&& fullChangedByPartialOnly
|
|
372
|
+
&& parentSelector
|
|
373
|
+
&& !(parentSelector instanceof Nil)
|
|
374
|
+
&& isNode(fullAfterPartialOnly, 'ComplexSelector'));
|
|
375
|
+
if (canDeriveOwnFromGeneratedIs) {
|
|
376
|
+
const complex = fullAfterPartialOnly;
|
|
377
|
+
const last = complex.value.at(-1);
|
|
378
|
+
if (last
|
|
379
|
+
&& isNode(last, 'PseudoSelector')
|
|
380
|
+
&& last.value.name === ':is'
|
|
381
|
+
&& last.value.arg
|
|
382
|
+
&& isNode(last.value.arg, 'SelectorList')) {
|
|
383
|
+
const derivedOwn = last.value.arg.copy(true);
|
|
384
|
+
ruleset.value.selector = derivedOwn;
|
|
385
|
+
ruleset.options.ownSelector = derivedOwn;
|
|
386
|
+
ruleset.invalidateSelectorValueCache();
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
if (partialOnly.length === 0 && nonPartialOnly.length > 0) {
|
|
392
|
+
const parentSelectorForOwnSplit = (ruleset.parent?.parent && isNode(ruleset.parent.parent, 'Ruleset')
|
|
393
|
+
? ruleset.parent.parent.value.selector
|
|
394
|
+
: null);
|
|
395
|
+
const nonPartialDiagnostics = nonPartialOnly.map((instruction) => {
|
|
396
|
+
const ownAfterSingle = applyExtendsToSelector(ownSelector, [instruction]);
|
|
397
|
+
const fullAfterSingle = applyExtendsToSelector(selector, [instruction]);
|
|
398
|
+
const ownChangedSingle = ownAfterSingle.valueOf() !== ownSelector.valueOf();
|
|
399
|
+
const fullChangedSingle = fullAfterSingle.valueOf() !== selector.valueOf();
|
|
400
|
+
const parentHasTargetMatch = Boolean(parentSelectorForOwnSplit
|
|
401
|
+
&& !(parentSelectorForOwnSplit instanceof Nil)
|
|
402
|
+
&& findExtendableLocations(parentSelectorForOwnSplit, instruction.target).hasMatches);
|
|
403
|
+
return {
|
|
404
|
+
instruction,
|
|
405
|
+
ownChangedSingle,
|
|
406
|
+
fullChangedSingle,
|
|
407
|
+
parentHasTargetMatch
|
|
408
|
+
};
|
|
409
|
+
});
|
|
410
|
+
const fullChangedExtendWith = new Set(nonPartialDiagnostics
|
|
411
|
+
.filter(d => d.fullChangedSingle)
|
|
412
|
+
.map(d => d.instruction.extendWith.valueOf()));
|
|
413
|
+
const nonPartialWithInclusion = nonPartialDiagnostics.map((d) => {
|
|
414
|
+
const includeOwnOnly = (d.ownChangedSingle
|
|
415
|
+
&& !d.fullChangedSingle
|
|
416
|
+
&& !d.parentHasTargetMatch
|
|
417
|
+
&& !fullChangedExtendWith.has(d.instruction.extendWith.valueOf()));
|
|
418
|
+
return { ...d, includeOwnOnly };
|
|
419
|
+
});
|
|
420
|
+
const nonPartialOwnOnly = nonPartialWithInclusion
|
|
421
|
+
.filter(x => x.includeOwnOnly)
|
|
422
|
+
.map(x => x.instruction);
|
|
423
|
+
const ownAfterOwnOnly = applyExtendsToSelector(ownSelector, nonPartialOwnOnly);
|
|
424
|
+
const hasAncestorDrivenNonPartial = nonPartialWithInclusion.some(d => !d.ownChangedSingle
|
|
425
|
+
&& d.fullChangedSingle
|
|
426
|
+
&& d.parentHasTargetMatch);
|
|
427
|
+
if (hasAncestorDrivenNonPartial) {
|
|
428
|
+
// Parent already carries this non-partial effect; keep nested selector local.
|
|
429
|
+
ruleset.value.selector = ownAfterOwnOnly;
|
|
430
|
+
ruleset.options.ownSelector = ownAfterOwnOnly;
|
|
431
|
+
ruleset.invalidateSelectorValueCache();
|
|
432
|
+
continue;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
if (partialOnly.length > 0 && nonPartialOnly.length > 0) {
|
|
436
|
+
const parentSelectorForOwnSplit = (ruleset.parent?.parent && isNode(ruleset.parent.parent, 'Ruleset')
|
|
437
|
+
? ruleset.parent.parent.value.selector
|
|
438
|
+
: null);
|
|
439
|
+
const nonPartialDiagnostics = nonPartialOnly.map((instruction) => {
|
|
440
|
+
const ownAfterSingle = applyExtendsToSelector(ownSelector, [instruction]);
|
|
441
|
+
const fullAfterSingle = applyExtendsToSelector(selector, [instruction]);
|
|
442
|
+
const ownChangedSingle = ownAfterSingle.valueOf() !== ownSelector.valueOf();
|
|
443
|
+
const fullChangedSingle = fullAfterSingle.valueOf() !== selector.valueOf();
|
|
444
|
+
const parentHasTargetMatch = Boolean(parentSelectorForOwnSplit
|
|
445
|
+
&& !(parentSelectorForOwnSplit instanceof Nil)
|
|
446
|
+
&& findExtendableLocations(parentSelectorForOwnSplit, instruction.target).hasMatches);
|
|
447
|
+
return {
|
|
448
|
+
instruction,
|
|
449
|
+
ownChangedSingle,
|
|
450
|
+
fullChangedSingle,
|
|
451
|
+
parentHasTargetMatch
|
|
452
|
+
};
|
|
453
|
+
});
|
|
454
|
+
const fullChangedExtendWith = new Set(nonPartialDiagnostics
|
|
455
|
+
.filter(d => d.fullChangedSingle)
|
|
456
|
+
.map(d => d.instruction.extendWith.valueOf()));
|
|
457
|
+
const nonPartialWithInclusion = nonPartialDiagnostics.map((d) => {
|
|
458
|
+
const includeOwnOnly = (d.ownChangedSingle
|
|
459
|
+
&& !d.fullChangedSingle
|
|
460
|
+
&& !d.parentHasTargetMatch
|
|
461
|
+
&& !fullChangedExtendWith.has(d.instruction.extendWith.valueOf()));
|
|
462
|
+
return { ...d, includeOwnOnly };
|
|
463
|
+
});
|
|
464
|
+
const nonPartialOwnOnly = nonPartialWithInclusion
|
|
465
|
+
.filter(x => x.includeOwnOnly)
|
|
466
|
+
.map(x => x.instruction);
|
|
467
|
+
const ownAfterPartialAndOwnOnlyNonPartial = applyExtendsToSelector(ownSelector, [...partialOnly, ...nonPartialOwnOnly]);
|
|
468
|
+
const ownAfterPartial = applyExtendsToSelector(ownSelector, partialOnly);
|
|
469
|
+
const ownAfterNonPartial = applyExtendsToSelector(ownSelector, nonPartialOnly);
|
|
470
|
+
const ownAfterAll = applyExtendsToSelector(ownSelector, visibleExtends);
|
|
471
|
+
const fullAfterNonPartial = applyExtendsToSelector(selector, nonPartialOnly);
|
|
472
|
+
const ownChangedByNonPartial = ownAfterNonPartial.valueOf() !== ownSelector.valueOf();
|
|
473
|
+
const fullChangedByNonPartial = fullAfterNonPartial.valueOf() !== selector.valueOf();
|
|
474
|
+
const nonPartialBoundaryOnly = !ownChangedByNonPartial && fullChangedByNonPartial;
|
|
475
|
+
const ownChangedByPartial = ownAfterPartial.valueOf() !== ownSelector.valueOf();
|
|
476
|
+
const hasAncestorDrivenNonPartial = nonPartialWithInclusion.some(d => !d.ownChangedSingle
|
|
477
|
+
&& d.fullChangedSingle
|
|
478
|
+
&& d.parentHasTargetMatch);
|
|
479
|
+
const shouldDeferToParentForNonPartial = Boolean(!ownChangedByPartial
|
|
480
|
+
&& nonPartialOwnOnly.length === 0
|
|
481
|
+
&& hasAncestorDrivenNonPartial);
|
|
482
|
+
const hasParentMatchedOwnOnlyNonPartial = nonPartialWithInclusion.some(d => d.ownChangedSingle
|
|
483
|
+
&& !d.fullChangedSingle
|
|
484
|
+
&& d.parentHasTargetMatch);
|
|
485
|
+
// When non-partial extends match only the full (cross-product) selector and not
|
|
486
|
+
// the own selector, and partial extends would incorrectly alter the own selector,
|
|
487
|
+
// the non-partial extend takes precedence. Applying partial extends to the own
|
|
488
|
+
// selector here blocks cross-product de-distribution (`:is(parent) :is(own), .rep_ace`).
|
|
489
|
+
if (nonPartialBoundaryOnly && (ownChangedByPartial || nonPartialOwnOnly.length > 0)) {
|
|
490
|
+
const newSel = applyExtendsToSelector(selector, nonPartialOnly);
|
|
491
|
+
if (newSel.valueOf() !== selector.valueOf()) {
|
|
492
|
+
newSel.hoistToRoot = true;
|
|
493
|
+
ruleset.value.selector = newSel;
|
|
494
|
+
ruleset.invalidateSelectorValueCache();
|
|
495
|
+
ruleset.hoistToRoot = true;
|
|
496
|
+
}
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
// For nested rulesets, apply partial (`all`) updates to own selector, but do not
|
|
500
|
+
// fold non-partial changes into own selector. Non-partial changes are handled
|
|
501
|
+
// through full-selector assignment path below when needed.
|
|
502
|
+
if (ownChangedByPartial || nonPartialOwnOnly.length > 0) {
|
|
503
|
+
ruleset.value.selector = ownAfterPartialAndOwnOnlyNonPartial;
|
|
504
|
+
ruleset.options.ownSelector = ownAfterPartialAndOwnOnlyNonPartial;
|
|
505
|
+
ruleset.invalidateSelectorValueCache();
|
|
506
|
+
continue;
|
|
507
|
+
}
|
|
508
|
+
if (hasParentMatchedOwnOnlyNonPartial) {
|
|
509
|
+
// Less parity: exact extends that only match nested own selector while parent already
|
|
510
|
+
// carries the target should remain parent-scoped (do not inject extender into child selector).
|
|
511
|
+
ruleset.value.selector = ownAfterPartial;
|
|
512
|
+
ruleset.options.ownSelector = ownAfterPartial;
|
|
513
|
+
ruleset.invalidateSelectorValueCache();
|
|
514
|
+
continue;
|
|
515
|
+
}
|
|
516
|
+
if (shouldDeferToParentForNonPartial) {
|
|
517
|
+
// Parent selector already carries the non-partial extend effect.
|
|
518
|
+
// Keep this nested ruleset relative to its own selector to avoid
|
|
519
|
+
// re-materializing parent prefixes inside nested blocks.
|
|
520
|
+
ruleset.value.selector = ownAfterPartial;
|
|
521
|
+
ruleset.options.ownSelector = ownAfterPartial;
|
|
522
|
+
ruleset.invalidateSelectorValueCache();
|
|
523
|
+
continue;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
let newSelector = applyExtendsToSelector(selector, visibleExtends);
|
|
528
|
+
if (newSelector !== selector) {
|
|
529
|
+
const beforeValue = selector.valueOf();
|
|
530
|
+
const ownRelevantExtends = (ownSelector && hasResolvedNestedSelector)
|
|
531
|
+
? visibleExtends.filter(instruction => instruction.partial)
|
|
532
|
+
: visibleExtends;
|
|
533
|
+
const ownAfterRelevant = (ownSelector && hasResolvedNestedSelector)
|
|
534
|
+
? applyExtendsToSelector(ownSelector, ownRelevantExtends)
|
|
535
|
+
: null;
|
|
536
|
+
const ownChangedByRelevant = Boolean(ownSelector
|
|
537
|
+
&& ownAfterRelevant
|
|
538
|
+
&& ownAfterRelevant.valueOf() !== ownSelector.valueOf());
|
|
539
|
+
const parentRuleset = (ruleset.parent?.parent && isNode(ruleset.parent.parent, 'Ruleset')
|
|
540
|
+
? ruleset.parent.parent
|
|
541
|
+
: null);
|
|
542
|
+
const parentSelectorForBoundary = parentRuleset?.value.selector;
|
|
543
|
+
const parentHasCombinatorContext = Boolean(parentSelectorForBoundary
|
|
544
|
+
&& !(parentSelectorForBoundary instanceof Nil)
|
|
545
|
+
&& (() => {
|
|
546
|
+
try {
|
|
547
|
+
for (const n of parentSelectorForBoundary.nodes()) {
|
|
548
|
+
if (isNode(n, 'Combinator')) {
|
|
549
|
+
return true;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
catch { }
|
|
554
|
+
return false;
|
|
555
|
+
})());
|
|
556
|
+
const parentHoistedBoundaryCompose = Boolean(ownSelector
|
|
557
|
+
&& hasResolvedNestedSelector
|
|
558
|
+
&& !hasOnlyPartialExtends
|
|
559
|
+
&& !ownChangedByRelevant
|
|
560
|
+
&& rootRules.options?.referenceMode !== true
|
|
561
|
+
&& parentRuleset?.hoistToRoot
|
|
562
|
+
&& !newSelector.hoistToRoot);
|
|
563
|
+
if (parentHoistedBoundaryCompose) {
|
|
564
|
+
const parentSelector = parentRuleset?.value.selector;
|
|
565
|
+
if (parentSelector && !(parentSelector instanceof Nil) && isNode(parentSelector, 'SelectorList')) {
|
|
566
|
+
const parentItems = parentSelector.value;
|
|
567
|
+
const complexItems = parentItems.filter(item => isNode(item, 'ComplexSelector'));
|
|
568
|
+
if (complexItems.length === parentItems.length && complexItems.length >= 2) {
|
|
569
|
+
const first = complexItems[0];
|
|
570
|
+
const allTri = complexItems.every(c => c.value.length === 3 && isNode(c.value[1], 'Combinator'));
|
|
571
|
+
if (allTri) {
|
|
572
|
+
const leftKey = first.value[0].valueOf();
|
|
573
|
+
const combKey = first.value[1].valueOf();
|
|
574
|
+
const samePrefix = complexItems.every(c => c.value[0].valueOf() === leftKey
|
|
575
|
+
&& c.value[1].valueOf() === combKey);
|
|
576
|
+
if (samePrefix) {
|
|
577
|
+
const ownSelectorNode = ownSelector;
|
|
578
|
+
const middleIs = PseudoSelector.create({
|
|
579
|
+
name: ':is',
|
|
580
|
+
arg: SelectorList.create(complexItems.map(c => c.value[2].copy(true)))
|
|
581
|
+
});
|
|
582
|
+
const parentFactored = ComplexSelector.create([
|
|
583
|
+
first.value[0].copy(true),
|
|
584
|
+
first.value[1].copy(true),
|
|
585
|
+
middleIs
|
|
586
|
+
]);
|
|
587
|
+
const ownArg = isNode(ownSelectorNode, 'SelectorList')
|
|
588
|
+
? SelectorList.create(ownSelectorNode.value.map(s => s.copy(true)))
|
|
589
|
+
: SelectorList.create([ownSelectorNode.copy(true)]);
|
|
590
|
+
const ownIs = PseudoSelector.create({ name: ':is', arg: ownArg });
|
|
591
|
+
newSelector = ComplexSelector.create([
|
|
592
|
+
...parentFactored.value.map(c => c.copy(true)),
|
|
593
|
+
Combinator.create(' '),
|
|
594
|
+
ownIs
|
|
595
|
+
]).inherit(newSelector);
|
|
596
|
+
newSelector.hoistToRoot = true;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
const boundaryOnlyNestedExactChange = Boolean(ownSelector
|
|
603
|
+
&& hasResolvedNestedSelector
|
|
604
|
+
&& !hasOnlyPartialExtends
|
|
605
|
+
&& !ownChangedByRelevant
|
|
606
|
+
&& parentHasCombinatorContext
|
|
607
|
+
&& !(ruleset.parent?.parent
|
|
608
|
+
&& isNode(ruleset.parent.parent, 'Ruleset')
|
|
609
|
+
&& Boolean(ruleset.parent.parent.hoistToRoot))
|
|
610
|
+
&& !newSelector.hoistToRoot);
|
|
611
|
+
if (boundaryOnlyNestedExactChange) {
|
|
612
|
+
newSelector.hoistToRoot = true;
|
|
613
|
+
}
|
|
614
|
+
const finalAfterValue = newSelector.valueOf();
|
|
615
|
+
if (beforeValue === finalAfterValue) {
|
|
616
|
+
continue;
|
|
617
|
+
}
|
|
618
|
+
if (hasOnlyPartialExtends && isNode(newSelector, 'SelectorList')) {
|
|
619
|
+
const previousValues = new Set();
|
|
620
|
+
if (isNode(selector, 'SelectorList')) {
|
|
621
|
+
for (const item of selector.value) {
|
|
622
|
+
previousValues.add(item.valueOf());
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
previousValues.add(selector.valueOf());
|
|
627
|
+
}
|
|
628
|
+
for (const item of newSelector.value) {
|
|
629
|
+
if (!previousValues.has(item.valueOf())) {
|
|
630
|
+
item.addFlag(F_EXTENDED);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
ruleset.value.selector = newSelector;
|
|
635
|
+
ruleset.invalidateSelectorValueCache();
|
|
636
|
+
if (newSelector.hoistToRoot) {
|
|
637
|
+
ruleset.hoistToRoot = true;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
for (const instruction of instructions) {
|
|
643
|
+
const stats = instructionStats.get(instruction);
|
|
644
|
+
if (!stats || instruction.fromReferenceScope === true) {
|
|
645
|
+
continue;
|
|
646
|
+
}
|
|
647
|
+
if (stats.visibleMatchCount > 0) {
|
|
648
|
+
continue;
|
|
649
|
+
}
|
|
650
|
+
const target = instruction.target.valueOf();
|
|
651
|
+
const targetLocation = instruction.target.location;
|
|
652
|
+
const targetLine = targetLocation.length >= 2 ? targetLocation[1] : undefined;
|
|
653
|
+
const targetColumn = targetLocation.length >= 3 ? targetLocation[2] : undefined;
|
|
654
|
+
const targetFile = instruction.target.treeContext?.file;
|
|
655
|
+
const targetFilePath = targetFile?.fullPath;
|
|
656
|
+
const inaccessibleMatchExists = Array.from(context.extendRoots.getAllRoots()).some((root) => {
|
|
657
|
+
if (isInstructionVisibleForRoot(context, root, instruction)) {
|
|
658
|
+
return false;
|
|
659
|
+
}
|
|
660
|
+
return rootHasTargetMatch(root, instruction.target, instruction.partial);
|
|
661
|
+
});
|
|
662
|
+
const blockedProtectedRootExists = Array.from(context.extendRoots.getAllRoots()).some(root => !isInstructionVisibleForRoot(context, root, instruction)
|
|
663
|
+
&& context.extendRoots.isProtectedRoot(root));
|
|
664
|
+
const diagnostic = (stats.blockedMatchCount > 0 || inaccessibleMatchExists || blockedProtectedRootExists
|
|
665
|
+
? WARN.extendNotAccessible({
|
|
666
|
+
ctx: targetFile ? { file: targetFile } : undefined,
|
|
667
|
+
filePath: targetFilePath,
|
|
668
|
+
line: targetLine,
|
|
669
|
+
column: targetColumn,
|
|
670
|
+
meta: { target }
|
|
671
|
+
})
|
|
672
|
+
: WARN.extendNotFound({
|
|
673
|
+
ctx: targetFile ? { file: targetFile } : undefined,
|
|
674
|
+
filePath: targetFilePath,
|
|
675
|
+
line: targetLine,
|
|
676
|
+
column: targetColumn,
|
|
677
|
+
meta: { target }
|
|
678
|
+
}));
|
|
679
|
+
context.warnings.push(toDiagnostic(diagnostic));
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
//# sourceMappingURL=extend-roots.js.map
|