@engjts/nexus 0.1.8 → 0.1.9
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/package.json +1 -1
- package/BENCHMARK_REPORT.md +0 -343
- package/documentation/01-getting-started.md +0 -240
- package/documentation/02-context.md +0 -335
- package/documentation/03-routing.md +0 -397
- package/documentation/04-middleware.md +0 -483
- package/documentation/05-validation.md +0 -514
- package/documentation/06-error-handling.md +0 -465
- package/documentation/07-performance.md +0 -364
- package/documentation/08-adapters.md +0 -470
- package/documentation/09-api-reference.md +0 -548
- package/documentation/10-examples.md +0 -582
- package/documentation/11-deployment.md +0 -477
- package/documentation/12-sentry.md +0 -620
- package/documentation/13-sentry-data-storage.md +0 -996
- package/documentation/14-sentry-data-reference.md +0 -457
- package/documentation/15-sentry-summary.md +0 -409
- package/documentation/16-alerts-system.md +0 -745
- package/documentation/17-alert-adapters.md +0 -696
- package/documentation/18-alerts-implementation-summary.md +0 -385
- package/documentation/19-class-based-routing.md +0 -840
- package/documentation/20-websocket-realtime.md +0 -813
- package/documentation/21-cache-system.md +0 -510
- package/documentation/22-job-queue.md +0 -772
- package/documentation/23-sentry-plugin.md +0 -551
- package/documentation/24-testing-utilities.md +0 -1287
- package/documentation/25-api-versioning.md +0 -533
- package/documentation/26-context-store.md +0 -607
- package/documentation/27-dependency-injection.md +0 -329
- package/documentation/28-lifecycle-hooks.md +0 -521
- package/documentation/29-package-structure.md +0 -196
- package/documentation/30-plugin-system.md +0 -414
- package/documentation/31-jwt-authentication.md +0 -597
- package/documentation/32-cli.md +0 -268
- package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
- package/documentation/ALERTS-INDEX.md +0 -330
- package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
- package/documentation/README.md +0 -178
- package/documentation/index.html +0 -34
- package/modern_framework_paper.md +0 -1870
- package/public/css/style.css +0 -87
- package/public/index.html +0 -34
- package/public/js/app.js +0 -27
- package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
- package/src/advanced/cache/MultiTierCache.ts +0 -194
- package/src/advanced/cache/RedisCacheStore.ts +0 -341
- package/src/advanced/cache/index.ts +0 -5
- package/src/advanced/cache/types.ts +0 -40
- package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
- package/src/advanced/graphql/index.ts +0 -22
- package/src/advanced/graphql/server.ts +0 -252
- package/src/advanced/graphql/types.ts +0 -42
- package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
- package/src/advanced/jobs/JobQueue.ts +0 -556
- package/src/advanced/jobs/RedisQueueStore.ts +0 -367
- package/src/advanced/jobs/index.ts +0 -5
- package/src/advanced/jobs/types.ts +0 -70
- package/src/advanced/observability/APMManager.ts +0 -163
- package/src/advanced/observability/AlertManager.ts +0 -109
- package/src/advanced/observability/MetricRegistry.ts +0 -151
- package/src/advanced/observability/ObservabilityCenter.ts +0 -304
- package/src/advanced/observability/StructuredLogger.ts +0 -154
- package/src/advanced/observability/TracingManager.ts +0 -117
- package/src/advanced/observability/adapters.ts +0 -304
- package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
- package/src/advanced/observability/index.ts +0 -11
- package/src/advanced/observability/types.ts +0 -174
- package/src/advanced/playground/extractPathParams.ts +0 -6
- package/src/advanced/playground/generateFieldExample.ts +0 -31
- package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1956
- package/src/advanced/playground/generateSummary.ts +0 -19
- package/src/advanced/playground/getTagFromPath.ts +0 -9
- package/src/advanced/playground/index.ts +0 -8
- package/src/advanced/playground/playground.ts +0 -250
- package/src/advanced/playground/types.ts +0 -49
- package/src/advanced/playground/zodToExample.ts +0 -16
- package/src/advanced/playground/zodToParams.ts +0 -15
- package/src/advanced/postman/buildAuth.ts +0 -31
- package/src/advanced/postman/buildBody.ts +0 -15
- package/src/advanced/postman/buildQueryParams.ts +0 -27
- package/src/advanced/postman/buildRequestItem.ts +0 -36
- package/src/advanced/postman/buildResponses.ts +0 -11
- package/src/advanced/postman/buildUrl.ts +0 -33
- package/src/advanced/postman/capitalize.ts +0 -4
- package/src/advanced/postman/generateCollection.ts +0 -59
- package/src/advanced/postman/generateEnvironment.ts +0 -34
- package/src/advanced/postman/generateExampleFromZod.ts +0 -21
- package/src/advanced/postman/generateFieldExample.ts +0 -45
- package/src/advanced/postman/generateName.ts +0 -20
- package/src/advanced/postman/generateUUID.ts +0 -11
- package/src/advanced/postman/getTagFromPath.ts +0 -10
- package/src/advanced/postman/index.ts +0 -28
- package/src/advanced/postman/postman.ts +0 -156
- package/src/advanced/postman/slugify.ts +0 -7
- package/src/advanced/postman/types.ts +0 -140
- package/src/advanced/realtime/index.ts +0 -18
- package/src/advanced/realtime/websocket.ts +0 -231
- package/src/advanced/sentry/index.ts +0 -1236
- package/src/advanced/sentry/types.ts +0 -355
- package/src/advanced/static/generateDirectoryListing.ts +0 -47
- package/src/advanced/static/generateETag.ts +0 -7
- package/src/advanced/static/getMimeType.ts +0 -9
- package/src/advanced/static/index.ts +0 -32
- package/src/advanced/static/isSafePath.ts +0 -13
- package/src/advanced/static/publicDir.ts +0 -21
- package/src/advanced/static/serveStatic.ts +0 -225
- package/src/advanced/static/spa.ts +0 -24
- package/src/advanced/static/types.ts +0 -159
- package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
- package/src/advanced/swagger/buildOperation.ts +0 -61
- package/src/advanced/swagger/buildParameters.ts +0 -61
- package/src/advanced/swagger/buildRequestBody.ts +0 -21
- package/src/advanced/swagger/buildResponses.ts +0 -54
- package/src/advanced/swagger/capitalize.ts +0 -5
- package/src/advanced/swagger/convertPath.ts +0 -9
- package/src/advanced/swagger/createSwagger.ts +0 -12
- package/src/advanced/swagger/generateOperationId.ts +0 -21
- package/src/advanced/swagger/generateSpec.ts +0 -105
- package/src/advanced/swagger/generateSummary.ts +0 -24
- package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
- package/src/advanced/swagger/generateThemeCss.ts +0 -53
- package/src/advanced/swagger/index.ts +0 -25
- package/src/advanced/swagger/swagger.ts +0 -237
- package/src/advanced/swagger/types.ts +0 -206
- package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
- package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
- package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
- package/src/advanced/testing/factory.ts +0 -509
- package/src/advanced/testing/harness.ts +0 -612
- package/src/advanced/testing/index.ts +0 -430
- package/src/advanced/testing/load-test.ts +0 -618
- package/src/advanced/testing/mock-server.ts +0 -498
- package/src/advanced/testing/mock.ts +0 -670
- package/src/cli/bin.ts +0 -9
- package/src/cli/cli.ts +0 -158
- package/src/cli/commands/add.ts +0 -178
- package/src/cli/commands/build.ts +0 -73
- package/src/cli/commands/create.ts +0 -166
- package/src/cli/commands/dev.ts +0 -85
- package/src/cli/commands/generate.ts +0 -99
- package/src/cli/commands/help.ts +0 -95
- package/src/cli/commands/init.ts +0 -91
- package/src/cli/commands/version.ts +0 -38
- package/src/cli/index.ts +0 -6
- package/src/cli/templates/generators.ts +0 -359
- package/src/cli/templates/index.ts +0 -680
- package/src/cli/utils/exec.ts +0 -52
- package/src/cli/utils/file-system.ts +0 -78
- package/src/cli/utils/logger.ts +0 -111
- package/src/core/adapter.ts +0 -88
- package/src/core/application.ts +0 -1453
- package/src/core/context-pool.ts +0 -79
- package/src/core/context.ts +0 -856
- package/src/core/index.ts +0 -94
- package/src/core/middleware.ts +0 -272
- package/src/core/performance/buffer-pool.ts +0 -108
- package/src/core/performance/middleware-optimizer.ts +0 -162
- package/src/core/plugin/PluginManager.ts +0 -435
- package/src/core/plugin/builder.ts +0 -358
- package/src/core/plugin/index.ts +0 -50
- package/src/core/plugin/types.ts +0 -214
- package/src/core/router/file-router.ts +0 -623
- package/src/core/router/index.ts +0 -260
- package/src/core/router/radix-tree.ts +0 -242
- package/src/core/serializer.ts +0 -397
- package/src/core/store/index.ts +0 -30
- package/src/core/store/registry.ts +0 -178
- package/src/core/store/request-store.ts +0 -240
- package/src/core/store/types.ts +0 -233
- package/src/core/types.ts +0 -616
- package/src/database/adapter.ts +0 -35
- package/src/database/adapters/index.ts +0 -1
- package/src/database/adapters/mysql.ts +0 -669
- package/src/database/database.ts +0 -70
- package/src/database/dialect.ts +0 -388
- package/src/database/index.ts +0 -12
- package/src/database/migrations.ts +0 -86
- package/src/database/optimizer.ts +0 -125
- package/src/database/query-builder.ts +0 -404
- package/src/database/realtime.ts +0 -53
- package/src/database/schema.ts +0 -71
- package/src/database/transactions.ts +0 -56
- package/src/database/types.ts +0 -87
- package/src/deployment/cluster.ts +0 -471
- package/src/deployment/config.ts +0 -454
- package/src/deployment/docker.ts +0 -599
- package/src/deployment/graceful-shutdown.ts +0 -373
- package/src/deployment/index.ts +0 -56
- package/src/index.ts +0 -281
- package/src/security/adapter.ts +0 -318
- package/src/security/auth/JWTPlugin.ts +0 -234
- package/src/security/auth/JWTProvider.ts +0 -316
- package/src/security/auth/adapter.ts +0 -12
- package/src/security/auth/jwt.ts +0 -234
- package/src/security/auth/middleware.ts +0 -188
- package/src/security/csrf.ts +0 -220
- package/src/security/headers.ts +0 -108
- package/src/security/index.ts +0 -60
- package/src/security/rate-limit/adapter.ts +0 -7
- package/src/security/rate-limit/memory.ts +0 -108
- package/src/security/rate-limit/middleware.ts +0 -181
- package/src/security/sanitization.ts +0 -75
- package/src/security/types.ts +0 -240
- package/src/security/utils.ts +0 -52
- package/tsconfig.json +0 -39
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plugin Builder
|
|
3
|
-
* Fluent API for creating plugins with type safety
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
NexusPlugin,
|
|
8
|
-
PluginMeta,
|
|
9
|
-
PluginContext,
|
|
10
|
-
PluginRouteExtension,
|
|
11
|
-
PluginPriority,
|
|
12
|
-
PluginFactory
|
|
13
|
-
} from './types';
|
|
14
|
-
import { Context, Middleware, Handler, Response } from '../types';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Plugin Builder for fluent plugin creation
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```typescript
|
|
21
|
-
* const authPlugin = definePlugin('auth-plugin')
|
|
22
|
-
* .version('1.0.0')
|
|
23
|
-
* .description('Authentication plugin with JWT support')
|
|
24
|
-
* .depends(['database-plugin'])
|
|
25
|
-
* .config<{ secret: string; expiry: number }>()
|
|
26
|
-
* .defaults({ expiry: 3600 })
|
|
27
|
-
* .middleware((ctx) => jwtMiddleware(ctx.config.secret))
|
|
28
|
-
* .decorate((ctx) => {
|
|
29
|
-
* ctx.auth = { user: null, isAuthenticated: false };
|
|
30
|
-
* })
|
|
31
|
-
* .register(async (ctx) => {
|
|
32
|
-
* ctx.log.info('Auth plugin initialized');
|
|
33
|
-
* })
|
|
34
|
-
* .export((ctx) => ({
|
|
35
|
-
* verify: (token: string) => verifyJWT(token, ctx.config.secret),
|
|
36
|
-
* sign: (payload: any) => signJWT(payload, ctx.config.secret)
|
|
37
|
-
* }))
|
|
38
|
-
* .build();
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
export class PluginBuilder<TConfig = {}, TExports = {}> {
|
|
42
|
-
private _meta: PluginMeta;
|
|
43
|
-
private _defaults?: Partial<TConfig>;
|
|
44
|
-
private _validateConfig?: (config: TConfig) => boolean | string;
|
|
45
|
-
private _configure?: (ctx: PluginContext<TConfig>) => void | Promise<void>;
|
|
46
|
-
private _register?: (ctx: PluginContext<TConfig>) => void | Promise<void>;
|
|
47
|
-
private _boot?: (ctx: PluginContext<TConfig>) => void | Promise<void>;
|
|
48
|
-
private _ready?: (ctx: PluginContext<TConfig>) => void | Promise<void>;
|
|
49
|
-
private _shutdown?: (ctx: PluginContext<TConfig>) => void | Promise<void>;
|
|
50
|
-
private _exports?: (ctx: PluginContext<TConfig>) => TExports;
|
|
51
|
-
private _middlewares?: Middleware[] | ((ctx: PluginContext<TConfig>) => Middleware[]);
|
|
52
|
-
private _routes?: PluginRouteExtension[] | ((ctx: PluginContext<TConfig>) => PluginRouteExtension[]);
|
|
53
|
-
private _decorateContext?: (ctx: Context) => void;
|
|
54
|
-
private _decorateApp?: (app: any) => void;
|
|
55
|
-
|
|
56
|
-
constructor(name: string) {
|
|
57
|
-
this._meta = { name, version: '1.0.0' };
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Set plugin version
|
|
62
|
-
*/
|
|
63
|
-
version(version: string): this {
|
|
64
|
-
this._meta.version = version;
|
|
65
|
-
return this;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Set plugin description
|
|
70
|
-
*/
|
|
71
|
-
description(description: string): this {
|
|
72
|
-
this._meta.description = description;
|
|
73
|
-
return this;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Set plugin author
|
|
78
|
-
*/
|
|
79
|
-
author(author: string | { name: string; email?: string; url?: string }): this {
|
|
80
|
-
this._meta.author = author;
|
|
81
|
-
return this;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Set plugin homepage
|
|
86
|
-
*/
|
|
87
|
-
homepage(url: string): this {
|
|
88
|
-
this._meta.homepage = url;
|
|
89
|
-
return this;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Set plugin priority
|
|
94
|
-
*/
|
|
95
|
-
priority(priority: PluginPriority): this {
|
|
96
|
-
this._meta.priority = priority;
|
|
97
|
-
return this;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Add tags for categorization
|
|
102
|
-
*/
|
|
103
|
-
tags(...tags: string[]): this {
|
|
104
|
-
this._meta.tags = tags;
|
|
105
|
-
return this;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Declare required dependencies
|
|
110
|
-
*/
|
|
111
|
-
depends(plugins: string[]): this {
|
|
112
|
-
this._meta.dependencies = plugins;
|
|
113
|
-
return this;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Declare optional dependencies
|
|
118
|
-
*/
|
|
119
|
-
optionalDeps(plugins: string[]): this {
|
|
120
|
-
this._meta.optionalDependencies = plugins;
|
|
121
|
-
return this;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Declare conflicting plugins
|
|
126
|
-
*/
|
|
127
|
-
conflicts(plugins: string[]): this {
|
|
128
|
-
this._meta.conflicts = plugins;
|
|
129
|
-
return this;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Define config type (for TypeScript inference)
|
|
134
|
-
*/
|
|
135
|
-
config<T>(): PluginBuilder<T, TExports> {
|
|
136
|
-
return this as unknown as PluginBuilder<T, TExports>;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Set default configuration
|
|
141
|
-
*/
|
|
142
|
-
defaults(defaults: Partial<TConfig>): this {
|
|
143
|
-
this._defaults = defaults;
|
|
144
|
-
return this;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Add config validator
|
|
149
|
-
*/
|
|
150
|
-
validate(validator: (config: TConfig) => boolean | string): this {
|
|
151
|
-
this._validateConfig = validator;
|
|
152
|
-
return this;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Configure phase hook
|
|
157
|
-
*/
|
|
158
|
-
configure(fn: (ctx: PluginContext<TConfig>) => void | Promise<void>): this {
|
|
159
|
-
this._configure = fn;
|
|
160
|
-
return this;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Register phase hook
|
|
165
|
-
*/
|
|
166
|
-
register(fn: (ctx: PluginContext<TConfig>) => void | Promise<void>): this {
|
|
167
|
-
this._register = fn;
|
|
168
|
-
return this;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Boot phase hook
|
|
173
|
-
*/
|
|
174
|
-
boot(fn: (ctx: PluginContext<TConfig>) => void | Promise<void>): this {
|
|
175
|
-
this._boot = fn;
|
|
176
|
-
return this;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Ready phase hook
|
|
181
|
-
*/
|
|
182
|
-
ready(fn: (ctx: PluginContext<TConfig>) => void | Promise<void>): this {
|
|
183
|
-
this._ready = fn;
|
|
184
|
-
return this;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Shutdown phase hook
|
|
189
|
-
*/
|
|
190
|
-
shutdown(fn: (ctx: PluginContext<TConfig>) => void | Promise<void>): this {
|
|
191
|
-
this._shutdown = fn;
|
|
192
|
-
return this;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Define exports for other plugins
|
|
197
|
-
*/
|
|
198
|
-
export<T>(fn: (ctx: PluginContext<TConfig>) => T): PluginBuilder<TConfig, T> {
|
|
199
|
-
this._exports = fn as any;
|
|
200
|
-
return this as unknown as PluginBuilder<TConfig, T>;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Add global middleware
|
|
205
|
-
*/
|
|
206
|
-
middleware(middleware: Middleware | ((ctx: PluginContext<TConfig>) => Middleware)): this {
|
|
207
|
-
if (!this._middlewares) {
|
|
208
|
-
this._middlewares = [];
|
|
209
|
-
}
|
|
210
|
-
if (typeof middleware === 'function' && middleware.length === 1) {
|
|
211
|
-
// It's a factory function
|
|
212
|
-
const existing = this._middlewares;
|
|
213
|
-
this._middlewares = (ctx: PluginContext<TConfig>) => {
|
|
214
|
-
const base = typeof existing === 'function' ? existing(ctx) : existing;
|
|
215
|
-
return [...base, (middleware as (ctx: PluginContext<TConfig>) => Middleware)(ctx)];
|
|
216
|
-
};
|
|
217
|
-
} else {
|
|
218
|
-
if (Array.isArray(this._middlewares)) {
|
|
219
|
-
this._middlewares.push(middleware as Middleware);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
return this;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Add multiple middlewares
|
|
227
|
-
*/
|
|
228
|
-
middlewares(middlewares: Middleware[] | ((ctx: PluginContext<TConfig>) => Middleware[])): this {
|
|
229
|
-
this._middlewares = middlewares;
|
|
230
|
-
return this;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
/**
|
|
234
|
-
* Add a route
|
|
235
|
-
*/
|
|
236
|
-
route(
|
|
237
|
-
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH',
|
|
238
|
-
path: string,
|
|
239
|
-
handler: Handler,
|
|
240
|
-
options?: { middlewares?: Middleware[]; meta?: PluginRouteExtension['meta'] }
|
|
241
|
-
): this {
|
|
242
|
-
if (!this._routes) {
|
|
243
|
-
this._routes = [];
|
|
244
|
-
}
|
|
245
|
-
if (Array.isArray(this._routes)) {
|
|
246
|
-
this._routes.push({
|
|
247
|
-
method,
|
|
248
|
-
path,
|
|
249
|
-
handler,
|
|
250
|
-
middlewares: options?.middlewares,
|
|
251
|
-
meta: options?.meta
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
return this;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Add routes dynamically
|
|
259
|
-
*/
|
|
260
|
-
routes(routes: PluginRouteExtension[] | ((ctx: PluginContext<TConfig>) => PluginRouteExtension[])): this {
|
|
261
|
-
this._routes = routes;
|
|
262
|
-
return this;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Decorate request context
|
|
267
|
-
*/
|
|
268
|
-
decorate(decorator: (ctx: Context) => void): this {
|
|
269
|
-
this._decorateContext = decorator;
|
|
270
|
-
return this;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
* Decorate application
|
|
275
|
-
*/
|
|
276
|
-
decorateApp(decorator: (app: any) => void): this {
|
|
277
|
-
this._decorateApp = decorator;
|
|
278
|
-
return this;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* Build the plugin
|
|
283
|
-
*/
|
|
284
|
-
build(): NexusPlugin<TConfig, TExports> {
|
|
285
|
-
return {
|
|
286
|
-
meta: this._meta,
|
|
287
|
-
defaults: this._defaults,
|
|
288
|
-
validateConfig: this._validateConfig,
|
|
289
|
-
configure: this._configure,
|
|
290
|
-
register: this._register,
|
|
291
|
-
boot: this._boot,
|
|
292
|
-
ready: this._ready,
|
|
293
|
-
shutdown: this._shutdown,
|
|
294
|
-
exports: this._exports,
|
|
295
|
-
middlewares: this._middlewares,
|
|
296
|
-
routes: this._routes,
|
|
297
|
-
decorateContext: this._decorateContext,
|
|
298
|
-
decorateApp: this._decorateApp
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
* Build as factory function (accepts config at runtime)
|
|
304
|
-
*/
|
|
305
|
-
factory(): PluginFactory<TConfig> {
|
|
306
|
-
return (config?: TConfig) => {
|
|
307
|
-
const plugin = this.build();
|
|
308
|
-
// Config will be merged by PluginManager
|
|
309
|
-
return plugin;
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Create a new plugin using fluent builder
|
|
316
|
-
*
|
|
317
|
-
* @example
|
|
318
|
-
* ```typescript
|
|
319
|
-
* const myPlugin = definePlugin('my-plugin')
|
|
320
|
-
* .version('1.0.0')
|
|
321
|
-
* .register(async (ctx) => {
|
|
322
|
-
* ctx.log.info('Hello from my plugin!');
|
|
323
|
-
* })
|
|
324
|
-
* .build();
|
|
325
|
-
*
|
|
326
|
-
* app.plugin(myPlugin);
|
|
327
|
-
* ```
|
|
328
|
-
*/
|
|
329
|
-
export function definePlugin(name: string): PluginBuilder {
|
|
330
|
-
return new PluginBuilder(name);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* Create a simple plugin quickly
|
|
335
|
-
*
|
|
336
|
-
* @example
|
|
337
|
-
* ```typescript
|
|
338
|
-
* const loggerPlugin = createPlugin({
|
|
339
|
-
* name: 'logger',
|
|
340
|
-
* version: '1.0.0',
|
|
341
|
-
* register: (ctx) => {
|
|
342
|
-
* ctx.app.use(loggerMiddleware);
|
|
343
|
-
* }
|
|
344
|
-
* });
|
|
345
|
-
* ```
|
|
346
|
-
*/
|
|
347
|
-
export function createPlugin<TConfig = any, TExports = any>(
|
|
348
|
-
options: Partial<NexusPlugin<TConfig, TExports>> & { name: string }
|
|
349
|
-
): NexusPlugin<TConfig, TExports> {
|
|
350
|
-
return {
|
|
351
|
-
meta: {
|
|
352
|
-
name: options.name,
|
|
353
|
-
version: options.meta?.version ?? '1.0.0',
|
|
354
|
-
...options.meta
|
|
355
|
-
},
|
|
356
|
-
...options
|
|
357
|
-
} as NexusPlugin<TConfig, TExports>;
|
|
358
|
-
}
|
package/src/core/plugin/index.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plugin System - Public API
|
|
3
|
-
*
|
|
4
|
-
* @example
|
|
5
|
-
* ```typescript
|
|
6
|
-
* import { definePlugin, createPlugin, PluginManager } from '@engjts/server/plugin';
|
|
7
|
-
*
|
|
8
|
-
* // Using fluent builder
|
|
9
|
-
* const authPlugin = definePlugin('auth')
|
|
10
|
-
* .version('1.0.0')
|
|
11
|
-
* .config<{ secret: string }>()
|
|
12
|
-
* .register(ctx => {
|
|
13
|
-
* ctx.log.info('Auth initialized');
|
|
14
|
-
* })
|
|
15
|
-
* .build();
|
|
16
|
-
*
|
|
17
|
-
* // Using quick create
|
|
18
|
-
* const loggerPlugin = createPlugin({
|
|
19
|
-
* name: 'logger',
|
|
20
|
-
* register: ctx => ctx.app.use(logMiddleware)
|
|
21
|
-
* });
|
|
22
|
-
*
|
|
23
|
-
* app.plugin(authPlugin, { secret: 'xxx' });
|
|
24
|
-
* app.plugin(loggerPlugin);
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
// Types
|
|
29
|
-
export type {
|
|
30
|
-
NexusPlugin,
|
|
31
|
-
SimplePlugin,
|
|
32
|
-
PluginFactory,
|
|
33
|
-
PluginMeta,
|
|
34
|
-
PluginContext,
|
|
35
|
-
PluginLogger,
|
|
36
|
-
PluginPhase,
|
|
37
|
-
PluginPriority,
|
|
38
|
-
PluginRouteExtension,
|
|
39
|
-
PluginManagerEvents,
|
|
40
|
-
RegisteredPlugin
|
|
41
|
-
} from './types';
|
|
42
|
-
|
|
43
|
-
// Plugin Manager
|
|
44
|
-
export { PluginManager } from './PluginManager';
|
|
45
|
-
|
|
46
|
-
// Builder & Factories
|
|
47
|
-
export { PluginBuilder, definePlugin, createPlugin } from './builder';
|
|
48
|
-
|
|
49
|
-
// Constants
|
|
50
|
-
export { PRIORITY_WEIGHTS } from './types';
|
package/src/core/plugin/types.ts
DELETED
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plugin System Types
|
|
3
|
-
* Advanced plugin architecture for Nexus Framework
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { Application } from '../application';
|
|
7
|
-
import { Context, Middleware, Handler, Response } from '../types';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Plugin lifecycle phases
|
|
11
|
-
*/
|
|
12
|
-
export type PluginPhase =
|
|
13
|
-
| 'configure' // Before app starts, configure settings
|
|
14
|
-
| 'register' // Register routes, middlewares, stores
|
|
15
|
-
| 'boot' // After all plugins registered, before server starts
|
|
16
|
-
| 'ready' // Server is listening
|
|
17
|
-
| 'shutdown'; // App is shutting down
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Plugin priority levels
|
|
21
|
-
*/
|
|
22
|
-
export type PluginPriority = 'critical' | 'high' | 'normal' | 'low';
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Plugin metadata
|
|
26
|
-
*/
|
|
27
|
-
export interface PluginMeta {
|
|
28
|
-
/** Unique plugin name */
|
|
29
|
-
name: string;
|
|
30
|
-
/** Plugin version (semver) */
|
|
31
|
-
version: string;
|
|
32
|
-
/** Plugin description */
|
|
33
|
-
description?: string;
|
|
34
|
-
/** Author information */
|
|
35
|
-
author?: string | { name: string; email?: string; url?: string };
|
|
36
|
-
/** Plugin homepage/docs URL */
|
|
37
|
-
homepage?: string;
|
|
38
|
-
/** Plugin dependencies (other plugin names) */
|
|
39
|
-
dependencies?: string[];
|
|
40
|
-
/** Optional dependencies (won't fail if missing) */
|
|
41
|
-
optionalDependencies?: string[];
|
|
42
|
-
/** Plugins that conflict with this one */
|
|
43
|
-
conflicts?: string[];
|
|
44
|
-
/** Plugin priority */
|
|
45
|
-
priority?: PluginPriority;
|
|
46
|
-
/** Plugin tags for categorization */
|
|
47
|
-
tags?: string[];
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Plugin context passed to lifecycle hooks
|
|
52
|
-
* @template TConfig - The plugin's configuration type
|
|
53
|
-
*/
|
|
54
|
-
export interface PluginContext<TConfig = Record<string, any>> {
|
|
55
|
-
/** The application instance */
|
|
56
|
-
app: Application<any>;
|
|
57
|
-
/** Plugin's own configuration (passed during .plugin()) */
|
|
58
|
-
config: TConfig;
|
|
59
|
-
/** Access other plugin's exported APIs */
|
|
60
|
-
getPlugin<T = any>(name: string): T | undefined;
|
|
61
|
-
/** Check if a plugin is installed */
|
|
62
|
-
hasPlugin(name: string): boolean;
|
|
63
|
-
/** Logger scoped to this plugin */
|
|
64
|
-
log: PluginLogger;
|
|
65
|
-
/** Plugin-scoped storage (persists across lifecycle) */
|
|
66
|
-
storage: Map<string, any>;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Plugin logger interface
|
|
71
|
-
*/
|
|
72
|
-
export interface PluginLogger {
|
|
73
|
-
debug(message: string, ...args: any[]): void;
|
|
74
|
-
info(message: string, ...args: any[]): void;
|
|
75
|
-
warn(message: string, ...args: any[]): void;
|
|
76
|
-
error(message: string, ...args: any[]): void;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Route extension added by plugin
|
|
81
|
-
*/
|
|
82
|
-
export interface PluginRouteExtension {
|
|
83
|
-
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
84
|
-
path: string;
|
|
85
|
-
handler: Handler;
|
|
86
|
-
middlewares?: Middleware[];
|
|
87
|
-
meta?: {
|
|
88
|
-
description?: string;
|
|
89
|
-
tags?: string[];
|
|
90
|
-
internal?: boolean;
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Full plugin interface
|
|
96
|
-
*/
|
|
97
|
-
export interface NexusPlugin<TConfig = any, TExports = any> {
|
|
98
|
-
/** Plugin metadata */
|
|
99
|
-
meta: PluginMeta;
|
|
100
|
-
|
|
101
|
-
/** Default configuration */
|
|
102
|
-
defaults?: Partial<TConfig>;
|
|
103
|
-
|
|
104
|
-
/** Validate plugin configuration */
|
|
105
|
-
validateConfig?: (config: TConfig) => boolean | string;
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Configure phase - set up configuration before anything else
|
|
109
|
-
* Called in dependency order
|
|
110
|
-
*/
|
|
111
|
-
configure?: (ctx: PluginContext<TConfig>) => void | Promise<void>;
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Register phase - register routes, middleware, stores, etc.
|
|
115
|
-
* Called after all plugins are configured
|
|
116
|
-
*/
|
|
117
|
-
register?: (ctx: PluginContext<TConfig>) => void | Promise<void>;
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Boot phase - perform initialization after all registrations
|
|
121
|
-
* Called after all plugins are registered
|
|
122
|
-
*/
|
|
123
|
-
boot?: (ctx: PluginContext<TConfig>) => void | Promise<void>;
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Ready phase - called when server is listening
|
|
127
|
-
* Good for logging, connecting to external services
|
|
128
|
-
*/
|
|
129
|
-
ready?: (ctx: PluginContext<TConfig>) => void | Promise<void>;
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Shutdown phase - cleanup when app is shutting down
|
|
133
|
-
* Called in reverse dependency order
|
|
134
|
-
*/
|
|
135
|
-
shutdown?: (ctx: PluginContext<TConfig>) => void | Promise<void>;
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Export APIs for other plugins to use
|
|
139
|
-
* Accessible via ctx.getPlugin('plugin-name')
|
|
140
|
-
*/
|
|
141
|
-
exports?: (ctx: PluginContext<TConfig>) => TExports;
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Middleware to add globally
|
|
145
|
-
*/
|
|
146
|
-
middlewares?: Middleware[] | ((ctx: PluginContext<TConfig>) => Middleware[]);
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Routes to add
|
|
150
|
-
*/
|
|
151
|
-
routes?: PluginRouteExtension[] | ((ctx: PluginContext<TConfig>) => PluginRouteExtension[]);
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Decorate the Context with additional properties/methods
|
|
155
|
-
*/
|
|
156
|
-
decorateContext?: (ctx: Context) => void;
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Decorate the Application with additional methods
|
|
160
|
-
*/
|
|
161
|
-
decorateApp?: (app: Application<any>) => void;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Simplified plugin using just an install function (legacy compatible)
|
|
166
|
-
*/
|
|
167
|
-
export interface SimplePlugin {
|
|
168
|
-
name: string;
|
|
169
|
-
version: string;
|
|
170
|
-
install: (app: Application<any>) => void | Promise<void>;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Plugin factory function type
|
|
175
|
-
*/
|
|
176
|
-
export type PluginFactory<TConfig = any> = (config?: TConfig) => NexusPlugin<TConfig>;
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Registered plugin entry
|
|
180
|
-
*/
|
|
181
|
-
export interface RegisteredPlugin {
|
|
182
|
-
meta: PluginMeta;
|
|
183
|
-
plugin: NexusPlugin<any, any>;
|
|
184
|
-
config: Record<string, any>;
|
|
185
|
-
exports?: any;
|
|
186
|
-
storage: Map<string, any>;
|
|
187
|
-
state: 'pending' | 'configured' | 'registered' | 'booted' | 'ready' | 'shutdown' | 'error';
|
|
188
|
-
error?: Error;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Plugin manager events
|
|
193
|
-
*/
|
|
194
|
-
export interface PluginManagerEvents {
|
|
195
|
-
'plugin:added': (meta: PluginMeta) => void;
|
|
196
|
-
'plugin:configured': (meta: PluginMeta) => void;
|
|
197
|
-
'plugin:registered': (meta: PluginMeta) => void;
|
|
198
|
-
'plugin:booted': (meta: PluginMeta) => void;
|
|
199
|
-
'plugin:ready': (meta: PluginMeta) => void;
|
|
200
|
-
'plugin:shutdown': (meta: PluginMeta) => void;
|
|
201
|
-
'plugin:error': (meta: PluginMeta, error: Error) => void;
|
|
202
|
-
'lifecycle:start': (phase: PluginPhase) => void;
|
|
203
|
-
'lifecycle:complete': (phase: PluginPhase) => void;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Priority weights for sorting
|
|
208
|
-
*/
|
|
209
|
-
export const PRIORITY_WEIGHTS: Record<PluginPriority, number> = {
|
|
210
|
-
critical: 0,
|
|
211
|
-
high: 1,
|
|
212
|
-
normal: 2,
|
|
213
|
-
low: 3
|
|
214
|
-
};
|