@rogrp6/fork__fork__alias-jsconfig-webpack-plugin
Version:
webpack plugin: auto convert resolve.alias to jsconfig.json or tsconfig.json
79 lines (73 loc) • 2.07 kB
JavaScript
const fs = require('fs');
const path = require('path');
const jsconfig = {
compilerOptions: {
jsx: 'react',
baseUrl: './',
paths: {
}
},
exclude: [
'node_modules',
]
}
const promisify = fn => (...args) => new Promise((resolve, reject) => {
args.push((err, data) => {
if (err) return reject(err);
resolve(data);
});
fn.apply(this, args);
});
function Test(options = {}) {
this.options = {
indentation: 4,
language: 'js',
jsx: true,
...options,
};
}
Test.prototype.apply = async function (compiler) {
const { resolve } = compiler.options;
let alias = {};
if (resolve) {
alias = resolve.alias || {};
}
const cwd = process.cwd();
const file = path.join(cwd, this.options.language === 'ts' ? 'tsconfig.json' : 'jsconfig.json');
let exsits = true;
try {
await promisify(fs.access)(file);
} catch(e) {
if (e.code === 'ENOENT') exsits = false;
}
let result;
let baseUrl = './';
if (!exsits) {
result = JSON.parse(JSON.stringify(jsconfig));
} else {
const res = await promisify(fs.readFile)(file, 'utf-8');
try {
result = JSON.parse(res);
} catch(e) {
result = JSON.parse(JSON.stringify(jsconfig));
}
result.compilerOptions = result.compilerOptions || {};
baseUrl = result.compilerOptions.baseUrl || './';
if (this.options.jsx) {
result.compilerOptions.jsx = result.compilerOptions.jsx || 'preserve';
}
result.compilerOptions.paths = {};
}
baseUrl = path.join(cwd, baseUrl);
for (let key in alias) {
const relative = path.relative(baseUrl, alias[key]);
result.compilerOptions.paths[key] = [relative];
result.compilerOptions.paths[`${key}/*`] = [`${relative}/*`];
}
try {
await promisify(fs.writeFile)(file, JSON.stringify(result, null, 4));
} catch(e) {
throw e;
}
}
module.exports = Test;