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.
Files changed (106) hide show
  1. package/browser/fesm2022/taon.mjs +389 -222
  2. package/browser/fesm2022/taon.mjs.map +1 -1
  3. package/browser/lib/base-classes/base-controller.d.ts +11 -0
  4. package/browser/lib/base-classes/base-file-upload.middleware.d.ts +15 -0
  5. package/browser/lib/base-classes/base-middleware.d.ts +30 -8
  6. package/browser/lib/decorators/classes/controller-config.d.ts +10 -0
  7. package/browser/lib/decorators/classes/controller-decorator.d.ts +2 -12
  8. package/browser/lib/decorators/classes/controller-options.d.ts +12 -0
  9. package/browser/lib/decorators/classes/entity-decorator.d.ts +2 -2
  10. package/browser/lib/decorators/classes/middleware-decorator.d.ts +2 -2
  11. package/browser/lib/decorators/classes/migration-decorator.d.ts +2 -2
  12. package/browser/lib/decorators/classes/provider-decorator.d.ts +2 -2
  13. package/browser/lib/decorators/classes/repository-decorator.d.ts +2 -2
  14. package/browser/lib/decorators/classes/subscriber-decorator.d.ts +2 -2
  15. package/browser/lib/decorators/decorator-abstract-opt.d.ts +4 -0
  16. package/browser/lib/decorators/http/http-methods-decorators.d.ts +8 -5
  17. package/browser/lib/endpoint-context.d.ts +3 -2
  18. package/browser/lib/helpers/class-helpers.d.ts +7 -3
  19. package/browser/lib/helpers/taon-helpers.d.ts +2 -1
  20. package/browser/lib/index.d.ts +2 -1
  21. package/browser/lib/models.d.ts +16 -23
  22. package/browser/package.json +1 -1
  23. package/lib/base-classes/base-context.js +4 -0
  24. package/lib/base-classes/base-context.js.map +1 -1
  25. package/lib/base-classes/base-controller.d.ts +12 -0
  26. package/lib/base-classes/base-controller.js +56 -1
  27. package/lib/base-classes/base-controller.js.map +1 -1
  28. package/lib/base-classes/base-file-upload.middleware.d.ts +14 -0
  29. package/lib/base-classes/base-file-upload.middleware.js +85 -0
  30. package/lib/base-classes/base-file-upload.middleware.js.map +1 -0
  31. package/lib/base-classes/base-middleware.d.ts +30 -12
  32. package/lib/base-classes/base-middleware.js.map +1 -1
  33. package/lib/build-info._auto-generated_.d.ts +1 -1
  34. package/lib/build-info._auto-generated_.js +1 -1
  35. package/lib/decorators/classes/controller-config.d.ts +9 -0
  36. package/lib/decorators/classes/controller-config.js +11 -0
  37. package/lib/decorators/classes/controller-config.js.map +1 -0
  38. package/lib/decorators/classes/controller-decorator.d.ts +2 -12
  39. package/lib/decorators/classes/controller-decorator.js +0 -13
  40. package/lib/decorators/classes/controller-decorator.js.map +1 -1
  41. package/lib/decorators/classes/controller-options.d.ts +11 -0
  42. package/lib/decorators/classes/controller-options.js +16 -0
  43. package/lib/decorators/classes/controller-options.js.map +1 -0
  44. package/lib/decorators/classes/entity-decorator.d.ts +2 -2
  45. package/lib/decorators/classes/entity-decorator.js +7 -9
  46. package/lib/decorators/classes/entity-decorator.js.map +1 -1
  47. package/lib/decorators/classes/middleware-decorator.d.ts +2 -2
  48. package/lib/decorators/classes/middleware-decorator.js +2 -2
  49. package/lib/decorators/classes/middleware-decorator.js.map +1 -1
  50. package/lib/decorators/classes/migration-decorator.d.ts +2 -2
  51. package/lib/decorators/classes/migration-decorator.js +2 -2
  52. package/lib/decorators/classes/migration-decorator.js.map +1 -1
  53. package/lib/decorators/classes/provider-decorator.d.ts +2 -2
  54. package/lib/decorators/classes/provider-decorator.js +2 -2
  55. package/lib/decorators/classes/provider-decorator.js.map +1 -1
  56. package/lib/decorators/classes/repository-decorator.d.ts +2 -2
  57. package/lib/decorators/classes/repository-decorator.js +2 -2
  58. package/lib/decorators/classes/repository-decorator.js.map +1 -1
  59. package/lib/decorators/classes/subscriber-decorator.d.ts +2 -2
  60. package/lib/decorators/classes/subscriber-decorator.js +2 -2
  61. package/lib/decorators/classes/subscriber-decorator.js.map +1 -1
  62. package/lib/decorators/decorator-abstract-opt.d.ts +3 -0
  63. package/lib/decorators/decorator-abstract-opt.js +8 -0
  64. package/lib/decorators/decorator-abstract-opt.js.map +1 -0
  65. package/lib/decorators/http/http-methods-decorators.d.ts +8 -5
  66. package/lib/decorators/http/http-methods-decorators.js +3 -2
  67. package/lib/decorators/http/http-methods-decorators.js.map +1 -1
  68. package/lib/endpoint-context.d.ts +3 -2
  69. package/lib/endpoint-context.js +121 -71
  70. package/lib/endpoint-context.js.map +1 -1
  71. package/lib/helpers/class-helpers.d.ts +7 -3
  72. package/lib/helpers/class-helpers.js +12 -6
  73. package/lib/helpers/class-helpers.js.map +1 -1
  74. package/lib/helpers/taon-helpers.d.ts +2 -1
  75. package/lib/helpers/taon-helpers.js +1 -1
  76. package/lib/helpers/taon-helpers.js.map +1 -1
  77. package/lib/index.d.ts +2 -1
  78. package/lib/index.js.map +1 -1
  79. package/lib/models.d.ts +17 -25
  80. package/lib/models.js +4 -31
  81. package/lib/models.js.map +1 -1
  82. package/lib/ui/index.js +2 -2
  83. package/lib/ui/taon-admin-mode-configuration/index.js +2 -2
  84. package/package.json +1 -1
  85. package/websql/fesm2022/taon.mjs +386 -217
  86. package/websql/fesm2022/taon.mjs.map +1 -1
  87. package/websql/lib/base-classes/base-controller.d.ts +11 -0
  88. package/websql/lib/base-classes/base-file-upload.middleware.d.ts +15 -0
  89. package/websql/lib/base-classes/base-middleware.d.ts +30 -12
  90. package/websql/lib/decorators/classes/controller-config.d.ts +10 -0
  91. package/websql/lib/decorators/classes/controller-decorator.d.ts +2 -12
  92. package/websql/lib/decorators/classes/controller-options.d.ts +12 -0
  93. package/websql/lib/decorators/classes/entity-decorator.d.ts +2 -2
  94. package/websql/lib/decorators/classes/middleware-decorator.d.ts +2 -2
  95. package/websql/lib/decorators/classes/migration-decorator.d.ts +2 -2
  96. package/websql/lib/decorators/classes/provider-decorator.d.ts +2 -2
  97. package/websql/lib/decorators/classes/repository-decorator.d.ts +2 -2
  98. package/websql/lib/decorators/classes/subscriber-decorator.d.ts +2 -2
  99. package/websql/lib/decorators/decorator-abstract-opt.d.ts +4 -0
  100. package/websql/lib/decorators/http/http-methods-decorators.d.ts +8 -5
  101. package/websql/lib/endpoint-context.d.ts +3 -2
  102. package/websql/lib/helpers/class-helpers.d.ts +7 -3
  103. package/websql/lib/helpers/taon-helpers.d.ts +2 -1
  104. package/websql/lib/index.d.ts +2 -1
  105. package/websql/lib/models.d.ts +17 -25
  106. 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 { AxiosRequestConfig } from 'axios';
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
- abstract intercept({ server, client, }: TaonMiddlewareInterceptOptions): Promise<void>;
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 { Models } from '../../models';
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 { Models } from '../../models';
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 Models.DecoratorAbstractOpt {
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 { Models } from '../../models';
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 Models.DecoratorAbstractOpt {
7
+ export declare class TaonMiddlewareOptions<T = any> extends DecoratorAbstractOpt {
8
8
  }
@@ -1,8 +1,8 @@
1
1
  // @ts-nocheck
2
- import { Models } from '../../models';
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 Models.DecoratorAbstractOpt {
7
+ export declare class TaonMigrationOptions<T = any> extends DecoratorAbstractOpt {
8
8
  }
@@ -1,8 +1,8 @@
1
1
  // @ts-nocheck
2
- import { Models } from '../../models';
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 Models.DecoratorAbstractOpt {
7
+ export declare class TaonProviderOptions<T = any> extends DecoratorAbstractOpt {
8
8
  }
@@ -1,8 +1,8 @@
1
1
  // @ts-nocheck
2
- import { Models } from '../../models';
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 Models.DecoratorAbstractOpt {
7
+ export declare class TaonRepositoryOptions<T = any> extends DecoratorAbstractOpt {
8
8
  }
@@ -1,9 +1,9 @@
1
1
  // @ts-nocheck
2
- import { Models } from '../../models';
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 Models.DecoratorAbstractOpt {
7
+ export declare class TaonSubscriberOptions<T = any> extends DecoratorAbstractOpt {
8
8
  allowedEvents?: (keyof T)[];
9
9
  }
@@ -0,0 +1,4 @@
1
+ // @ts-nocheck
2
+ export declare class DecoratorAbstractOpt {
3
+ className: string;
4
+ }
@@ -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
- * ! BE CAREFULL
7
- * This method is only for very special cases
8
- * Path for the method is automatically generated
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
- overridResponseType?: ModelsNg2Rest.ResponseTypeAxios;
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 initFrontnedMiddlewares;
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 { Models } from '../models';
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) => Models.ControllerConfig | undefined;
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?: Models.ControllerConfig[], callerTarget?: Function) => Models.RuntimeControllerConfig[];
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: Models.RuntimeControllerConfig, pathOrClassConfig: Models.MethodConfig) => string;
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;
@@ -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 { TaonMiddlewareInterceptOptions } from './base-classes/base-middleware';
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;
@@ -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
- class DecoratorAbstractOpt {
210
- className: string;
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
- class MethodConfig {
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
- received?: Rest.PromiseObservableMix<Rest.HttpResponse<T>>;
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>>;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taon/browser",
3
- "version": "19.0.53",
3
+ "version": "19.0.55",
4
4
  "module": "fesm2022/taon.mjs",
5
5
  "typings": "index.d.ts",
6
6
  "exports": {
@@ -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)({ className: 'BaseController' })
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":";;;;;;;;;AAAA,qFAA4E;AAE5E,mDAA+C;AAGxC,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,4BAAY;CAE/C,CAAA;AAFY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,qCAAc,EAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;GACnC,cAAc,CAE1B"}
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"}