UNPKG

5.48 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = loader;
7
8var _loaderUtils = require("loader-utils");
9
10var _postcss = _interopRequireDefault(require("postcss"));
11
12var _package = _interopRequireDefault(require("postcss/package.json"));
13
14var _schemaUtils = require("schema-utils");
15
16var _semver = require("semver");
17
18var _CssSyntaxError = _interopRequireDefault(require("./CssSyntaxError"));
19
20var _Warning = _interopRequireDefault(require("./Warning"));
21
22var _options = _interopRequireDefault(require("./options.json"));
23
24var _plugins = require("./plugins");
25
26var _utils = require("./utils");
27
28function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
30/*
31 MIT License http://www.opensource.org/licenses/mit-license.php
32 Author Tobias Koppers @sokra
33*/
34async function loader(content, map, meta) {
35 const rawOptions = (0, _loaderUtils.getOptions)(this);
36 (0, _schemaUtils.validate)(_options.default, rawOptions, {
37 name: "CSS Loader",
38 baseDataPath: "options"
39 });
40 const plugins = [];
41 const callback = this.async();
42 let options;
43
44 try {
45 options = (0, _utils.normalizeOptions)(rawOptions, this);
46 } catch (error) {
47 callback(error);
48 return;
49 }
50
51 const replacements = [];
52 const exports = [];
53
54 if ((0, _utils.shouldUseModulesPlugins)(options)) {
55 plugins.push(...(0, _utils.getModulesPlugins)(options, this));
56 }
57
58 const importPluginImports = [];
59 const importPluginApi = [];
60
61 if ((0, _utils.shouldUseImportPlugin)(options)) {
62 const resolver = this.getResolve({
63 conditionNames: ["style"],
64 extensions: [".css"],
65 mainFields: ["css", "style", "main", "..."],
66 mainFiles: ["index", "..."],
67 restrictions: [/\.css$/i]
68 });
69 plugins.push((0, _plugins.importParser)({
70 imports: importPluginImports,
71 api: importPluginApi,
72 context: this.context,
73 rootContext: this.rootContext,
74 filter: (0, _utils.getFilter)(options.import, this.resourcePath),
75 resolver,
76 urlHandler: url => (0, _loaderUtils.stringifyRequest)(this, (0, _utils.getPreRequester)(this)(options.importLoaders) + url)
77 }));
78 }
79
80 const urlPluginImports = [];
81
82 if ((0, _utils.shouldUseURLPlugin)(options)) {
83 const urlResolver = this.getResolve({
84 conditionNames: ["asset"],
85 mainFields: ["asset"],
86 mainFiles: [],
87 extensions: []
88 });
89 plugins.push((0, _plugins.urlParser)({
90 imports: urlPluginImports,
91 replacements,
92 context: this.context,
93 rootContext: this.rootContext,
94 filter: (0, _utils.getFilter)(options.url, this.resourcePath),
95 resolver: urlResolver,
96 urlHandler: url => (0, _loaderUtils.stringifyRequest)(this, url)
97 }));
98 }
99
100 const icssPluginImports = [];
101 const icssPluginApi = [];
102
103 if ((0, _utils.shouldUseIcssPlugin)(options)) {
104 const icssResolver = this.getResolve({
105 conditionNames: ["style"],
106 extensions: [],
107 mainFields: ["css", "style", "main", "..."],
108 mainFiles: ["index", "..."]
109 });
110 plugins.push((0, _plugins.icssParser)({
111 imports: icssPluginImports,
112 api: icssPluginApi,
113 replacements,
114 exports,
115 context: this.context,
116 rootContext: this.rootContext,
117 resolver: icssResolver,
118 urlHandler: url => (0, _loaderUtils.stringifyRequest)(this, (0, _utils.getPreRequester)(this)(options.importLoaders) + url)
119 }));
120 } // Reuse CSS AST (PostCSS AST e.g 'postcss-loader') to avoid reparsing
121
122
123 if (meta) {
124 const {
125 ast
126 } = meta;
127
128 if (ast && ast.type === "postcss" && (0, _semver.satisfies)(ast.version, `^${_package.default.version}`)) {
129 // eslint-disable-next-line no-param-reassign
130 content = ast.root;
131 }
132 }
133
134 const {
135 resourcePath
136 } = this;
137 let result;
138
139 try {
140 result = await (0, _postcss.default)(plugins).process(content, {
141 hideNothingWarning: true,
142 from: resourcePath,
143 to: resourcePath,
144 map: options.sourceMap ? {
145 prev: map ? (0, _utils.normalizeSourceMap)(map, resourcePath) : null,
146 inline: false,
147 annotation: false
148 } : false
149 });
150 } catch (error) {
151 if (error.file) {
152 this.addDependency(error.file);
153 }
154
155 callback(error.name === "CssSyntaxError" ? new _CssSyntaxError.default(error) : error);
156 return;
157 }
158
159 for (const warning of result.warnings()) {
160 this.emitWarning(new _Warning.default(warning));
161 }
162
163 const imports = [].concat(icssPluginImports.sort(_utils.sort)).concat(importPluginImports.sort(_utils.sort)).concat(urlPluginImports.sort(_utils.sort));
164 const api = [].concat(importPluginApi.sort(_utils.sort)).concat(icssPluginApi.sort(_utils.sort));
165
166 if (options.modules.exportOnlyLocals !== true) {
167 imports.unshift({
168 importName: "___CSS_LOADER_API_IMPORT___",
169 url: (0, _loaderUtils.stringifyRequest)(this, require.resolve("./runtime/api"))
170 });
171
172 if (options.sourceMap) {
173 imports.unshift({
174 importName: "___CSS_LOADER_API_SOURCEMAP_IMPORT___",
175 url: (0, _loaderUtils.stringifyRequest)(this, require.resolve("./runtime/cssWithMappingToString"))
176 });
177 }
178 }
179
180 const importCode = (0, _utils.getImportCode)(imports, options);
181 const moduleCode = (0, _utils.getModuleCode)(result, api, replacements, options, this);
182 const exportCode = (0, _utils.getExportCode)(exports, replacements, options);
183 callback(null, `${importCode}${moduleCode}${exportCode}`);
184}
\No newline at end of file