Skip to content

Commit 87b1ea9

Browse files
Jasper De Moordevongovett
authored andcommitted
Custom less filemanager (#1289)
1 parent d8db6ba commit 87b1ea9

5 files changed

Lines changed: 79 additions & 0 deletions

File tree

src/assets/LESSAsset.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
const Asset = require('../Asset');
22
const localRequire = require('../utils/localRequire');
33
const promisify = require('../utils/promisify');
4+
const Resolver = require('../Resolver');
5+
const syncPromise = require('../utils/syncPromise');
6+
const fs = require('../utils/fs');
7+
const path = require('path');
48

59
class LESSAsset extends Asset {
610
constructor(name, options) {
@@ -54,8 +58,39 @@ function urlPlugin(asset) {
5458

5559
visitor.run = visitor.visit;
5660
pluginManager.addVisitor(visitor);
61+
62+
let LessFileManager = getFileManager(less, asset.options);
63+
pluginManager.addFileManager(new LessFileManager());
5764
}
5865
};
5966
}
6067

68+
function getFileManager(less, options) {
69+
const resolver = new Resolver({
70+
extensions: ['.css', '.less'],
71+
rootDir: options.rootDir
72+
});
73+
74+
class LessFileManager extends less.FileManager {
75+
async resolve(filename, currentDirectory) {
76+
return (await resolver.resolve(
77+
filename,
78+
path.join(currentDirectory, 'index')
79+
)).path;
80+
}
81+
82+
async loadFile(filename, currentDirectory) {
83+
filename = await this.resolve(filename, currentDirectory);
84+
let contents = await fs.readFile(filename, 'utf8');
85+
return {contents, filename};
86+
}
87+
88+
loadFileSync(filename, currentDirectory) {
89+
return syncPromise(this.loadFile(filename, currentDirectory));
90+
}
91+
}
92+
93+
return LessFileManager;
94+
}
95+
6196
module.exports = LESSAsset;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@base: #f938ab;
2+
3+
.base {
4+
color: @base;
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
require('~/index.less');
2+
3+
module.exports = function () {
4+
return 2;
5+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@import '~/base.less';
2+
3+
.index {
4+
color: @base;
5+
}

test/less.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,35 @@ describe('less', function() {
5656
assert(css.includes('.base'));
5757
});
5858

59+
it('should support advanced less imports', async function() {
60+
let b = await bundle(
61+
__dirname + '/integration/less-advanced-import/index.js'
62+
);
63+
64+
assertBundleTree(b, {
65+
name: 'index.js',
66+
assets: ['index.js', 'index.less'],
67+
childBundles: [
68+
{
69+
type: 'map'
70+
},
71+
{
72+
name: 'index.css',
73+
assets: ['index.less'],
74+
childBundles: []
75+
}
76+
]
77+
});
78+
79+
let output = run(b);
80+
assert.equal(typeof output, 'function');
81+
assert.equal(output(), 2);
82+
83+
let css = fs.readFileSync(__dirname + '/dist/index.css', 'utf8');
84+
assert(css.includes('.index'));
85+
assert(css.includes('.base'));
86+
});
87+
5988
it('should support requiring empty less files', async function() {
6089
let b = await bundle(__dirname + '/integration/less-empty/index.js');
6190

0 commit comments

Comments
 (0)