Skip to content

Commit a8990d4

Browse files
committed
feat: 🎸 add new custom command for extendability
1 parent bcc94c1 commit a8990d4

File tree

6 files changed

+76
-3
lines changed

6 files changed

+76
-3
lines changed

packages/cli/bin/merkur.mjs

+20-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#!/usr/bin/env node
2-
import { Command, Option } from 'commander';
2+
import { Command, Option, Argument } from 'commander';
33
import { dev } from '../src/commands/dev.mjs';
44
import { build } from '../src/commands/build.mjs';
55
import { start } from '../src/commands/start.mjs';
66
import { test } from '../src/commands/test.mjs';
7+
import { custom, CUSTOM_PART } from '../src/commands/custom.mjs';
78
import { COMMAND_NAME } from '../src/commands/constant.mjs';
89

910
// eslint-disable-next-line
@@ -66,6 +67,7 @@ program.command(COMMAND_NAME.DEV)
6667

6768
program
6869
.command(COMMAND_NAME.BUILD)
70+
.description('Build command')
6971
.addOption(writeToDiskOption)
7072
.addOption(sourcemapOption)
7173
.addOption(runTasksOption)
@@ -85,6 +87,7 @@ program
8587

8688
program
8789
.command(COMMAND_NAME.START)
90+
.description('Start widget server')
8891
.addOption(portOption)
8992
.addOption(devServerPortOption)
9093
.addOption(projectFolderOption)
@@ -106,6 +109,7 @@ program
106109

107110
program
108111
.command(COMMAND_NAME.TEST)
112+
.description('Test widget')
109113
.allowUnknownOption()
110114
.action(async (options, cmd) => {
111115
process.env.NODE_ENV = process.env.NODE_ENV ?? 'test';
@@ -117,4 +121,19 @@ program
117121
await test({ args, commandArgs: cmd.args, command: COMMAND_NAME.TEST });
118122
});
119123

124+
program
125+
.command(COMMAND_NAME.CUSTOM)
126+
.description('Customize template')
127+
.addArgument(new Argument('<part>', 'custom part').choices(Object.values(CUSTOM_PART)))
128+
.addOption(verboseOption)
129+
.allowUnknownOption()
130+
.action(async (part, options, cmd) => {
131+
const args = {
132+
...options,
133+
part,
134+
};
135+
136+
await custom({ args, commandArgs: cmd.args, command: COMMAND_NAME.CUSTOM });
137+
});
138+
120139
program.parse(process.argv);

packages/cli/src/commands/constant.mjs

+1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ export const COMMAND_NAME = {
33
DEV: 'dev',
44
BUILD: 'build',
55
TEST: 'test',
6+
CUSTOM: 'custom',
67
};

packages/cli/src/commands/custom.mjs

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import fs from 'node:fs/promises';
2+
import path from 'node:path';
3+
4+
import chalk from 'chalk';
5+
6+
import { createCLIConfig } from '../CLIConfig.mjs';
7+
import { createContext } from '../context.mjs';
8+
import { createLogger } from '../logger.mjs';
9+
import { createMerkurConfig } from '../merkurConfig.mjs';
10+
import { handleExit } from '../handleExit.mjs';
11+
12+
export const CUSTOM_PART = {
13+
PLAYGROUND_BODY: 'playground:body',
14+
};
15+
16+
export async function custom({ args, command }) {
17+
const context = await createContext();
18+
let baseCliConfig = await createCLIConfig({ args, command });
19+
20+
const { merkurConfig, cliConfig } = await createMerkurConfig({
21+
args,
22+
cliConfig: baseCliConfig,
23+
context,
24+
});
25+
26+
const logger = createLogger('Custom command:', cliConfig);
27+
28+
await handleExit({ context });
29+
switch (args.part) {
30+
case CUSTOM_PART.PLAYGROUND_BODY: {
31+
const file = 'body.ejs';
32+
const src = path.resolve(
33+
`${merkurConfig.playground.templateFolder}/${file}`,
34+
);
35+
const dest = path.resolve(
36+
`${merkurConfig.playground.serverTemplateFolder}/${file}`,
37+
);
38+
39+
logger.debug(`Copy file from ${src} to ${dest}`);
40+
41+
await fs.copyFile(src, dest);
42+
43+
logger.info(`You can customize ${chalk.green(dest)} file.`);
44+
break;
45+
}
46+
}
47+
}

packages/cli/src/devServer.mjs

+3-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ export async function runDevServer({ context, merkurConfig, cliConfig }) {
2626
const {
2727
template,
2828
templateFolder,
29+
serverTemplateFolder,
2930
path: playgroundPath,
3031
widgetHandler,
3132
} = merkurConfig.playground;
32-
const { cliFolder, projectFolder, command, writeToDisk } = cliConfig;
33+
const { cliFolder, command, writeToDisk } = cliConfig;
3334

3435
return new Promise((resolve, reject) => {
3536
const app = express();
@@ -126,7 +127,7 @@ export async function runDevServer({ context, merkurConfig, cliConfig }) {
126127
fs.readFileSync(template, 'utf8'),
127128
{
128129
views: [
129-
path.resolve(`${projectFolder}/server/playground/templates/`),
130+
serverTemplateFolder,
130131
path.dirname(template),
131132
templateFolder,
132133
],

packages/cli/src/merkurConfig.mjs

+3
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,9 @@ emitter.on(
194194
merkurConfig.playground = {
195195
template: path.resolve(`${cliConfig.cliFolder}/templates/playground.ejs`),
196196
templateFolder: path.resolve(`${cliConfig.cliFolder}/templates`),
197+
serverTemplateFolder: path.resolve(
198+
`${cliConfig.projectFolder}/server/playground/templates`,
199+
),
197200
path: '/',
198201
widgetHandler: async (req) => {
199202
const { protocol, host } = merkurConfig.widgetServer;

packages/cli/types.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export type Extend =
3030

3131
export interface Task {
3232
name: 'es13' | 'es9' | 'node' | string;
33+
folder: 'es13' | 'es9' | string;
3334
build: BuildOptions;
3435
[key: string]: any;
3536
}
@@ -46,6 +47,7 @@ export interface DevServer {
4647
export interface Playground {
4748
template: string;
4849
templateFolder: string;
50+
serverTemplateFolder: string;
4951
path: string;
5052
widgetHandler(req: Request, res: Response): Record<string, unknown>;
5153
widgetParams(req: Request): URLSearchParams;

0 commit comments

Comments
 (0)