@apexops/capabilities 0.10.0-next.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/dist/.tsbuildinfo +1 -0
- package/dist/bound-envelope-transport.d.ts +27 -0
- package/dist/bound-envelope-transport.d.ts.map +1 -0
- package/dist/bound-envelope-transport.js +96 -0
- package/dist/bound-envelope-transport.js.map +1 -0
- package/dist/capability.d.ts +36 -0
- package/dist/capability.d.ts.map +1 -0
- package/dist/capability.js +83 -0
- package/dist/capability.js.map +1 -0
- package/dist/command-plans.d.ts +49 -0
- package/dist/command-plans.d.ts.map +1 -0
- package/dist/command-plans.js +157 -0
- package/dist/command-plans.js.map +1 -0
- package/dist/design-capabilities.d.ts +23 -0
- package/dist/design-capabilities.d.ts.map +1 -0
- package/dist/design-capabilities.js +32 -0
- package/dist/design-capabilities.js.map +1 -0
- package/dist/encrypted-envelope-transport.d.ts +32 -0
- package/dist/encrypted-envelope-transport.d.ts.map +1 -0
- package/dist/encrypted-envelope-transport.js +138 -0
- package/dist/encrypted-envelope-transport.js.map +1 -0
- package/dist/iac-generation.d.ts +52 -0
- package/dist/iac-generation.d.ts.map +1 -0
- package/dist/iac-generation.js +645 -0
- package/dist/iac-generation.js.map +1 -0
- package/dist/iac-normalizers.d.ts +22 -0
- package/dist/iac-normalizers.d.ts.map +1 -0
- package/dist/iac-normalizers.js +198 -0
- package/dist/iac-normalizers.js.map +1 -0
- package/dist/iac.d.ts +83 -0
- package/dist/iac.d.ts.map +1 -0
- package/dist/iac.js +217 -0
- package/dist/iac.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/local-plan-transport.d.ts +29 -0
- package/dist/local-plan-transport.d.ts.map +1 -0
- package/dist/local-plan-transport.js +101 -0
- package/dist/local-plan-transport.js.map +1 -0
- package/dist/native-iac-providers.d.ts +96 -0
- package/dist/native-iac-providers.d.ts.map +1 -0
- package/dist/native-iac-providers.js +487 -0
- package/dist/native-iac-providers.js.map +1 -0
- package/dist/operations-placeholders.d.ts +5 -0
- package/dist/operations-placeholders.d.ts.map +1 -0
- package/dist/operations-placeholders.js +23 -0
- package/dist/operations-placeholders.js.map +1 -0
- package/dist/pack-manager.d.ts +95 -0
- package/dist/pack-manager.d.ts.map +1 -0
- package/dist/pack-manager.js +556 -0
- package/dist/pack-manager.js.map +1 -0
- package/dist/packs.d.ts +29 -0
- package/dist/packs.d.ts.map +1 -0
- package/dist/packs.js +51 -0
- package/dist/packs.js.map +1 -0
- package/dist/process-runner.d.ts +30 -0
- package/dist/process-runner.d.ts.map +1 -0
- package/dist/process-runner.js +97 -0
- package/dist/process-runner.js.map +1 -0
- package/dist/secret-redaction.d.ts +3 -0
- package/dist/secret-redaction.d.ts.map +1 -0
- package/dist/secret-redaction.js +48 -0
- package/dist/secret-redaction.js.map +1 -0
- package/dist/terraform-provider-schema.d.ts +75 -0
- package/dist/terraform-provider-schema.d.ts.map +1 -0
- package/dist/terraform-provider-schema.js +307 -0
- package/dist/terraform-provider-schema.js.map +1 -0
- package/dist/terraform-registry-client.d.ts +63 -0
- package/dist/terraform-registry-client.d.ts.map +1 -0
- package/dist/terraform-registry-client.js +388 -0
- package/dist/terraform-registry-client.js.map +1 -0
- package/dist/test/bound-envelope-transport.test.d.ts +2 -0
- package/dist/test/bound-envelope-transport.test.d.ts.map +1 -0
- package/dist/test/bound-envelope-transport.test.js +30 -0
- package/dist/test/bound-envelope-transport.test.js.map +1 -0
- package/dist/test/capabilities.test.d.ts +2 -0
- package/dist/test/capabilities.test.d.ts.map +1 -0
- package/dist/test/capabilities.test.js +86 -0
- package/dist/test/capabilities.test.js.map +1 -0
- package/dist/test/encrypted-envelope-transport.test.d.ts +2 -0
- package/dist/test/encrypted-envelope-transport.test.d.ts.map +1 -0
- package/dist/test/encrypted-envelope-transport.test.js +74 -0
- package/dist/test/encrypted-envelope-transport.test.js.map +1 -0
- package/dist/test/fixtures/terraform-provider-schema.d.ts +65 -0
- package/dist/test/fixtures/terraform-provider-schema.d.ts.map +1 -0
- package/dist/test/fixtures/terraform-provider-schema.js +29 -0
- package/dist/test/fixtures/terraform-provider-schema.js.map +1 -0
- package/dist/test/fixtures/terraform-registry.d.ts +54 -0
- package/dist/test/fixtures/terraform-registry.d.ts.map +1 -0
- package/dist/test/fixtures/terraform-registry.js +42 -0
- package/dist/test/fixtures/terraform-registry.js.map +1 -0
- package/dist/test/iac-generation.test.d.ts +2 -0
- package/dist/test/iac-generation.test.d.ts.map +1 -0
- package/dist/test/iac-generation.test.js +271 -0
- package/dist/test/iac-generation.test.js.map +1 -0
- package/dist/test/iac.test.d.ts +2 -0
- package/dist/test/iac.test.d.ts.map +1 -0
- package/dist/test/iac.test.js +161 -0
- package/dist/test/iac.test.js.map +1 -0
- package/dist/test/native-iac-providers.test.d.ts +2 -0
- package/dist/test/native-iac-providers.test.d.ts.map +1 -0
- package/dist/test/native-iac-providers.test.js +594 -0
- package/dist/test/native-iac-providers.test.js.map +1 -0
- package/dist/test/operations-placeholders.test.d.ts +2 -0
- package/dist/test/operations-placeholders.test.d.ts.map +1 -0
- package/dist/test/operations-placeholders.test.js +34 -0
- package/dist/test/operations-placeholders.test.js.map +1 -0
- package/dist/test/pack-manager.test.d.ts +2 -0
- package/dist/test/pack-manager.test.d.ts.map +1 -0
- package/dist/test/pack-manager.test.js +379 -0
- package/dist/test/pack-manager.test.js.map +1 -0
- package/dist/test/packs-and-commands.test.d.ts +2 -0
- package/dist/test/packs-and-commands.test.d.ts.map +1 -0
- package/dist/test/packs-and-commands.test.js +131 -0
- package/dist/test/packs-and-commands.test.js.map +1 -0
- package/dist/test/process-runner.test.d.ts +2 -0
- package/dist/test/process-runner.test.d.ts.map +1 -0
- package/dist/test/process-runner.test.js +42 -0
- package/dist/test/process-runner.test.js.map +1 -0
- package/dist/test/terraform-provider-schema.test.d.ts +2 -0
- package/dist/test/terraform-provider-schema.test.d.ts.map +1 -0
- package/dist/test/terraform-provider-schema.test.js +259 -0
- package/dist/test/terraform-provider-schema.test.js.map +1 -0
- package/dist/test/terraform-registry-client.test.d.ts +2 -0
- package/dist/test/terraform-registry-client.test.d.ts.map +1 -0
- package/dist/test/terraform-registry-client.test.js +321 -0
- package/dist/test/terraform-registry-client.test.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { TerraformRegistryClient } from "../terraform-registry-client.js";
|
|
4
|
+
import { terraformRegistryFixtures as fixtures } from "./fixtures/terraform-registry.js";
|
|
5
|
+
function response(name, status = 200) {
|
|
6
|
+
return new Response(JSON.stringify(fixtures[name]), { status, headers: { "content-type": "application/json" } });
|
|
7
|
+
}
|
|
8
|
+
test("searches modules with bounded pagination and caches until expiry", async () => {
|
|
9
|
+
const urls = [];
|
|
10
|
+
let now = 100;
|
|
11
|
+
const client = new TerraformRegistryClient({
|
|
12
|
+
now: () => now,
|
|
13
|
+
cacheTtlMs: 10,
|
|
14
|
+
fetch: async (input) => {
|
|
15
|
+
urls.push(String(input));
|
|
16
|
+
return response("search");
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
const first = await client.searchModules("key vault", { offset: 0, limit: 1 });
|
|
20
|
+
assert.equal(first.status, "ok");
|
|
21
|
+
if (first.status === "ok") {
|
|
22
|
+
assert.equal(first.cached, false);
|
|
23
|
+
assert.equal(first.value.modules[0]?.id, "Azure/avm-res-keyvault-vault/azurerm/0.10.0");
|
|
24
|
+
assert.equal(first.value.nextOffset, 1);
|
|
25
|
+
}
|
|
26
|
+
const cached = await client.searchModules("key vault", { offset: 0, limit: 1 });
|
|
27
|
+
assert.equal(cached.status === "ok" && cached.cached, true);
|
|
28
|
+
now = 111;
|
|
29
|
+
await client.searchModules("key vault", { offset: 0, limit: 1 });
|
|
30
|
+
assert.equal(urls.length, 2);
|
|
31
|
+
assert.match(urls[0], /^https:\/\/registry\.terraform\.io\/v1\/modules\/search\?/u);
|
|
32
|
+
assert.match(urls[0], /q=key\+vault/u);
|
|
33
|
+
});
|
|
34
|
+
test("treats omitted next_offset as a terminal search page", async () => {
|
|
35
|
+
const terminal = structuredClone(fixtures.search);
|
|
36
|
+
delete terminal.meta.next_offset;
|
|
37
|
+
const client = new TerraformRegistryClient({ fetch: async () => new Response(JSON.stringify(terminal)) });
|
|
38
|
+
const result = await client.searchModules("key vault", { limit: 1 });
|
|
39
|
+
assert.equal(result.status === "ok" && result.value.nextOffset, null);
|
|
40
|
+
});
|
|
41
|
+
test("returns module details and stable module/provider versions", async () => {
|
|
42
|
+
const client = new TerraformRegistryClient({
|
|
43
|
+
fetch: async (input) => {
|
|
44
|
+
const url = String(input);
|
|
45
|
+
if (url.includes("/providers/"))
|
|
46
|
+
return response("providerVersions");
|
|
47
|
+
if (url.endsWith("/versions"))
|
|
48
|
+
return response("moduleVersions");
|
|
49
|
+
return response("details");
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
const details = await client.getModuleDetails("Azure", "avm-res-keyvault-vault", "azurerm", "0.10.0");
|
|
53
|
+
assert.equal(details.status === "ok" && details.value.version, "0.10.0");
|
|
54
|
+
const modules = await client.getModuleVersions("Azure", "avm-res-keyvault-vault", "azurerm");
|
|
55
|
+
assert.deepEqual(modules.status === "ok" && modules.value, { versions: ["0.10.0", "0.9.0"], latestStable: "0.10.0" });
|
|
56
|
+
const providers = await client.getProviderVersions("hashicorp", "azurerm");
|
|
57
|
+
assert.deepEqual(providers.status === "ok" && providers.value, {
|
|
58
|
+
versions: ["4.10.0", "4.2.0"],
|
|
59
|
+
latestStable: "4.10.0",
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
test("chains search coordinates into case-normalized module versions", async () => {
|
|
63
|
+
const client = new TerraformRegistryClient({
|
|
64
|
+
fetch: async (input) => (String(input).includes("/search?") ? response("search") : response("moduleVersions")),
|
|
65
|
+
});
|
|
66
|
+
const search = await client.searchModules("key vault", { limit: 1 });
|
|
67
|
+
assert.equal(search.status, "ok");
|
|
68
|
+
if (search.status === "ok") {
|
|
69
|
+
const module = search.value.modules[0];
|
|
70
|
+
const versions = await client.getModuleVersions(module.namespace, module.name, module.provider);
|
|
71
|
+
assert.equal(versions.status === "ok" && versions.value.latestStable, "0.10.0");
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
test("accepts Registry-canonical casing for module details", async () => {
|
|
75
|
+
const client = new TerraformRegistryClient({ fetch: async () => response("details") });
|
|
76
|
+
const details = await client.getModuleDetails("azure", "avm-res-keyvault-vault", "AZURERM", "0.10.0");
|
|
77
|
+
assert.equal(details.status === "ok" && details.value.namespace, "Azure");
|
|
78
|
+
});
|
|
79
|
+
test("rejects mismatched module details and malformed version entries", async () => {
|
|
80
|
+
const mismatched = structuredClone(fixtures.details);
|
|
81
|
+
mismatched.namespace = "Other";
|
|
82
|
+
const detailClient = new TerraformRegistryClient({ fetch: async () => new Response(JSON.stringify(mismatched)) });
|
|
83
|
+
const details = await detailClient.getModuleDetails("Azure", "avm-res-keyvault-vault", "azurerm", "0.10.0");
|
|
84
|
+
assert.equal(details.status === "unavailable" && details.reason, "malformed-response");
|
|
85
|
+
const malformed = { versions: [{ version: 42 }] };
|
|
86
|
+
const versionClient = new TerraformRegistryClient({ fetch: async () => new Response(JSON.stringify(malformed)) });
|
|
87
|
+
const versions = await versionClient.getProviderVersions("hashicorp", "azurerm");
|
|
88
|
+
assert.equal(versions.status === "unavailable" && versions.reason, "malformed-response");
|
|
89
|
+
const wrongSource = structuredClone(fixtures.moduleVersions);
|
|
90
|
+
wrongSource.modules[0].source = "Other/different/azurerm";
|
|
91
|
+
const moduleClient = new TerraformRegistryClient({ fetch: async () => new Response(JSON.stringify(wrongSource)) });
|
|
92
|
+
const moduleVersions = await moduleClient.getModuleVersions("Azure", "avm-res-keyvault-vault", "azurerm");
|
|
93
|
+
assert.equal(moduleVersions.status === "unavailable" && moduleVersions.reason, "malformed-response");
|
|
94
|
+
const wrongProvider = structuredClone(fixtures.providerVersions);
|
|
95
|
+
wrongProvider.id = "evil/other";
|
|
96
|
+
const providerClient = new TerraformRegistryClient({
|
|
97
|
+
fetch: async () => new Response(JSON.stringify(wrongProvider)),
|
|
98
|
+
});
|
|
99
|
+
const providerVersions = await providerClient.getProviderVersions("hashicorp", "azurerm");
|
|
100
|
+
assert.equal(providerVersions.status === "unavailable" && providerVersions.reason, "malformed-response");
|
|
101
|
+
const oversizedVersion = {
|
|
102
|
+
id: "hashicorp/azurerm",
|
|
103
|
+
versions: [{ version: `1.0.0+${"x".repeat(201)}` }],
|
|
104
|
+
};
|
|
105
|
+
const oversizedClient = new TerraformRegistryClient({
|
|
106
|
+
fetch: async () => new Response(JSON.stringify(oversizedVersion)),
|
|
107
|
+
});
|
|
108
|
+
const oversized = await oversizedClient.getProviderVersions("hashicorp", "azurerm");
|
|
109
|
+
assert.equal(oversized.status === "unavailable" && oversized.reason, "malformed-response");
|
|
110
|
+
});
|
|
111
|
+
test("uses SemVer precedence and accepts stable build metadata", async () => {
|
|
112
|
+
const body = {
|
|
113
|
+
id: "hashicorp/azurerm",
|
|
114
|
+
versions: [
|
|
115
|
+
{ version: "1.2.3+build.1" },
|
|
116
|
+
{ version: "1.10.0" },
|
|
117
|
+
{ version: "1.10.0-alpha+build.2" },
|
|
118
|
+
{ version: "2.0.0" },
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
const client = new TerraformRegistryClient({ fetch: async () => new Response(JSON.stringify(body)) });
|
|
122
|
+
const versions = await client.getProviderVersions("hashicorp", "azurerm");
|
|
123
|
+
assert.deepEqual(versions.status === "ok" && versions.value, {
|
|
124
|
+
versions: ["2.0.0", "1.10.0", "1.2.3+build.1"],
|
|
125
|
+
latestStable: "2.0.0",
|
|
126
|
+
});
|
|
127
|
+
const details = await client.getModuleDetails("Azure", "module", "azurerm", "01.2.3");
|
|
128
|
+
assert.equal(details.status, "invalid");
|
|
129
|
+
});
|
|
130
|
+
test("orders arbitrary-precision SemVer components exactly", async () => {
|
|
131
|
+
const body = {
|
|
132
|
+
id: "hashicorp/azurerm",
|
|
133
|
+
versions: [{ version: "9999999999999999999.0.0" }, { version: "10000000000000000000.0.0" }],
|
|
134
|
+
};
|
|
135
|
+
const client = new TerraformRegistryClient({ fetch: async () => new Response(JSON.stringify(body)) });
|
|
136
|
+
const versions = await client.getProviderVersions("hashicorp", "azurerm");
|
|
137
|
+
assert.equal(versions.status === "ok" && versions.value.latestStable, "10000000000000000000.0.0");
|
|
138
|
+
});
|
|
139
|
+
test("distinguishes missing, invalid, rate-limited, and malformed responses", async () => {
|
|
140
|
+
let calls = 0;
|
|
141
|
+
const missing = new TerraformRegistryClient({ fetch: async () => new Response("", { status: 404 }) });
|
|
142
|
+
assert.equal((await missing.getProviderVersions("hashicorp", "missing")).status, "missing");
|
|
143
|
+
assert.equal((await missing.getProviderVersions("bad/path", "name")).status, "invalid");
|
|
144
|
+
const limited = new TerraformRegistryClient({
|
|
145
|
+
retries: 1,
|
|
146
|
+
retryDelayMs: 0,
|
|
147
|
+
sleep: async () => undefined,
|
|
148
|
+
fetch: async () => {
|
|
149
|
+
calls += 1;
|
|
150
|
+
return new Response("", { status: 429 });
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
const rateLimited = await limited.searchModules("module");
|
|
154
|
+
assert.equal(rateLimited.status === "unavailable" && rateLimited.reason, "rate-limited");
|
|
155
|
+
assert.equal(calls, 2);
|
|
156
|
+
const malformed = new TerraformRegistryClient({ fetch: async () => new Response("{}") });
|
|
157
|
+
const result = await malformed.searchModules("module");
|
|
158
|
+
assert.equal(result.status === "unavailable" && result.reason, "malformed-response");
|
|
159
|
+
const invalidJson = new TerraformRegistryClient({ fetch: async () => new Response("not-json") });
|
|
160
|
+
const invalidJsonResult = await invalidJson.searchModules("module");
|
|
161
|
+
assert.equal(invalidJsonResult.status === "unavailable" && invalidJsonResult.reason, "malformed-response");
|
|
162
|
+
});
|
|
163
|
+
test("fails closed on timeout and response byte limits", async () => {
|
|
164
|
+
const timeout = new TerraformRegistryClient({
|
|
165
|
+
timeoutMs: 1,
|
|
166
|
+
retries: 0,
|
|
167
|
+
fetch: async (_input, init) => await new Promise((_resolve, reject) => {
|
|
168
|
+
init?.signal?.addEventListener("abort", () => reject(new DOMException("aborted", "AbortError")), {
|
|
169
|
+
once: true,
|
|
170
|
+
});
|
|
171
|
+
}),
|
|
172
|
+
});
|
|
173
|
+
const timedOut = await timeout.searchModules("module");
|
|
174
|
+
assert.equal(timedOut.status === "unavailable" && timedOut.reason, "timeout");
|
|
175
|
+
const oversized = new TerraformRegistryClient({ maxResponseBytes: 10, fetch: async () => response("search") });
|
|
176
|
+
const tooLarge = await oversized.searchModules("module");
|
|
177
|
+
assert.equal(tooLarge.status === "unavailable" && tooLarge.reason, "response-too-large");
|
|
178
|
+
});
|
|
179
|
+
test("does not await non-cooperative oversized-body cancellation", async () => {
|
|
180
|
+
let canceled = false;
|
|
181
|
+
const client = new TerraformRegistryClient({
|
|
182
|
+
maxResponseBytes: 1,
|
|
183
|
+
fetch: async () => new Response(new ReadableStream({
|
|
184
|
+
start(controller) {
|
|
185
|
+
controller.enqueue(new TextEncoder().encode("too large"));
|
|
186
|
+
},
|
|
187
|
+
cancel() {
|
|
188
|
+
canceled = true;
|
|
189
|
+
return new Promise(() => undefined);
|
|
190
|
+
},
|
|
191
|
+
})),
|
|
192
|
+
});
|
|
193
|
+
const result = await client.searchModules("module");
|
|
194
|
+
assert.equal(result.status === "unavailable" && result.reason, "response-too-large");
|
|
195
|
+
assert.equal(canceled, true);
|
|
196
|
+
});
|
|
197
|
+
test("times out non-cooperative fetch and response streams", async () => {
|
|
198
|
+
const stalledFetch = new TerraformRegistryClient({
|
|
199
|
+
timeoutMs: 5,
|
|
200
|
+
retries: 0,
|
|
201
|
+
fetch: async () => await new Promise(() => undefined),
|
|
202
|
+
});
|
|
203
|
+
const fetchResult = await stalledFetch.searchModules("module");
|
|
204
|
+
assert.equal(fetchResult.status === "unavailable" && fetchResult.reason, "timeout");
|
|
205
|
+
let canceled = 0;
|
|
206
|
+
const stalledBody = new TerraformRegistryClient({
|
|
207
|
+
timeoutMs: 5,
|
|
208
|
+
retries: 0,
|
|
209
|
+
fetch: async () => new Response(new ReadableStream({
|
|
210
|
+
pull() {
|
|
211
|
+
return new Promise(() => undefined);
|
|
212
|
+
},
|
|
213
|
+
cancel() {
|
|
214
|
+
canceled += 1;
|
|
215
|
+
},
|
|
216
|
+
})),
|
|
217
|
+
});
|
|
218
|
+
const bodyResult = await stalledBody.searchModules("module");
|
|
219
|
+
assert.equal(bodyResult.status === "unavailable" && bodyResult.reason, "timeout");
|
|
220
|
+
assert.equal(canceled, 1);
|
|
221
|
+
});
|
|
222
|
+
test("does not await non-cooperative error-body cancellation", async () => {
|
|
223
|
+
const client = new TerraformRegistryClient({
|
|
224
|
+
timeoutMs: 5,
|
|
225
|
+
retries: 0,
|
|
226
|
+
fetch: async () => new Response(new ReadableStream({
|
|
227
|
+
cancel() {
|
|
228
|
+
return new Promise(() => undefined);
|
|
229
|
+
},
|
|
230
|
+
}), { status: 404 }),
|
|
231
|
+
});
|
|
232
|
+
const result = await client.getProviderVersions("hashicorp", "missing");
|
|
233
|
+
assert.equal(result.status, "missing");
|
|
234
|
+
});
|
|
235
|
+
test("rejects unbounded response pagination and cancels retry bodies", async () => {
|
|
236
|
+
const unbounded = structuredClone(fixtures.search);
|
|
237
|
+
unbounded.meta.next_offset = 1001;
|
|
238
|
+
const pagination = new TerraformRegistryClient({ fetch: async () => new Response(JSON.stringify(unbounded)) });
|
|
239
|
+
const invalidPage = await pagination.searchModules("module", { limit: 1 });
|
|
240
|
+
assert.equal(invalidPage.status === "unavailable" && invalidPage.reason, "malformed-response");
|
|
241
|
+
let canceled = 0;
|
|
242
|
+
const throttled = new TerraformRegistryClient({
|
|
243
|
+
retries: 1,
|
|
244
|
+
retryDelayMs: 0,
|
|
245
|
+
sleep: async () => undefined,
|
|
246
|
+
fetch: async () => new Response(new ReadableStream({
|
|
247
|
+
cancel() {
|
|
248
|
+
canceled += 1;
|
|
249
|
+
},
|
|
250
|
+
}), { status: 429 }),
|
|
251
|
+
});
|
|
252
|
+
await throttled.searchModules("module");
|
|
253
|
+
assert.equal(canceled, 2);
|
|
254
|
+
});
|
|
255
|
+
test("rejects invalid identifiers in search responses", async () => {
|
|
256
|
+
const invalid = structuredClone(fixtures.search);
|
|
257
|
+
const module = invalid.modules[0];
|
|
258
|
+
module.namespace = "..";
|
|
259
|
+
module.id = `../${String(module.name)}/${String(module.provider)}/${String(module.version)}`;
|
|
260
|
+
const client = new TerraformRegistryClient({ fetch: async () => new Response(JSON.stringify(invalid)) });
|
|
261
|
+
const result = await client.searchModules("module", { limit: 1 });
|
|
262
|
+
assert.equal(result.status === "unavailable" && result.reason, "malformed-response");
|
|
263
|
+
});
|
|
264
|
+
test("rejects invalid constructor and request bounds without transport", async () => {
|
|
265
|
+
assert.throws(() => new TerraformRegistryClient({ retries: 4 }), /bounds are invalid/u);
|
|
266
|
+
assert.throws(() => new TerraformRegistryClient({ maxCacheEntries: 0 }), /bounds are invalid/u);
|
|
267
|
+
for (const options of [
|
|
268
|
+
{ timeoutMs: 60_001 },
|
|
269
|
+
{ maxResponseBytes: 5_000_001 },
|
|
270
|
+
{ cacheTtlMs: 3_600_001 },
|
|
271
|
+
{ retryDelayMs: 10_001 },
|
|
272
|
+
]) {
|
|
273
|
+
assert.throws(() => new TerraformRegistryClient(options), /bounds are invalid/u);
|
|
274
|
+
}
|
|
275
|
+
let calls = 0;
|
|
276
|
+
const client = new TerraformRegistryClient({
|
|
277
|
+
fetch: async () => {
|
|
278
|
+
calls += 1;
|
|
279
|
+
return response("search");
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
assert.equal((await client.searchModules("", { limit: 51 })).status, "invalid");
|
|
283
|
+
assert.equal((await client.getModuleDetails("../bad", "name", "provider", "latest")).status, "invalid");
|
|
284
|
+
assert.equal((await client.getProviderVersions("..", "name")).status, "invalid");
|
|
285
|
+
assert.equal((await client.getProviderVersions(".", "name")).status, "invalid");
|
|
286
|
+
assert.equal((await client.getProviderVersions("x".repeat(101), "name")).status, "invalid");
|
|
287
|
+
assert.equal((await client.getModuleDetails("Azure", "module", "azurerm", `1.0.0+${"x".repeat(201)}`)).status, "invalid");
|
|
288
|
+
assert.equal(calls, 0);
|
|
289
|
+
});
|
|
290
|
+
test("bounds cache entries and exposes no lifecycle or arbitrary URL methods", async () => {
|
|
291
|
+
const urls = [];
|
|
292
|
+
const client = new TerraformRegistryClient({
|
|
293
|
+
maxCacheEntries: 1,
|
|
294
|
+
fetch: async (input) => {
|
|
295
|
+
urls.push(String(input));
|
|
296
|
+
return response("search");
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
await client.searchModules("first");
|
|
300
|
+
await client.searchModules("second");
|
|
301
|
+
await client.searchModules("first");
|
|
302
|
+
assert.equal(urls.length, 3);
|
|
303
|
+
assert.deepEqual(Object.getOwnPropertyNames(TerraformRegistryClient.prototype).sort(), [
|
|
304
|
+
"constructor",
|
|
305
|
+
"getModuleDetails",
|
|
306
|
+
"getModuleVersions",
|
|
307
|
+
"getProviderVersions",
|
|
308
|
+
"searchModules",
|
|
309
|
+
]);
|
|
310
|
+
});
|
|
311
|
+
test("isolates cached values from caller mutation", async () => {
|
|
312
|
+
const client = new TerraformRegistryClient({ fetch: async () => response("providerVersions") });
|
|
313
|
+
const first = await client.getProviderVersions("hashicorp", "azurerm");
|
|
314
|
+
assert.equal(first.status, "ok");
|
|
315
|
+
if (first.status === "ok") {
|
|
316
|
+
first.value.versions[0] = "not-semver";
|
|
317
|
+
}
|
|
318
|
+
const cached = await client.getProviderVersions("hashicorp", "azurerm");
|
|
319
|
+
assert.equal(cached.status === "ok" && cached.value.versions[0], "4.10.0");
|
|
320
|
+
});
|
|
321
|
+
//# sourceMappingURL=terraform-registry-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terraform-registry-client.test.js","sourceRoot":"","sources":["../../src/test/terraform-registry-client.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@apexops/capabilities",
|
|
3
|
+
"version": "0.10.0-next.0",
|
|
4
|
+
"description": "Authorized capability execution and IaC adapters for APEX vNext",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/jonathan-vella/apex-vnext.git",
|
|
9
|
+
"directory": "packages/capabilities"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public",
|
|
13
|
+
"provenance": true,
|
|
14
|
+
"tag": "next"
|
|
15
|
+
},
|
|
16
|
+
"type": "module",
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@apexops/contracts": "0.10.0-next.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@sinclair/typebox": "0.34.52"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc -b",
|
|
36
|
+
"test": "node --test dist/test/*.test.js"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=24"
|
|
40
|
+
}
|
|
41
|
+
}
|