const fs = require('fs');
|
const path = require('path');
|
|
exports.contains = function contains(arr, val) {
|
return arr && arr.indexOf(val) !== -1;
|
};
|
|
const atPrefix = new RegExp('^@', 'g');
|
exports.readDir = function readDir(dirName) {
|
if (!fs.existsSync(dirName)) {
|
return [];
|
}
|
|
try {
|
return fs
|
.readdirSync(dirName)
|
.map(function (module) {
|
if (atPrefix.test(module)) {
|
// reset regexp
|
atPrefix.lastIndex = 0;
|
try {
|
return fs
|
.readdirSync(path.join(dirName, module))
|
.map(function (scopedMod) {
|
return module + '/' + scopedMod;
|
});
|
} catch (e) {
|
return [module];
|
}
|
}
|
return module;
|
})
|
.reduce(function (prev, next) {
|
return prev.concat(next);
|
}, []);
|
} catch (e) {
|
return [];
|
}
|
};
|
|
exports.readFromPackageJson = function readFromPackageJson(options) {
|
if (typeof options !== 'object') {
|
options = {};
|
}
|
const includeInBundle = options.exclude || options.includeInBundle;
|
const excludeFromBundle = options.include || options.excludeFromBundle;
|
|
// read the file
|
let packageJson;
|
try {
|
const fileName = options.fileName || 'package.json';
|
const packageJsonString = fs.readFileSync(
|
path.resolve(process.cwd(), fileName),
|
'utf8'
|
);
|
packageJson = JSON.parse(packageJsonString);
|
} catch (e) {
|
return [];
|
}
|
// sections to search in package.json
|
let sections = [
|
'dependencies',
|
'devDependencies',
|
'peerDependencies',
|
'optionalDependencies',
|
];
|
if (excludeFromBundle) {
|
sections = [].concat(excludeFromBundle);
|
}
|
if (includeInBundle) {
|
sections = sections.filter(function (section) {
|
return [].concat(includeInBundle).indexOf(section) === -1;
|
});
|
}
|
// collect dependencies
|
const deps = {};
|
sections.forEach(function (section) {
|
Object.keys(packageJson[section] || {}).forEach(function (dep) {
|
deps[dep] = true;
|
});
|
});
|
return Object.keys(deps);
|
};
|
|
exports.containsPattern = function containsPattern(arr, val) {
|
return (
|
arr &&
|
arr.some(function (pattern) {
|
if (pattern instanceof RegExp) {
|
return pattern.test(val);
|
} else if (typeof pattern === 'function') {
|
return pattern(val);
|
} else {
|
return pattern == val;
|
}
|
})
|
);
|
};
|
|
exports.validateOptions = function (options) {
|
options = options || {};
|
const results = [];
|
const mistakes = {
|
allowlist: ['allowslist', 'whitelist', 'allow'],
|
importType: ['import', 'importype', 'importtype'],
|
modulesDir: ['moduledir', 'moduledirs'],
|
modulesFromFile: ['modulesfile'],
|
includeAbsolutePaths: ['includeAbsolutesPaths'],
|
additionalModuleDirs: ['additionalModulesDirs', 'additionalModulesDir'],
|
};
|
const optionsKeys = Object.keys(options);
|
const optionsKeysLower = optionsKeys.map(function (optionName) {
|
return optionName && optionName.toLowerCase();
|
});
|
Object.keys(mistakes).forEach(function (correctTerm) {
|
if (!options.hasOwnProperty(correctTerm)) {
|
mistakes[correctTerm]
|
.concat(correctTerm.toLowerCase())
|
.forEach(function (mistake) {
|
const ind = optionsKeysLower.indexOf(mistake.toLowerCase());
|
if (ind > -1) {
|
results.push({
|
message: `Option '${optionsKeys[ind]}' is not supported. Did you mean '${correctTerm}'?`,
|
wrongTerm: optionsKeys[ind],
|
correctTerm: correctTerm,
|
});
|
}
|
});
|
}
|
});
|
return results;
|
};
|
|
exports.log = function (message) {
|
console.log(`[webpack-node-externals] : ${message}`);
|
};
|
|
exports.error = function (errors) {
|
throw new Error(
|
errors
|
.map(function (error) {
|
return `[webpack-node-externals] : ${error}`;
|
})
|
.join('\r\n')
|
);
|
};
|