@jesscss/core 2.0.0-alpha.4 → 2.0.0-alpha.6
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/lib/index.cjs +20159 -0
- package/lib/index.d.cts +5993 -0
- package/lib/index.d.cts.map +1 -0
- package/lib/index.d.ts +5992 -21
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +19926 -22
- package/lib/index.js.map +1 -1
- package/package.json +15 -14
- package/src/__tests__/define-function-record.test.ts +58 -0
- package/src/__tests__/define-function-simple.test.ts +55 -0
- package/src/__tests__/define-function-split-sequence.test.ts +547 -0
- package/src/__tests__/define-function-type-parity.test.ts +9 -0
- package/src/__tests__/define-function.test.ts +763 -0
- package/src/__tests__/num-operations.test.ts +91 -0
- package/src/__tests__/safe-parse.test.ts +374 -0
- package/src/context.ts +896 -0
- package/src/conversions.ts +282 -0
- package/src/debug-log.ts +29 -0
- package/src/define-function.ts +1006 -0
- package/src/deprecation.ts +67 -0
- package/src/globals.d.ts +26 -0
- package/src/index.ts +31 -0
- package/src/jess-error.ts +773 -0
- package/src/logger/deprecation-processing.ts +109 -0
- package/src/logger.ts +31 -0
- package/src/plugin.ts +292 -0
- package/src/tree/LOOKUP_CHAINS.md +35 -0
- package/src/tree/README.md +18 -0
- package/src/tree/__tests__/__snapshots__/extend-eval-integration.test.ts.snap +1455 -0
- package/src/tree/__tests__/ampersand.test.ts +382 -0
- package/src/tree/__tests__/at-rule.test.ts +2047 -0
- package/src/tree/__tests__/basic-render.test.ts +212 -0
- package/src/tree/__tests__/block.test.ts +40 -0
- package/src/tree/__tests__/call.test.ts +346 -0
- package/src/tree/__tests__/color.test.ts +537 -0
- package/src/tree/__tests__/condition.test.ts +186 -0
- package/src/tree/__tests__/control.test.ts +564 -0
- package/src/tree/__tests__/declaration.test.ts +253 -0
- package/src/tree/__tests__/dependency-graph.test.ts +177 -0
- package/src/tree/__tests__/detached-rulesets.test.ts +213 -0
- package/src/tree/__tests__/dimension.test.ts +236 -0
- package/src/tree/__tests__/expression.test.ts +73 -0
- package/src/tree/__tests__/ext-node.test.ts +31 -0
- package/src/tree/__tests__/extend-eval-integration.test.ts +1033 -0
- package/src/tree/__tests__/extend-import-style.test.ts +929 -0
- package/src/tree/__tests__/extend-less-fixtures.test.ts +851 -0
- package/src/tree/__tests__/extend-list.test.ts +31 -0
- package/src/tree/__tests__/extend-roots.test.ts +1045 -0
- package/src/tree/__tests__/extend-rules.test.ts +740 -0
- package/src/tree/__tests__/func.test.ts +171 -0
- package/src/tree/__tests__/import-js.test.ts +33 -0
- package/src/tree/__tests__/import-style-test-helpers.ts +56 -0
- package/src/tree/__tests__/import-style.test.ts +1967 -0
- package/src/tree/__tests__/interpolated-reference.test.ts +44 -0
- package/src/tree/__tests__/interpolated.test.ts +41 -0
- package/src/tree/__tests__/list.test.ts +177 -0
- package/src/tree/__tests__/log.test.ts +83 -0
- package/src/tree/__tests__/mixin-recursion.test.ts +639 -0
- package/src/tree/__tests__/mixin.test.ts +2171 -0
- package/src/tree/__tests__/negative.test.ts +45 -0
- package/src/tree/__tests__/nesting-collapse.test.ts +519 -0
- package/src/tree/__tests__/node-flags-perf.test.ts +195 -0
- package/src/tree/__tests__/node-flags.test.ts +410 -0
- package/src/tree/__tests__/node-graph.test.ts +598 -0
- package/src/tree/__tests__/node-mutation.test.ts +182 -0
- package/src/tree/__tests__/operation.test.ts +18 -0
- package/src/tree/__tests__/paren.test.ts +90 -0
- package/src/tree/__tests__/preserve-mode-output.test.ts +50 -0
- package/src/tree/__tests__/quoted.test.ts +72 -0
- package/src/tree/__tests__/range.test.ts +59 -0
- package/src/tree/__tests__/reference.test.ts +743 -0
- package/src/tree/__tests__/rest.test.ts +29 -0
- package/src/tree/__tests__/rules-raw.test.ts +14 -0
- package/src/tree/__tests__/rules.test.ts +1271 -0
- package/src/tree/__tests__/ruleset.test.ts +597 -0
- package/src/tree/__tests__/selector-attr.test.ts +50 -0
- package/src/tree/__tests__/selector-basic.test.ts +44 -0
- package/src/tree/__tests__/selector-capture.test.ts +22 -0
- package/src/tree/__tests__/selector-complex.test.ts +120 -0
- package/src/tree/__tests__/selector-compound.test.ts +74 -0
- package/src/tree/__tests__/selector-interpolated.test.ts +50 -0
- package/src/tree/__tests__/selector-list.test.ts +59 -0
- package/src/tree/__tests__/selector-pseudo.test.ts +23 -0
- package/src/tree/__tests__/selector.test.ts +182 -0
- package/src/tree/__tests__/sequence.test.ts +226 -0
- package/src/tree/__tests__/serialize-types.test.ts +529 -0
- package/src/tree/__tests__/spaced.test.ts +8 -0
- package/src/tree/__tests__/url.test.ts +72 -0
- package/src/tree/__tests__/var-declaration.test.ts +90 -0
- package/src/tree/ampersand.ts +538 -0
- package/src/tree/any.ts +169 -0
- package/src/tree/at-rule.ts +760 -0
- package/src/tree/block.ts +72 -0
- package/src/tree/bool.ts +46 -0
- package/src/tree/call.ts +593 -0
- package/src/tree/collection.ts +52 -0
- package/src/tree/color.ts +629 -0
- package/src/tree/combinator.ts +30 -0
- package/src/tree/comment.ts +36 -0
- package/src/tree/condition.ts +194 -0
- package/src/tree/control.ts +452 -0
- package/src/tree/declaration-custom.ts +56 -0
- package/src/tree/declaration-var.ts +87 -0
- package/src/tree/declaration.ts +742 -0
- package/src/tree/default-guard.ts +35 -0
- package/src/tree/dimension.ts +392 -0
- package/src/tree/expression.ts +97 -0
- package/src/tree/extend-list.ts +51 -0
- package/src/tree/extend.ts +391 -0
- package/src/tree/function.ts +254 -0
- package/src/tree/import-js.ts +130 -0
- package/src/tree/import-style.ts +875 -0
- package/{lib/tree/index.js → src/tree/index.ts} +49 -22
- package/src/tree/interpolated.ts +346 -0
- package/src/tree/js-array.ts +21 -0
- package/src/tree/js-expr.ts +50 -0
- package/src/tree/js-function.ts +31 -0
- package/src/tree/js-object.ts +22 -0
- package/src/tree/list.ts +415 -0
- package/src/tree/log.ts +89 -0
- package/src/tree/mixin.ts +331 -0
- package/src/tree/negative.ts +58 -0
- package/src/tree/nil.ts +57 -0
- package/src/tree/node-base.ts +1716 -0
- package/src/tree/node-type.ts +122 -0
- package/src/tree/node.ts +118 -0
- package/src/tree/number.ts +54 -0
- package/src/tree/operation.ts +187 -0
- package/src/tree/paren.ts +132 -0
- package/src/tree/query-condition.ts +47 -0
- package/src/tree/quoted.ts +119 -0
- package/src/tree/range.ts +101 -0
- package/src/tree/reference.ts +1099 -0
- package/src/tree/rest.ts +55 -0
- package/src/tree/rules-raw.ts +52 -0
- package/src/tree/rules.ts +2896 -0
- package/src/tree/ruleset.ts +1217 -0
- package/src/tree/selector-attr.ts +172 -0
- package/src/tree/selector-basic.ts +75 -0
- package/src/tree/selector-capture.ts +85 -0
- package/src/tree/selector-complex.ts +189 -0
- package/src/tree/selector-compound.ts +205 -0
- package/src/tree/selector-interpolated.ts +95 -0
- package/src/tree/selector-list.ts +245 -0
- package/src/tree/selector-pseudo.ts +173 -0
- package/src/tree/selector-simple.ts +10 -0
- package/src/tree/selector.ts +152 -0
- package/src/tree/sequence.ts +463 -0
- package/src/tree/tree.ts +130 -0
- package/src/tree/url.ts +95 -0
- package/src/tree/util/EXTEND_ARCHITECTURE_ANALYSIS.md +215 -0
- package/src/tree/util/EXTEND_AUDIT.md +233 -0
- package/src/tree/util/EXTEND_BASELINE.md +64 -0
- package/src/tree/util/EXTEND_CALL_GRAPH_ANALYSIS.md +244 -0
- package/src/tree/util/EXTEND_DOCS.md +24 -0
- package/src/tree/util/EXTEND_FINAL_SUMMARY.md +95 -0
- package/src/tree/util/EXTEND_FUNCTION_AUDIT.md +1433 -0
- package/src/tree/util/EXTEND_OPTIMIZATION_PLAN.md +114 -0
- package/src/tree/util/EXTEND_REFACTORING_SUMMARY.md +152 -0
- package/src/tree/util/EXTEND_RULES.md +74 -0
- package/src/tree/util/EXTEND_UNUSED_FUNCTIONS.md +127 -0
- package/src/tree/util/EXTEND_UNUSED_FUNCTIONS_ANALYSIS.md +227 -0
- package/src/tree/util/NODE_COPY_REDUCTION_PLAN.md +12 -0
- package/src/tree/util/__tests__/EXTEND_TEST_INDEX.md +59 -0
- package/src/tree/util/__tests__/OPTIMIZATION-ANALYSIS.md +130 -0
- package/src/tree/util/__tests__/WALK_AND_CONSUME_DESIGN.md +138 -0
- package/src/tree/util/__tests__/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md +9 -0
- package/src/tree/util/__tests__/_archive/README.md +4 -0
- package/src/tree/util/__tests__/bitset.test.ts +142 -0
- package/src/tree/util/__tests__/debug-log.ts +50 -0
- package/src/tree/util/__tests__/extend-comment-handling.test.ts +187 -0
- package/src/tree/util/__tests__/extend-core-unit.test.ts +941 -0
- package/src/tree/util/__tests__/extend-pipeline-bench.test.ts +154 -0
- package/src/tree/util/__tests__/extend-pipeline-bench.ts +190 -0
- package/src/tree/util/__tests__/fast-reject.test.ts +377 -0
- package/src/tree/util/__tests__/is-node.test.ts +63 -0
- package/src/tree/util/__tests__/list-like.test.ts +63 -0
- package/src/tree/util/__tests__/outputwriter.test.ts +523 -0
- package/src/tree/util/__tests__/print.test.ts +183 -0
- package/src/tree/util/__tests__/process-extends.test.ts +226 -0
- package/src/tree/util/__tests__/process-leading-is.test.ts +205 -0
- package/src/tree/util/__tests__/recursion-helper.test.ts +184 -0
- package/src/tree/util/__tests__/selector-match-unit.test.ts +1427 -0
- package/src/tree/util/__tests__/sourcemap.test.ts +117 -0
- package/src/tree/util/ampersand-template.ts +9 -0
- package/src/tree/util/bitset.ts +194 -0
- package/src/tree/util/calculate.ts +11 -0
- package/src/tree/util/cast.ts +89 -0
- package/src/tree/util/cloning.ts +8 -0
- package/src/tree/util/collections.ts +299 -0
- package/src/tree/util/compare.ts +90 -0
- package/src/tree/util/cursor.ts +171 -0
- package/src/tree/util/extend-core.ts +2139 -0
- package/src/tree/util/extend-roots.ts +1108 -0
- package/src/tree/util/field-helpers.ts +354 -0
- package/src/tree/util/is-node.ts +43 -0
- package/src/tree/util/list-like.ts +93 -0
- package/src/tree/util/mixin-instance-primitives.ts +2020 -0
- package/src/tree/util/print.ts +303 -0
- package/src/tree/util/process-leading-is.ts +421 -0
- package/src/tree/util/recursion-helper.ts +54 -0
- package/src/tree/util/regex.ts +2 -0
- package/src/tree/util/registry-utils.ts +1953 -0
- package/src/tree/util/ruleset-trace.ts +17 -0
- package/src/tree/util/scoped-body-eval.ts +320 -0
- package/src/tree/util/selector-match-core.ts +2005 -0
- package/src/tree/util/selector-utils.ts +757 -0
- package/src/tree/util/serialize-helper.ts +535 -0
- package/src/tree/util/serialize-types.ts +318 -0
- package/src/tree/util/should-operate.ts +78 -0
- package/src/tree/util/sourcemap.ts +37 -0
- package/src/types/config.ts +247 -0
- package/src/types/index.ts +12 -0
- package/{lib/types/modes.d.ts → src/types/modes.ts} +2 -1
- package/src/types.d.ts +9 -0
- package/src/types.ts +68 -0
- package/src/use-webpack-resolver.ts +56 -0
- package/src/visitor/__tests__/visitor.test.ts +136 -0
- package/src/visitor/index.ts +263 -0
- package/{lib/visitor/less-visitor.js → src/visitor/less-visitor.ts} +3 -2
- package/lib/context.d.ts +0 -352
- package/lib/context.d.ts.map +0 -1
- package/lib/context.js +0 -636
- package/lib/context.js.map +0 -1
- package/lib/conversions.d.ts +0 -73
- package/lib/conversions.d.ts.map +0 -1
- package/lib/conversions.js +0 -253
- package/lib/conversions.js.map +0 -1
- package/lib/debug-log.d.ts +0 -2
- package/lib/debug-log.d.ts.map +0 -1
- package/lib/debug-log.js +0 -27
- package/lib/debug-log.js.map +0 -1
- package/lib/define-function.d.ts +0 -587
- package/lib/define-function.d.ts.map +0 -1
- package/lib/define-function.js +0 -726
- package/lib/define-function.js.map +0 -1
- package/lib/deprecation.d.ts +0 -34
- package/lib/deprecation.d.ts.map +0 -1
- package/lib/deprecation.js +0 -57
- package/lib/deprecation.js.map +0 -1
- package/lib/jess-error.d.ts +0 -343
- package/lib/jess-error.d.ts.map +0 -1
- package/lib/jess-error.js +0 -508
- package/lib/jess-error.js.map +0 -1
- package/lib/logger/deprecation-processing.d.ts +0 -41
- package/lib/logger/deprecation-processing.d.ts.map +0 -1
- package/lib/logger/deprecation-processing.js +0 -81
- package/lib/logger/deprecation-processing.js.map +0 -1
- package/lib/logger.d.ts +0 -10
- package/lib/logger.d.ts.map +0 -1
- package/lib/logger.js +0 -20
- package/lib/logger.js.map +0 -1
- package/lib/plugin.d.ts +0 -94
- package/lib/plugin.d.ts.map +0 -1
- package/lib/plugin.js +0 -174
- package/lib/plugin.js.map +0 -1
- package/lib/tree/ampersand.d.ts +0 -94
- package/lib/tree/ampersand.d.ts.map +0 -1
- package/lib/tree/ampersand.js +0 -269
- package/lib/tree/ampersand.js.map +0 -1
- package/lib/tree/any.d.ts +0 -58
- package/lib/tree/any.d.ts.map +0 -1
- package/lib/tree/any.js +0 -104
- package/lib/tree/any.js.map +0 -1
- package/lib/tree/at-rule.d.ts +0 -53
- package/lib/tree/at-rule.d.ts.map +0 -1
- package/lib/tree/at-rule.js +0 -503
- package/lib/tree/at-rule.js.map +0 -1
- package/lib/tree/block.d.ts +0 -22
- package/lib/tree/block.d.ts.map +0 -1
- package/lib/tree/block.js +0 -24
- package/lib/tree/block.js.map +0 -1
- package/lib/tree/bool.d.ts +0 -18
- package/lib/tree/bool.d.ts.map +0 -1
- package/lib/tree/bool.js +0 -28
- package/lib/tree/bool.js.map +0 -1
- package/lib/tree/call.d.ts +0 -66
- package/lib/tree/call.d.ts.map +0 -1
- package/lib/tree/call.js +0 -306
- package/lib/tree/call.js.map +0 -1
- package/lib/tree/collection.d.ts +0 -30
- package/lib/tree/collection.d.ts.map +0 -1
- package/lib/tree/collection.js +0 -37
- package/lib/tree/collection.js.map +0 -1
- package/lib/tree/color.d.ts +0 -101
- package/lib/tree/color.d.ts.map +0 -1
- package/lib/tree/color.js +0 -513
- package/lib/tree/color.js.map +0 -1
- package/lib/tree/combinator.d.ts +0 -13
- package/lib/tree/combinator.d.ts.map +0 -1
- package/lib/tree/combinator.js +0 -12
- package/lib/tree/combinator.js.map +0 -1
- package/lib/tree/comment.d.ts +0 -20
- package/lib/tree/comment.d.ts.map +0 -1
- package/lib/tree/comment.js +0 -19
- package/lib/tree/comment.js.map +0 -1
- package/lib/tree/condition.d.ts +0 -31
- package/lib/tree/condition.d.ts.map +0 -1
- package/lib/tree/condition.js +0 -103
- package/lib/tree/condition.js.map +0 -1
- package/lib/tree/control.d.ts +0 -104
- package/lib/tree/control.d.ts.map +0 -1
- package/lib/tree/control.js +0 -430
- package/lib/tree/control.js.map +0 -1
- package/lib/tree/declaration-custom.d.ts +0 -18
- package/lib/tree/declaration-custom.d.ts.map +0 -1
- package/lib/tree/declaration-custom.js +0 -24
- package/lib/tree/declaration-custom.js.map +0 -1
- package/lib/tree/declaration-var.d.ts +0 -35
- package/lib/tree/declaration-var.d.ts.map +0 -1
- package/lib/tree/declaration-var.js +0 -63
- package/lib/tree/declaration-var.js.map +0 -1
- package/lib/tree/declaration.d.ts +0 -78
- package/lib/tree/declaration.d.ts.map +0 -1
- package/lib/tree/declaration.js +0 -286
- package/lib/tree/declaration.js.map +0 -1
- package/lib/tree/default-guard.d.ts +0 -15
- package/lib/tree/default-guard.d.ts.map +0 -1
- package/lib/tree/default-guard.js +0 -19
- package/lib/tree/default-guard.js.map +0 -1
- package/lib/tree/dimension.d.ts +0 -34
- package/lib/tree/dimension.d.ts.map +0 -1
- package/lib/tree/dimension.js +0 -294
- package/lib/tree/dimension.js.map +0 -1
- package/lib/tree/expression.d.ts +0 -25
- package/lib/tree/expression.d.ts.map +0 -1
- package/lib/tree/expression.js +0 -32
- package/lib/tree/expression.js.map +0 -1
- package/lib/tree/extend-list.d.ts +0 -23
- package/lib/tree/extend-list.d.ts.map +0 -1
- package/lib/tree/extend-list.js +0 -23
- package/lib/tree/extend-list.js.map +0 -1
- package/lib/tree/extend.d.ts +0 -47
- package/lib/tree/extend.d.ts.map +0 -1
- package/lib/tree/extend.js +0 -296
- package/lib/tree/extend.js.map +0 -1
- package/lib/tree/function.d.ts +0 -48
- package/lib/tree/function.d.ts.map +0 -1
- package/lib/tree/function.js +0 -74
- package/lib/tree/function.js.map +0 -1
- package/lib/tree/import-js.d.ts +0 -35
- package/lib/tree/import-js.d.ts.map +0 -1
- package/lib/tree/import-js.js +0 -45
- package/lib/tree/import-js.js.map +0 -1
- package/lib/tree/import-style.d.ts +0 -156
- package/lib/tree/import-style.d.ts.map +0 -1
- package/lib/tree/import-style.js +0 -566
- package/lib/tree/import-style.js.map +0 -1
- package/lib/tree/index.d.ts +0 -71
- package/lib/tree/index.d.ts.map +0 -1
- package/lib/tree/index.js.map +0 -1
- package/lib/tree/interpolated-reference.d.ts +0 -24
- package/lib/tree/interpolated-reference.d.ts.map +0 -1
- package/lib/tree/interpolated-reference.js +0 -37
- package/lib/tree/interpolated-reference.js.map +0 -1
- package/lib/tree/interpolated.d.ts +0 -62
- package/lib/tree/interpolated.d.ts.map +0 -1
- package/lib/tree/interpolated.js +0 -204
- package/lib/tree/interpolated.js.map +0 -1
- package/lib/tree/js-array.d.ts +0 -10
- package/lib/tree/js-array.d.ts.map +0 -1
- package/lib/tree/js-array.js +0 -10
- package/lib/tree/js-array.js.map +0 -1
- package/lib/tree/js-expr.d.ts +0 -23
- package/lib/tree/js-expr.d.ts.map +0 -1
- package/lib/tree/js-expr.js +0 -28
- package/lib/tree/js-expr.js.map +0 -1
- package/lib/tree/js-function.d.ts +0 -20
- package/lib/tree/js-function.d.ts.map +0 -1
- package/lib/tree/js-function.js +0 -16
- package/lib/tree/js-function.js.map +0 -1
- package/lib/tree/js-object.d.ts +0 -10
- package/lib/tree/js-object.d.ts.map +0 -1
- package/lib/tree/js-object.js +0 -10
- package/lib/tree/js-object.js.map +0 -1
- package/lib/tree/list.d.ts +0 -38
- package/lib/tree/list.d.ts.map +0 -1
- package/lib/tree/list.js +0 -83
- package/lib/tree/list.js.map +0 -1
- package/lib/tree/log.d.ts +0 -29
- package/lib/tree/log.d.ts.map +0 -1
- package/lib/tree/log.js +0 -56
- package/lib/tree/log.js.map +0 -1
- package/lib/tree/mixin.d.ts +0 -87
- package/lib/tree/mixin.d.ts.map +0 -1
- package/lib/tree/mixin.js +0 -112
- package/lib/tree/mixin.js.map +0 -1
- package/lib/tree/negative.d.ts +0 -17
- package/lib/tree/negative.d.ts.map +0 -1
- package/lib/tree/negative.js +0 -22
- package/lib/tree/negative.js.map +0 -1
- package/lib/tree/nil.d.ts +0 -30
- package/lib/tree/nil.d.ts.map +0 -1
- package/lib/tree/nil.js +0 -35
- package/lib/tree/nil.js.map +0 -1
- package/lib/tree/node-base.d.ts +0 -361
- package/lib/tree/node-base.d.ts.map +0 -1
- package/lib/tree/node-base.js +0 -930
- package/lib/tree/node-base.js.map +0 -1
- package/lib/tree/node.d.ts +0 -10
- package/lib/tree/node.d.ts.map +0 -1
- package/lib/tree/node.js +0 -45
- package/lib/tree/node.js.map +0 -1
- package/lib/tree/number.d.ts +0 -21
- package/lib/tree/number.d.ts.map +0 -1
- package/lib/tree/number.js +0 -27
- package/lib/tree/number.js.map +0 -1
- package/lib/tree/operation.d.ts +0 -26
- package/lib/tree/operation.d.ts.map +0 -1
- package/lib/tree/operation.js +0 -103
- package/lib/tree/operation.js.map +0 -1
- package/lib/tree/paren.d.ts +0 -19
- package/lib/tree/paren.d.ts.map +0 -1
- package/lib/tree/paren.js +0 -92
- package/lib/tree/paren.js.map +0 -1
- package/lib/tree/query-condition.d.ts +0 -17
- package/lib/tree/query-condition.d.ts.map +0 -1
- package/lib/tree/query-condition.js +0 -39
- package/lib/tree/query-condition.js.map +0 -1
- package/lib/tree/quoted.d.ts +0 -28
- package/lib/tree/quoted.d.ts.map +0 -1
- package/lib/tree/quoted.js +0 -75
- package/lib/tree/quoted.js.map +0 -1
- package/lib/tree/range.d.ts +0 -33
- package/lib/tree/range.d.ts.map +0 -1
- package/lib/tree/range.js +0 -47
- package/lib/tree/range.js.map +0 -1
- package/lib/tree/reference.d.ts +0 -76
- package/lib/tree/reference.d.ts.map +0 -1
- package/lib/tree/reference.js +0 -521
- package/lib/tree/reference.js.map +0 -1
- package/lib/tree/rest.d.ts +0 -15
- package/lib/tree/rest.d.ts.map +0 -1
- package/lib/tree/rest.js +0 -32
- package/lib/tree/rest.js.map +0 -1
- package/lib/tree/rules-raw.d.ts +0 -17
- package/lib/tree/rules-raw.d.ts.map +0 -1
- package/lib/tree/rules-raw.js +0 -37
- package/lib/tree/rules-raw.js.map +0 -1
- package/lib/tree/rules.d.ts +0 -262
- package/lib/tree/rules.d.ts.map +0 -1
- package/lib/tree/rules.js +0 -2359
- package/lib/tree/rules.js.map +0 -1
- package/lib/tree/ruleset.d.ts +0 -92
- package/lib/tree/ruleset.d.ts.map +0 -1
- package/lib/tree/ruleset.js +0 -528
- package/lib/tree/ruleset.js.map +0 -1
- package/lib/tree/selector-attr.d.ts +0 -31
- package/lib/tree/selector-attr.d.ts.map +0 -1
- package/lib/tree/selector-attr.js +0 -99
- package/lib/tree/selector-attr.js.map +0 -1
- package/lib/tree/selector-basic.d.ts +0 -24
- package/lib/tree/selector-basic.d.ts.map +0 -1
- package/lib/tree/selector-basic.js +0 -38
- package/lib/tree/selector-basic.js.map +0 -1
- package/lib/tree/selector-capture.d.ts +0 -23
- package/lib/tree/selector-capture.d.ts.map +0 -1
- package/lib/tree/selector-capture.js +0 -34
- package/lib/tree/selector-capture.js.map +0 -1
- package/lib/tree/selector-complex.d.ts +0 -40
- package/lib/tree/selector-complex.d.ts.map +0 -1
- package/lib/tree/selector-complex.js +0 -143
- package/lib/tree/selector-complex.js.map +0 -1
- package/lib/tree/selector-compound.d.ts +0 -16
- package/lib/tree/selector-compound.d.ts.map +0 -1
- package/lib/tree/selector-compound.js +0 -114
- package/lib/tree/selector-compound.js.map +0 -1
- package/lib/tree/selector-interpolated.d.ts +0 -23
- package/lib/tree/selector-interpolated.d.ts.map +0 -1
- package/lib/tree/selector-interpolated.js +0 -27
- package/lib/tree/selector-interpolated.js.map +0 -1
- package/lib/tree/selector-list.d.ts +0 -17
- package/lib/tree/selector-list.d.ts.map +0 -1
- package/lib/tree/selector-list.js +0 -174
- package/lib/tree/selector-list.js.map +0 -1
- package/lib/tree/selector-pseudo.d.ts +0 -42
- package/lib/tree/selector-pseudo.d.ts.map +0 -1
- package/lib/tree/selector-pseudo.js +0 -204
- package/lib/tree/selector-pseudo.js.map +0 -1
- package/lib/tree/selector-simple.d.ts +0 -5
- package/lib/tree/selector-simple.d.ts.map +0 -1
- package/lib/tree/selector-simple.js +0 -6
- package/lib/tree/selector-simple.js.map +0 -1
- package/lib/tree/selector.d.ts +0 -43
- package/lib/tree/selector.d.ts.map +0 -1
- package/lib/tree/selector.js +0 -56
- package/lib/tree/selector.js.map +0 -1
- package/lib/tree/sequence.d.ts +0 -43
- package/lib/tree/sequence.d.ts.map +0 -1
- package/lib/tree/sequence.js +0 -151
- package/lib/tree/sequence.js.map +0 -1
- package/lib/tree/tree.d.ts +0 -87
- package/lib/tree/tree.d.ts.map +0 -1
- package/lib/tree/tree.js +0 -2
- package/lib/tree/tree.js.map +0 -1
- package/lib/tree/url.d.ts +0 -18
- package/lib/tree/url.d.ts.map +0 -1
- package/lib/tree/url.js +0 -35
- package/lib/tree/url.js.map +0 -1
- package/lib/tree/util/__tests__/debug-log.d.ts +0 -1
- package/lib/tree/util/__tests__/debug-log.d.ts.map +0 -1
- package/lib/tree/util/__tests__/debug-log.js +0 -36
- package/lib/tree/util/__tests__/debug-log.js.map +0 -1
- package/lib/tree/util/calculate.d.ts +0 -3
- package/lib/tree/util/calculate.d.ts.map +0 -1
- package/lib/tree/util/calculate.js +0 -10
- package/lib/tree/util/calculate.js.map +0 -1
- package/lib/tree/util/cast.d.ts +0 -10
- package/lib/tree/util/cast.d.ts.map +0 -1
- package/lib/tree/util/cast.js +0 -87
- package/lib/tree/util/cast.js.map +0 -1
- package/lib/tree/util/cloning.d.ts +0 -4
- package/lib/tree/util/cloning.d.ts.map +0 -1
- package/lib/tree/util/cloning.js +0 -8
- package/lib/tree/util/cloning.js.map +0 -1
- package/lib/tree/util/collections.d.ts +0 -57
- package/lib/tree/util/collections.d.ts.map +0 -1
- package/lib/tree/util/collections.js +0 -136
- package/lib/tree/util/collections.js.map +0 -1
- package/lib/tree/util/compare.d.ts +0 -11
- package/lib/tree/util/compare.d.ts.map +0 -1
- package/lib/tree/util/compare.js +0 -89
- package/lib/tree/util/compare.js.map +0 -1
- package/lib/tree/util/extend-helpers.d.ts +0 -2
- package/lib/tree/util/extend-helpers.d.ts.map +0 -1
- package/lib/tree/util/extend-helpers.js +0 -2
- package/lib/tree/util/extend-helpers.js.map +0 -1
- package/lib/tree/util/extend-roots.d.ts +0 -37
- package/lib/tree/util/extend-roots.d.ts.map +0 -1
- package/lib/tree/util/extend-roots.js +0 -700
- package/lib/tree/util/extend-roots.js.map +0 -1
- package/lib/tree/util/extend-roots.old.d.ts +0 -132
- package/lib/tree/util/extend-roots.old.d.ts.map +0 -1
- package/lib/tree/util/extend-roots.old.js +0 -2272
- package/lib/tree/util/extend-roots.old.js.map +0 -1
- package/lib/tree/util/extend-trace-debug.d.ts +0 -13
- package/lib/tree/util/extend-trace-debug.d.ts.map +0 -1
- package/lib/tree/util/extend-trace-debug.js +0 -34
- package/lib/tree/util/extend-trace-debug.js.map +0 -1
- package/lib/tree/util/extend-walk.d.ts +0 -53
- package/lib/tree/util/extend-walk.d.ts.map +0 -1
- package/lib/tree/util/extend-walk.js +0 -881
- package/lib/tree/util/extend-walk.js.map +0 -1
- package/lib/tree/util/extend.d.ts +0 -218
- package/lib/tree/util/extend.d.ts.map +0 -1
- package/lib/tree/util/extend.js +0 -3182
- package/lib/tree/util/extend.js.map +0 -1
- package/lib/tree/util/find-extendable-locations.d.ts +0 -2
- package/lib/tree/util/find-extendable-locations.d.ts.map +0 -1
- package/lib/tree/util/find-extendable-locations.js +0 -2
- package/lib/tree/util/find-extendable-locations.js.map +0 -1
- package/lib/tree/util/format.d.ts +0 -20
- package/lib/tree/util/format.d.ts.map +0 -1
- package/lib/tree/util/format.js +0 -67
- package/lib/tree/util/format.js.map +0 -1
- package/lib/tree/util/is-node.d.ts +0 -13
- package/lib/tree/util/is-node.d.ts.map +0 -1
- package/lib/tree/util/is-node.js +0 -43
- package/lib/tree/util/is-node.js.map +0 -1
- package/lib/tree/util/print.d.ts +0 -80
- package/lib/tree/util/print.d.ts.map +0 -1
- package/lib/tree/util/print.js +0 -205
- package/lib/tree/util/print.js.map +0 -1
- package/lib/tree/util/process-leading-is.d.ts +0 -25
- package/lib/tree/util/process-leading-is.d.ts.map +0 -1
- package/lib/tree/util/process-leading-is.js +0 -364
- package/lib/tree/util/process-leading-is.js.map +0 -1
- package/lib/tree/util/recursion-helper.d.ts +0 -15
- package/lib/tree/util/recursion-helper.d.ts.map +0 -1
- package/lib/tree/util/recursion-helper.js +0 -43
- package/lib/tree/util/recursion-helper.js.map +0 -1
- package/lib/tree/util/regex.d.ts +0 -4
- package/lib/tree/util/regex.d.ts.map +0 -1
- package/lib/tree/util/regex.js +0 -4
- package/lib/tree/util/regex.js.map +0 -1
- package/lib/tree/util/registry-utils.d.ts +0 -192
- package/lib/tree/util/registry-utils.d.ts.map +0 -1
- package/lib/tree/util/registry-utils.js +0 -1214
- package/lib/tree/util/registry-utils.js.map +0 -1
- package/lib/tree/util/ruleset-trace.d.ts +0 -4
- package/lib/tree/util/ruleset-trace.d.ts.map +0 -1
- package/lib/tree/util/ruleset-trace.js +0 -14
- package/lib/tree/util/ruleset-trace.js.map +0 -1
- package/lib/tree/util/selector-compare.d.ts +0 -2
- package/lib/tree/util/selector-compare.d.ts.map +0 -1
- package/lib/tree/util/selector-compare.js +0 -2
- package/lib/tree/util/selector-compare.js.map +0 -1
- package/lib/tree/util/selector-match-core.d.ts +0 -184
- package/lib/tree/util/selector-match-core.d.ts.map +0 -1
- package/lib/tree/util/selector-match-core.js +0 -1603
- package/lib/tree/util/selector-match-core.js.map +0 -1
- package/lib/tree/util/selector-utils.d.ts +0 -30
- package/lib/tree/util/selector-utils.d.ts.map +0 -1
- package/lib/tree/util/selector-utils.js +0 -100
- package/lib/tree/util/selector-utils.js.map +0 -1
- package/lib/tree/util/serialize-helper.d.ts +0 -13
- package/lib/tree/util/serialize-helper.d.ts.map +0 -1
- package/lib/tree/util/serialize-helper.js +0 -387
- package/lib/tree/util/serialize-helper.js.map +0 -1
- package/lib/tree/util/serialize-types.d.ts +0 -9
- package/lib/tree/util/serialize-types.d.ts.map +0 -1
- package/lib/tree/util/serialize-types.js +0 -216
- package/lib/tree/util/serialize-types.js.map +0 -1
- package/lib/tree/util/should-operate.d.ts +0 -23
- package/lib/tree/util/should-operate.d.ts.map +0 -1
- package/lib/tree/util/should-operate.js +0 -46
- package/lib/tree/util/should-operate.js.map +0 -1
- package/lib/tree/util/sourcemap.d.ts +0 -7
- package/lib/tree/util/sourcemap.d.ts.map +0 -1
- package/lib/tree/util/sourcemap.js +0 -25
- package/lib/tree/util/sourcemap.js.map +0 -1
- package/lib/types/config.d.ts +0 -205
- package/lib/types/config.d.ts.map +0 -1
- package/lib/types/config.js +0 -2
- package/lib/types/config.js.map +0 -1
- package/lib/types/index.d.ts +0 -15
- package/lib/types/index.d.ts.map +0 -1
- package/lib/types/index.js +0 -3
- package/lib/types/index.js.map +0 -1
- package/lib/types/modes.d.ts.map +0 -1
- package/lib/types/modes.js +0 -2
- package/lib/types/modes.js.map +0 -1
- package/lib/types.d.ts +0 -61
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js +0 -2
- package/lib/types.js.map +0 -1
- package/lib/use-webpack-resolver.d.ts +0 -9
- package/lib/use-webpack-resolver.d.ts.map +0 -1
- package/lib/use-webpack-resolver.js +0 -41
- package/lib/use-webpack-resolver.js.map +0 -1
- package/lib/visitor/index.d.ts +0 -136
- package/lib/visitor/index.d.ts.map +0 -1
- package/lib/visitor/index.js +0 -135
- package/lib/visitor/index.js.map +0 -1
- package/lib/visitor/less-visitor.d.ts +0 -7
- package/lib/visitor/less-visitor.d.ts.map +0 -1
- package/lib/visitor/less-visitor.js.map +0 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { Deprecation } from '../deprecation.js';
|
|
2
|
+
import type { Logger } from '../logger.js';
|
|
3
|
+
import type { WarningDiagnostic } from '../jess-error.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The maximum number of repetitions of the same deprecation warning
|
|
7
|
+
* that will be emitted before hiding the rest.
|
|
8
|
+
*/
|
|
9
|
+
const MAX_REPETITIONS = 5;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A logger wrapper that provides special handling for deprecation warnings:
|
|
13
|
+
* - Making deprecations fatal (throwing errors)
|
|
14
|
+
* - Limiting repetition (max 5 per deprecation)
|
|
15
|
+
*/
|
|
16
|
+
export class DeprecationProcessingLogger implements Logger {
|
|
17
|
+
/** A map of how many times each deprecation has been emitted */
|
|
18
|
+
private readonly _warningCounts = new Map<Deprecation, number>();
|
|
19
|
+
|
|
20
|
+
/** The inner logger to delegate to */
|
|
21
|
+
private readonly _inner: Logger;
|
|
22
|
+
|
|
23
|
+
/** Deprecation warnings of these types will cause an error to be thrown */
|
|
24
|
+
readonly fatalDeprecations: Set<Deprecation>;
|
|
25
|
+
|
|
26
|
+
/** Whether repetitions of the same warning should be limited */
|
|
27
|
+
readonly limitRepetition: boolean;
|
|
28
|
+
|
|
29
|
+
constructor(
|
|
30
|
+
inner: Logger,
|
|
31
|
+
options: {
|
|
32
|
+
fatalDeprecations?: Iterable<Deprecation>;
|
|
33
|
+
limitRepetition?: boolean;
|
|
34
|
+
} = {}
|
|
35
|
+
) {
|
|
36
|
+
this._inner = inner;
|
|
37
|
+
this.fatalDeprecations = new Set(options.fatalDeprecations ?? []);
|
|
38
|
+
this.limitRepetition = options.limitRepetition ?? true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Processes a deprecation warning.
|
|
43
|
+
*
|
|
44
|
+
* If the deprecation is in fatalDeprecations, this throws an error.
|
|
45
|
+
* If it's already been warned for MAX_REPETITIONS times and limitRepetition is true, the warning is dropped.
|
|
46
|
+
* Otherwise, this is passed on to the inner logger.
|
|
47
|
+
*/
|
|
48
|
+
warnForDeprecation(
|
|
49
|
+
deprecation: Deprecation,
|
|
50
|
+
warning: WarningDiagnostic
|
|
51
|
+
): void {
|
|
52
|
+
if (this.fatalDeprecations.has(deprecation)) {
|
|
53
|
+
const message = `${warning.message}\n\nThis is only an error because you've set the ${deprecation.id} deprecation to be fatal.\nRemove this setting if you need to keep using this feature.`;
|
|
54
|
+
const error = new Error(message);
|
|
55
|
+
error.name = 'DeprecationError';
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (this.limitRepetition) {
|
|
60
|
+
const count = (this._warningCounts.get(deprecation) ?? 0) + 1;
|
|
61
|
+
this._warningCounts.set(deprecation, count);
|
|
62
|
+
if (count > MAX_REPETITIONS) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Pass to inner logger
|
|
68
|
+
this._inner.warn?.(warning.message);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Prints a warning indicating the number of deprecation warnings that were
|
|
73
|
+
* omitted due to repetition.
|
|
74
|
+
*/
|
|
75
|
+
summarize(): void {
|
|
76
|
+
let total = 0;
|
|
77
|
+
for (const [deprecation, count] of this._warningCounts.entries()) {
|
|
78
|
+
if (count > MAX_REPETITIONS) {
|
|
79
|
+
total += count - MAX_REPETITIONS;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (total > 0) {
|
|
83
|
+
this._inner.warn?.(
|
|
84
|
+
`${total} repetitive deprecation warnings omitted.\nRun in verbose mode to see all warnings.`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Delegate other logger methods to inner logger
|
|
90
|
+
configure?(log: Logger): void {
|
|
91
|
+
this._inner.configure?.(log);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
log?(...args: any[]): void {
|
|
95
|
+
this._inner.log?.(...args);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
info?(...args: any[]): void {
|
|
99
|
+
this._inner.info?.(...args);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
warn?(...args: any[]): void {
|
|
103
|
+
this._inner.warn?.(...args);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
error?(...args: any[]): void {
|
|
107
|
+
this._inner.error?.(...args);
|
|
108
|
+
}
|
|
109
|
+
}
|
package/src/logger.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
|
|
3
|
+
export interface Logger {
|
|
4
|
+
configure?(log: Logger): void;
|
|
5
|
+
log?(...args: any[]): void;
|
|
6
|
+
info?(...args: any[]): void;
|
|
7
|
+
warn?(...args: any[]): void;
|
|
8
|
+
error?(...args: any[]): void;
|
|
9
|
+
}
|
|
10
|
+
/** Configure with custom behavior */
|
|
11
|
+
export const logger: Required<Logger> = {
|
|
12
|
+
configure(log: Logger) {
|
|
13
|
+
Object.assign(logger, log);
|
|
14
|
+
},
|
|
15
|
+
|
|
16
|
+
log(...args: any[]) {
|
|
17
|
+
console.log(...args);
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
info(...args: any[]) {
|
|
21
|
+
console.info(...args);
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
warn(...args: any[]) {
|
|
25
|
+
console.error(chalk.yellow(...args));
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
error(...args: any[]) {
|
|
29
|
+
console.error(chalk.red(...args));
|
|
30
|
+
}
|
|
31
|
+
};
|
package/src/plugin.ts
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import type { Rules } from './tree/rules.js';
|
|
2
|
+
import { join, isAbsolute, resolve } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import type { Visitor } from './visitor/index.js';
|
|
6
|
+
import { type ErrorDiagnostic, type WarningDiagnostic, JessError } from './jess-error.js';
|
|
7
|
+
|
|
8
|
+
export type ISafeParseResult = {
|
|
9
|
+
/**
|
|
10
|
+
* The parsed tree, if parsing succeeded
|
|
11
|
+
*/
|
|
12
|
+
tree?: Rules;
|
|
13
|
+
/**
|
|
14
|
+
* Normalized errors from parsing.
|
|
15
|
+
* This should include ALL errors from lexing, parsing, and any plugin-level issues.
|
|
16
|
+
* Plugins should convert all errors to normalized ErrorDiagnostic format.
|
|
17
|
+
* Always an array (empty if no errors).
|
|
18
|
+
*/
|
|
19
|
+
errors: ErrorDiagnostic[];
|
|
20
|
+
/**
|
|
21
|
+
* Normalized warnings from parsing.
|
|
22
|
+
* This should include ALL warnings from lexing, parsing, and any plugin-level issues.
|
|
23
|
+
* Plugins should convert all warnings to normalized WarningDiagnostic format.
|
|
24
|
+
* Always an array (empty if no warnings).
|
|
25
|
+
*/
|
|
26
|
+
warnings: WarningDiagnostic[];
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type PluginParseOptions = {
|
|
30
|
+
compilerOptions?: Record<string, any>;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export interface PluginInterface {
|
|
34
|
+
/**
|
|
35
|
+
* e.g. 'less-plugin'
|
|
36
|
+
*/
|
|
37
|
+
name: string;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Queryable filter if we have resolved the extension
|
|
41
|
+
* no dots e.g. `['less', 'scss']`
|
|
42
|
+
*/
|
|
43
|
+
supportedExtensions?: string[];
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Expand an import path into a set of paths to try.
|
|
47
|
+
* e.g.
|
|
48
|
+
* `@import 'foo'` -> `['./foo.less']`
|
|
49
|
+
* `@import 'foo'` -> `['./foo.scss', './_foo.scss']`
|
|
50
|
+
*/
|
|
51
|
+
expandImport?(importPath: string, currentDir: string): string[];
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* e.g.
|
|
55
|
+
* `./foo` -> `/Users/foo/bar/foo`
|
|
56
|
+
* `@/alias` -> `/Users/foo/bar/src/alias`
|
|
57
|
+
* `one/two` -> `/Users/foo/node_modules/one/two`
|
|
58
|
+
*
|
|
59
|
+
* Does not attempt to check if the path exists.
|
|
60
|
+
* Note: paths may already be absolute.
|
|
61
|
+
*
|
|
62
|
+
* If the plugin has nothing to change, return `null` or return the array as-is.
|
|
63
|
+
*
|
|
64
|
+
* @note - I suppose a plugin doesn't have to resolve to an absolute path, if it's
|
|
65
|
+
* using some other method to handle the resolved paths in `locate()`.
|
|
66
|
+
* To that end, `locate()` shouldn't presume that the paths are absolute.
|
|
67
|
+
*/
|
|
68
|
+
resolve?(path: string | string[], currentDir: string, searchPaths: string[]): null | string[] | Promise<null | string[]>;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Pick the first one that exists. Return null to let another plugin handle the path.
|
|
72
|
+
*/
|
|
73
|
+
locate?(pathCandidates: string[], currentDir: string): null | string | Promise<string | null>;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Get the source code for the file.
|
|
77
|
+
*/
|
|
78
|
+
getSource?(absoluteFilePath: string): Promise<string>;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* If we have the extension in `supportedExtensions`, and this method exists,
|
|
82
|
+
* then this plugin is assumed to be able to parse the file.
|
|
83
|
+
*/
|
|
84
|
+
parse?(filePath: string, source: string, options?: PluginParseOptions): Rules;
|
|
85
|
+
|
|
86
|
+
/** No errors thrown; instead will return errors in the result */
|
|
87
|
+
safeParse?(filePath: string, source: string, options?: PluginParseOptions): ISafeParseResult;
|
|
88
|
+
|
|
89
|
+
/** If this method exists, then the plugin can return a JS module / object */
|
|
90
|
+
import?(absoluteFilePath: string): Promise<Record<string, any>>;
|
|
91
|
+
|
|
92
|
+
/** Post-parse or post-eval visitor(s) */
|
|
93
|
+
visitor?: Visitor | Visitor[];
|
|
94
|
+
/** Pre-eval visitor(s) - called before node.eval() during the preEval phase */
|
|
95
|
+
preEvalVisitor?: Visitor | Visitor[];
|
|
96
|
+
/** Post-eval visitor(s) - called after node.eval() (alternative to visitor for clarity) */
|
|
97
|
+
postEvalVisitor?: Visitor | Visitor[];
|
|
98
|
+
/** Optional cleanup hook for plugins that manage external resources */
|
|
99
|
+
dispose?(): void;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const { isArray } = Array;
|
|
103
|
+
|
|
104
|
+
export abstract class AbstractPlugin implements PluginInterface {
|
|
105
|
+
abstract name: string;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Does a basic path resolution. Node resolution is in other plugins.
|
|
109
|
+
*/
|
|
110
|
+
resolve(filePath: string | string[], currentDir: string, searchPaths: string[]) {
|
|
111
|
+
const bases = [currentDir, ...searchPaths];
|
|
112
|
+
const out: string[] = [];
|
|
113
|
+
const seen = new Set<string>();
|
|
114
|
+
filePath = isArray(filePath) ? filePath : [filePath];
|
|
115
|
+
for (const base of bases) {
|
|
116
|
+
const baseDir = isAbsolute(base) ? base : join(currentDir, base);
|
|
117
|
+
for (const path of filePath) {
|
|
118
|
+
const abs = resolve(baseDir, path);
|
|
119
|
+
if (abs && !seen.has(abs)) {
|
|
120
|
+
seen.add(abs);
|
|
121
|
+
out.push(abs);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Default source getter */
|
|
129
|
+
async getSource(absoluteFilePath: string): Promise<string> {
|
|
130
|
+
try {
|
|
131
|
+
const result = await readFile(absoluteFilePath, 'utf8');
|
|
132
|
+
return result;
|
|
133
|
+
} catch (error: unknown) {
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Gets the first match using from the filesystem that exists */
|
|
139
|
+
locate(pathCandidates: string[], currentDir: string): null | string {
|
|
140
|
+
for (const candidate of pathCandidates) {
|
|
141
|
+
const absolutePath = isAbsolute(candidate) ? candidate : join(currentDir, candidate);
|
|
142
|
+
if (existsSync(absolutePath)) {
|
|
143
|
+
return absolutePath;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
parse(filePath: string, source: string, options?: PluginParseOptions): Rules {
|
|
150
|
+
const safeParse: PluginInterface['safeParse'] = (this as PluginInterface).safeParse;
|
|
151
|
+
if (!safeParse) {
|
|
152
|
+
throw new Error(`Plugin "${this.name}" does not support parsing`);
|
|
153
|
+
}
|
|
154
|
+
const { tree, errors } = safeParse.call(this, filePath, source, options);
|
|
155
|
+
if (errors.length > 0) {
|
|
156
|
+
const firstError = errors[0]!;
|
|
157
|
+
throw new JessError({
|
|
158
|
+
code: firstError.code,
|
|
159
|
+
phase: firstError.phase,
|
|
160
|
+
severity: 'error',
|
|
161
|
+
ctx: firstError.file ? { file: firstError.file } : undefined,
|
|
162
|
+
filePath: firstError.filePath,
|
|
163
|
+
source: firstError.file?.source,
|
|
164
|
+
line: firstError.line,
|
|
165
|
+
column: firstError.column,
|
|
166
|
+
reason: firstError.reason,
|
|
167
|
+
fix: firstError.fix,
|
|
168
|
+
note: firstError.note,
|
|
169
|
+
errors: firstError.errors,
|
|
170
|
+
lexerErrors: firstError.lexerErrors
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
if (!tree) {
|
|
174
|
+
throw new Error(`Plugin "${this.name}" failed to parse "${filePath}"`);
|
|
175
|
+
}
|
|
176
|
+
return tree;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** Implement using the JS plugin w/ Deno */
|
|
180
|
+
// import(absoluteFilePath: string): Promise<Record<string, any>> {
|
|
181
|
+
// return import(absoluteFilePath);
|
|
182
|
+
// }
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export type Plugin = <T extends Record<string, any>>(opts?: T) => PluginInterface;
|
|
186
|
+
|
|
187
|
+
// export abstract class FileManager<O extends Record<string, any> = Record<string, any>> {
|
|
188
|
+
// abstract supportedExtensions?: string[];
|
|
189
|
+
|
|
190
|
+
// constructor(
|
|
191
|
+
// public opts: Partial<O> = {}
|
|
192
|
+
// ) {}
|
|
193
|
+
|
|
194
|
+
// /**
|
|
195
|
+
// * Turns relative paths into absolute paths.
|
|
196
|
+
// * e.g.
|
|
197
|
+
// * `./foo` -> `/Users/foo/bar/foo`
|
|
198
|
+
// * `@/alias` -> `/Users/foo/bar/src/alias`
|
|
199
|
+
// * `one/two` -> `/Users/foo/node_modules/one/two`
|
|
200
|
+
// *
|
|
201
|
+
// * Does not attempt to check if the path exists.
|
|
202
|
+
// * Note: paths may already be absolute.
|
|
203
|
+
// */
|
|
204
|
+
// abstract resolver?(paths: Set<string>, currentDir: string): Set<string>;
|
|
205
|
+
|
|
206
|
+
// /**
|
|
207
|
+
// * e.g.
|
|
208
|
+
// * Less file manager: `@import 'foo'` -> `['./foo.less']`
|
|
209
|
+
// * Sass file manager: `@import 'foo'` -> `['./foo.scss', './_foo.scss']`
|
|
210
|
+
// */
|
|
211
|
+
// abstract getPathsToTry?(filePath: string, currentDir: string, paths: string[], options: PathOptions): Set<string>;
|
|
212
|
+
|
|
213
|
+
// /**
|
|
214
|
+
// * Get the final resolved path.
|
|
215
|
+
// *
|
|
216
|
+
// * @param filePath Will be a partial path
|
|
217
|
+
// * @param paths The paths to search. This should always contain
|
|
218
|
+
// * the directory context where the file was imported. Can be
|
|
219
|
+
// * a fully-qualified path or a glob. Relative paths
|
|
220
|
+
// * will be resolved relative to process.cwd(). Plugins
|
|
221
|
+
// * may alter the paths array and return false to let another
|
|
222
|
+
// * plugin handle the path resolution.
|
|
223
|
+
// * @param options Determined by the file manager
|
|
224
|
+
// */
|
|
225
|
+
// resolvePath(
|
|
226
|
+
// filePath: string,
|
|
227
|
+
// currentDir: string,
|
|
228
|
+
// paths: string[],
|
|
229
|
+
// options: PathOptions
|
|
230
|
+
// ): string | string[] {
|
|
231
|
+
// filePath = this.opts.resolver(filePath);
|
|
232
|
+
// const pathsTried: string[] = [];
|
|
233
|
+
// if (isAbsolute(filePath)) {
|
|
234
|
+
// pathsTried.push(filePath);
|
|
235
|
+
// if (existsSync(filePath)) {
|
|
236
|
+
// return filePath;
|
|
237
|
+
// }
|
|
238
|
+
// }
|
|
239
|
+
// let isRelative = filePath.startsWith('.');
|
|
240
|
+
// let tryPath: string | undefined;
|
|
241
|
+
// if (options.allowBareRelative || isRelative) {
|
|
242
|
+
// tryPath = join(currentDir, filePath);
|
|
243
|
+
// pathsTried.push(tryPath);
|
|
244
|
+
// if (existsSync(tryPath)) {
|
|
245
|
+
// return tryPath;
|
|
246
|
+
// }
|
|
247
|
+
// }
|
|
248
|
+
|
|
249
|
+
// if (!isRelative) {
|
|
250
|
+
// try {
|
|
251
|
+
// tryPath = require.resolve(filePath);
|
|
252
|
+
// if (existsSync(tryPath)) {
|
|
253
|
+
// return tryPath;
|
|
254
|
+
// }
|
|
255
|
+
// } catch (err) {
|
|
256
|
+
// // ignore
|
|
257
|
+
// }
|
|
258
|
+
// }
|
|
259
|
+
|
|
260
|
+
// for (let i = 0; i < paths.length; i++) {
|
|
261
|
+
// tryPath = join(paths[i]!, filePath);
|
|
262
|
+
// pathsTried.push(tryPath);
|
|
263
|
+
// if (existsSync(tryPath)) {
|
|
264
|
+
// return tryPath;
|
|
265
|
+
// }
|
|
266
|
+
// }
|
|
267
|
+
// return pathsTried;
|
|
268
|
+
// }
|
|
269
|
+
|
|
270
|
+
// async loadFile(fullPath: string) {
|
|
271
|
+
// return await readFile(fullPath, 'utf8');
|
|
272
|
+
// }
|
|
273
|
+
|
|
274
|
+
// /**
|
|
275
|
+
// * Can override this instead of `getTree` if we want
|
|
276
|
+
// * to preserve extension-checking logic.
|
|
277
|
+
// */
|
|
278
|
+
// protected async _getTree(fullPath: string, options?: Record<string, any>): Promise<Rules | false> {
|
|
279
|
+
// return false;
|
|
280
|
+
// }
|
|
281
|
+
|
|
282
|
+
// /**
|
|
283
|
+
// * @param fullPath The fully resolved path
|
|
284
|
+
// */
|
|
285
|
+
// async getTree(fullPath: string, options?: Record<string, any>): Promise<Rules | false> {
|
|
286
|
+
// const supported = this.supportedExtensions;
|
|
287
|
+
// if (supported && !supported.includes(extname(fullPath))) {
|
|
288
|
+
// return false;
|
|
289
|
+
// }
|
|
290
|
+
// return await this._getTree(fullPath, options);
|
|
291
|
+
// }
|
|
292
|
+
// }
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Lookup Chains in Core Tree
|
|
2
|
+
|
|
3
|
+
This note documents the intended scope model for variable/mixin lookup.
|
|
4
|
+
|
|
5
|
+
## Two Chains
|
|
6
|
+
|
|
7
|
+
- `parent` chain: definition/evaluation structure (lexical ancestry).
|
|
8
|
+
- `sourceParent` chain: call-site/source ancestry used for fallback behaviors (notably Less-style leaky lookups).
|
|
9
|
+
|
|
10
|
+
Both are needed; they represent different questions.
|
|
11
|
+
|
|
12
|
+
## Detached Rulesets / Mixin Calls
|
|
13
|
+
|
|
14
|
+
When evaluating a mixin with parameters:
|
|
15
|
+
|
|
16
|
+
1. Parameter declarations live in a **wrapper Rules scope**.
|
|
17
|
+
2. The cloned mixin body is evaluated as a **child Rules node** of that wrapper.
|
|
18
|
+
3. Emitted output should be the evaluated body rules, not the wrapper declarations.
|
|
19
|
+
|
|
20
|
+
This keeps parameter bindings available to lookup during evaluation while preventing parameter declarations from leaking into caller-visible output scope.
|
|
21
|
+
|
|
22
|
+
## Reference Lookup Order (Variable)
|
|
23
|
+
|
|
24
|
+
For untargeted variable lookup in `Reference`:
|
|
25
|
+
|
|
26
|
+
1. Resolve against `resolvedTarget` (primary scope).
|
|
27
|
+
2. If unresolved and `leakyRules` is enabled, fallback to:
|
|
28
|
+
- `rulesParent`
|
|
29
|
+
- then `sourceRulesParent`
|
|
30
|
+
|
|
31
|
+
The fallback chain allows call-site style resolution without overriding primary lexical resolution.
|
|
32
|
+
|
|
33
|
+
## Rule of Thumb
|
|
34
|
+
|
|
35
|
+
If a fix requires "remove things after eval," re-check whether those nodes should have been in emitted output scope at all. Prefer modeling scope through wrapper ancestry over post-hoc cleanup.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## Changes for 2.0
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
- We align names of AST nodes with CST nodes, where possible
|
|
5
|
+
- We assume all value sequences are space separated. Any Node that has pre-whitespace with a single space is therefore ommitted.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Target module
|
|
9
|
+
```js
|
|
10
|
+
import { seq as $$seq } from 'jess';
|
|
11
|
+
|
|
12
|
+
export let mixin
|
|
13
|
+
```
|
|
14
|
+
```js
|
|
15
|
+
import { mixin } from './something.jess'
|
|
16
|
+
|
|
17
|
+
mixin()
|
|
18
|
+
```
|