UNPKG

@lcap/builder

Version:
215 lines (214 loc) 10.1 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildNaslExtension = exports.buildNaslExtensionManifest = exports.buildNaslExtensionConfig = void 0; const fs_extra_1 = __importDefault(require("fs-extra")); const path_1 = __importDefault(require("path")); const fast_glob_1 = __importDefault(require("fast-glob")); const archiver_1 = __importDefault(require("archiver")); const utils_1 = require("../utils"); const logger_1 = __importDefault(require("../utils/logger")); const gen_nasl_extension_config_1 = __importDefault(require("./gens/gen-nasl-extension-config")); const gen_manifest_config_1 = __importDefault(require("./gens/gen-manifest-config")); const exec_1 = require("../utils/exec"); const build_theme_1 = require("./build-theme"); const build_css_info_1 = __importDefault(require("./build-css-info")); const build_declaration_1 = __importDefault(require("./build-declaration")); const build_modules_1 = require("./build-modules"); const zipDir = (basePath, fileName = 'client.zip', files = []) => new Promise((res) => { const zipPath = path_1.default.resolve(basePath, fileName); const output = fs_extra_1.default.createWriteStream(zipPath); // 将压缩包保存到当前项目的目录下,并且压缩包名为test.zip const archive = (0, archiver_1.default)('zip', { zlib: { level: 9 } }); archive.pipe(output); // eslint-disable-next-line no-plusplus for (let i = 0; i < files.length; i++) { if (fs_extra_1.default.existsSync(files[i])) { // 将被打包文件的流添加进archiver对象中 archive.append(fs_extra_1.default.createReadStream(files[i]), { name: files[i] }); } } archive.finalize(); archive.on('end', () => { res(zipPath); }); }); function getPath(filePath, pkg) { const resultPath = `packages/extension/${pkg.name}@${pkg.version}/${filePath}`; return resultPath; } function zipExtension(root, destDir, modulesOutDir) { return __awaiter(this, void 0, void 0, function* () { const filePaths = [ `${destDir}/**/*`, ]; if (modulesOutDir) { filePaths.push(`${modulesOutDir}/**/*`); } const fileList = fast_glob_1.default.sync(filePaths) .filter((item) => item.indexOf('.') !== -1) .concat(['manifest', 'source.zip']); if (fs_extra_1.default.existsSync(path_1.default.resolve(root, 'nasl.extension.d.ts'))) { fileList.push('nasl.extension.d.ts'); } fileList.push('nasl.extension.json'); const zipList = fileList; const pkg = fs_extra_1.default.readJSONSync(path_1.default.resolve(root, 'package.json')); const manifestData = { 'Plugin-Version': '1.0.0', 'Library-Type': 'Frontend', 'Metadata-File': 'nasl.extension.json', Tag: pkg.keywords.filter((v) => ['Lcap', 'library'].indexOf(v) === -1).join(','), }; fileList.forEach((filePath) => { manifestData[getPath(filePath, pkg)] = filePath; }); const filePathList = []; // eslint-disable-next-line no-restricted-syntax, guard-for-in for (const i in manifestData) { filePathList.push(`${i}: ${manifestData[i]}`); } const packName = (0, utils_1.getPackName)(pkg.name, pkg.version); const packPath = path_1.default.resolve(root, packName); const zipName = 'zip.tgz'; const zipTgzPath = path_1.default.resolve(root, zipName); if (fs_extra_1.default.existsSync(packPath)) { fs_extra_1.default.copyFileSync(packPath, zipTgzPath); filePathList.push(`${getPath(zipName, pkg)}: ${zipName}`); zipList.push(zipName); } const assets = yield (0, fast_glob_1.default)(['assets/**/*', 'src/**/screenshots/*', 'src/**/drawings/*'], { cwd: root }); assets.forEach((assetPath) => { filePathList.push(`${getPath(assetPath, pkg)}: ${assetPath}`); zipList.push(assetPath); }); fs_extra_1.default.writeFileSync(path_1.default.resolve(root, 'manifest'), filePathList.join('\n')); yield zipDir(root, `${pkg.name}@${pkg.version}.zip`, zipList); if (fs_extra_1.default.existsSync(zipTgzPath)) { fs_extra_1.default.unlinkSync(zipTgzPath); fs_extra_1.default.unlinkSync(packPath); } if (fs_extra_1.default.existsSync(path_1.default.resolve(root, 'source.zip'))) { fs_extra_1.default.unlinkSync(path_1.default.resolve(root, 'source.zip')); } }); } function getIgnores(root) { const filePath = path_1.default.resolve(root, '.gitignore'); let ignores = ['node_modules', '.lcap']; if (fs_extra_1.default.existsSync(filePath)) { ignores = fs_extra_1.default.readFileSync(filePath).toString().split('\n').filter((v) => !!v.trim() && !v.startsWith('#')); } if (!ignores.includes('node_modules')) { ignores.push('node_modules'); } if (!ignores.includes('.lcap')) { ignores.push('.lcap'); } ignores.push('.git'); return ignores; } function buildSourceZip(root) { return __awaiter(this, void 0, void 0, function* () { const pkg = fs_extra_1.default.readJSONSync(path_1.default.resolve(root, 'package.json')); const ignores = getIgnores(root); const files = yield (0, fast_glob_1.default)(['**/*'], { cwd: root, absolute: false, ignore: ignores, dot: true, }); const packageFiles = yield (0, fast_glob_1.default)('*.tgz', { cwd: root, absolute: false, dot: true, }); const pkgName = pkg.name.replace('@', '').replace('/', '-'); packageFiles.forEach((file) => { const name = path_1.default.basename(file, '.tgz'); if (name.startsWith(pkgName)) { return; } files.push(file); }); yield zipDir(root, 'source.zip', files); }); } function getDefaultFrameworkUI(root) { const pkg = fs_extra_1.default.readJSONSync(path_1.default.resolve(root, 'package.json')); if (pkg.lcap && pkg.lcap['lcap-ui'] && pkg.lcap['lcap-ui'].pkgName === '@lcap/element-ui') { return 'ElementUI'; } return undefined; } function buildNaslExtensionConfig(options) { return __awaiter(this, void 0, void 0, function* () { logger_1.default.start('开始生成 nasl.extension.json...'); const { config: naslExtensionConfig, viewComponents } = yield (0, gen_nasl_extension_config_1.default)({ assetsPublicPath: options.assetsPublicPath, rootPath: options.rootPath, framework: options.framework, i18n: options.i18n, frameworkUI: options.frameworkUI || getDefaultFrameworkUI(options.rootPath), }); const naslConfigPath = path_1.default.join(options.rootPath, 'nasl.extension.json'); fs_extra_1.default.writeJSONSync(naslConfigPath, naslExtensionConfig, { spaces: 2 }); logger_1.default.success('生成 nasl.extension.json 成功!'); return { naslExtensionConfig, viewComponents, }; }); } exports.buildNaslExtensionConfig = buildNaslExtensionConfig; function buildNaslExtensionManifest(options, hash = false) { return __awaiter(this, void 0, void 0, function* () { const naslConfigPath = path_1.default.join(options.rootPath, 'nasl.extension.json'); const naslExtensionConfig = fs_extra_1.default.readJSONSync(naslConfigPath); const manifest = yield (0, gen_manifest_config_1.default)(options); naslExtensionConfig.compilerInfoMap.manifest = JSON.stringify(manifest); // if (hash) { // const contentHash = getHashDigest(JSON.stringify(naslExtensionConfig), 'md5', 'base64', 16); // naslExtensionConfig.compilerInfoMap.debug = JSON.stringify({ hash: contentHash }); // } fs_extra_1.default.writeJSONSync(naslConfigPath, Object.assign({}, naslExtensionConfig), { spaces: 2 }); }); } exports.buildNaslExtensionManifest = buildNaslExtensionManifest; function buildNaslExtension(options, mode = 'production') { return __awaiter(this, void 0, void 0, function* () { if (options.type !== 'extension') { return; } if (mode === 'production') { yield buildSourceZip(options.rootPath); } yield buildNaslExtensionConfig(options); yield (0, build_css_info_1.default)(options); yield (0, build_theme_1.buildTheme)(options, mode); yield (0, build_declaration_1.default)(options); yield buildNaslExtensionManifest(options, mode === 'watch'); if (mode !== 'production') { return; } yield (0, build_modules_1.buildModules)(options); if (options.pnpm) { (0, exec_1.execSync)('pnpm pack'); } else { (0, exec_1.execSync)('npm pack'); } zipExtension(options.rootPath, options.destDir, options.modules && options.modules.outDir ? options.modules.outDir : 'es'); }); } exports.buildNaslExtension = buildNaslExtension;