UNPKG

underpost

Version:
202 lines (172 loc) 7.94 kB
import fs from 'fs-extra'; import { loggerFactory } from '../src/server/logger.js'; import { cap, getCapVariableName, getDirname, newInstance, uniqueArray, } from '../src/client/components/core/CommonJs.js'; import { shellCd, shellExec } from '../src/server/process.js'; import walk from 'ignore-walk'; import { validateTemplatePath } from '../src/server/conf.js'; import dotenv from 'dotenv'; const logger = loggerFactory(import.meta); dotenv.config({ path: `./engine-private/conf/dd-cron/.env.production`, override: true }); logger.info('argv', process.argv); let [exe, dir, type] = process.argv; let rawPath = process.argv[3].replaceAll(`'`, ''); let toPath = process.argv[4].replaceAll(`'`, ''); let path = `${rawPath}`.split('/'); path.pop(); path = path.join('/'); const file = `${rawPath}`.split('/').pop(); const ext = file.split('.')[1]; let name = getCapVariableName(file.split('.')[0]); logger.info('File metadata', { path, file, ext, name }); try { let content = ''; switch (type) { case 'update-template': case 'copy-src': console.log({ rawPath, toPath }); // this function returns a promise, but you can also pass a cb // if you like that approach better. let result = await new Promise((resolve) => walk( { path: rawPath, // root dir to start in. defaults to process.cwd() ignoreFiles: [`.gitignore`], // list of filenames. defaults to ['.ignore'] includeEmpty: false, // true to include empty dirs, default false follow: false, // true to follow symlink dirs, default false }, (...args) => resolve(args[1]), ), ); result = result.filter((path) => !path.startsWith('.git')); console.log('copy paths', result); if (type === 'update-template') { if (!fs.existsSync(toPath)) shellExec(`cd .. && underpost clone ${process.env.GITHUB_USERNAME}/pwa-microservices-template`); else { shellExec(`cd ${toPath} && git reset && git checkout . && git clean -f -d`); shellExec(`underpost pull ${toPath} ${process.env.GITHUB_USERNAME}/pwa-microservices-template`); shellExec(`sudo rm -rf ${toPath}/engine-private`); shellExec(`sudo rm -rf ${toPath}/logs`); } } else { fs.removeSync(toPath); } for (const copyPath of result) { if (copyPath === 'NaN') continue; const folder = getDirname(`${toPath}/${copyPath}`); const absolutePath = `${rawPath}/${copyPath}`; if (type === 'update-template' && !validateTemplatePath(absolutePath)) continue; if (!fs.existsSync(folder)) fs.mkdirSync(folder, { recursive: true }); logger.info('build', `${toPath}/${copyPath}`); fs.copyFileSync(absolutePath, `${toPath}/${copyPath}`); } if (type === 'update-template') { fs.copySync(`./.vscode`, `../pwa-microservices-template/.vscode`); // fs.copySync(`./.github`, `../pwa-microservices-template/.github`); fs.copySync(`./src/client/public/default`, `../pwa-microservices-template/src/client/public/default`); for (const checkoutPath of ['README.md', 'package-lock.json', 'package.json']) shellExec(`cd ../pwa-microservices-template && git checkout ${checkoutPath}`); for (const deletePath of [ './.github', './manifests/deployment/dd-lampp-development', './manifests/deployment/dd-cyberia-development', './manifests/deployment/dd-core-development', './manifests/deployment/dd-template-development', 'bin/web3.js', 'bin/cyberia.js', 'bin/cyberia0.js', ]) { if (fs.existsSync(deletePath)) fs.removeSync('../pwa-microservices-template/' + deletePath); } fs.mkdirSync(`../pwa-microservices-template/.github/workflows`, { recursive: true, }); for (const _path of [ `./.github/workflows/pwa-microservices-template-page.cd.yml`, `./.github/workflows/pwa-microservices-template-test.ci.yml`, `./.github/workflows/npmpkg.ci.yml`, `./.github/workflows/ghpkg.ci.yml`, `./.github/workflows/publish.ci.yml`, `./.github/workflows/release.cd.yml`, './src/ws/IoInterface.js', './src/ws/IoServer.js', ]) fs.copyFileSync(_path, `../pwa-microservices-template/${_path}`); const originPackageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8')); const templatePackageJson = JSON.parse(fs.readFileSync('../pwa-microservices-template/package.json', 'utf8')); const name = templatePackageJson.name; const description = templatePackageJson.description; const dev = templatePackageJson.scripts.dev; const build = templatePackageJson.scripts.build; templatePackageJson.dependencies = originPackageJson.dependencies; templatePackageJson.devDependencies = originPackageJson.devDependencies; templatePackageJson.version = originPackageJson.version; templatePackageJson.scripts = originPackageJson.scripts; templatePackageJson.name = name; templatePackageJson.description = description; // templatePackageJson.scripts.dev = dev; // templatePackageJson.scripts.build = build; templatePackageJson.keywords = uniqueArray( ['pwa', 'microservices', 'template', 'builder'].concat(templatePackageJson.keywords), ); delete templatePackageJson.scripts['update-template']; fs.writeFileSync( '../pwa-microservices-template/package.json', JSON.stringify(templatePackageJson, null, 4), 'utf8', ); const originPackageLockJson = JSON.parse(fs.readFileSync('./package-lock.json', 'utf8')); const templatePackageLockJson = JSON.parse( fs.readFileSync('../pwa-microservices-template/package-lock.json', 'utf8'), ); const originBasePackageLock = newInstance(templatePackageLockJson.packages['']); templatePackageLockJson.version = originPackageLockJson.version; templatePackageLockJson.packages = originPackageLockJson.packages; templatePackageLockJson.packages[''].name = originBasePackageLock.name; templatePackageLockJson.packages[''].version = originPackageLockJson.version; templatePackageLockJson.packages[''].hasInstallScript = originBasePackageLock.hasInstallScript; templatePackageLockJson.packages[''].license = originBasePackageLock.license; fs.writeFileSync( '../pwa-microservices-template/package-lock.json', JSON.stringify(templatePackageLockJson, null, 4), 'utf8', ); const badges = fs .readFileSync(`./README.md`, 'utf8') .split(`<!-- badges -->`)[1] .split(`<!-- end-badges -->`)[0]; let originMd = fs.readFileSync(`../pwa-microservices-template/README.md`, 'utf8'); originMd = originMd.split(`<!-- badges -->`)[0] + `<!-- badges -->` + badges + `<!-- end-badges -->` + originMd.split(`<!-- end-badges -->`)[1]; const splitKeyword = '## underpost ci/cd cli'; fs.writeFileSync( `../pwa-microservices-template/README.md`, originMd.split(`<!-- -->`)[0] + `<!-- --> ${splitKeyword + fs.readFileSync(`./README.md`, 'utf8').split(splitKeyword)[1]}`, 'utf8', ); } break; case 'create': const buildPath = `${path}/${name}${ext ? `.${ext}` : ''}`; logger.info('Build path', buildPath); fs.mkdirSync(path, { recursive: true }); fs.writeFileSync(buildPath, content, 'utf8'); default: logger.error('not found operator'); break; } } catch (error) { logger.error(error, error.stack); }