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.
Files changed (114) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +338 -314
  3. package/dist/cli.js +19 -0
  4. package/dist/generator.js +166 -55
  5. package/package.json +52 -50
  6. package/templates/backend/.env.example +67 -67
  7. package/templates/backend/.prettierrc +4 -4
  8. package/templates/backend/README.md +249 -168
  9. package/templates/backend/eslint.config.mjs +35 -35
  10. package/templates/backend/nest-cli.json +8 -8
  11. package/templates/backend/package-lock.json +10979 -10979
  12. package/templates/backend/package.json +88 -88
  13. package/templates/backend/src/app.controller.spec.ts +24 -24
  14. package/templates/backend/src/app.controller.ts +15 -15
  15. package/templates/backend/src/app.module.ts +40 -40
  16. package/templates/backend/src/app.service.ts +11 -11
  17. package/templates/backend/src/common/base/base.repository.ts +221 -221
  18. package/templates/backend/src/common/base/base.schema.ts +24 -24
  19. package/templates/backend/src/common/decorators/cookie.decorator.ts +9 -9
  20. package/templates/backend/src/common/decorators/current-user.decorator.ts +20 -20
  21. package/templates/backend/src/common/decorators/workspace-id.decorator.ts +14 -14
  22. package/templates/backend/src/common/filters/global-exception.filter.ts +61 -61
  23. package/templates/backend/src/common/guards/jwt-auth.guard.ts +5 -5
  24. package/templates/backend/src/common/interceptors/workspace-tenant.interceptor.ts +45 -45
  25. package/templates/backend/src/main.ts +51 -51
  26. package/templates/backend/src/modules/auth/auth.controller.ts +158 -158
  27. package/templates/backend/src/modules/auth/auth.module.ts +20 -20
  28. package/templates/backend/src/modules/auth/auth.service.ts +257 -257
  29. package/templates/backend/src/modules/auth/dto/forgot-password.dto.ts +9 -9
  30. package/templates/backend/src/modules/auth/dto/login.dto.ts +14 -14
  31. package/templates/backend/src/modules/auth/dto/refresh-token.dto.ts +12 -12
  32. package/templates/backend/src/modules/auth/dto/register.dto.ts +26 -26
  33. package/templates/backend/src/modules/auth/dto/reset-password.dto.ts +16 -16
  34. package/templates/backend/src/modules/auth/dto/verify-email.dto.ts +9 -9
  35. package/templates/backend/src/modules/auth/strategies/jwt.strategy.ts +43 -43
  36. package/templates/backend/src/modules/mail/mail.module.ts +9 -9
  37. package/templates/backend/src/modules/mail/mail.service.ts +141 -141
  38. package/templates/backend/src/modules/users/schemas/user.schema.ts +54 -54
  39. package/templates/backend/src/modules/users/users.module.ts +14 -14
  40. package/templates/backend/src/modules/users/users.repository.ts +51 -51
  41. package/templates/backend/src/modules/users/users.service.ts +104 -104
  42. package/templates/backend/src/modules/workspaces/schemas/workspace.schema.ts +26 -26
  43. package/templates/backend/src/modules/workspaces/workspaces.module.ts +16 -16
  44. package/templates/backend/src/modules/workspaces/workspaces.repository.ts +34 -34
  45. package/templates/backend/src/modules/workspaces/workspaces.service.ts +42 -42
  46. package/templates/backend/test/app.e2e-spec.ts +25 -25
  47. package/templates/backend/test/jest-e2e.json +9 -9
  48. package/templates/backend/tsconfig.build.json +4 -4
  49. package/templates/backend/tsconfig.json +26 -26
  50. package/templates/frontend/.env.local.example +1 -1
  51. package/templates/frontend/README.md +152 -0
  52. package/templates/frontend/components.json +20 -20
  53. package/templates/frontend/eslint.config.mjs +14 -14
  54. package/templates/frontend/next.config.ts +5 -5
  55. package/templates/frontend/package-lock.json +6722 -6722
  56. package/templates/frontend/package.json +48 -48
  57. package/templates/frontend/pnpm-lock.yaml +5012 -5012
  58. package/templates/frontend/pnpm-workspace.yaml +3 -3
  59. package/templates/frontend/postcss.config.mjs +7 -7
  60. package/templates/frontend/src/app/(auth)/forgot-password/page.tsx +84 -84
  61. package/templates/frontend/src/app/(auth)/layout.tsx +28 -28
  62. package/templates/frontend/src/app/(auth)/login/page.tsx +111 -111
  63. package/templates/frontend/src/app/(auth)/register/page.tsx +161 -161
  64. package/templates/frontend/src/app/(auth)/reset-password/page.tsx +120 -120
  65. package/templates/frontend/src/app/(auth)/verify-email/page.tsx +78 -78
  66. package/templates/frontend/src/app/(dashboard)/billing/page.tsx +111 -111
  67. package/templates/frontend/src/app/(dashboard)/dashboard/page.tsx +105 -105
  68. package/templates/frontend/src/app/(dashboard)/layout.tsx +38 -38
  69. package/templates/frontend/src/app/(dashboard)/profile/page.tsx +226 -226
  70. package/templates/frontend/src/app/(dashboard)/settings/page.tsx +156 -156
  71. package/templates/frontend/src/app/(dashboard)/team/page.tsx +178 -178
  72. package/templates/frontend/src/app/(legal)/privacy/page.tsx +127 -127
  73. package/templates/frontend/src/app/(legal)/terms/page.tsx +118 -118
  74. package/templates/frontend/src/app/globals.css +81 -81
  75. package/templates/frontend/src/app/layout.tsx +26 -26
  76. package/templates/frontend/src/app/page.tsx +5 -45
  77. package/templates/frontend/src/app/setup/page.tsx +371 -275
  78. package/templates/frontend/src/components/dashboard/header.tsx +89 -89
  79. package/templates/frontend/src/components/dashboard/sidebar.tsx +71 -71
  80. package/templates/frontend/src/components/dashboard/stat-card.tsx +34 -34
  81. package/templates/frontend/src/components/landing/faq.tsx +39 -39
  82. package/templates/frontend/src/components/landing/features.tsx +54 -54
  83. package/templates/frontend/src/components/landing/footer.tsx +76 -76
  84. package/templates/frontend/src/components/landing/hero.tsx +72 -72
  85. package/templates/frontend/src/components/landing/navbar.tsx +78 -78
  86. package/templates/frontend/src/components/landing/pricing.tsx +90 -90
  87. package/templates/frontend/src/components/ui/accordion.tsx +52 -52
  88. package/templates/frontend/src/components/ui/avatar.tsx +46 -46
  89. package/templates/frontend/src/components/ui/badge.tsx +30 -30
  90. package/templates/frontend/src/components/ui/button.tsx +52 -52
  91. package/templates/frontend/src/components/ui/card.tsx +50 -50
  92. package/templates/frontend/src/components/ui/checkbox.tsx +27 -27
  93. package/templates/frontend/src/components/ui/dialog.tsx +100 -100
  94. package/templates/frontend/src/components/ui/dropdown-menu.tsx +173 -173
  95. package/templates/frontend/src/components/ui/form.tsx +158 -158
  96. package/templates/frontend/src/components/ui/input.tsx +21 -21
  97. package/templates/frontend/src/components/ui/label.tsx +22 -22
  98. package/templates/frontend/src/components/ui/separator.tsx +25 -25
  99. package/templates/frontend/src/components/ui/skeleton.tsx +7 -7
  100. package/templates/frontend/src/components/ui/switch.tsx +28 -28
  101. package/templates/frontend/src/components/ui/tabs.tsx +54 -54
  102. package/templates/frontend/src/components/ui/textarea.tsx +20 -20
  103. package/templates/frontend/src/components/ui/toast.tsx +109 -109
  104. package/templates/frontend/src/components/ui/toaster.tsx +30 -30
  105. package/templates/frontend/src/config/site.ts +197 -197
  106. package/templates/frontend/src/hooks/use-toast.ts +116 -116
  107. package/templates/frontend/src/lib/api/auth.ts +39 -39
  108. package/templates/frontend/src/lib/api/client.ts +66 -66
  109. package/templates/frontend/src/lib/hooks/use-auth.ts +1 -1
  110. package/templates/frontend/src/lib/utils.ts +6 -6
  111. package/templates/frontend/src/providers/auth-provider.tsx +60 -60
  112. package/templates/frontend/src/types/api.ts +12 -12
  113. package/templates/frontend/src/types/auth.ts +27 -27
  114. package/templates/frontend/tsconfig.json +23 -23
@@ -1,88 +1,88 @@
1
- {
2
- "name": "create-saas-ar-backend",
3
- "version": "0.0.1",
4
- "description": "Backend SaaS multi-tenant generado con create-saas-ar",
5
- "author": "",
6
- "private": true,
7
- "license": "UNLICENSED",
8
- "scripts": {
9
- "build": "nest build",
10
- "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
11
- "start": "nest start",
12
- "start:dev": "nest start --watch",
13
- "start:debug": "nest start --debug --watch",
14
- "start:prod": "node dist/main",
15
- "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
16
- "test": "jest",
17
- "test:watch": "jest --watch",
18
- "test:cov": "jest --coverage",
19
- "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
20
- "test:e2e": "jest --config ./test/jest-e2e.json"
21
- },
22
- "dependencies": {
23
- "@nestjs/common": "^11.0.1",
24
- "@nestjs/config": "^4.0.2",
25
- "@nestjs/core": "^11.0.1",
26
- "@nestjs/jwt": "^11.0.1",
27
- "@nestjs/mongoose": "^11.0.2",
28
- "@nestjs/passport": "^11.0.5",
29
- "@nestjs/platform-express": "^11.0.1",
30
- "@nestjs/schedule": "^6.0.1",
31
- "@nestjs/swagger": "^11.2.1",
32
- "bcryptjs": "^2.4.3",
33
- "class-transformer": "^0.5.1",
34
- "class-validator": "^0.14.2",
35
- "cookie-parser": "^1.4.7",
36
- "mongoose": "^9.0.1",
37
- "passport": "^0.7.0",
38
- "passport-jwt": "^4.0.1",
39
- "reflect-metadata": "^0.2.2",
40
- "resend": "^4.1.2",
41
- "rxjs": "^7.8.1"
42
- },
43
- "devDependencies": {
44
- "@eslint/eslintrc": "^3.2.0",
45
- "@eslint/js": "^9.18.0",
46
- "@nestjs/cli": "^11.0.0",
47
- "@nestjs/schematics": "^11.0.0",
48
- "@nestjs/testing": "^11.0.1",
49
- "@types/bcryptjs": "^2.4.6",
50
- "@types/cookie-parser": "^1.4.8",
51
- "@types/express": "^5.0.0",
52
- "@types/jest": "^30.0.0",
53
- "@types/node": "^22.10.7",
54
- "@types/passport-jwt": "^4.0.1",
55
- "@types/supertest": "^6.0.2",
56
- "eslint": "^9.18.0",
57
- "eslint-config-prettier": "^10.0.1",
58
- "eslint-plugin-prettier": "^5.2.2",
59
- "globals": "^16.0.0",
60
- "jest": "^30.0.0",
61
- "prettier": "^3.4.2",
62
- "source-map-support": "^0.5.21",
63
- "supertest": "^7.0.0",
64
- "ts-jest": "^29.2.5",
65
- "ts-loader": "^9.5.2",
66
- "ts-node": "^10.9.2",
67
- "tsconfig-paths": "^4.2.0",
68
- "typescript": "^5.7.3",
69
- "typescript-eslint": "^8.20.0"
70
- },
71
- "jest": {
72
- "moduleFileExtensions": [
73
- "js",
74
- "json",
75
- "ts"
76
- ],
77
- "rootDir": "src",
78
- "testRegex": ".*\\.spec\\.ts$",
79
- "transform": {
80
- "^.+\\.(t|j)s$": "ts-jest"
81
- },
82
- "collectCoverageFrom": [
83
- "**/*.(t|j)s"
84
- ],
85
- "coverageDirectory": "../coverage",
86
- "testEnvironment": "node"
87
- }
88
- }
1
+ {
2
+ "name": "create-saas-ar-backend",
3
+ "version": "0.0.1",
4
+ "description": "Backend SaaS multi-tenant generado con create-saas-ar",
5
+ "author": "",
6
+ "private": true,
7
+ "license": "UNLICENSED",
8
+ "scripts": {
9
+ "build": "nest build",
10
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
11
+ "start": "nest start",
12
+ "start:dev": "nest start --watch",
13
+ "start:debug": "nest start --debug --watch",
14
+ "start:prod": "node dist/main",
15
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
16
+ "test": "jest",
17
+ "test:watch": "jest --watch",
18
+ "test:cov": "jest --coverage",
19
+ "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
20
+ "test:e2e": "jest --config ./test/jest-e2e.json"
21
+ },
22
+ "dependencies": {
23
+ "@nestjs/common": "^11.0.1",
24
+ "@nestjs/config": "^4.0.2",
25
+ "@nestjs/core": "^11.0.1",
26
+ "@nestjs/jwt": "^11.0.1",
27
+ "@nestjs/mongoose": "^11.0.2",
28
+ "@nestjs/passport": "^11.0.5",
29
+ "@nestjs/platform-express": "^11.0.1",
30
+ "@nestjs/schedule": "^6.0.1",
31
+ "@nestjs/swagger": "^11.2.1",
32
+ "bcryptjs": "^2.4.3",
33
+ "class-transformer": "^0.5.1",
34
+ "class-validator": "^0.14.2",
35
+ "cookie-parser": "^1.4.7",
36
+ "mongoose": "^9.0.1",
37
+ "passport": "^0.7.0",
38
+ "passport-jwt": "^4.0.1",
39
+ "reflect-metadata": "^0.2.2",
40
+ "resend": "^4.1.2",
41
+ "rxjs": "^7.8.1"
42
+ },
43
+ "devDependencies": {
44
+ "@eslint/eslintrc": "^3.2.0",
45
+ "@eslint/js": "^9.18.0",
46
+ "@nestjs/cli": "^11.0.0",
47
+ "@nestjs/schematics": "^11.0.0",
48
+ "@nestjs/testing": "^11.0.1",
49
+ "@types/bcryptjs": "^2.4.6",
50
+ "@types/cookie-parser": "^1.4.8",
51
+ "@types/express": "^5.0.0",
52
+ "@types/jest": "^30.0.0",
53
+ "@types/node": "^22.10.7",
54
+ "@types/passport-jwt": "^4.0.1",
55
+ "@types/supertest": "^6.0.2",
56
+ "eslint": "^9.18.0",
57
+ "eslint-config-prettier": "^10.0.1",
58
+ "eslint-plugin-prettier": "^5.2.2",
59
+ "globals": "^16.0.0",
60
+ "jest": "^30.0.0",
61
+ "prettier": "^3.4.2",
62
+ "source-map-support": "^0.5.21",
63
+ "supertest": "^7.0.0",
64
+ "ts-jest": "^29.2.5",
65
+ "ts-loader": "^9.5.2",
66
+ "ts-node": "^10.9.2",
67
+ "tsconfig-paths": "^4.2.0",
68
+ "typescript": "^5.7.3",
69
+ "typescript-eslint": "^8.20.0"
70
+ },
71
+ "jest": {
72
+ "moduleFileExtensions": [
73
+ "js",
74
+ "json",
75
+ "ts"
76
+ ],
77
+ "rootDir": "src",
78
+ "testRegex": ".*\\.spec\\.ts$",
79
+ "transform": {
80
+ "^.+\\.(t|j)s$": "ts-jest"
81
+ },
82
+ "collectCoverageFrom": [
83
+ "**/*.(t|j)s"
84
+ ],
85
+ "coverageDirectory": "../coverage",
86
+ "testEnvironment": "node"
87
+ }
88
+ }
@@ -1,24 +1,24 @@
1
- import { Test, TestingModule } from '@nestjs/testing';
2
- import { AppController } from './app.controller';
3
- import { AppService } from './app.service';
4
-
5
- describe('AppController', () => {
6
- let appController: AppController;
7
-
8
- beforeEach(async () => {
9
- const app: TestingModule = await Test.createTestingModule({
10
- controllers: [AppController],
11
- providers: [AppService],
12
- }).compile();
13
-
14
- appController = app.get<AppController>(AppController);
15
- });
16
-
17
- describe('health', () => {
18
- it('should return status ok', () => {
19
- const result = appController.getHealth();
20
- expect(result.status).toBe('ok');
21
- expect(result.timestamp).toBeDefined();
22
- });
23
- });
24
- });
1
+ import { Test, TestingModule } from '@nestjs/testing';
2
+ import { AppController } from './app.controller';
3
+ import { AppService } from './app.service';
4
+
5
+ describe('AppController', () => {
6
+ let appController: AppController;
7
+
8
+ beforeEach(async () => {
9
+ const app: TestingModule = await Test.createTestingModule({
10
+ controllers: [AppController],
11
+ providers: [AppService],
12
+ }).compile();
13
+
14
+ appController = app.get<AppController>(AppController);
15
+ });
16
+
17
+ describe('health', () => {
18
+ it('should return status ok', () => {
19
+ const result = appController.getHealth();
20
+ expect(result.status).toBe('ok');
21
+ expect(result.timestamp).toBeDefined();
22
+ });
23
+ });
24
+ });
@@ -1,15 +1,15 @@
1
- import { Controller, Get } from '@nestjs/common';
2
- import { ApiTags, ApiOperation } from '@nestjs/swagger';
3
- import { AppService } from './app.service';
4
-
5
- @ApiTags('Health')
6
- @Controller()
7
- export class AppController {
8
- constructor(private readonly appService: AppService) {}
9
-
10
- @Get()
11
- @ApiOperation({ summary: 'Health check' })
12
- getHealth(): { status: string; timestamp: string } {
13
- return this.appService.getHealth();
14
- }
15
- }
1
+ import { Controller, Get } from '@nestjs/common';
2
+ import { ApiTags, ApiOperation } from '@nestjs/swagger';
3
+ import { AppService } from './app.service';
4
+
5
+ @ApiTags('Health')
6
+ @Controller()
7
+ export class AppController {
8
+ constructor(private readonly appService: AppService) {}
9
+
10
+ @Get()
11
+ @ApiOperation({ summary: 'Health check' })
12
+ getHealth(): { status: string; timestamp: string } {
13
+ return this.appService.getHealth();
14
+ }
15
+ }
@@ -1,40 +1,40 @@
1
- import { Module } from '@nestjs/common';
2
- import { ConfigModule, ConfigService } from '@nestjs/config';
3
- import { MongooseModule } from '@nestjs/mongoose';
4
- import { APP_FILTER } from '@nestjs/core';
5
- import { AppController } from './app.controller';
6
- import { AppService } from './app.service';
7
- import { GlobalExceptionFilter } from './common/filters/global-exception.filter';
8
- import { AuthModule } from './modules/auth/auth.module';
9
- import { MailModule } from './modules/mail/mail.module';
10
- import { UsersModule } from './modules/users/users.module';
11
- import { WorkspacesModule } from './modules/workspaces/workspaces.module';
12
-
13
- @Module({
14
- imports: [
15
- ConfigModule.forRoot({
16
- isGlobal: true,
17
- envFilePath: '.env',
18
- }),
19
- MongooseModule.forRootAsync({
20
- imports: [ConfigModule],
21
- inject: [ConfigService],
22
- useFactory: (config: ConfigService) => ({
23
- uri: config.getOrThrow<string>('MONGODB_URI'),
24
- }),
25
- }),
26
- MailModule,
27
- UsersModule,
28
- WorkspacesModule,
29
- AuthModule,
30
- ],
31
- controllers: [AppController],
32
- providers: [
33
- AppService,
34
- {
35
- provide: APP_FILTER,
36
- useClass: GlobalExceptionFilter,
37
- },
38
- ],
39
- })
40
- export class AppModule {}
1
+ import { Module } from '@nestjs/common';
2
+ import { ConfigModule, ConfigService } from '@nestjs/config';
3
+ import { MongooseModule } from '@nestjs/mongoose';
4
+ import { APP_FILTER } from '@nestjs/core';
5
+ import { AppController } from './app.controller';
6
+ import { AppService } from './app.service';
7
+ import { GlobalExceptionFilter } from './common/filters/global-exception.filter';
8
+ import { AuthModule } from './modules/auth/auth.module';
9
+ import { MailModule } from './modules/mail/mail.module';
10
+ import { UsersModule } from './modules/users/users.module';
11
+ import { WorkspacesModule } from './modules/workspaces/workspaces.module';
12
+
13
+ @Module({
14
+ imports: [
15
+ ConfigModule.forRoot({
16
+ isGlobal: true,
17
+ envFilePath: '.env',
18
+ }),
19
+ MongooseModule.forRootAsync({
20
+ imports: [ConfigModule],
21
+ inject: [ConfigService],
22
+ useFactory: (config: ConfigService) => ({
23
+ uri: config.getOrThrow<string>('MONGODB_URI'),
24
+ }),
25
+ }),
26
+ MailModule,
27
+ UsersModule,
28
+ WorkspacesModule,
29
+ AuthModule,
30
+ ],
31
+ controllers: [AppController],
32
+ providers: [
33
+ AppService,
34
+ {
35
+ provide: APP_FILTER,
36
+ useClass: GlobalExceptionFilter,
37
+ },
38
+ ],
39
+ })
40
+ export class AppModule {}
@@ -1,11 +1,11 @@
1
- import { Injectable } from '@nestjs/common';
2
-
3
- @Injectable()
4
- export class AppService {
5
- getHealth(): { status: string; timestamp: string } {
6
- return {
7
- status: 'ok',
8
- timestamp: new Date().toISOString(),
9
- };
10
- }
11
- }
1
+ import { Injectable } from '@nestjs/common';
2
+
3
+ @Injectable()
4
+ export class AppService {
5
+ getHealth(): { status: string; timestamp: string } {
6
+ return {
7
+ status: 'ok',
8
+ timestamp: new Date().toISOString(),
9
+ };
10
+ }
11
+ }