@heossi/qnsi 0.3.2
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/CHANGELOG.md +67 -0
- package/LICENSE.md +8 -0
- package/README.md +200 -0
- package/dist/_activation/activation-client.d.ts +65 -0
- package/dist/_activation/activation-client.d.ts.map +1 -0
- package/dist/_activation/activation-client.js +164 -0
- package/dist/_activation/activation-client.js.map +1 -0
- package/dist/_activation/index.d.ts +10 -0
- package/dist/_activation/index.d.ts.map +1 -0
- package/dist/_activation/index.js +10 -0
- package/dist/_activation/index.js.map +1 -0
- package/dist/_activation/types.d.ts +128 -0
- package/dist/_activation/types.d.ts.map +1 -0
- package/dist/_activation/types.js +94 -0
- package/dist/_activation/types.js.map +1 -0
- package/dist/_internal.d.ts +52 -0
- package/dist/_internal.d.ts.map +1 -0
- package/dist/_internal.js +235 -0
- package/dist/_internal.js.map +1 -0
- package/dist/access.d.ts +32 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +33 -0
- package/dist/access.js.map +1 -0
- package/dist/ai.d.ts +51 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +53 -0
- package/dist/ai.js.map +1 -0
- package/dist/audit.d.ts +18 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +21 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth.d.ts +31 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +69 -0
- package/dist/auth.js.map +1 -0
- package/dist/autogen/executor.d.ts +200 -0
- package/dist/autogen/executor.d.ts.map +1 -0
- package/dist/autogen/executor.js +277 -0
- package/dist/autogen/executor.js.map +1 -0
- package/dist/autogen/index.d.ts +18 -0
- package/dist/autogen/index.d.ts.map +1 -0
- package/dist/autogen/index.js +17 -0
- package/dist/autogen/index.js.map +1 -0
- package/dist/billing.d.ts +22 -0
- package/dist/billing.d.ts.map +1 -0
- package/dist/billing.js +33 -0
- package/dist/billing.js.map +1 -0
- package/dist/browser/encrypt.d.ts +68 -0
- package/dist/browser/encrypt.d.ts.map +1 -0
- package/dist/browser/encrypt.js +191 -0
- package/dist/browser/encrypt.js.map +1 -0
- package/dist/browser/index.d.ts +39 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +41 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/noble-provider.d.ts +10 -0
- package/dist/browser/noble-provider.d.ts.map +1 -0
- package/dist/browser/noble-provider.js +130 -0
- package/dist/browser/noble-provider.js.map +1 -0
- package/dist/browser/pqc-types.d.ts +40 -0
- package/dist/browser/pqc-types.d.ts.map +1 -0
- package/dist/browser/pqc-types.js +2 -0
- package/dist/browser/pqc-types.js.map +1 -0
- package/dist/browser/provider-setup.d.ts +70 -0
- package/dist/browser/provider-setup.d.ts.map +1 -0
- package/dist/browser/provider-setup.js +101 -0
- package/dist/browser/provider-setup.js.map +1 -0
- package/dist/browser/sdk-package-version.d.ts +12 -0
- package/dist/browser/sdk-package-version.d.ts.map +1 -0
- package/dist/browser/sdk-package-version.js +12 -0
- package/dist/browser/sdk-package-version.js.map +1 -0
- package/dist/browser/sign.d.ts +65 -0
- package/dist/browser/sign.d.ts.map +1 -0
- package/dist/browser/sign.js +124 -0
- package/dist/browser/sign.js.map +1 -0
- package/dist/browser/telemetry.d.ts +98 -0
- package/dist/browser/telemetry.d.ts.map +1 -0
- package/dist/browser/telemetry.js +93 -0
- package/dist/browser/telemetry.js.map +1 -0
- package/dist/cli/commands/access-control.d.ts +4 -0
- package/dist/cli/commands/access-control.d.ts.map +1 -0
- package/dist/cli/commands/access-control.js +183 -0
- package/dist/cli/commands/access-control.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +4 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +70 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +4 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +46 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/billing.d.ts +4 -0
- package/dist/cli/commands/billing.d.ts.map +1 -0
- package/dist/cli/commands/billing.js +179 -0
- package/dist/cli/commands/billing.js.map +1 -0
- package/dist/cli/commands/crypto-policy.d.ts +4 -0
- package/dist/cli/commands/crypto-policy.d.ts.map +1 -0
- package/dist/cli/commands/crypto-policy.js +130 -0
- package/dist/cli/commands/crypto-policy.js.map +1 -0
- package/dist/cli/commands/kms.d.ts +4 -0
- package/dist/cli/commands/kms.d.ts.map +1 -0
- package/dist/cli/commands/kms.js +153 -0
- package/dist/cli/commands/kms.js.map +1 -0
- package/dist/cli/commands/observability.d.ts +4 -0
- package/dist/cli/commands/observability.d.ts.map +1 -0
- package/dist/cli/commands/observability.js +97 -0
- package/dist/cli/commands/observability.js.map +1 -0
- package/dist/cli/commands/search.d.ts +4 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +66 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/security.d.ts +4 -0
- package/dist/cli/commands/security.d.ts.map +1 -0
- package/dist/cli/commands/security.js +136 -0
- package/dist/cli/commands/security.js.map +1 -0
- package/dist/cli/commands/storage.d.ts +4 -0
- package/dist/cli/commands/storage.d.ts.map +1 -0
- package/dist/cli/commands/storage.js +85 -0
- package/dist/cli/commands/storage.js.map +1 -0
- package/dist/cli/commands/tenant.d.ts +4 -0
- package/dist/cli/commands/tenant.d.ts.map +1 -0
- package/dist/cli/commands/tenant.js +82 -0
- package/dist/cli/commands/tenant.js.map +1 -0
- package/dist/cli/commands/test-utils.d.ts +15 -0
- package/dist/cli/commands/test-utils.d.ts.map +1 -0
- package/dist/cli/commands/test-utils.js +72 -0
- package/dist/cli/commands/test-utils.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +4 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +111 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/config.d.ts +32 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +105 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +54 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/audit-logger.d.ts +17 -0
- package/dist/cli/utils/audit-logger.d.ts.map +1 -0
- package/dist/cli/utils/audit-logger.js +52 -0
- package/dist/cli/utils/audit-logger.js.map +1 -0
- package/dist/cli/utils/auth.d.ts +4 -0
- package/dist/cli/utils/auth.d.ts.map +1 -0
- package/dist/cli/utils/auth.js +100 -0
- package/dist/cli/utils/auth.js.map +1 -0
- package/dist/cli/utils/backend-validator.d.ts +19 -0
- package/dist/cli/utils/backend-validator.d.ts.map +1 -0
- package/dist/cli/utils/backend-validator.js +72 -0
- package/dist/cli/utils/backend-validator.js.map +1 -0
- package/dist/cli/utils/command-config.d.ts +4 -0
- package/dist/cli/utils/command-config.d.ts.map +1 -0
- package/dist/cli/utils/command-config.js +29 -0
- package/dist/cli/utils/command-config.js.map +1 -0
- package/dist/cli/utils/fetcher.d.ts +3 -0
- package/dist/cli/utils/fetcher.d.ts.map +1 -0
- package/dist/cli/utils/fetcher.js +30 -0
- package/dist/cli/utils/fetcher.js.map +1 -0
- package/dist/cli/utils/https-validator.d.ts +9 -0
- package/dist/cli/utils/https-validator.d.ts.map +1 -0
- package/dist/cli/utils/https-validator.js +35 -0
- package/dist/cli/utils/https-validator.js.map +1 -0
- package/dist/cli/utils/output.d.ts +6 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +29 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/cli/utils/pqc-validator.d.ts +17 -0
- package/dist/cli/utils/pqc-validator.d.ts.map +1 -0
- package/dist/cli/utils/pqc-validator.js +62 -0
- package/dist/cli/utils/pqc-validator.js.map +1 -0
- package/dist/cli/utils/prompt.d.ts +4 -0
- package/dist/cli/utils/prompt.d.ts.map +1 -0
- package/dist/cli/utils/prompt.js +30 -0
- package/dist/cli/utils/prompt.js.map +1 -0
- package/dist/cli/utils/rate-limiter.d.ts +15 -0
- package/dist/cli/utils/rate-limiter.d.ts.map +1 -0
- package/dist/cli/utils/rate-limiter.js +46 -0
- package/dist/cli/utils/rate-limiter.js.map +1 -0
- package/dist/cli/utils/sanitize.d.ts +3 -0
- package/dist/cli/utils/sanitize.d.ts.map +1 -0
- package/dist/cli/utils/sanitize.js +44 -0
- package/dist/cli/utils/sanitize.js.map +1 -0
- package/dist/cli/utils/security-headers.d.ts +18 -0
- package/dist/cli/utils/security-headers.d.ts.map +1 -0
- package/dist/cli/utils/security-headers.js +32 -0
- package/dist/cli/utils/security-headers.js.map +1 -0
- package/dist/cli/utils/token-cache.d.ts +4 -0
- package/dist/cli/utils/token-cache.d.ts.map +1 -0
- package/dist/cli/utils/token-cache.js +22 -0
- package/dist/cli/utils/token-cache.js.map +1 -0
- package/dist/client.d.ts +52 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +78 -0
- package/dist/client.js.map +1 -0
- package/dist/crypto-inventory.d.ts +21 -0
- package/dist/crypto-inventory.d.ts.map +1 -0
- package/dist/crypto-inventory.js +28 -0
- package/dist/crypto-inventory.js.map +1 -0
- package/dist/errors.d.ts +35 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +64 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/kms.d.ts +30 -0
- package/dist/kms.d.ts.map +1 -0
- package/dist/kms.js +92 -0
- package/dist/kms.js.map +1 -0
- package/dist/langchain/index.d.ts +22 -0
- package/dist/langchain/index.d.ts.map +1 -0
- package/dist/langchain/index.js +23 -0
- package/dist/langchain/index.js.map +1 -0
- package/dist/langchain/toolkit.d.ts +85 -0
- package/dist/langchain/toolkit.d.ts.map +1 -0
- package/dist/langchain/toolkit.js +146 -0
- package/dist/langchain/toolkit.js.map +1 -0
- package/dist/langchain/tools/audit.d.ts +43 -0
- package/dist/langchain/tools/audit.d.ts.map +1 -0
- package/dist/langchain/tools/audit.js +78 -0
- package/dist/langchain/tools/audit.js.map +1 -0
- package/dist/langchain/tools/kms.d.ts +62 -0
- package/dist/langchain/tools/kms.d.ts.map +1 -0
- package/dist/langchain/tools/kms.js +120 -0
- package/dist/langchain/tools/kms.js.map +1 -0
- package/dist/langchain/tools/vault.d.ts +69 -0
- package/dist/langchain/tools/vault.d.ts.map +1 -0
- package/dist/langchain/tools/vault.js +107 -0
- package/dist/langchain/tools/vault.js.map +1 -0
- package/dist/langchain/vault-client.d.ts +82 -0
- package/dist/langchain/vault-client.d.ts.map +1 -0
- package/dist/langchain/vault-client.js +133 -0
- package/dist/langchain/vault-client.js.map +1 -0
- package/dist/llamaindex/index.d.ts +16 -0
- package/dist/llamaindex/index.d.ts.map +1 -0
- package/dist/llamaindex/index.js +15 -0
- package/dist/llamaindex/index.js.map +1 -0
- package/dist/llamaindex/sse.d.ts +36 -0
- package/dist/llamaindex/sse.d.ts.map +1 -0
- package/dist/llamaindex/sse.js +151 -0
- package/dist/llamaindex/sse.js.map +1 -0
- package/dist/llamaindex/vector-store.d.ts +101 -0
- package/dist/llamaindex/vector-store.d.ts.map +1 -0
- package/dist/llamaindex/vector-store.js +348 -0
- package/dist/llamaindex/vector-store.js.map +1 -0
- package/dist/search.d.ts +32 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +27 -0
- package/dist/search.js.map +1 -0
- package/dist/storage.d.ts +32 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +58 -0
- package/dist/storage.js.map +1 -0
- package/dist/tenant.d.ts +25 -0
- package/dist/tenant.d.ts.map +1 -0
- package/dist/tenant.js +36 -0
- package/dist/tenant.js.map +1 -0
- package/dist/vault.d.ts +22 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +43 -0
- package/dist/vault.js.map +1 -0
- package/dist/webhooks.d.ts +32 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +77 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +118 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { EXIT_CODES } from "../config.js";
|
|
2
|
+
import { getAuthHeaders } from "../utils/auth.js";
|
|
3
|
+
import { getEffectiveConfig } from "../utils/command-config.js";
|
|
4
|
+
import { fetchWithBackendHandling } from "../utils/fetcher.js";
|
|
5
|
+
import { printError, printJson, printTable } from "../utils/output.js";
|
|
6
|
+
export function registerObservabilityCommands(program, config) {
|
|
7
|
+
const observability = program
|
|
8
|
+
.command("observability")
|
|
9
|
+
.description("Observability service commands");
|
|
10
|
+
const slos = observability.command("slos").description("SLO operations");
|
|
11
|
+
slos
|
|
12
|
+
.command("list")
|
|
13
|
+
.description("List SLOs")
|
|
14
|
+
.option("--limit <number>", "Number of SLOs to return", "50")
|
|
15
|
+
.option("--cursor <cursor>", "Pagination cursor")
|
|
16
|
+
.action(async (options, command) => {
|
|
17
|
+
if (!config.tenantId) {
|
|
18
|
+
printError("QNSP_TENANT_ID must be set");
|
|
19
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const effectiveConfig = getEffectiveConfig(config, command);
|
|
24
|
+
const headers = await getAuthHeaders(effectiveConfig);
|
|
25
|
+
const obsUrl = effectiveConfig.observabilityServiceUrl;
|
|
26
|
+
const url = new URL(`${obsUrl}/observability/v1/slos`);
|
|
27
|
+
url.searchParams.set("limit", options.limit);
|
|
28
|
+
if (options.cursor) {
|
|
29
|
+
url.searchParams.set("cursor", options.cursor);
|
|
30
|
+
}
|
|
31
|
+
const response = await fetchWithBackendHandling(effectiveConfig, url.toString(), {
|
|
32
|
+
headers,
|
|
33
|
+
});
|
|
34
|
+
if (!response.ok && [429, 402, 403, 507].includes(response.status)) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
const errorText = await response.text();
|
|
39
|
+
printError(`Failed to list SLOs: ${response.status} ${errorText}`);
|
|
40
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const data = (await response.json());
|
|
44
|
+
if (effectiveConfig.outputFormat === "json") {
|
|
45
|
+
printJson(data);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
printTable((data.slos ?? []));
|
|
49
|
+
}
|
|
50
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
printError(error instanceof Error ? error.message : "Failed to list SLOs");
|
|
55
|
+
process.exit(EXIT_CODES.NETWORK_ERROR);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
const otlp = observability.command("otlp").description("OTLP ingestion endpoints");
|
|
60
|
+
otlp
|
|
61
|
+
.command("status")
|
|
62
|
+
.description("Get OTLP ingestion status")
|
|
63
|
+
.action(async (_options, command) => {
|
|
64
|
+
try {
|
|
65
|
+
const effectiveConfig = getEffectiveConfig(config, command);
|
|
66
|
+
const headers = await getAuthHeaders(effectiveConfig);
|
|
67
|
+
const obsUrl = effectiveConfig.observabilityServiceUrl;
|
|
68
|
+
const response = await fetchWithBackendHandling(effectiveConfig, `${obsUrl}/health`, {
|
|
69
|
+
headers,
|
|
70
|
+
});
|
|
71
|
+
if (!response.ok && [429, 402, 403, 507].includes(response.status)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
const errorText = await response.text();
|
|
76
|
+
printError(`Failed to get status: ${response.status} ${errorText}`);
|
|
77
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const data = await response.json();
|
|
81
|
+
if (effectiveConfig.outputFormat === "json") {
|
|
82
|
+
printJson(data);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
printTable(data);
|
|
86
|
+
}
|
|
87
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
printError(error instanceof Error ? error.message : "Failed to get OTLP status");
|
|
92
|
+
process.exit(EXIT_CODES.NETWORK_ERROR);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.js","sourceRoot":"","sources":["../../../src/cli/commands/observability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAiEhF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { EXIT_CODES } from "../config.js";
|
|
2
|
+
import { getAuthHeaders } from "../utils/auth.js";
|
|
3
|
+
import { getEffectiveConfig } from "../utils/command-config.js";
|
|
4
|
+
import { fetchWithBackendHandling } from "../utils/fetcher.js";
|
|
5
|
+
import { printError, printJson, printTable } from "../utils/output.js";
|
|
6
|
+
export function registerSearchCommands(program, config) {
|
|
7
|
+
const search = program.command("search").description("Search service commands");
|
|
8
|
+
search
|
|
9
|
+
.command("query")
|
|
10
|
+
.description("Execute search query")
|
|
11
|
+
.requiredOption("--query <query>", "Search query")
|
|
12
|
+
.option("--limit <number>", "Number of results to return", "20")
|
|
13
|
+
.action(async (options, command) => {
|
|
14
|
+
try {
|
|
15
|
+
const effectiveConfig = getEffectiveConfig(config, command);
|
|
16
|
+
if (!effectiveConfig.tenantId) {
|
|
17
|
+
printError("QNSP_TENANT_ID must be set");
|
|
18
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const headers = await getAuthHeaders(effectiveConfig);
|
|
22
|
+
const searchUrl = effectiveConfig.searchServiceUrl;
|
|
23
|
+
const url = new URL(`${searchUrl}/search/v1/documents`);
|
|
24
|
+
url.searchParams.set("tenantId", effectiveConfig.tenantId);
|
|
25
|
+
url.searchParams.set("q", options.query);
|
|
26
|
+
url.searchParams.set("limit", String(Number.parseInt(options.limit, 10)));
|
|
27
|
+
const response = await fetchWithBackendHandling(effectiveConfig, url.toString(), {
|
|
28
|
+
headers,
|
|
29
|
+
});
|
|
30
|
+
if (!response.ok && [429, 402, 403, 507].includes(response.status)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
const errorText = await response.text();
|
|
35
|
+
printError(`Search failed: ${response.status} ${errorText}`);
|
|
36
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const data = (await response.json());
|
|
40
|
+
if (effectiveConfig.outputFormat === "json") {
|
|
41
|
+
printJson(data);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
printTable((data.items ?? []));
|
|
45
|
+
}
|
|
46
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
printError(error instanceof Error ? error.message : "Search failed");
|
|
51
|
+
process.exit(EXIT_CODES.NETWORK_ERROR);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
const indexes = search.command("indexes").description("Index operations");
|
|
56
|
+
indexes
|
|
57
|
+
.command("list")
|
|
58
|
+
.description("List search indexes")
|
|
59
|
+
.action(async () => {
|
|
60
|
+
printError("search indexes list is unavailable: search-service does not expose a list-indexes endpoint. " +
|
|
61
|
+
"Use search query, or the optimization endpoints in search-service.");
|
|
62
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
63
|
+
return;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAiJlF"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { EXIT_CODES } from "../config.js";
|
|
2
|
+
import { getAuthHeaders } from "../utils/auth.js";
|
|
3
|
+
import { getEffectiveConfig } from "../utils/command-config.js";
|
|
4
|
+
import { fetchWithBackendHandling } from "../utils/fetcher.js";
|
|
5
|
+
import { printError, printJson, printTable } from "../utils/output.js";
|
|
6
|
+
export function registerSecurityCommands(program, config) {
|
|
7
|
+
const security = program.command("security").description("Security monitoring service commands");
|
|
8
|
+
const alerts = security.command("alerts").description("Security alert operations");
|
|
9
|
+
alerts
|
|
10
|
+
.command("list")
|
|
11
|
+
.description("List security alerts")
|
|
12
|
+
.option("--severity <severity>", "Filter by severity")
|
|
13
|
+
.option("--status <status>", "Filter by status")
|
|
14
|
+
.option("--limit <number>", "Number of alerts to return", "50")
|
|
15
|
+
.option("--cursor <cursor>", "Pagination cursor")
|
|
16
|
+
.action(async (options, command) => {
|
|
17
|
+
if (!config.tenantId) {
|
|
18
|
+
printError("QNSP_TENANT_ID must be set");
|
|
19
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const effectiveConfig = getEffectiveConfig(config, command);
|
|
24
|
+
if (!effectiveConfig.tenantId) {
|
|
25
|
+
printError("QNSP_TENANT_ID must be set");
|
|
26
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const headers = await getAuthHeaders(effectiveConfig);
|
|
30
|
+
const secUrl = effectiveConfig.securityMonitoringServiceUrl;
|
|
31
|
+
const url = new URL(`${secUrl}/security/v1/alerts`);
|
|
32
|
+
url.searchParams.set("tenantId", effectiveConfig.tenantId);
|
|
33
|
+
url.searchParams.set("limit", options.limit);
|
|
34
|
+
if (options.severity) {
|
|
35
|
+
url.searchParams.set("severity", options.severity);
|
|
36
|
+
}
|
|
37
|
+
if (options.status) {
|
|
38
|
+
url.searchParams.set("status", options.status);
|
|
39
|
+
}
|
|
40
|
+
if (options.cursor) {
|
|
41
|
+
url.searchParams.set("cursor", options.cursor);
|
|
42
|
+
}
|
|
43
|
+
const response = await fetchWithBackendHandling(effectiveConfig, url.toString(), {
|
|
44
|
+
headers,
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok && [429, 402, 403, 507].includes(response.status)) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
const errorText = await response.text();
|
|
51
|
+
printError(`Failed to list alerts: ${response.status} ${errorText}`);
|
|
52
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const data = (await response.json());
|
|
56
|
+
if (effectiveConfig.outputFormat === "json") {
|
|
57
|
+
printJson(data);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
printTable((data.items ?? []));
|
|
61
|
+
}
|
|
62
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
printError(error instanceof Error ? error.message : "Failed to list alerts");
|
|
67
|
+
process.exit(EXIT_CODES.NETWORK_ERROR);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
alerts
|
|
72
|
+
.command("get")
|
|
73
|
+
.description("Get alert details")
|
|
74
|
+
.argument("<alertId>", "Alert identifier")
|
|
75
|
+
.action(async () => {
|
|
76
|
+
printError("security alerts get is not available: security-monitoring-service does not expose /security/v1/alerts/:id. " +
|
|
77
|
+
"Use security alerts list with filters instead.");
|
|
78
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
79
|
+
});
|
|
80
|
+
const breaches = security.command("breaches").description("Data breach detection");
|
|
81
|
+
breaches
|
|
82
|
+
.command("list")
|
|
83
|
+
.description("List detected breaches")
|
|
84
|
+
.option("--limit <number>", "Number of breaches to return", "50")
|
|
85
|
+
.option("--cursor <cursor>", "Pagination cursor")
|
|
86
|
+
.action(async (options, command) => {
|
|
87
|
+
if (!config.tenantId) {
|
|
88
|
+
printError("QNSP_TENANT_ID must be set");
|
|
89
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const effectiveConfig = getEffectiveConfig(config, command);
|
|
94
|
+
if (!effectiveConfig.tenantId) {
|
|
95
|
+
printError("QNSP_TENANT_ID must be set");
|
|
96
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const headers = await getAuthHeaders(effectiveConfig);
|
|
100
|
+
const secUrl = effectiveConfig.securityMonitoringServiceUrl;
|
|
101
|
+
const url = new URL(`${secUrl}/security/v1/breaches`);
|
|
102
|
+
url.searchParams.set("tenantId", effectiveConfig.tenantId);
|
|
103
|
+
url.searchParams.set("limit", options.limit);
|
|
104
|
+
if (options.cursor) {
|
|
105
|
+
url.searchParams.set("cursor", options.cursor);
|
|
106
|
+
}
|
|
107
|
+
const response = await fetchWithBackendHandling(effectiveConfig, url.toString(), {
|
|
108
|
+
headers,
|
|
109
|
+
});
|
|
110
|
+
if (!response.ok && [429, 402, 403, 507].includes(response.status)) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (!response.ok) {
|
|
114
|
+
const errorText = await response.text();
|
|
115
|
+
printError(`Failed to list breaches: ${response.status} ${errorText}`);
|
|
116
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const data = (await response.json());
|
|
120
|
+
if (effectiveConfig.outputFormat === "json") {
|
|
121
|
+
printJson(data);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
printTable((data.breaches ?? []));
|
|
125
|
+
}
|
|
126
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
printError(error instanceof Error ? error.message : "Failed to list breaches");
|
|
131
|
+
process.exit(EXIT_CODES.NETWORK_ERROR);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/cli/commands/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAyFjF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { EXIT_CODES } from "../config.js";
|
|
2
|
+
import { getAuthHeaders } from "../utils/auth.js";
|
|
3
|
+
import { getEffectiveConfig } from "../utils/command-config.js";
|
|
4
|
+
import { fetchWithBackendHandling } from "../utils/fetcher.js";
|
|
5
|
+
import { printError, printJson, printTable } from "../utils/output.js";
|
|
6
|
+
export function registerStorageCommands(program, config) {
|
|
7
|
+
const storage = program.command("storage").description("Storage service commands");
|
|
8
|
+
const objects = storage.command("objects").description("Object operations");
|
|
9
|
+
objects
|
|
10
|
+
.command("list")
|
|
11
|
+
.description("List storage objects")
|
|
12
|
+
.option("--limit <number>", "Number of objects to return", "100")
|
|
13
|
+
.option("--cursor <cursor>", "Pagination cursor")
|
|
14
|
+
.option("--prefix <prefix>", "Filter by prefix")
|
|
15
|
+
.action(async (options, command) => {
|
|
16
|
+
if (!config.tenantId) {
|
|
17
|
+
printError("QNSP_TENANT_ID must be set");
|
|
18
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const effectiveConfig = getEffectiveConfig(config, command);
|
|
23
|
+
if (!effectiveConfig.tenantId) {
|
|
24
|
+
printError("QNSP_TENANT_ID must be set");
|
|
25
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const headers = await getAuthHeaders(effectiveConfig);
|
|
29
|
+
const storageUrl = effectiveConfig.storageServiceUrl;
|
|
30
|
+
const url = new URL(`${storageUrl}/storage/v1/documents`);
|
|
31
|
+
url.searchParams.set("limit", options.limit);
|
|
32
|
+
if (options.cursor) {
|
|
33
|
+
url.searchParams.set("cursor", options.cursor);
|
|
34
|
+
}
|
|
35
|
+
if (options.prefix) {
|
|
36
|
+
url.searchParams.set("prefix", options.prefix);
|
|
37
|
+
}
|
|
38
|
+
const response = await fetchWithBackendHandling(effectiveConfig, url.toString(), {
|
|
39
|
+
headers,
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok && [429, 402, 403, 507].includes(response.status)) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
const errorText = await response.text();
|
|
46
|
+
printError(`Failed to list objects: ${response.status} ${errorText}`);
|
|
47
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const data = (await response.json());
|
|
51
|
+
if (effectiveConfig.outputFormat === "json") {
|
|
52
|
+
printJson(data);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
printTable((data.items ?? []));
|
|
56
|
+
}
|
|
57
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
printError(error instanceof Error ? error.message : "Failed to list objects");
|
|
62
|
+
process.exit(EXIT_CODES.NETWORK_ERROR);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
objects
|
|
67
|
+
.command("get")
|
|
68
|
+
.description("Get storage object metadata")
|
|
69
|
+
.argument("<objectId>", "Object identifier")
|
|
70
|
+
.action(async (_objectId) => {
|
|
71
|
+
printError("storage objects get is not available: storage-service does not expose GET /storage/v1/documents/:id. " +
|
|
72
|
+
"Use storage objects list or the document policy endpoints via the platform APIs.");
|
|
73
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
74
|
+
});
|
|
75
|
+
objects
|
|
76
|
+
.command("delete")
|
|
77
|
+
.description("Delete storage object")
|
|
78
|
+
.argument("<objectId>", "Object identifier")
|
|
79
|
+
.action(async (_objectId) => {
|
|
80
|
+
printError("storage objects delete is not available: storage-service does not expose a delete endpoint for documents. " +
|
|
81
|
+
"Use retention/lifecycle policies or administrative workflows.");
|
|
82
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/cli/commands/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tenant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CA2FhF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { EXIT_CODES } from "../config.js";
|
|
2
|
+
import { getAuthHeaders } from "../utils/auth.js";
|
|
3
|
+
import { getEffectiveConfig } from "../utils/command-config.js";
|
|
4
|
+
import { fetchWithBackendHandling } from "../utils/fetcher.js";
|
|
5
|
+
import { printError, printJson, printTable } from "../utils/output.js";
|
|
6
|
+
export function registerTenantCommands(program, config) {
|
|
7
|
+
const tenant = program.command("tenant").description("Tenant service commands");
|
|
8
|
+
tenant
|
|
9
|
+
.command("get")
|
|
10
|
+
.description("Get tenant details")
|
|
11
|
+
.argument("<tenantId>", "Tenant identifier")
|
|
12
|
+
.action(async (tenantId, _options, command) => {
|
|
13
|
+
try {
|
|
14
|
+
const effectiveConfig = getEffectiveConfig(config, command);
|
|
15
|
+
if (!effectiveConfig.tenantId) {
|
|
16
|
+
printError("QNSP_TENANT_ID must be set");
|
|
17
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (tenantId !== effectiveConfig.tenantId) {
|
|
21
|
+
printError("Cross-tenant access is not allowed from qnsp CLI. " +
|
|
22
|
+
"The requested tenantId must match QNSP_TENANT_ID.");
|
|
23
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const headers = await getAuthHeaders(effectiveConfig);
|
|
27
|
+
const tenantUrl = effectiveConfig.tenantServiceUrl;
|
|
28
|
+
const response = await fetchWithBackendHandling(effectiveConfig, `${tenantUrl}/tenant/v1/tenants/${tenantId}`, { headers });
|
|
29
|
+
if (!response.ok && [429, 402, 403, 507].includes(response.status)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (response.status === 404) {
|
|
33
|
+
printError(`Tenant not found: ${tenantId}`);
|
|
34
|
+
process.exit(EXIT_CODES.NOT_FOUND);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
const errorText = await response.text();
|
|
39
|
+
printError(`Failed to get tenant: ${response.status} ${errorText}`);
|
|
40
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const data = await response.json();
|
|
44
|
+
if (effectiveConfig.outputFormat === "json") {
|
|
45
|
+
printJson(data);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
printTable(data);
|
|
49
|
+
}
|
|
50
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
printError(error instanceof Error ? error.message : "Failed to get tenant");
|
|
55
|
+
process.exit(EXIT_CODES.NETWORK_ERROR);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
tenant
|
|
60
|
+
.command("list")
|
|
61
|
+
.description("List tenants")
|
|
62
|
+
.option("--limit <number>", "Number of tenants to return", "100")
|
|
63
|
+
.option("--cursor <cursor>", "Pagination cursor")
|
|
64
|
+
.action(async () => {
|
|
65
|
+
printError("tenant list is unavailable in qnsp CLI to prevent cross-tenant enumeration. " +
|
|
66
|
+
"Use the Cloud Portal for tenant administration.");
|
|
67
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
68
|
+
return;
|
|
69
|
+
});
|
|
70
|
+
tenant
|
|
71
|
+
.command("create")
|
|
72
|
+
.description("Create a new tenant")
|
|
73
|
+
.requiredOption("--name <name>", "Tenant name")
|
|
74
|
+
.option("--tier <tier>", "Pricing tier", "free")
|
|
75
|
+
.action(async (_options) => {
|
|
76
|
+
printError("tenant create is not available in qnsp CLI. " +
|
|
77
|
+
"Use the Cloud Portal signup flow (or the platform APIs) for tenant provisioning.");
|
|
78
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
79
|
+
return;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=tenant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.js","sourceRoot":"","sources":["../../../src/cli/commands/tenant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Mock, MockInstance } from "vitest";
|
|
2
|
+
import type { CliConfig } from "../config.js";
|
|
3
|
+
/** Explicit return type for setupTestEnvironment to avoid non-portable inferred types from @vitest/spy. */
|
|
4
|
+
export interface TestEnvironment {
|
|
5
|
+
readonly mockFetch: Mock;
|
|
6
|
+
readonly mockExit: MockInstance;
|
|
7
|
+
readonly mockLog: MockInstance;
|
|
8
|
+
readonly mockError: MockInstance;
|
|
9
|
+
readonly mockTable: MockInstance;
|
|
10
|
+
readonly cleanup: () => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function createMockResponse(data: unknown, status?: number, ok?: boolean, headers?: Record<string, string>): Response;
|
|
13
|
+
export declare const mockConfig: CliConfig;
|
|
14
|
+
export declare function setupTestEnvironment(): TestEnvironment;
|
|
15
|
+
//# sourceMappingURL=test-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,2GAA2G;AAC3G,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC7B;AAGD,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,OAAO,EACb,MAAM,SAAM,EACZ,EAAE,UAAO,EACT,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAClC,QAAQ,CAgBV;AAED,eAAO,MAAM,UAAU,EAAE,SAmBxB,CAAC;AAEF,wBAAgB,oBAAoB,IAAI,eAAe,CAmCtD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { vi } from "vitest";
|
|
2
|
+
// Helper to create Response objects that can be cloned
|
|
3
|
+
export function createMockResponse(data, status = 200, ok = true, headers = {}) {
|
|
4
|
+
const body = JSON.stringify(data);
|
|
5
|
+
const responseHeaders = new Headers(headers);
|
|
6
|
+
// Create a response that mimics the Fetch API Response object
|
|
7
|
+
// tailored for our tests which use clone()
|
|
8
|
+
return {
|
|
9
|
+
ok,
|
|
10
|
+
status,
|
|
11
|
+
headers: responseHeaders,
|
|
12
|
+
json: async () => JSON.parse(body),
|
|
13
|
+
text: async () => body,
|
|
14
|
+
clone() {
|
|
15
|
+
return createMockResponse(data, status, ok, headers);
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export const mockConfig = {
|
|
20
|
+
edgeGatewayUrl: null,
|
|
21
|
+
cloudPortalUrl: "https://cloud.qnsp.cuilabs.io",
|
|
22
|
+
authServiceUrl: "http://localhost:8081",
|
|
23
|
+
serviceId: "test-service-id",
|
|
24
|
+
serviceSecret: "test-secret",
|
|
25
|
+
tenantId: "test-tenant",
|
|
26
|
+
kmsServiceUrl: "http://localhost:8095",
|
|
27
|
+
vaultServiceUrl: "http://localhost:8090",
|
|
28
|
+
auditServiceUrl: "http://localhost:8103",
|
|
29
|
+
tenantServiceUrl: "http://localhost:8108",
|
|
30
|
+
billingServiceUrl: "http://localhost:8106/billing",
|
|
31
|
+
accessControlServiceUrl: "http://localhost:8102",
|
|
32
|
+
securityMonitoringServiceUrl: "http://localhost:8104",
|
|
33
|
+
storageServiceUrl: "http://localhost:8092",
|
|
34
|
+
searchServiceUrl: "http://localhost:8101",
|
|
35
|
+
observabilityServiceUrl: "http://localhost:8105",
|
|
36
|
+
outputFormat: "json",
|
|
37
|
+
verbose: false,
|
|
38
|
+
};
|
|
39
|
+
export function setupTestEnvironment() {
|
|
40
|
+
const mockFetch = vi.fn();
|
|
41
|
+
const mockExit = vi.spyOn(process, "exit").mockImplementation(() => undefined);
|
|
42
|
+
const mockLog = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
43
|
+
const mockError = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
44
|
+
const mockTable = vi.spyOn(console, "table").mockImplementation(() => { });
|
|
45
|
+
// Intercept global fetch
|
|
46
|
+
global.fetch = mockFetch;
|
|
47
|
+
// Override process.stdin.isTTY
|
|
48
|
+
Object.defineProperty(process.stdin, "isTTY", {
|
|
49
|
+
value: false,
|
|
50
|
+
configurable: true,
|
|
51
|
+
});
|
|
52
|
+
// Reset NODE_ENV to development to avoid HTTPS validation exit
|
|
53
|
+
const originalNodeEnv = process.env["NODE_ENV"];
|
|
54
|
+
process.env["NODE_ENV"] = "development";
|
|
55
|
+
return {
|
|
56
|
+
mockFetch,
|
|
57
|
+
mockExit,
|
|
58
|
+
mockLog,
|
|
59
|
+
mockError,
|
|
60
|
+
mockTable,
|
|
61
|
+
cleanup: () => {
|
|
62
|
+
if (originalNodeEnv === undefined) {
|
|
63
|
+
delete process.env["NODE_ENV"];
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
process.env["NODE_ENV"] = originalNodeEnv;
|
|
67
|
+
}
|
|
68
|
+
vi.restoreAllMocks();
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=test-utils.js.map
|