typescript-class-helpers 21.0.13 → 21.0.17
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/package.json +1 -1
- package/browser-prod/README.md +24 -0
- package/browser-prod/fesm2022/typescript-class-helpers-browser.mjs +609 -0
- package/browser-prod/fesm2022/typescript-class-helpers-browser.mjs.map +1 -0
- package/browser-prod/package.json +23 -0
- package/browser-prod/types/typescript-class-helpers-browser.d.ts +146 -0
- package/browser-prod.split-namespaces.json +36 -0
- package/lib/build-info._auto-generated_.d.ts +1 -1
- package/lib/build-info._auto-generated_.js +1 -1
- package/lib/env/env.angular-node-app.d.ts +30 -28
- package/lib/env/env.angular-node-app.js +32 -30
- package/lib/env/env.angular-node-app.js.map +1 -1
- package/lib/env/env.docs-webapp.d.ts +30 -28
- package/lib/env/env.docs-webapp.js +32 -30
- package/lib/env/env.docs-webapp.js.map +1 -1
- package/lib/env/env.electron-app.d.ts +30 -28
- package/lib/env/env.electron-app.js +32 -30
- package/lib/env/env.electron-app.js.map +1 -1
- package/lib/env/env.mobile-app.d.ts +30 -28
- package/lib/env/env.mobile-app.js +32 -30
- package/lib/env/env.mobile-app.js.map +1 -1
- package/lib/env/env.npm-lib-and-cli-tool.d.ts +30 -28
- package/lib/env/env.npm-lib-and-cli-tool.js +32 -30
- package/lib/env/env.npm-lib-and-cli-tool.js.map +1 -1
- package/lib/env/env.vscode-plugin.d.ts +30 -28
- package/lib/env/env.vscode-plugin.js +32 -30
- package/lib/env/env.vscode-plugin.js.map +1 -1
- package/lib/index._auto-generated_.d.ts +0 -1
- package/lib/migrations/index.d.ts +1 -0
- package/lib/migrations/index.js +19 -0
- package/lib/migrations/index.js.map +1 -0
- package/lib/migrations/migrations_index._auto-generated_.d.ts +0 -0
- package/lib/migrations/migrations_index._auto-generated_.js +4 -0
- package/lib/migrations/migrations_index._auto-generated_.js.map +1 -0
- package/lib/package.json +4 -0
- package/lib-prod/build-info._auto-generated_.d.ts +24 -0
- package/lib-prod/build-info._auto-generated_.js +30 -0
- package/lib-prod/build-info._auto-generated_.js.map +1 -0
- package/lib-prod/classname.d.ts +14 -0
- package/lib-prod/classname.js +196 -0
- package/lib-prod/classname.js.map +1 -0
- package/lib-prod/describe-class.d.ts +6 -0
- package/lib-prod/describe-class.js +77 -0
- package/lib-prod/describe-class.js.map +1 -0
- package/lib-prod/env/env.angular-node-app.d.ts +64 -0
- package/lib-prod/env/env.angular-node-app.js +71 -0
- package/lib-prod/env/env.angular-node-app.js.map +1 -0
- package/lib-prod/env/env.docs-webapp.d.ts +64 -0
- package/lib-prod/env/env.docs-webapp.js +71 -0
- package/lib-prod/env/env.docs-webapp.js.map +1 -0
- package/lib-prod/env/env.electron-app.d.ts +64 -0
- package/lib-prod/env/env.electron-app.js +71 -0
- package/lib-prod/env/env.electron-app.js.map +1 -0
- package/lib-prod/env/env.mobile-app.d.ts +64 -0
- package/lib-prod/env/env.mobile-app.js +71 -0
- package/lib-prod/env/env.mobile-app.js.map +1 -0
- package/lib-prod/env/env.npm-lib-and-cli-tool.d.ts +64 -0
- package/lib-prod/env/env.npm-lib-and-cli-tool.js +71 -0
- package/lib-prod/env/env.npm-lib-and-cli-tool.js.map +1 -0
- package/lib-prod/env/env.vscode-plugin.d.ts +64 -0
- package/lib-prod/env/env.vscode-plugin.js +71 -0
- package/lib-prod/env/env.vscode-plugin.js.map +1 -0
- package/lib-prod/env/index.d.ts +6 -0
- package/lib-prod/env/index.js +23 -0
- package/lib-prod/env/index.js.map +1 -0
- package/lib-prod/errors-messages.d.ts +1 -0
- package/lib-prod/errors-messages.js +15 -0
- package/lib-prod/errors-messages.js.map +1 -0
- package/lib-prod/index._auto-generated_.d.ts +0 -0
- package/lib-prod/index._auto-generated_.js +6 -0
- package/lib-prod/index._auto-generated_.js.map +1 -0
- package/lib-prod/index.d.ts +48 -0
- package/lib-prod/index.js +202 -0
- package/lib-prod/index.js.map +1 -0
- package/lib-prod/migrations/migrations_index._auto-generated_.d.ts +0 -0
- package/lib-prod/models.d.ts +81 -0
- package/lib-prod/models.js +61 -0
- package/lib-prod/models.js.map +1 -0
- package/lib-prod/package.json +4 -0
- package/lib-prod/registerd-db.d.ts +5 -0
- package/lib-prod/registerd-db.js +8 -0
- package/lib-prod/registerd-db.js.map +1 -0
- package/lib-prod/set-class-name.d.ts +2 -0
- package/lib-prod/set-class-name.js +100 -0
- package/lib-prod/set-class-name.js.map +1 -0
- package/lib-prod/storage.d.ts +1 -0
- package/lib-prod/storage.js +27 -0
- package/lib-prod/storage.js.map +1 -0
- package/lib-prod/symbols.d.ts +7 -0
- package/lib-prod/symbols.js +12 -0
- package/lib-prod/symbols.js.map +1 -0
- package/lib-prod.split-namespaces.json +36 -0
- package/package.json +1 -1
- package/websql/package.json +1 -1
- package/websql-prod/README.md +24 -0
- package/websql-prod/fesm2022/typescript-class-helpers-websql.mjs +608 -0
- package/websql-prod/fesm2022/typescript-class-helpers-websql.mjs.map +1 -0
- package/websql-prod/package.json +23 -0
- package/websql-prod/types/typescript-class-helpers-websql.d.ts +147 -0
- package/websql-prod.split-namespaces.json +36 -0
- package/migrations/migrations_index._auto-generated_.d.ts +0 -1
- package/tmp-environment.json +0 -37
- /package/{migrations → lib-prod/migrations}/index.d.ts +0 -0
- /package/{migrations → lib-prod/migrations}/index.js +0 -0
- /package/{migrations → lib-prod/migrations}/index.js.map +0 -0
- /package/{migrations → lib-prod/migrations}/migrations_index._auto-generated_.js +0 -0
- /package/{migrations → lib-prod/migrations}/migrations_index._auto-generated_.js.map +0 -0
package/browser/package.json
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# MyLib
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.2.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project my-lib` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project my-lib`.
|
|
8
|
+
> Note: Don't forget to add `--project my-lib` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build my-lib` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build my-lib`, go to the dist folder `cd dist/my-lib` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test my-lib` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
@@ -0,0 +1,609 @@
|
|
|
1
|
+
import { CoreModels_ClassNameStaticProperty, _, Helpers } from 'tnp-core/browser-prod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @deprecated
|
|
5
|
+
*/
|
|
6
|
+
class Models_ParamConfig {
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* @deprecated
|
|
10
|
+
*/
|
|
11
|
+
class Models_MethodConfig {
|
|
12
|
+
constructor() {
|
|
13
|
+
/* */
|
|
14
|
+
/* */
|
|
15
|
+
this.parameters = {};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated
|
|
20
|
+
*/
|
|
21
|
+
class Models_ClassConfig {
|
|
22
|
+
constructor() {
|
|
23
|
+
// @ts-ignore
|
|
24
|
+
this.singleton = void 0;
|
|
25
|
+
this.injections = [];
|
|
26
|
+
this.vChildren = [];
|
|
27
|
+
this.methods = {};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//end of namespace Models
|
|
31
|
+
|
|
32
|
+
const SYMBOL = {
|
|
33
|
+
MODELS_MAPPING: Symbol(),
|
|
34
|
+
DEFAULT_MODEL: Symbol(),
|
|
35
|
+
STORAGE: 'classesstorage',
|
|
36
|
+
CLASSES: 'classes',
|
|
37
|
+
ClassNameStaticProperty: CoreModels_ClassNameStaticProperty,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
function defaultValues() {
|
|
41
|
+
return _.cloneDeep({
|
|
42
|
+
[SYMBOL.CLASSES]: []
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function getStorage(property) {
|
|
46
|
+
/* */
|
|
47
|
+
/* */
|
|
48
|
+
/* */
|
|
49
|
+
/* */
|
|
50
|
+
if (typeof property === 'string') {
|
|
51
|
+
const storageInClassStaticProp = getStorage();
|
|
52
|
+
return storageInClassStaticProp[property];
|
|
53
|
+
}
|
|
54
|
+
if (typeof defaultValues.prototype[SYMBOL.STORAGE] === 'undefined') {
|
|
55
|
+
defaultValues.prototype[SYMBOL.STORAGE] = defaultValues();
|
|
56
|
+
}
|
|
57
|
+
return defaultValues.prototype[SYMBOL.STORAGE];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function getClasses$1() {
|
|
61
|
+
const s = getStorage();
|
|
62
|
+
return s[SYMBOL.CLASSES];
|
|
63
|
+
}
|
|
64
|
+
// @ts-ignore
|
|
65
|
+
function setClassName(target, className, options) {
|
|
66
|
+
let { classFamily, uniqueKey, classNameInBrowser, singleton } = options || {
|
|
67
|
+
classFamily: void 0,
|
|
68
|
+
uniqueKey: 'id',
|
|
69
|
+
classNameInBrowser: void 0,
|
|
70
|
+
singleton: void 0,
|
|
71
|
+
autoinstance: false
|
|
72
|
+
};
|
|
73
|
+
if (!_.isUndefined(singleton) && _.isBoolean(singleton) && singleton) {
|
|
74
|
+
singleton = 'first-instance';
|
|
75
|
+
}
|
|
76
|
+
if (!uniqueKey) {
|
|
77
|
+
uniqueKey = 'id';
|
|
78
|
+
}
|
|
79
|
+
if (target) {
|
|
80
|
+
const config = _.first(CLASSNAME_getClassConfig(target));
|
|
81
|
+
config.className = className;
|
|
82
|
+
config.uniqueKey = uniqueKey;
|
|
83
|
+
config.classNameInBrowser = classNameInBrowser;
|
|
84
|
+
// console.log(`Setting class Name to "${target.name}"`)
|
|
85
|
+
}
|
|
86
|
+
const existed = getClasses$1()
|
|
87
|
+
.find(f => f.className === className);
|
|
88
|
+
if (existed) {
|
|
89
|
+
existed.target = target;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const res = {
|
|
93
|
+
className,
|
|
94
|
+
classNameInBrowser,
|
|
95
|
+
target,
|
|
96
|
+
uniqueKey,
|
|
97
|
+
classFamily
|
|
98
|
+
};
|
|
99
|
+
if (_.isUndefined(classFamily)) {
|
|
100
|
+
Object.defineProperty(res, 'classFamily', {
|
|
101
|
+
get: function () {
|
|
102
|
+
const parent = Object.getPrototypeOf(target);
|
|
103
|
+
if (!_.isFunction(parent) || parent.name === 'Object' || parent.name === '') {
|
|
104
|
+
return className;
|
|
105
|
+
}
|
|
106
|
+
const classNameNew = CLASSNAME_getClassName(parent);
|
|
107
|
+
return CLASSNAME_getClassFamilyByClassName(classNameNew);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
getClasses$1().push(res);
|
|
112
|
+
}
|
|
113
|
+
const Original = target;
|
|
114
|
+
if (singleton === 'first-instance' || singleton === 'last-instance') {
|
|
115
|
+
const obj = {
|
|
116
|
+
// @ts-ignore
|
|
117
|
+
decoratedConstructor: function (...args) {
|
|
118
|
+
// console.log(`DECORATED CONSTRUCTOR OF ${Original.name}`)
|
|
119
|
+
const context = Original.apply(this, args);
|
|
120
|
+
const existedSingleton = CLASS.getSingleton(Original);
|
|
121
|
+
if (!existedSingleton || singleton === 'last-instance') {
|
|
122
|
+
CLASS.setSingletonObj(Original, this);
|
|
123
|
+
CLASS.setSingletonObj(obj.decoratedConstructor, this);
|
|
124
|
+
// console.log(`Singleton created for "${className}", mode: ${singleton} `);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// console.log('ingleton exists')
|
|
128
|
+
}
|
|
129
|
+
return context;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
// copy prototype so intanceof operator still works
|
|
133
|
+
obj.decoratedConstructor.prototype = Original.prototype;
|
|
134
|
+
// @ts-ignore
|
|
135
|
+
Object.keys(Original).forEach((name) => { obj.decoratedConstructor[name] = Original[name]; });
|
|
136
|
+
Object.defineProperty(obj.decoratedConstructor, 'name', {
|
|
137
|
+
value: className,
|
|
138
|
+
configurable: true,
|
|
139
|
+
});
|
|
140
|
+
// (obj.decoratedConstructor as any).name = className;
|
|
141
|
+
// console.log('return new contruor', decoratedConstructor)
|
|
142
|
+
return obj.decoratedConstructor;
|
|
143
|
+
}
|
|
144
|
+
else if (singleton === 'autoinstance') {
|
|
145
|
+
// console.log(`AUTOINSTANCE FOR ${target.name}`)
|
|
146
|
+
const auto = new Original();
|
|
147
|
+
CLASS.setSingletonObj(Original, auto);
|
|
148
|
+
// console.log(`Singleton created for "${className}", mode: ${singleton} `)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const registerd = {
|
|
153
|
+
configs: [],
|
|
154
|
+
classes: [],
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const ERROR_MSG_CLASS_WITHOUT_DECORATOR = `[typescript-class-helpers][getClassName(...)](PRODUCTION MODE ERROR)
|
|
158
|
+
Please use decoartor @CLASSNAME for each entity or controller
|
|
159
|
+
This is preventing class name problem in minified code.
|
|
160
|
+
|
|
161
|
+
import { CLASS } from 'typescript-class-helpers';
|
|
162
|
+
|
|
163
|
+
@CLASS.NAME('ExampleClass')
|
|
164
|
+
class ExampleClass {
|
|
165
|
+
...
|
|
166
|
+
}
|
|
167
|
+
`;
|
|
168
|
+
|
|
169
|
+
/* */
|
|
170
|
+
/* */
|
|
171
|
+
function getClasses() {
|
|
172
|
+
const s = getStorage();
|
|
173
|
+
return s[SYMBOL.CLASSES];
|
|
174
|
+
}
|
|
175
|
+
//namespace CLASSNAME
|
|
176
|
+
function CLASSNAME_getClassConfig(target, configs = [], callerTarget) {
|
|
177
|
+
if (!_.isFunction(target)) {
|
|
178
|
+
throw `[typescript-class-helper][getClassConfig] Cannot get class config from: ${target}`;
|
|
179
|
+
}
|
|
180
|
+
let config;
|
|
181
|
+
const parentClass = Object.getPrototypeOf(target);
|
|
182
|
+
const isValidParent = _.isFunction(parentClass) && parentClass.name !== '';
|
|
183
|
+
if (registerd.classes.includes(target)) {
|
|
184
|
+
config =
|
|
185
|
+
registerd.configs[registerd.classes.findIndex(c => c === target)];
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
config = new Models_ClassConfig();
|
|
189
|
+
config.classReference = target;
|
|
190
|
+
registerd.classes.push(target);
|
|
191
|
+
}
|
|
192
|
+
registerd.configs[registerd.classes.findIndex(c => c === target)] = config;
|
|
193
|
+
if (callerTarget) {
|
|
194
|
+
const callerTargetConfig = registerd.configs[registerd.classes.findIndex(c => c === callerTarget)];
|
|
195
|
+
if (!config.vChildren.includes(callerTargetConfig)) {
|
|
196
|
+
config.vChildren.push(callerTargetConfig);
|
|
197
|
+
}
|
|
198
|
+
callerTargetConfig.vParent = config;
|
|
199
|
+
}
|
|
200
|
+
configs.push(config);
|
|
201
|
+
return isValidParent
|
|
202
|
+
? CLASSNAME_getClassConfig(parentClass, configs, target)
|
|
203
|
+
: configs;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* PLEASE PROVIDE NAME AS TYPED STRING, NOT VARIABLE
|
|
207
|
+
* Decorator requred for production mode
|
|
208
|
+
* @param name Name of class
|
|
209
|
+
*/
|
|
210
|
+
function CLASSNAME_CLASSNAME(className, options) {
|
|
211
|
+
return function (target) {
|
|
212
|
+
// console.log(`CLASSNAME Inited ${className}`)
|
|
213
|
+
return setClassName(target, className, options);
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
function CLASSNAME_getClassName(target, production = false) {
|
|
217
|
+
if (_.isNil(target)) {
|
|
218
|
+
// console.log(target);
|
|
219
|
+
// Helpers.warn(`[typescript-class-helpers][getClassName] target is nil`)
|
|
220
|
+
return void 0;
|
|
221
|
+
}
|
|
222
|
+
if (_.isString(target)) {
|
|
223
|
+
// console.log(target);
|
|
224
|
+
Helpers.log(`[typescript-class-helpers][getClassName] target is string: '${target}', produciton: ${production}`);
|
|
225
|
+
return target;
|
|
226
|
+
}
|
|
227
|
+
if (target === Date) {
|
|
228
|
+
return 'Date';
|
|
229
|
+
}
|
|
230
|
+
if (target === FormData) {
|
|
231
|
+
return 'FormData';
|
|
232
|
+
}
|
|
233
|
+
if (!_.isFunction(target)) {
|
|
234
|
+
// console.log(target);
|
|
235
|
+
Helpers.log(`[typescript-class-helpers][getClassName] target is not a class`);
|
|
236
|
+
return void 0;
|
|
237
|
+
}
|
|
238
|
+
if (target[SYMBOL.ClassNameStaticProperty]) {
|
|
239
|
+
return target[SYMBOL.ClassNameStaticProperty];
|
|
240
|
+
}
|
|
241
|
+
const configs = CLASSNAME_getClassConfig(target);
|
|
242
|
+
const config = _.first(configs);
|
|
243
|
+
const classNameInBrowser = config?.classNameInBrowser;
|
|
244
|
+
if (Helpers.isBrowser && _.isString(classNameInBrowser)) {
|
|
245
|
+
return classNameInBrowser;
|
|
246
|
+
}
|
|
247
|
+
const className = config?.className;
|
|
248
|
+
if (typeof className === 'string') {
|
|
249
|
+
return className;
|
|
250
|
+
}
|
|
251
|
+
if (production) {
|
|
252
|
+
console.log('class without @CLASS.NAME deocrator', target);
|
|
253
|
+
throw new Error(ERROR_MSG_CLASS_WITHOUT_DECORATOR);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// Helpers.log('check for ' + target.name)
|
|
257
|
+
// setTimeout(() => {
|
|
258
|
+
// // Helpers.log('check for ' + target.name + ' === ' + config.className)/
|
|
259
|
+
// // TODO this may work, but not yet in singleton/morphi
|
|
260
|
+
// if (!config.className) {
|
|
261
|
+
// if (target?.name && target.name !== 'Object') {
|
|
262
|
+
// ConfigHelpers.log(`[typescript-class-helpers] Please use @CLASS.NAME`
|
|
263
|
+
// + `('${(target?.name && !!target.name) ? target.name : '...'}') decorator for class ${target?.name}`)
|
|
264
|
+
// }
|
|
265
|
+
// }
|
|
266
|
+
// })
|
|
267
|
+
}
|
|
268
|
+
// special thing when cloning classes
|
|
269
|
+
if (target.name?.startsWith('class_')) {
|
|
270
|
+
return '';
|
|
271
|
+
}
|
|
272
|
+
return target.name;
|
|
273
|
+
}
|
|
274
|
+
// @ts-ignore
|
|
275
|
+
function CLASSNAME_getObjectIndexPropertyValue(obj) {
|
|
276
|
+
const className = TchHelpers.getNameFromObject(obj);
|
|
277
|
+
// console.log('className',className)
|
|
278
|
+
let c = getClasses().find(c => c.className === className);
|
|
279
|
+
// console.log('c',c)
|
|
280
|
+
if (c) {
|
|
281
|
+
return c.uniqueKey;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// @ts-ignore
|
|
285
|
+
function CLASSNAME_getClassFamilyByClassName(className) {
|
|
286
|
+
let c = getClasses().find(c => c.className === className);
|
|
287
|
+
// console.log('getClasses()', getClasses())
|
|
288
|
+
if (c) {
|
|
289
|
+
return c.classFamily;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// @ts-ignore
|
|
293
|
+
function CLASSNAME_getObjectClassFamily(obj) {
|
|
294
|
+
const className = TchHelpers.getNameFromObject(obj);
|
|
295
|
+
// console.log('className',className)
|
|
296
|
+
let c = getClasses().find(c => c.className === className);
|
|
297
|
+
// console.log('c',c)
|
|
298
|
+
if (c) {
|
|
299
|
+
return c.classFamily;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
function CLASSNAME_getObjectIndexValue(obj) {
|
|
303
|
+
const className = TchHelpers.getNameFromObject(obj);
|
|
304
|
+
// console.log('className',className)
|
|
305
|
+
let c = getClasses().find(c => c.className === className);
|
|
306
|
+
// console.log('c',c)
|
|
307
|
+
if (c && _.isString(c.uniqueKey)) {
|
|
308
|
+
return obj[c.uniqueKey];
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
function CLASSNAME_getClassBy(className) {
|
|
312
|
+
let res;
|
|
313
|
+
if (Array.isArray(className)) {
|
|
314
|
+
if (className.length !== 1) {
|
|
315
|
+
throw `Mapping error... please use proper class names:
|
|
316
|
+
{
|
|
317
|
+
propertyObject: 'MyClassName',
|
|
318
|
+
propertyWithArray: ['MyClassName']
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
`;
|
|
322
|
+
}
|
|
323
|
+
className = className[0];
|
|
324
|
+
}
|
|
325
|
+
if (typeof className === 'function') {
|
|
326
|
+
// TODO QUICK_FIX
|
|
327
|
+
res = className;
|
|
328
|
+
}
|
|
329
|
+
if (className === 'Date') {
|
|
330
|
+
res = Date;
|
|
331
|
+
}
|
|
332
|
+
if (className === 'FormData') {
|
|
333
|
+
res = FormData;
|
|
334
|
+
}
|
|
335
|
+
let c = getClasses().find(c => c.className === className);
|
|
336
|
+
if (c) {
|
|
337
|
+
res = c.target;
|
|
338
|
+
}
|
|
339
|
+
// console.log(`getClassBy "${className} return \n\n ${res} \n\n`)
|
|
340
|
+
// @ts-ignore
|
|
341
|
+
return res;
|
|
342
|
+
}
|
|
343
|
+
//end of namespace CLASSNAME
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* @DEPRECATED
|
|
347
|
+
* Describe fields assigned in class
|
|
348
|
+
*/
|
|
349
|
+
const FRegEx = new RegExp(/(?:this\.)(.+?(?= ))/g);
|
|
350
|
+
function describeFromClassStringify(target, parent = false) {
|
|
351
|
+
// @ts-ignore
|
|
352
|
+
var result = [];
|
|
353
|
+
if (parent) {
|
|
354
|
+
var proto = Object.getPrototypeOf(target.prototype);
|
|
355
|
+
if (proto) {
|
|
356
|
+
// @ts-ignore
|
|
357
|
+
result = result.concat(describeFromClassStringify(proto.constructor, parent));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
const classString = target.toString();
|
|
361
|
+
const matches = classString.match(FRegEx) || [];
|
|
362
|
+
// console.log({
|
|
363
|
+
// classString,
|
|
364
|
+
// });
|
|
365
|
+
result = result.concat(matches);
|
|
366
|
+
return result.map(prop => prop
|
|
367
|
+
.replace('this.', '')
|
|
368
|
+
.replace('.', '')
|
|
369
|
+
.replace(')', '')
|
|
370
|
+
.replace('(', ''));
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Describe fields assigne through @DefaultModelWithMapping decorator
|
|
374
|
+
* without functions
|
|
375
|
+
*/
|
|
376
|
+
function describeByDefaultModelsAndMapping(target) {
|
|
377
|
+
let res = {};
|
|
378
|
+
if (target) {
|
|
379
|
+
// @ts-ignore
|
|
380
|
+
if (target[SYMBOL.DEFAULT_MODEL]) {
|
|
381
|
+
// @ts-ignore
|
|
382
|
+
Object.keys(target[SYMBOL.DEFAULT_MODEL])
|
|
383
|
+
.filter(key => {
|
|
384
|
+
// @ts-ignore
|
|
385
|
+
return !_.isFunction(target[SYMBOL.DEFAULT_MODEL][key]);
|
|
386
|
+
})
|
|
387
|
+
.forEach(key => {
|
|
388
|
+
// @ts-ignore
|
|
389
|
+
return res[key] = null;
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
// @ts-ignore
|
|
393
|
+
let mapping = target[SYMBOL.MODELS_MAPPING];
|
|
394
|
+
if (_.isArray(mapping)) {
|
|
395
|
+
mapping.forEach(m => {
|
|
396
|
+
Object.keys(m)
|
|
397
|
+
.forEach(key => {
|
|
398
|
+
// @ts-ignore
|
|
399
|
+
res[key] = null;
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
else if (mapping) {
|
|
404
|
+
Object.keys(mapping)
|
|
405
|
+
.forEach(key => {
|
|
406
|
+
// @ts-ignore
|
|
407
|
+
res[key] = null;
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
let propNames = Object.keys(res).filter(f => !!f);
|
|
412
|
+
propNames = (!propNames.includes('id') ? ['id'] : []).concat(propNames);
|
|
413
|
+
return propNames;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
class TchHelpers {
|
|
417
|
+
static getBy(className) {
|
|
418
|
+
return CLASSNAME_getClassBy(className);
|
|
419
|
+
}
|
|
420
|
+
static getFromObject(o) {
|
|
421
|
+
if (_.isUndefined(o) || _.isNull(o)) {
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
if (o.constructor) {
|
|
425
|
+
return o.constructor;
|
|
426
|
+
}
|
|
427
|
+
const p = Object.getPrototypeOf(o);
|
|
428
|
+
return p && p.constructor;
|
|
429
|
+
}
|
|
430
|
+
static getName(target, production = false) {
|
|
431
|
+
return CLASSNAME_getClassName(target, production);
|
|
432
|
+
}
|
|
433
|
+
static getNameFromObject(o) {
|
|
434
|
+
const fnCLass = this.getFromObject(o);
|
|
435
|
+
return this.getName(fnCLass);
|
|
436
|
+
}
|
|
437
|
+
static getConfigs(target) {
|
|
438
|
+
return CLASSNAME_getClassConfig(target);
|
|
439
|
+
}
|
|
440
|
+
static describeProperites(target) {
|
|
441
|
+
const d1 = describeFromClassStringify(target);
|
|
442
|
+
const d2 = describeByDefaultModelsAndMapping(target);
|
|
443
|
+
let uniq = {};
|
|
444
|
+
// @ts-ignore
|
|
445
|
+
d1.concat(d2).forEach(p => uniq[p] = p);
|
|
446
|
+
return Object.keys(uniq)
|
|
447
|
+
.filter(d => !!d)
|
|
448
|
+
.filter(d => typeof target.prototype[d] !== 'function');
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
const notAllowedAsMethodName = [
|
|
452
|
+
'length', 'name',
|
|
453
|
+
'arguments', 'caller',
|
|
454
|
+
'constructor', 'apply',
|
|
455
|
+
'bind', 'call',
|
|
456
|
+
'toString',
|
|
457
|
+
'__defineGetter__',
|
|
458
|
+
'__defineSetter__', 'hasOwnProperty',
|
|
459
|
+
'__lookupGetter__', '__lookupSetter__',
|
|
460
|
+
'isPrototypeOf', 'propertyIsEnumerable',
|
|
461
|
+
'valueOf', '__proto__', 'toLocaleString',
|
|
462
|
+
];
|
|
463
|
+
const getMethodsNames = (classOrClassInstance, allMethodsNames = []) => {
|
|
464
|
+
if (!classOrClassInstance) {
|
|
465
|
+
return allMethodsNames;
|
|
466
|
+
}
|
|
467
|
+
const isClassFunction = _.isFunction(classOrClassInstance);
|
|
468
|
+
const classFun = (isClassFunction ? classOrClassInstance : Object.getPrototypeOf(classOrClassInstance));
|
|
469
|
+
const objectToCheck = isClassFunction ? classOrClassInstance?.prototype : classOrClassInstance;
|
|
470
|
+
const prototypeObj = Object.getPrototypeOf(objectToCheck || {});
|
|
471
|
+
const properties = _.uniq([
|
|
472
|
+
...Object.getOwnPropertyNames(objectToCheck || {}),
|
|
473
|
+
...Object.getOwnPropertyNames(prototypeObj || {}),
|
|
474
|
+
...Object.keys(objectToCheck || {}),
|
|
475
|
+
...Object.keys(prototypeObj || {}),
|
|
476
|
+
])
|
|
477
|
+
.filter(f => !!f && !notAllowedAsMethodName.includes(f));
|
|
478
|
+
properties.filter((methodName) => typeof objectToCheck[methodName] === 'function').forEach(p => allMethodsNames.push(p));
|
|
479
|
+
if (!classFun || !classFun.constructor || classFun?.constructor?.name === 'Object') {
|
|
480
|
+
return allMethodsNames;
|
|
481
|
+
}
|
|
482
|
+
return getMethodsNames(Object.getPrototypeOf(classFun), allMethodsNames);
|
|
483
|
+
};
|
|
484
|
+
const CLASS = {
|
|
485
|
+
NAME: CLASSNAME_CLASSNAME,
|
|
486
|
+
setName: setClassName,
|
|
487
|
+
getBy: TchHelpers.getBy,
|
|
488
|
+
/**
|
|
489
|
+
* @deprecated
|
|
490
|
+
*/
|
|
491
|
+
getSingleton(target) {
|
|
492
|
+
if (typeof target !== 'function') {
|
|
493
|
+
console.error(`[typescript-class-helpers][setSingletonObj] Type of target is not a function`);
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
const config = TchHelpers.getConfigs(target)[0];
|
|
497
|
+
// console.log(`getSingleton for ${target.name}: `, config.singleton)
|
|
498
|
+
return config.singleton;
|
|
499
|
+
},
|
|
500
|
+
/**
|
|
501
|
+
* @deprecated
|
|
502
|
+
*/
|
|
503
|
+
setSingletonObj(target, singletonObject) {
|
|
504
|
+
// console.log('SET SINGLETON', singletonObject)
|
|
505
|
+
if (typeof target !== 'function') {
|
|
506
|
+
console.error(`[typescript-class-helpers][setSingletonObj] Type of target is not a function`);
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
if (Array.isArray(singletonObject)) {
|
|
510
|
+
console.error(`[typescript-class-helpers][setSingletonObj] Singleton instance cant be an array`);
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
if (typeof singletonObject !== 'object') {
|
|
514
|
+
console.error(`[typescript-class-helpers][setSingletonObj] Singleton instance cant must be a object`);
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
const className = CLASS.getName(target);
|
|
518
|
+
// console.log(`SINGLETON SET for TARGET ${className}`)
|
|
519
|
+
const config = TchHelpers.getConfigs(target)[0];
|
|
520
|
+
if (config.singleton) {
|
|
521
|
+
console.warn(`[typescript-class-helpers] You are trying to set singleton of "${className}" second time with different object.`);
|
|
522
|
+
}
|
|
523
|
+
config.singleton = singletonObject;
|
|
524
|
+
},
|
|
525
|
+
/**
|
|
526
|
+
* @deprecated
|
|
527
|
+
*/
|
|
528
|
+
getConfigs: TchHelpers.getConfigs,
|
|
529
|
+
/**
|
|
530
|
+
* @deprecated
|
|
531
|
+
*/
|
|
532
|
+
getConfig: (target) => {
|
|
533
|
+
return _.first(TchHelpers.getConfigs(target));
|
|
534
|
+
},
|
|
535
|
+
getMethodsNames(classOrClassInstance) {
|
|
536
|
+
return getMethodsNames(classOrClassInstance);
|
|
537
|
+
},
|
|
538
|
+
getFromObject: TchHelpers.getFromObject,
|
|
539
|
+
getName: TchHelpers.getName,
|
|
540
|
+
getNameFromObject: TchHelpers.getNameFromObject,
|
|
541
|
+
describeProperites: TchHelpers.describeProperites,
|
|
542
|
+
/**
|
|
543
|
+
* @deprecated
|
|
544
|
+
*/
|
|
545
|
+
OBJECT: (obj) => {
|
|
546
|
+
return {
|
|
547
|
+
get indexValue() {
|
|
548
|
+
return CLASSNAME_getObjectIndexValue(obj);
|
|
549
|
+
},
|
|
550
|
+
get indexProperty() {
|
|
551
|
+
return CLASSNAME_getObjectIndexPropertyValue(obj);
|
|
552
|
+
},
|
|
553
|
+
get isClassObject() {
|
|
554
|
+
if (!_.isObject(obj) || _.isArray(obj) || _.isRegExp(obj) ||
|
|
555
|
+
_.isBuffer(obj) || _.isArrayBuffer(obj)) {
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
if (_.isDate(obj)) {
|
|
559
|
+
return true;
|
|
560
|
+
}
|
|
561
|
+
const className = CLASS.getNameFromObject(obj);
|
|
562
|
+
return _.isString(className) && className !== 'Object';
|
|
563
|
+
},
|
|
564
|
+
isEqual: (anotherObj, compareDeep = false) => {
|
|
565
|
+
if (!CLASS.OBJECT(obj).isClassObject || !CLASS.OBJECT(anotherObj).isClassObject) {
|
|
566
|
+
return false;
|
|
567
|
+
}
|
|
568
|
+
if (obj === anotherObj) {
|
|
569
|
+
// console.log(`EQ v1: , v2: - class1 ${CLASS.getNameFromObject(obj)}, class2 ${CLASS.getNameFromObject(anotherObj)}`, obj, anotherObj)
|
|
570
|
+
return true;
|
|
571
|
+
}
|
|
572
|
+
const v1 = CLASSNAME_getObjectIndexValue(obj);
|
|
573
|
+
const v2 = CLASSNAME_getObjectIndexValue(anotherObj);
|
|
574
|
+
const f1 = CLASSNAME_getObjectClassFamily(obj);
|
|
575
|
+
const f2 = CLASSNAME_getObjectClassFamily(anotherObj);
|
|
576
|
+
const isFamilyDiff = (!_.isString(f1) || !_.isString(f2) || (f1 !== f2));
|
|
577
|
+
// console.log(`DIFF FAMILY ${isFamilyDiff} v1: ${CLASSNAME_getObjectClassFamily(obj)}, v2: ${CLASSNAME_getObjectClassFamily(anotherObj)} - class1 ${CLASS.getNameFromObject(obj)}, class2 ${CLASS.getNameFromObject(anotherObj)}`)
|
|
578
|
+
if (isFamilyDiff) {
|
|
579
|
+
// console.log(`DIFF v1: ${v1}, v2: ${v2} - class1 ${CLASS.getNameFromObject(obj)}, class2 ${CLASS.getNameFromObject(anotherObj)}`)
|
|
580
|
+
return false;
|
|
581
|
+
}
|
|
582
|
+
if (!CLASS.OBJECT(obj).isClassObject || !CLASS.OBJECT(anotherObj).isClassObject) {
|
|
583
|
+
// console.log(`NOT CLASS v1: ${v1}, v2: ${v2} - class1 ${CLASS.getNameFromObject(obj)}, class2 ${CLASS.getNameFromObject(anotherObj)}`)
|
|
584
|
+
return false;
|
|
585
|
+
}
|
|
586
|
+
// console.log(`v1: ${v1} ,class ${CLASS.getNameFromObject(obj)} ,prop: ${CLASS.OBJECT(obj).indexProperty}`)
|
|
587
|
+
// console.log(`v2: ${v2} ,class ${CLASS.getNameFromObject(anotherObj)} ,prop: ${CLASS.OBJECT(anotherObj).indexProperty}`)
|
|
588
|
+
// console.log(`v1: ${v1}, v2: ${v2} - class1 ${CLASS.getNameFromObject(obj)}, class2 ${CLASS.getNameFromObject(anotherObj)}`)
|
|
589
|
+
// console.log('')
|
|
590
|
+
if ((_.isNumber(v1) && _.isNumber(v2)) || (_.isString(v1) && _.isString(v2))) {
|
|
591
|
+
const res = (v1 === v2);
|
|
592
|
+
// @ts-ignore
|
|
593
|
+
return res;
|
|
594
|
+
}
|
|
595
|
+
if (compareDeep) {
|
|
596
|
+
return _.isEqual(v1, v2);
|
|
597
|
+
}
|
|
598
|
+
return false;
|
|
599
|
+
}
|
|
600
|
+
};
|
|
601
|
+
}
|
|
602
|
+
};
|
|
603
|
+
|
|
604
|
+
/**
|
|
605
|
+
* Generated bundle index. Do not edit.
|
|
606
|
+
*/
|
|
607
|
+
|
|
608
|
+
export { CLASS, Models_ClassConfig, Models_MethodConfig, Models_ParamConfig, SYMBOL, TchHelpers };
|
|
609
|
+
//# sourceMappingURL=typescript-class-helpers-browser.mjs.map
|