modestbench 0.0.1

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 (275) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/LICENSE.md +55 -0
  3. package/README.md +699 -0
  4. package/dist/bootstrap.cjs +37 -0
  5. package/dist/bootstrap.cjs.map +1 -0
  6. package/dist/bootstrap.d.cts +17 -0
  7. package/dist/bootstrap.d.cts.map +1 -0
  8. package/dist/bootstrap.d.ts +17 -0
  9. package/dist/bootstrap.d.ts.map +1 -0
  10. package/dist/bootstrap.js +33 -0
  11. package/dist/bootstrap.js.map +1 -0
  12. package/dist/cli/commands/history.cjs +459 -0
  13. package/dist/cli/commands/history.cjs.map +1 -0
  14. package/dist/cli/commands/history.d.cts +34 -0
  15. package/dist/cli/commands/history.d.cts.map +1 -0
  16. package/dist/cli/commands/history.d.ts +34 -0
  17. package/dist/cli/commands/history.d.ts.map +1 -0
  18. package/dist/cli/commands/history.js +422 -0
  19. package/dist/cli/commands/history.js.map +1 -0
  20. package/dist/cli/commands/init.cjs +566 -0
  21. package/dist/cli/commands/init.cjs.map +1 -0
  22. package/dist/cli/commands/init.d.cts +26 -0
  23. package/dist/cli/commands/init.d.cts.map +1 -0
  24. package/dist/cli/commands/init.d.ts +26 -0
  25. package/dist/cli/commands/init.d.ts.map +1 -0
  26. package/dist/cli/commands/init.js +562 -0
  27. package/dist/cli/commands/init.js.map +1 -0
  28. package/dist/cli/commands/run.cjs +285 -0
  29. package/dist/cli/commands/run.cjs.map +1 -0
  30. package/dist/cli/commands/run.d.cts +37 -0
  31. package/dist/cli/commands/run.d.cts.map +1 -0
  32. package/dist/cli/commands/run.d.ts +37 -0
  33. package/dist/cli/commands/run.d.ts.map +1 -0
  34. package/dist/cli/commands/run.js +248 -0
  35. package/dist/cli/commands/run.js.map +1 -0
  36. package/dist/cli/index.cjs +523 -0
  37. package/dist/cli/index.cjs.map +1 -0
  38. package/dist/cli/index.d.cts +58 -0
  39. package/dist/cli/index.d.cts.map +1 -0
  40. package/dist/cli/index.d.ts +58 -0
  41. package/dist/cli/index.d.ts.map +1 -0
  42. package/dist/cli/index.js +515 -0
  43. package/dist/cli/index.js.map +1 -0
  44. package/dist/config/manager.cjs +370 -0
  45. package/dist/config/manager.cjs.map +1 -0
  46. package/dist/config/manager.d.cts +46 -0
  47. package/dist/config/manager.d.cts.map +1 -0
  48. package/dist/config/manager.d.ts +46 -0
  49. package/dist/config/manager.d.ts.map +1 -0
  50. package/dist/config/manager.js +333 -0
  51. package/dist/config/manager.js.map +1 -0
  52. package/dist/config/schema.cjs +182 -0
  53. package/dist/config/schema.cjs.map +1 -0
  54. package/dist/config/schema.d.cts +51 -0
  55. package/dist/config/schema.d.cts.map +1 -0
  56. package/dist/config/schema.d.ts +51 -0
  57. package/dist/config/schema.d.ts.map +1 -0
  58. package/dist/config/schema.js +145 -0
  59. package/dist/config/schema.js.map +1 -0
  60. package/dist/constants.cjs +22 -0
  61. package/dist/constants.cjs.map +1 -0
  62. package/dist/constants.d.cts +10 -0
  63. package/dist/constants.d.cts.map +1 -0
  64. package/dist/constants.d.ts +10 -0
  65. package/dist/constants.d.ts.map +1 -0
  66. package/dist/constants.js +19 -0
  67. package/dist/constants.js.map +1 -0
  68. package/dist/core/benchmark-schema.cjs +135 -0
  69. package/dist/core/benchmark-schema.cjs.map +1 -0
  70. package/dist/core/benchmark-schema.d.cts +139 -0
  71. package/dist/core/benchmark-schema.d.cts.map +1 -0
  72. package/dist/core/benchmark-schema.d.ts +139 -0
  73. package/dist/core/benchmark-schema.d.ts.map +1 -0
  74. package/dist/core/benchmark-schema.js +132 -0
  75. package/dist/core/benchmark-schema.js.map +1 -0
  76. package/dist/core/engine.cjs +669 -0
  77. package/dist/core/engine.cjs.map +1 -0
  78. package/dist/core/engine.d.cts +128 -0
  79. package/dist/core/engine.d.cts.map +1 -0
  80. package/dist/core/engine.d.ts +128 -0
  81. package/dist/core/engine.d.ts.map +1 -0
  82. package/dist/core/engine.js +632 -0
  83. package/dist/core/engine.js.map +1 -0
  84. package/dist/core/engines/accurate-engine.cjs +292 -0
  85. package/dist/core/engines/accurate-engine.cjs.map +1 -0
  86. package/dist/core/engines/accurate-engine.d.cts +63 -0
  87. package/dist/core/engines/accurate-engine.d.cts.map +1 -0
  88. package/dist/core/engines/accurate-engine.d.ts +63 -0
  89. package/dist/core/engines/accurate-engine.d.ts.map +1 -0
  90. package/dist/core/engines/accurate-engine.js +288 -0
  91. package/dist/core/engines/accurate-engine.js.map +1 -0
  92. package/dist/core/engines/index.cjs +21 -0
  93. package/dist/core/engines/index.cjs.map +1 -0
  94. package/dist/core/engines/index.d.cts +16 -0
  95. package/dist/core/engines/index.d.cts.map +1 -0
  96. package/dist/core/engines/index.d.ts +16 -0
  97. package/dist/core/engines/index.d.ts.map +1 -0
  98. package/dist/core/engines/index.js +16 -0
  99. package/dist/core/engines/index.js.map +1 -0
  100. package/dist/core/engines/tinybench-engine.cjs +286 -0
  101. package/dist/core/engines/tinybench-engine.cjs.map +1 -0
  102. package/dist/core/engines/tinybench-engine.d.cts +18 -0
  103. package/dist/core/engines/tinybench-engine.d.cts.map +1 -0
  104. package/dist/core/engines/tinybench-engine.d.ts +18 -0
  105. package/dist/core/engines/tinybench-engine.d.ts.map +1 -0
  106. package/dist/core/engines/tinybench-engine.js +282 -0
  107. package/dist/core/engines/tinybench-engine.js.map +1 -0
  108. package/dist/core/error-manager.cjs +303 -0
  109. package/dist/core/error-manager.cjs.map +1 -0
  110. package/dist/core/error-manager.d.cts +77 -0
  111. package/dist/core/error-manager.d.cts.map +1 -0
  112. package/dist/core/error-manager.d.ts +77 -0
  113. package/dist/core/error-manager.d.ts.map +1 -0
  114. package/dist/core/error-manager.js +299 -0
  115. package/dist/core/error-manager.js.map +1 -0
  116. package/dist/core/loader.cjs +287 -0
  117. package/dist/core/loader.cjs.map +1 -0
  118. package/dist/core/loader.d.cts +55 -0
  119. package/dist/core/loader.d.cts.map +1 -0
  120. package/dist/core/loader.d.ts +55 -0
  121. package/dist/core/loader.d.ts.map +1 -0
  122. package/dist/core/loader.js +250 -0
  123. package/dist/core/loader.js.map +1 -0
  124. package/dist/core/stats-utils.cjs +99 -0
  125. package/dist/core/stats-utils.cjs.map +1 -0
  126. package/dist/core/stats-utils.d.cts +50 -0
  127. package/dist/core/stats-utils.d.cts.map +1 -0
  128. package/dist/core/stats-utils.d.ts +50 -0
  129. package/dist/core/stats-utils.d.ts.map +1 -0
  130. package/dist/core/stats-utils.js +94 -0
  131. package/dist/core/stats-utils.js.map +1 -0
  132. package/dist/index.cjs +64 -0
  133. package/dist/index.cjs.map +1 -0
  134. package/dist/index.d.cts +22 -0
  135. package/dist/index.d.cts.map +1 -0
  136. package/dist/index.d.ts +22 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +30 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/progress/manager.cjs +325 -0
  141. package/dist/progress/manager.cjs.map +1 -0
  142. package/dist/progress/manager.d.cts +125 -0
  143. package/dist/progress/manager.d.cts.map +1 -0
  144. package/dist/progress/manager.d.ts +125 -0
  145. package/dist/progress/manager.d.ts.map +1 -0
  146. package/dist/progress/manager.js +321 -0
  147. package/dist/progress/manager.js.map +1 -0
  148. package/dist/reporters/csv.cjs +250 -0
  149. package/dist/reporters/csv.cjs.map +1 -0
  150. package/dist/reporters/csv.d.cts +92 -0
  151. package/dist/reporters/csv.d.cts.map +1 -0
  152. package/dist/reporters/csv.d.ts +92 -0
  153. package/dist/reporters/csv.d.ts.map +1 -0
  154. package/dist/reporters/csv.js +246 -0
  155. package/dist/reporters/csv.js.map +1 -0
  156. package/dist/reporters/human.cjs +516 -0
  157. package/dist/reporters/human.cjs.map +1 -0
  158. package/dist/reporters/human.d.cts +86 -0
  159. package/dist/reporters/human.d.cts.map +1 -0
  160. package/dist/reporters/human.d.ts +86 -0
  161. package/dist/reporters/human.d.ts.map +1 -0
  162. package/dist/reporters/human.js +509 -0
  163. package/dist/reporters/human.js.map +1 -0
  164. package/dist/reporters/index.cjs +17 -0
  165. package/dist/reporters/index.cjs.map +1 -0
  166. package/dist/reporters/index.d.cts +10 -0
  167. package/dist/reporters/index.d.cts.map +1 -0
  168. package/dist/reporters/index.d.ts +10 -0
  169. package/dist/reporters/index.d.ts.map +1 -0
  170. package/dist/reporters/index.js +10 -0
  171. package/dist/reporters/index.js.map +1 -0
  172. package/dist/reporters/json.cjs +215 -0
  173. package/dist/reporters/json.cjs.map +1 -0
  174. package/dist/reporters/json.d.cts +79 -0
  175. package/dist/reporters/json.d.cts.map +1 -0
  176. package/dist/reporters/json.d.ts +79 -0
  177. package/dist/reporters/json.d.ts.map +1 -0
  178. package/dist/reporters/json.js +211 -0
  179. package/dist/reporters/json.js.map +1 -0
  180. package/dist/reporters/registry.cjs +255 -0
  181. package/dist/reporters/registry.cjs.map +1 -0
  182. package/dist/reporters/registry.d.cts +155 -0
  183. package/dist/reporters/registry.d.cts.map +1 -0
  184. package/dist/reporters/registry.d.ts +155 -0
  185. package/dist/reporters/registry.d.ts.map +1 -0
  186. package/dist/reporters/registry.js +249 -0
  187. package/dist/reporters/registry.js.map +1 -0
  188. package/dist/reporters/simple.cjs +328 -0
  189. package/dist/reporters/simple.cjs.map +1 -0
  190. package/dist/reporters/simple.d.cts +51 -0
  191. package/dist/reporters/simple.d.cts.map +1 -0
  192. package/dist/reporters/simple.d.ts +51 -0
  193. package/dist/reporters/simple.d.ts.map +1 -0
  194. package/dist/reporters/simple.js +321 -0
  195. package/dist/reporters/simple.js.map +1 -0
  196. package/dist/schema/modestbench-config.schema.json +162 -0
  197. package/dist/storage/history.cjs +456 -0
  198. package/dist/storage/history.cjs.map +1 -0
  199. package/dist/storage/history.d.cts +99 -0
  200. package/dist/storage/history.d.cts.map +1 -0
  201. package/dist/storage/history.d.ts +99 -0
  202. package/dist/storage/history.d.ts.map +1 -0
  203. package/dist/storage/history.js +452 -0
  204. package/dist/storage/history.js.map +1 -0
  205. package/dist/types/cli.cjs +21 -0
  206. package/dist/types/cli.cjs.map +1 -0
  207. package/dist/types/cli.d.cts +296 -0
  208. package/dist/types/cli.d.cts.map +1 -0
  209. package/dist/types/cli.d.ts +296 -0
  210. package/dist/types/cli.d.ts.map +1 -0
  211. package/dist/types/cli.js +18 -0
  212. package/dist/types/cli.js.map +1 -0
  213. package/dist/types/core.cjs +14 -0
  214. package/dist/types/core.cjs.map +1 -0
  215. package/dist/types/core.d.cts +380 -0
  216. package/dist/types/core.d.cts.map +1 -0
  217. package/dist/types/core.d.ts +380 -0
  218. package/dist/types/core.d.ts.map +1 -0
  219. package/dist/types/core.js +13 -0
  220. package/dist/types/core.js.map +1 -0
  221. package/dist/types/index.cjs +27 -0
  222. package/dist/types/index.cjs.map +1 -0
  223. package/dist/types/index.d.cts +11 -0
  224. package/dist/types/index.d.cts.map +1 -0
  225. package/dist/types/index.d.ts +11 -0
  226. package/dist/types/index.d.ts.map +1 -0
  227. package/dist/types/index.js +11 -0
  228. package/dist/types/index.js.map +1 -0
  229. package/dist/types/interfaces.cjs +10 -0
  230. package/dist/types/interfaces.cjs.map +1 -0
  231. package/dist/types/interfaces.d.cts +381 -0
  232. package/dist/types/interfaces.d.cts.map +1 -0
  233. package/dist/types/interfaces.d.ts +381 -0
  234. package/dist/types/interfaces.d.ts.map +1 -0
  235. package/dist/types/interfaces.js +9 -0
  236. package/dist/types/interfaces.js.map +1 -0
  237. package/dist/types/utility.cjs +92 -0
  238. package/dist/types/utility.cjs.map +1 -0
  239. package/dist/types/utility.d.cts +330 -0
  240. package/dist/types/utility.d.cts.map +1 -0
  241. package/dist/types/utility.d.ts +330 -0
  242. package/dist/types/utility.d.ts.map +1 -0
  243. package/dist/types/utility.js +78 -0
  244. package/dist/types/utility.js.map +1 -0
  245. package/package.json +211 -0
  246. package/src/bootstrap.ts +35 -0
  247. package/src/cli/commands/history.ts +569 -0
  248. package/src/cli/commands/init.ts +658 -0
  249. package/src/cli/commands/run.ts +346 -0
  250. package/src/cli/index.ts +642 -0
  251. package/src/config/manager.ts +387 -0
  252. package/src/config/schema.ts +188 -0
  253. package/src/constants.ts +21 -0
  254. package/src/core/benchmark-schema.ts +185 -0
  255. package/src/core/engine.ts +888 -0
  256. package/src/core/engines/accurate-engine.ts +408 -0
  257. package/src/core/engines/index.ts +16 -0
  258. package/src/core/engines/tinybench-engine.ts +335 -0
  259. package/src/core/error-manager.ts +372 -0
  260. package/src/core/loader.ts +324 -0
  261. package/src/core/stats-utils.ts +135 -0
  262. package/src/index.ts +46 -0
  263. package/src/progress/manager.ts +415 -0
  264. package/src/reporters/csv.ts +368 -0
  265. package/src/reporters/human.ts +707 -0
  266. package/src/reporters/index.ts +10 -0
  267. package/src/reporters/json.ts +302 -0
  268. package/src/reporters/registry.ts +349 -0
  269. package/src/reporters/simple.ts +459 -0
  270. package/src/storage/history.ts +600 -0
  271. package/src/types/cli.ts +312 -0
  272. package/src/types/core.ts +414 -0
  273. package/src/types/index.ts +18 -0
  274. package/src/types/interfaces.ts +451 -0
  275. package/src/types/utility.ts +446 -0
@@ -0,0 +1,562 @@
1
+ /**
2
+ * ModestBench Init Command
3
+ *
4
+ * Initialize a new benchmark project with configuration files, directory
5
+ * structure, and optional example benchmark files.
6
+ */
7
+ import { access, appendFile, mkdir, readFile, writeFile, } from 'node:fs/promises';
8
+ import { join, resolve } from 'node:path';
9
+ import { createInterface } from 'node:readline';
10
+ /**
11
+ * Project templates for different initialization types
12
+ */
13
+ const PROJECT_TEMPLATES = {
14
+ advanced: {
15
+ configOptions: {
16
+ iterations: 1000,
17
+ outputDir: './benchmark-results',
18
+ pattern: 'benchmarks/**/*.bench.{js,ts}',
19
+ reporters: ['human', 'json'],
20
+ time: 10000,
21
+ warmup: 50,
22
+ },
23
+ description: 'Feature-rich setup with multiple reporters and configuration',
24
+ directories: ['benchmarks', 'benchmark-results'],
25
+ name: 'Advanced Project',
26
+ },
27
+ basic: {
28
+ configOptions: {
29
+ iterations: 100,
30
+ pattern: 'benchmarks/**/*.bench.{js,ts}',
31
+ reporters: ['human'],
32
+ time: 5000,
33
+ },
34
+ description: 'Simple benchmark setup for small projects',
35
+ directories: ['benchmarks'],
36
+ name: 'Basic Project',
37
+ },
38
+ library: {
39
+ configOptions: {
40
+ bail: false,
41
+ iterations: 5000,
42
+ outputDir: './benchmark-results',
43
+ pattern: 'benchmarks/**/*.bench.{js,ts}',
44
+ reporters: ['human', 'json'],
45
+ time: 15000,
46
+ warmup: 100,
47
+ },
48
+ description: 'Optimized for library performance testing',
49
+ directories: ['benchmarks', 'benchmarks/suites', 'benchmark-results'],
50
+ name: 'Library Project',
51
+ },
52
+ };
53
+ /**
54
+ * Example benchmark files
55
+ */
56
+ const EXAMPLE_BENCHMARKS = {
57
+ arrayMethods: {
58
+ content: `/**
59
+ * Array Methods Performance Benchmark
60
+ *
61
+ * Compares performance of different array iteration methods.
62
+ */
63
+
64
+ export default {
65
+ name: 'Array Methods',
66
+
67
+ setup() {
68
+ // Setup data for benchmarks
69
+ this.smallArray = Array.from({ length: 100 }, (_, i) => i);
70
+ this.largeArray = Array.from({ length: 10000 }, (_, i) => i);
71
+ },
72
+
73
+ benchmarks: {
74
+ 'for loop (small array)': {
75
+ fn() {
76
+ let sum = 0;
77
+ for (let i = 0; i < this.smallArray.length; i++) {
78
+ sum += this.smallArray[i];
79
+ }
80
+ return sum;
81
+ }
82
+ },
83
+
84
+ 'forEach (small array)': {
85
+ fn() {
86
+ let sum = 0;
87
+ this.smallArray.forEach(n => sum += n);
88
+ return sum;
89
+ }
90
+ },
91
+
92
+ 'reduce (small array)': {
93
+ fn() {
94
+ return this.smallArray.reduce((sum, n) => sum + n, 0);
95
+ }
96
+ },
97
+
98
+ 'for loop (large array)': {
99
+ fn() {
100
+ let sum = 0;
101
+ for (let i = 0; i < this.largeArray.length; i++) {
102
+ sum += this.largeArray[i];
103
+ }
104
+ return sum;
105
+ }
106
+ },
107
+
108
+ 'forEach (large array)': {
109
+ fn() {
110
+ let sum = 0;
111
+ this.largeArray.forEach(n => sum += n);
112
+ return sum;
113
+ }
114
+ },
115
+
116
+ 'reduce (large array)': {
117
+ fn() {
118
+ return this.largeArray.reduce((sum, n) => sum + n, 0);
119
+ }
120
+ }
121
+ }
122
+ };
123
+ `,
124
+ filename: 'array-methods.bench.js',
125
+ },
126
+ example: {
127
+ content: `/**
128
+ * Example Benchmark File
129
+ *
130
+ * This is a simple example demonstrating basic benchmarking setup.
131
+ */
132
+
133
+ export default {
134
+ name: 'Example Benchmarks',
135
+
136
+ benchmarks: {
137
+ 'simple addition': {
138
+ fn() {
139
+ return 1 + 1;
140
+ }
141
+ },
142
+
143
+ 'array creation': {
144
+ fn() {
145
+ return Array.from({ length: 100 }, (_, i) => i);
146
+ }
147
+ },
148
+
149
+ 'string manipulation': {
150
+ fn() {
151
+ return 'Hello, World!'.toUpperCase();
152
+ }
153
+ }
154
+ }
155
+ };
156
+ `,
157
+ filename: 'example.bench.js',
158
+ },
159
+ stringOperations: {
160
+ content: `/**
161
+ * String Operations Performance Benchmark
162
+ *
163
+ * Tests various string manipulation techniques.
164
+ */
165
+
166
+ export default {
167
+ name: 'String Operations',
168
+
169
+ setup() {
170
+ this.baseString = 'Hello, World!';
171
+ this.longString = 'Lorem ipsum '.repeat(1000);
172
+ this.template = 'Hello, {name}!';
173
+ },
174
+
175
+ benchmarks: {
176
+ 'string concatenation': {
177
+ fn() {
178
+ return this.baseString + ' How are you?';
179
+ }
180
+ },
181
+
182
+ 'template literals': {
183
+ fn() {
184
+ return \`\${this.baseString} How are you?\`;
185
+ }
186
+ },
187
+
188
+ 'string replace': {
189
+ fn() {
190
+ return this.template.replace('{name}', 'ModestBench');
191
+ }
192
+ },
193
+
194
+ 'string includes': {
195
+ fn() {
196
+ return this.longString.includes('ipsum');
197
+ }
198
+ },
199
+
200
+ 'regex test': {
201
+ fn() {
202
+ return /ipsum/.test(this.longString);
203
+ }
204
+ }
205
+ }
206
+ };
207
+ `,
208
+ filename: 'string-operations.bench.js',
209
+ },
210
+ };
211
+ /**
212
+ * Prompt user for confirmation with Y/n default to Yes
213
+ */
214
+ const promptUser = async (question) => {
215
+ const rl = createInterface({
216
+ input: process.stdin,
217
+ output: process.stdout,
218
+ });
219
+ return new Promise((resolve) => {
220
+ rl.question(question, (answer) => {
221
+ rl.close();
222
+ const normalized = answer.trim().toLowerCase();
223
+ // Default to Yes if empty or starts with 'y'
224
+ resolve(normalized === '' || normalized === 'y' || normalized === 'yes');
225
+ });
226
+ });
227
+ };
228
+ /**
229
+ * Handle init command
230
+ */
231
+ export const handleInitCommand = async (context, options) => {
232
+ try {
233
+ const template = PROJECT_TEMPLATES[options.type];
234
+ if (!options.quiet) {
235
+ console.log(`Initializing ${template.name}...`);
236
+ console.log(template.description);
237
+ console.log();
238
+ }
239
+ // Check if project already exists
240
+ if (!options.force) {
241
+ const hasConflicts = await checkForConflicts(options);
242
+ if (hasConflicts) {
243
+ console.error('Project files already exist. Use --force to overwrite.');
244
+ return 1; // Already initialized
245
+ }
246
+ }
247
+ // Create directory structure
248
+ await createDirectories(template.directories, options);
249
+ // Create configuration file
250
+ await createConfigFile(template.configOptions, options);
251
+ // Create example benchmarks if requested
252
+ if (options.examples) {
253
+ await createExampleBenchmarks(options);
254
+ }
255
+ // Create additional files
256
+ await createAdditionalFiles(options);
257
+ if (!options.quiet) {
258
+ console.log('✅ Project initialized successfully!');
259
+ console.log();
260
+ console.log('Next steps:');
261
+ if (options.examples) {
262
+ console.log(' 1. Run example benchmarks: modestbench run');
263
+ }
264
+ else {
265
+ console.log(' 1. Create your first benchmark file in the benchmarks/ directory');
266
+ }
267
+ console.log(' 2. Customize configuration in your config file');
268
+ console.log(' 3. Add your own benchmark suites');
269
+ console.log();
270
+ console.log('Documentation: https://github.com/your-org/modestbench#readme');
271
+ }
272
+ return 0;
273
+ }
274
+ catch (error) {
275
+ console.error('Init command failed:', error instanceof Error ? error.message : String(error));
276
+ if (options.verbose && error instanceof Error && error.stack) {
277
+ console.error('Stack trace:');
278
+ console.error(error.stack);
279
+ }
280
+ return 5; // Runtime error
281
+ }
282
+ };
283
+ /**
284
+ * Check for existing files that would conflict
285
+ */
286
+ const checkForConflicts = async (options) => {
287
+ const filesToCheck = [
288
+ 'modestbench.config.' + options.configType,
289
+ 'benchmarks',
290
+ ];
291
+ for (const file of filesToCheck) {
292
+ try {
293
+ await access(resolve(options.cwd, file));
294
+ return true; // File exists, conflict detected
295
+ }
296
+ catch {
297
+ // File doesn't exist, no conflict
298
+ }
299
+ }
300
+ return false;
301
+ };
302
+ /**
303
+ * Handle .gitignore file creation or modification
304
+ */
305
+ const handleGitignore = async (options) => {
306
+ const gitignorePath = resolve(options.cwd, '.gitignore');
307
+ const modestbenchEntry = '.modestbench/';
308
+ // Default .gitignore content for new files
309
+ const defaultGitignoreContent = `# ModestBench
310
+ benchmark-results/
311
+ .modestbench/
312
+
313
+ # Dependencies
314
+ node_modules/
315
+
316
+ # Environment
317
+ .env
318
+ .env.local
319
+
320
+ # Logs
321
+ *.log
322
+ npm-debug.log*
323
+ yarn-debug.log*
324
+ yarn-error.log*
325
+
326
+ # OS
327
+ .DS_Store
328
+ Thumbs.db
329
+ `;
330
+ try {
331
+ // Check if .gitignore exists
332
+ let gitignoreExists = false;
333
+ try {
334
+ await access(gitignorePath);
335
+ gitignoreExists = true;
336
+ }
337
+ catch {
338
+ // File doesn't exist
339
+ }
340
+ if (!gitignoreExists) {
341
+ // Create new .gitignore with full content
342
+ await writeFile(gitignorePath, defaultGitignoreContent, 'utf8');
343
+ if (options.verbose) {
344
+ console.log(' ✓ .gitignore');
345
+ }
346
+ return;
347
+ }
348
+ // File exists, check if .modestbench/ is already present
349
+ const existingContent = await readFile(gitignorePath, 'utf8');
350
+ // Check if .modestbench/ is already in the file
351
+ const hasModestbenchEntry = existingContent
352
+ .split('\n')
353
+ .some((line) => line.trim() === modestbenchEntry);
354
+ if (hasModestbenchEntry) {
355
+ // Already has the entry, nothing to do
356
+ if (options.verbose) {
357
+ console.log(' ✓ .gitignore (already contains .modestbench/)');
358
+ }
359
+ return;
360
+ }
361
+ // Determine if we should prompt or auto-add
362
+ let shouldAdd = false;
363
+ if (options.yes || options.quiet) {
364
+ // Auto-accept in non-interactive mode
365
+ shouldAdd = true;
366
+ }
367
+ else {
368
+ // Prompt the user
369
+ console.log();
370
+ console.log('The .modestbench/ directory stores benchmark history and should typically');
371
+ console.log('not be committed to version control.');
372
+ console.log();
373
+ shouldAdd = await promptUser('Would you like to add .modestbench/ to .gitignore? (Y/n) ');
374
+ }
375
+ if (shouldAdd) {
376
+ // Append .modestbench/ to existing .gitignore
377
+ let contentToAppend = '';
378
+ // Ensure file ends with newline
379
+ if (!existingContent.endsWith('\n')) {
380
+ contentToAppend += '\n';
381
+ }
382
+ // Add a blank line if the file doesn't end with one
383
+ if (!existingContent.endsWith('\n\n') && existingContent.trim() !== '') {
384
+ contentToAppend += '\n';
385
+ }
386
+ // Add comment and entry
387
+ contentToAppend += '# ModestBench history\n';
388
+ contentToAppend += modestbenchEntry + '\n';
389
+ await appendFile(gitignorePath, contentToAppend, 'utf8');
390
+ if (options.verbose || !options.quiet) {
391
+ console.log(' ✓ Added .modestbench/ to .gitignore');
392
+ }
393
+ }
394
+ else {
395
+ if (options.verbose) {
396
+ console.log(' ⊘ Skipped adding .modestbench/ to .gitignore');
397
+ }
398
+ }
399
+ }
400
+ catch (error) {
401
+ // Non-critical, just warn
402
+ console.warn('Warning: Could not create/modify .gitignore file:', error instanceof Error ? error.message : String(error));
403
+ }
404
+ };
405
+ /**
406
+ * Create additional project files
407
+ */
408
+ const createAdditionalFiles = async (options) => {
409
+ if (!options.quiet) {
410
+ console.log('Creating additional files...');
411
+ }
412
+ // Handle .gitignore
413
+ await handleGitignore(options);
414
+ // Create README.md
415
+ const readmeContent = `# Benchmark Project
416
+
417
+ This project uses [ModestBench](https://github.com/your-org/modestbench) for performance testing.
418
+
419
+ ## Getting Started
420
+
421
+ Run all benchmarks:
422
+ \`\`\`bash
423
+ modestbench run
424
+ \`\`\`
425
+
426
+ Run specific benchmarks:
427
+ \`\`\`bash
428
+ modestbench run "benchmarks/array-*.bench.js"
429
+ \`\`\`
430
+
431
+ View benchmark history:
432
+ \`\`\`bash
433
+ modestbench history list
434
+ \`\`\`
435
+
436
+ ## Configuration
437
+
438
+ See \`modestbench.config.*\` for benchmark configuration options.
439
+
440
+ ## Writing Benchmarks
441
+
442
+ Create new benchmark files in the \`benchmarks/\` directory. See the examples for the expected format.
443
+ `;
444
+ try {
445
+ const readmePath = resolve(options.cwd, 'README.md');
446
+ await writeFile(readmePath, readmeContent, 'utf8');
447
+ if (options.verbose) {
448
+ console.log(' ✓ README.md');
449
+ }
450
+ }
451
+ catch {
452
+ // Non-critical, just warn
453
+ console.warn('Warning: Could not create README.md file');
454
+ }
455
+ };
456
+ /**
457
+ * Create configuration file
458
+ */
459
+ const createConfigFile = async (configOptions, options) => {
460
+ const filename = `modestbench.config.${options.configType}`;
461
+ const filePath = resolve(options.cwd, filename);
462
+ if (!options.quiet) {
463
+ console.log(`Creating configuration file: ${filename}`);
464
+ }
465
+ let content;
466
+ switch (options.configType) {
467
+ case 'js':
468
+ content = `export default ${JSON.stringify(configOptions, null, 2)};\n`;
469
+ break;
470
+ case 'json':
471
+ content = JSON.stringify(configOptions, null, 2);
472
+ break;
473
+ case 'ts':
474
+ content = `import type { ModestBenchConfig } from 'modestbench';
475
+
476
+ const config: ModestBenchConfig = ${JSON.stringify(configOptions, null, 2)};
477
+
478
+ export default config;
479
+ `;
480
+ break;
481
+ case 'yaml':
482
+ // Simple YAML generation (could use a proper YAML library)
483
+ content = generateSimpleYaml(configOptions);
484
+ break;
485
+ default:
486
+ throw new Error(`Unsupported config format: ${options.configType}`);
487
+ }
488
+ try {
489
+ await writeFile(filePath, content, 'utf8');
490
+ if (options.verbose) {
491
+ console.log(` ✓ ${filename}`);
492
+ }
493
+ }
494
+ catch (error) {
495
+ throw new Error(`Failed to create config file: ${error instanceof Error ? error.message : String(error)}`);
496
+ }
497
+ };
498
+ /**
499
+ * Create directory structure
500
+ */
501
+ const createDirectories = async (directories, options) => {
502
+ if (!options.quiet) {
503
+ console.log('Creating directories...');
504
+ }
505
+ for (const dir of directories) {
506
+ const dirPath = resolve(options.cwd, dir);
507
+ try {
508
+ await mkdir(dirPath, { recursive: true });
509
+ if (options.verbose) {
510
+ console.log(` ✓ ${dir}/`);
511
+ }
512
+ }
513
+ catch (error) {
514
+ throw new Error(`Failed to create directory ${dir}: ${error instanceof Error ? error.message : String(error)}`);
515
+ }
516
+ }
517
+ };
518
+ /**
519
+ * Create example benchmark files
520
+ */
521
+ const createExampleBenchmarks = async (options) => {
522
+ if (!options.quiet) {
523
+ console.log('Creating example benchmarks...');
524
+ }
525
+ const benchmarksDir = resolve(options.cwd, 'benchmarks');
526
+ for (const [name, example] of Object.entries(EXAMPLE_BENCHMARKS)) {
527
+ const filePath = join(benchmarksDir, example.filename);
528
+ try {
529
+ await writeFile(filePath, example.content, 'utf8');
530
+ if (options.verbose) {
531
+ console.log(` ✓ ${example.filename}`);
532
+ }
533
+ }
534
+ catch (error) {
535
+ throw new Error(`Failed to create example ${name}: ${error instanceof Error ? error.message : String(error)}`);
536
+ }
537
+ }
538
+ };
539
+ /**
540
+ * Generate simple YAML from object (basic implementation)
541
+ */
542
+ const generateSimpleYaml = (obj, indent = 0) => {
543
+ const spaces = ' '.repeat(indent);
544
+ let yaml = '';
545
+ for (const [key, value] of Object.entries(obj)) {
546
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
547
+ yaml += `${spaces}${key}:\n${generateSimpleYaml(value, indent + 2)}`;
548
+ }
549
+ else if (Array.isArray(value)) {
550
+ yaml += `${spaces}${key}:\n`;
551
+ for (const item of value) {
552
+ yaml += `${spaces} - ${item}\n`;
553
+ }
554
+ }
555
+ else {
556
+ const formattedValue = typeof value === 'string' ? `"${value}"` : value;
557
+ yaml += `${spaces}${key}: ${formattedValue}\n`;
558
+ }
559
+ }
560
+ return yaml;
561
+ };
562
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}