@ainc/script
Version:
Script compiler for typescript
199 lines • 7.71 kB
JavaScript
/**
*****************************************
* Created by edonet@163.com
* Created on 2021-07-17 16:02:55
*****************************************
*/
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformScript = exports.transformTSXScript = exports.transformJSXScript = exports.transformTypeScript = exports.transformJavaScript = exports.transform = void 0;
/**
*****************************************
* 加载依赖
*****************************************
*/
const babel = require("@babel/core");
const plugin_transform_typescript_1 = require("@babel/plugin-transform-typescript");
const plugin_transform_react_jsx_1 = require("@babel/plugin-transform-react-jsx");
const plugin_transform_modules_commonjs_1 = require("@babel/plugin-transform-modules-commonjs");
const plugin_proposal_dynamic_import_1 = require("@babel/plugin-proposal-dynamic-import");
const plugin_proposal_decorators_1 = require("@babel/plugin-proposal-decorators");
const plugin_proposal_class_properties_1 = require("@babel/plugin-proposal-class-properties");
const plugin_proposal_export_namespace_from_1 = require("@babel/plugin-proposal-export-namespace-from");
const module_paths_plugin_1 = require("./helpers/module-paths-plugin");
const tsconfig_1 = require("./helpers/tsconfig");
/**
*****************************************
* 解析路径配置
*****************************************
*/
const modulePathsOptions = {
baseUrl: tsconfig_1.compilerOptions.baseUrl,
paths: tsconfig_1.compilerOptions.paths,
alias: tsconfig_1.compilerOptions.alias,
calls: [],
useRelativePath: false,
};
/**
*****************************************
* 测试环境
*****************************************
*/
if (process.env.BABEL_ENV === 'test') {
modulePathsOptions.calls.push('jest.genMockFromModule', 'jest.mock', 'jest.unmock', 'jest.doMock', 'jest.dontMock', 'jest.setMock', 'jest.requireActual', 'jest.requireMock');
}
/**
*****************************************
* 解析模块配置
*****************************************
*/
const moduleEntries = ['index.js', 'index.ts'];
const importInterop = tsconfig_1.compilerOptions.esModuleInterop ? 'babel' : 'none';
/**
*****************************************
* 是否使用懒加载
*****************************************
*/
function lazy(file) {
const isEntry = !!moduleEntries.find(name => file.endsWith(name));
// 返回匹配函数
return () => isEntry;
}
/**
*****************************************
* 默认配置
*****************************************
*/
const babelOptions = {
ast: false,
babelrc: false,
babelrcRoots: false,
configFile: false,
comments: false,
sourceMaps: 'inline',
};
/**
*****************************************
* 转换代码
*****************************************
*/
function transform(code, options) {
const result = babel.transformSync(code, options);
// 返回结果
if (result) {
return result.code || '';
}
// 返回空
return '';
}
exports.transform = transform;
/**
*****************************************
* 转码【JavaScript】
*****************************************
*/
function transformJavaScript(filename, code) {
// 过滤第三方模块
if (filename.indexOf('node_modules') > -1) {
return code;
}
// 过滤非ES6模块
if (code.indexOf('import ') === -1 && code.indexOf('export ') === -1) {
return code;
}
// 转换代码
return transform(code, {
...babelOptions,
filename,
plugins: [
[plugin_proposal_export_namespace_from_1.default],
[module_paths_plugin_1.default, modulePathsOptions],
[plugin_transform_modules_commonjs_1.default, { lazy: lazy(filename), importInterop }],
[plugin_proposal_dynamic_import_1.default],
[plugin_proposal_decorators_1.default, { legacy: true }],
[plugin_proposal_class_properties_1.default, { loose: true }],
],
});
}
exports.transformJavaScript = transformJavaScript;
/**
*****************************************
* 转码【TypeScript】
*****************************************
*/
function transformTypeScript(filename, code) {
return transform(code, {
...babelOptions,
filename,
plugins: [
[plugin_proposal_export_namespace_from_1.default],
[plugin_transform_typescript_1.default, { isTSX: true, allowDeclareFields: true }],
[module_paths_plugin_1.default, modulePathsOptions],
[plugin_transform_modules_commonjs_1.default, { lazy: lazy(filename), importInterop }],
[plugin_proposal_dynamic_import_1.default],
[plugin_proposal_decorators_1.default, { legacy: true }],
[plugin_proposal_class_properties_1.default, { loose: true }],
],
});
}
exports.transformTypeScript = transformTypeScript;
/**
*****************************************
* 转码【JSX】
*****************************************
*/
function transformJSXScript(filename, code) {
return transform(code, {
...babelOptions,
filename,
plugins: [
[plugin_proposal_export_namespace_from_1.default],
[plugin_transform_react_jsx_1.default],
[module_paths_plugin_1.default, modulePathsOptions],
[plugin_transform_modules_commonjs_1.default, { lazy: lazy(filename), importInterop }],
[plugin_proposal_dynamic_import_1.default],
[plugin_proposal_decorators_1.default, { legacy: true }],
[plugin_proposal_class_properties_1.default, { loose: true }],
],
});
}
exports.transformJSXScript = transformJSXScript;
/**
*****************************************
* 转码【TSX】
*****************************************
*/
function transformTSXScript(filename, code) {
return transform(code, {
...babelOptions,
filename,
plugins: [
[plugin_proposal_export_namespace_from_1.default],
[plugin_transform_typescript_1.default, { isTSX: true, allowDeclareFields: true }],
[plugin_transform_react_jsx_1.default],
[module_paths_plugin_1.default, modulePathsOptions],
[plugin_transform_modules_commonjs_1.default, { lazy: lazy(filename), importInterop }],
[plugin_proposal_dynamic_import_1.default],
[plugin_proposal_decorators_1.default, { legacy: true }],
[plugin_proposal_class_properties_1.default, { loose: true }],
],
});
}
exports.transformTSXScript = transformTSXScript;
/**
*****************************************
* 转码脚本
*****************************************
*/
function transformScript(filename, code, options = {}) {
const plugins = options.plugins || [];
const opts = { ...babelOptions, ...options, filename, plugins };
// 添加语法插件
plugins.unshift([plugin_proposal_export_namespace_from_1.default]);
// 添加模块解析
plugins.push([plugin_transform_typescript_1.default, { isTSX: true, allowDeclareFields: true, ...opts.typescript }], [plugin_transform_react_jsx_1.default, opts.jsx], [module_paths_plugin_1.default, { ...modulePathsOptions, ...opts.modulePaths }], [plugin_transform_modules_commonjs_1.default, { lazy: lazy(filename), importInterop }], [plugin_proposal_dynamic_import_1.default], [plugin_proposal_decorators_1.default, { legacy: true }], [plugin_proposal_class_properties_1.default, { loose: true }]);
// 执行转换
return transform(code, opts);
}
exports.transformScript = transformScript;
//# sourceMappingURL=transform.js.map