sequant 1.5.0 → 1.5.2

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 (157) hide show
  1. package/dist/bin/cli.d.ts +0 -1
  2. package/dist/bin/cli.js +0 -1
  3. package/dist/src/commands/doctor.d.ts +0 -1
  4. package/dist/src/commands/doctor.js +0 -1
  5. package/dist/src/commands/init.d.ts +0 -1
  6. package/dist/src/commands/init.js +0 -1
  7. package/dist/src/commands/logs.d.ts +0 -1
  8. package/dist/src/commands/logs.js +0 -1
  9. package/dist/src/commands/run.d.ts +0 -1
  10. package/dist/src/commands/run.js +0 -1
  11. package/dist/src/commands/stats.d.ts +0 -1
  12. package/dist/src/commands/stats.js +0 -1
  13. package/dist/src/commands/status.d.ts +0 -1
  14. package/dist/src/commands/status.js +0 -1
  15. package/dist/src/commands/update.d.ts +0 -1
  16. package/dist/src/commands/update.js +0 -1
  17. package/dist/src/index.d.ts +0 -1
  18. package/dist/src/index.js +0 -1
  19. package/dist/src/lib/config.d.ts +0 -1
  20. package/dist/src/lib/config.js +0 -1
  21. package/dist/src/lib/fs.d.ts +0 -1
  22. package/dist/src/lib/fs.js +0 -1
  23. package/dist/src/lib/manifest.d.ts +0 -1
  24. package/dist/src/lib/manifest.js +0 -1
  25. package/dist/src/lib/settings.d.ts +0 -1
  26. package/dist/src/lib/settings.js +0 -1
  27. package/dist/src/lib/shutdown.d.ts +0 -1
  28. package/dist/src/lib/shutdown.js +0 -1
  29. package/dist/src/lib/stacks.d.ts +0 -1
  30. package/dist/src/lib/stacks.js +0 -1
  31. package/dist/src/lib/system.d.ts +0 -1
  32. package/dist/src/lib/system.js +0 -1
  33. package/dist/src/lib/templates.d.ts +0 -1
  34. package/dist/src/lib/templates.js +0 -1
  35. package/dist/src/lib/tty.d.ts +0 -1
  36. package/dist/src/lib/tty.js +0 -1
  37. package/dist/src/lib/wizard.d.ts +0 -1
  38. package/dist/src/lib/wizard.js +0 -1
  39. package/dist/src/lib/workflow/log-rotation.d.ts +0 -1
  40. package/dist/src/lib/workflow/log-rotation.js +0 -1
  41. package/dist/src/lib/workflow/log-writer.d.ts +0 -1
  42. package/dist/src/lib/workflow/log-writer.js +0 -1
  43. package/dist/src/lib/workflow/run-log-schema.d.ts +4 -5
  44. package/dist/src/lib/workflow/run-log-schema.js +0 -1
  45. package/dist/src/lib/workflow/types.d.ts +0 -1
  46. package/dist/src/lib/workflow/types.js +0 -1
  47. package/package.json +2 -2
  48. package/dist/bin/cli.d.ts.map +0 -1
  49. package/dist/bin/cli.js.map +0 -1
  50. package/dist/src/commands/doctor.d.ts.map +0 -1
  51. package/dist/src/commands/doctor.integration.test.d.ts +0 -10
  52. package/dist/src/commands/doctor.integration.test.d.ts.map +0 -1
  53. package/dist/src/commands/doctor.integration.test.js +0 -71
  54. package/dist/src/commands/doctor.integration.test.js.map +0 -1
  55. package/dist/src/commands/doctor.js.map +0 -1
  56. package/dist/src/commands/doctor.test.d.ts +0 -2
  57. package/dist/src/commands/doctor.test.d.ts.map +0 -1
  58. package/dist/src/commands/doctor.test.js +0 -285
  59. package/dist/src/commands/doctor.test.js.map +0 -1
  60. package/dist/src/commands/init.d.ts.map +0 -1
  61. package/dist/src/commands/init.js.map +0 -1
  62. package/dist/src/commands/init.test.d.ts +0 -2
  63. package/dist/src/commands/init.test.d.ts.map +0 -1
  64. package/dist/src/commands/init.test.js +0 -313
  65. package/dist/src/commands/init.test.js.map +0 -1
  66. package/dist/src/commands/logs.d.ts.map +0 -1
  67. package/dist/src/commands/logs.js.map +0 -1
  68. package/dist/src/commands/run.d.ts.map +0 -1
  69. package/dist/src/commands/run.js.map +0 -1
  70. package/dist/src/commands/run.test.d.ts +0 -2
  71. package/dist/src/commands/run.test.d.ts.map +0 -1
  72. package/dist/src/commands/run.test.js +0 -320
  73. package/dist/src/commands/run.test.js.map +0 -1
  74. package/dist/src/commands/stats.d.ts.map +0 -1
  75. package/dist/src/commands/stats.js.map +0 -1
  76. package/dist/src/commands/stats.test.d.ts +0 -7
  77. package/dist/src/commands/stats.test.d.ts.map +0 -1
  78. package/dist/src/commands/stats.test.js +0 -218
  79. package/dist/src/commands/stats.test.js.map +0 -1
  80. package/dist/src/commands/status.d.ts.map +0 -1
  81. package/dist/src/commands/status.js.map +0 -1
  82. package/dist/src/commands/update.d.ts.map +0 -1
  83. package/dist/src/commands/update.js.map +0 -1
  84. package/dist/src/index.d.ts.map +0 -1
  85. package/dist/src/index.js.map +0 -1
  86. package/dist/src/lib/config.d.ts.map +0 -1
  87. package/dist/src/lib/config.js.map +0 -1
  88. package/dist/src/lib/fs.d.ts.map +0 -1
  89. package/dist/src/lib/fs.js.map +0 -1
  90. package/dist/src/lib/manifest.d.ts.map +0 -1
  91. package/dist/src/lib/manifest.js.map +0 -1
  92. package/dist/src/lib/settings.d.ts.map +0 -1
  93. package/dist/src/lib/settings.js.map +0 -1
  94. package/dist/src/lib/shutdown.d.ts.map +0 -1
  95. package/dist/src/lib/shutdown.js.map +0 -1
  96. package/dist/src/lib/shutdown.test.d.ts +0 -5
  97. package/dist/src/lib/shutdown.test.d.ts.map +0 -1
  98. package/dist/src/lib/shutdown.test.js +0 -216
  99. package/dist/src/lib/shutdown.test.js.map +0 -1
  100. package/dist/src/lib/stacks.d.ts.map +0 -1
  101. package/dist/src/lib/stacks.js.map +0 -1
  102. package/dist/src/lib/stacks.test.d.ts +0 -2
  103. package/dist/src/lib/stacks.test.d.ts.map +0 -1
  104. package/dist/src/lib/stacks.test.js +0 -487
  105. package/dist/src/lib/stacks.test.js.map +0 -1
  106. package/dist/src/lib/system.d.ts.map +0 -1
  107. package/dist/src/lib/system.js.map +0 -1
  108. package/dist/src/lib/system.test.d.ts +0 -2
  109. package/dist/src/lib/system.test.d.ts.map +0 -1
  110. package/dist/src/lib/system.test.js +0 -107
  111. package/dist/src/lib/system.test.js.map +0 -1
  112. package/dist/src/lib/templates.d.ts.map +0 -1
  113. package/dist/src/lib/templates.js.map +0 -1
  114. package/dist/src/lib/tty.d.ts.map +0 -1
  115. package/dist/src/lib/tty.js.map +0 -1
  116. package/dist/src/lib/tty.test.d.ts +0 -2
  117. package/dist/src/lib/tty.test.d.ts.map +0 -1
  118. package/dist/src/lib/tty.test.js +0 -269
  119. package/dist/src/lib/tty.test.js.map +0 -1
  120. package/dist/src/lib/wizard.d.ts.map +0 -1
  121. package/dist/src/lib/wizard.js.map +0 -1
  122. package/dist/src/lib/wizard.test.d.ts +0 -2
  123. package/dist/src/lib/wizard.test.d.ts.map +0 -1
  124. package/dist/src/lib/wizard.test.js +0 -268
  125. package/dist/src/lib/wizard.test.js.map +0 -1
  126. package/dist/src/lib/workflow/cli-args.d.ts +0 -138
  127. package/dist/src/lib/workflow/cli-args.d.ts.map +0 -1
  128. package/dist/src/lib/workflow/cli-args.js +0 -210
  129. package/dist/src/lib/workflow/cli-args.js.map +0 -1
  130. package/dist/src/lib/workflow/execute-issues.d.ts +0 -42
  131. package/dist/src/lib/workflow/execute-issues.d.ts.map +0 -1
  132. package/dist/src/lib/workflow/execute-issues.js +0 -463
  133. package/dist/src/lib/workflow/execute-issues.js.map +0 -1
  134. package/dist/src/lib/workflow/log-rotation.d.ts.map +0 -1
  135. package/dist/src/lib/workflow/log-rotation.js.map +0 -1
  136. package/dist/src/lib/workflow/log-rotation.test.d.ts +0 -7
  137. package/dist/src/lib/workflow/log-rotation.test.d.ts.map +0 -1
  138. package/dist/src/lib/workflow/log-rotation.test.js +0 -248
  139. package/dist/src/lib/workflow/log-rotation.test.js.map +0 -1
  140. package/dist/src/lib/workflow/log-writer.d.ts.map +0 -1
  141. package/dist/src/lib/workflow/log-writer.js.map +0 -1
  142. package/dist/src/lib/workflow/log-writer.test.d.ts +0 -7
  143. package/dist/src/lib/workflow/log-writer.test.d.ts.map +0 -1
  144. package/dist/src/lib/workflow/log-writer.test.js +0 -454
  145. package/dist/src/lib/workflow/log-writer.test.js.map +0 -1
  146. package/dist/src/lib/workflow/logger.d.ts +0 -168
  147. package/dist/src/lib/workflow/logger.d.ts.map +0 -1
  148. package/dist/src/lib/workflow/logger.js +0 -249
  149. package/dist/src/lib/workflow/logger.js.map +0 -1
  150. package/dist/src/lib/workflow/run-log-schema.d.ts.map +0 -1
  151. package/dist/src/lib/workflow/run-log-schema.js.map +0 -1
  152. package/dist/src/lib/workflow/run-log-schema.test.d.ts +0 -2
  153. package/dist/src/lib/workflow/run-log-schema.test.d.ts.map +0 -1
  154. package/dist/src/lib/workflow/run-log-schema.test.js +0 -456
  155. package/dist/src/lib/workflow/run-log-schema.test.js.map +0 -1
  156. package/dist/src/lib/workflow/types.d.ts.map +0 -1
  157. package/dist/src/lib/workflow/types.js.map +0 -1
@@ -1,487 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import { detectStack, getStackConfig, STACKS, detectPackageManager, getPackageManagerCommands, PM_CONFIG, } from "./stacks.js";
3
- // Mock the fs module
4
- vi.mock("./fs.js", () => ({
5
- fileExists: vi.fn(),
6
- readFile: vi.fn(),
7
- }));
8
- import { fileExists, readFile } from "./fs.js";
9
- const mockFileExists = vi.mocked(fileExists);
10
- const mockReadFile = vi.mocked(readFile);
11
- describe("STACKS", () => {
12
- describe("astro config", () => {
13
- it("has correct detection files", () => {
14
- expect(STACKS.astro.detection.files).toEqual([
15
- "astro.config.mjs",
16
- "astro.config.js",
17
- "astro.config.ts",
18
- ]);
19
- });
20
- it("has astro in packageDeps", () => {
21
- expect(STACKS.astro.detection.packageDeps).toContain("astro");
22
- });
23
- it("has correct commands", () => {
24
- expect(STACKS.astro.commands.build).toBe("npm run build");
25
- expect(STACKS.astro.commands.dev).toBe("npm run dev");
26
- expect(STACKS.astro.commands.test).toBe("npm test");
27
- expect(STACKS.astro.commands.lint).toBe("npm run lint");
28
- });
29
- });
30
- describe("sveltekit config", () => {
31
- it("has correct detection files", () => {
32
- expect(STACKS.sveltekit.detection.files).toEqual([
33
- "svelte.config.js",
34
- "svelte.config.ts",
35
- ]);
36
- });
37
- it("has @sveltejs/kit in packageDeps", () => {
38
- expect(STACKS.sveltekit.detection.packageDeps).toContain("@sveltejs/kit");
39
- });
40
- it("has correct commands", () => {
41
- expect(STACKS.sveltekit.commands.build).toBe("npm run build");
42
- expect(STACKS.sveltekit.commands.dev).toBe("npm run dev");
43
- expect(STACKS.sveltekit.commands.test).toBe("npm test");
44
- expect(STACKS.sveltekit.commands.lint).toBe("npm run lint");
45
- });
46
- it("has correct devUrl for Vite-based server", () => {
47
- expect(STACKS.sveltekit.devUrl).toBe("http://localhost:5173");
48
- });
49
- });
50
- describe("remix config", () => {
51
- it("has correct detection files", () => {
52
- expect(STACKS.remix.detection.files).toEqual([
53
- "remix.config.js",
54
- "remix.config.ts",
55
- ]);
56
- });
57
- it("has @remix-run/react in packageDeps", () => {
58
- expect(STACKS.remix.detection.packageDeps).toContain("@remix-run/react");
59
- });
60
- it("has correct commands", () => {
61
- expect(STACKS.remix.commands.build).toBe("npm run build");
62
- expect(STACKS.remix.commands.dev).toBe("npm run dev");
63
- expect(STACKS.remix.commands.test).toBe("npm test");
64
- expect(STACKS.remix.commands.lint).toBe("npm run lint");
65
- });
66
- it("has correct devUrl for Vite-based server", () => {
67
- expect(STACKS.remix.devUrl).toBe("http://localhost:5173");
68
- });
69
- });
70
- describe("nuxt config", () => {
71
- it("has correct detection files", () => {
72
- expect(STACKS.nuxt.detection.files).toEqual([
73
- "nuxt.config.ts",
74
- "nuxt.config.js",
75
- ]);
76
- });
77
- it("has nuxt in packageDeps", () => {
78
- expect(STACKS.nuxt.detection.packageDeps).toContain("nuxt");
79
- });
80
- it("has correct commands", () => {
81
- expect(STACKS.nuxt.commands.build).toBe("npm run build");
82
- expect(STACKS.nuxt.commands.dev).toBe("npm run dev");
83
- expect(STACKS.nuxt.commands.test).toBe("npm test");
84
- expect(STACKS.nuxt.commands.lint).toBe("npm run lint");
85
- });
86
- it("has correct devUrl", () => {
87
- expect(STACKS.nuxt.devUrl).toBe("http://localhost:3000");
88
- });
89
- });
90
- });
91
- describe("detectStack", () => {
92
- beforeEach(() => {
93
- vi.resetAllMocks();
94
- mockFileExists.mockResolvedValue(false);
95
- mockReadFile.mockResolvedValue("{}");
96
- });
97
- describe("Astro detection", () => {
98
- it("detects astro.config.mjs", async () => {
99
- mockFileExists.mockImplementation(async (path) => {
100
- return path === "astro.config.mjs";
101
- });
102
- const result = await detectStack();
103
- expect(result).toBe("astro");
104
- });
105
- it("detects astro.config.js", async () => {
106
- mockFileExists.mockImplementation(async (path) => {
107
- return path === "astro.config.js";
108
- });
109
- const result = await detectStack();
110
- expect(result).toBe("astro");
111
- });
112
- it("detects astro.config.ts", async () => {
113
- mockFileExists.mockImplementation(async (path) => {
114
- return path === "astro.config.ts";
115
- });
116
- const result = await detectStack();
117
- expect(result).toBe("astro");
118
- });
119
- it("detects astro in dependencies via package.json", async () => {
120
- mockFileExists.mockImplementation(async (path) => {
121
- return path === "package.json";
122
- });
123
- mockReadFile.mockResolvedValue(JSON.stringify({
124
- dependencies: { astro: "^4.0.0" },
125
- }));
126
- const result = await detectStack();
127
- expect(result).toBe("astro");
128
- });
129
- it("detects astro in devDependencies via package.json", async () => {
130
- mockFileExists.mockImplementation(async (path) => {
131
- return path === "package.json";
132
- });
133
- mockReadFile.mockResolvedValue(JSON.stringify({
134
- devDependencies: { astro: "^4.0.0" },
135
- }));
136
- const result = await detectStack();
137
- expect(result).toBe("astro");
138
- });
139
- });
140
- describe("SvelteKit detection", () => {
141
- it("detects svelte.config.js", async () => {
142
- mockFileExists.mockImplementation(async (path) => {
143
- return path === "svelte.config.js";
144
- });
145
- const result = await detectStack();
146
- expect(result).toBe("sveltekit");
147
- });
148
- it("detects svelte.config.ts", async () => {
149
- mockFileExists.mockImplementation(async (path) => {
150
- return path === "svelte.config.ts";
151
- });
152
- const result = await detectStack();
153
- expect(result).toBe("sveltekit");
154
- });
155
- it("detects @sveltejs/kit in dependencies via package.json", async () => {
156
- mockFileExists.mockImplementation(async (path) => {
157
- return path === "package.json";
158
- });
159
- mockReadFile.mockResolvedValue(JSON.stringify({
160
- dependencies: { "@sveltejs/kit": "^2.0.0" },
161
- }));
162
- const result = await detectStack();
163
- expect(result).toBe("sveltekit");
164
- });
165
- it("detects @sveltejs/kit in devDependencies via package.json", async () => {
166
- mockFileExists.mockImplementation(async (path) => {
167
- return path === "package.json";
168
- });
169
- mockReadFile.mockResolvedValue(JSON.stringify({
170
- devDependencies: { "@sveltejs/kit": "^2.0.0" },
171
- }));
172
- const result = await detectStack();
173
- expect(result).toBe("sveltekit");
174
- });
175
- });
176
- describe("Remix detection", () => {
177
- it("detects remix.config.js", async () => {
178
- mockFileExists.mockImplementation(async (path) => {
179
- return path === "remix.config.js";
180
- });
181
- const result = await detectStack();
182
- expect(result).toBe("remix");
183
- });
184
- it("detects remix.config.ts", async () => {
185
- mockFileExists.mockImplementation(async (path) => {
186
- return path === "remix.config.ts";
187
- });
188
- const result = await detectStack();
189
- expect(result).toBe("remix");
190
- });
191
- it("detects @remix-run/react in dependencies via package.json", async () => {
192
- mockFileExists.mockImplementation(async (path) => {
193
- return path === "package.json";
194
- });
195
- mockReadFile.mockResolvedValue(JSON.stringify({
196
- dependencies: { "@remix-run/react": "^2.0.0" },
197
- }));
198
- const result = await detectStack();
199
- expect(result).toBe("remix");
200
- });
201
- it("detects @remix-run/react in devDependencies via package.json", async () => {
202
- mockFileExists.mockImplementation(async (path) => {
203
- return path === "package.json";
204
- });
205
- mockReadFile.mockResolvedValue(JSON.stringify({
206
- devDependencies: { "@remix-run/react": "^2.0.0" },
207
- }));
208
- const result = await detectStack();
209
- expect(result).toBe("remix");
210
- });
211
- });
212
- describe("Nuxt detection", () => {
213
- it("detects nuxt.config.ts", async () => {
214
- mockFileExists.mockImplementation(async (path) => {
215
- return path === "nuxt.config.ts";
216
- });
217
- const result = await detectStack();
218
- expect(result).toBe("nuxt");
219
- });
220
- it("detects nuxt.config.js", async () => {
221
- mockFileExists.mockImplementation(async (path) => {
222
- return path === "nuxt.config.js";
223
- });
224
- const result = await detectStack();
225
- expect(result).toBe("nuxt");
226
- });
227
- it("detects nuxt in dependencies via package.json", async () => {
228
- mockFileExists.mockImplementation(async (path) => {
229
- return path === "package.json";
230
- });
231
- mockReadFile.mockResolvedValue(JSON.stringify({
232
- dependencies: { nuxt: "^3.0.0" },
233
- }));
234
- const result = await detectStack();
235
- expect(result).toBe("nuxt");
236
- });
237
- it("detects nuxt in devDependencies via package.json", async () => {
238
- mockFileExists.mockImplementation(async (path) => {
239
- return path === "package.json";
240
- });
241
- mockReadFile.mockResolvedValue(JSON.stringify({
242
- devDependencies: { nuxt: "^3.0.0" },
243
- }));
244
- const result = await detectStack();
245
- expect(result).toBe("nuxt");
246
- });
247
- });
248
- describe("priority", () => {
249
- it("Next.js takes priority over Astro when both present", async () => {
250
- mockFileExists.mockImplementation(async (path) => {
251
- return path === "next.config.js" || path === "astro.config.mjs";
252
- });
253
- const result = await detectStack();
254
- expect(result).toBe("nextjs");
255
- });
256
- it("Next.js dep takes priority over Astro dep", async () => {
257
- mockFileExists.mockImplementation(async (path) => {
258
- return path === "package.json";
259
- });
260
- mockReadFile.mockResolvedValue(JSON.stringify({
261
- dependencies: { next: "^14.0.0", astro: "^4.0.0" },
262
- }));
263
- const result = await detectStack();
264
- expect(result).toBe("nextjs");
265
- });
266
- it("Astro config file takes priority over Rust", async () => {
267
- mockFileExists.mockImplementation(async (path) => {
268
- return path === "astro.config.mjs" || path === "Cargo.toml";
269
- });
270
- const result = await detectStack();
271
- expect(result).toBe("astro");
272
- });
273
- it("Astro takes priority over SvelteKit when both present", async () => {
274
- mockFileExists.mockImplementation(async (path) => {
275
- return path === "astro.config.mjs" || path === "svelte.config.js";
276
- });
277
- const result = await detectStack();
278
- expect(result).toBe("astro");
279
- });
280
- it("SvelteKit takes priority over Remix when both present", async () => {
281
- mockFileExists.mockImplementation(async (path) => {
282
- return path === "svelte.config.js" || path === "remix.config.js";
283
- });
284
- const result = await detectStack();
285
- expect(result).toBe("sveltekit");
286
- });
287
- it("Remix takes priority over Nuxt when both present", async () => {
288
- mockFileExists.mockImplementation(async (path) => {
289
- return path === "remix.config.js" || path === "nuxt.config.ts";
290
- });
291
- const result = await detectStack();
292
- expect(result).toBe("remix");
293
- });
294
- it("SvelteKit dep takes priority over Remix dep", async () => {
295
- mockFileExists.mockImplementation(async (path) => {
296
- return path === "package.json";
297
- });
298
- mockReadFile.mockResolvedValue(JSON.stringify({
299
- dependencies: {
300
- "@sveltejs/kit": "^2.0.0",
301
- "@remix-run/react": "^2.0.0",
302
- },
303
- }));
304
- const result = await detectStack();
305
- expect(result).toBe("sveltekit");
306
- });
307
- it("Nuxt config file takes priority over Rust", async () => {
308
- mockFileExists.mockImplementation(async (path) => {
309
- return path === "nuxt.config.ts" || path === "Cargo.toml";
310
- });
311
- const result = await detectStack();
312
- expect(result).toBe("nuxt");
313
- });
314
- });
315
- describe("edge cases", () => {
316
- it("returns null when no stack detected", async () => {
317
- mockFileExists.mockResolvedValue(false);
318
- const result = await detectStack();
319
- expect(result).toBeNull();
320
- });
321
- it("handles malformed package.json gracefully", async () => {
322
- mockFileExists.mockImplementation(async (path) => {
323
- return path === "package.json";
324
- });
325
- mockReadFile.mockResolvedValue("{ invalid json }");
326
- const result = await detectStack();
327
- expect(result).toBeNull();
328
- });
329
- it("handles empty package.json", async () => {
330
- mockFileExists.mockImplementation(async (path) => {
331
- return path === "package.json";
332
- });
333
- mockReadFile.mockResolvedValue("{}");
334
- const result = await detectStack();
335
- expect(result).toBeNull();
336
- });
337
- });
338
- });
339
- describe("getStackConfig", () => {
340
- it("returns astro config for astro stack", () => {
341
- const config = getStackConfig("astro");
342
- expect(config.name).toBe("astro");
343
- expect(config.displayName).toBe("Astro");
344
- });
345
- it("returns sveltekit config for sveltekit stack", () => {
346
- const config = getStackConfig("sveltekit");
347
- expect(config.name).toBe("sveltekit");
348
- expect(config.displayName).toBe("SvelteKit");
349
- });
350
- it("returns remix config for remix stack", () => {
351
- const config = getStackConfig("remix");
352
- expect(config.name).toBe("remix");
353
- expect(config.displayName).toBe("Remix");
354
- });
355
- it("returns nuxt config for nuxt stack", () => {
356
- const config = getStackConfig("nuxt");
357
- expect(config.name).toBe("nuxt");
358
- expect(config.displayName).toBe("Nuxt");
359
- });
360
- it("returns generic config for unknown stack", () => {
361
- const config = getStackConfig("unknown-stack");
362
- expect(config.name).toBe("generic");
363
- });
364
- it("returns generic config for empty string", () => {
365
- const config = getStackConfig("");
366
- expect(config.name).toBe("generic");
367
- });
368
- });
369
- describe("detectPackageManager", () => {
370
- beforeEach(() => {
371
- vi.resetAllMocks();
372
- mockFileExists.mockResolvedValue(false);
373
- });
374
- describe("lockfile detection", () => {
375
- it("detects bun.lockb", async () => {
376
- mockFileExists.mockImplementation(async (path) => {
377
- return path === "bun.lockb";
378
- });
379
- const result = await detectPackageManager();
380
- expect(result).toBe("bun");
381
- });
382
- it("detects bun.lock", async () => {
383
- mockFileExists.mockImplementation(async (path) => {
384
- return path === "bun.lock";
385
- });
386
- const result = await detectPackageManager();
387
- expect(result).toBe("bun");
388
- });
389
- it("detects yarn.lock", async () => {
390
- mockFileExists.mockImplementation(async (path) => {
391
- return path === "yarn.lock";
392
- });
393
- const result = await detectPackageManager();
394
- expect(result).toBe("yarn");
395
- });
396
- it("detects pnpm-lock.yaml", async () => {
397
- mockFileExists.mockImplementation(async (path) => {
398
- return path === "pnpm-lock.yaml";
399
- });
400
- const result = await detectPackageManager();
401
- expect(result).toBe("pnpm");
402
- });
403
- it("detects package-lock.json", async () => {
404
- mockFileExists.mockImplementation(async (path) => {
405
- return path === "package-lock.json";
406
- });
407
- const result = await detectPackageManager();
408
- expect(result).toBe("npm");
409
- });
410
- });
411
- describe("priority", () => {
412
- it("bun takes priority over yarn", async () => {
413
- mockFileExists.mockImplementation(async (path) => {
414
- return path === "bun.lockb" || path === "yarn.lock";
415
- });
416
- const result = await detectPackageManager();
417
- expect(result).toBe("bun");
418
- });
419
- it("yarn takes priority over pnpm", async () => {
420
- mockFileExists.mockImplementation(async (path) => {
421
- return path === "yarn.lock" || path === "pnpm-lock.yaml";
422
- });
423
- const result = await detectPackageManager();
424
- expect(result).toBe("yarn");
425
- });
426
- it("pnpm takes priority over npm", async () => {
427
- mockFileExists.mockImplementation(async (path) => {
428
- return path === "pnpm-lock.yaml" || path === "package-lock.json";
429
- });
430
- const result = await detectPackageManager();
431
- expect(result).toBe("pnpm");
432
- });
433
- });
434
- describe("fallback behavior", () => {
435
- it("falls back to npm when only package.json exists", async () => {
436
- mockFileExists.mockImplementation(async (path) => {
437
- return path === "package.json";
438
- });
439
- const result = await detectPackageManager();
440
- expect(result).toBe("npm");
441
- });
442
- it("returns null when no package.json exists", async () => {
443
- mockFileExists.mockResolvedValue(false);
444
- const result = await detectPackageManager();
445
- expect(result).toBeNull();
446
- });
447
- });
448
- });
449
- describe("getPackageManagerCommands", () => {
450
- it("returns correct npm commands", () => {
451
- const config = getPackageManagerCommands("npm");
452
- expect(config.run).toBe("npm run");
453
- expect(config.exec).toBe("npx");
454
- expect(config.install).toBe("npm install");
455
- expect(config.installSilent).toBe("npm install --silent");
456
- });
457
- it("returns correct bun commands", () => {
458
- const config = getPackageManagerCommands("bun");
459
- expect(config.run).toBe("bun run");
460
- expect(config.exec).toBe("bunx");
461
- expect(config.install).toBe("bun install");
462
- expect(config.installSilent).toBe("bun install --silent");
463
- });
464
- it("returns correct yarn commands", () => {
465
- const config = getPackageManagerCommands("yarn");
466
- expect(config.run).toBe("yarn");
467
- expect(config.exec).toBe("yarn dlx");
468
- expect(config.install).toBe("yarn install");
469
- expect(config.installSilent).toBe("yarn install --silent");
470
- });
471
- it("returns correct pnpm commands", () => {
472
- const config = getPackageManagerCommands("pnpm");
473
- expect(config.run).toBe("pnpm run");
474
- expect(config.exec).toBe("pnpm dlx");
475
- expect(config.install).toBe("pnpm install");
476
- expect(config.installSilent).toBe("pnpm install --silent");
477
- });
478
- });
479
- describe("PM_CONFIG", () => {
480
- it("has all supported package managers", () => {
481
- expect(PM_CONFIG).toHaveProperty("npm");
482
- expect(PM_CONFIG).toHaveProperty("bun");
483
- expect(PM_CONFIG).toHaveProperty("yarn");
484
- expect(PM_CONFIG).toHaveProperty("pnpm");
485
- });
486
- });
487
- //# sourceMappingURL=stacks.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stacks.test.js","sourceRoot":"","sources":["../../../src/lib/stacks.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/lib/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWlD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAa/B;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA2BlD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,EAqB/C,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAY5C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAYlD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAejE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/lib/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,mDAAmD;IACnD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,QAAQ,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,CACL,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC/C,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC1C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,MAAM,KAAK,GAA2C;QACpD,EAAE,EAAE;YACF,MAAM,EAAE,iBAAiB;YACzB,KAAK,EAAE,sCAAsC;YAC7C,KAAK,EAAE,0CAA0C;SAClD;QACD,EAAE,EAAE;YACF,MAAM,EAAE,iBAAiB;YACzB,KAAK,EAAE,+CAA+C;YACtD,KAAK,EAAE,mDAAmD;SAC3D;QACD,MAAM,EAAE;YACN,MAAM,EAAE,0CAA0C;YAClD,KAAK,EAAE,0CAA0C;YACjD,KAAK,EAAE,0CAA0C;SAClD;KACF,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC;AACrE,CAAC;AAYD;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAoB;IACnD;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,mCAAmC;QAC5C,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC;QACtC,UAAU,EACR,mFAAmF;KACtF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,uCAAuC;QAChD,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;QAC/B,UAAU,EAAE,qCAAqC;KAClD;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,8BAA8B;QACvC,MAAM,EAAE,CAAC,YAAY,CAAC;QACtB,UAAU,EACR,uFAAuF;KAC1F;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAE/D,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,GAAG,IAAI,gEAAgE,CAAC;IACjF,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,sCAAsC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,QAAQ;QACR,OAAO,GAAG,IAAI,4CAA4C,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,iBAAiB,GAAG,uBAAuB,EAAE,CAAC;IACpD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,MAAM,IAAI,oBAAoB,EAAE,CAAC;QAC1C,uCAAuC;QACvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAClC,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAC/D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=system.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"system.test.d.ts","sourceRoot":"","sources":["../../../src/lib/system.test.ts"],"names":[],"mappings":""}
@@ -1,107 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import { execSync } from "child_process";
3
- // Mock child_process
4
- vi.mock("child_process", () => ({
5
- execSync: vi.fn(),
6
- }));
7
- import { commandExists, isGhAuthenticated, getInstallHint } from "./system.js";
8
- const mockExecSync = vi.mocked(execSync);
9
- describe("system utilities", () => {
10
- beforeEach(() => {
11
- vi.resetAllMocks();
12
- });
13
- describe("commandExists", () => {
14
- it("returns true when command exists", () => {
15
- mockExecSync.mockReturnValue(Buffer.from("/usr/local/bin/gh"));
16
- expect(commandExists("gh")).toBe(true);
17
- expect(mockExecSync).toHaveBeenCalledWith("command -v gh", {
18
- stdio: "ignore",
19
- });
20
- });
21
- it("returns false when command does not exist", () => {
22
- mockExecSync.mockImplementation(() => {
23
- throw new Error("command not found");
24
- });
25
- expect(commandExists("nonexistent")).toBe(false);
26
- });
27
- it("checks different commands correctly", () => {
28
- mockExecSync.mockReturnValue(Buffer.from("/usr/local/bin/jq"));
29
- expect(commandExists("jq")).toBe(true);
30
- expect(mockExecSync).toHaveBeenCalledWith("command -v jq", {
31
- stdio: "ignore",
32
- });
33
- });
34
- it("returns false for invalid command names (injection prevention)", () => {
35
- // Commands with shell metacharacters should be rejected
36
- expect(commandExists("gh; echo test")).toBe(false);
37
- expect(commandExists("gh && echo")).toBe(false);
38
- expect(commandExists("gh$(echo)")).toBe(false);
39
- expect(commandExists("")).toBe(false);
40
- expect(commandExists("gh | cat")).toBe(false);
41
- expect(commandExists("gh > file")).toBe(false);
42
- expect(commandExists("gh < file")).toBe(false);
43
- expect(commandExists("gh\necho")).toBe(false);
44
- // execSync should NOT be called for invalid inputs
45
- expect(mockExecSync).not.toHaveBeenCalled();
46
- });
47
- it("allows valid command names with hyphens and underscores", () => {
48
- mockExecSync.mockReturnValue(Buffer.from("/usr/bin/my-command"));
49
- expect(commandExists("my-command")).toBe(true);
50
- expect(commandExists("my_command")).toBe(true);
51
- expect(commandExists("command123")).toBe(true);
52
- });
53
- });
54
- describe("isGhAuthenticated", () => {
55
- it("returns true when gh is authenticated", () => {
56
- mockExecSync.mockReturnValue(Buffer.from(""));
57
- expect(isGhAuthenticated()).toBe(true);
58
- expect(mockExecSync).toHaveBeenCalledWith("gh auth status", {
59
- stdio: "ignore",
60
- });
61
- });
62
- it("returns false when gh is not authenticated", () => {
63
- mockExecSync.mockImplementation(() => {
64
- throw new Error("not authenticated");
65
- });
66
- expect(isGhAuthenticated()).toBe(false);
67
- });
68
- });
69
- describe("getInstallHint", () => {
70
- const originalPlatform = process.platform;
71
- beforeEach(() => {
72
- // Reset platform after each test
73
- Object.defineProperty(process, "platform", {
74
- value: originalPlatform,
75
- writable: true,
76
- });
77
- });
78
- it("returns macOS hint for gh on darwin", () => {
79
- Object.defineProperty(process, "platform", { value: "darwin" });
80
- expect(getInstallHint("gh")).toBe("brew install gh");
81
- });
82
- it("returns macOS hint for jq on darwin", () => {
83
- Object.defineProperty(process, "platform", { value: "darwin" });
84
- expect(getInstallHint("jq")).toBe("brew install jq");
85
- });
86
- it("returns Linux hint for gh on linux", () => {
87
- Object.defineProperty(process, "platform", { value: "linux" });
88
- expect(getInstallHint("gh")).toContain("apt install gh");
89
- });
90
- it("returns Windows hint for gh on win32", () => {
91
- Object.defineProperty(process, "platform", { value: "win32" });
92
- expect(getInstallHint("gh")).toContain("choco install gh");
93
- });
94
- it("returns generic hint for unknown package", () => {
95
- expect(getInstallHint("unknown-package")).toBe("Install unknown-package");
96
- });
97
- it("returns npm hint for claude on any platform", () => {
98
- Object.defineProperty(process, "platform", { value: "darwin" });
99
- expect(getInstallHint("claude")).toContain("npm install -g @anthropic-ai/claude-code");
100
- Object.defineProperty(process, "platform", { value: "linux" });
101
- expect(getInstallHint("claude")).toContain("npm install -g @anthropic-ai/claude-code");
102
- Object.defineProperty(process, "platform", { value: "win32" });
103
- expect(getInstallHint("claude")).toContain("npm install -g @anthropic-ai/claude-code");
104
- });
105
- });
106
- });
107
- //# sourceMappingURL=system.test.js.map