79 lines
2.2 KiB
JavaScript
79 lines
2.2 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
const path = require('path');
|
||
|
const fs = require('fs');
|
||
|
|
||
|
function findDependency(searchDir, depName) {
|
||
|
var nonPartialPath = path.resolve(searchDir, depName);
|
||
|
if (fs.existsSync(nonPartialPath)) {
|
||
|
return nonPartialPath;
|
||
|
}
|
||
|
|
||
|
var partialsPath = path.resolve(searchDir, '_' + depName);
|
||
|
if (fs.existsSync(partialsPath)) {
|
||
|
return partialsPath;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Determines the resolved dependency path according to
|
||
|
* the Sass compiler's dependency lookup behavior
|
||
|
*
|
||
|
* @param {Object} options
|
||
|
* @param {String} options.dep - the import name
|
||
|
* @param {String} options.filename - the file containing the import
|
||
|
* @param {String|Array<String>} options.directory - the location(s) of all sass files
|
||
|
* @return {String}
|
||
|
*/
|
||
|
module.exports = function({dependency: dep, filename, directory} = {}) {
|
||
|
if (typeof dep === 'undefined') {
|
||
|
throw new Error('dependency is not supplied');
|
||
|
}
|
||
|
|
||
|
if (typeof filename === 'undefined') {
|
||
|
throw new Error('filename is not supplied');
|
||
|
}
|
||
|
|
||
|
if (typeof directory === 'undefined') {
|
||
|
throw new Error('directory is not supplied');
|
||
|
}
|
||
|
|
||
|
const fileDir = path.dirname(filename);
|
||
|
|
||
|
// Use the file's extension if necessary
|
||
|
const ext = path.extname(dep) ? '' : path.extname(filename);
|
||
|
|
||
|
if (!path.isAbsolute(dep)) {
|
||
|
const sassDep = path.resolve(filename, dep) + ext;
|
||
|
|
||
|
if (fs.existsSync(sassDep)) { return sassDep; }
|
||
|
}
|
||
|
|
||
|
// path.basename in case the dep is slashed: a/b/c should be a/b/_c.scss
|
||
|
const isSlashed = dep.indexOf('/') !== -1;
|
||
|
const depDir = isSlashed ? path.dirname(dep) : '';
|
||
|
const depName = (isSlashed ? path.basename(dep) : dep) + ext;
|
||
|
|
||
|
const relativeToFile = findDependency(path.resolve(fileDir, depDir), depName);
|
||
|
if (relativeToFile) {
|
||
|
return relativeToFile;
|
||
|
}
|
||
|
|
||
|
const directories = typeof directory === 'string' ? [directory] : directory;
|
||
|
|
||
|
let i;
|
||
|
for (i in directories) {
|
||
|
const dir = directories[i];
|
||
|
const relativeToDir = findDependency(path.resolve(dir, depDir), depName);
|
||
|
if (relativeToDir) {
|
||
|
return relativeToDir;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// old versions returned a static path, if one could not be found
|
||
|
// do the same, if `directory` is not an array
|
||
|
if (typeof directory === 'string') {
|
||
|
return path.resolve(directory, depDir, depName);
|
||
|
}
|
||
|
};
|