alepha 0.11.7 → 0.11.10

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 (169) hide show
  1. package/README.md +55 -17
  2. package/dist/index.cjs +15805 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +1 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.js +15804 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +36 -372
  9. package/src/assets/biomeJson.ts +33 -0
  10. package/src/assets/tsconfigJson.ts +17 -0
  11. package/src/assets/viteConfigTs.ts +14 -0
  12. package/src/commands/BiomeCommands.ts +60 -0
  13. package/src/commands/CoreCommands.ts +266 -0
  14. package/src/commands/DrizzleCommands.ts +403 -0
  15. package/src/commands/VerifyCommands.ts +48 -0
  16. package/src/commands/ViteCommands.ts +152 -0
  17. package/src/index.ts +35 -0
  18. package/src/services/ProcessRunner.ts +89 -0
  19. package/src/version.ts +7 -0
  20. package/api/files.cjs +0 -8
  21. package/api/files.d.ts +0 -438
  22. package/api/files.js +0 -1
  23. package/api/jobs.cjs +0 -8
  24. package/api/jobs.d.ts +0 -327
  25. package/api/jobs.js +0 -1
  26. package/api/notifications.cjs +0 -8
  27. package/api/notifications.d.ts +0 -263
  28. package/api/notifications.js +0 -1
  29. package/api/users.cjs +0 -8
  30. package/api/users.d.ts +0 -923
  31. package/api/users.js +0 -1
  32. package/api/verifications.cjs +0 -8
  33. package/api/verifications.d.ts +0 -1
  34. package/api/verifications.js +0 -1
  35. package/batch.cjs +0 -8
  36. package/batch.d.ts +0 -154
  37. package/batch.js +0 -1
  38. package/bucket.cjs +0 -8
  39. package/bucket.d.ts +0 -520
  40. package/bucket.js +0 -1
  41. package/cache/redis.cjs +0 -8
  42. package/cache/redis.d.ts +0 -40
  43. package/cache/redis.js +0 -1
  44. package/cache.cjs +0 -8
  45. package/cache.d.ts +0 -288
  46. package/cache.js +0 -1
  47. package/command.cjs +0 -8
  48. package/command.d.ts +0 -269
  49. package/command.js +0 -1
  50. package/core.cjs +0 -8
  51. package/core.d.ts +0 -1904
  52. package/core.js +0 -1
  53. package/datetime.cjs +0 -8
  54. package/datetime.d.ts +0 -144
  55. package/datetime.js +0 -1
  56. package/devtools.cjs +0 -8
  57. package/devtools.d.ts +0 -252
  58. package/devtools.js +0 -1
  59. package/email.cjs +0 -8
  60. package/email.d.ts +0 -187
  61. package/email.js +0 -1
  62. package/fake.cjs +0 -8
  63. package/fake.d.ts +0 -73
  64. package/fake.js +0 -1
  65. package/file.cjs +0 -8
  66. package/file.d.ts +0 -528
  67. package/file.js +0 -1
  68. package/lock/redis.cjs +0 -8
  69. package/lock/redis.d.ts +0 -24
  70. package/lock/redis.js +0 -1
  71. package/lock.cjs +0 -8
  72. package/lock.d.ts +0 -552
  73. package/lock.js +0 -1
  74. package/logger.cjs +0 -8
  75. package/logger.d.ts +0 -287
  76. package/logger.js +0 -1
  77. package/postgres.cjs +0 -8
  78. package/postgres.d.ts +0 -2143
  79. package/postgres.js +0 -1
  80. package/queue/redis.cjs +0 -8
  81. package/queue/redis.d.ts +0 -29
  82. package/queue/redis.js +0 -1
  83. package/queue.cjs +0 -8
  84. package/queue.d.ts +0 -760
  85. package/queue.js +0 -1
  86. package/react/auth.cjs +0 -8
  87. package/react/auth.d.ts +0 -504
  88. package/react/auth.js +0 -1
  89. package/react/form.cjs +0 -8
  90. package/react/form.d.ts +0 -211
  91. package/react/form.js +0 -1
  92. package/react/head.cjs +0 -8
  93. package/react/head.d.ts +0 -120
  94. package/react/head.js +0 -1
  95. package/react/i18n.cjs +0 -8
  96. package/react/i18n.d.ts +0 -168
  97. package/react/i18n.js +0 -1
  98. package/react.cjs +0 -8
  99. package/react.d.ts +0 -1263
  100. package/react.js +0 -1
  101. package/redis.cjs +0 -8
  102. package/redis.d.ts +0 -82
  103. package/redis.js +0 -1
  104. package/retry.cjs +0 -8
  105. package/retry.d.ts +0 -162
  106. package/retry.js +0 -1
  107. package/router.cjs +0 -8
  108. package/router.d.ts +0 -45
  109. package/router.js +0 -1
  110. package/scheduler.cjs +0 -8
  111. package/scheduler.d.ts +0 -145
  112. package/scheduler.js +0 -1
  113. package/security.cjs +0 -8
  114. package/security.d.ts +0 -586
  115. package/security.js +0 -1
  116. package/server/cache.cjs +0 -8
  117. package/server/cache.d.ts +0 -163
  118. package/server/cache.js +0 -1
  119. package/server/compress.cjs +0 -8
  120. package/server/compress.d.ts +0 -38
  121. package/server/compress.js +0 -1
  122. package/server/cookies.cjs +0 -8
  123. package/server/cookies.d.ts +0 -144
  124. package/server/cookies.js +0 -1
  125. package/server/cors.cjs +0 -8
  126. package/server/cors.d.ts +0 -45
  127. package/server/cors.js +0 -1
  128. package/server/health.cjs +0 -8
  129. package/server/health.d.ts +0 -58
  130. package/server/health.js +0 -1
  131. package/server/helmet.cjs +0 -8
  132. package/server/helmet.d.ts +0 -98
  133. package/server/helmet.js +0 -1
  134. package/server/links.cjs +0 -8
  135. package/server/links.d.ts +0 -322
  136. package/server/links.js +0 -1
  137. package/server/metrics.cjs +0 -8
  138. package/server/metrics.d.ts +0 -35
  139. package/server/metrics.js +0 -1
  140. package/server/multipart.cjs +0 -8
  141. package/server/multipart.d.ts +0 -42
  142. package/server/multipart.js +0 -1
  143. package/server/proxy.cjs +0 -8
  144. package/server/proxy.d.ts +0 -234
  145. package/server/proxy.js +0 -1
  146. package/server/security.cjs +0 -8
  147. package/server/security.d.ts +0 -92
  148. package/server/security.js +0 -1
  149. package/server/static.cjs +0 -8
  150. package/server/static.d.ts +0 -119
  151. package/server/static.js +0 -1
  152. package/server/swagger.cjs +0 -8
  153. package/server/swagger.d.ts +0 -161
  154. package/server/swagger.js +0 -1
  155. package/server.cjs +0 -8
  156. package/server.d.ts +0 -849
  157. package/server.js +0 -1
  158. package/topic/redis.cjs +0 -8
  159. package/topic/redis.d.ts +0 -42
  160. package/topic/redis.js +0 -1
  161. package/topic.cjs +0 -8
  162. package/topic.d.ts +0 -819
  163. package/topic.js +0 -1
  164. package/ui.cjs +0 -8
  165. package/ui.d.ts +0 -813
  166. package/ui.js +0 -1
  167. package/vite.cjs +0 -8
  168. package/vite.d.ts +0 -186
  169. package/vite.js +0 -1
package/package.json CHANGED
@@ -1,389 +1,53 @@
1
1
  {
2
2
  "name": "alepha",
3
- "version": "0.11.7",
3
+ "version": "0.11.10",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=22.0.0"
7
7
  },
8
8
  "license": "MIT",
9
- "description": "Alepha is a convention-driven TypeScript framework for building robust, end-to-end type-safe applications, from serverless APIs to full-stack React apps.",
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist",
13
+ "src",
14
+ "assets"
15
+ ],
16
+ "bin": "./dist/index.js",
17
+ "dependencies": {
18
+ "@alepha/postgres": "^0.11.10",
19
+ "@biomejs/biome": "^2.3.5",
20
+ "drizzle-kit": "^0.31.7",
21
+ "tar": "^7.5.2",
22
+ "tsx": "^4.20.6",
23
+ "typescript": "^5.9.3",
24
+ "vite": "^7.2.2",
25
+ "vitest": "^4.0.9"
26
+ },
27
+ "devDependencies": {
28
+ "@alepha/command": "^0.11.10",
29
+ "@alepha/core": "^0.11.10",
30
+ "@alepha/logger": "^0.11.10"
31
+ },
32
+ "scripts": {
33
+ "lint": "biome check --fix",
34
+ "build": "tsdown -c=../../tsdown.config.ts",
35
+ "check": "tsc --noEmit"
36
+ },
10
37
  "homepage": "https://github.com/feunard/alepha",
11
38
  "repository": {
12
39
  "type": "git",
13
40
  "url": "git+https://github.com/feunard/alepha.git"
14
41
  },
15
- "main": "./core.js",
16
- "types": "./core.d.ts",
17
- "dependencies": {
18
- "@alepha/api-files": "0.11.7",
19
- "@alepha/api-jobs": "0.11.7",
20
- "@alepha/api-notifications": "0.11.7",
21
- "@alepha/api-users": "0.11.7",
22
- "@alepha/api-verifications": "0.11.7",
23
- "@alepha/batch": "0.11.7",
24
- "@alepha/bucket": "0.11.7",
25
- "@alepha/cache": "0.11.7",
26
- "@alepha/cache-redis": "0.11.7",
27
- "@alepha/command": "0.11.7",
28
- "@alepha/core": "0.11.7",
29
- "@alepha/datetime": "0.11.7",
30
- "@alepha/devtools": "0.11.7",
31
- "@alepha/email": "0.11.7",
32
- "@alepha/fake": "0.11.7",
33
- "@alepha/file": "0.11.7",
34
- "@alepha/lock": "0.11.7",
35
- "@alepha/lock-redis": "0.11.7",
36
- "@alepha/logger": "0.11.7",
37
- "@alepha/postgres": "0.11.7",
38
- "@alepha/queue": "0.11.7",
39
- "@alepha/queue-redis": "0.11.7",
40
- "@alepha/react": "0.11.7",
41
- "@alepha/react-auth": "0.11.7",
42
- "@alepha/react-form": "0.11.7",
43
- "@alepha/react-head": "0.11.7",
44
- "@alepha/react-i18n": "0.11.7",
45
- "@alepha/redis": "0.11.7",
46
- "@alepha/retry": "0.11.7",
47
- "@alepha/router": "0.11.7",
48
- "@alepha/scheduler": "0.11.7",
49
- "@alepha/security": "0.11.7",
50
- "@alepha/server": "0.11.7",
51
- "@alepha/server-cache": "0.11.7",
52
- "@alepha/server-compress": "0.11.7",
53
- "@alepha/server-cookies": "0.11.7",
54
- "@alepha/server-cors": "0.11.7",
55
- "@alepha/server-health": "0.11.7",
56
- "@alepha/server-helmet": "0.11.7",
57
- "@alepha/server-links": "0.11.7",
58
- "@alepha/server-metrics": "0.11.7",
59
- "@alepha/server-multipart": "0.11.7",
60
- "@alepha/server-proxy": "0.11.7",
61
- "@alepha/server-security": "0.11.7",
62
- "@alepha/server-static": "0.11.7",
63
- "@alepha/server-swagger": "0.11.7",
64
- "@alepha/topic": "0.11.7",
65
- "@alepha/topic-redis": "0.11.7",
66
- "@alepha/ui": "0.11.7",
67
- "@alepha/vite": "0.11.7",
68
- "react": "^19.2.0",
69
- "react-dom": "^19.2.0"
70
- },
71
- "scripts": {
72
- "build": "node build.ts"
73
- },
74
- "files": [
75
- "**/*.js",
76
- "**/*.cjs",
77
- "**/*.d.ts"
42
+ "keywords": [
43
+ "alepha"
78
44
  ],
45
+ "module": "./dist/index.js",
79
46
  "exports": {
80
47
  ".": {
81
- "import": "./core.js",
82
- "require": "./core.cjs",
83
- "types": "./core.d.ts"
84
- },
85
- "./api/files": {
86
- "import": "./api/files.js",
87
- "require": "./api/files.cjs",
88
- "types": "./api/files.d.ts"
89
- },
90
- "./api/jobs": {
91
- "import": "./api/jobs.js",
92
- "require": "./api/jobs.cjs",
93
- "types": "./api/jobs.d.ts"
94
- },
95
- "./api/notifications": {
96
- "import": "./api/notifications.js",
97
- "require": "./api/notifications.cjs",
98
- "types": "./api/notifications.d.ts"
99
- },
100
- "./api/users": {
101
- "import": "./api/users.js",
102
- "require": "./api/users.cjs",
103
- "types": "./api/users.d.ts"
104
- },
105
- "./api/verifications": {
106
- "import": "./api/verifications.js",
107
- "require": "./api/verifications.cjs",
108
- "types": "./api/verifications.d.ts"
109
- },
110
- "./batch": {
111
- "import": "./batch.js",
112
- "require": "./batch.cjs",
113
- "types": "./batch.d.ts"
114
- },
115
- "./bucket": {
116
- "import": "./bucket.js",
117
- "require": "./bucket.cjs",
118
- "types": "./bucket.d.ts"
119
- },
120
- "./cache": {
121
- "import": "./cache.js",
122
- "require": "./cache.cjs",
123
- "types": "./cache.d.ts"
124
- },
125
- "./cache/redis": {
126
- "import": "./cache/redis.js",
127
- "require": "./cache/redis.cjs",
128
- "types": "./cache/redis.d.ts"
129
- },
130
- "./command": {
131
- "import": "./command.js",
132
- "require": "./command.cjs",
133
- "types": "./command.d.ts"
134
- },
135
- "./core": {
136
- "import": "./core.js",
137
- "require": "./core.cjs",
138
- "types": "./core.d.ts"
139
- },
140
- "./datetime": {
141
- "import": "./datetime.js",
142
- "require": "./datetime.cjs",
143
- "types": "./datetime.d.ts"
144
- },
145
- "./devtools": {
146
- "import": "./devtools.js",
147
- "require": "./devtools.cjs",
148
- "types": "./devtools.d.ts"
149
- },
150
- "./email": {
151
- "import": "./email.js",
152
- "require": "./email.cjs",
153
- "types": "./email.d.ts"
154
- },
155
- "./fake": {
156
- "import": "./fake.js",
157
- "require": "./fake.cjs",
158
- "types": "./fake.d.ts"
159
- },
160
- "./file": {
161
- "import": "./file.js",
162
- "require": "./file.cjs",
163
- "types": "./file.d.ts"
164
- },
165
- "./lock": {
166
- "import": "./lock.js",
167
- "require": "./lock.cjs",
168
- "types": "./lock.d.ts"
169
- },
170
- "./lock/redis": {
171
- "import": "./lock/redis.js",
172
- "require": "./lock/redis.cjs",
173
- "types": "./lock/redis.d.ts"
174
- },
175
- "./logger": {
176
- "import": "./logger.js",
177
- "require": "./logger.cjs",
178
- "types": "./logger.d.ts"
179
- },
180
- "./postgres": {
181
- "import": "./postgres.js",
182
- "require": "./postgres.cjs",
183
- "types": "./postgres.d.ts"
184
- },
185
- "./queue": {
186
- "import": "./queue.js",
187
- "require": "./queue.cjs",
188
- "types": "./queue.d.ts"
189
- },
190
- "./queue/redis": {
191
- "import": "./queue/redis.js",
192
- "require": "./queue/redis.cjs",
193
- "types": "./queue/redis.d.ts"
194
- },
195
- "./react": {
196
- "import": "./react.js",
197
- "require": "./react.cjs",
198
- "types": "./react.d.ts"
199
- },
200
- "./react/auth": {
201
- "import": "./react/auth.js",
202
- "require": "./react/auth.cjs",
203
- "types": "./react/auth.d.ts"
204
- },
205
- "./react/form": {
206
- "import": "./react/form.js",
207
- "require": "./react/form.cjs",
208
- "types": "./react/form.d.ts"
209
- },
210
- "./react/head": {
211
- "import": "./react/head.js",
212
- "require": "./react/head.cjs",
213
- "types": "./react/head.d.ts"
214
- },
215
- "./react/i18n": {
216
- "import": "./react/i18n.js",
217
- "require": "./react/i18n.cjs",
218
- "types": "./react/i18n.d.ts"
219
- },
220
- "./redis": {
221
- "import": "./redis.js",
222
- "require": "./redis.cjs",
223
- "types": "./redis.d.ts"
224
- },
225
- "./retry": {
226
- "import": "./retry.js",
227
- "require": "./retry.cjs",
228
- "types": "./retry.d.ts"
229
- },
230
- "./router": {
231
- "import": "./router.js",
232
- "require": "./router.cjs",
233
- "types": "./router.d.ts"
234
- },
235
- "./scheduler": {
236
- "import": "./scheduler.js",
237
- "require": "./scheduler.cjs",
238
- "types": "./scheduler.d.ts"
239
- },
240
- "./security": {
241
- "import": "./security.js",
242
- "require": "./security.cjs",
243
- "types": "./security.d.ts"
244
- },
245
- "./server": {
246
- "import": "./server.js",
247
- "require": "./server.cjs",
248
- "types": "./server.d.ts"
249
- },
250
- "./server/cache": {
251
- "import": "./server/cache.js",
252
- "require": "./server/cache.cjs",
253
- "types": "./server/cache.d.ts"
254
- },
255
- "./server/compress": {
256
- "import": "./server/compress.js",
257
- "require": "./server/compress.cjs",
258
- "types": "./server/compress.d.ts"
259
- },
260
- "./server/cookies": {
261
- "import": "./server/cookies.js",
262
- "require": "./server/cookies.cjs",
263
- "types": "./server/cookies.d.ts"
264
- },
265
- "./server/cors": {
266
- "import": "./server/cors.js",
267
- "require": "./server/cors.cjs",
268
- "types": "./server/cors.d.ts"
269
- },
270
- "./server/health": {
271
- "import": "./server/health.js",
272
- "require": "./server/health.cjs",
273
- "types": "./server/health.d.ts"
274
- },
275
- "./server/helmet": {
276
- "import": "./server/helmet.js",
277
- "require": "./server/helmet.cjs",
278
- "types": "./server/helmet.d.ts"
279
- },
280
- "./server/links": {
281
- "import": "./server/links.js",
282
- "require": "./server/links.cjs",
283
- "types": "./server/links.d.ts"
284
- },
285
- "./server/metrics": {
286
- "import": "./server/metrics.js",
287
- "require": "./server/metrics.cjs",
288
- "types": "./server/metrics.d.ts"
289
- },
290
- "./server/multipart": {
291
- "import": "./server/multipart.js",
292
- "require": "./server/multipart.cjs",
293
- "types": "./server/multipart.d.ts"
294
- },
295
- "./server/proxy": {
296
- "import": "./server/proxy.js",
297
- "require": "./server/proxy.cjs",
298
- "types": "./server/proxy.d.ts"
299
- },
300
- "./server/security": {
301
- "import": "./server/security.js",
302
- "require": "./server/security.cjs",
303
- "types": "./server/security.d.ts"
304
- },
305
- "./server/static": {
306
- "import": "./server/static.js",
307
- "require": "./server/static.cjs",
308
- "types": "./server/static.d.ts"
309
- },
310
- "./server/swagger": {
311
- "import": "./server/swagger.js",
312
- "require": "./server/swagger.cjs",
313
- "types": "./server/swagger.d.ts"
314
- },
315
- "./topic": {
316
- "import": "./topic.js",
317
- "require": "./topic.cjs",
318
- "types": "./topic.d.ts"
319
- },
320
- "./topic/redis": {
321
- "import": "./topic/redis.js",
322
- "require": "./topic/redis.cjs",
323
- "types": "./topic/redis.d.ts"
324
- },
325
- "./ui": {
326
- "import": "./ui.js",
327
- "require": "./ui.cjs",
328
- "types": "./ui.d.ts"
329
- },
330
- "./vite": {
331
- "import": "./vite.js",
332
- "require": "./vite.cjs",
333
- "types": "./vite.d.ts"
48
+ "types": "./dist/index.d.ts",
49
+ "import": "./dist/index.js",
50
+ "require": "./dist/index.cjs"
334
51
  }
335
- },
336
- "keywords": [
337
- "alepha",
338
- "api-files",
339
- "api-jobs",
340
- "api-notifications",
341
- "api-users",
342
- "api-verifications",
343
- "batch",
344
- "bucket",
345
- "cache",
346
- "cache-redis",
347
- "command",
348
- "core",
349
- "datetime",
350
- "devtools",
351
- "email",
352
- "fake",
353
- "file",
354
- "lock",
355
- "lock-redis",
356
- "logger",
357
- "postgres",
358
- "queue",
359
- "queue-redis",
360
- "react",
361
- "react-auth",
362
- "react-form",
363
- "react-head",
364
- "react-i18n",
365
- "redis",
366
- "retry",
367
- "router",
368
- "scheduler",
369
- "security",
370
- "server",
371
- "server-cache",
372
- "server-compress",
373
- "server-cookies",
374
- "server-cors",
375
- "server-health",
376
- "server-helmet",
377
- "server-links",
378
- "server-metrics",
379
- "server-multipart",
380
- "server-proxy",
381
- "server-security",
382
- "server-static",
383
- "server-swagger",
384
- "topic",
385
- "topic-redis",
386
- "ui",
387
- "vite"
388
- ]
52
+ }
389
53
  }
@@ -0,0 +1,33 @@
1
+ export const biomeJson = `
2
+ {
3
+ "$schema": "https://biomejs.dev/schemas/latest/schema.json",
4
+ "vcs": {
5
+ "enabled": true,
6
+ "clientKind": "git"
7
+ },
8
+ "files": {
9
+ "ignoreUnknown": true,
10
+ "includes": ["**", "!node_modules", "!dist"]
11
+ },
12
+ "formatter": {
13
+ "enabled": true,
14
+ "indentStyle": "space"
15
+ },
16
+ "linter": {
17
+ "enabled": true,
18
+ "rules": {
19
+ "recommended": true
20
+ },
21
+ "domains": {
22
+ "react": "recommended"
23
+ }
24
+ },
25
+ "assist": {
26
+ "actions": {
27
+ "source": {
28
+ "organizeImports": "on"
29
+ }
30
+ }
31
+ }
32
+ }
33
+ `.trim()
@@ -0,0 +1,17 @@
1
+ export const tsconfigJson = `
2
+ {
3
+ "compilerOptions": {
4
+ "module": "nodenext",
5
+ "target": "esnext",
6
+ "strict": true,
7
+ "jsx": "react-jsx",
8
+ "verbatimModuleSyntax": true,
9
+ "isolatedModules": true,
10
+ "moduleDetection": "force",
11
+ "skipLibCheck": true,
12
+ "resolveJsonModule": true,
13
+ "allowImportingTsExtensions": true
14
+ },
15
+ "exclude": ["node_modules", "dist"]
16
+ }
17
+ `.trim();
@@ -0,0 +1,14 @@
1
+ export const viteConfigTs = (
2
+ serverEntry?: string,
3
+ ) => `
4
+ import { viteAlepha } from "@alepha/vite";
5
+
6
+ export default {
7
+ plugins: [
8
+ viteAlepha(${serverEntry ? `{ serverEntry: "${serverEntry}" }` : ""}),
9
+ ],
10
+ test: {
11
+ globals: true,
12
+ },
13
+ };
14
+ `.trim()
@@ -0,0 +1,60 @@
1
+ import { access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { $command } from "@alepha/command";
4
+ import { $inject, t } from "@alepha/core";
5
+ import { $logger } from "@alepha/logger";
6
+ import { biomeJson } from "../assets/biomeJson.ts";
7
+ import { ProcessRunner } from "../services/ProcessRunner.ts";
8
+
9
+ export class BiomeCommands {
10
+ protected readonly log = $logger();
11
+ protected readonly runner = $inject(ProcessRunner);
12
+ protected readonly biomeFlags = t.object({
13
+ config: t.optional(
14
+ t.text({
15
+ aliases: ["c"],
16
+ }),
17
+ ),
18
+ });
19
+
20
+ public readonly format = $command({
21
+ name: "format",
22
+ description: "Format the codebase using Biome",
23
+ flags: this.biomeFlags,
24
+ handler: async ({ flags }) => {
25
+ const configPath = await this.configPath(flags.config);
26
+ await this.runner.exec(`biome format --fix --config-path=${configPath}`);
27
+ },
28
+ });
29
+
30
+ public readonly lint = $command({
31
+ name: "lint",
32
+ description: "Run linter across the codebase using Biome",
33
+ flags: this.biomeFlags,
34
+ handler: async ({ flags }) => {
35
+ const configPath = await this.configPath(flags.config);
36
+ await this.runner.exec(
37
+ `biome check --formatter-enabled=false --fix --config-path=${configPath}`,
38
+ );
39
+ },
40
+ });
41
+
42
+ protected async configPath(maybePath?: string): Promise<string> {
43
+ const root = process.cwd();
44
+ if (maybePath) {
45
+ try {
46
+ const path = join(root, maybePath);
47
+ await access(path);
48
+ return path;
49
+ } catch {}
50
+ }
51
+
52
+ try {
53
+ const path = join(root, "biome.json");
54
+ await access(path);
55
+ return path;
56
+ } catch {
57
+ return await this.runner.writeConfigFile("biome.json", biomeJson);
58
+ }
59
+ }
60
+ }