@engjts/nexus 0.1.8 → 0.1.10
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/dist/advanced/playground/playground.js.map +1 -1
- package/dist/advanced/static/generateDirectoryListing.d.ts +1 -1
- package/dist/advanced/static/generateDirectoryListing.d.ts.map +1 -1
- package/dist/advanced/static/generateDirectoryListing.js +12 -6
- package/dist/advanced/static/generateDirectoryListing.js.map +1 -1
- package/dist/advanced/static/index.d.ts +2 -0
- package/dist/advanced/static/index.d.ts.map +1 -1
- package/dist/advanced/static/index.js +4 -1
- package/dist/advanced/static/index.js.map +1 -1
- package/dist/advanced/static/serveStatic.d.ts.map +1 -1
- package/dist/advanced/static/serveStatic.js +7 -1
- package/dist/advanced/static/serveStatic.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- 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,509 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Factory pattern for generating test data
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { randomUUID } from 'crypto';
|
|
6
|
-
|
|
7
|
-
export type FactoryAttribute<T> = T | (() => T);
|
|
8
|
-
|
|
9
|
-
export type FactoryDefinition<T> = {
|
|
10
|
-
[K in keyof T]: FactoryAttribute<T[K]>;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export interface FactoryState<T> {
|
|
14
|
-
sequence: number;
|
|
15
|
-
traits: Map<string, Partial<FactoryDefinition<T>>>;
|
|
16
|
-
afterCreate: Array<(record: T) => void | Promise<void>>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface FactoryBuildOptions<T> {
|
|
20
|
-
traits?: string[];
|
|
21
|
-
overrides?: Partial<T>;
|
|
22
|
-
transient?: Record<string, any>;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Factory class for generating test data
|
|
27
|
-
*/
|
|
28
|
-
export class Factory<T extends Record<string, any>> {
|
|
29
|
-
private definition: FactoryDefinition<T>;
|
|
30
|
-
private state: FactoryState<T>;
|
|
31
|
-
private persistFn?: (record: T) => Promise<T>;
|
|
32
|
-
|
|
33
|
-
constructor(definition: FactoryDefinition<T>) {
|
|
34
|
-
this.definition = definition;
|
|
35
|
-
this.state = {
|
|
36
|
-
sequence: 1,
|
|
37
|
-
traits: new Map(),
|
|
38
|
-
afterCreate: []
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Define a trait (variation of the base factory)
|
|
44
|
-
*/
|
|
45
|
-
trait(name: string, overrides: Partial<FactoryDefinition<T>>): this {
|
|
46
|
-
this.state.traits.set(name, overrides);
|
|
47
|
-
return this;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Add afterCreate hook
|
|
52
|
-
*/
|
|
53
|
-
afterCreate(callback: (record: T) => void | Promise<void>): this {
|
|
54
|
-
this.state.afterCreate.push(callback);
|
|
55
|
-
return this;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Set persist function for creating records in database
|
|
60
|
-
*/
|
|
61
|
-
setPersist(fn: (record: T) => Promise<T>): this {
|
|
62
|
-
this.persistFn = fn;
|
|
63
|
-
return this;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Build a record without persisting
|
|
68
|
-
*/
|
|
69
|
-
build(options: FactoryBuildOptions<T> = {}): T {
|
|
70
|
-
const context = {
|
|
71
|
-
sequence: this.state.sequence++,
|
|
72
|
-
transient: options.transient ?? {}
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
// Start with base definition
|
|
76
|
-
let merged = { ...this.definition };
|
|
77
|
-
|
|
78
|
-
// Apply traits
|
|
79
|
-
for (const traitName of options.traits ?? []) {
|
|
80
|
-
const trait = this.state.traits.get(traitName);
|
|
81
|
-
if (!trait) {
|
|
82
|
-
throw new Error(`Unknown trait: ${traitName}`);
|
|
83
|
-
}
|
|
84
|
-
merged = { ...merged, ...trait };
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Apply overrides
|
|
88
|
-
if (options.overrides) {
|
|
89
|
-
for (const [key, value] of Object.entries(options.overrides)) {
|
|
90
|
-
(merged as any)[key] = value;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Resolve all values
|
|
95
|
-
const result: Partial<T> = {};
|
|
96
|
-
for (const [key, value] of Object.entries(merged)) {
|
|
97
|
-
if (typeof value === 'function') {
|
|
98
|
-
(result as any)[key] = (value as Function)(context);
|
|
99
|
-
} else {
|
|
100
|
-
(result as any)[key] = value;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return result as T;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Build multiple records
|
|
109
|
-
*/
|
|
110
|
-
buildMany(count: number, options: FactoryBuildOptions<T> = {}): T[] {
|
|
111
|
-
return Array.from({ length: count }, () => this.build(options));
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Create and persist a record
|
|
116
|
-
*/
|
|
117
|
-
async create(options: FactoryBuildOptions<T> = {}): Promise<T> {
|
|
118
|
-
const record = this.build(options);
|
|
119
|
-
|
|
120
|
-
let persisted = record;
|
|
121
|
-
if (this.persistFn) {
|
|
122
|
-
persisted = await this.persistFn(record);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Run afterCreate hooks
|
|
126
|
-
for (const hook of this.state.afterCreate) {
|
|
127
|
-
await hook(persisted);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return persisted;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Create multiple records
|
|
135
|
-
*/
|
|
136
|
-
async createMany(count: number, options: FactoryBuildOptions<T> = {}): Promise<T[]> {
|
|
137
|
-
return Promise.all(Array.from({ length: count }, () => this.create(options)));
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Reset sequence counter
|
|
142
|
-
*/
|
|
143
|
-
resetSequence(): this {
|
|
144
|
-
this.state.sequence = 1;
|
|
145
|
-
return this;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Define a new factory
|
|
151
|
-
*/
|
|
152
|
-
export function defineFactory<T extends Record<string, any>>(
|
|
153
|
-
definition: FactoryDefinition<T>
|
|
154
|
-
): Factory<T> {
|
|
155
|
-
return new Factory(definition);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// ============================================================================
|
|
159
|
-
// Built-in Generators
|
|
160
|
-
// ============================================================================
|
|
161
|
-
|
|
162
|
-
export const generators = {
|
|
163
|
-
/**
|
|
164
|
-
* Generate unique ID
|
|
165
|
-
*/
|
|
166
|
-
uuid: () => randomUUID(),
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Generate auto-incrementing ID
|
|
170
|
-
*/
|
|
171
|
-
sequence: (prefix: string = '') => {
|
|
172
|
-
let counter = 0;
|
|
173
|
-
return () => `${prefix}${++counter}`;
|
|
174
|
-
},
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Generate random integer
|
|
178
|
-
*/
|
|
179
|
-
integer: (min: number = 0, max: number = 100) => {
|
|
180
|
-
return () => Math.floor(Math.random() * (max - min + 1)) + min;
|
|
181
|
-
},
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Generate random float
|
|
185
|
-
*/
|
|
186
|
-
float: (min: number = 0, max: number = 100, decimals: number = 2) => {
|
|
187
|
-
return () => {
|
|
188
|
-
const value = Math.random() * (max - min) + min;
|
|
189
|
-
return Number(value.toFixed(decimals));
|
|
190
|
-
};
|
|
191
|
-
},
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Generate random boolean
|
|
195
|
-
*/
|
|
196
|
-
boolean: (trueChance: number = 0.5) => {
|
|
197
|
-
return () => Math.random() < trueChance;
|
|
198
|
-
},
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Pick random element from array
|
|
202
|
-
*/
|
|
203
|
-
oneOf: <T>(options: T[]) => {
|
|
204
|
-
return () => options[Math.floor(Math.random() * options.length)];
|
|
205
|
-
},
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Pick multiple random elements
|
|
209
|
-
*/
|
|
210
|
-
someOf: <T>(options: T[], min: number = 1, max: number = options.length) => {
|
|
211
|
-
return () => {
|
|
212
|
-
const count = Math.floor(Math.random() * (max - min + 1)) + min;
|
|
213
|
-
const shuffled = [...options].sort(() => Math.random() - 0.5);
|
|
214
|
-
return shuffled.slice(0, count);
|
|
215
|
-
};
|
|
216
|
-
},
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Generate random date
|
|
220
|
-
*/
|
|
221
|
-
date: (start: Date = new Date(2020, 0, 1), end: Date = new Date()) => {
|
|
222
|
-
return () => {
|
|
223
|
-
const time = start.getTime() + Math.random() * (end.getTime() - start.getTime());
|
|
224
|
-
return new Date(time);
|
|
225
|
-
};
|
|
226
|
-
},
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Generate date relative to now
|
|
230
|
-
*/
|
|
231
|
-
pastDate: (maxDaysAgo: number = 365) => {
|
|
232
|
-
return () => {
|
|
233
|
-
const now = Date.now();
|
|
234
|
-
const daysAgo = Math.floor(Math.random() * maxDaysAgo);
|
|
235
|
-
return new Date(now - daysAgo * 24 * 60 * 60 * 1000);
|
|
236
|
-
};
|
|
237
|
-
},
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Generate future date
|
|
241
|
-
*/
|
|
242
|
-
futureDate: (maxDaysAhead: number = 365) => {
|
|
243
|
-
return () => {
|
|
244
|
-
const now = Date.now();
|
|
245
|
-
const daysAhead = Math.floor(Math.random() * maxDaysAhead);
|
|
246
|
-
return new Date(now + daysAhead * 24 * 60 * 60 * 1000);
|
|
247
|
-
};
|
|
248
|
-
},
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* Generate random string
|
|
252
|
-
*/
|
|
253
|
-
string: (length: number = 10) => {
|
|
254
|
-
return () => {
|
|
255
|
-
const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
|
256
|
-
let result = '';
|
|
257
|
-
for (let i = 0; i < length; i++) {
|
|
258
|
-
result += chars[Math.floor(Math.random() * chars.length)];
|
|
259
|
-
}
|
|
260
|
-
return result;
|
|
261
|
-
};
|
|
262
|
-
},
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Generate Lorem ipsum text
|
|
266
|
-
*/
|
|
267
|
-
lorem: (wordCount: number = 10) => {
|
|
268
|
-
const words = [
|
|
269
|
-
'lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit',
|
|
270
|
-
'sed', 'do', 'eiusmod', 'tempor', 'incididunt', 'ut', 'labore', 'et', 'dolore',
|
|
271
|
-
'magna', 'aliqua', 'enim', 'ad', 'minim', 'veniam', 'quis', 'nostrud'
|
|
272
|
-
];
|
|
273
|
-
return () => {
|
|
274
|
-
const result: string[] = [];
|
|
275
|
-
for (let i = 0; i < wordCount; i++) {
|
|
276
|
-
result.push(words[Math.floor(Math.random() * words.length)]);
|
|
277
|
-
}
|
|
278
|
-
return result.join(' ');
|
|
279
|
-
};
|
|
280
|
-
},
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Generate paragraph
|
|
284
|
-
*/
|
|
285
|
-
paragraph: (sentenceCount: number = 3) => {
|
|
286
|
-
return () => {
|
|
287
|
-
const sentences: string[] = [];
|
|
288
|
-
for (let i = 0; i < sentenceCount; i++) {
|
|
289
|
-
const words = generators.lorem(Math.floor(Math.random() * 10) + 5)();
|
|
290
|
-
sentences.push(words.charAt(0).toUpperCase() + words.slice(1) + '.');
|
|
291
|
-
}
|
|
292
|
-
return sentences.join(' ');
|
|
293
|
-
};
|
|
294
|
-
},
|
|
295
|
-
|
|
296
|
-
// ========================================================================
|
|
297
|
-
// Common data generators (like faker.js)
|
|
298
|
-
// ========================================================================
|
|
299
|
-
|
|
300
|
-
/**
|
|
301
|
-
* Generate email
|
|
302
|
-
*/
|
|
303
|
-
email: () => {
|
|
304
|
-
const domains = ['example.com', 'test.com', 'mail.test', 'demo.org'];
|
|
305
|
-
return (ctx: { sequence: number }) => {
|
|
306
|
-
const domain = domains[Math.floor(Math.random() * domains.length)];
|
|
307
|
-
return `user${ctx.sequence}@${domain}`;
|
|
308
|
-
};
|
|
309
|
-
},
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* Generate name
|
|
313
|
-
*/
|
|
314
|
-
firstName: () => {
|
|
315
|
-
const names = ['John', 'Jane', 'Bob', 'Alice', 'Charlie', 'Diana', 'Eve', 'Frank'];
|
|
316
|
-
return () => names[Math.floor(Math.random() * names.length)];
|
|
317
|
-
},
|
|
318
|
-
|
|
319
|
-
lastName: () => {
|
|
320
|
-
const names = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller'];
|
|
321
|
-
return () => names[Math.floor(Math.random() * names.length)];
|
|
322
|
-
},
|
|
323
|
-
|
|
324
|
-
fullName: () => {
|
|
325
|
-
return () => `${generators.firstName()()} ${generators.lastName()()}`;
|
|
326
|
-
},
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Generate username
|
|
330
|
-
*/
|
|
331
|
-
username: () => {
|
|
332
|
-
return (ctx: { sequence: number }) => `user_${ctx.sequence}_${generators.string(4)()}`;
|
|
333
|
-
},
|
|
334
|
-
|
|
335
|
-
/**
|
|
336
|
-
* Generate password (for testing)
|
|
337
|
-
*/
|
|
338
|
-
password: (length: number = 12) => {
|
|
339
|
-
return () => {
|
|
340
|
-
const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*';
|
|
341
|
-
let result = '';
|
|
342
|
-
for (let i = 0; i < length; i++) {
|
|
343
|
-
result += chars[Math.floor(Math.random() * chars.length)];
|
|
344
|
-
}
|
|
345
|
-
return result;
|
|
346
|
-
};
|
|
347
|
-
},
|
|
348
|
-
|
|
349
|
-
/**
|
|
350
|
-
* Generate phone number
|
|
351
|
-
*/
|
|
352
|
-
phone: () => {
|
|
353
|
-
return () => {
|
|
354
|
-
const area = Math.floor(Math.random() * 900) + 100;
|
|
355
|
-
const first = Math.floor(Math.random() * 900) + 100;
|
|
356
|
-
const second = Math.floor(Math.random() * 9000) + 1000;
|
|
357
|
-
return `${area}-${first}-${second}`;
|
|
358
|
-
};
|
|
359
|
-
},
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* Generate URL
|
|
363
|
-
*/
|
|
364
|
-
url: () => {
|
|
365
|
-
const protocols = ['http', 'https'];
|
|
366
|
-
const domains = ['example.com', 'test.org', 'demo.net'];
|
|
367
|
-
return () => {
|
|
368
|
-
const protocol = protocols[Math.floor(Math.random() * protocols.length)];
|
|
369
|
-
const domain = domains[Math.floor(Math.random() * domains.length)];
|
|
370
|
-
return `${protocol}://${domain}/${generators.string(8)()}`;
|
|
371
|
-
};
|
|
372
|
-
},
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* Generate IPv4 address
|
|
376
|
-
*/
|
|
377
|
-
ipv4: () => {
|
|
378
|
-
return () => {
|
|
379
|
-
const octets = Array.from({ length: 4 }, () => Math.floor(Math.random() * 256));
|
|
380
|
-
return octets.join('.');
|
|
381
|
-
};
|
|
382
|
-
},
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Generate slug
|
|
386
|
-
*/
|
|
387
|
-
slug: () => {
|
|
388
|
-
return (ctx: { sequence: number }) => `slug-${ctx.sequence}-${generators.string(6)().toLowerCase()}`;
|
|
389
|
-
},
|
|
390
|
-
|
|
391
|
-
/**
|
|
392
|
-
* Generate company name
|
|
393
|
-
*/
|
|
394
|
-
company: () => {
|
|
395
|
-
const prefixes = ['Tech', 'Global', 'Smart', 'Digital', 'Cloud', 'Data', 'Cyber'];
|
|
396
|
-
const suffixes = ['Corp', 'Inc', 'Ltd', 'Solutions', 'Systems', 'Labs', 'Works'];
|
|
397
|
-
return () => {
|
|
398
|
-
const prefix = prefixes[Math.floor(Math.random() * prefixes.length)];
|
|
399
|
-
const suffix = suffixes[Math.floor(Math.random() * suffixes.length)];
|
|
400
|
-
return `${prefix}${generators.string(4)()} ${suffix}`;
|
|
401
|
-
};
|
|
402
|
-
},
|
|
403
|
-
|
|
404
|
-
/**
|
|
405
|
-
* Generate job title
|
|
406
|
-
*/
|
|
407
|
-
jobTitle: () => {
|
|
408
|
-
const levels = ['Junior', 'Senior', 'Lead', 'Principal', 'Staff'];
|
|
409
|
-
const roles = ['Developer', 'Engineer', 'Designer', 'Manager', 'Analyst', 'Architect'];
|
|
410
|
-
return () => {
|
|
411
|
-
const level = levels[Math.floor(Math.random() * levels.length)];
|
|
412
|
-
const role = roles[Math.floor(Math.random() * roles.length)];
|
|
413
|
-
return `${level} ${role}`;
|
|
414
|
-
};
|
|
415
|
-
},
|
|
416
|
-
|
|
417
|
-
/**
|
|
418
|
-
* Generate address
|
|
419
|
-
*/
|
|
420
|
-
address: () => {
|
|
421
|
-
const streets = ['Main St', 'Oak Ave', 'Park Rd', 'Lake Dr', 'Hill Blvd'];
|
|
422
|
-
const cities = ['Springfield', 'Riverside', 'Georgetown', 'Franklin', 'Clinton'];
|
|
423
|
-
const states = ['CA', 'NY', 'TX', 'FL', 'WA', 'OR', 'CO'];
|
|
424
|
-
return () => ({
|
|
425
|
-
street: `${Math.floor(Math.random() * 9999) + 1} ${streets[Math.floor(Math.random() * streets.length)]}`,
|
|
426
|
-
city: cities[Math.floor(Math.random() * cities.length)],
|
|
427
|
-
state: states[Math.floor(Math.random() * states.length)],
|
|
428
|
-
zip: String(Math.floor(Math.random() * 90000) + 10000)
|
|
429
|
-
});
|
|
430
|
-
},
|
|
431
|
-
|
|
432
|
-
/**
|
|
433
|
-
* Generate country code
|
|
434
|
-
*/
|
|
435
|
-
countryCode: () => {
|
|
436
|
-
const codes = ['US', 'GB', 'DE', 'FR', 'JP', 'AU', 'CA', 'BR', 'IN', 'CN'];
|
|
437
|
-
return () => codes[Math.floor(Math.random() * codes.length)];
|
|
438
|
-
},
|
|
439
|
-
|
|
440
|
-
/**
|
|
441
|
-
* Generate currency code
|
|
442
|
-
*/
|
|
443
|
-
currency: () => {
|
|
444
|
-
const currencies = ['USD', 'EUR', 'GBP', 'JPY', 'AUD', 'CAD', 'CHF'];
|
|
445
|
-
return () => currencies[Math.floor(Math.random() * currencies.length)];
|
|
446
|
-
},
|
|
447
|
-
|
|
448
|
-
/**
|
|
449
|
-
* Generate price/amount
|
|
450
|
-
*/
|
|
451
|
-
price: (min: number = 1, max: number = 1000) => {
|
|
452
|
-
return () => Number((Math.random() * (max - min) + min).toFixed(2));
|
|
453
|
-
},
|
|
454
|
-
|
|
455
|
-
/**
|
|
456
|
-
* Generate credit card number (fake, for testing)
|
|
457
|
-
*/
|
|
458
|
-
creditCard: () => {
|
|
459
|
-
return () => {
|
|
460
|
-
const groups = Array.from({ length: 4 }, () =>
|
|
461
|
-
String(Math.floor(Math.random() * 10000)).padStart(4, '0')
|
|
462
|
-
);
|
|
463
|
-
return groups.join('-');
|
|
464
|
-
};
|
|
465
|
-
},
|
|
466
|
-
|
|
467
|
-
/**
|
|
468
|
-
* Generate hex color
|
|
469
|
-
*/
|
|
470
|
-
hexColor: () => {
|
|
471
|
-
return () => '#' + Math.floor(Math.random() * 16777215).toString(16).padStart(6, '0');
|
|
472
|
-
},
|
|
473
|
-
|
|
474
|
-
/**
|
|
475
|
-
* Generate file path
|
|
476
|
-
*/
|
|
477
|
-
filePath: () => {
|
|
478
|
-
const dirs = ['documents', 'images', 'downloads', 'data', 'temp'];
|
|
479
|
-
const extensions = ['txt', 'pdf', 'jpg', 'png', 'doc', 'json'];
|
|
480
|
-
return () => {
|
|
481
|
-
const dir = dirs[Math.floor(Math.random() * dirs.length)];
|
|
482
|
-
const ext = extensions[Math.floor(Math.random() * extensions.length)];
|
|
483
|
-
return `/${dir}/${generators.string(8)()}.${ext}`;
|
|
484
|
-
};
|
|
485
|
-
},
|
|
486
|
-
|
|
487
|
-
/**
|
|
488
|
-
* Generate MIME type
|
|
489
|
-
*/
|
|
490
|
-
mimeType: () => {
|
|
491
|
-
const types = [
|
|
492
|
-
'application/json',
|
|
493
|
-
'application/pdf',
|
|
494
|
-
'text/plain',
|
|
495
|
-
'text/html',
|
|
496
|
-
'image/jpeg',
|
|
497
|
-
'image/png',
|
|
498
|
-
'audio/mpeg',
|
|
499
|
-
'video/mp4'
|
|
500
|
-
];
|
|
501
|
-
return () => types[Math.floor(Math.random() * types.length)];
|
|
502
|
-
}
|
|
503
|
-
};
|
|
504
|
-
|
|
505
|
-
// Export type for context
|
|
506
|
-
export interface FactoryContext {
|
|
507
|
-
sequence: number;
|
|
508
|
-
transient: Record<string, any>;
|
|
509
|
-
}
|