taon 21.0.53 → 21.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/bin/taon +5 -5
- package/bin/taon-debug +5 -5
- package/bin/taon-debug-brk +4 -4
- package/browser/package.json +1 -1
- package/browser-prod/package.json +1 -1
- package/icon-menu-taon.svg +15 -15
- package/lib/build-info._auto-generated_.d.ts +1 -1
- package/lib/build-info._auto-generated_.js +1 -1
- package/lib/package.json +1 -1
- package/lib/ui/index.js +2 -2
- package/lib/ui/taon-admin-mode-configuration/index.js +2 -2
- package/lib-prod/base-classes/base-abstract-entity.js +17 -31
- package/lib-prod/base-classes/base-angular-service.js +83 -55
- package/lib-prod/base-classes/base-class.js +33 -35
- package/lib-prod/base-classes/base-context.js +17 -19
- package/lib-prod/base-classes/base-controller.js +146 -154
- package/lib-prod/base-classes/base-crud-controller.js +250 -221
- package/lib-prod/base-classes/base-custom-repository.js +7 -18
- package/lib-prod/base-classes/base-electron-service.js +49 -0
- package/lib-prod/base-classes/base-entity.js +20 -30
- package/lib-prod/base-classes/base-file-upload.middleware.js +72 -75
- package/lib-prod/base-classes/base-injector.js +176 -194
- package/lib-prod/base-classes/base-middleware.js +8 -5
- package/lib-prod/base-classes/base-migration.js +19 -22
- package/lib-prod/base-classes/base-provider.js +7 -5
- package/lib-prod/base-classes/base-repository.js +601 -573
- package/lib-prod/base-classes/base-subscriber-for-entity.js +143 -152
- package/lib-prod/base-classes/base.js +18 -0
- package/lib-prod/build-info._auto-generated_.js +26 -14
- package/lib-prod/config/controller-config.js +24 -24
- package/lib-prod/config/controller-options.js +2 -5
- package/lib-prod/config/method-config.js +6 -8
- package/lib-prod/config/param-config.js +2 -8
- package/lib-prod/constants.js +29 -25
- package/lib-prod/context-db-migrations.js +328 -324
- package/lib-prod/create-context.js +211 -146
- package/lib-prod/decorators/classes/controller-decorator.js +16 -20
- package/lib-prod/decorators/classes/entity-decorator.js +26 -47
- package/lib-prod/decorators/classes/middleware-decorator.js +14 -24
- package/lib-prod/decorators/classes/migration-decorator.js +13 -22
- package/lib-prod/decorators/classes/provider-decorator.js +13 -23
- package/lib-prod/decorators/classes/repository-decorator.js +13 -22
- package/lib-prod/decorators/classes/subscriber-decorator.js +13 -23
- package/lib-prod/decorators/decorator-abstract-opt.js +1 -4
- package/lib-prod/decorators/http/http-decorators.js +20 -5
- package/lib-prod/decorators/http/http-methods-decorators.js +91 -133
- package/lib-prod/decorators/http/http-params-decorators.js +36 -62
- package/lib-prod/dependency-injection/di-container.js +28 -29
- package/lib-prod/endpoint-context-storage.js +27 -32
- package/lib-prod/endpoint-context.js +2294 -1930
- package/lib-prod/entity-process.js +209 -198
- package/lib-prod/env/env.angular-node-app.js +66 -130
- package/lib-prod/env/env.docs-webapp.js +66 -130
- package/lib-prod/env/env.electron-app.js +66 -130
- package/lib-prod/env/env.mobile-app.js +66 -130
- package/lib-prod/env/env.npm-lib-and-cli-tool.js +66 -130
- package/lib-prod/env/env.vscode-plugin.js +66 -130
- package/lib-prod/env/index.js +6 -6
- package/lib-prod/express-types.js +1 -0
- package/lib-prod/formly/formly.models.js +1 -0
- package/lib-prod/formly/fromly.js +196 -175
- package/lib-prod/formly/type-from-entity.js +45 -52
- package/lib-prod/get-response-value.js +21 -18
- package/lib-prod/global-state/taon-global-state/index.js +6 -5
- package/lib-prod/global-state/taon-global-state/taon-global-state.abstract.context.js +18 -19
- package/lib-prod/global-state/taon-global-state/taon-global-state.constants.js +6 -9
- package/lib-prod/global-state/taon-global-state/taon-global-state.controller.js +40 -46
- package/lib-prod/global-state/taon-global-state/taon-global-state.entity.js +33 -46
- package/lib-prod/global-state/taon-global-state/taon-global-state.middleware.js +10 -20
- package/lib-prod/global-state/taon-global-state/taon-global-state.models.js +43 -33
- package/lib-prod/global-state/taon-global-state/taon-global-state.provider.js +10 -20
- package/lib-prod/global-state/taon-global-state/taon-global-state.repository.js +43 -44
- package/lib-prod/global-state/taon-global-state/taon-global-state.subscriber.js +20 -27
- package/lib-prod/global-state/taon-global-state/taon-global-state.utils.js +10 -10
- package/lib-prod/global-state/taon-transaction-registry/index.js +11 -10
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.abstract.context.js +20 -21
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.constants.js +4 -7
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.controller.js +34 -39
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.entity.js +34 -54
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.middleware.js +10 -20
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.models.js +7 -10
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.provider.js +10 -20
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.repository.js +29 -34
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.subscriber.js +20 -27
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.utils.js +4 -5
- package/lib-prod/helpers/class-helpers.js +210 -177
- package/lib-prod/helpers/clone-obj.js +16 -20
- package/lib-prod/helpers/taon-helpers.js +132 -114
- package/lib-prod/index._auto-generated_.js +5 -0
- package/lib-prod/index.js +248 -227
- package/lib-prod/inject.js +88 -33
- package/lib-prod/migrations/index.js +2 -1
- package/lib-prod/migrations/migrations_index._auto-generated_.js +3 -0
- package/lib-prod/models.js +72 -103
- package/lib-prod/orm/columns.js +58 -118
- package/lib-prod/orm/index.js +56 -1
- package/lib-prod/package.json +1 -1
- package/lib-prod/realtime/realtime-client.js +188 -186
- package/lib-prod/realtime/realtime-core.js +77 -78
- package/lib-prod/realtime/realtime-server.js +225 -240
- package/lib-prod/realtime/realtime-strategy/index.js +4 -4
- package/lib-prod/realtime/realtime-strategy/realtime-strategy-ipc.js +273 -219
- package/lib-prod/realtime/realtime-strategy/realtime-strategy-mock.js +267 -240
- package/lib-prod/realtime/realtime-strategy/realtime-strategy-socket-io.js +26 -20
- package/lib-prod/realtime/realtime-strategy/realtime-strategy.js +10 -13
- package/lib-prod/realtime/realtime-subs-manager.js +82 -90
- package/lib-prod/realtime/realtime.models.js +2 -0
- package/lib-prod/symbols.js +104 -105
- package/lib-prod/ui/index.js +1 -5
- package/lib-prod/ui/taon-admin-mode-configuration/index.js +1 -5
- package/lib-prod/validators.js +43 -37
- package/lib-prod.split-namespaces.json +32 -86
- package/package.json +1 -1
- package/websql/package.json +1 -1
- package/websql-prod/package.json +1 -1
|
@@ -1,162 +1,154 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
size: f.size,
|
|
43
|
-
mimetype: f.mimetype
|
|
1
|
+
import * as FormData from 'form-data'; // @backend
|
|
2
|
+
import { HttpResponseError, } from 'ng2-rest/lib-prod';
|
|
3
|
+
import { crossPlatformPath, fse, path, CoreModels__NS__TaonHttpErrorCustomProp, UtilsTerminal__NS__waitMilliseconds } from 'tnp-core/lib-prod';
|
|
4
|
+
import { TaonController } from '../decorators/classes/controller-decorator';
|
|
5
|
+
import { POST } from '../decorators/http/http-methods-decorators';
|
|
6
|
+
import { Body, Query } from '../decorators/http/http-params-decorators';
|
|
7
|
+
import { TaonBaseFileUploadMiddleware } from './base-file-upload.middleware';
|
|
8
|
+
import { TaonBaseInjector } from './base-injector';
|
|
9
|
+
let TaonBaseController = class TaonBaseController extends TaonBaseInjector {
|
|
10
|
+
/**
|
|
11
|
+
* Hook that is called when taon app is inited
|
|
12
|
+
* (all contexts are created and inited)
|
|
13
|
+
*/
|
|
14
|
+
async afterAllCtxInited(options) { }
|
|
15
|
+
//#region upload form data to server
|
|
16
|
+
uploadFormDataToServer(formData, queryParams) {
|
|
17
|
+
//#region @backendFunc
|
|
18
|
+
return async (req, res) => {
|
|
19
|
+
const files = req.files;
|
|
20
|
+
if (!files) {
|
|
21
|
+
throw 'No file(s) received';
|
|
22
|
+
}
|
|
23
|
+
const responseArr = files.map(f => {
|
|
24
|
+
const savedAbs = crossPlatformPath(path.resolve(f.path));
|
|
25
|
+
// const savedRel = crossPlatformPath(
|
|
26
|
+
// path.relative(this.ctx.cwd, savedAbs),
|
|
27
|
+
// );
|
|
28
|
+
return {
|
|
29
|
+
ok: true,
|
|
30
|
+
originalName: f.originalname,
|
|
31
|
+
savedAs: path.basename(savedAbs),
|
|
32
|
+
// savedPath: void 0, // not needed
|
|
33
|
+
size: f.size,
|
|
34
|
+
mimetype: f.mimetype,
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
// console.log(responseArr);
|
|
38
|
+
for (const res of responseArr) {
|
|
39
|
+
await this.afterFileUploadAction(res, queryParams || {});
|
|
40
|
+
}
|
|
41
|
+
return responseArr;
|
|
44
42
|
};
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
form.append("file", stream, {
|
|
66
|
-
filename: path.basename(absFilePath),
|
|
67
|
-
knownLength: stat.size
|
|
68
|
-
});
|
|
69
|
-
const data = await this.uploadFormDataToServer(form, queryParams).request(
|
|
70
|
-
options || {}
|
|
71
|
-
);
|
|
72
|
-
return data.body.json;
|
|
73
|
-
}
|
|
74
|
-
//#endregion
|
|
75
|
-
// async check() {
|
|
76
|
-
// await this._waitForProperStatusChange({
|
|
77
|
-
// request: () => this.uploadFormDataToServer(void 0, void 0).request(),
|
|
78
|
-
// statusCheck: resp => resp.body.json[0].ok,
|
|
79
|
-
// });
|
|
80
|
-
// }
|
|
81
|
-
/**
|
|
82
|
-
* Easy way to wait for status change with http (1s default) pooling.
|
|
83
|
-
*
|
|
84
|
-
* example (in sub class):
|
|
85
|
-
* ```ts
|
|
86
|
-
async check() {
|
|
87
|
-
await this.waitForProperStatusChange({
|
|
88
|
-
request: () => this.uploadFormDataToServer(void 0, void 0).request(),
|
|
89
|
-
statusCheck: resp => resp.body.json[0].ok,
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
* ```
|
|
93
|
-
*/
|
|
94
|
-
async _waitForProperStatusChange(options) {
|
|
95
|
-
const poolingInterval = options.poolingInterval || 1e3;
|
|
96
|
-
const taonRequest = options.request;
|
|
97
|
-
let maxTries = options.maxTries || Number.POSITIVE_INFINITY;
|
|
98
|
-
let i = 0;
|
|
99
|
-
let httpErrorsCount = 0;
|
|
100
|
-
while (true) {
|
|
101
|
-
await UtilsTerminal__NS__waitMilliseconds(poolingInterval);
|
|
102
|
-
try {
|
|
103
|
-
const resp = await taonRequest({
|
|
104
|
-
reqIndexNum: i,
|
|
105
|
-
httpErrorsCount
|
|
43
|
+
//#endregion
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region after file upload hook
|
|
47
|
+
/**
|
|
48
|
+
* Hook after file is uploaded
|
|
49
|
+
* through `uploadFormDataToServer` or `uploadLocalFileToServer`
|
|
50
|
+
*/
|
|
51
|
+
afterFileUploadAction(file, queryParams) {
|
|
52
|
+
// empty
|
|
53
|
+
}
|
|
54
|
+
//#region upload local file to server
|
|
55
|
+
async uploadLocalFileToServer(absFilePath, options, queryParams) {
|
|
56
|
+
//#region @backendFunc
|
|
57
|
+
const stat = fse.statSync(absFilePath);
|
|
58
|
+
const stream = fse.createReadStream(absFilePath);
|
|
59
|
+
const form = new FormData();
|
|
60
|
+
form.append('file', stream, {
|
|
61
|
+
filename: path.basename(absFilePath),
|
|
62
|
+
knownLength: stat.size,
|
|
106
63
|
});
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
64
|
+
const data = await this.uploadFormDataToServer(form, queryParams).request(options || {});
|
|
65
|
+
return data.body.json;
|
|
66
|
+
//#endregion
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
// async check() {
|
|
70
|
+
// await this._waitForProperStatusChange({
|
|
71
|
+
// request: () => this.uploadFormDataToServer(void 0, void 0).request(),
|
|
72
|
+
// statusCheck: resp => resp.body.json[0].ok,
|
|
73
|
+
// });
|
|
74
|
+
// }
|
|
75
|
+
/**
|
|
76
|
+
* Easy way to wait for status change with http (1s default) pooling.
|
|
77
|
+
*
|
|
78
|
+
* example (in sub class):
|
|
79
|
+
* ```ts
|
|
80
|
+
async check() {
|
|
81
|
+
await this.waitForProperStatusChange({
|
|
82
|
+
request: () => this.uploadFormDataToServer(void 0, void 0).request(),
|
|
83
|
+
statusCheck: resp => resp.body.json[0].ok,
|
|
84
|
+
});
|
|
128
85
|
}
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
async _waitForProperStatusChange(options) {
|
|
89
|
+
const poolingInterval = options.poolingInterval || 1000;
|
|
90
|
+
const taonRequest = options.request;
|
|
91
|
+
let maxTries = options.maxTries || Number.POSITIVE_INFINITY;
|
|
92
|
+
let i = 0;
|
|
93
|
+
let httpErrorsCount = 0;
|
|
94
|
+
while (true) {
|
|
95
|
+
await UtilsTerminal__NS__waitMilliseconds(poolingInterval);
|
|
96
|
+
try {
|
|
97
|
+
const resp = await taonRequest({
|
|
98
|
+
reqIndexNum: i,
|
|
99
|
+
httpErrorsCount,
|
|
100
|
+
});
|
|
101
|
+
if (options.statusCheck && options.statusCheck(resp)) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
httpErrorsCount++;
|
|
107
|
+
if (options.loopRequestsOnBackendError) {
|
|
108
|
+
const isProperTaonError = error instanceof HttpResponseError &&
|
|
109
|
+
error.body.json[CoreModels__NS__TaonHttpErrorCustomProp];
|
|
110
|
+
const isHttpError = error instanceof HttpResponseError && !isProperTaonError;
|
|
111
|
+
const isUnknownError = !(error instanceof HttpResponseError);
|
|
112
|
+
const resBool = await options.loopRequestsOnBackendError({
|
|
113
|
+
taonError: isProperTaonError ? error : void 0,
|
|
114
|
+
unknownHttpError: isHttpError ? error : void 0,
|
|
115
|
+
unknownError: isUnknownError ? error : void 0,
|
|
116
|
+
reqIndexNum: i,
|
|
117
|
+
httpErrorsCount,
|
|
118
|
+
});
|
|
119
|
+
if (resBool) {
|
|
120
|
+
i++;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (httpErrorsCount >
|
|
128
|
+
(options.allowedHttpErrors || Number.POSITIVE_INFINITY)) {
|
|
129
|
+
throw new Error(`Too many http errors (${httpErrorsCount}) for "${options.actionName}".`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (i++ > maxTries) {
|
|
133
|
+
throw new Error(`Timeout waiting for "${options.actionName}" to be finished. Waited for ${maxTries} seconds`);
|
|
134
|
+
}
|
|
129
135
|
}
|
|
130
|
-
if (httpErrorsCount > (options.allowedHttpErrors || Number.POSITIVE_INFINITY)) {
|
|
131
|
-
throw new Error(
|
|
132
|
-
`Too many http errors (${httpErrorsCount}) for "${options.actionName}".`
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
if (i++ > maxTries) {
|
|
137
|
-
throw new Error(
|
|
138
|
-
`Timeout waiting for "${options.actionName}" to be finished. Waited for ${maxTries} seconds`
|
|
139
|
-
);
|
|
140
|
-
}
|
|
141
136
|
}
|
|
142
|
-
}
|
|
143
137
|
};
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
138
|
+
__decorate([
|
|
139
|
+
POST({
|
|
140
|
+
overrideContentType: 'multipart/form-data',
|
|
141
|
+
middlewares: ({ parentMiddlewares }) => ({
|
|
142
|
+
...parentMiddlewares,
|
|
143
|
+
TaonBaseFileUploadMiddleware,
|
|
144
|
+
}),
|
|
145
|
+
}),
|
|
146
|
+
__param(0, Body()),
|
|
147
|
+
__param(1, Query())
|
|
148
|
+
], TaonBaseController.prototype, "uploadFormDataToServer", null);
|
|
149
|
+
TaonBaseController = __decorate([
|
|
150
|
+
TaonController({
|
|
151
|
+
className: 'TaonBaseController',
|
|
150
152
|
})
|
|
151
|
-
}),
|
|
152
|
-
__decorateParam(0, Body()),
|
|
153
|
-
__decorateParam(1, Query())
|
|
154
|
-
], TaonBaseController.prototype, "uploadFormDataToServer", 1);
|
|
155
|
-
TaonBaseController = __decorateClass([
|
|
156
|
-
TaonController({
|
|
157
|
-
className: "TaonBaseController"
|
|
158
|
-
})
|
|
159
153
|
], TaonBaseController);
|
|
160
|
-
export {
|
|
161
|
-
TaonBaseController
|
|
162
|
-
};
|
|
154
|
+
export { TaonBaseController };
|