ar-saas 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +338 -314
- package/dist/cli.js +19 -0
- package/dist/generator.js +166 -55
- package/package.json +52 -50
- package/templates/backend/.env.example +67 -67
- package/templates/backend/.prettierrc +4 -4
- package/templates/backend/README.md +249 -168
- package/templates/backend/eslint.config.mjs +35 -35
- package/templates/backend/nest-cli.json +8 -8
- package/templates/backend/package-lock.json +10979 -10979
- package/templates/backend/package.json +88 -88
- package/templates/backend/src/app.controller.spec.ts +24 -24
- package/templates/backend/src/app.controller.ts +15 -15
- package/templates/backend/src/app.module.ts +40 -40
- package/templates/backend/src/app.service.ts +11 -11
- package/templates/backend/src/common/base/base.repository.ts +221 -221
- package/templates/backend/src/common/base/base.schema.ts +24 -24
- package/templates/backend/src/common/decorators/cookie.decorator.ts +9 -9
- package/templates/backend/src/common/decorators/current-user.decorator.ts +20 -20
- package/templates/backend/src/common/decorators/workspace-id.decorator.ts +14 -14
- package/templates/backend/src/common/filters/global-exception.filter.ts +61 -61
- package/templates/backend/src/common/guards/jwt-auth.guard.ts +5 -5
- package/templates/backend/src/common/interceptors/workspace-tenant.interceptor.ts +45 -45
- package/templates/backend/src/main.ts +51 -51
- package/templates/backend/src/modules/auth/auth.controller.ts +158 -158
- package/templates/backend/src/modules/auth/auth.module.ts +20 -20
- package/templates/backend/src/modules/auth/auth.service.ts +257 -257
- package/templates/backend/src/modules/auth/dto/forgot-password.dto.ts +9 -9
- package/templates/backend/src/modules/auth/dto/login.dto.ts +14 -14
- package/templates/backend/src/modules/auth/dto/refresh-token.dto.ts +12 -12
- package/templates/backend/src/modules/auth/dto/register.dto.ts +26 -26
- package/templates/backend/src/modules/auth/dto/reset-password.dto.ts +16 -16
- package/templates/backend/src/modules/auth/dto/verify-email.dto.ts +9 -9
- package/templates/backend/src/modules/auth/strategies/jwt.strategy.ts +43 -43
- package/templates/backend/src/modules/mail/mail.module.ts +9 -9
- package/templates/backend/src/modules/mail/mail.service.ts +141 -141
- package/templates/backend/src/modules/users/schemas/user.schema.ts +54 -54
- package/templates/backend/src/modules/users/users.module.ts +14 -14
- package/templates/backend/src/modules/users/users.repository.ts +51 -51
- package/templates/backend/src/modules/users/users.service.ts +104 -104
- package/templates/backend/src/modules/workspaces/schemas/workspace.schema.ts +26 -26
- package/templates/backend/src/modules/workspaces/workspaces.module.ts +16 -16
- package/templates/backend/src/modules/workspaces/workspaces.repository.ts +34 -34
- package/templates/backend/src/modules/workspaces/workspaces.service.ts +42 -42
- package/templates/backend/test/app.e2e-spec.ts +25 -25
- package/templates/backend/test/jest-e2e.json +9 -9
- package/templates/backend/tsconfig.build.json +4 -4
- package/templates/backend/tsconfig.json +26 -26
- package/templates/frontend/.env.local.example +1 -1
- package/templates/frontend/README.md +152 -0
- package/templates/frontend/components.json +20 -20
- package/templates/frontend/eslint.config.mjs +14 -14
- package/templates/frontend/next.config.ts +5 -5
- package/templates/frontend/package-lock.json +6722 -6722
- package/templates/frontend/package.json +48 -48
- package/templates/frontend/pnpm-lock.yaml +5012 -5012
- package/templates/frontend/pnpm-workspace.yaml +3 -3
- package/templates/frontend/postcss.config.mjs +7 -7
- package/templates/frontend/src/app/(auth)/forgot-password/page.tsx +84 -84
- package/templates/frontend/src/app/(auth)/layout.tsx +28 -28
- package/templates/frontend/src/app/(auth)/login/page.tsx +111 -111
- package/templates/frontend/src/app/(auth)/register/page.tsx +161 -161
- package/templates/frontend/src/app/(auth)/reset-password/page.tsx +120 -120
- package/templates/frontend/src/app/(auth)/verify-email/page.tsx +78 -78
- package/templates/frontend/src/app/(dashboard)/billing/page.tsx +111 -111
- package/templates/frontend/src/app/(dashboard)/dashboard/page.tsx +105 -105
- package/templates/frontend/src/app/(dashboard)/layout.tsx +38 -38
- package/templates/frontend/src/app/(dashboard)/profile/page.tsx +226 -226
- package/templates/frontend/src/app/(dashboard)/settings/page.tsx +156 -156
- package/templates/frontend/src/app/(dashboard)/team/page.tsx +178 -178
- package/templates/frontend/src/app/(legal)/privacy/page.tsx +127 -127
- package/templates/frontend/src/app/(legal)/terms/page.tsx +118 -118
- package/templates/frontend/src/app/globals.css +81 -81
- package/templates/frontend/src/app/layout.tsx +26 -26
- package/templates/frontend/src/app/page.tsx +5 -45
- package/templates/frontend/src/app/setup/page.tsx +371 -275
- package/templates/frontend/src/components/dashboard/header.tsx +89 -89
- package/templates/frontend/src/components/dashboard/sidebar.tsx +71 -71
- package/templates/frontend/src/components/dashboard/stat-card.tsx +34 -34
- package/templates/frontend/src/components/landing/faq.tsx +39 -39
- package/templates/frontend/src/components/landing/features.tsx +54 -54
- package/templates/frontend/src/components/landing/footer.tsx +76 -76
- package/templates/frontend/src/components/landing/hero.tsx +72 -72
- package/templates/frontend/src/components/landing/navbar.tsx +78 -78
- package/templates/frontend/src/components/landing/pricing.tsx +90 -90
- package/templates/frontend/src/components/ui/accordion.tsx +52 -52
- package/templates/frontend/src/components/ui/avatar.tsx +46 -46
- package/templates/frontend/src/components/ui/badge.tsx +30 -30
- package/templates/frontend/src/components/ui/button.tsx +52 -52
- package/templates/frontend/src/components/ui/card.tsx +50 -50
- package/templates/frontend/src/components/ui/checkbox.tsx +27 -27
- package/templates/frontend/src/components/ui/dialog.tsx +100 -100
- package/templates/frontend/src/components/ui/dropdown-menu.tsx +173 -173
- package/templates/frontend/src/components/ui/form.tsx +158 -158
- package/templates/frontend/src/components/ui/input.tsx +21 -21
- package/templates/frontend/src/components/ui/label.tsx +22 -22
- package/templates/frontend/src/components/ui/separator.tsx +25 -25
- package/templates/frontend/src/components/ui/skeleton.tsx +7 -7
- package/templates/frontend/src/components/ui/switch.tsx +28 -28
- package/templates/frontend/src/components/ui/tabs.tsx +54 -54
- package/templates/frontend/src/components/ui/textarea.tsx +20 -20
- package/templates/frontend/src/components/ui/toast.tsx +109 -109
- package/templates/frontend/src/components/ui/toaster.tsx +30 -30
- package/templates/frontend/src/config/site.ts +197 -197
- package/templates/frontend/src/hooks/use-toast.ts +116 -116
- package/templates/frontend/src/lib/api/auth.ts +39 -39
- package/templates/frontend/src/lib/api/client.ts +66 -66
- package/templates/frontend/src/lib/hooks/use-auth.ts +1 -1
- package/templates/frontend/src/lib/utils.ts +6 -6
- package/templates/frontend/src/providers/auth-provider.tsx +60 -60
- package/templates/frontend/src/types/api.ts +12 -12
- package/templates/frontend/src/types/auth.ts +27 -27
- package/templates/frontend/tsconfig.json +23 -23
package/README.md
CHANGED
|
@@ -1,314 +1,338 @@
|
|
|
1
|
-
# ar-saas
|
|
2
|
-
|
|
3
|
-
<p align="center">
|
|
4
|
-
<img src="assets/logo.png" alt="ar-saas" width="400" />
|
|
5
|
-
</p>
|
|
6
|
-
|
|
7
|
-
<p align="center">
|
|
8
|
-
<strong>Generador de proyectos SaaS multi-tenant para startups argentinas</strong><br/>
|
|
9
|
-
Backend NestJS + Frontend Next.js completo — landing, auth, dashboard y legal listos para producción.
|
|
10
|
-
</p>
|
|
11
|
-
|
|
12
|
-
<p align="center">
|
|
13
|
-
<a href="https://www.npmjs.com/package/ar-saas"><img src="https://img.shields.io/npm/v/ar-saas.svg" alt="npm version" /></a>
|
|
14
|
-
<a href="https://github.com/ignaciobecher/ar-saas/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="license" /></a>
|
|
15
|
-
<img src="https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen" alt="node version" />
|
|
16
|
-
</p>
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## Quickstart
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
npx ar-saas mi-proyecto
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Respondés algunas preguntas y en minutos tenés un proyecto completo corriendo localmente.
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## ¿Qué genera?
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
mi-proyecto/
|
|
34
|
-
├── backend/ # NestJS 11 + MongoDB
|
|
35
|
-
│ ├── src/
|
|
36
|
-
│ │ ├── modules/
|
|
37
|
-
│ │ │ ├── auth/ # Auth completo (JWT + GitHub OAuth en cookies HttpOnly)
|
|
38
|
-
│ │ │ ├── users/ # Usuarios con roles
|
|
39
|
-
│ │ │ ├── workspaces/ # Multi-tenancy por workspace
|
|
40
|
-
│ │ │ └── mail/ # Emails transaccionales con Resend
|
|
41
|
-
│ │ └── common/ # Guards, filtros, decoradores, base repository
|
|
42
|
-
│ ├── .env # Copiado de .env.example automáticamente
|
|
43
|
-
│ └── package.json
|
|
44
|
-
│
|
|
45
|
-
├── frontend/ # Next.js 15 + Tailwind CSS 4 + shadcn/ui
|
|
46
|
-
│ ├── src/
|
|
47
|
-
│ │ ├── config/
|
|
48
|
-
│ │ │ └── site.ts # ← Personalización central del SaaS
|
|
49
|
-
│ │ ├── app/
|
|
50
|
-
│ │ │ ├── page.tsx # Landing page completa
|
|
51
|
-
│ │ │ ├── (auth)/ # Login, register (+términos), verify, reset
|
|
52
|
-
│ │ │ ├── (dashboard)/ # Rutas protegidas
|
|
53
|
-
│ │ │ │ ├── dashboard/ # Overview con stat cards
|
|
54
|
-
│ │ │ │ ├── profile/ # Perfil de usuario + cambio de contraseña
|
|
55
|
-
│ │ │ │ ├── settings/ # Notificaciones, workspace, zona peligrosa
|
|
56
|
-
│ │ │ │ ├── billing/ # Plan actual, historial, upgrade
|
|
57
|
-
│ │ │ │ └── team/ # Miembros + invitaciones
|
|
58
|
-
│ │ │ ├── (legal)/
|
|
59
|
-
│ │ │ │ ├── terms/ # Términos y condiciones
|
|
60
|
-
│ │ │ │ └── privacy/ # Política de privacidad
|
|
61
|
-
│ │ │ └── setup/ # Onboarding inicial
|
|
62
|
-
│ │ ├── components/
|
|
63
|
-
│ │ │ ├── landing/ # Navbar, Hero, Features, Pricing, FAQ, Footer
|
|
64
|
-
│ │ │ ├── dashboard/ # Sidebar, Header, StatCard
|
|
65
|
-
│ │ │ └── ui/ # 15+ componentes shadcn/ui
|
|
66
|
-
│ │ ├── providers/ # AuthProvider con estado global
|
|
67
|
-
│ │ └── lib/api/ # Cliente axios con refresh automático
|
|
68
|
-
│ ├── .env.local # Copiado de .env.local.example automáticamente
|
|
69
|
-
│ └── package.json
|
|
70
|
-
│
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
|
121
|
-
|
|
|
122
|
-
| passport
|
|
123
|
-
|
|
|
124
|
-
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
|
131
|
-
|
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
| **
|
|
146
|
-
| **
|
|
147
|
-
| **
|
|
148
|
-
| **
|
|
149
|
-
| **
|
|
150
|
-
| **
|
|
151
|
-
| **
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
| **
|
|
159
|
-
| **
|
|
160
|
-
| **
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
| **
|
|
168
|
-
| **
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
| `
|
|
182
|
-
| `
|
|
183
|
-
| `
|
|
184
|
-
| `
|
|
185
|
-
| `
|
|
186
|
-
| `
|
|
187
|
-
| `
|
|
188
|
-
| `
|
|
189
|
-
| `
|
|
190
|
-
| `
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
#
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
#
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
-
|
|
299
|
-
-
|
|
300
|
-
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
---
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
1
|
+
# ar-saas
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="assets/logo.png" alt="ar-saas" width="400" />
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>Generador de proyectos SaaS multi-tenant para startups argentinas</strong><br/>
|
|
9
|
+
Backend NestJS + Frontend Next.js completo — landing, auth, dashboard y legal listos para producción.
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="https://www.npmjs.com/package/ar-saas"><img src="https://img.shields.io/npm/v/ar-saas.svg" alt="npm version" /></a>
|
|
14
|
+
<a href="https://github.com/ignaciobecher/ar-saas/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="license" /></a>
|
|
15
|
+
<img src="https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen" alt="node version" />
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Quickstart
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npx ar-saas mi-proyecto
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Respondés algunas preguntas y en minutos tenés un proyecto completo corriendo localmente.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## ¿Qué genera?
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
mi-proyecto/
|
|
34
|
+
├── backend/ # NestJS 11 + MongoDB
|
|
35
|
+
│ ├── src/
|
|
36
|
+
│ │ ├── modules/
|
|
37
|
+
│ │ │ ├── auth/ # Auth completo (JWT + GitHub OAuth en cookies HttpOnly)
|
|
38
|
+
│ │ │ ├── users/ # Usuarios con roles
|
|
39
|
+
│ │ │ ├── workspaces/ # Multi-tenancy por workspace
|
|
40
|
+
│ │ │ └── mail/ # Emails transaccionales con Resend
|
|
41
|
+
│ │ └── common/ # Guards, filtros, decoradores, base repository
|
|
42
|
+
│ ├── .env # Copiado de .env.example automáticamente
|
|
43
|
+
│ └── package.json
|
|
44
|
+
│
|
|
45
|
+
├── frontend/ # Next.js 15 + Tailwind CSS 4 + shadcn/ui
|
|
46
|
+
│ ├── src/
|
|
47
|
+
│ │ ├── config/
|
|
48
|
+
│ │ │ └── site.ts # ← Personalización central del SaaS
|
|
49
|
+
│ │ ├── app/
|
|
50
|
+
│ │ │ ├── page.tsx # Landing page completa
|
|
51
|
+
│ │ │ ├── (auth)/ # Login, register (+términos), verify, reset
|
|
52
|
+
│ │ │ ├── (dashboard)/ # Rutas protegidas
|
|
53
|
+
│ │ │ │ ├── dashboard/ # Overview con stat cards
|
|
54
|
+
│ │ │ │ ├── profile/ # Perfil de usuario + cambio de contraseña
|
|
55
|
+
│ │ │ │ ├── settings/ # Notificaciones, workspace, zona peligrosa
|
|
56
|
+
│ │ │ │ ├── billing/ # Plan actual, historial, upgrade
|
|
57
|
+
│ │ │ │ └── team/ # Miembros + invitaciones
|
|
58
|
+
│ │ │ ├── (legal)/
|
|
59
|
+
│ │ │ │ ├── terms/ # Términos y condiciones
|
|
60
|
+
│ │ │ │ └── privacy/ # Política de privacidad
|
|
61
|
+
│ │ │ └── setup/ # Onboarding inicial
|
|
62
|
+
│ │ ├── components/
|
|
63
|
+
│ │ │ ├── landing/ # Navbar, Hero, Features, Pricing, FAQ, Footer
|
|
64
|
+
│ │ │ ├── dashboard/ # Sidebar, Header, StatCard
|
|
65
|
+
│ │ │ └── ui/ # 15+ componentes shadcn/ui
|
|
66
|
+
│ │ ├── providers/ # AuthProvider con estado global
|
|
67
|
+
│ │ └── lib/api/ # Cliente axios con refresh automático
|
|
68
|
+
│ ├── .env.local # Copiado de .env.local.example automáticamente
|
|
69
|
+
│ └── package.json
|
|
70
|
+
│
|
|
71
|
+
├── docker-compose.dev.yml # MongoDB local para desarrollo (Docker opcional)
|
|
72
|
+
└── railway.toml / fly.toml / docker-compose.yml # Config de deploy según target elegido
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Personalización
|
|
78
|
+
|
|
79
|
+
Al generar el proyecto, el CLI pregunta el nombre, tagline, descripción y email de soporte del SaaS. Esos valores se inyectan automáticamente en un único archivo:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
frontend/src/config/site.ts
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Ese archivo es la **fuente de verdad** para todo el contenido de la app:
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
export const siteConfig = {
|
|
89
|
+
name: 'Mi SaaS',
|
|
90
|
+
tagline: 'La plataforma que tu equipo necesita',
|
|
91
|
+
description: 'Automatizá tu negocio...',
|
|
92
|
+
supportEmail: 'hola@mi-saas.com',
|
|
93
|
+
|
|
94
|
+
// Navegación de la landing
|
|
95
|
+
nav: { links: [...] },
|
|
96
|
+
|
|
97
|
+
// Secciones de la landing
|
|
98
|
+
hero: { headline, description, cta, ctaSecondary },
|
|
99
|
+
features: [...], // Íconos, títulos y descripciones
|
|
100
|
+
pricing: [...], // 3 tiers con features, precios y CTAs
|
|
101
|
+
faq: [...], // Preguntas y respuestas
|
|
102
|
+
|
|
103
|
+
// Footer
|
|
104
|
+
footer: { columns, social, copyright },
|
|
105
|
+
|
|
106
|
+
// Usado en /terms y /privacy
|
|
107
|
+
legal: { companyName, email, lastUpdated },
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Editás ese archivo una sola vez y toda la app (landing, footer, páginas legales) queda actualizada.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Stack
|
|
116
|
+
|
|
117
|
+
### Backend
|
|
118
|
+
| Tecnología | Versión | Uso |
|
|
119
|
+
|---|---|---|
|
|
120
|
+
| NestJS | 11 | Framework principal |
|
|
121
|
+
| MongoDB + Mongoose | 9 | Base de datos |
|
|
122
|
+
| JWT (passport) | — | Autenticación en cookies HttpOnly |
|
|
123
|
+
| passport-github2 | — | OAuth con GitHub |
|
|
124
|
+
| Resend | — | Emails transaccionales |
|
|
125
|
+
| Swagger | — | Documentación automática en `/api/docs` |
|
|
126
|
+
|
|
127
|
+
### Frontend
|
|
128
|
+
| Tecnología | Versión | Uso |
|
|
129
|
+
|---|---|---|
|
|
130
|
+
| Next.js | 15 | App Router, Server Components |
|
|
131
|
+
| Tailwind CSS | 4 | Estilos |
|
|
132
|
+
| shadcn/ui + Radix UI | — | 15+ componentes listos (button, dialog, dropdown, tabs, accordion, avatar, switch, etc.) |
|
|
133
|
+
| react-hook-form | — | Formularios con validación |
|
|
134
|
+
| axios | — | HTTP client con interceptor de refresh |
|
|
135
|
+
| lucide-react | — | Íconos |
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Módulos incluidos
|
|
140
|
+
|
|
141
|
+
### Frontend — siempre incluido
|
|
142
|
+
|
|
143
|
+
| Sección | Contenido |
|
|
144
|
+
|---|---|
|
|
145
|
+
| **Landing page** | Navbar sticky, Hero con mockup, Features (6 cards), Pricing (3 tiers), FAQ (acordeón), CTA final, Footer |
|
|
146
|
+
| **Auth** | Login, Register (con checkbox de términos), Verify email, Forgot password, Reset password |
|
|
147
|
+
| **Dashboard** | Overview con stat cards, sidebar con navegación activa, header con avatar + dropdown |
|
|
148
|
+
| **Perfil** | Editar nombre/email, cambiar contraseña (modal), zona de eliminación de cuenta |
|
|
149
|
+
| **Ajustes** | Switches de notificaciones por email, configuración de workspace, zona peligrosa |
|
|
150
|
+
| **Facturación** | Plan actual, método de pago, historial de facturas, botón de upgrade |
|
|
151
|
+
| **Equipo** | Lista de miembros, invitar por email (modal), gestión de roles |
|
|
152
|
+
| **Legal** | Términos y condiciones, Política de privacidad — ambas enlazadas desde el footer y el register |
|
|
153
|
+
|
|
154
|
+
### Backend — siempre incluido
|
|
155
|
+
|
|
156
|
+
| Módulo | Descripción |
|
|
157
|
+
|---|---|
|
|
158
|
+
| **Auth completo** | Registro, login, verificación de email, reset de password |
|
|
159
|
+
| **GitHub OAuth** | Login/registro con GitHub (código de intercambio + cookies HttpOnly) |
|
|
160
|
+
| **Multi-tenancy** | Aislamiento estricto por `workspaceId` en todas las queries |
|
|
161
|
+
| **Mail transaccional** | Verificación, bienvenida y reset con Resend. Fail-open si Resend falla |
|
|
162
|
+
|
|
163
|
+
### Módulos opcionales
|
|
164
|
+
|
|
165
|
+
| Módulo | Descripción |
|
|
166
|
+
|---|---|
|
|
167
|
+
| **Notificaciones** | Notificaciones in-app + Push Web (VAPID) |
|
|
168
|
+
| **Invoices + Quotes** | Facturación con generación de PDF |
|
|
169
|
+
| **CRM** | Kanban + Pipeline de ventas |
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Configuración
|
|
174
|
+
|
|
175
|
+
Al ejecutar el CLI se copian automáticamente los archivos `.env.example` → `.env` y se precarga `MONGODB_URI` apuntando a la base de datos Docker local. Si preferís usar MongoDB Atlas u otra BD remota, reemplazá ese valor antes de iniciar el backend.
|
|
176
|
+
|
|
177
|
+
### Backend — variables requeridas
|
|
178
|
+
|
|
179
|
+
| Variable | Descripción |
|
|
180
|
+
|---|---|
|
|
181
|
+
| `MONGODB_URI` | URI de MongoDB — local (`mongodb://localhost:27017/proyecto`) o remota (Atlas, Railway, etc.) |
|
|
182
|
+
| `JWT_ACCESS_SECRET` | Secreto para access tokens (`openssl rand -hex 64`) |
|
|
183
|
+
| `JWT_REFRESH_SECRET` | Secreto para refresh tokens (distinto al anterior) |
|
|
184
|
+
| `RESEND_API_KEY` | API Key de [Resend](https://resend.com) |
|
|
185
|
+
| `RESEND_FROM_EMAIL` | Email remitente verificado en Resend |
|
|
186
|
+
| `APP_URL` | URL del frontend (para links en emails) |
|
|
187
|
+
| `CORS_ORIGINS` | URL del frontend separada por comas |
|
|
188
|
+
| `FRONTEND_URL` | URL del frontend para redirecciones OAuth |
|
|
189
|
+
| `GITHUB_CLIENT_ID` | Client ID de tu GitHub OAuth App |
|
|
190
|
+
| `GITHUB_CLIENT_SECRET` | Client Secret de tu GitHub OAuth App |
|
|
191
|
+
| `GITHUB_CALLBACK_URL` | Callback URL registrada en GitHub |
|
|
192
|
+
|
|
193
|
+
### Frontend — variables requeridas
|
|
194
|
+
|
|
195
|
+
| Variable | Descripción |
|
|
196
|
+
|---|---|
|
|
197
|
+
| `NEXT_PUBLIC_API_URL` | URL base del backend (ej: `http://localhost:3000`) |
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Deploy
|
|
202
|
+
|
|
203
|
+
El CLI genera la configuración según el entorno elegido:
|
|
204
|
+
|
|
205
|
+
### Railway
|
|
206
|
+
```toml
|
|
207
|
+
# railway.toml generado automáticamente
|
|
208
|
+
[build]
|
|
209
|
+
builder = "nixpacks"
|
|
210
|
+
|
|
211
|
+
[deploy]
|
|
212
|
+
startCommand = "npm run start:prod"
|
|
213
|
+
healthcheckPath = "/api/health"
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Fly.io
|
|
217
|
+
```toml
|
|
218
|
+
# fly.toml generado automáticamente
|
|
219
|
+
app = "mi-proyecto"
|
|
220
|
+
primary_region = "gru" # São Paulo
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Docker
|
|
224
|
+
```yaml
|
|
225
|
+
# docker-compose.yml generado automáticamente
|
|
226
|
+
# Incluye backend + frontend + MongoDB
|
|
227
|
+
docker compose up
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Iniciar el proyecto generado
|
|
233
|
+
|
|
234
|
+
### 1. Base de datos
|
|
235
|
+
|
|
236
|
+
El CLI genera un `docker-compose.dev.yml` con MongoDB listo para desarrollo local. **Docker es opcional** — podés usar cualquier MongoDB (Atlas, Railway, etc.) cambiando `MONGODB_URI` en `backend/.env`.
|
|
237
|
+
|
|
238
|
+
**Opción A — Docker local (sin cuenta externa)**
|
|
239
|
+
```bash
|
|
240
|
+
cd mi-proyecto
|
|
241
|
+
docker compose -f docker-compose.dev.yml up -d
|
|
242
|
+
# MongoDB corriendo en mongodb://localhost:27017/mi-proyecto
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
**Opción B — MongoDB Atlas u otra BD remota**
|
|
246
|
+
```bash
|
|
247
|
+
# Editá backend/.env y reemplazá MONGODB_URI:
|
|
248
|
+
MONGODB_URI=mongodb+srv://usuario:contraseña@cluster.mongodb.net/mi-proyecto
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### 2. Backend
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
cd mi-proyecto/backend
|
|
255
|
+
npm install
|
|
256
|
+
# Completar variables en .env (JWT secrets, Resend, GitHub OAuth, etc.)
|
|
257
|
+
npm run start:dev
|
|
258
|
+
# → http://localhost:3000
|
|
259
|
+
# → Swagger: http://localhost:3000/api/docs
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### 3. Frontend
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
cd mi-proyecto/frontend
|
|
266
|
+
npm install
|
|
267
|
+
# Completar .env.local con NEXT_PUBLIC_API_URL=http://localhost:3000
|
|
268
|
+
npm run dev
|
|
269
|
+
# → http://localhost:3001 (landing page)
|
|
270
|
+
# → http://localhost:3001/login
|
|
271
|
+
# → http://localhost:3001/dashboard
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
La landing page aparece directo en `/`. El primer setup del workspace se hace desde la pantalla de onboarding `/setup`.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Flujos de autenticación implementados
|
|
279
|
+
|
|
280
|
+
- `POST /api/auth/register` — Registro con email de verificación
|
|
281
|
+
- `GET /api/auth/verify-email?token=` — Verificación de email
|
|
282
|
+
- `POST /api/auth/login` — Login (setea cookies HttpOnly)
|
|
283
|
+
- `POST /api/auth/refresh` — Refresh automático del access token
|
|
284
|
+
- `POST /api/auth/logout` — Logout (limpia cookies)
|
|
285
|
+
- `POST /api/auth/forgot-password` — Solicitud de reset
|
|
286
|
+
- `POST /api/auth/reset-password` — Reset de contraseña
|
|
287
|
+
- `GET /api/auth/me` — Datos del usuario autenticado
|
|
288
|
+
- `GET /api/auth/github` — Inicia el flujo OAuth con GitHub
|
|
289
|
+
- `GET /api/auth/github/callback` — Callback de GitHub
|
|
290
|
+
- `POST /api/auth/github/exchange` — Canjea el código por cookies de sesión
|
|
291
|
+
|
|
292
|
+
Los tokens JWT viajan **únicamente en cookies HttpOnly**. Nunca en `localStorage` ni en el body de las respuestas.
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## Requisitos
|
|
297
|
+
|
|
298
|
+
- **Node.js** 18+
|
|
299
|
+
- **MongoDB** — Docker (incluido) o [Atlas](https://www.mongodb.com/atlas) (free tier disponible)
|
|
300
|
+
- Cuenta en [Resend](https://resend.com) para emails (free tier: 100 emails/día)
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## Licencia
|
|
305
|
+
|
|
306
|
+
MIT © 2026 [Ignacio Becher](https://github.com/ignaciobecher)
|
|
307
|
+
|
|
308
|
+
El código generado por esta herramienta es completamente tuyo, sin restricciones de uso comercial. Podés usarlo, modificarlo y distribuirlo libremente.
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Legal
|
|
313
|
+
|
|
314
|
+
**Propiedad del código generado**
|
|
315
|
+
|
|
316
|
+
Todo el código que `ar-saas` genera en tu proyecto te pertenece a vos. No reclamamos ningún derecho sobre el código generado ni sobre los productos que construyas con él.
|
|
317
|
+
|
|
318
|
+
**Sin garantías**
|
|
319
|
+
|
|
320
|
+
Esta herramienta se provee "tal cual" (*as is*), sin garantías de ningún tipo. No nos hacemos responsables por:
|
|
321
|
+
|
|
322
|
+
- Vulnerabilidades de seguridad en el código generado si modificás la configuración por defecto
|
|
323
|
+
- Daños directos o indirectos derivados del uso del software
|
|
324
|
+
- Pérdida de datos o interrupciones de servicio en proyectos construidos con esta herramienta
|
|
325
|
+
|
|
326
|
+
**Dependencias de terceros**
|
|
327
|
+
|
|
328
|
+
El código generado incluye dependencias de terceros (NestJS, Next.js, MongoDB, etc.), cada una con su propia licencia. Es tu responsabilidad revisar y cumplir con los términos de cada dependencia en tu proyecto.
|
|
329
|
+
|
|
330
|
+
**Seguridad**
|
|
331
|
+
|
|
332
|
+
Si encontrás una vulnerabilidad de seguridad en esta herramienta, por favor reportala abriendo un issue en el [repositorio de GitHub](https://github.com/ignaciobecher/ar-saas) en lugar de hacerlo público.
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
<p align="center">
|
|
337
|
+
Hecho en Argentina 🇦🇷
|
|
338
|
+
</p>
|