happy-css-modules 3.1.0 → 3.1.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/dist/cli.d.ts +6 -0
- package/dist/cli.js +121 -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 +14 -0
- package/dist/emitter/dts.js +128 -0
- package/dist/emitter/dts.js.map +1 -0
- package/dist/emitter/dts.test.d.ts +1 -0
- package/dist/emitter/dts.test.js +205 -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 +34 -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 +68 -0
- package/dist/emitter/index.test.js.map +1 -0
- package/dist/emitter/source-map.d.ts +8 -0
- package/dist/emitter/source-map.js +16 -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/library/source-map/index.d.ts +8 -0
- package/dist/library/source-map/index.js +5 -0
- package/dist/library/source-map/index.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 +76 -0
- package/dist/runner.js +120 -0
- package/dist/runner.js.map +1 -0
- package/dist/runner.test.d.ts +1 -0
- package/dist/runner.test.js +287 -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
|
@@ -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;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { exists } from '../util.js';
|
|
2
|
+
import { createNodeResolver } from './node-resolver.js';
|
|
3
|
+
import { createRelativeResolver } from './relative-resolver.js';
|
|
4
|
+
import { createWebpackResolver } from './webpack-resolver.js';
|
|
5
|
+
/**
|
|
6
|
+
* The Default resolver.
|
|
7
|
+
*
|
|
8
|
+
* This resolver implements a resolve algorithm that is as compatible as possible with the major toolchains,
|
|
9
|
+
* including Node.js, webpack (css-loader, sass-loader, less-loader) and vite. It is difficult to completely
|
|
10
|
+
* mimic the behavior of these toolchains, so the behavior may differ in some cases.
|
|
11
|
+
*
|
|
12
|
+
* @param specifier The specifier to resolve (i.e. './foo.css', '~bootstrap', etc.)
|
|
13
|
+
* @param options The options to resolve
|
|
14
|
+
* @returns The resolved path (absolute). `false` means to skip resolving.
|
|
15
|
+
*/
|
|
16
|
+
export const createDefaultResolver = (defaultResolverOptions) => {
|
|
17
|
+
const relativeResolver = createRelativeResolver();
|
|
18
|
+
const nodeResolver = createNodeResolver();
|
|
19
|
+
const webpackResolver = createWebpackResolver(defaultResolverOptions);
|
|
20
|
+
// In less-loader, `relativeResolver` has priority over `webpackResolver`.
|
|
21
|
+
// happy-css-modules follows suit.
|
|
22
|
+
// ref: https://github.com/webpack-contrib/sass-loader/blob/49a578a218574ddc92a597c7e365b6c21960717e/src/utils.js#L588-L596
|
|
23
|
+
// ref: https://github.com/webpack-contrib/less-loader/tree/454e187f58046356c3d383d67fda763db8bfc528#webpack-resolver
|
|
24
|
+
const resolvers = [relativeResolver, nodeResolver, webpackResolver];
|
|
25
|
+
return async (specifier, options) => {
|
|
26
|
+
for (const resolver of resolvers) {
|
|
27
|
+
try {
|
|
28
|
+
// eslint-disable-next-line no-await-in-loop
|
|
29
|
+
const resolved = await resolver(specifier, options);
|
|
30
|
+
if (resolved !== false) {
|
|
31
|
+
// eslint-disable-next-line no-await-in-loop
|
|
32
|
+
const isExists = await exists(resolved);
|
|
33
|
+
if (isExists)
|
|
34
|
+
return resolved;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
// noop
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAc9D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA8E,CAC9G,sBAAsB,EACtB,EAAE;IACF,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;IAClD,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAC1C,MAAM,eAAe,GAAG,qBAAqB,CAAC,sBAAsB,CAAC,CAAC;IAEtE,0EAA0E;IAC1E,kCAAkC;IAClC,2HAA2H;IAC3H,qHAAqH;IACrH,MAAM,SAAS,GAAG,CAAC,gBAAgB,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;QAClC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,4CAA4C;gBAC5C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACpD,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;oBACvB,4CAA4C;oBAC5C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACxC,IAAI,QAAQ;wBAAE,OAAO,QAAQ,CAAC;gBAChC,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createFixtures, getFixturePath } from '../test-util/util.js';
|
|
2
|
+
import { createDefaultResolver } from './index.js';
|
|
3
|
+
const defaultResolver = createDefaultResolver();
|
|
4
|
+
const request = getFixturePath('/test/1.css');
|
|
5
|
+
test('resolve with webpackResolver when other resolvers fail to resolve', async () => {
|
|
6
|
+
createFixtures({
|
|
7
|
+
'/test/2.css': `.a {}`,
|
|
8
|
+
'/test/3.css': `.a {}`,
|
|
9
|
+
'/node_modules/3.css/index.css': `.a {}`,
|
|
10
|
+
'/node_modules/4.css/index.css': `.a {}`,
|
|
11
|
+
});
|
|
12
|
+
expect(await defaultResolver('2.css', { request })).toBe(getFixturePath('/test/2.css'));
|
|
13
|
+
expect(await defaultResolver('3.css', { request })).toBe(getFixturePath('/test/3.css'));
|
|
14
|
+
expect(await defaultResolver('~4.css', { request })).toBe(getFixturePath('/node_modules/4.css/index.css'));
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/resolver/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC;AAChD,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;AAE9C,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;IACnF,cAAc,CAAC;QACb,aAAa,EAAE,OAAO;QACtB,aAAa,EAAE,OAAO;QACtB,+BAA+B,EAAE,OAAO;QACxC,+BAA+B,EAAE,OAAO;KACzC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IACxF,MAAM,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IACxF,MAAM,CAAC,MAAM,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,+BAA+B,CAAC,CAAC,CAAC;AAC7G,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { fileURLToPath, pathToFileURL } from 'url';
|
|
2
|
+
import { resolve } from 'import-meta-resolve';
|
|
3
|
+
export const createNodeResolver = () => (specifier, options) => {
|
|
4
|
+
return fileURLToPath(resolve(specifier, pathToFileURL(options.request).href));
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=node-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-resolver.js","sourceRoot":"","sources":["../../src/resolver/node-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG9C,MAAM,CAAC,MAAM,kBAAkB,GAAmB,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;IAC7E,OAAO,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createFixtures, getFixturePath } from '../test-util/util.js';
|
|
2
|
+
import { createNodeResolver } from './node-resolver.js';
|
|
3
|
+
const nodeResolver = createNodeResolver();
|
|
4
|
+
const request = getFixturePath('/test/1.css');
|
|
5
|
+
test('resolves specifier with node mechanism', async () => {
|
|
6
|
+
createFixtures({
|
|
7
|
+
'/test/2.css': `.a {}`,
|
|
8
|
+
'/test/dir/3.css': `.a {}`,
|
|
9
|
+
'/4.css': `.a {}`,
|
|
10
|
+
'/test/5.css': `.a {}`,
|
|
11
|
+
'/node_modules/package-1/6.css': `.a {}`,
|
|
12
|
+
'/package.json': `{ "imports": { "#subpath-1": "./test/7.css", "#subpath-2/*.css": "./test/*.css" } }`,
|
|
13
|
+
'/test/7.css': `.a {}`,
|
|
14
|
+
'/test/8.css': `.a {}`,
|
|
15
|
+
});
|
|
16
|
+
expect(await nodeResolver('./2.css', { request })).toBe(getFixturePath('/test/2.css'));
|
|
17
|
+
expect(await nodeResolver('./dir/3.css', { request })).toBe(getFixturePath('/test/dir/3.css'));
|
|
18
|
+
expect(await nodeResolver('../4.css', { request })).toBe(getFixturePath('/4.css'));
|
|
19
|
+
expect(await nodeResolver(getFixturePath('/test/5.css'), { request })).toBe(getFixturePath('/test/5.css'));
|
|
20
|
+
expect(await nodeResolver('package-1/6.css', { request })).toBe(getFixturePath('/node_modules/package-1/6.css'));
|
|
21
|
+
expect(await nodeResolver('#subpath-1', { request })).toBe(getFixturePath('/test/7.css'));
|
|
22
|
+
// FIXME: For some reason, it does not pass...
|
|
23
|
+
// expect(await nodeResolver('#subpath-2/8.css', { request })).toBe(getFixturePath('/test/8.css'));
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=node-resolver.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-resolver.test.js","sourceRoot":"","sources":["../../src/resolver/node-resolver.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;AAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;AAE9C,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;IACxD,cAAc,CAAC;QACb,aAAa,EAAE,OAAO;QACtB,iBAAiB,EAAE,OAAO;QAC1B,QAAQ,EAAE,OAAO;QACjB,aAAa,EAAE,OAAO;QACtB,+BAA+B,EAAE,OAAO;QACxC,eAAe,EAAE,qFAAqF;QACtG,aAAa,EAAE,OAAO;QACtB,aAAa,EAAE,OAAO;KACvB,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,YAAY,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IACvF,MAAM,CAAC,MAAM,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC/F,MAAM,CAAC,MAAM,YAAY,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnF,MAAM,CAAC,MAAM,YAAY,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3G,MAAM,CAAC,MAAM,YAAY,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACjH,MAAM,CAAC,MAAM,YAAY,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1F,8CAA8C;IAC9C,mGAAmG;AACrG,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-resolver.js","sourceRoot":"","sources":["../../src/resolver/relative-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGxC,MAAM,CAAC,MAAM,sBAAsB,GAAmB,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;IACjF,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { getFixturePath } from '../test-util/util.js';
|
|
2
|
+
import { createRelativeResolver } from './relative-resolver.js';
|
|
3
|
+
const relativeResolver = createRelativeResolver();
|
|
4
|
+
const request = getFixturePath('/test/1.css');
|
|
5
|
+
test('resolves specifier with relative mechanism', async () => {
|
|
6
|
+
expect(await relativeResolver('2.css', { request })).toBe(getFixturePath('/test/2.css'));
|
|
7
|
+
expect(await relativeResolver('./3.css', { request })).toBe(getFixturePath('/test/3.css'));
|
|
8
|
+
expect(await relativeResolver('dir/4.css', { request })).toBe(getFixturePath('/test/dir/4.css'));
|
|
9
|
+
expect(await relativeResolver('../5.css', { request })).toBe(getFixturePath('/5.css'));
|
|
10
|
+
expect(await relativeResolver(getFixturePath('/test/6.css'), { request })).toBe(getFixturePath('/test/6.css'));
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=relative-resolver.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-resolver.test.js","sourceRoot":"","sources":["../../src/resolver/relative-resolver.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;AAClD,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;AAE9C,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;IAC5D,MAAM,CAAC,MAAM,gBAAgB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IACzF,MAAM,CAAC,MAAM,gBAAgB,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3F,MAAM,CAAC,MAAM,gBAAgB,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACjG,MAAM,CAAC,MAAM,gBAAgB,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvF,MAAM,CAAC,MAAM,gBAAgB,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;AACjH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Resolver } from './index.js';
|
|
2
|
+
export type WebpackResolverOptions = {
|
|
3
|
+
/** Working directory path. */
|
|
4
|
+
cwd?: string | undefined;
|
|
5
|
+
/**
|
|
6
|
+
* The option compatible with sass's `--load-path`. It is an array of relative or absolute paths.
|
|
7
|
+
* @example ['src/styles']
|
|
8
|
+
* @example ['/home/user/repository/src/styles']
|
|
9
|
+
*/
|
|
10
|
+
sassLoadPaths?: string[] | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* The option compatible with less's `--include-path`. It is an array of relative or absolute paths.
|
|
13
|
+
* @example ['src/styles']
|
|
14
|
+
* @example ['/home/user/repository/src/styles']
|
|
15
|
+
*/
|
|
16
|
+
lessIncludePaths?: string[] | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* The option compatible with webpack's `resolve.alias`. It is an object consisting of a pair of alias names and relative or absolute paths.
|
|
19
|
+
* @example { style: 'src/styles', '@': 'src' }
|
|
20
|
+
* @example { style: '/home/user/repository/src/styles', '@': '/home/user/repository/src' }
|
|
21
|
+
*/
|
|
22
|
+
webpackResolveAlias?: Record<string, string> | undefined;
|
|
23
|
+
};
|
|
24
|
+
export declare const createWebpackResolver: (webpackResolverOptions?: WebpackResolverOptions | undefined) => Resolver;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { basename, dirname, join, resolve } from 'path';
|
|
2
|
+
import enhancedResolve from 'enhanced-resolve';
|
|
3
|
+
import { exists } from '../util.js';
|
|
4
|
+
// TODO: Support `resolve.alias` for Node.js API
|
|
5
|
+
export const createWebpackResolver = (webpackResolverOptions) => {
|
|
6
|
+
const cwd = webpackResolverOptions?.cwd ?? process.cwd();
|
|
7
|
+
const sassLoadPaths = webpackResolverOptions?.sassLoadPaths?.map((path) => resolve(cwd, path));
|
|
8
|
+
const lessIncludePaths = webpackResolverOptions?.lessIncludePaths?.map((path) => resolve(cwd, path));
|
|
9
|
+
const webpackResolveAlias = webpackResolverOptions?.webpackResolveAlias
|
|
10
|
+
? Object.fromEntries(Object.entries(webpackResolverOptions?.webpackResolveAlias).map(([key, value]) => [key, resolve(cwd, value)]))
|
|
11
|
+
: undefined;
|
|
12
|
+
/**
|
|
13
|
+
* A resolver compatible with css-loader.
|
|
14
|
+
*
|
|
15
|
+
* @see https://github.com/webpack-contrib/css-loader/blob/897e7dd250ccdb0d31e6c66d4cd0d009f2022a85/src/plugins/postcss-import-parser.js#L228-L235
|
|
16
|
+
*/
|
|
17
|
+
const cssLoaderResolver = enhancedResolve.create.sync({
|
|
18
|
+
conditionNames: ['style'],
|
|
19
|
+
// We are not sure how "..." affects behavior...
|
|
20
|
+
mainFields: ['css', 'style', 'main', '...'],
|
|
21
|
+
mainFiles: ['index', '...'],
|
|
22
|
+
extensions: ['.css', '...'],
|
|
23
|
+
preferRelative: true,
|
|
24
|
+
alias: webpackResolveAlias ?? {},
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* A resolver compatible with sass-loader.
|
|
28
|
+
*
|
|
29
|
+
* @see https://github.com/webpack-contrib/sass-loader/blob/49a578a218574ddc92a597c7e365b6c21960717e/src/utils.js#L531-L539
|
|
30
|
+
*/
|
|
31
|
+
const sassLoaderResolver = enhancedResolve.create.sync({
|
|
32
|
+
conditionNames: ['sass', 'style'],
|
|
33
|
+
mainFields: ['sass', 'style', 'main', '...'],
|
|
34
|
+
mainFiles: ['_index', 'index', '...'],
|
|
35
|
+
extensions: ['.sass', '.scss', '.css'],
|
|
36
|
+
restrictions: [/\.((sa|sc|c)ss)$/iu],
|
|
37
|
+
preferRelative: true,
|
|
38
|
+
alias: webpackResolveAlias ?? {},
|
|
39
|
+
modules: ['node_modules', ...(sassLoadPaths ?? [])],
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* A resolver compatible with less-loader.
|
|
43
|
+
*
|
|
44
|
+
* @see https://github.com/webpack-contrib/less-loader/blob/d74f740c100c4006b00dfb3e02c6d5aaf8713519/src/utils.js#L35-L42
|
|
45
|
+
*/
|
|
46
|
+
const lessLoaderResolver = enhancedResolve.create.sync({
|
|
47
|
+
conditionNames: ['less', 'style'],
|
|
48
|
+
mainFields: ['less', 'style', 'main', '...'],
|
|
49
|
+
mainFiles: ['index', '...'],
|
|
50
|
+
extensions: ['.less', '.css'],
|
|
51
|
+
preferRelative: true,
|
|
52
|
+
alias: webpackResolveAlias ?? {},
|
|
53
|
+
modules: ['node_modules', ...(lessIncludePaths ?? [])],
|
|
54
|
+
});
|
|
55
|
+
// NOTE: In theory, `sassLoaderResolver` should only be used when the resolver is called from `sassTransformer`.
|
|
56
|
+
// However, we do not implement such behavior because it is cumbersome. If someone wants it, we will implement it.
|
|
57
|
+
const resolvers = [cssLoaderResolver, sassLoaderResolver, lessLoaderResolver];
|
|
58
|
+
return async (specifier, options) => {
|
|
59
|
+
// `~` prefix is optional.
|
|
60
|
+
// ref: https://github.com/webpack-contrib/css-loader/blob/5e6cf91fd3f0c8b5fb4b91197b98dc56abdef4bf/src/utils.js#L92-L95
|
|
61
|
+
// ref: https://github.com/webpack-contrib/sass-loader/blob/49a578a218574ddc92a597c7e365b6c21960717e/src/utils.js#L368-L370
|
|
62
|
+
// ref: https://github.com/webpack-contrib/less-loader/blob/d74f740c100c4006b00dfb3e02c6d5aaf8713519/src/utils.js#L72-L75
|
|
63
|
+
// eslint-disable-next-line no-param-reassign
|
|
64
|
+
if (specifier.startsWith('~'))
|
|
65
|
+
specifier = specifier.slice(1);
|
|
66
|
+
for (const resolver of resolvers) {
|
|
67
|
+
const specifierVariants = resolver === sassLoaderResolver
|
|
68
|
+
? // Support partial import for sass
|
|
69
|
+
// https://sass-lang.com/documentation/at-rules/import#partials
|
|
70
|
+
// https://github.com/webpack-contrib/sass-loader/blob/0e9494074f69a6b6d47efea6c083a02a31a5ae84/test/sass/import-with-underscore.sass
|
|
71
|
+
[join(dirname(specifier), `_${basename(specifier)}`), specifier]
|
|
72
|
+
: [specifier];
|
|
73
|
+
for (const specifierVariant of specifierVariants) {
|
|
74
|
+
try {
|
|
75
|
+
const resolved = resolver(dirname(options.request), specifierVariant);
|
|
76
|
+
if (resolved !== false) {
|
|
77
|
+
// eslint-disable-next-line no-await-in-loop
|
|
78
|
+
const isExists = await exists(resolved);
|
|
79
|
+
if (isExists)
|
|
80
|
+
return resolved;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
// noop
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=webpack-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webpack-resolver.js","sourceRoot":"","sources":["../../src/resolver/webpack-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxD,OAAO,eAAe,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AA0BpC,gDAAgD;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAA8E,CAC9G,sBAAsB,EACtB,EAAE;IACF,MAAM,GAAG,GAAG,sBAAsB,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,aAAa,GAAG,sBAAsB,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/F,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACrG,MAAM,mBAAmB,GAAG,sBAAsB,EAAE,mBAAmB;QACrE,CAAC,CAAC,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAC9G;QACH,CAAC,CAAC,SAAS,CAAC;IACd;;;;OAIG;IACH,MAAM,iBAAiB,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;QACpD,cAAc,EAAE,CAAC,OAAO,CAAC;QACzB,gDAAgD;QAChD,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;QAC3C,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;QAC3B,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;QAC3B,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,mBAAmB,IAAI,EAAE;KACjC,CAAC,CAAC;IAEH;;;;OAIG;IACH,MAAM,kBAAkB,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;QACrD,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;QACjC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;QAC5C,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC;QACrC,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;QACtC,YAAY,EAAE,CAAC,oBAAoB,CAAC;QACpC,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,mBAAmB,IAAI,EAAE;QAChC,OAAO,EAAE,CAAC,cAAc,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;KACpD,CAAC,CAAC;IAEH;;;;OAIG;IACH,MAAM,kBAAkB,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;QACrD,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;QACjC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;QAC5C,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;QAC3B,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;QAC7B,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,mBAAmB,IAAI,EAAE;QAChC,OAAO,EAAE,CAAC,cAAc,EAAE,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;KACvD,CAAC,CAAC;IAEH,gHAAgH;IAChH,kHAAkH;IAClH,MAAM,SAAS,GAAG,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IAE9E,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;QAClC,0BAA0B;QAC1B,wHAAwH;QACxH,2HAA2H;QAC3H,yHAAyH;QACzH,6CAA6C;QAC7C,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE9D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,iBAAiB,GACrB,QAAQ,KAAK,kBAAkB;gBAC7B,CAAC,CAAC,kCAAkC;oBAClC,+DAA+D;oBAC/D,qIAAqI;oBACrI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;gBAClE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAElB,KAAK,MAAM,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;gBACjD,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC;oBACtE,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;wBACvB,4CAA4C;wBAC5C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;wBACxC,IAAI,QAAQ;4BAAE,OAAO,QAAQ,CAAC;oBAChC,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createFixtures, getFixturePath } from '../test-util/util.js';
|
|
2
|
+
import { createWebpackResolver } from './webpack-resolver.js';
|
|
3
|
+
test('resolves specifier with css-loader mechanism', async () => {
|
|
4
|
+
const webpackResolver = createWebpackResolver({
|
|
5
|
+
cwd: getFixturePath('/'),
|
|
6
|
+
webpackResolveAlias: {
|
|
7
|
+
'@relative': 'test/alias-relative',
|
|
8
|
+
'@absolute': getFixturePath('/test/alias-absolute'),
|
|
9
|
+
},
|
|
10
|
+
});
|
|
11
|
+
const request = getFixturePath('/test/1.css');
|
|
12
|
+
createFixtures({
|
|
13
|
+
'/node_modules/package-1/index.css': `.a {}`,
|
|
14
|
+
'/node_modules/package-2/index.css': `.a {}`,
|
|
15
|
+
'/node_modules/package-3/index.css': `.a {}`,
|
|
16
|
+
'/node_modules/package-4/package.json': `{ "style": "./style.css" }`,
|
|
17
|
+
'/node_modules/package-4/style.css': `.a {}`,
|
|
18
|
+
'/node_modules/@scoped/package-5/index.css': `.a {}`,
|
|
19
|
+
'/node_modules/package-6/index.css': `.a {}`,
|
|
20
|
+
'/test/alias-relative/alias.css': `.a {}`,
|
|
21
|
+
'/test/alias-absolute/alias.css': `.a {}`,
|
|
22
|
+
});
|
|
23
|
+
expect(await webpackResolver('~package-1/index.css', { request })).toBe(getFixturePath('/node_modules/package-1/index.css'));
|
|
24
|
+
expect(await webpackResolver('~package-2', { request })).toBe(getFixturePath('/node_modules/package-2/index.css'));
|
|
25
|
+
expect(await webpackResolver('~package-3/', { request })).toBe(getFixturePath('/node_modules/package-3/index.css'));
|
|
26
|
+
expect(await webpackResolver('~package-4', { request })).toBe(getFixturePath('/node_modules/package-4/style.css'));
|
|
27
|
+
expect(await webpackResolver('~@scoped/package-5/index.css', { request })).toBe(getFixturePath('/node_modules/@scoped/package-5/index.css'));
|
|
28
|
+
expect(await webpackResolver('package-6/index.css', { request })).toBe(getFixturePath('/node_modules/package-6/index.css'));
|
|
29
|
+
expect(await webpackResolver('@relative/alias.css', { request })).toBe(getFixturePath('/test/alias-relative/alias.css'));
|
|
30
|
+
expect(await webpackResolver('@absolute/alias.css', { request })).toBe(getFixturePath('/test/alias-absolute/alias.css'));
|
|
31
|
+
});
|
|
32
|
+
test('resolves specifier with sass-loader mechanism', async () => {
|
|
33
|
+
const webpackResolver = createWebpackResolver({
|
|
34
|
+
cwd: getFixturePath('/'),
|
|
35
|
+
sassLoadPaths: ['test/load-paths-relative', getFixturePath('/test/load-paths-absolute')],
|
|
36
|
+
webpackResolveAlias: {
|
|
37
|
+
'@relative': 'test/alias-relative',
|
|
38
|
+
'@absolute': getFixturePath('/test/alias-absolute'),
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
const request = getFixturePath('/test/1.scss');
|
|
42
|
+
createFixtures({
|
|
43
|
+
'/node_modules/package-1/index.scss': `.a {}`,
|
|
44
|
+
'/test/load-paths-relative/load-paths-relative.scss': `.a {}`,
|
|
45
|
+
'/test/load-paths-absolute/load-paths-absolute.scss': `.a {}`,
|
|
46
|
+
'/test/_partial-import.scss': `.a {}`,
|
|
47
|
+
'/test/alias-relative/alias.scss': `.a {}`,
|
|
48
|
+
'/test/alias-absolute/alias.scss': `.a {}`,
|
|
49
|
+
});
|
|
50
|
+
expect(await webpackResolver('~package-1/index.scss', { request })).toBe(getFixturePath('/node_modules/package-1/index.scss'));
|
|
51
|
+
expect(await webpackResolver('~package-1', { request })).toBe(getFixturePath('/node_modules/package-1/index.scss'));
|
|
52
|
+
// ref: https://github.com/webpack-contrib/sass-loader/blob/bed9fb5799a90020d43f705ea405f85b368621d7/test/scss/import-include-paths.scss#L1
|
|
53
|
+
expect(await webpackResolver('load-paths-relative', { request })).toBe(getFixturePath('/test/load-paths-relative/load-paths-relative.scss'));
|
|
54
|
+
expect(await webpackResolver('load-paths-absolute', { request })).toBe(getFixturePath('/test/load-paths-absolute/load-paths-absolute.scss'));
|
|
55
|
+
// https://sass-lang.com/documentation/at-rules/import#partials
|
|
56
|
+
// https://github.com/webpack-contrib/sass-loader/blob/0e9494074f69a6b6d47efea6c083a02a31a5ae84/test/sass/import-with-underscore.sass
|
|
57
|
+
expect(await webpackResolver('partial-import', { request: getFixturePath('/test/1.scss') })).toBe(getFixturePath('/test/_partial-import.scss'));
|
|
58
|
+
expect(await webpackResolver('test/partial-import', { request: getFixturePath('/test') })).toBe(getFixturePath('/test/_partial-import.scss'));
|
|
59
|
+
expect(await webpackResolver('@relative/alias.scss', { request })).toBe(getFixturePath('/test/alias-relative/alias.scss'));
|
|
60
|
+
expect(await webpackResolver('@absolute/alias.scss', { request })).toBe(getFixturePath('/test/alias-absolute/alias.scss'));
|
|
61
|
+
});
|
|
62
|
+
test('resolves specifier with less-loader mechanism', async () => {
|
|
63
|
+
const webpackResolver = createWebpackResolver({
|
|
64
|
+
cwd: getFixturePath('/'),
|
|
65
|
+
lessIncludePaths: ['test/include-paths-relative', getFixturePath('/test/include-paths-absolute')],
|
|
66
|
+
webpackResolveAlias: {
|
|
67
|
+
'@relative': 'test/alias-relative',
|
|
68
|
+
'@absolute': getFixturePath('/test/alias-absolute'),
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
const request = getFixturePath('/test/1.less');
|
|
72
|
+
createFixtures({
|
|
73
|
+
'/node_modules/package-1/index.less': `.a {}`,
|
|
74
|
+
'/test/include-paths-relative/include-paths-relative.less': `.a {}`,
|
|
75
|
+
'/test/include-paths-absolute/include-paths-absolute.less': `.a {}`,
|
|
76
|
+
'/test/alias-relative/alias.less': `.a {}`,
|
|
77
|
+
'/test/alias-absolute/alias.less': `.a {}`,
|
|
78
|
+
});
|
|
79
|
+
expect(await webpackResolver('~package-1/index.less', { request })).toBe(getFixturePath('/node_modules/package-1/index.less'));
|
|
80
|
+
expect(await webpackResolver('~package-1', { request })).toBe(getFixturePath('/node_modules/package-1/index.less'));
|
|
81
|
+
// ref: https://github.com/webpack-contrib/less-loader/blob/81a0d27eb6d18e5dc550a60fc1007fdc77305b78/test/loader.test.js#L248-L253
|
|
82
|
+
// ref: https://github.com/webpack-contrib/less-loader/blob/393147064672ace986ec84aca21f69f0ab819a9c/test/fixtures/import-paths.less#L1
|
|
83
|
+
// ref: https://github.com/webpack-contrib/less-loader/blob/99d80bd290dae50375db6e17c5f56ec33754e258/test/helpers/getCodeFromLess.js#L47-L54
|
|
84
|
+
expect(await webpackResolver('include-paths-relative', { request })).toBe(getFixturePath('/test/include-paths-relative/include-paths-relative.less'));
|
|
85
|
+
expect(await webpackResolver('include-paths-absolute', { request })).toBe(getFixturePath('/test/include-paths-absolute/include-paths-absolute.less'));
|
|
86
|
+
expect(await webpackResolver('@relative/alias.less', { request })).toBe(getFixturePath('/test/alias-relative/alias.less'));
|
|
87
|
+
expect(await webpackResolver('@absolute/alias.less', { request })).toBe(getFixturePath('/test/alias-absolute/alias.less'));
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=webpack-resolver.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webpack-resolver.test.js","sourceRoot":"","sources":["../../src/resolver/webpack-resolver.test.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { Resolver } from './resolver/index.js';
|
|
2
|
+
import { type Transformer } from './transformer/index.js';
|
|
3
|
+
export type Watcher = {
|
|
4
|
+
close: () => Promise<void>;
|
|
5
|
+
};
|
|
6
|
+
export type LocalsConvention = 'camelCase' | 'camelCaseOnly' | 'dashes' | 'dashesOnly' | undefined;
|
|
7
|
+
export interface RunnerOptions {
|
|
8
|
+
pattern: string;
|
|
9
|
+
watch?: boolean | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Style of exported class names.
|
|
12
|
+
* @default undefined
|
|
13
|
+
*/
|
|
14
|
+
localsConvention?: LocalsConvention | undefined;
|
|
15
|
+
declarationMap?: boolean | undefined;
|
|
16
|
+
transformer?: Transformer | undefined;
|
|
17
|
+
resolver?: Resolver | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* The option compatible with sass's `--load-path`. It is an array of relative or absolute paths.
|
|
20
|
+
* @example ['src/styles']
|
|
21
|
+
* @example ['/home/user/repository/src/styles']
|
|
22
|
+
*/
|
|
23
|
+
sassLoadPaths?: string[] | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* The option compatible with less's `--include-path`. It is an array of relative or absolute paths.
|
|
26
|
+
* @example ['src/styles']
|
|
27
|
+
* @example ['/home/user/repository/src/styles']
|
|
28
|
+
*/
|
|
29
|
+
lessIncludePaths?: string[] | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* The option compatible with webpack's `resolve.alias`. It is an object consisting of a pair of alias names and relative or absolute paths.
|
|
32
|
+
* @example { style: 'src/styles', '@': 'src' }
|
|
33
|
+
* @example { style: '/home/user/repository/src/styles', '@': '/home/user/repository/src' }
|
|
34
|
+
*/
|
|
35
|
+
webpackResolveAlias?: Record<string, string> | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* The option compatible with postcss's `--config`. It is a relative or absolute path.
|
|
38
|
+
* @example '.'
|
|
39
|
+
* @example 'postcss.config.js'
|
|
40
|
+
* @example '/home/user/repository/src'
|
|
41
|
+
*/
|
|
42
|
+
postcssConfig?: string | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Generate `.d.css.ts` instead of `.css.d.ts`.
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
arbitraryExtensions?: boolean | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Only generate .d.ts and .d.ts.map for changed files.
|
|
50
|
+
* @default true
|
|
51
|
+
*/
|
|
52
|
+
cache?: boolean | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Strategy for the cache to use for detecting changed files.
|
|
55
|
+
* @default 'content'
|
|
56
|
+
*/
|
|
57
|
+
cacheStrategy?: 'content' | 'metadata' | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* What level of logs to report.
|
|
60
|
+
* @default 'info'
|
|
61
|
+
*/
|
|
62
|
+
logLevel?: 'debug' | 'info' | 'silent' | undefined;
|
|
63
|
+
/** Working directory path. */
|
|
64
|
+
cwd?: string | undefined;
|
|
65
|
+
}
|
|
66
|
+
type OverrideProp<T, K extends keyof T, V extends T[K]> = Omit<T, K> & {
|
|
67
|
+
[P in K]: V;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Run typed-css-module.
|
|
71
|
+
* @param options Runner options.
|
|
72
|
+
* @returns Returns `Promise<Watcher>` if `options.watch` is `true`, `Promise<void>` if `false`.
|
|
73
|
+
*/
|
|
74
|
+
export declare function run(options: OverrideProp<RunnerOptions, 'watch', true>): Promise<Watcher>;
|
|
75
|
+
export declare function run(options: RunnerOptions): Promise<void>;
|
|
76
|
+
export {};
|