Skip to content

Commit

Permalink
feat: refactor codesmith logger (#154)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
caohuilin authored Sep 23, 2024
1 parent 28464e2 commit 6d271ef
Show file tree
Hide file tree
Showing 18 changed files with 223 additions and 153 deletions.
14 changes: 14 additions & 0 deletions .changeset/khaki-readers-fix.md
Original file line number Diff line number Diff line change
@@ -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 ζ—₯志樑块
60 changes: 36 additions & 24 deletions packages/api/app/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down Expand Up @@ -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`,
}),
})}`,
);
}
}
Expand Down Expand Up @@ -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)}`,
);
}

Expand All @@ -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)}`);
}
}

Expand All @@ -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,
Expand All @@ -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)
Expand All @@ -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);
}
}

Expand All @@ -218,7 +222,7 @@ export class AppAPI {
parameters?: Record<string, any>,
) {
try {
this.generatorCore.logger?.timing?.('renderTemplateByFileType');
this.generatorCore.logger?.timing?.('πŸ•’ RenderTemplateByFileType');
const { material } = this.generatorContext.current!;
const resourceMap = await material.find(templatePattern, {
nodir: true,
Expand All @@ -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
Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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');
}
}
Expand Down
2 changes: 1 addition & 1 deletion packages/api/app/src/utils/checkUseNvm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
2 changes: 1 addition & 1 deletion packages/api/ejs/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
2 changes: 1 addition & 1 deletion packages/api/fs/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}),
Expand Down
6 changes: 3 additions & 3 deletions packages/api/git/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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;
}
}
Expand All @@ -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;
}
}
Expand Down
2 changes: 1 addition & 1 deletion packages/api/handlebars/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
6 changes: 3 additions & 3 deletions packages/api/json/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');
}
}
Expand All @@ -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');
}
});
Expand All @@ -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');
}
});
Expand Down
19 changes: 11 additions & 8 deletions packages/cli/src/actions/genAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,42 @@ 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);
}
}

let targetConfig: Record<string, unknown> = {};
try {
targetConfig = JSON.parse(config);
} catch (e) {
smith.logger.error('Bad json for config: ', genOptions.config);
smith.logger.error('πŸ”΄ [Config Parse Error]:', e);
return;
}

Expand Down
1 change: 1 addition & 0 deletions packages/cli/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export default function () {
.command('gen <generator>', { 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 <pwd>', 'process working directory', process.cwd())
.option('--config <config>', 'config for this generator(json string)', '{}')
.option(
Expand Down
4 changes: 3 additions & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,16 @@
"@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",
"@modern-js/plugin-testing": "^2.58.0",
"@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
Expand Down
24 changes: 17 additions & 7 deletions packages/core/src/codesmith/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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,
Expand All @@ -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);
}
}

Expand All @@ -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);
}
}
Loading

0 comments on commit 6d271ef

Please sign in to comment.