wexts 3.0.0 → 3.0.1
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/README.md +241 -235
- package/package.json +20 -7
- package/templates/.dockerignore +43 -0
- package/templates/.env.example +17 -0
- package/templates/Dockerfile +60 -0
- package/templates/Procfile +1 -0
- package/templates/README.md +58 -0
- package/templates/api-sdk.ts +115 -0
- package/templates/docker-compose.yml +34 -0
- package/templates/nestjs-api/src/auth/auth.controller.ts +4 -7
- package/templates/nestjs-api/src/auth/auth.module.ts +4 -1
- package/templates/nestjs-api/src/auth/auth.service.ts +8 -13
- package/templates/nestjs-api/src/todos/todos.controller.ts +0 -7
- package/templates/nestjs-api/src/todos/todos.module.ts +3 -1
- package/templates/nestjs-api/src/users/users.controller.ts +0 -3
- package/templates/nestjs-api/src/users/users.module.ts +3 -1
- package/templates/nextjs-web/app/actions/auth.ts +49 -20
- package/templates/nextjs-web/lib/api.ts +115 -0
- package/templates/nixpacks.toml +11 -0
- package/templates/root-package.json +32 -0
- package/templates/server.ts +66 -0
- package/templates/tsconfig.json +31 -0
package/README.md
CHANGED
|
@@ -1,340 +1,346 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
```
|
|
4
|
+
██╗ ██╗███████╗██╗ ██╗████████╗███████╗
|
|
5
|
+
██║ ██║██╔════╝╚██╗██╔╝╚══██╔══╝██╔════╝
|
|
6
|
+
██║ █╗ ██║█████╗ ╚███╔╝ ██║ ███████╗
|
|
7
|
+
██║███╗██║██╔══╝ ██╔██╗ ██║ ╚════██║
|
|
8
|
+
╚███╔███╔╝███████╗██╔╝ ██╗ ██║ ███████║
|
|
9
|
+
╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚══════╝
|
|
10
|
+
```
|
|
8
11
|
|
|
9
|
-
>
|
|
12
|
+
<h1>WEXTS Framework</h1>
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
**Build production-ready full-stack apps with Next.js 16 + NestJS 11 in a unified runtime**
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
- 🔥 **React 19** full support
|
|
16
|
+
[](https://www.npmjs.com/package/wexts)
|
|
17
|
+
[](https://www.npmjs.com/package/wexts)
|
|
18
|
+
[](https://opensource.org/licenses/MIT)
|
|
19
|
+
[](https://www.typescriptlang.org/)
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
[Quick Start](#-quick-start) • [Documentation](https://github.com/ziadmustafa1/wexts#documentation) • [Examples](https://github.com/ziadmustafa1/wexts/tree/main/demo)
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
- **📦 All‑in‑One SDK** – core utilities, HTTP client, decorators, and hooks in one package
|
|
23
|
-
- **🎯 Type‑Safe** – end‑to‑end TypeScript from database to UI
|
|
24
|
-
- **🛠️ CLI Tools** – scaffold projects, generate code, manage development
|
|
25
|
-
- **⚡ Auto API Client** – generate type‑safe clients from NestJS controllers
|
|
26
|
-
- **🔐 Auth Built‑in** – ready‑to‑use authentication hooks for Next.js
|
|
27
|
-
- **📝 Configuration Management** – environment‑aware config loader
|
|
28
|
-
- **🎨 React Hooks** – `useWexts()`, `useAuth()` for seamless API integration
|
|
23
|
+
</div>
|
|
29
24
|
|
|
30
25
|
---
|
|
31
26
|
|
|
32
|
-
##
|
|
27
|
+
## ✨ Why WEXTS?
|
|
33
28
|
|
|
34
|
-
|
|
29
|
+
Stop managing separate Next.js and NestJS servers. **WEXTS runs both in a single Node.js process** with zero configuration.
|
|
35
30
|
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
**Traditional Approach:**
|
|
32
|
+
```
|
|
33
|
+
❌ Two separate servers (Next.js + NestJS)
|
|
34
|
+
❌ Complex proxy setup
|
|
35
|
+
❌ CORS configuration nightmare
|
|
36
|
+
❌ URLs everywhere in your code
|
|
37
|
+
❌ Two deployments to manage
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
**WEXTS:**
|
|
41
|
+
```
|
|
42
|
+
✅ One unified server
|
|
43
|
+
✅ Smart routing (automatic)
|
|
44
|
+
✅ Zero configuration
|
|
45
|
+
✅ Type-safe SDK (no URLs!)
|
|
46
|
+
✅ Single deployment
|
|
46
47
|
```
|
|
47
48
|
|
|
48
49
|
---
|
|
49
50
|
|
|
50
|
-
##
|
|
51
|
+
## 🎯 Key Features
|
|
52
|
+
|
|
53
|
+
- 🔥 **Unified Runtime** - Single Node.js process for frontend + backend
|
|
54
|
+
- 🎨 **Zero URLs** - Call APIs without explicit URLs
|
|
55
|
+
- ⚡ **Type-Safe** - End-to-end TypeScript with auto-complete
|
|
56
|
+
- 🚀 **Production Ready** - Docker, Railway, Render, Vercel support
|
|
57
|
+
- 🔒 **Auth Built-in** - JWT authentication out of the box
|
|
58
|
+
- 📦 **Prisma ORM** - Database integration ready
|
|
59
|
+
- 🐳 **Docker Ready** - Complete Docker setup included
|
|
60
|
+
|
|
61
|
+
---
|
|
51
62
|
|
|
52
|
-
|
|
63
|
+
## 🚀 Quick Start
|
|
53
64
|
|
|
54
65
|
```bash
|
|
55
|
-
|
|
66
|
+
# Create new project
|
|
67
|
+
npx wexts create my-app
|
|
68
|
+
|
|
69
|
+
# Start development
|
|
56
70
|
cd my-app
|
|
57
|
-
pnpm
|
|
71
|
+
pnpm install
|
|
72
|
+
pnpm run dev
|
|
73
|
+
|
|
74
|
+
# Open http://localhost:3000
|
|
58
75
|
```
|
|
59
76
|
|
|
60
|
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
77
|
+
**That's it!** Your unified server is running with:
|
|
78
|
+
- ✅ Next.js frontend
|
|
79
|
+
- ✅ NestJS backend API
|
|
80
|
+
- ✅ Smart routing
|
|
81
|
+
- ✅ Hot reload
|
|
65
82
|
|
|
66
83
|
---
|
|
67
84
|
|
|
68
|
-
##
|
|
85
|
+
## 💡 The Magic - Zero URLs!
|
|
69
86
|
|
|
70
|
-
###
|
|
87
|
+
### ❌ Without WEXTS
|
|
71
88
|
|
|
72
89
|
```typescript
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
@WextsPost()
|
|
85
|
-
async create(@Body() createUserDto: CreateUserDto) {
|
|
86
|
-
return this.usersService.create(createUserDto);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
90
|
+
// Hardcoded URLs everywhere
|
|
91
|
+
const response = await fetch('http://localhost:3001/api/users');
|
|
92
|
+
const users = await response.json();
|
|
93
|
+
|
|
94
|
+
// Problems:
|
|
95
|
+
// - No type safety
|
|
96
|
+
// - CORS issues
|
|
97
|
+
// - Environment management
|
|
98
|
+
// - Proxy configuration
|
|
89
99
|
```
|
|
90
100
|
|
|
91
|
-
|
|
101
|
+
### ✅ With WEXTS
|
|
92
102
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
### Next.js Frontend
|
|
96
|
-
|
|
97
|
-
#### Setup Provider
|
|
98
|
-
|
|
99
|
-
```tsx
|
|
100
|
-
// app/layout.tsx
|
|
101
|
-
import { WextsProvider } from 'wexts/next';
|
|
103
|
+
```typescript
|
|
104
|
+
import { api } from '@/lib/api';
|
|
102
105
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
{children}
|
|
109
|
-
</WextsProvider>
|
|
110
|
-
</body>
|
|
111
|
-
</html>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
106
|
+
// Type-safe, zero URLs, works everywhere!
|
|
107
|
+
const users = await api.users.findAll();
|
|
108
|
+
// ✅ Auto-complete
|
|
109
|
+
// ✅ Type-safe
|
|
110
|
+
// ✅ No configuration
|
|
114
111
|
```
|
|
115
112
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
```tsx
|
|
119
|
-
'use client';
|
|
120
|
-
import { useWexts, useAuth } from 'wexts/next';
|
|
121
|
-
import { useEffect, useState } from 'react';
|
|
122
|
-
|
|
123
|
-
export default function UsersPage() {
|
|
124
|
-
const { client } = useWexts();
|
|
125
|
-
const { user, isAuthenticated } = useAuth();
|
|
126
|
-
const [users, setUsers] = useState([]);
|
|
127
|
-
|
|
128
|
-
useEffect(() => {
|
|
129
|
-
client.get<User[]>('/users').then(setUsers);
|
|
130
|
-
}, []);
|
|
131
|
-
|
|
132
|
-
return (
|
|
133
|
-
<div>
|
|
134
|
-
{isAuthenticated && <p>Welcome, {user.name}!</p>}
|
|
135
|
-
<ul>
|
|
136
|
-
{users.map(u => (
|
|
137
|
-
<li key={u.id}>{u.name}</li>
|
|
138
|
-
))}
|
|
139
|
-
</ul>
|
|
140
|
-
</div>
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
```
|
|
113
|
+
**The SDK automatically connects to your backend. No URLs needed!**
|
|
144
114
|
|
|
145
115
|
---
|
|
146
116
|
|
|
147
|
-
|
|
117
|
+
## 📖 Project Structure
|
|
148
118
|
|
|
149
|
-
```
|
|
150
|
-
|
|
119
|
+
```
|
|
120
|
+
my-app/
|
|
121
|
+
├── 🚀 server.ts # Unified server
|
|
122
|
+
├── apps/
|
|
123
|
+
│ ├── 🔙 api/ # NestJS Backend
|
|
124
|
+
│ │ ├── src/
|
|
125
|
+
│ │ │ ├── auth/ # JWT Authentication
|
|
126
|
+
│ │ │ └── prisma/ # Database ORM
|
|
127
|
+
│ │ └── prisma/schema.prisma
|
|
128
|
+
│ │
|
|
129
|
+
│ └── 🎨 web/ # Next.js Frontend
|
|
130
|
+
│ ├── app/ # App Router
|
|
131
|
+
│ └── lib/
|
|
132
|
+
│ └── api.ts # 🔥 Type-safe SDK
|
|
133
|
+
│
|
|
134
|
+
├── 🐳 Dockerfile # Production build
|
|
135
|
+
└── docker-compose.yml # Docker + PostgreSQL
|
|
136
|
+
```
|
|
151
137
|
|
|
152
|
-
|
|
153
|
-
const users = await apiFetcher.get<User[]>('/users');
|
|
138
|
+
---
|
|
154
139
|
|
|
155
|
-
|
|
156
|
-
const newUser = await apiFetcher.post('/users', {
|
|
157
|
-
name: 'John',
|
|
158
|
-
email: 'john@example.com',
|
|
159
|
-
});
|
|
140
|
+
## 🏗️ How It Works
|
|
160
141
|
|
|
161
|
-
|
|
162
|
-
|
|
142
|
+
```
|
|
143
|
+
┌─────────────────────────────────────────┐
|
|
144
|
+
│ Single Node.js Process │
|
|
145
|
+
│ │
|
|
146
|
+
│ ┌──────────┐ ┌──────────┐ │
|
|
147
|
+
│ │ Next.js │ │ NestJS │ │
|
|
148
|
+
│ │ Frontend │ │ Backend │ │
|
|
149
|
+
│ └──────────┘ └──────────┘ │
|
|
150
|
+
│ │
|
|
151
|
+
│ Smart Router Middleware │
|
|
152
|
+
│ ┌─────────────────────────────┐ │
|
|
153
|
+
│ │ /api/* → NestJS │ │
|
|
154
|
+
│ │ /* → Next.js │ │
|
|
155
|
+
│ └─────────────────────────────┘ │
|
|
156
|
+
└─────────────────────────────────────────┘
|
|
163
157
|
```
|
|
164
158
|
|
|
159
|
+
**No proxy. No CORS. Just works.** ✨
|
|
160
|
+
|
|
165
161
|
---
|
|
166
162
|
|
|
167
|
-
##
|
|
163
|
+
## 🔐 Built-in Authentication
|
|
168
164
|
|
|
169
165
|
```typescript
|
|
170
|
-
|
|
166
|
+
// Register
|
|
167
|
+
const { user, access_token } = await api.auth.register({
|
|
168
|
+
email: 'user@example.com',
|
|
169
|
+
password: 'secure123',
|
|
170
|
+
name: 'John Doe'
|
|
171
|
+
});
|
|
171
172
|
|
|
172
|
-
//
|
|
173
|
-
const
|
|
174
|
-
|
|
173
|
+
// Login
|
|
174
|
+
const { user, access_token } = await api.auth.login({
|
|
175
|
+
email: 'user@example.com',
|
|
176
|
+
password: 'secure123'
|
|
177
|
+
});
|
|
175
178
|
|
|
176
|
-
//
|
|
177
|
-
|
|
179
|
+
// Get current user
|
|
180
|
+
const user = await api.auth.me();
|
|
178
181
|
```
|
|
179
182
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
```json
|
|
183
|
-
{
|
|
184
|
-
"database": "postgresql://localhost/mydb",
|
|
185
|
-
"apiPort": 5050,
|
|
186
|
-
"webPort": 3000,
|
|
187
|
-
"jwt": {
|
|
188
|
-
"secret": "your-secret-key",
|
|
189
|
-
"expiresIn": "7d"
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
```
|
|
183
|
+
**Secure JWT authentication with httpOnly cookies included!**
|
|
193
184
|
|
|
194
|
-
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 🐳 Deploy Anywhere
|
|
188
|
+
|
|
189
|
+
### Docker (Recommended)
|
|
195
190
|
|
|
196
191
|
```bash
|
|
197
|
-
|
|
198
|
-
WEXTS_JWT__SECRET=your-secret-key
|
|
192
|
+
docker-compose up -d
|
|
199
193
|
```
|
|
200
194
|
|
|
201
|
-
|
|
195
|
+
**Includes PostgreSQL!** Your app is live at `http://localhost:3000`
|
|
202
196
|
|
|
203
|
-
|
|
197
|
+
### Railway (Easiest)
|
|
204
198
|
|
|
205
199
|
```bash
|
|
206
|
-
#
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
# Start development servers
|
|
210
|
-
wexts dev [--port <port>]
|
|
200
|
+
# Push to GitHub, connect Railway, done!
|
|
201
|
+
```
|
|
211
202
|
|
|
212
|
-
|
|
213
|
-
wexts build
|
|
203
|
+
Railway auto-detects WEXTS configuration.
|
|
214
204
|
|
|
215
|
-
|
|
216
|
-
wexts generate controller <name>
|
|
205
|
+
### Render / VPS
|
|
217
206
|
|
|
218
|
-
|
|
219
|
-
|
|
207
|
+
```bash
|
|
208
|
+
pnpm run build
|
|
209
|
+
pnpm start
|
|
220
210
|
```
|
|
221
211
|
|
|
222
|
-
|
|
212
|
+
**One build. One deployment. Works everywhere.**
|
|
223
213
|
|
|
224
|
-
|
|
214
|
+
---
|
|
225
215
|
|
|
226
|
-
|
|
216
|
+
## 📚 Full Example
|
|
227
217
|
|
|
228
218
|
```typescript
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
219
|
+
// Backend - apps/api/src/posts/posts.controller.ts
|
|
220
|
+
@Controller('posts')
|
|
221
|
+
@UseGuards(JwtAuthGuard)
|
|
222
|
+
export class PostsController {
|
|
223
|
+
@Get()
|
|
224
|
+
findAll() {
|
|
225
|
+
return this.postsService.findAll();
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
@Post()
|
|
229
|
+
create(@Body() dto: CreatePostDto) {
|
|
230
|
+
return this.postsService.create(dto);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
239
233
|
|
|
240
|
-
|
|
241
|
-
|
|
234
|
+
// Frontend - apps/web/lib/api.ts
|
|
235
|
+
export const api = {
|
|
236
|
+
posts: {
|
|
237
|
+
findAll: () => request<Post[]>('GET', '/posts'),
|
|
238
|
+
create: (data) => request<Post>('POST', '/posts', data),
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
// Usage - apps/web/app/posts/page.tsx
|
|
243
|
+
import { api } from '@/lib/api';
|
|
244
|
+
|
|
245
|
+
export default async function PostsPage() {
|
|
246
|
+
const posts = await api.posts.findAll(); // Type-safe!
|
|
247
|
+
|
|
248
|
+
return (
|
|
249
|
+
<div>
|
|
250
|
+
{posts.map(post => (
|
|
251
|
+
<article key={post.id}>
|
|
252
|
+
<h2>{post.title}</h2>
|
|
253
|
+
<p>{post.content}</p>
|
|
254
|
+
</article>
|
|
255
|
+
))}
|
|
256
|
+
</div>
|
|
257
|
+
);
|
|
258
|
+
}
|
|
242
259
|
```
|
|
243
260
|
|
|
244
|
-
|
|
245
|
-
- **apiFetcher** – singleton instance
|
|
261
|
+
**Complete type safety from database to UI!**
|
|
246
262
|
|
|
247
|
-
|
|
263
|
+
---
|
|
248
264
|
|
|
249
|
-
|
|
250
|
-
import { WextsController, WextsGet, WextsPost, WextsPut, WextsDelete } from 'wexts/nest';
|
|
251
|
-
```
|
|
265
|
+
## 🛠️ Commands
|
|
252
266
|
|
|
253
|
-
|
|
267
|
+
```bash
|
|
268
|
+
# Development
|
|
269
|
+
pnpm run dev # Start dev server
|
|
254
270
|
|
|
255
|
-
|
|
271
|
+
# Production
|
|
272
|
+
pnpm run build # Build everything
|
|
273
|
+
pnpm start # Start production server
|
|
256
274
|
|
|
257
|
-
|
|
258
|
-
|
|
275
|
+
# Database
|
|
276
|
+
cd apps/api
|
|
277
|
+
npx prisma migrate dev
|
|
278
|
+
npx prisma studio
|
|
259
279
|
```
|
|
260
280
|
|
|
261
|
-
|
|
262
|
-
- **useWexts()** – access API client in components
|
|
263
|
-
- **useAuth()** – authentication state management
|
|
264
|
-
|
|
265
|
-
### `wexts/types`
|
|
281
|
+
---
|
|
266
282
|
|
|
267
|
-
|
|
268
|
-
import type { User, ApiResponse, WextsConfig } from 'wexts/types';
|
|
269
|
-
```
|
|
283
|
+
## 📦 What's Included
|
|
270
284
|
|
|
271
|
-
-
|
|
285
|
+
- **Next.js 16** - Latest React framework with App Router
|
|
286
|
+
- **NestJS 11** - Modern Node.js framework
|
|
287
|
+
- **Prisma** - Type-safe database ORM
|
|
288
|
+
- **JWT Auth** - Secure authentication
|
|
289
|
+
- **TypeScript** - Full type safety
|
|
290
|
+
- **Tailwind CSS** - Utility-first CSS
|
|
291
|
+
- **Docker** - Production deployment
|
|
292
|
+
- **Examples** - Auth, CRUD, and more
|
|
272
293
|
|
|
273
294
|
---
|
|
274
295
|
|
|
275
|
-
##
|
|
296
|
+
## 🎯 Perfect For
|
|
276
297
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
│ │ └── src/
|
|
284
|
-
│ └── web/ # Next.js 16 frontend
|
|
285
|
-
│ └── app/
|
|
286
|
-
├── packages/
|
|
287
|
-
│ ├── types/ # Shared DTOs
|
|
288
|
-
│ └── api-client/ # Auto‑generated SDK
|
|
289
|
-
├── turbo.json
|
|
290
|
-
├── package.json
|
|
291
|
-
└── wexts.config.json
|
|
292
|
-
```
|
|
298
|
+
✅ Full-stack applications
|
|
299
|
+
✅ SaaS products
|
|
300
|
+
✅ Admin dashboards
|
|
301
|
+
✅ API + Web combo
|
|
302
|
+
✅ Production-ready apps
|
|
303
|
+
✅ Rapid prototyping
|
|
293
304
|
|
|
294
305
|
---
|
|
295
306
|
|
|
296
|
-
##
|
|
297
|
-
|
|
298
|
-
### Build
|
|
307
|
+
## 📚 Documentation
|
|
299
308
|
|
|
300
|
-
|
|
301
|
-
wexts
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
309
|
+
- [Getting Started](https://github.com/ziadmustafa1/wexts/blob/main/docs/getting-started.md)
|
|
310
|
+
- [Architecture](https://github.com/ziadmustafa1/wexts/blob/main/docs/architecture.md)
|
|
311
|
+
- [API Reference](https://github.com/ziadmustafa1/wexts/blob/main/docs/api-reference.md)
|
|
312
|
+
- [Deployment](https://github.com/ziadmustafa1/wexts/blob/main/docs/deployment.md)
|
|
313
|
+
- [Examples](https://github.com/ziadmustafa1/wexts/tree/main/demo)
|
|
305
314
|
|
|
306
|
-
|
|
307
|
-
cd apps/api
|
|
308
|
-
npm run build
|
|
309
|
-
npm run start:prod
|
|
310
|
-
```
|
|
315
|
+
---
|
|
311
316
|
|
|
312
|
-
|
|
317
|
+
## 🤝 Contributing
|
|
313
318
|
|
|
314
|
-
|
|
315
|
-
cd apps/web
|
|
316
|
-
npm run build
|
|
317
|
-
npm start
|
|
318
|
-
```
|
|
319
|
+
Contributions are welcome! See [CONTRIBUTING.md](https://github.com/ziadmustafa1/wexts/blob/main/CONTRIBUTING.md)
|
|
319
320
|
|
|
320
321
|
---
|
|
321
322
|
|
|
322
323
|
## 📄 License
|
|
323
324
|
|
|
324
|
-
MIT ©
|
|
325
|
+
MIT © WEXTS Team
|
|
325
326
|
|
|
326
327
|
---
|
|
327
328
|
|
|
328
|
-
##
|
|
329
|
+
## 🙏 Built With
|
|
329
330
|
|
|
330
|
-
|
|
331
|
+
- [Next.js](https://nextjs.org/) - React framework
|
|
332
|
+
- [NestJS](https://nestjs.com/) - Node.js framework
|
|
333
|
+
- [Prisma](https://www.prisma.io/) - Database ORM
|
|
334
|
+
- [TypeScript](https://www.typescriptlang.org/) - Type safety
|
|
331
335
|
|
|
332
|
-
|
|
336
|
+
---
|
|
333
337
|
|
|
334
|
-
|
|
335
|
-
- **Issues**: [Report bugs](https://github.com/ziadmustafa1/wexts/issues)
|
|
336
|
-
- **Discussions**: [Community forums](https://github.com/ziadmustafa1/wexts/discussions)
|
|
338
|
+
<div align="center">
|
|
337
339
|
|
|
338
|
-
|
|
340
|
+
**Stop managing separate servers. Start building with WEXTS.** 🚀
|
|
341
|
+
|
|
342
|
+
[GitHub](https://github.com/ziadmustafa1/wexts) • [npm](https://www.npmjs.com/package/wexts) • [Documentation](https://github.com/ziadmustafa1/wexts#readme)
|
|
343
|
+
|
|
344
|
+
Made with ❤️ for the TypeScript community
|
|
339
345
|
|
|
340
|
-
|
|
346
|
+
</div>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wexts",
|
|
3
|
-
"version": "3.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "3.0.1",
|
|
4
|
+
"description": "Build production-ready full-stack apps with Next.js 16 + NestJS 11 in a unified runtime. Zero URLs. Zero configuration.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
},
|
|
11
11
|
"files": [
|
|
12
12
|
"dist",
|
|
13
|
-
"templates"
|
|
13
|
+
"templates",
|
|
14
|
+
"README.md",
|
|
15
|
+
"LICENSE"
|
|
14
16
|
],
|
|
15
17
|
"exports": {
|
|
16
18
|
".": {
|
|
@@ -56,14 +58,25 @@
|
|
|
56
58
|
"nextjs",
|
|
57
59
|
"monorepo",
|
|
58
60
|
"typescript",
|
|
59
|
-
"react"
|
|
61
|
+
"react",
|
|
62
|
+
"unified-runtime",
|
|
63
|
+
"zero-config",
|
|
64
|
+
"type-safe",
|
|
65
|
+
"prisma",
|
|
66
|
+
"jwt-auth",
|
|
67
|
+
"docker",
|
|
68
|
+
"next.js",
|
|
69
|
+
"nest.js"
|
|
60
70
|
],
|
|
61
|
-
"author": "
|
|
71
|
+
"author": "WEXTS Team",
|
|
62
72
|
"license": "MIT",
|
|
63
73
|
"repository": {
|
|
64
74
|
"type": "git",
|
|
65
|
-
"url": "https://github.com/ziadmustafa1/wexts.git"
|
|
66
|
-
|
|
75
|
+
"url": "https://github.com/ziadmustafa1/wexts.git"
|
|
76
|
+
},
|
|
77
|
+
"homepage": "https://github.com/ziadmustafa1/wexts#readme",
|
|
78
|
+
"bugs": {
|
|
79
|
+
"url": "https://github.com/ziadmustafa1/wexts/issues"
|
|
67
80
|
},
|
|
68
81
|
"engines": {
|
|
69
82
|
"node": ">=20.9.0",
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Environment files
|
|
2
|
+
.env
|
|
3
|
+
.env.local
|
|
4
|
+
.env.*.local
|
|
5
|
+
|
|
6
|
+
# Node modules
|
|
7
|
+
node_modules
|
|
8
|
+
dist
|
|
9
|
+
build
|
|
10
|
+
.next
|
|
11
|
+
.turbo
|
|
12
|
+
|
|
13
|
+
# Database
|
|
14
|
+
*.db
|
|
15
|
+
*.db-journal
|
|
16
|
+
|
|
17
|
+
# Logs
|
|
18
|
+
*.log
|
|
19
|
+
npm-debug.log*
|
|
20
|
+
|
|
21
|
+
# OS
|
|
22
|
+
.DS_Store
|
|
23
|
+
Thumbs.db
|
|
24
|
+
|
|
25
|
+
# IDE
|
|
26
|
+
.vscode
|
|
27
|
+
.idea
|
|
28
|
+
*.swp
|
|
29
|
+
|
|
30
|
+
# Git
|
|
31
|
+
.git
|
|
32
|
+
.gitignore
|
|
33
|
+
|
|
34
|
+
# CI/CD
|
|
35
|
+
.github
|
|
36
|
+
|
|
37
|
+
# Documentation
|
|
38
|
+
*.md
|
|
39
|
+
!README.md
|
|
40
|
+
|
|
41
|
+
# Config files
|
|
42
|
+
.prettierrc
|
|
43
|
+
.eslintrc*
|