UNPKG

3.69 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
7const Asset = require('../Asset');
8
9const localRequire = require('../utils/localRequire');
10
11const _require = require('@parcel/utils'),
12 promisify = _require.promisify;
13
14const Resolver = require('../Resolver');
15
16const fs = require('@parcel/fs');
17
18const path = require('path');
19
20const parseCSSImport = require('../utils/parseCSSImport');
21
22class LESSAsset extends Asset {
23 constructor(name, options) {
24 super(name, options);
25 this.type = 'css';
26 }
27
28 parse(code) {
29 var _this = this;
30
31 return (0, _asyncToGenerator2.default)(function* () {
32 // less should be installed locally in the module that's being required
33 let less = yield localRequire('less', _this.name);
34 let render = promisify(less.render.bind(less));
35 let opts = (yield _this.getConfig(['.lessrc', '.lessrc.js'], {
36 packageKey: 'less'
37 })) || {};
38 opts.filename = _this.name;
39 opts.plugins = (opts.plugins || []).concat(urlPlugin(_this));
40
41 if (_this.options.sourceMaps) {
42 opts.sourceMap = {
43 outputSourceFiles: true
44 };
45 }
46
47 return render(code, opts);
48 })();
49 }
50
51 collectDependencies() {
52 var _iteratorNormalCompletion = true;
53 var _didIteratorError = false;
54 var _iteratorError = undefined;
55
56 try {
57 for (var _iterator = this.ast.imports[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
58 let dep = _step.value;
59 this.addDependency(dep, {
60 includedInParent: true
61 });
62 }
63 } catch (err) {
64 _didIteratorError = true;
65 _iteratorError = err;
66 } finally {
67 try {
68 if (!_iteratorNormalCompletion && _iterator.return != null) {
69 _iterator.return();
70 }
71 } finally {
72 if (_didIteratorError) {
73 throw _iteratorError;
74 }
75 }
76 }
77 }
78
79 generate() {
80 let map;
81
82 if (this.ast && this.ast.map) {
83 map = JSON.parse(this.ast.map.toString());
84 map.sources = map.sources.map(v => path.relative(this.options.rootDir, v));
85 }
86
87 return [{
88 type: 'css',
89 value: this.ast ? this.ast.css : '',
90 hasDependencies: false,
91 map
92 }];
93 }
94
95}
96
97function urlPlugin(asset) {
98 return {
99 install: (less, pluginManager) => {
100 let visitor = new less.visitors.Visitor({
101 visitUrl: node => {
102 node.value.value = asset.addURLDependency(node.value.value, node.currentFileInfo.filename);
103 return node;
104 }
105 });
106 visitor.run = visitor.visit;
107 pluginManager.addVisitor(visitor);
108 let LessFileManager = getFileManager(less, asset.options);
109 pluginManager.addFileManager(new LessFileManager());
110 }
111 };
112}
113
114function getFileManager(less, options) {
115 const resolver = new Resolver({
116 extensions: ['.css', '.less'],
117 rootDir: options.rootDir
118 });
119
120 class LessFileManager extends less.FileManager {
121 supports() {
122 return true;
123 }
124
125 supportsSync() {
126 return false;
127 }
128
129 loadFile(filename, currentDirectory) {
130 return (0, _asyncToGenerator2.default)(function* () {
131 filename = parseCSSImport(filename);
132 let resolved = yield resolver.resolve(filename, path.join(currentDirectory, 'index'));
133 return {
134 contents: yield fs.readFile(resolved.path, 'utf8'),
135 filename: resolved.path
136 };
137 })();
138 }
139
140 }
141
142 return LessFileManager;
143}
144
145module.exports = LESSAsset;
\No newline at end of file