@apexops/testkit 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.
Files changed (58) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/determinism.d.ts +14 -0
  3. package/dist/determinism.d.ts.map +1 -0
  4. package/dist/determinism.js +38 -0
  5. package/dist/determinism.js.map +1 -0
  6. package/dist/faults.d.ts +8 -0
  7. package/dist/faults.d.ts.map +1 -0
  8. package/dist/faults.js +26 -0
  9. package/dist/faults.js.map +1 -0
  10. package/dist/fixtures.d.ts +18 -0
  11. package/dist/fixtures.d.ts.map +1 -0
  12. package/dist/fixtures.js +207 -0
  13. package/dist/fixtures.js.map +1 -0
  14. package/dist/index.d.ts +11 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +11 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/malicious.d.ts +9 -0
  19. package/dist/malicious.d.ts.map +1 -0
  20. package/dist/malicious.js +26 -0
  21. package/dist/malicious.js.map +1 -0
  22. package/dist/parity.d.ts +3 -0
  23. package/dist/parity.d.ts.map +1 -0
  24. package/dist/parity.js +10 -0
  25. package/dist/parity.js.map +1 -0
  26. package/dist/qualification.d.ts +53 -0
  27. package/dist/qualification.d.ts.map +1 -0
  28. package/dist/qualification.js +760 -0
  29. package/dist/qualification.js.map +1 -0
  30. package/dist/quality.d.ts +46 -0
  31. package/dist/quality.d.ts.map +1 -0
  32. package/dist/quality.js +118 -0
  33. package/dist/quality.js.map +1 -0
  34. package/dist/scenario.d.ts +26 -0
  35. package/dist/scenario.d.ts.map +1 -0
  36. package/dist/scenario.js +35 -0
  37. package/dist/scenario.js.map +1 -0
  38. package/dist/scorecard-samples.d.ts +5 -0
  39. package/dist/scorecard-samples.d.ts.map +1 -0
  40. package/dist/scorecard-samples.js +151 -0
  41. package/dist/scorecard-samples.js.map +1 -0
  42. package/dist/test/qualification.test.d.ts +2 -0
  43. package/dist/test/qualification.test.d.ts.map +1 -0
  44. package/dist/test/qualification.test.js +169 -0
  45. package/dist/test/qualification.test.js.map +1 -0
  46. package/dist/test/scorecard-samples.test.d.ts +2 -0
  47. package/dist/test/scorecard-samples.test.d.ts.map +1 -0
  48. package/dist/test/scorecard-samples.test.js +62 -0
  49. package/dist/test/scorecard-samples.test.js.map +1 -0
  50. package/dist/test/testkit.test.d.ts +2 -0
  51. package/dist/test/testkit.test.d.ts.map +1 -0
  52. package/dist/test/testkit.test.js +177 -0
  53. package/dist/test/testkit.test.js.map +1 -0
  54. package/dist/workspace.d.ts +3 -0
  55. package/dist/workspace.d.ts.map +1 -0
  56. package/dist/workspace.js +11 -0
  57. package/dist/workspace.js.map +1 -0
  58. package/package.json +43 -0
@@ -0,0 +1,38 @@
1
+ export class FakeClock {
2
+ #currentMs;
3
+ constructor(initial = "2026-01-01T00:00:00.000Z") {
4
+ this.#currentMs = new Date(initial).getTime();
5
+ if (!Number.isFinite(this.#currentMs)) {
6
+ throw new Error("FakeClock requires a valid initial time");
7
+ }
8
+ }
9
+ now = () => new Date(this.#currentMs);
10
+ advance(milliseconds) {
11
+ if (!Number.isFinite(milliseconds)) {
12
+ throw new Error("FakeClock advance must be finite");
13
+ }
14
+ this.#currentMs += milliseconds;
15
+ return this.now();
16
+ }
17
+ set(value) {
18
+ const nextMs = new Date(value).getTime();
19
+ if (!Number.isFinite(nextMs)) {
20
+ throw new Error("FakeClock requires a valid time");
21
+ }
22
+ this.#currentMs = nextMs;
23
+ return this.now();
24
+ }
25
+ }
26
+ export class SequenceIds {
27
+ prefix;
28
+ #next;
29
+ constructor(prefix = "id", start = 1) {
30
+ this.prefix = prefix;
31
+ if (!Number.isSafeInteger(start) || start < 0) {
32
+ throw new Error("SequenceIds start must be a non-negative safe integer");
33
+ }
34
+ this.#next = start;
35
+ }
36
+ next = () => `${this.prefix}-${String(this.#next++).padStart(4, "0")}`;
37
+ }
38
+ //# sourceMappingURL=determinism.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"determinism.js","sourceRoot":"","sources":["../src/determinism.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAS;IACpB,UAAU,CAAS;IAEnB,YAAY,OAAO,GAA2B,0BAA0B;QACtE,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAEQ,GAAG,GAAG,GAAS,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAErD,OAAO,CAAC,YAAoB;QAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC,UAAU,IAAI,YAAY,CAAC;QAChC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,GAAG,CAAC,KAA6B;QAC/B,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QACzB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;CACF;AAED,MAAM,OAAO,WAAW;IAIH,MAAM;IAHzB,KAAK,CAAS;IAEd,YACmB,MAAM,GAAG,IAAI,EAC9B,KAAK,GAAG,CAAC;sBADQ,MAAM;QAGvB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEQ,IAAI,GAAG,GAAW,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;CACzF"}
@@ -0,0 +1,8 @@
1
+ export declare class InjectedFault extends Error {
2
+ constructor(point: string);
3
+ }
4
+ export declare function crashBefore<T>(callback: () => T | Promise<T>, point?: string): Promise<never>;
5
+ export declare function crashAfter<T>(callback: () => T | Promise<T>, point?: string): Promise<never>;
6
+ export declare function staleEpoch(currentEpoch: number): number;
7
+ export declare function staleHead(currentHead: string): string;
8
+ //# sourceMappingURL=faults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faults.d.ts","sourceRoot":"","sources":["../src/faults.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,KAAK,EAAE,MAAM,EAGxB;CACF;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,SAAoB,GAAG,OAAO,CAAC,KAAK,CAAC,CAG9G;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,SAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,CAG5G;AAED,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGrD"}
package/dist/faults.js ADDED
@@ -0,0 +1,26 @@
1
+ import { fixtureHash } from "./fixtures.js";
2
+ export class InjectedFault extends Error {
3
+ constructor(point) {
4
+ super(`Injected fault: ${point}`);
5
+ this.name = "InjectedFault";
6
+ }
7
+ }
8
+ export async function crashBefore(callback, point = "before-callback") {
9
+ void callback;
10
+ throw new InjectedFault(point);
11
+ }
12
+ export async function crashAfter(callback, point = "after-callback") {
13
+ await callback();
14
+ throw new InjectedFault(point);
15
+ }
16
+ export function staleEpoch(currentEpoch) {
17
+ if (!Number.isInteger(currentEpoch) || currentEpoch <= 1) {
18
+ throw new Error("A stale epoch requires a current epoch greater than one");
19
+ }
20
+ return currentEpoch - 1;
21
+ }
22
+ export function staleHead(currentHead) {
23
+ const stale = fixtureHash(`stale:${currentHead}`);
24
+ return stale === currentHead ? fixtureHash(`stale-again:${currentHead}`) : stale;
25
+ }
26
+ //# sourceMappingURL=faults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faults.js","sourceRoot":"","sources":["../src/faults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,KAAa;QACvB,KAAK,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAI,QAA8B,EAAE,KAAK,GAAG,iBAAiB;IAC5F,KAAK,QAAQ,CAAC;IACd,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAI,QAA8B,EAAE,KAAK,GAAG,gBAAgB;IAC1F,MAAM,QAAQ,EAAE,CAAC;IACjB,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,YAAoB;IAC7C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,YAAY,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,WAAmB;IAC3C,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IAClD,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACnF,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ApprovalEvidenceV1, DeploymentPreviewV1, IacBindingV1, ImplementationIntentV1, OperationRecordV1, ProjectConfigV1, RequirementsV1, ResourceInventoryV1, RunConfigV1, RuntimeBundleLockV1, TaskEnvelopeV1 } from "@apexops/contracts";
2
+ export declare const FIXTURE_TIME = "2026-01-01T00:00:00.000Z";
3
+ export declare const FIXTURE_EXPIRY = "2026-01-01T01:00:00.000Z";
4
+ export declare function fixtureHash(label: string): string;
5
+ export declare function runtimeLockFixture(overrides?: Partial<RuntimeBundleLockV1>): RuntimeBundleLockV1;
6
+ export declare function projectFixture(overrides?: Partial<ProjectConfigV1>): ProjectConfigV1;
7
+ export declare function runFixture(overrides?: Partial<RunConfigV1>): RunConfigV1;
8
+ export declare function taskFixture(overrides?: Partial<TaskEnvelopeV1>): TaskEnvelopeV1;
9
+ export declare function requirementsFixture(overrides?: Partial<RequirementsV1>): RequirementsV1;
10
+ export declare function intentFixture(overrides?: Partial<ImplementationIntentV1>): ImplementationIntentV1;
11
+ export declare function bindingFixture(overrides?: Partial<IacBindingV1>): IacBindingV1;
12
+ export declare function previewFixture(overrides?: Partial<DeploymentPreviewV1>): DeploymentPreviewV1;
13
+ export declare function approvalFixture(overrides?: Partial<Extract<ApprovalEvidenceV1, {
14
+ mechanism: "tty";
15
+ }>>): ApprovalEvidenceV1;
16
+ export declare function operationFixture(overrides?: Partial<OperationRecordV1>): OperationRecordV1;
17
+ export declare function inventoryFixture(overrides?: Partial<ResourceInventoryV1>): ResourceInventoryV1;
18
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,cAAc,EACf,MAAM,oBAAoB,CAAC;AAK5B,eAAO,MAAM,YAAY,6BAA6B,CAAC;AACvD,eAAO,MAAM,cAAc,6BAA6B,CAAC;AAEzD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,kBAAkB,CAAC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAAG,mBAAmB,CAapG;AAED,wBAAgB,cAAc,CAAC,SAAS,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,eAAe,CASxF;AAED,wBAAgB,UAAU,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,CAe5E;AAED,wBAAgB,WAAW,CAAC,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,cAAc,CAkBnF;AAED,wBAAgB,mBAAmB,CAAC,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,cAAc,CAmB3F;AAED,wBAAgB,aAAa,CAAC,SAAS,GAAE,OAAO,CAAC,sBAAsB,CAAM,GAAG,sBAAsB,CAkBrG;AAED,wBAAgB,cAAc,CAAC,SAAS,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,YAAY,CAgBlF;AAED,wBAAgB,cAAc,CAAC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAAG,mBAAmB,CAsBhG;AAED,wBAAgB,eAAe,CAC7B,SAAS,GAAE,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE;IAAE,SAAS,EAAE,KAAK,CAAA;CAAE,CAAC,CAAM,GACzE,kBAAkB,CAkBpB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,iBAAiB,CAe9F;AAED,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAAG,mBAAmB,CAmBlG"}
@@ -0,0 +1,207 @@
1
+ import { CONTRACT_VERSION } from "@apexops/contracts";
2
+ import { sha256 } from "@apexops/capabilities";
3
+ import { sha256Text } from "@apexops/kernel";
4
+ export const FIXTURE_TIME = "2026-01-01T00:00:00.000Z";
5
+ export const FIXTURE_EXPIRY = "2026-01-01T01:00:00.000Z";
6
+ export function fixtureHash(label) {
7
+ return sha256Text(`apex-testkit:${label}`);
8
+ }
9
+ export function runtimeLockFixture(overrides = {}) {
10
+ return {
11
+ schemaVersion: CONTRACT_VERSION,
12
+ cliVersion: "0.10.0-next.0",
13
+ customizationVersion: "0.10.0-next.0",
14
+ workflowHash: fixtureHash("workflow"),
15
+ defaultsHash: fixtureHash("defaults"),
16
+ validatorHash: fixtureHash("validator"),
17
+ qualityScorecardHash: fixtureHash("quality-scorecard"),
18
+ improvementPolicyHash: fixtureHash("improvement-policy"),
19
+ requiredCapabilityPacks: ["iac"],
20
+ ...overrides,
21
+ };
22
+ }
23
+ export function projectFixture(overrides = {}) {
24
+ return {
25
+ schemaVersion: CONTRACT_VERSION,
26
+ projectId: "test-project",
27
+ displayName: "Test Project",
28
+ createdAt: FIXTURE_TIME,
29
+ defaultIacTool: "bicep",
30
+ ...overrides,
31
+ };
32
+ }
33
+ export function runFixture(overrides = {}) {
34
+ const dependencyHash = overrides.runtimeLockHash ?? fixtureHash("runtime-lock");
35
+ return {
36
+ schemaVersion: CONTRACT_VERSION,
37
+ projectId: "test-project",
38
+ runId: "run-0001",
39
+ environment: "test",
40
+ targetScope: "/subscriptions/00000000-0000-0000-0000-000000000000",
41
+ iacTool: "bicep",
42
+ createdAt: FIXTURE_TIME,
43
+ runtimeLockHash: dependencyHash,
44
+ ownerEpoch: 1,
45
+ gates: [1, 2, 3, 4].map((gate) => ({ gate, state: "closed", dependencyHash })),
46
+ ...overrides,
47
+ };
48
+ }
49
+ export function taskFixture(overrides = {}) {
50
+ return {
51
+ schemaVersion: CONTRACT_VERSION,
52
+ projectId: "test-project",
53
+ runId: "run-0001",
54
+ taskId: "task-0001",
55
+ role: "test-agent",
56
+ taskType: "render",
57
+ expectedHead: fixtureHash("journal-head"),
58
+ ownerEpoch: 1,
59
+ createdAt: FIXTURE_TIME,
60
+ expiresAt: FIXTURE_EXPIRY,
61
+ inputRefs: [fixtureHash("input")],
62
+ allowedOutputKinds: ["implementation-intent"],
63
+ capabilityGrants: [{ capability: "filesystem.read", sideEffect: "none", expiresAt: FIXTURE_EXPIRY }],
64
+ maxOutputBytes: 1024 * 1024,
65
+ ...overrides,
66
+ };
67
+ }
68
+ export function requirementsFixture(overrides = {}) {
69
+ return {
70
+ schemaVersion: CONTRACT_VERSION,
71
+ projectId: "test-project",
72
+ workload: "test workload",
73
+ environment: "test",
74
+ requirements: [
75
+ {
76
+ id: "req-001",
77
+ statement: "Provision deterministic infrastructure",
78
+ priority: "must",
79
+ status: "confirmed",
80
+ source: "test",
81
+ },
82
+ ],
83
+ assumptions: [],
84
+ unknowns: [],
85
+ ...overrides,
86
+ };
87
+ }
88
+ export function intentFixture(overrides = {}) {
89
+ return {
90
+ schemaVersion: CONTRACT_VERSION,
91
+ projectId: "test-project",
92
+ runId: "run-0001",
93
+ sourceHashes: { requirements: fixtureHash("requirements") },
94
+ resources: [
95
+ {
96
+ id: "storage",
97
+ type: "Microsoft.Storage/storageAccounts",
98
+ purpose: "Store artifacts",
99
+ dependsOn: [],
100
+ controls: ["https-only"],
101
+ },
102
+ ],
103
+ outputs: ["storageResourceId"],
104
+ ...overrides,
105
+ };
106
+ }
107
+ export function bindingFixture(overrides = {}) {
108
+ return {
109
+ schemaVersion: CONTRACT_VERSION,
110
+ projectId: "test-project",
111
+ runId: "run-0001",
112
+ track: "bicep",
113
+ intentHash: fixtureHash("intent"),
114
+ resourceBindings: {
115
+ storage: {
116
+ implementation: "br/public:avm/res/storage/storage-account",
117
+ version: "0.31.0",
118
+ parameters: { location: "swedencentral" },
119
+ },
120
+ },
121
+ ...overrides,
122
+ };
123
+ }
124
+ export function previewFixture(overrides = {}) {
125
+ const body = {
126
+ schemaVersion: CONTRACT_VERSION,
127
+ projectId: "test-project",
128
+ runId: "run-0001",
129
+ environment: "test",
130
+ track: "bicep",
131
+ operation: "apply",
132
+ target: "/subscriptions/00000000-0000-0000-0000-000000000000",
133
+ commit: fixtureHash("commit"),
134
+ dependencyRevision: fixtureHash("commit"),
135
+ ownerEpoch: 1,
136
+ inputHash: fixtureHash("input"),
137
+ iacHash: fixtureHash("iac"),
138
+ policyHash: fixtureHash("policy"),
139
+ changes: [{ resourceId: "storage", action: "create", material: true }],
140
+ blockers: [],
141
+ createdAt: FIXTURE_TIME,
142
+ expiresAt: FIXTURE_EXPIRY,
143
+ ...without(overrides, "previewHash"),
144
+ };
145
+ return { ...body, previewHash: overrides.previewHash ?? sha256(body) };
146
+ }
147
+ export function approvalFixture(overrides = {}) {
148
+ const previewHash = overrides.previewHash ?? fixtureHash("preview");
149
+ return {
150
+ schemaVersion: CONTRACT_VERSION,
151
+ projectId: "test-project",
152
+ runId: "run-0001",
153
+ gate: 4,
154
+ decision: "approved",
155
+ actor: "test-user",
156
+ mechanism: "tty",
157
+ dependencyHash: previewHash,
158
+ previewHash,
159
+ writerEpoch: 1,
160
+ recipientIdentity: "test-writer",
161
+ decidedAt: FIXTURE_TIME,
162
+ expiresAt: FIXTURE_EXPIRY,
163
+ ...overrides,
164
+ };
165
+ }
166
+ export function operationFixture(overrides = {}) {
167
+ return {
168
+ schemaVersion: CONTRACT_VERSION,
169
+ operationId: "operation-0001",
170
+ projectId: "test-project",
171
+ runId: "run-0001",
172
+ providerOperationId: "fake-operation-0001",
173
+ operation: "apply",
174
+ state: "succeeded",
175
+ previewHash: fixtureHash("preview"),
176
+ approvalHash: fixtureHash("approval"),
177
+ ownerEpoch: 1,
178
+ updatedAt: FIXTURE_TIME,
179
+ ...overrides,
180
+ };
181
+ }
182
+ export function inventoryFixture(overrides = {}) {
183
+ const resources = overrides.resources ?? [
184
+ {
185
+ logicalId: "storage",
186
+ resourceId: "/subscriptions/test/resourceGroups/test/providers/Microsoft.Storage/storageAccounts/test",
187
+ type: "Microsoft.Storage/storageAccounts",
188
+ location: "swedencentral",
189
+ properties: { httpsOnly: true },
190
+ },
191
+ ];
192
+ return {
193
+ schemaVersion: CONTRACT_VERSION,
194
+ projectId: "test-project",
195
+ runId: "run-0001",
196
+ deploymentHash: sha256(resources),
197
+ collectedAt: FIXTURE_TIME,
198
+ ...overrides,
199
+ resources,
200
+ };
201
+ }
202
+ function without(value, key) {
203
+ const copy = { ...value };
204
+ delete copy[key];
205
+ return copy;
206
+ }
207
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export * from "./determinism.js";
2
+ export * from "./faults.js";
3
+ export * from "./fixtures.js";
4
+ export * from "./malicious.js";
5
+ export * from "./parity.js";
6
+ export * from "./qualification.js";
7
+ export * from "./quality.js";
8
+ export * from "./scorecard-samples.js";
9
+ export * from "./scenario.js";
10
+ export * from "./workspace.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ export * from "./determinism.js";
2
+ export * from "./faults.js";
3
+ export * from "./fixtures.js";
4
+ export * from "./malicious.js";
5
+ export * from "./parity.js";
6
+ export * from "./qualification.js";
7
+ export * from "./quality.js";
8
+ export * from "./scorecard-samples.js";
9
+ export * from "./scenario.js";
10
+ export * from "./workspace.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const maliciousPaths: readonly string[];
2
+ export declare const secretFixtures: Readonly<{
3
+ azureClientSecret: "not-a-real-client-secret";
4
+ githubToken: "ghp_notARealToken000000000000000000000";
5
+ privateKey: "-----BEGIN PRIVATE KEY-----\nnot-a-real-key\n-----END PRIVATE KEY-----";
6
+ }>;
7
+ export declare function oversizedFixture(maxBytes: number, fill?: number): Buffer;
8
+ export declare function symlinkFixture(linkPath: string, targetPath: string): Promise<string>;
9
+ //# sourceMappingURL=malicious.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"malicious.d.ts","sourceRoot":"","sources":["../src/malicious.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,mBAMzB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;EAIzB,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,SAAO,GAAG,MAAM,CAKtE;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI1F"}
@@ -0,0 +1,26 @@
1
+ import { mkdir, symlink } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ export const maliciousPaths = Object.freeze([
4
+ "../outside",
5
+ "../../etc/passwd",
6
+ "/absolute/path",
7
+ "nested/../../../outside",
8
+ "..\\outside",
9
+ ]);
10
+ export const secretFixtures = Object.freeze({
11
+ azureClientSecret: "not-a-real-client-secret",
12
+ githubToken: "ghp_notARealToken000000000000000000000",
13
+ privateKey: "-----BEGIN PRIVATE KEY-----\nnot-a-real-key\n-----END PRIVATE KEY-----",
14
+ });
15
+ export function oversizedFixture(maxBytes, fill = 0x61) {
16
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 0) {
17
+ throw new Error("maxBytes must be a non-negative safe integer");
18
+ }
19
+ return Buffer.alloc(maxBytes + 1, fill);
20
+ }
21
+ export async function symlinkFixture(linkPath, targetPath) {
22
+ await mkdir(dirname(linkPath), { recursive: true });
23
+ await symlink(targetPath, linkPath);
24
+ return linkPath;
25
+ }
26
+ //# sourceMappingURL=malicious.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"malicious.js","sourceRoot":"","sources":["../src/malicious.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1C,YAAY;IACZ,kBAAkB;IAClB,gBAAgB;IAChB,yBAAyB;IACzB,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1C,iBAAiB,EAAE,0BAA0B;IAC7C,WAAW,EAAE,wCAAwC;IACrD,UAAU,EAAE,wEAAwE;CACrF,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,IAAI,GAAG,IAAI;IAC5D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,UAAkB;IACvE,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACpC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ResourceInventoryV1 } from "@apexops/contracts";
2
+ export declare function assertLogicalInventoryParity(bicep: ResourceInventoryV1, terraform: ResourceInventoryV1): void;
3
+ //# sourceMappingURL=parity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parity.d.ts","sourceRoot":"","sources":["../src/parity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAe9D,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAE7G"}
package/dist/parity.js ADDED
@@ -0,0 +1,10 @@
1
+ import assert from "node:assert/strict";
2
+ function logicalResources(inventory) {
3
+ return inventory.resources
4
+ .map(({ logicalId, type, location, properties }) => ({ logicalId, type, location, properties }))
5
+ .sort((left, right) => left.logicalId.localeCompare(right.logicalId));
6
+ }
7
+ export function assertLogicalInventoryParity(bicep, terraform) {
8
+ assert.deepStrictEqual(logicalResources(bicep), logicalResources(terraform));
9
+ }
10
+ //# sourceMappingURL=parity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parity.js","sourceRoot":"","sources":["../src/parity.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAUxC,SAAS,gBAAgB,CAAC,SAA8B;IACtD,OAAO,SAAS,CAAC,SAAS;SACvB,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;SAC/F,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAA0B,EAAE,SAA8B;IACrG,MAAM,CAAC,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { benchmarkKernel } from "@apexops/kernel";
2
+ import { FakeClock, SequenceIds } from "./determinism.js";
3
+ export type QualificationTrack = "bicep" | "terraform";
4
+ export type QualificationCheckStatus = "pass" | "fail";
5
+ export interface QualificationCheck {
6
+ id: string;
7
+ status: QualificationCheckStatus;
8
+ durationMs: number;
9
+ detail?: string;
10
+ }
11
+ export interface QualificationTrackReport {
12
+ track: QualificationTrack;
13
+ status: QualificationCheckStatus;
14
+ checks: QualificationCheck[];
15
+ eventCount: number;
16
+ gateRevisionLoops?: number;
17
+ taskContextBytes?: number;
18
+ hashes: Record<string, string>;
19
+ }
20
+ export interface QualificationReport {
21
+ schemaVersion: "1.0.0";
22
+ status: QualificationCheckStatus;
23
+ durationMs: number;
24
+ tracks: QualificationTrackReport[];
25
+ checks: QualificationCheck[];
26
+ eventCount: number;
27
+ hashes: Record<string, string>;
28
+ }
29
+ export interface QualificationOptions {
30
+ workspaceRoot: string;
31
+ customizationsSource: string;
32
+ clock?: FakeClock;
33
+ ids?: SequenceIds;
34
+ injectFailure?: string;
35
+ }
36
+ export interface BenchmarkBudgets {
37
+ appendP95Ms: number;
38
+ replayP95Ms: number;
39
+ statusP95Ms: number;
40
+ }
41
+ export interface QualificationBenchmarkReport {
42
+ schemaVersion: "1.0.0";
43
+ status: QualificationCheckStatus;
44
+ eventCount: number;
45
+ budgets: BenchmarkBudgets;
46
+ metrics: ReturnType<typeof benchmarkKernel>;
47
+ checks: QualificationCheck[];
48
+ }
49
+ export declare function runQualification(options: QualificationOptions): Promise<QualificationReport>;
50
+ export declare function qualificationStatus(checks: readonly QualificationCheck[]): QualificationCheckStatus;
51
+ export declare function qualificationJson(report: QualificationReport): string;
52
+ export declare function runQualificationBenchmark(eventCount: number, budgets: BenchmarkBudgets): QualificationBenchmarkReport;
53
+ //# sourceMappingURL=qualification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qualification.d.ts","sourceRoot":"","sources":["../src/qualification.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2C,eAAe,EAA+B,MAAM,iBAAiB,CAAC;AAIxH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,WAAW,CAAC;AACvD,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,wBAAwB,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,MAAM,EAAE,wBAAwB,CAAC;IACjC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,wBAAwB,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACnC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,wBAAwB,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;IAC5C,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAiBD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkClG;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,GAAG,wBAAwB,CAEnG;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAErE;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,4BAA4B,CAQrH"}