are-you-es5
Version:
A package to help you find out which of your `node_modules` aren't ES5 so you can add them to your transpilation steps.
132 lines • 5.26 kB
JavaScript
;
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const acorn = __importStar(require("acorn"));
const array_flatten_1 = __importDefault(require("array-flatten"));
const fs_1 = __importStar(require("fs"));
const path_1 = __importDefault(require("path"));
const logger_1 = require("./logger");
class ModulesChecker {
constructor(dir, config = ModulesChecker.defaultConfig) {
this.dir = dir;
this.config = config;
this.dir = path_1.default.resolve(dir);
this.config = Object.assign(Object.assign({}, ModulesChecker.defaultConfig), config);
this.logger = new logger_1.Logger(config);
}
checkModules() {
return this.parseDeps();
}
parseDeps() {
const dependencies = this.getDeps() || [];
const es5Modules = [];
const es6Modules = [];
const ignored = [];
dependencies.forEach(dependency => {
try {
const dependencyIsEs5 = this.isScriptEs5(require.resolve(dependency, { paths: [this.dir] }), dependency);
dependencyIsEs5
? es5Modules.push(dependency)
: es6Modules.push(dependency);
}
catch (err) {
ignored.push(dependency);
}
});
return { es5Modules, es6Modules, ignored };
}
getDeps() {
let deps = this.getDepsFromRootPackageJson();
if (this.config.checkAllNodeModules) {
deps.push(...this.getAllNodeModules());
}
if (this.config.ignoreBabelAndWebpackPackages) {
deps = this.dependenciesWithoutBabelAndWebpackPages(deps);
}
// convert to and from a Set to remove duplicates
return [...new Set(deps)].sort();
}
isScriptEs5(scriptPath, dependencyName) {
// TODO: Check all scripts this script requires/imports
const acornOpts = { ecmaVersion: 5 };
const code = fs_1.default.readFileSync(scriptPath, 'utf8');
try {
acorn.parse(code, acornOpts);
}
catch (err) {
this.logger.log(`❌ ${dependencyName} is not ES5`);
return false;
}
if (this.config.logEs5Packages) {
this.logger.log(`✅ ${dependencyName} is ES5`);
}
return true;
}
dependenciesWithoutBabelAndWebpackPages(dependencies) {
const ignoreRegex = /(babel|webpack)|(loader$)/;
return dependencies.filter(dep => !ignoreRegex.test(dep));
}
getDepsFromRootPackageJson() {
const packageJsonPath = path_1.default.join(this.dir, 'package.json');
const packageJson = require(packageJsonPath);
if (!packageJson) {
throw new Error(`Failed to load package.json in ${this.dir}`);
}
return Object.keys(packageJson.dependencies || {});
}
getAllNodeModules() {
const nodeModulesPath = path_1.default.join(this.dir, 'node_modules');
if (fs_1.default.existsSync(nodeModulesPath)) {
const isDirectory = (source) => fs_1.lstatSync(source).isDirectory();
const getDirectories = (source) => {
return fs_1.default
.readdirSync(source)
.map(name => path_1.default.join(source, name))
.filter(isDirectory);
};
const getLeafFolderName = (fullPath) => {
const needle = 'node_modules' + path_1.default.sep;
const indexOfLastSlash = fullPath.lastIndexOf(needle);
return fullPath.substr(indexOfLastSlash + needle.length);
};
let nodeModules = getDirectories(nodeModulesPath)
.filter(entry => {
const leafFolderName = getLeafFolderName(entry);
return !leafFolderName.startsWith('.');
})
.map(entry => {
// If this is a scope (folder starts with @), return all
// folders inside it (scoped packages)
if (/@.*$/.test(entry)) {
return getDirectories(entry);
}
else {
return entry;
}
});
// Remove path from all strings
// e.g. turn bla/bla/node_modules/@babel/core
// into @babel/core
nodeModules = array_flatten_1.default(nodeModules).map((entry) => getLeafFolderName(entry));
return nodeModules;
}
throw new Error(`Failed to find node_modules at ${this.dir}`);
}
}
exports.ModulesChecker = ModulesChecker;
ModulesChecker.defaultConfig = {
checkAllNodeModules: false,
ignoreBabelAndWebpackPackages: true,
logEs5Packages: false,
silent: false
};
//# sourceMappingURL=modules-checker.js.map