@jesscss/plugin-less-compat 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 +139 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +10 -0
- package/lib/index.js.map +1 -0
- package/lib/less-compat-structures.d.ts +108 -0
- package/lib/less-compat-structures.js +519 -0
- package/lib/less-compat-structures.js.map +1 -0
- package/lib/nodes/at-rule.d.ts +6 -0
- package/lib/nodes/at-rule.js +72 -0
- package/lib/nodes/at-rule.js.map +1 -0
- package/lib/nodes/attribute-selector.d.ts +6 -0
- package/lib/nodes/attribute-selector.js +54 -0
- package/lib/nodes/attribute-selector.js.map +1 -0
- package/lib/nodes/call.d.ts +6 -0
- package/lib/nodes/call.js +83 -0
- package/lib/nodes/call.js.map +1 -0
- package/lib/nodes/color.d.ts +6 -0
- package/lib/nodes/color.js +57 -0
- package/lib/nodes/color.js.map +1 -0
- package/lib/nodes/combinator.d.ts +6 -0
- package/lib/nodes/combinator.js +34 -0
- package/lib/nodes/combinator.js.map +1 -0
- package/lib/nodes/comment.d.ts +6 -0
- package/lib/nodes/comment.js +41 -0
- package/lib/nodes/comment.js.map +1 -0
- package/lib/nodes/condition.d.ts +6 -0
- package/lib/nodes/condition.js +60 -0
- package/lib/nodes/condition.js.map +1 -0
- package/lib/nodes/declaration.d.ts +6 -0
- package/lib/nodes/declaration.js +81 -0
- package/lib/nodes/declaration.js.map +1 -0
- package/lib/nodes/dimension.d.ts +6 -0
- package/lib/nodes/dimension.js +47 -0
- package/lib/nodes/dimension.js.map +1 -0
- package/lib/nodes/expression.d.ts +6 -0
- package/lib/nodes/expression.js +44 -0
- package/lib/nodes/expression.js.map +1 -0
- package/lib/nodes/extend.d.ts +6 -0
- package/lib/nodes/extend.js +57 -0
- package/lib/nodes/extend.js.map +1 -0
- package/lib/nodes/import.d.ts +6 -0
- package/lib/nodes/import.js +63 -0
- package/lib/nodes/import.js.map +1 -0
- package/lib/nodes/index.d.ts +45 -0
- package/lib/nodes/index.js +308 -0
- package/lib/nodes/index.js.map +1 -0
- package/lib/nodes/keyword.d.ts +6 -0
- package/lib/nodes/keyword.js +36 -0
- package/lib/nodes/keyword.js.map +1 -0
- package/lib/nodes/list.d.ts +6 -0
- package/lib/nodes/list.js +150 -0
- package/lib/nodes/list.js.map +1 -0
- package/lib/nodes/mixin.d.ts +6 -0
- package/lib/nodes/mixin.js +62 -0
- package/lib/nodes/mixin.js.map +1 -0
- package/lib/nodes/negative.d.ts +6 -0
- package/lib/nodes/negative.js +42 -0
- package/lib/nodes/negative.js.map +1 -0
- package/lib/nodes/operation.d.ts +6 -0
- package/lib/nodes/operation.js +63 -0
- package/lib/nodes/operation.js.map +1 -0
- package/lib/nodes/paren.d.ts +6 -0
- package/lib/nodes/paren.js +42 -0
- package/lib/nodes/paren.js.map +1 -0
- package/lib/nodes/quoted.d.ts +6 -0
- package/lib/nodes/quoted.js +57 -0
- package/lib/nodes/quoted.js.map +1 -0
- package/lib/nodes/reference.d.ts +9 -0
- package/lib/nodes/reference.js +80 -0
- package/lib/nodes/reference.js.map +1 -0
- package/lib/nodes/ruleset.d.ts +6 -0
- package/lib/nodes/ruleset.js +108 -0
- package/lib/nodes/ruleset.js.map +1 -0
- package/lib/nodes/selector.d.ts +8 -0
- package/lib/nodes/selector.js +226 -0
- package/lib/nodes/selector.js.map +1 -0
- package/lib/nodes/sequence.d.ts +9 -0
- package/lib/nodes/sequence.js +75 -0
- package/lib/nodes/sequence.js.map +1 -0
- package/lib/nodes/url.d.ts +6 -0
- package/lib/nodes/url.js +42 -0
- package/lib/nodes/url.js.map +1 -0
- package/lib/nodes/var-declaration.d.ts +6 -0
- package/lib/nodes/var-declaration.js +60 -0
- package/lib/nodes/var-declaration.js.map +1 -0
- package/lib/plugin-utils.d.ts +20 -0
- package/lib/plugin-utils.js +100 -0
- package/lib/plugin-utils.js.map +1 -0
- package/lib/plugin.d.ts +92 -0
- package/lib/plugin.js +1027 -0
- package/lib/plugin.js.map +1 -0
- package/lib/transform/from-less.d.ts +30 -0
- package/lib/transform/from-less.js +170 -0
- package/lib/transform/from-less.js.map +1 -0
- package/lib/transform/index.d.ts +7 -0
- package/lib/transform/index.js +8 -0
- package/lib/transform/index.js.map +1 -0
- package/lib/transform/proxy.d.ts +32 -0
- package/lib/transform/proxy.js +138 -0
- package/lib/transform/proxy.js.map +1 -0
- package/lib/transform/to-less.d.ts +17 -0
- package/lib/transform/to-less.js +128 -0
- package/lib/transform/to-less.js.map +1 -0
- package/lib/transform/type-map.d.ts +27 -0
- package/lib/transform/type-map.js +105 -0
- package/lib/transform/type-map.js.map +1 -0
- package/lib/types.d.ts +33 -0
- package/lib/types.js +5 -0
- package/lib/types.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Nil, SelectorList } from '@jesscss/core';
|
|
2
|
+
import { createLessProxy } from '../transform/proxy.js';
|
|
3
|
+
import { toLessNode } from '../transform/to-less.js';
|
|
4
|
+
import { mapJessTypeToLessType } from '../transform/type-map.js';
|
|
5
|
+
/**
|
|
6
|
+
* Transform a Jess Ruleset to a Less-compatible Ruleset
|
|
7
|
+
*/
|
|
8
|
+
export function transformRulesetToLess(jessRuleset, cache) {
|
|
9
|
+
return createLessProxy(jessRuleset, cache, (prop, target) => {
|
|
10
|
+
const ruleset = target;
|
|
11
|
+
// Map 'type' property
|
|
12
|
+
if (prop === 'type') {
|
|
13
|
+
return mapJessTypeToLessType(ruleset.type);
|
|
14
|
+
}
|
|
15
|
+
// typeIndex is handled automatically by the base proxy handler
|
|
16
|
+
// Map 'selectors' property (Less expects array, Jess has single Selector | Nil)
|
|
17
|
+
if (prop === 'selectors') {
|
|
18
|
+
const selector = ruleset.value.selector;
|
|
19
|
+
// Handle Nil selector
|
|
20
|
+
if (selector instanceof Nil) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
// Handle SelectorList - convert to array
|
|
24
|
+
if (selector instanceof SelectorList) {
|
|
25
|
+
return selector.value.map((s) => toLessNode(s, { cache }));
|
|
26
|
+
}
|
|
27
|
+
// Single selector - wrap in array
|
|
28
|
+
return [toLessNode(selector, { cache })];
|
|
29
|
+
}
|
|
30
|
+
// Map 'rules' property (Less expects array, Jess has Rules container)
|
|
31
|
+
if (prop === 'rules') {
|
|
32
|
+
const rules = ruleset.value.rules;
|
|
33
|
+
// Rules has a value array of nodes
|
|
34
|
+
return rules.value.map((r) => toLessNode(r, { cache }));
|
|
35
|
+
}
|
|
36
|
+
// Map 'accept' method for visitor traversal
|
|
37
|
+
// Less's Visitor.visit() calls node.accept(this) to traverse children
|
|
38
|
+
// The accept method should traverse children, NOT call visitor.visit again
|
|
39
|
+
if (prop === 'accept') {
|
|
40
|
+
return function (visitor) {
|
|
41
|
+
// CRITICAL: The visitor passed here is the Less visitor, not the plugin visitor
|
|
42
|
+
// Less's Ruleset.accept() traverses selectors and rules
|
|
43
|
+
// Use visitArray which handles the traversal correctly
|
|
44
|
+
const selector = ruleset.value.selector;
|
|
45
|
+
const rules = ruleset.value.rules;
|
|
46
|
+
// Traverse selectors using visitArray (Less's pattern)
|
|
47
|
+
if (selector && !(selector instanceof Nil)) {
|
|
48
|
+
if (selector instanceof SelectorList) {
|
|
49
|
+
// Convert all selectors to Less format BEFORE calling visitArray
|
|
50
|
+
// This ensures visitArray receives Less proxies, not Jess nodes
|
|
51
|
+
const lessSelectors = selector.value.map((s) => {
|
|
52
|
+
const lessSel = toLessNode(s, { cache });
|
|
53
|
+
// Ensure we have a Less proxy, not a Jess node
|
|
54
|
+
return lessSel;
|
|
55
|
+
});
|
|
56
|
+
if (visitor.visitArray) {
|
|
57
|
+
visitor.visitArray(lessSelectors);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
// Fallback: call accept on each selector if visitArray not available
|
|
61
|
+
for (const lessSel of lessSelectors) {
|
|
62
|
+
if (lessSel && lessSel.accept) {
|
|
63
|
+
lessSel.accept(visitor);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Single selector - convert to Less format BEFORE calling visitArray
|
|
70
|
+
const lessSelector = toLessNode(selector, { cache });
|
|
71
|
+
if (lessSelector) {
|
|
72
|
+
if (visitor.visitArray) {
|
|
73
|
+
visitor.visitArray([lessSelector]);
|
|
74
|
+
}
|
|
75
|
+
else if (lessSelector.accept) {
|
|
76
|
+
lessSelector.accept(visitor);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Traverse rules using visitArray (Less's pattern)
|
|
82
|
+
if (rules && rules.value && rules.value.length > 0) {
|
|
83
|
+
// Convert all rules to Less format BEFORE calling visitArray
|
|
84
|
+
// This ensures visitArray receives Less proxies, not Jess nodes
|
|
85
|
+
const lessRules = rules.value.map((r) => {
|
|
86
|
+
const lessRule = toLessNode(r, { cache });
|
|
87
|
+
// Ensure we have a Less proxy, not a Jess node
|
|
88
|
+
return lessRule;
|
|
89
|
+
});
|
|
90
|
+
if (visitor.visitArray) {
|
|
91
|
+
visitor.visitArray(lessRules);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Fallback: call accept on each rule if visitArray not available
|
|
95
|
+
for (const lessRule of lessRules) {
|
|
96
|
+
if (lessRule && lessRule.accept) {
|
|
97
|
+
lessRule.accept(visitor);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Pass through other properties
|
|
105
|
+
return undefined;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=ruleset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruleset.js","sourceRoot":"","sources":["../../src/nodes/ruleset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,GAAG,EAAY,YAAY,EAAQ,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,WAAoB,EACpB,KAAyB;IAEzB,OAAO,eAAe,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC1D,MAAM,OAAO,GAAG,MAAiB,CAAC;QAElC,sBAAsB;QACtB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,+DAA+D;QAE/D,gFAAgF;QAChF,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;YAExC,sBAAsB;YACtB,IAAI,QAAQ,YAAY,GAAG,EAAE,CAAC;gBAC5B,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,yCAAyC;YACzC,IAAI,QAAQ,YAAY,YAAY,EAAE,CAAC;gBACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvE,CAAC;YAED,kCAAkC;YAClC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,sEAAsE;QACtE,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;YAClC,mCAAmC;YACnC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAO,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,4CAA4C;QAC5C,sEAAsE;QACtE,2EAA2E;QAC3E,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,UAAS,OAAY;gBAC1B,gFAAgF;gBAChF,wDAAwD;gBACxD,uDAAuD;gBACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBAElC,uDAAuD;gBACvD,IAAI,QAAQ,IAAI,CAAC,CAAC,QAAQ,YAAY,GAAG,CAAC,EAAE,CAAC;oBAC3C,IAAI,QAAQ,YAAY,YAAY,EAAE,CAAC;wBACrC,iEAAiE;wBACjE,gEAAgE;wBAChE,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE;4BACvD,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;4BACzC,+CAA+C;4BAC/C,OAAO,OAAO,CAAC;wBACjB,CAAC,CAAC,CAAC;wBACH,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;4BACvB,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;wBACpC,CAAC;6BAAM,CAAC;4BACN,qEAAqE;4BACrE,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;gCACpC,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oCAC9B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gCAC1B,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,qEAAqE;wBACrE,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;wBACrD,IAAI,YAAY,EAAE,CAAC;4BACjB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gCACvB,OAAO,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;4BACrC,CAAC;iCAAM,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;gCAC/B,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;4BAC/B,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,mDAAmD;gBACnD,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnD,6DAA6D;oBAC7D,gEAAgE;oBAChE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAO,EAAE,EAAE;wBAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC1C,+CAA+C;wBAC/C,OAAO,QAAQ,CAAC;oBAClB,CAAC,CAAC,CAAC;oBACH,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;wBACvB,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;oBAChC,CAAC;yBAAM,CAAC;wBACN,iEAAiE;wBACjE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;4BACjC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gCAChC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;4BAC3B,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;QAED,gCAAgC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Selector, SelectorList } from '@jesscss/core';
|
|
2
|
+
import type { LessNode } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transform a Jess Selector to a Less-compatible Selector
|
|
5
|
+
*
|
|
6
|
+
* Less Selector is an array of Element nodes
|
|
7
|
+
*/
|
|
8
|
+
export declare function transformSelectorToLess(jessSelector: Selector | SelectorList, cache?: WeakMap<any, any>): LessNode;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { ComplexSelector, CompoundSelector, BasicSelector, SelectorList, Combinator } from '@jesscss/core';
|
|
2
|
+
import { createLessProxy } from '../transform/proxy.js';
|
|
3
|
+
import { toLessNode } from '../transform/to-less.js';
|
|
4
|
+
/**
|
|
5
|
+
* Flatten a hierarchical Jess selector into Less's flat Element array
|
|
6
|
+
*
|
|
7
|
+
* Less expects: Element[] where each Element has { combinator, value }
|
|
8
|
+
* Jess has: ComplexSelector → CompoundSelector[] → BasicSelector[]
|
|
9
|
+
*/
|
|
10
|
+
function flattenSelectorToElements(selector, cache) {
|
|
11
|
+
const elements = [];
|
|
12
|
+
if (selector instanceof SelectorList) {
|
|
13
|
+
// SelectorList contains multiple selectors - Less expects a single Selector
|
|
14
|
+
// For now, we'll take the first selector, but this might need special handling
|
|
15
|
+
if (selector.value.length > 0) {
|
|
16
|
+
const first = selector.value[0];
|
|
17
|
+
if (first) {
|
|
18
|
+
return flattenSelectorToElements(first, cache);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
if (selector instanceof ComplexSelector) {
|
|
24
|
+
// ComplexSelector contains CompoundSelector[] with Combinators between them
|
|
25
|
+
const compounds = selector.value;
|
|
26
|
+
for (let i = 0; i < compounds.length; i++) {
|
|
27
|
+
const compound = compounds[i];
|
|
28
|
+
// Get combinator (default to ' ' for space)
|
|
29
|
+
let combinator;
|
|
30
|
+
if (i > 0) {
|
|
31
|
+
// Combinator is between compounds
|
|
32
|
+
// Less's Element includes the combinator, so we need to find it
|
|
33
|
+
// For now, default to space combinator
|
|
34
|
+
combinator = new Combinator(' ');
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// First element has no combinator (or empty combinator)
|
|
38
|
+
// Use space as default for Less compatibility
|
|
39
|
+
combinator = new Combinator(' ');
|
|
40
|
+
}
|
|
41
|
+
// Flatten compound selector
|
|
42
|
+
if (compound instanceof CompoundSelector) {
|
|
43
|
+
const basicSelectors = compound.value;
|
|
44
|
+
for (let j = 0; j < basicSelectors.length; j++) {
|
|
45
|
+
const basic = basicSelectors[j];
|
|
46
|
+
if (!basic) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Use combinator only for first element of compound
|
|
50
|
+
const elementCombinator = j === 0 ? combinator : new Combinator(' ');
|
|
51
|
+
// Create Less Element structure
|
|
52
|
+
// Less Element: { combinator, value, isVariable }
|
|
53
|
+
const element = createLessProxy(basic, cache, (prop, target) => {
|
|
54
|
+
const basicSel = target;
|
|
55
|
+
if (prop === 'type') {
|
|
56
|
+
return 'Element';
|
|
57
|
+
}
|
|
58
|
+
if (prop === 'combinator') {
|
|
59
|
+
return toLessNode(elementCombinator, { cache });
|
|
60
|
+
}
|
|
61
|
+
if (prop === 'value') {
|
|
62
|
+
return basicSel.value;
|
|
63
|
+
}
|
|
64
|
+
if (prop === 'isVariable') {
|
|
65
|
+
return false; // BasicSelector is not a variable
|
|
66
|
+
}
|
|
67
|
+
if (prop === 'accept') {
|
|
68
|
+
return function (visitor) {
|
|
69
|
+
// Less Element's accept() ONLY traverses children (combinator and value)
|
|
70
|
+
// It does NOT call visitor.visit() on itself - that's already been done
|
|
71
|
+
// Less.js Element.accept() pattern: visitor.visit(this.combinator) and visitor.visit(this.value)
|
|
72
|
+
const lessCombinator = toLessNode(elementCombinator, { cache });
|
|
73
|
+
if (lessCombinator && visitor.visit) {
|
|
74
|
+
visitor.visit(lessCombinator);
|
|
75
|
+
}
|
|
76
|
+
// Visit value if it's an object/node
|
|
77
|
+
const value = basicSel.value;
|
|
78
|
+
if (value && typeof value === 'object') {
|
|
79
|
+
const lessValue = toLessNode(value, { cache });
|
|
80
|
+
if (lessValue && visitor.visit) {
|
|
81
|
+
visitor.visit(lessValue);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return basicSel;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
88
|
+
});
|
|
89
|
+
elements.push(element);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (compound instanceof BasicSelector) {
|
|
93
|
+
// Single basic selector
|
|
94
|
+
const element = createLessProxy(compound, cache, (prop, target) => {
|
|
95
|
+
const basicSel = target;
|
|
96
|
+
if (prop === 'type') {
|
|
97
|
+
return 'Element';
|
|
98
|
+
}
|
|
99
|
+
if (prop === 'combinator') {
|
|
100
|
+
return toLessNode(combinator, { cache });
|
|
101
|
+
}
|
|
102
|
+
if (prop === 'value') {
|
|
103
|
+
return basicSel.value;
|
|
104
|
+
}
|
|
105
|
+
if (prop === 'isVariable') {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
});
|
|
110
|
+
elements.push(element);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else if (selector instanceof CompoundSelector) {
|
|
115
|
+
// Single compound selector - flatten to elements
|
|
116
|
+
const basicSelectors = selector.value;
|
|
117
|
+
for (let i = 0; i < basicSelectors.length; i++) {
|
|
118
|
+
const basic = basicSelectors[i];
|
|
119
|
+
if (!basic) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const combinator = new Combinator(' ');
|
|
123
|
+
const element = createLessProxy(basic, cache, (prop, target) => {
|
|
124
|
+
const basicSel = target;
|
|
125
|
+
if (prop === 'type') {
|
|
126
|
+
return 'Element';
|
|
127
|
+
}
|
|
128
|
+
if (prop === 'combinator') {
|
|
129
|
+
return toLessNode(combinator, { cache });
|
|
130
|
+
}
|
|
131
|
+
if (prop === 'value') {
|
|
132
|
+
return basicSel.value;
|
|
133
|
+
}
|
|
134
|
+
if (prop === 'isVariable') {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
return undefined;
|
|
138
|
+
});
|
|
139
|
+
elements.push(element);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (selector instanceof BasicSelector) {
|
|
143
|
+
// Single basic selector
|
|
144
|
+
const element = createLessProxy(selector, cache, (prop, target) => {
|
|
145
|
+
const basicSel = target;
|
|
146
|
+
if (prop === 'type') {
|
|
147
|
+
return 'Element';
|
|
148
|
+
}
|
|
149
|
+
if (prop === 'combinator') {
|
|
150
|
+
// Empty combinator for first element - use space as default
|
|
151
|
+
return toLessNode(new Combinator(' '), { cache });
|
|
152
|
+
}
|
|
153
|
+
if (prop === 'value') {
|
|
154
|
+
return basicSel.value;
|
|
155
|
+
}
|
|
156
|
+
if (prop === 'isVariable') {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
return undefined;
|
|
160
|
+
});
|
|
161
|
+
elements.push(element);
|
|
162
|
+
}
|
|
163
|
+
return elements;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Transform a Jess Selector to a Less-compatible Selector
|
|
167
|
+
*
|
|
168
|
+
* Less Selector is an array of Element nodes
|
|
169
|
+
*/
|
|
170
|
+
export function transformSelectorToLess(jessSelector, cache) {
|
|
171
|
+
// Less Selector is an array of Elements
|
|
172
|
+
const elements = flattenSelectorToElements(jessSelector, cache);
|
|
173
|
+
// Create a proxy that represents a Less Selector (array of Elements)
|
|
174
|
+
return createLessProxy(jessSelector, cache, (prop, _target) => {
|
|
175
|
+
// Map 'type' property
|
|
176
|
+
if (prop === 'type') {
|
|
177
|
+
return 'Selector';
|
|
178
|
+
}
|
|
179
|
+
// Map 'typeIndex'
|
|
180
|
+
if (prop === 'typeIndex') {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
// Map 'elements' property (Less Selector has elements array)
|
|
184
|
+
if (prop === 'elements') {
|
|
185
|
+
return elements;
|
|
186
|
+
}
|
|
187
|
+
// Map array-like access (Less Selector is array-like)
|
|
188
|
+
if (typeof prop === 'string' && /^\d+$/.test(prop)) {
|
|
189
|
+
const index = parseInt(prop, 10);
|
|
190
|
+
return elements[index];
|
|
191
|
+
}
|
|
192
|
+
// Map 'length' property
|
|
193
|
+
if (prop === 'length') {
|
|
194
|
+
return elements.length;
|
|
195
|
+
}
|
|
196
|
+
// Map 'accept' method for visitor traversal
|
|
197
|
+
if (prop === 'accept') {
|
|
198
|
+
return function (visitor) {
|
|
199
|
+
// Less Selector accepts visitor and visits each element
|
|
200
|
+
// CRITICAL: All elements should already be Less proxies from flattenSelectorToElements
|
|
201
|
+
// If they're not, we need to convert them to prevent infinite loops
|
|
202
|
+
for (const element of elements) {
|
|
203
|
+
if (element && element.accept) {
|
|
204
|
+
// Element is already a Less proxy - call accept directly
|
|
205
|
+
element.accept(visitor);
|
|
206
|
+
}
|
|
207
|
+
else if (element) {
|
|
208
|
+
// Element is not a proxy - this shouldn't happen, but convert it just in case
|
|
209
|
+
// This prevents infinite loops if somehow a Jess node got through
|
|
210
|
+
const lessElement = toLessNode(element, { cache });
|
|
211
|
+
if (lessElement && lessElement.accept) {
|
|
212
|
+
lessElement.accept(visitor);
|
|
213
|
+
}
|
|
214
|
+
else if (lessElement && visitor.visitArray) {
|
|
215
|
+
// Fallback: use visitArray if accept doesn't exist
|
|
216
|
+
visitor.visitArray([lessElement]);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return jessSelector;
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
return undefined;
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector.js","sourceRoot":"","sources":["../../src/nodes/selector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Sequence } from '@jesscss/core';
|
|
2
|
+
import type { LessNode } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transform a Jess Sequence (space-separated value list) to a Less-compatible Expression.
|
|
5
|
+
*
|
|
6
|
+
* This is critical for Less plugins that traverse into declaration values (e.g. preEval visitors
|
|
7
|
+
* that rewrite variables inside custom properties).
|
|
8
|
+
*/
|
|
9
|
+
export declare function transformSequenceToLess(jessSequence: Sequence, cache?: WeakMap<any, any>): LessNode;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Node } from '@jesscss/core';
|
|
2
|
+
import { createLessProxy } from '../transform/proxy.js';
|
|
3
|
+
import { toLessNode } from '../transform/to-less.js';
|
|
4
|
+
import { fromLessNode } from '../transform/from-less.js';
|
|
5
|
+
import { mapJessTypeToLessType } from '../transform/type-map.js';
|
|
6
|
+
/**
|
|
7
|
+
* Transform a Jess Sequence (space-separated value list) to a Less-compatible Expression.
|
|
8
|
+
*
|
|
9
|
+
* This is critical for Less plugins that traverse into declaration values (e.g. preEval visitors
|
|
10
|
+
* that rewrite variables inside custom properties).
|
|
11
|
+
*/
|
|
12
|
+
export function transformSequenceToLess(jessSequence, cache) {
|
|
13
|
+
return createLessProxy(jessSequence, cache, (prop, target) => {
|
|
14
|
+
const seq = target;
|
|
15
|
+
if (prop === 'type') {
|
|
16
|
+
return mapJessTypeToLessType(seq.type);
|
|
17
|
+
}
|
|
18
|
+
// Less Expression nodes expose their members via `.value` as an array.
|
|
19
|
+
if (prop === 'value') {
|
|
20
|
+
return (seq.value ?? [])
|
|
21
|
+
.map((item) => item instanceof Node ? toLessNode(item, { cache }) : item)
|
|
22
|
+
.filter((item) => item !== undefined && item !== null);
|
|
23
|
+
}
|
|
24
|
+
// Allow array-like access patterns some Less visitors use.
|
|
25
|
+
if (prop === 'length') {
|
|
26
|
+
return (seq.value ?? []).filter((v) => v !== undefined && v !== null).length;
|
|
27
|
+
}
|
|
28
|
+
if (typeof prop === 'string' && /^\d+$/.test(prop)) {
|
|
29
|
+
const idx = Number(prop);
|
|
30
|
+
const arr = (seq.value ?? []).filter((v) => v !== undefined && v !== null);
|
|
31
|
+
const item = arr[idx];
|
|
32
|
+
return item instanceof Node ? toLessNode(item, { cache }) : item;
|
|
33
|
+
}
|
|
34
|
+
// Traverse children (sequence members) without re-entering Jess visitor recursion.
|
|
35
|
+
if (prop === 'accept') {
|
|
36
|
+
return function (visitor) {
|
|
37
|
+
const raw = seq.value ?? [];
|
|
38
|
+
if (!Array.isArray(raw) || raw.length === 0) {
|
|
39
|
+
return seq;
|
|
40
|
+
}
|
|
41
|
+
for (let i = 0; i < raw.length; i++) {
|
|
42
|
+
const item = raw[i];
|
|
43
|
+
if (item === undefined || item === null) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const lessItem = item instanceof Node ? toLessNode(item, { cache }) : item;
|
|
47
|
+
if (!lessItem || typeof visitor?.visit !== 'function') {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const visited = visitor.visit(lessItem);
|
|
51
|
+
// If a replacing visitor returned a new Less node, write it back into the Jess Sequence.
|
|
52
|
+
if (visited && visited !== lessItem && typeof visited === 'object' && visited.type) {
|
|
53
|
+
try {
|
|
54
|
+
const jessReplacement = fromLessNode(visited, { cache: new WeakMap() });
|
|
55
|
+
// Preserve whitespace semantics from the original node inside the Sequence.
|
|
56
|
+
// This is especially important for custom property values where spacing is significant.
|
|
57
|
+
if (item instanceof Node) {
|
|
58
|
+
jessReplacement.pre = item.pre;
|
|
59
|
+
jessReplacement.post = item.post;
|
|
60
|
+
}
|
|
61
|
+
seq.adopt(jessReplacement);
|
|
62
|
+
seq.value[i] = jessReplacement;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// If we can't convert it back, ignore (visitor may be creating unsupported nodes)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return seq;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=sequence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/nodes/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,IAAI,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAsB,EACtB,KAAyB;IAEzB,OAAO,eAAe,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC3D,MAAM,GAAG,GAAG,MAAkB,CAAC;QAE/B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,uEAAuE;QACvE,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;iBACrB,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;iBAC7E,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;QAChE,CAAC;QAED,2DAA2D;QAC3D,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;QACpF,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChF,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,CAAC;QAED,mFAAmF;QACnF,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,UAAS,OAAY;gBAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5C,OAAO,GAAG,CAAC;gBACb,CAAC;gBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACpC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;oBACpB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBACxC,SAAS;oBACX,CAAC;oBACD,MAAM,QAAQ,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC3E,IAAI,CAAC,QAAQ,IAAI,OAAO,OAAO,EAAE,KAAK,KAAK,UAAU,EAAE,CAAC;wBACtD,SAAS;oBACX,CAAC;oBAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBACxC,yFAAyF;oBACzF,IAAI,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAK,OAAe,CAAC,IAAI,EAAE,CAAC;wBAC5F,IAAI,CAAC;4BACH,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;4BACxE,4EAA4E;4BAC5E,wFAAwF;4BACxF,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;gCACxB,eAAuB,CAAC,GAAG,GAAI,IAAY,CAAC,GAAG,CAAC;gCAChD,eAAuB,CAAC,IAAI,GAAI,IAAY,CAAC,IAAI,CAAC;4BACrD,CAAC;4BACD,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;4BAC1B,GAAG,CAAC,KAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;wBAC5C,CAAC;wBAAC,MAAM,CAAC;4BACP,kFAAkF;wBACpF,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/lib/nodes/url.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Quoted } from '@jesscss/core';
|
|
2
|
+
import { createLessProxy } from '../transform/proxy.js';
|
|
3
|
+
import { toLessNode } from '../transform/to-less.js';
|
|
4
|
+
import { mapJessTypeToLessType } from '../transform/type-map.js';
|
|
5
|
+
import { fromLessNode } from '../transform/from-less.js';
|
|
6
|
+
/**
|
|
7
|
+
* Transform a Jess Url to a Less-compatible URL
|
|
8
|
+
*/
|
|
9
|
+
export function transformUrlToLess(jessUrl, cache) {
|
|
10
|
+
return createLessProxy(jessUrl, cache, (prop, target) => {
|
|
11
|
+
const url = target;
|
|
12
|
+
// Map 'type' property
|
|
13
|
+
if (prop === 'type') {
|
|
14
|
+
return mapJessTypeToLessType(url.type);
|
|
15
|
+
}
|
|
16
|
+
// Map 'typeIndex'
|
|
17
|
+
if (prop === 'typeIndex') {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
// Map 'value' property
|
|
21
|
+
if (prop === 'value') {
|
|
22
|
+
const value = url.value;
|
|
23
|
+
if (value instanceof Quoted) {
|
|
24
|
+
return toLessNode(value, { cache });
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
// Map 'accept' method for visitor traversal
|
|
29
|
+
if (prop === 'accept') {
|
|
30
|
+
return function (visitor) {
|
|
31
|
+
const lessUrl = transformUrlToLess(url, cache);
|
|
32
|
+
const result = visitor.visit(lessUrl);
|
|
33
|
+
if (result !== lessUrl) {
|
|
34
|
+
return fromLessNode(result, { cache });
|
|
35
|
+
}
|
|
36
|
+
return url;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/nodes/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAY,EACZ,KAAyB;IAEzB,OAAO,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QACtD,MAAM,GAAG,GAAG,MAAa,CAAC;QAE1B,sBAAsB;QACtB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,kBAAkB;QAClB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YACxB,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;gBAC5B,OAAO,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,4CAA4C;QAC5C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,UAAS,OAAY;gBAC1B,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACtC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;oBACvB,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzC,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { VarDeclaration } from '@jesscss/core';
|
|
2
|
+
import type { LessNode } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transform a Jess VarDeclaration to a Less-compatible Assignment
|
|
5
|
+
*/
|
|
6
|
+
export declare function transformVarDeclarationToLess(jessVarDecl: VarDeclaration, cache?: WeakMap<any, any>): LessNode;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Node } from '@jesscss/core';
|
|
2
|
+
import { createLessProxy } from '../transform/proxy.js';
|
|
3
|
+
import { toLessNode } from '../transform/to-less.js';
|
|
4
|
+
import { mapJessTypeToLessType } from '../transform/type-map.js';
|
|
5
|
+
/**
|
|
6
|
+
* Transform a Jess VarDeclaration to a Less-compatible Assignment
|
|
7
|
+
*/
|
|
8
|
+
export function transformVarDeclarationToLess(jessVarDecl, cache) {
|
|
9
|
+
return createLessProxy(jessVarDecl, cache, (prop, target) => {
|
|
10
|
+
const varDecl = target;
|
|
11
|
+
// Map 'type' property
|
|
12
|
+
if (prop === 'type') {
|
|
13
|
+
return mapJessTypeToLessType(varDecl.type);
|
|
14
|
+
}
|
|
15
|
+
// Map 'typeIndex'
|
|
16
|
+
if (prop === 'typeIndex') {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
// Map 'name' property
|
|
20
|
+
if (prop === 'name') {
|
|
21
|
+
return varDecl.value.name;
|
|
22
|
+
}
|
|
23
|
+
// Map 'value' property
|
|
24
|
+
if (prop === 'value') {
|
|
25
|
+
const value = varDecl.value.value;
|
|
26
|
+
if (value instanceof Node) {
|
|
27
|
+
return toLessNode(value, { cache });
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
// Map 'index' property
|
|
32
|
+
if (prop === 'index') {
|
|
33
|
+
const loc = varDecl.location;
|
|
34
|
+
if (Array.isArray(loc) || !loc) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
return loc.index;
|
|
38
|
+
}
|
|
39
|
+
// Map 'accept' method for visitor traversal
|
|
40
|
+
// Less's Visitor.visit() calls node.accept(this) to traverse children
|
|
41
|
+
// VarDeclaration's accept should traverse its value
|
|
42
|
+
if (prop === 'accept') {
|
|
43
|
+
return function (visitor) {
|
|
44
|
+
// VarDeclaration's accept traverses its value
|
|
45
|
+
const value = varDecl.value.value;
|
|
46
|
+
if (value instanceof Node) {
|
|
47
|
+
const lessValue = toLessNode(value, { cache });
|
|
48
|
+
if (lessValue && lessValue.accept) {
|
|
49
|
+
lessValue.accept(visitor);
|
|
50
|
+
}
|
|
51
|
+
else if (lessValue && visitor.visitArray) {
|
|
52
|
+
visitor.visitArray([lessValue]);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=var-declaration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"var-declaration.js","sourceRoot":"","sources":["../../src/nodes/var-declaration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,IAAI,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,WAA2B,EAC3B,KAAyB;IAEzB,OAAO,eAAe,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC1D,MAAM,OAAO,GAAG,MAAwB,CAAC;QAEzC,sBAAsB;QACtB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,kBAAkB;QAClB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;YAClC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;gBAC1B,OAAO,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC/B,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAQ,GAAW,CAAC,KAAK,CAAC;QAC5B,CAAC;QAED,4CAA4C;QAC5C,sEAAsE;QACtE,oDAAoD;QACpD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,UAAS,OAAY;gBAC1B,8CAA8C;gBAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBAClC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC/C,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;wBAClC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC5B,CAAC;yBAAM,IAAI,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;wBAC3C,OAAO,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for working with Less.js plugins in Jess
|
|
3
|
+
*/
|
|
4
|
+
import type { PluginInterface } from '@jesscss/core';
|
|
5
|
+
/**
|
|
6
|
+
* Detect if a plugin is a Less.js plugin
|
|
7
|
+
*/
|
|
8
|
+
export declare function isLessPlugin(plugin: any): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Detect if a plugin is a Jess plugin
|
|
11
|
+
*/
|
|
12
|
+
export declare function isJessPlugin(plugin: any): plugin is PluginInterface;
|
|
13
|
+
/**
|
|
14
|
+
* Filter and separate Less plugins from Jess plugins
|
|
15
|
+
* This allows mixed plugin arrays to be handled correctly
|
|
16
|
+
*/
|
|
17
|
+
export declare function filterPlugins(plugins: any[]): {
|
|
18
|
+
lessPlugins: any[];
|
|
19
|
+
jessPlugins: PluginInterface[];
|
|
20
|
+
};
|