UNPKG

4.35 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
7const localRequire = require('../utils/localRequire');
8
9const loadPlugins = require('../utils/loadPlugins');
10
11const md5 = require('../utils/md5');
12
13const postcss = require('postcss');
14
15const FileSystemLoader = require('css-modules-loader-core/lib/file-system-loader');
16
17const semver = require('semver');
18
19const path = require('path');
20
21const fs = require('@parcel/fs');
22
23module.exports =
24/*#__PURE__*/
25function () {
26 var _ref = (0, _asyncToGenerator2.default)(function* (asset) {
27 let config = yield getConfig(asset);
28
29 if (!config) {
30 return;
31 }
32
33 yield asset.parseIfNeeded();
34 let res = yield postcss(config.plugins).process(asset.getCSSAst(), config);
35 asset.ast.css = res.css;
36 asset.ast.dirty = false;
37 asset.sourceMap = res.map ? res.map.toJSON() : null;
38 });
39
40 return function (_x) {
41 return _ref.apply(this, arguments);
42 };
43}();
44
45function getConfig(_x2) {
46 return _getConfig.apply(this, arguments);
47}
48
49function _getConfig() {
50 _getConfig = (0, _asyncToGenerator2.default)(function* (asset) {
51 let config = yield asset.getConfig(['.postcssrc', '.postcssrc.json', '.postcssrc.js', 'postcss.config.js'], {
52 packageKey: 'postcss'
53 });
54 let enableModules = asset.options.rendition && asset.options.rendition.modules;
55
56 if (!config && !asset.options.minify && !enableModules) {
57 return;
58 }
59
60 config = config || {};
61
62 if (asset.options.sourceMaps) {
63 config.map = {
64 inline: false,
65 annotation: false,
66 sourcesContent: true
67 };
68 }
69
70 if (typeof config !== 'object') {
71 throw new Error('PostCSS config should be an object.');
72 }
73
74 let postcssModulesConfig = {
75 getJSON: (filename, json) => asset.cssModules = json,
76 Loader: createLoader(asset),
77 generateScopedName: (name, filename) => `_${name}_${md5(filename).substr(0, 5)}`
78 };
79
80 if (config.plugins && config.plugins['postcss-modules']) {
81 postcssModulesConfig = Object.assign(config.plugins['postcss-modules'], postcssModulesConfig);
82 delete config.plugins['postcss-modules'];
83 }
84
85 config.plugins = yield loadPlugins(config.plugins, asset.name);
86
87 if (config.modules || enableModules) {
88 let postcssModules = yield localRequire('postcss-modules', asset.name);
89 config.plugins.push(postcssModules(postcssModulesConfig));
90 }
91
92 if (asset.options.minify) {
93 let cssnano = yield localRequire('cssnano', asset.name);
94
95 let _ref3 = yield localRequire('cssnano/package.json', asset.name),
96 version = _ref3.version;
97
98 config.plugins.push(cssnano((yield asset.getConfig(['cssnano.config.js'])) || {
99 // Only enable safe css transforms if cssnano < 4
100 // See: https://github.com/parcel-bundler/parcel/issues/698
101 // See: https://github.com/ben-eb/cssnano/releases/tag/v4.0.0-rc.0
102 safe: semver.satisfies(version, '<4.0.0-rc')
103 }));
104 }
105
106 config.from = asset.name;
107 config.to = asset.name;
108 return config;
109 });
110 return _getConfig.apply(this, arguments);
111}
112
113const createLoader = asset => class ParcelFileSystemLoader extends FileSystemLoader {
114 fetch(composesPath, relativeTo) {
115 var _this = this;
116
117 return (0, _asyncToGenerator2.default)(function* () {
118 let importPath = composesPath.replace(/^["']|["']$/g, '');
119
120 const _asset$resolveDepende = asset.resolveDependency(importPath, relativeTo),
121 resolved = _asset$resolveDepende.resolved;
122
123 let rootRelativePath = path.resolve(path.dirname(relativeTo), resolved);
124 const root = path.resolve('/'); // fixes an issue on windows which is part of the css-modules-loader-core
125 // see https://github.com/css-modules/css-modules-loader-core/issues/230
126
127 if (rootRelativePath.startsWith(root)) {
128 rootRelativePath = rootRelativePath.substr(root.length);
129 }
130
131 const source = yield fs.readFile(resolved, 'utf-8');
132
133 const _ref2 = yield _this.core.load(source, rootRelativePath, undefined, _this.fetch.bind(_this)),
134 exportTokens = _ref2.exportTokens;
135
136 return exportTokens;
137 })();
138 }
139
140 get finalSource() {
141 return '';
142 }
143
144};
\No newline at end of file