@kubb/cli 5.14.5 → 5.15.0
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/bin/kubb.js +2 -1
- package/dist/{Telemetry-Dc79_cIA.js → Telemetry-B3edcFoB.js} +12 -86
- package/dist/Telemetry-B3edcFoB.js.map +1 -0
- package/dist/{Telemetry-Dc9DVxKQ.cjs → Telemetry-COWGqYmh.cjs} +14 -118
- package/dist/Telemetry-COWGqYmh.cjs.map +1 -0
- package/dist/{background-v5pDy3IJ.cjs → background-B24lIehn.cjs} +5 -6
- package/dist/{background-v5pDy3IJ.cjs.map → background-B24lIehn.cjs.map} +1 -1
- package/dist/{background-C877JFxE.js → background-D-7OGjvg.js} +1 -1
- package/dist/{background-3_KudPH-.js → background-_dKcGjM7.js} +5 -6
- package/dist/{background-3_KudPH-.js.map → background-_dKcGjM7.js.map} +1 -1
- package/dist/banner-BdTTDFkG.js +140 -0
- package/dist/banner-BdTTDFkG.js.map +1 -0
- package/dist/banner-wJFk-L-c.cjs +163 -0
- package/dist/banner-wJFk-L-c.cjs.map +1 -0
- package/dist/config-BL3HnFhb.js +1 -0
- package/dist/config-BWj9jBVj.cjs +62 -0
- package/dist/config-BWj9jBVj.cjs.map +1 -0
- package/dist/{config-CNqgDSu3.js → config-CQTxXvIG.js} +6 -52
- package/dist/config-CQTxXvIG.js.map +1 -0
- package/dist/{config-BG_Nr2CZ.cjs → config-CRrmj88c.cjs} +15 -62
- package/dist/config-CRrmj88c.cjs.map +1 -0
- package/dist/config-Uk3rbZfb.js +49 -0
- package/dist/config-Uk3rbZfb.js.map +1 -0
- package/dist/configFile-C0DIXNMD.js +993 -0
- package/dist/configFile-C0DIXNMD.js.map +1 -0
- package/dist/configFile-CoEpHdXG.cjs +1028 -0
- package/dist/configFile-CoEpHdXG.cjs.map +1 -0
- package/dist/{credentials-C8tjAhTo.js → credentials-B77iJx9H.js} +1 -1
- package/dist/{credentials-DDaKqtJn.cjs → credentials-DEsGwcGD.cjs} +3 -4
- package/dist/{credentials-DDaKqtJn.cjs.map → credentials-DEsGwcGD.cjs.map} +1 -1
- package/dist/{credentials-CZK6zPLv.js → credentials-osgjujE_.js} +3 -4
- package/dist/{credentials-CZK6zPLv.js.map → credentials-osgjujE_.js.map} +1 -1
- package/dist/env-C3xHRMez.js +1 -0
- package/dist/env-eu3XyKqJ.cjs +55 -0
- package/dist/env-eu3XyKqJ.cjs.map +1 -0
- package/dist/env-rv-VgSGN.js +34 -0
- package/dist/env-rv-VgSGN.js.map +1 -0
- package/dist/{errors-Cl69p_vI.cjs → errors-BponpdjN.cjs} +3 -4
- package/dist/{errors-Cl69p_vI.cjs.map → errors-BponpdjN.cjs.map} +1 -1
- package/dist/{errors-DmC83ALX.js → errors-wzqmMpMo.js} +3 -4
- package/dist/{errors-DmC83ALX.js.map → errors-wzqmMpMo.js.map} +1 -1
- package/dist/index.cjs +37 -2719
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +0 -2
- package/dist/index.d.ts +0 -2
- package/dist/index.js +35 -2713
- package/dist/index.js.map +1 -1
- package/dist/installWithSpinner-DpnpxHq5.js +49 -0
- package/dist/installWithSpinner-DpnpxHq5.js.map +1 -0
- package/dist/installWithSpinner-ONGfIVUJ.cjs +56 -0
- package/dist/installWithSpinner-ONGfIVUJ.cjs.map +1 -0
- package/dist/{text-CEyJhBnh.js → intro-9PB8sE8z.js} +8 -52
- package/dist/intro-9PB8sE8z.js.map +1 -0
- package/dist/{text-CC2xdpGL.cjs → intro-YPaf1Imr.cjs} +12 -80
- package/dist/intro-YPaf1Imr.cjs.map +1 -0
- package/dist/isCIEnvironment-D6xtAAZ2.js +14 -0
- package/dist/isCIEnvironment-D6xtAAZ2.js.map +1 -0
- package/dist/isCIEnvironment-DiVOMI5Q.cjs +20 -0
- package/dist/isCIEnvironment-DiVOMI5Q.cjs.map +1 -0
- package/dist/mascot--q1xjKw1.js +63 -0
- package/dist/mascot--q1xjKw1.js.map +1 -0
- package/dist/mascot-JSA0j3Q_.cjs +80 -0
- package/dist/mascot-JSA0j3Q_.cjs.map +1 -0
- package/dist/mcp-CYPOFKnP.cjs +20 -0
- package/dist/mcp-CYPOFKnP.cjs.map +1 -0
- package/dist/mcp-CxeZR5vb.js +21 -0
- package/dist/mcp-CxeZR5vb.js.map +1 -0
- package/dist/package-D3Yss9Bb.js +5 -0
- package/dist/package-D3Yss9Bb.js.map +1 -0
- package/dist/package-aX0q9SZr.cjs +10 -0
- package/dist/package-aX0q9SZr.cjs.map +1 -0
- package/dist/{registry-ov1RYcD4.js → registry-B3eYk4LN.js} +7 -67
- package/dist/registry-B3eYk4LN.js.map +1 -0
- package/dist/{registry-BInbtBm7.cjs → registry-YE1pFWL-.cjs} +4 -82
- package/dist/registry-YE1pFWL-.cjs.map +1 -0
- package/dist/{reporters-DQz--AdE.cjs → reporters-2cgjvXwR.cjs} +32 -40
- package/dist/{reporters-DQz--AdE.cjs.map → reporters-2cgjvXwR.cjs.map} +1 -1
- package/dist/{reporters-BtD41K-C.js → reporters-BM430HdQ.js} +19 -27
- package/dist/{reporters-BtD41K-C.js.map → reporters-BM430HdQ.js.map} +1 -1
- package/dist/{rolldown-runtime-CPE0t6oh.cjs → rolldown-runtime-C3-Zg-KD.cjs} +1 -2
- package/dist/{rolldown-runtime-CRm0XQPb.js → rolldown-runtime-xo6NMXYd.js} +1 -2
- package/dist/run-1H9TGT8v.js +77 -0
- package/dist/run-1H9TGT8v.js.map +1 -0
- package/dist/run-B4zvF9WY.cjs +233 -0
- package/dist/run-B4zvF9WY.cjs.map +1 -0
- package/dist/run-BYP_t9dR.cjs +324 -0
- package/dist/run-BYP_t9dR.cjs.map +1 -0
- package/dist/{run-1oXPIkli.cjs → run-Bb19PlwV.cjs} +44 -37
- package/dist/run-Bb19PlwV.cjs.map +1 -0
- package/dist/{run-B03V0Poj.cjs → run-BoO7H8RA.cjs} +49 -41
- package/dist/run-BoO7H8RA.cjs.map +1 -0
- package/dist/run-BrM7-NSV.js +181 -0
- package/dist/run-BrM7-NSV.js.map +1 -0
- package/dist/{run-UsAMlUyy.js → run-C0KI-NE3.js} +9 -9
- package/dist/{run-UsAMlUyy.js.map → run-C0KI-NE3.js.map} +1 -1
- package/dist/run-CCLPt4hr.js +1 -0
- package/dist/run-CCsdLz3X.js +385 -0
- package/dist/run-CCsdLz3X.js.map +1 -0
- package/dist/{run-YMSJnvYl.js → run-CbX6tpqB.js} +31 -23
- package/dist/run-CbX6tpqB.js.map +1 -0
- package/dist/run-CrM4jsix.cjs +80 -0
- package/dist/run-CrM4jsix.cjs.map +1 -0
- package/dist/run-CvFakE3B.cjs +185 -0
- package/dist/run-CvFakE3B.cjs.map +1 -0
- package/dist/run-D-nn9-Wq.js +319 -0
- package/dist/run-D-nn9-Wq.js.map +1 -0
- package/dist/{run-cBSr2F1q.cjs → run-D5Z6nfzK.cjs} +5 -6
- package/dist/{run-cBSr2F1q.cjs.map → run-D5Z6nfzK.cjs.map} +1 -1
- package/dist/{run-BUzdEUaE.cjs → run-DCqmf5W1.cjs} +10 -10
- package/dist/{run-BUzdEUaE.cjs.map → run-DCqmf5W1.cjs.map} +1 -1
- package/dist/{run-BK-A9JDf.js → run-DFXhBS64.js} +5 -6
- package/dist/{run-BK-A9JDf.js.map → run-DFXhBS64.js.map} +1 -1
- package/dist/run-DgGZOC_x.cjs +389 -0
- package/dist/run-DgGZOC_x.cjs.map +1 -0
- package/dist/{run-DDwdeHgU.js → run-KqdudiWQ.js} +26 -20
- package/dist/run-KqdudiWQ.js.map +1 -0
- package/dist/run-RN_31Q4u.js +228 -0
- package/dist/run-RN_31Q4u.js.map +1 -0
- package/dist/shared-C0EtrdUm.cjs +123 -0
- package/dist/shared-C0EtrdUm.cjs.map +1 -0
- package/dist/shared-Ct9stKpp.js +94 -0
- package/dist/shared-Ct9stKpp.js.map +1 -0
- package/dist/{snapshot-BrwynBfC.cjs → snapshot-D7Ytw8S0.cjs} +13 -14
- package/dist/{snapshot-BrwynBfC.cjs.map → snapshot-D7Ytw8S0.cjs.map} +1 -1
- package/dist/{snapshot-D2E7nhEf.js → snapshot-n7dJGCWv.js} +10 -11
- package/dist/{snapshot-D2E7nhEf.js.map → snapshot-n7dJGCWv.js.map} +1 -1
- package/dist/spinner-BZaln7O8.js +160 -0
- package/dist/spinner-BZaln7O8.js.map +1 -0
- package/dist/spinner-CfB0sIPy.cjs +208 -0
- package/dist/spinner-CfB0sIPy.cjs.map +1 -0
- package/dist/{status-CxzhvjKs.cjs → status-Bc0_4T41.cjs} +7 -8
- package/dist/{status-CxzhvjKs.cjs.map → status-Bc0_4T41.cjs.map} +1 -1
- package/dist/{status-BHIOMCM0.js → status-DxSkp1cH.js} +6 -7
- package/dist/{status-BHIOMCM0.js.map → status-DxSkp1cH.js.map} +1 -1
- package/dist/studio-BpYwgFb0.cjs +218 -0
- package/dist/studio-BpYwgFb0.cjs.map +1 -0
- package/dist/studio-mw6HaPkr.js +215 -0
- package/dist/studio-mw6HaPkr.js.map +1 -0
- package/dist/studioWorker.js +4 -5
- package/dist/{summary-B219y888.js → summary-CbmQKA8l.js} +5 -6
- package/dist/{summary-B219y888.js.map → summary-CbmQKA8l.js.map} +1 -1
- package/dist/{summary-BOYsqub3.cjs → summary-Clvl5Hxs.cjs} +7 -8
- package/dist/{summary-BOYsqub3.cjs.map → summary-Clvl5Hxs.cjs.map} +1 -1
- package/dist/table-BlRe9YTZ.cjs +15 -0
- package/dist/table-BlRe9YTZ.cjs.map +1 -0
- package/dist/table-CR7iZJGo.js +10 -0
- package/dist/table-CR7iZJGo.js.map +1 -0
- package/dist/text-BmiI4s6N.js +13 -0
- package/dist/text-BmiI4s6N.js.map +1 -0
- package/dist/text-Ep3AulAS.cjs +24 -0
- package/dist/text-Ep3AulAS.cjs.map +1 -0
- package/dist/time-3BKoci3G.cjs +82 -0
- package/dist/time-3BKoci3G.cjs.map +1 -0
- package/dist/time-C-wU7VhC.js +65 -0
- package/dist/time-C-wU7VhC.js.map +1 -0
- package/dist/utils-BdibacYq.js +244 -0
- package/dist/utils-BdibacYq.js.map +1 -0
- package/dist/utils-CO89mxRU.cjs +290 -0
- package/dist/utils-CO89mxRU.cjs.map +1 -0
- package/dist/utils-CbJ6hS_t.js +222 -0
- package/dist/utils-CbJ6hS_t.js.map +1 -0
- package/dist/utils-CcARPB45.cjs +286 -0
- package/dist/utils-CcARPB45.cjs.map +1 -0
- package/dist/validate-8ZcWXfMt.js +28 -0
- package/dist/validate-8ZcWXfMt.js.map +1 -0
- package/dist/validate-CMSeDpGT.cjs +27 -0
- package/dist/validate-CMSeDpGT.cjs.map +1 -0
- package/package.json +7 -7
- package/dist/Telemetry-Dc79_cIA.js.map +0 -1
- package/dist/Telemetry-Dc9DVxKQ.cjs.map +0 -1
- package/dist/config-BG_Nr2CZ.cjs.map +0 -1
- package/dist/config-CNqgDSu3.js.map +0 -1
- package/dist/config-DWDpFSn1.js +0 -1
- package/dist/registry-BInbtBm7.cjs.map +0 -1
- package/dist/registry-ov1RYcD4.js.map +0 -1
- package/dist/run-1oXPIkli.cjs.map +0 -1
- package/dist/run-B03V0Poj.cjs.map +0 -1
- package/dist/run-DDwdeHgU.js.map +0 -1
- package/dist/run-YMSJnvYl.js.map +0 -1
- package/dist/run-v5aW1jjQ.js +0 -1
- package/dist/text-CC2xdpGL.cjs.map +0 -1
- package/dist/text-CEyJhBnh.js.map +0 -1
- package/dist/utils-8E1nF4C1.cjs +0 -645
- package/dist/utils-8E1nF4C1.cjs.map +0 -1
- package/dist/utils-D8VN40bN.js +0 -536
- package/dist/utils-D8VN40bN.js.map +0 -1
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
const require_rolldown_runtime = require("./rolldown-runtime-C3-Zg-KD.cjs");
|
|
2
|
+
const require_errors = require("./errors-BponpdjN.cjs");
|
|
3
|
+
const require_spinner = require("./spinner-CfB0sIPy.cjs");
|
|
4
|
+
const require_utils = require("./utils-CcARPB45.cjs");
|
|
5
|
+
const require_intro = require("./intro-YPaf1Imr.cjs");
|
|
6
|
+
const require_shared = require("./shared-C0EtrdUm.cjs");
|
|
7
|
+
const require_config = require("./config-CRrmj88c.cjs");
|
|
8
|
+
const require_summary = require("./summary-Clvl5Hxs.cjs");
|
|
9
|
+
const require_registry = require("./registry-YE1pFWL-.cjs");
|
|
10
|
+
const require_utils$1 = require("./utils-CO89mxRU.cjs");
|
|
11
|
+
const require_installWithSpinner = require("./installWithSpinner-ONGfIVUJ.cjs");
|
|
12
|
+
const require_text = require("./text-Ep3AulAS.cjs");
|
|
13
|
+
const require_table = require("./table-BlRe9YTZ.cjs");
|
|
14
|
+
let node_util = require("node:util");
|
|
15
|
+
let gunshi = require("gunshi");
|
|
16
|
+
let node_process = require("node:process");
|
|
17
|
+
node_process = require_rolldown_runtime.__toESM(node_process, 1);
|
|
18
|
+
let node_path = require("node:path");
|
|
19
|
+
node_path = require_rolldown_runtime.__toESM(node_path, 1);
|
|
20
|
+
let _clack_prompts = require("@clack/prompts");
|
|
21
|
+
_clack_prompts = require_rolldown_runtime.__toESM(_clack_prompts, 1);
|
|
22
|
+
let _kubb_core = require("@kubb/core");
|
|
23
|
+
let _gunshi_plugin_dryrun = require("@gunshi/plugin-dryrun");
|
|
24
|
+
// src/runners/update/run.ts
|
|
25
|
+
/**
|
|
26
|
+
* Generates every config in this process, the way `kubb generate` does, and returns the output files
|
|
27
|
+
* it changed. Runs after the install, so the config loads the new versions. `undefined` when the
|
|
28
|
+
* config fails to load or a build fails.
|
|
29
|
+
*/
|
|
30
|
+
async function regenerate({ cwd, configPath }) {
|
|
31
|
+
const spinner = require_spinner.createSpinner();
|
|
32
|
+
spinner.start("Generating with the new versions");
|
|
33
|
+
try {
|
|
34
|
+
const [{ getConfigs }, { generate }] = await Promise.all([Promise.resolve().then(() => require("./config-BWj9jBVj.cjs")).then((n) => n.config_exports), Promise.resolve().then(() => require("./run-BoO7H8RA.cjs"))]);
|
|
35
|
+
const { configs } = await getConfigs({ configPath });
|
|
36
|
+
const dirs = configs.map((config) => node_path.default.resolve(config.root ?? cwd, config.output.path));
|
|
37
|
+
const before = new Map((await Promise.all(dirs.map(require_utils.readOutputFiles))).flatMap((files) => [...files]));
|
|
38
|
+
const hooks = new _kubb_core.Hookable();
|
|
39
|
+
for (const config of configs) if (!await generate({
|
|
40
|
+
config,
|
|
41
|
+
hooks
|
|
42
|
+
})) throw new Error("Generation failed");
|
|
43
|
+
const after = new Map((await Promise.all(dirs.map(require_utils.readOutputFiles))).flatMap((files) => [...files]));
|
|
44
|
+
const diff = require_utils.diffFiles(before, after);
|
|
45
|
+
spinner.stop(diff.files.length ? `Generated: ${require_text.pluralize(diff.files.length, "file")} changed` : "Generated: no files changed");
|
|
46
|
+
return {
|
|
47
|
+
...diff,
|
|
48
|
+
output: dirs.map((dir) => node_path.default.relative(cwd, dir) || ".").join(", ")
|
|
49
|
+
};
|
|
50
|
+
} catch (error) {
|
|
51
|
+
spinner.error(`Generation failed: ${require_errors.getErrorMessage(error)}`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Moves installed extensions to the version the registry pins. Shows each version change with its
|
|
57
|
+
* bump, asks which to install with majors left out, installs them, and regenerates to show which
|
|
58
|
+
* files changed. With `dryRun`, only lists the updates and installs nothing.
|
|
59
|
+
*/
|
|
60
|
+
async function run({ ids, dryRun, yes }) {
|
|
61
|
+
const cwd = node_process.default.cwd();
|
|
62
|
+
const hrStart = node_process.default.hrtime();
|
|
63
|
+
const installedPackages = [];
|
|
64
|
+
const summary = (title, status, lines) => require_summary.logCommandSummary({
|
|
65
|
+
title,
|
|
66
|
+
status,
|
|
67
|
+
hrStart,
|
|
68
|
+
block: true,
|
|
69
|
+
lines
|
|
70
|
+
});
|
|
71
|
+
require_intro.logIntro({ title: require_intro.isInteractiveRun({
|
|
72
|
+
yes,
|
|
73
|
+
dryRun
|
|
74
|
+
}) ? void 0 : (0, node_util.styleText)("bgCyan", (0, node_util.styleText)("black", " Kubb Update ")) });
|
|
75
|
+
try {
|
|
76
|
+
const wanted = new Set(ids.map(require_registry.toRegistryId));
|
|
77
|
+
const [entries, installed] = await require_spinner.withSpinner({
|
|
78
|
+
message: "Checking the registry",
|
|
79
|
+
promise: Promise.all([require_registry.fetchRegistryIndex({ registry: require_registry.registryUrl() }), (0, _kubb_core.readInstalledPackages)({ root: cwd })])
|
|
80
|
+
});
|
|
81
|
+
const versions = new Map(installed.map((item) => [item.package, item.version]));
|
|
82
|
+
const tracked = entries.filter((entry) => versions.has(entry.artifact.package) && (!wanted.size || wanted.has(entry.id)));
|
|
83
|
+
for (const id of wanted) {
|
|
84
|
+
if (tracked.some((entry) => entry.id === id)) continue;
|
|
85
|
+
require_intro.logWarn(`${id} is not installed, or not in the registry.`);
|
|
86
|
+
node_process.default.exitCode = 1;
|
|
87
|
+
}
|
|
88
|
+
const current = ({ artifact }) => versions.get(artifact.package);
|
|
89
|
+
const isMajor = (entry) => require_registry.bumpOf({
|
|
90
|
+
installed: current(entry),
|
|
91
|
+
latest: entry.artifact.version
|
|
92
|
+
}) === "major";
|
|
93
|
+
const outdated = tracked.filter((entry) => require_registry.isOutdated({
|
|
94
|
+
installed: current(entry),
|
|
95
|
+
latest: entry.artifact.version
|
|
96
|
+
}));
|
|
97
|
+
const proposals = outdated.filter((entry) => {
|
|
98
|
+
const problem = require_registry.incompatibility(entry.manifest);
|
|
99
|
+
if (problem) {
|
|
100
|
+
require_intro.logWarn(`Skipped ${entry.id}: ${problem}`);
|
|
101
|
+
if (wanted.has(entry.id)) node_process.default.exitCode = 1;
|
|
102
|
+
}
|
|
103
|
+
return !problem;
|
|
104
|
+
});
|
|
105
|
+
if (!proposals.length) {
|
|
106
|
+
const title = outdated.length ? "No compatible updates available" : "Already up to date";
|
|
107
|
+
summary(tracked.length ? title : "No installed extensions to update", outdated.length ? "warning" : "success", [` ${tracked.length - outdated.length} of ${tracked.length} up to date`, ...ids.length ? ["", `No updates for ${ids.join(", ")}.`] : []]);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (tracked.length) {
|
|
111
|
+
const header = [
|
|
112
|
+
"Extension",
|
|
113
|
+
"Current",
|
|
114
|
+
"Latest",
|
|
115
|
+
""
|
|
116
|
+
];
|
|
117
|
+
const rows = tracked.map((entry) => {
|
|
118
|
+
if (!outdated.includes(entry)) return [
|
|
119
|
+
entry.artifact.package,
|
|
120
|
+
current(entry) ?? "-",
|
|
121
|
+
"up to date",
|
|
122
|
+
""
|
|
123
|
+
];
|
|
124
|
+
const bump = require_registry.bumpOf({
|
|
125
|
+
installed: current(entry),
|
|
126
|
+
latest: entry.artifact.version
|
|
127
|
+
}) ?? "";
|
|
128
|
+
return [
|
|
129
|
+
entry.artifact.package,
|
|
130
|
+
current(entry) ?? "not installed",
|
|
131
|
+
entry.artifact.version,
|
|
132
|
+
bump === "major" ? "major · breaking" : bump
|
|
133
|
+
];
|
|
134
|
+
});
|
|
135
|
+
const lines = require_table.formatTable([header, ...rows]);
|
|
136
|
+
require_intro.logStep(`Checked ${require_text.pluralize(tracked.length, "extension")} against the registry`);
|
|
137
|
+
require_intro.logBlock([(0, node_util.styleText)("dim", lines[0]), ...lines.slice(1).map((line, index) => {
|
|
138
|
+
if (!outdated.includes(tracked[index])) return (0, node_util.styleText)("dim", line);
|
|
139
|
+
return line.endsWith("major · breaking") ? (0, node_util.styleText)("yellow", line) : line;
|
|
140
|
+
})]);
|
|
141
|
+
}
|
|
142
|
+
if (dryRun) {
|
|
143
|
+
summary("Updates available", "planned", [`Dry run: nothing was installed. Run kubb update to install ${proposals.length === 1 ? "it" : "them"}.`]);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const defaults = proposals.filter((entry) => wanted.has(entry.id) || !isMajor(entry));
|
|
147
|
+
const chosen = yes ? defaults.map((entry) => entry.id) : await _clack_prompts.multiselect({
|
|
148
|
+
message: "Select the updates to install",
|
|
149
|
+
options: proposals.map((entry) => ({
|
|
150
|
+
value: entry.id,
|
|
151
|
+
label: entry.artifact.package,
|
|
152
|
+
hint: `${current(entry) ?? "not installed"} → ${entry.artifact.version}`
|
|
153
|
+
})),
|
|
154
|
+
initialValues: defaults.map((entry) => entry.id),
|
|
155
|
+
required: false
|
|
156
|
+
});
|
|
157
|
+
if (_clack_prompts.isCancel(chosen)) {
|
|
158
|
+
summary("Update canceled", "canceled", [" No changes made"]);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const selected = proposals.filter((entry) => chosen.includes(entry.id));
|
|
162
|
+
const skipped = proposals.filter((entry) => !selected.includes(entry)).map((entry) => {
|
|
163
|
+
const kind = entry.manifest.kind.charAt(0).toUpperCase() + entry.manifest.kind.slice(1);
|
|
164
|
+
return ` ${(0, node_util.styleText)("dim", "Skipped")} ${kind} ${entry.artifact.package} ${entry.artifact.version} ${(0, node_util.styleText)("dim", `run kubb update ${require_registry.toShortId(entry.id)} later`)}`;
|
|
165
|
+
});
|
|
166
|
+
if (!selected.length) {
|
|
167
|
+
summary("No updates installed", "canceled", [" No updates selected.", ...skipped]);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const packageManager = require_utils$1.detectPackageManager(cwd);
|
|
171
|
+
const names = selected.map(({ artifact }) => artifact.package).join(", ");
|
|
172
|
+
await require_installWithSpinner.installWithSpinner({
|
|
173
|
+
packages: selected.map(({ artifact }) => require_registry.installSpec(artifact)),
|
|
174
|
+
names,
|
|
175
|
+
packageManager,
|
|
176
|
+
cwd
|
|
177
|
+
});
|
|
178
|
+
installedPackages.push(...selected.map((entry) => entry.artifact.package));
|
|
179
|
+
const foundConfig = require_config.findConfigFile(cwd);
|
|
180
|
+
const configPath = foundConfig && !yes && await _clack_prompts.confirm({
|
|
181
|
+
message: "Regenerate now? This rewrites the generated files.",
|
|
182
|
+
initialValue: true
|
|
183
|
+
}) === true ? foundConfig : void 0;
|
|
184
|
+
const changed = configPath ? await regenerate({
|
|
185
|
+
cwd,
|
|
186
|
+
configPath
|
|
187
|
+
}) : void 0;
|
|
188
|
+
const generationFailed = Boolean(configPath && !changed);
|
|
189
|
+
const fileCounts = {
|
|
190
|
+
A: 0,
|
|
191
|
+
M: 0,
|
|
192
|
+
D: 0
|
|
193
|
+
};
|
|
194
|
+
for (const file of changed?.files ?? []) fileCounts[file.status]++;
|
|
195
|
+
summary(generationFailed ? "Extensions updated; generation failed" : "Update complete", generationFailed ? "warning" : "success", [
|
|
196
|
+
` Packages ${selected.length} installed with ${packageManager.name}${skipped.length ? ` · ${skipped.length} skipped` : ""}`,
|
|
197
|
+
...skipped,
|
|
198
|
+
...changed ? [` Files ${fileCounts.A} added · ${fileCounts.M} modified · ${fileCounts.D} deleted`] : [],
|
|
199
|
+
...!configPath ? [" Regeneration not run"] : [],
|
|
200
|
+
...generationFailed ? ["", "Fix the generation error, then run kubb generate."] : []
|
|
201
|
+
]);
|
|
202
|
+
} catch (error) {
|
|
203
|
+
require_intro.logError(require_errors.getErrorMessage(error));
|
|
204
|
+
summary("Update failed", "failed", installedPackages.length ? [` Packages ${installedPackages.join(", ")} installed`] : [" No changes made"]);
|
|
205
|
+
node_process.default.exitCode = 1;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const command = (0, gunshi.defineWithTypes)()({
|
|
209
|
+
name: "update",
|
|
210
|
+
description: "Update installed extensions, regenerate, and summarize file changes.",
|
|
211
|
+
examples: [
|
|
212
|
+
"kubb update",
|
|
213
|
+
"kubb update --dry-run",
|
|
214
|
+
"kubb update plugin-zod plugin-ts --yes"
|
|
215
|
+
].join("\n"),
|
|
216
|
+
args: {
|
|
217
|
+
ids: {
|
|
218
|
+
type: "positional",
|
|
219
|
+
description: "Registry ids to update, all installed extensions when omitted",
|
|
220
|
+
multiple: true
|
|
221
|
+
},
|
|
222
|
+
...require_shared.yesArg
|
|
223
|
+
},
|
|
224
|
+
run: ({ values, extensions }) => run({
|
|
225
|
+
ids: values.ids ?? [],
|
|
226
|
+
dryRun: extensions[_gunshi_plugin_dryrun.pluginId].enabled,
|
|
227
|
+
yes: values.yes
|
|
228
|
+
})
|
|
229
|
+
});
|
|
230
|
+
exports.command = command;
|
|
231
|
+
exports.run = run;
|
|
232
|
+
|
|
233
|
+
//# sourceMappingURL=run-B4zvF9WY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-B4zvF9WY.cjs","names":["createSpinner","path","readOutputFiles","Hookable","diffFiles","pluralize","getErrorMessage","process","logCommandSummary","isInteractiveRun","styleText","toRegistryId","withSpinner","fetchRegistryIndex","registryUrl","readInstalledPackages","bumpOf","isOutdated","incompatibility","formatTable","clack","toShortId","detectPackageManager","installWithSpinner","installSpec","findConfigFile","defineWithTypes","yesArg","dryRunId"],"sources":["../src/runners/update/run.ts"],"sourcesContent":["import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport { defineWithTypes } from 'gunshi'\nimport { findConfigFile } from '@internals/shared'\nimport { getErrorMessage } from '@internals/utils'\nimport { Hookable, type KubbHooks, readInstalledPackages, type RegistryEntry } from '@kubb/core'\nimport { pluralize } from '../../ui/text.ts'\nimport { dryRunId, type DryRunExtensions, yesArg } from '../../commands/shared.ts'\nimport { isInteractiveRun, logIntro } from '../../ui/intro.ts'\nimport { logBlock, logError, logStep, logWarn } from '../../ui/log.ts'\nimport { createSpinner, withSpinner } from '../../ui/spinner.ts'\nimport { logCommandSummary } from '../../ui/summary.ts'\nimport { formatTable } from '../../ui/table.ts'\nimport { bumpOf, fetchRegistryIndex, incompatibility, installSpec, isOutdated, registryUrl, toRegistryId, toShortId } from '../../utils/registry.ts'\nimport { detectPackageManager } from '../init/utils.ts'\nimport { installWithSpinner } from '../installWithSpinner.ts'\nimport { diffFiles, type FileChange, readOutputFiles } from '../generate/utils.ts'\n\nexport type UpdateOptions = {\n /**\n * Registry ids to update. Empty updates every installed extension the registry lists.\n */\n ids: Array<string>\n /**\n * List the updates without installing anything.\n */\n dryRun: boolean\n yes: boolean\n}\n\n/**\n * Generates every config in this process, the way `kubb generate` does, and returns the output files\n * it changed. Runs after the install, so the config loads the new versions. `undefined` when the\n * config fails to load or a build fails.\n */\nasync function regenerate({\n cwd,\n configPath,\n}: {\n cwd: string\n configPath: string\n}): Promise<{ files: Array<FileChange>; unchanged: number; output: string } | undefined> {\n const spinner = createSpinner()\n spinner.start('Generating with the new versions')\n try {\n // Imported here, so the config loader and the generate path never slow down `kubb --help`.\n const [{ getConfigs }, { generate }] = await Promise.all([import('../../config.ts'), import('../generate/run.ts')])\n const { configs } = await getConfigs({ configPath })\n const dirs = configs.map((config) => path.resolve(config.root ?? cwd, config.output.path))\n const before = new Map((await Promise.all(dirs.map(readOutputFiles))).flatMap((files) => [...files]))\n const hooks = new Hookable<KubbHooks>()\n for (const config of configs) {\n if (!(await generate({ config, hooks }))) throw new Error('Generation failed')\n }\n const after = new Map((await Promise.all(dirs.map(readOutputFiles))).flatMap((files) => [...files]))\n const diff = diffFiles(before, after)\n spinner.stop(diff.files.length ? `Generated: ${pluralize(diff.files.length, 'file')} changed` : 'Generated: no files changed')\n return { ...diff, output: dirs.map((dir) => path.relative(cwd, dir) || '.').join(', ') }\n } catch (error) {\n spinner.error(`Generation failed: ${getErrorMessage(error)}`)\n return undefined\n }\n}\n\n/**\n * Moves installed extensions to the version the registry pins. Shows each version change with its\n * bump, asks which to install with majors left out, installs them, and regenerates to show which\n * files changed. With `dryRun`, only lists the updates and installs nothing.\n */\nexport async function run({ ids, dryRun, yes }: UpdateOptions): Promise<void> {\n const cwd = process.cwd()\n const hrStart = process.hrtime()\n const installedPackages: Array<string> = []\n const summary = (title: string, status: Parameters<typeof logCommandSummary>[0]['status'], lines: ReadonlyArray<string>) =>\n logCommandSummary({ title, status, hrStart, block: true, lines })\n logIntro({ title: isInteractiveRun({ yes, dryRun }) ? undefined : styleText('bgCyan', styleText('black', ' Kubb Update ')) })\n\n try {\n const wanted = new Set(ids.map(toRegistryId))\n const [entries, installed] = await withSpinner({\n message: 'Checking the registry',\n promise: Promise.all([fetchRegistryIndex({ registry: registryUrl() }), readInstalledPackages({ root: cwd })]),\n })\n const versions = new Map(installed.map((item) => [item.package, item.version]))\n\n const tracked = entries.filter((entry) => versions.has(entry.artifact.package) && (!wanted.size || wanted.has(entry.id)))\n for (const id of wanted) {\n if (tracked.some((entry) => entry.id === id)) continue\n logWarn(`${id} is not installed, or not in the registry.`)\n // A caller that named it, such as Studio, must not read the run as a successful update.\n process.exitCode = 1\n }\n\n const current = ({ artifact }: RegistryEntry) => versions.get(artifact.package)\n const isMajor = (entry: RegistryEntry) => bumpOf({ installed: current(entry), latest: entry.artifact.version }) === 'major'\n const outdated = tracked.filter((entry) => isOutdated({ installed: current(entry), latest: entry.artifact.version }))\n const proposals = outdated.filter((entry) => {\n const problem = incompatibility(entry.manifest)\n if (problem) {\n logWarn(`Skipped ${entry.id}: ${problem}`)\n // Same as a missing id: Studio would report an update that installed nothing.\n if (wanted.has(entry.id)) process.exitCode = 1\n }\n return !problem\n })\n\n if (!proposals.length) {\n const title = outdated.length ? 'No compatible updates available' : 'Already up to date'\n summary(tracked.length ? title : 'No installed extensions to update', outdated.length ? 'warning' : 'success', [\n ` ${tracked.length - outdated.length} of ${tracked.length} up to date`,\n ...(ids.length ? ['', `No updates for ${ids.join(', ')}.`] : []),\n ])\n return\n }\n\n if (tracked.length) {\n const header = ['Extension', 'Current', 'Latest', '']\n const rows = tracked.map((entry) => {\n if (!outdated.includes(entry)) return [entry.artifact.package, current(entry) ?? '-', 'up to date', '']\n const bump = bumpOf({ installed: current(entry), latest: entry.artifact.version }) ?? ''\n return [entry.artifact.package, current(entry) ?? 'not installed', entry.artifact.version, bump === 'major' ? 'major · breaking' : bump]\n })\n const lines = formatTable([header, ...rows])\n logStep(`Checked ${pluralize(tracked.length, 'extension')} against the registry`)\n logBlock([\n styleText('dim', lines[0]!),\n ...lines.slice(1).map((line, index) => {\n if (!outdated.includes(tracked[index]!)) return styleText('dim', line)\n return line.endsWith('major · breaking') ? styleText('yellow', line) : line\n }),\n ])\n }\n\n if (dryRun) {\n summary('Updates available', 'planned', [`Dry run: nothing was installed. Run kubb update to install ${proposals.length === 1 ? 'it' : 'them'}.`])\n return\n }\n\n // A major can break the generated code, so it is only picked for you when you named it.\n const defaults = proposals.filter((entry) => wanted.has(entry.id) || !isMajor(entry))\n const chosen = yes\n ? defaults.map((entry) => entry.id)\n : await clack.multiselect({\n message: 'Select the updates to install',\n options: proposals.map((entry) => ({\n value: entry.id,\n label: entry.artifact.package,\n hint: `${current(entry) ?? 'not installed'} → ${entry.artifact.version}`,\n })),\n initialValues: defaults.map((entry) => entry.id),\n required: false,\n })\n if (clack.isCancel(chosen)) {\n summary('Update canceled', 'canceled', [' No changes made'])\n return\n }\n const selected = proposals.filter((entry) => chosen.includes(entry.id))\n\n const skipped = proposals\n .filter((entry) => !selected.includes(entry))\n .map((entry) => {\n const kind = entry.manifest.kind.charAt(0).toUpperCase() + entry.manifest.kind.slice(1)\n return ` ${styleText('dim', 'Skipped')} ${kind} ${entry.artifact.package} ${entry.artifact.version} ${styleText('dim', `run kubb update ${toShortId(entry.id)} later`)}`\n })\n if (!selected.length) {\n summary('No updates installed', 'canceled', [' No updates selected.', ...skipped])\n return\n }\n\n const packageManager = detectPackageManager(cwd)\n const names = selected.map(({ artifact }) => artifact.package).join(', ')\n await installWithSpinner({\n packages: selected.map(({ artifact }) => installSpec(artifact)),\n names,\n packageManager,\n cwd,\n })\n installedPackages.push(...selected.map((entry) => entry.artifact.package))\n\n // Regenerating rewrites output files, so it is asked for. `--yes` only accepts the install.\n const foundConfig = findConfigFile(cwd)\n const regenerateNow =\n foundConfig && !yes && (await clack.confirm({ message: 'Regenerate now? This rewrites the generated files.', initialValue: true })) === true\n const configPath = regenerateNow ? foundConfig : undefined\n const changed = configPath ? await regenerate({ cwd, configPath }) : undefined\n\n const generationFailed = Boolean(configPath && !changed)\n const fileCounts = { A: 0, M: 0, D: 0 }\n for (const file of changed?.files ?? []) fileCounts[file.status]++\n summary(generationFailed ? 'Extensions updated; generation failed' : 'Update complete', generationFailed ? 'warning' : 'success', [\n ` Packages ${selected.length} installed with ${packageManager.name}${skipped.length ? ` · ${skipped.length} skipped` : ''}`,\n ...skipped,\n ...(changed ? [` Files ${fileCounts.A} added · ${fileCounts.M} modified · ${fileCounts.D} deleted`] : []),\n ...(!configPath ? [' Regeneration not run'] : []),\n ...(generationFailed ? ['', 'Fix the generation error, then run kubb generate.'] : []),\n ])\n } catch (error) {\n logError(getErrorMessage(error))\n summary('Update failed', 'failed', installedPackages.length ? [` Packages ${installedPackages.join(', ')} installed`] : [' No changes made'])\n process.exitCode = 1\n }\n}\n\nexport const command = defineWithTypes<{ extensions: DryRunExtensions }>()({\n name: 'update',\n description: 'Update installed extensions, regenerate, and summarize file changes.',\n examples: ['kubb update', 'kubb update --dry-run', 'kubb update plugin-zod plugin-ts --yes'].join('\\n'),\n args: {\n ids: {\n type: 'positional',\n description: 'Registry ids to update, all installed extensions when omitted',\n multiple: true,\n },\n ...yesArg,\n },\n run: ({ values, extensions }) => run({ ids: values.ids ?? [], dryRun: extensions[dryRunId].enabled, yes: values.yes }),\n})\n"],"mappings":"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"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
const require_rolldown_runtime = require("./rolldown-runtime-C3-Zg-KD.cjs");
|
|
2
|
+
const require_configFile = require("./configFile-CoEpHdXG.cjs");
|
|
3
|
+
const require_errors = require("./errors-BponpdjN.cjs");
|
|
4
|
+
const require_spinner = require("./spinner-CfB0sIPy.cjs");
|
|
5
|
+
const require_intro = require("./intro-YPaf1Imr.cjs");
|
|
6
|
+
const require_shared = require("./shared-C0EtrdUm.cjs");
|
|
7
|
+
const require_config = require("./config-CRrmj88c.cjs");
|
|
8
|
+
const require_summary = require("./summary-Clvl5Hxs.cjs");
|
|
9
|
+
const require_registry = require("./registry-YE1pFWL-.cjs");
|
|
10
|
+
const require_utils = require("./utils-CO89mxRU.cjs");
|
|
11
|
+
const require_installWithSpinner = require("./installWithSpinner-ONGfIVUJ.cjs");
|
|
12
|
+
let node_util = require("node:util");
|
|
13
|
+
let gunshi = require("gunshi");
|
|
14
|
+
let node_process = require("node:process");
|
|
15
|
+
node_process = require_rolldown_runtime.__toESM(node_process, 1);
|
|
16
|
+
let node_path = require("node:path");
|
|
17
|
+
node_path = require_rolldown_runtime.__toESM(node_path, 1);
|
|
18
|
+
let _clack_prompts = require("@clack/prompts");
|
|
19
|
+
_clack_prompts = require_rolldown_runtime.__toESM(_clack_prompts, 1);
|
|
20
|
+
let _kubb_core = require("@kubb/core");
|
|
21
|
+
// src/runners/add/run.ts
|
|
22
|
+
/** The import and the `defineConfig` property to merge into `kubb.config.ts` by hand. */
|
|
23
|
+
function toSnippet({ artifact, manifest }) {
|
|
24
|
+
const call = `${manifest.export}()`;
|
|
25
|
+
const property = {
|
|
26
|
+
plugin: `plugins: [..., ${call}],`,
|
|
27
|
+
adapter: `adapter: ${call},`,
|
|
28
|
+
parser: `parsers: [..., ${call}],`
|
|
29
|
+
};
|
|
30
|
+
return [
|
|
31
|
+
`import { ${manifest.export} } from '${artifact.package}'`,
|
|
32
|
+
"",
|
|
33
|
+
property[manifest.kind]
|
|
34
|
+
].join("\n");
|
|
35
|
+
}
|
|
36
|
+
/** The `add-plugin` edits for `details`, and the manifests the edits read their export names from. */
|
|
37
|
+
function toConfigEdits(details) {
|
|
38
|
+
return {
|
|
39
|
+
edits: details.map(({ artifact, manifest }) => ({
|
|
40
|
+
operation: require_configFile.ConfigEditOperation.ADD_PLUGIN,
|
|
41
|
+
...manifest.kind === require_configFile.extensionKinds.parser ? { kind: require_configFile.extensionKinds.parser } : {},
|
|
42
|
+
plugin: artifact.package
|
|
43
|
+
})),
|
|
44
|
+
extensions: new Map(details.map(({ artifact, manifest }) => [artifact.package, {
|
|
45
|
+
package: artifact.package,
|
|
46
|
+
version: artifact.version,
|
|
47
|
+
manifest
|
|
48
|
+
}]))
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** The lines adding `details` would put in the config `source`, trimmed, or why it could not add them. */
|
|
52
|
+
function previewConfig({ details, source }) {
|
|
53
|
+
const result = require_configFile.editConfig({
|
|
54
|
+
source,
|
|
55
|
+
...toConfigEdits(details)
|
|
56
|
+
});
|
|
57
|
+
const failed = result.outcomes.find((outcome) => !outcome.applied);
|
|
58
|
+
if (failed) return { reason: failed.reason ?? "the config file was not changed" };
|
|
59
|
+
const remaining = source.split("\n");
|
|
60
|
+
return {
|
|
61
|
+
lines: result.source.split("\n").filter((line) => {
|
|
62
|
+
const index = remaining.indexOf(line);
|
|
63
|
+
if (index !== -1) remaining.splice(index, 1);
|
|
64
|
+
return index === -1;
|
|
65
|
+
}).map((line) => line.trim()),
|
|
66
|
+
source: result.source
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async function selectExtension({ entries, versions, registry }) {
|
|
70
|
+
if (!entries.length) throw new _kubb_core.Diagnostics.Error({
|
|
71
|
+
code: _kubb_core.Diagnostics.code.unknown,
|
|
72
|
+
severity: "error",
|
|
73
|
+
message: `The registry at ${registry} lists no extensions.`,
|
|
74
|
+
help: "Check that `KUBB_REGISTRY` points at a Kubb registry, or unset it to use https://kubb.dev/registry."
|
|
75
|
+
});
|
|
76
|
+
const searchText = new Map(entries.map((entry) => [entry.id, `${entry.id} ${entry.manifest.displayName} ${entry.manifest.description}`.toLowerCase()]));
|
|
77
|
+
const options = entries.toSorted((a, b) => a.id.localeCompare(b.id)).map((entry) => {
|
|
78
|
+
const installed = versions.has(entry.artifact.package);
|
|
79
|
+
return {
|
|
80
|
+
value: entry.id,
|
|
81
|
+
label: require_registry.toShortId(entry.id),
|
|
82
|
+
hint: installed ? "installed" : summarize(entry.manifest.description),
|
|
83
|
+
disabled: installed
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
const id = await _clack_prompts.autocomplete({
|
|
87
|
+
message: `Add an extension · ${entries.length} in the registry`,
|
|
88
|
+
placeholder: "Search",
|
|
89
|
+
options,
|
|
90
|
+
filter: (search, option) => searchText.get(option.value)?.includes(search.toLowerCase()) ?? false
|
|
91
|
+
});
|
|
92
|
+
return _clack_prompts.isCancel(id) ? void 0 : id;
|
|
93
|
+
}
|
|
94
|
+
/** Asks whether to also add the required plugins the config lacks. `--yes` adds them. */
|
|
95
|
+
async function confirmDependencies({ entry, missing, yes }) {
|
|
96
|
+
if (!missing.length || yes) return true;
|
|
97
|
+
const names = missing.map((dependency) => dependency.manifest.name).join(", ");
|
|
98
|
+
const answer = await _clack_prompts.select({
|
|
99
|
+
message: `${entry.manifest.name} needs ${names}. Add ${names} as well?`,
|
|
100
|
+
options: [{
|
|
101
|
+
value: true,
|
|
102
|
+
label: `Yes, add ${missing.length === 1 ? "both" : "all"}`,
|
|
103
|
+
hint: "recommended"
|
|
104
|
+
}, {
|
|
105
|
+
value: false,
|
|
106
|
+
label: `Only ${entry.manifest.name}`,
|
|
107
|
+
hint: "generate fails until you add it"
|
|
108
|
+
}],
|
|
109
|
+
initialValue: true
|
|
110
|
+
});
|
|
111
|
+
return _clack_prompts.isCancel(answer) ? void 0 : answer;
|
|
112
|
+
}
|
|
113
|
+
/** The first sentence of a registry description, cut to one terminal line. */
|
|
114
|
+
function summarize(description, max = 64) {
|
|
115
|
+
const sentence = description.split(/\.\s/)[0].replace(/\.$/, "");
|
|
116
|
+
return sentence.length > max ? `${sentence.slice(0, max - 1).trimEnd()}…` : sentence;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Installs an extension from the Kubb registry at its reviewed version and, for a plugin or a parser,
|
|
120
|
+
* adds it to `kubb.config.ts`, offering to add the plugins it needs as well. An adapter is never
|
|
121
|
+
* written: the command prints the snippet to swap it in by hand. Without an id, asks which one.
|
|
122
|
+
* Previews the packages and config lines before asking. Refuses when the running Kubb or Node.js
|
|
123
|
+
* version is outside its compatibility.
|
|
124
|
+
*/
|
|
125
|
+
async function run({ id: input, configPath, yes, install }) {
|
|
126
|
+
const cwd = node_process.default.cwd();
|
|
127
|
+
const hrStart = node_process.default.hrtime();
|
|
128
|
+
const summary = (title, status, lines) => require_summary.logCommandSummary({
|
|
129
|
+
title,
|
|
130
|
+
status,
|
|
131
|
+
hrStart,
|
|
132
|
+
block: true,
|
|
133
|
+
lines
|
|
134
|
+
});
|
|
135
|
+
const installedPackages = [];
|
|
136
|
+
const configured = [];
|
|
137
|
+
require_intro.logIntro({ title: require_intro.isInteractiveRun({ yes }) ? void 0 : (0, node_util.styleText)("bgCyan", (0, node_util.styleText)("black", " Kubb Add ")) });
|
|
138
|
+
try {
|
|
139
|
+
const registry = require_registry.registryUrl();
|
|
140
|
+
if (!input && yes) throw new _kubb_core.Diagnostics.Error({
|
|
141
|
+
code: _kubb_core.Diagnostics.code.unknown,
|
|
142
|
+
severity: "error",
|
|
143
|
+
message: "Pass a registry id, such as plugin-zod, when using --yes.",
|
|
144
|
+
help: "Run `kubb add plugin-zod --yes`, or drop `--yes` to pick from a list."
|
|
145
|
+
});
|
|
146
|
+
const inputId = input ? require_registry.toRegistryId(input) : void 0;
|
|
147
|
+
const foundConfig = configPath ? node_path.default.resolve(configPath) : require_config.findConfigFile(cwd);
|
|
148
|
+
const [entries, installed, configSource] = await require_spinner.withSpinner({
|
|
149
|
+
message: "Reading the registry",
|
|
150
|
+
promise: Promise.all([
|
|
151
|
+
require_registry.fetchRegistryIndex({ registry }),
|
|
152
|
+
(0, _kubb_core.readInstalledPackages)({ root: cwd }),
|
|
153
|
+
foundConfig ? require_spinner.read(foundConfig).catch(() => void 0) : void 0
|
|
154
|
+
])
|
|
155
|
+
});
|
|
156
|
+
const versions = new Map(installed.map((item) => [item.package, item.version]));
|
|
157
|
+
const id = inputId ?? await selectExtension({
|
|
158
|
+
entries,
|
|
159
|
+
versions,
|
|
160
|
+
registry
|
|
161
|
+
});
|
|
162
|
+
if (!id) {
|
|
163
|
+
summary("Add canceled", "canceled", [" No changes made"]);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const entry = entries.find((candidate) => candidate.id === id);
|
|
167
|
+
if (!entry) {
|
|
168
|
+
const suggestions = require_registry.closestIds({
|
|
169
|
+
input: id,
|
|
170
|
+
ids: entries.map((entry) => entry.id)
|
|
171
|
+
}).map(require_registry.toShortId);
|
|
172
|
+
summary(`No extension named ${input ?? id}`, "failed", [...suggestions.map((suggestion) => ` kubb add ${suggestion}`), " Browse all kubb.dev/extensions"]);
|
|
173
|
+
node_process.default.exitCode = 1;
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const { artifact, manifest } = entry;
|
|
177
|
+
const kind = manifest.kind.charAt(0).toUpperCase() + manifest.kind.slice(1);
|
|
178
|
+
const problem = require_registry.incompatibility(manifest);
|
|
179
|
+
if (problem) throw new _kubb_core.Diagnostics.Error({
|
|
180
|
+
code: _kubb_core.Diagnostics.code.incompatibleExtension,
|
|
181
|
+
severity: "error",
|
|
182
|
+
message: problem,
|
|
183
|
+
help: "Upgrade Kubb or Node.js to a version the extension supports."
|
|
184
|
+
});
|
|
185
|
+
const configFile = manifest.kind === require_configFile.extensionKinds.adapter ? void 0 : foundConfig;
|
|
186
|
+
if (manifest.kind !== require_configFile.extensionKinds.adapter && !configFile) throw new _kubb_core.Diagnostics.Error({
|
|
187
|
+
code: _kubb_core.Diagnostics.code.unknown,
|
|
188
|
+
severity: "error",
|
|
189
|
+
message: "No kubb.config.ts found. Run `kubb init` first, or pass --config.",
|
|
190
|
+
help: "Run `kubb init` to create a config, or pass its path with `--config`."
|
|
191
|
+
});
|
|
192
|
+
const configName = configFile ? node_path.default.relative(cwd, configFile) || configFile : void 0;
|
|
193
|
+
const byName = new Map(entries.map((candidate) => [candidate.manifest.name, candidate]));
|
|
194
|
+
const inConfig = (name) => {
|
|
195
|
+
const dependency = byName.get(name);
|
|
196
|
+
return dependency ? !!configSource?.includes(`${dependency.manifest.export}(`) : installed.some((item) => item.manifest?.name === name);
|
|
197
|
+
};
|
|
198
|
+
const dependencies = manifest.dependencies ?? [];
|
|
199
|
+
const missing = configFile ? dependencies.filter((name) => !inConfig(name)).flatMap((name) => byName.get(name) ?? []) : [];
|
|
200
|
+
const withDependencies = await confirmDependencies({
|
|
201
|
+
entry,
|
|
202
|
+
missing,
|
|
203
|
+
yes
|
|
204
|
+
});
|
|
205
|
+
if (withDependencies === void 0) {
|
|
206
|
+
summary("Add canceled", "canceled", [` ${kind} ${manifest.name}`, " No changes made"]);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const targets = [...withDependencies ? missing : [], entry];
|
|
210
|
+
const dependencyStatus = (name) => {
|
|
211
|
+
if (inConfig(name)) return `${name} ${(0, node_util.styleText)("green", "✓ installed")}`;
|
|
212
|
+
return targets.some((target) => target.manifest.name === name) ? `${name} ${(0, node_util.styleText)("cyan", "+ adding")}` : `${name} ${(0, node_util.styleText)("yellow", "missing")}`;
|
|
213
|
+
};
|
|
214
|
+
const preview = configFile && configSource !== void 0 ? previewConfig({
|
|
215
|
+
details: targets,
|
|
216
|
+
source: configSource
|
|
217
|
+
}) : void 0;
|
|
218
|
+
const before = require_configFile.readImports(configSource ?? "");
|
|
219
|
+
const added = preview && "lines" in preview ? require_configFile.readImports(preview.source).filter((name) => !before.includes(name)) : [];
|
|
220
|
+
const bundled = require_config.BUNDLED_PACKAGES.filter((name) => added.includes(name) && !versions.has(name) && !targets.some((target) => target.artifact.package === name));
|
|
221
|
+
const kubbVersion = versions.get("kubb");
|
|
222
|
+
const specs = [...targets.filter((target) => target === entry || !versions.has(target.artifact.package)).map((target) => require_registry.installSpec(target.artifact)), ...bundled.map((name) => kubbVersion ? `${name}@${kubbVersion}` : name)];
|
|
223
|
+
require_intro.logStep(`${kind} ${(0, node_util.styleText)("cyan", manifest.name)} v${artifact.version} · ${summarize(manifest.description)}`);
|
|
224
|
+
require_intro.logBlock([
|
|
225
|
+
...dependencies.length ? [`Needs ${dependencies.map(dependencyStatus).join(" ")}`] : [],
|
|
226
|
+
install ? `Installs ${specs.join(" ")}` : "Installs nothing (--no-install)",
|
|
227
|
+
...configName ? [`Config ${configName}`] : [`Config prints the ${manifest.kind} snippet to add`],
|
|
228
|
+
...preview && "lines" in preview ? preview.lines.map((line) => (0, node_util.styleText)("green", ` + ${line}`)) : [],
|
|
229
|
+
...preview && "reason" in preview ? [(0, node_util.styleText)("yellow", ` cannot edit it: ${preview.reason}`)] : []
|
|
230
|
+
]);
|
|
231
|
+
const confirmed = yes || await _clack_prompts.confirm({
|
|
232
|
+
message: "Add it?",
|
|
233
|
+
initialValue: true
|
|
234
|
+
});
|
|
235
|
+
if (_clack_prompts.isCancel(confirmed) || !confirmed) {
|
|
236
|
+
summary("Add canceled", "canceled", [` ${kind} ${manifest.name}`, " No changes made"]);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const packageManager = require_utils.detectPackageManager(cwd);
|
|
240
|
+
const packages = () => install ? `${installedPackages.length} installed with ${packageManager.name}` : "installation skipped (--no-install)";
|
|
241
|
+
if (install) {
|
|
242
|
+
const names = [...targets.filter((target) => specs.includes(require_registry.installSpec(target.artifact))).map((target) => target.artifact.package), ...bundled];
|
|
243
|
+
await require_installWithSpinner.installWithSpinner({
|
|
244
|
+
packages: specs,
|
|
245
|
+
names: names.join(", "),
|
|
246
|
+
packageManager,
|
|
247
|
+
cwd
|
|
248
|
+
});
|
|
249
|
+
installedPackages.push(...names);
|
|
250
|
+
}
|
|
251
|
+
const unconfigured = configFile ? [] : [entry];
|
|
252
|
+
if (configFile) for (const target of targets) try {
|
|
253
|
+
const { outcomes, changed } = await require_configFile.editConfigFile({
|
|
254
|
+
filePath: configFile,
|
|
255
|
+
...toConfigEdits([target])
|
|
256
|
+
});
|
|
257
|
+
if (!outcomes[0]?.applied) throw new Error(outcomes[0]?.reason ?? "the config file was not changed");
|
|
258
|
+
if (changed) configured.push(target);
|
|
259
|
+
require_intro.logStep(`${target.manifest.export}() configured in ${configName}`);
|
|
260
|
+
} catch (error) {
|
|
261
|
+
require_intro.logWarn(`Could not edit ${configName}: ${require_errors.getErrorMessage(error)}`);
|
|
262
|
+
unconfigured.push(target);
|
|
263
|
+
}
|
|
264
|
+
const manual = unconfigured.length > 0;
|
|
265
|
+
if (manual && manifest.kind !== require_configFile.extensionKinds.adapter) node_process.default.exitCode = 1;
|
|
266
|
+
if (manual) require_intro.logBlock([
|
|
267
|
+
"Add the import to your Kubb config and merge the property into its defineConfig call:",
|
|
268
|
+
"",
|
|
269
|
+
...unconfigured.map((target) => toSnippet(target))
|
|
270
|
+
]);
|
|
271
|
+
const dependenciesMissing = !withDependencies && missing.length > 0;
|
|
272
|
+
summary(manual ? `${kind} needs configuration` : dependenciesMissing ? "Plugin configured; dependencies missing" : configured.length ? install ? `${kind} ready` : `${kind} configured` : `${kind} already configured`, manual || dependenciesMissing ? "warning" : "success", [
|
|
273
|
+
` Packages ${packages()}`,
|
|
274
|
+
...configured.map((target) => (0, node_util.styleText)("green", ` + ${target.manifest.export}()`)),
|
|
275
|
+
"",
|
|
276
|
+
...!install ? [`Install ${specs.join(" ")} to use it.`] : [],
|
|
277
|
+
...dependenciesMissing ? [`Missing plugins ${missing.map((target) => target.manifest.name).join(", ")}`] : [],
|
|
278
|
+
manual ? "Add the snippet above, then run kubb generate." : "Next kubb generate",
|
|
279
|
+
`Options kubb.dev/extensions/${entry.id}`
|
|
280
|
+
]);
|
|
281
|
+
} catch (error) {
|
|
282
|
+
require_intro.logError(require_errors.getErrorMessage(error));
|
|
283
|
+
summary("Add failed", "failed", installedPackages.length ? [` Packages ${installedPackages.join(", ")} installed`] : [" No changes made"]);
|
|
284
|
+
node_process.default.exitCode = 1;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const command = (0, gunshi.define)({
|
|
288
|
+
name: "add",
|
|
289
|
+
description: "Find and install plugins, adapters, and parsers from the Kubb registry.",
|
|
290
|
+
examples: [
|
|
291
|
+
"kubb add",
|
|
292
|
+
"kubb add plugin-zod",
|
|
293
|
+
"kubb add kubb-labs/plugin-react-query",
|
|
294
|
+
"kubb add acme/plugin-x --yes",
|
|
295
|
+
"kubb add plugin-zod --no-install"
|
|
296
|
+
].join("\n"),
|
|
297
|
+
toKebab: true,
|
|
298
|
+
args: {
|
|
299
|
+
id: {
|
|
300
|
+
type: "positional",
|
|
301
|
+
description: "Registry id: owner/slug, or a slug for an official extension. Asked for when omitted",
|
|
302
|
+
required: false
|
|
303
|
+
},
|
|
304
|
+
...require_shared.configArg,
|
|
305
|
+
...require_shared.yesArg,
|
|
306
|
+
install: {
|
|
307
|
+
type: "boolean",
|
|
308
|
+
description: "Install the package. Pass --no-install to only edit the config",
|
|
309
|
+
negatable: true,
|
|
310
|
+
default: true
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
run: ({ values }) => run({
|
|
314
|
+
id: values.id,
|
|
315
|
+
configPath: values.config,
|
|
316
|
+
yes: values.yes,
|
|
317
|
+
install: values.install
|
|
318
|
+
})
|
|
319
|
+
});
|
|
320
|
+
exports.command = command;
|
|
321
|
+
exports.run = run;
|
|
322
|
+
exports.summarize = summarize;
|
|
323
|
+
|
|
324
|
+
//# sourceMappingURL=run-BYP_t9dR.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-BYP_t9dR.cjs","names":["ConfigEditOperation","extensionKinds","editConfig","Diagnostics","toShortId","clack","process","logCommandSummary","isInteractiveRun","styleText","registryUrl","toRegistryId","path","findConfigFile","withSpinner","fetchRegistryIndex","readInstalledPackages","read","closestIds","incompatibility","readImports","BUNDLED_PACKAGES","installSpec","detectPackageManager","installWithSpinner","editConfigFile","getErrorMessage","define","configArg","yesArg"],"sources":["../src/runners/add/run.ts"],"sourcesContent":["import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport { define } from 'gunshi'\nimport { BUNDLED_PACKAGES, ConfigEditOperation, extensionKinds, editConfig, editConfigFile, findConfigFile, readImports } from '@internals/shared'\nimport { getErrorMessage, read } from '@internals/utils'\nimport { Diagnostics, type ExtensionManifest, readInstalledPackages, type RegistryDetail, type RegistryEntry } from '@kubb/core'\nimport { configArg, yesArg } from '../../commands/shared.ts'\nimport { isInteractiveRun, logIntro } from '../../ui/intro.ts'\nimport { logBlock, logError, logStep, logWarn } from '../../ui/log.ts'\nimport { withSpinner } from '../../ui/spinner.ts'\nimport { logCommandSummary } from '../../ui/summary.ts'\nimport { closestIds, fetchRegistryIndex, incompatibility, installSpec, registryUrl, toRegistryId, toShortId } from '../../utils/registry.ts'\nimport { detectPackageManager } from '../init/utils.ts'\nimport { installWithSpinner } from '../installWithSpinner.ts'\n\nexport type AddOptions = {\n /**\n * `owner/slug`, or a bare `slug` for an official extension. Asked for when omitted.\n */\n id?: string\n configPath?: string\n yes: boolean\n install: boolean\n}\n\ntype ConfigTarget = Pick<RegistryDetail, 'artifact' | 'manifest'>\n\n/** The import and the `defineConfig` property to merge into `kubb.config.ts` by hand. */\nfunction toSnippet({ artifact, manifest }: ConfigTarget): string {\n const call = `${manifest.export}()`\n const property: Record<ExtensionManifest['kind'], string> = {\n plugin: `plugins: [..., ${call}],`,\n adapter: `adapter: ${call},`,\n parser: `parsers: [..., ${call}],`,\n }\n return [`import { ${manifest.export} } from '${artifact.package}'`, '', property[manifest.kind]].join('\\n')\n}\n\n/** The `add-plugin` edits for `details`, and the manifests the edits read their export names from. */\nfunction toConfigEdits(details: Array<ConfigTarget>) {\n return {\n edits: details.map(({ artifact, manifest }) => ({\n operation: ConfigEditOperation.ADD_PLUGIN,\n ...(manifest.kind === extensionKinds.parser ? { kind: extensionKinds.parser } : {}),\n plugin: artifact.package,\n })),\n extensions: new Map(details.map(({ artifact, manifest }) => [artifact.package, { package: artifact.package, version: artifact.version, manifest }])),\n }\n}\n\n/** The lines adding `details` would put in the config `source`, trimmed, or why it could not add them. */\nfunction previewConfig({ details, source }: { details: Array<ConfigTarget>; source: string }): { lines: Array<string>; source: string } | { reason: string } {\n const result = editConfig({ source, ...toConfigEdits(details) })\n const failed = result.outcomes.find((outcome) => !outcome.applied)\n if (failed) return { reason: failed.reason ?? 'the config file was not changed' }\n const remaining = source.split('\\n')\n const lines = result.source.split('\\n').filter((line) => {\n const index = remaining.indexOf(line)\n if (index !== -1) remaining.splice(index, 1)\n return index === -1\n })\n return { lines: lines.map((line) => line.trim()), source: result.source }\n}\n\nasync function selectExtension({\n entries,\n versions,\n registry,\n}: {\n entries: Array<RegistryEntry>\n versions: Map<string, unknown>\n registry: string\n}): Promise<string | undefined> {\n if (!entries.length)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: `The registry at ${registry} lists no extensions.`,\n help: 'Check that `KUBB_REGISTRY` points at a Kubb registry, or unset it to use https://kubb.dev/registry.',\n })\n\n // Filters in memory, so typing never waits on the network.\n const searchText = new Map(entries.map((entry) => [entry.id, `${entry.id} ${entry.manifest.displayName} ${entry.manifest.description}`.toLowerCase()]))\n const options = entries\n .toSorted((a, b) => a.id.localeCompare(b.id))\n .map((entry) => {\n const installed = versions.has(entry.artifact.package)\n return { value: entry.id, label: toShortId(entry.id), hint: installed ? 'installed' : summarize(entry.manifest.description), disabled: installed }\n })\n\n const id = await clack.autocomplete({\n message: `Add an extension · ${entries.length} in the registry`,\n placeholder: 'Search',\n options,\n filter: (search, option) => searchText.get(option.value)?.includes(search.toLowerCase()) ?? false,\n })\n return clack.isCancel(id) ? undefined : id\n}\n\n/** Asks whether to also add the required plugins the config lacks. `--yes` adds them. */\nasync function confirmDependencies({\n entry,\n missing,\n yes,\n}: {\n entry: RegistryEntry\n missing: Array<RegistryEntry>\n yes: boolean\n}): Promise<boolean | undefined> {\n if (!missing.length || yes) return true\n const names = missing.map((dependency) => dependency.manifest.name).join(', ')\n const answer = await clack.select({\n message: `${entry.manifest.name} needs ${names}. Add ${names} as well?`,\n options: [\n { value: true, label: `Yes, add ${missing.length === 1 ? 'both' : 'all'}`, hint: 'recommended' },\n { value: false, label: `Only ${entry.manifest.name}`, hint: 'generate fails until you add it' },\n ],\n initialValue: true,\n })\n return clack.isCancel(answer) ? undefined : answer\n}\n\n/** The first sentence of a registry description, cut to one terminal line. */\nexport function summarize(description: string, max = 64): string {\n const sentence = description.split(/\\.\\s/)[0]!.replace(/\\.$/, '')\n return sentence.length > max ? `${sentence.slice(0, max - 1).trimEnd()}…` : sentence\n}\n\n/**\n * Installs an extension from the Kubb registry at its reviewed version and, for a plugin or a parser,\n * adds it to `kubb.config.ts`, offering to add the plugins it needs as well. An adapter is never\n * written: the command prints the snippet to swap it in by hand. Without an id, asks which one.\n * Previews the packages and config lines before asking. Refuses when the running Kubb or Node.js\n * version is outside its compatibility.\n */\nexport async function run({ id: input, configPath, yes, install }: AddOptions): Promise<void> {\n const cwd = process.cwd()\n const hrStart = process.hrtime()\n const summary = (title: string, status: Parameters<typeof logCommandSummary>[0]['status'], lines: ReadonlyArray<string>) =>\n logCommandSummary({ title, status, hrStart, block: true, lines })\n const installedPackages: Array<string> = []\n const configured: Array<RegistryEntry> = []\n logIntro({ title: isInteractiveRun({ yes }) ? undefined : styleText('bgCyan', styleText('black', ' Kubb Add ')) })\n\n try {\n const registry = registryUrl()\n if (!input && yes)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: 'Pass a registry id, such as plugin-zod, when using --yes.',\n help: 'Run `kubb add plugin-zod --yes`, or drop `--yes` to pick from a list.',\n })\n const inputId = input ? toRegistryId(input) : undefined\n const foundConfig = configPath ? path.resolve(configPath) : findConfigFile(cwd)\n const [entries, installed, configSource] = await withSpinner({\n message: 'Reading the registry',\n promise: Promise.all([\n fetchRegistryIndex({ registry }),\n readInstalledPackages({ root: cwd }),\n foundConfig ? read(foundConfig).catch(() => undefined) : undefined,\n ]),\n })\n const versions = new Map(installed.map((item) => [item.package, item.version]))\n\n const id = inputId ?? (await selectExtension({ entries, versions, registry }))\n if (!id) {\n summary('Add canceled', 'canceled', [' No changes made'])\n return\n }\n const entry = entries.find((candidate) => candidate.id === id)\n if (!entry) {\n const suggestions = closestIds({ input: id, ids: entries.map((entry) => entry.id) }).map(toShortId)\n summary(`No extension named ${input ?? id}`, 'failed', [\n ...suggestions.map((suggestion) => ` kubb add ${suggestion}`),\n ' Browse all kubb.dev/extensions',\n ])\n process.exitCode = 1\n return\n }\n const { artifact, manifest } = entry\n const kind = manifest.kind.charAt(0).toUpperCase() + manifest.kind.slice(1)\n\n const problem = incompatibility(manifest)\n if (problem)\n throw new Diagnostics.Error({\n code: Diagnostics.code.incompatibleExtension,\n severity: 'error',\n message: problem,\n help: 'Upgrade Kubb or Node.js to a version the extension supports.',\n })\n\n const configFile = manifest.kind === extensionKinds.adapter ? undefined : foundConfig\n if (manifest.kind !== extensionKinds.adapter && !configFile)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: 'No kubb.config.ts found. Run `kubb init` first, or pass --config.',\n help: 'Run `kubb init` to create a config, or pass its path with `--config`.',\n })\n const configName = configFile ? path.relative(cwd, configFile) || configFile : undefined\n\n const byName = new Map(entries.map((candidate) => [candidate.manifest.name, candidate]))\n const inConfig = (name: string) => {\n const dependency = byName.get(name)\n return dependency ? !!configSource?.includes(`${dependency.manifest.export}(`) : installed.some((item) => item.manifest?.name === name)\n }\n const dependencies = manifest.dependencies ?? []\n const missing = configFile ? dependencies.filter((name) => !inConfig(name)).flatMap((name) => byName.get(name) ?? []) : []\n const withDependencies = await confirmDependencies({ entry, missing, yes })\n if (withDependencies === undefined) {\n summary('Add canceled', 'canceled', [` ${kind} ${manifest.name}`, ' No changes made'])\n return\n }\n const targets = [...(withDependencies ? missing : []), entry]\n\n const dependencyStatus = (name: string) => {\n if (inConfig(name)) return `${name} ${styleText('green', '✓ installed')}`\n return targets.some((target) => target.manifest.name === name) ? `${name} ${styleText('cyan', '+ adding')}` : `${name} ${styleText('yellow', 'missing')}`\n }\n const preview = configFile && configSource !== undefined ? previewConfig({ details: targets, source: configSource }) : undefined\n // The default parsers written next to a new parser come with `kubb`. A strict node_modules layout\n // only lets the config import direct dependencies, so they are installed at the project's `kubb` version.\n const before = readImports(configSource ?? '')\n const added = preview && 'lines' in preview ? readImports(preview.source).filter((name) => !before.includes(name)) : []\n const bundled = BUNDLED_PACKAGES.filter(\n (name) => added.includes(name) && !versions.has(name) && !targets.some((target) => target.artifact.package === name),\n )\n const kubbVersion = versions.get('kubb')\n const specs = [\n ...targets.filter((target) => target === entry || !versions.has(target.artifact.package)).map((target) => installSpec(target.artifact)),\n ...bundled.map((name) => (kubbVersion ? `${name}@${kubbVersion}` : name)),\n ]\n logStep(`${kind} ${styleText('cyan', manifest.name)} v${artifact.version} · ${summarize(manifest.description)}`)\n logBlock([\n ...(dependencies.length ? [`Needs ${dependencies.map(dependencyStatus).join(' ')}`] : []),\n install ? `Installs ${specs.join(' ')}` : 'Installs nothing (--no-install)',\n ...(configName ? [`Config ${configName}`] : [`Config prints the ${manifest.kind} snippet to add`]),\n ...(preview && 'lines' in preview ? preview.lines.map((line) => styleText('green', ` + ${line}`)) : []),\n ...(preview && 'reason' in preview ? [styleText('yellow', ` cannot edit it: ${preview.reason}`)] : []),\n ])\n\n const confirmed = yes || (await clack.confirm({ message: 'Add it?', initialValue: true }))\n if (clack.isCancel(confirmed) || !confirmed) {\n summary('Add canceled', 'canceled', [` ${kind} ${manifest.name}`, ' No changes made'])\n return\n }\n\n const packageManager = detectPackageManager(cwd)\n const packages = () => (install ? `${installedPackages.length} installed with ${packageManager.name}` : 'installation skipped (--no-install)')\n if (install) {\n const names = [...targets.filter((target) => specs.includes(installSpec(target.artifact))).map((target) => target.artifact.package), ...bundled]\n await installWithSpinner({ packages: specs, names: names.join(', '), packageManager, cwd })\n installedPackages.push(...names)\n }\n\n const unconfigured: Array<RegistryEntry> = configFile ? [] : [entry]\n if (configFile) {\n for (const target of targets) {\n try {\n const { outcomes, changed } = await editConfigFile({ filePath: configFile, ...toConfigEdits([target]) })\n if (!outcomes[0]?.applied) throw new Error(outcomes[0]?.reason ?? 'the config file was not changed')\n if (changed) configured.push(target)\n logStep(`${target.manifest.export}() configured in ${configName}`)\n } catch (error) {\n logWarn(`Could not edit ${configName}: ${getErrorMessage(error)}`)\n unconfigured.push(target)\n }\n }\n }\n\n const manual = unconfigured.length > 0\n // A plugin or parser the command could not write into the config is a failure a caller can act on; an adapter never gets written.\n if (manual && manifest.kind !== extensionKinds.adapter) process.exitCode = 1\n if (manual)\n logBlock([\n 'Add the import to your Kubb config and merge the property into its defineConfig call:',\n '',\n ...unconfigured.map((target) => toSnippet(target)),\n ])\n const dependenciesMissing = !withDependencies && missing.length > 0\n const title = manual\n ? `${kind} needs configuration`\n : dependenciesMissing\n ? 'Plugin configured; dependencies missing'\n : configured.length\n ? install\n ? `${kind} ready`\n : `${kind} configured`\n : `${kind} already configured`\n summary(title, manual || dependenciesMissing ? 'warning' : 'success', [\n ` Packages ${packages()}`,\n ...configured.map((target) => styleText('green', ` + ${target.manifest.export}()`)),\n '',\n ...(!install ? [`Install ${specs.join(' ')} to use it.`] : []),\n ...(dependenciesMissing ? [`Missing plugins ${missing.map((target) => target.manifest.name).join(', ')}`] : []),\n manual ? 'Add the snippet above, then run kubb generate.' : 'Next kubb generate',\n `Options kubb.dev/extensions/${entry.id}`,\n ])\n } catch (error) {\n logError(getErrorMessage(error))\n summary('Add failed', 'failed', installedPackages.length ? [` Packages ${installedPackages.join(', ')} installed`] : [' No changes made'])\n process.exitCode = 1\n }\n}\n\nexport const command = define({\n name: 'add',\n description: 'Find and install plugins, adapters, and parsers from the Kubb registry.',\n examples: [\n 'kubb add',\n 'kubb add plugin-zod',\n 'kubb add kubb-labs/plugin-react-query',\n 'kubb add acme/plugin-x --yes',\n 'kubb add plugin-zod --no-install',\n ].join('\\n'),\n toKebab: true,\n args: {\n id: {\n type: 'positional',\n description: 'Registry id: owner/slug, or a slug for an official extension. Asked for when omitted',\n required: false,\n },\n ...configArg,\n ...yesArg,\n install: {\n type: 'boolean',\n description: 'Install the package. Pass --no-install to only edit the config',\n negatable: true,\n default: true,\n },\n },\n run: ({ values }) => run({ id: values.id, configPath: values.config, yes: values.yes, install: values.install }),\n})\n"],"mappings":"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"}
|