@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,150 @@
|
|
|
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 List to a Less-compatible Value
|
|
7
|
+
*/
|
|
8
|
+
export function transformListToLess(jessList, cache) {
|
|
9
|
+
return createLessProxy(jessList, cache, (prop, target) => {
|
|
10
|
+
const list = target;
|
|
11
|
+
// Map 'type' property
|
|
12
|
+
if (prop === 'type') {
|
|
13
|
+
return mapJessTypeToLessType(list.type);
|
|
14
|
+
}
|
|
15
|
+
// Map 'typeIndex'
|
|
16
|
+
if (prop === 'typeIndex') {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
// Get filtered, converted value array (used by multiple properties)
|
|
20
|
+
const getFilteredValue = () => {
|
|
21
|
+
const value = list.value;
|
|
22
|
+
if (Array.isArray(value)) {
|
|
23
|
+
return value
|
|
24
|
+
.map((item) => {
|
|
25
|
+
if (!item) {
|
|
26
|
+
return null; // Mark null/undefined for filtering
|
|
27
|
+
}
|
|
28
|
+
if (item instanceof Node) {
|
|
29
|
+
const lessItem = toLessNode(item, { cache });
|
|
30
|
+
// If toLessNode returns undefined, skip it
|
|
31
|
+
return lessItem || null;
|
|
32
|
+
}
|
|
33
|
+
return item;
|
|
34
|
+
})
|
|
35
|
+
.filter((item) => item !== undefined && item !== null); // Filter out undefined/null
|
|
36
|
+
}
|
|
37
|
+
// Single value - wrap in array (if not undefined/null)
|
|
38
|
+
if (value !== undefined && value !== null) {
|
|
39
|
+
if (value && typeof value === 'object' && 'type' in value) {
|
|
40
|
+
// Check if it's a Node-like object
|
|
41
|
+
const lessValue = toLessNode(value, { cache });
|
|
42
|
+
return lessValue ? [lessValue] : [];
|
|
43
|
+
}
|
|
44
|
+
return [value];
|
|
45
|
+
}
|
|
46
|
+
return [];
|
|
47
|
+
};
|
|
48
|
+
// Map 'value' property (Less Value expects array)
|
|
49
|
+
if (prop === 'value') {
|
|
50
|
+
return getFilteredValue();
|
|
51
|
+
}
|
|
52
|
+
// Intercept 'length' property to return filtered array length
|
|
53
|
+
// Less visitor checks node.length to determine if it's array-like
|
|
54
|
+
if (prop === 'length') {
|
|
55
|
+
return getFilteredValue().length;
|
|
56
|
+
}
|
|
57
|
+
// Intercept numeric indices (array access like node[0], node[1])
|
|
58
|
+
// Less visitor may access node[i] directly when node.length exists
|
|
59
|
+
if (typeof prop === 'string' && /^\d+$/.test(prop)) {
|
|
60
|
+
const filtered = getFilteredValue();
|
|
61
|
+
const index = parseInt(prop, 10);
|
|
62
|
+
return filtered[index];
|
|
63
|
+
}
|
|
64
|
+
// Map 'children' method to return filtered, converted items
|
|
65
|
+
// This prevents undefined items from being accessed when Jess core's accept() calls children()
|
|
66
|
+
// children() is a generator function that yields Node instances
|
|
67
|
+
// CRITICAL: When Jess core's accept() calls children(), it uses getValues(this.value)
|
|
68
|
+
// We need to ensure the value property returns clean items, and children() filters them
|
|
69
|
+
if (prop === 'children') {
|
|
70
|
+
return function* (deep, reverse, includePrePost) {
|
|
71
|
+
// Use the filtered value from our value property getter
|
|
72
|
+
// This ensures we get the same filtered array that the value property returns
|
|
73
|
+
const filteredValue = list.value
|
|
74
|
+
.filter((item) => item !== undefined && item !== null)
|
|
75
|
+
.map((item) => {
|
|
76
|
+
if (item instanceof Node) {
|
|
77
|
+
const lessItem = toLessNode(item, { cache });
|
|
78
|
+
return lessItem || null;
|
|
79
|
+
}
|
|
80
|
+
return item;
|
|
81
|
+
})
|
|
82
|
+
.filter((item) => item !== undefined && item !== null);
|
|
83
|
+
// Handle reverse order if needed
|
|
84
|
+
const itemsToIterate = reverse ? [...filteredValue].reverse() : filteredValue;
|
|
85
|
+
for (const item of itemsToIterate) {
|
|
86
|
+
if (item === undefined || item === null) {
|
|
87
|
+
continue; // Skip undefined/null items (shouldn't happen after filtering, but be safe)
|
|
88
|
+
}
|
|
89
|
+
if (item instanceof Node || (item && typeof item === 'object' && 'type' in item)) {
|
|
90
|
+
// It's a node (either Jess node or Less proxy)
|
|
91
|
+
if (includePrePost) {
|
|
92
|
+
// For now, just yield the item (pre/post handling can be added later if needed)
|
|
93
|
+
yield item;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
yield item;
|
|
97
|
+
}
|
|
98
|
+
if (deep && item instanceof Node) {
|
|
99
|
+
// Recursively yield children if deep is true
|
|
100
|
+
if (item.children) {
|
|
101
|
+
yield* item.children(deep, reverse, includePrePost);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
yield item;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Map 'accept' method for visitor traversal
|
|
112
|
+
if (prop === 'accept') {
|
|
113
|
+
return function (visitor) {
|
|
114
|
+
// Less List's accept() should traverse value items if they exist
|
|
115
|
+
// But we don't call visitor.visit() here to avoid infinite loops
|
|
116
|
+
// The visitor's visit() method will handle traversal
|
|
117
|
+
// If value exists, we should traverse items using visitArray
|
|
118
|
+
const value = list.value;
|
|
119
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
120
|
+
const lessItems = value
|
|
121
|
+
.map((item) => {
|
|
122
|
+
if (item instanceof Node) {
|
|
123
|
+
return toLessNode(item, { cache });
|
|
124
|
+
}
|
|
125
|
+
return item;
|
|
126
|
+
})
|
|
127
|
+
.filter((item) => item !== undefined && item !== null); // Filter out undefined/null
|
|
128
|
+
if (lessItems.length > 0) {
|
|
129
|
+
if (visitor.visitArray) {
|
|
130
|
+
visitor.visitArray(lessItems);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Fallback: call accept on each item if visitArray not available
|
|
134
|
+
for (const lessItem of lessItems) {
|
|
135
|
+
if (lessItem && lessItem.accept) {
|
|
136
|
+
lessItem.accept(visitor);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Return the proxy, not the underlying node, to prevent Less visitor from accessing raw Jess node
|
|
143
|
+
// Get the proxy from cache or create it
|
|
144
|
+
return cache && cache.has(list) ? cache.get(list) : transformListToLess(list, cache);
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return undefined;
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/nodes/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
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
|
+
import { fromLessNode } from '../transform/from-less.js';
|
|
6
|
+
/**
|
|
7
|
+
* Transform a Jess Mixin to a Less-compatible MixinDefinition
|
|
8
|
+
*/
|
|
9
|
+
export function transformMixinToLess(jessMixin, cache) {
|
|
10
|
+
return createLessProxy(jessMixin, cache, (prop, target) => {
|
|
11
|
+
const mixin = target;
|
|
12
|
+
// Map 'type' property
|
|
13
|
+
if (prop === 'type') {
|
|
14
|
+
return mapJessTypeToLessType(mixin.type);
|
|
15
|
+
}
|
|
16
|
+
// Map 'typeIndex'
|
|
17
|
+
if (prop === 'typeIndex') {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
// Map 'name' property
|
|
21
|
+
if (prop === 'name') {
|
|
22
|
+
return mixin.value.name;
|
|
23
|
+
}
|
|
24
|
+
// Map 'params' property
|
|
25
|
+
if (prop === 'params') {
|
|
26
|
+
const params = mixin.value.params;
|
|
27
|
+
if (params instanceof Node) {
|
|
28
|
+
return toLessNode(params, { cache });
|
|
29
|
+
}
|
|
30
|
+
return params;
|
|
31
|
+
}
|
|
32
|
+
// Map 'rules' property
|
|
33
|
+
if (prop === 'rules') {
|
|
34
|
+
const rules = mixin.value.rules;
|
|
35
|
+
if (rules && rules.value) {
|
|
36
|
+
return rules.value.map((r) => toLessNode(r, { cache }));
|
|
37
|
+
}
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
// Map 'condition' property (from guard)
|
|
41
|
+
if (prop === 'condition') {
|
|
42
|
+
const guard = mixin.value.guard;
|
|
43
|
+
if (guard instanceof Node) {
|
|
44
|
+
return toLessNode(guard, { cache });
|
|
45
|
+
}
|
|
46
|
+
return guard;
|
|
47
|
+
}
|
|
48
|
+
// Map 'accept' method for visitor traversal
|
|
49
|
+
if (prop === 'accept') {
|
|
50
|
+
return function (visitor) {
|
|
51
|
+
const lessMixin = transformMixinToLess(mixin, cache);
|
|
52
|
+
const result = visitor.visit(lessMixin);
|
|
53
|
+
if (result !== lessMixin) {
|
|
54
|
+
return fromLessNode(result, { cache });
|
|
55
|
+
}
|
|
56
|
+
return mixin;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=mixin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixin.js","sourceRoot":"","sources":["../../src/nodes/mixin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,IAAI,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,oBAAoB,CAClC,SAAgB,EAChB,KAAyB;IAEzB,OAAO,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QACxD,MAAM,KAAK,GAAG,MAAe,CAAC;QAE9B,sBAAsB;QACtB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,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,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1B,CAAC;QAED,wBAAwB;QACxB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YAClC,IAAI,MAAM,YAAY,IAAI,EAAE,CAAC;gBAC3B,OAAO,UAAU,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YAChC,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAO,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,wCAAwC;QACxC,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YAChC,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,4CAA4C;QAC5C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,UAAS,OAAY;gBAC1B,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACrD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzC,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Negative } from '@jesscss/core';
|
|
2
|
+
import type { LessNode } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transform a Jess Negative to a Less-compatible Negative
|
|
5
|
+
*/
|
|
6
|
+
export declare function transformNegativeToLess(jessNegative: Negative, cache?: WeakMap<any, any>): LessNode;
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
import { fromLessNode } from '../transform/from-less.js';
|
|
6
|
+
/**
|
|
7
|
+
* Transform a Jess Negative to a Less-compatible Negative
|
|
8
|
+
*/
|
|
9
|
+
export function transformNegativeToLess(jessNegative, cache) {
|
|
10
|
+
return createLessProxy(jessNegative, cache, (prop, target) => {
|
|
11
|
+
const negative = target;
|
|
12
|
+
// Map 'type' property
|
|
13
|
+
if (prop === 'type') {
|
|
14
|
+
return mapJessTypeToLessType(negative.type);
|
|
15
|
+
}
|
|
16
|
+
// Map 'typeIndex'
|
|
17
|
+
if (prop === 'typeIndex') {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
// Map 'value' property
|
|
21
|
+
if (prop === 'value') {
|
|
22
|
+
const value = negative.value;
|
|
23
|
+
if (value instanceof Node) {
|
|
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 lessNegative = transformNegativeToLess(negative, cache);
|
|
32
|
+
const result = visitor.visit(lessNegative);
|
|
33
|
+
if (result !== lessNegative) {
|
|
34
|
+
return fromLessNode(result, { cache });
|
|
35
|
+
}
|
|
36
|
+
return negative;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=negative.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"negative.js","sourceRoot":"","sources":["../../src/nodes/negative.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,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAsB,EACtB,KAAyB;IAEzB,OAAO,eAAe,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC3D,MAAM,QAAQ,GAAG,MAAkB,CAAC;QAEpC,sBAAsB;QACtB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9C,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,QAAQ,CAAC,KAAK,CAAC;YAC7B,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,4CAA4C;QAC5C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,UAAS,OAAY;gBAC1B,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC3C,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;oBAC5B,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzC,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Operation } from '@jesscss/core';
|
|
2
|
+
import type { LessNode } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transform a Jess Operation to a Less-compatible Operation
|
|
5
|
+
*/
|
|
6
|
+
export declare function transformOperationToLess(jessOperation: Operation, cache?: WeakMap<any, any>): LessNode;
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
import { fromLessNode } from '../transform/from-less.js';
|
|
6
|
+
/**
|
|
7
|
+
* Transform a Jess Operation to a Less-compatible Operation
|
|
8
|
+
*/
|
|
9
|
+
export function transformOperationToLess(jessOperation, cache) {
|
|
10
|
+
return createLessProxy(jessOperation, cache, (prop, target) => {
|
|
11
|
+
const op = target;
|
|
12
|
+
// Map 'type' property
|
|
13
|
+
if (prop === 'type') {
|
|
14
|
+
return mapJessTypeToLessType(op.type);
|
|
15
|
+
}
|
|
16
|
+
// Map 'typeIndex'
|
|
17
|
+
if (prop === 'typeIndex') {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
// Map 'op' property (operator)
|
|
21
|
+
if (prop === 'op') {
|
|
22
|
+
// Jess stores as [left, op, right], extract op
|
|
23
|
+
const value = op.value;
|
|
24
|
+
if (Array.isArray(value) && value.length >= 2) {
|
|
25
|
+
return value[1]; // Operator is in the middle
|
|
26
|
+
}
|
|
27
|
+
return '';
|
|
28
|
+
}
|
|
29
|
+
// Map 'operands' property
|
|
30
|
+
if (prop === 'operands') {
|
|
31
|
+
const value = op.value;
|
|
32
|
+
if (Array.isArray(value)) {
|
|
33
|
+
// Extract left and right operands, skip operator
|
|
34
|
+
const operands = [];
|
|
35
|
+
for (let i = 0; i < value.length; i++) {
|
|
36
|
+
const item = value[i];
|
|
37
|
+
if (item instanceof Node) {
|
|
38
|
+
operands.push(item);
|
|
39
|
+
}
|
|
40
|
+
else if (typeof item === 'string' && i === 1) {
|
|
41
|
+
// Skip operator
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return operands.map(o => toLessNode(o, { cache }));
|
|
46
|
+
}
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
// Map 'accept' method for visitor traversal
|
|
50
|
+
if (prop === 'accept') {
|
|
51
|
+
return function (visitor) {
|
|
52
|
+
const lessOp = transformOperationToLess(op, cache);
|
|
53
|
+
const result = visitor.visit(lessOp);
|
|
54
|
+
if (result !== lessOp) {
|
|
55
|
+
return fromLessNode(result, { cache });
|
|
56
|
+
}
|
|
57
|
+
return op;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return undefined;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation.js","sourceRoot":"","sources":["../../src/nodes/operation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,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,wBAAwB,CACtC,aAAwB,EACxB,KAAyB;IAEzB,OAAO,eAAe,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC5D,MAAM,EAAE,GAAG,MAAmB,CAAC;QAE/B,sBAAsB;QACtB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,qBAAqB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,kBAAkB;QAClB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,+CAA+C;YAC/C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;YACvB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;YAC/C,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;YACvB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,iDAAiD;gBACjD,MAAM,QAAQ,GAAW,EAAE,CAAC;gBAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtB,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;wBACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtB,CAAC;yBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,gBAAgB;wBAChB,SAAS;oBACX,CAAC;gBACH,CAAC;gBACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,4CAA4C;QAC5C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,UAAS,OAAY;gBAC1B,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACnD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzC,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
import { fromLessNode } from '../transform/from-less.js';
|
|
6
|
+
/**
|
|
7
|
+
* Transform a Jess Paren to a Less-compatible Paren
|
|
8
|
+
*/
|
|
9
|
+
export function transformParenToLess(jessParen, cache) {
|
|
10
|
+
return createLessProxy(jessParen, cache, (prop, target) => {
|
|
11
|
+
const paren = target;
|
|
12
|
+
// Map 'type' property
|
|
13
|
+
if (prop === 'type') {
|
|
14
|
+
return mapJessTypeToLessType(paren.type);
|
|
15
|
+
}
|
|
16
|
+
// Map 'typeIndex'
|
|
17
|
+
if (prop === 'typeIndex') {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
// Map 'value' property
|
|
21
|
+
if (prop === 'value') {
|
|
22
|
+
const value = paren.value;
|
|
23
|
+
if (value instanceof Node) {
|
|
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 lessParen = transformParenToLess(paren, cache);
|
|
32
|
+
const result = visitor.visit(lessParen);
|
|
33
|
+
if (result !== lessParen) {
|
|
34
|
+
return fromLessNode(result, { cache });
|
|
35
|
+
}
|
|
36
|
+
return paren;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=paren.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paren.js","sourceRoot":"","sources":["../../src/nodes/paren.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,IAAI,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,oBAAoB,CAClC,SAAgB,EAChB,KAAyB;IAEzB,OAAO,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QACxD,MAAM,KAAK,GAAG,MAAe,CAAC;QAE9B,sBAAsB;QACtB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,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,KAAK,CAAC,KAAK,CAAC;YAC1B,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,4CAA4C;QAC5C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,UAAS,OAAY;gBAC1B,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACrD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzC,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Any, Interpolated } from '@jesscss/core';
|
|
2
|
+
import { createLessProxy } from '../transform/proxy.js';
|
|
3
|
+
import { mapJessTypeToLessType } from '../transform/type-map.js';
|
|
4
|
+
import { fromLessNode } from '../transform/from-less.js';
|
|
5
|
+
/**
|
|
6
|
+
* Transform a Jess Quoted to a Less-compatible Quoted
|
|
7
|
+
*/
|
|
8
|
+
export function transformQuotedToLess(jessQuoted, cache) {
|
|
9
|
+
return createLessProxy(jessQuoted, cache, (prop, target) => {
|
|
10
|
+
const quoted = target;
|
|
11
|
+
// Map 'type' property
|
|
12
|
+
if (prop === 'type') {
|
|
13
|
+
return mapJessTypeToLessType(quoted.type);
|
|
14
|
+
}
|
|
15
|
+
// Map 'typeIndex'
|
|
16
|
+
if (prop === 'typeIndex') {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
// Map 'value' property
|
|
20
|
+
if (prop === 'value') {
|
|
21
|
+
const value = quoted.value;
|
|
22
|
+
if (typeof value === 'string') {
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
if (value instanceof Any) {
|
|
26
|
+
return value.value;
|
|
27
|
+
}
|
|
28
|
+
if (value instanceof Interpolated) {
|
|
29
|
+
// Convert interpolated to string representation
|
|
30
|
+
// Less handles interpolation differently, so we convert to string
|
|
31
|
+
return String(value.value);
|
|
32
|
+
}
|
|
33
|
+
return String(value);
|
|
34
|
+
}
|
|
35
|
+
// Map 'quote' property
|
|
36
|
+
if (prop === 'quote') {
|
|
37
|
+
return quoted.options?.quote || '"';
|
|
38
|
+
}
|
|
39
|
+
// Map 'escaped' property
|
|
40
|
+
if (prop === 'escaped') {
|
|
41
|
+
return quoted.options?.escaped === true;
|
|
42
|
+
}
|
|
43
|
+
// Map 'accept' method for visitor traversal
|
|
44
|
+
if (prop === 'accept') {
|
|
45
|
+
return function (visitor) {
|
|
46
|
+
const lessQuoted = transformQuotedToLess(quoted, cache);
|
|
47
|
+
const result = visitor.visit(lessQuoted);
|
|
48
|
+
if (result !== lessQuoted) {
|
|
49
|
+
return fromLessNode(result, { cache });
|
|
50
|
+
}
|
|
51
|
+
return quoted;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=quoted.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quoted.js","sourceRoot":"","sources":["../../src/nodes/quoted.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,GAAG,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAkB,EAClB,KAAyB;IAEzB,OAAO,eAAe,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,MAAgB,CAAC;QAEhC,sBAAsB;QACtB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,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,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,KAAK,CAAC;YACrB,CAAC;YACD,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,gDAAgD;gBAChD,kEAAkE;gBAClE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,CAAC;QACtC,CAAC;QAED,yBAAyB;QACzB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;QAC1C,CAAC;QAED,4CAA4C;QAC5C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,UAAS,OAAY;gBAC1B,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACzC,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC1B,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzC,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Reference } from '@jesscss/core';
|
|
2
|
+
import type { LessNode } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transform a Jess Reference to a Less-compatible Variable, Property, or VariableCall
|
|
5
|
+
*
|
|
6
|
+
* Jess has unified Reference with options.type
|
|
7
|
+
* Less has separate Variable, Property, and VariableCall nodes
|
|
8
|
+
*/
|
|
9
|
+
export declare function transformReferenceToLess(jessReference: Reference, cache?: WeakMap<any, any>): LessNode;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { createLessProxy } from '../transform/proxy.js';
|
|
2
|
+
/**
|
|
3
|
+
* Transform a Jess Reference to a Less-compatible Variable, Property, or VariableCall
|
|
4
|
+
*
|
|
5
|
+
* Jess has unified Reference with options.type
|
|
6
|
+
* Less has separate Variable, Property, and VariableCall nodes
|
|
7
|
+
*/
|
|
8
|
+
export function transformReferenceToLess(jessReference, cache) {
|
|
9
|
+
const refType = jessReference.options?.type || 'variable';
|
|
10
|
+
// Determine Less node type based on Jess reference type
|
|
11
|
+
let lessType;
|
|
12
|
+
if (refType === 'property') {
|
|
13
|
+
lessType = 'Property';
|
|
14
|
+
}
|
|
15
|
+
else if (refType === 'function' || refType === 'mixin') {
|
|
16
|
+
lessType = 'VariableCall';
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
lessType = 'Variable'; // Default to Variable
|
|
20
|
+
}
|
|
21
|
+
return createLessProxy(jessReference, cache, (prop, target) => {
|
|
22
|
+
const ref = target;
|
|
23
|
+
// Map 'type' property
|
|
24
|
+
if (prop === 'type') {
|
|
25
|
+
return lessType;
|
|
26
|
+
}
|
|
27
|
+
// Map 'typeIndex'
|
|
28
|
+
if (prop === 'typeIndex') {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
// Map 'name' property (for Variable and Property)
|
|
32
|
+
if (prop === 'name') {
|
|
33
|
+
// Less Variable/Property expects name as string
|
|
34
|
+
// Jess Reference has value.key which might be string, number, or Node
|
|
35
|
+
const key = ref.value.key;
|
|
36
|
+
if (typeof key === 'string') {
|
|
37
|
+
// Less variables include the leading "@"
|
|
38
|
+
if (lessType === 'Variable' && !key.startsWith('@')) {
|
|
39
|
+
return `@${key}`;
|
|
40
|
+
}
|
|
41
|
+
return key;
|
|
42
|
+
}
|
|
43
|
+
if (typeof key === 'number') {
|
|
44
|
+
return String(key);
|
|
45
|
+
}
|
|
46
|
+
// For other types, convert to string representation
|
|
47
|
+
return String(key);
|
|
48
|
+
}
|
|
49
|
+
// Map 'value' property (for VariableCall - it's the call expression)
|
|
50
|
+
if (prop === 'value' && lessType === 'VariableCall') {
|
|
51
|
+
// VariableCall has value as the call expression
|
|
52
|
+
// This is complex - for now, return the reference itself
|
|
53
|
+
// Less VariableCall structure might need special handling
|
|
54
|
+
return ref;
|
|
55
|
+
}
|
|
56
|
+
// Map 'index' property
|
|
57
|
+
if (prop === 'index') {
|
|
58
|
+
const loc = ref.location;
|
|
59
|
+
if (Array.isArray(loc) || !loc) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
return loc.index;
|
|
63
|
+
}
|
|
64
|
+
// Map 'currentFileInfo' property
|
|
65
|
+
if (prop === 'currentFileInfo') {
|
|
66
|
+
return ref.location || {};
|
|
67
|
+
}
|
|
68
|
+
// Map 'accept' method for visitor traversal
|
|
69
|
+
// Less's Visitor.visit() calls node.accept(this) to traverse children
|
|
70
|
+
// Reference nodes typically don't have children to traverse
|
|
71
|
+
if (prop === 'accept') {
|
|
72
|
+
return function (visitor) {
|
|
73
|
+
// Reference nodes don't have children to traverse
|
|
74
|
+
// The visitor.visit() was already called by our plugin wrapper
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference.js","sourceRoot":"","sources":["../../src/nodes/reference.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKxD;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,aAAwB,EACxB,KAAyB;IAEzB,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,IAAI,UAAU,CAAC;IAE1D,wDAAwD;IACxD,IAAI,QAAgB,CAAC;IACrB,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,QAAQ,GAAG,UAAU,CAAC;IACxB,CAAC;SAAM,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACzD,QAAQ,GAAG,cAAc,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,UAAU,CAAC,CAAC,sBAAsB;IAC/C,CAAC;IAED,OAAO,eAAe,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC5D,MAAM,GAAG,GAAG,MAAmB,CAAC;QAEhC,sBAAsB;QACtB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,kBAAkB;QAClB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,kDAAkD;QAClD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,gDAAgD;YAChD,sEAAsE;YACtE,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;YAC1B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,yCAAyC;gBACzC,IAAI,QAAQ,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpD,OAAO,IAAI,GAAG,EAAE,CAAC;gBACnB,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC;YACD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;YACD,oDAAoD;YACpD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAED,qEAAqE;QACrE,IAAI,IAAI,KAAK,OAAO,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;YACpD,gDAAgD;YAChD,yDAAyD;YACzD,0DAA0D;YAC1D,OAAO,GAAG,CAAC;QACb,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC;YACzB,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,iCAAiC;QACjC,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC/B,OAAO,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC5B,CAAC;QAED,4CAA4C;QAC5C,sEAAsE;QACtE,4DAA4D;QAC5D,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,UAAS,OAAY;gBAC1B,kDAAkD;gBAClD,+DAA+D;YACjE,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|