@kubb/cli 5.3.15 → 5.3.16
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/{connect-B4NIfpxC.cjs → connect-CYlbWNUk.cjs} +2 -2
- package/dist/{connect-B4NIfpxC.cjs.map → connect-CYlbWNUk.cjs.map} +1 -1
- package/dist/{connect-CgkbDN1-.js → connect-IObjkkpy.js} +2 -2
- package/dist/{connect-CgkbDN1-.js.map → connect-IObjkkpy.js.map} +1 -1
- package/dist/{generate-CGVdHu45.cjs → generate-By-otZHV.cjs} +2 -2
- package/dist/{generate-CGVdHu45.cjs.map → generate-By-otZHV.cjs.map} +1 -1
- package/dist/{generate-D3l-s7Vh.js → generate-RIE_QgE_.js} +2 -2
- package/dist/{generate-D3l-s7Vh.js.map → generate-RIE_QgE_.js.map} +1 -1
- package/dist/index.cjs +7 -7
- package/dist/index.js +7 -7
- package/dist/{init-BtNySVze.js → init-BTOW_efj.js} +2 -2
- package/dist/{init-BtNySVze.js.map → init-BTOW_efj.js.map} +1 -1
- package/dist/{init-B40Y8E7d.cjs → init-m87O7gWD.cjs} +2 -2
- package/dist/{init-B40Y8E7d.cjs.map → init-m87O7gWD.cjs.map} +1 -1
- package/dist/{login-VlfI9Xcv.js → login-CA_xoFp7.js} +2 -2
- package/dist/{login-VlfI9Xcv.js.map → login-CA_xoFp7.js.map} +1 -1
- package/dist/{login-CcYnvzn9.cjs → login-XpaX0zmW.cjs} +2 -2
- package/dist/{login-CcYnvzn9.cjs.map → login-XpaX0zmW.cjs.map} +1 -1
- package/dist/{logout-BNlPXi-7.js → logout-BRZyHSgy.js} +2 -2
- package/dist/{logout-BNlPXi-7.js.map → logout-BRZyHSgy.js.map} +1 -1
- package/dist/{logout-Bzlys_F2.cjs → logout-CzsW6zdv.cjs} +2 -2
- package/dist/{logout-Bzlys_F2.cjs.map → logout-CzsW6zdv.cjs.map} +1 -1
- package/dist/package-DjDsh9cp.js +6 -0
- package/dist/package-DjDsh9cp.js.map +1 -0
- package/dist/{package-Bd8xo-XX.cjs → package-DvqvX4iy.cjs} +2 -2
- package/dist/package-DvqvX4iy.cjs.map +1 -0
- package/dist/{run-2VumfVcx.js → run-BZr3INfK.js} +2 -2
- package/dist/{run-2VumfVcx.js.map → run-BZr3INfK.js.map} +1 -1
- package/dist/{run-DqZ334j3.cjs → run-BkpO4HyT.cjs} +3 -3
- package/dist/{run-DqZ334j3.cjs.map → run-BkpO4HyT.cjs.map} +1 -1
- package/dist/{run-BHMnPdul.js → run-DOOtoHGQ.js} +18 -19
- package/dist/run-DOOtoHGQ.js.map +1 -0
- package/dist/{run-CmB0Bnby.cjs → run-DQGHRxvY.cjs} +2 -2
- package/dist/{run-CmB0Bnby.cjs.map → run-DQGHRxvY.cjs.map} +1 -1
- package/dist/{run-DYmx4BUd.cjs → run-DY-3ONFZ.cjs} +17 -18
- package/dist/run-DY-3ONFZ.cjs.map +1 -0
- package/dist/{run-Dcv_CGTV.cjs → run-DjMd8cvr.cjs} +2 -2
- package/dist/{run-Dcv_CGTV.cjs.map → run-DjMd8cvr.cjs.map} +1 -1
- package/dist/{run-DyXw4hZU.js → run-Dy5NxCMm.js} +3 -3
- package/dist/{run-DyXw4hZU.js.map → run-Dy5NxCMm.js.map} +1 -1
- package/dist/{run-CqNGsZW4.js → run-jbHIvdOg.js} +2 -2
- package/dist/{run-CqNGsZW4.js.map → run-jbHIvdOg.js.map} +1 -1
- package/dist/{snapshot-CWZAiRmb.js → snapshot-Cv2GHK1Y.js} +79 -58
- package/dist/snapshot-Cv2GHK1Y.js.map +1 -0
- package/dist/{snapshot-C2dbvseU.cjs → snapshot-DJzr_LP8.cjs} +76 -55
- package/dist/snapshot-DJzr_LP8.cjs.map +1 -0
- package/dist/{status-D9O6D20d.cjs → status-BtXF2YAC.cjs} +2 -2
- package/dist/{status-D9O6D20d.cjs.map → status-BtXF2YAC.cjs.map} +1 -1
- package/dist/{status-CKhgk59o.js → status-DT1nKRUb.js} +2 -2
- package/dist/{status-CKhgk59o.js.map → status-DT1nKRUb.js.map} +1 -1
- package/dist/{studio-DFZKPTAs.js → studio-CwZBPZWN.js} +7 -7
- package/dist/{studio-DFZKPTAs.js.map → studio-CwZBPZWN.js.map} +1 -1
- package/dist/{studio-D_bRD3nc.cjs → studio-DDDkhrVO.cjs} +7 -7
- package/dist/{studio-D_bRD3nc.cjs.map → studio-DDDkhrVO.cjs.map} +1 -1
- package/dist/{utils-CyfAlK9G.cjs → utils-DqUNntyL.cjs} +34 -17
- package/dist/utils-DqUNntyL.cjs.map +1 -0
- package/dist/{utils-LvEYQf9I.js → utils-TpILNAy7.js} +29 -18
- package/dist/utils-TpILNAy7.js.map +1 -0
- package/package.json +7 -7
- package/dist/package-79jTR7nF.js +0 -6
- package/dist/package-79jTR7nF.js.map +0 -1
- package/dist/package-Bd8xo-XX.cjs.map +0 -1
- package/dist/run-BHMnPdul.js.map +0 -1
- package/dist/run-DYmx4BUd.cjs.map +0 -1
- package/dist/snapshot-C2dbvseU.cjs.map +0 -1
- package/dist/snapshot-CWZAiRmb.js.map +0 -1
- package/dist/utils-CyfAlK9G.cjs.map +0 -1
- package/dist/utils-LvEYQf9I.js.map +0 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import "./rolldown-runtime-C0LytTxp.js";
|
|
2
|
-
import { a as run, c as exists, l as read, n as createStudioOptions, r as loadConfigs } from "./run-
|
|
3
|
-
import {
|
|
2
|
+
import { a as run, c as exists, l as read, n as createStudioOptions, r as loadConfigs } from "./run-DOOtoHGQ.js";
|
|
3
|
+
import { d as createPlainLogger, u as setupReporters } from "./utils-TpILNAy7.js";
|
|
4
|
+
import { r as logBlock } from "./output-C_Gk4p-8.js";
|
|
4
5
|
import { styleText } from "node:util";
|
|
5
6
|
import process from "node:process";
|
|
6
7
|
import { dirname, join } from "node:path";
|
|
7
8
|
import { readFileSync } from "node:fs";
|
|
8
|
-
import { logLevel } from "@kubb/core";
|
|
9
|
-
import { createAgent,
|
|
9
|
+
import { cliReporter, logLevel } from "@kubb/core";
|
|
10
|
+
import { createAgent, createJob, machineTokenFrom, runConnection, waitForJob } from "@kubb/studio";
|
|
10
11
|
//#region src/runners/studio/ci.ts
|
|
11
12
|
function readGithubPullRequestNumber(eventPath) {
|
|
12
13
|
if (!eventPath) return;
|
|
@@ -29,21 +30,24 @@ function detectCi(env = process.env) {
|
|
|
29
30
|
const scope = pullRequestNumber ?? env.GITHUB_RUN_ID ?? "";
|
|
30
31
|
return {
|
|
31
32
|
id: `gh:${repositoryId}:${scope}`,
|
|
32
|
-
name: `${env.GITHUB_REPOSITORY ?? "github"}#${scope}
|
|
33
|
+
name: `${env.GITHUB_REPOSITORY ?? "github"}#${scope}`,
|
|
34
|
+
commit: env.GITHUB_SHA
|
|
33
35
|
};
|
|
34
36
|
}
|
|
35
37
|
if (env.GITLAB_CI) {
|
|
36
38
|
const scope = env.CI_MERGE_REQUEST_IID ?? env.CI_COMMIT_REF_SLUG ?? "";
|
|
37
39
|
return {
|
|
38
40
|
id: `gl:${env.CI_PROJECT_ID ?? ""}:${scope}`,
|
|
39
|
-
name: `${env.CI_PROJECT_PATH ?? "gitlab"}#${scope}
|
|
41
|
+
name: `${env.CI_PROJECT_PATH ?? "gitlab"}#${scope}`,
|
|
42
|
+
commit: env.CI_COMMIT_SHA
|
|
40
43
|
};
|
|
41
44
|
}
|
|
42
45
|
if (env.BITBUCKET_BUILD_NUMBER) {
|
|
43
46
|
const scope = env.BITBUCKET_PR_ID ?? env.BITBUCKET_BRANCH ?? "";
|
|
44
47
|
return {
|
|
45
48
|
id: `bb:${env.BITBUCKET_REPO_UUID ?? ""}:${scope}`,
|
|
46
|
-
name: `${env.BITBUCKET_REPO_FULL_NAME ?? "bitbucket"}#${scope}
|
|
49
|
+
name: `${env.BITBUCKET_REPO_FULL_NAME ?? "bitbucket"}#${scope}`,
|
|
50
|
+
commit: env.BITBUCKET_COMMIT
|
|
47
51
|
};
|
|
48
52
|
}
|
|
49
53
|
if (env.CIRCLECI) {
|
|
@@ -52,7 +56,8 @@ function detectCi(env = process.env) {
|
|
|
52
56
|
const scope = env.CIRCLE_PR_NUMBER ?? env.CIRCLE_BRANCH ?? "";
|
|
53
57
|
return {
|
|
54
58
|
id: `circle:${owner}:${project}:${scope}`,
|
|
55
|
-
name: `${owner ? `${owner}/` : ""}${project}#${scope}
|
|
59
|
+
name: `${owner ? `${owner}/` : ""}${project}#${scope}`,
|
|
60
|
+
commit: env.CIRCLE_SHA1
|
|
56
61
|
};
|
|
57
62
|
}
|
|
58
63
|
return null;
|
|
@@ -111,7 +116,8 @@ function resolveCiIdentity(options) {
|
|
|
111
116
|
const detected = detectCi();
|
|
112
117
|
if (options.id) return {
|
|
113
118
|
id: options.id,
|
|
114
|
-
name: detected?.name ?? options.id
|
|
119
|
+
name: detected?.name ?? options.id,
|
|
120
|
+
commit: detected?.commit
|
|
115
121
|
};
|
|
116
122
|
if (!detected) throw new Error("Could not detect a supported CI provider (GitHub Actions, GitLab CI, Bitbucket Pipelines, CircleCI). Pass --id.");
|
|
117
123
|
return detected;
|
|
@@ -139,14 +145,27 @@ function toResult(studioUrl, snapshot, agentSlug) {
|
|
|
139
145
|
url: absoluteUrl(studioUrl, snapshot.url),
|
|
140
146
|
snapshotIdUrl: absoluteUrl(studioUrl, snapshot.snapshotIdUrl),
|
|
141
147
|
expiresAt: snapshot.expiresAt,
|
|
142
|
-
agentUrl: absoluteUrl(studioUrl, `/agents/${agentSlug}`)
|
|
148
|
+
agentUrl: absoluteUrl(studioUrl, `/agents/${agentSlug}`),
|
|
149
|
+
changes: snapshot.changes
|
|
143
150
|
};
|
|
144
151
|
}
|
|
152
|
+
/** One summary line: how many files changed, and since which run. */
|
|
153
|
+
function formatChanges(changes) {
|
|
154
|
+
if (!changes.base) return "First snapshot";
|
|
155
|
+
const counts = [
|
|
156
|
+
`${changes.added.length} added`,
|
|
157
|
+
`${changes.changed.length} changed`,
|
|
158
|
+
`${changes.removed.length} removed`
|
|
159
|
+
].join(", ");
|
|
160
|
+
const since = changes.base.commit ? changes.base.commit.slice(0, 7) : changes.base.createdAt;
|
|
161
|
+
return changes.added.length + changes.changed.length + changes.removed.length ? `${counts} since ${since}` : `No changes since ${since}`;
|
|
162
|
+
}
|
|
145
163
|
function printSummary(result) {
|
|
146
164
|
logBlock([
|
|
147
165
|
`${styleText("dim", "Package".padEnd(10))} ${result.name ?? "(unnamed)"}@${result.version ?? "0.0.0"}`,
|
|
148
166
|
`${styleText("dim", "Tarball".padEnd(10))} ${styleText("cyan", result.url)}`,
|
|
149
167
|
`${styleText("dim", "Agent".padEnd(10))} ${result.agentUrl}`,
|
|
168
|
+
...result.changes ? [`${styleText("dim", "Changes".padEnd(10))} ${formatChanges(result.changes)}`] : [],
|
|
150
169
|
`${styleText("dim", "Expires".padEnd(10))} ${result.expiresAt}`
|
|
151
170
|
]);
|
|
152
171
|
}
|
|
@@ -162,84 +181,86 @@ async function snapshot(options) {
|
|
|
162
181
|
const { configPath } = await loadConfigs(options);
|
|
163
182
|
const ci = resolveCiIdentity(options);
|
|
164
183
|
const { name, version: packageVersion } = await resolvePackageMetadata(options);
|
|
184
|
+
const logLevel$1 = logLevel[options.logLevel ?? "info"];
|
|
165
185
|
process.env.KUBB_AGENT_SECRET = ci.id;
|
|
166
|
-
const
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
spinner?.message(message);
|
|
186
|
+
const write = options.json ? (line) => console.error(line) : (line) => console.log(line);
|
|
187
|
+
const logger = createPlainLogger(write);
|
|
188
|
+
const step = (message) => {
|
|
189
|
+
if (logLevel$1 > logLevel.silent) write(message);
|
|
173
190
|
};
|
|
174
|
-
|
|
175
|
-
if (!options.json) spinner?.start("Creating Kubb Studio agent");
|
|
191
|
+
step("Creating Kubb Studio agent");
|
|
176
192
|
const agent = await createAgent({
|
|
177
193
|
studioUrl: options.studioUrl,
|
|
178
194
|
token,
|
|
179
195
|
name: ci.name,
|
|
180
196
|
machineToken: machineTokenFrom(ci.id)
|
|
181
197
|
});
|
|
182
|
-
const { promise: ready,
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
token: agent.token,
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
198
|
+
const { promise: ready, resolve: markReady } = Promise.withResolvers();
|
|
199
|
+
const shutdown = new AbortController();
|
|
200
|
+
const lost = runConnection({
|
|
201
|
+
credentials: { token: agent.token },
|
|
202
|
+
signal: shutdown.signal,
|
|
203
|
+
clientOptions: () => ({
|
|
204
|
+
studioUrl: options.studioUrl,
|
|
205
|
+
configPath,
|
|
206
|
+
root: process.cwd(),
|
|
207
|
+
version: options.version,
|
|
208
|
+
permissions: options.permission,
|
|
209
|
+
loadConfig: async () => (await loadConfigs(options)).config,
|
|
210
|
+
installLogger: async (hooks) => {
|
|
211
|
+
await setupReporters(hooks, {
|
|
212
|
+
logLevel: logLevel$1,
|
|
213
|
+
reporters: [cliReporter],
|
|
214
|
+
logger
|
|
215
|
+
});
|
|
216
|
+
hooks.hook("studio:ready", () => markReady());
|
|
217
|
+
}
|
|
218
|
+
}),
|
|
219
|
+
onTokenRejected: ({ error }) => Promise.reject(error)
|
|
220
|
+
}).then(() => Promise.reject(/* @__PURE__ */ new Error("The Kubb Studio connection ended before the snapshot finished")));
|
|
221
|
+
lost.catch(() => {});
|
|
204
222
|
try {
|
|
205
|
-
let
|
|
223
|
+
let readyTimeout;
|
|
206
224
|
try {
|
|
207
|
-
await Promise.race([
|
|
208
|
-
|
|
209
|
-
|
|
225
|
+
await Promise.race([
|
|
226
|
+
ready,
|
|
227
|
+
lost,
|
|
228
|
+
new Promise((_, reject) => {
|
|
229
|
+
readyTimeout = setTimeout(() => reject(/* @__PURE__ */ new Error("Timed out waiting for Kubb Studio to confirm the agent was ready")), READY_TIMEOUT_MS);
|
|
230
|
+
})
|
|
231
|
+
]);
|
|
210
232
|
} finally {
|
|
211
|
-
clearTimeout(
|
|
233
|
+
clearTimeout(readyTimeout);
|
|
212
234
|
}
|
|
213
|
-
|
|
235
|
+
step("Creating snapshot job");
|
|
214
236
|
const job = await createJob({
|
|
215
237
|
studioUrl: options.studioUrl,
|
|
216
238
|
token,
|
|
217
239
|
type: "snapshot",
|
|
218
240
|
agentId: agent.id,
|
|
219
241
|
name,
|
|
220
|
-
version: packageVersion
|
|
242
|
+
version: packageVersion,
|
|
243
|
+
commit: ci.commit
|
|
221
244
|
});
|
|
222
|
-
|
|
223
|
-
const finished = await waitForJob({
|
|
245
|
+
step(`Snapshot job queued: ${job.id}`);
|
|
246
|
+
const finished = await Promise.race([waitForJob({
|
|
224
247
|
studioUrl: options.studioUrl,
|
|
225
248
|
token,
|
|
226
249
|
id: job.id,
|
|
227
250
|
timeoutMs
|
|
228
|
-
});
|
|
251
|
+
}), lost]);
|
|
229
252
|
if (finished.status === "failed") throw new Error(finished.error ?? "Snapshot job failed");
|
|
230
253
|
if (!finished.snapshot) throw new Error("Snapshot job succeeded without a snapshot");
|
|
231
254
|
const result = toResult(options.studioUrl, finished.snapshot, agent.slug);
|
|
232
|
-
|
|
233
|
-
if (!options.json) spinner?.stop("Snapshot published");
|
|
255
|
+
step("Snapshot published");
|
|
234
256
|
if (options.json) console.log(JSON.stringify(result));
|
|
235
257
|
if (!options.json) printSummary(result);
|
|
236
258
|
} catch (error) {
|
|
237
|
-
|
|
238
|
-
if (!options.json) spinner?.stop("Snapshot failed");
|
|
259
|
+
step("Snapshot failed");
|
|
239
260
|
throw error;
|
|
240
261
|
} finally {
|
|
241
|
-
|
|
242
|
-
|
|
262
|
+
step("Disconnecting from Kubb Studio");
|
|
263
|
+
shutdown.abort();
|
|
243
264
|
}
|
|
244
265
|
}
|
|
245
266
|
const runner = async ({ values }) => {
|
|
@@ -257,4 +278,4 @@ const runner = async ({ values }) => {
|
|
|
257
278
|
//#endregion
|
|
258
279
|
export { runner };
|
|
259
280
|
|
|
260
|
-
//# sourceMappingURL=snapshot-
|
|
281
|
+
//# sourceMappingURL=snapshot-Cv2GHK1Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-Cv2GHK1Y.js","names":["logLevel","logLevelMap"],"sources":["../src/runners/studio/ci.ts","../src/runners/studio/snapshot.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport process from 'node:process'\n\n/**\n * Stable identity for the CI agent a snapshot run registers or reuses.\n */\nexport type CiContext = {\n /**\n * Fed into the machine token, so the same merge or pull request reuses one agent.\n */\n id: string\n /**\n * Agent display name shown in Studio.\n */\n name: string\n /** The commit this run builds, so the next snapshot can diff against it. */\n commit?: string\n}\n\nfunction readGithubPullRequestNumber(eventPath: string | undefined): string | undefined {\n if (!eventPath) {\n return undefined\n }\n\n try {\n const event = JSON.parse(readFileSync(eventPath, 'utf8')) as { pull_request?: { number?: number } }\n return event.pull_request?.number ? String(event.pull_request.number) : undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * Detects the CI provider from its environment variables and derives a stable identity from it.\n * The GitHub row reproduces `gh:<repositoryId>:<prNumber>`, the identity `kubb-labs/action` has\n * always registered agents under, so an existing repository keeps reusing its agent.\n */\nexport function detectCi(env: Record<string, string | undefined> = process.env): CiContext | null {\n if (env.GITHUB_ACTIONS) {\n const pullRequestNumber = readGithubPullRequestNumber(env.GITHUB_EVENT_PATH)\n const repositoryId = env.GITHUB_REPOSITORY_ID ?? env.GITHUB_REPOSITORY ?? ''\n const scope = pullRequestNumber ?? env.GITHUB_RUN_ID ?? ''\n\n return { id: `gh:${repositoryId}:${scope}`, name: `${env.GITHUB_REPOSITORY ?? 'github'}#${scope}`, commit: env.GITHUB_SHA }\n }\n\n if (env.GITLAB_CI) {\n const scope = env.CI_MERGE_REQUEST_IID ?? env.CI_COMMIT_REF_SLUG ?? ''\n\n return { id: `gl:${env.CI_PROJECT_ID ?? ''}:${scope}`, name: `${env.CI_PROJECT_PATH ?? 'gitlab'}#${scope}`, commit: env.CI_COMMIT_SHA }\n }\n\n if (env.BITBUCKET_BUILD_NUMBER) {\n const scope = env.BITBUCKET_PR_ID ?? env.BITBUCKET_BRANCH ?? ''\n\n return { id: `bb:${env.BITBUCKET_REPO_UUID ?? ''}:${scope}`, name: `${env.BITBUCKET_REPO_FULL_NAME ?? 'bitbucket'}#${scope}`, commit: env.BITBUCKET_COMMIT }\n }\n\n if (env.CIRCLECI) {\n // Owner-qualified: two projects with the same name under different CircleCI orgs must not\n // collide on one agent, since registering it purges the other project's live sessions.\n const owner = env.CIRCLE_PROJECT_USERNAME ?? ''\n const project = env.CIRCLE_PROJECT_REPONAME ?? 'circleci'\n const scope = env.CIRCLE_PR_NUMBER ?? env.CIRCLE_BRANCH ?? ''\n\n return { id: `circle:${owner}:${project}:${scope}`, name: `${owner ? `${owner}/` : ''}${project}#${scope}`, commit: env.CIRCLE_SHA1 }\n }\n\n return null\n}\n","import { dirname, join } from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport { exists, read } from '@internals/utils'\nimport { cliReporter, logLevel as logLevelMap } from '@kubb/core'\nimport { createAgent, createJob, machineTokenFrom, runConnection, waitForJob, type StudioSnapshot, type StudioSnapshotChanges } from '@kubb/studio'\nimport { logBlock } from '../../loggers/output.ts'\nimport { createPlainLogger } from '../../loggers/plainLogger.ts'\nimport setupReporters from '../../loggers/utils.ts'\nimport { type CiContext, detectCi } from './ci.ts'\nimport { createStudioOptions, loadConfigs, run, type SnapshotOptions } from './run.ts'\nimport type { definition } from '../../commands/studio/snapshot.ts'\nimport type { CommandRunner } from 'gunshi'\n\n/**\n * How long to wait for Studio's `studio:ready` acknowledgement, above the client's own 10s\n * handshake-ack timeout.\n */\nconst READY_TIMEOUT_MS = 15_000\n\n/**\n * Longest `--timeout` accepted. Job records expire from Studio's storage after an hour.\n */\nconst MAX_TIMEOUT_SECONDS = 3600\n\nconst LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1'])\n\nasync function findPackageJson(startDirectory: string): Promise<{ name: string; version: string }> {\n let directory = startDirectory\n\n for (;;) {\n const file = join(directory, 'package.json')\n\n if (await exists(file)) {\n const packageJson = JSON.parse(await read(file)) as Partial<{ name: string; version: string }>\n\n if (packageJson.name && packageJson.version) {\n return { name: packageJson.name, version: packageJson.version }\n }\n }\n\n const parent = dirname(directory)\n\n if (parent === directory) {\n break\n }\n\n directory = parent\n }\n\n throw new Error(`No package.json with a name and a version found above ${startDirectory}`)\n}\n\n/** Reads package.json only for whichever of name/version --name and --version did not supply. */\nasync function resolvePackageMetadata(options: SnapshotOptions): Promise<{ name: string; version: string }> {\n if (options.name && options.packageVersion) {\n return { name: options.name, version: options.packageVersion }\n }\n\n const packageMetadata = await findPackageJson(process.cwd())\n\n return { name: options.name ?? packageMetadata.name, version: options.packageVersion ?? packageMetadata.version }\n}\n\nfunction resolveToken(options: SnapshotOptions): string {\n const token = options.token ?? process.env.KUBB_TOKEN\n\n if (!token) {\n throw new Error('An organization CI API key is required. Pass --token or set KUBB_TOKEN.')\n }\n\n return token\n}\n\nfunction resolveCiIdentity(options: SnapshotOptions): CiContext {\n const detected = detectCi()\n\n if (options.id) {\n return { id: options.id, name: detected?.name ?? options.id, commit: detected?.commit }\n }\n\n if (!detected) {\n throw new Error('Could not detect a supported CI provider (GitHub Actions, GitLab CI, Bitbucket Pipelines, CircleCI). Pass --id.')\n }\n\n return detected\n}\n\n/** Rejects a bad `--timeout` up front instead of letting it reach `waitForJob` as NaN or <= 0. */\nfunction resolveTimeoutMs(options: SnapshotOptions): number {\n const seconds = options.timeout ?? 600\n\n if (!Number.isFinite(seconds) || seconds <= 0) {\n throw new Error('--timeout must be a positive number of seconds')\n }\n\n return Math.min(seconds, MAX_TIMEOUT_SECONDS) * 1000\n}\n\n/** The CI key is a credential, so refuse to send it anywhere but HTTPS or a loopback dev host. */\nfunction assertSecureStudioUrl(studioUrl: string): void {\n const url = new URL(studioUrl)\n\n if (url.protocol !== 'https:' && !LOOPBACK_HOSTS.has(url.hostname)) {\n throw new Error(`Refusing to send the CI API key to ${studioUrl}. Use an https:// Studio URL, or a loopback host for local development.`)\n }\n}\n\nfunction absoluteUrl(studioUrl: string, path: string): string {\n return new URL(path, `${studioUrl}/`).toString()\n}\n\ntype SnapshotResult = {\n id: string\n name: string | null\n version: string | null\n integrity: string | null\n url: string\n snapshotIdUrl: string\n expiresAt: string\n agentUrl: string\n /** What changed since the previous snapshot of this package on this agent. */\n changes?: StudioSnapshotChanges\n}\n\nfunction toResult(studioUrl: string, snapshot: StudioSnapshot, agentSlug: string): SnapshotResult {\n return {\n id: snapshot.id,\n name: snapshot.name,\n version: snapshot.version,\n integrity: snapshot.integrity,\n url: absoluteUrl(studioUrl, snapshot.url),\n snapshotIdUrl: absoluteUrl(studioUrl, snapshot.snapshotIdUrl),\n expiresAt: snapshot.expiresAt,\n agentUrl: absoluteUrl(studioUrl, `/agents/${agentSlug}`),\n changes: snapshot.changes,\n }\n}\n\n/** One summary line: how many files changed, and since which run. */\nexport function formatChanges(changes: StudioSnapshotChanges): string {\n if (!changes.base) {\n return 'First snapshot'\n }\n\n const counts = [`${changes.added.length} added`, `${changes.changed.length} changed`, `${changes.removed.length} removed`].join(', ')\n const since = changes.base.commit ? changes.base.commit.slice(0, 7) : changes.base.createdAt\n\n return changes.added.length + changes.changed.length + changes.removed.length ? `${counts} since ${since}` : `No changes since ${since}`\n}\n\nfunction printSummary(result: SnapshotResult): void {\n logBlock([\n `${styleText('dim', 'Package'.padEnd(10))} ${result.name ?? '(unnamed)'}@${result.version ?? '0.0.0'}`,\n `${styleText('dim', 'Tarball'.padEnd(10))} ${styleText('cyan', result.url)}`,\n `${styleText('dim', 'Agent'.padEnd(10))} ${result.agentUrl}`,\n ...(result.changes ? [`${styleText('dim', 'Changes'.padEnd(10))} ${formatChanges(result.changes)}`] : []),\n `${styleText('dim', 'Expires'.padEnd(10))} ${result.expiresAt}`,\n ])\n}\n\n/**\n * Generates a Kubb Studio snapshot from a script: registers or reuses a CI agent, connects it,\n * queues a snapshot job, and polls until the tarball is ready. A snapshot job runs generation and\n * packs the tarball in one step, so this needs no separate generation run.\n */\nexport async function snapshot(options: SnapshotOptions): Promise<void> {\n const timeoutMs = resolveTimeoutMs(options)\n const token = resolveToken(options)\n assertSecureStudioUrl(options.studioUrl)\n const { configPath } = await loadConfigs(options)\n const ci = resolveCiIdentity(options)\n const { name, version: packageVersion } = await resolvePackageMetadata(options)\n const logLevel = logLevelMap[options.logLevel ?? 'info']\n\n // Set before the first `getMachineToken()` call (inside the connection), so the WebSocket\n // session registers under the same machine token `createAgent` just registered with Studio.\n process.env.KUBB_AGENT_SECRET = ci.id\n\n const write = options.json ? (line: string) => console.error(line) : (line: string) => console.log(line)\n const logger = createPlainLogger(write)\n const step = (message: string) => {\n if (logLevel > logLevelMap.silent) {\n write(message)\n }\n }\n\n step('Creating Kubb Studio agent')\n\n const agent = await createAgent({ studioUrl: options.studioUrl, token, name: ci.name, machineToken: machineTokenFrom(ci.id) })\n\n const { promise: ready, resolve: markReady } = Promise.withResolvers<void>()\n const shutdown = new AbortController()\n\n const connection = runConnection({\n credentials: { token: agent.token },\n signal: shutdown.signal,\n clientOptions: () => ({\n studioUrl: options.studioUrl,\n configPath,\n root: process.cwd(),\n version: options.version,\n // Flags only: a script is never prompted and never reuses a saved answer.\n permissions: options.permission,\n loadConfig: async () => (await loadConfigs(options)).config,\n installLogger: async (hooks) => {\n await setupReporters(hooks, { logLevel, reporters: [cliReporter], logger })\n hooks.hook('studio:ready', () => markReady())\n },\n }),\n // A CI agent's token comes from the organization key, so there is no pairing to fall back to.\n onTokenRejected: ({ error }) => Promise.reject(error),\n })\n const lost = connection.then(() => Promise.reject(new Error('The Kubb Studio connection ended before the snapshot finished')))\n void lost.catch(() => {})\n\n try {\n let readyTimeout: ReturnType<typeof setTimeout> | undefined\n try {\n await Promise.race([\n ready,\n lost,\n new Promise<never>((_, reject) => {\n readyTimeout = setTimeout(() => reject(new Error('Timed out waiting for Kubb Studio to confirm the agent was ready')), READY_TIMEOUT_MS)\n }),\n ])\n } finally {\n clearTimeout(readyTimeout)\n }\n\n step('Creating snapshot job')\n\n const job = await createJob({ studioUrl: options.studioUrl, token, type: 'snapshot', agentId: agent.id, name, version: packageVersion, commit: ci.commit })\n step(`Snapshot job queued: ${job.id}`)\n const finished = await Promise.race([waitForJob({ studioUrl: options.studioUrl, token, id: job.id, timeoutMs }), lost])\n\n if (finished.status === 'failed') {\n throw new Error(finished.error ?? 'Snapshot job failed')\n }\n\n if (!finished.snapshot) {\n throw new Error('Snapshot job succeeded without a snapshot')\n }\n\n const result = toResult(options.studioUrl, finished.snapshot, agent.slug)\n\n step('Snapshot published')\n\n if (options.json) {\n console.log(JSON.stringify(result))\n }\n if (!options.json) {\n printSummary(result)\n }\n } catch (error) {\n step('Snapshot failed')\n throw error\n } finally {\n step('Disconnecting from Kubb Studio')\n // Not awaited: a half-open socket must not hold the run open.\n shutdown.abort()\n }\n}\n\nexport const runner: CommandRunner<{ args: typeof definition.args; extensions: {} }> = async ({ values }) => {\n const options: SnapshotOptions = {\n ...createStudioOptions(values),\n token: values.token,\n id: values.id,\n name: values.name,\n packageVersion: values.packageVersion,\n timeout: values.timeout,\n json: values.json,\n }\n await run(options, () => snapshot(options), { json: options.json })\n}\n"],"mappings":";;;;;;;;;;;AAmBA,SAAS,4BAA4B,WAAmD;CACtF,IAAI,CAAC,WACH;CAGF,IAAI;EACF,MAAM,QAAQ,KAAK,MAAM,aAAa,WAAW,MAAM,CAAC;EACxD,OAAO,MAAM,cAAc,SAAS,OAAO,MAAM,aAAa,MAAM,IAAI,KAAA;CAC1E,QAAQ;EACN;CACF;AACF;;;;;;AAOA,SAAgB,SAAS,MAA0C,QAAQ,KAAuB;CAChG,IAAI,IAAI,gBAAgB;EACtB,MAAM,oBAAoB,4BAA4B,IAAI,iBAAiB;EAC3E,MAAM,eAAe,IAAI,wBAAwB,IAAI,qBAAqB;EAC1E,MAAM,QAAQ,qBAAqB,IAAI,iBAAiB;EAExD,OAAO;GAAE,IAAI,MAAM,aAAa,GAAG;GAAS,MAAM,GAAG,IAAI,qBAAqB,SAAS,GAAG;GAAS,QAAQ,IAAI;EAAW;CAC5H;CAEA,IAAI,IAAI,WAAW;EACjB,MAAM,QAAQ,IAAI,wBAAwB,IAAI,sBAAsB;EAEpE,OAAO;GAAE,IAAI,MAAM,IAAI,iBAAiB,GAAG,GAAG;GAAS,MAAM,GAAG,IAAI,mBAAmB,SAAS,GAAG;GAAS,QAAQ,IAAI;EAAc;CACxI;CAEA,IAAI,IAAI,wBAAwB;EAC9B,MAAM,QAAQ,IAAI,mBAAmB,IAAI,oBAAoB;EAE7D,OAAO;GAAE,IAAI,MAAM,IAAI,uBAAuB,GAAG,GAAG;GAAS,MAAM,GAAG,IAAI,4BAA4B,YAAY,GAAG;GAAS,QAAQ,IAAI;EAAiB;CAC7J;CAEA,IAAI,IAAI,UAAU;EAGhB,MAAM,QAAQ,IAAI,2BAA2B;EAC7C,MAAM,UAAU,IAAI,2BAA2B;EAC/C,MAAM,QAAQ,IAAI,oBAAoB,IAAI,iBAAiB;EAE3D,OAAO;GAAE,IAAI,UAAU,MAAM,GAAG,QAAQ,GAAG;GAAS,MAAM,GAAG,QAAQ,GAAG,MAAM,KAAK,KAAK,QAAQ,GAAG;GAAS,QAAQ,IAAI;EAAY;CACtI;CAEA,OAAO;AACT;;;;;;;ACnDA,MAAM,mBAAmB;;;;AAKzB,MAAM,sBAAsB;AAE5B,MAAM,iCAAiB,IAAI,IAAI;CAAC;CAAa;CAAa;AAAK,CAAC;AAEhE,eAAe,gBAAgB,gBAAoE;CACjG,IAAI,YAAY;CAEhB,SAAS;EACP,MAAM,OAAO,KAAK,WAAW,cAAc;EAE3C,IAAI,MAAM,OAAO,IAAI,GAAG;GACtB,MAAM,cAAc,KAAK,MAAM,MAAM,KAAK,IAAI,CAAC;GAE/C,IAAI,YAAY,QAAQ,YAAY,SAClC,OAAO;IAAE,MAAM,YAAY;IAAM,SAAS,YAAY;GAAQ;EAElE;EAEA,MAAM,SAAS,QAAQ,SAAS;EAEhC,IAAI,WAAW,WACb;EAGF,YAAY;CACd;CAEA,MAAM,IAAI,MAAM,yDAAyD,gBAAgB;AAC3F;;AAGA,eAAe,uBAAuB,SAAsE;CAC1G,IAAI,QAAQ,QAAQ,QAAQ,gBAC1B,OAAO;EAAE,MAAM,QAAQ;EAAM,SAAS,QAAQ;CAAe;CAG/D,MAAM,kBAAkB,MAAM,gBAAgB,QAAQ,IAAI,CAAC;CAE3D,OAAO;EAAE,MAAM,QAAQ,QAAQ,gBAAgB;EAAM,SAAS,QAAQ,kBAAkB,gBAAgB;CAAQ;AAClH;AAEA,SAAS,aAAa,SAAkC;CACtD,MAAM,QAAQ,QAAQ,SAAS,QAAQ,IAAI;CAE3C,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,yEAAyE;CAG3F,OAAO;AACT;AAEA,SAAS,kBAAkB,SAAqC;CAC9D,MAAM,WAAW,SAAS;CAE1B,IAAI,QAAQ,IACV,OAAO;EAAE,IAAI,QAAQ;EAAI,MAAM,UAAU,QAAQ,QAAQ;EAAI,QAAQ,UAAU;CAAO;CAGxF,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,iHAAiH;CAGnI,OAAO;AACT;;AAGA,SAAS,iBAAiB,SAAkC;CAC1D,MAAM,UAAU,QAAQ,WAAW;CAEnC,IAAI,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,GAC1C,MAAM,IAAI,MAAM,gDAAgD;CAGlE,OAAO,KAAK,IAAI,SAAS,mBAAmB,IAAI;AAClD;;AAGA,SAAS,sBAAsB,WAAyB;CACtD,MAAM,MAAM,IAAI,IAAI,SAAS;CAE7B,IAAI,IAAI,aAAa,YAAY,CAAC,eAAe,IAAI,IAAI,QAAQ,GAC/D,MAAM,IAAI,MAAM,sCAAsC,UAAU,wEAAwE;AAE5I;AAEA,SAAS,YAAY,WAAmB,MAAsB;CAC5D,OAAO,IAAI,IAAI,MAAM,GAAG,UAAU,EAAE,CAAC,CAAC,SAAS;AACjD;AAeA,SAAS,SAAS,WAAmB,UAA0B,WAAmC;CAChG,OAAO;EACL,IAAI,SAAS;EACb,MAAM,SAAS;EACf,SAAS,SAAS;EAClB,WAAW,SAAS;EACpB,KAAK,YAAY,WAAW,SAAS,GAAG;EACxC,eAAe,YAAY,WAAW,SAAS,aAAa;EAC5D,WAAW,SAAS;EACpB,UAAU,YAAY,WAAW,WAAW,WAAW;EACvD,SAAS,SAAS;CACpB;AACF;;AAGA,SAAgB,cAAc,SAAwC;CACpE,IAAI,CAAC,QAAQ,MACX,OAAO;CAGT,MAAM,SAAS;EAAC,GAAG,QAAQ,MAAM,OAAO;EAAS,GAAG,QAAQ,QAAQ,OAAO;EAAW,GAAG,QAAQ,QAAQ,OAAO;CAAS,CAAC,CAAC,KAAK,IAAI;CACpI,MAAM,QAAQ,QAAQ,KAAK,SAAS,QAAQ,KAAK,OAAO,MAAM,GAAG,CAAC,IAAI,QAAQ,KAAK;CAEnF,OAAO,QAAQ,MAAM,SAAS,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,SAAS,GAAG,OAAO,SAAS,UAAU,oBAAoB;AACnI;AAEA,SAAS,aAAa,QAA8B;CAClD,SAAS;EACP,GAAG,UAAU,OAAO,UAAU,OAAO,EAAE,CAAC,EAAE,IAAI,OAAO,QAAQ,YAAY,GAAG,OAAO,WAAW;EAC9F,GAAG,UAAU,OAAO,UAAU,OAAO,EAAE,CAAC,EAAE,IAAI,UAAU,QAAQ,OAAO,GAAG;EAC1E,GAAG,UAAU,OAAO,QAAQ,OAAO,EAAE,CAAC,EAAE,IAAI,OAAO;EACnD,GAAI,OAAO,UAAU,CAAC,GAAG,UAAU,OAAO,UAAU,OAAO,EAAE,CAAC,EAAE,IAAI,cAAc,OAAO,OAAO,GAAG,IAAI,CAAC;EACxG,GAAG,UAAU,OAAO,UAAU,OAAO,EAAE,CAAC,EAAE,IAAI,OAAO;CACvD,CAAC;AACH;;;;;;AAOA,eAAsB,SAAS,SAAyC;CACtE,MAAM,YAAY,iBAAiB,OAAO;CAC1C,MAAM,QAAQ,aAAa,OAAO;CAClC,sBAAsB,QAAQ,SAAS;CACvC,MAAM,EAAE,eAAe,MAAM,YAAY,OAAO;CAChD,MAAM,KAAK,kBAAkB,OAAO;CACpC,MAAM,EAAE,MAAM,SAAS,mBAAmB,MAAM,uBAAuB,OAAO;CAC9E,MAAMA,aAAWC,SAAY,QAAQ,YAAY;CAIjD,QAAQ,IAAI,oBAAoB,GAAG;CAEnC,MAAM,QAAQ,QAAQ,QAAQ,SAAiB,QAAQ,MAAM,IAAI,KAAK,SAAiB,QAAQ,IAAI,IAAI;CACvG,MAAM,SAAS,kBAAkB,KAAK;CACtC,MAAM,QAAQ,YAAoB;EAChC,IAAID,aAAWC,SAAY,QACzB,MAAM,OAAO;CAEjB;CAEA,KAAK,4BAA4B;CAEjC,MAAM,QAAQ,MAAM,YAAY;EAAE,WAAW,QAAQ;EAAW;EAAO,MAAM,GAAG;EAAM,cAAc,iBAAiB,GAAG,EAAE;CAAE,CAAC;CAE7H,MAAM,EAAE,SAAS,OAAO,SAAS,cAAc,QAAQ,cAAoB;CAC3E,MAAM,WAAW,IAAI,gBAAgB;CAqBrC,MAAM,OAnBa,cAAc;EAC/B,aAAa,EAAE,OAAO,MAAM,MAAM;EAClC,QAAQ,SAAS;EACjB,sBAAsB;GACpB,WAAW,QAAQ;GACnB;GACA,MAAM,QAAQ,IAAI;GAClB,SAAS,QAAQ;GAEjB,aAAa,QAAQ;GACrB,YAAY,aAAa,MAAM,YAAY,OAAO,EAAA,CAAG;GACrD,eAAe,OAAO,UAAU;IAC9B,MAAM,eAAe,OAAO;KAAE,UAAA;KAAU,WAAW,CAAC,WAAW;KAAG;IAAO,CAAC;IAC1E,MAAM,KAAK,sBAAsB,UAAU,CAAC;GAC9C;EACF;EAEA,kBAAkB,EAAE,YAAY,QAAQ,OAAO,KAAK;CACtD,CACsB,CAAC,CAAC,WAAW,QAAQ,uBAAO,IAAI,MAAM,+DAA+D,CAAC,CAAC;CAC7H,KAAU,YAAY,CAAC,CAAC;CAExB,IAAI;EACF,IAAI;EACJ,IAAI;GACF,MAAM,QAAQ,KAAK;IACjB;IACA;IACA,IAAI,SAAgB,GAAG,WAAW;KAChC,eAAe,iBAAiB,uBAAO,IAAI,MAAM,kEAAkE,CAAC,GAAG,gBAAgB;IACzI,CAAC;GACH,CAAC;EACH,UAAU;GACR,aAAa,YAAY;EAC3B;EAEA,KAAK,uBAAuB;EAE5B,MAAM,MAAM,MAAM,UAAU;GAAE,WAAW,QAAQ;GAAW;GAAO,MAAM;GAAY,SAAS,MAAM;GAAI;GAAM,SAAS;GAAgB,QAAQ,GAAG;EAAO,CAAC;EAC1J,KAAK,wBAAwB,IAAI,IAAI;EACrC,MAAM,WAAW,MAAM,QAAQ,KAAK,CAAC,WAAW;GAAE,WAAW,QAAQ;GAAW;GAAO,IAAI,IAAI;GAAI;EAAU,CAAC,GAAG,IAAI,CAAC;EAEtH,IAAI,SAAS,WAAW,UACtB,MAAM,IAAI,MAAM,SAAS,SAAS,qBAAqB;EAGzD,IAAI,CAAC,SAAS,UACZ,MAAM,IAAI,MAAM,2CAA2C;EAG7D,MAAM,SAAS,SAAS,QAAQ,WAAW,SAAS,UAAU,MAAM,IAAI;EAExE,KAAK,oBAAoB;EAEzB,IAAI,QAAQ,MACV,QAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;EAEpC,IAAI,CAAC,QAAQ,MACX,aAAa,MAAM;CAEvB,SAAS,OAAO;EACd,KAAK,iBAAiB;EACtB,MAAM;CACR,UAAU;EACR,KAAK,gCAAgC;EAErC,SAAS,MAAM;CACjB;AACF;AAEA,MAAa,SAA0E,OAAO,EAAE,aAAa;CAC3G,MAAM,UAA2B;EAC/B,GAAG,oBAAoB,MAAM;EAC7B,OAAO,OAAO;EACd,IAAI,OAAO;EACX,MAAM,OAAO;EACb,gBAAgB,OAAO;EACvB,SAAS,OAAO;EAChB,MAAM,OAAO;CACf;CACA,MAAM,IAAI,eAAe,SAAS,OAAO,GAAG,EAAE,MAAM,QAAQ,KAAK,CAAC;AACpE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const require_rolldown_runtime = require("./rolldown-runtime-qbf5tadS.cjs");
|
|
2
|
-
const require_run = require("./run-
|
|
2
|
+
const require_run = require("./run-DY-3ONFZ.cjs");
|
|
3
|
+
const require_utils = require("./utils-DqUNntyL.cjs");
|
|
3
4
|
const require_output = require("./output-D-9bGS7y.cjs");
|
|
4
5
|
let node_util = require("node:util");
|
|
5
6
|
let node_process = require("node:process");
|
|
@@ -30,21 +31,24 @@ function detectCi(env = node_process.default.env) {
|
|
|
30
31
|
const scope = pullRequestNumber ?? env.GITHUB_RUN_ID ?? "";
|
|
31
32
|
return {
|
|
32
33
|
id: `gh:${repositoryId}:${scope}`,
|
|
33
|
-
name: `${env.GITHUB_REPOSITORY ?? "github"}#${scope}
|
|
34
|
+
name: `${env.GITHUB_REPOSITORY ?? "github"}#${scope}`,
|
|
35
|
+
commit: env.GITHUB_SHA
|
|
34
36
|
};
|
|
35
37
|
}
|
|
36
38
|
if (env.GITLAB_CI) {
|
|
37
39
|
const scope = env.CI_MERGE_REQUEST_IID ?? env.CI_COMMIT_REF_SLUG ?? "";
|
|
38
40
|
return {
|
|
39
41
|
id: `gl:${env.CI_PROJECT_ID ?? ""}:${scope}`,
|
|
40
|
-
name: `${env.CI_PROJECT_PATH ?? "gitlab"}#${scope}
|
|
42
|
+
name: `${env.CI_PROJECT_PATH ?? "gitlab"}#${scope}`,
|
|
43
|
+
commit: env.CI_COMMIT_SHA
|
|
41
44
|
};
|
|
42
45
|
}
|
|
43
46
|
if (env.BITBUCKET_BUILD_NUMBER) {
|
|
44
47
|
const scope = env.BITBUCKET_PR_ID ?? env.BITBUCKET_BRANCH ?? "";
|
|
45
48
|
return {
|
|
46
49
|
id: `bb:${env.BITBUCKET_REPO_UUID ?? ""}:${scope}`,
|
|
47
|
-
name: `${env.BITBUCKET_REPO_FULL_NAME ?? "bitbucket"}#${scope}
|
|
50
|
+
name: `${env.BITBUCKET_REPO_FULL_NAME ?? "bitbucket"}#${scope}`,
|
|
51
|
+
commit: env.BITBUCKET_COMMIT
|
|
48
52
|
};
|
|
49
53
|
}
|
|
50
54
|
if (env.CIRCLECI) {
|
|
@@ -53,7 +57,8 @@ function detectCi(env = node_process.default.env) {
|
|
|
53
57
|
const scope = env.CIRCLE_PR_NUMBER ?? env.CIRCLE_BRANCH ?? "";
|
|
54
58
|
return {
|
|
55
59
|
id: `circle:${owner}:${project}:${scope}`,
|
|
56
|
-
name: `${owner ? `${owner}/` : ""}${project}#${scope}
|
|
60
|
+
name: `${owner ? `${owner}/` : ""}${project}#${scope}`,
|
|
61
|
+
commit: env.CIRCLE_SHA1
|
|
57
62
|
};
|
|
58
63
|
}
|
|
59
64
|
return null;
|
|
@@ -112,7 +117,8 @@ function resolveCiIdentity(options) {
|
|
|
112
117
|
const detected = detectCi();
|
|
113
118
|
if (options.id) return {
|
|
114
119
|
id: options.id,
|
|
115
|
-
name: detected?.name ?? options.id
|
|
120
|
+
name: detected?.name ?? options.id,
|
|
121
|
+
commit: detected?.commit
|
|
116
122
|
};
|
|
117
123
|
if (!detected) throw new Error("Could not detect a supported CI provider (GitHub Actions, GitLab CI, Bitbucket Pipelines, CircleCI). Pass --id.");
|
|
118
124
|
return detected;
|
|
@@ -140,14 +146,27 @@ function toResult(studioUrl, snapshot, agentSlug) {
|
|
|
140
146
|
url: absoluteUrl(studioUrl, snapshot.url),
|
|
141
147
|
snapshotIdUrl: absoluteUrl(studioUrl, snapshot.snapshotIdUrl),
|
|
142
148
|
expiresAt: snapshot.expiresAt,
|
|
143
|
-
agentUrl: absoluteUrl(studioUrl, `/agents/${agentSlug}`)
|
|
149
|
+
agentUrl: absoluteUrl(studioUrl, `/agents/${agentSlug}`),
|
|
150
|
+
changes: snapshot.changes
|
|
144
151
|
};
|
|
145
152
|
}
|
|
153
|
+
/** One summary line: how many files changed, and since which run. */
|
|
154
|
+
function formatChanges(changes) {
|
|
155
|
+
if (!changes.base) return "First snapshot";
|
|
156
|
+
const counts = [
|
|
157
|
+
`${changes.added.length} added`,
|
|
158
|
+
`${changes.changed.length} changed`,
|
|
159
|
+
`${changes.removed.length} removed`
|
|
160
|
+
].join(", ");
|
|
161
|
+
const since = changes.base.commit ? changes.base.commit.slice(0, 7) : changes.base.createdAt;
|
|
162
|
+
return changes.added.length + changes.changed.length + changes.removed.length ? `${counts} since ${since}` : `No changes since ${since}`;
|
|
163
|
+
}
|
|
146
164
|
function printSummary(result) {
|
|
147
165
|
require_output.logBlock([
|
|
148
166
|
`${(0, node_util.styleText)("dim", "Package".padEnd(10))} ${result.name ?? "(unnamed)"}@${result.version ?? "0.0.0"}`,
|
|
149
167
|
`${(0, node_util.styleText)("dim", "Tarball".padEnd(10))} ${(0, node_util.styleText)("cyan", result.url)}`,
|
|
150
168
|
`${(0, node_util.styleText)("dim", "Agent".padEnd(10))} ${result.agentUrl}`,
|
|
169
|
+
...result.changes ? [`${(0, node_util.styleText)("dim", "Changes".padEnd(10))} ${formatChanges(result.changes)}`] : [],
|
|
151
170
|
`${(0, node_util.styleText)("dim", "Expires".padEnd(10))} ${result.expiresAt}`
|
|
152
171
|
]);
|
|
153
172
|
}
|
|
@@ -163,84 +182,86 @@ async function snapshot(options) {
|
|
|
163
182
|
const { configPath } = await require_run.loadConfigs(options);
|
|
164
183
|
const ci = resolveCiIdentity(options);
|
|
165
184
|
const { name, version: packageVersion } = await resolvePackageMetadata(options);
|
|
185
|
+
const logLevel = _kubb_core.logLevel[options.logLevel ?? "info"];
|
|
166
186
|
node_process.default.env.KUBB_AGENT_SECRET = ci.id;
|
|
167
|
-
const
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
spinner?.message(message);
|
|
187
|
+
const write = options.json ? (line) => console.error(line) : (line) => console.log(line);
|
|
188
|
+
const logger = require_utils.createPlainLogger(write);
|
|
189
|
+
const step = (message) => {
|
|
190
|
+
if (logLevel > _kubb_core.logLevel.silent) write(message);
|
|
174
191
|
};
|
|
175
|
-
|
|
176
|
-
if (!options.json) spinner?.start("Creating Kubb Studio agent");
|
|
192
|
+
step("Creating Kubb Studio agent");
|
|
177
193
|
const agent = await (0, _kubb_studio.createAgent)({
|
|
178
194
|
studioUrl: options.studioUrl,
|
|
179
195
|
token,
|
|
180
196
|
name: ci.name,
|
|
181
197
|
machineToken: (0, _kubb_studio.machineTokenFrom)(ci.id)
|
|
182
198
|
});
|
|
183
|
-
const { promise: ready,
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
token: agent.token,
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
199
|
+
const { promise: ready, resolve: markReady } = Promise.withResolvers();
|
|
200
|
+
const shutdown = new AbortController();
|
|
201
|
+
const lost = (0, _kubb_studio.runConnection)({
|
|
202
|
+
credentials: { token: agent.token },
|
|
203
|
+
signal: shutdown.signal,
|
|
204
|
+
clientOptions: () => ({
|
|
205
|
+
studioUrl: options.studioUrl,
|
|
206
|
+
configPath,
|
|
207
|
+
root: node_process.default.cwd(),
|
|
208
|
+
version: options.version,
|
|
209
|
+
permissions: options.permission,
|
|
210
|
+
loadConfig: async () => (await require_run.loadConfigs(options)).config,
|
|
211
|
+
installLogger: async (hooks) => {
|
|
212
|
+
await require_utils.setupReporters(hooks, {
|
|
213
|
+
logLevel,
|
|
214
|
+
reporters: [_kubb_core.cliReporter],
|
|
215
|
+
logger
|
|
216
|
+
});
|
|
217
|
+
hooks.hook("studio:ready", () => markReady());
|
|
218
|
+
}
|
|
219
|
+
}),
|
|
220
|
+
onTokenRejected: ({ error }) => Promise.reject(error)
|
|
221
|
+
}).then(() => Promise.reject(/* @__PURE__ */ new Error("The Kubb Studio connection ended before the snapshot finished")));
|
|
222
|
+
lost.catch(() => {});
|
|
205
223
|
try {
|
|
206
|
-
let
|
|
224
|
+
let readyTimeout;
|
|
207
225
|
try {
|
|
208
|
-
await Promise.race([
|
|
209
|
-
|
|
210
|
-
|
|
226
|
+
await Promise.race([
|
|
227
|
+
ready,
|
|
228
|
+
lost,
|
|
229
|
+
new Promise((_, reject) => {
|
|
230
|
+
readyTimeout = setTimeout(() => reject(/* @__PURE__ */ new Error("Timed out waiting for Kubb Studio to confirm the agent was ready")), READY_TIMEOUT_MS);
|
|
231
|
+
})
|
|
232
|
+
]);
|
|
211
233
|
} finally {
|
|
212
|
-
clearTimeout(
|
|
234
|
+
clearTimeout(readyTimeout);
|
|
213
235
|
}
|
|
214
|
-
|
|
236
|
+
step("Creating snapshot job");
|
|
215
237
|
const job = await (0, _kubb_studio.createJob)({
|
|
216
238
|
studioUrl: options.studioUrl,
|
|
217
239
|
token,
|
|
218
240
|
type: "snapshot",
|
|
219
241
|
agentId: agent.id,
|
|
220
242
|
name,
|
|
221
|
-
version: packageVersion
|
|
243
|
+
version: packageVersion,
|
|
244
|
+
commit: ci.commit
|
|
222
245
|
});
|
|
223
|
-
|
|
224
|
-
const finished = await (0, _kubb_studio.waitForJob)({
|
|
246
|
+
step(`Snapshot job queued: ${job.id}`);
|
|
247
|
+
const finished = await Promise.race([(0, _kubb_studio.waitForJob)({
|
|
225
248
|
studioUrl: options.studioUrl,
|
|
226
249
|
token,
|
|
227
250
|
id: job.id,
|
|
228
251
|
timeoutMs
|
|
229
|
-
});
|
|
252
|
+
}), lost]);
|
|
230
253
|
if (finished.status === "failed") throw new Error(finished.error ?? "Snapshot job failed");
|
|
231
254
|
if (!finished.snapshot) throw new Error("Snapshot job succeeded without a snapshot");
|
|
232
255
|
const result = toResult(options.studioUrl, finished.snapshot, agent.slug);
|
|
233
|
-
|
|
234
|
-
if (!options.json) spinner?.stop("Snapshot published");
|
|
256
|
+
step("Snapshot published");
|
|
235
257
|
if (options.json) console.log(JSON.stringify(result));
|
|
236
258
|
if (!options.json) printSummary(result);
|
|
237
259
|
} catch (error) {
|
|
238
|
-
|
|
239
|
-
if (!options.json) spinner?.stop("Snapshot failed");
|
|
260
|
+
step("Snapshot failed");
|
|
240
261
|
throw error;
|
|
241
262
|
} finally {
|
|
242
|
-
|
|
243
|
-
|
|
263
|
+
step("Disconnecting from Kubb Studio");
|
|
264
|
+
shutdown.abort();
|
|
244
265
|
}
|
|
245
266
|
}
|
|
246
267
|
const runner = async ({ values }) => {
|
|
@@ -258,4 +279,4 @@ const runner = async ({ values }) => {
|
|
|
258
279
|
//#endregion
|
|
259
280
|
exports.runner = runner;
|
|
260
281
|
|
|
261
|
-
//# sourceMappingURL=snapshot-
|
|
282
|
+
//# sourceMappingURL=snapshot-DJzr_LP8.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-DJzr_LP8.cjs","names":["readFileSync","process","join","exists","read","dirname","process","styleText","loadConfigs","logLevelMap","createPlainLogger","createAgent","machineTokenFrom","runConnection","setupReporters","cliReporter","createJob","waitForJob","createStudioOptions","run"],"sources":["../src/runners/studio/ci.ts","../src/runners/studio/snapshot.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport process from 'node:process'\n\n/**\n * Stable identity for the CI agent a snapshot run registers or reuses.\n */\nexport type CiContext = {\n /**\n * Fed into the machine token, so the same merge or pull request reuses one agent.\n */\n id: string\n /**\n * Agent display name shown in Studio.\n */\n name: string\n /** The commit this run builds, so the next snapshot can diff against it. */\n commit?: string\n}\n\nfunction readGithubPullRequestNumber(eventPath: string | undefined): string | undefined {\n if (!eventPath) {\n return undefined\n }\n\n try {\n const event = JSON.parse(readFileSync(eventPath, 'utf8')) as { pull_request?: { number?: number } }\n return event.pull_request?.number ? String(event.pull_request.number) : undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * Detects the CI provider from its environment variables and derives a stable identity from it.\n * The GitHub row reproduces `gh:<repositoryId>:<prNumber>`, the identity `kubb-labs/action` has\n * always registered agents under, so an existing repository keeps reusing its agent.\n */\nexport function detectCi(env: Record<string, string | undefined> = process.env): CiContext | null {\n if (env.GITHUB_ACTIONS) {\n const pullRequestNumber = readGithubPullRequestNumber(env.GITHUB_EVENT_PATH)\n const repositoryId = env.GITHUB_REPOSITORY_ID ?? env.GITHUB_REPOSITORY ?? ''\n const scope = pullRequestNumber ?? env.GITHUB_RUN_ID ?? ''\n\n return { id: `gh:${repositoryId}:${scope}`, name: `${env.GITHUB_REPOSITORY ?? 'github'}#${scope}`, commit: env.GITHUB_SHA }\n }\n\n if (env.GITLAB_CI) {\n const scope = env.CI_MERGE_REQUEST_IID ?? env.CI_COMMIT_REF_SLUG ?? ''\n\n return { id: `gl:${env.CI_PROJECT_ID ?? ''}:${scope}`, name: `${env.CI_PROJECT_PATH ?? 'gitlab'}#${scope}`, commit: env.CI_COMMIT_SHA }\n }\n\n if (env.BITBUCKET_BUILD_NUMBER) {\n const scope = env.BITBUCKET_PR_ID ?? env.BITBUCKET_BRANCH ?? ''\n\n return { id: `bb:${env.BITBUCKET_REPO_UUID ?? ''}:${scope}`, name: `${env.BITBUCKET_REPO_FULL_NAME ?? 'bitbucket'}#${scope}`, commit: env.BITBUCKET_COMMIT }\n }\n\n if (env.CIRCLECI) {\n // Owner-qualified: two projects with the same name under different CircleCI orgs must not\n // collide on one agent, since registering it purges the other project's live sessions.\n const owner = env.CIRCLE_PROJECT_USERNAME ?? ''\n const project = env.CIRCLE_PROJECT_REPONAME ?? 'circleci'\n const scope = env.CIRCLE_PR_NUMBER ?? env.CIRCLE_BRANCH ?? ''\n\n return { id: `circle:${owner}:${project}:${scope}`, name: `${owner ? `${owner}/` : ''}${project}#${scope}`, commit: env.CIRCLE_SHA1 }\n }\n\n return null\n}\n","import { dirname, join } from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport { exists, read } from '@internals/utils'\nimport { cliReporter, logLevel as logLevelMap } from '@kubb/core'\nimport { createAgent, createJob, machineTokenFrom, runConnection, waitForJob, type StudioSnapshot, type StudioSnapshotChanges } from '@kubb/studio'\nimport { logBlock } from '../../loggers/output.ts'\nimport { createPlainLogger } from '../../loggers/plainLogger.ts'\nimport setupReporters from '../../loggers/utils.ts'\nimport { type CiContext, detectCi } from './ci.ts'\nimport { createStudioOptions, loadConfigs, run, type SnapshotOptions } from './run.ts'\nimport type { definition } from '../../commands/studio/snapshot.ts'\nimport type { CommandRunner } from 'gunshi'\n\n/**\n * How long to wait for Studio's `studio:ready` acknowledgement, above the client's own 10s\n * handshake-ack timeout.\n */\nconst READY_TIMEOUT_MS = 15_000\n\n/**\n * Longest `--timeout` accepted. Job records expire from Studio's storage after an hour.\n */\nconst MAX_TIMEOUT_SECONDS = 3600\n\nconst LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1'])\n\nasync function findPackageJson(startDirectory: string): Promise<{ name: string; version: string }> {\n let directory = startDirectory\n\n for (;;) {\n const file = join(directory, 'package.json')\n\n if (await exists(file)) {\n const packageJson = JSON.parse(await read(file)) as Partial<{ name: string; version: string }>\n\n if (packageJson.name && packageJson.version) {\n return { name: packageJson.name, version: packageJson.version }\n }\n }\n\n const parent = dirname(directory)\n\n if (parent === directory) {\n break\n }\n\n directory = parent\n }\n\n throw new Error(`No package.json with a name and a version found above ${startDirectory}`)\n}\n\n/** Reads package.json only for whichever of name/version --name and --version did not supply. */\nasync function resolvePackageMetadata(options: SnapshotOptions): Promise<{ name: string; version: string }> {\n if (options.name && options.packageVersion) {\n return { name: options.name, version: options.packageVersion }\n }\n\n const packageMetadata = await findPackageJson(process.cwd())\n\n return { name: options.name ?? packageMetadata.name, version: options.packageVersion ?? packageMetadata.version }\n}\n\nfunction resolveToken(options: SnapshotOptions): string {\n const token = options.token ?? process.env.KUBB_TOKEN\n\n if (!token) {\n throw new Error('An organization CI API key is required. Pass --token or set KUBB_TOKEN.')\n }\n\n return token\n}\n\nfunction resolveCiIdentity(options: SnapshotOptions): CiContext {\n const detected = detectCi()\n\n if (options.id) {\n return { id: options.id, name: detected?.name ?? options.id, commit: detected?.commit }\n }\n\n if (!detected) {\n throw new Error('Could not detect a supported CI provider (GitHub Actions, GitLab CI, Bitbucket Pipelines, CircleCI). Pass --id.')\n }\n\n return detected\n}\n\n/** Rejects a bad `--timeout` up front instead of letting it reach `waitForJob` as NaN or <= 0. */\nfunction resolveTimeoutMs(options: SnapshotOptions): number {\n const seconds = options.timeout ?? 600\n\n if (!Number.isFinite(seconds) || seconds <= 0) {\n throw new Error('--timeout must be a positive number of seconds')\n }\n\n return Math.min(seconds, MAX_TIMEOUT_SECONDS) * 1000\n}\n\n/** The CI key is a credential, so refuse to send it anywhere but HTTPS or a loopback dev host. */\nfunction assertSecureStudioUrl(studioUrl: string): void {\n const url = new URL(studioUrl)\n\n if (url.protocol !== 'https:' && !LOOPBACK_HOSTS.has(url.hostname)) {\n throw new Error(`Refusing to send the CI API key to ${studioUrl}. Use an https:// Studio URL, or a loopback host for local development.`)\n }\n}\n\nfunction absoluteUrl(studioUrl: string, path: string): string {\n return new URL(path, `${studioUrl}/`).toString()\n}\n\ntype SnapshotResult = {\n id: string\n name: string | null\n version: string | null\n integrity: string | null\n url: string\n snapshotIdUrl: string\n expiresAt: string\n agentUrl: string\n /** What changed since the previous snapshot of this package on this agent. */\n changes?: StudioSnapshotChanges\n}\n\nfunction toResult(studioUrl: string, snapshot: StudioSnapshot, agentSlug: string): SnapshotResult {\n return {\n id: snapshot.id,\n name: snapshot.name,\n version: snapshot.version,\n integrity: snapshot.integrity,\n url: absoluteUrl(studioUrl, snapshot.url),\n snapshotIdUrl: absoluteUrl(studioUrl, snapshot.snapshotIdUrl),\n expiresAt: snapshot.expiresAt,\n agentUrl: absoluteUrl(studioUrl, `/agents/${agentSlug}`),\n changes: snapshot.changes,\n }\n}\n\n/** One summary line: how many files changed, and since which run. */\nexport function formatChanges(changes: StudioSnapshotChanges): string {\n if (!changes.base) {\n return 'First snapshot'\n }\n\n const counts = [`${changes.added.length} added`, `${changes.changed.length} changed`, `${changes.removed.length} removed`].join(', ')\n const since = changes.base.commit ? changes.base.commit.slice(0, 7) : changes.base.createdAt\n\n return changes.added.length + changes.changed.length + changes.removed.length ? `${counts} since ${since}` : `No changes since ${since}`\n}\n\nfunction printSummary(result: SnapshotResult): void {\n logBlock([\n `${styleText('dim', 'Package'.padEnd(10))} ${result.name ?? '(unnamed)'}@${result.version ?? '0.0.0'}`,\n `${styleText('dim', 'Tarball'.padEnd(10))} ${styleText('cyan', result.url)}`,\n `${styleText('dim', 'Agent'.padEnd(10))} ${result.agentUrl}`,\n ...(result.changes ? [`${styleText('dim', 'Changes'.padEnd(10))} ${formatChanges(result.changes)}`] : []),\n `${styleText('dim', 'Expires'.padEnd(10))} ${result.expiresAt}`,\n ])\n}\n\n/**\n * Generates a Kubb Studio snapshot from a script: registers or reuses a CI agent, connects it,\n * queues a snapshot job, and polls until the tarball is ready. A snapshot job runs generation and\n * packs the tarball in one step, so this needs no separate generation run.\n */\nexport async function snapshot(options: SnapshotOptions): Promise<void> {\n const timeoutMs = resolveTimeoutMs(options)\n const token = resolveToken(options)\n assertSecureStudioUrl(options.studioUrl)\n const { configPath } = await loadConfigs(options)\n const ci = resolveCiIdentity(options)\n const { name, version: packageVersion } = await resolvePackageMetadata(options)\n const logLevel = logLevelMap[options.logLevel ?? 'info']\n\n // Set before the first `getMachineToken()` call (inside the connection), so the WebSocket\n // session registers under the same machine token `createAgent` just registered with Studio.\n process.env.KUBB_AGENT_SECRET = ci.id\n\n const write = options.json ? (line: string) => console.error(line) : (line: string) => console.log(line)\n const logger = createPlainLogger(write)\n const step = (message: string) => {\n if (logLevel > logLevelMap.silent) {\n write(message)\n }\n }\n\n step('Creating Kubb Studio agent')\n\n const agent = await createAgent({ studioUrl: options.studioUrl, token, name: ci.name, machineToken: machineTokenFrom(ci.id) })\n\n const { promise: ready, resolve: markReady } = Promise.withResolvers<void>()\n const shutdown = new AbortController()\n\n const connection = runConnection({\n credentials: { token: agent.token },\n signal: shutdown.signal,\n clientOptions: () => ({\n studioUrl: options.studioUrl,\n configPath,\n root: process.cwd(),\n version: options.version,\n // Flags only: a script is never prompted and never reuses a saved answer.\n permissions: options.permission,\n loadConfig: async () => (await loadConfigs(options)).config,\n installLogger: async (hooks) => {\n await setupReporters(hooks, { logLevel, reporters: [cliReporter], logger })\n hooks.hook('studio:ready', () => markReady())\n },\n }),\n // A CI agent's token comes from the organization key, so there is no pairing to fall back to.\n onTokenRejected: ({ error }) => Promise.reject(error),\n })\n const lost = connection.then(() => Promise.reject(new Error('The Kubb Studio connection ended before the snapshot finished')))\n void lost.catch(() => {})\n\n try {\n let readyTimeout: ReturnType<typeof setTimeout> | undefined\n try {\n await Promise.race([\n ready,\n lost,\n new Promise<never>((_, reject) => {\n readyTimeout = setTimeout(() => reject(new Error('Timed out waiting for Kubb Studio to confirm the agent was ready')), READY_TIMEOUT_MS)\n }),\n ])\n } finally {\n clearTimeout(readyTimeout)\n }\n\n step('Creating snapshot job')\n\n const job = await createJob({ studioUrl: options.studioUrl, token, type: 'snapshot', agentId: agent.id, name, version: packageVersion, commit: ci.commit })\n step(`Snapshot job queued: ${job.id}`)\n const finished = await Promise.race([waitForJob({ studioUrl: options.studioUrl, token, id: job.id, timeoutMs }), lost])\n\n if (finished.status === 'failed') {\n throw new Error(finished.error ?? 'Snapshot job failed')\n }\n\n if (!finished.snapshot) {\n throw new Error('Snapshot job succeeded without a snapshot')\n }\n\n const result = toResult(options.studioUrl, finished.snapshot, agent.slug)\n\n step('Snapshot published')\n\n if (options.json) {\n console.log(JSON.stringify(result))\n }\n if (!options.json) {\n printSummary(result)\n }\n } catch (error) {\n step('Snapshot failed')\n throw error\n } finally {\n step('Disconnecting from Kubb Studio')\n // Not awaited: a half-open socket must not hold the run open.\n shutdown.abort()\n }\n}\n\nexport const runner: CommandRunner<{ args: typeof definition.args; extensions: {} }> = async ({ values }) => {\n const options: SnapshotOptions = {\n ...createStudioOptions(values),\n token: values.token,\n id: values.id,\n name: values.name,\n packageVersion: values.packageVersion,\n timeout: values.timeout,\n json: values.json,\n }\n await run(options, () => snapshot(options), { json: options.json })\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require("./rolldown-runtime-qbf5tadS.cjs");
|
|
2
|
-
const require_run = require("./run-
|
|
2
|
+
const require_run = require("./run-DY-3ONFZ.cjs");
|
|
3
3
|
//#region src/runners/studio/status.ts
|
|
4
4
|
const runner = async ({ values }) => {
|
|
5
5
|
const options = require_run.createStudioOptions(values);
|
|
@@ -8,4 +8,4 @@ const runner = async ({ values }) => {
|
|
|
8
8
|
//#endregion
|
|
9
9
|
exports.runner = runner;
|
|
10
10
|
|
|
11
|
-
//# sourceMappingURL=status-
|
|
11
|
+
//# sourceMappingURL=status-BtXF2YAC.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-
|
|
1
|
+
{"version":3,"file":"status-BtXF2YAC.cjs","names":["createStudioOptions","run","status"],"sources":["../src/runners/studio/status.ts"],"sourcesContent":["import type { CommandRunner } from 'gunshi'\nimport type { definition } from '../../commands/studio/status.ts'\nimport { createStudioOptions, run, status } from './run.ts'\n\nexport const runner: CommandRunner<{ args: typeof definition.args; extensions: {} }> = async ({ values }) => {\n const options = createStudioOptions(values)\n await run(options, () => status(options))\n}\n"],"mappings":";;;AAIA,MAAa,SAA0E,OAAO,EAAE,aAAa;CAC3G,MAAM,UAAUA,YAAAA,oBAAoB,MAAM;CAC1C,MAAMC,YAAAA,IAAI,eAAeC,YAAAA,OAAO,OAAO,CAAC;AAC1C"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "./rolldown-runtime-C0LytTxp.js";
|
|
2
|
-
import { a as run, n as createStudioOptions, o as status } from "./run-
|
|
2
|
+
import { a as run, n as createStudioOptions, o as status } from "./run-DOOtoHGQ.js";
|
|
3
3
|
//#region src/runners/studio/status.ts
|
|
4
4
|
const runner = async ({ values }) => {
|
|
5
5
|
const options = createStudioOptions(values);
|
|
@@ -8,4 +8,4 @@ const runner = async ({ values }) => {
|
|
|
8
8
|
//#endregion
|
|
9
9
|
export { runner };
|
|
10
10
|
|
|
11
|
-
//# sourceMappingURL=status-
|
|
11
|
+
//# sourceMappingURL=status-DT1nKRUb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-
|
|
1
|
+
{"version":3,"file":"status-DT1nKRUb.js","names":[],"sources":["../src/runners/studio/status.ts"],"sourcesContent":["import type { CommandRunner } from 'gunshi'\nimport type { definition } from '../../commands/studio/status.ts'\nimport { createStudioOptions, run, status } from './run.ts'\n\nexport const runner: CommandRunner<{ args: typeof definition.args; extensions: {} }> = async ({ values }) => {\n const options = createStudioOptions(values)\n await run(options, () => status(options))\n}\n"],"mappings":";;;AAIA,MAAa,SAA0E,OAAO,EAAE,aAAa;CAC3G,MAAM,UAAU,oBAAoB,MAAM;CAC1C,MAAM,IAAI,eAAe,OAAO,OAAO,CAAC;AAC1C"}
|
|
@@ -138,18 +138,18 @@ const definition = define({
|
|
|
138
138
|
...logLevelArg
|
|
139
139
|
},
|
|
140
140
|
async run(ctx) {
|
|
141
|
-
const { runner } = await import("./connect-
|
|
141
|
+
const { runner } = await import("./connect-IObjkkpy.js");
|
|
142
142
|
await runner(ctx);
|
|
143
143
|
},
|
|
144
144
|
subCommands: {
|
|
145
|
-
connect: lazy(async () => (await import("./connect-
|
|
146
|
-
login: lazy(async () => (await import("./login-
|
|
147
|
-
logout: lazy(async () => (await import("./logout-
|
|
148
|
-
status: lazy(async () => (await import("./status-
|
|
149
|
-
snapshot: lazy(async () => (await import("./snapshot-
|
|
145
|
+
connect: lazy(async () => (await import("./connect-IObjkkpy.js")).runner, definition$5),
|
|
146
|
+
login: lazy(async () => (await import("./login-CA_xoFp7.js")).runner, definition$4),
|
|
147
|
+
logout: lazy(async () => (await import("./logout-BRZyHSgy.js")).runner, definition$3),
|
|
148
|
+
status: lazy(async () => (await import("./status-DT1nKRUb.js")).runner, definition$1),
|
|
149
|
+
snapshot: lazy(async () => (await import("./snapshot-Cv2GHK1Y.js")).runner, definition$2)
|
|
150
150
|
}
|
|
151
151
|
});
|
|
152
152
|
//#endregion
|
|
153
153
|
export { definition };
|
|
154
154
|
|
|
155
|
-
//# sourceMappingURL=studio-
|
|
155
|
+
//# sourceMappingURL=studio-CwZBPZWN.js.map
|