alepha 0.21.2 → 0.23.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 (519) hide show
  1. package/README.md +0 -1
  2. package/dist/api/audits/index.browser.js.map +1 -1
  3. package/dist/api/audits/index.d.ts +393 -403
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/audits/index.js +25 -56
  6. package/dist/api/audits/index.js.map +1 -1
  7. package/dist/api/files/index.browser.js +31 -1
  8. package/dist/api/files/index.browser.js.map +1 -1
  9. package/dist/api/files/index.d.ts +313 -208
  10. package/dist/api/files/index.d.ts.map +1 -1
  11. package/dist/api/files/index.js +152 -42
  12. package/dist/api/files/index.js.map +1 -1
  13. package/dist/api/jobs/index.browser.js +2 -2
  14. package/dist/api/jobs/index.browser.js.map +1 -1
  15. package/dist/api/jobs/index.d.ts +282 -285
  16. package/dist/api/jobs/index.d.ts.map +1 -1
  17. package/dist/api/jobs/index.js +39 -33
  18. package/dist/api/jobs/index.js.map +1 -1
  19. package/dist/api/keys/index.d.ts +217 -222
  20. package/dist/api/keys/index.d.ts.map +1 -1
  21. package/dist/api/keys/index.js.map +1 -1
  22. package/dist/api/notifications/index.browser.js.map +1 -1
  23. package/dist/api/notifications/index.d.ts +188 -195
  24. package/dist/api/notifications/index.d.ts.map +1 -1
  25. package/dist/api/notifications/index.js.map +1 -1
  26. package/dist/api/oauth/index.d.ts +71 -76
  27. package/dist/api/oauth/index.d.ts.map +1 -1
  28. package/dist/api/oauth/index.js.map +1 -1
  29. package/dist/api/organizations/index.browser.js.map +1 -1
  30. package/dist/api/organizations/index.d.ts +104 -109
  31. package/dist/api/organizations/index.d.ts.map +1 -1
  32. package/dist/api/organizations/index.js.map +1 -1
  33. package/dist/api/parameters/index.browser.js +43 -16
  34. package/dist/api/parameters/index.browser.js.map +1 -1
  35. package/dist/api/parameters/index.d.ts +488 -344
  36. package/dist/api/parameters/index.d.ts.map +1 -1
  37. package/dist/api/parameters/index.js +175 -35
  38. package/dist/api/parameters/index.js.map +1 -1
  39. package/dist/api/payments/index.d.ts +396 -402
  40. package/dist/api/payments/index.d.ts.map +1 -1
  41. package/dist/api/payments/index.js.map +1 -1
  42. package/dist/api/subscriptions/index.d.ts +644 -652
  43. package/dist/api/subscriptions/index.d.ts.map +1 -1
  44. package/dist/api/subscriptions/index.js +1 -1
  45. package/dist/api/subscriptions/index.js.map +1 -1
  46. package/dist/api/users/index.browser.js +7 -0
  47. package/dist/api/users/index.browser.js.map +1 -1
  48. package/dist/api/users/index.d.ts +1106 -1005
  49. package/dist/api/users/index.d.ts.map +1 -1
  50. package/dist/api/users/index.js +307 -64
  51. package/dist/api/users/index.js.map +1 -1
  52. package/dist/api/verifications/index.browser.js.map +1 -1
  53. package/dist/api/verifications/index.d.ts +137 -143
  54. package/dist/api/verifications/index.d.ts.map +1 -1
  55. package/dist/api/verifications/index.js.map +1 -1
  56. package/dist/background/index.d.ts +95 -0
  57. package/dist/background/index.d.ts.map +1 -0
  58. package/dist/background/index.js +121 -0
  59. package/dist/background/index.js.map +1 -0
  60. package/dist/background/index.workerd.js +110 -0
  61. package/dist/background/index.workerd.js.map +1 -0
  62. package/dist/batch/index.d.ts +5 -7
  63. package/dist/batch/index.d.ts.map +1 -1
  64. package/dist/batch/index.js.map +1 -1
  65. package/dist/bin/index.js.map +1 -1
  66. package/dist/bucket/index.d.ts +76 -54
  67. package/dist/bucket/index.d.ts.map +1 -1
  68. package/dist/bucket/index.js +58 -11
  69. package/dist/bucket/index.js.map +1 -1
  70. package/dist/bucket/index.workerd.js +200 -5
  71. package/dist/bucket/index.workerd.js.map +1 -1
  72. package/dist/cache/core/index.d.ts +7 -10
  73. package/dist/cache/core/index.d.ts.map +1 -1
  74. package/dist/cache/core/index.js.map +1 -1
  75. package/dist/cache/core/index.workerd.js.map +1 -1
  76. package/dist/cache/database/index.d.ts +22 -26
  77. package/dist/cache/database/index.d.ts.map +1 -1
  78. package/dist/cache/database/index.js.map +1 -1
  79. package/dist/cache/redis/index.d.ts +4 -7
  80. package/dist/cache/redis/index.d.ts.map +1 -1
  81. package/dist/cache/redis/index.js.map +1 -1
  82. package/dist/captcha/index.d.ts +3 -6
  83. package/dist/captcha/index.d.ts.map +1 -1
  84. package/dist/captcha/index.js.map +1 -1
  85. package/dist/cli/config/index.d.ts.map +1 -1
  86. package/dist/cli/config/index.js.map +1 -1
  87. package/dist/cli/core/index.d.ts +458 -249
  88. package/dist/cli/core/index.d.ts.map +1 -1
  89. package/dist/cli/core/index.js +372 -660
  90. package/dist/cli/core/index.js.map +1 -1
  91. package/dist/cli/devtools/index.d.ts +3 -5
  92. package/dist/cli/devtools/index.d.ts.map +1 -1
  93. package/dist/cli/devtools/index.js.map +1 -1
  94. package/dist/cli/i18n/index.d.ts +20 -17
  95. package/dist/cli/i18n/index.d.ts.map +1 -1
  96. package/dist/cli/i18n/index.js +45 -11
  97. package/dist/cli/i18n/index.js.map +1 -1
  98. package/dist/cli/platform/index.d.ts +126 -1342
  99. package/dist/cli/platform/index.d.ts.map +1 -1
  100. package/dist/cli/platform/index.js +136 -2374
  101. package/dist/cli/platform/index.js.map +1 -1
  102. package/dist/cli/platform-lib/index.d.ts +1472 -0
  103. package/dist/cli/platform-lib/index.d.ts.map +1 -0
  104. package/dist/cli/platform-lib/index.js +2660 -0
  105. package/dist/cli/platform-lib/index.js.map +1 -0
  106. package/dist/cli/vendor/index.d.ts +17 -21
  107. package/dist/cli/vendor/index.d.ts.map +1 -1
  108. package/dist/cli/vendor/index.js.map +1 -1
  109. package/dist/command/index.d.ts +20 -19
  110. package/dist/command/index.d.ts.map +1 -1
  111. package/dist/command/index.js +39 -10
  112. package/dist/command/index.js.map +1 -1
  113. package/dist/{containers → container}/core/index.d.ts +13 -15
  114. package/dist/container/core/index.d.ts.map +1 -0
  115. package/dist/{containers → container}/core/index.js +23 -14
  116. package/dist/container/core/index.js.map +1 -0
  117. package/dist/{containers → container}/core/index.workerd.js +37 -22
  118. package/dist/container/core/index.workerd.js.map +1 -0
  119. package/dist/core/index.browser.js +27 -1
  120. package/dist/core/index.browser.js.map +1 -1
  121. package/dist/core/index.d.ts +48 -24
  122. package/dist/core/index.d.ts.map +1 -1
  123. package/dist/core/index.js +27 -1
  124. package/dist/core/index.js.map +1 -1
  125. package/dist/core/index.native.js +27 -1
  126. package/dist/core/index.native.js.map +1 -1
  127. package/dist/core/index.workerd.js +27 -1
  128. package/dist/core/index.workerd.js.map +1 -1
  129. package/dist/crypto/index.browser.js.map +1 -1
  130. package/dist/crypto/index.d.ts +5 -8
  131. package/dist/crypto/index.d.ts.map +1 -1
  132. package/dist/crypto/index.js.map +1 -1
  133. package/dist/datetime/index.d.ts +3 -4
  134. package/dist/datetime/index.d.ts.map +1 -1
  135. package/dist/datetime/index.js.map +1 -1
  136. package/dist/email/brevo/index.d.ts +2 -4
  137. package/dist/email/brevo/index.d.ts.map +1 -1
  138. package/dist/email/brevo/index.js.map +1 -1
  139. package/dist/email/cloudflare/index.d.ts +20 -7
  140. package/dist/email/cloudflare/index.d.ts.map +1 -1
  141. package/dist/email/cloudflare/index.js +46 -9
  142. package/dist/email/cloudflare/index.js.map +1 -1
  143. package/dist/email/core/index.d.ts +6 -9
  144. package/dist/email/core/index.d.ts.map +1 -1
  145. package/dist/email/core/index.js.map +1 -1
  146. package/dist/email/core/index.workerd.js.map +1 -1
  147. package/dist/email/smtp/index.d.ts +10 -13
  148. package/dist/email/smtp/index.d.ts.map +1 -1
  149. package/dist/email/smtp/index.js +107 -32
  150. package/dist/email/smtp/index.js.map +1 -1
  151. package/dist/fake/index.d.ts +1 -2
  152. package/dist/fake/index.d.ts.map +1 -1
  153. package/dist/fake/index.js.map +1 -1
  154. package/dist/lock/core/index.d.ts +9 -14
  155. package/dist/lock/core/index.d.ts.map +1 -1
  156. package/dist/lock/core/index.js.map +1 -1
  157. package/dist/lock/redis/index.d.ts +2 -4
  158. package/dist/lock/redis/index.d.ts.map +1 -1
  159. package/dist/lock/redis/index.js.map +1 -1
  160. package/dist/logger/index.d.ts +105 -76
  161. package/dist/logger/index.d.ts.map +1 -1
  162. package/dist/logger/index.js +196 -174
  163. package/dist/logger/index.js.map +1 -1
  164. package/dist/mcp/index.d.ts +25 -20
  165. package/dist/mcp/index.d.ts.map +1 -1
  166. package/dist/mcp/index.js +23 -0
  167. package/dist/mcp/index.js.map +1 -1
  168. package/dist/orm/core/index.browser.js.map +1 -1
  169. package/dist/orm/core/index.bun.js +19 -1
  170. package/dist/orm/core/index.bun.js.map +1 -1
  171. package/dist/orm/core/index.d.ts +76 -62
  172. package/dist/orm/core/index.d.ts.map +1 -1
  173. package/dist/orm/core/index.js +20 -2
  174. package/dist/orm/core/index.js.map +1 -1
  175. package/dist/orm/postgres/index.bun.js.map +1 -1
  176. package/dist/orm/postgres/index.d.ts +28 -20
  177. package/dist/orm/postgres/index.d.ts.map +1 -1
  178. package/dist/orm/postgres/index.js.map +1 -1
  179. package/dist/queue/core/index.d.ts +12 -15
  180. package/dist/queue/core/index.d.ts.map +1 -1
  181. package/dist/queue/core/index.js.map +1 -1
  182. package/dist/queue/core/index.workerd.js.map +1 -1
  183. package/dist/queue/redis/index.d.ts +3 -5
  184. package/dist/queue/redis/index.d.ts.map +1 -1
  185. package/dist/queue/redis/index.js.map +1 -1
  186. package/dist/react/auth/index.browser.js +9 -2
  187. package/dist/react/auth/index.browser.js.map +1 -1
  188. package/dist/react/auth/index.d.ts +14 -9
  189. package/dist/react/auth/index.d.ts.map +1 -1
  190. package/dist/react/auth/index.js +9 -2
  191. package/dist/react/auth/index.js.map +1 -1
  192. package/dist/react/core/index.d.ts +7 -8
  193. package/dist/react/core/index.d.ts.map +1 -1
  194. package/dist/react/core/index.js +6 -3
  195. package/dist/react/core/index.js.map +1 -1
  196. package/dist/react/form/index.d.ts +2 -5
  197. package/dist/react/form/index.d.ts.map +1 -1
  198. package/dist/react/form/index.js +16 -15
  199. package/dist/react/form/index.js.map +1 -1
  200. package/dist/react/head/index.browser.js.map +1 -1
  201. package/dist/react/head/index.d.ts +2 -4
  202. package/dist/react/head/index.d.ts.map +1 -1
  203. package/dist/react/head/index.js.map +1 -1
  204. package/dist/react/i18n/index.d.ts +90 -11
  205. package/dist/react/i18n/index.d.ts.map +1 -1
  206. package/dist/react/i18n/index.js +147 -11
  207. package/dist/react/i18n/index.js.map +1 -1
  208. package/dist/react/intro/index.d.ts +1 -2
  209. package/dist/react/intro/index.d.ts.map +1 -1
  210. package/dist/react/intro/index.js +2 -2
  211. package/dist/react/intro/index.js.map +1 -1
  212. package/dist/react/router/index.browser.js +193 -24
  213. package/dist/react/router/index.browser.js.map +1 -1
  214. package/dist/react/router/index.d.ts +434 -222
  215. package/dist/react/router/index.d.ts.map +1 -1
  216. package/dist/react/router/index.js +249 -35
  217. package/dist/react/router/index.js.map +1 -1
  218. package/dist/react/sitemap/index.browser.js +35 -0
  219. package/dist/react/sitemap/index.browser.js.map +1 -0
  220. package/dist/react/sitemap/index.d.ts +92 -0
  221. package/dist/react/sitemap/index.d.ts.map +1 -0
  222. package/dist/react/sitemap/index.js +131 -0
  223. package/dist/react/sitemap/index.js.map +1 -0
  224. package/dist/react/testing/index.d.ts +1 -2
  225. package/dist/react/testing/index.d.ts.map +1 -1
  226. package/dist/react/testing/index.js +16 -17
  227. package/dist/react/testing/index.js.map +1 -1
  228. package/dist/react/ui/index.d.ts +20 -25
  229. package/dist/react/ui/index.d.ts.map +1 -1
  230. package/dist/react/ui/index.js.map +1 -1
  231. package/dist/redis/index.bun.js.map +1 -1
  232. package/dist/redis/index.d.ts +17 -19
  233. package/dist/redis/index.d.ts.map +1 -1
  234. package/dist/redis/index.js.map +1 -1
  235. package/dist/retry/index.d.ts +2 -4
  236. package/dist/retry/index.d.ts.map +1 -1
  237. package/dist/retry/index.js.map +1 -1
  238. package/dist/router/index.d.ts.map +1 -1
  239. package/dist/router/index.js.map +1 -1
  240. package/dist/scheduler/index.d.ts +10 -13
  241. package/dist/scheduler/index.d.ts.map +1 -1
  242. package/dist/scheduler/index.js.map +1 -1
  243. package/dist/scheduler/index.workerd.js.map +1 -1
  244. package/dist/security/index.browser.js.map +1 -1
  245. package/dist/security/index.d.ts +45 -48
  246. package/dist/security/index.d.ts.map +1 -1
  247. package/dist/security/index.js.map +1 -1
  248. package/dist/server/auth/index.browser.js.map +1 -1
  249. package/dist/server/auth/index.d.ts +272 -173
  250. package/dist/server/auth/index.d.ts.map +1 -1
  251. package/dist/server/auth/index.js +1608 -15
  252. package/dist/server/auth/index.js.map +1 -1
  253. package/dist/server/cookies/index.browser.js.map +1 -1
  254. package/dist/server/cookies/index.d.ts +20 -7
  255. package/dist/server/cookies/index.d.ts.map +1 -1
  256. package/dist/server/cookies/index.js +22 -3
  257. package/dist/server/cookies/index.js.map +1 -1
  258. package/dist/server/core/index.browser.js.map +1 -1
  259. package/dist/server/core/index.d.ts +106 -73
  260. package/dist/server/core/index.d.ts.map +1 -1
  261. package/dist/server/core/index.js +44 -0
  262. package/dist/server/core/index.js.map +1 -1
  263. package/dist/server/cors/index.d.ts +11 -14
  264. package/dist/server/cors/index.d.ts.map +1 -1
  265. package/dist/server/cors/index.js.map +1 -1
  266. package/dist/server/etag/index.d.ts +6 -9
  267. package/dist/server/etag/index.d.ts.map +1 -1
  268. package/dist/server/etag/index.js.map +1 -1
  269. package/dist/server/health/index.d.ts +18 -21
  270. package/dist/server/health/index.d.ts.map +1 -1
  271. package/dist/server/health/index.js.map +1 -1
  272. package/dist/server/links/index.browser.js +2 -0
  273. package/dist/server/links/index.browser.js.map +1 -1
  274. package/dist/server/links/index.d.ts +63 -67
  275. package/dist/server/links/index.d.ts.map +1 -1
  276. package/dist/server/links/index.js +2 -0
  277. package/dist/server/links/index.js.map +1 -1
  278. package/dist/server/metrics/index.d.ts +5 -7
  279. package/dist/server/metrics/index.d.ts.map +1 -1
  280. package/dist/server/metrics/index.js.map +1 -1
  281. package/dist/server/proxy/index.d.ts +3 -5
  282. package/dist/server/proxy/index.d.ts.map +1 -1
  283. package/dist/server/proxy/index.js.map +1 -1
  284. package/dist/server/rate-limit/index.d.ts +10 -13
  285. package/dist/server/rate-limit/index.d.ts.map +1 -1
  286. package/dist/server/rate-limit/index.js.map +1 -1
  287. package/dist/server/static/index.d.ts +3 -5
  288. package/dist/server/static/index.d.ts.map +1 -1
  289. package/dist/server/static/index.js.map +1 -1
  290. package/dist/server/swagger/index.d.ts +5 -8
  291. package/dist/server/swagger/index.d.ts.map +1 -1
  292. package/dist/server/swagger/index.js.map +1 -1
  293. package/dist/sms/index.d.ts +3 -5
  294. package/dist/sms/index.d.ts.map +1 -1
  295. package/dist/sms/index.js.map +1 -1
  296. package/dist/system/index.browser.js.map +1 -1
  297. package/dist/system/index.d.ts +2 -4
  298. package/dist/system/index.d.ts.map +1 -1
  299. package/dist/system/index.js.map +1 -1
  300. package/dist/system/index.workerd.js.map +1 -1
  301. package/dist/topic/core/index.d.ts +4 -6
  302. package/dist/topic/core/index.d.ts.map +1 -1
  303. package/dist/topic/core/index.js.map +1 -1
  304. package/dist/topic/redis/index.d.ts +5 -8
  305. package/dist/topic/redis/index.d.ts.map +1 -1
  306. package/dist/topic/redis/index.js.map +1 -1
  307. package/package.json +59 -23
  308. package/src/api/audits/__tests__/AuditService.spec.ts +18 -110
  309. package/src/api/audits/controllers/AdminAuditController.ts +14 -0
  310. package/src/api/audits/services/AuditService.ts +21 -88
  311. package/src/api/files/__tests__/FileService.spec.ts +207 -2
  312. package/src/api/files/index.ts +3 -0
  313. package/src/api/files/schemas/fileCreatorSummarySchema.ts +22 -0
  314. package/src/api/files/schemas/fileResourceSchema.ts +10 -1
  315. package/src/api/files/services/FileService.ts +170 -72
  316. package/src/api/jobs/__tests__/$job.spec.ts +24 -1
  317. package/src/api/jobs/index.ts +4 -3
  318. package/src/api/jobs/primitives/$job.ts +7 -3
  319. package/src/api/jobs/providers/DirectJobDispatcher.ts +17 -36
  320. package/src/api/jobs/providers/JobProvider.ts +53 -24
  321. package/src/api/jobs/schemas/jobConfigAtom.ts +1 -1
  322. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +4 -1
  323. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +3 -1
  324. package/src/api/parameters/__tests__/$parameter.spec.ts +19 -2
  325. package/src/api/parameters/audits/ParameterAudits.ts +17 -0
  326. package/src/api/parameters/controllers/AdminParameterController.ts +95 -19
  327. package/src/api/parameters/index.ts +3 -0
  328. package/src/api/parameters/schemas/activateParameterBodySchema.ts +3 -3
  329. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +3 -2
  330. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +25 -0
  331. package/src/api/parameters/schemas/parameterResponseSchema.ts +5 -0
  332. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +4 -2
  333. package/src/api/parameters/services/ParameterProvider.ts +69 -6
  334. package/src/api/subscriptions/jobs/SubscriptionJobs.ts +1 -1
  335. package/src/api/users/__tests__/AdminSessionController.spec.ts +37 -0
  336. package/src/api/users/audits/SessionAudits.ts +33 -0
  337. package/src/api/users/audits/UserAudits.ts +19 -43
  338. package/src/api/users/controllers/AdminUserController.ts +66 -1
  339. package/src/api/users/controllers/RealmController.ts +1 -0
  340. package/src/api/users/entities/sessions.ts +6 -0
  341. package/src/api/users/entities/users.ts +2 -0
  342. package/src/api/users/index.ts +9 -1
  343. package/src/api/users/primitives/$realm.ts +29 -0
  344. package/src/api/users/providers/RealmProvider.ts +15 -0
  345. package/src/api/users/schemas/realmConfigSchema.ts +14 -0
  346. package/src/api/users/schemas/sessionResourceSchema.ts +16 -0
  347. package/src/api/users/schemas/updateUserSchema.ts +1 -8
  348. package/src/api/users/schemas/userQuerySchema.ts +7 -0
  349. package/src/api/users/services/CredentialService.ts +15 -6
  350. package/src/api/users/services/IdentityService.ts +2 -1
  351. package/src/api/users/services/RegistrationService.ts +2 -1
  352. package/src/api/users/services/SessionCrudService.ts +19 -2
  353. package/src/api/users/services/SessionService.ts +39 -19
  354. package/src/api/users/services/UserService.ts +106 -8
  355. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +96 -0
  356. package/src/background/index.ts +37 -0
  357. package/src/background/index.workerd.ts +28 -0
  358. package/src/background/providers/BackgroundTaskProvider.ts +70 -0
  359. package/src/background/providers/WorkerdBackgroundTaskProvider.ts +43 -0
  360. package/src/bucket/__tests__/$bucket.spec.ts +18 -0
  361. package/src/bucket/__tests__/LocalFileStorageProvider.spec.ts +5 -0
  362. package/src/bucket/__tests__/MemoryFileStorageProvider.spec.ts +5 -0
  363. package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +23 -4
  364. package/src/bucket/__tests__/shared.ts +30 -0
  365. package/src/bucket/index.ts +5 -5
  366. package/src/bucket/index.workerd.ts +11 -4
  367. package/src/bucket/primitives/$bucket.ts +27 -0
  368. package/src/bucket/providers/FileStorageProvider.ts +13 -0
  369. package/src/bucket/providers/LocalFileStorageProvider.ts +17 -1
  370. package/src/bucket/providers/MemoryFileStorageProvider.ts +7 -0
  371. package/src/bucket/providers/{CloudflareR2Provider.ts → R2FileStorageProvider.ts} +10 -1
  372. package/src/bucket/providers/{NodeS3BucketProvider.ts → S3FileStorageProvider.ts} +27 -5
  373. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +25 -1
  374. package/src/cli/core/__tests__/init.spec.ts +0 -219
  375. package/src/cli/core/atoms/buildOptions.ts +0 -12
  376. package/src/cli/core/commands/__tests__/BuildCommand.spec.ts +43 -0
  377. package/src/cli/core/commands/build.ts +105 -37
  378. package/src/cli/core/commands/init.ts +0 -12
  379. package/src/cli/core/commands/pack.ts +133 -0
  380. package/src/cli/core/index.ts +3 -3
  381. package/src/cli/core/providers/ViteDevServerProvider.ts +40 -16
  382. package/src/cli/core/services/PackageManagerUtils.ts +0 -16
  383. package/src/cli/core/services/ProjectScaffolder.ts +29 -291
  384. package/src/cli/core/tasks/BuildCloudflareTask.ts +382 -56
  385. package/src/cli/core/tasks/BuildDockerTask.ts +33 -3
  386. package/src/cli/core/tasks/BuildPrerenderTask.ts +44 -7
  387. package/src/cli/core/tasks/BuildTask.ts +34 -0
  388. package/src/cli/core/templates/apiIndexTs.ts +1 -22
  389. package/src/cli/core/templates/mainCss.ts +0 -1
  390. package/src/cli/core/templates/webAppRouterTs.ts +0 -99
  391. package/src/cli/core/templates/webIndexTs.ts +1 -22
  392. package/src/cli/i18n/__tests__/I18nCheckService.spec.ts +48 -0
  393. package/src/cli/i18n/services/I18nCheckService.ts +65 -11
  394. package/src/cli/platform/__tests__/SecretsCommand.spec.ts +5 -3
  395. package/src/cli/platform/commands/SecretsCommand.ts +8 -6
  396. package/src/cli/platform/commands/platform.ts +192 -46
  397. package/src/cli/platform/index.ts +12 -52
  398. package/src/cli/{platform → platform-lib}/__tests__/CloudflareAdapter.spec.ts +426 -169
  399. package/src/cli/{platform → platform-lib}/__tests__/NamingService.spec.ts +91 -4
  400. package/src/cli/{platform → platform-lib}/__tests__/VercelAdapter.spec.ts +56 -85
  401. package/src/cli/{platform → platform-lib}/adapters/CloudflareAdapter.ts +519 -190
  402. package/src/cli/{platform → platform-lib}/adapters/PlatformAdapter.ts +62 -35
  403. package/src/cli/{platform → platform-lib}/adapters/VercelAdapter.ts +6 -10
  404. package/src/cli/{platform → platform-lib}/atoms/platformOptions.ts +34 -1
  405. package/src/cli/platform-lib/index.ts +67 -0
  406. package/src/cli/platform-lib/services/NamingService.ts +136 -0
  407. package/src/cli/{platform → platform-lib}/services/PlatformInspector.ts +60 -13
  408. package/src/cli/{platform → platform-lib}/services/PlatformOrchestrator.ts +54 -43
  409. package/src/cli/{platform → platform-lib}/services/WranglerApi.ts +4 -2
  410. package/src/command/__tests__/Runner.spec.ts +20 -0
  411. package/src/command/helpers/EnvUtils.ts +19 -3
  412. package/src/command/helpers/Runner.ts +12 -2
  413. package/src/command/providers/CliProvider.ts +34 -1
  414. package/src/{containers → container}/core/__tests__/$container.spec.ts +5 -5
  415. package/src/{containers → container}/core/index.ts +4 -4
  416. package/src/{containers → container}/core/index.workerd.ts +19 -3
  417. package/src/{containers → container}/core/primitives/$container.ts +1 -1
  418. package/src/{containers → container}/core/providers/CloudflareContainerProvider.ts +17 -19
  419. package/src/{containers → container}/core/providers/ContainerProvider.ts +16 -2
  420. package/src/{containers → container}/core/providers/MockContainerProvider.ts +1 -1
  421. package/src/core/Alepha.ts +49 -1
  422. package/src/core/__tests__/$env.spec.ts +42 -0
  423. package/src/core/__tests__/dump.spec.ts +47 -0
  424. package/src/email/cloudflare/__tests__/CloudflareEmailProvider.spec.ts +42 -10
  425. package/src/email/cloudflare/index.ts +14 -5
  426. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +54 -9
  427. package/src/logger/__tests__/Logger.spec.ts +55 -0
  428. package/src/logger/index.ts +13 -0
  429. package/src/logger/services/Logger.ts +31 -1
  430. package/src/mcp/__tests__/McpServerProvider.spec.ts +71 -0
  431. package/src/mcp/providers/McpServerProvider.ts +55 -0
  432. package/src/orm/__tests__/orm-showcase-tests.ts +27 -0
  433. package/src/orm/__tests__/orm-showcase.spec.ts +12 -0
  434. package/src/orm/core/interfaces/PgQuery.ts +4 -1
  435. package/src/orm/core/services/Repository.ts +27 -11
  436. package/src/react/auth/hooks/useAuth.ts +10 -5
  437. package/src/react/core/__tests__/useQuery.browser.spec.tsx +25 -0
  438. package/src/react/core/hooks/useAction.ts +14 -3
  439. package/src/react/core/hooks/useQuery.ts +24 -4
  440. package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +71 -0
  441. package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +96 -0
  442. package/src/react/form/services/FormModel.ts +57 -39
  443. package/src/react/i18n/__tests__/I18nProvider.spec.ts +89 -0
  444. package/src/react/i18n/__tests__/locale-routing.spec.ts +107 -0
  445. package/src/react/i18n/components/Translate.tsx +47 -0
  446. package/src/react/i18n/index.ts +2 -0
  447. package/src/react/i18n/providers/I18nProvider.ts +171 -12
  448. package/src/react/intro/components/GettingStartedAdminSlide.tsx +2 -2
  449. package/src/react/router/__tests__/$page.spec.tsx +3 -2
  450. package/src/react/router/__tests__/RouterLocaleProvider.spec.ts +127 -0
  451. package/src/react/router/__tests__/page-can.spec.ts +18 -13
  452. package/src/react/router/hooks/useQueryParams.ts +114 -14
  453. package/src/react/router/index.browser.ts +4 -0
  454. package/src/react/router/index.shared.ts +1 -0
  455. package/src/react/router/index.ts +9 -0
  456. package/src/react/router/primitives/$page.ts +85 -4
  457. package/src/react/router/providers/ReactBrowserRouterProvider.ts +18 -8
  458. package/src/react/router/providers/ReactPageProvider.ts +12 -1
  459. package/src/react/router/providers/ReactServerProvider.ts +96 -14
  460. package/src/react/router/providers/RootComponentsProvider.ts +13 -0
  461. package/src/react/router/providers/RouterLocaleProvider.ts +125 -0
  462. package/src/react/router/providers/__tests__/RootComponentsProvider.spec.ts +15 -0
  463. package/src/react/router/providers/__tests__/rootComponents.ssr.browser.spec.tsx +67 -0
  464. package/src/react/sitemap/__tests__/$sitemap.spec.ts +131 -0
  465. package/src/react/sitemap/index.browser.ts +21 -0
  466. package/src/react/sitemap/index.ts +25 -0
  467. package/src/react/sitemap/primitives/$sitemap.browser.ts +26 -0
  468. package/src/react/sitemap/primitives/$sitemap.ts +196 -0
  469. package/src/react/ui/services/SchemaControl.ts +3 -4
  470. package/src/server/auth/__tests__/appleClientSecret.spec.ts +34 -0
  471. package/src/server/auth/__tests__/authFederationClient.spec.ts +40 -0
  472. package/src/server/auth/__tests__/federationAssertion.spec.ts +146 -0
  473. package/src/server/auth/__tests__/federationRedirectReplay.spec.ts +44 -0
  474. package/src/server/auth/helpers/appleClientSecret.ts +24 -0
  475. package/src/server/auth/helpers/federationAssertion.ts +74 -0
  476. package/src/server/auth/helpers/jtiReplayGuard.ts +41 -0
  477. package/src/server/auth/helpers/safeRedirectPath.ts +19 -0
  478. package/src/server/auth/index.ts +4 -0
  479. package/src/server/auth/primitives/$authFederationBroker.ts +273 -0
  480. package/src/server/auth/primitives/$authFederationClient.ts +89 -0
  481. package/src/server/auth/providers/ServerAuthProvider.ts +18 -4
  482. package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +70 -0
  483. package/src/server/cookies/providers/ServerCookiesProvider.ts +23 -3
  484. package/src/server/core/interfaces/ServerRequest.ts +8 -0
  485. package/src/server/core/primitives/$route.ts +27 -0
  486. package/src/server/core/providers/ServerMultipartProvider.ts +19 -0
  487. package/src/server/links/providers/LinkProvider.ts +10 -0
  488. package/dist/containers/core/index.d.ts.map +0 -1
  489. package/dist/containers/core/index.js.map +0 -1
  490. package/dist/containers/core/index.workerd.js.map +0 -1
  491. package/src/cli/core/tasks/BuildSitemapTask.ts +0 -130
  492. package/src/cli/core/templates/componentsJsonTs.ts +0 -39
  493. package/src/cli/core/templates/saasAdminLayoutTsx.ts +0 -77
  494. package/src/cli/core/templates/saasAdminPagesTsx.ts +0 -26
  495. package/src/cli/core/templates/saasAuthLayoutTsx.ts +0 -22
  496. package/src/cli/core/templates/saasAuthPagesTsx.ts +0 -62
  497. package/src/cli/core/templates/saasRealmProviderTs.ts +0 -52
  498. package/src/cli/platform/services/NamingService.ts +0 -54
  499. /package/dist/orm/core/{chunk-o8xxKEmq.js → chunk-B4FMCO8f.js} +0 -0
  500. /package/dist/react/testing/{chunk-6Ep1yQYe.js → chunk-BpyX8vjI.js} +0 -0
  501. /package/src/cli/{platform → platform-lib}/__tests__/GitHubSecretStore.spec.ts +0 -0
  502. /package/src/cli/{platform → platform-lib}/__tests__/PlatformCacheProvider.spec.ts +0 -0
  503. /package/src/cli/{platform → platform-lib}/__tests__/PlatformInspector.spec.ts +0 -0
  504. /package/src/cli/{platform → platform-lib}/__tests__/PlatformOrchestrator.spec.ts +0 -0
  505. /package/src/cli/{platform → platform-lib}/__tests__/SecretFilterService.spec.ts +0 -0
  506. /package/src/cli/{platform → platform-lib}/__tests__/detectResources.spec.ts +0 -0
  507. /package/src/cli/{platform → platform-lib}/providers/GitHubSecretStore.ts +0 -0
  508. /package/src/cli/{platform → platform-lib}/providers/MemorySecretStore.ts +0 -0
  509. /package/src/cli/{platform → platform-lib}/providers/PlatformCacheProvider.ts +0 -0
  510. /package/src/cli/{platform → platform-lib}/providers/SecretStoreProvider.ts +0 -0
  511. /package/src/cli/{platform → platform-lib}/schemas/cloudflare.ts +0 -0
  512. /package/src/cli/{platform → platform-lib}/schemas/platform.ts +0 -0
  513. /package/src/cli/{platform → platform-lib}/schemas/vercel.ts +0 -0
  514. /package/src/cli/{platform → platform-lib}/services/CloudflareApi.ts +0 -0
  515. /package/src/cli/{platform → platform-lib}/services/SecretFilterService.ts +0 -0
  516. /package/src/cli/{platform → platform-lib}/services/VercelApi.ts +0 -0
  517. /package/src/cli/{platform → platform-lib}/services/VercelCli.ts +0 -0
  518. /package/src/{containers → container}/core/interfaces/ContainerOptions.ts +0 -0
  519. /package/src/{containers → container}/core/providers/NodeContainerProvider.ts +0 -0
@@ -19,7 +19,6 @@ import { BuildDockerTask } from "../tasks/BuildDockerTask.ts";
19
19
  import { BuildPrerenderTask } from "../tasks/BuildPrerenderTask.ts";
20
20
  import { BuildPwaTask } from "../tasks/BuildPwaTask.ts";
21
21
  import { BuildServerTask } from "../tasks/BuildServerTask.ts";
22
- import { BuildSitemapTask } from "../tasks/BuildSitemapTask.ts";
23
22
  import { BuildStaticTask } from "../tasks/BuildStaticTask.ts";
24
23
  import type { BuildTaskContext } from "../tasks/BuildTask.ts";
25
24
  import { BuildVercelTask } from "../tasks/BuildVercelTask.ts";
@@ -43,7 +42,6 @@ export class BuildCommand {
43
42
  $inject(BuildClientTask),
44
43
  $inject(BuildServerTask),
45
44
  $inject(BuildAssetsTask),
46
- $inject(BuildSitemapTask),
47
45
  $inject(BuildPwaTask),
48
46
  $inject(BuildPrerenderTask),
49
47
  $inject(BuildVercelTask),
@@ -53,6 +51,29 @@ export class BuildCommand {
53
51
  $inject(BuildCompressTask),
54
52
  ];
55
53
 
54
+ /**
55
+ * Value aliases accepted for `--target`.
56
+ *
57
+ * These let the CLI accept short forms (e.g. `--target cf`) that are
58
+ * canonicalized to a real {@link BuildTarget} before they flow into the
59
+ * pipeline. The enum in `flags.target` must also list the alias so it
60
+ * passes schema validation.
61
+ */
62
+ protected readonly targetAliases: Record<string, BuildTarget> = {
63
+ cf: "cloudflare",
64
+ };
65
+
66
+ /**
67
+ * Canonicalize a raw `--target` value, mapping any known alias
68
+ * (e.g. `cf` → `cloudflare`) to its real {@link BuildTarget}.
69
+ */
70
+ protected resolveTarget(target: string | undefined): BuildTarget | undefined {
71
+ if (!target) {
72
+ return undefined;
73
+ }
74
+ return this.targetAliases[target] ?? (target as BuildTarget);
75
+ }
76
+
56
77
  /**
57
78
  * Resolve the effective runtime based on target and explicit runtime flag.
58
79
  *
@@ -99,9 +120,9 @@ export class BuildCommand {
99
120
  }),
100
121
  ),
101
122
  target: t.optional(
102
- t.enum(["bare", "docker", "vercel", "cloudflare", "static"], {
123
+ t.enum(["bare", "docker", "vercel", "cloudflare", "cf", "static"], {
103
124
  aliases: ["t"],
104
- description: "Deployment target",
125
+ description: "Deployment target (cf = cloudflare)",
105
126
  }),
106
127
  ),
107
128
  runtime: t.optional(
@@ -130,11 +151,6 @@ export class BuildCommand {
130
151
  "Skip the bundle steps (Vite client/server + asset compression). Only regenerates target-specific deploy config (e.g. wrangler.jsonc). Use when `dist/` is already built and you just need the config refreshed.",
131
152
  }),
132
153
  ),
133
- sitemap: t.optional(
134
- t.text({
135
- description: "Generate sitemap.xml with base URL",
136
- }),
137
- ),
138
154
  }),
139
155
  handler: async ({ flags, run, root }) => {
140
156
  process.env.NODE_ENV = "production";
@@ -152,24 +168,26 @@ export class BuildCommand {
152
168
  this.log.trace("Entry file found", { entry });
153
169
 
154
170
  // Resolve flags → mutate the atom (single source of truth)
155
- this.alepha.store.mut(buildOptions, (current) => ({
156
- ...current,
157
- stats: flags.stats ?? current.stats ?? false,
158
- target: flags.target ?? current.target,
159
- runtime: this.resolveRuntime(
160
- flags.target ?? current.target,
161
- flags.runtime ?? current.runtime,
162
- ),
163
- ...(flags.compile !== undefined && {
164
- docker: {
165
- ...current.docker,
166
- compile: flags.compile ? (current.docker?.compile ?? true) : false,
167
- },
168
- }),
169
- ...(flags.sitemap && {
170
- sitemap: { hostname: flags.sitemap },
171
- }),
172
- }));
171
+ this.alepha.store.mut(buildOptions, (current) => {
172
+ const target = this.resolveTarget(flags.target) ?? current.target;
173
+ return {
174
+ ...current,
175
+ stats: flags.stats ?? current.stats ?? false,
176
+ target,
177
+ runtime: this.resolveRuntime(
178
+ target,
179
+ flags.runtime ?? current.runtime,
180
+ ),
181
+ ...(flags.compile !== undefined && {
182
+ docker: {
183
+ ...current.docker,
184
+ compile: flags.compile
185
+ ? (current.docker?.compile ?? true)
186
+ : false,
187
+ },
188
+ }),
189
+ };
190
+ });
173
191
 
174
192
  const options = this.options;
175
193
 
@@ -211,28 +229,57 @@ export class BuildCommand {
211
229
  runtime: options.runtime,
212
230
  });
213
231
 
232
+ // Prebuilt + manifest fast-path: skip `analyze app` (which boots
233
+ // the workspace via Vite and requires its full node_modules tree).
234
+ // BuildCloudflareTask reads from `ctx.manifest` instead of from
235
+ // `ctx.alepha` in this mode. Falls back to the introspection path
236
+ // when no manifest is present (older artifacts).
237
+ let manifest: Awaited<ReturnType<typeof this.loadManifest>> = null;
238
+ if (flags.prebuilt) {
239
+ manifest = await this.loadManifest(root);
240
+ }
241
+
214
242
  let appAlepha: Alepha | undefined;
215
243
  let hasClient = false;
216
244
 
217
- await run({
218
- name: "analyze app",
219
- handler: async () => {
220
- appAlepha = await this.viteBuildProvider.init({ entry });
221
- hasClient = this.viteBuildProvider.hasClient();
222
- },
223
- });
245
+ if (!manifest) {
246
+ await run({
247
+ name: "analyze app",
248
+ handler: async () => {
249
+ appAlepha = await this.viteBuildProvider.init({ entry });
250
+ hasClient = this.viteBuildProvider.hasClient();
251
+ },
252
+ });
224
253
 
225
- if (!appAlepha) {
226
- throw new AlephaError("Alepha instance not found");
254
+ if (!appAlepha) {
255
+ throw new AlephaError("Alepha instance not found");
256
+ }
227
257
  }
228
258
 
259
+ // Read platformOptions from the CLI's Alepha instance — this is
260
+ // where alepha.config.ts wrote them during the configure hook.
261
+ // The workspace's appAlepha (from Vite) is a separate instance
262
+ // and doesn't have these. Captured here so BuildCloudflareTask
263
+ // can serialize them into dist/manifest.json without needing to
264
+ // re-load alepha.config.ts at deploy time.
265
+ const platformOptions =
266
+ (this.alepha.store.get("alepha.cli.platform.options") as
267
+ | BuildTaskContext["platformOptions"]
268
+ | undefined) ?? null;
269
+
229
270
  const ctx: BuildTaskContext = {
230
- alepha: appAlepha,
271
+ // Cast: when manifest mode is active, BuildCloudflareTask reads
272
+ // from ctx.manifest and never dereferences ctx.alepha. Bundle
273
+ // tasks (BuildClient/Server/etc.) self-guard on ctx.flags.prebuilt
274
+ // and return early, so they don't touch alepha either.
275
+ alepha: (appAlepha ?? null) as unknown as Alepha,
231
276
  options,
232
277
  root,
233
278
  run,
234
279
  entry,
235
280
  hasClient,
281
+ manifest,
282
+ platformOptions,
236
283
  flags: { image: flags.image, prebuilt: flags.prebuilt },
237
284
  };
238
285
 
@@ -241,4 +288,25 @@ export class BuildCommand {
241
288
  }
242
289
  },
243
290
  });
291
+
292
+ /**
293
+ * Read `dist/manifest.json` produced by a previous `alepha build`.
294
+ * Returns null when absent or unparseable — caller falls back to the
295
+ * Vite-introspection path.
296
+ */
297
+ protected async loadManifest(root: string) {
298
+ try {
299
+ const fs = await import("node:fs/promises");
300
+ const path = await import("node:path");
301
+ const raw = await fs.readFile(
302
+ path.join(root, "dist", "manifest.json"),
303
+ "utf-8",
304
+ );
305
+ return JSON.parse(
306
+ raw,
307
+ ) as import("../tasks/BuildCloudflareTask.ts").BuildManifest;
308
+ } catch {
309
+ return null;
310
+ }
311
+ }
244
312
  }
@@ -42,18 +42,6 @@ export class InitCommand {
42
42
  description: "Include Tailwind CSS with Vite plugin. Implies --react",
43
43
  }),
44
44
  ),
45
- shadcn: t.optional(
46
- t.union([t.boolean(), t.text()], {
47
- description:
48
- "Set up shadcn/ui (components.json, cn helper, theme tokens, alepha registry). Pass an optional preset id (default: b0). Implies --react and --tailwind",
49
- }),
50
- ),
51
- saas: t.optional(
52
- t.union([t.boolean(), t.text()], {
53
- description:
54
- "Scaffold a SaaS starter: auth (login/register/reset/verify) + admin panel (/admin AppShell with users/sessions/api-keys/parameters/audits). Pass an optional preset id (default: b0). Implies --shadcn and --api",
55
- }),
56
- ),
57
45
  force: t.optional(
58
46
  t.boolean({
59
47
  aliases: ["f"],
@@ -0,0 +1,133 @@
1
+ import { $inject, AlephaError, t } from "alepha";
2
+ import { $command } from "alepha/command";
3
+ import { $logger } from "alepha/logger";
4
+ import { FileSystemProvider, ShellProvider } from "alepha/system";
5
+
6
+ /**
7
+ * Pack the workspace into a deployable `tar.gz`.
8
+ *
9
+ * The tar contains everything a remote runner (Alepha Rocket, or any
10
+ * `alepha platform <op> --prebuilt` consumer) needs to deploy the app:
11
+ *
12
+ * dist/ pre-built output (incl. manifest.json)
13
+ * migrations/ SQL files (if present)
14
+ *
15
+ * No source, no `alepha.config.ts`, no `package.json` — the deploy
16
+ * side reads everything from `dist/manifest.json` and never touches
17
+ * source. Excludes: `node_modules`, `.DS_Store`, macOS AppleDouble
18
+ * (`._*`), `.alepha` build cache, `e2e`, `playwright-report`,
19
+ * `coverage`.
20
+ *
21
+ * Output name: `<project-name>-<tag>.tar.gz` (default tag
22
+ * "latest"). Project name comes from `package.json.name`. Naming
23
+ * mirrors Docker tags — same artifact, different tag = different
24
+ * file.
25
+ */
26
+ export class PackCommand {
27
+ protected readonly log = $logger();
28
+ protected readonly fs = $inject(FileSystemProvider);
29
+ protected readonly shell = $inject(ShellProvider);
30
+
31
+ public readonly pack = $command({
32
+ name: "pack",
33
+ description:
34
+ "Pack the workspace into a deployable tar.gz (for `alepha platform --prebuilt` consumers like Alepha Rocket).",
35
+ flags: t.object({
36
+ tag: t.optional(
37
+ t.text({
38
+ aliases: ["t"],
39
+ description:
40
+ "Tag suffix for the artifact name (Docker-style). Defaults to `latest` → `<project>-latest.tar.gz`. Pass a real version like `0.0.2` for a pinned artifact.",
41
+ }),
42
+ ),
43
+ output: t.optional(
44
+ t.text({
45
+ aliases: ["o"],
46
+ description:
47
+ "Output directory for the tar.gz (default: current dir).",
48
+ }),
49
+ ),
50
+ }),
51
+ handler: async ({ flags, root, run }) => {
52
+ const pkgPath = this.fs.join(root, "package.json");
53
+ let project: string;
54
+ try {
55
+ const pkg = await this.fs.readJsonFile<{ name?: string }>(pkgPath);
56
+ if (!pkg.name) {
57
+ throw new AlephaError(
58
+ 'Missing "name" in package.json — `alepha pack` needs it for the artifact filename.',
59
+ );
60
+ }
61
+ project = pkg.name;
62
+ } catch (err) {
63
+ if (err instanceof AlephaError) throw err;
64
+ throw new AlephaError(
65
+ `Could not read package.json at ${pkgPath}. Run \`alepha pack\` from a workspace directory.`,
66
+ );
67
+ }
68
+
69
+ const tag = flags.tag ?? "latest";
70
+ const outputDir = flags.output ?? root;
71
+ const filename = `${project}-${tag}.tar.gz`;
72
+ const outputPath = this.fs.join(outputDir, filename);
73
+
74
+ // Include list: just `dist/` + `migrations/`. Everything else
75
+ // (src, alepha.config.ts, tsconfig.json, package.json) is
76
+ // dev-time scaffolding — the deploy side reads
77
+ // `dist/manifest.json` for project/env/resources and never
78
+ // touches source.
79
+ const candidates = ["dist", "migrations"];
80
+ const includes: string[] = [];
81
+ for (const candidate of candidates) {
82
+ if (await this.fs.exists(this.fs.join(root, candidate))) {
83
+ includes.push(candidate);
84
+ }
85
+ }
86
+
87
+ if (!includes.includes("dist")) {
88
+ throw new AlephaError(
89
+ "dist/ missing — run `alepha build --target=cloudflare` before `alepha pack`.",
90
+ );
91
+ }
92
+ const manifestPath = this.fs.join(root, "dist", "manifest.json");
93
+ if (!(await this.fs.exists(manifestPath))) {
94
+ throw new AlephaError(
95
+ `dist/manifest.json missing — required for prebuilt deploys. Rebuild with the current alepha version (\`alepha build --target=cloudflare\`).`,
96
+ );
97
+ }
98
+
99
+ // macOS sets COPYFILE_DISABLE=0 by default; tar will then include
100
+ // AppleDouble `._*` files. Force it off here so the tarball is
101
+ // portable. Also pass explicit excludes for `node_modules`,
102
+ // `.DS_Store`, etc. — they slip in via `dist/`.
103
+ const excludes = [
104
+ "node_modules",
105
+ ".DS_Store",
106
+ "._*",
107
+ ".alepha",
108
+ "e2e",
109
+ "playwright-report",
110
+ "test-results",
111
+ "coverage",
112
+ ]
113
+ .map((p) => `--exclude='${p}'`)
114
+ .join(" ");
115
+
116
+ const tarCmd = `tar -czf '${outputPath}' ${excludes} ${includes.map((p) => `'${p}'`).join(" ")}`;
117
+ // Wrap in `sh -c` so the env-var assignment is interpreted by the
118
+ // shell instead of being parsed as the binary name. COPYFILE_DISABLE
119
+ // suppresses macOS AppleDouble (`._*`) entries that tar otherwise
120
+ // emits when running on HFS+/APFS.
121
+ const cmd = `sh -c "COPYFILE_DISABLE=1 ${tarCmd}"`;
122
+
123
+ await run({
124
+ name: `pack → ${filename}`,
125
+ handler: async () => {
126
+ await this.shell.run(cmd, { root });
127
+ },
128
+ });
129
+
130
+ this.log.info(`Packed ${filename} → ${outputPath}`);
131
+ },
132
+ });
133
+ }
@@ -14,6 +14,7 @@ import {
14
14
  import { GenCommand } from "./commands/gen.ts";
15
15
  import { InitCommand } from "./commands/init.ts";
16
16
  import { LintCommand } from "./commands/lint.ts";
17
+ import { PackCommand } from "./commands/pack.ts";
17
18
  import { RootCommand } from "./commands/root.ts";
18
19
  import { TestCommand } from "./commands/test.ts";
19
20
  import { TypecheckCommand } from "./commands/typecheck.ts";
@@ -33,7 +34,6 @@ import { BuildCompressTask } from "./tasks/BuildCompressTask.ts";
33
34
  import { BuildDockerTask } from "./tasks/BuildDockerTask.ts";
34
35
  import { BuildPrerenderTask } from "./tasks/BuildPrerenderTask.ts";
35
36
  import { BuildServerTask } from "./tasks/BuildServerTask.ts";
36
- import { BuildSitemapTask } from "./tasks/BuildSitemapTask.ts";
37
37
  import { BuildStaticTask } from "./tasks/BuildStaticTask.ts";
38
38
  import { BuildVercelTask } from "./tasks/BuildVercelTask.ts";
39
39
 
@@ -52,6 +52,7 @@ export * from "./commands/gen/changelog.ts";
52
52
  export * from "./commands/gen/openapi.ts";
53
53
  export * from "./commands/init.ts";
54
54
  export * from "./commands/lint.ts";
55
+ export * from "./commands/pack.ts";
55
56
  export * from "./commands/root.ts";
56
57
  export * from "./commands/test.ts";
57
58
  export * from "./commands/typecheck.ts";
@@ -72,7 +73,6 @@ export * from "./tasks/BuildCompressTask.ts";
72
73
  export * from "./tasks/BuildDockerTask.ts";
73
74
  export * from "./tasks/BuildPrerenderTask.ts";
74
75
  export * from "./tasks/BuildServerTask.ts";
75
- export * from "./tasks/BuildSitemapTask.ts";
76
76
  export * from "./tasks/BuildStaticTask.ts";
77
77
  export * from "./tasks/BuildTask.ts";
78
78
  export * from "./tasks/BuildVercelTask.ts";
@@ -116,6 +116,7 @@ export const AlephaCli = $module({
116
116
  DevCommand,
117
117
  InitCommand,
118
118
  LintCommand,
119
+ PackCommand,
119
120
  RootCommand,
120
121
  TestCommand,
121
122
  TypecheckCommand,
@@ -129,7 +130,6 @@ export const AlephaCli = $module({
129
130
  BuildDockerTask,
130
131
  BuildPrerenderTask,
131
132
  BuildServerTask,
132
- BuildSitemapTask,
133
133
  BuildStaticTask,
134
134
  BuildVercelTask,
135
135
  ],
@@ -324,13 +324,22 @@ export class ViteDevServerProvider {
324
324
  // Skip when waiting for startup retry
325
325
  if (this.waitingForRetry) return [];
326
326
 
327
- const firstModule = ctx.modules[0] as
328
- | { _ssrModule?: unknown; _clientModule?: unknown }
329
- | undefined;
330
- const isBrowserOnly = firstModule && !firstModule._ssrModule;
331
-
332
- // Browser-only: let Vite HMR handle it (React Fast Refresh)
333
- if (isBrowserOnly) return;
327
+ // React component (.tsx/.jsx) edits always need the SSR module
328
+ // graph invalidated — the `_ssrModule` shortcut below misses files
329
+ // that are workspace-linked source-only (e.g. `@alepha/ui/...`).
330
+ // Those don't carry an `_ssrModule` ref on `ctx.modules[0]` on
331
+ // first edit and get classified as browser-only, leaving stale
332
+ // SSR HTML and triggering hydration mismatches on next request.
333
+ const isTsx = /\.(tsx|jsx)$/.test(ctx.file);
334
+ if (!isTsx) {
335
+ const firstModule = ctx.modules[0] as
336
+ | { _ssrModule?: unknown; _clientModule?: unknown }
337
+ | undefined;
338
+ const isBrowserOnly = firstModule && !firstModule._ssrModule;
339
+
340
+ // Browser-only: let Vite HMR handle it (React Fast Refresh)
341
+ if (isBrowserOnly) return;
342
+ }
334
343
 
335
344
  // Queue Alepha reload for server-side invalidation
336
345
  this.changedFiles.add(ctx.file);
@@ -626,7 +635,17 @@ if (import.meta.hot) {
626
635
  }
627
636
 
628
637
  /**
629
- * Invalidate modules and all their importers.
638
+ * Invalidate modules and all their importers, across both client and
639
+ * SSR module graphs.
640
+ *
641
+ * Vite registers a file under multiple module ids (one per query
642
+ * variant — e.g. `?v=…`, `?import` and the bare path), and `getModuleById`
643
+ * only matches one. For workspace-linked source files (`@alepha/ui/...`)
644
+ * the SSR-graph entry is keyed by the absolute path while the client
645
+ * may use the package-qualified id. `getModulesByFile` returns every
646
+ * variant Vite knows about for a given absolute path — invalidating
647
+ * each catches both halves of the dual graph and prevents stale SSR
648
+ * compiled exports from surviving across edits.
630
649
  */
631
650
  protected invalidateModulesWithImporters(changedFiles: Set<string>): void {
632
651
  const graph = this.server.moduleGraph;
@@ -636,16 +655,21 @@ if (import.meta.hot) {
636
655
  while (queue.length > 0) {
637
656
  const file = queue.pop()!;
638
657
  if (invalidated.has(file)) continue;
639
-
640
- const mod = this.server.moduleGraph.getModuleById(file);
641
- if (!mod) continue;
642
-
643
- graph.invalidateModule(mod);
644
658
  invalidated.add(file);
645
659
 
646
- for (const importer of mod.importers) {
647
- if (importer.id && !invalidated.has(importer.id)) {
648
- queue.push(importer.id);
660
+ const mods = new Set([
661
+ ...(graph.getModulesByFile(file) ?? []),
662
+ ...(graph.getModuleById(file) ? [graph.getModuleById(file)!] : []),
663
+ ]);
664
+ if (mods.size === 0) continue;
665
+
666
+ for (const mod of mods) {
667
+ graph.invalidateModule(mod);
668
+ for (const importer of mod.importers) {
669
+ const key = importer.file ?? importer.id;
670
+ if (key && !invalidated.has(key)) {
671
+ queue.push(key);
672
+ }
649
673
  }
650
674
  }
651
675
  }
@@ -418,16 +418,6 @@ export class PackageManagerUtils {
418
418
  devDependencies["@tailwindcss/vite"] = alephaDeps["@tailwindcss/vite"];
419
419
  }
420
420
 
421
- if (modes.shadcn) {
422
- // Add `shadcn` CLI as a project devDep — `alepha init --shadcn` runs
423
- // `yarn shadcn init` after install to scaffold components.json,
424
- // theme tokens, cn() helper, and runtime deps (clsx, tailwind-merge,
425
- // class-variance-authority, lucide-react, tw-animate-css). Keeping
426
- // the CLI in the project lets users re-run `yarn shadcn add ...`
427
- // without `npx`.
428
- devDependencies.shadcn = alephaDeps.shadcn;
429
- }
430
-
431
421
  if (modes.react) {
432
422
  dependencies.react = alephaDeps.react;
433
423
  dependencies["react-dom"] = alephaDeps["react-dom"];
@@ -459,12 +449,6 @@ export interface DependencyModes {
459
449
  react?: boolean;
460
450
  expo?: boolean;
461
451
  tailwind?: boolean;
462
- shadcn?: boolean;
463
- /**
464
- * SaaS starter: implies `shadcn` + adds the alepha auth + admin registry
465
- * components on top via `shadcn add @alepha/...`.
466
- */
467
- saas?: boolean;
468
452
  /**
469
453
  * Whether the project is a workspace package inside a monorepo.
470
454
  */