Skip to content

Commit c409b4c

Browse files
committed
Add css-loader 4 support
Fixes #33 Adding duplicate tests for css-loader@3 to ensure we're backward compatible
1 parent 7a2b2e1 commit c409b4c

File tree

7 files changed

+517
-145
lines changed

7 files changed

+517
-145
lines changed

package-lock.json

Lines changed: 62 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
},
2828
"devDependencies": {
2929
"@types/jest": "^24.0.23",
30-
"css-loader": "^3.1.0",
30+
"css-loader": "*",
31+
"css-loader3": "npm:css-loader@^3.1.0",
3132
"eslint": "4.18.2",
3233
"eslint-config-prettier": "^6.0.0",
3334
"jest": "^24.9.0",

src/index.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const schema = {
3737
"Validate generated `*.d.ts` files and fail if an update is needed (useful in CI). Defaults to `false`",
3838
type: "boolean"
3939
}
40-
},
40+
},
4141
additionalProperties: false
4242
};
4343

@@ -48,7 +48,7 @@ const configuration = {
4848
};
4949

5050
/** @type {((this: import('webpack').loader.LoaderContext, ...args: any[]) => void) & {pitch?: import('webpack').loader.Loader['pitch']}} */
51-
module.exports = function(content, ...args) {
51+
module.exports = function (content, ...args) {
5252
const options = getOptions(this) || {};
5353

5454
validateOptions(schema, options, configuration);
@@ -58,9 +58,12 @@ module.exports = function(content, ...args) {
5858
}
5959

6060
// let's only check `exports.locals` for keys to avoid getting keys from the sourcemap when it's enabled
61-
const cssModuleKeys = getCssModuleKeys(
62-
content.substring(content.indexOf("exports.locals"))
63-
);
61+
// if we cannot find locals, then the module only contains global styles
62+
const indexOfLocals = content.indexOf(".locals");
63+
const cssModuleKeys =
64+
indexOfLocals === -1
65+
? []
66+
: getCssModuleKeys(content.substring(indexOfLocals));
6467

6568
/** @type {any} */
6669
const callback = this.async();

test/__snapshots__/index.test.js.snap

Lines changed: 150 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3-
exports[`default options 1`] = `
3+
exports[`css-loader@3 default options 1`] = `
44
"declare namespace ExampleCssNamespace {
55
export interface IExampleCss {
66
\\"bar-baz\\": string;
@@ -18,7 +18,7 @@ export = ExampleCssModule;
1818
"
1919
`;
2020

21-
exports[`localsConvention asIs 1`] = `
21+
exports[`css-loader@3 localsConvention asIs 1`] = `
2222
"declare namespace ExampleCssNamespace {
2323
export interface IExampleCss {
2424
\\"bar-baz\\": string;
@@ -36,7 +36,7 @@ export = ExampleCssModule;
3636
"
3737
`;
3838

39-
exports[`localsConvention camelCase 1`] = `
39+
exports[`css-loader@3 localsConvention camelCase 1`] = `
4040
"declare namespace ExampleCssNamespace {
4141
export interface IExampleCss {
4242
\\"bar-baz\\": string;
@@ -55,7 +55,7 @@ export = ExampleCssModule;
5555
"
5656
`;
5757

58-
exports[`with banner 1`] = `
58+
exports[`css-loader@3 with banner 1`] = `
5959
"// autogenerated by typings-for-css-modules-loader
6060
declare namespace ExampleCssNamespace {
6161
export interface IExampleCss {
@@ -74,7 +74,7 @@ export = ExampleCssModule;
7474
"
7575
`;
7676

77-
exports[`with locals export disabled 1`] = `
77+
exports[`css-loader@3 with locals export disabled 1`] = `
7878
"declare namespace ExampleCssNamespace {
7979
export interface IExampleCss {
8080
\\"bar-baz\\": string;
@@ -89,7 +89,7 @@ export = ExampleCssModule;
8989
"
9090
`;
9191

92-
exports[`with no formatter 1`] = `
92+
exports[`css-loader@3 with no formatter 1`] = `
9393
"declare namespace ExampleCssNamespace {
9494
export interface IExampleCss {
9595
'bar-baz': string;
@@ -106,7 +106,7 @@ declare const ExampleCssModule: ExampleCssNamespace.IExampleCss & {
106106
export = ExampleCssModule;"
107107
`;
108108

109-
exports[`with prettier 1`] = `
109+
exports[`css-loader@3 with prettier 1`] = `
110110
"declare namespace ExampleCssNamespace {
111111
export interface IExampleCss {
112112
\\"bar-baz\\": string;
@@ -124,7 +124,149 @@ export = ExampleCssModule;
124124
"
125125
`;
126126

127-
exports[`with sourcemap 1`] = `
127+
exports[`css-loader@3 with sourcemap 1`] = `
128+
"declare namespace ExampleCssNamespace {
129+
export interface IExampleCss {
130+
\\"bar-baz\\": string;
131+
composed: string;
132+
foo: string;
133+
}
134+
}
135+
136+
declare const ExampleCssModule: ExampleCssNamespace.IExampleCss & {
137+
/** WARNING: Only available when \`css-loader\` is used without \`style-loader\` or \`mini-css-extract-plugin\` */
138+
locals: ExampleCssNamespace.IExampleCss;
139+
};
140+
141+
export = ExampleCssModule;
142+
"
143+
`;
144+
145+
exports[`css-loader@latest default options 1`] = `
146+
"declare namespace ExampleCssNamespace {
147+
export interface IExampleCss {
148+
\\"bar-baz\\": string;
149+
composed: string;
150+
foo: string;
151+
}
152+
}
153+
154+
declare const ExampleCssModule: ExampleCssNamespace.IExampleCss & {
155+
/** WARNING: Only available when \`css-loader\` is used without \`style-loader\` or \`mini-css-extract-plugin\` */
156+
locals: ExampleCssNamespace.IExampleCss;
157+
};
158+
159+
export = ExampleCssModule;
160+
"
161+
`;
162+
163+
exports[`css-loader@latest localsConvention asIs 1`] = `
164+
"declare namespace ExampleCssNamespace {
165+
export interface IExampleCss {
166+
\\"bar-baz\\": string;
167+
composed: string;
168+
foo: string;
169+
}
170+
}
171+
172+
declare const ExampleCssModule: ExampleCssNamespace.IExampleCss & {
173+
/** WARNING: Only available when \`css-loader\` is used without \`style-loader\` or \`mini-css-extract-plugin\` */
174+
locals: ExampleCssNamespace.IExampleCss;
175+
};
176+
177+
export = ExampleCssModule;
178+
"
179+
`;
180+
181+
exports[`css-loader@latest localsConvention camelCase 1`] = `
182+
"declare namespace ExampleCssNamespace {
183+
export interface IExampleCss {
184+
\\"bar-baz\\": string;
185+
barBaz: string;
186+
composed: string;
187+
foo: string;
188+
}
189+
}
190+
191+
declare const ExampleCssModule: ExampleCssNamespace.IExampleCss & {
192+
/** WARNING: Only available when \`css-loader\` is used without \`style-loader\` or \`mini-css-extract-plugin\` */
193+
locals: ExampleCssNamespace.IExampleCss;
194+
};
195+
196+
export = ExampleCssModule;
197+
"
198+
`;
199+
200+
exports[`css-loader@latest with banner 1`] = `
201+
"// autogenerated by typings-for-css-modules-loader
202+
declare namespace ExampleCssNamespace {
203+
export interface IExampleCss {
204+
\\"bar-baz\\": string;
205+
composed: string;
206+
foo: string;
207+
}
208+
}
209+
210+
declare const ExampleCssModule: ExampleCssNamespace.IExampleCss & {
211+
/** WARNING: Only available when \`css-loader\` is used without \`style-loader\` or \`mini-css-extract-plugin\` */
212+
locals: ExampleCssNamespace.IExampleCss;
213+
};
214+
215+
export = ExampleCssModule;
216+
"
217+
`;
218+
219+
exports[`css-loader@latest with locals export disabled 1`] = `
220+
"declare namespace ExampleCssNamespace {
221+
export interface IExampleCss {
222+
\\"bar-baz\\": string;
223+
composed: string;
224+
foo: string;
225+
}
226+
}
227+
228+
declare const ExampleCssModule: ExampleCssNamespace.IExampleCss;
229+
230+
export = ExampleCssModule;
231+
"
232+
`;
233+
234+
exports[`css-loader@latest with no formatter 1`] = `
235+
"declare namespace ExampleCssNamespace {
236+
export interface IExampleCss {
237+
'bar-baz': string;
238+
'composed': string;
239+
'foo': string;
240+
}
241+
}
242+
243+
declare const ExampleCssModule: ExampleCssNamespace.IExampleCss & {
244+
/** WARNING: Only available when \`css-loader\` is used without \`style-loader\` or \`mini-css-extract-plugin\` */
245+
locals: ExampleCssNamespace.IExampleCss;
246+
};
247+
248+
export = ExampleCssModule;"
249+
`;
250+
251+
exports[`css-loader@latest with prettier 1`] = `
252+
"declare namespace ExampleCssNamespace {
253+
export interface IExampleCss {
254+
\\"bar-baz\\": string;
255+
composed: string;
256+
foo: string;
257+
}
258+
}
259+
260+
declare const ExampleCssModule: ExampleCssNamespace.IExampleCss & {
261+
/** WARNING: Only available when \`css-loader\` is used without \`style-loader\` or \`mini-css-extract-plugin\` */
262+
locals: ExampleCssNamespace.IExampleCss;
263+
};
264+
265+
export = ExampleCssModule;
266+
"
267+
`;
268+
269+
exports[`css-loader@latest with sourcemap 1`] = `
128270
"declare namespace ExampleCssNamespace {
129271
export interface IExampleCss {
130272
\\"bar-baz\\": string;

test/example-no-locals.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
div {
2+
background: red;
3+
}

0 commit comments

Comments
 (0)