@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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +139 -0
  3. package/lib/index.d.ts +9 -0
  4. package/lib/index.js +10 -0
  5. package/lib/index.js.map +1 -0
  6. package/lib/less-compat-structures.d.ts +108 -0
  7. package/lib/less-compat-structures.js +519 -0
  8. package/lib/less-compat-structures.js.map +1 -0
  9. package/lib/nodes/at-rule.d.ts +6 -0
  10. package/lib/nodes/at-rule.js +72 -0
  11. package/lib/nodes/at-rule.js.map +1 -0
  12. package/lib/nodes/attribute-selector.d.ts +6 -0
  13. package/lib/nodes/attribute-selector.js +54 -0
  14. package/lib/nodes/attribute-selector.js.map +1 -0
  15. package/lib/nodes/call.d.ts +6 -0
  16. package/lib/nodes/call.js +83 -0
  17. package/lib/nodes/call.js.map +1 -0
  18. package/lib/nodes/color.d.ts +6 -0
  19. package/lib/nodes/color.js +57 -0
  20. package/lib/nodes/color.js.map +1 -0
  21. package/lib/nodes/combinator.d.ts +6 -0
  22. package/lib/nodes/combinator.js +34 -0
  23. package/lib/nodes/combinator.js.map +1 -0
  24. package/lib/nodes/comment.d.ts +6 -0
  25. package/lib/nodes/comment.js +41 -0
  26. package/lib/nodes/comment.js.map +1 -0
  27. package/lib/nodes/condition.d.ts +6 -0
  28. package/lib/nodes/condition.js +60 -0
  29. package/lib/nodes/condition.js.map +1 -0
  30. package/lib/nodes/declaration.d.ts +6 -0
  31. package/lib/nodes/declaration.js +81 -0
  32. package/lib/nodes/declaration.js.map +1 -0
  33. package/lib/nodes/dimension.d.ts +6 -0
  34. package/lib/nodes/dimension.js +47 -0
  35. package/lib/nodes/dimension.js.map +1 -0
  36. package/lib/nodes/expression.d.ts +6 -0
  37. package/lib/nodes/expression.js +44 -0
  38. package/lib/nodes/expression.js.map +1 -0
  39. package/lib/nodes/extend.d.ts +6 -0
  40. package/lib/nodes/extend.js +57 -0
  41. package/lib/nodes/extend.js.map +1 -0
  42. package/lib/nodes/import.d.ts +6 -0
  43. package/lib/nodes/import.js +63 -0
  44. package/lib/nodes/import.js.map +1 -0
  45. package/lib/nodes/index.d.ts +45 -0
  46. package/lib/nodes/index.js +308 -0
  47. package/lib/nodes/index.js.map +1 -0
  48. package/lib/nodes/keyword.d.ts +6 -0
  49. package/lib/nodes/keyword.js +36 -0
  50. package/lib/nodes/keyword.js.map +1 -0
  51. package/lib/nodes/list.d.ts +6 -0
  52. package/lib/nodes/list.js +150 -0
  53. package/lib/nodes/list.js.map +1 -0
  54. package/lib/nodes/mixin.d.ts +6 -0
  55. package/lib/nodes/mixin.js +62 -0
  56. package/lib/nodes/mixin.js.map +1 -0
  57. package/lib/nodes/negative.d.ts +6 -0
  58. package/lib/nodes/negative.js +42 -0
  59. package/lib/nodes/negative.js.map +1 -0
  60. package/lib/nodes/operation.d.ts +6 -0
  61. package/lib/nodes/operation.js +63 -0
  62. package/lib/nodes/operation.js.map +1 -0
  63. package/lib/nodes/paren.d.ts +6 -0
  64. package/lib/nodes/paren.js +42 -0
  65. package/lib/nodes/paren.js.map +1 -0
  66. package/lib/nodes/quoted.d.ts +6 -0
  67. package/lib/nodes/quoted.js +57 -0
  68. package/lib/nodes/quoted.js.map +1 -0
  69. package/lib/nodes/reference.d.ts +9 -0
  70. package/lib/nodes/reference.js +80 -0
  71. package/lib/nodes/reference.js.map +1 -0
  72. package/lib/nodes/ruleset.d.ts +6 -0
  73. package/lib/nodes/ruleset.js +108 -0
  74. package/lib/nodes/ruleset.js.map +1 -0
  75. package/lib/nodes/selector.d.ts +8 -0
  76. package/lib/nodes/selector.js +226 -0
  77. package/lib/nodes/selector.js.map +1 -0
  78. package/lib/nodes/sequence.d.ts +9 -0
  79. package/lib/nodes/sequence.js +75 -0
  80. package/lib/nodes/sequence.js.map +1 -0
  81. package/lib/nodes/url.d.ts +6 -0
  82. package/lib/nodes/url.js +42 -0
  83. package/lib/nodes/url.js.map +1 -0
  84. package/lib/nodes/var-declaration.d.ts +6 -0
  85. package/lib/nodes/var-declaration.js +60 -0
  86. package/lib/nodes/var-declaration.js.map +1 -0
  87. package/lib/plugin-utils.d.ts +20 -0
  88. package/lib/plugin-utils.js +100 -0
  89. package/lib/plugin-utils.js.map +1 -0
  90. package/lib/plugin.d.ts +92 -0
  91. package/lib/plugin.js +1027 -0
  92. package/lib/plugin.js.map +1 -0
  93. package/lib/transform/from-less.d.ts +30 -0
  94. package/lib/transform/from-less.js +170 -0
  95. package/lib/transform/from-less.js.map +1 -0
  96. package/lib/transform/index.d.ts +7 -0
  97. package/lib/transform/index.js +8 -0
  98. package/lib/transform/index.js.map +1 -0
  99. package/lib/transform/proxy.d.ts +32 -0
  100. package/lib/transform/proxy.js +138 -0
  101. package/lib/transform/proxy.js.map +1 -0
  102. package/lib/transform/to-less.d.ts +17 -0
  103. package/lib/transform/to-less.js +128 -0
  104. package/lib/transform/to-less.js.map +1 -0
  105. package/lib/transform/type-map.d.ts +27 -0
  106. package/lib/transform/type-map.js +105 -0
  107. package/lib/transform/type-map.js.map +1 -0
  108. package/lib/types.d.ts +33 -0
  109. package/lib/types.js +5 -0
  110. package/lib/types.js.map +1 -0
  111. 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":"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"}
@@ -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":"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"}
@@ -0,0 +1,6 @@
1
+ import { Url } from '@jesscss/core';
2
+ import type { LessNode } from '../types.js';
3
+ /**
4
+ * Transform a Jess Url to a Less-compatible URL
5
+ */
6
+ export declare function transformUrlToLess(jessUrl: Url, cache?: WeakMap<any, any>): LessNode;
@@ -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
+ };