@jesscss/plugin-less-compat 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.
Files changed (87) hide show
  1. package/lib/index.d.ts +1 -0
  2. package/lib/index.js +1 -0
  3. package/lib/index.js.map +1 -1
  4. package/lib/nodes/at-rule.d.ts +2 -6
  5. package/lib/nodes/at-rule.js +17 -68
  6. package/lib/nodes/at-rule.js.map +1 -1
  7. package/lib/nodes/attribute-selector.d.ts +2 -6
  8. package/lib/nodes/attribute-selector.js +14 -50
  9. package/lib/nodes/attribute-selector.js.map +1 -1
  10. package/lib/nodes/call.d.ts +2 -6
  11. package/lib/nodes/call.js +22 -78
  12. package/lib/nodes/call.js.map +1 -1
  13. package/lib/nodes/color.d.ts +1 -6
  14. package/lib/nodes/color.js +11 -45
  15. package/lib/nodes/color.js.map +1 -1
  16. package/lib/nodes/combinator.d.ts +1 -6
  17. package/lib/nodes/combinator.js +6 -33
  18. package/lib/nodes/combinator.js.map +1 -1
  19. package/lib/nodes/comment.d.ts +1 -6
  20. package/lib/nodes/comment.js +8 -40
  21. package/lib/nodes/comment.js.map +1 -1
  22. package/lib/nodes/condition.d.ts +2 -6
  23. package/lib/nodes/condition.js +16 -57
  24. package/lib/nodes/condition.js.map +1 -1
  25. package/lib/nodes/declaration.d.ts +2 -6
  26. package/lib/nodes/declaration.js +32 -75
  27. package/lib/nodes/declaration.js.map +1 -1
  28. package/lib/nodes/dimension.d.ts +1 -6
  29. package/lib/nodes/dimension.js +7 -45
  30. package/lib/nodes/dimension.js.map +1 -1
  31. package/lib/nodes/expression.d.ts +2 -6
  32. package/lib/nodes/expression.js +8 -36
  33. package/lib/nodes/expression.js.map +1 -1
  34. package/lib/nodes/extend.d.ts +1 -6
  35. package/lib/nodes/extend.js +15 -54
  36. package/lib/nodes/extend.js.map +1 -1
  37. package/lib/nodes/import.d.ts +2 -6
  38. package/lib/nodes/import.js +16 -57
  39. package/lib/nodes/import.js.map +1 -1
  40. package/lib/nodes/keyword.d.ts +1 -6
  41. package/lib/nodes/keyword.js +7 -35
  42. package/lib/nodes/keyword.js.map +1 -1
  43. package/lib/nodes/list.d.ts +2 -6
  44. package/lib/nodes/list.js +48 -137
  45. package/lib/nodes/list.js.map +1 -1
  46. package/lib/nodes/mixin.d.ts +2 -6
  47. package/lib/nodes/mixin.js +18 -58
  48. package/lib/nodes/mixin.js.map +1 -1
  49. package/lib/nodes/negative.d.ts +2 -6
  50. package/lib/nodes/negative.js +10 -39
  51. package/lib/nodes/negative.js.map +1 -1
  52. package/lib/nodes/operation.d.ts +2 -6
  53. package/lib/nodes/operation.js +16 -57
  54. package/lib/nodes/operation.js.map +1 -1
  55. package/lib/nodes/paren.d.ts +2 -6
  56. package/lib/nodes/paren.js +10 -39
  57. package/lib/nodes/paren.js.map +1 -1
  58. package/lib/nodes/quoted.d.ts +1 -6
  59. package/lib/nodes/quoted.js +12 -46
  60. package/lib/nodes/quoted.js.map +1 -1
  61. package/lib/nodes/reference.d.ts +1 -9
  62. package/lib/nodes/reference.js +33 -69
  63. package/lib/nodes/reference.js.map +1 -1
  64. package/lib/nodes/ruleset.d.ts +2 -6
  65. package/lib/nodes/ruleset.js +48 -89
  66. package/lib/nodes/ruleset.js.map +1 -1
  67. package/lib/nodes/selector.d.ts +2 -7
  68. package/lib/nodes/selector.js +112 -180
  69. package/lib/nodes/selector.js.map +1 -1
  70. package/lib/nodes/sequence.d.ts +2 -9
  71. package/lib/nodes/sequence.js +44 -63
  72. package/lib/nodes/sequence.js.map +1 -1
  73. package/lib/nodes/url.d.ts +1 -6
  74. package/lib/nodes/url.js +10 -39
  75. package/lib/nodes/url.js.map +1 -1
  76. package/lib/nodes/var-declaration.d.ts +2 -6
  77. package/lib/nodes/var-declaration.js +17 -56
  78. package/lib/nodes/var-declaration.js.map +1 -1
  79. package/lib/plugin.js +2 -3
  80. package/lib/plugin.js.map +1 -1
  81. package/lib/transform/adapter.d.ts +33 -0
  82. package/lib/transform/adapter.js +111 -0
  83. package/lib/transform/adapter.js.map +1 -0
  84. package/lib/transform/proxy.d.ts +2 -2
  85. package/lib/transform/to-less.js +14 -12
  86. package/lib/transform/to-less.js.map +1 -1
  87. package/package.json +16 -12
@@ -1,226 +1,158 @@
1
- import { ComplexSelector, CompoundSelector, BasicSelector, SelectorList, Combinator } from '@jesscss/core';
1
+ import { ComplexSelector, CompoundSelector, BasicSelector, SelectorList, Combinator, Ampersand, Node } from '@jesscss/core';
2
2
  import { createLessProxy } from '../transform/proxy.js';
3
3
  import { toLessNode } from '../transform/to-less.js';
4
+ import { createFromAdapter } from '../transform/adapter.js';
4
5
  /**
5
- * Flatten a hierarchical Jess selector into Less's flat Element array
6
- *
6
+ * Flatten a hierarchical Jess selector into Less's flat Element array.
7
7
  * Less expects: Element[] where each Element has { combinator, value }
8
- * Jess has: ComplexSelector CompoundSelector[] BasicSelector[]
8
+ * Jess now models complex selectors as an interleaved stream of selector
9
+ * components and explicit combinators. Less still expects flat Elements with
10
+ * the combinator attached to the following selector component.
9
11
  */
10
12
  function flattenSelectorToElements(selector, cache) {
11
13
  const elements = [];
12
14
  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
- }
15
+ const selectorListValue = selector.get('value');
16
+ if (selectorListValue.length > 0 && selectorListValue[0]) {
17
+ return flattenSelectorToElements(selectorListValue[0], cache);
20
18
  }
21
19
  return [];
22
20
  }
23
21
  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(' ');
22
+ const components = selector.get('value');
23
+ let nextCombinatorValue = '';
24
+ for (let i = 0; i < components.length; i++) {
25
+ const component = components[i];
26
+ if (!component) {
27
+ continue;
35
28
  }
36
- else {
37
- // First element has no combinator (or empty combinator)
38
- // Use space as default for Less compatibility
39
- combinator = new Combinator(' ');
29
+ if (component instanceof Combinator) {
30
+ nextCombinatorValue = component.value;
31
+ continue;
40
32
  }
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) {
33
+ if (component instanceof CompoundSelector) {
34
+ const compoundValue = component.get('value');
35
+ for (let j = 0; j < compoundValue.length; j++) {
36
+ const simple = compoundValue[j];
37
+ if (!simple) {
47
38
  continue;
48
39
  }
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);
40
+ const elementCombinator = createLessCombinator(j === 0 ? nextCombinatorValue : '');
41
+ elements.push(createElementProxy(simple, elementCombinator, cache));
90
42
  }
91
43
  }
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);
44
+ else if (component instanceof BasicSelector || component instanceof Ampersand) {
45
+ const elementCombinator = createLessCombinator(nextCombinatorValue);
46
+ elements.push(createElementProxy(component, elementCombinator, cache));
47
+ }
48
+ else if (component instanceof Node) {
49
+ const elementCombinator = createLessCombinator(nextCombinatorValue);
50
+ elements.push(createElementProxy(component, elementCombinator, cache));
111
51
  }
52
+ nextCombinatorValue = '';
112
53
  }
113
54
  }
114
55
  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];
56
+ const compoundSelValue = selector.get('value');
57
+ for (let i = 0; i < compoundSelValue.length; i++) {
58
+ const basic = compoundSelValue[i];
119
59
  if (!basic) {
120
60
  continue;
121
61
  }
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);
62
+ const combinator = createLessCombinator(i === 0 ? '' : '');
63
+ elements.push(createElementProxy(basic, combinator, cache));
140
64
  }
141
65
  }
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);
66
+ else if (selector instanceof BasicSelector || selector instanceof Ampersand) {
67
+ elements.push(createElementProxy(selector, createLessCombinator(''), cache));
162
68
  }
163
69
  return elements;
164
70
  }
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
71
+ function createLessCombinator(value) {
72
+ const base = new Combinator(' ');
73
+ return createLessProxy(base, undefined, (prop) => {
176
74
  if (prop === 'type') {
177
- return 'Selector';
75
+ return 'Combinator';
178
76
  }
179
- // Map 'typeIndex'
180
- if (prop === 'typeIndex') {
181
- return undefined;
77
+ if (prop === 'value') {
78
+ return value;
182
79
  }
183
- // Map 'elements' property (Less Selector has elements array)
184
- if (prop === 'elements') {
185
- return elements;
80
+ if (prop === 'emptyOrWhitespace') {
81
+ return value === '' || value === ' ';
186
82
  }
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];
83
+ return undefined;
84
+ });
85
+ }
86
+ function createElementProxy(basic, combinator, cache) {
87
+ // Create without sharing cache (avoids collision with any Selector proxy
88
+ // already cached for this BasicSelector). Then store the Element proxy in
89
+ // the shared cache so toLessNode returns it when the Jess walker visits
90
+ // this BasicSelector — matching the original code's caching behavior.
91
+ const proxy = createLessProxy(basic, undefined, (prop, target) => {
92
+ const basicSel = target;
93
+ if (prop === 'type') {
94
+ return 'Element';
95
+ }
96
+ if (prop === 'combinator') {
97
+ return combinator;
191
98
  }
192
- // Map 'length' property
193
- if (prop === 'length') {
194
- return elements.length;
99
+ if (prop === 'value') {
100
+ return basicSel.value;
101
+ }
102
+ if (prop === 'isVariable') {
103
+ return false;
195
104
  }
196
- // Map 'accept' method for visitor traversal
197
105
  if (prop === 'accept') {
198
106
  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
- }
107
+ if (combinator && visitor.visit) {
108
+ visitor.visit(combinator);
109
+ }
110
+ const value = basicSel.value;
111
+ if (value && typeof value === 'object') {
112
+ const lessValue = toLessNode(value, { cache });
113
+ if (lessValue && visitor.visit) {
114
+ visitor.visit(lessValue);
218
115
  }
219
116
  }
220
- return jessSelector;
117
+ return basicSel;
221
118
  };
222
119
  }
223
120
  return undefined;
224
121
  });
122
+ if (cache) {
123
+ cache.set(basic, proxy);
124
+ }
125
+ return proxy;
225
126
  }
127
+ export const transformSelectorToLess = createFromAdapter({
128
+ lessType: 'Selector',
129
+ fields: {
130
+ elements: (sel, cache) => flattenSelectorToElements(sel, cache),
131
+ length: (sel, cache) => flattenSelectorToElements(sel, cache).length
132
+ },
133
+ dynamicField: (prop, sel, cache) => {
134
+ if (typeof prop === 'string' && /^\d+$/.test(prop)) {
135
+ return flattenSelectorToElements(sel, cache)[parseInt(prop, 10)];
136
+ }
137
+ return undefined;
138
+ },
139
+ accept: (sel, visitor, cache) => {
140
+ const elements = flattenSelectorToElements(sel, cache);
141
+ for (const element of elements) {
142
+ if (element?.accept) {
143
+ element.accept(visitor);
144
+ }
145
+ else if (element) {
146
+ const lessElement = toLessNode(element, { cache });
147
+ if (lessElement?.accept) {
148
+ lessElement.accept(visitor);
149
+ }
150
+ else if (lessElement && visitor.visitArray) {
151
+ visitor.visitArray([lessElement]);
152
+ }
153
+ }
154
+ }
155
+ return sel;
156
+ }
157
+ });
226
158
  //# sourceMappingURL=selector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"selector.js","sourceRoot":"","sources":["../../src/nodes/selector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selector.js","sourceRoot":"","sources":["../../src/nodes/selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,UAAU,EACV,SAAS,EACT,IAAI,EACL,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D;;;;;;GAMG;AACH,SAAS,yBAAyB,CAChC,QAAkB,EAClB,KAAyB;IAEzB,MAAM,QAAQ,GAAe,EAAE,CAAC;IAEhC,IAAI,QAAQ,YAAY,YAAY,EAAE,CAAC;QACrC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,yBAAyB,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,QAAQ,YAAY,eAAe,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,mBAAmB,GAAG,EAAE,CAAC;QAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YACD,IAAI,SAAS,YAAY,UAAU,EAAE,CAAC;gBACpC,mBAAmB,GAAG,SAAS,CAAC,KAAK,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,IAAI,SAAS,YAAY,gBAAgB,EAAE,CAAC;gBAC1C,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;oBAChC,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,SAAS;oBACX,CAAC;oBACD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACnF,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;iBAAM,IAAI,SAAS,YAAY,aAAa,IAAI,SAAS,YAAY,SAAS,EAAE,CAAC;gBAChF,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;gBACpE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;YACzE,CAAC;iBAAM,IAAI,SAAS,YAAY,IAAI,EAAE,CAAC;gBACrC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;gBACpE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;YACzE,CAAC;YAED,mBAAmB,GAAG,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,YAAY,gBAAgB,EAAE,CAAC;QAChD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YACD,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3D,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,YAAY,aAAa,IAAI,QAAQ,YAAY,SAAS,EAAE,CAAC;QAC9E,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;QAC/C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACjC,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,GAAG,CAAC;QACvC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAW,EACX,UAAoB,EACpB,KAAyB;IAEzB,yEAAyE;IACzE,0EAA0E;IAC1E,wEAAwE;IACxE,sEAAsE;IACtE,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC/D,MAAM,QAAQ,GAAG,MAAc,CAAC;QAChC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAQ,QAAgC,CAAC,KAAK,CAAC;QACjD,CAAC;QACD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,UAAS,OAAY;gBAC1B,IAAI,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAChC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC5B,CAAC;gBACD,MAAM,KAAK,GAAI,QAAgC,CAAC,KAAK,CAAC;gBACtD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACvC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAa,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;oBACvD,IAAI,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;wBAC/B,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,iBAAiB,CAA0B;IAChF,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE;QACN,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,yBAAyB,CAAC,GAAe,EAAE,KAAK,CAAC;QAC3E,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,yBAAyB,CAAC,GAAe,EAAE,KAAK,CAAC,CAAC,MAAM;KACjF;IACD,YAAY,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,yBAAyB,CAAC,GAAe,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9B,MAAM,QAAQ,GAAG,yBAAyB,CAAC,GAAe,EAAE,KAAK,CAAC,CAAC;QACnE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,MAAM,WAAW,GAAG,UAAU,CAAC,OAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1D,IAAI,WAAW,EAAE,MAAM,EAAE,CAAC;oBACxB,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC9B,CAAC;qBAAM,IAAI,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;oBAC7C,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF,CAAC,CAAC"}
@@ -1,9 +1,2 @@
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;
1
+ import { Node } from '@jesscss/core';
2
+ export declare const transformSequenceToLess: (jessNode: Node, cache?: WeakMap<any, any>) => import("../types.js").LessNode;
@@ -1,75 +1,56 @@
1
1
  import { Node } from '@jesscss/core';
2
- import { createLessProxy } from '../transform/proxy.js';
2
+ import { createFromAdapter } from '../transform/adapter.js';
3
3
  import { toLessNode } from '../transform/to-less.js';
4
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
- }
5
+ export const transformSequenceToLess = createFromAdapter({
6
+ fields: {
7
+ value: (seq, cache) => (seq.get('value') ?? [])
8
+ .map((item) => item instanceof Node ? toLessNode(item, { cache }) : item)
9
+ .filter((item) => item != null),
10
+ length: seq => (seq.get('value') ?? []).filter((v) => v != null).length
11
+ },
12
+ dynamicField: (prop, seq, cache) => {
28
13
  if (typeof prop === 'string' && /^\d+$/.test(prop)) {
29
14
  const idx = Number(prop);
30
- const arr = (seq.value ?? []).filter((v) => v !== undefined && v !== null);
15
+ const arr = (seq.get('value') ?? []).filter((v) => v != null);
31
16
  const item = arr[idx];
32
17
  return item instanceof Node ? toLessNode(item, { cache }) : item;
33
18
  }
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
- }
19
+ return undefined;
20
+ },
21
+ accept: (seq, visitor, cache) => {
22
+ const raw = seq.get('value') ?? [];
23
+ if (!Array.isArray(raw) || raw.length === 0) {
24
+ return seq;
25
+ }
26
+ for (let i = 0; i < raw.length; i++) {
27
+ const item = raw[i];
28
+ if (item == null) {
29
+ continue;
30
+ }
31
+ const lessItem = item instanceof Node ? toLessNode(item, { cache }) : item;
32
+ if (!lessItem || typeof visitor?.visit !== 'function') {
33
+ continue;
34
+ }
35
+ const visited = visitor.visit(lessItem);
36
+ if (visited && visited !== lessItem && typeof visited === 'object' && visited.type) {
37
+ try {
38
+ const jessReplacement = fromLessNode(visited, { cache: new WeakMap() });
39
+ if (item instanceof Node) {
40
+ jessReplacement.pre = item.pre;
41
+ jessReplacement.post = item.post;
67
42
  }
43
+ seq.adopt(jessReplacement);
44
+ const seqArr = seq.get('value');
45
+ seqArr[i] = jessReplacement;
46
+ seq.setData('value', seqArr);
68
47
  }
69
- return seq;
70
- };
48
+ catch {
49
+ // If we can't convert it back, ignore
50
+ }
51
+ }
71
52
  }
72
- return undefined;
73
- });
74
- }
53
+ return seq;
54
+ }
55
+ });
75
56
  //# sourceMappingURL=sequence.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/nodes/sequence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/nodes/sequence.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1 @@
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;
1
+ export declare const transformUrlToLess: (jessNode: import("@jesscss/core").Node, cache?: WeakMap<any, any>) => import("../types.js").LessNode;
package/lib/nodes/url.js CHANGED
@@ -1,42 +1,13 @@
1
1
  import { Quoted } from '@jesscss/core';
2
- import { createLessProxy } from '../transform/proxy.js';
2
+ import { createFromAdapter, selfVisitAccept } from '../transform/adapter.js';
3
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
- }
4
+ export const transformUrlToLess = createFromAdapter({
5
+ fields: {
6
+ value: (u, cache) => {
7
+ const value = u.get('value');
8
+ return value instanceof Quoted ? toLessNode(value, { cache }) : value;
9
+ }
10
+ },
11
+ accept: selfVisitAccept()
12
+ });
42
13
  //# sourceMappingURL=url.js.map
@@ -1 +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"}
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,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAM;IACvD,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;YAClB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO,KAAK,YAAY,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxE,CAAC;KACF;IACD,MAAM,EAAE,eAAe,EAAE;CAC1B,CAAC,CAAC"}
@@ -1,6 +1,2 @@
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;
1
+ import { Node } from '@jesscss/core';
2
+ export declare const transformVarDeclarationToLess: (jessNode: Node, cache?: WeakMap<any, any>) => import("../types.js").LessNode;