@kubb/cli 1.1.2 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +75 -13
- package/dist/index.js +77 -15
- package/package.json +4 -5
- package/src/index.ts +11 -3
- package/src/init.ts +88 -0
- package/src/run.ts +13 -10
- package/src/utils/index.ts +1 -0
- package/src/utils/parseText.ts +5 -0
package/dist/index.cjs
CHANGED
|
@@ -34,6 +34,11 @@ var __require = /* @__PURE__ */ ((x) => typeof require$1 !== "undefined" ? requi
|
|
|
34
34
|
throw new Error('Dynamic require of "' + x + '" is not supported');
|
|
35
35
|
});
|
|
36
36
|
|
|
37
|
+
// src/utils/parseText.ts
|
|
38
|
+
function parseText(baseText, config, logLevel = "silent") {
|
|
39
|
+
return `${baseText}${config[logLevel] || ""}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
37
42
|
// src/utils/parseHrtimeToSeconds.ts
|
|
38
43
|
function parseHrtimeToSeconds(hrtime) {
|
|
39
44
|
const seconds = (hrtime[0] + hrtime[1] / 1e9).toFixed(3);
|
|
@@ -53,7 +58,7 @@ async function run({ config, options, spinner: spinner2 }) {
|
|
|
53
58
|
},
|
|
54
59
|
spinner: spinner2
|
|
55
60
|
};
|
|
56
|
-
const onDone = async (hooks) => {
|
|
61
|
+
const onDone = async (hooks, logLevel) => {
|
|
57
62
|
if (!hooks?.done) {
|
|
58
63
|
return;
|
|
59
64
|
}
|
|
@@ -65,10 +70,10 @@ async function run({ config, options, spinner: spinner2 }) {
|
|
|
65
70
|
}
|
|
66
71
|
const promises = commands.map(async (command) => {
|
|
67
72
|
const [cmd, ..._args] = [...stringArgv.parseArgsStringToArgv(command)];
|
|
68
|
-
spinner2.start(`\u{1FA82} Executing hooks(${pc__default.default.yellow("done")}) ${pc__default.default.dim(command)}`);
|
|
73
|
+
spinner2.start(parseText(`\u{1FA82} Executing hooks(${pc__default.default.yellow("done")})`, { info: ` ${pc__default.default.dim(command)}` }, logLevel));
|
|
69
74
|
const { stdout } = await execa.execa(cmd, _args);
|
|
70
|
-
spinner2.succeed(`\u{1FA82}
|
|
71
|
-
if (
|
|
75
|
+
spinner2.succeed(parseText(`\u{1FA82} Executing hooks(${pc__default.default.yellow("done")})`, { info: ` ${pc__default.default.dim(command)}` }, logLevel));
|
|
76
|
+
if (logLevel === "info") {
|
|
72
77
|
console.log(stdout);
|
|
73
78
|
}
|
|
74
79
|
});
|
|
@@ -130,15 +135,17 @@ ${error?.message}`));
|
|
|
130
135
|
};
|
|
131
136
|
try {
|
|
132
137
|
const { root, ...userConfig } = config;
|
|
133
|
-
|
|
138
|
+
const logLevel = options.logLevel ?? userConfig.logLevel ?? "silent";
|
|
139
|
+
const inputPath = options.input ?? userConfig.input.path;
|
|
140
|
+
spinner2.start(parseText(`\u{1F680} Building`, { info: `(${pc__default.default.dim(inputPath)})` }, logLevel));
|
|
134
141
|
const output = await core.build({
|
|
135
142
|
config: {
|
|
136
143
|
root: process.cwd(),
|
|
137
|
-
logLevel: "silent",
|
|
138
144
|
...userConfig,
|
|
145
|
+
logLevel,
|
|
139
146
|
input: {
|
|
140
147
|
...userConfig.input,
|
|
141
|
-
path:
|
|
148
|
+
path: inputPath
|
|
142
149
|
},
|
|
143
150
|
output: {
|
|
144
151
|
write: true,
|
|
@@ -147,8 +154,8 @@ ${error?.message}`));
|
|
|
147
154
|
},
|
|
148
155
|
logger
|
|
149
156
|
});
|
|
150
|
-
spinner2.succeed(`\u{1F680} Build completed(${pc__default.default.dim(
|
|
151
|
-
await onDone(config.hooks);
|
|
157
|
+
spinner2.succeed(parseText(`\u{1F680} Build completed`, { info: `(${pc__default.default.dim(inputPath)})` }, logLevel));
|
|
158
|
+
await onDone(config.hooks, logLevel);
|
|
152
159
|
printSummary(output.pluginManager, "success");
|
|
153
160
|
} catch (error) {
|
|
154
161
|
printErrors(error);
|
|
@@ -302,19 +309,74 @@ async function getCosmiConfig(moduleName2, config) {
|
|
|
302
309
|
}
|
|
303
310
|
return result;
|
|
304
311
|
}
|
|
312
|
+
var presets = {
|
|
313
|
+
simple: {
|
|
314
|
+
"kubb.config": `
|
|
315
|
+
import { defineConfig } from '@kubb/core'
|
|
316
|
+
import createSwagger from '@kubb/swagger'
|
|
317
|
+
import createSwaggerTS from '@kubb/swagger-ts'
|
|
318
|
+
import createSwaggerTanstackQuery from '@kubb/swagger-tanstack-query'
|
|
319
|
+
|
|
320
|
+
export default defineConfig({
|
|
321
|
+
root: '.',
|
|
322
|
+
input: {
|
|
323
|
+
path: './petStore.yaml',
|
|
324
|
+
},
|
|
325
|
+
output: {
|
|
326
|
+
path: './src/gen',
|
|
327
|
+
clean: true,
|
|
328
|
+
},
|
|
329
|
+
hooks: {
|
|
330
|
+
done: 'eslint --fix ./src/gen',
|
|
331
|
+
},
|
|
332
|
+
logLevel: 'info',
|
|
333
|
+
plugins: [createSwagger({}), createSwaggerTS({ output: 'models', enumType: 'enum' }), createSwaggerTanstackQuery({ output: './hooks' })],
|
|
334
|
+
})
|
|
335
|
+
`,
|
|
336
|
+
packages: ["@kubb/core", "@kubb/cli", "@kubb/swagger", "@kubb/swagger-ts", "@kubb/swagger-tanstack-query"]
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
async function init({ spinner: spinner2, preset = "simple", logLevel = "silent", packageManager = "pnpm" }) {
|
|
340
|
+
try {
|
|
341
|
+
const presetMeta = presets[preset];
|
|
342
|
+
const path = pathParser__default.default.resolve(process.cwd(), "./kubb.config.js");
|
|
343
|
+
spinner2.start(`\u{1F4C0} Writing \`kubb.config.js\` ${pc__default.default.dim(path)}`);
|
|
344
|
+
await core.write(presetMeta["kubb.config"], path);
|
|
345
|
+
spinner2.succeed(`\u{1F4C0} Wrote \`kubb.config.js\` ${pc__default.default.dim(path)}`);
|
|
346
|
+
const data = await Promise.all(
|
|
347
|
+
presetMeta.packages.map(async (pack) => {
|
|
348
|
+
spinner2.start(`\u{1F4C0} Installing ${pc__default.default.dim(pack)}`);
|
|
349
|
+
const { stdout } = await execa.$({ preferLocal: false })`${packageManager} install ${pack}`;
|
|
350
|
+
spinner2.succeed(`\u{1F4C0} Installed ${pc__default.default.dim(pack)}`);
|
|
351
|
+
return stdout;
|
|
352
|
+
})
|
|
353
|
+
);
|
|
354
|
+
if (logLevel === "info") {
|
|
355
|
+
data.forEach((text) => console.log(text));
|
|
356
|
+
}
|
|
357
|
+
} catch (error) {
|
|
358
|
+
spinner2.fail(pc__default.default.red(`Something went wrong
|
|
359
|
+
|
|
360
|
+
${error?.message}`));
|
|
361
|
+
}
|
|
362
|
+
}
|
|
305
363
|
|
|
306
364
|
// package.json
|
|
307
|
-
var version = "1.1.
|
|
365
|
+
var version = "1.1.4";
|
|
308
366
|
|
|
309
367
|
// src/index.ts
|
|
310
368
|
var moduleName = "kubb";
|
|
311
369
|
var spinner = ora__default.default({
|
|
312
|
-
color: "blue",
|
|
313
|
-
text: pc__default.default.blue("\u{1F3CE}\uFE0F Kubb generation started"),
|
|
314
370
|
spinner: "clock"
|
|
315
371
|
}).start();
|
|
316
372
|
var program = new commander.Command(moduleName).description("Kubb").action(async (options) => {
|
|
317
373
|
try {
|
|
374
|
+
if (options.init) {
|
|
375
|
+
spinner.start("\u{1F4E6} Initializing Kubb");
|
|
376
|
+
await init({ spinner, logLevel: options.logLevel });
|
|
377
|
+
spinner.succeed(`\u{1F4E6} initialized Kubb`);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
318
380
|
spinner.start("\u{1F4BE} Loading config");
|
|
319
381
|
const result = await getCosmiConfig(moduleName, options.config);
|
|
320
382
|
spinner.succeed(`\u{1F4BE} Config loaded(${pc__default.default.dim(pathParser__default.default.relative(process.cwd(), result.filepath))})`);
|
|
@@ -338,5 +400,5 @@ var program = new commander.Command(moduleName).description("Kubb").action(async
|
|
|
338
400
|
} catch (e) {
|
|
339
401
|
process.exit(1);
|
|
340
402
|
}
|
|
341
|
-
}).addOption(new commander.Option("-c, --config <path>", "Path to the Kubb config")).addOption(new commander.Option("-i, --input <path>", "Path of the input file(overrides the
|
|
403
|
+
}).addOption(new commander.Option("-c, --config <path>", "Path to the Kubb config")).addOption(new commander.Option("-i, --input <path>", "Path of the input file(overrides the one in `kubb.config.js`)")).addOption(new commander.Option("-l, --logLevel <type>", "Type of the logging(overrides the one in `kubb.config.js`)").choices(["error", "info", "silent"])).addOption(new commander.Option("--init", "Init Kubb")).addOption(new commander.Option("-d, --debug", "Debug mode").default(false)).addOption(new commander.Option("-w, --watch", "Watch mode based on the input file"));
|
|
342
404
|
program.name(moduleName).description("Generate").version(version, "-v").parse();
|
package/dist/index.js
CHANGED
|
@@ -4,10 +4,10 @@ import pathParser from 'node:path';
|
|
|
4
4
|
import { Command, Option } from 'commander';
|
|
5
5
|
import pc from 'picocolors';
|
|
6
6
|
import ora from 'ora';
|
|
7
|
-
import { execa } from 'execa';
|
|
7
|
+
import { $, execa } from 'execa';
|
|
8
8
|
import { parseArgsStringToArgv } from 'string-argv';
|
|
9
9
|
import PrettyError from 'pretty-error';
|
|
10
|
-
import { build, PluginError, ParallelPluginError, isPromise } from '@kubb/core';
|
|
10
|
+
import { build, PluginError, ParallelPluginError, isPromise, write } from '@kubb/core';
|
|
11
11
|
import { pathToFileURL } from 'node:url';
|
|
12
12
|
import mod from 'node:module';
|
|
13
13
|
import { cosmiconfig } from 'cosmiconfig';
|
|
@@ -23,6 +23,11 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
23
23
|
throw new Error('Dynamic require of "' + x + '" is not supported');
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
+
// src/utils/parseText.ts
|
|
27
|
+
function parseText(baseText, config, logLevel = "silent") {
|
|
28
|
+
return `${baseText}${config[logLevel] || ""}`;
|
|
29
|
+
}
|
|
30
|
+
|
|
26
31
|
// src/utils/parseHrtimeToSeconds.ts
|
|
27
32
|
function parseHrtimeToSeconds(hrtime) {
|
|
28
33
|
const seconds = (hrtime[0] + hrtime[1] / 1e9).toFixed(3);
|
|
@@ -42,7 +47,7 @@ async function run({ config, options, spinner: spinner2 }) {
|
|
|
42
47
|
},
|
|
43
48
|
spinner: spinner2
|
|
44
49
|
};
|
|
45
|
-
const onDone = async (hooks) => {
|
|
50
|
+
const onDone = async (hooks, logLevel) => {
|
|
46
51
|
if (!hooks?.done) {
|
|
47
52
|
return;
|
|
48
53
|
}
|
|
@@ -54,10 +59,10 @@ async function run({ config, options, spinner: spinner2 }) {
|
|
|
54
59
|
}
|
|
55
60
|
const promises = commands.map(async (command) => {
|
|
56
61
|
const [cmd, ..._args] = [...parseArgsStringToArgv(command)];
|
|
57
|
-
spinner2.start(`\u{1FA82} Executing hooks(${pc.yellow("done")}) ${pc.dim(command)}`);
|
|
62
|
+
spinner2.start(parseText(`\u{1FA82} Executing hooks(${pc.yellow("done")})`, { info: ` ${pc.dim(command)}` }, logLevel));
|
|
58
63
|
const { stdout } = await execa(cmd, _args);
|
|
59
|
-
spinner2.succeed(`\u{1FA82}
|
|
60
|
-
if (
|
|
64
|
+
spinner2.succeed(parseText(`\u{1FA82} Executing hooks(${pc.yellow("done")})`, { info: ` ${pc.dim(command)}` }, logLevel));
|
|
65
|
+
if (logLevel === "info") {
|
|
61
66
|
console.log(stdout);
|
|
62
67
|
}
|
|
63
68
|
});
|
|
@@ -119,15 +124,17 @@ ${error?.message}`));
|
|
|
119
124
|
};
|
|
120
125
|
try {
|
|
121
126
|
const { root, ...userConfig } = config;
|
|
122
|
-
|
|
127
|
+
const logLevel = options.logLevel ?? userConfig.logLevel ?? "silent";
|
|
128
|
+
const inputPath = options.input ?? userConfig.input.path;
|
|
129
|
+
spinner2.start(parseText(`\u{1F680} Building`, { info: `(${pc.dim(inputPath)})` }, logLevel));
|
|
123
130
|
const output = await build({
|
|
124
131
|
config: {
|
|
125
132
|
root: process.cwd(),
|
|
126
|
-
logLevel: "silent",
|
|
127
133
|
...userConfig,
|
|
134
|
+
logLevel,
|
|
128
135
|
input: {
|
|
129
136
|
...userConfig.input,
|
|
130
|
-
path:
|
|
137
|
+
path: inputPath
|
|
131
138
|
},
|
|
132
139
|
output: {
|
|
133
140
|
write: true,
|
|
@@ -136,8 +143,8 @@ ${error?.message}`));
|
|
|
136
143
|
},
|
|
137
144
|
logger
|
|
138
145
|
});
|
|
139
|
-
spinner2.succeed(`\u{1F680} Build completed(${pc.dim(
|
|
140
|
-
await onDone(config.hooks);
|
|
146
|
+
spinner2.succeed(parseText(`\u{1F680} Build completed`, { info: `(${pc.dim(inputPath)})` }, logLevel));
|
|
147
|
+
await onDone(config.hooks, logLevel);
|
|
141
148
|
printSummary(output.pluginManager, "success");
|
|
142
149
|
} catch (error) {
|
|
143
150
|
printErrors(error);
|
|
@@ -291,19 +298,74 @@ async function getCosmiConfig(moduleName2, config) {
|
|
|
291
298
|
}
|
|
292
299
|
return result;
|
|
293
300
|
}
|
|
301
|
+
var presets = {
|
|
302
|
+
simple: {
|
|
303
|
+
"kubb.config": `
|
|
304
|
+
import { defineConfig } from '@kubb/core'
|
|
305
|
+
import createSwagger from '@kubb/swagger'
|
|
306
|
+
import createSwaggerTS from '@kubb/swagger-ts'
|
|
307
|
+
import createSwaggerTanstackQuery from '@kubb/swagger-tanstack-query'
|
|
308
|
+
|
|
309
|
+
export default defineConfig({
|
|
310
|
+
root: '.',
|
|
311
|
+
input: {
|
|
312
|
+
path: './petStore.yaml',
|
|
313
|
+
},
|
|
314
|
+
output: {
|
|
315
|
+
path: './src/gen',
|
|
316
|
+
clean: true,
|
|
317
|
+
},
|
|
318
|
+
hooks: {
|
|
319
|
+
done: 'eslint --fix ./src/gen',
|
|
320
|
+
},
|
|
321
|
+
logLevel: 'info',
|
|
322
|
+
plugins: [createSwagger({}), createSwaggerTS({ output: 'models', enumType: 'enum' }), createSwaggerTanstackQuery({ output: './hooks' })],
|
|
323
|
+
})
|
|
324
|
+
`,
|
|
325
|
+
packages: ["@kubb/core", "@kubb/cli", "@kubb/swagger", "@kubb/swagger-ts", "@kubb/swagger-tanstack-query"]
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
async function init({ spinner: spinner2, preset = "simple", logLevel = "silent", packageManager = "pnpm" }) {
|
|
329
|
+
try {
|
|
330
|
+
const presetMeta = presets[preset];
|
|
331
|
+
const path = pathParser.resolve(process.cwd(), "./kubb.config.js");
|
|
332
|
+
spinner2.start(`\u{1F4C0} Writing \`kubb.config.js\` ${pc.dim(path)}`);
|
|
333
|
+
await write(presetMeta["kubb.config"], path);
|
|
334
|
+
spinner2.succeed(`\u{1F4C0} Wrote \`kubb.config.js\` ${pc.dim(path)}`);
|
|
335
|
+
const data = await Promise.all(
|
|
336
|
+
presetMeta.packages.map(async (pack) => {
|
|
337
|
+
spinner2.start(`\u{1F4C0} Installing ${pc.dim(pack)}`);
|
|
338
|
+
const { stdout } = await $({ preferLocal: false })`${packageManager} install ${pack}`;
|
|
339
|
+
spinner2.succeed(`\u{1F4C0} Installed ${pc.dim(pack)}`);
|
|
340
|
+
return stdout;
|
|
341
|
+
})
|
|
342
|
+
);
|
|
343
|
+
if (logLevel === "info") {
|
|
344
|
+
data.forEach((text) => console.log(text));
|
|
345
|
+
}
|
|
346
|
+
} catch (error) {
|
|
347
|
+
spinner2.fail(pc.red(`Something went wrong
|
|
348
|
+
|
|
349
|
+
${error?.message}`));
|
|
350
|
+
}
|
|
351
|
+
}
|
|
294
352
|
|
|
295
353
|
// package.json
|
|
296
|
-
var version = "1.1.
|
|
354
|
+
var version = "1.1.4";
|
|
297
355
|
|
|
298
356
|
// src/index.ts
|
|
299
357
|
var moduleName = "kubb";
|
|
300
358
|
var spinner = ora({
|
|
301
|
-
color: "blue",
|
|
302
|
-
text: pc.blue("\u{1F3CE}\uFE0F Kubb generation started"),
|
|
303
359
|
spinner: "clock"
|
|
304
360
|
}).start();
|
|
305
361
|
var program = new Command(moduleName).description("Kubb").action(async (options) => {
|
|
306
362
|
try {
|
|
363
|
+
if (options.init) {
|
|
364
|
+
spinner.start("\u{1F4E6} Initializing Kubb");
|
|
365
|
+
await init({ spinner, logLevel: options.logLevel });
|
|
366
|
+
spinner.succeed(`\u{1F4E6} initialized Kubb`);
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
307
369
|
spinner.start("\u{1F4BE} Loading config");
|
|
308
370
|
const result = await getCosmiConfig(moduleName, options.config);
|
|
309
371
|
spinner.succeed(`\u{1F4BE} Config loaded(${pc.dim(pathParser.relative(process.cwd(), result.filepath))})`);
|
|
@@ -327,5 +389,5 @@ var program = new Command(moduleName).description("Kubb").action(async (options)
|
|
|
327
389
|
} catch (e) {
|
|
328
390
|
process.exit(1);
|
|
329
391
|
}
|
|
330
|
-
}).addOption(new Option("-c, --config <path>", "Path to the Kubb config")).addOption(new Option("-i, --input <path>", "Path of the input file(overrides the
|
|
392
|
+
}).addOption(new Option("-c, --config <path>", "Path to the Kubb config")).addOption(new Option("-i, --input <path>", "Path of the input file(overrides the one in `kubb.config.js`)")).addOption(new Option("-l, --logLevel <type>", "Type of the logging(overrides the one in `kubb.config.js`)").choices(["error", "info", "silent"])).addOption(new Option("--init", "Init Kubb")).addOption(new Option("-d, --debug", "Debug mode").default(false)).addOption(new Option("-w, --watch", "Watch mode based on the input file"));
|
|
331
393
|
program.name(moduleName).description("Generate").version(version, "-v").parse();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/cli",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"description": "Generator cli",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -43,13 +43,13 @@
|
|
|
43
43
|
"yaml": "^2.3.1",
|
|
44
44
|
"@swc/core": "^1.3.62",
|
|
45
45
|
"pretty-error": "^4.0.0",
|
|
46
|
-
"@kubb/core": "1.1.
|
|
46
|
+
"@kubb/core": "1.1.4"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@types/node": "^20.2.5",
|
|
50
50
|
"tsup": "^6.7.0",
|
|
51
51
|
"typescript": "^5.1.3",
|
|
52
|
-
"@kubb/swagger": "1.1.
|
|
52
|
+
"@kubb/swagger": "1.1.4"
|
|
53
53
|
},
|
|
54
54
|
"publishConfig": {
|
|
55
55
|
"access": "public",
|
|
@@ -66,8 +66,7 @@
|
|
|
66
66
|
"pre-commit": "echo 'pre-commit not configured'",
|
|
67
67
|
"pre-push": "pnpm typecheck",
|
|
68
68
|
"test": "vitest --passWithNoTests",
|
|
69
|
-
"upgrade": "
|
|
70
|
-
"upgrade:local": "ncu --interactive --doctor",
|
|
69
|
+
"upgrade": "pnpm update",
|
|
71
70
|
"typecheck": "tsc -p ./tsconfig.json --noEmit --emitDeclarationOnly false"
|
|
72
71
|
}
|
|
73
72
|
}
|
package/src/index.ts
CHANGED
|
@@ -10,14 +10,13 @@ import type { CLIOptions } from '@kubb/core'
|
|
|
10
10
|
|
|
11
11
|
import { run } from './run.ts'
|
|
12
12
|
import { startWatcher, getConfig, getCosmiConfig } from './utils/index.ts'
|
|
13
|
+
import { init } from './init.ts'
|
|
13
14
|
|
|
14
15
|
import { version } from '../package.json'
|
|
15
16
|
|
|
16
17
|
const moduleName = 'kubb'
|
|
17
18
|
|
|
18
19
|
const spinner = ora({
|
|
19
|
-
color: 'blue',
|
|
20
|
-
text: pc.blue('🏎️ Kubb generation started'),
|
|
21
20
|
spinner: 'clock',
|
|
22
21
|
}).start()
|
|
23
22
|
|
|
@@ -25,6 +24,13 @@ const program = new Command(moduleName)
|
|
|
25
24
|
.description('Kubb')
|
|
26
25
|
.action(async (options: CLIOptions) => {
|
|
27
26
|
try {
|
|
27
|
+
if (options.init) {
|
|
28
|
+
spinner.start('📦 Initializing Kubb')
|
|
29
|
+
await init({ spinner, logLevel: options.logLevel })
|
|
30
|
+
spinner.succeed(`📦 initialized Kubb`)
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
|
|
28
34
|
// CONFIG
|
|
29
35
|
spinner.start('💾 Loading config')
|
|
30
36
|
const result = await getCosmiConfig(moduleName, options.config)
|
|
@@ -56,7 +62,9 @@ const program = new Command(moduleName)
|
|
|
56
62
|
}
|
|
57
63
|
})
|
|
58
64
|
.addOption(new Option('-c, --config <path>', 'Path to the Kubb config'))
|
|
59
|
-
.addOption(new Option('-i, --input <path>', 'Path of the input file(overrides the
|
|
65
|
+
.addOption(new Option('-i, --input <path>', 'Path of the input file(overrides the one in `kubb.config.js`)'))
|
|
66
|
+
.addOption(new Option('-l, --logLevel <type>', 'Type of the logging(overrides the one in `kubb.config.js`)').choices(['error', 'info', 'silent']))
|
|
67
|
+
.addOption(new Option('--init', 'Init Kubb'))
|
|
60
68
|
.addOption(new Option('-d, --debug', 'Debug mode').default(false))
|
|
61
69
|
.addOption(new Option('-w, --watch', 'Watch mode based on the input file'))
|
|
62
70
|
|
package/src/init.ts
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import pathParser from 'node:path'
|
|
2
|
+
import pc from 'picocolors'
|
|
3
|
+
import { $ } from 'execa'
|
|
4
|
+
|
|
5
|
+
import type { LogLevel } from '@kubb/core'
|
|
6
|
+
import { write } from '@kubb/core'
|
|
7
|
+
|
|
8
|
+
import type { Ora } from 'ora'
|
|
9
|
+
|
|
10
|
+
export type Preset = 'simple'
|
|
11
|
+
|
|
12
|
+
export type PackageManager = 'pnpm' | 'npm' | 'yarn'
|
|
13
|
+
|
|
14
|
+
export type PresetMeta = {
|
|
15
|
+
'kubb.config': string
|
|
16
|
+
packages: string[]
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type RunProps = {
|
|
20
|
+
spinner: Ora
|
|
21
|
+
/**
|
|
22
|
+
* @default `'silent'`
|
|
23
|
+
*/
|
|
24
|
+
logLevel?: LogLevel
|
|
25
|
+
/**
|
|
26
|
+
* @default `'simple'`
|
|
27
|
+
*/
|
|
28
|
+
preset?: Preset
|
|
29
|
+
/**
|
|
30
|
+
* @default `'pnpm'`
|
|
31
|
+
*/
|
|
32
|
+
packageManager?: PackageManager
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const presets: Record<Preset, PresetMeta> = {
|
|
36
|
+
simple: {
|
|
37
|
+
'kubb.config': `
|
|
38
|
+
import { defineConfig } from '@kubb/core'
|
|
39
|
+
import createSwagger from '@kubb/swagger'
|
|
40
|
+
import createSwaggerTS from '@kubb/swagger-ts'
|
|
41
|
+
import createSwaggerTanstackQuery from '@kubb/swagger-tanstack-query'
|
|
42
|
+
|
|
43
|
+
export default defineConfig({
|
|
44
|
+
root: '.',
|
|
45
|
+
input: {
|
|
46
|
+
path: './petStore.yaml',
|
|
47
|
+
},
|
|
48
|
+
output: {
|
|
49
|
+
path: './src/gen',
|
|
50
|
+
clean: true,
|
|
51
|
+
},
|
|
52
|
+
hooks: {
|
|
53
|
+
done: 'eslint --fix ./src/gen',
|
|
54
|
+
},
|
|
55
|
+
logLevel: 'info',
|
|
56
|
+
plugins: [createSwagger({}), createSwaggerTS({ output: 'models', enumType: 'enum' }), createSwaggerTanstackQuery({ output: './hooks' })],
|
|
57
|
+
})
|
|
58
|
+
`,
|
|
59
|
+
packages: ['@kubb/core', '@kubb/cli', '@kubb/swagger', '@kubb/swagger-ts', '@kubb/swagger-tanstack-query'],
|
|
60
|
+
},
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export async function init({ spinner, preset = 'simple', logLevel = 'silent', packageManager = 'pnpm' }: RunProps): Promise<void> {
|
|
64
|
+
try {
|
|
65
|
+
const presetMeta = presets[preset]
|
|
66
|
+
const path = pathParser.resolve(process.cwd(), './kubb.config.js')
|
|
67
|
+
|
|
68
|
+
spinner.start(`📀 Writing \`kubb.config.js\` ${pc.dim(path)}`)
|
|
69
|
+
await write(presetMeta['kubb.config'], path)
|
|
70
|
+
spinner.succeed(`📀 Wrote \`kubb.config.js\` ${pc.dim(path)}`)
|
|
71
|
+
|
|
72
|
+
const data = await Promise.all(
|
|
73
|
+
presetMeta.packages.map(async (pack) => {
|
|
74
|
+
spinner.start(`📀 Installing ${pc.dim(pack)}`)
|
|
75
|
+
const { stdout } = await $({ preferLocal: false })`${packageManager} install ${pack}`
|
|
76
|
+
spinner.succeed(`📀 Installed ${pc.dim(pack)}`)
|
|
77
|
+
|
|
78
|
+
return stdout
|
|
79
|
+
})
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if (logLevel === 'info') {
|
|
83
|
+
data.forEach((text) => console.log(text))
|
|
84
|
+
}
|
|
85
|
+
} catch (error) {
|
|
86
|
+
spinner.fail(pc.red(`Something went wrong\n\n${(error as Error)?.message}`))
|
|
87
|
+
}
|
|
88
|
+
}
|
package/src/run.ts
CHANGED
|
@@ -7,8 +7,9 @@ import { parseArgsStringToArgv } from 'string-argv'
|
|
|
7
7
|
import PrettyError from 'pretty-error'
|
|
8
8
|
|
|
9
9
|
import { ParallelPluginError, PluginError, build } from '@kubb/core'
|
|
10
|
-
import type { Logger, CLIOptions, KubbConfig, BuildOutput } from '@kubb/core'
|
|
10
|
+
import type { Logger, CLIOptions, KubbConfig, BuildOutput, LogLevel } from '@kubb/core'
|
|
11
11
|
|
|
12
|
+
import { parseText } from './utils/parseText.ts'
|
|
12
13
|
import { parseHrtimeToSeconds } from './utils/parseHrtimeToSeconds.ts'
|
|
13
14
|
|
|
14
15
|
import type { Ora } from 'ora'
|
|
@@ -32,7 +33,7 @@ export async function run({ config, options, spinner }: RunProps): Promise<void>
|
|
|
32
33
|
spinner,
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
const onDone = async (hooks: KubbConfig['hooks']) => {
|
|
36
|
+
const onDone = async (hooks: KubbConfig['hooks'], logLevel: LogLevel) => {
|
|
36
37
|
if (!hooks?.done) {
|
|
37
38
|
return
|
|
38
39
|
}
|
|
@@ -46,11 +47,11 @@ export async function run({ config, options, spinner }: RunProps): Promise<void>
|
|
|
46
47
|
|
|
47
48
|
const promises = commands.map(async (command) => {
|
|
48
49
|
const [cmd, ..._args] = [...parseArgsStringToArgv(command)]
|
|
49
|
-
spinner.start(`🪂 Executing hooks(${pc.yellow('done')}) ${pc.dim(command)}`)
|
|
50
|
+
spinner.start(parseText(`🪂 Executing hooks(${pc.yellow('done')})`, { info: ` ${pc.dim(command)}` }, logLevel))
|
|
50
51
|
const { stdout } = await execa(cmd, _args)
|
|
51
|
-
spinner.succeed(`🪂
|
|
52
|
+
spinner.succeed(parseText(`🪂 Executing hooks(${pc.yellow('done')})`, { info: ` ${pc.dim(command)}` }, logLevel))
|
|
52
53
|
|
|
53
|
-
if (
|
|
54
|
+
if (logLevel === 'info') {
|
|
54
55
|
console.log(stdout)
|
|
55
56
|
}
|
|
56
57
|
})
|
|
@@ -123,17 +124,19 @@ ${pc.bold('Generated:')} ${meta.filesCreated} files
|
|
|
123
124
|
try {
|
|
124
125
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars
|
|
125
126
|
const { root, ...userConfig } = config
|
|
127
|
+
const logLevel = options.logLevel ?? userConfig.logLevel ?? 'silent'
|
|
128
|
+
const inputPath = options.input ?? userConfig.input.path
|
|
126
129
|
|
|
127
|
-
spinner.start(`🚀 Building(${pc.dim(
|
|
130
|
+
spinner.start(parseText(`🚀 Building`, { info: `(${pc.dim(inputPath)})` }, logLevel))
|
|
128
131
|
|
|
129
132
|
const output = await build({
|
|
130
133
|
config: {
|
|
131
134
|
root: process.cwd(),
|
|
132
|
-
logLevel: 'silent',
|
|
133
135
|
...userConfig,
|
|
136
|
+
logLevel,
|
|
134
137
|
input: {
|
|
135
138
|
...userConfig.input,
|
|
136
|
-
path:
|
|
139
|
+
path: inputPath,
|
|
137
140
|
},
|
|
138
141
|
output: {
|
|
139
142
|
write: true,
|
|
@@ -143,9 +146,9 @@ ${pc.bold('Generated:')} ${meta.filesCreated} files
|
|
|
143
146
|
logger,
|
|
144
147
|
})
|
|
145
148
|
|
|
146
|
-
spinner.succeed(`🚀 Build completed(${pc.dim(
|
|
149
|
+
spinner.succeed(parseText(`🚀 Build completed`, { info: `(${pc.dim(inputPath)})` }, logLevel))
|
|
147
150
|
|
|
148
|
-
await onDone(config.hooks)
|
|
151
|
+
await onDone(config.hooks, logLevel)
|
|
149
152
|
|
|
150
153
|
printSummary(output.pluginManager, 'success')
|
|
151
154
|
} catch (error: any) {
|
package/src/utils/index.ts
CHANGED