dolphin-server-modules 1.3.5 → 1.3.7
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 +64 -0
- package/README.md +2 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/server/server.js +31 -14
- package/dist/server/server.js.map +1 -1
- package/dist/swagger/swagger.d.ts +36 -0
- package/dist/swagger/swagger.js +152 -0
- package/dist/swagger/swagger.js.map +1 -0
- package/package.json +3 -2
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
- [१२. टेस्टिङ र डेभप्स (Testing & DevOps)](#१२-टेस्टिङ-र-डेभप्स-testing--devops)
|
|
21
21
|
- [१३. भविष्य र योगदान (Future Roadmap)](#१३-भविष्य-र-योगदान-future-roadmap)
|
|
22
22
|
- [१४. रियलटाइम र IoT मास्टरक्लास (Realtime & IoT Masterclass) [NEW]](#१४-रियलटाइम-र-iot-मास्टरक्लास-realtime--iot-masterclass-new)
|
|
23
|
+
- [१५. इन्डिपेन्डेन्ट राउटिङ मास्टरक्लास (Independent Routing) [NEW]](#१५-इन्डिपेन्डेन्ट-राउटिङ-मास्टरक्लास-independent-routing-new)
|
|
24
|
+
- [१६. स्वतन्त्र अटो-स्वैगर जेनेरेसन (Independent Auto-Swagger) [NEW]](#१६-स्वतन्त्र-अटो-स्वैगर-जेनेरेसन-independent-auto-swagger-new)
|
|
23
25
|
|
|
24
26
|
---
|
|
25
27
|
|
|
@@ -589,6 +591,66 @@ app.use('/users', userRouter); // अब यो /users/profile मा चल्
|
|
|
589
591
|
|
|
590
592
|
---
|
|
591
593
|
|
|
594
|
+
## १६. स्वतन्त्र अटो-स्वैगर जेनेरेसन (Independent Auto-Swagger) [NEW]
|
|
595
|
+
|
|
596
|
+
API बनाउँदा सबैभन्दा अल्छीलाग्दो काम भनेको त्यसको डकुमेन्टेसन (Swagger/OpenAPI docs) हातैले लेख्नु हो। Dolphin ले यसलाई १००% अटोमेटिक र **Framework Independent** बनाइदिएको छ।
|
|
597
|
+
|
|
598
|
+
### १६.१ यो किन विशेष छ?
|
|
599
|
+
यसले तपाईँको `Zod` स्किमालाई सिधै पढेर OpenAPI को स्ट्यान्डर्ड JSON निकाल्छ। यसको लागि तपाईँले कुनै मिडलवेयर (`app.use`) सेटअप गरिरहनु पर्दैन। यो जुनसुकै फ्रेमवर्क (Next.js, Express, Fastify, Dolphin) मा काम गर्छ।
|
|
600
|
+
|
|
601
|
+
### १६.२ कसरी प्रयोग गर्ने?
|
|
602
|
+
```typescript
|
|
603
|
+
import { z } from 'zod';
|
|
604
|
+
import { generateSwagger, serveSwaggerUI } from 'dolphin-server-modules/swagger';
|
|
605
|
+
import { createDolphinServer } from 'dolphin-server-modules/server';
|
|
606
|
+
|
|
607
|
+
const app = createDolphinServer();
|
|
608
|
+
|
|
609
|
+
// १. Zod Schema बनाउने
|
|
610
|
+
const UserSchema = z.object({
|
|
611
|
+
name: z.string(),
|
|
612
|
+
email: z.string().email(),
|
|
613
|
+
age: z.number().optional()
|
|
614
|
+
});
|
|
615
|
+
|
|
616
|
+
// २. Swagger Config तयार गर्ने
|
|
617
|
+
const apiDocs = generateSwagger({
|
|
618
|
+
title: "DolphinStore API",
|
|
619
|
+
version: "1.0.0",
|
|
620
|
+
description: "E-Commerce Backend API Provider",
|
|
621
|
+
modules: [
|
|
622
|
+
{
|
|
623
|
+
path: "/users",
|
|
624
|
+
method: "post",
|
|
625
|
+
schema: UserSchema, // बडी रिक्वेस्टको लागि (Body)
|
|
626
|
+
summary: "Create User",
|
|
627
|
+
description: "Registers a new user in the system.",
|
|
628
|
+
tags: ["Users"]
|
|
629
|
+
}
|
|
630
|
+
]
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
// ३. डकुमेन्टेसन सर्भ गर्ने (Swagger UI सँगै)
|
|
634
|
+
app.get('/docs', (ctx) => {
|
|
635
|
+
const html = serveSwaggerUI(apiDocs, "DolphinStore API Docs");
|
|
636
|
+
return ctx.html(html); // सिधै सुन्दर UI देखिन्छ!
|
|
637
|
+
});
|
|
638
|
+
|
|
639
|
+
// ४. JSON मात्र चाहियो भने (फिल्नेटर वा पोस्टम्यानको लागि)
|
|
640
|
+
app.get('/docs/json', (ctx) => ctx.json(apiDocs));
|
|
641
|
+
|
|
642
|
+
app.listen(3000, () => console.log('Swagger UI is live at http://localhost:3000/docs'));
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
### १६.३ यसले के-के सपोर्ट गर्छ?
|
|
646
|
+
- **Zod Types:** `string`, `number`, `boolean`, `array`, `object`, `enum`, `optional()`, र `nullable()` लाई राम्रोसँग बुझ्छ।
|
|
647
|
+
- **Path/Query Params:** `modules` भित्र `params: { id: "string" }` जस्ता कुराहरू सपोर्ट गर्छ।
|
|
648
|
+
- **Response Schema:** `responseSchema: UserSchema` दिएर सफल रेस्पोन्स कस्तो हुन्छ भन्ने देखाउन मिल्छ।
|
|
649
|
+
|
|
650
|
+
यति सेटअप गरेपछि, तपाईँको कोड परिवर्तन हुने बित्तिकै तपाईँको Swagger Docs आफैँ अपडेट हुन्छ!
|
|
651
|
+
|
|
652
|
+
---
|
|
653
|
+
|
|
592
654
|
## निष्कर्ष (Conclusion)
|
|
593
655
|
|
|
594
656
|
बधाई छ! तपाईँले Dolphin Framework को **Master Guide** को अन्त्य सम्म पढ्नुभयो। अब तपाईँ कुनै पनि जटिल ब्याकइन्ड सिस्टम Dolphin प्रयोग गरेर बनाउन पूर्ण सक्षम हुनुहुन्छ।
|
|
@@ -597,3 +659,5 @@ app.use('/users', userRouter); // अब यो /users/profile मा चल्
|
|
|
597
659
|
|
|
598
660
|
**Happy Coding! 🐬🇳🇵**
|
|
599
661
|
**नेपालबाट विश्वस्तरको सफ्टवेयर बनाऔँ!**
|
|
662
|
+
|
|
663
|
+
|
package/README.md
CHANGED
|
@@ -72,6 +72,7 @@ rt.subscribe('factory/machine/+', (data) => {
|
|
|
72
72
|
| **Auth** | `/auth` | Argon2/JWT based secure auth with 2FA support. |
|
|
73
73
|
| **Realtime** | `/realtime` | Pub/Sub engine with `TopicTrie` & Binary Codecs. |
|
|
74
74
|
| **Validation** | `/middleware/zod` | Type-safe validation for Express, Next.js, and Dolphin. |
|
|
75
|
+
| **Swagger Docs** | `/swagger` | Auto-generated OpenAPI docs from Zod schemas (UI included). |
|
|
75
76
|
| **IoT Plugins** | `/realtime/plugins` | Native parsers for HL7, Modbus, and DICOM. |
|
|
76
77
|
| **DB Adapters** | `/adapters` | Mongoose and SQL adapters for rapid CRUD. |
|
|
77
78
|
|
|
@@ -105,8 +106,8 @@ mainApp.use('/api/v1', apiV1); // Accessible at /api/v1/status
|
|
|
105
106
|
## 🗺️ Roadmap
|
|
106
107
|
- [x] Universal Plugin System (HL7/Modbus/Binary)
|
|
107
108
|
- [x] Recursive Sub-routing
|
|
109
|
+
- [x] **Auto-Doc**: Automatic Swagger/OpenAPI generation from Zod schemas.
|
|
108
110
|
- [ ] **Dolphin CLI**: `npx dolphin init` for automated scaffolding.
|
|
109
|
-
- [ ] **Auto-Doc**: Automatic Swagger/OpenAPI generation from Zod schemas.
|
|
110
111
|
|
|
111
112
|
---
|
|
112
113
|
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -27,4 +27,5 @@ __exportStar(require("./server/server"), exports);
|
|
|
27
27
|
__exportStar(require("./router/router"), exports);
|
|
28
28
|
// Re-export Realtime
|
|
29
29
|
__exportStar(require("./realtime/index"), exports);
|
|
30
|
+
__exportStar(require("./swagger/swagger"), exports);
|
|
30
31
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iBAAiB;AACjB,8CAA4B;AAC5B,uBAAuB;AACvB,0DAAwC;AACxC,8DAA8D;AAC9D,oCAMqB;AALnB,kGAAA,UAAU,OAAA;AAMZ,4BAA4B;AAC5B,kDAAgC;AAChC,kDAAgC;AAEhC,qBAAqB;AACrB,mDAAiC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iBAAiB;AACjB,8CAA4B;AAC5B,uBAAuB;AACvB,0DAAwC;AACxC,8DAA8D;AAC9D,oCAMqB;AALnB,kGAAA,UAAU,OAAA;AAMZ,4BAA4B;AAC5B,kDAAgC;AAChC,kDAAgC;AAEhC,qBAAqB;AACrB,mDAAiC;AACjC,oDAAkC"}
|
package/dist/server/server.js
CHANGED
|
@@ -78,26 +78,43 @@ function createDolphinServer(options = {}) {
|
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
// Body parsing for POST/PUT/PATCH
|
|
81
|
+
const contentType = req.headers['content-type'] || '';
|
|
81
82
|
if (['POST', 'PUT', 'PATCH'].includes(req.method)) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
83
|
+
if (contentType.includes('multipart/form-data')) {
|
|
84
|
+
// Handled by third-party middlewares like multer. Just sync to ctx.
|
|
85
|
+
if (req.body)
|
|
86
|
+
ctx.body = req.body;
|
|
87
|
+
if (req.file)
|
|
88
|
+
ctx.file = req.file;
|
|
89
|
+
if (req.files)
|
|
90
|
+
ctx.files = req.files;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const chunks = [];
|
|
94
|
+
for await (const chunk of req)
|
|
95
|
+
chunks.push(chunk);
|
|
96
|
+
const rawBody = Buffer.concat(chunks).toString();
|
|
97
|
+
if (contentType.includes('application/json')) {
|
|
98
|
+
try {
|
|
99
|
+
const parsed = JSON.parse(rawBody);
|
|
100
|
+
ctx.body = parsed;
|
|
101
|
+
req.body = parsed;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
ctx.body = {};
|
|
105
|
+
req.body = {};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (contentType.includes('application/x-www-form-urlencoded')) {
|
|
109
|
+
const parsed = Object.fromEntries(new URLSearchParams(rawBody));
|
|
89
110
|
ctx.body = parsed;
|
|
90
111
|
req.body = parsed;
|
|
91
112
|
}
|
|
92
|
-
|
|
93
|
-
ctx.body =
|
|
94
|
-
req.body =
|
|
113
|
+
else {
|
|
114
|
+
ctx.body = rawBody;
|
|
115
|
+
req.body = rawBody;
|
|
95
116
|
}
|
|
96
117
|
}
|
|
97
|
-
else {
|
|
98
|
-
ctx.body = rawBody;
|
|
99
|
-
req.body = rawBody;
|
|
100
|
-
}
|
|
101
118
|
}
|
|
102
119
|
// Matching route
|
|
103
120
|
const match = router.match(req.method, parsedUrl.pathname);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../server/server.ts"],"names":[],"mappings":";;;;;AAGA,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../server/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare function zodToJsonSchema(schema: any): any;
|
|
3
|
+
export interface SwaggerConfig {
|
|
4
|
+
title: string;
|
|
5
|
+
version: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
servers?: {
|
|
8
|
+
url: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
}[];
|
|
11
|
+
modules: {
|
|
12
|
+
path: string;
|
|
13
|
+
method: "get" | "post" | "put" | "delete" | "patch";
|
|
14
|
+
summary?: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
tags?: string[];
|
|
17
|
+
schema?: z.ZodTypeAny;
|
|
18
|
+
responseSchema?: z.ZodTypeAny;
|
|
19
|
+
params?: Record<string, "string" | "number" | "boolean">;
|
|
20
|
+
query?: Record<string, "string" | "number" | "boolean">;
|
|
21
|
+
}[];
|
|
22
|
+
}
|
|
23
|
+
export declare function generateSwagger(config: SwaggerConfig): {
|
|
24
|
+
openapi: string;
|
|
25
|
+
info: {
|
|
26
|
+
title: string;
|
|
27
|
+
version: string;
|
|
28
|
+
description: string;
|
|
29
|
+
};
|
|
30
|
+
servers: {
|
|
31
|
+
url: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
}[];
|
|
34
|
+
paths: any;
|
|
35
|
+
};
|
|
36
|
+
export declare function serveSwaggerUI(swaggerJson: any, title?: string): string;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.zodToJsonSchema = zodToJsonSchema;
|
|
4
|
+
exports.generateSwagger = generateSwagger;
|
|
5
|
+
exports.serveSwaggerUI = serveSwaggerUI;
|
|
6
|
+
function zodToJsonSchema(schema) {
|
|
7
|
+
if (!schema || !schema._def)
|
|
8
|
+
return { type: "string" };
|
|
9
|
+
const typeName = schema._def.typeName || schema._def.type;
|
|
10
|
+
// Convert standard Zod names or Zod Lite names
|
|
11
|
+
const normalizedType = typeof typeName === 'string' ? typeName.replace('Zod', '').toLowerCase() : '';
|
|
12
|
+
if (normalizedType === "string") {
|
|
13
|
+
return { type: "string" };
|
|
14
|
+
}
|
|
15
|
+
else if (normalizedType === "number") {
|
|
16
|
+
return { type: "number" };
|
|
17
|
+
}
|
|
18
|
+
else if (normalizedType === "boolean") {
|
|
19
|
+
return { type: "boolean" };
|
|
20
|
+
}
|
|
21
|
+
else if (normalizedType === "array") {
|
|
22
|
+
return {
|
|
23
|
+
type: "array",
|
|
24
|
+
items: zodToJsonSchema(schema._def.type || schema._def.element)
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
else if (normalizedType === "object") {
|
|
28
|
+
const rawShape = schema._def.shape;
|
|
29
|
+
const shape = typeof rawShape === "function" ? rawShape() : rawShape;
|
|
30
|
+
const properties = {};
|
|
31
|
+
const required = [];
|
|
32
|
+
for (const [key, propSchema] of Object.entries(shape || {})) {
|
|
33
|
+
const propDef = propSchema._def;
|
|
34
|
+
let innerSchema = propSchema;
|
|
35
|
+
let isRequired = true;
|
|
36
|
+
const propType = propDef?.typeName || propDef?.type;
|
|
37
|
+
const normPropType = typeof propType === 'string' ? propType.replace('Zod', '').toLowerCase() : '';
|
|
38
|
+
if (normPropType === "optional" || normPropType === "nullable") {
|
|
39
|
+
isRequired = false;
|
|
40
|
+
innerSchema = propDef.innerType;
|
|
41
|
+
}
|
|
42
|
+
properties[key] = zodToJsonSchema(innerSchema);
|
|
43
|
+
if (isRequired)
|
|
44
|
+
required.push(key);
|
|
45
|
+
}
|
|
46
|
+
const schemaObj = { type: "object", properties };
|
|
47
|
+
if (required.length > 0)
|
|
48
|
+
schemaObj.required = required;
|
|
49
|
+
return schemaObj;
|
|
50
|
+
}
|
|
51
|
+
else if (normalizedType === "optional" || normalizedType === "nullable") {
|
|
52
|
+
return zodToJsonSchema(schema._def.innerType);
|
|
53
|
+
}
|
|
54
|
+
else if (normalizedType === "enum") {
|
|
55
|
+
return { type: "string", enum: schema._def.values || schema._def.entries };
|
|
56
|
+
}
|
|
57
|
+
return { type: "string" }; // default fallback
|
|
58
|
+
}
|
|
59
|
+
function generateSwagger(config) {
|
|
60
|
+
const paths = {};
|
|
61
|
+
for (const mod of config.modules) {
|
|
62
|
+
if (!paths[mod.path])
|
|
63
|
+
paths[mod.path] = {};
|
|
64
|
+
const operation = {
|
|
65
|
+
summary: mod.summary || `Endpoint for ${mod.path}`,
|
|
66
|
+
description: mod.description,
|
|
67
|
+
tags: mod.tags || ["API"],
|
|
68
|
+
responses: {
|
|
69
|
+
"200": {
|
|
70
|
+
description: "Successful response"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const parameters = [];
|
|
75
|
+
if (mod.params) {
|
|
76
|
+
for (const [k, v] of Object.entries(mod.params)) {
|
|
77
|
+
parameters.push({ name: k, in: "path", required: true, schema: { type: v } });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (mod.query) {
|
|
81
|
+
for (const [k, v] of Object.entries(mod.query)) {
|
|
82
|
+
parameters.push({ name: k, in: "query", required: false, schema: { type: v } });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (parameters.length > 0) {
|
|
86
|
+
operation.parameters = parameters;
|
|
87
|
+
}
|
|
88
|
+
if (mod.schema && ['post', 'put', 'patch'].includes(mod.method.toLowerCase())) {
|
|
89
|
+
operation.requestBody = {
|
|
90
|
+
required: true,
|
|
91
|
+
content: {
|
|
92
|
+
"application/json": {
|
|
93
|
+
schema: zodToJsonSchema(mod.schema)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (mod.responseSchema) {
|
|
99
|
+
operation.responses["200"].content = {
|
|
100
|
+
"application/json": {
|
|
101
|
+
schema: zodToJsonSchema(mod.responseSchema)
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
paths[mod.path][mod.method.toLowerCase()] = operation;
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
openapi: "3.0.0",
|
|
109
|
+
info: {
|
|
110
|
+
title: config.title,
|
|
111
|
+
version: config.version,
|
|
112
|
+
description: config.description || "Auto-generated API Docs",
|
|
113
|
+
},
|
|
114
|
+
servers: config.servers || [{ url: "/" }],
|
|
115
|
+
paths
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function serveSwaggerUI(swaggerJson, title = 'API Documentation') {
|
|
119
|
+
return `
|
|
120
|
+
<!DOCTYPE html>
|
|
121
|
+
<html lang="en">
|
|
122
|
+
<head>
|
|
123
|
+
<meta charset="UTF-8">
|
|
124
|
+
<title>${title}</title>
|
|
125
|
+
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@4/swagger-ui.css" />
|
|
126
|
+
<style>
|
|
127
|
+
body { margin: 0; padding: 0; }
|
|
128
|
+
.swagger-ui .topbar { display: none; }
|
|
129
|
+
</style>
|
|
130
|
+
</head>
|
|
131
|
+
<body>
|
|
132
|
+
<div id="swagger-ui"></div>
|
|
133
|
+
<script src="https://unpkg.com/swagger-ui-dist@4/swagger-ui-bundle.js"></script>
|
|
134
|
+
<script>
|
|
135
|
+
window.onload = () => {
|
|
136
|
+
window.ui = SwaggerUIBundle({
|
|
137
|
+
spec: ${JSON.stringify(swaggerJson)},
|
|
138
|
+
dom_id: '#swagger-ui',
|
|
139
|
+
deepLinking: true,
|
|
140
|
+
presets: [
|
|
141
|
+
SwaggerUIBundle.presets.apis,
|
|
142
|
+
SwaggerUIBundle.SwaggerUIStandalonePreset
|
|
143
|
+
],
|
|
144
|
+
layout: "BaseLayout"
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
</script>
|
|
148
|
+
</body>
|
|
149
|
+
</html>
|
|
150
|
+
`.trim();
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=swagger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swagger.js","sourceRoot":"","sources":["../../swagger/swagger.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dolphin-server-modules",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.7",
|
|
4
4
|
"homepage": "https://github.com/Phuyalshankar/dolphin-server-modules#readme",
|
|
5
5
|
"description": "Core utility modules for Auth, CRUD, and Controllers",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
"./realtime/core": "./dist/realtime/core.js",
|
|
27
27
|
"./realtime/trie": "./dist/realtime/trie.js",
|
|
28
28
|
"./realtime/codec": "./dist/realtime/codec.js",
|
|
29
|
-
"./realtime/plugins": "./dist/realtime/plugins.js"
|
|
29
|
+
"./realtime/plugins": "./dist/realtime/plugins.js",
|
|
30
|
+
"./swagger": "./dist/swagger/swagger.js"
|
|
30
31
|
},
|
|
31
32
|
"scripts": {
|
|
32
33
|
"build": "tsc",
|