@kb-labs/core-config 1.2.0 → 1.4.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/index.d.ts +1016 -25
- package/dist/index.js +1533 -29
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/__tests__/cache.spec.d.ts +0 -6
- package/dist/__tests__/cache.spec.d.ts.map +0 -1
- package/dist/__tests__/cache.spec.js +0 -87
- package/dist/__tests__/cache.spec.js.map +0 -1
- package/dist/__tests__/fs-atomic.spec.d.ts +0 -6
- package/dist/__tests__/fs-atomic.spec.d.ts.map +0 -1
- package/dist/__tests__/fs-atomic.spec.js +0 -153
- package/dist/__tests__/fs-atomic.spec.js.map +0 -1
- package/dist/__tests__/get-product-config-edge-cases.spec.d.ts +0 -6
- package/dist/__tests__/get-product-config-edge-cases.spec.d.ts.map +0 -1
- package/dist/__tests__/get-product-config-edge-cases.spec.js +0 -334
- package/dist/__tests__/get-product-config-edge-cases.spec.js.map +0 -1
- package/dist/__tests__/init-workspace.spec.d.ts +0 -6
- package/dist/__tests__/init-workspace.spec.d.ts.map +0 -1
- package/dist/__tests__/init-workspace.spec.js +0 -101
- package/dist/__tests__/init-workspace.spec.js.map +0 -1
- package/dist/__tests__/kb-error.spec.d.ts +0 -6
- package/dist/__tests__/kb-error.spec.d.ts.map +0 -1
- package/dist/__tests__/kb-error.spec.js +0 -193
- package/dist/__tests__/kb-error.spec.js.map +0 -1
- package/dist/__tests__/preset-lockfile.spec.d.ts +0 -6
- package/dist/__tests__/preset-lockfile.spec.d.ts.map +0 -1
- package/dist/__tests__/preset-lockfile.spec.js +0 -142
- package/dist/__tests__/preset-lockfile.spec.js.map +0 -1
- package/dist/__tests__/product-config-profiles.spec.d.ts +0 -6
- package/dist/__tests__/product-config-profiles.spec.d.ts.map +0 -1
- package/dist/__tests__/product-config-profiles.spec.js +0 -82
- package/dist/__tests__/product-config-profiles.spec.js.map +0 -1
- package/dist/__tests__/product-config.spec.d.ts +0 -6
- package/dist/__tests__/product-config.spec.d.ts.map +0 -1
- package/dist/__tests__/product-config.spec.js +0 -304
- package/dist/__tests__/product-config.spec.js.map +0 -1
- package/dist/__tests__/profiles-demo.d.ts +0 -11
- package/dist/__tests__/profiles-demo.d.ts.map +0 -1
- package/dist/__tests__/profiles-demo.js +0 -173
- package/dist/__tests__/profiles-demo.js.map +0 -1
- package/dist/__tests__/profiles-resolver.spec.d.ts +0 -2
- package/dist/__tests__/profiles-resolver.spec.d.ts.map +0 -1
- package/dist/__tests__/profiles-resolver.spec.js +0 -114
- package/dist/__tests__/profiles-resolver.spec.js.map +0 -1
- package/dist/__tests__/profiles-section.spec.d.ts +0 -2
- package/dist/__tests__/profiles-section.spec.d.ts.map +0 -1
- package/dist/__tests__/profiles-section.spec.js +0 -50
- package/dist/__tests__/profiles-section.spec.js.map +0 -1
- package/dist/__tests__/runtime.spec.d.ts +0 -2
- package/dist/__tests__/runtime.spec.d.ts.map +0 -1
- package/dist/__tests__/runtime.spec.js +0 -170
- package/dist/__tests__/runtime.spec.js.map +0 -1
- package/dist/__tests__/upsert-lockfile.spec.d.ts +0 -1
- package/dist/__tests__/upsert-lockfile.spec.d.ts.map +0 -1
- package/dist/__tests__/upsert-lockfile.spec.js +0 -2
- package/dist/__tests__/upsert-lockfile.spec.js.map +0 -1
- package/dist/__tests__/validate-config.spec.d.ts +0 -2
- package/dist/__tests__/validate-config.spec.d.ts.map +0 -1
- package/dist/__tests__/validate-config.spec.js +0 -14
- package/dist/__tests__/validate-config.spec.js.map +0 -1
- package/dist/api/init-workspace.d.ts +0 -10
- package/dist/api/init-workspace.d.ts.map +0 -1
- package/dist/api/init-workspace.js +0 -186
- package/dist/api/init-workspace.js.map +0 -1
- package/dist/api/product-config.d.ts +0 -20
- package/dist/api/product-config.d.ts.map +0 -1
- package/dist/api/product-config.js +0 -236
- package/dist/api/product-config.js.map +0 -1
- package/dist/api/read-config.d.ts +0 -22
- package/dist/api/read-config.d.ts.map +0 -1
- package/dist/api/read-config.js +0 -112
- package/dist/api/read-config.js.map +0 -1
- package/dist/api/read-kb-config.d.ts +0 -12
- package/dist/api/read-kb-config.d.ts.map +0 -1
- package/dist/api/read-kb-config.js +0 -47
- package/dist/api/read-kb-config.js.map +0 -1
- package/dist/api/upsert-lockfile.d.ts +0 -10
- package/dist/api/upsert-lockfile.d.ts.map +0 -1
- package/dist/api/upsert-lockfile.js +0 -63
- package/dist/api/upsert-lockfile.js.map +0 -1
- package/dist/cache/fs-cache.d.ts +0 -38
- package/dist/cache/fs-cache.d.ts.map +0 -1
- package/dist/cache/fs-cache.js +0 -142
- package/dist/cache/fs-cache.js.map +0 -1
- package/dist/errors/kb-error.d.ts +0 -35
- package/dist/errors/kb-error.d.ts.map +0 -1
- package/dist/errors/kb-error.js +0 -57
- package/dist/errors/kb-error.js.map +0 -1
- package/dist/hash/config-hash.d.ts +0 -17
- package/dist/hash/config-hash.d.ts.map +0 -1
- package/dist/hash/config-hash.js +0 -55
- package/dist/hash/config-hash.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/lockfile/lockfile.d.ts +0 -53
- package/dist/lockfile/lockfile.d.ts.map +0 -1
- package/dist/lockfile/lockfile.js +0 -142
- package/dist/lockfile/lockfile.js.map +0 -1
- package/dist/merge/layered-merge.d.ts +0 -16
- package/dist/merge/layered-merge.d.ts.map +0 -1
- package/dist/merge/layered-merge.js +0 -87
- package/dist/merge/layered-merge.js.map +0 -1
- package/dist/preset/resolve-preset.d.ts +0 -28
- package/dist/preset/resolve-preset.d.ts.map +0 -1
- package/dist/preset/resolve-preset.js +0 -104
- package/dist/preset/resolve-preset.js.map +0 -1
- package/dist/profiles/loader.d.ts +0 -12
- package/dist/profiles/loader.d.ts.map +0 -1
- package/dist/profiles/loader.js +0 -34
- package/dist/profiles/loader.js.map +0 -1
- package/dist/profiles/resolver.d.ts +0 -11
- package/dist/profiles/resolver.d.ts.map +0 -1
- package/dist/profiles/resolver.js +0 -252
- package/dist/profiles/resolver.js.map +0 -1
- package/dist/profiles/scope-selector.d.ts +0 -19
- package/dist/profiles/scope-selector.d.ts.map +0 -1
- package/dist/profiles/scope-selector.js +0 -64
- package/dist/profiles/scope-selector.js.map +0 -1
- package/dist/profiles/types.d.ts +0 -462
- package/dist/profiles/types.d.ts.map +0 -1
- package/dist/profiles/types.js +0 -68
- package/dist/profiles/types.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -2
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -2
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/runtime.d.ts +0 -46
- package/dist/runtime/runtime.d.ts.map +0 -1
- package/dist/runtime/runtime.js +0 -126
- package/dist/runtime/runtime.js.map +0 -1
- package/dist/types/index.d.ts +0 -2
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -2
- package/dist/types/index.js.map +0 -1
- package/dist/types/init.d.ts +0 -33
- package/dist/types/init.d.ts.map +0 -1
- package/dist/types/init.js +0 -6
- package/dist/types/init.js.map +0 -1
- package/dist/types/preset.d.ts +0 -27
- package/dist/types/preset.d.ts.map +0 -1
- package/dist/types/preset.js +0 -6
- package/dist/types/preset.js.map +0 -1
- package/dist/types/types.d.ts +0 -70
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/types.js +0 -2
- package/dist/types/types.js.map +0 -1
- package/dist/utils/__tests__/env.spec.d.ts +0 -2
- package/dist/utils/__tests__/env.spec.d.ts.map +0 -1
- package/dist/utils/__tests__/env.spec.js +0 -33
- package/dist/utils/__tests__/env.spec.js.map +0 -1
- package/dist/utils/env.d.ts +0 -7
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/env.js +0 -25
- package/dist/utils/env.js.map +0 -1
- package/dist/utils/fs-atomic.d.ts +0 -15
- package/dist/utils/fs-atomic.d.ts.map +0 -1
- package/dist/utils/fs-atomic.js +0 -46
- package/dist/utils/fs-atomic.js.map +0 -1
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -3
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/paths.d.ts +0 -21
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js +0 -32
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/product-normalize.d.ts +0 -25
- package/dist/utils/product-normalize.d.ts.map +0 -1
- package/dist/utils/product-normalize.js +0 -48
- package/dist/utils/product-normalize.js.map +0 -1
- package/dist/validation/validate-config.d.ts +0 -10
- package/dist/validation/validate-config.d.ts.map +0 -1
- package/dist/validation/validate-config.js +0 -21
- package/dist/validation/validate-config.js.map +0 -1
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module @kb-labs/core-config/__tests__/get-product-config-edge-cases.spec.ts
|
|
3
|
-
* Edge cases and error handling tests for getProductConfig
|
|
4
|
-
*/
|
|
5
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
6
|
-
import { promises as fsp } from "node:fs";
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
import { tmpdir } from "node:os";
|
|
9
|
-
import { getProductConfig } from "../api/product-config";
|
|
10
|
-
import { clearCaches } from "../cache/fs-cache";
|
|
11
|
-
describe("getProductConfig Edge Cases", () => {
|
|
12
|
-
let testDir;
|
|
13
|
-
beforeEach(async () => {
|
|
14
|
-
testDir = path.join(tmpdir(), `kb-labs-config-edge-${Date.now()}`);
|
|
15
|
-
await fsp.mkdir(testDir, { recursive: true });
|
|
16
|
-
clearCaches();
|
|
17
|
-
});
|
|
18
|
-
afterEach(async () => {
|
|
19
|
-
await fsp.rm(testDir, { recursive: true, force: true });
|
|
20
|
-
clearCaches();
|
|
21
|
-
});
|
|
22
|
-
describe("Profile Layer Edge Cases", () => {
|
|
23
|
-
it("should handle missing profile layer", async () => {
|
|
24
|
-
const workspaceConfig = {
|
|
25
|
-
schemaVersion: "1.0",
|
|
26
|
-
products: {
|
|
27
|
-
"ai-review": { enabled: true },
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
await fsp.writeFile(path.join(testDir, "kb.config.json"), JSON.stringify(workspaceConfig, null, 2));
|
|
31
|
-
const result = await getProductConfig({
|
|
32
|
-
cwd: testDir,
|
|
33
|
-
product: "aiReview",
|
|
34
|
-
profileLayer: undefined,
|
|
35
|
-
}, null);
|
|
36
|
-
expect(result.config).toBeDefined();
|
|
37
|
-
expect(result.config.enabled).toBe(true);
|
|
38
|
-
});
|
|
39
|
-
it("should merge profile layer with workspace config", async () => {
|
|
40
|
-
const workspaceConfig = {
|
|
41
|
-
schemaVersion: "1.0",
|
|
42
|
-
products: {
|
|
43
|
-
"ai-review": { enabled: true, maxFiles: 100 },
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
await fsp.writeFile(path.join(testDir, "kb.config.json"), JSON.stringify(workspaceConfig, null, 2));
|
|
47
|
-
const profileLayer = {
|
|
48
|
-
profileId: "default",
|
|
49
|
-
source: "profile:default",
|
|
50
|
-
products: {
|
|
51
|
-
"ai-review": { maxFiles: 200 },
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
const result = await getProductConfig({
|
|
55
|
-
cwd: testDir,
|
|
56
|
-
product: "aiReview",
|
|
57
|
-
profileLayer,
|
|
58
|
-
}, null);
|
|
59
|
-
const config = result.config;
|
|
60
|
-
expect(config.enabled).toBe(true); // From workspace
|
|
61
|
-
// Profile layer merges with workspace
|
|
62
|
-
// Profile layer should override workspace (higher priority in merge order)
|
|
63
|
-
// Note: maxFiles may not be in runtime defaults, so check only if present
|
|
64
|
-
if ("maxFiles" in config) {
|
|
65
|
-
expect(config.maxFiles).toBe(200); // Profile should override workspace (100 -> 200)
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
it("should handle scope layer with profile layer", async () => {
|
|
69
|
-
const workspaceConfig = {
|
|
70
|
-
schemaVersion: "1.0",
|
|
71
|
-
products: {
|
|
72
|
-
"ai-review": { enabled: true, maxFiles: 100 },
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
await fsp.writeFile(path.join(testDir, "kb.config.json"), JSON.stringify(workspaceConfig, null, 2));
|
|
76
|
-
const profileLayer = {
|
|
77
|
-
profileId: "default",
|
|
78
|
-
source: "profile:default",
|
|
79
|
-
products: {
|
|
80
|
-
"ai-review": { maxFiles: 200 },
|
|
81
|
-
},
|
|
82
|
-
scope: {
|
|
83
|
-
id: "src",
|
|
84
|
-
source: "profile-scope:src",
|
|
85
|
-
products: {
|
|
86
|
-
"ai-review": { maxFiles: 150 },
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
const result = await getProductConfig({
|
|
91
|
-
cwd: testDir,
|
|
92
|
-
product: "aiReview",
|
|
93
|
-
profileLayer,
|
|
94
|
-
}, null);
|
|
95
|
-
const config = result.config;
|
|
96
|
-
expect(config.enabled).toBe(true); // From workspace
|
|
97
|
-
// Scope layer should have highest priority (after CLI)
|
|
98
|
-
// Note: maxFiles may not be in runtime defaults
|
|
99
|
-
if ("maxFiles" in config) {
|
|
100
|
-
expect(config.maxFiles).toBe(150); // From scope (overrides profile 200)
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
describe("CLI Overrides", () => {
|
|
105
|
-
it("should apply CLI overrides with highest priority", async () => {
|
|
106
|
-
const workspaceConfig = {
|
|
107
|
-
schemaVersion: "1.0",
|
|
108
|
-
products: {
|
|
109
|
-
"ai-review": { enabled: true, maxFiles: 100 },
|
|
110
|
-
},
|
|
111
|
-
};
|
|
112
|
-
await fsp.writeFile(path.join(testDir, "kb.config.json"), JSON.stringify(workspaceConfig, null, 2));
|
|
113
|
-
const profileLayer = {
|
|
114
|
-
profileId: "default",
|
|
115
|
-
source: "profile:default",
|
|
116
|
-
products: {
|
|
117
|
-
"ai-review": { maxFiles: 200 },
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
const result = await getProductConfig({
|
|
121
|
-
cwd: testDir,
|
|
122
|
-
product: "aiReview",
|
|
123
|
-
profileLayer,
|
|
124
|
-
cli: { maxFiles: 50 },
|
|
125
|
-
}, null);
|
|
126
|
-
const config = result.config;
|
|
127
|
-
expect(config.maxFiles).toBe(50); // CLI override wins
|
|
128
|
-
});
|
|
129
|
-
it("should handle CLI overrides without profile layer", async () => {
|
|
130
|
-
const workspaceConfig = {
|
|
131
|
-
schemaVersion: "1.0",
|
|
132
|
-
products: {
|
|
133
|
-
"ai-review": { enabled: true, maxFiles: 100 },
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
await fsp.writeFile(path.join(testDir, "kb.config.json"), JSON.stringify(workspaceConfig, null, 2));
|
|
137
|
-
const result = await getProductConfig({
|
|
138
|
-
cwd: testDir,
|
|
139
|
-
product: "aiReview",
|
|
140
|
-
cli: { maxFiles: 50, debug: true },
|
|
141
|
-
}, null);
|
|
142
|
-
const config = result.config;
|
|
143
|
-
expect(config.maxFiles).toBe(50); // CLI override
|
|
144
|
-
expect(config.debug).toBe(true); // CLI override
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
describe("Merge Conflicts", () => {
|
|
148
|
-
it("should handle nested object merges correctly", async () => {
|
|
149
|
-
const workspaceConfig = {
|
|
150
|
-
schemaVersion: "1.0",
|
|
151
|
-
products: {
|
|
152
|
-
"ai-review": {
|
|
153
|
-
enabled: true,
|
|
154
|
-
rules: {
|
|
155
|
-
security: { level: "high" },
|
|
156
|
-
performance: { level: "medium" },
|
|
157
|
-
},
|
|
158
|
-
},
|
|
159
|
-
},
|
|
160
|
-
};
|
|
161
|
-
await fsp.writeFile(path.join(testDir, "kb.config.json"), JSON.stringify(workspaceConfig, null, 2));
|
|
162
|
-
const profileLayer = {
|
|
163
|
-
profileId: "default",
|
|
164
|
-
source: "profile:default",
|
|
165
|
-
products: {
|
|
166
|
-
"ai-review": {
|
|
167
|
-
rules: {
|
|
168
|
-
security: { level: "critical" },
|
|
169
|
-
style: { level: "low" },
|
|
170
|
-
},
|
|
171
|
-
},
|
|
172
|
-
},
|
|
173
|
-
};
|
|
174
|
-
const result = await getProductConfig({
|
|
175
|
-
cwd: testDir,
|
|
176
|
-
product: "aiReview",
|
|
177
|
-
profileLayer,
|
|
178
|
-
}, null);
|
|
179
|
-
const config = result.config;
|
|
180
|
-
// Profile should override workspace values for matching keys
|
|
181
|
-
// Merge behavior: nested objects are merged, so both workspace and profile values should be present
|
|
182
|
-
expect(config.rules).toBeDefined();
|
|
183
|
-
if (config.rules.security) {
|
|
184
|
-
expect(config.rules.security.level).toBe("critical"); // From profile (overrides workspace 'high')
|
|
185
|
-
}
|
|
186
|
-
if (config.rules.performance) {
|
|
187
|
-
expect(config.rules.performance.level).toBe("medium"); // From workspace (preserved if not in profile)
|
|
188
|
-
}
|
|
189
|
-
if (config.rules.style) {
|
|
190
|
-
expect(config.rules.style.level).toBe("low"); // From profile (added)
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
describe("Cache Behavior", () => {
|
|
195
|
-
it("should cache configuration results", async () => {
|
|
196
|
-
const workspaceConfig = {
|
|
197
|
-
schemaVersion: "1.0",
|
|
198
|
-
products: {
|
|
199
|
-
"ai-review": { enabled: true },
|
|
200
|
-
},
|
|
201
|
-
};
|
|
202
|
-
await fsp.writeFile(path.join(testDir, "kb.config.json"), JSON.stringify(workspaceConfig, null, 2));
|
|
203
|
-
// First call - should populate cache
|
|
204
|
-
const result1 = await getProductConfig({
|
|
205
|
-
cwd: testDir,
|
|
206
|
-
product: "aiReview",
|
|
207
|
-
}, null);
|
|
208
|
-
// Second call - should use cache
|
|
209
|
-
const result2 = await getProductConfig({
|
|
210
|
-
cwd: testDir,
|
|
211
|
-
product: "aiReview",
|
|
212
|
-
}, null);
|
|
213
|
-
expect(result1.config).toEqual(result2.config);
|
|
214
|
-
expect(result1.trace).toEqual(result2.trace);
|
|
215
|
-
});
|
|
216
|
-
it("should invalidate cache when config changes", async () => {
|
|
217
|
-
const workspaceConfig1 = {
|
|
218
|
-
schemaVersion: "1.0",
|
|
219
|
-
products: {
|
|
220
|
-
"ai-review": { enabled: true, maxFiles: 100 },
|
|
221
|
-
},
|
|
222
|
-
};
|
|
223
|
-
await fsp.writeFile(path.join(testDir, "kb.config.json"), JSON.stringify(workspaceConfig1, null, 2));
|
|
224
|
-
const result1 = await getProductConfig({
|
|
225
|
-
cwd: testDir,
|
|
226
|
-
product: "aiReview",
|
|
227
|
-
}, null);
|
|
228
|
-
// Update config
|
|
229
|
-
const workspaceConfig2 = {
|
|
230
|
-
schemaVersion: "1.0",
|
|
231
|
-
products: {
|
|
232
|
-
"ai-review": { enabled: true, maxFiles: 200 },
|
|
233
|
-
},
|
|
234
|
-
};
|
|
235
|
-
await fsp.writeFile(path.join(testDir, "kb.config.json"), JSON.stringify(workspaceConfig2, null, 2));
|
|
236
|
-
// Clear cache to simulate cache invalidation
|
|
237
|
-
clearCaches();
|
|
238
|
-
// Should get new config (after cache clear)
|
|
239
|
-
const result2 = await getProductConfig({
|
|
240
|
-
cwd: testDir,
|
|
241
|
-
product: "aiReview",
|
|
242
|
-
}, null);
|
|
243
|
-
const config1 = result1.config;
|
|
244
|
-
const config2 = result2.config;
|
|
245
|
-
// Verify that configs are different (cache invalidation works)
|
|
246
|
-
// Note: maxFiles may not be in runtime defaults, but should be in workspace config
|
|
247
|
-
// Both configs should have enabled: true, but maxFiles should differ
|
|
248
|
-
expect(config1.enabled).toBe(true);
|
|
249
|
-
expect(config2.enabled).toBe(true);
|
|
250
|
-
// If maxFiles is present in configs, verify it changed
|
|
251
|
-
if ("maxFiles" in config1 && "maxFiles" in config2) {
|
|
252
|
-
expect(config1.maxFiles).toBe(100);
|
|
253
|
-
expect(config2.maxFiles).toBe(200);
|
|
254
|
-
expect(config1.maxFiles).not.toBe(config2.maxFiles);
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
// If maxFiles is not preserved (not in runtime defaults),
|
|
258
|
-
// at least verify configs were reloaded (different objects)
|
|
259
|
-
expect(config1).not.toBe(config2);
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
describe("Trace Generation", () => {
|
|
264
|
-
it("should generate trace for all layers", async () => {
|
|
265
|
-
const workspaceConfig = {
|
|
266
|
-
schemaVersion: "1.0",
|
|
267
|
-
products: {
|
|
268
|
-
"ai-review": { enabled: true },
|
|
269
|
-
},
|
|
270
|
-
};
|
|
271
|
-
await fsp.writeFile(path.join(testDir, "kb.config.json"), JSON.stringify(workspaceConfig, null, 2));
|
|
272
|
-
const profileLayer = {
|
|
273
|
-
profileId: "default",
|
|
274
|
-
source: "profile:default",
|
|
275
|
-
products: {
|
|
276
|
-
"ai-review": { maxFiles: 200 },
|
|
277
|
-
},
|
|
278
|
-
};
|
|
279
|
-
const result = await getProductConfig({
|
|
280
|
-
cwd: testDir,
|
|
281
|
-
product: "aiReview",
|
|
282
|
-
profileLayer,
|
|
283
|
-
cli: { debug: true },
|
|
284
|
-
}, null);
|
|
285
|
-
expect(result.trace).toBeDefined();
|
|
286
|
-
expect(Array.isArray(result.trace)).toBe(true);
|
|
287
|
-
expect(result.trace.length).toBeGreaterThan(0);
|
|
288
|
-
// Trace contains merged steps - check that we have trace
|
|
289
|
-
expect(result.trace).toBeDefined();
|
|
290
|
-
expect(Array.isArray(result.trace)).toBe(true);
|
|
291
|
-
expect(result.trace.length).toBeGreaterThan(0);
|
|
292
|
-
// Verify trace structure
|
|
293
|
-
const layers = result.trace.map((step) => step.layer || step.label);
|
|
294
|
-
expect(layers.length).toBeGreaterThan(0);
|
|
295
|
-
// Should have at least runtime and CLI if profile/workspace are empty
|
|
296
|
-
expect(layers).toContain("runtime");
|
|
297
|
-
expect(layers).toContain("cli");
|
|
298
|
-
});
|
|
299
|
-
});
|
|
300
|
-
describe("Write Final Config", () => {
|
|
301
|
-
it("should write final config when writeFinal=true", async () => {
|
|
302
|
-
const workspaceConfig = {
|
|
303
|
-
schemaVersion: "1.0",
|
|
304
|
-
products: {
|
|
305
|
-
"ai-review": { enabled: true },
|
|
306
|
-
},
|
|
307
|
-
};
|
|
308
|
-
await fsp.writeFile(path.join(testDir, "kb.config.json"), JSON.stringify(workspaceConfig, null, 2));
|
|
309
|
-
await getProductConfig({
|
|
310
|
-
cwd: testDir,
|
|
311
|
-
product: "aiReview",
|
|
312
|
-
writeFinal: true,
|
|
313
|
-
}, null);
|
|
314
|
-
// Check that final config was written
|
|
315
|
-
const finalConfigPath = path.join(testDir, ".kb", "ai-review", "ai-review.config.json");
|
|
316
|
-
const finalConfigExists = await fsp
|
|
317
|
-
.access(finalConfigPath)
|
|
318
|
-
.then(() => true)
|
|
319
|
-
.catch(() => false);
|
|
320
|
-
expect(finalConfigExists).toBe(true);
|
|
321
|
-
if (finalConfigExists) {
|
|
322
|
-
const finalConfigContent = await fsp.readFile(finalConfigPath, "utf-8");
|
|
323
|
-
const finalConfig = JSON.parse(finalConfigContent);
|
|
324
|
-
// Final config structure: { $schema, schemaVersion, ...config }
|
|
325
|
-
expect(finalConfig).toBeDefined();
|
|
326
|
-
expect(finalConfig.$schema).toBe("https://schemas.kb-labs.dev/config.schema.json");
|
|
327
|
-
expect(finalConfig.schemaVersion).toBe("1.0");
|
|
328
|
-
// Config properties should be at root level (spread from merged config)
|
|
329
|
-
expect(finalConfig.enabled).toBeDefined(); // Should have config properties
|
|
330
|
-
}
|
|
331
|
-
});
|
|
332
|
-
});
|
|
333
|
-
});
|
|
334
|
-
//# sourceMappingURL=get-product-config-edge-cases.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-product-config-edge-cases.spec.js","sourceRoot":"","sources":["../../src/__tests__/get-product-config-edge-cases.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init-workspace.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/init-workspace.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module @kb-labs/core-config/__tests__/init-workspace
|
|
3
|
-
* Smoke tests for initWorkspaceConfig
|
|
4
|
-
*/
|
|
5
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
6
|
-
import { promises as fs } from "node:fs";
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
import { initWorkspaceConfig } from "../api/init-workspace";
|
|
9
|
-
import os from "node:os";
|
|
10
|
-
describe("initWorkspaceConfig", () => {
|
|
11
|
-
let tmpDir;
|
|
12
|
-
beforeEach(async () => {
|
|
13
|
-
tmpDir = path.join(os.tmpdir(), `kb-test-${Date.now()}-${Math.random()}`);
|
|
14
|
-
await fs.mkdir(tmpDir, { recursive: true });
|
|
15
|
-
});
|
|
16
|
-
afterEach(async () => {
|
|
17
|
-
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
18
|
-
});
|
|
19
|
-
it("creates new workspace config in YAML format", async () => {
|
|
20
|
-
const result = await initWorkspaceConfig({
|
|
21
|
-
cwd: tmpDir,
|
|
22
|
-
format: "yaml",
|
|
23
|
-
products: ["aiReview"],
|
|
24
|
-
});
|
|
25
|
-
expect(result.created).toHaveLength(1);
|
|
26
|
-
expect(result.created[0]).toMatch(/\.kb\/kb\.config\.yaml$/);
|
|
27
|
-
const configPath = path.join(tmpDir, ".kb", "kb.config.yaml");
|
|
28
|
-
const content = await fs.readFile(configPath, "utf-8");
|
|
29
|
-
expect(content).toContain('schemaVersion: "1.0"');
|
|
30
|
-
expect(content).toContain("aiReview");
|
|
31
|
-
});
|
|
32
|
-
it("creates new workspace config in JSON format", async () => {
|
|
33
|
-
const result = await initWorkspaceConfig({
|
|
34
|
-
cwd: tmpDir,
|
|
35
|
-
format: "json",
|
|
36
|
-
products: ["aiReview"],
|
|
37
|
-
});
|
|
38
|
-
expect(result.created).toHaveLength(1);
|
|
39
|
-
expect(result.created[0]).toMatch(/\.kb\/kb\.config\.json$/);
|
|
40
|
-
const configPath = path.join(tmpDir, ".kb", "kb.config.json");
|
|
41
|
-
const content = await fs.readFile(configPath, "utf-8");
|
|
42
|
-
const parsed = JSON.parse(content);
|
|
43
|
-
expect(parsed.schemaVersion).toBe("1.0");
|
|
44
|
-
expect(parsed.products).toHaveProperty("aiReview");
|
|
45
|
-
});
|
|
46
|
-
it("is idempotent - second run skips unchanged config", async () => {
|
|
47
|
-
// First run
|
|
48
|
-
await initWorkspaceConfig({
|
|
49
|
-
cwd: tmpDir,
|
|
50
|
-
format: "yaml",
|
|
51
|
-
products: ["aiReview"],
|
|
52
|
-
});
|
|
53
|
-
// Second run with same options
|
|
54
|
-
const result2 = await initWorkspaceConfig({
|
|
55
|
-
cwd: tmpDir,
|
|
56
|
-
format: "yaml",
|
|
57
|
-
products: ["aiReview"],
|
|
58
|
-
});
|
|
59
|
-
expect(result2.skipped).toHaveLength(1);
|
|
60
|
-
expect(result2.created).toHaveLength(0);
|
|
61
|
-
expect(result2.updated).toHaveLength(0);
|
|
62
|
-
});
|
|
63
|
-
it("detects conflicts without --force", async () => {
|
|
64
|
-
// Create initial config
|
|
65
|
-
const configPath = path.join(tmpDir, ".kb", "kb.config.yaml");
|
|
66
|
-
await fs.mkdir(path.dirname(configPath), { recursive: true });
|
|
67
|
-
await fs.writeFile(configPath, 'schemaVersion: "1.0"\nproducts:\n aiReview: {}\n', "utf-8");
|
|
68
|
-
// Try to overwrite with different content
|
|
69
|
-
const result = await initWorkspaceConfig({
|
|
70
|
-
cwd: tmpDir,
|
|
71
|
-
format: "yaml",
|
|
72
|
-
products: ["aiReview", "aiDocs"],
|
|
73
|
-
force: false,
|
|
74
|
-
});
|
|
75
|
-
const conflicts = result.actions.filter((a) => a.kind === "conflict");
|
|
76
|
-
expect(conflicts.length).toBeGreaterThan(0);
|
|
77
|
-
expect(result.warnings.length).toBeGreaterThan(0);
|
|
78
|
-
});
|
|
79
|
-
it("supports dry-run mode", async () => {
|
|
80
|
-
const result = await initWorkspaceConfig({
|
|
81
|
-
cwd: tmpDir,
|
|
82
|
-
format: "yaml",
|
|
83
|
-
products: ["aiReview"],
|
|
84
|
-
dryRun: true,
|
|
85
|
-
});
|
|
86
|
-
expect(result.actions.length).toBeGreaterThan(0);
|
|
87
|
-
// File should not actually be created
|
|
88
|
-
const configPath = path.join(tmpDir, ".kb", "kb.config.yaml");
|
|
89
|
-
await expect(fs.access(configPath)).rejects.toThrow();
|
|
90
|
-
});
|
|
91
|
-
it("warns when deprecated profiles option is provided", async () => {
|
|
92
|
-
const result = await initWorkspaceConfig({
|
|
93
|
-
cwd: tmpDir,
|
|
94
|
-
format: "yaml",
|
|
95
|
-
profiles: { default: "legacy" },
|
|
96
|
-
});
|
|
97
|
-
expect(result.warnings.length).toBeGreaterThan(0);
|
|
98
|
-
expect(result.warnings.some((w) => w.includes("profiles option is deprecated"))).toBe(true);
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
//# sourceMappingURL=init-workspace.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init-workspace.spec.js","sourceRoot":"","sources":["../../src/__tests__/init-workspace.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kb-error.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/kb-error.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|