Skip to content
This repository was archived by the owner on Aug 7, 2021. It is now read-only.

Commit 632af4f

Browse files
author
vakrilov
committed
feat: add useForImports option
1 parent 0a3cb31 commit 632af4f

File tree

4 files changed

+66
-9
lines changed

4 files changed

+66
-9
lines changed

Diff for: css2json-loader.spec.ts

+42-3
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,59 @@ const someCSS = `
2121
`
2222

2323
describe("css2jsonLoader", () => {
24-
importTestCases.forEach((importTestCase) => {
24+
it("converts CSS to JSON", (done) => {
25+
const loaderContext = {
26+
callback: (error, source: string, map) => {
27+
expect(source).toContain(`{"type":"declaration","property":"background-color","value":"#7f9"}`);
28+
29+
done();
30+
}
31+
}
2532

33+
css2jsonLoader.call(loaderContext, someCSS);
34+
})
35+
36+
importTestCases.forEach((importTestCase) => {
2637
it(`handles: ${importTestCase}`, (done) => {
2738

2839
const loaderContext = {
2940
callback: (error, source: string, map) => {
30-
expect(source).toContain("global.registerModule(\"custom.css\", () => require(\"custom.css\"))");
41+
expect(source).toContain(`global.registerModule("custom.css", () => require("custom.css"))`);
3142
expect(source).toContain(`{"type":"declaration","property":"background-color","value":"#7f9"}`);
3243

3344
done();
34-
}
45+
},
3546
}
3647

3748
css2jsonLoader.call(loaderContext, importTestCase + someCSS);
3849
})
50+
});
51+
52+
it("inlines css2json loader in imports if option is provided", (done) => {
53+
const loaderContext = {
54+
callback: (error, source: string, map) => {
55+
expect(source).toContain(`global.registerModule("custom.css", () => require("!nativescript-dev-webpack/css2json-loader?useForImports!custom.css"))`);
56+
expect(source).toContain(`{"type":"declaration","property":"background-color","value":"#7f9"}`);
57+
58+
done();
59+
},
60+
query: { useForImports: true }
61+
}
62+
63+
css2jsonLoader.call(loaderContext, `@import url("custom.css");` + someCSS);
64+
})
65+
66+
it("registers modules for paths starting with ~", (done) => {
67+
const loaderContext = {
68+
callback: (error, source: string, map) => {
69+
expect(source).toContain(`global.registerModule("~custom.css", () => require("custom.css"))`);
70+
expect(source).toContain(`global.registerModule("custom.css", () => require("custom.css"))`);
71+
expect(source).toContain(`{"type":"declaration","property":"background-color","value":"#7f9"}`);
72+
73+
done();
74+
}
75+
}
76+
77+
css2jsonLoader.call(loaderContext, `@import url("~custom.css");` + someCSS);
3978
})
4079
});

Diff for: css2json-loader.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,32 @@
11
import { parse, Rule, SyntaxTree } from "tns-core-modules/css";
22
import { loader } from "webpack";
3+
import { getOptions } from "loader-utils";
34

45
interface ImportRule extends Rule {
56
import: string;
67
}
78

89
const betweenQuotesPattern = /('|")(.*?)\1/;
910
const unpackUrlPattern = /url\(([^\)]+)\)/;
11+
const inlineLoader = "!nativescript-dev-webpack/css2json-loader?useForImports!"
1012

1113
const loader: loader.Loader = function (content: string, map) {
14+
const options = getOptions(this) || {};
15+
const inline = !!options.useForImports;
16+
const requirePrefix = inline ? inlineLoader : "";
17+
1218
const ast = parse(content, undefined);
1319

1420
let dependencies = [];
1521
getImportRules(ast)
1622
.map(extractUrlFromRule)
1723
.map(createRequireUri)
1824
.forEach(({ uri, requireURI }) => {
19-
dependencies.push(`global.registerModule("${uri}", () => require("${requireURI}"));`);
25+
dependencies.push(`global.registerModule("${uri}", () => require("${requirePrefix}${requireURI}"));`);
2026

2127
// Call registerModule with requireURI to handle cases like @import "~@nativescript/theme/css/blue.css";
2228
if (uri !== requireURI) {
23-
dependencies.push(`global.registerModule("${requireURI}", () => require("${requireURI}"));`);
29+
dependencies.push(`global.registerModule("${requireURI}", () => require("${requirePrefix}${requireURI}"));`);
2430
}
2531
});
2632
const str = JSON.stringify(ast, (k, v) => k === "position" ? undefined : v);

Diff for: demo/AngularApp/webpack.config.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -226,14 +226,20 @@ module.exports = env => {
226226
test: /[\/|\\]app\.css$/,
227227
use: [
228228
"nativescript-dev-webpack/style-hot-loader",
229-
"nativescript-dev-webpack/css2json-loader"
229+
{
230+
loader: "nativescript-dev-webpack/css2json-loader",
231+
options: { useForImports: true }
232+
}
230233
]
231234
},
232235
{
233236
test: /[\/|\\]app\.scss$/,
234237
use: [
235238
"nativescript-dev-webpack/style-hot-loader",
236-
"nativescript-dev-webpack/css2json-loader",
239+
{
240+
loader: "nativescript-dev-webpack/css2json-loader",
241+
options: { useForImports: true }
242+
},
237243
"sass-loader"
238244
]
239245
},

Diff for: templates/webpack.angular.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -232,14 +232,20 @@ module.exports = env => {
232232
test: /[\/|\\]app\.css$/,
233233
use: [
234234
"nativescript-dev-webpack/style-hot-loader",
235-
"nativescript-dev-webpack/css2json-loader",
235+
{
236+
loader: "nativescript-dev-webpack/css2json-loader",
237+
options: { useForImports: true }
238+
}
236239
]
237240
},
238241
{
239242
test: /[\/|\\]app\.scss$/,
240243
use: [
241244
"nativescript-dev-webpack/style-hot-loader",
242-
"nativescript-dev-webpack/css2json-loader",
245+
{
246+
loader: "nativescript-dev-webpack/css2json-loader",
247+
options: { useForImports: true }
248+
},
243249
"sass-loader"
244250
]
245251
},

0 commit comments

Comments
 (0)