Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading