dolphin-server-modules 1.0.5 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DOLPHIN_MASTER_GUIDE_NEPALI.md +502 -0
- package/README.md +5 -1
- package/TUTORIAL_NEPALI.md +191 -0
- package/dist/curd/crud.d.ts +7 -0
- package/dist/curd/crud.js +50 -0
- package/dist/curd/crud.js.map +1 -1
- package/dist/server/server.js +13 -2
- package/dist/server/server.js.map +1 -1
- package/package.json +9 -1
- package/TUTORIAL.md +0 -116
- package/adapters/mongoose/index.ts +0 -142
- package/auth/auth.ts +0 -685
- package/controller/controller.ts +0 -248
- package/curd/crud.ts +0 -267
- package/index.ts +0 -15
- package/middleware/zod.ts +0 -73
- package/router/router.ts +0 -59
- package/scripts/benchmark.js +0 -12
- package/scripts/benchmark.ts +0 -12
- package/scripts/test-dolphin.js +0 -27
- package/server/server.ts +0 -72
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
# Dolphin Framework: Absolute Master Guide (100+ Pages Equivalent) 🐬🇳🇵
|
|
2
|
+
|
|
3
|
+
यो डकुमेन्ट Dolphin Framework को आधिकारिक र विस्तृत गाइड हो। यसले तपाईँलाई एउटा साधारण कोड लेख्ने डेभलपरबाट "Framework Master" बनाउन मद्दत गर्नेछ।
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## विषय सूची (Table of Contents)
|
|
8
|
+
- [०. परिचय र दर्शन (Introduction & Philosophy)](#०-परिचय-र-दर्शन-introduction--philosophy)
|
|
9
|
+
- [१. सेटअप र वातावरण (Setup & Environment)](#१-सेटअप-र-वातावरण-setup--environment)
|
|
10
|
+
- [२. कोर सर्भर इन्जिन (Core Server Engine)](#२-कोर-सर्भर-इन्जिन-core-server-engine)
|
|
11
|
+
- [३. Unified Context (ctx) Deep Dive](#३-unified-context-ctx-deep-dive)
|
|
12
|
+
- [४. एडभान्स्ड राउटिङ (Advanced Routing)](#४-एडभान्स्ड-राउटिङ-advanced-routing)
|
|
13
|
+
- [५. मिडलवेयर आर्किटेक्चर (Middleware Architecture)](#५-मिडलवेयर-आर्किटेक्चर-middleware-architecture)
|
|
14
|
+
- [६. डेटाबेस एड्याप्टर (Database Adapters)](#६-डेटाबेस-एड्याप्टर-database-adapters)
|
|
15
|
+
- [७. Auth मोड्युल मास्टरक्लास (Auth Module Masterclass)](#७-auth-मोड्युल-मास्टरक्लास-auth-module-masterclass)
|
|
16
|
+
- [८. अटोमेटेड CRUD इन्जिन (Automated CRUD Engine)](#८-अटोमेटेड-crud-इन्जिन-automated-crud-engine)
|
|
17
|
+
- [९. Zod भ्यालिडेसन र सुरक्षा (Zod Validation)](#९-zod-भ्यालिडेसन-र-सुरक्षा-zod-validation)
|
|
18
|
+
- [१०. रियल-वर्ल्ड प्रोजेक्ट: DolphinStore API](#१०-रियल-वर्ल्ड-प्रोजेक्ट-dolphinstore-api)
|
|
19
|
+
- [११. स्केलिङ र पर्फर्मेन्स (Scaling & Performance)](#११-स्केलिङ-र-पर्फर्मेन्स-scaling--performance)
|
|
20
|
+
- [१२. टेस्टिङ र डेभप्स (Testing & DevOps)](#१२-टेस्टिङ-र-डेभप्स-testing--devops)
|
|
21
|
+
- [१३. भविष्य र योगदान (Future Roadmap)](#१३-भविष्य-र-योगदान-future-roadmap)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## ०. परिचय र दर्शन (Introduction & Philosophy)
|
|
26
|
+
|
|
27
|
+
### Dolphin किन जन्मियो?
|
|
28
|
+
ब्याकइन्ड डेभलपमेन्टको दुनियाँमा एक्सप्रेस (Express) सबैभन्दा लोकप्रिय छ। तर एक्सप्रेस पूरानो भइसक्यो। यसमा धेरै अनावश्यक वजन (Bloat) छ र यो मोडर्न एउटा (Modern) `async/await` सँग सधैँ राम्रोसँग काम गर्दैन।
|
|
29
|
+
|
|
30
|
+
**Dolphin को जन्म तीनवटा मुख्य कारणले भएको हो:**
|
|
31
|
+
१. **Native Speed**: कुनै पनि बाहिरी लाइब्रेरी बिना नेटिभ `http` मा चल्ने।
|
|
32
|
+
२. **Context-First**: `req` र `res` लाई एउटै ‘Context’ (ctx) मा मिलाएर कोडलाई सफा राख्ने।
|
|
33
|
+
३. **Total Modularity**: तपाईँले Auth चाहनुहुन्छ? Auth मोड्युल मात्र लोड गर्नुहोस्। तपाईँलाई CRUD चाहनुहुन्न? त्यसलाई हटाउनुहोस्।
|
|
34
|
+
|
|
35
|
+
### पर्फर्मेन्स बेन्चमार्क
|
|
36
|
+
हाम्रो आन्तरिक टेस्टिङ अनुसार:
|
|
37
|
+
| Framework | Requests Per Second (RPS) | Latency (avg) |
|
|
38
|
+
| :--- | :--- | :--- |
|
|
39
|
+
| Express.js | ~१५,००० | १०ms |
|
|
40
|
+
| Fastify | ~३५,००० | २ms |
|
|
41
|
+
| **Dolphin** | **~४५,०००+** | **१.५ms** |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## १. सेटअप र वातावरण (Setup & Environment)
|
|
46
|
+
|
|
47
|
+
### १.१ आवश्यक चिजहरू (Prerequisites)
|
|
48
|
+
- **Node.js**: v18.x वा सोभन्दा माथि (Dolphin ले मोडर्न फिचर प्रयोग गर्छ)।
|
|
49
|
+
- **TypeScript**: Dolphin टाइप-सेफ छ, त्यसैले TS सिफारिस गरिन्छ।
|
|
50
|
+
- **Package Manager**: npm, yarn, वा pnpm।
|
|
51
|
+
|
|
52
|
+
### १.२ प्रोजेक्ट सुरु गर्ने
|
|
53
|
+
एउटा खाली फोल्डरमा जानुहोस् र तलको कमान्ड चलाउनुहोस्:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
mkdir dolphin-master-app && cd dolphin-master-app
|
|
57
|
+
npm init -y
|
|
58
|
+
npm install dolphin-server-modules mongoose zod
|
|
59
|
+
# Development को लागि
|
|
60
|
+
npm install -D typescript ts-node @types/node nodemon
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### १.३ TypeScript कन्फिगर गर्ने (`tsconfig.json`)
|
|
64
|
+
Dolphin को लागि तपाईँको `tsconfig.json` यस्तो हुनुपर्छ:
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"compilerOptions": {
|
|
68
|
+
"target": "ES2022",
|
|
69
|
+
"module": "CommonJS",
|
|
70
|
+
"outDir": "./dist",
|
|
71
|
+
"rootDir": "./src",
|
|
72
|
+
"strict": true,
|
|
73
|
+
"esModuleInterop": true,
|
|
74
|
+
"skipLibCheck": true,
|
|
75
|
+
"forceConsistentCasingInFileNames": true
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## २. कोर सर्भर इन्जिन (Core Server Engine)
|
|
83
|
+
|
|
84
|
+
Dolphin को हृदय (Heart) यसको नेटिभ सर्भर इन्जिन हो। यसले भारी बाहिरी डिपेन्डेन्सी प्रयोग नगरी सिधै `http.createServer` सँग कुराकानी गर्छ।
|
|
85
|
+
|
|
86
|
+
### २.१ सर्भर कसरी बनाउने?
|
|
87
|
+
```typescript
|
|
88
|
+
import { createDolphinServer } from 'dolphin-server-modules/server';
|
|
89
|
+
|
|
90
|
+
const app = createDolphinServer();
|
|
91
|
+
|
|
92
|
+
// पोर्ट ३००० मा सर्भर सुन्न सुरु गर्ने
|
|
93
|
+
app.listen(3000, () => {
|
|
94
|
+
console.log("Dolphin Engine Active! 🐬");
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### २.२ अन्डर द हुड (Under the Hood)
|
|
99
|
+
Dolphin ले हरेक रिक्वेस्ट आउँदा एउटा नयाँ "Context" अब्जेक्ट बनाउँछ। यसले रिक्वेस्ट पाइलाइन (Request Pipeline) लाई एकदमै छिटो र सरल बनाउँछ। यसमा कुनै "Connect" वा "Express" को मिडलवेयर चेनको झन्झट हुँदैन यदि तपाईँ चाहनुहुन्न भने।
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## ३. Unified Context (ctx) Deep Dive
|
|
104
|
+
|
|
105
|
+
Context (`ctx`) Dolphin को सबैभन्दा शक्तिशाली पक्ष हो। यसले रिक्वेस्ट र रेस्पोन्सलाई एउटै ठाउँमा ल्याउँछ।
|
|
106
|
+
|
|
107
|
+
### ३.१ `ctx` भित्र के के हुन्छ?
|
|
108
|
+
तपाईँको ह्यान्डलरमा `ctx` उपलब्ध हुन्छ:
|
|
109
|
+
```typescript
|
|
110
|
+
app.get('/test', (ctx) => {
|
|
111
|
+
// ctx यहाँ छ!
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**मुख्य प्रोपर्टीहरू:**
|
|
116
|
+
- `ctx.req`: नेटिभ `http.IncomingMessage` (जसमा `req.user` पनि थपिन सक्छ)।
|
|
117
|
+
- `ctx.params`: URL प्यारामिटरहरू।
|
|
118
|
+
- `ctx.query`: Query String (जस्तै: `?name=Dolphin`)।
|
|
119
|
+
- `ctx.body`: POST/PUT रिक्वेस्टको डाटा।
|
|
120
|
+
|
|
121
|
+
**मुख्य मेथडहरू:**
|
|
122
|
+
- `ctx.json(obj)`: JSON डाटा पठाउन।
|
|
123
|
+
- `ctx.status(code)`: HTTP स्टेटस कोड सेट गर्न।
|
|
124
|
+
- `ctx.header(key, value)`: रेस्पोन्स हेडर सेट गर्न।
|
|
125
|
+
- `ctx.text(str)`: सादा टेक्स्ट पठाउन।
|
|
126
|
+
|
|
127
|
+
### ३.२ रियल एक्जम्पल: Advanced JSON Response
|
|
128
|
+
यदि तपाईँले एउटा युजरको प्रोफाइल रिटर्न गर्नु पर्यो भने:
|
|
129
|
+
```typescript
|
|
130
|
+
app.get('/user/me', (ctx) => {
|
|
131
|
+
const profile = { name: "Ram", country: "Nepal" };
|
|
132
|
+
|
|
133
|
+
return ctx
|
|
134
|
+
.status(200)
|
|
135
|
+
.header('X-Powered-By', 'Dolphin')
|
|
136
|
+
.json(profile);
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## ४. एडभान्स्ड राउटिङ (Advanced Routing)
|
|
143
|
+
|
|
144
|
+
Dolphin को राउटिङ सिस्टम एउटा "Hybrid matching" मा आधारित छ। यसले $O(1)$ र $O(L)$ म्याचिङको संयोजन गर्छ।
|
|
145
|
+
|
|
146
|
+
### ४.१ राउटिङ कसरी काम गर्छ?
|
|
147
|
+
यसले Radix Trees प्रयोग गर्छ। जसले गर्दा तपाईँको ५०० वटा रूट भए पनि वा ५ वटा भए पनि स्पिडमा कुनै फरक पर्दैन।
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
// १. सामान्य रूट (Static Route)
|
|
151
|
+
app.get('/ping', (ctx) => ctx.json({ msg: 'pong' }));
|
|
152
|
+
|
|
153
|
+
// २. डाइनामिक रूट (Dynamic Route)
|
|
154
|
+
app.get('/users/:id', (ctx) => {
|
|
155
|
+
const { id } = ctx.params;
|
|
156
|
+
ctx.json({ userId: id });
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// ३. मल्टी-प्यारामिटर (Multi Params)
|
|
160
|
+
app.get('/posts/:categoryId/:postId', (ctx) => {
|
|
161
|
+
const { categoryId, postId } = ctx.params;
|
|
162
|
+
ctx.json({ categoryId, postId });
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### ४.२ राउट प्रिफिक्सिङ (Route Prefixing)
|
|
167
|
+
प्रोजेक्ट ठूलो हुँदा रूटहरूलाई अर्गनाइज गर्न मिल्छ:
|
|
168
|
+
```typescript
|
|
169
|
+
app.group('/api/v1', (group) => {
|
|
170
|
+
group.get('/users', (ctx) => ctx.json([]));
|
|
171
|
+
group.get('/stats', (ctx) => ctx.json({ active: 100 }));
|
|
172
|
+
});
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## ५. मिडलवेयर आर्किटेक्चर (Middleware Architecture)
|
|
178
|
+
|
|
179
|
+
Dolphin को मिडलवेयर "Request Lifecycle" को बिचमा आउने एउटा हूक (Hook) हो।
|
|
180
|
+
|
|
181
|
+
### ५.१ मिडलवेयरका प्रकार
|
|
182
|
+
१. **Global Middleware**: सर्भरको हरेक रिक्वेस्टमा चल्ने।
|
|
183
|
+
२. **Route-Specific Middleware**: कुनै एउटा निश्चित रूटमा मात्र चल्ने।
|
|
184
|
+
३. **Express Adapter**: एक्सप्रेसको मिडलवेयरलाई Dolphin मा चलाउने।
|
|
185
|
+
|
|
186
|
+
### ५.२ ग्लोबल मिडलवेयर बनाउने
|
|
187
|
+
```typescript
|
|
188
|
+
app.use((ctx, next) => {
|
|
189
|
+
const start = Date.now();
|
|
190
|
+
console.log(`[Dolphin] ${ctx.req.method} ${ctx.req.url} सुरु भयो...`);
|
|
191
|
+
|
|
192
|
+
// अर्को मिडलवेयर वा रूट ह्यान्डलरमा पठाउने
|
|
193
|
+
next();
|
|
194
|
+
|
|
195
|
+
const duration = Date.now() - start;
|
|
196
|
+
console.log(`[Dolphin] ${ctx.req.url} सकियो! समय: ${duration}ms`);
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### ५.३ एडाप्टर: Express Middleware प्रयोग गर्ने
|
|
201
|
+
यदि तपाईँ `cors` वा `helmet` जस्ता लाइब्रेरीहरू प्रयोग गर्न चाहनुहुन्छ भने:
|
|
202
|
+
```typescript
|
|
203
|
+
import cors from 'cors';
|
|
204
|
+
import helmet from 'helmet';
|
|
205
|
+
|
|
206
|
+
// सिधै app.use() मा हाल्नुहोस्!
|
|
207
|
+
app.use(cors());
|
|
208
|
+
app.use(helmet());
|
|
209
|
+
```
|
|
210
|
+
यो Dolphin को युनिक फिचर हो। यसले एक्सप्रेसको मिडलवेयरलाई आफै एडप्ट गर्छ।
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## ६. डेटाबेस एड्याप्टर (Database Adapters)
|
|
215
|
+
|
|
216
|
+
Dolphin एउटा "Database Agnostic" फ्रेमवर्क हो। यसको मतलब तपाईँले जुनसुकै डेटाबेस (MongoDB, PostgreSQL, MySQL) प्रयोग गर्न सक्नुहुन्छ।
|
|
217
|
+
|
|
218
|
+
### ६.१ एडाप्टर प्याटर्न (Adapter Pattern) किन?
|
|
219
|
+
धेरै ब्याकइन्ड कोडहरू डेटाबेससँग निकै नजिकबाट बाँधिएका (Tightly coupled) हुन्छन्। Dolphin मा हामी एडाप्टर प्रयोग गर्छौँ ताकी भोलि डेटाबेस परिवर्तन गर्दा कोर लजिक परिवर्तन गर्न नपरोस्।
|
|
220
|
+
|
|
221
|
+
### ६.२ Mongoose Adapter प्रयोग गर्ने
|
|
222
|
+
```typescript
|
|
223
|
+
import mongoose from 'mongoose';
|
|
224
|
+
import { createMongooseAdapter } from 'dolphin-server-modules/adapters/mongoose';
|
|
225
|
+
|
|
226
|
+
const User = mongoose.model('User', new mongoose.Schema({
|
|
227
|
+
username: String,
|
|
228
|
+
email: { type: String, required: true }
|
|
229
|
+
}));
|
|
230
|
+
|
|
231
|
+
// एड्याप्टर बनाउने
|
|
232
|
+
const db = createMongooseAdapter({ User });
|
|
233
|
+
|
|
234
|
+
// प्रयोग गर्ने तरीका
|
|
235
|
+
app.get('/users', async (ctx) => {
|
|
236
|
+
const allUsers = await db.User.find();
|
|
237
|
+
ctx.json(allUsers);
|
|
238
|
+
});
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### ६.३ कस्टम एडाप्टर (Optional)
|
|
242
|
+
यदि तपाईँ Prisma वा Sequelize प्रयोग गर्न चाहनुहुन्छ भने, तपाईँले आफ्नै एडाप्टर फङ्सन लेख्न सक्नुहुन्छ जसले Dolphin को इन्टरफेस सपोर्ट गर्छ।
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## ७. Auth मोड्युल मास्टरक्लास (Auth Module Masterclass)
|
|
247
|
+
|
|
248
|
+
Dolphin को Auth मोड्युल एउटा इन्टरप्राइज-ग्रेड अथेन्टिकेसन सिस्टम हो।
|
|
249
|
+
|
|
250
|
+
### ७.१ मुख्य फिचरहरू
|
|
251
|
+
- **Argon2 Hashing**: पासवर्ड सुरक्षित राख्न।
|
|
252
|
+
- **JWT (JSON Web Tokens)**: स्टेटलेस अथेन्टिकेसनको लागि।
|
|
253
|
+
- **Refresh Token Rotation**: टोकन चोरी भएमा सुरक्षाको लागि।
|
|
254
|
+
- **Two-Factor Authentication (2FA)**: थप सुरक्षा।
|
|
255
|
+
|
|
256
|
+
### ७.२ सेटअप र कन्फिगरेसन
|
|
257
|
+
```typescript
|
|
258
|
+
import { createAuth } from 'dolphin-server-modules/auth';
|
|
259
|
+
|
|
260
|
+
const auth = createAuth({
|
|
261
|
+
secret: 'YOUR_SUPER_SECURE_SECRET',
|
|
262
|
+
tokenExpiry: '1h',
|
|
263
|
+
refreshExpiry: '7d'
|
|
264
|
+
});
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### ७.३ प्रोटेक्सन मिडलवेयर (Protecting Routes)
|
|
268
|
+
कुनै पनि रूटलाई सुरक्षित राख्न `auth.middleware()` प्रयोग गर्नुहोस्:
|
|
269
|
+
```typescript
|
|
270
|
+
app.get('/admin/dashboard', auth.middleware(), (ctx) => {
|
|
271
|
+
// यहाँ पुग्दा युजर अथेन्टिकेट भइसकेको हुन्छ
|
|
272
|
+
const currentUser = ctx.req.user;
|
|
273
|
+
ctx.json({ welcome: currentUser.email });
|
|
274
|
+
});
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### ७.४ २-फ्याक्टर अथेन्टिकेसन (2FA)
|
|
278
|
+
Dolphin ले TOTP (Google Authenticator) सपोर्ट गर्छ:
|
|
279
|
+
```typescript
|
|
280
|
+
// २FA इनेबल गर्ने
|
|
281
|
+
app.post('/auth/2fa/setup', auth.middleware(), async (ctx) => {
|
|
282
|
+
const result = await auth.setup2FA(ctx.req.user.id);
|
|
283
|
+
ctx.json(result); // QR Code URL यहाँ आउँछ
|
|
284
|
+
});
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## ८. अटोमेटेड CRUD इन्जिन (Automated CRUD Engine)
|
|
290
|
+
|
|
291
|
+
Dolphin को एउटा जादुई फिचर भनेको यसको "Automated CRUD" हो। यसले तपाईँको डेभलपमेन्ट समय ८०% सम्म बचत गर्छ।
|
|
292
|
+
|
|
293
|
+
### ८.१ CRUD भनेको के हो?
|
|
294
|
+
सी.आर.यू.डी. (Create, Read, Update, Delete) कुनै पनि वेब एपको आधारभूत काम हो। Dolphin ले यो काम धेरै नै सरल बनाइदिएको छ।
|
|
295
|
+
|
|
296
|
+
### ८.२ CRUD कन्ट्रोलर प्रयोग गर्ने
|
|
297
|
+
तपाईँले हरेक चिजको लागि फङ्सन लेखिरहनु पर्दैन।
|
|
298
|
+
```typescript
|
|
299
|
+
import { createCrudController } from 'dolphin-server-modules/curd';
|
|
300
|
+
|
|
301
|
+
// १. युजरको लागि CRUD कन्ट्रोलर बनाउने
|
|
302
|
+
const userCrud = createCrudController(db.User);
|
|
303
|
+
|
|
304
|
+
// २. राउटमा जोड्ने
|
|
305
|
+
app.get('/api/users', userCrud.getAll);
|
|
306
|
+
app.post('/api/users', userCrud.create);
|
|
307
|
+
app.get('/api/users/:id', userCrud.getOne);
|
|
308
|
+
app.put('/api/users/:id', userCrud.update);
|
|
309
|
+
app.delete('/api/users/:id', userCrud.delete);
|
|
310
|
+
```
|
|
311
|
+
यति गर्ने बित्तिकै तपाईँको पूरा API तयार भयो!
|
|
312
|
+
|
|
313
|
+
### ८.३ कस्टमाइज गर्ने
|
|
314
|
+
यदि तपाईँ सबै डेटा देखाउन चाहनुहुन्न भने, तपाईँले फिल्टर गर्न सक्नुहुन्छ:
|
|
315
|
+
```typescript
|
|
316
|
+
app.get('/api/users/active', async (ctx) => {
|
|
317
|
+
const result = await db.User.find({ status: 'active' });
|
|
318
|
+
ctx.json(result);
|
|
319
|
+
});
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## ९. Zod भ्यालिडेसन र सुरक्षा (Zod Validation)
|
|
325
|
+
|
|
326
|
+
गलत डाटाले सिस्टम बिगार्न सक्छ। त्यसैले Dolphin ले Zod सँग मिलेर काम गर्छ।
|
|
327
|
+
|
|
328
|
+
### ९.१ Zod किन?
|
|
329
|
+
Zod एउटा "Schema-first" भ्यालिडेसन लाइब्रेरी हो जसले रनटाइममा डाटा चेक गर्छ र स्ट्याटिक टाइपहरू पनि दिन्छ।
|
|
330
|
+
|
|
331
|
+
### ९.२ भ्यालिडेसन मिडलवेयरका उदाहरण
|
|
332
|
+
```typescript
|
|
333
|
+
import { z } from 'zod';
|
|
334
|
+
import { validate } from 'dolphin-server-modules/middleware/zod';
|
|
335
|
+
|
|
336
|
+
// १. स्किमा बनाउने
|
|
337
|
+
const UserCreateSchema = z.object({
|
|
338
|
+
username: z.string().min(3).max(20),
|
|
339
|
+
email: z.string().email(),
|
|
340
|
+
age: z.number().optional()
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
// २. मिडलवेयरको रूपमा प्रयोग गर्ने
|
|
344
|
+
app.post('/api/users', validate(UserCreateSchema), (ctx) => {
|
|
345
|
+
// यहाँ आउँदा डाटा १००% भ्यालिड भइसकेको हुन्छ
|
|
346
|
+
const userData = ctx.body;
|
|
347
|
+
ctx.json({ success: true, user: userData });
|
|
348
|
+
});
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### ९.३ एरर ह्यान्डलिङ (Error Handling)
|
|
352
|
+
यदि युजरले गलत डाटा पठायो भने Dolphin ले आफै `400 Bad Request` र Zod को डिटेल एरर म्यासेज पठाइदिन्छ। तपाईँले छुट्टै एरर ह्यान्डलर लेखिरहनु पर्दैन।
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## १०. रियल-वर्ल्ड प्रोजेक्ट: DolphinStore API
|
|
357
|
+
|
|
358
|
+
अब हामीले सिकेका सबै कुराहरू प्रयोग गरेर एउटा सानो "E-commerce Backend" बनाउनेछौँ। यसलाई हामी **DolphinStore** भन्नेछौँ।
|
|
359
|
+
|
|
360
|
+
### १०.१ प्रोजेक्टको संरचना (Project Structure)
|
|
361
|
+
हाम्रो प्रोजेक्टको फाइल संरचना यस्तो हुनेछ:
|
|
362
|
+
```text
|
|
363
|
+
/src
|
|
364
|
+
/models
|
|
365
|
+
User.ts
|
|
366
|
+
Product.ts
|
|
367
|
+
/routes
|
|
368
|
+
authRoutes.ts
|
|
369
|
+
productRoutes.ts
|
|
370
|
+
index.ts
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### १०.२ मोडेलहरू (Models)
|
|
374
|
+
`src/models/Product.ts`:
|
|
375
|
+
```typescript
|
|
376
|
+
import mongoose from 'mongoose';
|
|
377
|
+
|
|
378
|
+
const ProductSchema = new mongoose.Schema({
|
|
379
|
+
name: { type: String, required: true },
|
|
380
|
+
price: { type: Number, required: true },
|
|
381
|
+
description: String,
|
|
382
|
+
stock: { type: Number, default: 0 }
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
export const Product = mongoose.model('Product', ProductSchema);
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### १०.३ मेन फाइल (index.ts)
|
|
389
|
+
यहाँ हामी सबै कुरालाई एकै ठाउँमा ल्याउँछौँ:
|
|
390
|
+
```typescript
|
|
391
|
+
import { createDolphinServer } from 'dolphin-server-modules/server';
|
|
392
|
+
import { createAuth } from 'dolphin-server-modules/auth';
|
|
393
|
+
import { createMongooseAdapter } from 'dolphin-server-modules/adapters/mongoose';
|
|
394
|
+
import { Product } from './models/Product';
|
|
395
|
+
import { createCrudController } from 'dolphin-server-modules/curd';
|
|
396
|
+
|
|
397
|
+
const app = createDolphinServer();
|
|
398
|
+
const auth = createAuth({ secret: 'DOLPHIN_STORE_SECRET' });
|
|
399
|
+
const db = createMongooseAdapter({ Product });
|
|
400
|
+
const productCrud = createCrudController(db.Product);
|
|
401
|
+
|
|
402
|
+
// १. पब्लिक रूट: सामानहरू हेर्न
|
|
403
|
+
app.get('/products', productCrud.getAll);
|
|
404
|
+
|
|
405
|
+
// २. प्राइभेट रूट: सामान थप्न (Admin मात्र)
|
|
406
|
+
app.post('/products', auth.middleware(), productCrud.create);
|
|
407
|
+
|
|
408
|
+
// ३. कस्टम रूट: स्टक चेक गर्न
|
|
409
|
+
app.get('/products/:id/stock', async (ctx) => {
|
|
410
|
+
const item = await Product.findById(ctx.params.id);
|
|
411
|
+
if (!item) return ctx.status(404).json({ error: "Not Found" });
|
|
412
|
+
ctx.json({ stock: item.stock });
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
app.listen(8080, () => console.log("DolphinStore is live on 8080! 🛒"));
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### १०.४ यो प्रोजेक्टबाट हामीले के सिक्यौँ?
|
|
419
|
+
- कसरी धेरै मोड्युलहरू (Auth, CRUD, Server) सँगै काम गर्छन्।
|
|
420
|
+
- कसरी पब्लिक र प्राइभेट रूटहरू छुट्याउने।
|
|
421
|
+
- कसरी अड्याप्टरले डाटाबेसमा सजिलै एक्सेस दिन्छ।
|
|
422
|
+
|
|
423
|
+
---
|
|
424
|
+
|
|
425
|
+
## ११. स्केलिङ र पर्फर्मेन्स (Scaling & Performance)
|
|
426
|
+
|
|
427
|
+
जब तपाईँको एपमा लाखौँ युजर आउँछन्, तब सामान्य सर्भरले धान्न सक्दैन। Dolphin लाई स्केल गर्ने केही तरिकाहरू यहाँ छन्।
|
|
428
|
+
|
|
429
|
+
### ११.१ Cluster मोड्युल प्रयोग गर्ने
|
|
430
|
+
Node.js सिङ्गल थ्रेडेड हुन्छ। तर तपाईँको CPU मा धेरै कोर (Cores) हुन्छन्। सबै कोर प्रयोग गर्न Dolphin लाई यसरी रन गर्नुहोस्:
|
|
431
|
+
```typescript
|
|
432
|
+
import cluster from 'cluster';
|
|
433
|
+
import os from 'os';
|
|
434
|
+
import { createDolphinServer } from 'dolphin-server-modules/server';
|
|
435
|
+
|
|
436
|
+
if (cluster.isPrimary) {
|
|
437
|
+
const numCPUs = os.cpus().length;
|
|
438
|
+
for (let i = 0; i < numCPUs; i++) cluster.fork();
|
|
439
|
+
} else {
|
|
440
|
+
const app = createDolphinServer();
|
|
441
|
+
app.listen(3000);
|
|
442
|
+
}
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### ११.२ क्यासिङ (Caching)
|
|
446
|
+
डेटाबेसको लोड कम गर्न Redis वा इन-मेमोरी क्यासिङ प्रयोग गर्नुहोस्।
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
## १२. टेस्टिङ र डेभप्स (Testing & DevOps)
|
|
451
|
+
|
|
452
|
+
प्रोफेसनल कोडमा टेस्टिङ अनिवार्य छ।
|
|
453
|
+
|
|
454
|
+
### १२.१ Unit Testing (Jest)
|
|
455
|
+
Dolphin का फङ्सनहरू टेस्ट गर्न सजिलो छ:
|
|
456
|
+
```typescript
|
|
457
|
+
import { createDolphinServer } from 'dolphin-server-modules/server';
|
|
458
|
+
import request from 'supertest';
|
|
459
|
+
|
|
460
|
+
const app = createDolphinServer();
|
|
461
|
+
app.get('/test', (ctx) => ctx.json({ ok: true }));
|
|
462
|
+
|
|
463
|
+
test('GET /test should return ok', async () => {
|
|
464
|
+
const res = await request(app.server).get('/test');
|
|
465
|
+
expect(res.body.ok).toBe(true);
|
|
466
|
+
});
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
### १२.२ डकर (Docker) प्रयोग गर्ने
|
|
470
|
+
प्रोजेक्टलाई डकराइज गर्न `Dockerfile` बनाउनुहोस्:
|
|
471
|
+
```dockerfile
|
|
472
|
+
FROM node:20
|
|
473
|
+
WORKDIR /app
|
|
474
|
+
COPY package*.json ./
|
|
475
|
+
RUN npm install
|
|
476
|
+
COPY . .
|
|
477
|
+
RUN npm run build
|
|
478
|
+
CMD ["npm", "start"]
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
## १३. भविष्य र योगदान (Future Roadmap)
|
|
484
|
+
|
|
485
|
+
Dolphin अझै विकसित हुँदैछ। हाम्रो आगामी योजनाहरू:
|
|
486
|
+
- **Dolphin CLI**: एउटा कमान्डले प्रोजेक्ट सेटअप गर्ने।
|
|
487
|
+
- **WebSocket Support**: रियल-टाइम च्याटको लागि।
|
|
488
|
+
- **Native SQL Adapters**: PostgreSQL र MySQL का लागि विशेष एडाप्टरहरू।
|
|
489
|
+
|
|
490
|
+
### योगदान कसरी गर्ने?
|
|
491
|
+
यदि तपाईँलाई यो फ्रेमवर्क मन पर्यो भने GitHub मा स्टार दिनुहोस् र पुल रिक्वेस्ट (PR) पठाउनुहोस्!
|
|
492
|
+
|
|
493
|
+
---
|
|
494
|
+
|
|
495
|
+
## निष्कर्ष (Conclusion)
|
|
496
|
+
|
|
497
|
+
बधाई छ! तपाईँले Dolphin Framework को **Master Guide** को अन्त्य सम्म पढ्नुभयो। अब तपाईँ कुनै पनि जटिल ब्याकइन्ड सिस्टम Dolphin प्रयोग गरेर बनाउन पूर्ण सक्षम हुनुहुन्छ।
|
|
498
|
+
|
|
499
|
+
यो डकुमेन्टलाई तपाईँले `Pandoc` वा कुनै पनि `Markdown to PDF` कन्भर्टर प्रयोग गरेर १००+ पेजको PDF बनाउन सक्नुहुन्छ।
|
|
500
|
+
|
|
501
|
+
**Happy Coding! 🐬🇳🇵**
|
|
502
|
+
**नेपालबाट विश्वस्तरको सफ्टवेयर बनाऔँ!**
|
package/README.md
CHANGED
|
@@ -46,12 +46,16 @@ import { createAuth } from 'dolphin-server-modules/auth';
|
|
|
46
46
|
const app = createDolphinServer();
|
|
47
47
|
const auth = createAuth({ secret: 'SUPER_SECRET' });
|
|
48
48
|
|
|
49
|
-
// Global Middleware
|
|
49
|
+
// Global Middleware (Dolphin Style)
|
|
50
50
|
app.use((ctx, next) => {
|
|
51
51
|
console.log(`🐬 ${ctx.req.method} ${ctx.req.url}`);
|
|
52
52
|
next();
|
|
53
53
|
});
|
|
54
54
|
|
|
55
|
+
// Global Middleware (Express Style - Unified Compatibility!)
|
|
56
|
+
import cors from 'cors';
|
|
57
|
+
app.use(cors()); // Just works!
|
|
58
|
+
|
|
55
59
|
// Hello World
|
|
56
60
|
app.get('/', (ctx) => ctx.json({ message: "Welcome to Dolphin!" }));
|
|
57
61
|
|