taon 19.0.53 → 19.0.55
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/browser/fesm2022/taon.mjs +389 -222
- package/browser/fesm2022/taon.mjs.map +1 -1
- package/browser/lib/base-classes/base-controller.d.ts +11 -0
- package/browser/lib/base-classes/base-file-upload.middleware.d.ts +15 -0
- package/browser/lib/base-classes/base-middleware.d.ts +30 -8
- package/browser/lib/decorators/classes/controller-config.d.ts +10 -0
- package/browser/lib/decorators/classes/controller-decorator.d.ts +2 -12
- package/browser/lib/decorators/classes/controller-options.d.ts +12 -0
- package/browser/lib/decorators/classes/entity-decorator.d.ts +2 -2
- package/browser/lib/decorators/classes/middleware-decorator.d.ts +2 -2
- package/browser/lib/decorators/classes/migration-decorator.d.ts +2 -2
- package/browser/lib/decorators/classes/provider-decorator.d.ts +2 -2
- package/browser/lib/decorators/classes/repository-decorator.d.ts +2 -2
- package/browser/lib/decorators/classes/subscriber-decorator.d.ts +2 -2
- package/browser/lib/decorators/decorator-abstract-opt.d.ts +4 -0
- package/browser/lib/decorators/http/http-methods-decorators.d.ts +8 -5
- package/browser/lib/endpoint-context.d.ts +3 -2
- package/browser/lib/helpers/class-helpers.d.ts +7 -3
- package/browser/lib/helpers/taon-helpers.d.ts +2 -1
- package/browser/lib/index.d.ts +2 -1
- package/browser/lib/models.d.ts +16 -23
- package/browser/package.json +1 -1
- package/lib/base-classes/base-context.js +4 -0
- package/lib/base-classes/base-context.js.map +1 -1
- package/lib/base-classes/base-controller.d.ts +12 -0
- package/lib/base-classes/base-controller.js +56 -1
- package/lib/base-classes/base-controller.js.map +1 -1
- package/lib/base-classes/base-file-upload.middleware.d.ts +14 -0
- package/lib/base-classes/base-file-upload.middleware.js +85 -0
- package/lib/base-classes/base-file-upload.middleware.js.map +1 -0
- package/lib/base-classes/base-middleware.d.ts +30 -12
- package/lib/base-classes/base-middleware.js.map +1 -1
- package/lib/build-info._auto-generated_.d.ts +1 -1
- package/lib/build-info._auto-generated_.js +1 -1
- package/lib/decorators/classes/controller-config.d.ts +9 -0
- package/lib/decorators/classes/controller-config.js +11 -0
- package/lib/decorators/classes/controller-config.js.map +1 -0
- package/lib/decorators/classes/controller-decorator.d.ts +2 -12
- package/lib/decorators/classes/controller-decorator.js +0 -13
- package/lib/decorators/classes/controller-decorator.js.map +1 -1
- package/lib/decorators/classes/controller-options.d.ts +11 -0
- package/lib/decorators/classes/controller-options.js +16 -0
- package/lib/decorators/classes/controller-options.js.map +1 -0
- package/lib/decorators/classes/entity-decorator.d.ts +2 -2
- package/lib/decorators/classes/entity-decorator.js +7 -9
- package/lib/decorators/classes/entity-decorator.js.map +1 -1
- package/lib/decorators/classes/middleware-decorator.d.ts +2 -2
- package/lib/decorators/classes/middleware-decorator.js +2 -2
- package/lib/decorators/classes/middleware-decorator.js.map +1 -1
- package/lib/decorators/classes/migration-decorator.d.ts +2 -2
- package/lib/decorators/classes/migration-decorator.js +2 -2
- package/lib/decorators/classes/migration-decorator.js.map +1 -1
- package/lib/decorators/classes/provider-decorator.d.ts +2 -2
- package/lib/decorators/classes/provider-decorator.js +2 -2
- package/lib/decorators/classes/provider-decorator.js.map +1 -1
- package/lib/decorators/classes/repository-decorator.d.ts +2 -2
- package/lib/decorators/classes/repository-decorator.js +2 -2
- package/lib/decorators/classes/repository-decorator.js.map +1 -1
- package/lib/decorators/classes/subscriber-decorator.d.ts +2 -2
- package/lib/decorators/classes/subscriber-decorator.js +2 -2
- package/lib/decorators/classes/subscriber-decorator.js.map +1 -1
- package/lib/decorators/decorator-abstract-opt.d.ts +3 -0
- package/lib/decorators/decorator-abstract-opt.js +8 -0
- package/lib/decorators/decorator-abstract-opt.js.map +1 -0
- package/lib/decorators/http/http-methods-decorators.d.ts +8 -5
- package/lib/decorators/http/http-methods-decorators.js +3 -2
- package/lib/decorators/http/http-methods-decorators.js.map +1 -1
- package/lib/endpoint-context.d.ts +3 -2
- package/lib/endpoint-context.js +121 -71
- package/lib/endpoint-context.js.map +1 -1
- package/lib/helpers/class-helpers.d.ts +7 -3
- package/lib/helpers/class-helpers.js +12 -6
- package/lib/helpers/class-helpers.js.map +1 -1
- package/lib/helpers/taon-helpers.d.ts +2 -1
- package/lib/helpers/taon-helpers.js +1 -1
- package/lib/helpers/taon-helpers.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js.map +1 -1
- package/lib/models.d.ts +17 -25
- package/lib/models.js +4 -31
- package/lib/models.js.map +1 -1
- package/lib/ui/index.js +2 -2
- package/lib/ui/taon-admin-mode-configuration/index.js +2 -2
- package/package.json +1 -1
- package/websql/fesm2022/taon.mjs +386 -217
- package/websql/fesm2022/taon.mjs.map +1 -1
- package/websql/lib/base-classes/base-controller.d.ts +11 -0
- package/websql/lib/base-classes/base-file-upload.middleware.d.ts +15 -0
- package/websql/lib/base-classes/base-middleware.d.ts +30 -12
- package/websql/lib/decorators/classes/controller-config.d.ts +10 -0
- package/websql/lib/decorators/classes/controller-decorator.d.ts +2 -12
- package/websql/lib/decorators/classes/controller-options.d.ts +12 -0
- package/websql/lib/decorators/classes/entity-decorator.d.ts +2 -2
- package/websql/lib/decorators/classes/middleware-decorator.d.ts +2 -2
- package/websql/lib/decorators/classes/migration-decorator.d.ts +2 -2
- package/websql/lib/decorators/classes/provider-decorator.d.ts +2 -2
- package/websql/lib/decorators/classes/repository-decorator.d.ts +2 -2
- package/websql/lib/decorators/classes/subscriber-decorator.d.ts +2 -2
- package/websql/lib/decorators/decorator-abstract-opt.d.ts +4 -0
- package/websql/lib/decorators/http/http-methods-decorators.d.ts +8 -5
- package/websql/lib/endpoint-context.d.ts +3 -2
- package/websql/lib/helpers/class-helpers.d.ts +7 -3
- package/websql/lib/helpers/taon-helpers.d.ts +2 -1
- package/websql/lib/index.d.ts +2 -1
- package/websql/lib/models.d.ts +17 -25
- package/websql/package.json +1 -1
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
+
import type { Models } from '../models';
|
|
2
3
|
import { BaseInjector } from './base-injector';
|
|
4
|
+
export interface MulterFileUploadResponse {
|
|
5
|
+
ok: boolean;
|
|
6
|
+
originalName: string;
|
|
7
|
+
savedAs: string;
|
|
8
|
+
savedPath: string;
|
|
9
|
+
size: number;
|
|
10
|
+
mimetype: string;
|
|
11
|
+
}
|
|
3
12
|
export declare class BaseController extends BaseInjector {
|
|
13
|
+
uploadFormDataToServer(formData: FormData): Models.Http.Response<MulterFileUploadResponse[]>;
|
|
14
|
+
uploadLocalFileToServer(absFilePath: string): Promise<MulterFileUploadResponse[]>;
|
|
4
15
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import express from 'express';
|
|
3
|
+
import * as multer from 'multer';
|
|
4
|
+
import { TaonServerMiddlewareInterceptOptions } from 'ng2-rest/browser';
|
|
5
|
+
import { BaseMiddleware, TaonAddtionalMiddlewareMethodInfo } from './base-middleware';
|
|
6
|
+
/**
|
|
7
|
+
* Configurable file upload middleware (multer based)
|
|
8
|
+
*/
|
|
9
|
+
export declare class BaseFileUploadMiddleware extends BaseMiddleware {
|
|
10
|
+
interceptServerMethod({ req, res, next }: TaonServerMiddlewareInterceptOptions, { methodName, expressPath }: TaonAddtionalMiddlewareMethodInfo): Promise<void>;
|
|
11
|
+
uploadDir(): string;
|
|
12
|
+
storage(): multer.StorageEngine;
|
|
13
|
+
upload(): multer.Multer;
|
|
14
|
+
middleware(): express.RequestHandler;
|
|
15
|
+
}
|
|
@@ -1,17 +1,39 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import type {
|
|
2
|
+
import type { AxiosResponse } from 'axios';
|
|
3
|
+
import { TaonClientMiddlewareInterceptOptions, TaonServerMiddlewareInterceptOptions } from 'ng2-rest/browser';
|
|
4
|
+
import { Observable } from 'rxjs';
|
|
5
|
+
import { CoreModels } from 'tnp-core/browser';
|
|
3
6
|
import { BaseInjector } from './base-injector';
|
|
4
|
-
export interface TaonMiddlewareInterceptOptions {
|
|
5
|
-
client?: {
|
|
6
|
-
req: AxiosRequestConfig<unknown>;
|
|
7
|
-
} | undefined;
|
|
8
|
-
server?: {} | undefined;
|
|
9
|
-
}
|
|
10
7
|
/**
|
|
11
8
|
* TODO
|
|
12
9
|
* - global provider available in all contexts
|
|
13
10
|
* - provider available in own context
|
|
14
11
|
*/
|
|
15
12
|
export declare abstract class BaseMiddleware extends BaseInjector {
|
|
16
|
-
|
|
13
|
+
}
|
|
14
|
+
export interface TaonAddtionalMiddlewareMethodInfo {
|
|
15
|
+
methodName: string;
|
|
16
|
+
expressPath: string;
|
|
17
|
+
httpRequestType: CoreModels.HttpMethod;
|
|
18
|
+
}
|
|
19
|
+
export interface BaseMiddleware {
|
|
20
|
+
/**
|
|
21
|
+
* Global interceptor for whole context
|
|
22
|
+
* backend request
|
|
23
|
+
*/
|
|
24
|
+
interceptServer({ req, res, next, }: TaonServerMiddlewareInterceptOptions): Promise<void> | void;
|
|
25
|
+
/**
|
|
26
|
+
* Global interceptor for whole context
|
|
27
|
+
* client requests
|
|
28
|
+
*/
|
|
29
|
+
interceptClient({ req, next, }: TaonClientMiddlewareInterceptOptions): Observable<AxiosResponse<any>>;
|
|
30
|
+
/**
|
|
31
|
+
* Specyfic controller method interceptor
|
|
32
|
+
*/
|
|
33
|
+
interceptServerMethod({ req, res, next }: TaonServerMiddlewareInterceptOptions, { methodName, expressPath, httpRequestType }: TaonAddtionalMiddlewareMethodInfo): Promise<void> | void;
|
|
34
|
+
/**
|
|
35
|
+
* Controller method frontned interceptor
|
|
36
|
+
* TODO not needed ?
|
|
37
|
+
*/
|
|
38
|
+
interceptClientMethod({ req, next }: TaonClientMiddlewareInterceptOptions, { methodName, expressPath, httpRequestType }: TaonAddtionalMiddlewareMethodInfo): Observable<AxiosResponse<any>>;
|
|
17
39
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { Models } from '../../models';
|
|
3
|
+
import { TaonControllerOptions } from './controller-options';
|
|
4
|
+
export declare class ControllerConfig extends TaonControllerOptions {
|
|
5
|
+
methods: {
|
|
6
|
+
[methodName: string]: Models.MethodConfig;
|
|
7
|
+
};
|
|
8
|
+
calculatedPath?: string;
|
|
9
|
+
browserTransformFn?: (entity: any) => any;
|
|
10
|
+
}
|
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import {
|
|
2
|
+
import type { TaonControllerOptions } from './controller-options';
|
|
3
3
|
/**
|
|
4
4
|
* Controller decorator
|
|
5
5
|
*/
|
|
6
|
-
export declare function TaonController(options?: TaonControllerOptions): (constructor: Function) => void;
|
|
7
|
-
export declare class TaonControllerOptions extends Models.DecoratorAbstractOpt {
|
|
8
|
-
/**
|
|
9
|
-
* typeorm realtime subscribtion // TODO disabled for now, does not make sense ?s
|
|
10
|
-
*/
|
|
11
|
-
realtime?: boolean;
|
|
12
|
-
/**
|
|
13
|
-
* override default path for controller api
|
|
14
|
-
*/
|
|
15
|
-
path?: string;
|
|
16
|
-
}
|
|
6
|
+
export declare function TaonController<ControllerClass = any>(options?: TaonControllerOptions<ControllerClass>): (constructor: Function) => void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { DecoratorAbstractOpt } from '../decorator-abstract-opt';
|
|
3
|
+
export declare class TaonControllerOptions<ControllerClass = any> extends DecoratorAbstractOpt {
|
|
4
|
+
/**
|
|
5
|
+
* typeorm realtime subscribtion // TODO disabled for now, does not make sense ?s
|
|
6
|
+
*/
|
|
7
|
+
realtime?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* override default path for controller api
|
|
10
|
+
*/
|
|
11
|
+
path?: string;
|
|
12
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
import { Mapping } from 'ng2-rest/browser';
|
|
3
|
-
import {
|
|
3
|
+
import { DecoratorAbstractOpt } from '../decorator-abstract-opt';
|
|
4
4
|
/**
|
|
5
5
|
* Entity decorator
|
|
6
6
|
*/
|
|
7
7
|
export declare function TaonEntity<T = any>(options?: TaonEntityOptions<T>): (constructor: Function) => void;
|
|
8
|
-
export declare class TaonEntityOptions<T = any> extends
|
|
8
|
+
export declare class TaonEntityOptions<T = any> extends DecoratorAbstractOpt {
|
|
9
9
|
/**
|
|
10
10
|
* default unique property is "id"
|
|
11
11
|
* for your entity it may be something else
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import {
|
|
2
|
+
import { DecoratorAbstractOpt } from '../decorator-abstract-opt';
|
|
3
3
|
/**
|
|
4
4
|
* Provider decorator
|
|
5
5
|
*/
|
|
6
6
|
export declare function TaonMiddleware<T = any>(options?: TaonMiddlewareOptions<T>): (constructor: Function) => void;
|
|
7
|
-
export declare class TaonMiddlewareOptions<T = any> extends
|
|
7
|
+
export declare class TaonMiddlewareOptions<T = any> extends DecoratorAbstractOpt {
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import {
|
|
2
|
+
import { DecoratorAbstractOpt } from '../decorator-abstract-opt';
|
|
3
3
|
/**
|
|
4
4
|
* Migration decorator
|
|
5
5
|
*/
|
|
6
6
|
export declare function TaonMigration(options: TaonMigrationOptions): any;
|
|
7
|
-
export declare class TaonMigrationOptions<T = any> extends
|
|
7
|
+
export declare class TaonMigrationOptions<T = any> extends DecoratorAbstractOpt {
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import {
|
|
2
|
+
import { DecoratorAbstractOpt } from '../decorator-abstract-opt';
|
|
3
3
|
/**
|
|
4
4
|
* Provider decorator
|
|
5
5
|
*/
|
|
6
6
|
export declare function TaonProvider<T = any>(options?: TaonProviderOptions<T>): (constructor: Function) => void;
|
|
7
|
-
export declare class TaonProviderOptions<T = any> extends
|
|
7
|
+
export declare class TaonProviderOptions<T = any> extends DecoratorAbstractOpt {
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import {
|
|
2
|
+
import { DecoratorAbstractOpt } from '../decorator-abstract-opt';
|
|
3
3
|
/**
|
|
4
4
|
* Repository decorator
|
|
5
5
|
*/
|
|
6
6
|
export declare function TaonRepository(options: TaonRepositoryOptions): (constructor: Function) => void;
|
|
7
|
-
export declare class TaonRepositoryOptions<T = any> extends
|
|
7
|
+
export declare class TaonRepositoryOptions<T = any> extends DecoratorAbstractOpt {
|
|
8
8
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import {
|
|
2
|
+
import { DecoratorAbstractOpt } from '../decorator-abstract-opt';
|
|
3
3
|
/**
|
|
4
4
|
* Subscriber decorator
|
|
5
5
|
*/
|
|
6
6
|
export declare function TaonSubscriber(options: TaonSubscriberOptions): any;
|
|
7
|
-
export declare class TaonSubscriberOptions<T = any> extends
|
|
7
|
+
export declare class TaonSubscriberOptions<T = any> extends DecoratorAbstractOpt {
|
|
8
8
|
allowedEvents?: (keyof T)[];
|
|
9
9
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import { CoreModels } from 'tnp-core/browser';
|
|
3
2
|
import { Models as ModelsNg2Rest } from 'ng2-rest/browser';
|
|
3
|
+
import { CoreModels } from 'tnp-core/browser';
|
|
4
|
+
import { BaseMiddleware } from '../../base-classes/base-middleware';
|
|
4
5
|
export interface TaonHttpDecoratorOptions {
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* @deprecated don't use in production - keep stuff encapsulated
|
|
8
|
+
* path is global in express app
|
|
9
|
+
* ! BE CAREFUL ! global path IS NOT GLOBAL inside dockerized app
|
|
10
|
+
* (/api/contextName is automatically added to global path in docker)
|
|
9
11
|
*/
|
|
10
12
|
path?: string;
|
|
11
13
|
/**
|
|
@@ -14,7 +16,8 @@ export interface TaonHttpDecoratorOptions {
|
|
|
14
16
|
*/
|
|
15
17
|
pathIsGlobal?: boolean;
|
|
16
18
|
overrideContentType?: CoreModels.ContentType;
|
|
17
|
-
|
|
19
|
+
overrideResponseType?: ModelsNg2Rest.ResponseTypeAxios;
|
|
20
|
+
middlewares?: (typeof BaseMiddleware)[];
|
|
18
21
|
}
|
|
19
22
|
export declare function GET(pathOrOptions?: string | TaonHttpDecoratorOptions, pathIsGlobal?: boolean): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void;
|
|
20
23
|
export declare function HEAD(pathOrOptions?: string | TaonHttpDecoratorOptions, pathIsGlobal?: boolean): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void;
|
|
@@ -4,7 +4,6 @@ import type { NgZone } from '@angular/core';
|
|
|
4
4
|
import type { Application } from 'express';
|
|
5
5
|
import { DataSource } from 'taon-typeorm/browser';
|
|
6
6
|
import type { BaseInjector } from './base-classes/base-injector';
|
|
7
|
-
export type { TaonMiddlewareInterceptOptions } from './base-classes/base-middleware';
|
|
8
7
|
import { ContextDbMigrations } from './context-db-migrations';
|
|
9
8
|
import { Models } from './models';
|
|
10
9
|
export declare class EndpointContext {
|
|
@@ -139,6 +138,7 @@ export declare class EndpointContext {
|
|
|
139
138
|
* ipc/udp needs this
|
|
140
139
|
*/
|
|
141
140
|
get contextName(): string;
|
|
141
|
+
get cwd(): string;
|
|
142
142
|
get activeContext(): string | null;
|
|
143
143
|
get appId(): string;
|
|
144
144
|
get publicAssets(): {
|
|
@@ -156,7 +156,8 @@ export declare class EndpointContext {
|
|
|
156
156
|
initControllers(): Promise<void>;
|
|
157
157
|
writeActiveRoutes(): void;
|
|
158
158
|
get middlewares(): Models.MiddlewareType[];
|
|
159
|
-
private
|
|
159
|
+
private initCustomClientMiddlewares;
|
|
160
|
+
private initCustomBackendMiddlewares;
|
|
160
161
|
private initBackendMiddlewares;
|
|
161
162
|
private initServer;
|
|
162
163
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import {
|
|
2
|
+
import { ControllerConfig } from '../decorators/classes/controller-config';
|
|
3
3
|
export declare namespace ClassHelpers {
|
|
4
4
|
/**
|
|
5
5
|
* TODO - repalce in every place when getting class fn from object
|
|
@@ -12,7 +12,11 @@ export declare namespace ClassHelpers {
|
|
|
12
12
|
const isContextClassObject: (obj: any) => boolean;
|
|
13
13
|
const setName: (target: Function, className: string) => void;
|
|
14
14
|
const hasParentClassWithName: (target: Function, className: string, targets?: any[]) => boolean;
|
|
15
|
-
const getControllerConfig: (target: Function) =>
|
|
15
|
+
const getControllerConfig: (target: Function) => ControllerConfig | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Express async handler for middleware functions.
|
|
18
|
+
*/
|
|
19
|
+
const asyncHandler: (fn: any) => (req: any, res: any, next: any) => void;
|
|
16
20
|
const getMethodsNames: (classOrClassInstance: any, allMethodsNames?: any[]) => string[];
|
|
17
|
-
const getControllerConfigs: (target: Function, configs?:
|
|
21
|
+
const getControllerConfigs: (target: Function, configs?: ControllerConfig[], callerTarget?: Function) => ControllerConfig[];
|
|
18
22
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
+
import type { ControllerConfig } from '../decorators/classes/controller-config';
|
|
2
3
|
import { Models } from '../models';
|
|
3
4
|
export declare namespace TaonHelpers {
|
|
4
5
|
const fillUpTo: (s: string, nCharacters: number) => string;
|
|
5
6
|
const isGoodPath: (p: string) => boolean;
|
|
6
7
|
const tryTransformParam: (param: any) => any;
|
|
7
|
-
const getExpressPath: (c:
|
|
8
|
+
const getExpressPath: (c: ControllerConfig, pathOrClassConfig: Models.MethodConfig) => string;
|
|
8
9
|
const defaultType: (value: any) => {};
|
|
9
10
|
const parseJSONwithStringJSONs: (object: Object, waring?: boolean) => Object;
|
|
10
11
|
const isPlainFileOrFolder: (filePath: any) => boolean;
|
package/browser/lib/index.d.ts
CHANGED
|
@@ -23,12 +23,13 @@ export { BaseProvider } from './base-classes/base-provider';
|
|
|
23
23
|
export { BaseEntity } from './base-classes/base-entity';
|
|
24
24
|
export { BaseContext } from './base-classes/base-context';
|
|
25
25
|
export { BaseMigration } from './base-classes/base-migration';
|
|
26
|
+
export { TaonAddtionalMiddlewareMethodInfo } from './base-classes/base-middleware';
|
|
26
27
|
export { createContext, TaonContext } from './create-context';
|
|
27
28
|
export { inject } from './inject';
|
|
28
29
|
export { Models } from './models';
|
|
29
30
|
export * from './constants';
|
|
30
31
|
export { ClassHelpers } from './helpers/class-helpers';
|
|
31
|
-
export type {
|
|
32
|
+
export type { TaonClientMiddlewareInterceptOptions, TaonServerMiddlewareInterceptOptions, } from 'ng2-rest/browser';
|
|
32
33
|
export declare namespace Taon {
|
|
33
34
|
export import Response = models.Models.Http.Response;
|
|
34
35
|
export import Http = http.Http;
|
package/browser/lib/models.d.ts
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { Response as ExpressResponse, Request as ExpressRequest } from 'express';
|
|
3
3
|
import { Models as ModelsNg2Rest } from 'ng2-rest/browser';
|
|
4
4
|
import { CoreModels } from 'tnp-core/browser';
|
|
5
|
+
import type { BaseMiddleware } from './base-classes/base-middleware';
|
|
6
|
+
import type { TaonHttpDecoratorOptions } from './decorators/http/http-methods-decorators';
|
|
5
7
|
export declare namespace Models {
|
|
6
8
|
type FrameworkMode = 'backend-frontend(tcp+udp)' | 'remote-backend(tcp+udp)' | 'backend-frontend(ipc-electron)' | 'backend-frontend(websql-electron)' | 'backend-frontend(websql)';
|
|
7
9
|
enum ClassType {
|
|
@@ -205,9 +207,10 @@ export declare namespace Models {
|
|
|
205
207
|
serverPath: string;
|
|
206
208
|
locationOnDisk: string;
|
|
207
209
|
}[];
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
210
|
+
/**
|
|
211
|
+
* by default cwd === process.cwd()
|
|
212
|
+
*/
|
|
213
|
+
cwd?: string;
|
|
211
214
|
}
|
|
212
215
|
class ParamConfig {
|
|
213
216
|
paramName: string;
|
|
@@ -216,14 +219,11 @@ export declare namespace Models {
|
|
|
216
219
|
defaultType: any;
|
|
217
220
|
expireInSeconds?: number;
|
|
218
221
|
}
|
|
219
|
-
|
|
222
|
+
/**
|
|
223
|
+
* @link './decorators/http/http-methods-decorators.ts' TaonHttpDecoratorOptions
|
|
224
|
+
*/
|
|
225
|
+
class MethodConfig implements Pick<TaonHttpDecoratorOptions, 'path' | 'middlewares'> {
|
|
220
226
|
methodName: string;
|
|
221
|
-
/**
|
|
222
|
-
* @deprecated don't use in production - keep stuff encapsulated
|
|
223
|
-
* path is global in express app
|
|
224
|
-
* ! BE CAREFUL ! global path IS NOT GLOBAL inside dockerized app
|
|
225
|
-
* (/api/contextName is automatically added to global path in docker)
|
|
226
|
-
*/
|
|
227
227
|
global?: boolean;
|
|
228
228
|
/**
|
|
229
229
|
* override default content type
|
|
@@ -239,18 +239,7 @@ export declare namespace Models {
|
|
|
239
239
|
parameters: {
|
|
240
240
|
[paramName: string]: ParamConfig;
|
|
241
241
|
};
|
|
242
|
-
|
|
243
|
-
class ControllerConfig extends DecoratorAbstractOpt {
|
|
244
|
-
realtime?: boolean;
|
|
245
|
-
path: string;
|
|
246
|
-
uniqueKey?: string;
|
|
247
|
-
methods: {
|
|
248
|
-
[methodName: string]: MethodConfig;
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
class RuntimeControllerConfig extends ControllerConfig {
|
|
252
|
-
calculatedPath?: string;
|
|
253
|
-
browserTransformFn?: (entity: any) => any;
|
|
242
|
+
middlewares?: (typeof BaseMiddleware)[];
|
|
254
243
|
}
|
|
255
244
|
namespace Http {
|
|
256
245
|
export import Rest = ModelsNg2Rest;
|
|
@@ -267,7 +256,11 @@ export declare namespace Models {
|
|
|
267
256
|
type SyncResponseFunc<T> = (options?: ResponseFuncOpt<T>) => SyncResponse<T>;
|
|
268
257
|
type MixResponse<T> = SyncResponse<T> | ExpressContext<T>;
|
|
269
258
|
interface ClientAction<T> {
|
|
270
|
-
|
|
259
|
+
/**
|
|
260
|
+
* @deprecated use request() mehods instead
|
|
261
|
+
*/
|
|
262
|
+
readonly received?: Rest.PromiseObservableMix<Rest.HttpResponse<T>>;
|
|
263
|
+
request?(axiosConfig?: ModelsNg2Rest.Ng2RestAxiosRequestConfig): Rest.PromiseObservableMix<Rest.HttpResponse<T>>;
|
|
271
264
|
}
|
|
272
265
|
interface AsyncResponse<T> {
|
|
273
266
|
(req?: ExpressRequest, res?: ExpressResponse): Promise<SyncResponse<T> | SyncResponseFunc<T>>;
|
package/browser/package.json
CHANGED
|
@@ -2,10 +2,14 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BaseContext = void 0;
|
|
4
4
|
const create_context_1 = require("../create-context");
|
|
5
|
+
const base_file_upload_middleware_1 = require("./base-file-upload.middleware");
|
|
5
6
|
const base_repository_1 = require("./base-repository");
|
|
6
7
|
const BaseContext = (0, create_context_1.createContext)(() => ({
|
|
7
8
|
contextName: 'BaseContext',
|
|
8
9
|
abstract: true,
|
|
10
|
+
middlewares: {
|
|
11
|
+
BaseFileUploadMiddleware: base_file_upload_middleware_1.BaseFileUploadMiddleware,
|
|
12
|
+
},
|
|
9
13
|
repositories: {
|
|
10
14
|
// @ts-ignore
|
|
11
15
|
BaseRepository: base_repository_1.BaseRepository,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-context.js","sourceRoot":"","sources":[""],"names":[],"mappings":";;;AAAA,sDAAkD;AAElD,uDAAmD;AAEnD,MAAM,WAAW,GAAG,IAAA,8BAAa,EAAC,GAAG,EAAE,CAAC,CAAC;IACvC,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,IAAI;IACd,YAAY,EAAE;QACZ,aAAa;QACb,cAAc,EAAd,gCAAc;KACf;CACF,CAAC,CAAC,CAAC;AAEK,kCAAW"}
|
|
1
|
+
{"version":3,"file":"base-context.js","sourceRoot":"","sources":[""],"names":[],"mappings":";;;AAAA,sDAAkD;AAElD,+EAAyE;AACzE,uDAAmD;AAEnD,MAAM,WAAW,GAAG,IAAA,8BAAa,EAAC,GAAG,EAAE,CAAC,CAAC;IACvC,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE;QACX,wBAAwB,EAAxB,sDAAwB;KACzB;IACD,YAAY,EAAE;QACZ,aAAa;QACb,cAAc,EAAd,gCAAc;KACf;CACF,CAAC,CAAC,CAAC;AAEK,kCAAW"}
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
import * as FormData from 'form-data';
|
|
2
|
+
import type { Models } from '../models';
|
|
1
3
|
import { BaseInjector } from './base-injector';
|
|
4
|
+
export interface MulterFileUploadResponse {
|
|
5
|
+
ok: boolean;
|
|
6
|
+
originalName: string;
|
|
7
|
+
savedAs: string;
|
|
8
|
+
savedPath: string;
|
|
9
|
+
size: number;
|
|
10
|
+
mimetype: string;
|
|
11
|
+
}
|
|
2
12
|
export declare class BaseController extends BaseInjector {
|
|
13
|
+
uploadFormDataToServer(formData: FormData): Models.Http.Response<MulterFileUploadResponse[]>;
|
|
14
|
+
uploadLocalFileToServer(absFilePath: string): Promise<MulterFileUploadResponse[]>;
|
|
3
15
|
}
|
|
@@ -5,14 +5,69 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
9
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
10
|
+
};
|
|
8
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
12
|
exports.BaseController = void 0;
|
|
13
|
+
const FormData = require("form-data"); // @backend
|
|
14
|
+
const lib_1 = require("tnp-core/lib"); // @backend
|
|
10
15
|
const controller_decorator_1 = require("../decorators/classes/controller-decorator");
|
|
16
|
+
const http_methods_decorators_1 = require("../decorators/http/http-methods-decorators");
|
|
17
|
+
const http_params_decorators_1 = require("../decorators/http/http-params-decorators");
|
|
18
|
+
const base_file_upload_middleware_1 = require("./base-file-upload.middleware");
|
|
11
19
|
const base_injector_1 = require("./base-injector");
|
|
12
20
|
let BaseController = class BaseController extends base_injector_1.BaseInjector {
|
|
21
|
+
//#region upload form data to server
|
|
22
|
+
uploadFormDataToServer(formData) {
|
|
23
|
+
//#region @backendFunc
|
|
24
|
+
return async (req, res) => {
|
|
25
|
+
const files = req.files;
|
|
26
|
+
if (!files) {
|
|
27
|
+
throw 'No file(s) received';
|
|
28
|
+
}
|
|
29
|
+
return files.map(f => {
|
|
30
|
+
const savedAbs = (0, lib_1.crossPlatformPath)(lib_1.path.resolve(f.path));
|
|
31
|
+
const savedRel = (0, lib_1.crossPlatformPath)(lib_1.path.relative(this.ctx.cwd, savedAbs));
|
|
32
|
+
return {
|
|
33
|
+
ok: true,
|
|
34
|
+
originalName: f.originalname,
|
|
35
|
+
savedAs: lib_1.path.basename(savedAbs),
|
|
36
|
+
savedPath: savedRel,
|
|
37
|
+
size: f.size,
|
|
38
|
+
mimetype: f.mimetype,
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
//#endregion
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
//#region upload local file to server
|
|
46
|
+
async uploadLocalFileToServer(absFilePath) {
|
|
47
|
+
//#region @backendFunc
|
|
48
|
+
const stat = lib_1.fse.statSync(absFilePath);
|
|
49
|
+
const stream = lib_1.fse.createReadStream(absFilePath);
|
|
50
|
+
const form = new FormData();
|
|
51
|
+
form.append('file', stream, {
|
|
52
|
+
filename: lib_1.path.basename(absFilePath),
|
|
53
|
+
knownLength: stat.size,
|
|
54
|
+
});
|
|
55
|
+
const data = await this.uploadFormDataToServer(form).received;
|
|
56
|
+
return data.body.json;
|
|
57
|
+
//#endregion
|
|
58
|
+
}
|
|
13
59
|
};
|
|
14
60
|
exports.BaseController = BaseController;
|
|
61
|
+
__decorate([
|
|
62
|
+
(0, http_methods_decorators_1.POST)({
|
|
63
|
+
overrideContentType: 'multipart/form-data',
|
|
64
|
+
middlewares: [base_file_upload_middleware_1.BaseFileUploadMiddleware],
|
|
65
|
+
}),
|
|
66
|
+
__param(0, (0, http_params_decorators_1.Body)())
|
|
67
|
+
], BaseController.prototype, "uploadFormDataToServer", null);
|
|
15
68
|
exports.BaseController = BaseController = __decorate([
|
|
16
|
-
(0, controller_decorator_1.TaonController)({
|
|
69
|
+
(0, controller_decorator_1.TaonController)({
|
|
70
|
+
className: 'BaseController',
|
|
71
|
+
})
|
|
17
72
|
], BaseController);
|
|
18
73
|
//# sourceMappingURL=base-controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-controller.js","sourceRoot":"","sources":[""],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base-controller.js","sourceRoot":"","sources":[""],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAAsC,CAAC,WAAW;AAClD,sCAA4D,CAAC,WAAW;AAExE,qFAA4E;AAC5E,wFAAkE;AAClE,sFAA8E;AAG9E,+EAAyE;AACzE,mDAA+C;AAcxC,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,4BAAY;IAC9C,oCAAoC;IAKpC,sBAAsB,CACZ,QAAkB;QAE1B,sBAAsB;QACtB,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACxB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,qBAAqB,CAAC;YAC9B,CAAC;YACD,OAAQ,KAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC9B,MAAM,QAAQ,GAAG,IAAA,uBAAiB,EAAC,UAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACzD,MAAM,QAAQ,GAAG,IAAA,uBAAiB,EAChC,UAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CACtC,CAAC;gBACF,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,YAAY,EAAE,CAAC,CAAC,YAAY;oBAC5B,OAAO,EAAE,UAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAChC,SAAS,EAAE,QAAQ;oBACnB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACF,YAAY;IACd,CAAC;IACD,YAAY;IAEZ,qCAAqC;IACrC,KAAK,CAAC,uBAAuB,CAC3B,WAAmB;QAEnB,sBAAsB;QACtB,MAAM,IAAI,GAAG,SAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,SAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE;YAC1B,QAAQ,EAAE,UAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;YACpC,WAAW,EAAE,IAAI,CAAC,IAAI;SACvB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAC9D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACtB,YAAY;IACd,CAAC;CAEF,CAAA;AArDY,wCAAc;AAMzB;IAJC,IAAA,8BAAI,EAAC;QACJ,mBAAmB,EAAE,qBAAqB;QAC1C,WAAW,EAAE,CAAC,sDAAwB,CAAC;KACxC,CAAC;IAEC,WAAA,IAAA,6BAAI,GAAE,CAAA;4DAwBR;yBA/BU,cAAc;IAH1B,IAAA,qCAAc,EAAiB;QAC9B,SAAS,EAAE,gBAAgB;KAC5B,CAAC;GACW,cAAc,CAqD1B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import * as multer from 'multer';
|
|
3
|
+
import { TaonServerMiddlewareInterceptOptions } from 'ng2-rest';
|
|
4
|
+
import { BaseMiddleware, TaonAddtionalMiddlewareMethodInfo } from './base-middleware';
|
|
5
|
+
/**
|
|
6
|
+
* Configurable file upload middleware (multer based)
|
|
7
|
+
*/
|
|
8
|
+
export declare class BaseFileUploadMiddleware extends BaseMiddleware {
|
|
9
|
+
interceptServerMethod({ req, res, next }: TaonServerMiddlewareInterceptOptions, { methodName, expressPath }: TaonAddtionalMiddlewareMethodInfo): Promise<void>;
|
|
10
|
+
uploadDir(): string;
|
|
11
|
+
storage(): multer.StorageEngine;
|
|
12
|
+
upload(): multer.Multer;
|
|
13
|
+
middleware(): express.RequestHandler;
|
|
14
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.BaseFileUploadMiddleware = void 0;
|
|
10
|
+
//#region imports
|
|
11
|
+
const crypto = require("crypto");
|
|
12
|
+
const multer = require("multer");
|
|
13
|
+
const lib_1 = require("tnp-core/lib");
|
|
14
|
+
const middleware_decorator_1 = require("../decorators/classes/middleware-decorator");
|
|
15
|
+
const base_middleware_1 = require("./base-middleware");
|
|
16
|
+
//#endregion
|
|
17
|
+
/**
|
|
18
|
+
* Configurable file upload middleware (multer based)
|
|
19
|
+
*/
|
|
20
|
+
let BaseFileUploadMiddleware = class BaseFileUploadMiddleware extends base_middleware_1.BaseMiddleware {
|
|
21
|
+
async interceptServerMethod({ req, res, next }, { methodName, expressPath }) {
|
|
22
|
+
return this.middleware()(req, res, next);
|
|
23
|
+
}
|
|
24
|
+
//#region upload Dir
|
|
25
|
+
uploadDir() {
|
|
26
|
+
return (0, lib_1.crossPlatformPath)([this.ctx.cwd, 'uploaded-files']);
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region storage
|
|
30
|
+
storage() {
|
|
31
|
+
//#region @backendFunc
|
|
32
|
+
const uploadDir = this.uploadDir();
|
|
33
|
+
if (!lib_1.fse.existsSync(uploadDir)) {
|
|
34
|
+
try {
|
|
35
|
+
lib_1.fse.mkdirSync(uploadDir, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
catch (error) { }
|
|
38
|
+
}
|
|
39
|
+
return multer.diskStorage({
|
|
40
|
+
destination: (_req, _file, cb) => cb(null, uploadDir),
|
|
41
|
+
filename: (_req, file, cb) => {
|
|
42
|
+
const ext = lib_1.path.extname(file.originalname).toLowerCase();
|
|
43
|
+
const base = lib_1.path
|
|
44
|
+
.basename(file.originalname, ext)
|
|
45
|
+
.replace(/[^\w.-]/g, '_');
|
|
46
|
+
const uniq = `${Date.now()}-${crypto.randomBytes(6).toString('hex')}`;
|
|
47
|
+
const filenameToProcess = `${base}-${uniq}${ext}`;
|
|
48
|
+
cb(null, filenameToProcess);
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
//#endregion
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region upload
|
|
55
|
+
upload() {
|
|
56
|
+
//#region @backendFunc
|
|
57
|
+
return multer({
|
|
58
|
+
storage: this.storage(),
|
|
59
|
+
limits: { fileSize: 1024 * 1024 * 1024 }, // 1 GiB cap; tweak as needed
|
|
60
|
+
// TODO implement file filter if needed
|
|
61
|
+
// fileFilter: (_req, file, cb) => {
|
|
62
|
+
// // accept only .zip by filename extension
|
|
63
|
+
// if (path.extname(file.originalname).toLowerCase() !== '.zip') {
|
|
64
|
+
// return cb(new Error('Only .zip files are allowed'));
|
|
65
|
+
// }
|
|
66
|
+
// cb(null, true);
|
|
67
|
+
// },
|
|
68
|
+
});
|
|
69
|
+
//#endregion
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
//#region middleware
|
|
73
|
+
middleware() {
|
|
74
|
+
//#region @backendFunc
|
|
75
|
+
return this.upload().any();
|
|
76
|
+
//#endregion
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
exports.BaseFileUploadMiddleware = BaseFileUploadMiddleware;
|
|
80
|
+
exports.BaseFileUploadMiddleware = BaseFileUploadMiddleware = __decorate([
|
|
81
|
+
(0, middleware_decorator_1.TaonMiddleware)({
|
|
82
|
+
className: 'BaseFileUploadMiddleware',
|
|
83
|
+
})
|
|
84
|
+
], BaseFileUploadMiddleware);
|
|
85
|
+
//# sourceMappingURL=base-file-upload.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-file-upload.middleware.js","sourceRoot":"","sources":[""],"names":[],"mappings":";;;;;;;;;AAAA,iBAAiB;AACjB,iCAAiC;AAGjC,iCAAiC;AAMjC,sCAA4D;AAE5D,qFAA4E;AAE5E,uDAG2B;AAC3B,YAAY;AAEZ;;GAEG;AAII,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,gCAAc;IAC1D,KAAK,CAAC,qBAAqB,CACzB,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAwC,EACxD,EAAE,UAAU,EAAE,WAAW,EAAqC;QAE9D,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,oBAAoB;IACpB,SAAS;QACP,OAAO,IAAA,uBAAiB,EAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,YAAY;IAEZ,iBAAiB;IACjB,OAAO;QACL,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,IAAI,CAAC,SAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,SAAG,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC,CAAA,CAAC;QACpB,CAAC;QACD,OAAO,MAAM,CAAC,WAAW,CAAC;YACxB,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC;YACrD,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;gBAC3B,MAAM,GAAG,GAAG,UAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC1D,MAAM,IAAI,GAAG,UAAI;qBACd,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC;qBAChC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtE,MAAM,iBAAiB,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;gBAClD,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YAC9B,CAAC;SACF,CAAC,CAAC;QACH,YAAY;IACd,CAAC;IACD,YAAY;IAEZ,gBAAgB;IAChB,MAAM;QACJ,sBAAsB;QACtB,OAAO,MAAM,CAAC;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;YACvB,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,6BAA6B;YACvE,uCAAuC;YACvC,oCAAoC;YACpC,8CAA8C;YAC9C,oEAAoE;YACpE,2DAA2D;YAC3D,MAAM;YACN,oBAAoB;YACpB,KAAK;SACN,CAAC,CAAC;QACH,YAAY;IACd,CAAC;IACD,YAAY;IAEZ,oBAAoB;IACpB,UAAU;QACR,sBAAsB;QACtB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;QAC3B,YAAY;IACd,CAAC;CAEF,CAAA;AAjEY,4DAAwB;mCAAxB,wBAAwB;IAHpC,IAAA,qCAAc,EAAC;QACd,SAAS,EAAE,0BAA0B;KACtC,CAAC;GACW,wBAAwB,CAiEpC"}
|