alepha 0.15.1 → 0.15.3

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 (523) hide show
  1. package/README.md +68 -80
  2. package/dist/api/audits/index.d.ts +10 -33
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/audits/index.js +10 -33
  5. package/dist/api/audits/index.js.map +1 -1
  6. package/dist/api/files/index.d.ts +10 -3
  7. package/dist/api/files/index.d.ts.map +1 -1
  8. package/dist/api/files/index.js +10 -3
  9. package/dist/api/files/index.js.map +1 -1
  10. package/dist/api/jobs/index.d.ts +162 -155
  11. package/dist/api/jobs/index.d.ts.map +1 -1
  12. package/dist/api/jobs/index.js +10 -3
  13. package/dist/api/jobs/index.js.map +1 -1
  14. package/dist/api/keys/index.d.ts +413 -0
  15. package/dist/api/keys/index.d.ts.map +1 -0
  16. package/dist/api/keys/index.js +476 -0
  17. package/dist/api/keys/index.js.map +1 -0
  18. package/dist/api/notifications/index.d.ts +10 -4
  19. package/dist/api/notifications/index.d.ts.map +1 -1
  20. package/dist/api/notifications/index.js +10 -4
  21. package/dist/api/notifications/index.js.map +1 -1
  22. package/dist/api/parameters/index.d.ts +43 -50
  23. package/dist/api/parameters/index.d.ts.map +1 -1
  24. package/dist/api/parameters/index.js +30 -37
  25. package/dist/api/parameters/index.js.map +1 -1
  26. package/dist/api/users/index.d.ts +1081 -760
  27. package/dist/api/users/index.d.ts.map +1 -1
  28. package/dist/api/users/index.js +2539 -218
  29. package/dist/api/users/index.js.map +1 -1
  30. package/dist/api/verifications/index.d.ts +138 -132
  31. package/dist/api/verifications/index.d.ts.map +1 -1
  32. package/dist/api/verifications/index.js +12 -4
  33. package/dist/api/verifications/index.js.map +1 -1
  34. package/dist/batch/index.d.ts +20 -40
  35. package/dist/batch/index.d.ts.map +1 -1
  36. package/dist/batch/index.js +31 -44
  37. package/dist/batch/index.js.map +1 -1
  38. package/dist/bucket/index.d.ts +440 -8
  39. package/dist/bucket/index.d.ts.map +1 -1
  40. package/dist/bucket/index.js +1861 -12
  41. package/dist/bucket/index.js.map +1 -1
  42. package/dist/cache/core/index.d.ts +179 -7
  43. package/dist/cache/core/index.d.ts.map +1 -1
  44. package/dist/cache/core/index.js +213 -7
  45. package/dist/cache/core/index.js.map +1 -1
  46. package/dist/cache/redis/index.d.ts +1 -0
  47. package/dist/cache/redis/index.d.ts.map +1 -1
  48. package/dist/cache/redis/index.js +4 -0
  49. package/dist/cache/redis/index.js.map +1 -1
  50. package/dist/cli/index.d.ts +638 -5645
  51. package/dist/cli/index.d.ts.map +1 -1
  52. package/dist/cli/index.js +2550 -368
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/command/index.d.ts +203 -45
  55. package/dist/command/index.d.ts.map +1 -1
  56. package/dist/command/index.js +2060 -71
  57. package/dist/command/index.js.map +1 -1
  58. package/dist/core/index.browser.js +70 -40
  59. package/dist/core/index.browser.js.map +1 -1
  60. package/dist/core/index.d.ts +34 -13
  61. package/dist/core/index.d.ts.map +1 -1
  62. package/dist/core/index.js +90 -40
  63. package/dist/core/index.js.map +1 -1
  64. package/dist/core/index.native.js +70 -40
  65. package/dist/core/index.native.js.map +1 -1
  66. package/dist/datetime/index.d.ts +15 -0
  67. package/dist/datetime/index.d.ts.map +1 -1
  68. package/dist/datetime/index.js +15 -0
  69. package/dist/datetime/index.js.map +1 -1
  70. package/dist/email/index.d.ts +323 -20
  71. package/dist/email/index.d.ts.map +1 -1
  72. package/dist/email/index.js +1857 -7
  73. package/dist/email/index.js.map +1 -1
  74. package/dist/fake/index.d.ts +90 -8
  75. package/dist/fake/index.d.ts.map +1 -1
  76. package/dist/fake/index.js +91 -20
  77. package/dist/fake/index.js.map +1 -1
  78. package/dist/lock/core/index.d.ts +11 -4
  79. package/dist/lock/core/index.d.ts.map +1 -1
  80. package/dist/lock/core/index.js +11 -4
  81. package/dist/lock/core/index.js.map +1 -1
  82. package/dist/logger/index.d.ts +17 -66
  83. package/dist/logger/index.d.ts.map +1 -1
  84. package/dist/logger/index.js +14 -63
  85. package/dist/logger/index.js.map +1 -1
  86. package/dist/mcp/index.d.ts +10 -30
  87. package/dist/mcp/index.d.ts.map +1 -1
  88. package/dist/mcp/index.js +12 -35
  89. package/dist/mcp/index.js.map +1 -1
  90. package/dist/orm/index.browser.js +3 -3
  91. package/dist/orm/index.browser.js.map +1 -1
  92. package/dist/orm/index.bun.js +39 -20
  93. package/dist/orm/index.bun.js.map +1 -1
  94. package/dist/orm/index.d.ts +517 -540
  95. package/dist/orm/index.d.ts.map +1 -1
  96. package/dist/orm/index.js +58 -71
  97. package/dist/orm/index.js.map +1 -1
  98. package/dist/queue/core/index.d.ts +18 -10
  99. package/dist/queue/core/index.d.ts.map +1 -1
  100. package/dist/queue/core/index.js +14 -6
  101. package/dist/queue/core/index.js.map +1 -1
  102. package/dist/react/auth/index.browser.js +108 -0
  103. package/dist/react/auth/index.browser.js.map +1 -0
  104. package/dist/react/auth/index.d.ts +100 -0
  105. package/dist/react/auth/index.d.ts.map +1 -0
  106. package/dist/react/auth/index.js +145 -0
  107. package/dist/react/auth/index.js.map +1 -0
  108. package/dist/react/core/index.d.ts +469 -0
  109. package/dist/react/core/index.d.ts.map +1 -0
  110. package/dist/react/core/index.js +464 -0
  111. package/dist/react/core/index.js.map +1 -0
  112. package/dist/react/form/index.d.ts +232 -0
  113. package/dist/react/form/index.d.ts.map +1 -0
  114. package/dist/react/form/index.js +432 -0
  115. package/dist/react/form/index.js.map +1 -0
  116. package/dist/react/head/index.browser.js +423 -0
  117. package/dist/react/head/index.browser.js.map +1 -0
  118. package/dist/react/head/index.d.ts +288 -0
  119. package/dist/react/head/index.d.ts.map +1 -0
  120. package/dist/react/head/index.js +465 -0
  121. package/dist/react/head/index.js.map +1 -0
  122. package/dist/react/i18n/index.d.ts +175 -0
  123. package/dist/react/i18n/index.d.ts.map +1 -0
  124. package/dist/react/i18n/index.js +224 -0
  125. package/dist/react/i18n/index.js.map +1 -0
  126. package/dist/react/router/index.browser.js +1974 -0
  127. package/dist/react/router/index.browser.js.map +1 -0
  128. package/dist/react/router/index.d.ts +1956 -0
  129. package/dist/react/router/index.d.ts.map +1 -0
  130. package/dist/react/router/index.js +4722 -0
  131. package/dist/react/router/index.js.map +1 -0
  132. package/dist/react/websocket/index.d.ts +117 -0
  133. package/dist/react/websocket/index.d.ts.map +1 -0
  134. package/dist/react/websocket/index.js +107 -0
  135. package/dist/react/websocket/index.js.map +1 -0
  136. package/dist/redis/index.bun.js +4 -0
  137. package/dist/redis/index.bun.js.map +1 -1
  138. package/dist/redis/index.d.ts +41 -44
  139. package/dist/redis/index.d.ts.map +1 -1
  140. package/dist/redis/index.js +16 -25
  141. package/dist/redis/index.js.map +1 -1
  142. package/dist/retry/index.d.ts +11 -2
  143. package/dist/retry/index.d.ts.map +1 -1
  144. package/dist/retry/index.js +11 -2
  145. package/dist/retry/index.js.map +1 -1
  146. package/dist/scheduler/index.d.ts +11 -2
  147. package/dist/scheduler/index.d.ts.map +1 -1
  148. package/dist/scheduler/index.js +11 -2
  149. package/dist/scheduler/index.js.map +1 -1
  150. package/dist/security/index.d.ts +140 -49
  151. package/dist/security/index.d.ts.map +1 -1
  152. package/dist/security/index.js +164 -32
  153. package/dist/security/index.js.map +1 -1
  154. package/dist/server/auth/index.d.ts +12 -7
  155. package/dist/server/auth/index.d.ts.map +1 -1
  156. package/dist/server/auth/index.js +12 -7
  157. package/dist/server/auth/index.js.map +1 -1
  158. package/dist/server/cache/index.d.ts +7 -22
  159. package/dist/server/cache/index.d.ts.map +1 -1
  160. package/dist/server/cache/index.js +7 -22
  161. package/dist/server/cache/index.js.map +1 -1
  162. package/dist/server/compress/index.d.ts +10 -2
  163. package/dist/server/compress/index.d.ts.map +1 -1
  164. package/dist/server/compress/index.js +10 -2
  165. package/dist/server/compress/index.js.map +1 -1
  166. package/dist/server/cookies/index.d.ts +40 -16
  167. package/dist/server/cookies/index.d.ts.map +1 -1
  168. package/dist/server/cookies/index.js +7 -5
  169. package/dist/server/cookies/index.js.map +1 -1
  170. package/dist/server/core/index.d.ts +124 -23
  171. package/dist/server/core/index.d.ts.map +1 -1
  172. package/dist/server/core/index.js +231 -14
  173. package/dist/server/core/index.js.map +1 -1
  174. package/dist/server/cors/index.d.ts +13 -23
  175. package/dist/server/cors/index.d.ts.map +1 -1
  176. package/dist/server/cors/index.js +7 -21
  177. package/dist/server/cors/index.js.map +1 -1
  178. package/dist/server/health/index.d.ts +8 -2
  179. package/dist/server/health/index.d.ts.map +1 -1
  180. package/dist/server/health/index.js +8 -2
  181. package/dist/server/health/index.js.map +1 -1
  182. package/dist/server/helmet/index.d.ts +11 -3
  183. package/dist/server/helmet/index.d.ts.map +1 -1
  184. package/dist/server/helmet/index.js +11 -3
  185. package/dist/server/helmet/index.js.map +1 -1
  186. package/dist/server/links/index.d.ts +11 -6
  187. package/dist/server/links/index.d.ts.map +1 -1
  188. package/dist/server/links/index.js +11 -6
  189. package/dist/server/links/index.js.map +1 -1
  190. package/dist/server/metrics/index.d.ts +10 -3
  191. package/dist/server/metrics/index.d.ts.map +1 -1
  192. package/dist/server/metrics/index.js +10 -3
  193. package/dist/server/metrics/index.js.map +1 -1
  194. package/dist/server/multipart/index.d.ts +9 -3
  195. package/dist/server/multipart/index.d.ts.map +1 -1
  196. package/dist/server/multipart/index.js +9 -3
  197. package/dist/server/multipart/index.js.map +1 -1
  198. package/dist/server/proxy/index.d.ts +8 -2
  199. package/dist/server/proxy/index.d.ts.map +1 -1
  200. package/dist/server/proxy/index.js +8 -2
  201. package/dist/server/proxy/index.js.map +1 -1
  202. package/dist/server/rate-limit/index.d.ts +30 -35
  203. package/dist/server/rate-limit/index.d.ts.map +1 -1
  204. package/dist/server/rate-limit/index.js +18 -55
  205. package/dist/server/rate-limit/index.js.map +1 -1
  206. package/dist/server/static/index.d.ts +137 -4
  207. package/dist/server/static/index.d.ts.map +1 -1
  208. package/dist/server/static/index.js +1853 -5
  209. package/dist/server/static/index.js.map +1 -1
  210. package/dist/server/swagger/index.d.ts +309 -6
  211. package/dist/server/swagger/index.d.ts.map +1 -1
  212. package/dist/server/swagger/index.js +1854 -6
  213. package/dist/server/swagger/index.js.map +1 -1
  214. package/dist/sms/index.d.ts +309 -7
  215. package/dist/sms/index.d.ts.map +1 -1
  216. package/dist/sms/index.js +1856 -7
  217. package/dist/sms/index.js.map +1 -1
  218. package/dist/system/index.browser.js +1218 -0
  219. package/dist/system/index.browser.js.map +1 -0
  220. package/dist/{file → system}/index.d.ts +343 -16
  221. package/dist/system/index.d.ts.map +1 -0
  222. package/dist/{file → system}/index.js +419 -22
  223. package/dist/system/index.js.map +1 -0
  224. package/dist/thread/index.d.ts +11 -2
  225. package/dist/thread/index.d.ts.map +1 -1
  226. package/dist/thread/index.js +11 -2
  227. package/dist/thread/index.js.map +1 -1
  228. package/dist/topic/core/index.d.ts +12 -5
  229. package/dist/topic/core/index.d.ts.map +1 -1
  230. package/dist/topic/core/index.js +12 -5
  231. package/dist/topic/core/index.js.map +1 -1
  232. package/dist/vite/index.d.ts +5 -6272
  233. package/dist/vite/index.d.ts.map +1 -1
  234. package/dist/vite/index.js +23 -10
  235. package/dist/vite/index.js.map +1 -1
  236. package/dist/websocket/index.d.ts +12 -8
  237. package/dist/websocket/index.d.ts.map +1 -1
  238. package/dist/websocket/index.js +12 -8
  239. package/dist/websocket/index.js.map +1 -1
  240. package/package.json +82 -11
  241. package/src/api/audits/index.ts +10 -33
  242. package/src/api/files/__tests__/$bucket.spec.ts +1 -1
  243. package/src/api/files/controllers/AdminFileStatsController.spec.ts +1 -1
  244. package/src/api/files/controllers/FileController.spec.ts +1 -1
  245. package/src/api/files/index.ts +10 -3
  246. package/src/api/files/jobs/FileJobs.spec.ts +1 -1
  247. package/src/api/files/services/FileService.spec.ts +1 -1
  248. package/src/api/jobs/index.ts +10 -3
  249. package/src/api/keys/controllers/AdminApiKeyController.ts +75 -0
  250. package/src/api/keys/controllers/ApiKeyController.ts +103 -0
  251. package/src/api/keys/entities/apiKeyEntity.ts +41 -0
  252. package/src/api/keys/index.ts +49 -0
  253. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +7 -0
  254. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +17 -0
  255. package/src/api/keys/schemas/createApiKeyBodySchema.ts +7 -0
  256. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +11 -0
  257. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +15 -0
  258. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +5 -0
  259. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +5 -0
  260. package/src/api/keys/services/ApiKeyService.spec.ts +553 -0
  261. package/src/api/keys/services/ApiKeyService.ts +306 -0
  262. package/src/api/logs/TODO.md +55 -0
  263. package/src/api/notifications/index.ts +10 -4
  264. package/src/api/parameters/index.ts +9 -30
  265. package/src/api/parameters/primitives/$config.ts +12 -4
  266. package/src/api/parameters/services/ConfigStore.ts +9 -3
  267. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +1035 -0
  268. package/src/api/users/__tests__/ApiKeys.spec.ts +401 -0
  269. package/src/api/users/index.ts +14 -3
  270. package/src/api/users/primitives/$realm.ts +33 -5
  271. package/src/api/users/providers/RealmProvider.ts +1 -12
  272. package/src/api/users/services/SessionService.ts +1 -1
  273. package/src/api/verifications/controllers/VerificationController.ts +2 -0
  274. package/src/api/verifications/index.ts +10 -4
  275. package/src/batch/index.ts +9 -36
  276. package/src/batch/primitives/$batch.ts +0 -8
  277. package/src/batch/providers/BatchProvider.ts +29 -2
  278. package/src/bucket/__tests__/shared.ts +1 -1
  279. package/src/bucket/index.ts +13 -6
  280. package/src/bucket/primitives/$bucket.ts +1 -1
  281. package/src/bucket/providers/LocalFileStorageProvider.ts +1 -1
  282. package/src/bucket/providers/MemoryFileStorageProvider.ts +1 -1
  283. package/src/cache/core/__tests__/shared.ts +30 -0
  284. package/src/cache/core/index.ts +11 -6
  285. package/src/cache/core/primitives/$cache.spec.ts +5 -0
  286. package/src/cache/core/providers/CacheProvider.ts +17 -0
  287. package/src/cache/core/providers/MemoryCacheProvider.ts +300 -1
  288. package/src/cache/redis/__tests__/cache-redis.spec.ts +5 -0
  289. package/src/cache/redis/providers/RedisCacheProvider.ts +9 -0
  290. package/src/cli/apps/AlephaCli.ts +1 -14
  291. package/src/cli/apps/AlephaPackageBuilderCli.ts +10 -1
  292. package/src/cli/atoms/buildOptions.ts +99 -9
  293. package/src/cli/commands/build.ts +150 -37
  294. package/src/cli/commands/db.ts +22 -18
  295. package/src/cli/commands/deploy.ts +1 -1
  296. package/src/cli/commands/dev.ts +1 -20
  297. package/src/cli/commands/gen/env.ts +5 -2
  298. package/src/cli/commands/gen/openapi.ts +5 -2
  299. package/src/cli/commands/init.spec.ts +588 -0
  300. package/src/cli/commands/init.ts +115 -58
  301. package/src/cli/commands/lint.ts +7 -1
  302. package/src/cli/commands/typecheck.ts +11 -0
  303. package/src/cli/providers/AppEntryProvider.ts +1 -1
  304. package/src/cli/providers/ViteBuildProvider.ts +8 -50
  305. package/src/cli/providers/ViteDevServerProvider.ts +35 -16
  306. package/src/cli/services/AlephaCliUtils.ts +52 -121
  307. package/src/cli/services/PackageManagerUtils.ts +129 -11
  308. package/src/cli/services/ProjectScaffolder.spec.ts +97 -0
  309. package/src/cli/services/ProjectScaffolder.ts +148 -81
  310. package/src/cli/services/ViteUtils.ts +82 -0
  311. package/src/cli/{assets/claudeMd.ts → templates/agentMd.ts} +37 -24
  312. package/src/cli/templates/apiAppSecurityTs.ts +11 -0
  313. package/src/cli/templates/apiIndexTs.ts +30 -0
  314. package/src/cli/templates/gitignore.ts +39 -0
  315. package/src/cli/{assets → templates}/mainCss.ts +11 -2
  316. package/src/cli/templates/mainServerTs.ts +33 -0
  317. package/src/cli/templates/webAppRouterTs.ts +74 -0
  318. package/src/cli/templates/webHelloComponentTsx.ts +30 -0
  319. package/src/command/helpers/Runner.spec.ts +139 -0
  320. package/src/command/helpers/Runner.ts +7 -22
  321. package/src/command/index.ts +12 -4
  322. package/src/command/providers/CliProvider.spec.ts +1392 -0
  323. package/src/command/providers/CliProvider.ts +320 -47
  324. package/src/core/Alepha.ts +34 -27
  325. package/src/core/__tests__/Alepha-start.spec.ts +4 -4
  326. package/src/core/helpers/jsonSchemaToTypeBox.spec.ts +771 -0
  327. package/src/core/helpers/jsonSchemaToTypeBox.ts +62 -10
  328. package/src/core/index.shared.ts +1 -0
  329. package/src/core/index.ts +20 -0
  330. package/src/core/providers/EventManager.spec.ts +0 -71
  331. package/src/core/providers/EventManager.ts +3 -15
  332. package/src/core/providers/Json.ts +2 -14
  333. package/src/datetime/index.ts +15 -0
  334. package/src/email/index.ts +10 -5
  335. package/src/email/providers/LocalEmailProvider.spec.ts +1 -1
  336. package/src/email/providers/LocalEmailProvider.ts +1 -1
  337. package/src/fake/__tests__/keyName.example.ts +1 -1
  338. package/src/fake/__tests__/keyName.spec.ts +5 -5
  339. package/src/fake/index.ts +9 -6
  340. package/src/fake/providers/FakeProvider.spec.ts +258 -40
  341. package/src/fake/providers/FakeProvider.ts +133 -19
  342. package/src/lock/core/index.ts +11 -4
  343. package/src/logger/index.ts +17 -66
  344. package/src/mcp/index.ts +10 -27
  345. package/src/mcp/transports/SseMcpTransport.ts +0 -11
  346. package/src/orm/__tests__/PostgresProvider.spec.ts +2 -2
  347. package/src/orm/index.browser.ts +2 -2
  348. package/src/orm/index.bun.ts +5 -3
  349. package/src/orm/index.ts +23 -53
  350. package/src/orm/providers/drivers/BunSqliteProvider.ts +5 -1
  351. package/src/orm/providers/drivers/CloudflareD1Provider.ts +57 -30
  352. package/src/orm/providers/drivers/DatabaseProvider.ts +9 -1
  353. package/src/orm/providers/drivers/NodeSqliteProvider.ts +4 -1
  354. package/src/orm/services/Repository.ts +7 -3
  355. package/src/queue/core/index.ts +14 -6
  356. package/src/react/auth/__tests__/$auth.spec.ts +202 -0
  357. package/src/react/auth/hooks/useAuth.ts +32 -0
  358. package/src/react/auth/index.browser.ts +13 -0
  359. package/src/react/auth/index.shared.ts +2 -0
  360. package/src/react/auth/index.ts +48 -0
  361. package/src/react/auth/providers/ReactAuthProvider.ts +16 -0
  362. package/src/react/auth/services/ReactAuth.ts +135 -0
  363. package/src/react/core/__tests__/Router.spec.tsx +169 -0
  364. package/src/react/core/components/ClientOnly.tsx +49 -0
  365. package/src/react/core/components/ErrorBoundary.tsx +73 -0
  366. package/src/react/core/contexts/AlephaContext.ts +7 -0
  367. package/src/react/core/contexts/AlephaProvider.tsx +42 -0
  368. package/src/react/core/hooks/useAction.browser.spec.tsx +569 -0
  369. package/src/react/core/hooks/useAction.ts +480 -0
  370. package/src/react/core/hooks/useAlepha.ts +26 -0
  371. package/src/react/core/hooks/useClient.ts +17 -0
  372. package/src/react/core/hooks/useEvents.ts +51 -0
  373. package/src/react/core/hooks/useInject.ts +12 -0
  374. package/src/react/core/hooks/useStore.ts +52 -0
  375. package/src/react/core/index.ts +90 -0
  376. package/src/react/form/components/FormState.tsx +17 -0
  377. package/src/react/form/errors/FormValidationError.ts +18 -0
  378. package/src/react/form/hooks/useForm.browser.spec.tsx +366 -0
  379. package/src/react/form/hooks/useForm.ts +47 -0
  380. package/src/react/form/hooks/useFormState.ts +130 -0
  381. package/src/react/form/index.ts +44 -0
  382. package/src/react/form/services/FormModel.ts +614 -0
  383. package/src/react/head/helpers/SeoExpander.spec.ts +203 -0
  384. package/src/react/head/helpers/SeoExpander.ts +142 -0
  385. package/src/react/head/hooks/useHead.spec.tsx +288 -0
  386. package/src/react/head/hooks/useHead.ts +62 -0
  387. package/src/react/head/index.browser.ts +26 -0
  388. package/src/react/head/index.ts +44 -0
  389. package/src/react/head/interfaces/Head.ts +105 -0
  390. package/src/react/head/primitives/$head.ts +25 -0
  391. package/src/react/head/providers/BrowserHeadProvider.browser.spec.ts +196 -0
  392. package/src/react/head/providers/BrowserHeadProvider.ts +212 -0
  393. package/src/react/head/providers/HeadProvider.ts +168 -0
  394. package/src/react/head/providers/ServerHeadProvider.ts +31 -0
  395. package/src/react/i18n/__tests__/integration.spec.tsx +239 -0
  396. package/src/react/i18n/components/Localize.spec.tsx +357 -0
  397. package/src/react/i18n/components/Localize.tsx +35 -0
  398. package/src/react/i18n/hooks/useI18n.browser.spec.tsx +438 -0
  399. package/src/react/i18n/hooks/useI18n.ts +18 -0
  400. package/src/react/i18n/index.ts +41 -0
  401. package/src/react/i18n/primitives/$dictionary.ts +69 -0
  402. package/src/react/i18n/providers/I18nProvider.spec.ts +389 -0
  403. package/src/react/i18n/providers/I18nProvider.ts +278 -0
  404. package/src/react/router/__tests__/page-head-browser.browser.spec.ts +95 -0
  405. package/src/react/router/__tests__/page-head.spec.ts +48 -0
  406. package/src/react/router/__tests__/seo-head.spec.ts +125 -0
  407. package/src/react/router/atoms/ssrManifestAtom.ts +58 -0
  408. package/src/react/router/components/ErrorViewer.tsx +872 -0
  409. package/src/react/router/components/Link.tsx +23 -0
  410. package/src/react/router/components/NestedView.tsx +223 -0
  411. package/src/react/router/components/NotFound.tsx +30 -0
  412. package/src/react/router/constants/PAGE_PRELOAD_KEY.ts +6 -0
  413. package/src/react/router/contexts/RouterLayerContext.ts +12 -0
  414. package/src/react/router/errors/Redirection.ts +28 -0
  415. package/src/react/router/hooks/useActive.ts +52 -0
  416. package/src/react/router/hooks/useQueryParams.ts +63 -0
  417. package/src/react/router/hooks/useRouter.ts +20 -0
  418. package/src/react/router/hooks/useRouterState.ts +11 -0
  419. package/src/react/router/index.browser.ts +45 -0
  420. package/src/react/router/index.shared.ts +19 -0
  421. package/src/react/router/index.ts +146 -0
  422. package/src/react/router/primitives/$page.browser.spec.tsx +851 -0
  423. package/src/react/router/primitives/$page.spec.tsx +676 -0
  424. package/src/react/router/primitives/$page.ts +489 -0
  425. package/src/react/router/providers/ReactBrowserProvider.ts +312 -0
  426. package/src/react/router/providers/ReactBrowserRendererProvider.ts +25 -0
  427. package/src/react/router/providers/ReactBrowserRouterProvider.ts +168 -0
  428. package/src/react/router/providers/ReactPageProvider.ts +726 -0
  429. package/src/react/router/providers/ReactPreloadProvider.spec.ts +142 -0
  430. package/src/react/router/providers/ReactPreloadProvider.ts +85 -0
  431. package/src/react/router/providers/ReactServerProvider.spec.tsx +316 -0
  432. package/src/react/router/providers/ReactServerProvider.ts +487 -0
  433. package/src/react/router/providers/ReactServerTemplateProvider.spec.ts +210 -0
  434. package/src/react/router/providers/ReactServerTemplateProvider.ts +542 -0
  435. package/src/react/router/providers/SSRManifestProvider.ts +334 -0
  436. package/src/react/router/services/ReactPageServerService.ts +48 -0
  437. package/src/react/router/services/ReactPageService.ts +27 -0
  438. package/src/react/router/services/ReactRouter.ts +262 -0
  439. package/src/react/websocket/hooks/useRoom.tsx +242 -0
  440. package/src/react/websocket/index.ts +7 -0
  441. package/src/redis/__tests__/redis.spec.ts +13 -0
  442. package/src/redis/index.ts +9 -25
  443. package/src/redis/providers/BunRedisProvider.ts +9 -0
  444. package/src/redis/providers/NodeRedisProvider.ts +8 -0
  445. package/src/redis/providers/RedisProvider.ts +16 -0
  446. package/src/retry/index.ts +11 -2
  447. package/src/router/index.ts +15 -0
  448. package/src/scheduler/index.ts +11 -2
  449. package/src/security/__tests__/BasicAuth.spec.ts +2 -0
  450. package/src/security/__tests__/ServerSecurityProvider.spec.ts +90 -5
  451. package/src/security/index.ts +15 -10
  452. package/src/security/interfaces/IssuerResolver.ts +27 -0
  453. package/src/security/primitives/$issuer.ts +55 -0
  454. package/src/security/providers/SecurityProvider.ts +179 -0
  455. package/src/security/providers/ServerBasicAuthProvider.ts +6 -2
  456. package/src/security/providers/ServerSecurityProvider.ts +63 -41
  457. package/src/server/auth/index.ts +12 -7
  458. package/src/server/cache/index.ts +7 -22
  459. package/src/server/compress/index.ts +10 -2
  460. package/src/server/cookies/index.ts +7 -5
  461. package/src/server/cookies/primitives/$cookie.ts +33 -11
  462. package/src/server/core/index.ts +16 -6
  463. package/src/server/core/interfaces/ServerRequest.ts +83 -1
  464. package/src/server/core/primitives/$action.spec.ts +1 -1
  465. package/src/server/core/primitives/$action.ts +8 -3
  466. package/src/server/core/providers/NodeHttpServerProvider.spec.ts +9 -3
  467. package/src/server/core/providers/NodeHttpServerProvider.ts +9 -3
  468. package/src/server/core/services/ServerRequestParser.spec.ts +520 -0
  469. package/src/server/core/services/ServerRequestParser.ts +306 -13
  470. package/src/server/cors/index.ts +7 -21
  471. package/src/server/cors/primitives/$cors.ts +6 -2
  472. package/src/server/health/index.ts +8 -2
  473. package/src/server/helmet/index.ts +11 -3
  474. package/src/server/links/index.ts +11 -6
  475. package/src/server/metrics/index.ts +10 -3
  476. package/src/server/multipart/index.ts +9 -3
  477. package/src/server/proxy/index.ts +8 -2
  478. package/src/server/rate-limit/index.ts +21 -25
  479. package/src/server/rate-limit/primitives/$rateLimit.ts +6 -2
  480. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +38 -14
  481. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +22 -56
  482. package/src/server/static/index.ts +8 -2
  483. package/src/server/static/providers/ServerStaticProvider.ts +1 -1
  484. package/src/server/swagger/index.ts +9 -4
  485. package/src/server/swagger/providers/ServerSwaggerProvider.ts +1 -1
  486. package/src/sms/index.ts +9 -5
  487. package/src/sms/providers/LocalSmsProvider.spec.ts +1 -1
  488. package/src/sms/providers/LocalSmsProvider.ts +1 -1
  489. package/src/system/index.browser.ts +36 -0
  490. package/src/system/index.ts +62 -0
  491. package/src/system/index.workerd.ts +1 -0
  492. package/src/{file → system}/providers/FileSystemProvider.ts +24 -0
  493. package/src/{file → system}/providers/MemoryFileSystemProvider.ts +116 -3
  494. package/src/system/providers/MemoryShellProvider.ts +164 -0
  495. package/src/{file → system}/providers/NodeFileSystemProvider.spec.ts +2 -2
  496. package/src/{file → system}/providers/NodeFileSystemProvider.ts +47 -2
  497. package/src/system/providers/NodeShellProvider.ts +184 -0
  498. package/src/system/providers/ShellProvider.ts +74 -0
  499. package/src/{file → system}/services/FileDetector.spec.ts +2 -2
  500. package/src/thread/index.ts +11 -2
  501. package/src/topic/core/index.ts +12 -5
  502. package/src/vite/tasks/buildClient.ts +2 -7
  503. package/src/vite/tasks/buildServer.ts +19 -13
  504. package/src/vite/tasks/generateCloudflare.ts +10 -7
  505. package/src/vite/tasks/generateDocker.ts +4 -0
  506. package/src/websocket/index.ts +12 -8
  507. package/dist/file/index.d.ts.map +0 -1
  508. package/dist/file/index.js.map +0 -1
  509. package/src/cli/assets/apiIndexTs.ts +0 -16
  510. package/src/cli/assets/mainServerTs.ts +0 -24
  511. package/src/cli/assets/webAppRouterTs.ts +0 -16
  512. package/src/cli/assets/webHelloComponentTsx.ts +0 -20
  513. package/src/cli/providers/ViteTemplateProvider.ts +0 -27
  514. package/src/file/index.ts +0 -43
  515. /package/src/cli/{assets → templates}/apiHelloControllerTs.ts +0 -0
  516. /package/src/cli/{assets → templates}/biomeJson.ts +0 -0
  517. /package/src/cli/{assets → templates}/dummySpecTs.ts +0 -0
  518. /package/src/cli/{assets → templates}/editorconfig.ts +0 -0
  519. /package/src/cli/{assets → templates}/mainBrowserTs.ts +0 -0
  520. /package/src/cli/{assets → templates}/tsconfigJson.ts +0 -0
  521. /package/src/cli/{assets → templates}/webIndexTs.ts +0 -0
  522. /package/src/{file → system}/errors/FileError.ts +0 -0
  523. /package/src/{file → system}/services/FileDetector.ts +0 -0
@@ -1,10 +1,10 @@
1
- import { t } from "alepha";
1
+ import { Type, t } from "alepha";
2
2
  import { describe, test } from "vitest";
3
3
  import { FakeProvider } from "../providers/FakeProvider.ts";
4
4
 
5
5
  describe("FakeProvider", () => {
6
6
  test("generates string values", ({ expect }) => {
7
- const fake = new FakeProvider({ seed: 12345 });
7
+ const fake = new FakeProvider();
8
8
  const schema = t.string();
9
9
  const result = fake.generate(schema);
10
10
 
@@ -13,7 +13,7 @@ describe("FakeProvider", () => {
13
13
  });
14
14
 
15
15
  test("generates text with size constraints", ({ expect }) => {
16
- const fake = new FakeProvider({ seed: 12345 });
16
+ const fake = new FakeProvider();
17
17
 
18
18
  const shortText = fake.generate(t.shortText());
19
19
  expect(typeof shortText).toBe("string");
@@ -33,7 +33,7 @@ describe("FakeProvider", () => {
33
33
  });
34
34
 
35
35
  test("generates number values", ({ expect }) => {
36
- const fake = new FakeProvider({ seed: 12345 });
36
+ const fake = new FakeProvider();
37
37
  const schema = t.number();
38
38
  const result = fake.generate(schema);
39
39
 
@@ -41,7 +41,7 @@ describe("FakeProvider", () => {
41
41
  });
42
42
 
43
43
  test("generates number with constraints", ({ expect }) => {
44
- const fake = new FakeProvider({ seed: 12345 });
44
+ const fake = new FakeProvider();
45
45
  const schema = t.number({ minimum: 10, maximum: 20 });
46
46
  const result = fake.generate(schema);
47
47
 
@@ -50,7 +50,7 @@ describe("FakeProvider", () => {
50
50
  });
51
51
 
52
52
  test("generates integer values", ({ expect }) => {
53
- const fake = new FakeProvider({ seed: 12345 });
53
+ const fake = new FakeProvider();
54
54
  const schema = t.integer();
55
55
  const result = fake.generate(schema);
56
56
 
@@ -59,7 +59,7 @@ describe("FakeProvider", () => {
59
59
  });
60
60
 
61
61
  test("generates integer with constraints", ({ expect }) => {
62
- const fake = new FakeProvider({ seed: 12345 });
62
+ const fake = new FakeProvider();
63
63
  const schema = t.integer({ minimum: 5, maximum: 15 });
64
64
  const result = fake.generate(schema);
65
65
 
@@ -69,7 +69,7 @@ describe("FakeProvider", () => {
69
69
  });
70
70
 
71
71
  test("generates boolean values", ({ expect }) => {
72
- const fake = new FakeProvider({ seed: 12345 });
72
+ const fake = new FakeProvider();
73
73
  const schema = t.boolean();
74
74
  const result = fake.generate(schema);
75
75
 
@@ -77,7 +77,7 @@ describe("FakeProvider", () => {
77
77
  });
78
78
 
79
79
  test("generates UUID", ({ expect }) => {
80
- const fake = new FakeProvider({ seed: 12345 });
80
+ const fake = new FakeProvider();
81
81
  const schema = t.uuid();
82
82
  const result = fake.generate(schema);
83
83
 
@@ -88,7 +88,7 @@ describe("FakeProvider", () => {
88
88
  });
89
89
 
90
90
  test("generates email", ({ expect }) => {
91
- const fake = new FakeProvider({ seed: 12345 });
91
+ const fake = new FakeProvider();
92
92
  const schema = t.email();
93
93
  const result = fake.generate(schema);
94
94
 
@@ -97,7 +97,7 @@ describe("FakeProvider", () => {
97
97
  });
98
98
 
99
99
  test("generates URL", ({ expect }) => {
100
- const fake = new FakeProvider({ seed: 12345 });
100
+ const fake = new FakeProvider();
101
101
  const schema = t.string({ format: "url" });
102
102
  const result = fake.generate(schema);
103
103
 
@@ -106,7 +106,7 @@ describe("FakeProvider", () => {
106
106
  });
107
107
 
108
108
  test("generates bigint", ({ expect }) => {
109
- const fake = new FakeProvider({ seed: 12345 });
109
+ const fake = new FakeProvider();
110
110
  const schema = t.string({ format: "bigint" });
111
111
  const result = fake.generate(schema);
112
112
 
@@ -115,7 +115,7 @@ describe("FakeProvider", () => {
115
115
  });
116
116
 
117
117
  test("generates E.164 phone number", ({ expect }) => {
118
- const fake = new FakeProvider({ seed: 12345 });
118
+ const fake = new FakeProvider();
119
119
  const schema = t.e164();
120
120
  const result = fake.generate(schema);
121
121
 
@@ -124,7 +124,7 @@ describe("FakeProvider", () => {
124
124
  });
125
125
 
126
126
  test("generates BCP 47 language tag", ({ expect }) => {
127
- const fake = new FakeProvider({ seed: 12345 });
127
+ const fake = new FakeProvider();
128
128
  const schema = t.bcp47();
129
129
  const result = fake.generate(schema);
130
130
 
@@ -133,7 +133,7 @@ describe("FakeProvider", () => {
133
133
  });
134
134
 
135
135
  test("generates snake_case string", ({ expect }) => {
136
- const fake = new FakeProvider({ seed: 12345 });
136
+ const fake = new FakeProvider();
137
137
  const schema = t.snakeCase();
138
138
  const result = fake.generate(schema);
139
139
 
@@ -142,7 +142,7 @@ describe("FakeProvider", () => {
142
142
  });
143
143
 
144
144
  test("generates enum values", ({ expect }) => {
145
- const fake = new FakeProvider({ seed: 12345 });
145
+ const fake = new FakeProvider();
146
146
  const schema = t.enum(["red", "green", "blue"]);
147
147
  const result = fake.generate(schema);
148
148
 
@@ -150,30 +150,40 @@ describe("FakeProvider", () => {
150
150
  });
151
151
 
152
152
  test("generates array of values", ({ expect }) => {
153
- const fake = new FakeProvider({ seed: 12345 });
153
+ const fake = new FakeProvider();
154
+ // Note: Alepha's t.array() sets maxItems: 1000 by default
155
+ // FakeProvider caps it to maxArrayLength (default 20)
154
156
  const schema = t.array(t.string());
155
157
  const result = fake.generate(schema);
156
158
 
157
159
  expect(Array.isArray(result)).toBe(true);
158
160
  expect(result.length).toBeGreaterThanOrEqual(0);
159
- expect(result.length).toBeLessThanOrEqual(5);
161
+ expect(result.length).toBeLessThanOrEqual(20); // maxArrayLength default
160
162
  result.forEach((item: unknown) => {
161
163
  expect(typeof item).toBe("string");
162
164
  });
163
165
  });
164
166
 
165
167
  test("generates array with size constraints", ({ expect }) => {
166
- const fake = new FakeProvider({ seed: 12345 });
168
+ const fake = new FakeProvider();
167
169
  const schema = t.array(t.number(), { minItems: 3, maxItems: 7 });
168
- const result = fake.generate(schema);
169
170
 
170
- expect(Array.isArray(result)).toBe(true);
171
- expect(result.length).toBeGreaterThanOrEqual(3);
172
- expect(result.length).toBeLessThanOrEqual(7);
171
+ // Generate multiple times to verify constraints are respected
172
+ const results = Array.from({ length: 20 }, () => fake.generate(schema));
173
+
174
+ for (const result of results) {
175
+ expect(Array.isArray(result)).toBe(true);
176
+ expect(result.length).toBeGreaterThanOrEqual(3);
177
+ expect(result.length).toBeLessThanOrEqual(7);
178
+ }
179
+
180
+ // Verify we actually get some arrays with length > 5 (old cap was 5)
181
+ const hasLargerArray = results.some((r) => r.length > 5);
182
+ expect(hasLargerArray).toBe(true);
173
183
  });
174
184
 
175
185
  test("generates object with properties", ({ expect }) => {
176
- const fake = new FakeProvider({ seed: 12345 });
186
+ const fake = new FakeProvider();
177
187
  const schema = t.object({
178
188
  id: t.uuid(),
179
189
  name: t.text(),
@@ -194,7 +204,7 @@ describe("FakeProvider", () => {
194
204
  });
195
205
 
196
206
  test("generates nested objects", ({ expect }) => {
197
- const fake = new FakeProvider({ seed: 12345 });
207
+ const fake = new FakeProvider();
198
208
  const schema = t.object({
199
209
  user: t.object({
200
210
  name: t.text(),
@@ -217,7 +227,7 @@ describe("FakeProvider", () => {
217
227
  });
218
228
 
219
229
  test("generates optional values", ({ expect }) => {
220
- const fake = new FakeProvider({ seed: 12345 });
230
+ const fake = new FakeProvider();
221
231
  const schema = t.object({
222
232
  required: t.text(),
223
233
  optional: t.optional(t.text()),
@@ -241,7 +251,7 @@ describe("FakeProvider", () => {
241
251
  });
242
252
 
243
253
  test("generates nullable values", ({ expect }) => {
244
- const fake = new FakeProvider({ seed: 12345 });
254
+ const fake = new FakeProvider();
245
255
  const schema = t.object({
246
256
  required: t.text(),
247
257
  nullable: t.nullable(t.text()),
@@ -265,7 +275,7 @@ describe("FakeProvider", () => {
265
275
  });
266
276
 
267
277
  test("generates union types", ({ expect }) => {
268
- const fake = new FakeProvider({ seed: 12345 });
278
+ const fake = new FakeProvider();
269
279
  const schema = t.union([t.string(), t.number(), t.boolean()]);
270
280
  const result = fake.generate(schema);
271
281
 
@@ -274,7 +284,7 @@ describe("FakeProvider", () => {
274
284
  });
275
285
 
276
286
  test("generates record types", ({ expect }) => {
277
- const fake = new FakeProvider({ seed: 12345 });
287
+ const fake = new FakeProvider();
278
288
  const schema = t.record(t.string(), t.number());
279
289
  const result = fake.generate(schema);
280
290
 
@@ -288,7 +298,7 @@ describe("FakeProvider", () => {
288
298
  });
289
299
 
290
300
  test("generates tuple types", ({ expect }) => {
291
- const fake = new FakeProvider({ seed: 12345 });
301
+ const fake = new FakeProvider();
292
302
  const schema = t.tuple([t.string(), t.number(), t.boolean()]);
293
303
  const result = fake.generate(schema);
294
304
 
@@ -300,7 +310,7 @@ describe("FakeProvider", () => {
300
310
  });
301
311
 
302
312
  test("generates literal values", ({ expect }) => {
303
- const fake = new FakeProvider({ seed: 12345 });
313
+ const fake = new FakeProvider();
304
314
  const schema = t.const("ACTIVE");
305
315
  const result = fake.generate(schema);
306
316
 
@@ -308,7 +318,7 @@ describe("FakeProvider", () => {
308
318
  });
309
319
 
310
320
  test("generates null", ({ expect }) => {
311
- const fake = new FakeProvider({ seed: 12345 });
321
+ const fake = new FakeProvider();
312
322
  const schema = t.null();
313
323
  const result = fake.generate(schema);
314
324
 
@@ -316,7 +326,7 @@ describe("FakeProvider", () => {
316
326
  });
317
327
 
318
328
  test("generates undefined", ({ expect }) => {
319
- const fake = new FakeProvider({ seed: 12345 });
329
+ const fake = new FakeProvider();
320
330
  const schema = t.undefined();
321
331
  const result = fake.generate(schema);
322
332
 
@@ -324,7 +334,7 @@ describe("FakeProvider", () => {
324
334
  });
325
335
 
326
336
  test("generates void as undefined", ({ expect }) => {
327
- const fake = new FakeProvider({ seed: 12345 });
337
+ const fake = new FakeProvider();
328
338
  const schema = t.void();
329
339
  const result = fake.generate(schema);
330
340
 
@@ -332,7 +342,7 @@ describe("FakeProvider", () => {
332
342
  });
333
343
 
334
344
  test("generates any type", ({ expect }) => {
335
- const fake = new FakeProvider({ seed: 12345 });
345
+ const fake = new FakeProvider();
336
346
  const schema = t.any();
337
347
  const result = fake.generate(schema);
338
348
 
@@ -341,7 +351,7 @@ describe("FakeProvider", () => {
341
351
  });
342
352
 
343
353
  test("generateMany produces multiple values", ({ expect }) => {
344
- const fake = new FakeProvider({ seed: 12345 });
354
+ const fake = new FakeProvider();
345
355
  const schema = t.object({
346
356
  id: t.uuid(),
347
357
  name: t.text(),
@@ -364,12 +374,12 @@ describe("FakeProvider", () => {
364
374
  });
365
375
 
366
376
  // Generate with same seed - should produce same results
367
- const fake1 = new FakeProvider({ seed: 99999 });
377
+ const fake1 = new FakeProvider().configure({ seed: 99999 });
368
378
  const result1a = fake1.generate(schema);
369
379
  const result1b = fake1.generate(schema);
370
380
 
371
381
  // Create new instance with same seed
372
- const fake2 = new FakeProvider({ seed: 99999 });
382
+ const fake2 = new FakeProvider().configure({ seed: 99999 });
373
383
  const result2a = fake2.generate(schema);
374
384
 
375
385
  // First result from both instances should match
@@ -391,7 +401,7 @@ describe("FakeProvider", () => {
391
401
  });
392
402
 
393
403
  test("complex nested schema", ({ expect }) => {
394
- const fake = new FakeProvider({ seed: 12345 });
404
+ const fake = new FakeProvider();
395
405
  const schema = t.object({
396
406
  id: t.uuid(),
397
407
  user: t.object({
@@ -423,7 +433,7 @@ describe("FakeProvider", () => {
423
433
  });
424
434
 
425
435
  test("valueLabel pattern", ({ expect }) => {
426
- const fake = new FakeProvider({ seed: 12345 });
436
+ const fake = new FakeProvider();
427
437
  const schema = t.valueLabel();
428
438
  const result = fake.generate(schema);
429
439
 
@@ -435,4 +445,212 @@ describe("FakeProvider", () => {
435
445
  expect(typeof result.description).toBe("string");
436
446
  }
437
447
  });
448
+
449
+ test("context-aware generation for string fields", ({ expect }) => {
450
+ const fake = new FakeProvider();
451
+ const schema = t.object({
452
+ email: t.string(),
453
+ firstName: t.string(),
454
+ lastName: t.string(),
455
+ name: t.string(),
456
+ username: t.string(),
457
+ phone: t.string(),
458
+ address: t.string(),
459
+ city: t.string(),
460
+ country: t.string(),
461
+ company: t.string(),
462
+ url: t.string(),
463
+ });
464
+ const result = fake.generate(schema);
465
+
466
+ expect(result.email).toMatch(/@/);
467
+ expect(typeof result.firstName).toBe("string");
468
+ expect(typeof result.lastName).toBe("string");
469
+ expect(typeof result.name).toBe("string");
470
+ expect(typeof result.username).toBe("string");
471
+ expect(typeof result.phone).toBe("string");
472
+ expect(typeof result.address).toBe("string");
473
+ expect(typeof result.city).toBe("string");
474
+ expect(typeof result.country).toBe("string");
475
+ expect(typeof result.company).toBe("string");
476
+ expect(result.url).toMatch(/^https?:\/\//);
477
+ });
478
+
479
+ test("context-aware generation handles snake_case field names", ({
480
+ expect,
481
+ }) => {
482
+ const fake = new FakeProvider();
483
+ const schema = t.object({
484
+ user_name: t.string(),
485
+ first_name: t.string(),
486
+ last_name: t.string(),
487
+ full_name: t.string(),
488
+ phone_number: t.string(),
489
+ email_address: t.string(),
490
+ });
491
+ const result = fake.generate(schema);
492
+
493
+ expect(typeof result.user_name).toBe("string");
494
+ expect(typeof result.first_name).toBe("string");
495
+ expect(typeof result.last_name).toBe("string");
496
+ expect(typeof result.full_name).toBe("string");
497
+ expect(typeof result.phone_number).toBe("string");
498
+ expect(result.email_address).toMatch(/@/);
499
+ });
500
+
501
+ test("context-aware generation handles kebab-case field names", ({
502
+ expect,
503
+ }) => {
504
+ const fake = new FakeProvider();
505
+ const schema = t.object({
506
+ "user-name": t.string(),
507
+ "first-name": t.string(),
508
+ "last-name": t.string(),
509
+ "e-mail": t.string(),
510
+ });
511
+ const result = fake.generate(schema);
512
+
513
+ expect(typeof result["user-name"]).toBe("string");
514
+ expect(typeof result["first-name"]).toBe("string");
515
+ expect(typeof result["last-name"]).toBe("string");
516
+ expect(result["e-mail"]).toMatch(/@/);
517
+ });
518
+
519
+ test("context-aware generation for number fields", ({ expect }) => {
520
+ const fake = new FakeProvider();
521
+ const schema = t.object({
522
+ age: t.integer(),
523
+ year: t.integer(),
524
+ month: t.integer(),
525
+ day: t.integer(),
526
+ price: t.number(),
527
+ user_age: t.integer(),
528
+ });
529
+ const result = fake.generate(schema);
530
+
531
+ expect(result.age).toBeGreaterThanOrEqual(18);
532
+ expect(result.age).toBeLessThanOrEqual(99);
533
+ expect(result.year).toBeGreaterThan(1900);
534
+ expect(result.month).toBeGreaterThanOrEqual(1);
535
+ expect(result.month).toBeLessThanOrEqual(12);
536
+ expect(result.day).toBeGreaterThanOrEqual(1);
537
+ expect(result.day).toBeLessThanOrEqual(31);
538
+ expect(result.price).toBeGreaterThan(0);
539
+ expect(result.user_age).toBeGreaterThanOrEqual(18);
540
+ expect(result.user_age).toBeLessThanOrEqual(99);
541
+ });
542
+
543
+ test("context-aware generation respects explicit formats", ({ expect }) => {
544
+ const fake = new FakeProvider();
545
+ const schema = t.object({
546
+ // Even though field is named "email", the uuid format takes precedence
547
+ email: t.uuid(),
548
+ });
549
+ const result = fake.generate(schema);
550
+
551
+ expect(result.email).toMatch(
552
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
553
+ );
554
+ });
555
+
556
+ test("context-aware generation respects enum values", ({ expect }) => {
557
+ const fake = new FakeProvider();
558
+ const schema = t.object({
559
+ // Even though field is named "username", the enum takes precedence
560
+ username: t.enum(["admin", "user", "guest"]),
561
+ });
562
+ const result = fake.generate(schema);
563
+
564
+ expect(["admin", "user", "guest"]).toContain(result.username);
565
+ });
566
+
567
+ test("respects optionalProbability option", ({ expect }) => {
568
+ // With probability 0, optional should never be undefined
569
+ const fakeNever = new FakeProvider().configure({ optionalProbability: 0 });
570
+ const schema = t.object({ value: t.optional(t.string()) });
571
+ const resultsNever = Array.from({ length: 20 }, () =>
572
+ fakeNever.generate(schema),
573
+ );
574
+ expect(resultsNever.every((r) => r.value !== undefined)).toBe(true);
575
+
576
+ // With probability 1, optional should always be undefined
577
+ const fakeAlways = new FakeProvider().configure({ optionalProbability: 1 });
578
+ const resultsAlways = Array.from({ length: 20 }, () =>
579
+ fakeAlways.generate(schema),
580
+ );
581
+ expect(resultsAlways.every((r) => r.value === undefined)).toBe(true);
582
+ });
583
+
584
+ test("respects nullableProbability option", ({ expect }) => {
585
+ // With probability 0, nullable should never be null
586
+ const fakeNever = new FakeProvider().configure({ nullableProbability: 0 });
587
+ const schema = t.object({ value: t.nullable(t.string()) });
588
+ const resultsNever = Array.from({ length: 20 }, () =>
589
+ fakeNever.generate(schema),
590
+ );
591
+ expect(resultsNever.every((r) => r.value !== null)).toBe(true);
592
+
593
+ // With probability 1, nullable should always be null
594
+ const fakeAlways = new FakeProvider().configure({ nullableProbability: 1 });
595
+ const resultsAlways = Array.from({ length: 20 }, () =>
596
+ fakeAlways.generate(schema),
597
+ );
598
+ expect(resultsAlways.every((r) => r.value === null)).toBe(true);
599
+ });
600
+
601
+ test("respects maxArrayLength option", ({ expect }) => {
602
+ // With maxArrayLength: 10, arrays should not exceed 10 items
603
+ const fake = new FakeProvider().configure({ maxArrayLength: 10 });
604
+ const schema = t.array(t.number(), { minItems: 1, maxItems: 100 });
605
+ const results = Array.from({ length: 20 }, () => fake.generate(schema));
606
+
607
+ for (const result of results) {
608
+ expect(result.length).toBeLessThanOrEqual(10);
609
+ }
610
+ });
611
+
612
+ test("respects defaultArrayLength option", ({ expect }) => {
613
+ // With defaultArrayLength: 3, arrays without maxItems should default to 3
614
+ // Note: Use TypeBox directly since Alepha's t.array() always sets maxItems: 1000
615
+ const fake = new FakeProvider().configure({
616
+ defaultArrayLength: 3,
617
+ maxArrayLength: 100,
618
+ });
619
+ const schema = Type.Array(Type.Number()); // No minItems/maxItems
620
+ const results = Array.from({ length: 20 }, () => fake.generate(schema));
621
+
622
+ for (const result of results) {
623
+ expect(result.length).toBeLessThanOrEqual(3);
624
+ }
625
+ });
626
+
627
+ test("respects defaultRecordEntries option", ({ expect }) => {
628
+ const fake = new FakeProvider().configure({
629
+ defaultRecordEntries: { min: 5, max: 5 },
630
+ });
631
+ const schema = t.record(t.string(), t.number());
632
+ const result = fake.generate(schema);
633
+
634
+ expect(Object.keys(result).length).toBe(5);
635
+ });
636
+
637
+ test("configure() reseeds faker when seed changes", ({ expect }) => {
638
+ const schema = t.uuid();
639
+ const fake = new FakeProvider();
640
+
641
+ // Generate with default seed
642
+ const result1 = fake.generate(schema);
643
+
644
+ // Reconfigure with same seed - should reset and produce same result
645
+ fake.configure({ seed: 12345 });
646
+ const result2 = fake.generate(schema);
647
+
648
+ expect(result2).toBe(result1);
649
+
650
+ // Reconfigure with different seed - should produce different result
651
+ fake.configure({ seed: 99999 });
652
+ const result3 = fake.generate(schema);
653
+
654
+ expect(result3).not.toBe(result1);
655
+ });
438
656
  });