@lcap/builder
Version:
lcap builder utils
215 lines (214 loc) • 10.1 kB
JavaScript
;
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;