create-rudder-app 0.3.1 → 0.4.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 (243) hide show
  1. package/dist/index.js +100 -20
  2. package/dist/index.js.map +1 -1
  3. package/dist/templates/app/auth-controller.d.ts +2 -0
  4. package/dist/templates/app/auth-controller.d.ts.map +1 -0
  5. package/dist/templates/app/auth-controller.js +51 -0
  6. package/dist/templates/app/auth-controller.js.map +1 -0
  7. package/dist/templates/app/mcp-echo-server.d.ts +2 -0
  8. package/dist/templates/app/mcp-echo-server.d.ts.map +1 -0
  9. package/dist/templates/app/mcp-echo-server.js +13 -0
  10. package/dist/templates/app/mcp-echo-server.js.map +1 -0
  11. package/dist/templates/app/mcp-echo-tool.d.ts +2 -0
  12. package/dist/templates/app/mcp-echo-tool.d.ts.map +1 -0
  13. package/dist/templates/app/mcp-echo-tool.js +20 -0
  14. package/dist/templates/app/mcp-echo-tool.js.map +1 -0
  15. package/dist/templates/app/service-provider.d.ts +3 -0
  16. package/dist/templates/app/service-provider.d.ts.map +1 -0
  17. package/dist/templates/app/service-provider.js +27 -0
  18. package/dist/templates/app/service-provider.js.map +1 -0
  19. package/dist/templates/app/user-model.d.ts +2 -0
  20. package/dist/templates/app/user-model.d.ts.map +1 -0
  21. package/dist/templates/app/user-model.js +19 -0
  22. package/dist/templates/app/user-model.js.map +1 -0
  23. package/dist/templates/bootstrap/app.d.ts +3 -0
  24. package/dist/templates/bootstrap/app.d.ts.map +1 -0
  25. package/dist/templates/bootstrap/app.js +41 -0
  26. package/dist/templates/bootstrap/app.js.map +1 -0
  27. package/dist/templates/bootstrap/providers.d.ts +3 -0
  28. package/dist/templates/bootstrap/providers.d.ts.map +1 -0
  29. package/dist/templates/bootstrap/providers.js +27 -0
  30. package/dist/templates/bootstrap/providers.js.map +1 -0
  31. package/dist/templates/configs/ai.d.ts +2 -0
  32. package/dist/templates/configs/ai.d.ts.map +1 -0
  33. package/dist/templates/configs/ai.js +32 -0
  34. package/dist/templates/configs/ai.js.map +1 -0
  35. package/dist/templates/configs/app.d.ts +2 -0
  36. package/dist/templates/configs/app.d.ts.map +1 -0
  37. package/dist/templates/configs/app.js +12 -0
  38. package/dist/templates/configs/app.js.map +1 -0
  39. package/dist/templates/configs/auth.d.ts +3 -0
  40. package/dist/templates/configs/auth.d.ts.map +1 -0
  41. package/dist/templates/configs/auth.js +16 -0
  42. package/dist/templates/configs/auth.js.map +1 -0
  43. package/dist/templates/configs/cache.d.ts +2 -0
  44. package/dist/templates/configs/cache.d.ts.map +1 -0
  45. package/dist/templates/configs/cache.js +28 -0
  46. package/dist/templates/configs/cache.js.map +1 -0
  47. package/dist/templates/configs/cashier.d.ts +2 -0
  48. package/dist/templates/configs/cashier.d.ts.map +1 -0
  49. package/dist/templates/configs/cashier.js +22 -0
  50. package/dist/templates/configs/cashier.js.map +1 -0
  51. package/dist/templates/configs/crypt.d.ts +2 -0
  52. package/dist/templates/configs/crypt.d.ts.map +1 -0
  53. package/dist/templates/configs/crypt.js +16 -0
  54. package/dist/templates/configs/crypt.js.map +1 -0
  55. package/dist/templates/configs/database.d.ts +3 -0
  56. package/dist/templates/configs/database.d.ts.map +1 -0
  57. package/dist/templates/configs/database.js +28 -0
  58. package/dist/templates/configs/database.js.map +1 -0
  59. package/dist/templates/configs/hash.d.ts +2 -0
  60. package/dist/templates/configs/hash.d.ts.map +1 -0
  61. package/dist/templates/configs/hash.js +12 -0
  62. package/dist/templates/configs/hash.js.map +1 -0
  63. package/dist/templates/configs/horizon.d.ts +2 -0
  64. package/dist/templates/configs/horizon.d.ts.map +1 -0
  65. package/dist/templates/configs/horizon.js +30 -0
  66. package/dist/templates/configs/horizon.js.map +1 -0
  67. package/dist/templates/configs/index.d.ts +3 -0
  68. package/dist/templates/configs/index.d.ts.map +1 -0
  69. package/dist/templates/configs/index.js +96 -0
  70. package/dist/templates/configs/index.js.map +1 -0
  71. package/dist/templates/configs/localization.d.ts +2 -0
  72. package/dist/templates/configs/localization.d.ts.map +1 -0
  73. package/dist/templates/configs/localization.js +13 -0
  74. package/dist/templates/configs/localization.js.map +1 -0
  75. package/dist/templates/configs/log.d.ts +2 -0
  76. package/dist/templates/configs/log.d.ts.map +1 -0
  77. package/dist/templates/configs/log.js +40 -0
  78. package/dist/templates/configs/log.js.map +1 -0
  79. package/dist/templates/configs/mail.d.ts +2 -0
  80. package/dist/templates/configs/mail.d.ts.map +1 -0
  81. package/dist/templates/configs/mail.js +33 -0
  82. package/dist/templates/configs/mail.js.map +1 -0
  83. package/dist/templates/configs/passport.d.ts +2 -0
  84. package/dist/templates/configs/passport.d.ts.map +1 -0
  85. package/dist/templates/configs/passport.js +22 -0
  86. package/dist/templates/configs/passport.js.map +1 -0
  87. package/dist/templates/configs/pennant.d.ts +2 -0
  88. package/dist/templates/configs/pennant.d.ts.map +1 -0
  89. package/dist/templates/configs/pennant.js +16 -0
  90. package/dist/templates/configs/pennant.js.map +1 -0
  91. package/dist/templates/configs/pulse.d.ts +2 -0
  92. package/dist/templates/configs/pulse.d.ts.map +1 -0
  93. package/dist/templates/configs/pulse.js +21 -0
  94. package/dist/templates/configs/pulse.js.map +1 -0
  95. package/dist/templates/configs/queue.d.ts +2 -0
  96. package/dist/templates/configs/queue.d.ts.map +1 -0
  97. package/dist/templates/configs/queue.js +28 -0
  98. package/dist/templates/configs/queue.js.map +1 -0
  99. package/dist/templates/configs/sanctum.d.ts +2 -0
  100. package/dist/templates/configs/sanctum.d.ts.map +1 -0
  101. package/dist/templates/configs/sanctum.js +19 -0
  102. package/dist/templates/configs/sanctum.js.map +1 -0
  103. package/dist/templates/configs/server.d.ts +2 -0
  104. package/dist/templates/configs/server.d.ts.map +1 -0
  105. package/dist/templates/configs/server.js +15 -0
  106. package/dist/templates/configs/server.js.map +1 -0
  107. package/dist/templates/configs/session.d.ts +2 -0
  108. package/dist/templates/configs/session.d.ts.map +1 -0
  109. package/dist/templates/configs/session.js +26 -0
  110. package/dist/templates/configs/session.js.map +1 -0
  111. package/dist/templates/configs/socialite.d.ts +2 -0
  112. package/dist/templates/configs/socialite.d.ts.map +1 -0
  113. package/dist/templates/configs/socialite.js +27 -0
  114. package/dist/templates/configs/socialite.js.map +1 -0
  115. package/dist/templates/configs/storage.d.ts +2 -0
  116. package/dist/templates/configs/storage.d.ts.map +1 -0
  117. package/dist/templates/configs/storage.js +35 -0
  118. package/dist/templates/configs/storage.js.map +1 -0
  119. package/dist/templates/configs/sync.d.ts +3 -0
  120. package/dist/templates/configs/sync.d.ts.map +1 -0
  121. package/dist/templates/configs/sync.js +17 -0
  122. package/dist/templates/configs/sync.js.map +1 -0
  123. package/dist/templates/configs/telescope.d.ts +2 -0
  124. package/dist/templates/configs/telescope.d.ts.map +1 -0
  125. package/dist/templates/configs/telescope.js +25 -0
  126. package/dist/templates/configs/telescope.js.map +1 -0
  127. package/dist/templates/css/index.d.ts +3 -0
  128. package/dist/templates/css/index.d.ts.map +1 -0
  129. package/dist/templates/css/index.js +140 -0
  130. package/dist/templates/css/index.js.map +1 -0
  131. package/dist/templates/css/plain.d.ts +2 -0
  132. package/dist/templates/css/plain.d.ts.map +1 -0
  133. package/dist/templates/css/plain.js +373 -0
  134. package/dist/templates/css/plain.js.map +1 -0
  135. package/dist/templates/css/tailwind.d.ts +2 -0
  136. package/dist/templates/css/tailwind.d.ts.map +1 -0
  137. package/dist/templates/css/tailwind.js +176 -0
  138. package/dist/templates/css/tailwind.js.map +1 -0
  139. package/dist/templates/demos/bk-socket.d.ts +2 -0
  140. package/dist/templates/demos/bk-socket.d.ts.map +1 -0
  141. package/dist/templates/demos/bk-socket.js +95 -0
  142. package/dist/templates/demos/bk-socket.js.map +1 -0
  143. package/dist/templates/demos/contact.d.ts +3 -0
  144. package/dist/templates/demos/contact.d.ts.map +1 -0
  145. package/dist/templates/demos/contact.js +106 -0
  146. package/dist/templates/demos/contact.js.map +1 -0
  147. package/dist/templates/demos/index-view.d.ts +3 -0
  148. package/dist/templates/demos/index-view.d.ts.map +1 -0
  149. package/dist/templates/demos/index-view.js +67 -0
  150. package/dist/templates/demos/index-view.js.map +1 -0
  151. package/dist/templates/demos/live.d.ts +2 -0
  152. package/dist/templates/demos/live.d.ts.map +1 -0
  153. package/dist/templates/demos/live.js +97 -0
  154. package/dist/templates/demos/live.js.map +1 -0
  155. package/dist/templates/demos/registry.d.ts +13 -0
  156. package/dist/templates/demos/registry.d.ts.map +1 -0
  157. package/dist/templates/demos/registry.js +15 -0
  158. package/dist/templates/demos/registry.js.map +1 -0
  159. package/dist/templates/demos/ws.d.ts +2 -0
  160. package/dist/templates/demos/ws.d.ts.map +1 -0
  161. package/dist/templates/demos/ws.js +106 -0
  162. package/dist/templates/demos/ws.js.map +1 -0
  163. package/dist/templates/env.d.ts +7 -0
  164. package/dist/templates/env.d.ts.map +1 -0
  165. package/dist/templates/env.js +127 -0
  166. package/dist/templates/env.js.map +1 -0
  167. package/dist/templates/package-json.d.ts +3 -0
  168. package/dist/templates/package-json.d.ts.map +1 -0
  169. package/dist/templates/package-json.js +195 -0
  170. package/dist/templates/package-json.js.map +1 -0
  171. package/dist/templates/package-managers.d.ts +14 -0
  172. package/dist/templates/package-managers.d.ts.map +1 -0
  173. package/dist/templates/package-managers.js +49 -0
  174. package/dist/templates/package-managers.js.map +1 -0
  175. package/dist/templates/pages/ai-chat.d.ts +7 -0
  176. package/dist/templates/pages/ai-chat.d.ts.map +1 -0
  177. package/dist/templates/pages/ai-chat.js +285 -0
  178. package/dist/templates/pages/ai-chat.js.map +1 -0
  179. package/dist/templates/pages/demo.d.ts +4 -0
  180. package/dist/templates/pages/demo.d.ts.map +1 -0
  181. package/dist/templates/pages/demo.js +71 -0
  182. package/dist/templates/pages/demo.js.map +1 -0
  183. package/dist/templates/pages/error.d.ts +7 -0
  184. package/dist/templates/pages/error.d.ts.map +1 -0
  185. package/dist/templates/pages/error.js +148 -0
  186. package/dist/templates/pages/error.js.map +1 -0
  187. package/dist/templates/pages/index.d.ts +9 -0
  188. package/dist/templates/pages/index.d.ts.map +1 -0
  189. package/dist/templates/pages/index.js +311 -0
  190. package/dist/templates/pages/index.js.map +1 -0
  191. package/dist/templates/prisma/auth.d.ts +2 -0
  192. package/dist/templates/prisma/auth.d.ts.map +1 -0
  193. package/dist/templates/prisma/auth.js +22 -0
  194. package/dist/templates/prisma/auth.js.map +1 -0
  195. package/dist/templates/prisma/base.d.ts +3 -0
  196. package/dist/templates/prisma/base.d.ts.map +1 -0
  197. package/dist/templates/prisma/base.js +14 -0
  198. package/dist/templates/prisma/base.js.map +1 -0
  199. package/dist/templates/prisma/config.d.ts +3 -0
  200. package/dist/templates/prisma/config.d.ts.map +1 -0
  201. package/dist/templates/prisma/config.js +15 -0
  202. package/dist/templates/prisma/config.js.map +1 -0
  203. package/dist/templates/prisma/notification.d.ts +2 -0
  204. package/dist/templates/prisma/notification.d.ts.map +1 -0
  205. package/dist/templates/prisma/notification.js +16 -0
  206. package/dist/templates/prisma/notification.js.map +1 -0
  207. package/dist/templates/prisma/passport.d.ts +2 -0
  208. package/dist/templates/prisma/passport.d.ts.map +1 -0
  209. package/dist/templates/prisma/passport.js +69 -0
  210. package/dist/templates/prisma/passport.js.map +1 -0
  211. package/dist/templates/routes/api.d.ts +3 -0
  212. package/dist/templates/routes/api.d.ts.map +1 -0
  213. package/dist/templates/routes/api.js +118 -0
  214. package/dist/templates/routes/api.js.map +1 -0
  215. package/dist/templates/routes/console.d.ts +2 -0
  216. package/dist/templates/routes/console.d.ts.map +1 -0
  217. package/dist/templates/routes/console.js +22 -0
  218. package/dist/templates/routes/console.js.map +1 -0
  219. package/dist/templates/routes/web.d.ts +4 -0
  220. package/dist/templates/routes/web.d.ts.map +1 -0
  221. package/dist/templates/routes/web.js +108 -0
  222. package/dist/templates/routes/web.js.map +1 -0
  223. package/dist/templates/server.d.ts +2 -0
  224. package/dist/templates/server.d.ts.map +1 -0
  225. package/dist/templates/server.js +10 -0
  226. package/dist/templates/server.js.map +1 -0
  227. package/dist/templates/tsconfig.d.ts +3 -0
  228. package/dist/templates/tsconfig.d.ts.map +1 -0
  229. package/dist/templates/tsconfig.js +33 -0
  230. package/dist/templates/tsconfig.js.map +1 -0
  231. package/dist/templates/views/welcome.d.ts +6 -0
  232. package/dist/templates/views/welcome.d.ts.map +1 -0
  233. package/dist/templates/views/welcome.js +396 -0
  234. package/dist/templates/views/welcome.js.map +1 -0
  235. package/dist/templates/vite.d.ts +3 -0
  236. package/dist/templates/vite.d.ts.map +1 -0
  237. package/dist/templates/vite.js +61 -0
  238. package/dist/templates/vite.js.map +1 -0
  239. package/dist/templates.d.ts +28 -17
  240. package/dist/templates.d.ts.map +1 -1
  241. package/dist/templates.js +99 -3779
  242. package/dist/templates.js.map +1 -1
  243. package/package.json +2 -2
@@ -0,0 +1,69 @@
1
+ export function prismaPassport() {
2
+ return `model OAuthClient {
3
+ id String @id @default(cuid())
4
+ name String
5
+ secret String?
6
+ redirectUris String @default("[]")
7
+ grantTypes String @default("[\\"authorization_code\\"]")
8
+ scopes String @default("[]")
9
+ confidential Boolean @default(true)
10
+ revoked Boolean @default(false)
11
+ createdAt DateTime @default(now())
12
+ updatedAt DateTime @updatedAt
13
+
14
+ @@map("oauth_clients")
15
+ }
16
+
17
+ model OAuthAccessToken {
18
+ id String @id @default(cuid())
19
+ userId String?
20
+ clientId String
21
+ name String?
22
+ scopes String @default("[]")
23
+ revoked Boolean @default(false)
24
+ expiresAt DateTime
25
+ createdAt DateTime @default(now())
26
+
27
+ @@index([userId])
28
+ @@map("oauth_access_tokens")
29
+ }
30
+
31
+ model OAuthRefreshToken {
32
+ id String @id @default(cuid())
33
+ accessTokenId String @unique
34
+ revoked Boolean @default(false)
35
+ expiresAt DateTime
36
+
37
+ @@map("oauth_refresh_tokens")
38
+ }
39
+
40
+ model OAuthAuthCode {
41
+ id String @id @default(cuid())
42
+ userId String
43
+ clientId String
44
+ scopes String @default("[]")
45
+ revoked Boolean @default(false)
46
+ expiresAt DateTime
47
+ codeChallenge String?
48
+ codeChallengeMethod String?
49
+
50
+ @@map("oauth_auth_codes")
51
+ }
52
+
53
+ model OAuthDeviceCode {
54
+ id String @id @default(cuid())
55
+ clientId String
56
+ userCode String @unique
57
+ deviceCode String @unique
58
+ scopes String @default("[]")
59
+ userId String?
60
+ approved Boolean?
61
+ expiresAt DateTime
62
+ lastPolledAt DateTime?
63
+ createdAt DateTime @default(now())
64
+
65
+ @@map("oauth_device_codes")
66
+ }
67
+ `;
68
+ }
69
+ //# sourceMappingURL=passport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passport.js","sourceRoot":"","sources":["../../../src/templates/prisma/passport.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiER,CAAA;AACD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type TemplateContext } from '../../templates.js';
2
+ export declare function routesApi(ctx: TemplateContext): string;
3
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/templates/routes/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpG,wBAAgB,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CA4HtD"}
@@ -0,0 +1,118 @@
1
+ import { shouldScaffoldAnyDemo, shouldScaffoldDemo } from '../../templates.js';
2
+ export function routesApi(ctx) {
3
+ const imports = [
4
+ "import { router } from '@rudderjs/router'",
5
+ ];
6
+ const lines = [];
7
+ if (ctx.packages.auth || ctx.packages.ai) {
8
+ imports.push("import { app } from '@rudderjs/core'");
9
+ }
10
+ if (ctx.packages.auth) {
11
+ imports.push("import { Auth, AuthManager, runWithAuth } from '@rudderjs/auth'");
12
+ imports.push("import { SessionMiddleware } from '@rudderjs/session'");
13
+ }
14
+ if (ctx.packages.ai) {
15
+ imports.push("import { AI } from '@rudderjs/ai'");
16
+ }
17
+ lines.push('');
18
+ lines.push("router.get('/api/health', (_req, res) => res.json({ status: 'ok' }))");
19
+ if (ctx.packages.auth) {
20
+ lines.push('');
21
+ lines.push(`// GET /api/me — returns current user or null (Laravel Sanctum SPA-style).
22
+ // Api routes are stateless by default, so session is opted in per-route.
23
+ // Session-mutating handlers (sign-in, sign-up, sign-out, password reset)
24
+ // live in routes/web.ts so they inherit SessionMiddleware from the web group.
25
+ router.get('/api/me', async (req, res) => {
26
+ const manager = app().make<AuthManager>('auth.manager')
27
+ let user: Record<string, unknown> | null = null
28
+ await runWithAuth(manager, async () => {
29
+ const authUser = await Auth.user()
30
+ if (authUser) {
31
+ user = { id: authUser.getAuthIdentifier() }
32
+ }
33
+ })
34
+ res.json({ user })
35
+ }, [SessionMiddleware()])`);
36
+ }
37
+ if (ctx.packages.ai) {
38
+ lines.push('');
39
+ lines.push(`// POST /api/ai/chat — simple AI chat endpoint
40
+ router.post('/api/ai/chat', async (req, res) => {
41
+ const { messages } = req.body as { messages: { role: string; content: string }[] }
42
+ const lastMessage = messages.at(-1)?.content ?? ''
43
+ const response = await AI.agent('You are a helpful assistant.').prompt(lastMessage)
44
+ res.json({ message: response.text })
45
+ })`);
46
+ }
47
+ if (ctx.packages.passport) {
48
+ imports.push("import { registerPassportRoutes, RequireBearer, scope } from '@rudderjs/passport'");
49
+ lines.push('');
50
+ lines.push(`// ── Passport OAuth 2 routes ──────────────────────────────
51
+ //
52
+ // Registers /oauth/authorize, /oauth/token, /oauth/tokens/:id,
53
+ // /oauth/scopes, /oauth/device/code, /oauth/device/approve.
54
+ //
55
+ // Requires: RSA keys via \`pnpm rudder passport:keys\` and an OAuth client
56
+ // via \`pnpm rudder passport:client <name>\`.
57
+ const passportRouter = {
58
+ get: (path: string, handler: any) => router.get(path, handler),
59
+ post: (path: string, handler: any) => router.post(path, handler),
60
+ delete: (path: string, handler: any) => router.delete(path, handler),
61
+ }
62
+ registerPassportRoutes(passportRouter as any)
63
+
64
+ // Example: protected route requiring a Bearer token with 'read' scope
65
+ router.get('/api/passport/me', async (req, res) => {
66
+ res.json({
67
+ user: req.user ?? null,
68
+ scopes: (req.raw as any)?.__passport_scopes ?? [],
69
+ })
70
+ }, [RequireBearer(), scope('read')])`);
71
+ }
72
+ if (shouldScaffoldAnyDemo(ctx)) {
73
+ const wantContact = shouldScaffoldDemo(ctx, 'contact');
74
+ const wantWs = shouldScaffoldDemo(ctx, 'ws');
75
+ if (wantContact)
76
+ imports.push(`import { z } from '@rudderjs/core'`);
77
+ if (wantContact && ctx.packages.auth)
78
+ imports.push(`import { CsrfMiddleware } from '@rudderjs/middleware'`);
79
+ if (wantWs)
80
+ imports.push(`import { broadcast, broadcastStats } from '@rudderjs/broadcast'`);
81
+ lines.push('');
82
+ lines.push(`// ── Demos ────────────────────────────────────────────────`);
83
+ if (wantContact) {
84
+ lines.push(`// POST /api/contact — Zod validation${ctx.packages.auth ? ' + CSRF' : ''}.
85
+ const contactSchema = z.object({
86
+ name: z.string().min(2, 'Name must be at least 2 characters.'),
87
+ email: z.string().email('Please enter a valid email address.'),
88
+ message: z.string().min(10, 'Message must be at least 10 characters.'),
89
+ })
90
+
91
+ router.post('/api/contact', async (req, res) => {
92
+ const result = contactSchema.safeParse(req.body)
93
+ if (!result.success) {
94
+ const errors = Object.fromEntries(result.error.issues.map(i => [i.path[0], i.message]))
95
+ return res.status(422).json({ errors })
96
+ }
97
+ return res.json({ ok: true, message: \`Thanks \${result.data.name}, your message has been received!\` })
98
+ }${ctx.packages.auth ? ', [CsrfMiddleware()]' : ''})`);
99
+ }
100
+ if (wantWs) {
101
+ lines.push('');
102
+ lines.push(`// POST /api/ws/broadcast — push a chat message to subscribers of the 'chat' channel.
103
+ router.post('/api/ws/broadcast', async (req, res) => {
104
+ const { user, text } = req.body as { user: string; text: string }
105
+ broadcast('chat', 'message', { user, text, ts: Date.now() })
106
+ res.json({ ok: true })
107
+ })
108
+
109
+ // GET /api/ws/ping — current connection / channel counts.
110
+ router.get('/api/ws/ping', (_req, res) => res.json(broadcastStats()))`);
111
+ }
112
+ }
113
+ lines.push('');
114
+ lines.push("// Catch-all: any unmatched /api/* route returns 404");
115
+ lines.push("router.all('/api/*', (_req, res) => res.status(404).json({ message: 'Route not found.' }))");
116
+ return imports.join('\n') + '\n' + lines.join('\n') + '\n';
117
+ }
118
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/templates/routes/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function routesConsole(): string;
2
+ //# sourceMappingURL=console.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/templates/routes/console.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,IAAI,MAAM,CAoBtC"}
@@ -0,0 +1,22 @@
1
+ export function routesConsole() {
2
+ return `import { rudder } from '@rudderjs/console'
3
+
4
+ rudder.command('inspire', () => {
5
+ const quotes = [
6
+ 'The best way to predict the future is to create it.',
7
+ 'Build something people want.',
8
+ 'Stay hungry, stay foolish.',
9
+ 'Code is poetry.',
10
+ 'Simplicity is the soul of efficiency.',
11
+ ]
12
+ const quote = quotes[Math.floor(Math.random() * quotes.length)]!
13
+ console.log(\`\\n "\${quote}"\\n\`)
14
+ }).description('Display an inspiring quote')
15
+
16
+ rudder.command('db:seed', async () => {
17
+ // TODO: add your seed data here
18
+ console.log('No seed data configured. Edit routes/console.ts to add seed logic.')
19
+ }).description('Seed the database with sample data')
20
+ `;
21
+ }
22
+ //# sourceMappingURL=console.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/templates/routes/console.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;;;;;;;;;;;CAkBR,CAAA;AACD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type TemplateContext } from '../../templates.js';
2
+ export declare function routesWeb(ctx: TemplateContext): string;
3
+ export declare function welcomeExt(fw: 'react' | 'vue' | 'solid'): string;
4
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../src/templates/routes/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpG,wBAAgB,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAyGtD;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAEhE"}
@@ -0,0 +1,108 @@
1
+ import { shouldScaffoldAnyDemo, shouldScaffoldDemo } from '../../templates.js';
2
+ export function routesWeb(ctx) {
3
+ const hasAuth = ctx.packages.auth;
4
+ const hasWelcome = ctx.frameworks.length === 1;
5
+ // ── imports ─────────────────────────────────────────────
6
+ const imports = [`import { Route } from '@rudderjs/router'`];
7
+ if (hasWelcome) {
8
+ imports.push(`import { createRequire } from 'node:module'`);
9
+ imports.push(`import { view } from '@rudderjs/view'`);
10
+ imports.push(`import { config } from '@rudderjs/core'`);
11
+ }
12
+ if (hasAuth) {
13
+ imports.push(`import { CsrfMiddleware } from '@rudderjs/middleware'`);
14
+ imports.push(`import { registerAuthRoutes } from '@rudderjs/auth/routes'`);
15
+ imports.push(`import { auth } from '@rudderjs/auth'`);
16
+ imports.push(`import { AuthController } from '../app/Http/Controllers/AuthController.ts'`);
17
+ }
18
+ // ── middleware chain shared with auth routes + welcome ─
19
+ // SessionMiddleware + AuthMiddleware are auto-installed on the web group by
20
+ // their providers. Only CSRF stays per-route so specific endpoints (webhooks,
21
+ // server-to-server callbacks) can opt out.
22
+ const webMwBlock = hasAuth
23
+ ? `
24
+ // Per-route web middleware — session + auth are auto-applied on the web group.
25
+ const webMw = [CsrfMiddleware()]
26
+ `
27
+ : '';
28
+ // ── auth UI wiring ──────────────────────────────────────
29
+ // GET view pages come from `registerAuthRoutes`; the POST submit handlers
30
+ // come from `AuthController` (extends @rudderjs/auth's BaseAuthController).
31
+ // Both live in routes/web.ts so they inherit SessionMiddleware + AuthMiddleware
32
+ // from the web group. Customize the flow by editing app/Http/Controllers/AuthController.ts.
33
+ const authBlock = hasAuth
34
+ ? `
35
+ // GET pages — login/register/forgot-password/reset-password
36
+ // Views live in app/Views/Auth/ (vendored from @rudderjs/auth/views/${ctx.primary}/)
37
+ registerAuthRoutes(Route, { middleware: webMw })
38
+
39
+ // POST handlers — sign-in/email, sign-up/email, sign-out, password reset.
40
+ // Edit app/Http/Controllers/AuthController.ts to customize.
41
+ Route.registerController(AuthController)
42
+ `
43
+ : '';
44
+ // ── welcome page wiring ─────────────────────────────────
45
+ const welcomeBlock = hasWelcome
46
+ ? `
47
+ // Read RudderJS version from @rudderjs/core's package.json at boot time.
48
+ const _require = createRequire(import.meta.url)
49
+ const rudderCorePkg = _require('@rudderjs/core/package.json') as { version: string }
50
+
51
+ // Welcome page — delete this route and app/Views/Welcome.${welcomeExt(ctx.primary)} to replace it.
52
+ Route.get('/', async () => {${hasAuth ? `
53
+ // Resolve the current user (if signed in) — AuthMiddleware auto-installs on
54
+ // the web group, so auth() has a populated ALS context here.
55
+ const current = await auth().user() as Record<string, unknown> | null
56
+ const user = current
57
+ ? { name: String(current['name'] ?? ''), email: String(current['email'] ?? '') }
58
+ : null` : `
59
+ // Auth is not installed, so the welcome page never shows a signed-in user.
60
+ const user = null`}
61
+ return view('welcome', {
62
+ appName: config<string>('app.name', 'RudderJS'),
63
+ rudderVersion: rudderCorePkg.version,
64
+ nodeVersion: process.version.replace(/^v/, ''),
65
+ env: config<string>('app.env', 'development'),
66
+ user,
67
+ // Laravel's Route::has() — the welcome nav renders Log in / Register links
68
+ // only when the auth package registered these named routes. Install
69
+ // @rudderjs/auth + call registerAuthRoutes() and they appear automatically;
70
+ // uninstall and they vanish. No scaffold-time flag.
71
+ loginUrl: Route.getNamedRoute('login') ?? null,
72
+ registerUrl: Route.getNamedRoute('register') ?? null,
73
+ })
74
+ }${hasAuth ? ', webMw' : ''})
75
+ `
76
+ : '';
77
+ // ── demos wiring ────────────────────────────────────────
78
+ // Controllers for /demos and /demos/<name>. Views live under app/Views/Demos/.
79
+ let demosBlock = '';
80
+ if (shouldScaffoldAnyDemo(ctx)) {
81
+ if (!hasWelcome) {
82
+ // Demo files exist but routesWeb already has `view` imports if hasWelcome.
83
+ // For multi-framework projects (no welcome) we still need the view import here.
84
+ imports.push(`import { view } from '@rudderjs/view'`);
85
+ }
86
+ const lines = [
87
+ `// Demos — see app/Views/Demos/`,
88
+ `Route.get('/demos', async () => view('demos.index'))`,
89
+ ];
90
+ if (shouldScaffoldDemo(ctx, 'contact'))
91
+ lines.push(`Route.get('/demos/contact', async () => view('demos.contact'))`);
92
+ if (shouldScaffoldDemo(ctx, 'ws'))
93
+ lines.push(`Route.get('/demos/ws', async () => view('demos.ws'))`);
94
+ if (shouldScaffoldDemo(ctx, 'live'))
95
+ lines.push(`Route.get('/demos/live', async () => view('demos.live'))`);
96
+ demosBlock = '\n' + lines.join('\n') + '\n';
97
+ }
98
+ return `${imports.join('\n')}
99
+ ${webMwBlock}${authBlock}${welcomeBlock}${demosBlock}
100
+ // Web routes — HTML redirects, guards, and non-API server responses
101
+ // These run before Vike's file-based page routing
102
+ // Use this file for: redirects, server-side auth guards, download routes, sitemaps, etc.
103
+ `;
104
+ }
105
+ export function welcomeExt(fw) {
106
+ return fw === 'vue' ? 'vue' : 'tsx';
107
+ }
108
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/templates/routes/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAwB,MAAM,oBAAoB,CAAA;AAEpG,MAAM,UAAU,SAAS,CAAC,GAAoB;IAC5C,MAAM,OAAO,GAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAA;IACrC,MAAM,UAAU,GAAI,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAA;IAE/C,2DAA2D;IAC3D,MAAM,OAAO,GAAa,CAAC,0CAA0C,CAAC,CAAA;IACtE,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;QAC3D,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;QACrD,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAA;IACzD,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAA;QACrE,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;QAC1E,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;QACrD,OAAO,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAA;IAC5F,CAAC;IAED,0DAA0D;IAC1D,4EAA4E;IAC5E,8EAA8E;IAC9E,2CAA2C;IAC3C,MAAM,UAAU,GAAG,OAAO;QACxB,CAAC,CAAC;;;CAGL;QACG,CAAC,CAAC,EAAE,CAAA;IAEN,2DAA2D;IAC3D,0EAA0E;IAC1E,4EAA4E;IAC5E,gFAAgF;IAChF,4FAA4F;IAC5F,MAAM,SAAS,GAAG,OAAO;QACvB,CAAC,CAAC;;uEAEiE,GAAG,CAAC,OAAO;;;;;;CAMjF;QACG,CAAC,CAAC,EAAE,CAAA;IAEN,2DAA2D;IAC3D,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC;;;;;4DAKsD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;8BACrD,OAAO,CAAC,CAAC,CAAC;;;;;;WAM7B,CAAC,CAAC,CAAC;;oBAEM;;;;;;;;;;;;;;GAcjB,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;CAC1B;QACG,CAAC,CAAC,EAAE,CAAA;IAEN,2DAA2D;IAC3D,+EAA+E;IAC/E,IAAI,UAAU,GAAG,EAAE,CAAA;IACnB,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,2EAA2E;YAC3E,gFAAgF;YAChF,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;QACvD,CAAC;QACD,MAAM,KAAK,GAAG;YACZ,iCAAiC;YACjC,8DAA8D;SAC/D,CAAA;QACD,IAAI,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;QACpH,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC;YAAO,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;QAC/G,IAAI,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC;YAAK,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;QACjH,UAAU,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC7C,CAAC;IAED,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;EAC5B,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU;;;;CAInD,CAAA;AACD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAA6B;IACtD,OAAO,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;AACrC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function serverTs(): string;
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/templates/server.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,IAAI,MAAM,CAQjC"}
@@ -0,0 +1,10 @@
1
+ export function serverTs() {
2
+ return `import type { Server } from 'vike/types'
3
+ import app from './bootstrap/app.js'
4
+
5
+ export default {
6
+ fetch: app.fetch,
7
+ } satisfies Server
8
+ `;
9
+ }
10
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/templates/server.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ;IACtB,OAAO;;;;;;CAMR,CAAA;AACD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TemplateContext } from '../templates.js';
2
+ export declare function tsconfigJson(ctx: TemplateContext): string;
3
+ //# sourceMappingURL=tsconfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsconfig.d.ts","sourceRoot":"","sources":["../../src/templates/tsconfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAiCzD"}
@@ -0,0 +1,33 @@
1
+ export function tsconfigJson(ctx) {
2
+ const hasReact = ctx.frameworks.includes('react');
3
+ const hasSolid = ctx.frameworks.includes('solid');
4
+ const compilerOptions = {
5
+ target: 'ES2022',
6
+ module: 'ESNext',
7
+ moduleResolution: 'bundler',
8
+ lib: ['ES2022', 'DOM', 'DOM.Iterable'],
9
+ strict: true,
10
+ exactOptionalPropertyTypes: true,
11
+ noUncheckedIndexedAccess: true,
12
+ experimentalDecorators: true,
13
+ emitDecoratorMetadata: true,
14
+ skipLibCheck: true,
15
+ noEmit: true,
16
+ baseUrl: '.',
17
+ paths: { '@/*': ['./src/*'], 'App/*': ['./app/*'] },
18
+ allowImportingTsExtensions: true,
19
+ };
20
+ if (hasReact) {
21
+ compilerOptions['jsx'] = 'react-jsx';
22
+ }
23
+ else if (hasSolid) {
24
+ compilerOptions['jsx'] = 'preserve';
25
+ compilerOptions['jsxImportSource'] = 'solid-js';
26
+ }
27
+ // Vue only — no jsx field needed
28
+ return JSON.stringify({
29
+ compilerOptions,
30
+ include: ['src/**/*', 'pages/**/*', 'app/**/*', 'bootstrap/**/*', 'routes/**/*', 'config/**/*', '*.ts', '*.tsx'],
31
+ }, null, 2) + '\n';
32
+ }
33
+ //# sourceMappingURL=tsconfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsconfig.js","sourceRoot":"","sources":["../../src/templates/tsconfig.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,GAAoB;IAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEjD,MAAM,eAAe,GAA4B;QAC/C,MAAM,EAAsB,QAAQ;QACpC,MAAM,EAAsB,QAAQ;QACpC,gBAAgB,EAAY,SAAS;QACrC,GAAG,EAAyB,CAAC,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC;QAC7D,MAAM,EAAsB,IAAI;QAChC,0BAA0B,EAAE,IAAI;QAChC,wBAAwB,EAAI,IAAI;QAChC,sBAAsB,EAAM,IAAI;QAChC,qBAAqB,EAAO,IAAI;QAChC,YAAY,EAAgB,IAAI;QAChC,MAAM,EAAsB,IAAI;QAChC,OAAO,EAAqB,GAAG;QAC/B,KAAK,EAAuB,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE;QACxE,0BAA0B,EAAE,IAAI;KACjC,CAAA;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,eAAe,CAAC,KAAK,CAAC,GAAG,WAAW,CAAA;IACtC,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,eAAe,CAAC,KAAK,CAAC,GAAe,UAAU,CAAA;QAC/C,eAAe,CAAC,iBAAiB,CAAC,GAAG,UAAU,CAAA;IACjD,CAAC;IACD,iCAAiC;IAEjC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe;QACf,OAAO,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC;KACjH,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAA;AACpB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { TemplateContext } from '../../templates.js';
2
+ export declare function welcomeView(ctx: TemplateContext): string;
3
+ export declare function welcomeViewReact(ctx: TemplateContext): string;
4
+ export declare function welcomeViewVue(ctx: TemplateContext): string;
5
+ export declare function welcomeViewSolid(ctx: TemplateContext): string;
6
+ //# sourceMappingURL=welcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../../src/templates/views/welcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,wBAAgB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAMxD;AAsCD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAgH7D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAiH3D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CA6H7D"}