UNPKG

build-easy

Version:
557 lines (434 loc) 16.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.applyAfterHook = applyAfterHook; exports.applyBeforeHook = applyBeforeHook; exports.applyHook = applyHook; exports.compileAlias = compileAlias; exports.compileDeclaration = compileDeclaration; exports.compileJsOrTs = compileJsOrTs; exports.compileLess = compileLess; exports.compileVueSfc = compileVueSfc; exports.enablePlumber = enablePlumber; exports.enableSourcemap = enableSourcemap; exports.enablefileCache = enablefileCache; exports.hackGetFile = hackGetFile; exports.hackSaveFile = hackSaveFile; exports.logger = logger; exports.modifySourcemap = modifySourcemap; function _compilerSfc() { const data = require("@build-easy/bundles/model/@vue/compiler-sfc"); _compilerSfc = function _compilerSfc() { return data; }; return data; } function _core() { const data = require("@build-easy/bundles/model/@babel/core"); _core = function _core() { return data; }; return data; } function _gulpTypescript() { const data = _interopRequireDefault(require("@build-easy/bundles/model/gulp-typescript")); _gulpTypescript = function _gulpTypescript() { return data; }; return data; } function _gulpSourcemaps() { const data = _interopRequireDefault(require("@build-easy/bundles/model/gulp-sourcemaps")); _gulpSourcemaps = function _gulpSourcemaps() { return data; }; return data; } function _gulpPlumber() { const data = _interopRequireDefault(require("@build-easy/bundles/model/gulp-plumber")); _gulpPlumber = function _gulpPlumber() { return data; }; return data; } function _through() { const data = _interopRequireDefault(require("@build-easy/bundles/model/through2")); _through = function _through() { return data; }; return data; } function _figures() { const data = _interopRequireDefault(require("@build-easy/bundles/model/figures")); _figures = function _figures() { return data; }; return data; } function _gulpIf() { const data = _interopRequireDefault(require("@build-easy/bundles/model/gulp-if")); _gulpIf = function _gulpIf() { return data; }; return data; } function _gulpLess() { const data = _interopRequireDefault(require("@build-easy/bundles/model/gulp-less")); _gulpLess = function _gulpLess() { return data; }; return data; } function _hashSum() { const data = _interopRequireDefault(require("@build-easy/bundles/model/hash-sum")); _hashSum = function _hashSum() { return data; }; return data; } function _chalk() { const data = _interopRequireDefault(require("@build-easy/bundles/model/chalk")); _chalk = function _chalk() { return data; }; return data; } function _vinyl() { const data = _interopRequireDefault(require("@build-easy/bundles/model/vinyl")); _vinyl = function _vinyl() { return data; }; return data; } function _path() { const data = _interopRequireDefault(require("path")); _path = function _path() { return data; }; return data; } function _fs() { const data = _interopRequireDefault(require("fs")); _fs = function _fs() { return data; }; return data; } var _getBabelConifg = _interopRequireDefault(require("./getBabelConifg")); var _alias2 = _interopRequireDefault(require("./alias")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } const empty = () => {}; const jsxIdent = '__build-easy__jsx__file__'; function logger() { return _through().default.obj((file, _, cb) => { const ext = _path().default.extname(file.path); if (!/d.ts/.test(file.path) && ext) { console.log(_chalk().default.green(_figures().default.tick), _chalk().default.green(`Success ${ext.slice(1).toUpperCase()}:`), _path().default.join(_path().default.basename(file.cwd), file.path.replace(file.cwd, ''))); } cb(null, file); }); } function isTransform(regExp, filePath) { return regExp.test(filePath) && !filePath.endsWith('.d.ts'); } function applyHook(func, args) { return typeof func === 'function' ? func(args) : _through().default.obj(); } function modifySourcemap(sourcemap) { return (0, _gulpIf().default)(file => !!sourcemap && !file.path.endsWith('.d.ts'), _gulpSourcemaps().default.write('.')); } function enablefileCache(cache) { return _through().default.obj((file, _, cb) => { var _file$contents; cache[file.path] = (_file$contents = file.contents) === null || _file$contents === void 0 ? void 0 : _file$contents.toString(); if (/\.(t|j)sx$/.test(file.basename)) { file.contents = Buffer.from(`/*${jsxIdent}*/\n${cache[file.path]}`); } cb(null, file); }); } function enableSourcemap(sourcemap) { return (0, _gulpIf().default)(() => !!sourcemap, _gulpSourcemaps().default.init()); } function enablePlumber(watch) { return (0, _gulpIf().default)(!!watch, (0, _gulpPlumber().default)(empty)); } function applyBeforeHook(hook) { return applyHook(hook, { through: _through().default, gulpIf: _gulpIf().default }); } function applyAfterHook(hook) { return applyHook(hook, { through: _through().default, gulpIf: _gulpIf().default }); } function compileLess(lessOptions) { return (0, _gulpIf().default)(file => file.path.endsWith('.less'), (0, _gulpLess().default)(lessOptions)); } function hackSaveFile() { return (0, _gulpIf().default)(file => { return isTransform(/\.tsx?$/, file.path); }, _through().default.obj(function (file, _, cb) { this.push(new (_vinyl().default)({ cwd: file.cwd, base: file.base, contents: file.contents, path: file.path + 'backup', sourceMap: file.sourceMap })); cb(null, file); })); } function hackGetFile(moduleType, output) { return _through().default.obj(function (file, _, cb) { if (isTransform(/\.tsx?backup$/, file.path)) { file.path = file.path.replace('backup', ''); return cb(null, file); } if (moduleType === 'all' && /\.d\.ts$/.test(file.path)) { file.path = _path().default.join(file.cwd, output, 'types', file.path.replace(file.base, '')); return cb(null, file); } if (moduleType === 'all' && !/\.(j|t)sx?$/.test(file.path)) { const esmFile = { path: _path().default.join(file.cwd, output, 'esm', file.path.replace(file.base, '')), base: file.base, contents: file.contents, cwd: file.cwd }; const cjsFile = { path: _path().default.join(file.cwd, output, 'cjs', file.path.replace(file.base, '')), base: file.base, contents: file.contents, cwd: file.cwd }; this.push(new (_vinyl().default)(esmFile)); this.push(new (_vinyl().default)(cjsFile)); cb(); } else { cb(null, file); } }); } function compileDeclaration(currentDirPath, cwd, tsCompilerOptions) { let tsconfigPath = _path().default.join(currentDirPath, 'tsconfig.json'); let isTsconfig = _fs().default.existsSync(tsconfigPath); if (cwd !== currentDirPath && !isTsconfig) { tsconfigPath = _path().default.join(cwd, 'tsconfig.json'); isTsconfig = _fs().default.existsSync(tsconfigPath); } const ts = isTsconfig ? _gulpTypescript().default.createProject(tsconfigPath, _objectSpread(_objectSpread({}, tsCompilerOptions), {}, { declaration: true, emitDeclarationOnly: true, moduleResolution: 'node' })) : () => _through().default.obj((file, _, cb) => { cb(null, file); }); // typescript may not be installed return (0, _gulpIf().default)(file => { return isTransform(/\.tsx?$/, file.path) && isTsconfig; }, ts({ error: err => { console.log(`${_chalk().default.red('➜ [Error]: ')}${err.message}`); } })); // No files are output except d.ts } function compileAlias(alias) { return _through().default.obj((file, _, cb) => { const _alias = _objectSpread({}, alias); if (Object.keys(_alias).length) { const dirname = _path().default.dirname(file.path); const ext = _path().default.extname(file.relative); file.contents = Buffer.from((0, _alias2.default)({ ext, contents: file.contents.toString(), dirname, aliasMap: _alias })); } cb(null, file); }); } function compileVueSfc(injectCss) { const EXT_REGEXP = /\.\w+$/; const RENDER_FN = '__vue_render__'; const VUEIDS = '__vue_sfc__'; const EXPORT = 'export default'; function trim(code) { return code.replace(/\/\/\n/g, '').trim(); } function injectRender(render) { return render.replace('export function render', `function ${RENDER_FN}`); } function injectScopeId(scopeId) { return `\n${VUEIDS}.__scopeId = '${scopeId}'`; } function getSfcStylePath(filePath, ext, index) { const number = index !== 0 ? `-${index}` : ''; return filePath.replace(EXT_REGEXP, `${number}.${ext}`); } function injectStyle(styles, filePath) { const imports = styles.reduce((code, _, index) => code + `import './${_path().default.basename(getSfcStylePath(filePath, 'css', index))}';\n`, ''); return imports; } function transform(file, _, cb) { const content = file.contents.toString(); const _parse = (0, _compilerSfc().parse)(content, { filename: file.path }), descriptor = _parse.descriptor; const template = descriptor.template, styles = descriptor.styles, script = descriptor.script, filename = descriptor.filename, scriptSetup = descriptor.scriptSetup; const hasScoped = styles.some(s => s.scoped); const scopeId = hasScoped ? `data-v-${(0, _hashSum().default)(content)}` : null; if (script || scriptSetup) { var _script$lang; const lang = (_script$lang = script === null || script === void 0 ? void 0 : script.lang) !== null && _script$lang !== void 0 ? _script$lang : 'js'; const scriptFilePath = file.path.replace(EXT_REGEXP, `.${lang}`); let makeScript = injectCss ? injectStyle(styles, file.path) : ''; if (script) { if (template) { const render = (0, _compilerSfc().compileTemplate)({ id: scopeId !== null && scopeId !== void 0 ? scopeId : filename, source: template.content, filename: file.path }).code; makeScript += injectRender(render); } makeScript += script.content; makeScript += template ? `${VUEIDS}.render = ${RENDER_FN}\n` : ''; } if (scriptSetup) { makeScript += (0, _compilerSfc().compileScript)(descriptor, { id: scopeId !== null && scopeId !== void 0 ? scopeId : filename, refTransform: true, inlineTemplate: true }).content; } makeScript = makeScript.replace(EXPORT, `const ${VUEIDS} =`); if (scopeId) { makeScript += injectScopeId(scopeId); } makeScript += `\n${VUEIDS}.__file = '${_path().default.basename(filename)}'\n${EXPORT} ${VUEIDS}`; this.push(new (_vinyl().default)({ path: scriptFilePath, contents: Buffer.from(makeScript), cwd: file.cwd, base: file.base })); } if (styles) { styles.forEach((style, index) => { var _style$lang; const cssFilePath = getSfcStylePath(file.path, (_style$lang = style.lang) !== null && _style$lang !== void 0 ? _style$lang : 'css', index); let styleSource = trim(style.content); if (style.scoped) { styleSource = (0, _compilerSfc().compileStyle)({ id: scopeId, scoped: true, source: styleSource, filename: cssFilePath }).code; } this.push(new (_vinyl().default)({ path: cssFilePath, contents: Buffer.from(styleSource), cwd: file.cwd, base: file.base })); }); } cb(); } return (0, _gulpIf().default)(file => isTransform(/\.vue$/, file.path), _through().default.obj(transform)); } function compileJsOrTs(config, currentEntryDirPath) { return (0, _gulpIf().default)(file => isTransform(/\.(t|j)sx?$/, file.path), _through().default.obj(function (file, _, cb) { var _babelFileResult$code; const sourcemap = config.sourcemap, target = config.target, nodeFiles = config.nodeFiles, browserFiles = config.browserFiles, moduleType = config.moduleType, output = config.output; const vinylSourcemapsApply = require('@build-easy/bundles/model/vinyl-sourcemaps-apply'); let isBrowser = target === 'browser'; const ident = new RegExp(`/*${jsxIdent}*/`); if (/\.(t|j)sx$/.test(file.path) || ident.test(file.contents.toString())) { isBrowser = true; } else { const currentFilePath = _path().default.relative(currentEntryDirPath, file.path); if (isBrowser && nodeFiles && nodeFiles.includes(currentFilePath)) { isBrowser = false; } if (!isBrowser && browserFiles && browserFiles.includes(currentFilePath)) { isBrowser = true; } } const replaceExtname = file => file.replace(_path().default.extname(file), '.js'); if (moduleType === 'all') { var _babelFileResultCjs$c, _babelFileResultEsm$c; const babelConfigCjs = (0, _getBabelConifg.default)(config, isBrowser, 'cjs'); const babelFileResultCjs = (0, _core().transformSync)(file.contents, _objectSpread(_objectSpread({}, babelConfigCjs), {}, { filename: file.path, configFile: false, sourceMaps: sourcemap })); if (file.sourceMap && sourcemap) { if (!babelFileResultCjs.map.file) { babelFileResultCjs.map.file = file.sourceMap.file; } vinylSourcemapsApply(file, babelFileResultCjs.map); } this.push(new (_vinyl().default)({ contents: Buffer.from((_babelFileResultCjs$c = babelFileResultCjs.code) !== null && _babelFileResultCjs$c !== void 0 ? _babelFileResultCjs$c : ''), cwd: file.cwd, base: file.base, path: _path().default.join(file.cwd, output, 'cjs', replaceExtname(file.path.replace(file.base, ''))) })); const babelConfigEsm = (0, _getBabelConifg.default)(config, isBrowser, 'esm'); const babelFileResultEsm = (0, _core().transformSync)(file.contents, _objectSpread(_objectSpread({}, babelConfigEsm), {}, { filename: file.path, configFile: false, sourceMaps: sourcemap })); if (file.sourceMap && sourcemap) { if (!babelFileResultEsm.map.file) { babelFileResultEsm.map.file = file.sourceMap.file; } vinylSourcemapsApply(file, babelFileResultEsm.map); } this.push(new (_vinyl().default)({ contents: Buffer.from((_babelFileResultEsm$c = babelFileResultEsm.code) !== null && _babelFileResultEsm$c !== void 0 ? _babelFileResultEsm$c : ''), cwd: file.cwd, base: file.base, path: _path().default.join(file.cwd, output, 'esm', replaceExtname(file.path.replace(file.base, ''))) })); return cb(); } const babelConfig = (0, _getBabelConifg.default)(config, isBrowser, moduleType); const babelFileResult = (0, _core().transformSync)(file.contents, _objectSpread(_objectSpread({}, babelConfig), {}, { filename: file.path, configFile: false, sourceMaps: sourcemap })); file.contents = Buffer.from((_babelFileResult$code = babelFileResult.code) !== null && _babelFileResult$code !== void 0 ? _babelFileResult$code : ''); if (file.sourceMap && sourcemap) { if (!babelFileResult.map.file) { babelFileResult.map.file = file.sourceMap.file; } vinylSourcemapsApply(file, babelFileResult.map); } file.path = replaceExtname(file.path); cb(null, file); })); }