@spec0/cli 0.1.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/AGENTS.md +67 -0
- package/LICENSE +21 -0
- package/README.md +235 -0
- package/dist/commands/api/changelog.d.ts +9 -0
- package/dist/commands/api/changelog.d.ts.map +1 -0
- package/dist/commands/api/changelog.js +144 -0
- package/dist/commands/api/changelog.js.map +1 -0
- package/dist/commands/api/index.d.ts +6 -0
- package/dist/commands/api/index.d.ts.map +1 -0
- package/dist/commands/api/index.js +13 -0
- package/dist/commands/api/index.js.map +1 -0
- package/dist/commands/api/list.d.ts +10 -0
- package/dist/commands/api/list.d.ts.map +1 -0
- package/dist/commands/api/list.js +79 -0
- package/dist/commands/api/list.js.map +1 -0
- package/dist/commands/api/show.d.ts +9 -0
- package/dist/commands/api/show.d.ts.map +1 -0
- package/dist/commands/api/show.js +88 -0
- package/dist/commands/api/show.js.map +1 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +166 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/ci/generate.d.ts +10 -0
- package/dist/commands/ci/generate.d.ts.map +1 -0
- package/dist/commands/ci/generate.js +72 -0
- package/dist/commands/ci/generate.js.map +1 -0
- package/dist/commands/ci/index.d.ts +3 -0
- package/dist/commands/ci/index.d.ts.map +1 -0
- package/dist/commands/ci/index.js +6 -0
- package/dist/commands/ci/index.js.map +1 -0
- package/dist/commands/commands.d.ts +19 -0
- package/dist/commands/commands.d.ts.map +1 -0
- package/dist/commands/commands.js +127 -0
- package/dist/commands/commands.js.map +1 -0
- package/dist/commands/diff.d.ts +6 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +102 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +54 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +67 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +6 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +109 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/log.d.ts +6 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +95 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/mcp.d.ts +6 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +59 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/mock/create.d.ts +14 -0
- package/dist/commands/mock/create.d.ts.map +1 -0
- package/dist/commands/mock/create.js +75 -0
- package/dist/commands/mock/create.js.map +1 -0
- package/dist/commands/mock/index.d.ts +9 -0
- package/dist/commands/mock/index.d.ts.map +1 -0
- package/dist/commands/mock/index.js +18 -0
- package/dist/commands/mock/index.js.map +1 -0
- package/dist/commands/mock/list.d.ts +8 -0
- package/dist/commands/mock/list.d.ts.map +1 -0
- package/dist/commands/mock/list.js +52 -0
- package/dist/commands/mock/list.js.map +1 -0
- package/dist/commands/mock/show.d.ts +9 -0
- package/dist/commands/mock/show.d.ts.map +1 -0
- package/dist/commands/mock/show.js +68 -0
- package/dist/commands/mock/show.js.map +1 -0
- package/dist/commands/mock/url.d.ts +10 -0
- package/dist/commands/mock/url.d.ts.map +1 -0
- package/dist/commands/mock/url.js +42 -0
- package/dist/commands/mock/url.js.map +1 -0
- package/dist/commands/mock.d.ts +6 -0
- package/dist/commands/mock.d.ts.map +1 -0
- package/dist/commands/mock.js +116 -0
- package/dist/commands/mock.js.map +1 -0
- package/dist/commands/publish.d.ts +11 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +242 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/pull.d.ts +6 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +62 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +18 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +302 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/register.d.ts +6 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +213 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/search.d.ts +6 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +58 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +86 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync-status.d.ts +14 -0
- package/dist/commands/sync-status.d.ts.map +1 -0
- package/dist/commands/sync-status.js +119 -0
- package/dist/commands/sync-status.js.map +1 -0
- package/dist/commands/team.d.ts +6 -0
- package/dist/commands/team.d.ts.map +1 -0
- package/dist/commands/team.js +30 -0
- package/dist/commands/team.js.map +1 -0
- package/dist/commands/version.d.ts +6 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +31 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent-mode.d.ts +25 -0
- package/dist/lib/agent-mode.d.ts.map +1 -0
- package/dist/lib/agent-mode.js +36 -0
- package/dist/lib/agent-mode.js.map +1 -0
- package/dist/lib/api-client.d.ts +37 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +144 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/auth-context.d.ts +18 -0
- package/dist/lib/auth-context.d.ts.map +1 -0
- package/dist/lib/auth-context.js +48 -0
- package/dist/lib/auth-context.js.map +1 -0
- package/dist/lib/breaking-change.d.ts +12 -0
- package/dist/lib/breaking-change.d.ts.map +1 -0
- package/dist/lib/breaking-change.js +10 -0
- package/dist/lib/breaking-change.js.map +1 -0
- package/dist/lib/ci-detect.d.ts +33 -0
- package/dist/lib/ci-detect.d.ts.map +1 -0
- package/dist/lib/ci-detect.js +136 -0
- package/dist/lib/ci-detect.js.map +1 -0
- package/dist/lib/cli-spec-path.d.ts +6 -0
- package/dist/lib/cli-spec-path.d.ts.map +1 -0
- package/dist/lib/cli-spec-path.js +34 -0
- package/dist/lib/cli-spec-path.js.map +1 -0
- package/dist/lib/codeowners.d.ts +11 -0
- package/dist/lib/codeowners.d.ts.map +1 -0
- package/dist/lib/codeowners.js +43 -0
- package/dist/lib/codeowners.js.map +1 -0
- package/dist/lib/config.d.ts +24 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +49 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/deprecation.d.ts +17 -0
- package/dist/lib/deprecation.d.ts.map +1 -0
- package/dist/lib/deprecation.js +22 -0
- package/dist/lib/deprecation.js.map +1 -0
- package/dist/lib/doctor.d.ts +40 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +107 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/exit-codes.d.ts +51 -0
- package/dist/lib/exit-codes.d.ts.map +1 -0
- package/dist/lib/exit-codes.js +78 -0
- package/dist/lib/exit-codes.js.map +1 -0
- package/dist/lib/lint.d.ts +18 -0
- package/dist/lib/lint.d.ts.map +1 -0
- package/dist/lib/lint.js +41 -0
- package/dist/lib/lint.js.map +1 -0
- package/dist/lib/local-config-yaml.d.ts +14 -0
- package/dist/lib/local-config-yaml.d.ts.map +1 -0
- package/dist/lib/local-config-yaml.js +29 -0
- package/dist/lib/local-config-yaml.js.map +1 -0
- package/dist/lib/output/index.d.ts +69 -0
- package/dist/lib/output/index.d.ts.map +1 -0
- package/dist/lib/output/index.js +120 -0
- package/dist/lib/output/index.js.map +1 -0
- package/dist/lib/output/table.d.ts +19 -0
- package/dist/lib/output/table.d.ts.map +1 -0
- package/dist/lib/output/table.js +48 -0
- package/dist/lib/output/table.js.map +1 -0
- package/dist/lib/output.d.ts +32 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +64 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/platform-defaults.d.ts +27 -0
- package/dist/lib/platform-defaults.d.ts.map +1 -0
- package/dist/lib/platform-defaults.js +36 -0
- package/dist/lib/platform-defaults.js.map +1 -0
- package/dist/lib/ref-resolver.d.ts +37 -0
- package/dist/lib/ref-resolver.d.ts.map +1 -0
- package/dist/lib/ref-resolver.js +56 -0
- package/dist/lib/ref-resolver.js.map +1 -0
- package/dist/lib/registry-ref.d.ts +10 -0
- package/dist/lib/registry-ref.d.ts.map +1 -0
- package/dist/lib/registry-ref.js +18 -0
- package/dist/lib/registry-ref.js.map +1 -0
- package/dist/lib/spec-finder.d.ts +6 -0
- package/dist/lib/spec-finder.d.ts.map +1 -0
- package/dist/lib/spec-finder.js +42 -0
- package/dist/lib/spec-finder.js.map +1 -0
- package/dist/lib/update-check.d.ts +12 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +62 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/version.d.ts +17 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +33 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/lib/winspect-yaml.d.ts +14 -0
- package/dist/lib/winspect-yaml.d.ts.map +1 -0
- package/dist/lib/winspect-yaml.js +28 -0
- package/dist/lib/winspect-yaml.js.map +1 -0
- package/dist/types.d.ts +664 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 mock create — provision (or fetch) the default mock server for an API.
|
|
3
|
+
*
|
|
4
|
+
* The backend endpoint is idempotent: POST /api-management/cli/v1/mocks either
|
|
5
|
+
* returns the existing mock or creates a fresh one. The API key is only ever
|
|
6
|
+
* returned once (on initial creation), so CI callers should capture it on the
|
|
7
|
+
* very first run — we surface it prominently in text mode and include it in
|
|
8
|
+
* the JSON payload.
|
|
9
|
+
*/
|
|
10
|
+
import chalk from "chalk";
|
|
11
|
+
import { createOrgApiClient, is401 } from "../../lib/api-client.js";
|
|
12
|
+
import { requireOrgContext } from "../../lib/auth-context.js";
|
|
13
|
+
import { ExitCode } from "../../lib/exit-codes.js";
|
|
14
|
+
import { emit, fail, resolveOutputContext } from "../../lib/output/index.js";
|
|
15
|
+
export function registerMockCreateCommand(mock) {
|
|
16
|
+
mock
|
|
17
|
+
.command("create")
|
|
18
|
+
.description("Create (or fetch existing) mock server for an API; print URL and one-time key.")
|
|
19
|
+
.option("--api <name>", "API name (required unless --api-id is set)")
|
|
20
|
+
.option("--api-id <uuid>", "API id")
|
|
21
|
+
.option("--org <uuid>", "Org id override")
|
|
22
|
+
.option("--output <format>", "Output format: text, json, or yaml (default: text)")
|
|
23
|
+
.action(async (opts) => {
|
|
24
|
+
const outCtx = resolveOutputContext(opts);
|
|
25
|
+
if (!opts.api && !opts.apiId) {
|
|
26
|
+
fail(outCtx, ExitCode.USAGE, "Provide --api <name> or --api-id <uuid>.");
|
|
27
|
+
}
|
|
28
|
+
let authCtx;
|
|
29
|
+
try {
|
|
30
|
+
authCtx = requireOrgContext(opts.org);
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
fail(outCtx, ExitCode.AUTH_MISSING, e.message, {
|
|
34
|
+
hint: "Set SPEC0_TOKEN + SPEC0_ORG_ID, or run 'spec0 auth login'.",
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const client = createOrgApiClient(authCtx);
|
|
38
|
+
const body = {
|
|
39
|
+
apiName: opts.api,
|
|
40
|
+
apiId: opts.apiId,
|
|
41
|
+
};
|
|
42
|
+
try {
|
|
43
|
+
const res = (await client.postJson("/api-management/cli/v1/mocks", body));
|
|
44
|
+
const result = {
|
|
45
|
+
apiId: res.apiId,
|
|
46
|
+
apiName: res.apiName,
|
|
47
|
+
mockUrl: `${authCtx.apiUrl}${res.mockBaseUrl ?? ""}`,
|
|
48
|
+
apiKey: res.apiKey ?? null,
|
|
49
|
+
created: res.created,
|
|
50
|
+
};
|
|
51
|
+
emit(outCtx, result, renderCreateText);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
if (is401(err)) {
|
|
55
|
+
fail(outCtx, ExitCode.AUTH_MISSING, "Token invalid or expired.", {
|
|
56
|
+
hint: "Run 'spec0 auth login' or refresh SPEC0_TOKEN.",
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
fail(outCtx, ExitCode.GENERIC, `mock create failed: ${err.message}`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function renderCreateText(r) {
|
|
64
|
+
const lines = [];
|
|
65
|
+
lines.push(chalk.green(r.created ? "Mock server created:" : "Mock server (existing):"));
|
|
66
|
+
lines.push(` Mock URL: ${r.mockUrl}`);
|
|
67
|
+
if (r.apiKey) {
|
|
68
|
+
lines.push(` API Key: ${r.apiKey} ${chalk.yellow("(shown once — copy and keep safe)")}`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
lines.push(chalk.gray(" (API key was issued when the mock was first created.)"));
|
|
72
|
+
}
|
|
73
|
+
return lines.join("\n");
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/mock/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 mock … — mock-server subcommands.
|
|
3
|
+
*
|
|
4
|
+
* Split from the previous monolithic mock.ts so each verb owns its flags,
|
|
5
|
+
* exit codes, and output contract.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
export declare function registerMockCommands(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/mock/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAMpD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 mock … — mock-server subcommands.
|
|
3
|
+
*
|
|
4
|
+
* Split from the previous monolithic mock.ts so each verb owns its flags,
|
|
5
|
+
* exit codes, and output contract.
|
|
6
|
+
*/
|
|
7
|
+
import { registerMockCreateCommand } from "./create.js";
|
|
8
|
+
import { registerMockListCommand } from "./list.js";
|
|
9
|
+
import { registerMockShowCommand } from "./show.js";
|
|
10
|
+
import { registerMockUrlCommand } from "./url.js";
|
|
11
|
+
export function registerMockCommands(program) {
|
|
12
|
+
const mock = program.command("mock").description("Mock server management");
|
|
13
|
+
registerMockCreateCommand(mock);
|
|
14
|
+
registerMockListCommand(mock);
|
|
15
|
+
registerMockShowCommand(mock);
|
|
16
|
+
registerMockUrlCommand(mock);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/mock/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAElD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAC3E,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAChC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9B,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9B,sBAAsB,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 mock list — one row per mock server in the org.
|
|
3
|
+
*
|
|
4
|
+
* Already modernised in a prior PR; moved here as part of the mock.ts split.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
export declare function registerMockListCommand(mock: Command): void;
|
|
8
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/mock/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,QA0CpD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 mock list — one row per mock server in the org.
|
|
3
|
+
*
|
|
4
|
+
* Already modernised in a prior PR; moved here as part of the mock.ts split.
|
|
5
|
+
*/
|
|
6
|
+
import { createOrgApiClient, is401 } from "../../lib/api-client.js";
|
|
7
|
+
import { requireOrgContext } from "../../lib/auth-context.js";
|
|
8
|
+
import { ExitCode } from "../../lib/exit-codes.js";
|
|
9
|
+
import { emit, fail, resolveOutputContext } from "../../lib/output/index.js";
|
|
10
|
+
import { renderTable } from "../../lib/output/table.js";
|
|
11
|
+
export function registerMockListCommand(mock) {
|
|
12
|
+
mock
|
|
13
|
+
.command("list")
|
|
14
|
+
.description("List all mock servers in the org.")
|
|
15
|
+
.option("--org <uuid>", "Org id override")
|
|
16
|
+
.option("--output <format>", "Output format: text, json, or yaml (default: text)")
|
|
17
|
+
.action(async (opts) => {
|
|
18
|
+
const outCtx = resolveOutputContext(opts);
|
|
19
|
+
let authCtx;
|
|
20
|
+
try {
|
|
21
|
+
authCtx = requireOrgContext(opts.org);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
fail(outCtx, ExitCode.AUTH_MISSING, e.message, {
|
|
25
|
+
hint: "Set SPEC0_TOKEN + SPEC0_ORG_ID, or run 'spec0 auth login'.",
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const client = createOrgApiClient(authCtx);
|
|
29
|
+
try {
|
|
30
|
+
const rows = (await client.getJson("/api-management/cli/v1/mocks"));
|
|
31
|
+
const enriched = rows.map((m) => ({
|
|
32
|
+
api: m.apiName ?? m.apiId ?? "—",
|
|
33
|
+
name: m.name ?? "—",
|
|
34
|
+
mockUrl: `${authCtx.apiUrl}${m.mockBaseUrl ?? ""}`,
|
|
35
|
+
}));
|
|
36
|
+
emit(outCtx, enriched, (data) => renderTable(data, [
|
|
37
|
+
{ key: "api", header: "API" },
|
|
38
|
+
{ key: "name", header: "Name" },
|
|
39
|
+
{ key: "mockUrl", header: "Mock URL" },
|
|
40
|
+
]));
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (is401(err)) {
|
|
44
|
+
fail(outCtx, ExitCode.AUTH_MISSING, "Token invalid or expired.", {
|
|
45
|
+
hint: "Run 'spec0 auth login' or refresh SPEC0_TOKEN.",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
fail(outCtx, ExitCode.GENERIC, `mock list failed: ${err.message}`);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/mock/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,oBAAoB,EAAsB,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,MAAM,UAAU,uBAAuB,CAAC,IAAa;IACnD,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC;SACzC,MAAM,CAAC,mBAAmB,EAAE,oDAAoD,CAAC;SACjF,MAAM,CAAC,KAAK,EAAE,IAAsC,EAAE,EAAE;QACvD,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAE1C,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,EAAG,CAAW,CAAC,OAAO,EAAE;gBACxD,IAAI,EAAE,4DAA4D;aACnE,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAe,CAAC;YAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChC,GAAG,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG;gBAChC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG;gBACnB,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,IAAI,EAAE,EAAE;aACnD,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAC9B,WAAW,CAAC,IAA4C,EAAE;gBACxD,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;gBAC7B,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;gBAC/B,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE;aACvC,CAAC,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,EAAE,2BAA2B,EAAE;oBAC/D,IAAI,EAAE,gDAAgD;iBACvD,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,qBAAsB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 mock show <api> — structured view of a single mock server.
|
|
3
|
+
*
|
|
4
|
+
* Backend lacks a GET /mocks/{id} endpoint, so we fetch the full list and
|
|
5
|
+
* filter client-side by API name or id. Cheap enough for any realistic org.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
export declare function registerMockShowCommand(mock: Command): void;
|
|
9
|
+
//# sourceMappingURL=show.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../../src/commands/mock/show.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,QAkDpD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 mock show <api> — structured view of a single mock server.
|
|
3
|
+
*
|
|
4
|
+
* Backend lacks a GET /mocks/{id} endpoint, so we fetch the full list and
|
|
5
|
+
* filter client-side by API name or id. Cheap enough for any realistic org.
|
|
6
|
+
*/
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { createOrgApiClient, is401 } from "../../lib/api-client.js";
|
|
9
|
+
import { requireOrgContext } from "../../lib/auth-context.js";
|
|
10
|
+
import { ExitCode } from "../../lib/exit-codes.js";
|
|
11
|
+
import { emit, fail, resolveOutputContext } from "../../lib/output/index.js";
|
|
12
|
+
export function registerMockShowCommand(mock) {
|
|
13
|
+
mock
|
|
14
|
+
.command("show <api>")
|
|
15
|
+
.description("Show details for the mock server tied to <api> (name or UUID).")
|
|
16
|
+
.option("--org <uuid>", "Org id override")
|
|
17
|
+
.option("--output <format>", "Output format: text, json, or yaml (default: text)")
|
|
18
|
+
.action(async (api, opts) => {
|
|
19
|
+
const outCtx = resolveOutputContext(opts);
|
|
20
|
+
let authCtx;
|
|
21
|
+
try {
|
|
22
|
+
authCtx = requireOrgContext(opts.org);
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
fail(outCtx, ExitCode.AUTH_MISSING, e.message, {
|
|
26
|
+
hint: "Set SPEC0_TOKEN + SPEC0_ORG_ID, or run 'spec0 auth login'.",
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const client = createOrgApiClient(authCtx);
|
|
30
|
+
try {
|
|
31
|
+
const rows = (await client.getJson("/api-management/cli/v1/mocks"));
|
|
32
|
+
const needle = api.toLowerCase();
|
|
33
|
+
const hit = rows.find((r) => (r.apiName ?? "").toLowerCase() === needle || (r.apiId ?? "").toLowerCase() === needle);
|
|
34
|
+
if (!hit) {
|
|
35
|
+
fail(outCtx, ExitCode.NOT_FOUND, `No mock server found for '${api}'.`, {
|
|
36
|
+
hint: "Run 'spec0 mock list' to see existing mocks, or 'spec0 mock create --api <name>' to provision one.",
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const result = {
|
|
40
|
+
apiId: hit.apiId,
|
|
41
|
+
apiName: hit.apiName,
|
|
42
|
+
mockServerId: hit.mockServerId,
|
|
43
|
+
name: hit.name,
|
|
44
|
+
mockUrl: `${authCtx.apiUrl}${hit.mockBaseUrl ?? ""}`,
|
|
45
|
+
};
|
|
46
|
+
emit(outCtx, result, renderShowText);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
if (is401(err)) {
|
|
50
|
+
fail(outCtx, ExitCode.AUTH_MISSING, "Token invalid or expired.", {
|
|
51
|
+
hint: "Run 'spec0 auth login' or refresh SPEC0_TOKEN.",
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
fail(outCtx, ExitCode.GENERIC, `mock show failed: ${err.message}`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function renderShowText(r) {
|
|
59
|
+
const lines = [];
|
|
60
|
+
lines.push(chalk.bold(`mock for ${r.apiName ?? r.apiId ?? "(unknown)"}`));
|
|
61
|
+
lines.push("");
|
|
62
|
+
lines.push(` name: ${r.name ?? "—"}`);
|
|
63
|
+
lines.push(` api id: ${r.apiId ?? "—"}`);
|
|
64
|
+
lines.push(` mock server: ${r.mockServerId ?? "—"}`);
|
|
65
|
+
lines.push(` mock url: ${r.mockUrl}`);
|
|
66
|
+
return lines.join("\n");
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/commands/mock/show.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 mock url <api> — single-line URL emitter for CI one-liners.
|
|
3
|
+
*
|
|
4
|
+
* Intentionally terse: prints the resolved mock URL and nothing else so it can
|
|
5
|
+
* be captured straight into a shell var (`export MOCK=$(spec0 mock url foo)`).
|
|
6
|
+
* For a richer view, use `spec0 mock show`.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from "commander";
|
|
9
|
+
export declare function registerMockUrlCommand(mock: Command): void;
|
|
10
|
+
//# sourceMappingURL=url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/commands/mock/url.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,QAgCnD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 mock url <api> — single-line URL emitter for CI one-liners.
|
|
3
|
+
*
|
|
4
|
+
* Intentionally terse: prints the resolved mock URL and nothing else so it can
|
|
5
|
+
* be captured straight into a shell var (`export MOCK=$(spec0 mock url foo)`).
|
|
6
|
+
* For a richer view, use `spec0 mock show`.
|
|
7
|
+
*/
|
|
8
|
+
import { createOrgApiClient, is401 } from "../../lib/api-client.js";
|
|
9
|
+
import { requireOrgContext } from "../../lib/auth-context.js";
|
|
10
|
+
import { ExitCode, exit } from "../../lib/exit-codes.js";
|
|
11
|
+
export function registerMockUrlCommand(mock) {
|
|
12
|
+
mock
|
|
13
|
+
.command("url <api>")
|
|
14
|
+
.description("Print mock base URL for <api> (name or UUID). One line, pipe-friendly.")
|
|
15
|
+
.option("--org <uuid>", "Org id override")
|
|
16
|
+
.action(async (api, opts) => {
|
|
17
|
+
let authCtx;
|
|
18
|
+
try {
|
|
19
|
+
authCtx = requireOrgContext(opts.org);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
exit(ExitCode.AUTH_MISSING, e.message);
|
|
23
|
+
}
|
|
24
|
+
const client = createOrgApiClient(authCtx);
|
|
25
|
+
try {
|
|
26
|
+
const rows = (await client.getJson("/api-management/cli/v1/mocks"));
|
|
27
|
+
const needle = api.toLowerCase();
|
|
28
|
+
const hit = rows.find((r) => (r.apiName ?? "").toLowerCase() === needle || (r.apiId ?? "").toLowerCase() === needle);
|
|
29
|
+
if (!hit) {
|
|
30
|
+
exit(ExitCode.NOT_FOUND, `No mock server found for '${api}'.`);
|
|
31
|
+
}
|
|
32
|
+
process.stdout.write(`${authCtx.apiUrl}${hit.mockBaseUrl ?? ""}\n`);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
if (is401(err)) {
|
|
36
|
+
exit(ExitCode.AUTH_MISSING, "Token invalid or expired. Run 'spec0 auth login'.");
|
|
37
|
+
}
|
|
38
|
+
exit(ExitCode.GENERIC, `mock url failed: ${err.message}`);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/commands/mock/url.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAGzD,MAAM,UAAU,sBAAsB,CAAC,IAAa;IAClD,IAAI;SACD,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,wEAAwE,CAAC;SACrF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAAsB,EAAE,EAAE;QACpD,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAe,CAAC;YAClF,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CACnB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CACzF,CAAC;YACF,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,6BAA6B,GAAG,IAAI,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,mDAAmD,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,oBAAqB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/commands/mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA2GpD"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 mock create | list | url | delete | regenerate-key | logs
|
|
3
|
+
*/
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { createOrgApiClient, is401 } from "../lib/api-client.js";
|
|
6
|
+
import { requireOrgContext } from "../lib/auth-context.js";
|
|
7
|
+
import { ExitCode, exit } from "../lib/exit-codes.js";
|
|
8
|
+
import { emit, resolveOutputContext } from "../lib/output/index.js";
|
|
9
|
+
import { renderTable } from "../lib/output/table.js";
|
|
10
|
+
export function registerMockCommands(program) {
|
|
11
|
+
const mock = program.command("mock").description("Mock server management");
|
|
12
|
+
mock
|
|
13
|
+
.command("create")
|
|
14
|
+
.description("Create mock server, print URL and key")
|
|
15
|
+
.option("--api <name>", "API name (required unless --api-id is set)")
|
|
16
|
+
.option("--api-id <uuid>", "API id")
|
|
17
|
+
.option("--org <uuid>", "Org id override")
|
|
18
|
+
.action(async (opts) => {
|
|
19
|
+
let ctx;
|
|
20
|
+
try {
|
|
21
|
+
ctx = requireOrgContext(opts.org);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
console.error(chalk.red(e.message));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
if (!opts.api && !opts.apiId) {
|
|
28
|
+
console.error(chalk.red("Provide --api <name> or --api-id <uuid>"));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const client = createOrgApiClient(ctx);
|
|
32
|
+
const body = {
|
|
33
|
+
apiName: opts.api,
|
|
34
|
+
apiId: opts.apiId,
|
|
35
|
+
};
|
|
36
|
+
try {
|
|
37
|
+
const res = (await client.postJson("/api-management/cli/v1/mocks", body));
|
|
38
|
+
const base = ctx.apiUrl;
|
|
39
|
+
const fullUrl = `${base}${res.mockBaseUrl ?? ""}`;
|
|
40
|
+
console.log(chalk.green("Mock server:"));
|
|
41
|
+
console.log(` Mock URL: ${fullUrl}`);
|
|
42
|
+
if (res.apiKey) {
|
|
43
|
+
console.log(` API Key: ${res.apiKey} (copy and keep safe — shown once)`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log(chalk.yellow(" (Existing mock — API key was issued at creation.)"));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
if (is401(err)) {
|
|
51
|
+
console.error(chalk.red("Token invalid. Run 'spec0 auth login'."));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
console.error(chalk.red(err.message));
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
mock
|
|
59
|
+
.command("list")
|
|
60
|
+
.description("List all mock servers")
|
|
61
|
+
.option("--org <uuid>", "Org id override")
|
|
62
|
+
.option("--output <format>", "Output format: text, json, or yaml (default: text)")
|
|
63
|
+
.action(async (opts) => {
|
|
64
|
+
const outCtx = resolveOutputContext(opts);
|
|
65
|
+
let authCtx;
|
|
66
|
+
try {
|
|
67
|
+
authCtx = requireOrgContext(opts.org);
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
exit(ExitCode.AUTH_MISSING, e.message);
|
|
71
|
+
}
|
|
72
|
+
const client = createOrgApiClient(authCtx);
|
|
73
|
+
try {
|
|
74
|
+
const rows = (await client.getJson("/api-management/cli/v1/mocks"));
|
|
75
|
+
const enriched = rows.map((m) => ({
|
|
76
|
+
api: m.apiName ?? m.apiId ?? "—",
|
|
77
|
+
name: m.name ?? "—",
|
|
78
|
+
mockUrl: `${authCtx.apiUrl}${m.mockBaseUrl ?? ""}`,
|
|
79
|
+
}));
|
|
80
|
+
emit(outCtx, enriched, (data) => renderTable(data, [
|
|
81
|
+
{ key: "api", header: "API" },
|
|
82
|
+
{ key: "name", header: "Name" },
|
|
83
|
+
{ key: "mockUrl", header: "Mock URL" },
|
|
84
|
+
]));
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
if (is401(err)) {
|
|
88
|
+
exit(ExitCode.AUTH_MISSING, "Token invalid or expired. Run 'spec0 auth login'.");
|
|
89
|
+
}
|
|
90
|
+
exit(ExitCode.GENERIC, err.message);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
mock
|
|
94
|
+
.command("url <api-name>")
|
|
95
|
+
.description("Print mock base URL for API")
|
|
96
|
+
.option("--org <uuid>", "Org id override")
|
|
97
|
+
.action(async (apiName, opts) => {
|
|
98
|
+
let ctx;
|
|
99
|
+
try {
|
|
100
|
+
ctx = requireOrgContext(opts.org);
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
console.error(chalk.red(e.message));
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
const client = createOrgApiClient(ctx);
|
|
107
|
+
const rows = (await client.getJson("/api-management/cli/v1/mocks"));
|
|
108
|
+
const hit = rows.find((r) => (r.apiName ?? "").toLowerCase() === apiName.toLowerCase());
|
|
109
|
+
if (!hit) {
|
|
110
|
+
console.error(chalk.red(`No mock found for API name '${apiName}'.`));
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
console.log(`${ctx.apiUrl}${hit.mockBaseUrl ?? ""}`);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/commands/mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 publish — publish an OpenAPI spec to the public API registry.
|
|
3
|
+
*
|
|
4
|
+
* Unlike `spec0 register` (which is team-scoped and private), `publish` creates
|
|
5
|
+
* org-scoped public APIs accessible via a shareable URL with no authentication.
|
|
6
|
+
*
|
|
7
|
+
* URL convention: {platform}/public/registry/{org-slug}/{api-slug}
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from "commander";
|
|
10
|
+
export declare function registerPublishCommand(program: Command): void;
|
|
11
|
+
//# sourceMappingURL=publish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwEpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QAiQtD"}
|