happy-css-modules 3.1.0 → 3.2.0
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/dist/cli.d.ts +6 -0
- package/dist/cli.js +127 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.test.d.ts +1 -0
- package/dist/cli.test.js +66 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -0
- package/dist/emitter/dts.d.ts +15 -0
- package/dist/emitter/dts.js +134 -0
- package/dist/emitter/dts.js.map +1 -0
- package/dist/emitter/dts.test.d.ts +1 -0
- package/dist/emitter/dts.test.js +206 -0
- package/dist/emitter/dts.test.js.map +1 -0
- package/dist/emitter/file-system.d.ts +6 -0
- package/dist/emitter/file-system.js +26 -0
- package/dist/emitter/file-system.js.map +1 -0
- package/dist/emitter/file-system.test.d.ts +1 -0
- package/dist/emitter/file-system.test.js +34 -0
- package/dist/emitter/file-system.test.js.map +1 -0
- package/dist/emitter/index.d.ts +42 -0
- package/dist/emitter/index.js +49 -0
- package/dist/emitter/index.js.map +1 -0
- package/dist/emitter/index.test.d.ts +1 -0
- package/dist/emitter/index.test.js +76 -0
- package/dist/emitter/index.test.js.map +1 -0
- package/dist/emitter/source-map.d.ts +10 -0
- package/dist/emitter/source-map.js +17 -0
- package/dist/emitter/source-map.js.map +1 -0
- package/dist/emitter/source-map.test.d.ts +1 -0
- package/dist/emitter/source-map.test.js +13 -0
- package/dist/emitter/source-map.test.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/integration-test/go-to-definition.test.d.ts +1 -0
- package/dist/integration-test/go-to-definition.test.js +334 -0
- package/dist/integration-test/go-to-definition.test.js.map +1 -0
- package/dist/locator/index.d.ts +46 -0
- package/dist/locator/index.js +173 -0
- package/dist/locator/index.js.map +1 -0
- package/dist/locator/index.test.d.ts +1 -0
- package/dist/locator/index.test.js +393 -0
- package/dist/locator/index.test.js.map +1 -0
- package/dist/locator/postcss.d.ts +91 -0
- package/dist/locator/postcss.js +241 -0
- package/dist/locator/postcss.js.map +1 -0
- package/dist/locator/postcss.test.d.ts +1 -0
- package/dist/locator/postcss.test.js +256 -0
- package/dist/locator/postcss.test.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.js +28 -0
- package/dist/logger.js.map +1 -0
- package/dist/regression-test/issue-168.test.d.ts +1 -0
- package/dist/regression-test/issue-168.test.js +30 -0
- package/dist/regression-test/issue-168.test.js.map +1 -0
- package/dist/resolver/index.d.ts +22 -0
- package/dist/resolver/index.js +44 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/resolver/index.test.d.ts +1 -0
- package/dist/resolver/index.test.js +16 -0
- package/dist/resolver/index.test.js.map +1 -0
- package/dist/resolver/node-resolver.d.ts +2 -0
- package/dist/resolver/node-resolver.js +6 -0
- package/dist/resolver/node-resolver.js.map +1 -0
- package/dist/resolver/node-resolver.test.d.ts +1 -0
- package/dist/resolver/node-resolver.test.js +25 -0
- package/dist/resolver/node-resolver.test.js.map +1 -0
- package/dist/resolver/relative-resolver.d.ts +2 -0
- package/dist/resolver/relative-resolver.js +5 -0
- package/dist/resolver/relative-resolver.js.map +1 -0
- package/dist/resolver/relative-resolver.test.d.ts +1 -0
- package/dist/resolver/relative-resolver.test.js +12 -0
- package/dist/resolver/relative-resolver.test.js.map +1 -0
- package/dist/resolver/webpack-resolver.d.ts +24 -0
- package/dist/resolver/webpack-resolver.js +91 -0
- package/dist/resolver/webpack-resolver.js.map +1 -0
- package/dist/resolver/webpack-resolver.test.d.ts +1 -0
- package/dist/resolver/webpack-resolver.test.js +89 -0
- package/dist/resolver/webpack-resolver.test.js.map +1 -0
- package/dist/runner.d.ts +78 -0
- package/dist/runner.js +122 -0
- package/dist/runner.js.map +1 -0
- package/dist/runner.test.d.ts +1 -0
- package/dist/runner.test.js +304 -0
- package/dist/runner.test.js.map +1 -0
- package/dist/test-util/jest/resolver.cjs +31 -0
- package/dist/test-util/jest/resolver.cjs.map +1 -0
- package/dist/test-util/jest/resolver.d.cts +16 -0
- package/dist/test-util/tsserver.d.ts +31 -0
- package/dist/test-util/tsserver.js +112 -0
- package/dist/test-util/tsserver.js.map +1 -0
- package/dist/test-util/util.d.ts +29 -0
- package/dist/test-util/util.js +85 -0
- package/dist/test-util/util.js.map +1 -0
- package/dist/transformer/index.d.ts +30 -0
- package/dist/transformer/index.js +25 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/index.test.d.ts +1 -0
- package/dist/transformer/index.test.js +66 -0
- package/dist/transformer/index.test.js.map +1 -0
- package/dist/transformer/less-transformer.d.ts +2 -0
- package/dist/transformer/less-transformer.js +45 -0
- package/dist/transformer/less-transformer.js.map +1 -0
- package/dist/transformer/less-transformer.test.d.ts +1 -0
- package/dist/transformer/less-transformer.test.js +134 -0
- package/dist/transformer/less-transformer.test.js.map +1 -0
- package/dist/transformer/postcss-transformer.d.ts +12 -0
- package/dist/transformer/postcss-transformer.js +32 -0
- package/dist/transformer/postcss-transformer.js.map +1 -0
- package/dist/transformer/postcss-transformer.test.d.ts +1 -0
- package/dist/transformer/postcss-transformer.test.js +178 -0
- package/dist/transformer/postcss-transformer.test.js.map +1 -0
- package/dist/transformer/scss-transformer.d.ts +2 -0
- package/dist/transformer/scss-transformer.js +40 -0
- package/dist/transformer/scss-transformer.js.map +1 -0
- package/dist/transformer/scss-transformer.test.d.ts +1 -0
- package/dist/transformer/scss-transformer.test.js +149 -0
- package/dist/transformer/scss-transformer.test.js.map +1 -0
- package/dist/util.d.ts +21 -0
- package/dist/util.js +72 -0
- package/dist/util.js.map +1 -0
- package/dist/util.test.d.ts +1 -0
- package/dist/util.test.js +74 -0
- package/dist/util.test.js.map +1 -0
- package/package.json +1 -1
- package/src/cli.ts +6 -0
- package/src/emitter/dts.test.ts +7 -4
- package/src/emitter/dts.ts +22 -10
- package/src/emitter/index.test.ts +10 -0
- package/src/emitter/index.ts +17 -4
- package/src/emitter/source-map.test.ts +4 -4
- package/src/emitter/source-map.ts +8 -2
- package/src/runner.test.ts +23 -0
- package/src/runner.ts +6 -0
- package/src/library/README.md +0 -3
- package/src/library/source-map/index.ts +0 -26
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import postcss from 'postcss';
|
|
2
|
+
import modules from 'postcss-modules';
|
|
3
|
+
import selectorParser from 'postcss-selector-parser';
|
|
4
|
+
import valueParser from 'postcss-value-parser';
|
|
5
|
+
/**
|
|
6
|
+
* Traverses a local token from the AST and returns its name.
|
|
7
|
+
* @param ast The AST to traverse.
|
|
8
|
+
* @returns The name of the local token.
|
|
9
|
+
*/
|
|
10
|
+
export async function generateLocalTokenNames(ast) {
|
|
11
|
+
class EmptyLoader {
|
|
12
|
+
async fetch(_file, _relativeTo, _depTrace) {
|
|
13
|
+
// Return an empty object because we do not want to load external tokens in `generateLocalTokenNames`.
|
|
14
|
+
return Promise.resolve({});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
postcss
|
|
19
|
+
.default()
|
|
20
|
+
.use(modules({
|
|
21
|
+
// `@import`, `@value`, and `composes` can read tokens from external files.
|
|
22
|
+
// However, we want to collect only local tokens. So we will fake that
|
|
23
|
+
// an empty token is exported from the external file.
|
|
24
|
+
Loader: EmptyLoader,
|
|
25
|
+
getJSON: (_cssFileName, json) => {
|
|
26
|
+
resolve(Object.keys(json));
|
|
27
|
+
},
|
|
28
|
+
}))
|
|
29
|
+
// NOTE: `process` modifies ast, so clone it.
|
|
30
|
+
.process(ast.clone())
|
|
31
|
+
.catch(reject);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the original location of the class selector.
|
|
36
|
+
* @param rule The rule node that contains the token.
|
|
37
|
+
* @param classSelector The class selector node that contains the token.
|
|
38
|
+
* @returns The original location of the class selector.
|
|
39
|
+
*/
|
|
40
|
+
export function getOriginalLocationOfClassSelector(rule, classSelector) {
|
|
41
|
+
// The node derived from `postcss.parse` always has `source` property. Therefore, this line is unreachable.
|
|
42
|
+
if (rule.source === undefined || classSelector.source === undefined)
|
|
43
|
+
throw new Error('Node#source is undefined');
|
|
44
|
+
// The node derived from `postcss.parse` always has `start` and `end` property. Therefore, this line is unreachable.
|
|
45
|
+
if (rule.source.start === undefined || classSelector.source.start === undefined)
|
|
46
|
+
throw new Error('Node#start is undefined');
|
|
47
|
+
if (rule.source.end === undefined || classSelector.source.end === undefined)
|
|
48
|
+
throw new Error('Node#end is undefined');
|
|
49
|
+
if (rule.source.input.file === undefined)
|
|
50
|
+
throw new Error('Node#input.file is undefined');
|
|
51
|
+
const classSelectorStartPosition = {
|
|
52
|
+
// The line is 1-based.
|
|
53
|
+
line: rule.source.start.line + (classSelector.source.start.line - 1),
|
|
54
|
+
// The column is 1-based.
|
|
55
|
+
column: rule.source.start.column + (classSelector.source.start.column - 1),
|
|
56
|
+
};
|
|
57
|
+
const classSelectorEndPosition = {
|
|
58
|
+
line: classSelectorStartPosition.line,
|
|
59
|
+
// The column is inclusive.
|
|
60
|
+
column: classSelectorStartPosition.column + classSelector.value.length,
|
|
61
|
+
};
|
|
62
|
+
const classSelectorLocation = {
|
|
63
|
+
filePath: rule.source.input.file,
|
|
64
|
+
start: classSelectorStartPosition,
|
|
65
|
+
end: classSelectorEndPosition,
|
|
66
|
+
};
|
|
67
|
+
if (!rule.source.input.map)
|
|
68
|
+
return classSelectorLocation;
|
|
69
|
+
const classSelectorOrigin = rule.source.input.origin(classSelectorLocation.start.line,
|
|
70
|
+
// The column of `Input#origin` is 0-based. This behavior is undocumented and probably a postcss's bug.
|
|
71
|
+
// TODO: Open PR to postcss/postcss
|
|
72
|
+
classSelectorLocation.start.column - 1);
|
|
73
|
+
if (classSelectorOrigin === false || classSelectorOrigin.file === undefined) {
|
|
74
|
+
return { filePath: undefined, start: undefined, end: undefined };
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
filePath: classSelectorOrigin.file,
|
|
78
|
+
start: {
|
|
79
|
+
line: classSelectorOrigin.line,
|
|
80
|
+
column: classSelectorOrigin.column + 1,
|
|
81
|
+
},
|
|
82
|
+
end: {
|
|
83
|
+
line: classSelectorOrigin.line,
|
|
84
|
+
column: classSelectorOrigin.column + classSelector.value.length + 1,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the original location of `@value`.
|
|
90
|
+
* @param atValue The `@value` rule.
|
|
91
|
+
* @returns The location of the `@value` rule.
|
|
92
|
+
*/
|
|
93
|
+
export function getOriginalLocationOfAtValue(atValue, valueDeclaration) {
|
|
94
|
+
// The node derived from `postcss.parse` always has `source` property. Therefore, this line is unreachable.
|
|
95
|
+
if (atValue.source === undefined)
|
|
96
|
+
throw new Error('Node#source is undefined');
|
|
97
|
+
// The node derived from `postcss.parse` always has `start` and `end` property. Therefore, this line is unreachable.
|
|
98
|
+
if (atValue.source.start === undefined)
|
|
99
|
+
throw new Error('Node#start is undefined');
|
|
100
|
+
if (atValue.source.end === undefined)
|
|
101
|
+
throw new Error('Node#end is undefined');
|
|
102
|
+
if (atValue.source.input.file === undefined)
|
|
103
|
+
throw new Error('Node#input.file is undefined');
|
|
104
|
+
return {
|
|
105
|
+
filePath: atValue.source.input.file,
|
|
106
|
+
start: {
|
|
107
|
+
line: atValue.source.start.line,
|
|
108
|
+
column: atValue.source.start.column + 7, // Add for `@value `
|
|
109
|
+
},
|
|
110
|
+
end: {
|
|
111
|
+
line: atValue.source.start.line,
|
|
112
|
+
column: atValue.source.start.column + 7 + valueDeclaration.tokenName.length, // Add for `@value ` and token name
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function isAtRuleNode(node) {
|
|
117
|
+
return node.type === 'atrule';
|
|
118
|
+
}
|
|
119
|
+
function isAtImportNode(node) {
|
|
120
|
+
return isAtRuleNode(node) && node.name === 'import';
|
|
121
|
+
}
|
|
122
|
+
function isAtValueNode(node) {
|
|
123
|
+
return isAtRuleNode(node) && node.name === 'value';
|
|
124
|
+
}
|
|
125
|
+
function isRuleNode(node) {
|
|
126
|
+
return node.type === 'rule';
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Collect nodes from the AST.
|
|
130
|
+
* @param ast The AST.
|
|
131
|
+
*/
|
|
132
|
+
export function collectNodes(ast) {
|
|
133
|
+
const atImports = [];
|
|
134
|
+
const atValues = [];
|
|
135
|
+
const classSelectors = [];
|
|
136
|
+
ast.walk((node) => {
|
|
137
|
+
if (isAtImportNode(node)) {
|
|
138
|
+
atImports.push(node);
|
|
139
|
+
}
|
|
140
|
+
else if (isAtValueNode(node)) {
|
|
141
|
+
atValues.push(node);
|
|
142
|
+
}
|
|
143
|
+
else if (isRuleNode(node)) {
|
|
144
|
+
// In `rule.selector` comes the following string:
|
|
145
|
+
// 1. ".foo"
|
|
146
|
+
// 2. ".foo:hover"
|
|
147
|
+
// 3. ".foo, .bar"
|
|
148
|
+
selectorParser((selectors) => {
|
|
149
|
+
selectors.walk((selector) => {
|
|
150
|
+
if (selector.type === 'class') {
|
|
151
|
+
// In `selector.value` comes the following string:
|
|
152
|
+
// 1. "foo"
|
|
153
|
+
// 2. "bar"
|
|
154
|
+
classSelectors.push({ rule: node, classSelector: selector });
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}).processSync(node);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
return { atImports, atValues, classSelectors };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Parse the `@import` rule.
|
|
164
|
+
* @param atImport The `@import` rule to parse.
|
|
165
|
+
* @returns The imported sheet path.
|
|
166
|
+
*/
|
|
167
|
+
export function parseAtImport(atImport) {
|
|
168
|
+
const firstNode = valueParser(atImport.params).nodes[0];
|
|
169
|
+
if (firstNode === undefined)
|
|
170
|
+
return undefined;
|
|
171
|
+
if (firstNode.type === 'string')
|
|
172
|
+
return firstNode.value;
|
|
173
|
+
if (firstNode.type === 'function' && firstNode.value === 'url') {
|
|
174
|
+
if (firstNode.nodes[0] === undefined)
|
|
175
|
+
return undefined;
|
|
176
|
+
if (firstNode.nodes[0].type === 'string')
|
|
177
|
+
return firstNode.nodes[0].value;
|
|
178
|
+
if (firstNode.nodes[0].type === 'word')
|
|
179
|
+
return firstNode.nodes[0].value;
|
|
180
|
+
}
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
const matchImports = /^(.+?|\([\s\S]+?\))\s+from\s+("[^"]*"|'[^']*'|[\w-]+)$/u;
|
|
184
|
+
const matchValueDefinition = /(?:\s+|^)([\w-]+):?(.*?)$/u;
|
|
185
|
+
const matchImport = /^([\w-]+)(?:\s+as\s+([\w-]+))?/u;
|
|
186
|
+
/**
|
|
187
|
+
* Parse the `@value` rule.
|
|
188
|
+
* Forked from https://github.com/css-modules/postcss-modules-values/blob/v4.0.0/src/index.js.
|
|
189
|
+
*
|
|
190
|
+
* @license
|
|
191
|
+
* ISC License (ISC)
|
|
192
|
+
* Copyright (c) 2015, Glen Maddern
|
|
193
|
+
*
|
|
194
|
+
* Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,
|
|
195
|
+
* provided that the above copyright notice and this permission notice appear in all copies.
|
|
196
|
+
*
|
|
197
|
+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING
|
|
198
|
+
* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
199
|
+
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
200
|
+
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
|
|
201
|
+
* THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
202
|
+
*/
|
|
203
|
+
export function parseAtValue(atValue) {
|
|
204
|
+
const matchesForImports = atValue.params.match(matchImports);
|
|
205
|
+
if (matchesForImports) {
|
|
206
|
+
const [, aliases, path] = matchesForImports;
|
|
207
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
208
|
+
if (aliases === undefined || path === undefined)
|
|
209
|
+
throw new Error(`unreachable`);
|
|
210
|
+
const imports = aliases
|
|
211
|
+
.replace(/^\(\s*([\s\S]+)\s*\)$/u, '$1')
|
|
212
|
+
.split(/\s*,\s*/u)
|
|
213
|
+
.map((alias) => {
|
|
214
|
+
const tokens = matchImport.exec(alias);
|
|
215
|
+
if (tokens) {
|
|
216
|
+
const [, theirName, myName] = tokens;
|
|
217
|
+
if (theirName === undefined)
|
|
218
|
+
throw new Error(`unreachable`);
|
|
219
|
+
return { importedTokenName: theirName, localTokenName: myName ?? theirName };
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
throw new Error(`@import statement "${alias}" is invalid!`);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
// Remove quotes from the path.
|
|
226
|
+
// NOTE: This is a restriction unique to "happy-css-modules" and not a specification of CSS Modules.
|
|
227
|
+
const normalizedPath = path.replace(/^['"]|['"]$/gu, '');
|
|
228
|
+
return { type: 'valueImportDeclaration', imports, from: normalizedPath };
|
|
229
|
+
}
|
|
230
|
+
const matchesForValueDefinitions = `${atValue.params}${atValue.raws.between}`.match(matchValueDefinition);
|
|
231
|
+
if (matchesForValueDefinitions) {
|
|
232
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
233
|
+
const [, key, value] = matchesForValueDefinitions;
|
|
234
|
+
if (key === undefined)
|
|
235
|
+
throw new Error(`unreachable`);
|
|
236
|
+
return { type: 'valueDeclaration', tokenName: key };
|
|
237
|
+
}
|
|
238
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
239
|
+
throw new Error(`@value statement "${atValue.source}" is invalid!`);
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=postcss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postcss.js","sourceRoot":"","sources":["../../src/locator/postcss.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import dedent from 'dedent';
|
|
2
|
+
import { createRoot, createClassSelectors, createAtImports, createFixtures, createAtValues, } from '../test-util/util.js';
|
|
3
|
+
import { generateLocalTokenNames, getOriginalLocationOfClassSelector, parseAtImport, parseAtValue, collectNodes, getOriginalLocationOfAtValue, } from './postcss.js';
|
|
4
|
+
describe('generateLocalTokenNames', () => {
|
|
5
|
+
test('basic', async () => {
|
|
6
|
+
expect(await generateLocalTokenNames(createRoot(`
|
|
7
|
+
.basic {}
|
|
8
|
+
.cascading {}
|
|
9
|
+
.cascading {}
|
|
10
|
+
.pseudo_class_1 {}
|
|
11
|
+
.pseudo_class_2:hover {}
|
|
12
|
+
:not(.pseudo_class_3) {}
|
|
13
|
+
.multiple_selector_1.multiple_selector_2 {}
|
|
14
|
+
.combinator_1 + .combinator_2 {}
|
|
15
|
+
@supports (display: flex) {
|
|
16
|
+
@media screen and (min-width: 900px) {
|
|
17
|
+
.at_rule {}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
.selector_list_1, .selector_list_2 {}
|
|
21
|
+
:local .local_class_name_1 {}
|
|
22
|
+
:local {
|
|
23
|
+
.local_class_name_2 {}
|
|
24
|
+
.local_class_name_3 {}
|
|
25
|
+
}
|
|
26
|
+
:local(.local_class_name_4) {}
|
|
27
|
+
@value value: #BF4040;
|
|
28
|
+
`))).toStrictEqual([
|
|
29
|
+
'value',
|
|
30
|
+
'basic',
|
|
31
|
+
'cascading',
|
|
32
|
+
'pseudo_class_1',
|
|
33
|
+
'pseudo_class_2',
|
|
34
|
+
'pseudo_class_3',
|
|
35
|
+
'multiple_selector_1',
|
|
36
|
+
'multiple_selector_2',
|
|
37
|
+
'combinator_1',
|
|
38
|
+
'combinator_2',
|
|
39
|
+
'at_rule',
|
|
40
|
+
'selector_list_1',
|
|
41
|
+
'selector_list_2',
|
|
42
|
+
'local_class_name_1',
|
|
43
|
+
'local_class_name_2',
|
|
44
|
+
'local_class_name_3',
|
|
45
|
+
'local_class_name_4',
|
|
46
|
+
]);
|
|
47
|
+
});
|
|
48
|
+
test('does not track styles imported by @import in other file because it is not a local token', async () => {
|
|
49
|
+
createFixtures({
|
|
50
|
+
'/test/1.css': dedent `
|
|
51
|
+
.a {}
|
|
52
|
+
`,
|
|
53
|
+
});
|
|
54
|
+
expect(await generateLocalTokenNames(createRoot(`
|
|
55
|
+
@import "/test/1.css";
|
|
56
|
+
`))).toStrictEqual([]);
|
|
57
|
+
});
|
|
58
|
+
test('does not track styles imported by @value in other file because it is not a local token', async () => {
|
|
59
|
+
createFixtures({
|
|
60
|
+
'/test/1.css': dedent `
|
|
61
|
+
.a {}
|
|
62
|
+
`,
|
|
63
|
+
});
|
|
64
|
+
expect(await generateLocalTokenNames(createRoot(`
|
|
65
|
+
@value a from "/test/1.css";
|
|
66
|
+
`))).toStrictEqual(['a']);
|
|
67
|
+
});
|
|
68
|
+
test('does not track styles imported by composes in other file because it is not a local token', async () => {
|
|
69
|
+
createFixtures({
|
|
70
|
+
'/test/1.css': dedent `
|
|
71
|
+
.b {}
|
|
72
|
+
`,
|
|
73
|
+
});
|
|
74
|
+
expect(await generateLocalTokenNames(createRoot(`
|
|
75
|
+
.a {
|
|
76
|
+
composes: b from "/test/1.css";
|
|
77
|
+
}
|
|
78
|
+
`))).toStrictEqual(['a']);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('getOriginalLocationOfClassSelector', () => {
|
|
82
|
+
test('basic', () => {
|
|
83
|
+
const [basic] = createClassSelectors(createRoot(dedent `
|
|
84
|
+
.basic {}
|
|
85
|
+
`));
|
|
86
|
+
expect(getOriginalLocationOfClassSelector(basic.rule, basic.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 6 } }`);
|
|
87
|
+
});
|
|
88
|
+
test('cascading', () => {
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
90
|
+
const [cascading_1, cascading_2] = createClassSelectors(createRoot(dedent `
|
|
91
|
+
.cascading {}
|
|
92
|
+
.cascading {}
|
|
93
|
+
`));
|
|
94
|
+
expect(getOriginalLocationOfClassSelector(cascading_1.rule, cascading_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 10 } }`);
|
|
95
|
+
expect(getOriginalLocationOfClassSelector(cascading_2.rule, cascading_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 2, column: 1 }, end: { line: 2, column: 10 } }`);
|
|
96
|
+
});
|
|
97
|
+
test('pseudo_class', () => {
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
99
|
+
const [pseudo_class_1, pseudo_class_2, pseudo_class_3] = createClassSelectors(createRoot(dedent `
|
|
100
|
+
.pseudo_class_1 {}
|
|
101
|
+
.pseudo_class_2:hover {}
|
|
102
|
+
:not(.pseudo_class_3) {}
|
|
103
|
+
`));
|
|
104
|
+
expect(getOriginalLocationOfClassSelector(pseudo_class_1.rule, pseudo_class_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 15 } }`);
|
|
105
|
+
expect(getOriginalLocationOfClassSelector(pseudo_class_2.rule, pseudo_class_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 2, column: 1 }, end: { line: 2, column: 15 } }`);
|
|
106
|
+
expect(getOriginalLocationOfClassSelector(pseudo_class_3.rule, pseudo_class_3.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 3, column: 6 }, end: { line: 3, column: 20 } }`);
|
|
107
|
+
});
|
|
108
|
+
test('multiple_selector', () => {
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
110
|
+
const [multiple_selector_1, multiple_selector_2] = createClassSelectors(createRoot(dedent `
|
|
111
|
+
.multiple_selector_1.multiple_selector_2 {}
|
|
112
|
+
`));
|
|
113
|
+
expect(getOriginalLocationOfClassSelector(multiple_selector_1.rule, multiple_selector_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 20 } }`);
|
|
114
|
+
expect(getOriginalLocationOfClassSelector(multiple_selector_2.rule, multiple_selector_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 21 }, end: { line: 1, column: 40 } }`);
|
|
115
|
+
});
|
|
116
|
+
test('combinator', () => {
|
|
117
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
118
|
+
const [combinator_1, combinator_2] = createClassSelectors(createRoot(dedent `
|
|
119
|
+
.combinator_1 + .combinator_2 {}
|
|
120
|
+
`));
|
|
121
|
+
expect(getOriginalLocationOfClassSelector(combinator_1.rule, combinator_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 13 } }`);
|
|
122
|
+
expect(getOriginalLocationOfClassSelector(combinator_2.rule, combinator_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 17 }, end: { line: 1, column: 29 } }`);
|
|
123
|
+
});
|
|
124
|
+
test('at_rule', () => {
|
|
125
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
126
|
+
const [at_rule] = createClassSelectors(createRoot(dedent `
|
|
127
|
+
@supports (display: flex) {
|
|
128
|
+
@media screen and (min-width: 900px) {
|
|
129
|
+
.at_rule {}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
`));
|
|
133
|
+
expect(getOriginalLocationOfClassSelector(at_rule.rule, at_rule.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 3, column: 5 }, end: { line: 3, column: 12 } }`);
|
|
134
|
+
});
|
|
135
|
+
test('selector_list', () => {
|
|
136
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
137
|
+
const [selector_list_1, selector_list_2] = createClassSelectors(createRoot(dedent `
|
|
138
|
+
.selector_list_1, .selector_list_2 {}
|
|
139
|
+
`));
|
|
140
|
+
expect(getOriginalLocationOfClassSelector(selector_list_1.rule, selector_list_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 16 } }`);
|
|
141
|
+
expect(getOriginalLocationOfClassSelector(selector_list_2.rule, selector_list_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 19 }, end: { line: 1, column: 34 } }`);
|
|
142
|
+
});
|
|
143
|
+
test('local_class_name', () => {
|
|
144
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
145
|
+
const [local_class_name_1, local_class_name_2, local_class_name_3, local_class_name_4] = createClassSelectors(createRoot(dedent `
|
|
146
|
+
:local .local_class_name_1 {}
|
|
147
|
+
:local {
|
|
148
|
+
.local_class_name_2 {}
|
|
149
|
+
.local_class_name_3 {}
|
|
150
|
+
}
|
|
151
|
+
:local(.local_class_name_4) {}
|
|
152
|
+
`));
|
|
153
|
+
expect(getOriginalLocationOfClassSelector(local_class_name_1.rule, local_class_name_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 8 }, end: { line: 1, column: 26 } }`);
|
|
154
|
+
expect(getOriginalLocationOfClassSelector(local_class_name_2.rule, local_class_name_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 3, column: 3 }, end: { line: 3, column: 21 } }`);
|
|
155
|
+
expect(getOriginalLocationOfClassSelector(local_class_name_3.rule, local_class_name_3.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 4, column: 3 }, end: { line: 4, column: 21 } }`);
|
|
156
|
+
expect(getOriginalLocationOfClassSelector(local_class_name_4.rule, local_class_name_4.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 6, column: 8 }, end: { line: 6, column: 26 } }`);
|
|
157
|
+
});
|
|
158
|
+
test('with_newline', () => {
|
|
159
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
160
|
+
const [with_newline_1, with_newline_2, with_newline_3] = createClassSelectors(createRoot(dedent `
|
|
161
|
+
.with_newline_1,
|
|
162
|
+
.with_newline_2
|
|
163
|
+
+ .with_newline_3, {}
|
|
164
|
+
`));
|
|
165
|
+
expect(getOriginalLocationOfClassSelector(with_newline_1.rule, with_newline_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 15 } }`);
|
|
166
|
+
expect(getOriginalLocationOfClassSelector(with_newline_2.rule, with_newline_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 2, column: 1 }, end: { line: 2, column: 15 } }`);
|
|
167
|
+
expect(getOriginalLocationOfClassSelector(with_newline_3.rule, with_newline_3.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 3, column: 5 }, end: { line: 3, column: 19 } }`);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
test('getOriginalLocationOfAtValue', () => {
|
|
171
|
+
function tryGetOriginalLocationOfAtValue(atValue) {
|
|
172
|
+
const parsed = parseAtValue(atValue);
|
|
173
|
+
if (parsed.type === 'valueDeclaration') {
|
|
174
|
+
return getOriginalLocationOfAtValue(atValue, parsed);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
throw new Error('Unexpected type');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const [basic] = createAtValues(createRoot(dedent `
|
|
181
|
+
@value basic: #000;
|
|
182
|
+
`));
|
|
183
|
+
expect(tryGetOriginalLocationOfAtValue(basic)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 8 }, end: { line: 1, column: 13 } }`);
|
|
184
|
+
});
|
|
185
|
+
test('collectNodes', () => {
|
|
186
|
+
const ast = createRoot(dedent `
|
|
187
|
+
@import;
|
|
188
|
+
@import "test.css";
|
|
189
|
+
@ignored;
|
|
190
|
+
.a { ignored: "ignored"; }
|
|
191
|
+
.b { ignored: "ignored"; }
|
|
192
|
+
`);
|
|
193
|
+
const { atImports, classSelectors } = collectNodes(ast);
|
|
194
|
+
expect(atImports).toHaveLength(2);
|
|
195
|
+
expect(atImports[0].toString()).toEqual('@import');
|
|
196
|
+
expect(atImports[1].toString()).toEqual('@import "test.css"');
|
|
197
|
+
expect(classSelectors).toHaveLength(2);
|
|
198
|
+
expect(classSelectors[0].rule.toString()).toEqual('.a { ignored: "ignored"; }');
|
|
199
|
+
expect(classSelectors[0].classSelector.toString()).toEqual('.a');
|
|
200
|
+
expect(classSelectors[1].rule.toString()).toEqual('.b { ignored: "ignored"; }');
|
|
201
|
+
expect(classSelectors[1].classSelector.toString()).toEqual('.b');
|
|
202
|
+
});
|
|
203
|
+
test('parseAtImport', () => {
|
|
204
|
+
const atImports = createAtImports(createRoot(dedent `
|
|
205
|
+
@import;
|
|
206
|
+
@import "test.css";
|
|
207
|
+
@import url("test.css");
|
|
208
|
+
@import url(test.css);
|
|
209
|
+
@import "test.css" print;
|
|
210
|
+
`));
|
|
211
|
+
expect(parseAtImport(atImports[0])).toBe(undefined);
|
|
212
|
+
expect(parseAtImport(atImports[1])).toBe('test.css');
|
|
213
|
+
expect(parseAtImport(atImports[2])).toBe('test.css');
|
|
214
|
+
expect(parseAtImport(atImports[3])).toBe('test.css');
|
|
215
|
+
expect(parseAtImport(atImports[4])).toBe('test.css');
|
|
216
|
+
});
|
|
217
|
+
test('parseAtValue', () => {
|
|
218
|
+
const atValues = createAtValues(createRoot(dedent `
|
|
219
|
+
@value basic: #000;
|
|
220
|
+
@value withoutColon #000;
|
|
221
|
+
@value empty:;
|
|
222
|
+
@value comment:/* comment */;
|
|
223
|
+
@value complex: (max-width: 599px);
|
|
224
|
+
@value import from "test.css";
|
|
225
|
+
@value import1, import2 from "test.css";
|
|
226
|
+
@value import as alias from "test.css";
|
|
227
|
+
/*
|
|
228
|
+
* NOTE: happy-css-modules intentionally does not support module specifier as variable.
|
|
229
|
+
* e.g. \`@value d, e from moduleName;\`
|
|
230
|
+
*/
|
|
231
|
+
`));
|
|
232
|
+
expect(parseAtValue(atValues[0])).toStrictEqual({ type: 'valueDeclaration', tokenName: 'basic' });
|
|
233
|
+
expect(parseAtValue(atValues[1])).toStrictEqual({ type: 'valueDeclaration', tokenName: 'withoutColon' });
|
|
234
|
+
expect(parseAtValue(atValues[2])).toStrictEqual({ type: 'valueDeclaration', tokenName: 'empty' });
|
|
235
|
+
expect(parseAtValue(atValues[3])).toStrictEqual({ type: 'valueDeclaration', tokenName: 'comment' });
|
|
236
|
+
expect(parseAtValue(atValues[4])).toStrictEqual({ type: 'valueDeclaration', tokenName: 'complex' });
|
|
237
|
+
expect(parseAtValue(atValues[5])).toStrictEqual({
|
|
238
|
+
type: 'valueImportDeclaration',
|
|
239
|
+
imports: [{ importedTokenName: 'import', localTokenName: 'import' }],
|
|
240
|
+
from: 'test.css',
|
|
241
|
+
});
|
|
242
|
+
expect(parseAtValue(atValues[6])).toStrictEqual({
|
|
243
|
+
type: 'valueImportDeclaration',
|
|
244
|
+
imports: [
|
|
245
|
+
{ importedTokenName: 'import1', localTokenName: 'import1' },
|
|
246
|
+
{ importedTokenName: 'import2', localTokenName: 'import2' },
|
|
247
|
+
],
|
|
248
|
+
from: 'test.css',
|
|
249
|
+
});
|
|
250
|
+
expect(parseAtValue(atValues[7])).toStrictEqual({
|
|
251
|
+
type: 'valueImportDeclaration',
|
|
252
|
+
imports: [{ importedTokenName: 'import', localTokenName: 'alias' }],
|
|
253
|
+
from: 'test.css',
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
//# sourceMappingURL=postcss.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postcss.test.js","sourceRoot":"","sources":["../../src/locator/postcss.test.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
package/dist/logger.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
const LOG_LEVEL = {
|
|
3
|
+
debug: 2,
|
|
4
|
+
info: 1,
|
|
5
|
+
silent: 0,
|
|
6
|
+
};
|
|
7
|
+
export class Logger {
|
|
8
|
+
constructor(logLevelLabel) {
|
|
9
|
+
this.logLevel = LOG_LEVEL[logLevelLabel];
|
|
10
|
+
}
|
|
11
|
+
debug(message) {
|
|
12
|
+
if (this.logLevel >= LOG_LEVEL['debug']) {
|
|
13
|
+
// eslint-disable-next-line no-console
|
|
14
|
+
console.log('[debug]', message);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
info(message) {
|
|
18
|
+
if (this.logLevel >= LOG_LEVEL['info']) {
|
|
19
|
+
// eslint-disable-next-line no-console
|
|
20
|
+
console.log(chalk.blue('[info]'), message);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
error(message) {
|
|
24
|
+
// eslint-disable-next-line no-console
|
|
25
|
+
console.error(chalk.red('[error]'), message);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,SAAS,GAAoC;IACjD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,OAAO,MAAM;IAEjB,YAAY,aAA4B;QACtC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,CAAC,OAAgB;QACpB,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAgB;QACnB,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,KAAK,CAAC,OAAgB;QACpB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { symlink } from 'fs/promises';
|
|
2
|
+
import { jest } from '@jest/globals';
|
|
3
|
+
import { run } from '../runner.js';
|
|
4
|
+
import { createFixtures, getFixturePath, waitForAsyncTask } from '../test-util/util.js';
|
|
5
|
+
const defaultOptions = {
|
|
6
|
+
pattern: 'test/**/*.css',
|
|
7
|
+
cwd: getFixturePath('/'),
|
|
8
|
+
cache: false,
|
|
9
|
+
logLevel: 'silent',
|
|
10
|
+
};
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
12
|
+
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
13
|
+
// Exit the watcher even if the test fails
|
|
14
|
+
let watcher;
|
|
15
|
+
afterEach(async () => {
|
|
16
|
+
if (watcher) {
|
|
17
|
+
await watcher.close();
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
it('issue-168', async () => {
|
|
21
|
+
createFixtures({
|
|
22
|
+
'/test/css-file.css': '.a {}',
|
|
23
|
+
'/test/non-css-file.txt': 'text file',
|
|
24
|
+
});
|
|
25
|
+
await symlink(getFixturePath('/test/non-css-file.txt'), getFixturePath('/test/symlink.txt'));
|
|
26
|
+
watcher = await run({ ...defaultOptions, watch: true });
|
|
27
|
+
await waitForAsyncTask(300); // Wait for initial code generation to complete
|
|
28
|
+
expect(consoleErrorSpy).not.toBeCalled(); // If an error is output, then failed
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=issue-168.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-168.test.js","sourceRoot":"","sources":["../../src/regression-test/issue-168.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExF,MAAM,cAAc,GAAkB;IACpC,OAAO,EAAE,eAAe;IACxB,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC;IACxB,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,QAAQ;CACnB,CAAC;AAEF,gEAAgE;AAChE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAElF,0CAA0C;AAC1C,IAAI,OAA4B,CAAC;AACjC,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;IACzB,cAAc,CAAC;QACb,oBAAoB,EAAE,OAAO;QAC7B,wBAAwB,EAAE,WAAW;KACtC,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,cAAc,CAAC,wBAAwB,CAAC,EAAE,cAAc,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7F,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,+CAA+C;IAC5E,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,qCAAqC;AACjF,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { WebpackResolverOptions } from './webpack-resolver.js';
|
|
2
|
+
export type ResolverOptions = {
|
|
3
|
+
request: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* The function to resolve the path of the imported file.
|
|
7
|
+
* @returns The resolved path of the imported file. `false` means to skip resolving.
|
|
8
|
+
*/
|
|
9
|
+
export type Resolver = (specifier: string, options: ResolverOptions) => string | false | Promise<string | false>;
|
|
10
|
+
export type DefaultResolverOptions = WebpackResolverOptions;
|
|
11
|
+
/**
|
|
12
|
+
* The Default resolver.
|
|
13
|
+
*
|
|
14
|
+
* This resolver implements a resolve algorithm that is as compatible as possible with the major toolchains,
|
|
15
|
+
* including Node.js, webpack (css-loader, sass-loader, less-loader) and vite. It is difficult to completely
|
|
16
|
+
* mimic the behavior of these toolchains, so the behavior may differ in some cases.
|
|
17
|
+
*
|
|
18
|
+
* @param specifier The specifier to resolve (i.e. './foo.css', '~bootstrap', etc.)
|
|
19
|
+
* @param options The options to resolve
|
|
20
|
+
* @returns The resolved path (absolute). `false` means to skip resolving.
|
|
21
|
+
*/
|
|
22
|
+
export declare const createDefaultResolver: (defaultResolverOptions?: DefaultResolverOptions | undefined) => Resolver;
|