From 6d271efc048afe11be70b83b457f7dff0979b598 Mon Sep 17 00:00:00 2001 From: Belinda Cao Date: Mon, 23 Sep 2024 15:01:49 +0800 Subject: [PATCH] feat: refactor codesmith logger (#154) * feat: refactor logger printing timing * feat: use debug package to logger * feat: format debug info * feat: format warn info * feat: format error logger * fix: detail * feat: support time option * docs: changeset * fix: typo * fix: lint error * fix: log * feat: add icon * feat: time log --- .changeset/khaki-readers-fix.md | 14 ++++ packages/api/app/src/index.ts | 60 ++++++++------ packages/api/app/src/utils/checkUseNvm.ts | 2 +- packages/api/ejs/src/index.ts | 2 +- packages/api/fs/src/index.ts | 2 +- packages/api/git/src/index.ts | 6 +- packages/api/handlebars/src/index.ts | 2 +- packages/api/json/src/index.ts | 6 +- packages/cli/src/actions/genAction.ts | 19 +++-- packages/cli/src/index.ts | 1 + packages/core/package.json | 4 +- packages/core/src/codesmith/index.ts | 24 ++++-- packages/core/src/generator/index.ts | 46 +++++------ packages/core/src/index.ts | 2 +- packages/core/src/logger/constants.ts | 11 --- packages/core/src/logger/index.ts | 75 +++++++++-------- packages/core/src/utils/downloadPackage.ts | 4 +- pnpm-lock.yaml | 96 +++++++++++++++------- 18 files changed, 223 insertions(+), 153 deletions(-) create mode 100644 .changeset/khaki-readers-fix.md diff --git a/.changeset/khaki-readers-fix.md b/.changeset/khaki-readers-fix.md new file mode 100644 index 00000000..f7522b75 --- /dev/null +++ b/.changeset/khaki-readers-fix.md @@ -0,0 +1,14 @@ +--- +"@modern-js/codesmith-api-handlebars": minor +"@modern-js/codesmith-api-json": minor +"@modern-js/codesmith-api-app": minor +"@modern-js/codesmith-api-ejs": minor +"@modern-js/codesmith-api-git": minor +"@modern-js/codesmith-api-fs": minor +"@modern-js/codesmith": minor +"@modern-js/codesmith-cli": minor +--- + +feat: refactor codesmith logger + +feat: 重构 codesmith 日志模块 diff --git a/packages/api/app/src/index.ts b/packages/api/app/src/index.ts index bd5d89fa..473228a1 100644 --- a/packages/api/app/src/index.ts +++ b/packages/api/app/src/index.ts @@ -53,9 +53,9 @@ export class AppAPI { } public async checkEnvironment(nodeVersion?: string) { - if (semver.lt(process.versions.node, nodeVersion || '12.22.12')) { + if (semver.lt(process.versions.node, nodeVersion || '16.20.2')) { this.generatorCore.logger.warn( - i18n.t(localeKeys.environment.node_version), + `🟡 ${i18n.t(localeKeys.environment.node_version)}`, ); return false; } @@ -64,9 +64,11 @@ export class AppAPI { !(await canUsePnpm()) && !(await canUseNpm()) ) { - this.generatorCore.logger.debug("can't use yarn or pnpm or npm"); + this.generatorCore.logger.debug( + "🧐 [Check Environment] Can't use yarn or pnpm or npm", + ); this.generatorCore.logger.warn( - i18n.t(localeKeys.environment.yarn_pnpm_npm), + `🟡 ${i18n.t(localeKeys.environment.yarn_pnpm_npm)}`, ); return false; } @@ -118,9 +120,9 @@ export class AppAPI { } catch (e) { this.generatorCore.logger.warn(e); this.generatorCore.logger.warn( - i18n.t(localeKeys.install.failed, { + `🟡 ${i18n.t(localeKeys.install.failed, { command: command || `${packageManager} install`, - }), + })}`, ); } } @@ -149,9 +151,9 @@ export class AppAPI { await this.runInstall(); } } catch (e) { - this.generatorCore.logger.debug('Dependencies install failed', e); + this.generatorCore.logger.debug('❗️ [Run Install Failed]:', e); this.generatorCore.logger.warn( - i18n.t(localeKeys.install.failed_no_command), + `🟡 ${i18n.t(localeKeys.install.failed_no_command)}`, ); } @@ -161,8 +163,8 @@ export class AppAPI { this.generatorCore.logger.info(i18n.t(localeKeys.git.success)); } } catch (e) { - this.generatorCore.logger.debug('Git repository create failed', e); - this.generatorCore.logger.warn(i18n.t(localeKeys.git.failed)); + this.generatorCore.logger.debug('❗️ [Git Add and Commit Failed]:', e); + this.generatorCore.logger.warn(`🟡 ${i18n.t(localeKeys.git.failed)}`); } } @@ -174,7 +176,7 @@ export class AppAPI { type: 'handlebars' | 'ejs' = 'handlebars', ) { try { - this.generatorCore.logger?.timing?.('forgeTemplate'); + this.generatorCore.logger?.timing?.('🕒 ForgeTemplate'); const { material } = this.generatorContext.current!; const resourceMap = await material.find(templatePattern, { nodir: true, @@ -187,7 +189,7 @@ export class AppAPI { .filter(resourceKey => (filter ? filter(resourceKey) : true)) .map(async resourceKey => { this.generatorCore.logger.debug( - `[renderDir] resourceKey=${resourceKey}`, + `💡 [Forge Template]: resourceKey=${resourceKey}`, ); const target = rename ? rename(resourceKey) @@ -203,11 +205,13 @@ export class AppAPI { ); } } catch (e) { - this.generatorCore.logger.debug('base forging failed:', e); - this.generatorCore.logger.warn(i18n.t(localeKeys.templated.failed)); - throw new Error('base forging failed'); + this.generatorCore.logger.debug('❗️ [Forge Template Failed]:', e); + this.generatorCore.logger.warn( + `🟡 ${i18n.t(localeKeys.templated.failed)}`, + ); + throw new Error('Forge Template Failed'); } finally { - this.generatorCore.logger?.timing?.('forgeTemplate', true); + this.generatorCore.logger?.timing?.('🕒 ForgeTemplate', true); } } @@ -218,7 +222,7 @@ export class AppAPI { parameters?: Record, ) { try { - this.generatorCore.logger?.timing?.('renderTemplateByFileType'); + this.generatorCore.logger?.timing?.('🕒 RenderTemplateByFileType'); const { material } = this.generatorContext.current!; const resourceMap = await material.find(templatePattern, { nodir: true, @@ -230,7 +234,7 @@ export class AppAPI { .filter(resourceKey => (filter ? filter(resourceKey) : true)) .map(async resourceKey => { this.generatorCore.logger.debug( - `[renderDir] resourceKey=${resourceKey}`, + `💡 [Forge Template by Type]: resourceKey=${resourceKey}`, ); if (resourceKey.includes('.handlebars')) { const target = rename @@ -268,11 +272,13 @@ export class AppAPI { ); } } catch (e) { - this.generatorCore.logger.debug('base forging failed:', e); - this.generatorCore.logger.warn(i18n.t(localeKeys.templated.failed)); - throw new Error('base forging failed'); + this.generatorCore.logger.debug('❗️ [Forge Template by Type Failed]:', e); + this.generatorCore.logger.warn( + `🟡 ${i18n.t(localeKeys.templated.failed)}`, + ); + throw new Error('Forge Template by Type Failed'); } finally { - this.generatorCore.logger?.timing?.('renderTemplateByFileType', true); + this.generatorCore.logger?.timing?.('🕒 RenderTemplateByFileType', true); } } @@ -317,8 +323,14 @@ export class AppAPI { config, ); } catch (e) { - this.generatorCore.logger.warn(i18n.t(localeKeys.generator.failed)); - this.generatorCore.logger.debug(i18n.t(localeKeys.generator.failed), e); + this.generatorCore.logger.warn( + `🟡 ${i18n.t(localeKeys.generator.failed)}`, + ); + this.generatorCore.logger.debug( + '❗️ [Runtime sub Generator Failed]:', + subGenerator, + e, + ); throw new Error('run sub generator failed'); } } diff --git a/packages/api/app/src/utils/checkUseNvm.ts b/packages/api/app/src/utils/checkUseNvm.ts index ec50296e..dcdae556 100644 --- a/packages/api/app/src/utils/checkUseNvm.ts +++ b/packages/api/app/src/utils/checkUseNvm.ts @@ -41,7 +41,7 @@ export async function checkUseNvm(cwd: string, logger: ILogger) { // check nvm exist if (!(await canUseNvm())) { logger.warn( - `current node version is not expect, you should install ${expectNodeVersion}`, + `🟡 [Check nvm Error]: Current node version is not expect, you should install ${expectNodeVersion}`, ); return false; } diff --git a/packages/api/ejs/src/index.ts b/packages/api/ejs/src/index.ts index 5bab38d3..0717998e 100644 --- a/packages/api/ejs/src/index.ts +++ b/packages/api/ejs/src/index.ts @@ -61,7 +61,7 @@ export class EjsAPI { // resourceKey is relate path. example: in `garr-master/package.json`, package.json is resourceKey Object.keys(resourceMap).map(async resourceKey => { this.generatorCore.logger.debug( - `[renderDir] resourceKey=${resourceKey}`, + `💡 [EJS Render Template Dir]: resourceKey=${resourceKey}`, ); await this.renderTemplate( material.get(resourceKey), diff --git a/packages/api/fs/src/index.ts b/packages/api/fs/src/index.ts index dfc06228..c9a20b09 100644 --- a/packages/api/fs/src/index.ts +++ b/packages/api/fs/src/index.ts @@ -47,7 +47,7 @@ export class FsAPI { await Promise.all( Object.keys(resourceMap).map(async resourceKey => { this.generatorCore.logger.debug( - `[renderDir] resourceKey=${resourceKey}`, + `💡 [FS Render Dir]: resourceKey=${resourceKey}`, ); await this.renderFile(material.get(resourceKey), target(resourceKey)); }), diff --git a/packages/api/git/src/index.ts b/packages/api/git/src/index.ts index a417afcd..3cf721cd 100644 --- a/packages/api/git/src/index.ts +++ b/packages/api/git/src/index.ts @@ -35,7 +35,7 @@ export class GitAPI { } const alreadyInit = await this.isInGitRepo(cwd); if (alreadyInit && !force) { - this.generatorCore.logger.debug('already in a git repo, skip init'); + this.generatorCore.logger.debug('❗️ [Git Init]: Already init, Skip'); return; } try { @@ -44,7 +44,7 @@ export class GitAPI { } = this.generatorContext || { config: { defaultBranch: 'master' } }; await initGitRepo(cwd, defaultBranch); } catch (e) { - this.generatorCore.logger.debug('[GitAPI.error]:', e); + this.generatorCore.logger.debug('❗️ [Git Init Error]:', e); throw e; } } @@ -61,7 +61,7 @@ export class GitAPI { await gitAdd(cwd); await gitCommit(cwd, commitMessage); } catch (e) { - this.generatorCore.logger.debug('[GitAPI.error]:', e); + this.generatorCore.logger.debug('❗️ [Git Add and Commit Error]:', e); throw e; } } diff --git a/packages/api/handlebars/src/index.ts b/packages/api/handlebars/src/index.ts index 4fd3c245..2c0945be 100644 --- a/packages/api/handlebars/src/index.ts +++ b/packages/api/handlebars/src/index.ts @@ -90,7 +90,7 @@ export class HandlebarsAPI { // resourceKey is relate path. example: in `garr-master/package.json`, package.json is resourceKey Object.keys(resourceMap).map(async resourceKey => { this.generatorCore.logger.debug( - `[renderDir] resourceKey=${resourceKey}`, + `💡 [Handlebars Render Template Dir]: resourceKey=${resourceKey}`, ); await this.renderTemplate( material.get(resourceKey), diff --git a/packages/api/json/src/index.ts b/packages/api/json/src/index.ts index 35ffd0a2..fd285581 100644 --- a/packages/api/json/src/index.ts +++ b/packages/api/json/src/index.ts @@ -16,7 +16,7 @@ export class JsonAPI { const origin = commentJSON.parse(originJsonValue.content as string); return origin; } catch (e) { - this.generatorCore.logger.debug('[JSON API] parse json error:', e); + this.generatorCore.logger.debug('❗️ [JSON Get Parse Error]:', e); throw new Error('resource content is not a legal json'); } } @@ -37,7 +37,7 @@ export class JsonAPI { (endWithNewLine ? '\n' : '') ); } catch (e) { - this.generatorCore.logger.debug('[JSON API] parse json error:', e); + this.generatorCore.logger.debug('❗️ [JSON Extend Parse Error]:', e); throw new Error('resource content is not a legal json'); } }); @@ -58,7 +58,7 @@ export class JsonAPI { (endWithNewLine ? '\n' : ''), ); } catch (e) { - this.generatorCore.logger.debug('[JSON API] parse json error:', e); + this.generatorCore.logger.debug('❗️ [JSON Update Parse Error]:', e); throw new Error('resource content is not a legal json'); } }); diff --git a/packages/cli/src/actions/genAction.ts b/packages/cli/src/actions/genAction.ts index 048a7724..cf6d3a20 100644 --- a/packages/cli/src/actions/genAction.ts +++ b/packages/cli/src/actions/genAction.ts @@ -4,31 +4,34 @@ import { getLocalLanguage } from '../utils'; interface LocalOptions { debug?: boolean; + time?: boolean; config: string; registry?: string; pwd?: string; } export async function genAction(generator: string, genOptions: LocalOptions) { - const { debug, config, registry, pwd } = genOptions; + const { debug, time, config, registry, pwd } = genOptions; const smith = new CodeSmith({ debug, + time, registryUrl: registry, }); - smith.logger.debug('generator', generator); - smith.logger.debug('genOptions.debug', debug); - smith.logger.debug('genOptions.pwd', pwd); - smith.logger.debug('genOptions.config', config); + smith.logger.debug('💡 [Runtime Gen Action]'); + smith.logger.debug('💡 [Generator Name]:', generator); + smith.logger.debug('💡 [Generator Pwd]:', pwd); + smith.logger.debug('💡 [Generator Debug]:', debug); + smith.logger.debug('💡 [Generator Options]:', config); let runPwd = process.cwd(); if (pwd) { if (path.isAbsolute(pwd)) { runPwd = pwd; - smith.logger.debug('genOptions.pwd is absolute path', pwd); + smith.logger.debug('💡 [PWD is Absolute Path]:', pwd); } else { runPwd = path.join(process.cwd(), pwd); - smith.logger.debug('genOptions.pwd is relative path', pwd); + smith.logger.debug('💡 [PWD is Relative Path]:', pwd); } } @@ -36,7 +39,7 @@ export async function genAction(generator: string, genOptions: LocalOptions) { try { targetConfig = JSON.parse(config); } catch (e) { - smith.logger.error('Bad json for config: ', genOptions.config); + smith.logger.error('🔴 [Config Parse Error]:', e); return; } diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 2c417d95..a0ba906f 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -8,6 +8,7 @@ export default function () { .command('gen ', { isDefault: true }) .description('use csmith to generator something') .option('-d,--debug', 'using debug mode to log something', false) + .option('--time', 'show time logger', false) .option('-p,--pwd ', 'process working directory', process.cwd()) .option('--config ', 'config for this generator(json string)', '{}') .option( diff --git a/packages/core/package.json b/packages/core/package.json index 36f0f697..5ebe0d29 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -32,7 +32,8 @@ "@swc/helpers": "0.5.1", "@modern-js/utils": "^2.58.0", "axios": "^1.6.0", - "tar": "^6.1.13" + "tar": "^6.1.13", + "debug": "4.3.7" }, "devDependencies": { "@modern-js/module-tools": "^2.58.0", @@ -40,6 +41,7 @@ "@types/jest": "^26.0.24", "@types/node": "^14.18.42", "@types/tar": "^4.0.5", + "@types/debug": "^4.1.12", "typescript": "^4.9.5" }, "sideEffects": false diff --git a/packages/core/src/codesmith/index.ts b/packages/core/src/codesmith/index.ts index e8f9ea35..98c70f76 100644 --- a/packages/core/src/codesmith/index.ts +++ b/packages/core/src/codesmith/index.ts @@ -8,9 +8,11 @@ import type { ForgeOptions, ForgeTask } from './constants'; interface ICreateOptions { debug?: boolean; + time?: boolean; logger?: Logger; // custom npm registry registryUrl?: string; + namespace?: string; } export class CodeSmith { @@ -23,15 +25,23 @@ export class CodeSmith { logger: Logger; - constructor({ debug, logger, registryUrl }: ICreateOptions) { + constructor({ debug, time, logger, registryUrl, namespace }: ICreateOptions) { this.debug = debug || false; this.logger = - logger || new Logger(debug ? LoggerLevel.Debug : LoggerLevel.Info); + logger || + new Logger( + debug + ? LoggerLevel.Debug + : time + ? LoggerLevel.Timing + : LoggerLevel.Info, + namespace, + ); this.materialsManager = new MaterialsManager(this.logger, registryUrl); } public async forge({ tasks, pwd }: ForgeOptions) { - this.logger?.timing?.('CodeSmith all tasks'); + this.logger?.timing?.('🕒 Codesmith Task'); this.core = new GeneratorCore({ logger: this.logger, materialsManager: this.materialsManager, @@ -46,10 +56,10 @@ export class CodeSmith { await this.runTask(task); } } catch (e: unknown) { - this.logger.error('run task error:', e); + this.logger.error('🔴 [Run Forge Generator Error]:', e); throw new Error('run task error'); } finally { - this.logger?.timing?.('CodeSmith all tasks', true); + this.logger?.timing?.('🕒 Codesmith Task', true); } } @@ -58,8 +68,8 @@ export class CodeSmith { throw new Error("no core in 'runTask'"); } const { generator, config } = task; - this.logger?.timing?.(`runTask ${generator}`); + this.logger?.timing?.(`🕒 RunTask ${generator}`); await this.core.runGenerator(generator, config); - this.logger?.timing?.(`runTask ${generator}`, true); + this.logger?.timing?.(`🕒 RunTask ${generator}`, true); } } diff --git a/packages/core/src/generator/index.ts b/packages/core/src/generator/index.ts index 16387e8d..c14e6bdc 100644 --- a/packages/core/src/generator/index.ts +++ b/packages/core/src/generator/index.ts @@ -86,9 +86,7 @@ export class GeneratorCore { } private async loadLocalGenerator(generator: string) { - this.logger.debug( - '[runGenerator] generator is absolute, using local generator', - ); + this.logger.debug('⏳ [Load Local Generator]:', generator); let generatorPkg: FsMaterial; let pkgJson: Record; try { @@ -96,17 +94,16 @@ export class GeneratorCore { generatorPkg = await this.materialsManager.loadLocalGenerator(generatorDir); } catch (e) { - this.logger.debug('load local generator failed:', e); + this.logger.debug('❗️[Load Local Generator Error]:', e); return { generatorPkg: null }; } // check package.json file exist try { pkgJson = nodeRequire(generatorPkg.get('package.json').filePath); } catch (e) { - this.logger.debug('nodeRequire fail:', e); - this.logger.error('can not require package.json'); + this.logger.error(`🔴 [Load Generator ${generator} Error]:`, e); this.logger.warn( - `generator need a package.json in top directory + `🟡 [Load Local Generator Error]: generator need a \`package.json\` in top directory check path: ${chalk.blue.underline( generator, )} exist a package.json file or not`, @@ -115,9 +112,11 @@ check path: ${chalk.blue.underline( generatorPkg: null, }; } - this.logger.debug(`[runGenerator] generator version is ${pkgJson.version}`); + this.logger.debug( + '⌛ [Load Local Generator Success]:', + `v${pkgJson.version}`, + ); const materialKey = `${pkgJson.name}@local`; - this.logger.debug(`[runGenerator] loaded local generator, ${generator}`); return { generatorPkg, pkgJson, @@ -126,18 +125,20 @@ check path: ${chalk.blue.underline( } private async loadRemoteGenerator(generator: string) { - this.logger.debug('[runGenerator] task.generator is remote package'); + this.logger.debug('💡 [Load Remote Generator]:', generator); try { const generatorPkg = await this.materialsManager.loadRemoteGenerator(generator); const pkgJson = nodeRequire(generatorPkg.get('package.json').filePath); const materialKey = `${pkgJson.name}@${pkgJson.version}`; this.logger.debug( - `[runTask] loaded remote generator, ${pkgJson.name}@${pkgJson.version}`, + '🌟 [Load Remote Generator Success]:', + generator, + pkgJson.version, ); return { generatorPkg, pkgJson, materialKey }; } catch (e) { - this.logger.error(`load remote generator ${generator} failed:`, e); + this.logger.error(`❗️ [Load Generator ${generator} Error]:`, e); return { generatorPkg: null }; } } @@ -175,7 +176,7 @@ check path: ${chalk.blue.underline( } async loadGenerator(generator: string) { - this.logger?.timing?.(`loadGenerator ${generator}`); + this.logger?.timing?.(`🕒 LoadGenerator ${generator}`); let generatorPath = generator; if (generator.startsWith('file:')) { generatorPath = path.join(this.basePath, generator.slice(5)); @@ -187,13 +188,13 @@ check path: ${chalk.blue.underline( if (!generatorPkg || !pkgJson || !materialKey) { return {}; } - this.logger.debug('[runGenerator] task.generator loaded'); - this.logger?.timing?.(`loadGenerator ${generator}`, true); + this.logger.debug('💡 [runGenerator] task.generator loaded'); + this.logger?.timing?.(`🕒 LoadGenerator ${generator}`, true); const generatorScript = nodeRequire(generatorPkg.basePath); if (typeof generatorScript !== 'function') { this.logger.debug( - `generator module [${pkgJson.name}] export default is not a function`, + `❗️ [Generator Error]: generator module [${pkgJson.name}] export default is not a function`, generatorScript, ); throw new Error( @@ -208,9 +209,9 @@ check path: ${chalk.blue.underline( } async runGenerator(generator: string, config: Record = {}) { - this.logger?.timing?.(`runGenerator ${generator}`); + this.logger?.timing?.(`🕒 RunGenerator ${generator}`); const spinner = ora({ - text: 'Load Generator...', + text: 'Load Generator...\n', spinner: 'runner', }).start(); const { materialKey, generatorPkg, generatorScript } = @@ -229,7 +230,7 @@ check path: ${chalk.blue.underline( this.setbasePath(this._context.current!.material.basePath!); await generatorScript(this._context, this); this.setCurrent(null); - this.logger?.timing?.(`runGenerator ${generator}`, true); + this.logger?.timing?.(`🕒 RunGenerator ${generator}`, true); } async runSubGenerator( @@ -237,9 +238,9 @@ check path: ${chalk.blue.underline( relativePwdPath = '', config?: Record, ) { - this.logger?.timing?.(`runSubGenerator ${subGenerator}`); + this.logger?.timing?.(`🕒 RunSubGenerator ${subGenerator}`); const spinner = ora({ - text: 'Load Generator...', + text: 'Load Generator...\n', spinner: 'runner', }).start(); const { materialKey, generatorPkg, generatorScript } = @@ -262,7 +263,6 @@ check path: ${chalk.blue.underline( material: generatorPkg, }, }; - this.logger.debug('subContext', subContext); const preOutputPath = this.outputPath; const preBasePath = this.basePath; this.setOutputPath(path.resolve(this.outputPath, relativePwdPath || '')); @@ -271,6 +271,6 @@ check path: ${chalk.blue.underline( await generatorScript(subContext, this); this.setOutputPath(preOutputPath); this.setbasePath(preBasePath); - this.logger?.timing?.(`runSubGenerator ${subGenerator}`, true); + this.logger?.timing?.(`🕒 RunSubGenerator ${subGenerator}`, true); } } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index ac6f6f39..26fca05d 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,5 +1,5 @@ export type { ILogger } from './logger/constants'; -export { LoggerLevel, LevelPriority } from './logger/constants'; +export { LoggerLevel } from './logger/constants'; export { Logger } from './logger'; export { CodeSmith } from './codesmith'; diff --git a/packages/core/src/logger/constants.ts b/packages/core/src/logger/constants.ts index 46757d77..10c64b2b 100644 --- a/packages/core/src/logger/constants.ts +++ b/packages/core/src/logger/constants.ts @@ -8,17 +8,6 @@ export enum LoggerLevel { Timing = 'timing', } -// define log lever priprity -export const LevelPriority = [ - LoggerLevel.Error, - LoggerLevel.Warn, - LoggerLevel.Info, - LoggerLevel.Timing, - LoggerLevel.Debug, - LoggerLevel.Verbose, - LoggerLevel.Stream, -]; - type LeveledLogMethod = (...meta: any[]) => void; type TimingMethod = (key: string, end?: boolean) => void; diff --git a/packages/core/src/logger/index.ts b/packages/core/src/logger/index.ts index 8fb5f24a..5b9f0429 100644 --- a/packages/core/src/logger/index.ts +++ b/packages/core/src/logger/index.ts @@ -1,71 +1,74 @@ import { chalk } from '@modern-js/utils'; -import { type ILogger, LevelPriority, LoggerLevel } from './constants'; +import { type Debugger, debug } from 'debug'; +import { type ILogger, LoggerLevel } from './constants'; +export { LoggerLevel }; export class Logger implements ILogger { level: LoggerLevel = LoggerLevel.Info; + errorLogger: Debugger; + warningLogger: Debugger; + debugLogger: Debugger; + timingLogger: Debugger; + verboseLogger: Debugger; + streamLogger: Debugger; - constructor(level: LoggerLevel = LoggerLevel.Info) { + constructor(level: LoggerLevel = LoggerLevel.Info, namespace = 'codesmith') { + if (!process.env.DEBUG) { + process.env.DEBUG = `${namespace}:*`; + debug.enable(process.env.DEBUG); + } this.level = level; + this.warningLogger = debug(`${namespace}:warn`); + this.errorLogger = debug(`${namespace}:error`); + this.debugLogger = debug(`${namespace}:debug`); + this.timingLogger = debug(`${namespace}:timing`); + this.verboseLogger = debug(`${namespace}:verbose`); + this.streamLogger = debug(`${namespace}:stream`); } - get currentLevelIndex() { - return LevelPriority.indexOf(this.level); - } - - private getLevalIndex(level: LoggerLevel) { - return LevelPriority.indexOf(level); + info(...meta: any[]) { + console.log(chalk.green('[INFO]'), ...meta); } - error(...meta: any[]) { - if (this.currentLevelIndex < this.getLevalIndex(LoggerLevel.Error)) { - return; - } - console.log(chalk.red('[ERROR]'), ...meta); + error(message: string, ...args: any[]) { + this.errorLogger(message, ...args); } - warn(...meta: any[]) { - if (this.currentLevelIndex < this.getLevalIndex(LoggerLevel.Warn)) { - return; - } - console.log(chalk.yellow('[WARN]'), ...meta); + warn(message: string, ...args: any[]) { + this.warningLogger(message, ...args); } - info(...meta: any[]) { - if (this.currentLevelIndex < this.getLevalIndex(LoggerLevel.Info)) { + debug(message: string, ...args: any[]) { + if (this.level === LoggerLevel.Timing) { return; } - console.log(chalk.green('[INFO]'), ...meta); - } - - debug(...meta: any[]) { - if (this.currentLevelIndex < this.getLevalIndex(LoggerLevel.Debug)) { - return; + if (this.level === LoggerLevel.Debug) { + this.debugLogger(message, ...args); } - console.log(chalk.blue('[DEBUG]'), ...meta); } timing(key: string, end?: boolean) { - if (this.currentLevelIndex < this.getLevalIndex(LoggerLevel.Timing)) { + if (this.level !== LoggerLevel.Timing) { return; } if (end) { + this.timingLogger(`[Time End] ${key}`); console.timeEnd(key); } else { + this.timingLogger(`[Time Start] ${key}`); console.time(key); } } - verbose(...meta: any[]) { - if (this.currentLevelIndex < this.getLevalIndex(LoggerLevel.Verbose)) { - return; + verbose(message: string, ...args: any[]) { + if (this.level === LoggerLevel.Verbose) { + this.verboseLogger(message, ...args); } - console.log('[VERBOSE]', ...meta); } - stream(...meta: any[]) { - if (this.currentLevelIndex < this.getLevalIndex(LoggerLevel.Stream)) { - return; + stream(message: string, ...args: any[]) { + if (this.level === LoggerLevel.Stream) { + this.streamLogger(message, ...args); } - console.log('[STREAM]', ...meta); } } diff --git a/packages/core/src/utils/downloadPackage.ts b/packages/core/src/utils/downloadPackage.ts index 01035530..c2038740 100644 --- a/packages/core/src/utils/downloadPackage.ts +++ b/packages/core/src/utils/downloadPackage.ts @@ -110,7 +110,9 @@ export async function downloadPackage( version = pkgVersion; } const targetDir = `${os.tmpdir()}/csmith-generator/${pkgName}@${version}`; - logger?.debug?.(`Download package ${pkgName}@${version} to ${targetDir}`); + logger?.debug?.( + `💡 [Download Generator Package]: ${pkgName}@${version} to ${targetDir}`, + ); if ((await fsExists(targetDir)) && (await isValidCache(targetDir))) { return targetDir; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 90912fd6..3946f632 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,7 +62,7 @@ importers: version: link:../../core '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -93,7 +93,7 @@ importers: version: link:../../core '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -124,7 +124,7 @@ importers: version: link:../../core '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -152,7 +152,7 @@ importers: version: link:../../core '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -180,7 +180,7 @@ importers: version: link:../../core '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -211,7 +211,7 @@ importers: devDependencies: '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -239,7 +239,7 @@ importers: devDependencies: '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -270,7 +270,7 @@ importers: devDependencies: '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -297,17 +297,23 @@ importers: version: 0.5.1 axios: specifier: ^1.6.0 - version: 1.6.0 + version: 1.6.0(debug@4.3.7) + debug: + specifier: 4.3.7 + version: 4.3.7 tar: specifier: ^6.1.13 version: 6.1.15 devDependencies: '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) + '@types/debug': + specifier: ^4.1.12 + version: 4.1.12 '@types/jest': specifier: ^26.0.24 version: 26.0.24 @@ -341,7 +347,7 @@ importers: devDependencies: '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -369,7 +375,7 @@ importers: devDependencies: '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -409,7 +415,7 @@ importers: version: link:../core '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -452,7 +458,7 @@ importers: devDependencies: '@modern-js/module-tools': specifier: ^2.58.0 - version: 2.58.0(typescript@4.9.5) + version: 2.58.0(debug@4.3.7)(typescript@4.9.5) '@modern-js/plugin-testing': specifier: ^2.58.0 version: 2.58.0(@rsbuild/core@1.0.1-beta.13)(@types/node@14.18.48)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(tsconfig-paths@4.2.0)(typescript@4.9.5) @@ -598,7 +604,7 @@ packages: '@babel/traverse': 7.25.3 '@babel/types': 7.25.2 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -711,7 +717,7 @@ packages: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - debug: 4.3.4 + debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.2 transitivePeerDependencies: @@ -2146,7 +2152,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - debug: 4.3.4 + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2161,7 +2167,7 @@ packages: '@babel/parser': 7.25.3 '@babel/template': 7.25.0 '@babel/types': 7.25.2 - debug: 4.3.4 + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -3347,7 +3353,7 @@ packages: '@swc/helpers': 0.5.3 dev: true - /@modern-js/module-tools@2.58.0(typescript@4.9.5): + /@modern-js/module-tools@2.58.0(debug@4.3.7)(typescript@4.9.5): resolution: {integrity: sha512-q4utnmoSxaz4sqC0sa9s5MSLI6IcnnxDIpiTAi4cJw4PChLcvo+oqY+Yb8bRvyf37DaZkDXgUctJ2kmCnzTIHw==} engines: {node: '>=16.0.0'} hasBin: true @@ -3363,7 +3369,7 @@ packages: '@babel/types': 7.25.2 '@modern-js/core': 2.58.0 '@modern-js/plugin': 2.58.0 - '@modern-js/plugin-changeset': 2.58.0 + '@modern-js/plugin-changeset': 2.58.0(debug@4.3.7) '@modern-js/plugin-i18n': 2.58.0 '@modern-js/plugin-lint': 2.58.0 '@modern-js/swc-plugins': 0.6.6(@swc/helpers@0.5.3) @@ -3397,7 +3403,7 @@ packages: dependencies: '@modern-js/core': 2.58.0 '@modern-js/plugin': 2.58.0 - '@modern-js/plugin-changeset': 2.58.0 + '@modern-js/plugin-changeset': 2.58.0(debug@4.3.7) '@modern-js/plugin-i18n': 2.58.0 '@modern-js/plugin-lint': 2.58.0 '@modern-js/utils': 2.58.0 @@ -3421,7 +3427,7 @@ packages: esbuild: 0.17.19 dev: true - /@modern-js/plugin-changeset@2.58.0: + /@modern-js/plugin-changeset@2.58.0(debug@4.3.7): resolution: {integrity: sha512-FtX3E15eK4OiwqQ9Cc0ANqi4FEwPUETwrEnHxMHJUYJDOv75Ld+bA1nUnWACc5L2gsjsT4A2U5zD41YuPw2G2A==} dependencies: '@changesets/cli': 2.26.2 @@ -3430,7 +3436,7 @@ packages: '@modern-js/plugin-i18n': 2.58.0 '@modern-js/utils': 2.58.0 '@swc/helpers': 0.5.3 - axios: 1.6.0 + axios: 1.6.0(debug@4.3.7) resolve-from: 5.0.0 transitivePeerDependencies: - debug @@ -4058,6 +4064,12 @@ packages: '@babel/types': 7.23.0 dev: true + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + dev: true + /@types/ejs@3.1.2: resolution: {integrity: sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g==} dev: true @@ -4127,6 +4139,10 @@ packages: minipass: 6.0.2 dev: true + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: true + /@types/node@12.20.24: resolution: {integrity: sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==} dev: true @@ -4305,7 +4321,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4 + debug: 4.3.7 transitivePeerDependencies: - supports-color dev: true @@ -4426,10 +4442,10 @@ packages: engines: {node: '>= 0.4'} dev: true - /axios@1.6.0: + /axios@1.6.0(debug@4.3.7): resolution: {integrity: sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2(debug@4.3.7) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -4980,6 +4996,18 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: false + + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} @@ -5482,7 +5510,7 @@ packages: pkg-dir: 4.2.0 dev: true - /follow-redirects@1.15.2: + /follow-redirects@1.15.2(debug@4.3.7): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -5490,6 +5518,8 @@ packages: peerDependenciesMeta: debug: optional: true + dependencies: + debug: 4.3.7 /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -5782,7 +5812,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.7 transitivePeerDependencies: - supports-color dev: true @@ -5792,7 +5822,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.7 transitivePeerDependencies: - supports-color dev: true @@ -6190,7 +6220,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4 + debug: 4.3.7 istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: @@ -7059,6 +7089,10 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -8108,7 +8142,7 @@ packages: dependencies: component-emitter: 1.3.0 cookiejar: 2.1.4 - debug: 4.3.4 + debug: 4.3.7 fast-safe-stringify: 2.1.1 form-data: 4.0.0 formidable: 2.1.2