UNPKG

@ainc/script

Version:

Script compiler for typescript

199 lines 7.71 kB
/** ***************************************** * 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