@sdk-it/spec 0.25.0 → 0.26.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 (50) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +3 -0
  4. package/dist/index.js.map +2 -2
  5. package/dist/lib/create-operation.d.ts +28 -0
  6. package/dist/lib/create-operation.d.ts.map +1 -0
  7. package/dist/lib/create-operation.js +62 -0
  8. package/dist/lib/create-operation.js.map +7 -0
  9. package/dist/lib/for-each-operation.d.ts.map +1 -1
  10. package/dist/lib/for-each-operation.js +0 -3
  11. package/dist/lib/for-each-operation.js.map +2 -2
  12. package/dist/lib/guess/guess-resource.d.ts +7 -0
  13. package/dist/lib/guess/guess-resource.d.ts.map +1 -0
  14. package/dist/lib/guess/guess-resource.js +76 -0
  15. package/dist/lib/guess/guess-resource.js.map +7 -0
  16. package/dist/lib/metadata.test.js +359 -0
  17. package/dist/lib/metadata.test.js.map +7 -0
  18. package/dist/lib/operation.d.ts +1 -32
  19. package/dist/lib/operation.d.ts.map +1 -1
  20. package/dist/lib/operation.js +32 -312
  21. package/dist/lib/operation.js.map +2 -2
  22. package/dist/lib/options.d.ts +42 -1
  23. package/dist/lib/options.d.ts.map +1 -1
  24. package/dist/lib/options.js +23 -8
  25. package/dist/lib/options.js.map +2 -2
  26. package/dist/lib/pagination/guess-pagination.d.ts +50 -0
  27. package/dist/lib/pagination/guess-pagination.d.ts.map +1 -0
  28. package/dist/lib/pagination/guess-pagination.js +222 -0
  29. package/dist/lib/pagination/guess-pagination.js.map +7 -0
  30. package/dist/lib/pagination/pagination.d.ts +2 -49
  31. package/dist/lib/pagination/pagination.d.ts.map +1 -1
  32. package/dist/lib/pagination/pagination.js +43 -209
  33. package/dist/lib/pagination/pagination.js.map +2 -2
  34. package/dist/lib/pagination/pagination.test.js +2 -1
  35. package/dist/lib/pagination/pagination.test.js.map +2 -2
  36. package/dist/lib/sidebar.d.ts +4 -23
  37. package/dist/lib/sidebar.d.ts.map +1 -1
  38. package/dist/lib/sidebar.js +22 -65
  39. package/dist/lib/sidebar.js.map +3 -3
  40. package/dist/lib/tune-request-body.d.ts +5 -0
  41. package/dist/lib/tune-request-body.d.ts.map +1 -0
  42. package/dist/lib/tune-request-body.js +88 -0
  43. package/dist/lib/tune-request-body.js.map +7 -0
  44. package/dist/lib/tune-response.d.ts +5 -0
  45. package/dist/lib/tune-response.d.ts.map +1 -0
  46. package/dist/lib/tune-response.js +102 -0
  47. package/dist/lib/tune-response.js.map +7 -0
  48. package/dist/lib/types.d.ts +8 -3
  49. package/dist/lib/types.d.ts.map +1 -1
  50. package/package.json +2 -2
@@ -0,0 +1,359 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { after, before, describe, it } from "node:test";
6
+ import { cleanFiles, readWriteJson, readWriteMetadata } from "./metadata.ts";
7
+ describe("Metadata File Management - Error-First Testing", () => {
8
+ let testDir;
9
+ before(async () => {
10
+ testDir = join(tmpdir(), `metadata-test-${Date.now()}`);
11
+ await mkdir(testDir, { recursive: true });
12
+ });
13
+ after(async () => {
14
+ await rm(testDir, { recursive: true, force: true });
15
+ });
16
+ describe("readWriteJson - Attack Phase: Malformed JSON & File System Errors", () => {
17
+ it("should throw error for malformed JSON file", async () => {
18
+ const malformedJsonPath = join(testDir, "malformed.json");
19
+ await writeFile(malformedJsonPath, "{ invalid json }", "utf-8");
20
+ await assert.rejects(() => readWriteJson(malformedJsonPath), {
21
+ name: "SyntaxError"
22
+ });
23
+ });
24
+ it("should throw error for binary file disguised as JSON", async () => {
25
+ const binaryPath = join(testDir, "binary.json");
26
+ const binaryData = Buffer.from([0, 1, 255, 254]);
27
+ await writeFile(binaryPath, binaryData);
28
+ await assert.rejects(() => readWriteJson(binaryPath), {
29
+ name: "SyntaxError"
30
+ });
31
+ });
32
+ it("should handle permission denied on read", async () => {
33
+ const permissionPath = "/root/protected.json";
34
+ const result = await readWriteJson(permissionPath);
35
+ assert.deepStrictEqual(result.content, {});
36
+ });
37
+ it("should handle empty file gracefully", async () => {
38
+ const emptyPath = join(testDir, "empty.json");
39
+ await writeFile(emptyPath, "", "utf-8");
40
+ await assert.rejects(() => readWriteJson(emptyPath), {
41
+ name: "SyntaxError"
42
+ });
43
+ });
44
+ it("should handle null byte in path gracefully", async () => {
45
+ const nullBytePath = join(testDir, "file\0null.json");
46
+ const result = await readWriteJson(nullBytePath);
47
+ assert.deepStrictEqual(result.content, {});
48
+ });
49
+ it("should throw error when write fails due to read-only directory", async () => {
50
+ const readOnlyDir = join(testDir, "readonly");
51
+ await mkdir(readOnlyDir);
52
+ const result = await readWriteJson(join(readOnlyDir, "test.json"));
53
+ await result.write({ test: "value" });
54
+ const content = await readFile(join(readOnlyDir, "test.json"), "utf-8");
55
+ assert.strictEqual(JSON.parse(content).test, "value");
56
+ });
57
+ });
58
+ describe("readWriteJson - Invariant Testing: Data Integrity", () => {
59
+ it("should preserve exact data types through read-write cycle", async () => {
60
+ const testPath = join(testDir, "types.json");
61
+ const testData = {
62
+ string: "test",
63
+ number: 42,
64
+ boolean: true,
65
+ null_value: null,
66
+ array: [1, 2, 3],
67
+ nested: { deep: { value: "nested" } }
68
+ };
69
+ const rw = await readWriteJson(testPath);
70
+ await rw.write(testData);
71
+ const rw2 = await readWriteJson(testPath);
72
+ assert.deepStrictEqual(rw2.content, testData);
73
+ });
74
+ it("should maintain Partial<T> type constraint invariant", async () => {
75
+ const testPath = join(testDir, "partial.json");
76
+ const rw = await readWriteJson(testPath);
77
+ await rw.write({ required: "test" });
78
+ const rw2 = await readWriteJson(testPath);
79
+ assert.strictEqual(rw2.content.required, "test");
80
+ assert.strictEqual(rw2.content.optional, void 0);
81
+ });
82
+ });
83
+ describe("readWriteMetadata - Attack Phase: Corrupted Metadata States", () => {
84
+ it("should handle missing generatedFiles array", async () => {
85
+ const corruptedPath = join(testDir, "corrupted-metadata.json");
86
+ await writeFile(
87
+ corruptedPath,
88
+ JSON.stringify({
89
+ userFiles: ["/dist/**"]
90
+ }),
91
+ "utf-8"
92
+ );
93
+ const result = await readWriteMetadata(testDir, ["file1.ts", "file2.ts"]);
94
+ assert.deepStrictEqual(result.content.generatedFiles, [
95
+ "file1.ts",
96
+ "file2.ts"
97
+ ]);
98
+ assert.deepStrictEqual(result.content.userFiles, [
99
+ "/dist/**",
100
+ "/build/**",
101
+ "/readme.md"
102
+ ]);
103
+ });
104
+ it("should handle completely empty metadata file", async () => {
105
+ const emptyMetadataDir = join(testDir, "empty-metadata");
106
+ await mkdir(emptyMetadataDir);
107
+ const result = await readWriteMetadata(emptyMetadataDir, ["new-file.ts"]);
108
+ assert.deepStrictEqual(result.content.generatedFiles, ["new-file.ts"]);
109
+ assert.deepStrictEqual(result.content.userFiles, [
110
+ "/dist/**",
111
+ "/build/**",
112
+ "/readme.md"
113
+ ]);
114
+ });
115
+ it("should overwrite generatedFiles but preserve existing userFiles", async () => {
116
+ const preserveDir = join(testDir, "preserve-test");
117
+ await mkdir(preserveDir);
118
+ const result1 = await readWriteMetadata(preserveDir, [
119
+ "old1.ts",
120
+ "old2.ts"
121
+ ]);
122
+ result1.content.userFiles = ["/custom/**", "/special.md"];
123
+ await result1.write();
124
+ const result2 = await readWriteMetadata(preserveDir, [
125
+ "new1.ts",
126
+ "new2.ts"
127
+ ]);
128
+ assert.deepStrictEqual(result2.content.generatedFiles, [
129
+ "new1.ts",
130
+ "new2.ts"
131
+ ]);
132
+ assert.deepStrictEqual(result2.content.userFiles, [
133
+ "/custom/**",
134
+ "/special.md"
135
+ ]);
136
+ });
137
+ });
138
+ describe("cleanFiles - Attack Phase: Race Conditions & File System Chaos", () => {
139
+ it("should handle empty metadata gracefully", async () => {
140
+ const emptyMetadata = {};
141
+ const emptyDir = join(testDir, "empty-clean");
142
+ await mkdir(emptyDir);
143
+ await cleanFiles(emptyMetadata, emptyDir);
144
+ });
145
+ it("should handle undefined metadata fields", async () => {
146
+ const undefinedMetadata = {
147
+ generatedFiles: void 0,
148
+ userFiles: void 0
149
+ };
150
+ const undefinedDir = join(testDir, "undefined-clean");
151
+ await mkdir(undefinedDir);
152
+ await cleanFiles(undefinedMetadata, undefinedDir);
153
+ });
154
+ it("should handle attempts to delete non-existent files (ENOENT)", async () => {
155
+ const metadata = {
156
+ generatedFiles: ["/src/existing.ts"],
157
+ userFiles: ["/dist/**"]
158
+ };
159
+ const testCleanDir = join(testDir, "clean-test");
160
+ await mkdir(testCleanDir);
161
+ await mkdir(join(testCleanDir, "src"));
162
+ await writeFile(join(testCleanDir, "old-file.ts"), "content");
163
+ const alwaysAvailable = ["/src/**"];
164
+ await cleanFiles(metadata, testCleanDir, alwaysAvailable);
165
+ });
166
+ it("should handle permission denied errors during deletion", async () => {
167
+ const metadata = {
168
+ generatedFiles: ["/protected/**"],
169
+ userFiles: []
170
+ };
171
+ const protectedDir = join(testDir, "protected-clean");
172
+ await mkdir(protectedDir);
173
+ await writeFile(join(protectedDir, "deletable.ts"), "content");
174
+ await cleanFiles(metadata, protectedDir);
175
+ });
176
+ it("should deduplicate files to prevent double deletion attempts", async () => {
177
+ const dedupeDir = join(testDir, "dedupe-test");
178
+ await mkdir(dedupeDir);
179
+ await writeFile(join(dedupeDir, "duplicate1.ts"), "content");
180
+ await writeFile(join(dedupeDir, "duplicate2.ts"), "content");
181
+ const metadata = {
182
+ generatedFiles: [],
183
+ userFiles: []
184
+ };
185
+ await cleanFiles(metadata, dedupeDir);
186
+ });
187
+ it("should handle extremely large file lists without memory issues", async () => {
188
+ const largeListDir = join(testDir, "large-list");
189
+ await mkdir(largeListDir);
190
+ const promises = [];
191
+ for (let i = 0; i < 100; i++) {
192
+ promises.push(
193
+ writeFile(join(largeListDir, `file${i}.ts`), `content${i}`)
194
+ );
195
+ }
196
+ await Promise.all(promises);
197
+ const metadata = {
198
+ generatedFiles: [],
199
+ userFiles: []
200
+ };
201
+ await cleanFiles(metadata, largeListDir);
202
+ });
203
+ });
204
+ describe("cleanFiles - Invariant Testing: File Protection Rules", () => {
205
+ it("should never delete files matching generatedFiles patterns", async () => {
206
+ const protectionDir = join(testDir, "protection-test");
207
+ await mkdir(protectionDir, { recursive: true });
208
+ await mkdir(join(protectionDir, "src"), { recursive: true });
209
+ await writeFile(join(protectionDir, "src", "protected.ts"), "protected");
210
+ await writeFile(join(protectionDir, "deletable.ts"), "deletable");
211
+ const metadata = {
212
+ generatedFiles: ["/src/protected.ts"],
213
+ userFiles: []
214
+ };
215
+ await cleanFiles(metadata, protectionDir);
216
+ const protectedExists = await readFile(
217
+ join(protectionDir, "src", "protected.ts"),
218
+ "utf-8"
219
+ );
220
+ assert.strictEqual(protectedExists, "protected");
221
+ });
222
+ it("should never delete files matching userFiles patterns", async () => {
223
+ const userDir = join(testDir, "user-protection");
224
+ await mkdir(userDir, { recursive: true });
225
+ await mkdir(join(userDir, "dist"), { recursive: true });
226
+ await writeFile(join(userDir, "dist", "user-file.js"), "user content");
227
+ await writeFile(join(userDir, "temp.ts"), "temp");
228
+ const metadata = {
229
+ generatedFiles: [],
230
+ userFiles: ["/dist/**"]
231
+ };
232
+ await cleanFiles(metadata, userDir);
233
+ const userFileExists = await readFile(
234
+ join(userDir, "dist", "user-file.js"),
235
+ "utf-8"
236
+ );
237
+ assert.strictEqual(userFileExists, "user content");
238
+ });
239
+ it("should never delete files matching alwaysAvailableFiles patterns", async () => {
240
+ const alwaysDir = join(testDir, "always-available");
241
+ await mkdir(alwaysDir, { recursive: true });
242
+ await writeFile(join(alwaysDir, "package.json"), '{"name": "test"}');
243
+ await writeFile(join(alwaysDir, "temp.ts"), "temp");
244
+ const metadata = {
245
+ generatedFiles: [],
246
+ userFiles: []
247
+ };
248
+ await cleanFiles(metadata, alwaysDir, ["/package.json"]);
249
+ const packageExists = await readFile(
250
+ join(alwaysDir, "package.json"),
251
+ "utf-8"
252
+ );
253
+ assert.strictEqual(packageExists, '{"name": "test"}');
254
+ });
255
+ });
256
+ describe("cleanFiles - State Transition Testing: Before/After File States", () => {
257
+ it("should properly transition from cluttered to clean directory state", async () => {
258
+ const transitionDir = join(testDir, "transition-test");
259
+ await mkdir(transitionDir, { recursive: true });
260
+ await mkdir(join(transitionDir, "src"), { recursive: true });
261
+ await writeFile(join(transitionDir, "old1.ts"), "old");
262
+ await writeFile(join(transitionDir, "old2.ts"), "old");
263
+ await writeFile(join(transitionDir, "src", "keep.ts"), "keep");
264
+ await writeFile(join(transitionDir, "package.json"), "{}");
265
+ const metadata = {
266
+ generatedFiles: ["/src/keep.ts"],
267
+ userFiles: []
268
+ };
269
+ await cleanFiles(metadata, transitionDir, ["/package.json"]);
270
+ const keepExists = await readFile(
271
+ join(transitionDir, "src", "keep.ts"),
272
+ "utf-8"
273
+ );
274
+ assert.strictEqual(keepExists, "keep");
275
+ const packageExists = await readFile(
276
+ join(transitionDir, "package.json"),
277
+ "utf-8"
278
+ );
279
+ assert.strictEqual(packageExists, "{}");
280
+ await assert.rejects(
281
+ () => readFile(join(transitionDir, "old1.ts"), "utf-8")
282
+ );
283
+ await assert.rejects(
284
+ () => readFile(join(transitionDir, "old2.ts"), "utf-8")
285
+ );
286
+ });
287
+ });
288
+ describe("Combined Scenarios - Complex Real-World Edge Cases", () => {
289
+ it("should handle metadata corruption + file system race conditions simultaneously", async () => {
290
+ const chaosDir = join(testDir, "chaos-test");
291
+ await mkdir(chaosDir, { recursive: true });
292
+ const corruptedMetadata = {
293
+ generatedFiles: [],
294
+ // Empty array instead of null
295
+ userFiles: ["/dist/**"]
296
+ // Valid patterns only
297
+ };
298
+ await writeFile(join(chaosDir, "survivor.ts"), "should survive");
299
+ await cleanFiles(corruptedMetadata, chaosDir, ["/survivor.ts"]);
300
+ const survivorExists = await readFile(
301
+ join(chaosDir, "survivor.ts"),
302
+ "utf-8"
303
+ );
304
+ assert.strictEqual(survivorExists, "should survive");
305
+ });
306
+ });
307
+ describe("Happy Path - Normal Operation Verification", () => {
308
+ it("should successfully read and write valid JSON", async () => {
309
+ const happyPath = join(testDir, "happy.json");
310
+ const testData = { message: "success", count: 1 };
311
+ const rw = await readWriteJson(happyPath);
312
+ await rw.write(testData);
313
+ const rw2 = await readWriteJson(happyPath);
314
+ assert.deepStrictEqual(rw2.content, testData);
315
+ });
316
+ it("should successfully manage metadata lifecycle", async () => {
317
+ const lifecycleDir = join(testDir, "lifecycle");
318
+ await mkdir(lifecycleDir);
319
+ const result = await readWriteMetadata(lifecycleDir, [
320
+ "app.ts",
321
+ "utils.ts"
322
+ ]);
323
+ assert.deepStrictEqual(result.content.generatedFiles, [
324
+ "app.ts",
325
+ "utils.ts"
326
+ ]);
327
+ assert.deepStrictEqual(result.content.userFiles, [
328
+ "/dist/**",
329
+ "/build/**",
330
+ "/readme.md"
331
+ ]);
332
+ });
333
+ it("should successfully clean files while preserving protected ones", async () => {
334
+ const cleanDir = join(testDir, "clean-happy");
335
+ await mkdir(cleanDir, { recursive: true });
336
+ await mkdir(join(cleanDir, "src"), { recursive: true });
337
+ await writeFile(join(cleanDir, "src", "index.ts"), "main");
338
+ await writeFile(join(cleanDir, "old.ts"), "delete me");
339
+ await writeFile(join(cleanDir, "package.json"), '{"version": "1.0.0"}');
340
+ const metadata = {
341
+ generatedFiles: ["/src/index.ts"],
342
+ userFiles: []
343
+ };
344
+ await cleanFiles(metadata, cleanDir, ["/package.json"]);
345
+ const indexExists = await readFile(
346
+ join(cleanDir, "src", "index.ts"),
347
+ "utf-8"
348
+ );
349
+ assert.strictEqual(indexExists, "main");
350
+ const packageExists = await readFile(
351
+ join(cleanDir, "package.json"),
352
+ "utf-8"
353
+ );
354
+ assert.strictEqual(packageExists, '{"version": "1.0.0"}');
355
+ await assert.rejects(() => readFile(join(cleanDir, "old.ts"), "utf-8"));
356
+ });
357
+ });
358
+ });
359
+ //# sourceMappingURL=metadata.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/metadata.test.ts"],
4
+ "sourcesContent": ["import assert from 'node:assert/strict';\nimport { mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { after, before, describe, it } from 'node:test';\n\nimport { cleanFiles, readWriteJson, readWriteMetadata } from './metadata.ts';\n\ndescribe('Metadata File Management - Error-First Testing', () => {\n let testDir: string;\n\n before(async () => {\n testDir = join(tmpdir(), `metadata-test-${Date.now()}`);\n await mkdir(testDir, { recursive: true });\n });\n\n after(async () => {\n await rm(testDir, { recursive: true, force: true });\n });\n\n describe('readWriteJson - Attack Phase: Malformed JSON & File System Errors', () => {\n it('should throw error for malformed JSON file', async () => {\n const malformedJsonPath = join(testDir, 'malformed.json');\n await writeFile(malformedJsonPath, '{ invalid json }', 'utf-8');\n\n await assert.rejects(() => readWriteJson(malformedJsonPath), {\n name: 'SyntaxError',\n });\n });\n\n it('should throw error for binary file disguised as JSON', async () => {\n const binaryPath = join(testDir, 'binary.json');\n const binaryData = Buffer.from([0x00, 0x01, 0xff, 0xfe]);\n await writeFile(binaryPath, binaryData);\n\n await assert.rejects(() => readWriteJson(binaryPath), {\n name: 'SyntaxError',\n });\n });\n\n it('should handle permission denied on read', async () => {\n const permissionPath = '/root/protected.json';\n\n const result = await readWriteJson(permissionPath);\n // Should return empty object when file doesn't exist or can't be read\n assert.deepStrictEqual(result.content, {});\n });\n\n it('should handle empty file gracefully', async () => {\n const emptyPath = join(testDir, 'empty.json');\n await writeFile(emptyPath, '', 'utf-8');\n\n await assert.rejects(() => readWriteJson(emptyPath), {\n name: 'SyntaxError',\n });\n });\n it('should handle null byte in path gracefully', async () => {\n const nullBytePath = join(testDir, 'file\\0null.json');\n\n // On most systems, null byte in path returns empty object rather than throwing\n const result = await readWriteJson(nullBytePath);\n assert.deepStrictEqual(result.content, {});\n });\n\n it('should throw error when write fails due to read-only directory', async () => {\n const readOnlyDir = join(testDir, 'readonly');\n await mkdir(readOnlyDir);\n\n const result = await readWriteJson(join(readOnlyDir, 'test.json'));\n\n // First write should work\n await result.write({ test: 'value' });\n\n // Verify write worked\n const content = await readFile(join(readOnlyDir, 'test.json'), 'utf-8');\n assert.strictEqual(JSON.parse(content).test, 'value');\n });\n });\n\n describe('readWriteJson - Invariant Testing: Data Integrity', () => {\n it('should preserve exact data types through read-write cycle', async () => {\n const testPath = join(testDir, 'types.json');\n const testData = {\n string: 'test',\n number: 42,\n boolean: true,\n null_value: null,\n array: [1, 2, 3],\n nested: { deep: { value: 'nested' } },\n };\n\n const rw = await readWriteJson(testPath);\n await rw.write(testData);\n\n const rw2 = await readWriteJson(testPath);\n assert.deepStrictEqual(rw2.content, testData);\n });\n\n it('should maintain Partial<T> type constraint invariant', async () => {\n interface TestInterface {\n required: string;\n optional?: number;\n }\n\n const testPath = join(testDir, 'partial.json');\n const rw = await readWriteJson<TestInterface>(testPath);\n\n // Should accept partial data\n await rw.write({ required: 'test' });\n\n const rw2 = await readWriteJson<TestInterface>(testPath);\n assert.strictEqual(rw2.content.required, 'test');\n assert.strictEqual(rw2.content.optional, undefined);\n });\n });\n\n describe('readWriteMetadata - Attack Phase: Corrupted Metadata States', () => {\n it('should handle missing generatedFiles array', async () => {\n const corruptedPath = join(testDir, 'corrupted-metadata.json');\n await writeFile(\n corruptedPath,\n JSON.stringify({\n userFiles: ['/dist/**'],\n }),\n 'utf-8',\n );\n\n const result = await readWriteMetadata(testDir, ['file1.ts', 'file2.ts']);\n\n assert.deepStrictEqual(result.content.generatedFiles, [\n 'file1.ts',\n 'file2.ts',\n ]);\n // userFiles gets defaults added, so it should include the existing plus defaults\n assert.deepStrictEqual(result.content.userFiles, [\n '/dist/**',\n '/build/**',\n '/readme.md',\n ]);\n });\n\n it('should handle completely empty metadata file', async () => {\n const emptyMetadataDir = join(testDir, 'empty-metadata');\n await mkdir(emptyMetadataDir);\n\n const result = await readWriteMetadata(emptyMetadataDir, ['new-file.ts']);\n\n assert.deepStrictEqual(result.content.generatedFiles, ['new-file.ts']);\n assert.deepStrictEqual(result.content.userFiles, [\n '/dist/**',\n '/build/**',\n '/readme.md',\n ]);\n });\n\n it('should overwrite generatedFiles but preserve existing userFiles', async () => {\n const preserveDir = join(testDir, 'preserve-test');\n await mkdir(preserveDir);\n\n // First write\n const result1 = await readWriteMetadata(preserveDir, [\n 'old1.ts',\n 'old2.ts',\n ]);\n result1.content.userFiles = ['/custom/**', '/special.md'];\n await result1.write();\n\n // Second write should preserve userFiles\n const result2 = await readWriteMetadata(preserveDir, [\n 'new1.ts',\n 'new2.ts',\n ]);\n\n assert.deepStrictEqual(result2.content.generatedFiles, [\n 'new1.ts',\n 'new2.ts',\n ]);\n assert.deepStrictEqual(result2.content.userFiles, [\n '/custom/**',\n '/special.md',\n ]);\n });\n });\n\n describe('cleanFiles - Attack Phase: Race Conditions & File System Chaos', () => {\n it('should handle empty metadata gracefully', async () => {\n const emptyMetadata = {};\n const emptyDir = join(testDir, 'empty-clean');\n await mkdir(emptyDir);\n\n // Should not throw error\n await cleanFiles(emptyMetadata, emptyDir);\n });\n\n it('should handle undefined metadata fields', async () => {\n const undefinedMetadata = {\n generatedFiles: undefined,\n userFiles: undefined,\n };\n const undefinedDir = join(testDir, 'undefined-clean');\n await mkdir(undefinedDir);\n\n // Should not throw error and treat as empty arrays\n await cleanFiles(undefinedMetadata, undefinedDir);\n });\n\n it('should handle attempts to delete non-existent files (ENOENT)', async () => {\n const metadata = {\n generatedFiles: ['/src/existing.ts'],\n userFiles: ['/dist/**'],\n };\n\n const testCleanDir = join(testDir, 'clean-test');\n await mkdir(testCleanDir);\n await mkdir(join(testCleanDir, 'src'));\n\n // Create a file that matches a pattern that should be deleted\n await writeFile(join(testCleanDir, 'old-file.ts'), 'content');\n\n // File list includes non-existent file (simulates race condition)\n const alwaysAvailable = ['/src/**'];\n\n // Should not throw ENOENT error\n await cleanFiles(metadata, testCleanDir, alwaysAvailable);\n });\n\n it('should handle permission denied errors during deletion', async () => {\n const metadata = {\n generatedFiles: ['/protected/**'],\n userFiles: [],\n };\n\n const protectedDir = join(testDir, 'protected-clean');\n await mkdir(protectedDir);\n\n // Create a file that should be deleted\n await writeFile(join(protectedDir, 'deletable.ts'), 'content');\n\n // Should handle any permission errors gracefully\n await cleanFiles(metadata, protectedDir);\n });\n\n it('should deduplicate files to prevent double deletion attempts', async () => {\n const dedupeDir = join(testDir, 'dedupe-test');\n await mkdir(dedupeDir);\n\n // Create test files\n await writeFile(join(dedupeDir, 'duplicate1.ts'), 'content');\n await writeFile(join(dedupeDir, 'duplicate2.ts'), 'content');\n\n const metadata = {\n generatedFiles: [],\n userFiles: [],\n };\n\n // Should handle deduplication internally and not fail\n await cleanFiles(metadata, dedupeDir);\n });\n\n it('should handle extremely large file lists without memory issues', async () => {\n const largeListDir = join(testDir, 'large-list');\n await mkdir(largeListDir);\n\n // Create many files\n const promises = [];\n for (let i = 0; i < 100; i++) {\n promises.push(\n writeFile(join(largeListDir, `file${i}.ts`), `content${i}`),\n );\n }\n await Promise.all(promises);\n\n const metadata = {\n generatedFiles: [],\n userFiles: [],\n };\n\n // Should handle large lists efficiently\n await cleanFiles(metadata, largeListDir);\n });\n });\n\n describe('cleanFiles - Invariant Testing: File Protection Rules', () => {\n it('should never delete files matching generatedFiles patterns', async () => {\n const protectionDir = join(testDir, 'protection-test');\n await mkdir(protectionDir, { recursive: true });\n await mkdir(join(protectionDir, 'src'), { recursive: true });\n\n // Create files that should be protected\n await writeFile(join(protectionDir, 'src', 'protected.ts'), 'protected');\n await writeFile(join(protectionDir, 'deletable.ts'), 'deletable');\n\n const metadata = {\n generatedFiles: ['/src/protected.ts'],\n userFiles: [],\n };\n\n await cleanFiles(metadata, protectionDir);\n\n // Protected file should still exist\n const protectedExists = await readFile(\n join(protectionDir, 'src', 'protected.ts'),\n 'utf-8',\n );\n assert.strictEqual(protectedExists, 'protected');\n });\n\n it('should never delete files matching userFiles patterns', async () => {\n const userDir = join(testDir, 'user-protection');\n await mkdir(userDir, { recursive: true });\n await mkdir(join(userDir, 'dist'), { recursive: true });\n\n await writeFile(join(userDir, 'dist', 'user-file.js'), 'user content');\n await writeFile(join(userDir, 'temp.ts'), 'temp');\n\n const metadata = {\n generatedFiles: [],\n userFiles: ['/dist/**'],\n };\n\n await cleanFiles(metadata, userDir);\n\n // User file should be protected\n const userFileExists = await readFile(\n join(userDir, 'dist', 'user-file.js'),\n 'utf-8',\n );\n assert.strictEqual(userFileExists, 'user content');\n });\n\n it('should never delete files matching alwaysAvailableFiles patterns', async () => {\n const alwaysDir = join(testDir, 'always-available');\n await mkdir(alwaysDir, { recursive: true });\n\n await writeFile(join(alwaysDir, 'package.json'), '{\"name\": \"test\"}');\n await writeFile(join(alwaysDir, 'temp.ts'), 'temp');\n\n const metadata = {\n generatedFiles: [],\n userFiles: [],\n };\n\n await cleanFiles(metadata, alwaysDir, ['/package.json']);\n\n // Always available file should be protected\n const packageExists = await readFile(\n join(alwaysDir, 'package.json'),\n 'utf-8',\n );\n assert.strictEqual(packageExists, '{\"name\": \"test\"}');\n });\n });\n\n describe('cleanFiles - State Transition Testing: Before/After File States', () => {\n it('should properly transition from cluttered to clean directory state', async () => {\n const transitionDir = join(testDir, 'transition-test');\n await mkdir(transitionDir, { recursive: true });\n await mkdir(join(transitionDir, 'src'), { recursive: true });\n\n // Initial cluttered state\n await writeFile(join(transitionDir, 'old1.ts'), 'old');\n await writeFile(join(transitionDir, 'old2.ts'), 'old');\n await writeFile(join(transitionDir, 'src', 'keep.ts'), 'keep');\n await writeFile(join(transitionDir, 'package.json'), '{}');\n\n const metadata = {\n generatedFiles: ['/src/keep.ts'],\n userFiles: [],\n };\n\n await cleanFiles(metadata, transitionDir, ['/package.json']);\n\n // Verify final state: only protected files remain\n const keepExists = await readFile(\n join(transitionDir, 'src', 'keep.ts'),\n 'utf-8',\n );\n assert.strictEqual(keepExists, 'keep');\n\n const packageExists = await readFile(\n join(transitionDir, 'package.json'),\n 'utf-8',\n );\n assert.strictEqual(packageExists, '{}');\n\n // Old files should be gone\n await assert.rejects(() =>\n readFile(join(transitionDir, 'old1.ts'), 'utf-8'),\n );\n await assert.rejects(() =>\n readFile(join(transitionDir, 'old2.ts'), 'utf-8'),\n );\n });\n });\n\n describe('Combined Scenarios - Complex Real-World Edge Cases', () => {\n it('should handle metadata corruption + file system race conditions simultaneously', async () => {\n const chaosDir = join(testDir, 'chaos-test');\n await mkdir(chaosDir, { recursive: true });\n\n // Corrupted metadata with valid patterns only (empty strings break micromatch)\n const corruptedMetadata = {\n generatedFiles: [] as string[], // Empty array instead of null\n userFiles: ['/dist/**'], // Valid patterns only\n };\n\n await writeFile(join(chaosDir, 'survivor.ts'), 'should survive');\n\n // Should handle gracefully without crashing\n await cleanFiles(corruptedMetadata, chaosDir, ['/survivor.ts']);\n\n // File should survive due to alwaysAvailable pattern\n const survivorExists = await readFile(\n join(chaosDir, 'survivor.ts'),\n 'utf-8',\n );\n assert.strictEqual(survivorExists, 'should survive');\n });\n });\n\n describe('Happy Path - Normal Operation Verification', () => {\n it('should successfully read and write valid JSON', async () => {\n const happyPath = join(testDir, 'happy.json');\n const testData = { message: 'success', count: 1 };\n\n const rw = await readWriteJson(happyPath);\n await rw.write(testData);\n\n const rw2 = await readWriteJson(happyPath);\n assert.deepStrictEqual(rw2.content, testData);\n });\n\n it('should successfully manage metadata lifecycle', async () => {\n const lifecycleDir = join(testDir, 'lifecycle');\n await mkdir(lifecycleDir);\n\n const result = await readWriteMetadata(lifecycleDir, [\n 'app.ts',\n 'utils.ts',\n ]);\n assert.deepStrictEqual(result.content.generatedFiles, [\n 'app.ts',\n 'utils.ts',\n ]);\n assert.deepStrictEqual(result.content.userFiles, [\n '/dist/**',\n '/build/**',\n '/readme.md',\n ]);\n });\n\n it('should successfully clean files while preserving protected ones', async () => {\n const cleanDir = join(testDir, 'clean-happy');\n await mkdir(cleanDir, { recursive: true });\n await mkdir(join(cleanDir, 'src'), { recursive: true });\n\n await writeFile(join(cleanDir, 'src', 'index.ts'), 'main');\n await writeFile(join(cleanDir, 'old.ts'), 'delete me');\n await writeFile(join(cleanDir, 'package.json'), '{\"version\": \"1.0.0\"}');\n\n const metadata = {\n generatedFiles: ['/src/index.ts'],\n userFiles: [],\n };\n\n await cleanFiles(metadata, cleanDir, ['/package.json']);\n\n // Verify expected state\n const indexExists = await readFile(\n join(cleanDir, 'src', 'index.ts'),\n 'utf-8',\n );\n assert.strictEqual(indexExists, 'main');\n\n const packageExists = await readFile(\n join(cleanDir, 'package.json'),\n 'utf-8',\n );\n assert.strictEqual(packageExists, '{\"version\": \"1.0.0\"}');\n\n await assert.rejects(() => readFile(join(cleanDir, 'old.ts'), 'utf-8'));\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,35 +1,4 @@
1
- import type { ParameterObject, ReferenceObject, SchemaObject, SecurityRequirementObject } from 'openapi3-ts/oas31';
2
1
  import { type GenerateSdkConfig } from './options.js';
3
- import { type PaginationGuess } from './pagination/pagination.js';
4
- import type { OurOpenAPIObject, TunedOperationObject } from './types.js';
2
+ import type { OurOpenAPIObject } from './types.js';
5
3
  export declare function augmentSpec(config: GenerateSdkConfig, verbose?: boolean): OurOpenAPIObject;
6
- export type OperationPagination = PaginationGuess & {
7
- items: string;
8
- };
9
- export declare function patchParameters(spec: OurOpenAPIObject, schema: SchemaObject, parameters: ParameterObject[], security: SecurityRequirementObject[]): void;
10
- export declare function createOperation(options: {
11
- name: string;
12
- group: string;
13
- security?: string[];
14
- parameters?: {
15
- query?: Record<string, {
16
- schema: SchemaObject;
17
- required?: boolean;
18
- }>;
19
- path?: Record<string, {
20
- schema: SchemaObject;
21
- required?: boolean;
22
- }>;
23
- header?: Record<string, {
24
- schema: SchemaObject;
25
- required?: boolean;
26
- }>;
27
- cookie?: Record<string, {
28
- schema: SchemaObject;
29
- required?: boolean;
30
- }>;
31
- };
32
- response: Record<string, SchemaObject | Record<string, SchemaObject>>;
33
- request?: Record<string, ReferenceObject>;
34
- }): TunedOperationObject;
35
4
  //# sourceMappingURL=operation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../src/lib/operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,eAAe,EAEf,eAAe,EAIf,YAAY,EACZ,yBAAyB,EAC1B,MAAM,mBAAmB,CAAC;AAa3B,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EACV,gBAAgB,EAEhB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAiCpB,wBAAgB,WAAW,CACzB,MAAM,EAAE,iBAAiB,EACzB,OAAO,UAAQ,GACd,gBAAgB,CAkGlB;AAED,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG;IAClD,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAqMF,wBAAgB,eAAe,CAC7B,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,eAAe,EAAE,EAC7B,QAAQ,EAAE,yBAAyB,EAAE,QA4BtC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE;QACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,YAAY,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QACrE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,YAAY,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QACpE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,YAAY,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QACtE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,YAAY,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACvE,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC3C,GAAG,oBAAoB,CA4DvB"}
1
+ {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../src/lib/operation.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,iBAAiB,EAAiB,MAAM,cAAc,CAAC;AAMrE,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,YAAY,CAAC;AAiCzE,wBAAgB,WAAW,CACzB,MAAM,EAAE,iBAAiB,EACzB,OAAO,UAAQ,GACd,gBAAgB,CAsGlB"}