1 | "use strict";
|
2 |
|
3 | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
4 |
|
5 | var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
6 |
|
7 | const localRequire = require('../utils/localRequire');
|
8 |
|
9 | const loadPlugins = require('../utils/loadPlugins');
|
10 |
|
11 | const md5 = require('../utils/md5');
|
12 |
|
13 | const postcss = require('postcss');
|
14 |
|
15 | const FileSystemLoader = require('css-modules-loader-core/lib/file-system-loader');
|
16 |
|
17 | const semver = require('semver');
|
18 |
|
19 | const path = require('path');
|
20 |
|
21 | const fs = require('@parcel/fs');
|
22 |
|
23 | module.exports =
|
24 |
|
25 | function () {
|
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 |
|
45 | function getConfig(_x2) {
|
46 | return _getConfig.apply(this, arguments);
|
47 | }
|
48 |
|
49 | function _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 |
|
100 |
|
101 |
|
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 |
|
113 | const 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('/');
|
125 |
|
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 |