@common-stack/server-core 7.2.1-alpha.31 → 7.2.1-alpha.32

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.
@@ -0,0 +1,653 @@
1
+ import {Moleculer}from'./moleculerEventHandler.js';import {getAllMethodNames}from'./serviceGenerationUtils.js';// from package: store-mongo
2
+ /**
3
+ * @file typed-moleculer-service.ts
4
+ * @description Provides type-safe base class for Moleculer services with ENFORCED
5
+ * compile-time verification AND automatic action generation from service methods.
6
+ */
7
+ /**
8
+ * Split parameters by comma, respecting nested structures
9
+ */
10
+ function splitParams(paramsStr) {
11
+ const params = [];
12
+ let current = '';
13
+ let depth = 0;
14
+ for (let i = 0; i < paramsStr.length; i++) {
15
+ const char = paramsStr[i];
16
+ if (char === '<' || char === '{' || char === '[' || char === '(') {
17
+ depth++;
18
+ current += char;
19
+ }
20
+ else if (char === '>' || char === '}' || char === ']' || char === ')') {
21
+ depth--;
22
+ current += char;
23
+ }
24
+ else if (char === ',' && depth === 0) {
25
+ params.push(current);
26
+ current = '';
27
+ }
28
+ else {
29
+ current += char;
30
+ }
31
+ }
32
+ if (current) {
33
+ params.push(current);
34
+ }
35
+ return params;
36
+ }
37
+ /**
38
+ * Infer Moleculer validator type from TypeScript type annotation
39
+ */
40
+ function inferMoleculerType(typeAnnotation) {
41
+ const type = typeAnnotation.trim();
42
+ // Check for array types
43
+ if (type.endsWith('[]') || type.startsWith('Array<') || type.startsWith('ReadonlyArray<')) {
44
+ return 'array';
45
+ }
46
+ // Check for primitive types
47
+ if (type === 'string' || type === 'String')
48
+ return 'string';
49
+ if (type === 'number' || type === 'Number')
50
+ return 'number';
51
+ if (type === 'boolean' || type === 'Boolean')
52
+ return 'boolean';
53
+ // Check for common built-in types
54
+ if (type === 'Date')
55
+ return 'date';
56
+ if (type === 'RegExp')
57
+ return 'object';
58
+ // Check for union types with primitive
59
+ if (type.includes('|')) {
60
+ const types = type.split('|').map((t) => t.trim());
61
+ // If all types are same primitive, return that
62
+ const nonNullTypes = types.filter((t) => t !== 'null' && t !== 'undefined');
63
+ if (nonNullTypes.length === 1) {
64
+ return inferMoleculerType(nonNullTypes[0]);
65
+ }
66
+ // If contains string, number, or boolean, try to infer
67
+ if (nonNullTypes.some((t) => t === 'string'))
68
+ return 'string';
69
+ if (nonNullTypes.some((t) => t === 'number'))
70
+ return 'number';
71
+ if (nonNullTypes.some((t) => t === 'boolean'))
72
+ return 'boolean';
73
+ }
74
+ // Check for enum types (assume string enum)
75
+ if (type.includes('Enum') || type.includes('Type')) {
76
+ return 'string';
77
+ }
78
+ // Default to object for interfaces, types, classes, etc.
79
+ return 'object';
80
+ }
81
+ /**
82
+ * Infer type from default value
83
+ */
84
+ function inferTypeFromDefault(defaultValue) {
85
+ // String defaults
86
+ if (defaultValue.startsWith("'") || defaultValue.startsWith('"') || defaultValue.startsWith('`')) {
87
+ return 'string';
88
+ }
89
+ // Number defaults
90
+ if (/^-?\d+(\.\d+)?$/.test(defaultValue)) {
91
+ return 'number';
92
+ }
93
+ // Boolean defaults
94
+ if (defaultValue === 'true' || defaultValue === 'false') {
95
+ return 'boolean';
96
+ }
97
+ // Array defaults
98
+ if (defaultValue.startsWith('[')) {
99
+ return 'array';
100
+ }
101
+ // Object defaults
102
+ if (defaultValue.startsWith('{')) {
103
+ return 'object';
104
+ }
105
+ return 'object';
106
+ }
107
+ /**
108
+ * Extract parameter names and infer types from a function's string representation
109
+ * Returns array of { name, type } where type is the inferred Moleculer validator
110
+ */
111
+ function extractParamsWithTypes(funcStr) {
112
+ // Match function parameters: function(a, b) or (a, b) => or async (a, b) =>
113
+ const match = funcStr.match(/(?:function\s*)?(?:\w+\s*)?\(([^)]*)\)/);
114
+ if (!match || !match[1])
115
+ return [];
116
+ const paramsStr = match[1].trim();
117
+ if (!paramsStr)
118
+ return [];
119
+ const params = [];
120
+ // Split by comma, but handle nested objects/arrays
121
+ const paramParts = splitParams(paramsStr);
122
+ paramParts.forEach((param) => {
123
+ const trimmed = param.trim();
124
+ if (!trimmed)
125
+ return;
126
+ // Check if optional (has ?)
127
+ const optional = trimmed.includes('?');
128
+ // Extract parameter name and type annotation
129
+ // Patterns: "name", "name?", "name: Type", "name?: Type", "name = default"
130
+ const paramMatch = trimmed.match(/^(\w+)\??(?:\s*:\s*([^=]+))?(?:\s*=\s*(.+))?/);
131
+ if (!paramMatch)
132
+ return;
133
+ const name = paramMatch[1];
134
+ const typeAnnotation = paramMatch[2]?.trim();
135
+ const defaultValue = paramMatch[3]?.trim();
136
+ // Infer Moleculer type from TypeScript annotation or default value
137
+ let moleculerType = 'object'; // Safe default
138
+ if (typeAnnotation) {
139
+ moleculerType = inferMoleculerType(typeAnnotation);
140
+ }
141
+ else if (defaultValue) {
142
+ moleculerType = inferTypeFromDefault(defaultValue);
143
+ }
144
+ params.push({
145
+ name,
146
+ type: moleculerType,
147
+ optional: optional || !!defaultValue,
148
+ });
149
+ });
150
+ return params;
151
+ }
152
+ // getAllMethodNames is now imported from serviceGenerationUtils.ts for consistency
153
+ /**
154
+ * ADVANCED AUTO-GENERATED: Generate actions with full control over inclusion, exclusion, and overrides.
155
+ * Params are inferred from TypeScript function signatures with optional fine-grained control.
156
+ *
157
+ * @param service - The service instance to wrap
158
+ * @param config - Advanced configuration for fine-grained control
159
+ * @returns Actions object with handlers for selected service methods
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * // Basic: Auto-generate all methods
164
+ * const actions = generateAutoInferredServiceActions<IAccountService>(accountService);
165
+ *
166
+ * // Advanced: Include only specific methods
167
+ * const actions = generateAutoInferredServiceActions<IAccountService>(accountService, {
168
+ * include: ['findAccountById', 'createAccount', 'updateAccount']
169
+ * });
170
+ *
171
+ * // Advanced: Exclude specific methods
172
+ * const actions = generateAutoInferredServiceActions<IAccountService>(accountService, {
173
+ * exclude: ['deleteAccount', 'internalMethod']
174
+ * });
175
+ *
176
+ * // Advanced: Override param schemas for specific methods
177
+ * const actions = generateAutoInferredServiceActions<IAccountService>(accountService, {
178
+ * paramOverrides: {
179
+ * findAccountById: { id: 'string' },
180
+ * getUsers: { where: { type: 'object', optional: true } }
181
+ * }
182
+ * });
183
+ *
184
+ * // Advanced: Add custom action configuration
185
+ * const actions = generateAutoInferredServiceActions<IAccountService>(accountService, {
186
+ * actionConfig: {
187
+ * findAccountById: { cache: true, visibility: 'public' },
188
+ * deleteAccount: { visibility: 'protected' }
189
+ * }
190
+ * });
191
+ *
192
+ * // Advanced: Combine multiple options
193
+ * const actions = generateAutoInferredServiceActions<IAccountService>(accountService, {
194
+ * include: ['findAccountById', 'createAccount'],
195
+ * paramOverrides: {
196
+ * findAccountById: { id: 'string' }
197
+ * },
198
+ * actionConfig: {
199
+ * findAccountById: { cache: true }
200
+ * }
201
+ * });
202
+ * ```
203
+ */
204
+ function generateAutoInferredServiceActions(service, config = {}) {
205
+ const { paramOverrides = {}, include, exclude = [], actionToMethodMap = {}, actionConfig = {} } = config;
206
+ const actions = {};
207
+ // Get all methods from the service, including inherited methods from parent classes
208
+ const allKeys = getAllMethodNames(service);
209
+ allKeys.forEach((key) => {
210
+ // Skip constructor and private methods
211
+ if (key === 'constructor' || key.startsWith('_')) {
212
+ return;
213
+ }
214
+ // Apply include filter (whitelist) - takes precedence
215
+ if (include && include.length > 0) {
216
+ if (!include.includes(key)) {
217
+ return;
218
+ }
219
+ }
220
+ // Apply exclude filter (blacklist) - only if include is not specified
221
+ else if (exclude.includes(key)) {
222
+ return;
223
+ }
224
+ const method = service[key];
225
+ if (typeof method !== 'function') {
226
+ return;
227
+ }
228
+ const methodName = actionToMethodMap[key] || key;
229
+ const serviceMethod = service[methodName];
230
+ if (typeof serviceMethod !== 'function') {
231
+ return;
232
+ }
233
+ // Use runtime reflection to infer params and types from function signature
234
+ const funcStr = serviceMethod.toString();
235
+ const paramsWithTypes = extractParamsWithTypes(funcStr);
236
+ // Build param schema
237
+ let paramSchema;
238
+ // Use override if provided
239
+ if (paramOverrides[key]) {
240
+ paramSchema = paramOverrides[key];
241
+ }
242
+ else if (paramsWithTypes.length > 0) {
243
+ // Auto-generate schema from inferred types
244
+ paramSchema = paramsWithTypes.reduce((acc, param) => {
245
+ if (param.optional) {
246
+ acc[param.name] = { type: param.type, optional: true };
247
+ }
248
+ else {
249
+ acc[param.name] = param.type;
250
+ }
251
+ return acc;
252
+ }, {});
253
+ }
254
+ // Get custom action configuration if provided
255
+ const customActionConfig = actionConfig[key];
256
+ // Build the action object
257
+ const action = {
258
+ ...(paramSchema ? { params: paramSchema } : {}),
259
+ handler: (ctx) => {
260
+ const method = service[methodName];
261
+ const paramsObj = ctx.params || {};
262
+ const values = Object.values(paramsObj);
263
+ return method.apply(service, values.length > 0 ? values : [paramsObj]);
264
+ },
265
+ };
266
+ // Merge custom action config if provided (cache, visibility, etc.)
267
+ if (customActionConfig) {
268
+ Object.assign(action, customActionConfig);
269
+ }
270
+ actions[key] = action;
271
+ });
272
+ return actions;
273
+ }
274
+ /**
275
+ * Generate both actions AND events from a service instance
276
+ * - Actions: Generated from regular service methods
277
+ * - Events: Generated from methods marked with @MoleculerEventHandler decorator
278
+ *
279
+ * @param service - The service instance to wrap
280
+ * @param config - Configuration for actions and events
281
+ * @returns Object with both actions and events
282
+ *
283
+ * @example
284
+ * ```typescript
285
+ * // Service with decorator
286
+ * class OrganizationService {
287
+ * // Regular method becomes action
288
+ * async createOrganization(org: Org): Promise<Org> { }
289
+ *
290
+ * // Decorated method becomes event handler
291
+ * @MoleculerEventHandler(UserBroadcasterAction.OnUserCreated)
292
+ * async onUserCreated(event: UserEvent): Promise<void> { }
293
+ * }
294
+ *
295
+ * // Generate both
296
+ * const { actions, events } = generateServiceActionsAndEvents(service);
297
+ * ```
298
+ */
299
+ function generateServiceActionsAndEvents(service, config = {}) {
300
+ // Get event handlers from decorator metadata
301
+ const eventHandlers = Moleculer.getEventHandlers(service);
302
+ const eventHandlerMethods = new Set(eventHandlers.map((h) => h.methodName));
303
+ // Generate actions (excluding event handler methods)
304
+ const actionsConfig = {
305
+ ...config,
306
+ exclude: [...(config.exclude || []), ...Array.from(eventHandlerMethods)],
307
+ };
308
+ const actions = generateAutoInferredServiceActions(service, actionsConfig);
309
+ // Generate events from decorated methods
310
+ const events = {};
311
+ eventHandlers.forEach((metadata) => {
312
+ const method = service[metadata.methodName];
313
+ if (typeof method === 'function') {
314
+ events[metadata.eventName] = {
315
+ handler: async (ctx) => {
316
+ // Event payload is typically wrapped in ctx.params.event
317
+ const eventData = ctx.params.event || ctx.params;
318
+ return method.call(service, eventData);
319
+ },
320
+ ...(metadata.group ? { group: metadata.group } : {}),
321
+ };
322
+ }
323
+ });
324
+ return { actions, events };
325
+ }
326
+ /**
327
+ * Automatically generate Moleculer actions from a service instance.
328
+ *
329
+ * This eliminates the need to write repetitive action handlers - just pass your service
330
+ * and it will create handlers that forward all calls automatically.
331
+ *
332
+ * @param service - The service instance to wrap
333
+ * @param config - Optional configuration for customizing actions
334
+ * @returns Actions object with handlers for all service methods
335
+ *
336
+ * @example
337
+ * ```typescript
338
+ * const actions = generateServiceActions(accountService, {
339
+ * params: {
340
+ * findAccountById: { id: 'string' },
341
+ * createAccount: { account: 'object' }
342
+ * },
343
+ * exclude: ['get', 'getAll'] // Handle these manually
344
+ * });
345
+ * ```
346
+ */
347
+ function generateServiceActions(service, config = {}) {
348
+ const { params = {}, exclude = [], actionToMethodMap = {} } = config;
349
+ const actions = {};
350
+ // Get all methods from the service
351
+ const allKeys = Object.getOwnPropertyNames(Object.getPrototypeOf(service));
352
+ const generatedMethods = [];
353
+ allKeys.forEach((key) => {
354
+ // Skip excluded methods, constructors, and private methods
355
+ if (exclude.includes(key) || key === 'constructor' || key.startsWith('_')) {
356
+ return;
357
+ }
358
+ const method = service[key];
359
+ // Only process functions
360
+ if (typeof method !== 'function') {
361
+ return;
362
+ }
363
+ // Determine the method name to call (in case of mapping)
364
+ const methodName = actionToMethodMap[key] || key;
365
+ const serviceMethod = service[methodName];
366
+ if (typeof serviceMethod !== 'function') {
367
+ return;
368
+ }
369
+ generatedMethods.push(key);
370
+ // Create the action handler
371
+ actions[key] = {
372
+ ...(params[key] ? { params: params[key] } : {}),
373
+ handler: (ctx) => {
374
+ // Call the service method with ctx.params spread as arguments
375
+ const method = service[methodName];
376
+ // If params is an object with known keys, extract them in order
377
+ // Otherwise, pass the whole params object
378
+ const paramsObj = ctx.params || {};
379
+ const values = Object.values(paramsObj);
380
+ return method.apply(service, values.length > 0 ? values : [paramsObj]);
381
+ },
382
+ };
383
+ });
384
+ // In development, log methods that don't have param validation
385
+ if (process.env.NODE_ENV !== 'production') {
386
+ const methodsWithoutParams = generatedMethods.filter((method) => !params[method]);
387
+ if (methodsWithoutParams.length > 0) {
388
+ console.warn(`⚠️ [generateServiceActions] The following methods don't have param validation defined:`, methodsWithoutParams);
389
+ }
390
+ }
391
+ return actions;
392
+ }
393
+ /**
394
+ * TYPE-SAFE version: Generate Moleculer actions with COMPILE-TIME verification.
395
+ * TypeScript will error if any service method is missing from params.
396
+ *
397
+ * @param service - The service instance to wrap
398
+ * @param config - Type-safe configuration requiring ALL methods to have params
399
+ * @returns Actions object with handlers for all service methods
400
+ *
401
+ * @example
402
+ * ```typescript
403
+ * const actions = generateTypeSafeServiceActions<IAccountService>(accountService, {
404
+ * params: {
405
+ * // TypeScript enforces ALL IAccountService methods are here!
406
+ * findAccountById: { id: 'string' },
407
+ * createAccount: { account: 'object' },
408
+ * // ... if you forget any method, TypeScript will error
409
+ * }
410
+ * });
411
+ * ```
412
+ */
413
+ function generateTypeSafeServiceActions(service, config) {
414
+ // Delegate to the regular function - type checking happens at compile time
415
+ return generateServiceActions(service, config);
416
+ }
417
+ /**
418
+ * Verify that all service methods have param validation defined.
419
+ * Throws an error if any methods are missing params.
420
+ *
421
+ * Use this in development to ensure you haven't forgotten any param schemas.
422
+ *
423
+ * @param service - The service instance
424
+ * @param config - The config used for generateServiceActions
425
+ * @throws Error if any methods are missing param validation
426
+ *
427
+ * @example
428
+ * ```typescript
429
+ * const config = { params: { ... }, exclude: [...] };
430
+ * verifyAllParamsDefined(accountService, config); // Throws if params missing
431
+ * const actions = generateServiceActions(accountService, config);
432
+ * ```
433
+ */
434
+ function verifyAllParamsDefined(service, config = {}) {
435
+ const { params = {}, exclude = [] } = config;
436
+ const allKeys = Object.getOwnPropertyNames(Object.getPrototypeOf(service));
437
+ const missingParams = [];
438
+ allKeys.forEach((key) => {
439
+ // Skip excluded methods, constructors, and private methods
440
+ if (exclude.includes(key) || key === 'constructor' || key.startsWith('_')) {
441
+ return;
442
+ }
443
+ const method = service[key];
444
+ // Only check functions
445
+ if (typeof method !== 'function') {
446
+ return;
447
+ }
448
+ // Check if params defined
449
+ if (!params[key]) {
450
+ missingParams.push(key);
451
+ }
452
+ });
453
+ if (missingParams.length > 0) {
454
+ const errorMessage = [
455
+ `Missing param validation for methods: ${missingParams.join(', ')}`,
456
+ '',
457
+ 'Add these to your params config:',
458
+ ...missingParams.map((method) => ` ${method}: { /* your params */ },`),
459
+ ].join('\n');
460
+ throw new Error(errorMessage);
461
+ }
462
+ }
463
+ /**
464
+ * Helper to create a typed action handler
465
+ */
466
+ function createTypedAction(action) {
467
+ return action;
468
+ }
469
+ /**
470
+ * DEBUG UTILITY: Dumps parameter information for all service methods
471
+ *
472
+ * This function extracts and logs parameter names, types, and inferred schemas
473
+ * for debugging auto-generation issues. Use during development to understand
474
+ * what the auto-generation sees and optimize paramOverrides.
475
+ *
476
+ * @param service - The service instance to analyze
477
+ * @param config - Optional configuration to see what would be generated
478
+ * @returns Object with detailed parameter information for each method
479
+ *
480
+ * @example
481
+ * ```typescript
482
+ * // In development/debug mode
483
+ * const paramInfo = Moleculer.debugServiceParams(accountService);
484
+ * console.log(JSON.stringify(paramInfo, null, 2));
485
+ *
486
+ * // With config to see filtered results
487
+ * const paramInfo = Moleculer.debugServiceParams(accountService, {
488
+ * exclude: ['dispose', 'createUserToken']
489
+ * });
490
+ * ```
491
+ */
492
+ function debugServiceParams(service, config = {}) {
493
+ const { paramOverrides = {}, include, exclude = [] } = config;
494
+ const result = {};
495
+ // Get all methods from the service, including inherited methods
496
+ const allKeys = getAllMethodNames(service);
497
+ // Get event handler methods
498
+ const eventHandlers = Moleculer.getEventHandlers(service);
499
+ const eventHandlerMethods = new Set(eventHandlers.map((h) => h.methodName));
500
+ allKeys.forEach((key) => {
501
+ // Skip constructor and private methods
502
+ if (key === 'constructor' || key.startsWith('_')) {
503
+ return;
504
+ }
505
+ const method = service[key];
506
+ if (typeof method !== 'function') {
507
+ return;
508
+ }
509
+ // Determine if this method would be excluded
510
+ const isEventHandler = eventHandlerMethods.has(key);
511
+ let isExcluded = false;
512
+ if (include && include.length > 0) {
513
+ isExcluded = !include.includes(key);
514
+ }
515
+ else {
516
+ isExcluded = exclude.includes(key) || isEventHandler;
517
+ }
518
+ // Get function signature
519
+ const funcStr = method.toString();
520
+ const paramsWithTypes = extractParamsWithTypes(funcStr);
521
+ // Extract just the function signature (first line with params)
522
+ const signatureMatch = funcStr.match(/^(?:async\s+)?(?:function\s+)?(?:\w+\s*)?\(([^)]*)\)/);
523
+ const signature = signatureMatch ? signatureMatch[0] : funcStr.split('{')[0].trim();
524
+ // Build inferred schema using new type inference
525
+ let inferredSchema;
526
+ if (paramsWithTypes.length > 0) {
527
+ inferredSchema = paramsWithTypes.reduce((acc, param) => {
528
+ if (param.optional) {
529
+ acc[param.name] = { type: param.type, optional: true };
530
+ }
531
+ else {
532
+ acc[param.name] = param.type;
533
+ }
534
+ return acc;
535
+ }, {});
536
+ }
537
+ // Get override schema if provided
538
+ const overrideSchema = paramOverrides[key];
539
+ result[key] = {
540
+ methodName: key,
541
+ paramNames: paramsWithTypes.map((p) => p.name),
542
+ functionSignature: signature,
543
+ inferredSchema,
544
+ overrideSchema,
545
+ isExcluded,
546
+ isEventHandler,
547
+ };
548
+ });
549
+ return result;
550
+ }
551
+ /**
552
+ * DEBUG UTILITY: Pretty prints service parameter information to console
553
+ *
554
+ * Formats and logs the output of debugServiceParams() in a readable way.
555
+ * Shows which methods need paramOverrides and what types are inferred.
556
+ *
557
+ * @param service - The service instance to analyze
558
+ * @param config - Optional configuration
559
+ * @param options - Display options
560
+ *
561
+ * @example
562
+ * ```typescript
563
+ * // Print all methods
564
+ * Moleculer.printServiceParams(accountService);
565
+ *
566
+ * // Print only methods without overrides
567
+ * Moleculer.printServiceParams(accountService, config, { onlyMissingOverrides: true });
568
+ *
569
+ * // Print only included methods
570
+ * Moleculer.printServiceParams(accountService, config, { onlyIncluded: true });
571
+ * ```
572
+ */
573
+ function printServiceParams(service, config = {}, options = {}) {
574
+ const paramInfo = debugServiceParams(service, config);
575
+ const methods = Object.values(paramInfo);
576
+ const separator = '='.repeat(80);
577
+ const dashedLine = '-'.repeat(80);
578
+ console.log(`\n${separator}`);
579
+ console.log('SERVICE PARAMETER DEBUG INFORMATION');
580
+ console.log(`${separator}\n`);
581
+ // Summary statistics
582
+ const totalMethods = methods.length;
583
+ const includedMethods = methods.filter((m) => !m.isExcluded);
584
+ const eventHandlers = methods.filter((m) => m.isEventHandler);
585
+ const withOverrides = methods.filter((m) => m.overrideSchema);
586
+ const withoutOverrides = includedMethods.filter((m) => !m.overrideSchema && !m.isExcluded);
587
+ console.log('📊 SUMMARY:');
588
+ console.log(` Total methods found: ${totalMethods}`);
589
+ console.log(` Included in actions: ${includedMethods.length}`);
590
+ console.log(` Event handlers (excluded from actions): ${eventHandlers.length}`);
591
+ console.log(` With param overrides: ${withOverrides.length}`);
592
+ console.log(` Without param overrides: ${withoutOverrides.length}`);
593
+ console.log(`\n${dashedLine}\n`);
594
+ // Filter methods based on options
595
+ let displayMethods = methods;
596
+ if (options.onlyMissingOverrides) {
597
+ displayMethods = displayMethods.filter((m) => !m.overrideSchema && !m.isExcluded);
598
+ }
599
+ if (options.onlyIncluded) {
600
+ displayMethods = displayMethods.filter((m) => !m.isExcluded);
601
+ }
602
+ if (!options.showExcluded) {
603
+ displayMethods = displayMethods.filter((m) => !m.isExcluded);
604
+ }
605
+ // Print each method
606
+ displayMethods.forEach((info, index) => {
607
+ let status;
608
+ if (info.isExcluded) {
609
+ status = '❌ EXCLUDED';
610
+ }
611
+ else if (info.isEventHandler) {
612
+ status = '📡 EVENT HANDLER';
613
+ }
614
+ else if (info.overrideSchema) {
615
+ status = '✅ HAS OVERRIDE';
616
+ }
617
+ else {
618
+ status = '⚠️ NEEDS OVERRIDE';
619
+ }
620
+ console.log(`${index + 1}. ${info.methodName} ${status}`);
621
+ console.log(` Signature: ${info.functionSignature}`);
622
+ console.log(` Parameters: [${info.paramNames.join(', ')}]`);
623
+ if (info.inferredSchema) {
624
+ console.log(` Inferred: ${JSON.stringify(info.inferredSchema)}`);
625
+ }
626
+ if (info.overrideSchema) {
627
+ console.log(` Override: ${JSON.stringify(info.overrideSchema)}`);
628
+ }
629
+ console.log('');
630
+ });
631
+ // Suggestions
632
+ if (withoutOverrides.length > 0 && !options.onlyMissingOverrides) {
633
+ console.log(`\n${separator}`);
634
+ console.log('💡 SUGGESTIONS:');
635
+ console.log(`${separator}\n`);
636
+ console.log('The following methods use default "object" validation:');
637
+ console.log('Consider adding paramOverrides for better type safety:\n');
638
+ const suggestions = [];
639
+ withoutOverrides.forEach((info) => {
640
+ const params = info.paramNames.map((p) => `${p}: 'string'`).join(', ');
641
+ suggestions.push(` ${info.methodName}: { ${params} },`);
642
+ });
643
+ console.log('paramOverrides: {');
644
+ console.log(suggestions.join('\n'));
645
+ console.log('}');
646
+ }
647
+ console.log(`\n${separator}\n`);
648
+ }
649
+ // Implement the namespace extensions
650
+ Moleculer.generateAutoInferredActions = generateAutoInferredServiceActions;
651
+ Moleculer.generateActionsAndEvents = generateServiceActionsAndEvents;
652
+ Moleculer.debugServiceParams = debugServiceParams;
653
+ Moleculer.printServiceParams = printServiceParams;export{createTypedAction,debugServiceParams,generateAutoInferredServiceActions,generateServiceActions,generateServiceActionsAndEvents,generateTypeSafeServiceActions,printServiceParams,verifyAllParamsDefined};//# sourceMappingURL=typedMoleculerService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typedMoleculerService.js","sources":["../../src/moleculer-generation/typedMoleculerService.ts"],"sourcesContent":[null],"names":[],"mappings":"+GAAA;AACA;;;;AAIG;AAkEH;;AAEG;AACH,SAAS,WAAW,CAAC,SAAiB,EAAA;IAClC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,KAAK,GAAG,CAAC,CAAC;AAEd,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAE1B,QAAA,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE;AAC9D,YAAA,KAAK,EAAE,CAAC;YACR,OAAO,IAAI,IAAI,CAAC;SACnB;AAAM,aAAA,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE;AACrE,YAAA,KAAK,EAAE,CAAC;YACR,OAAO,IAAI,IAAI,CAAC;SACnB;aAAM,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE;AACpC,YAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,EAAE,CAAC;SAChB;aAAM;YACH,OAAO,IAAI,IAAI,CAAC;SACnB;KACJ;IAED,IAAI,OAAO,EAAE;AACT,QAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KACxB;AAED,IAAA,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;AAEG;AACH,SAAS,kBAAkB,CAAC,cAAsB,EAAA;AAC9C,IAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;;IAGnC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;AACvF,QAAA,OAAO,OAAO,CAAC;KAClB;;AAGD,IAAA,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,QAAQ,CAAC;AAC5D,IAAA,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,QAAQ,CAAC;AAC5D,IAAA,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;AAAE,QAAA,OAAO,SAAS,CAAC;;IAG/D,IAAI,IAAI,KAAK,MAAM;AAAE,QAAA,OAAO,MAAM,CAAC;IACnC,IAAI,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,QAAQ,CAAC;;AAGvC,IAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;;AAEnD,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC;AAC5E,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3B,YAAA,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9C;;AAED,QAAA,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC;AAAE,YAAA,OAAO,QAAQ,CAAC;AAC9D,QAAA,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC;AAAE,YAAA,OAAO,QAAQ,CAAC;AAC9D,QAAA,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;AAAE,YAAA,OAAO,SAAS,CAAC;KACnE;;AAGD,IAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAChD,QAAA,OAAO,QAAQ,CAAC;KACnB;;AAGD,IAAA,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;AAEG;AACH,SAAS,oBAAoB,CAAC,YAAoB,EAAA;;IAE9C,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC9F,QAAA,OAAO,QAAQ,CAAC;KACnB;;AAGD,IAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;AACtC,QAAA,OAAO,QAAQ,CAAC;KACnB;;IAGD,IAAI,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,OAAO,EAAE;AACrD,QAAA,OAAO,SAAS,CAAC;KACpB;;AAGD,IAAA,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC9B,QAAA,OAAO,OAAO,CAAC;KAClB;;AAGD,IAAA,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC9B,QAAA,OAAO,QAAQ,CAAC;KACnB;AAED,IAAA,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;;AAGG;AACH,SAAS,sBAAsB,CAAC,OAAe,EAAA;;IAE3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;AACtE,IAAA,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,EAAE,CAAC;IAEnC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,IAAA,IAAI,CAAC,SAAS;AAAE,QAAA,OAAO,EAAE,CAAC;IAE1B,MAAM,MAAM,GAA6D,EAAE,CAAC;;AAG5E,IAAA,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;AAE1C,IAAA,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACzB,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,OAAO;YAAE,OAAO;;QAGrB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;;;QAIvC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;AACjF,QAAA,IAAI,CAAC,UAAU;YAAE,OAAO;AAExB,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QAC7C,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;;AAG3C,QAAA,IAAI,aAAa,GAAG,QAAQ,CAAC;QAE7B,IAAI,cAAc,EAAE;AAChB,YAAA,aAAa,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;SACtD;aAAM,IAAI,YAAY,EAAE;AACrB,YAAA,aAAa,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;SACtD;QAED,MAAM,CAAC,IAAI,CAAC;YACR,IAAI;AACJ,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,QAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC,YAAY;AACvC,SAAA,CAAC,CAAC;AACP,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,MAAM,CAAC;AAClB,CAAC;AA+FD;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDG;SACa,kCAAkC,CAC9C,OAAiB,EACjB,SAA6C,EAAE,EAAA;IAE/C,MAAM,EAAE,cAAc,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE,iBAAiB,GAAG,EAAE,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IACzG,MAAM,OAAO,GAA6F,EAAE,CAAC;;AAG7G,IAAA,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAE3C,IAAA,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;;QAEpB,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC9C,OAAO;SACV;;QAGD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAA+B,CAAC,EAAE;gBACpD,OAAO;aACV;SACJ;;AAEI,aAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,GAA+B,CAAC,EAAE;YACxD,OAAO;SACV;AAED,QAAA,MAAM,MAAM,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAC;AACzD,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;YAC9B,OAAO;SACV;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACjD,QAAA,MAAM,aAAa,GAAI,OAAmC,CAAC,UAAU,CAAC,CAAC;AAEvE,QAAA,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE;YACrC,OAAO;SACV;;AAGD,QAAA,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;AACzC,QAAA,MAAM,eAAe,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;;AAGxD,QAAA,IAAI,WAAgD,CAAC;;AAGrD,QAAA,IAAI,cAAc,CAAC,GAAkC,CAAC,EAAE;AACpD,YAAA,WAAW,GAAG,cAAc,CAAC,GAAkC,CAA4B,CAAC;SAC/F;AAAM,aAAA,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;;YAEnC,WAAW,GAAG,eAAe,CAAC,MAAM,CAChC,CAAC,GAAG,EAAE,KAAK,KAAI;AACX,gBAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;AAChB,oBAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;iBAC1D;qBAAM;oBACH,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;iBAChC;AACD,gBAAA,OAAO,GAAG,CAAC;aACd,EACD,EAA6B,CAChC,CAAC;SACL;;AAGD,QAAA,MAAM,kBAAkB,GAAG,YAAY,CAAC,GAAgC,CAAC,CAAC;;AAG1E,QAAA,MAAM,MAAM,GACR;AACI,YAAA,IAAI,WAAW,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;AAC/C,YAAA,OAAO,EAAE,CAAC,GAAwC,KAAI;AAClD,gBAAA,MAAM,MAAM,GAAI,OAA2D,CAAC,UAAU,CAAC,CAAC;AACxF,gBAAA,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACxC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;aAC1E;SACJ,CAAC;;QAGN,IAAI,kBAAkB,EAAE;AACpB,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;SAC7C;AAED,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;AAC1B,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;SACa,+BAA+B,CAC3C,OAAiB,EACjB,SAA6C,EAAE,EAAA;;IAS/C,MAAM,aAAa,GAAG,SAAS,CAAC,gBAAgB,CAAC,OAAiB,CAAC,CAAC;AACpE,IAAA,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;;AAG5E,IAAA,MAAM,aAAa,GAAuC;AACtD,QAAA,GAAG,MAAM;AACT,QAAA,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAI,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAqC,CAAC;KAChH,CAAC;IAEF,MAAM,OAAO,GAAG,kCAAkC,CAAW,OAAO,EAAE,aAAa,CAAC,CAAC;;IAGrF,MAAM,MAAM,GAA2E,EAAE,CAAC;AAE1F,IAAA,aAAa,CAAC,OAAO,CAAC,CAAC,QAAwC,KAAI;QAC/D,MAAM,MAAM,GAAI,OAAmC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAEzE,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAC9B,YAAA,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG;AACzB,gBAAA,OAAO,EAAE,OAAO,GAAoC,KAAI;;oBAEpD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC;oBACjD,OAAQ,MAA0C,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;iBAC/E;AACD,gBAAA,IAAI,QAAQ,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;aACvD,CAAC;SACL;AACL,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC;AA6CD;;;;;;;;;;;;;;;;;;;;AAoBG;SACa,sBAAsB,CAClC,OAAiB,EACjB,SAA2B,EAAE,EAAA;AAE7B,IAAA,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,iBAAiB,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IACrE,MAAM,OAAO,GAA6F,EAAE,CAAC;;AAG7G,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,MAAM,gBAAgB,GAAa,EAAE,CAAC;AAEtC,IAAA,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;;AAEpB,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACvE,OAAO;SACV;AAED,QAAA,MAAM,MAAM,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAC;;AAGzD,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;YAC9B,OAAO;SACV;;QAGD,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACjD,QAAA,MAAM,aAAa,GAAI,OAAmC,CAAC,UAAU,CAAC,CAAC;AAEvE,QAAA,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE;YACrC,OAAO;SACV;AAED,QAAA,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;QAG3B,OAAO,CAAC,GAAG,CAAC,GAAG;YACX,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;AAC/C,YAAA,OAAO,EAAE,CAAC,GAAwC,KAAI;;AAElD,gBAAA,MAAM,MAAM,GAAI,OAA2D,CAAC,UAAU,CAAC,CAAC;;;AAIxF,gBAAA,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAExC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;aAC1E;SACJ,CAAC;AACN,KAAC,CAAC,CAAC;;IAGH,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE;AACvC,QAAA,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAClF,QAAA,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,IAAI,CACR,yFAAyF,EACzF,oBAAoB,CACvB,CAAC;SACL;KACJ;AAED,IAAA,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;AAmBG;AACa,SAAA,8BAA8B,CAC1C,OAAiB,EACjB,MAAsC,EAAA;;AAGtC,IAAA,OAAO,sBAAsB,CAAC,OAA6C,EAAE,MAA0B,CAAC,CAAC;AAC7G,CAAC;AAED;;;;;;;;;;;;;;;;AAgBG;SACa,sBAAsB,CAClC,OAAiB,EACjB,SAA2B,EAAE,EAAA;IAE7B,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;AAC7C,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,MAAM,aAAa,GAAa,EAAE,CAAC;AAEnC,IAAA,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;;AAEpB,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACvE,OAAO;SACV;AAED,QAAA,MAAM,MAAM,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAC;;AAGzD,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;YAC9B,OAAO;SACV;;AAGD,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;AACd,YAAA,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC3B;AACL,KAAC,CAAC,CAAC;AAEH,IAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1B,QAAA,MAAM,YAAY,GAAG;AACjB,YAAA,CAAA,sCAAA,EAAyC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAE,CAAA;YACnE,EAAE;YACF,kCAAkC;AAClC,YAAA,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,wBAAA,CAA0B,CAAC;AAC1E,SAAA,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,QAAA,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;KACjC;AACL,CAAC;AAqED;;AAEG;AACG,SAAU,iBAAiB,CAC7B,MAA4C,EAAA;AAE5C,IAAA,OAAO,MAAM,CAAC;AAClB,CAAC;AA4FD;;;;;;;;;;;;;;;;;;;;;;AAsBG;SACa,kBAAkB,CAC9B,OAAiB,EACjB,SAA6C,EAAE,EAAA;AAa/C,IAAA,MAAM,EAAE,cAAc,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAE9D,MAAM,MAAM,GAWR,EAAE,CAAC;;AAGP,IAAA,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;;IAG3C,MAAM,aAAa,GAAG,SAAS,CAAC,gBAAgB,CAAC,OAAiB,CAAC,CAAC;AACpE,IAAA,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAE5E,IAAA,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;;QAEpB,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC9C,OAAO;SACV;AAED,QAAA,MAAM,MAAM,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAC;AACzD,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;YAC9B,OAAO;SACV;;QAGD,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,UAAU,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAA+B,CAAC,CAAC;SACnE;aAAM;YACH,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAA+B,CAAC,IAAI,cAAc,CAAC;SACpF;;AAGD,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;AAClC,QAAA,MAAM,eAAe,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;;QAGxD,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC7F,MAAM,SAAS,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;;AAGpF,QAAA,IAAI,cAAmD,CAAC;AACxD,QAAA,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5B,cAAc,GAAG,eAAe,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,KAAK,KAAI;AACX,gBAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;AAChB,oBAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;iBAC1D;qBAAM;oBACH,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;iBAChC;AACD,gBAAA,OAAO,GAAG,CAAC;aACd,EACD,EAA6B,CAChC,CAAC;SACL;;AAGD,QAAA,MAAM,cAAc,GAAG,cAAc,CAAC,GAAkC,CAEzD,CAAC;QAEhB,MAAM,CAAC,GAAG,CAAC,GAAG;AACV,YAAA,UAAU,EAAE,GAAG;AACf,YAAA,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AAC9C,YAAA,iBAAiB,EAAE,SAAS;YAC5B,cAAc;YACd,cAAc;YACd,UAAU;YACV,cAAc;SACjB,CAAC;AACN,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;AAqBG;AACG,SAAU,kBAAkB,CAC9B,OAAiB,EACjB,MAA6C,GAAA,EAAE,EAC/C,OAAA,GAII,EAAE,EAAA;IAEN,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEzC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElC,IAAA,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAA,CAAE,CAAC,CAAC;AAC9B,IAAA,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;AACnD,IAAA,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA,EAAA,CAAI,CAAC,CAAC;;AAG9B,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;AACpC,IAAA,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AAC7D,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC;AAC9D,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC;IAC9D,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AAE3F,IAAA,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC3B,IAAA,OAAO,CAAC,GAAG,CAAC,0BAA0B,YAAY,CAAA,CAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,CAAA,uBAAA,EAA0B,eAAe,CAAC,MAAM,CAAE,CAAA,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,CAAA,0CAAA,EAA6C,aAAa,CAAC,MAAM,CAAE,CAAA,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,CAAA,wBAAA,EAA2B,aAAa,CAAC,MAAM,CAAE,CAAA,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,CAAA,2BAAA,EAA8B,gBAAgB,CAAC,MAAM,CAAE,CAAA,CAAC,CAAC;AACrE,IAAA,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAA,EAAA,CAAI,CAAC,CAAC;;IAGjC,IAAI,cAAc,GAAG,OAAO,CAAC;AAC7B,IAAA,IAAI,OAAO,CAAC,oBAAoB,EAAE;QAC9B,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;KACrF;AACD,IAAA,IAAI,OAAO,CAAC,YAAY,EAAE;AACtB,QAAA,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;KAChE;AACD,IAAA,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AACvB,QAAA,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;KAChE;;IAGD,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACnC,QAAA,IAAI,MAAc,CAAC;AACnB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,MAAM,GAAG,YAAY,CAAC;SACzB;AAAM,aAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YAC5B,MAAM,GAAG,kBAAkB,CAAC;SAC/B;AAAM,aAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YAC5B,MAAM,GAAG,gBAAgB,CAAC;SAC7B;aAAM;YACH,MAAM,GAAG,oBAAoB,CAAC;SACjC;AAED,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,KAAK,GAAG,CAAC,CAAK,EAAA,EAAA,IAAI,CAAC,UAAU,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAC,iBAAiB,CAAE,CAAA,CAAC,CAAC;AACvD,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,gBAAA,EAAmB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AAE9D,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,aAAA,EAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA,CAAE,CAAC,CAAC;SACtE;AAED,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,aAAA,EAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA,CAAE,CAAC,CAAC;SACtE;AAED,QAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACpB,KAAC,CAAC,CAAC;;IAGH,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE;AAC9D,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAA,CAAE,CAAC,CAAC;AAC9B,QAAA,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAC/B,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA,EAAA,CAAI,CAAC,CAAC;AAC9B,QAAA,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;AACtE,QAAA,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAExE,MAAM,WAAW,GAAa,EAAE,CAAC;AACjC,QAAA,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,EAAG,CAAC,CAAY,UAAA,CAAA,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,WAAW,CAAC,IAAI,CAAC,CAAK,EAAA,EAAA,IAAI,CAAC,UAAU,CAAO,IAAA,EAAA,MAAM,CAAK,GAAA,CAAA,CAAC,CAAC;AAC7D,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACpC,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KACpB;AAED,IAAA,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAA,EAAA,CAAI,CAAC,CAAC;AACpC,CAAC;AAED;AACA,SAAS,CAAC,2BAA2B,GAAG,kCAAkC,CAAC;AAC3E,SAAS,CAAC,wBAAwB,GAAG,+BAA+B,CAAC;AACrE,SAAS,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;AAClD,SAAS,CAAC,kBAAkB,GAAG,kBAAkB"}