@griffin-app/griffin-executor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +152 -0
  2. package/dist/adapters/axios.d.ts +5 -0
  3. package/dist/adapters/axios.d.ts.map +1 -0
  4. package/dist/adapters/axios.js +36 -0
  5. package/dist/adapters/axios.js.map +1 -0
  6. package/dist/adapters/index.d.ts +3 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +3 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/stub.d.ts +22 -0
  11. package/dist/adapters/stub.d.ts.map +1 -0
  12. package/dist/adapters/stub.js +36 -0
  13. package/dist/adapters/stub.js.map +1 -0
  14. package/dist/events/adapters/in-memory.d.ts +52 -0
  15. package/dist/events/adapters/in-memory.d.ts.map +1 -0
  16. package/dist/events/adapters/in-memory.js +70 -0
  17. package/dist/events/adapters/in-memory.js.map +1 -0
  18. package/dist/events/adapters/in-memory.test.d.ts +2 -0
  19. package/dist/events/adapters/in-memory.test.d.ts.map +1 -0
  20. package/dist/events/adapters/in-memory.test.js +109 -0
  21. package/dist/events/adapters/in-memory.test.js.map +1 -0
  22. package/dist/events/adapters/index.d.ts +9 -0
  23. package/dist/events/adapters/index.d.ts.map +1 -0
  24. package/dist/events/adapters/index.js +9 -0
  25. package/dist/events/adapters/index.js.map +1 -0
  26. package/dist/events/adapters/kinesis.d.ts +91 -0
  27. package/dist/events/adapters/kinesis.d.ts.map +1 -0
  28. package/dist/events/adapters/kinesis.js +136 -0
  29. package/dist/events/adapters/kinesis.js.map +1 -0
  30. package/dist/events/adapters/kinesis.test.d.ts +2 -0
  31. package/dist/events/adapters/kinesis.test.d.ts.map +1 -0
  32. package/dist/events/adapters/kinesis.test.js +249 -0
  33. package/dist/events/adapters/kinesis.test.js.map +1 -0
  34. package/dist/events/emitter.d.ts +68 -0
  35. package/dist/events/emitter.d.ts.map +1 -0
  36. package/dist/events/emitter.js +83 -0
  37. package/dist/events/emitter.js.map +1 -0
  38. package/dist/events/emitter.test.d.ts +2 -0
  39. package/dist/events/emitter.test.d.ts.map +1 -0
  40. package/dist/events/emitter.test.js +262 -0
  41. package/dist/events/emitter.test.js.map +1 -0
  42. package/dist/events/index.d.ts +4 -0
  43. package/dist/events/index.d.ts.map +1 -0
  44. package/dist/events/index.js +4 -0
  45. package/dist/events/index.js.map +1 -0
  46. package/dist/events/types.d.ts +112 -0
  47. package/dist/events/types.d.ts.map +1 -0
  48. package/dist/events/types.js +9 -0
  49. package/dist/events/types.js.map +1 -0
  50. package/dist/executor.d.ts +4 -0
  51. package/dist/executor.d.ts.map +1 -0
  52. package/dist/executor.js +799 -0
  53. package/dist/executor.js.map +1 -0
  54. package/dist/executor.test.d.ts +2 -0
  55. package/dist/executor.test.d.ts.map +1 -0
  56. package/dist/executor.test.js +1584 -0
  57. package/dist/executor.test.js.map +1 -0
  58. package/dist/index.d.ts +9 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +15 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/secrets/factory.d.ts +121 -0
  63. package/dist/secrets/factory.d.ts.map +1 -0
  64. package/dist/secrets/factory.js +137 -0
  65. package/dist/secrets/factory.js.map +1 -0
  66. package/dist/secrets/index.d.ts +14 -0
  67. package/dist/secrets/index.d.ts.map +1 -0
  68. package/dist/secrets/index.js +18 -0
  69. package/dist/secrets/index.js.map +1 -0
  70. package/dist/secrets/providers/aws.d.ts +63 -0
  71. package/dist/secrets/providers/aws.d.ts.map +1 -0
  72. package/dist/secrets/providers/aws.js +110 -0
  73. package/dist/secrets/providers/aws.js.map +1 -0
  74. package/dist/secrets/providers/env.d.ts +36 -0
  75. package/dist/secrets/providers/env.d.ts.map +1 -0
  76. package/dist/secrets/providers/env.js +37 -0
  77. package/dist/secrets/providers/env.js.map +1 -0
  78. package/dist/secrets/providers/index.d.ts +7 -0
  79. package/dist/secrets/providers/index.d.ts.map +1 -0
  80. package/dist/secrets/providers/index.js +7 -0
  81. package/dist/secrets/providers/index.js.map +1 -0
  82. package/dist/secrets/providers/vault.d.ts +75 -0
  83. package/dist/secrets/providers/vault.d.ts.map +1 -0
  84. package/dist/secrets/providers/vault.js +143 -0
  85. package/dist/secrets/providers/vault.js.map +1 -0
  86. package/dist/secrets/registry.d.ts +39 -0
  87. package/dist/secrets/registry.d.ts.map +1 -0
  88. package/dist/secrets/registry.js +134 -0
  89. package/dist/secrets/registry.js.map +1 -0
  90. package/dist/secrets/resolver.d.ts +45 -0
  91. package/dist/secrets/resolver.d.ts.map +1 -0
  92. package/dist/secrets/resolver.js +188 -0
  93. package/dist/secrets/resolver.js.map +1 -0
  94. package/dist/secrets/secrets.test.d.ts +2 -0
  95. package/dist/secrets/secrets.test.d.ts.map +1 -0
  96. package/dist/secrets/secrets.test.js +317 -0
  97. package/dist/secrets/secrets.test.js.map +1 -0
  98. package/dist/secrets/types.d.ts +70 -0
  99. package/dist/secrets/types.d.ts.map +1 -0
  100. package/dist/secrets/types.js +42 -0
  101. package/dist/secrets/types.js.map +1 -0
  102. package/dist/shared.d.ts +8 -0
  103. package/dist/shared.d.ts.map +1 -0
  104. package/dist/shared.js +30 -0
  105. package/dist/shared.js.map +1 -0
  106. package/dist/test-monitor-types.d.ts +43 -0
  107. package/dist/test-monitor-types.d.ts.map +1 -0
  108. package/dist/test-monitor-types.js +2 -0
  109. package/dist/test-monitor-types.js.map +1 -0
  110. package/dist/test-plan-types.d.ts +43 -0
  111. package/dist/test-plan-types.d.ts.map +1 -0
  112. package/dist/test-plan-types.js +2 -0
  113. package/dist/test-plan-types.js.map +1 -0
  114. package/dist/types.d.ts +93 -0
  115. package/dist/types.d.ts.map +1 -0
  116. package/dist/types.js +3 -0
  117. package/dist/types.js.map +1 -0
  118. package/dist/utils/dates.d.ts +11 -0
  119. package/dist/utils/dates.d.ts.map +1 -0
  120. package/dist/utils/dates.js +13 -0
  121. package/dist/utils/dates.js.map +1 -0
  122. package/package.json +39 -0
  123. package/src/adapters/axios.ts +39 -0
  124. package/src/adapters/index.ts +2 -0
  125. package/src/adapters/stub.ts +47 -0
  126. package/src/events/adapters/README.md +144 -0
  127. package/src/events/adapters/in-memory.test.ts +146 -0
  128. package/src/events/adapters/in-memory.ts +93 -0
  129. package/src/events/adapters/index.ts +9 -0
  130. package/src/events/adapters/kinesis.test.ts +323 -0
  131. package/src/events/adapters/kinesis.ts +211 -0
  132. package/src/events/emitter.test.ts +327 -0
  133. package/src/events/emitter.ts +133 -0
  134. package/src/events/index.ts +3 -0
  135. package/src/events/types.ts +136 -0
  136. package/src/executor.test.ts +1732 -0
  137. package/src/executor.ts +1075 -0
  138. package/src/index.ts +81 -0
  139. package/src/secrets/factory.ts +248 -0
  140. package/src/secrets/index.ts +48 -0
  141. package/src/secrets/providers/aws.ts +178 -0
  142. package/src/secrets/providers/env.ts +66 -0
  143. package/src/secrets/providers/index.ts +15 -0
  144. package/src/secrets/providers/vault.ts +257 -0
  145. package/src/secrets/resolver.ts +269 -0
  146. package/src/secrets/secrets.test.ts +402 -0
  147. package/src/secrets/types.ts +106 -0
  148. package/src/shared.ts +46 -0
  149. package/src/test-monitor-types.ts +49 -0
  150. package/src/types.ts +114 -0
  151. package/src/utils/dates.ts +13 -0
  152. package/tsconfig.json +20 -0
  153. package/vitest.config.ts +14 -0
@@ -0,0 +1,188 @@
1
+ import { isSecretRef, isStringLiteral, SecretResolutionError } from "./types.js";
2
+ /**
3
+ * Recursively collect all secret references and string literals from a value.
4
+ * @param value - The value to scan
5
+ * @param currentPath - Current path in the object tree
6
+ * @param collected - Accumulator for found secrets and literals
7
+ */
8
+ function collectSecretsFromValue(value, currentPath, collected) {
9
+ if (value === null || value === undefined) {
10
+ return;
11
+ }
12
+ if (isSecretRef(value)) {
13
+ collected.refs.push(value.$secret);
14
+ collected.paths.push({
15
+ path: [...currentPath],
16
+ secretRef: value.$secret,
17
+ });
18
+ return;
19
+ }
20
+ if (isStringLiteral(value)) {
21
+ collected.literalPaths.push({
22
+ path: [...currentPath],
23
+ value: value.$literal,
24
+ });
25
+ return;
26
+ }
27
+ if (Array.isArray(value)) {
28
+ for (let i = 0; i < value.length; i++) {
29
+ collectSecretsFromValue(value[i], [...currentPath, i], collected);
30
+ }
31
+ return;
32
+ }
33
+ if (typeof value === "object") {
34
+ for (const [key, val] of Object.entries(value)) {
35
+ collectSecretsFromValue(val, [...currentPath, key], collected);
36
+ }
37
+ }
38
+ }
39
+ /**
40
+ * Collect all secret references and string literals from a test monitor.
41
+ * Scans endpoint headers and bodies for $secret markers and $literal wrappers.
42
+ */
43
+ export function collectSecretsFromMonitor(monitor) {
44
+ const collected = {
45
+ refs: [],
46
+ paths: [],
47
+ literalPaths: [],
48
+ };
49
+ for (let nodeIndex = 0; nodeIndex < monitor.nodes.length; nodeIndex++) {
50
+ const node = monitor.nodes[nodeIndex];
51
+ // Only endpoints can have secrets (in headers and body)
52
+ if (node.type !== "HTTP_REQUEST") {
53
+ continue;
54
+ }
55
+ //const endpoint = node;
56
+ // Scan headers
57
+ if (node.headers) {
58
+ for (const [headerKey, headerValue] of Object.entries(node.headers)) {
59
+ collectSecretsFromValue(headerValue, ["nodes", nodeIndex, "headers", headerKey], collected);
60
+ }
61
+ }
62
+ // Scan body
63
+ if (node.body !== undefined) {
64
+ collectSecretsFromValue(node.body, ["nodes", nodeIndex, "body"], collected);
65
+ }
66
+ }
67
+ // Deduplicate refs by creating a unique key
68
+ const seen = new Set();
69
+ const uniqueRefs = [];
70
+ for (const ref of collected.refs) {
71
+ const key = `${ref.ref}:${ref.version || ""}:${ref.field || ""}`;
72
+ if (!seen.has(key)) {
73
+ seen.add(key);
74
+ uniqueRefs.push(ref);
75
+ }
76
+ }
77
+ collected.refs = uniqueRefs;
78
+ return collected;
79
+ }
80
+ /**
81
+ * Set a value at a path in an object.
82
+ * Creates intermediate objects/arrays as needed.
83
+ */
84
+ function setAtPath(obj, path, value) {
85
+ if (path.length === 0) {
86
+ return;
87
+ }
88
+ let current = obj;
89
+ for (let i = 0; i < path.length - 1; i++) {
90
+ const key = path[i];
91
+ if (current[key] === undefined) {
92
+ // Create intermediate object or array based on next key type
93
+ current[key] = typeof path[i + 1] === "number" ? [] : {};
94
+ }
95
+ current = current[key];
96
+ }
97
+ current[path[path.length - 1]] = value;
98
+ }
99
+ /**
100
+ * Deep clone a value.
101
+ */
102
+ function deepClone(value) {
103
+ if (value === null || value === undefined) {
104
+ return value;
105
+ }
106
+ return JSON.parse(JSON.stringify(value));
107
+ }
108
+ /**
109
+ * Resolve all secrets and unwrap string literals in a monitor and return a new monitor with substituted values.
110
+ * The original monitor is not modified.
111
+ *
112
+ * @param monitor - The test monitor containing secret references and string literals
113
+ * @param provider - The secret provider (required when monitor contains secret refs)
114
+ * @returns A new monitor with all secrets resolved to their values and literals unwrapped
115
+ * @throws SecretResolutionError if any secret cannot be resolved (fail-fast)
116
+ */
117
+ export async function resolveSecretsInMonitor(monitor, provider) {
118
+ // Collect all secret references and string literals
119
+ const collected = collectSecretsFromMonitor(monitor);
120
+ if (collected.refs.length === 0 && collected.literalPaths.length === 0) {
121
+ // No secrets or literals to resolve
122
+ return monitor;
123
+ }
124
+ // Resolve secrets when we have refs (provider required)
125
+ if (collected.refs.length > 0 && !provider) {
126
+ throw new SecretResolutionError("Monitor contains secret references but no secret provider was provided", { ref: "unknown" });
127
+ }
128
+ // Clone the monitor for modification
129
+ const resolvedMonitor = deepClone(monitor);
130
+ // Substitute resolved secret values at each path
131
+ if (provider) {
132
+ for (const { path, secretRef } of collected.paths) {
133
+ const value = await provider.resolve(secretRef.ref, {
134
+ version: secretRef.version,
135
+ field: secretRef.field,
136
+ });
137
+ setAtPath(resolvedMonitor, path, value);
138
+ }
139
+ }
140
+ // Unwrap string literals at each path
141
+ for (const { path, value } of collected.literalPaths) {
142
+ setAtPath(resolvedMonitor, path, value);
143
+ }
144
+ return resolvedMonitor;
145
+ }
146
+ /**
147
+ * Check if a monitor contains any secret references or string literals that need resolution.
148
+ * Useful for short-circuiting resolution when no secrets or literals are present.
149
+ */
150
+ export function planHasSecrets(monitor) {
151
+ for (const node of monitor.nodes) {
152
+ if (node.type !== "HTTP_REQUEST") {
153
+ continue;
154
+ }
155
+ // Check headers
156
+ if (node.headers) {
157
+ for (const headerValue of Object.values(node.headers)) {
158
+ if (isSecretRef(headerValue) || isStringLiteral(headerValue)) {
159
+ return true;
160
+ }
161
+ }
162
+ }
163
+ // Check body (recursive check)
164
+ if (node.body !== undefined && containsSecretOrLiteral(node.body)) {
165
+ return true;
166
+ }
167
+ }
168
+ return false;
169
+ }
170
+ /**
171
+ * Recursively check if a value contains any secret references or string literals.
172
+ */
173
+ function containsSecretOrLiteral(value) {
174
+ if (value === null || value === undefined) {
175
+ return false;
176
+ }
177
+ if (isSecretRef(value) || isStringLiteral(value)) {
178
+ return true;
179
+ }
180
+ if (Array.isArray(value)) {
181
+ return value.some(containsSecretOrLiteral);
182
+ }
183
+ if (typeof value === "object") {
184
+ return Object.values(value).some(containsSecretOrLiteral);
185
+ }
186
+ return false;
187
+ }
188
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/secrets/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=secrets.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.test.d.ts","sourceRoot":"","sources":["../../src/secrets/secrets.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,317 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { isSecretRef, isStringLiteral } from "./types.js";
3
+ import { EnvSecretProvider } from "./providers/env.js";
4
+ import { resolveSecretsInMonitor, collectSecretsFromMonitor, planHasSecrets, } from "./resolver.js";
5
+ // Helper to create a secret ref (mirrors the DSL's secret function)
6
+ function createSecretRef(ref) {
7
+ return { $secret: { ref } };
8
+ }
9
+ // Helper to create a string literal (mirrors the schema's StringLiteral)
10
+ function createStringLiteral(value) {
11
+ return { $literal: value };
12
+ }
13
+ describe("Secret Types", () => {
14
+ describe("isSecretRef", () => {
15
+ it("should return true for valid secret refs", () => {
16
+ expect(isSecretRef({ $secret: { ref: "API_KEY" } })).toBe(true);
17
+ expect(isSecretRef({
18
+ $secret: { ref: "my-secret", version: "1" },
19
+ })).toBe(true);
20
+ });
21
+ it("should return false for non-secret values", () => {
22
+ expect(isSecretRef("string")).toBe(false);
23
+ expect(isSecretRef(123)).toBe(false);
24
+ expect(isSecretRef(null)).toBe(false);
25
+ expect(isSecretRef(undefined)).toBe(false);
26
+ expect(isSecretRef({})).toBe(false);
27
+ expect(isSecretRef({ secret: { ref: "KEY" } })).toBe(false); // wrong key
28
+ expect(isSecretRef({ $literal: "value" })).toBe(false); // string literal
29
+ });
30
+ });
31
+ describe("isStringLiteral", () => {
32
+ it("should return true for valid string literals", () => {
33
+ expect(isStringLiteral({ $literal: "application/json" })).toBe(true);
34
+ expect(isStringLiteral({ $literal: "" })).toBe(true);
35
+ expect(isStringLiteral({ $literal: "Bearer token-123" })).toBe(true);
36
+ });
37
+ it("should return false for non-literal values", () => {
38
+ expect(isStringLiteral("string")).toBe(false);
39
+ expect(isStringLiteral(123)).toBe(false);
40
+ expect(isStringLiteral(null)).toBe(false);
41
+ expect(isStringLiteral(undefined)).toBe(false);
42
+ expect(isStringLiteral({})).toBe(false);
43
+ expect(isStringLiteral({ literal: "value" })).toBe(false); // wrong key
44
+ expect(isStringLiteral({ $secret: { ref: "KEY" } })).toBe(false); // secret ref
45
+ });
46
+ });
47
+ });
48
+ describe("EnvSecretProvider", () => {
49
+ it("should resolve environment variables", async () => {
50
+ const provider = new EnvSecretProvider({
51
+ env: { MY_API_KEY: "test-key-123" },
52
+ });
53
+ const result = await provider.resolve("MY_API_KEY");
54
+ expect(result).toBe("test-key-123");
55
+ });
56
+ it("should throw for missing environment variables", async () => {
57
+ const provider = new EnvSecretProvider({ env: {} });
58
+ await expect(provider.resolve("MISSING_VAR")).rejects.toThrow(/not set/);
59
+ });
60
+ it("should support prefix", async () => {
61
+ const provider = new EnvSecretProvider({
62
+ env: { APP_API_KEY: "prefixed-value" },
63
+ prefix: "APP_",
64
+ });
65
+ const result = await provider.resolve("API_KEY");
66
+ expect(result).toBe("prefixed-value");
67
+ });
68
+ });
69
+ describe("Monitor Secret Resolution", () => {
70
+ const createTestMonitor = (headers, body) => ({
71
+ id: "test-monitor-1",
72
+ name: "Test Monitor",
73
+ version: "1.0",
74
+ environment: "default",
75
+ project: "test-project",
76
+ frequency: { every: 1, unit: "MINUTE" },
77
+ nodes: [
78
+ {
79
+ id: "endpoint-1",
80
+ type: "HTTP_REQUEST",
81
+ method: "GET",
82
+ path: "/api/test",
83
+ base: "https://api.example.com",
84
+ response_format: "JSON",
85
+ headers,
86
+ body,
87
+ },
88
+ ],
89
+ edges: [
90
+ { from: "__START__", to: "endpoint-1" },
91
+ { from: "endpoint-1", to: "__END__" },
92
+ ],
93
+ });
94
+ describe("planHasSecrets", () => {
95
+ it("should return false for monitors without secrets or literals", () => {
96
+ const monitor = createTestMonitor({ "Content-Type": "application/json" });
97
+ expect(planHasSecrets(monitor)).toBe(false);
98
+ });
99
+ it("should return true for monitors with secret refs in headers", () => {
100
+ const monitor = createTestMonitor({
101
+ Authorization: createSecretRef("API_KEY"),
102
+ });
103
+ expect(planHasSecrets(monitor)).toBe(true);
104
+ });
105
+ it("should return true for monitors with secret refs in body", () => {
106
+ const monitor = createTestMonitor(undefined, {
107
+ token: createSecretRef("TOKEN"),
108
+ });
109
+ expect(planHasSecrets(monitor)).toBe(true);
110
+ });
111
+ it("should return true for monitors with string literals in headers", () => {
112
+ const monitor = createTestMonitor({
113
+ "Content-Type": createStringLiteral("application/json"),
114
+ });
115
+ expect(planHasSecrets(monitor)).toBe(true);
116
+ });
117
+ it("should return true for monitors with string literals in body", () => {
118
+ const monitor = createTestMonitor(undefined, {
119
+ type: createStringLiteral("test"),
120
+ });
121
+ expect(planHasSecrets(monitor)).toBe(true);
122
+ });
123
+ });
124
+ describe("collectSecretsFromMonitor", () => {
125
+ it("should collect secrets from headers", () => {
126
+ const monitor = createTestMonitor({
127
+ Authorization: createSecretRef("API_KEY"),
128
+ "X-Custom": createSecretRef("custom-secret"),
129
+ });
130
+ const collected = collectSecretsFromMonitor(monitor);
131
+ expect(collected.refs).toHaveLength(2);
132
+ expect(collected.refs).toContainEqual({ ref: "API_KEY" });
133
+ expect(collected.refs).toContainEqual({ ref: "custom-secret" });
134
+ });
135
+ it("should collect secrets from nested body", () => {
136
+ const monitor = createTestMonitor(undefined, {
137
+ auth: {
138
+ token: createSecretRef("TOKEN"),
139
+ },
140
+ items: [{ key: createSecretRef("ITEM_KEY") }],
141
+ });
142
+ const collected = collectSecretsFromMonitor(monitor);
143
+ expect(collected.refs).toHaveLength(2);
144
+ expect(collected.refs).toContainEqual({ ref: "TOKEN" });
145
+ expect(collected.refs).toContainEqual({ ref: "ITEM_KEY" });
146
+ });
147
+ it("should deduplicate secret refs", () => {
148
+ const monitor = createTestMonitor({
149
+ Authorization: createSecretRef("API_KEY"),
150
+ "X-Backup-Auth": createSecretRef("API_KEY"),
151
+ });
152
+ const collected = collectSecretsFromMonitor(monitor);
153
+ expect(collected.refs).toHaveLength(1);
154
+ expect(collected.paths).toHaveLength(2);
155
+ });
156
+ it("should collect string literals from headers", () => {
157
+ const monitor = createTestMonitor({
158
+ "Content-Type": createStringLiteral("application/json"),
159
+ Accept: createStringLiteral("application/xml"),
160
+ });
161
+ const collected = collectSecretsFromMonitor(monitor);
162
+ expect(collected.refs).toHaveLength(0);
163
+ expect(collected.literalPaths).toHaveLength(2);
164
+ expect(collected.literalPaths).toContainEqual({
165
+ path: ["nodes", 0, "headers", "Content-Type"],
166
+ value: "application/json",
167
+ });
168
+ expect(collected.literalPaths).toContainEqual({
169
+ path: ["nodes", 0, "headers", "Accept"],
170
+ value: "application/xml",
171
+ });
172
+ });
173
+ it("should collect both secrets and literals", () => {
174
+ const monitor = createTestMonitor({
175
+ Authorization: createSecretRef("API_KEY"),
176
+ "Content-Type": createStringLiteral("application/json"),
177
+ });
178
+ const collected = collectSecretsFromMonitor(monitor);
179
+ expect(collected.refs).toHaveLength(1);
180
+ expect(collected.refs).toContainEqual({ ref: "API_KEY" });
181
+ expect(collected.literalPaths).toHaveLength(1);
182
+ expect(collected.literalPaths).toContainEqual({
183
+ path: ["nodes", 0, "headers", "Content-Type"],
184
+ value: "application/json",
185
+ });
186
+ });
187
+ });
188
+ describe("resolveSecretsInMonitor", () => {
189
+ it("should resolve secrets in headers", async () => {
190
+ const monitor = createTestMonitor({
191
+ Authorization: createSecretRef("API_KEY"),
192
+ "Content-Type": "application/json",
193
+ });
194
+ const provider = new EnvSecretProvider({
195
+ env: { API_KEY: "Bearer secret-token" },
196
+ });
197
+ const resolved = await resolveSecretsInMonitor(monitor, provider);
198
+ const endpoint = resolved.nodes[0];
199
+ if (endpoint.type !== "HTTP_REQUEST") {
200
+ throw new Error("HttpRequest not found");
201
+ }
202
+ expect(endpoint.headers?.Authorization).toBe("Bearer secret-token");
203
+ expect(endpoint.headers?.["Content-Type"]).toBe("application/json");
204
+ });
205
+ it("should resolve secrets in body", async () => {
206
+ const monitor = createTestMonitor(undefined, {
207
+ token: createSecretRef("TOKEN"),
208
+ data: "plain-value",
209
+ });
210
+ const provider = new EnvSecretProvider({
211
+ env: { TOKEN: "resolved-token" },
212
+ });
213
+ const resolved = await resolveSecretsInMonitor(monitor, provider);
214
+ const endpoint = resolved.nodes[0];
215
+ if (endpoint.type !== "HTTP_REQUEST") {
216
+ throw new Error("HttpRequest not found");
217
+ }
218
+ expect(endpoint.body.token).toBe("resolved-token");
219
+ expect(endpoint.body.data).toBe("plain-value");
220
+ });
221
+ it("should not modify original monitor", async () => {
222
+ const monitor = createTestMonitor({
223
+ Authorization: createSecretRef("API_KEY"),
224
+ });
225
+ const provider = new EnvSecretProvider({
226
+ env: { API_KEY: "secret" },
227
+ });
228
+ const resolved = await resolveSecretsInMonitor(monitor, provider);
229
+ // Original should still have secret ref
230
+ const originalEndpoint = monitor.nodes[0];
231
+ if (originalEndpoint.type !== "HTTP_REQUEST") {
232
+ throw new Error("HttpRequest not found");
233
+ }
234
+ expect(originalEndpoint.headers?.Authorization).toEqual(createSecretRef("API_KEY"));
235
+ // Resolved should have string
236
+ const resolvedEndpoint = resolved.nodes[0];
237
+ if (resolvedEndpoint.type !== "HTTP_REQUEST") {
238
+ throw new Error("HttpRequest not found");
239
+ }
240
+ expect(resolvedEndpoint.headers?.Authorization).toBe("secret");
241
+ });
242
+ it("should throw when no provider configured", async () => {
243
+ const monitor = createTestMonitor({
244
+ Authorization: createSecretRef("API_KEY"),
245
+ });
246
+ await expect(resolveSecretsInMonitor(monitor, null)).rejects.toThrow(/Monitor contains secret references but no secret provider was provided/);
247
+ });
248
+ it("should throw for missing secret", async () => {
249
+ const monitor = createTestMonitor({
250
+ Authorization: createSecretRef("MISSING_KEY"),
251
+ });
252
+ const provider = new EnvSecretProvider({ env: {} });
253
+ await expect(resolveSecretsInMonitor(monitor, provider)).rejects.toThrow(/not set/);
254
+ });
255
+ it("should unwrap string literals in headers", async () => {
256
+ const monitor = createTestMonitor({
257
+ "Content-Type": createStringLiteral("application/json"),
258
+ Accept: createStringLiteral("application/xml"),
259
+ });
260
+ const resolved = await resolveSecretsInMonitor(monitor, null);
261
+ const endpoint = resolved.nodes[0];
262
+ if (endpoint.type !== "HTTP_REQUEST") {
263
+ throw new Error("HttpRequest not found");
264
+ }
265
+ expect(endpoint.headers?.["Content-Type"]).toBe("application/json");
266
+ expect(endpoint.headers?.Accept).toBe("application/xml");
267
+ });
268
+ it("should unwrap string literals in body", async () => {
269
+ const monitor = createTestMonitor(undefined, {
270
+ type: createStringLiteral("test-type"),
271
+ data: "plain-value",
272
+ });
273
+ const resolved = await resolveSecretsInMonitor(monitor, null);
274
+ const endpoint = resolved.nodes[0];
275
+ if (endpoint.type !== "HTTP_REQUEST") {
276
+ throw new Error("HttpRequest not found");
277
+ }
278
+ expect(endpoint.body.type).toBe("test-type");
279
+ expect(endpoint.body.data).toBe("plain-value");
280
+ });
281
+ it("should resolve both secrets and literals", async () => {
282
+ const monitor = createTestMonitor({
283
+ Authorization: createSecretRef("API_KEY"),
284
+ "Content-Type": createStringLiteral("application/json"),
285
+ });
286
+ const provider = new EnvSecretProvider({
287
+ env: { API_KEY: "Bearer secret-token" },
288
+ });
289
+ const resolved = await resolveSecretsInMonitor(monitor, provider);
290
+ const endpoint = resolved.nodes[0];
291
+ if (endpoint.type !== "HTTP_REQUEST") {
292
+ throw new Error("HttpRequest not found");
293
+ }
294
+ expect(endpoint.headers?.Authorization).toBe("Bearer secret-token");
295
+ expect(endpoint.headers?.["Content-Type"]).toBe("application/json");
296
+ });
297
+ it("should not modify original monitor with literals", async () => {
298
+ const monitor = createTestMonitor({
299
+ "Content-Type": createStringLiteral("application/json"),
300
+ });
301
+ const resolved = await resolveSecretsInMonitor(monitor, null);
302
+ // Original should still have literal wrapper
303
+ const originalEndpoint = monitor.nodes[0];
304
+ if (originalEndpoint.type !== "HTTP_REQUEST") {
305
+ throw new Error("HttpRequest not found");
306
+ }
307
+ expect(originalEndpoint.headers?.["Content-Type"]).toEqual(createStringLiteral("application/json"));
308
+ // Resolved should have unwrapped string
309
+ const resolvedEndpoint = resolved.nodes[0];
310
+ if (resolvedEndpoint.type !== "HTTP_REQUEST") {
311
+ throw new Error("HttpRequest not found");
312
+ }
313
+ expect(resolvedEndpoint.headers?.["Content-Type"]).toBe("application/json");
314
+ });
315
+ });
316
+ });
317
+ //# sourceMappingURL=secrets.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.test.js","sourceRoot":"","sources":["../../src/secrets/secrets.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { StringLiteral } from "@griffin-app/griffin-hub-sdk";
2
+ /**
3
+ * Data structure for a secret reference as it appears in a monitor.
4
+ */
5
+ export interface SecretRefData {
6
+ ref: string;
7
+ version?: string;
8
+ field?: string;
9
+ }
10
+ /**
11
+ * Secret reference marker in monitor JSON.
12
+ */
13
+ export interface SecretRef {
14
+ $secret: SecretRefData;
15
+ }
16
+ /**
17
+ * Options passed to secret resolution.
18
+ */
19
+ export interface SecretResolveOptions {
20
+ version?: string;
21
+ field?: string;
22
+ }
23
+ /**
24
+ * Interface that all secret providers must implement.
25
+ */
26
+ export interface SecretProvider {
27
+ /** Unique name of the provider (e.g., "env", "aws", "vault") */
28
+ readonly name: string;
29
+ /**
30
+ * Resolve a single secret reference.
31
+ * @param ref - The secret path/identifier within this provider
32
+ * @param options - Optional version or field extraction
33
+ * @returns The resolved secret value
34
+ * @throws Error if secret cannot be resolved
35
+ */
36
+ resolve(ref: string, options?: SecretResolveOptions): Promise<string>;
37
+ /**
38
+ * Optional batch resolution for efficiency.
39
+ * Default implementation calls resolve() for each ref.
40
+ */
41
+ resolveMany?(refs: Array<{
42
+ ref: string;
43
+ options?: SecretResolveOptions;
44
+ }>): Promise<Map<string, string>>;
45
+ /**
46
+ * Optional validation/health check.
47
+ * Called during provider initialization.
48
+ */
49
+ validate?(): Promise<void>;
50
+ }
51
+ /**
52
+ * Error thrown when secret resolution fails.
53
+ */
54
+ export declare class SecretResolutionError extends Error {
55
+ readonly ref: string;
56
+ readonly cause?: Error;
57
+ constructor(message: string, details: {
58
+ ref: string;
59
+ cause?: unknown;
60
+ });
61
+ }
62
+ /**
63
+ * Type guard to check if a value is a secret reference.
64
+ */
65
+ export declare function isSecretRef(value: unknown): value is SecretRef;
66
+ /**
67
+ * Type guard to check if a value is a string literal.
68
+ */
69
+ export declare function isStringLiteral(value: unknown): value is StringLiteral;
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/secrets/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;;OAMG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtE;;;OAGG;IACH,WAAW,CAAC,CACV,IAAI,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,oBAAoB,CAAA;KAAE,CAAC,GAC3D,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,SAAgB,KAAK,CAAC,EAAE,KAAK,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQvE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAgB9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAOtE"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Error thrown when secret resolution fails.
3
+ */
4
+ export class SecretResolutionError extends Error {
5
+ ref;
6
+ cause;
7
+ constructor(message, details) {
8
+ super(message);
9
+ this.name = "SecretResolutionError";
10
+ this.ref = details.ref;
11
+ if (details.cause instanceof Error) {
12
+ this.cause = details.cause;
13
+ }
14
+ }
15
+ }
16
+ /**
17
+ * Type guard to check if a value is a secret reference.
18
+ */
19
+ export function isSecretRef(value) {
20
+ if (typeof value !== "object" || value === null) {
21
+ return false;
22
+ }
23
+ const obj = value;
24
+ if (!("$secret" in obj) ||
25
+ typeof obj.$secret !== "object" ||
26
+ obj.$secret === null) {
27
+ return false;
28
+ }
29
+ const secretData = obj.$secret;
30
+ return typeof secretData.ref === "string";
31
+ }
32
+ /**
33
+ * Type guard to check if a value is a string literal.
34
+ */
35
+ export function isStringLiteral(value) {
36
+ if (typeof value !== "object" || value === null) {
37
+ return false;
38
+ }
39
+ const obj = value;
40
+ return "$literal" in obj && typeof obj.$literal === "string";
41
+ }
42
+ //# sourceMappingURL=types.js.map