create-rudder-app 0.3.0 → 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 +3 -3
@@ -0,0 +1,396 @@
1
+ export function welcomeView(ctx) {
2
+ switch (ctx.primary) {
3
+ case 'vue': return welcomeViewVue(ctx);
4
+ case 'solid': return welcomeViewSolid(ctx);
5
+ default: return welcomeViewReact(ctx);
6
+ }
7
+ }
8
+ const WELCOME_FEATURES = `const DEFAULT_DOCS = 'https://github.com/rudderjs/rudder'
9
+ const DEFAULT_GITHUB = 'https://github.com/rudderjs/rudder'
10
+
11
+ const features: Feature[] = [
12
+ {
13
+ title: 'Controllers & Routing',
14
+ description: 'Explicit routes in routes/api.ts with middleware, params, named routes, and return types that just work.',
15
+ href: \`\${DEFAULT_DOCS}#routing\`,
16
+ },
17
+ {
18
+ title: 'Eloquent ORM',
19
+ description: 'Laravel-style models on Prisma or Drizzle. Query relationships, scopes, and eager loading without changing mental models.',
20
+ href: \`\${DEFAULT_DOCS}#orm\`,
21
+ },
22
+ {
23
+ title: 'Controller Views',
24
+ description: "The page you're looking at — return view() from a controller, rendered through Vike SSR. Zero adapter, full SPA nav.",
25
+ href: \`\${DEFAULT_DOCS}#views\`,
26
+ },
27
+ {
28
+ title: 'Rudder CLI',
29
+ description: 'Laravel-style make:* generators, schedule, db:seed, and custom commands. Run \\\`pnpm rudder\\\` for the full list.',
30
+ href: \`\${DEFAULT_DOCS}#cli\`,
31
+ },
32
+ {
33
+ title: 'Queues & Jobs',
34
+ description: 'Dispatch background jobs with sync, database, or Redis drivers. Monitor them with @rudderjs/horizon.',
35
+ href: \`\${DEFAULT_DOCS}#queue\`,
36
+ },
37
+ {
38
+ title: 'Auth, Guards, Policies',
39
+ description: 'Session-backed auth, password reset, gates, and RequireAuth / RequireGuest middleware — all through one provider.',
40
+ href: \`\${DEFAULT_DOCS}#auth\`,
41
+ },
42
+ ]`;
43
+ export function welcomeViewReact(ctx) {
44
+ const cssImport = `import '@/index.css'\n\n`;
45
+ return `${cssImport}// URL this view is served at — MUST match the Route.get('/', ...) in routes/web.ts.
46
+ // The scanner reads this constant and writes it into the generated +route.ts,
47
+ // so Vike's client router can SPA-navigate here instead of doing full reloads.
48
+ export const route = '/'
49
+
50
+ export interface WelcomeProps {
51
+ appName: string
52
+ rudderVersion: string
53
+ nodeVersion: string
54
+ env: string
55
+ user: { name: string; email: string } | null
56
+ // null when the auth package isn't installed (Laravel's Route::has() idiom).
57
+ loginUrl: string | null
58
+ registerUrl: string | null
59
+ signOutUrl?: string
60
+ docsUrl?: string
61
+ githubUrl?: string
62
+ }
63
+
64
+ interface Feature {
65
+ title: string
66
+ description: string
67
+ href: string
68
+ }
69
+
70
+ ${WELCOME_FEATURES}
71
+
72
+ export default function Welcome(props: WelcomeProps) {
73
+ const signOutUrl = props.signOutUrl ?? '/api/auth/sign-out'
74
+ const docsUrl = props.docsUrl ?? DEFAULT_DOCS
75
+ const githubUrl = props.githubUrl ?? DEFAULT_GITHUB
76
+
77
+ async function handleSignOut() {
78
+ await fetch(signOutUrl, {
79
+ method: 'POST',
80
+ headers: { 'Content-Type': 'application/json' },
81
+ body: '{}',
82
+ })
83
+ // Full reload so the server resolves a fresh pageContext (logged-out user).
84
+ window.location.href = '/'
85
+ }
86
+
87
+ return (
88
+ <div className="page">
89
+ <nav className="page-nav">
90
+ <div className="brand">
91
+ <span className="brand-dot" />
92
+ RudderJS
93
+ </div>
94
+ <div className="nav-right">
95
+ {props.loginUrl && (props.user ? (
96
+ <>
97
+ <span className="nav-badge">
98
+ Signed in as <strong>{props.user.name}</strong>
99
+ </span>
100
+ <button type="button" onClick={handleSignOut} className="nav-button">
101
+ Sign out
102
+ </button>
103
+ </>
104
+ ) : (
105
+ <>
106
+ <a href={props.loginUrl} className="nav-link">Log in</a>
107
+ {props.registerUrl && (
108
+ <a href={props.registerUrl} className="nav-button">Register</a>
109
+ )}
110
+ </>
111
+ ))}
112
+ </div>
113
+ </nav>
114
+
115
+ <section className="hero">
116
+ <h1 className="hero-title">{props.appName}</h1>
117
+ <p className="hero-lead">
118
+ Laravel&apos;s developer experience, Vike&apos;s performance, Node&apos;s ecosystem.
119
+ This page is served by a controller, rendered through{' '}
120
+ <code className="inline-code">view(&apos;welcome&apos;)</code>.
121
+ </p>
122
+ <div className="hero-meta">
123
+ <span>RudderJS v{props.rudderVersion}</span>
124
+ <span>•</span>
125
+ <span>Node {props.nodeVersion}</span>
126
+ <span>•</span>
127
+ <span>env={props.env}</span>
128
+ </div>
129
+ </section>
130
+
131
+ <section className="feature-section">
132
+ <div className="feature-grid">
133
+ {features.map(f => (
134
+ <a key={f.title} href={f.href} className="feature-card">
135
+ <h3 className="feature-title">{f.title}</h3>
136
+ <p className="feature-desc">{f.description}</p>
137
+ </a>
138
+ ))}
139
+ </div>
140
+ </section>
141
+
142
+ <footer className="page-footer">
143
+ <div className="footer-inner">
144
+ <div>Built with RudderJS. Edit <code>app/Views/Welcome.tsx</code> to customize this page.</div>
145
+ <div className="footer-links">
146
+ <a href={docsUrl} className="footer-link">Docs</a>
147
+ <a href={githubUrl} className="footer-link">GitHub</a>
148
+ </div>
149
+ </div>
150
+ </footer>
151
+ </div>
152
+ )
153
+ }
154
+ `;
155
+ }
156
+ export function welcomeViewVue(ctx) {
157
+ const cssImport = `import '@/index.css'\n`;
158
+ // Vue SFC quirk: top-level `export` statements must live in a regular
159
+ // <script> block, NOT <script setup> (the compiler rejects exports there).
160
+ // The scanner reads both blocks as plain text, so the route override is
161
+ // still picked up. Keep this dual-script structure whenever a Vue view
162
+ // needs `export const route = '/...'`.
163
+ return `<script lang="ts">
164
+ // URL this view is served at — see the React variant for rationale.
165
+ export const route = '/'
166
+ </script>
167
+
168
+ <script setup lang="ts">
169
+ ${cssImport}
170
+ export interface WelcomeProps {
171
+ appName: string
172
+ rudderVersion: string
173
+ nodeVersion: string
174
+ env: string
175
+ user: { name: string; email: string } | null
176
+ // null when the auth package isn't installed (Laravel's Route::has() idiom).
177
+ loginUrl: string | null
178
+ registerUrl: string | null
179
+ signOutUrl?: string
180
+ docsUrl?: string
181
+ githubUrl?: string
182
+ }
183
+
184
+ const props = defineProps<WelcomeProps>()
185
+
186
+ interface Feature {
187
+ title: string
188
+ description: string
189
+ href: string
190
+ }
191
+
192
+ ${WELCOME_FEATURES}
193
+
194
+ const signOutUrl = props.signOutUrl ?? '/api/auth/sign-out'
195
+ const docsUrl = props.docsUrl ?? DEFAULT_DOCS
196
+ const githubUrl = props.githubUrl ?? DEFAULT_GITHUB
197
+
198
+ async function handleSignOut() {
199
+ await fetch(signOutUrl, {
200
+ method: 'POST',
201
+ headers: { 'Content-Type': 'application/json' },
202
+ body: '{}',
203
+ })
204
+ // Full reload so the server resolves a fresh pageContext (logged-out user).
205
+ window.location.href = '/'
206
+ }
207
+ </script>
208
+
209
+ <template>
210
+ <div class="page">
211
+ <nav class="page-nav">
212
+ <div class="brand">
213
+ <span class="brand-dot"></span>
214
+ RudderJS
215
+ </div>
216
+ <div v-if="props.loginUrl" class="nav-right">
217
+ <template v-if="props.user">
218
+ <span class="nav-badge">
219
+ Signed in as <strong>{{ props.user.name }}</strong>
220
+ </span>
221
+ <button type="button" @click="handleSignOut" class="nav-button">
222
+ Sign out
223
+ </button>
224
+ </template>
225
+ <template v-else>
226
+ <a :href="props.loginUrl" class="nav-link">Log in</a>
227
+ <a v-if="props.registerUrl" :href="props.registerUrl" class="nav-button">Register</a>
228
+ </template>
229
+ </div>
230
+ </nav>
231
+
232
+ <section class="hero">
233
+ <h1 class="hero-title">{{ props.appName }}</h1>
234
+ <p class="hero-lead">
235
+ Laravel's developer experience, Vike's performance, Node's ecosystem.
236
+ This page is served by a controller, rendered through
237
+ <code class="inline-code">view('welcome')</code>.
238
+ </p>
239
+ <div class="hero-meta">
240
+ <span>RudderJS v{{ props.rudderVersion }}</span>
241
+ <span>•</span>
242
+ <span>Node {{ props.nodeVersion }}</span>
243
+ <span>•</span>
244
+ <span>env={{ props.env }}</span>
245
+ </div>
246
+ </section>
247
+
248
+ <section class="feature-section">
249
+ <div class="feature-grid">
250
+ <a v-for="f in features" :key="f.title" :href="f.href" class="feature-card">
251
+ <h3 class="feature-title">{{ f.title }}</h3>
252
+ <p class="feature-desc">{{ f.description }}</p>
253
+ </a>
254
+ </div>
255
+ </section>
256
+
257
+ <footer class="page-footer">
258
+ <div class="footer-inner">
259
+ <div>Built with RudderJS. Edit <code>app/Views/Welcome.vue</code> to customize this page.</div>
260
+ <div class="footer-links">
261
+ <a :href="docsUrl" class="footer-link">Docs</a>
262
+ <a :href="githubUrl" class="footer-link">GitHub</a>
263
+ </div>
264
+ </div>
265
+ </footer>
266
+ </div>
267
+ </template>
268
+ `;
269
+ }
270
+ export function welcomeViewSolid(ctx) {
271
+ const cssImport = `import '@/index.css'\n`;
272
+ return `${cssImport}import { For, Show } from 'solid-js'
273
+
274
+ // URL this view is served at — see the React variant for rationale.
275
+ export const route = '/'
276
+
277
+ export interface WelcomeProps {
278
+ appName: string
279
+ rudderVersion: string
280
+ nodeVersion: string
281
+ env: string
282
+ user: { name: string; email: string } | null
283
+ // null when the auth package isn't installed (Laravel's Route::has() idiom).
284
+ loginUrl: string | null
285
+ registerUrl: string | null
286
+ signOutUrl?: string
287
+ docsUrl?: string
288
+ githubUrl?: string
289
+ }
290
+
291
+ interface Feature {
292
+ title: string
293
+ description: string
294
+ href: string
295
+ }
296
+
297
+ ${WELCOME_FEATURES}
298
+
299
+ export default function Welcome(props: WelcomeProps) {
300
+ const signOutUrl = () => props.signOutUrl ?? '/api/auth/sign-out'
301
+ const docsUrl = () => props.docsUrl ?? DEFAULT_DOCS
302
+ const githubUrl = () => props.githubUrl ?? DEFAULT_GITHUB
303
+
304
+ async function handleSignOut() {
305
+ await fetch(signOutUrl(), {
306
+ method: 'POST',
307
+ headers: { 'Content-Type': 'application/json' },
308
+ body: '{}',
309
+ })
310
+ // Full reload so the server resolves a fresh pageContext (logged-out user).
311
+ window.location.href = '/'
312
+ }
313
+
314
+ return (
315
+ <div class="page">
316
+ <nav class="page-nav">
317
+ <div class="brand">
318
+ <span class="brand-dot" />
319
+ RudderJS
320
+ </div>
321
+ <Show when={props.loginUrl}>
322
+ {(loginUrl) => (
323
+ <div class="nav-right">
324
+ <Show
325
+ when={props.user}
326
+ fallback={
327
+ <>
328
+ <a href={loginUrl()} class="nav-link">Log in</a>
329
+ <Show when={props.registerUrl}>
330
+ {(registerUrl) => (
331
+ <a href={registerUrl()} class="nav-button">Register</a>
332
+ )}
333
+ </Show>
334
+ </>
335
+ }
336
+ >
337
+ {(user) => (
338
+ <>
339
+ <span class="nav-badge">
340
+ Signed in as <strong>{user().name}</strong>
341
+ </span>
342
+ <button type="button" onClick={handleSignOut} class="nav-button">
343
+ Sign out
344
+ </button>
345
+ </>
346
+ )}
347
+ </Show>
348
+ </div>
349
+ )}
350
+ </Show>
351
+ </nav>
352
+
353
+ <section class="hero">
354
+ <h1 class="hero-title">{props.appName}</h1>
355
+ <p class="hero-lead">
356
+ Laravel's developer experience, Vike's performance, Node's ecosystem.
357
+ This page is served by a controller, rendered through{' '}
358
+ <code class="inline-code">view('welcome')</code>.
359
+ </p>
360
+ <div class="hero-meta">
361
+ <span>RudderJS v{props.rudderVersion}</span>
362
+ <span>•</span>
363
+ <span>Node {props.nodeVersion}</span>
364
+ <span>•</span>
365
+ <span>env={props.env}</span>
366
+ </div>
367
+ </section>
368
+
369
+ <section class="feature-section">
370
+ <div class="feature-grid">
371
+ <For each={features}>
372
+ {(f) => (
373
+ <a href={f.href} class="feature-card">
374
+ <h3 class="feature-title">{f.title}</h3>
375
+ <p class="feature-desc">{f.description}</p>
376
+ </a>
377
+ )}
378
+ </For>
379
+ </div>
380
+ </section>
381
+
382
+ <footer class="page-footer">
383
+ <div class="footer-inner">
384
+ <div>Built with RudderJS. Edit <code>app/Views/Welcome.tsx</code> to customize this page.</div>
385
+ <div class="footer-links">
386
+ <a href={docsUrl()} class="footer-link">Docs</a>
387
+ <a href={githubUrl()} class="footer-link">GitHub</a>
388
+ </div>
389
+ </div>
390
+ </footer>
391
+ </div>
392
+ )
393
+ }
394
+ `;
395
+ }
396
+ //# sourceMappingURL=welcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../../src/templates/views/welcome.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,GAAoB;IAC9C,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,KAAK,CAAC,CAAG,OAAO,cAAc,CAAC,GAAG,CAAC,CAAA;QACxC,KAAK,OAAO,CAAC,CAAC,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC1C,OAAO,CAAC,CAAM,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCvB,CAAA;AAEF,MAAM,UAAU,gBAAgB,CAAC,GAAoB;IACnD,MAAM,SAAS,GAAG,0BAA0B,CAAA;IAC5C,OAAO,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;EAyBnB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoFjB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAoB;IACjD,MAAM,SAAS,GAAG,wBAAwB,CAAA;IAC1C,sEAAsE;IACtE,2EAA2E;IAC3E,wEAAwE;IACxE,uEAAuE;IACvE,uCAAuC;IACvC,OAAO;;;;;;EAMP,SAAS;;;;;;;;;;;;;;;;;;;;;;;EAuBT,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4EjB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAoB;IACnD,MAAM,SAAS,GAAG,wBAAwB,CAAA;IAC1C,OAAO,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;EAyBnB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiGjB,CAAA;AACD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TemplateContext } from '../templates.js';
2
+ export declare function viteConfig(ctx: TemplateContext): string;
3
+ //# sourceMappingURL=vite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../../src/templates/vite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAyDvD"}
@@ -0,0 +1,61 @@
1
+ export function viteConfig(ctx) {
2
+ const { frameworks, primary, tailwind } = ctx;
3
+ const hasReact = frameworks.includes('react');
4
+ const hasVue = frameworks.includes('vue');
5
+ const hasSolid = frameworks.includes('solid');
6
+ const hasReactSolidConflict = hasReact && hasSolid;
7
+ const imports = [
8
+ `import { defineConfig } from 'vite'`,
9
+ `import rudderjs from '@rudderjs/vite'`,
10
+ ];
11
+ if (tailwind)
12
+ imports.push(`import tailwindcss from '@tailwindcss/vite'`);
13
+ if (hasReact)
14
+ imports.push(`import react from '@vitejs/plugin-react'`);
15
+ if (hasVue)
16
+ imports.push(`import vue from '@vitejs/plugin-vue'`);
17
+ if (hasSolid)
18
+ imports.push(`import solid from 'vike-solid/vite'`);
19
+ const plugins = ['rudderjs()'];
20
+ if (tailwind)
21
+ plugins.push('tailwindcss()');
22
+ if (hasReact) {
23
+ if (hasReactSolidConflict) {
24
+ if (primary === 'react') {
25
+ plugins.push(`react({ exclude: ['**/pages/solid-demo/**'] })`);
26
+ }
27
+ else {
28
+ plugins.push(`react({ include: ['**/pages/react-demo/**'] })`);
29
+ }
30
+ }
31
+ else {
32
+ plugins.push('react()');
33
+ }
34
+ }
35
+ if (hasVue) {
36
+ plugins.push('vue()');
37
+ }
38
+ if (hasSolid) {
39
+ if (hasReactSolidConflict) {
40
+ if (primary === 'solid') {
41
+ plugins.push(`solid({ exclude: ['**/pages/react-demo/**'] })`);
42
+ }
43
+ else {
44
+ plugins.push(`solid({ include: ['**/pages/solid-demo/**'] })`);
45
+ }
46
+ }
47
+ else {
48
+ plugins.push('solid()');
49
+ }
50
+ }
51
+ const pluginsStr = plugins.map(p => ` ${p},`).join('\n');
52
+ return `${imports.join('\n')}
53
+
54
+ export default defineConfig({
55
+ plugins: [
56
+ ${pluginsStr}
57
+ ],
58
+ })
59
+ `;
60
+ }
61
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.js","sourceRoot":"","sources":["../../src/templates/vite.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,GAAoB;IAC7C,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;IAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAK,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,qBAAqB,GAAG,QAAQ,IAAI,QAAQ,CAAA;IAElD,MAAM,OAAO,GAAa;QACxB,qCAAqC;QACrC,uCAAuC;KACxC,CAAA;IACD,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;IACzE,IAAI,QAAQ;QAAG,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;IACvE,IAAI,MAAM;QAAK,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IACnE,IAAI,QAAQ;QAAG,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IAElE,MAAM,OAAO,GAAa,CAAC,YAAY,CAAC,CAAA;IACxC,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAE3C,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,qBAAqB,EAAE,CAAC;YAC1B,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;YAChE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;YAChE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,qBAAqB,EAAE,CAAC;YAC1B,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;YAChE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;YAChE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE3D,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;;EAI5B,UAAU;;;CAGX,CAAA;AACD,CAAC"}
@@ -1,9 +1,13 @@
1
- export type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';
1
+ import { detectPackageManager, pmExec, pmInstall, pmRun, type PackageManager } from './templates/package-managers.js';
2
+ export { detectPackageManager, pmExec, pmInstall, pmRun };
3
+ export type { PackageManager };
2
4
  export interface TemplateContext {
3
5
  name: string;
4
6
  db: 'sqlite' | 'postgresql' | 'mysql';
5
7
  orm: 'prisma' | 'drizzle' | false;
6
8
  authSecret: string;
9
+ /** Random base64-encoded 32-byte key for @rudderjs/crypt's APP_KEY. */
10
+ appKey: string;
7
11
  frameworks: ('react' | 'vue' | 'solid')[];
8
12
  primary: 'react' | 'vue' | 'solid';
9
13
  tailwind: boolean;
@@ -11,33 +15,40 @@ export interface TemplateContext {
11
15
  pm: PackageManager;
12
16
  packages: {
13
17
  auth: boolean;
14
- cache: boolean;
18
+ sanctum: boolean;
19
+ passport: boolean;
20
+ socialite: boolean;
15
21
  queue: boolean;
16
22
  storage: boolean;
23
+ scheduler: boolean;
24
+ image: boolean;
17
25
  mail: boolean;
18
26
  notifications: boolean;
19
- scheduler: boolean;
20
27
  broadcast: boolean;
21
28
  sync: boolean;
22
29
  ai: boolean;
23
30
  mcp: boolean;
24
- passport: boolean;
31
+ boost: boolean;
25
32
  localization: boolean;
33
+ cashierPaddle: boolean;
34
+ pennant: boolean;
26
35
  telescope: boolean;
27
- boost: boolean;
28
- demos: boolean;
36
+ pulse: boolean;
37
+ horizon: boolean;
38
+ crypt: boolean;
39
+ http: boolean;
40
+ process: boolean;
41
+ concurrency: boolean;
29
42
  };
43
+ /** Demo IDs to scaffold (e.g. 'contact', 'ws', 'live'). See templates/demos/registry.ts. */
44
+ demos: string[];
30
45
  }
31
- /** Detect which package manager invoked the installer.
32
- * 1. Check npm_config_user_agent (set by pnpm/npm/yarn/bun create commands)
33
- * 2. Fall back to checking which binaries are available on PATH
34
- */
35
- export declare function detectPackageManager(): PackageManager;
36
- /** `<pm> exec <bin>` equivalent per package manager. */
37
- export declare function pmExec(pm: PackageManager, bin: string): string;
38
- /** `<pm> run <script>` equivalent (yarn/bun allow omitting "run"). */
39
- export declare function pmRun(pm: PackageManager, script: string): string;
40
- /** `<pm> install` command. */
41
- export declare function pmInstall(pm: PackageManager): string;
42
46
  export declare function getTemplates(ctx: TemplateContext): Record<string, string>;
47
+ /**
48
+ * Demos are React-primary only for v1 — vue/solid variants aren't written yet.
49
+ * `name` is a demo ID from `templates/demos/registry.ts` (e.g. 'contact', 'ws', 'live').
50
+ * Returns true when the demo was selected AND its package gates are satisfied.
51
+ */
52
+ export declare function shouldScaffoldDemo(ctx: TemplateContext, name: string): boolean;
53
+ export declare function shouldScaffoldAnyDemo(ctx: TemplateContext): boolean;
43
54
  //# sourceMappingURL=templates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;AAE5D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAQ,MAAM,CAAA;IAClB,EAAE,EAAU,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAA;IAC7C,GAAG,EAAS,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAA;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,CAAC,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC,EAAE,CAAA;IACzC,OAAO,EAAK,OAAO,GAAG,KAAK,GAAG,OAAO,CAAA;IACrC,QAAQ,EAAI,OAAO,CAAA;IACnB,MAAM,EAAM,OAAO,CAAA;IACnB,EAAE,EAAU,cAAc,CAAA;IAC1B,QAAQ,EAAE;QACR,IAAI,EAAW,OAAO,CAAA;QACtB,KAAK,EAAU,OAAO,CAAA;QACtB,KAAK,EAAU,OAAO,CAAA;QACtB,OAAO,EAAQ,OAAO,CAAA;QACtB,IAAI,EAAW,OAAO,CAAA;QACtB,aAAa,EAAE,OAAO,CAAA;QACtB,SAAS,EAAM,OAAO,CAAA;QACtB,SAAS,EAAM,OAAO,CAAA;QACtB,IAAI,EAAW,OAAO,CAAA;QACtB,EAAE,EAAa,OAAO,CAAA;QACtB,GAAG,EAAY,OAAO,CAAA;QACtB,QAAQ,EAAO,OAAO,CAAA;QACtB,YAAY,EAAG,OAAO,CAAA;QACtB,SAAS,EAAM,OAAO,CAAA;QACtB,KAAK,EAAU,OAAO,CAAA;QACtB,KAAK,EAAU,OAAO,CAAA;KACvB,CAAA;CACF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAerD;AAED,wDAAwD;AACxD,wBAAgB,MAAM,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,sEAAsE;AACtE,wBAAgB,KAAK,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,8BAA8B;AAC9B,wBAAgB,SAAS,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAEpD;AAMD,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6GzE"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAW,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAA;AA0D9H,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;AACzD,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAQ,MAAM,CAAA;IAClB,EAAE,EAAU,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAA;IAC7C,GAAG,EAAS,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAA;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,MAAM,EAAM,MAAM,CAAA;IAClB,UAAU,EAAE,CAAC,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC,EAAE,CAAA;IACzC,OAAO,EAAK,OAAO,GAAG,KAAK,GAAG,OAAO,CAAA;IACrC,QAAQ,EAAI,OAAO,CAAA;IACnB,MAAM,EAAM,OAAO,CAAA;IACnB,EAAE,EAAU,cAAc,CAAA;IAC1B,QAAQ,EAAE;QACR,IAAI,EAAW,OAAO,CAAA;QACtB,OAAO,EAAQ,OAAO,CAAA;QACtB,QAAQ,EAAO,OAAO,CAAA;QACtB,SAAS,EAAM,OAAO,CAAA;QACtB,KAAK,EAAU,OAAO,CAAA;QACtB,OAAO,EAAQ,OAAO,CAAA;QACtB,SAAS,EAAM,OAAO,CAAA;QACtB,KAAK,EAAU,OAAO,CAAA;QACtB,IAAI,EAAW,OAAO,CAAA;QACtB,aAAa,EAAE,OAAO,CAAA;QACtB,SAAS,EAAM,OAAO,CAAA;QACtB,IAAI,EAAW,OAAO,CAAA;QACtB,EAAE,EAAa,OAAO,CAAA;QACtB,GAAG,EAAY,OAAO,CAAA;QACtB,KAAK,EAAU,OAAO,CAAA;QACtB,YAAY,EAAG,OAAO,CAAA;QACtB,aAAa,EAAE,OAAO,CAAA;QACtB,OAAO,EAAQ,OAAO,CAAA;QACtB,SAAS,EAAM,OAAO,CAAA;QACtB,KAAK,EAAU,OAAO,CAAA;QACtB,OAAO,EAAQ,OAAO,CAAA;QACtB,KAAK,EAAU,OAAO,CAAA;QACtB,IAAI,EAAW,OAAO,CAAA;QACtB,OAAO,EAAQ,OAAO,CAAA;QACtB,WAAW,EAAI,OAAO,CAAA;KACvB,CAAA;IACD,4FAA4F;IAC5F,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoHzE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO9E;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAGnE"}