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.
- package/dist/index.js +100 -20
- package/dist/index.js.map +1 -1
- package/dist/templates/app/auth-controller.d.ts +2 -0
- package/dist/templates/app/auth-controller.d.ts.map +1 -0
- package/dist/templates/app/auth-controller.js +51 -0
- package/dist/templates/app/auth-controller.js.map +1 -0
- package/dist/templates/app/mcp-echo-server.d.ts +2 -0
- package/dist/templates/app/mcp-echo-server.d.ts.map +1 -0
- package/dist/templates/app/mcp-echo-server.js +13 -0
- package/dist/templates/app/mcp-echo-server.js.map +1 -0
- package/dist/templates/app/mcp-echo-tool.d.ts +2 -0
- package/dist/templates/app/mcp-echo-tool.d.ts.map +1 -0
- package/dist/templates/app/mcp-echo-tool.js +20 -0
- package/dist/templates/app/mcp-echo-tool.js.map +1 -0
- package/dist/templates/app/service-provider.d.ts +3 -0
- package/dist/templates/app/service-provider.d.ts.map +1 -0
- package/dist/templates/app/service-provider.js +27 -0
- package/dist/templates/app/service-provider.js.map +1 -0
- package/dist/templates/app/user-model.d.ts +2 -0
- package/dist/templates/app/user-model.d.ts.map +1 -0
- package/dist/templates/app/user-model.js +19 -0
- package/dist/templates/app/user-model.js.map +1 -0
- package/dist/templates/bootstrap/app.d.ts +3 -0
- package/dist/templates/bootstrap/app.d.ts.map +1 -0
- package/dist/templates/bootstrap/app.js +41 -0
- package/dist/templates/bootstrap/app.js.map +1 -0
- package/dist/templates/bootstrap/providers.d.ts +3 -0
- package/dist/templates/bootstrap/providers.d.ts.map +1 -0
- package/dist/templates/bootstrap/providers.js +27 -0
- package/dist/templates/bootstrap/providers.js.map +1 -0
- package/dist/templates/configs/ai.d.ts +2 -0
- package/dist/templates/configs/ai.d.ts.map +1 -0
- package/dist/templates/configs/ai.js +32 -0
- package/dist/templates/configs/ai.js.map +1 -0
- package/dist/templates/configs/app.d.ts +2 -0
- package/dist/templates/configs/app.d.ts.map +1 -0
- package/dist/templates/configs/app.js +12 -0
- package/dist/templates/configs/app.js.map +1 -0
- package/dist/templates/configs/auth.d.ts +3 -0
- package/dist/templates/configs/auth.d.ts.map +1 -0
- package/dist/templates/configs/auth.js +16 -0
- package/dist/templates/configs/auth.js.map +1 -0
- package/dist/templates/configs/cache.d.ts +2 -0
- package/dist/templates/configs/cache.d.ts.map +1 -0
- package/dist/templates/configs/cache.js +28 -0
- package/dist/templates/configs/cache.js.map +1 -0
- package/dist/templates/configs/cashier.d.ts +2 -0
- package/dist/templates/configs/cashier.d.ts.map +1 -0
- package/dist/templates/configs/cashier.js +22 -0
- package/dist/templates/configs/cashier.js.map +1 -0
- package/dist/templates/configs/crypt.d.ts +2 -0
- package/dist/templates/configs/crypt.d.ts.map +1 -0
- package/dist/templates/configs/crypt.js +16 -0
- package/dist/templates/configs/crypt.js.map +1 -0
- package/dist/templates/configs/database.d.ts +3 -0
- package/dist/templates/configs/database.d.ts.map +1 -0
- package/dist/templates/configs/database.js +28 -0
- package/dist/templates/configs/database.js.map +1 -0
- package/dist/templates/configs/hash.d.ts +2 -0
- package/dist/templates/configs/hash.d.ts.map +1 -0
- package/dist/templates/configs/hash.js +12 -0
- package/dist/templates/configs/hash.js.map +1 -0
- package/dist/templates/configs/horizon.d.ts +2 -0
- package/dist/templates/configs/horizon.d.ts.map +1 -0
- package/dist/templates/configs/horizon.js +30 -0
- package/dist/templates/configs/horizon.js.map +1 -0
- package/dist/templates/configs/index.d.ts +3 -0
- package/dist/templates/configs/index.d.ts.map +1 -0
- package/dist/templates/configs/index.js +96 -0
- package/dist/templates/configs/index.js.map +1 -0
- package/dist/templates/configs/localization.d.ts +2 -0
- package/dist/templates/configs/localization.d.ts.map +1 -0
- package/dist/templates/configs/localization.js +13 -0
- package/dist/templates/configs/localization.js.map +1 -0
- package/dist/templates/configs/log.d.ts +2 -0
- package/dist/templates/configs/log.d.ts.map +1 -0
- package/dist/templates/configs/log.js +40 -0
- package/dist/templates/configs/log.js.map +1 -0
- package/dist/templates/configs/mail.d.ts +2 -0
- package/dist/templates/configs/mail.d.ts.map +1 -0
- package/dist/templates/configs/mail.js +33 -0
- package/dist/templates/configs/mail.js.map +1 -0
- package/dist/templates/configs/passport.d.ts +2 -0
- package/dist/templates/configs/passport.d.ts.map +1 -0
- package/dist/templates/configs/passport.js +22 -0
- package/dist/templates/configs/passport.js.map +1 -0
- package/dist/templates/configs/pennant.d.ts +2 -0
- package/dist/templates/configs/pennant.d.ts.map +1 -0
- package/dist/templates/configs/pennant.js +16 -0
- package/dist/templates/configs/pennant.js.map +1 -0
- package/dist/templates/configs/pulse.d.ts +2 -0
- package/dist/templates/configs/pulse.d.ts.map +1 -0
- package/dist/templates/configs/pulse.js +21 -0
- package/dist/templates/configs/pulse.js.map +1 -0
- package/dist/templates/configs/queue.d.ts +2 -0
- package/dist/templates/configs/queue.d.ts.map +1 -0
- package/dist/templates/configs/queue.js +28 -0
- package/dist/templates/configs/queue.js.map +1 -0
- package/dist/templates/configs/sanctum.d.ts +2 -0
- package/dist/templates/configs/sanctum.d.ts.map +1 -0
- package/dist/templates/configs/sanctum.js +19 -0
- package/dist/templates/configs/sanctum.js.map +1 -0
- package/dist/templates/configs/server.d.ts +2 -0
- package/dist/templates/configs/server.d.ts.map +1 -0
- package/dist/templates/configs/server.js +15 -0
- package/dist/templates/configs/server.js.map +1 -0
- package/dist/templates/configs/session.d.ts +2 -0
- package/dist/templates/configs/session.d.ts.map +1 -0
- package/dist/templates/configs/session.js +26 -0
- package/dist/templates/configs/session.js.map +1 -0
- package/dist/templates/configs/socialite.d.ts +2 -0
- package/dist/templates/configs/socialite.d.ts.map +1 -0
- package/dist/templates/configs/socialite.js +27 -0
- package/dist/templates/configs/socialite.js.map +1 -0
- package/dist/templates/configs/storage.d.ts +2 -0
- package/dist/templates/configs/storage.d.ts.map +1 -0
- package/dist/templates/configs/storage.js +35 -0
- package/dist/templates/configs/storage.js.map +1 -0
- package/dist/templates/configs/sync.d.ts +3 -0
- package/dist/templates/configs/sync.d.ts.map +1 -0
- package/dist/templates/configs/sync.js +17 -0
- package/dist/templates/configs/sync.js.map +1 -0
- package/dist/templates/configs/telescope.d.ts +2 -0
- package/dist/templates/configs/telescope.d.ts.map +1 -0
- package/dist/templates/configs/telescope.js +25 -0
- package/dist/templates/configs/telescope.js.map +1 -0
- package/dist/templates/css/index.d.ts +3 -0
- package/dist/templates/css/index.d.ts.map +1 -0
- package/dist/templates/css/index.js +140 -0
- package/dist/templates/css/index.js.map +1 -0
- package/dist/templates/css/plain.d.ts +2 -0
- package/dist/templates/css/plain.d.ts.map +1 -0
- package/dist/templates/css/plain.js +373 -0
- package/dist/templates/css/plain.js.map +1 -0
- package/dist/templates/css/tailwind.d.ts +2 -0
- package/dist/templates/css/tailwind.d.ts.map +1 -0
- package/dist/templates/css/tailwind.js +176 -0
- package/dist/templates/css/tailwind.js.map +1 -0
- package/dist/templates/demos/bk-socket.d.ts +2 -0
- package/dist/templates/demos/bk-socket.d.ts.map +1 -0
- package/dist/templates/demos/bk-socket.js +95 -0
- package/dist/templates/demos/bk-socket.js.map +1 -0
- package/dist/templates/demos/contact.d.ts +3 -0
- package/dist/templates/demos/contact.d.ts.map +1 -0
- package/dist/templates/demos/contact.js +106 -0
- package/dist/templates/demos/contact.js.map +1 -0
- package/dist/templates/demos/index-view.d.ts +3 -0
- package/dist/templates/demos/index-view.d.ts.map +1 -0
- package/dist/templates/demos/index-view.js +67 -0
- package/dist/templates/demos/index-view.js.map +1 -0
- package/dist/templates/demos/live.d.ts +2 -0
- package/dist/templates/demos/live.d.ts.map +1 -0
- package/dist/templates/demos/live.js +97 -0
- package/dist/templates/demos/live.js.map +1 -0
- package/dist/templates/demos/registry.d.ts +13 -0
- package/dist/templates/demos/registry.d.ts.map +1 -0
- package/dist/templates/demos/registry.js +15 -0
- package/dist/templates/demos/registry.js.map +1 -0
- package/dist/templates/demos/ws.d.ts +2 -0
- package/dist/templates/demos/ws.d.ts.map +1 -0
- package/dist/templates/demos/ws.js +106 -0
- package/dist/templates/demos/ws.js.map +1 -0
- package/dist/templates/env.d.ts +7 -0
- package/dist/templates/env.d.ts.map +1 -0
- package/dist/templates/env.js +127 -0
- package/dist/templates/env.js.map +1 -0
- package/dist/templates/package-json.d.ts +3 -0
- package/dist/templates/package-json.d.ts.map +1 -0
- package/dist/templates/package-json.js +195 -0
- package/dist/templates/package-json.js.map +1 -0
- package/dist/templates/package-managers.d.ts +14 -0
- package/dist/templates/package-managers.d.ts.map +1 -0
- package/dist/templates/package-managers.js +49 -0
- package/dist/templates/package-managers.js.map +1 -0
- package/dist/templates/pages/ai-chat.d.ts +7 -0
- package/dist/templates/pages/ai-chat.d.ts.map +1 -0
- package/dist/templates/pages/ai-chat.js +285 -0
- package/dist/templates/pages/ai-chat.js.map +1 -0
- package/dist/templates/pages/demo.d.ts +4 -0
- package/dist/templates/pages/demo.d.ts.map +1 -0
- package/dist/templates/pages/demo.js +71 -0
- package/dist/templates/pages/demo.js.map +1 -0
- package/dist/templates/pages/error.d.ts +7 -0
- package/dist/templates/pages/error.d.ts.map +1 -0
- package/dist/templates/pages/error.js +148 -0
- package/dist/templates/pages/error.js.map +1 -0
- package/dist/templates/pages/index.d.ts +9 -0
- package/dist/templates/pages/index.d.ts.map +1 -0
- package/dist/templates/pages/index.js +311 -0
- package/dist/templates/pages/index.js.map +1 -0
- package/dist/templates/prisma/auth.d.ts +2 -0
- package/dist/templates/prisma/auth.d.ts.map +1 -0
- package/dist/templates/prisma/auth.js +22 -0
- package/dist/templates/prisma/auth.js.map +1 -0
- package/dist/templates/prisma/base.d.ts +3 -0
- package/dist/templates/prisma/base.d.ts.map +1 -0
- package/dist/templates/prisma/base.js +14 -0
- package/dist/templates/prisma/base.js.map +1 -0
- package/dist/templates/prisma/config.d.ts +3 -0
- package/dist/templates/prisma/config.d.ts.map +1 -0
- package/dist/templates/prisma/config.js +15 -0
- package/dist/templates/prisma/config.js.map +1 -0
- package/dist/templates/prisma/notification.d.ts +2 -0
- package/dist/templates/prisma/notification.d.ts.map +1 -0
- package/dist/templates/prisma/notification.js +16 -0
- package/dist/templates/prisma/notification.js.map +1 -0
- package/dist/templates/prisma/passport.d.ts +2 -0
- package/dist/templates/prisma/passport.d.ts.map +1 -0
- package/dist/templates/prisma/passport.js +69 -0
- package/dist/templates/prisma/passport.js.map +1 -0
- package/dist/templates/routes/api.d.ts +3 -0
- package/dist/templates/routes/api.d.ts.map +1 -0
- package/dist/templates/routes/api.js +118 -0
- package/dist/templates/routes/api.js.map +1 -0
- package/dist/templates/routes/console.d.ts +2 -0
- package/dist/templates/routes/console.d.ts.map +1 -0
- package/dist/templates/routes/console.js +22 -0
- package/dist/templates/routes/console.js.map +1 -0
- package/dist/templates/routes/web.d.ts +4 -0
- package/dist/templates/routes/web.d.ts.map +1 -0
- package/dist/templates/routes/web.js +108 -0
- package/dist/templates/routes/web.js.map +1 -0
- package/dist/templates/server.d.ts +2 -0
- package/dist/templates/server.d.ts.map +1 -0
- package/dist/templates/server.js +10 -0
- package/dist/templates/server.js.map +1 -0
- package/dist/templates/tsconfig.d.ts +3 -0
- package/dist/templates/tsconfig.d.ts.map +1 -0
- package/dist/templates/tsconfig.js +33 -0
- package/dist/templates/tsconfig.js.map +1 -0
- package/dist/templates/views/welcome.d.ts +6 -0
- package/dist/templates/views/welcome.d.ts.map +1 -0
- package/dist/templates/views/welcome.js +396 -0
- package/dist/templates/views/welcome.js.map +1 -0
- package/dist/templates/vite.d.ts +3 -0
- package/dist/templates/vite.d.ts.map +1 -0
- package/dist/templates/vite.js +61 -0
- package/dist/templates/vite.js.map +1 -0
- package/dist/templates.d.ts +28 -17
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +99 -3779
- package/dist/templates.js.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/templates/server.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,IAAI,MAAM,CAQjC"}
|
|
@@ -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 @@
|
|
|
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"}
|