@techextensor/tab-core-utility 2.2.130 → 2.2.132
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/esm2022/index.mjs +2 -1
- package/esm2022/lib/tab-core-utility/app/constants/storage-constants.mjs +2 -1
- package/esm2022/lib/tab-core-utility/app/helpers/common/meta-data.helpers.mjs +661 -0
- package/esm2022/lib/tab-core-utility/app/interfaces/schema.interface.mjs +9 -2
- package/index.d.ts +1 -0
- package/lib/tab-core-utility/app/constants/storage-constants.d.ts +1 -0
- package/lib/tab-core-utility/app/helpers/common/meta-data.helpers.d.ts +355 -0
- package/lib/tab-core-utility/app/interfaces/schema.interface.d.ts +16 -0
- package/lib/tab-core-utility/store/auth.store.d.ts +2 -2
- package/package.json +1 -1
package/esm2022/index.mjs
CHANGED
|
@@ -24,6 +24,7 @@ export * from './lib/tab-core-utility/app/helpers/common/dsq.helpers';
|
|
|
24
24
|
export * from './lib/tab-core-utility/app/helpers/common/req-res.helpers';
|
|
25
25
|
export * from './lib/tab-core-utility/app/helpers/common/where-clause.helpers';
|
|
26
26
|
export * from './lib/tab-core-utility/app/helpers/common/template.helpers';
|
|
27
|
+
export * from './lib/tab-core-utility/app/helpers/common/meta-data.helpers';
|
|
27
28
|
export * from './lib/tab-core-utility/app/helpers/screen/forms.helpers';
|
|
28
29
|
export * from './lib/tab-core-utility/app/helpers/screen/grid-column-data.helpers';
|
|
29
30
|
export * from './lib/tab-core-utility/app/helpers/screen/grid.helpers';
|
|
@@ -66,4 +67,4 @@ export * from './lib/tab-core-utility/core/util/auth.utils';
|
|
|
66
67
|
export * from './lib/tab-core-utility/store/orginfo.store';
|
|
67
68
|
// export * from './lib/tab-core-utility/store/schema.store'
|
|
68
69
|
export * from './lib/tab-core-utility/store/auth.store';
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2RhdGEtYWNjZXNzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrQkFBa0I7QUFDbEIsY0FBYyxvREFBb0QsQ0FBQztBQUNuRSxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMscURBQXFELENBQUM7QUFDcEUsY0FBYyx3REFBd0QsQ0FBQztBQUV2RSxhQUFhO0FBQ2IsY0FBYyxpREFBaUQsQ0FBQztBQUNoRSxjQUFjLG9EQUFvRCxDQUFDO0FBQ25FLGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyxvREFBb0QsQ0FBQztBQUNuRSxjQUFjLG9EQUFvRCxDQUFDO0FBQ25FLGNBQWMsc0RBQXNELENBQUM7QUFDckUsY0FBYyx1REFBdUQsQ0FBQztBQUV0RSxhQUFhO0FBQ2IsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLDJDQUEyQyxDQUFDO0FBQzFELGNBQWMsa0RBQWtELENBQUM7QUFDakUsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLGdEQUFnRCxDQUFDO0FBRS9ELGdCQUFnQjtBQUNoQixjQUFjLHVEQUF1RCxDQUFDO0FBQ3RFLGNBQWMsdUVBQXVFLENBQUM7QUFDdEYsY0FBYyx1REFBdUQsQ0FBQztBQUN0RSxjQUFjLDJEQUEyRCxDQUFDO0FBQzFFLGNBQWMsZ0VBQWdFLENBQUM7QUFDL0UsY0FBYyw0REFBNEQsQ0FBQztBQUMzRSxjQUFjLDZEQUE2RCxDQUFDO0FBRTVFLGNBQWMseURBQXlELENBQUM7QUFDeEUsY0FBYyxvRUFBb0UsQ0FBQztBQUNuRixjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsZ0VBQWdFLENBQUM7QUFDL0UsY0FBYywwREFBMEQsQ0FBQztBQUN6RSxjQUFjLDBEQUEwRCxDQUFDO0FBQ3pFLHNGQUFzRjtBQUV0RixtQkFBbUI7QUFDbkIsY0FBYyxzREFBc0QsQ0FBQztBQUNyRSxjQUFjLDREQUE0RCxDQUFDO0FBQzNFLGNBQWMsc0RBQXNELENBQUM7QUFDckUsY0FBYyx5REFBeUQsQ0FBQztBQUN4RSxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsc0RBQXNELENBQUM7QUFFckUsZUFBZTtBQUNmLGNBQWMsbURBQW1ELENBQUM7QUFDbEUsY0FBYyxvREFBb0QsQ0FBQztBQUNuRSxjQUFjLGdEQUFnRCxDQUFDO0FBQy9ELGNBQWMsNkRBQTZELENBQUM7QUFFNUUsY0FBYztBQUNkLGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYyxvREFBb0QsQ0FBQztBQUNuRSxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsaURBQWlELENBQUM7QUFDaEUsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLCtDQUErQyxDQUFDO0FBRTlELE9BQU87QUFDUCxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsbURBQW1ELENBQUM7QUFDbEUsY0FBYyxxREFBcUQsQ0FBQztBQUNwRSxjQUFjLGlEQUFpRCxDQUFDO0FBRWhFLE9BQU87QUFDUCxjQUFjLDZFQUE2RSxDQUFDO0FBQzVGLGNBQWMsK0RBQStELENBQUM7QUFDOUUsY0FBYyxzRUFBc0UsQ0FBQztBQUVyRixjQUFjLHVEQUF1RCxDQUFDO0FBQ3RFLGNBQWMscURBQXFELENBQUM7QUFFcEUsY0FBYyw2Q0FBNkMsQ0FBQztBQUc1RCxRQUFRO0FBRVIsY0FBYyw0Q0FBNEMsQ0FBQTtBQUMxRCw0REFBNEQ7QUFDNUQsY0FBYyx5Q0FBeUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFwcCAvIGNvbnN0YW50c1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvY29uc3RhbnRzL2FwaS1jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvY29uc3RhbnRzL2NvbW1vbic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9jb25zdGFudHMvZXJyb3ItbWVzc2FnZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvY29uc3RhbnRzL3N0b3JhZ2UtY29uc3RhbnRzJztcblxuLy8gQXBwIC8gY3J1ZFxuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvY3J1ZC90YWItZ2V0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvY3J1ZC90YWItZm9ybWlvLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvY3J1ZC90YWItaW5zZXJ0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvY3J1ZC90YWItZGVsZXRlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvY3J1ZC90YWItdXBkYXRlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvY3J1ZC90YWItd29ya2Zsb3cuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9jcnVkL3RhYi1ibHVlcHJpbnQuc2VydmljZSc7XG5cbi8vIEFwcCAvIGVudW1cbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2VudW1zL2NvbnRyb2xsZXJzLmVudW0nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvZW51bXMvZHNxLmVudW0nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvZW51bXMvcGVybWlzc2lvbi5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2VudW1zL3F1ZXJ5LmVudW0nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvZW51bXMvd29ya2Zsb3cuZW51bSc7XG5cbi8vIEFwcCAvIGhlbHBlcnNcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2hlbHBlcnMvY29tbW9uL2FwcC5oZWxwZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2hlbHBlcnMvY29tbW9uL3VzZXItcGVyc29uYWxpemF0aW9uLmhlbHBlcic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9oZWxwZXJzL2NvbW1vbi9kc3EuaGVscGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9oZWxwZXJzL2NvbW1vbi9yZXEtcmVzLmhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvaGVscGVycy9jb21tb24vd2hlcmUtY2xhdXNlLmhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvaGVscGVycy9jb21tb24vdGVtcGxhdGUuaGVscGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9oZWxwZXJzL2NvbW1vbi9tZXRhLWRhdGEuaGVscGVycyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2hlbHBlcnMvc2NyZWVuL2Zvcm1zLmhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvaGVscGVycy9zY3JlZW4vZ3JpZC1jb2x1bW4tZGF0YS5oZWxwZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2hlbHBlcnMvc2NyZWVuL2dyaWQuaGVscGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9oZWxwZXJzL3NjcmVlbi9tZWRpYS11cGxvYWQuaGVscGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9oZWxwZXJzL3NjcmVlbi9wbHVnaW4uaGVscGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9oZWxwZXJzL3NjcmVlbi9zY3JlZW4uaGVscGVycyc7XG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9oZWxwZXJzL3NjcmVlbi9mdHAtbWVkaWEtdXBsb2FkLmhlbHBlcnMnO1xuXG4vLyBBcHAgLyBpbnRlcmZhY2VzXG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9pbnRlcmZhY2VzL2F1dGguaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2ludGVyZmFjZXMvY29tbW9uLWFwaS5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvaW50ZXJmYWNlcy91c2VyLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9pbnRlcmZhY2VzL29yZ0luZm8uaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2ludGVyZmFjZXMvc2NoZW1hLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9pbnRlcmZhY2VzL2dyaWQuaW50ZXJmYWNlJztcblxuLy8gQXBwIC8gbW9kZWxzXG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9tb2RlbHMvYXBpLXF1ZXJ5LmNsYXNzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL21vZGVscy9hcHAtb2JqZWN0LmNsYXNzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL21vZGVscy9jb21tb24uY2xhc3MnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvbW9kZWxzL2RhdGEtc291cmNlLXF1ZXJpZXMuY2xhc3MnO1xuXG4vLyBBcHAgLyB1dGlsc1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvdXRpbHMvZmlsdGVyLnV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvdXRpbHMvZm9ybS1idWlsZGVyLnV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvdXRpbHMvanNvbi51dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL3V0aWxzL29wZXJhdG9ycy51dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL3V0aWxzL3JlcS1yZXMudXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC91dGlscy90YWItYXBwLnV0aWwnO1xuXG4vLyBBdXRoXG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2F1dGgvYXV0aC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXV0aC9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9hdXRoL3Nlc3Npb24tc3RvcmFnZS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvYXV0aC9pZGItc3RvcmFnZS5zZXJ2aWNlJztcblxuLy8gQ29yZVxuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9jb3JlL2Vycm9yLWhhbmRsZXIvZXJyb3ItaGFuZGxlci1pbnRlcmNlcHRvci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvY29yZS9lcnJvci1oYW5kbGVyL2Vycm9yLWhhbmRsZXIuc3RvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGFiLWNvcmUtdXRpbGl0eS9jb3JlL2Vycm9yLWhhbmRsZXIvbW9kZWxzL2Vycm9yLWhhbmRsZXIuc3RhdGUnO1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2NvcmUvaHR0cC1jbGllbnQvYXBpLXVybC50b2tlbic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2NvcmUvaHR0cC1jbGllbnQvYXBpLnNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L2NvcmUvdXRpbC9hdXRoLnV0aWxzJztcblxuXG4vLyBzdG9yZVxuXG5leHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L3N0b3JlL29yZ2luZm8uc3RvcmUnXG4vLyBleHBvcnQgKiBmcm9tICcuL2xpYi90YWItY29yZS11dGlsaXR5L3N0b3JlL3NjaGVtYS5zdG9yZSdcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RhYi1jb3JlLXV0aWxpdHkvc3RvcmUvYXV0aC5zdG9yZSdcbiJdfQ==
|
|
@@ -18,6 +18,7 @@ export const StorageConstants = {
|
|
|
18
18
|
AppId: 'AppId',
|
|
19
19
|
screenContext: 'screenContext',
|
|
20
20
|
environmentMode: 'environmentMode',
|
|
21
|
+
environmentId: 'environmentId',
|
|
21
22
|
tabAppObjectAccess: 'tabAppObjectAccess'
|
|
22
23
|
};
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1jb25zdGFudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2RhdGEtYWNjZXNzL3NyYy9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvY29uc3RhbnRzL3N0b3JhZ2UtY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsR0FBRyxFQUFFLEtBQUs7SUFDVixRQUFRLEVBQUUsVUFBVTtJQUNwQixLQUFLLEVBQUUsT0FBTztJQUNkLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLG9CQUFvQixFQUFFLHNCQUFzQjtJQUM1QyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLHVCQUF1QixFQUFFLHlCQUF5QjtJQUNsRCxLQUFLLEVBQUMsT0FBTztJQUNiLGFBQWEsRUFBQyxlQUFlO0lBQzdCLGVBQWUsRUFBQyxpQkFBaUI7SUFDakMsYUFBYSxFQUFDLGVBQWU7SUFDN0Isa0JBQWtCLEVBQUUsb0JBQW9CO0NBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgU3RvcmFnZUNvbnN0YW50cyA9IHtcclxuICB0YWJEYXRhOiAndGFiRGF0YScsXHJcbiAgZm9ybUpzb246ICdGb3JtSnNvbicsXHJcbiAgc2NoZW1hSlNPTjogJ3NjaGVtYUpTT04nLFxyXG4gIG9yZ0luZm86ICdvcmdJbmZvJyxcclxuICBhcHBsaWNhdGlvbkNvZGU6ICdhcHBsaWNhdGlvbkNvZGUnLFxyXG4gIFRBQjogJ1RBQicsXHJcbiAgdXNlckluZm86ICd1c2VySW5mbycsXHJcbiAgdG9rZW46ICd0b2tlbicsXHJcbiAgc3RhdGljVG9rZW46ICdzdGF0aWNUb2tlbicsXHJcbiAgc2NyZWVuSWQ6ICdzY3JlZW5JZCcsXHJcbiAgZWRpdFNjcmVlblF1ZXJ5UGFyYW06ICdlZGl0U2NyZWVuUXVlcnlQYXJhbScsXHJcbiAgbGF5b3V0U2NyZWVuSWQ6ICdsYXlvdXRTY3JlZW5JZCcsXHJcbiAgdGFiU2NyZWVuOiAndGFiU2NyZWVuJyxcclxuICBUZW5hbnRJZDogJ1RlbmFudElkJyxcclxuICBBdXRob3JpemF0aW9uOiAnQXV0aG9yaXphdGlvbicsXHJcbiAgdGFiVXNlclBlcnNvbmFsaXplZERhdGE6ICd0YWJVc2VyUGVyc29uYWxpemVkRGF0YScsXHJcbiAgQXBwSWQ6J0FwcElkJyxcclxuICBzY3JlZW5Db250ZXh0OidzY3JlZW5Db250ZXh0JyxcclxuICBlbnZpcm9ubWVudE1vZGU6J2Vudmlyb25tZW50TW9kZScsXHJcbiAgZW52aXJvbm1lbnRJZDonZW52aXJvbm1lbnRJZCcsXHJcbiAgdGFiQXBwT2JqZWN0QWNjZXNzOiAndGFiQXBwT2JqZWN0QWNjZXNzJ1xyXG59O1xyXG4iXX0=
|
|
@@ -0,0 +1,661 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { Injectable } from "@angular/core";
|
|
3
|
+
import { MetadataEntityType } from "../../interfaces/schema.interface";
|
|
4
|
+
import { Common } from "../../constants/common";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* MetadataUtils - Utility service for retrieving and manipulating application metadata
|
|
8
|
+
*
|
|
9
|
+
* This service provides methods to extract, filter, and format different parts of the
|
|
10
|
+
* application metadata, including objects, fields, screens, menus, etc.
|
|
11
|
+
*/
|
|
12
|
+
export class MetadataHelper {
|
|
13
|
+
// Helper method to consistently format results
|
|
14
|
+
formatResults(items, columns) {
|
|
15
|
+
if (!columns || columns.length === 0) {
|
|
16
|
+
return items;
|
|
17
|
+
}
|
|
18
|
+
return items.map(item => {
|
|
19
|
+
const result = {};
|
|
20
|
+
columns.forEach(col => {
|
|
21
|
+
result[col] = item[col];
|
|
22
|
+
});
|
|
23
|
+
return result;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Search across all metadata for a term
|
|
28
|
+
*
|
|
29
|
+
* @param searchTerm Term to search for
|
|
30
|
+
* @param entityTypes Optional types of entities to search (if not provided, searches all)
|
|
31
|
+
* @returns Search results grouped by entity type
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* // Search across all metadata
|
|
35
|
+
* const results = metadataUtils.searchAcrossMetadata('Blueprint');
|
|
36
|
+
*
|
|
37
|
+
* // Search only in app objects and screens
|
|
38
|
+
* const results = metadataUtils.searchAcrossMetadata(
|
|
39
|
+
* 'Role',
|
|
40
|
+
* [MetadataEntityType.APP_OBJECTS, MetadataEntityType.APP_SCREENS]
|
|
41
|
+
* );
|
|
42
|
+
*/
|
|
43
|
+
searchAcrossMetadata(searchTerm, entityTypes) {
|
|
44
|
+
try {
|
|
45
|
+
if (!searchTerm || searchTerm.trim() === '') {
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
const term = searchTerm.toLowerCase();
|
|
49
|
+
const results = {};
|
|
50
|
+
// If entityTypes not provided, search all entity types
|
|
51
|
+
const typesToSearch = entityTypes || Object.values(MetadataEntityType);
|
|
52
|
+
// Execute search for each entity type
|
|
53
|
+
if (typesToSearch.includes(MetadataEntityType.APP_OBJECTS)) {
|
|
54
|
+
results[MetadataEntityType.APP_OBJECTS] = this.searchAppObjects(term);
|
|
55
|
+
}
|
|
56
|
+
if (typesToSearch.includes(MetadataEntityType.APP_FIELDS)) {
|
|
57
|
+
results[MetadataEntityType.APP_FIELDS] = this.searchAppFields(term);
|
|
58
|
+
}
|
|
59
|
+
if (typesToSearch.includes(MetadataEntityType.DATA_SOURCE_QUERIES)) {
|
|
60
|
+
results[MetadataEntityType.DATA_SOURCE_QUERIES] = this.searchDataSourceQueries(term);
|
|
61
|
+
}
|
|
62
|
+
if (typesToSearch.includes(MetadataEntityType.APP_SCREENS)) {
|
|
63
|
+
results[MetadataEntityType.APP_SCREENS] = this.searchAppScreens(term);
|
|
64
|
+
}
|
|
65
|
+
if (typesToSearch.includes(MetadataEntityType.APP_MENUS)) {
|
|
66
|
+
results[MetadataEntityType.APP_MENUS] = this.searchAppMenus(term);
|
|
67
|
+
}
|
|
68
|
+
return results;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.error('Error in searchMetadata:', error);
|
|
72
|
+
return {};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Search for a term within App Objects
|
|
77
|
+
* @private
|
|
78
|
+
*/
|
|
79
|
+
searchAppObjects(term) {
|
|
80
|
+
return this.getAppObjects(obj => this.containsTerm(obj.ObjectName, term) ||
|
|
81
|
+
this.containsTerm(obj.DisplayName, term) ||
|
|
82
|
+
this.containsTerm(obj.Description, term) ||
|
|
83
|
+
this.containsTerm(obj.SystemDBTableName, term));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Search for a term within App Fields
|
|
87
|
+
* @private
|
|
88
|
+
*/
|
|
89
|
+
searchAppFields(term) {
|
|
90
|
+
return this.getAppFields(field => this.containsTerm(field.FieldName, term) ||
|
|
91
|
+
this.containsTerm(field.DisplayName, term) ||
|
|
92
|
+
this.containsTerm(field.Description, term) ||
|
|
93
|
+
this.containsTerm(field.SystemDBFieldName, term));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Search for a term within Data Source Queries
|
|
97
|
+
* @private
|
|
98
|
+
*/
|
|
99
|
+
searchDataSourceQueries(term) {
|
|
100
|
+
return this.getDataSourceQueries(query => this.containsTerm(query.QueryName, term) ||
|
|
101
|
+
this.containsTerm(query.DisplayName, term));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Search for a term within App Screens
|
|
105
|
+
* @private
|
|
106
|
+
*/
|
|
107
|
+
searchAppScreens(term) {
|
|
108
|
+
return this.getAppScreens(screen => this.containsTerm(screen.Name, term) ||
|
|
109
|
+
this.containsTerm(screen.Description, term));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Search for a term within App Menus
|
|
113
|
+
* @private
|
|
114
|
+
*/
|
|
115
|
+
searchAppMenus(term) {
|
|
116
|
+
return this.getAppMenus(menu => this.containsTerm(menu.MenuName, term) ||
|
|
117
|
+
this.containsTerm(menu.DisplayName, term));
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Helper method to check if a string contains a search term
|
|
121
|
+
* @private
|
|
122
|
+
*/
|
|
123
|
+
containsTerm(value, term) {
|
|
124
|
+
return !!value && value.toLowerCase().includes(term);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Gets App Objects based on filter criteria
|
|
128
|
+
*
|
|
129
|
+
* @param filterFn Optional filter function to apply to app objects
|
|
130
|
+
* @param columns Optional columns to include in the result
|
|
131
|
+
* @returns Array of filtered app objects
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* // Get all system app objects
|
|
135
|
+
* const systemObjects = metadataUtils.getAppObjects(obj => obj.IsSystem === true);
|
|
136
|
+
*
|
|
137
|
+
* // Get specific columns from non-deprecated objects
|
|
138
|
+
* const objects = metadataUtils.getAppObjects(
|
|
139
|
+
* obj => !obj.IsDeprecated,
|
|
140
|
+
* ['ID', 'DisplayName', 'ObjectName']
|
|
141
|
+
* );
|
|
142
|
+
*/
|
|
143
|
+
getAppObjects(filterFn, columns) {
|
|
144
|
+
try {
|
|
145
|
+
let appObjects = Common.tabJson.AppObjects || [];
|
|
146
|
+
// Apply filter if provided
|
|
147
|
+
if (filterFn) {
|
|
148
|
+
appObjects = appObjects.filter(filterFn);
|
|
149
|
+
}
|
|
150
|
+
// Return all object data if no columns specified
|
|
151
|
+
return this.formatResults(appObjects, columns);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error('Error in getAppObjects:', error);
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Gets a specific App Object by ID or Name
|
|
160
|
+
*
|
|
161
|
+
* @param appObject ID or Name of the app object to retrieve
|
|
162
|
+
* @param columns Optional columns to include in the result
|
|
163
|
+
* @returns The app object with specified columns or null if not found
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* // Get a specific app object with all properties
|
|
167
|
+
* const appObj = metadataUtils.getAppObjectDetails('b4887d4d-bb1e-4d52-a7e8-2f943d69e44c' or 'TABMD_SYSTEM');
|
|
168
|
+
*
|
|
169
|
+
* // Get specific columns from an app object
|
|
170
|
+
* const appObj = metadataUtils.getAppObjectDetails(
|
|
171
|
+
* 'b4887d4d-bb1e-4d52-a7e8-2f943d69e44c',
|
|
172
|
+
* ['ID', 'DisplayName', 'ObjectName']
|
|
173
|
+
* );
|
|
174
|
+
*/
|
|
175
|
+
getAppObjectDetails(appObject, columns) {
|
|
176
|
+
try {
|
|
177
|
+
return this.getAppObjects(obj => obj.ID?.toLowerCase() === appObject?.toLowerCase() || obj.ObjectName === appObject, columns)?.[0] ?? null;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
console.error('Error in getAppObjectById:', error);
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Gets all fields across all app objects with filter criteria
|
|
186
|
+
*
|
|
187
|
+
* @param filterFn Optional filter function to apply to fields
|
|
188
|
+
* @param columns Optional columns to include in the result
|
|
189
|
+
* @returns Array of filtered fields
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* // Get all required fields across all objects
|
|
193
|
+
* const requiredFields = metadataUtils.getAppFields(field => field.IsRequired === true);
|
|
194
|
+
*
|
|
195
|
+
* // Get specific columns from searchable fields
|
|
196
|
+
* const fields = metadataUtils.getAppFields(
|
|
197
|
+
* field => field.IsSearchable === true,
|
|
198
|
+
* ['ID', 'DisplayName', 'FieldName']
|
|
199
|
+
* );
|
|
200
|
+
*/
|
|
201
|
+
getAppFields(filterFn, columns) {
|
|
202
|
+
try {
|
|
203
|
+
// Get all fields from all app objects
|
|
204
|
+
const allFields = [];
|
|
205
|
+
Common.tabJson.AppObjects.forEach((obj) => {
|
|
206
|
+
allFields.push(...obj.Fields);
|
|
207
|
+
});
|
|
208
|
+
// Apply filter if provided
|
|
209
|
+
let filteredFields = allFields;
|
|
210
|
+
if (filterFn) {
|
|
211
|
+
filteredFields = allFields.filter(filterFn);
|
|
212
|
+
}
|
|
213
|
+
// Return all field data if no columns specified
|
|
214
|
+
return this.formatResults(filteredFields, columns);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
console.error('Error in getAppFields:', error);
|
|
218
|
+
return [];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Gets fields for a specific app object
|
|
223
|
+
*
|
|
224
|
+
* @param appObject ID or Name of the app object
|
|
225
|
+
* @param filterFn Optional filter function for fields
|
|
226
|
+
* @returns Array of fields for the specified object
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* // Get all fields for an object
|
|
230
|
+
* const fields = metadataUtils.getAppFieldsByAppObject('b4887d4d-bb1e-4d52-a7e8-2f943d69e44c' or 'TABMD_SYSTEM');
|
|
231
|
+
*
|
|
232
|
+
* // Get only required fields
|
|
233
|
+
* const requiredFields = metadataUtils.getAppFieldsByAppObject(
|
|
234
|
+
* 'b4887d4d-bb1e-4d52-a7e8-2f943d69e44c',
|
|
235
|
+
* field => field.IsRequired === true
|
|
236
|
+
* );
|
|
237
|
+
*/
|
|
238
|
+
getAppFieldsByAppObject(appObject, filterFn, columns) {
|
|
239
|
+
try {
|
|
240
|
+
const filteredAppObject = this.getAppObjectDetails(appObject);
|
|
241
|
+
if (!filteredAppObject) {
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
let fields = filteredAppObject.Fields || [];
|
|
245
|
+
// Apply filter if provided
|
|
246
|
+
if (filterFn) {
|
|
247
|
+
fields = fields.filter(filterFn);
|
|
248
|
+
}
|
|
249
|
+
return this.formatResults(fields, columns);
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
console.error('Error in getAppFieldById:', error);
|
|
253
|
+
return [];
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Gets lookup fields for a specific app object
|
|
258
|
+
*
|
|
259
|
+
* @param appObject ID or Name of the app object
|
|
260
|
+
* @param filterFn Optional filter function for lookup fields
|
|
261
|
+
* @param columns Optional columns to include in the result
|
|
262
|
+
* @returns Array of lookup fields for the specified object
|
|
263
|
+
*
|
|
264
|
+
* @example
|
|
265
|
+
* // Get all lookup fields for an object
|
|
266
|
+
* const lookupFields = metadataUtils.getLookupFieldsByAppObject('TABD_Blueprint_SLASchemes');
|
|
267
|
+
*
|
|
268
|
+
* // Get specific lookup fields
|
|
269
|
+
* const fields = metadataUtils.getLookupFieldsByAppObject(
|
|
270
|
+
* 'b4887d4d-bb1e-4d52-a7e8-2f943d69e44c',
|
|
271
|
+
* field => field.IsRequired === true
|
|
272
|
+
* );
|
|
273
|
+
*/
|
|
274
|
+
getLookupFieldsByAppObject(appObject, filterFn, columns) {
|
|
275
|
+
try {
|
|
276
|
+
// Get fields for the specified object that are lookups
|
|
277
|
+
return this.getAppFieldsByAppObject(appObject, field => {
|
|
278
|
+
// Check if the field is a lookup type
|
|
279
|
+
const isLookup = field.LookUpDetails != null;
|
|
280
|
+
// Apply additional user filter if provided
|
|
281
|
+
return isLookup && (!filterFn || filterFn(field));
|
|
282
|
+
}, columns);
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
console.error('Error in getAppObjectLookupFields:', error);
|
|
286
|
+
return [];
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Gets data source queries with filter criteria
|
|
291
|
+
*
|
|
292
|
+
* @param filterFn Optional filter function to apply to queries
|
|
293
|
+
* @param columns Optional columns to include in the result
|
|
294
|
+
* @returns Array of filtered data source queries
|
|
295
|
+
*
|
|
296
|
+
* @example
|
|
297
|
+
* // Get all queries with a specific naming pattern
|
|
298
|
+
* const queries = metadataUtils.getDataSourceQueries(query => query.QueryName.includes('List'));
|
|
299
|
+
*
|
|
300
|
+
* // Get specific columns from all queries
|
|
301
|
+
* const queries = metadataUtils.getDataSourceQueries(
|
|
302
|
+
* undefined,
|
|
303
|
+
* ['ID', 'QueryName', 'DisplayName']
|
|
304
|
+
* );
|
|
305
|
+
*/
|
|
306
|
+
getDataSourceQueries(filterFn, columns) {
|
|
307
|
+
try {
|
|
308
|
+
// Get all data source queries from all app objects
|
|
309
|
+
const allQueries = [];
|
|
310
|
+
Common.tabJson.AppObjects.forEach((obj) => {
|
|
311
|
+
if (obj.DataSourceQueries && obj.DataSourceQueries.length > 0) {
|
|
312
|
+
allQueries.push(...obj.DataSourceQueries);
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
// Apply filter if provided
|
|
316
|
+
let filteredQueries = allQueries;
|
|
317
|
+
if (filterFn) {
|
|
318
|
+
filteredQueries = allQueries.filter(filterFn);
|
|
319
|
+
}
|
|
320
|
+
return this.formatResults(filteredQueries, columns);
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
console.error('Error in getDataSourceQueries:', error);
|
|
324
|
+
return [];
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Gets data source queries for a specific app object
|
|
329
|
+
*
|
|
330
|
+
* @param appObject ID or Name of the app object
|
|
331
|
+
* @param filterFn Optional filter function for queries
|
|
332
|
+
* @param columns Optional columns to include in the result
|
|
333
|
+
* @returns Array of queries for the specified object
|
|
334
|
+
*
|
|
335
|
+
* @example
|
|
336
|
+
* // Get all queries for an object
|
|
337
|
+
* const queries = metadataUtils.getDataSourceQueriesByAppObject('b4887d4d-bb1e-4d52-a7e8-2f943d69e44c');
|
|
338
|
+
*
|
|
339
|
+
* // Get queries with specific pattern
|
|
340
|
+
* const filteredQueries = metadataUtils.getDataSourceQueriesByAppObject(
|
|
341
|
+
* 'TABD_Blueprint_SLASchemes',
|
|
342
|
+
* query => query.QueryName.includes('List')
|
|
343
|
+
* );
|
|
344
|
+
*/
|
|
345
|
+
getDataSourceQueriesByAppObject(appObject, filterFn, columns) {
|
|
346
|
+
try {
|
|
347
|
+
const filteredAppObject = this.getAppObjectDetails(appObject);
|
|
348
|
+
if (!filteredAppObject || !filteredAppObject.DataSourceQueries) {
|
|
349
|
+
return [];
|
|
350
|
+
}
|
|
351
|
+
let queries = filteredAppObject.DataSourceQueries;
|
|
352
|
+
// Apply filter if provided
|
|
353
|
+
if (filterFn) {
|
|
354
|
+
queries = queries.filter(filterFn);
|
|
355
|
+
}
|
|
356
|
+
return this.formatResults(queries, columns);
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
console.error('Error in getAppObjectQueries:', error);
|
|
360
|
+
return [];
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Gets a specific Data Source Query by ID or Name
|
|
365
|
+
*
|
|
366
|
+
* @param query ID or Name of the data source query to retrieve
|
|
367
|
+
* @param columns Optional columns to include in the result
|
|
368
|
+
* @returns The data source query with specified columns or null if not found
|
|
369
|
+
*
|
|
370
|
+
* @example
|
|
371
|
+
* // Get a specific query with all properties
|
|
372
|
+
* const query = metadataUtils.getDataSourceQueryDetails('73e590d0-c4eb-464d-abf9-01943e30ae09');
|
|
373
|
+
*
|
|
374
|
+
* // Get specific columns from a query by name
|
|
375
|
+
* const query = metadataUtils.getDataSourceQueryDetails(
|
|
376
|
+
* 'Get_SLASchemes_List',
|
|
377
|
+
* ['ID', 'QueryName', 'DisplayName']
|
|
378
|
+
* );
|
|
379
|
+
*/
|
|
380
|
+
getDataSourceQueryDetails(query, columns) {
|
|
381
|
+
try {
|
|
382
|
+
return this.getDataSourceQueries(q => q.ID?.toLowerCase() === query?.toLowerCase() || q.QueryName === query, columns)?.[0] ?? null;
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
console.error('Error in getDataSourceQuery:', error);
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Gets fields from a data source query
|
|
391
|
+
*
|
|
392
|
+
* @param query ID or Name of the data source query
|
|
393
|
+
* @param filterFn Optional filter function for query fields
|
|
394
|
+
* @param columns Optional columns to include in the result
|
|
395
|
+
* @returns Array of fields for the specified query with app field details
|
|
396
|
+
*
|
|
397
|
+
* @example
|
|
398
|
+
* // Get all fields for a query
|
|
399
|
+
* const queryFields = metadataUtils.getDataSourceQueryFields('73e590d0-c4eb-464d-abf9-01943e30ae09');
|
|
400
|
+
*
|
|
401
|
+
* // Get fields for a query by name
|
|
402
|
+
* const queryFields = metadataUtils.getDataSourceQueryFields('Get_SLASchemes_List');
|
|
403
|
+
*
|
|
404
|
+
* // Get fields with filter and specific columns
|
|
405
|
+
* const fields = metadataUtils.getDataSourceQueryFields(
|
|
406
|
+
* '73e590d0-c4eb-464d-abf9-01943e30ae09',
|
|
407
|
+
* field => field.FieldType === 1,
|
|
408
|
+
* ['ID', 'AppFieldID', 'FieldType']
|
|
409
|
+
* );
|
|
410
|
+
*/
|
|
411
|
+
getFieldsByDSQ(query, filterFn, columns) {
|
|
412
|
+
try {
|
|
413
|
+
// Find the query using our existing method
|
|
414
|
+
const dsQuery = this.getDataSourceQueryDetails(query);
|
|
415
|
+
if (!dsQuery || !dsQuery.Fields?.length) {
|
|
416
|
+
return [];
|
|
417
|
+
}
|
|
418
|
+
// Get enhanced fields with app field details
|
|
419
|
+
let queryFields = this.enhanceQueryFieldsWithAppFields(dsQuery);
|
|
420
|
+
// Apply filter if provided
|
|
421
|
+
if (filterFn) {
|
|
422
|
+
queryFields = queryFields.filter(filterFn);
|
|
423
|
+
}
|
|
424
|
+
return this.formatResults(queryFields, columns);
|
|
425
|
+
}
|
|
426
|
+
catch (error) {
|
|
427
|
+
console.error('Error in getDataSourceQueryFields:', error);
|
|
428
|
+
return [];
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Enhances query fields with their corresponding app field details
|
|
433
|
+
* @private
|
|
434
|
+
*/
|
|
435
|
+
enhanceQueryFieldsWithAppFields(dsQuery) {
|
|
436
|
+
if (!dsQuery || !dsQuery.Fields?.length) {
|
|
437
|
+
return [];
|
|
438
|
+
}
|
|
439
|
+
// Find the parent app object
|
|
440
|
+
const parentAppObject = this.findParentAppObjectForQuery(dsQuery);
|
|
441
|
+
if (!parentAppObject) {
|
|
442
|
+
return dsQuery.Fields;
|
|
443
|
+
}
|
|
444
|
+
// Add app field details to each query field
|
|
445
|
+
return dsQuery.Fields.map((field) => {
|
|
446
|
+
const appField = this.findAppFieldById(parentAppObject, field.AppFieldID);
|
|
447
|
+
return {
|
|
448
|
+
...field,
|
|
449
|
+
Field: appField || {}
|
|
450
|
+
};
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Finds the parent app object that contains a specific data source query
|
|
455
|
+
* @private
|
|
456
|
+
*/
|
|
457
|
+
findParentAppObjectForQuery(dsQuery) {
|
|
458
|
+
return this.getAppObjects(obj => obj.DataSourceQueries?.some((q) => q.ID?.toLowerCase() === dsQuery.ID?.toLowerCase() ||
|
|
459
|
+
q.QueryName === dsQuery.QueryName))[0];
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Finds an app field by ID within a specific app object
|
|
463
|
+
* @private
|
|
464
|
+
*/
|
|
465
|
+
findAppFieldById(appObject, fieldId) {
|
|
466
|
+
if (!appObject || !appObject.Fields?.length || !fieldId) {
|
|
467
|
+
return undefined;
|
|
468
|
+
}
|
|
469
|
+
return appObject.Fields.find((field) => field.ID?.toLowerCase() === fieldId?.toLowerCase());
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Gets query parameters from a data source query
|
|
473
|
+
*
|
|
474
|
+
* @param query ID or Name of the data source query
|
|
475
|
+
* @param filterFn Optional filter function for query parameters
|
|
476
|
+
* @param columns Optional columns to include in the result
|
|
477
|
+
* @returns Array of parameters for the specified query
|
|
478
|
+
*
|
|
479
|
+
* @example
|
|
480
|
+
* // Get all parameters for a query
|
|
481
|
+
* const queryParams = metadataUtils.getParametersByDSQ('73e590d0-c4eb-464d-abf9-01943e30ae09');
|
|
482
|
+
*
|
|
483
|
+
* // Get all parameters for a query by name
|
|
484
|
+
* const queryParams = metadataUtils.getParametersByDSQ('Get_SLASchemes_List');
|
|
485
|
+
*
|
|
486
|
+
* // Get mandatory parameters only
|
|
487
|
+
* const mandatoryParams = metadataUtils.getParametersByDSQ(
|
|
488
|
+
* '73e590d0-c4eb-464d-abf9-01943e30ae09',
|
|
489
|
+
* param => param.IsMandatory === true
|
|
490
|
+
* );
|
|
491
|
+
*/
|
|
492
|
+
getParametersByDSQ(query, filterFn, columns) {
|
|
493
|
+
try {
|
|
494
|
+
// Find the query using our existing method
|
|
495
|
+
const dsQuery = this.getDataSourceQueryDetails(query);
|
|
496
|
+
if (!dsQuery || !dsQuery.Parameters?.length) {
|
|
497
|
+
return [];
|
|
498
|
+
}
|
|
499
|
+
let queryParameters = dsQuery.Parameters || [];
|
|
500
|
+
// Apply filter if provided
|
|
501
|
+
if (filterFn) {
|
|
502
|
+
queryParameters = queryParameters.filter(filterFn);
|
|
503
|
+
}
|
|
504
|
+
return this.formatResults(queryParameters, columns);
|
|
505
|
+
}
|
|
506
|
+
catch (error) {
|
|
507
|
+
console.error('Error in getDataSourceQueryParameters:', error);
|
|
508
|
+
return [];
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Gets App Screens with filter criteria
|
|
513
|
+
*
|
|
514
|
+
* @param filterFn Optional filter function to apply to app screens
|
|
515
|
+
* @param columns Optional columns to include in the result
|
|
516
|
+
* @returns Array of filtered app screens
|
|
517
|
+
*
|
|
518
|
+
* @example
|
|
519
|
+
* // Get all system screens
|
|
520
|
+
* const systemScreens = metadataUtils.getAppScreens(screen => screen.IsSystemRecord === true);
|
|
521
|
+
*
|
|
522
|
+
* // Get specific columns from all screens
|
|
523
|
+
* const screens = metadataUtils.getAppScreens(
|
|
524
|
+
* undefined,
|
|
525
|
+
* ['ID', 'Name', 'ScreenType']
|
|
526
|
+
* );
|
|
527
|
+
*/
|
|
528
|
+
getAppScreens(filterFn, columns) {
|
|
529
|
+
try {
|
|
530
|
+
let appScreens = Common.tabJson.AppScreens || [];
|
|
531
|
+
// Apply filter if provided
|
|
532
|
+
if (filterFn) {
|
|
533
|
+
appScreens = appScreens.filter(filterFn);
|
|
534
|
+
}
|
|
535
|
+
return this.formatResults(appScreens, columns);
|
|
536
|
+
}
|
|
537
|
+
catch (error) {
|
|
538
|
+
console.error('Error in getAppScreens:', error);
|
|
539
|
+
return [];
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Gets a specific App Screen by ID or Name
|
|
544
|
+
*
|
|
545
|
+
* @param screen ID or Name of the app screen to retrieve
|
|
546
|
+
* @param columns Optional columns to include in the result
|
|
547
|
+
* @returns The app screen with specified columns or null if not found
|
|
548
|
+
*
|
|
549
|
+
* @example
|
|
550
|
+
* // Get a specific screen with all properties
|
|
551
|
+
* const screen = metadataUtils.getAppScreen('a5cd639e-31ba-4d33-8800-005a5248dfb2');
|
|
552
|
+
*
|
|
553
|
+
* // Get specific columns from a screen by name
|
|
554
|
+
* const screen = metadataUtils.getAppScreen(
|
|
555
|
+
* 'New Detail Role/Permission Appoject acess wise',
|
|
556
|
+
* ['ID', 'Name', 'ScreenType']
|
|
557
|
+
* );
|
|
558
|
+
*/
|
|
559
|
+
getAppScreen(screen, columns) {
|
|
560
|
+
try {
|
|
561
|
+
return this.getAppScreens(scr => scr.ID?.toLowerCase() === screen?.toLowerCase() || scr.Name === screen, columns)?.[0] ?? null;
|
|
562
|
+
}
|
|
563
|
+
catch (error) {
|
|
564
|
+
console.error('Error in getAppScreen:', error);
|
|
565
|
+
return null;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Gets App Menus with filter criteria
|
|
570
|
+
*
|
|
571
|
+
* @param filterFn Optional filter function to apply to app menus
|
|
572
|
+
* @param columns Optional columns to include in the result
|
|
573
|
+
* @returns Array of filtered app menus
|
|
574
|
+
*
|
|
575
|
+
* @example
|
|
576
|
+
* // Get all top-level menus
|
|
577
|
+
* const topMenus = metadataUtils.getAppMenus(menu => !menu.ParentID);
|
|
578
|
+
*
|
|
579
|
+
* // Get specific columns from all menus
|
|
580
|
+
* const menus = metadataUtils.getAppMenus(
|
|
581
|
+
* undefined,
|
|
582
|
+
* ['ID', 'MenuName', 'DisplayName', 'ScreenID']
|
|
583
|
+
* );
|
|
584
|
+
*/
|
|
585
|
+
getAppMenus(filterFn, columns) {
|
|
586
|
+
try {
|
|
587
|
+
let appMenus = Common.tabJson.AppMenus || [];
|
|
588
|
+
// Apply filter if provided
|
|
589
|
+
if (filterFn) {
|
|
590
|
+
appMenus = appMenus.filter(filterFn);
|
|
591
|
+
}
|
|
592
|
+
return this.formatResults(appMenus, columns);
|
|
593
|
+
}
|
|
594
|
+
catch (error) {
|
|
595
|
+
console.error('Error in getAppMenus:', error);
|
|
596
|
+
return [];
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Gets organization information with filter criteria
|
|
601
|
+
*
|
|
602
|
+
* @param filterFn Optional filter function to apply to organizations
|
|
603
|
+
* @param columns Optional columns to include in the result
|
|
604
|
+
* @returns Array of filtered organizations
|
|
605
|
+
*
|
|
606
|
+
* @example
|
|
607
|
+
* // Get all organizations
|
|
608
|
+
* const orgs = metadataUtils.getOrgs();
|
|
609
|
+
*
|
|
610
|
+
* // Get organizations with specific subdomain pattern
|
|
611
|
+
* const specificOrgs = metadataUtils.getOrgs(
|
|
612
|
+
* org => org.Subdomain?.includes('test')
|
|
613
|
+
* );
|
|
614
|
+
*/
|
|
615
|
+
getOrgs(filterFn, columns) {
|
|
616
|
+
try {
|
|
617
|
+
let organizations = Common.tabJson.OrgInfos || [];
|
|
618
|
+
// Apply filter if provided
|
|
619
|
+
if (filterFn) {
|
|
620
|
+
organizations = organizations.filter(filterFn);
|
|
621
|
+
}
|
|
622
|
+
return this.formatResults(organizations, columns);
|
|
623
|
+
}
|
|
624
|
+
catch (error) {
|
|
625
|
+
console.error('Error in getOrganizations:', error);
|
|
626
|
+
return [];
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Gets a specific organization by ID or Name
|
|
631
|
+
*
|
|
632
|
+
* @param organization ID or OrganizationName of the organization
|
|
633
|
+
* @param columns Optional columns to include in the result
|
|
634
|
+
* @returns The organization or null if not found
|
|
635
|
+
*
|
|
636
|
+
* @example
|
|
637
|
+
* // Get organization by ID
|
|
638
|
+
* const org = metadataUtils.getOrgInfoDetails('0ec3d0f1-b2ec-47b7-8305-b767d0e5ea63');
|
|
639
|
+
*
|
|
640
|
+
* // Get organization by name
|
|
641
|
+
* const org = metadataUtils.getOrgInfoDetails('SquadFocus');
|
|
642
|
+
*/
|
|
643
|
+
getOrgInfoDetails(organization, columns) {
|
|
644
|
+
try {
|
|
645
|
+
return this.getOrgs(org => org.ID?.toLowerCase() === organization?.toLowerCase() ||
|
|
646
|
+
org.OrganizationName === organization ||
|
|
647
|
+
org.Subdomain === organization, columns)[0] || null;
|
|
648
|
+
}
|
|
649
|
+
catch (error) {
|
|
650
|
+
console.error('Error in getOrganization:', error);
|
|
651
|
+
return null;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
static { this.ɵfac = function MetadataHelper_Factory(t) { return new (t || MetadataHelper)(); }; }
|
|
655
|
+
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MetadataHelper, factory: MetadataHelper.ɵfac, providedIn: 'root' }); }
|
|
656
|
+
}
|
|
657
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MetadataHelper, [{
|
|
658
|
+
type: Injectable,
|
|
659
|
+
args: [{ providedIn: 'root' }]
|
|
660
|
+
}], null, null); })();
|
|
661
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YS1kYXRhLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2RhdGEtYWNjZXNzL3NyYy9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvaGVscGVycy9jb21tb24vbWV0YS1kYXRhLmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFXLE1BQU0sbUNBQW1DLENBQUM7QUFDaEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUloRDs7Ozs7S0FLSztBQUVMLE1BQU0sT0FBTyxjQUFjO0lBQ3ZCLCtDQUErQztJQUN2QyxhQUFhLENBQUksS0FBVSxFQUFFLE9BQWtCO1FBQ25ELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BCLE1BQU0sTUFBTSxHQUFRLEVBQUUsQ0FBQztZQUN2QixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUksSUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSSxvQkFBb0IsQ0FDdkIsVUFBa0IsRUFDbEIsV0FBa0M7UUFFbEMsSUFBSSxDQUFDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxF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LGdCQUFnQixLQUFLLFlBQVk7Z0JBQ3JDLEdBQUcsQ0FBQyxTQUFTLEtBQUssWUFBWSxFQUM5QixPQUFPLENBQ1YsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDakIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2xELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDOytFQXR1QlEsY0FBYzt1RUFBZCxjQUFjLFdBQWQsY0FBYyxtQkFERCxNQUFNOztpRkFDbkIsY0FBYztjQUQxQixVQUFVO2VBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBNZXRhZGF0YUVudGl0eVR5cGUsIE9yZ0luZm8gfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9zY2hlbWEuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBDb21tb24gfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBwTWVudSwgQXBwT2JqZWN0LCBBcHBTY3JlZW4gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2FwcC1vYmplY3QuY2xhc3NcIjtcbmltcG9ydCB7IEFwcEZpZWxkcywgRGF0YVNvdXJjZVF1ZXJpZXMsIERhdGFTb3VyY2VRdWVyaWVzX0ZpZWxkcywgUGFyYW1ldGVycyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGF0YS1zb3VyY2UtcXVlcmllcy5jbGFzc1wiO1xuXG4vKipcbiAgICogTWV0YWRhdGFVdGlscyAtIFV0aWxpdHkgc2VydmljZSBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGFwcGxpY2F0aW9uIG1ldGFkYXRhXG4gICAqIFxuICAgKiBUaGlzIHNlcnZpY2UgcHJvdmlkZXMgbWV0aG9kcyB0byBleHRyYWN0LCBmaWx0ZXIsIGFuZCBmb3JtYXQgZGlmZmVyZW50IHBhcnRzIG9mIHRoZVxuICAgKiBhcHBsaWNhdGlvbiBtZXRhZGF0YSwgaW5jbHVkaW5nIG9iamVjdHMsIGZpZWxkcywgc2NyZWVucywgbWVudXMsIGV0Yy5cbiAgICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIE1ldGFkYXRhSGVscGVyIHtcbiAgICAvLyBIZWxwZXIgbWV0aG9kIHRvIGNvbnNpc3RlbnRseSBmb3JtYXQgcmVzdWx0c1xuICAgIHByaXZhdGUgZm9ybWF0UmVzdWx0czxUPihpdGVtczogVFtdLCBjb2x1bW5zPzogc3RyaW5nW10pOiBhbnlbXSB7XG4gICAgICAgIGlmICghY29sdW1ucyB8fCBjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgICAgICAgICBjb2x1bW5zLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHRbY29sXSA9IChpdGVtIGFzIGFueSlbY29sXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VhcmNoIGFjcm9zcyBhbGwgbWV0YWRhdGEgZm9yIGEgdGVybVxuICAgICAqIFxuICAgICAqIEBwYXJhbSBzZWFyY2hUZXJtIFRlcm0gdG8gc2VhcmNoIGZvclxuICAgICAqIEBwYXJhbSBlbnRpdHlUeXBlcyBPcHRpb25hbCB0eXBlcyBvZiBlbnRpdGllcyB0byBzZWFyY2ggKGlmIG5vdCBwcm92aWRlZCwgc2VhcmNoZXMgYWxsKVxuICAgICAqIEByZXR1cm5zIFNlYXJjaCByZXN1bHRzIGdyb3VwZWQgYnkgZW50aXR5IHR5cGVcbiAgICAgKiBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFNlYXJjaCBhY3Jvc3MgYWxsIG1ldGFkYXRhXG4gICAgICogY29uc3QgcmVzdWx0cyA9IG1ldGFkYXRhVXRpbHMuc2VhcmNoQWNyb3NzTWV0YWRhdGEoJ0JsdWVwcmludCcpO1xuICAgICAqIFxuICAgICAqIC8vIFNlYXJjaCBvbmx5IGluIGFwcCBvYmplY3RzIGFuZCBzY3JlZW5zXG4gICAgICogY29uc3QgcmVzdWx0cyA9IG1ldGFkYXRhVXRpbHMuc2VhcmNoQWNyb3NzTWV0YWRhdGEoXG4gICAgICogICAnUm9sZScsIFxuICAgICAqICAgW01ldGFkYXRhRW50aXR5VHlwZS5BUFBfT0JKRUNUUywgTWV0YWRhdGFFbnRpdHlUeXBlLkFQUF9TQ1JFRU5TXVxuICAgICAqICk7XG4gICAgICovXG4gICAgcHVibGljIHNlYXJjaEFjcm9zc01ldGFkYXRhKFxuICAgICAgICBzZWFyY2hUZXJtOiBzdHJpbmcsXG4gICAgICAgIGVudGl0eVR5cGVzPzogTWV0YWRhdGFFbnRpdHlUeXBlW11cbiAgICApOiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFzZWFyY2hUZXJtIHx8IHNlYXJjaFRlcm0udHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGVybSA9IHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIGFueVtdPiA9IHt9O1xuXG4gICAgICAgICAgICAvLyBJZiBlbnRpdHlUeXBlcyBub3QgcHJvdmlkZWQsIHNlYXJjaCBhbGwgZW50aXR5IHR5cGVzXG4gICAgICAgICAgICBjb25zdCB0eXBlc1RvU2VhcmNoID0gZW50aXR5VHlwZXMgfHwgT2JqZWN0LnZhbHVlcyhNZXRhZGF0YUVudGl0eVR5cGUpO1xuXG4gICAgICAgICAgICAvLyBFeGVjdXRlIHNlYXJjaCBmb3IgZWFjaCBlbnRpdHkgdHlwZVxuICAgICAgICAgICAgaWYgKHR5cGVzVG9TZWFyY2guaW5jbHVkZXMoTWV0YWRhdGFFbnRpdHlUeXBlLkFQUF9PQkpFQ1RTKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHNbTWV0YWRhdGFFbnRpdHlUeXBlLkFQUF9PQkpFQ1RTXSA9IHRoaXMuc2VhcmNoQXBwT2JqZWN0cyh0ZXJtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVzVG9TZWFyY2guaW5jbHVkZXMoTWV0YWRhdGFFbnRpdHlUeXBlLkFQUF9GSUVMRFMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0c1tNZXRhZGF0YUVudGl0eVR5cGUuQVBQX0ZJRUxEU10gPSB0aGlzLnNlYXJjaEFwcEZpZWxkcyh0ZXJtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVzVG9TZWFyY2guaW5jbHVkZXMoTWV0YWRhdGFFbnRpdHlUeXBlLkRBVEFfU09VUkNFX1FVRVJJRVMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0c1tNZXRhZGF0YUVudGl0eVR5cGUuREFUQV9TT1VSQ0VfUVVFUklFU10gPSB0aGlzLnNlYXJjaERhdGFTb3VyY2VRdWVyaWVzKHRlcm0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZXNUb1NlYXJjaC5pbmNsdWRlcyhNZXRhZGF0YUVudGl0eVR5cGUuQVBQX1NDUkVFTlMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0c1tNZXRhZGF0YUVudGl0eVR5cGUuQVBQX1NDUkVFTlNdID0gdGhpcy5zZWFyY2hBcHBTY3JlZW5zKHRlcm0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZXNUb1NlYXJjaC5pbmNsdWRlcyhNZXRhZGF0YUVudGl0eVR5cGUuQVBQX01FTlVTKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHNbTWV0YWRhdGFFbnRpdHlUeXBlLkFQUF9NRU5VU10gPSB0aGlzLnNlYXJjaEFwcE1lbnVzKHRlcm0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIHNlYXJjaE1ldGFkYXRhOicsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBmb3IgYSB0ZXJtIHdpdGhpbiBBcHAgT2JqZWN0c1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZWFyY2hBcHBPYmplY3RzKHRlcm06IHN0cmluZyk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXBwT2JqZWN0cyhvYmogPT5cbiAgICAgICAgICAgIHRoaXMuY29udGFpbnNUZXJtKG9iai5PYmplY3ROYW1lLCB0ZXJtKSB8fFxuICAgICAgICAgICAgdGhpcy5jb250YWluc1Rlcm0ob2JqLkRpc3BsYXlOYW1lLCB0ZXJtKSB8fFxuICAgICAgICAgICAgdGhpcy5jb250YWluc1Rlcm0ob2JqLkRlc2NyaXB0aW9uLCB0ZXJtKSB8fFxuICAgICAgICAgICAgdGhpcy5jb250YWluc1Rlcm0ob2JqLlN5c3RlbURCVGFibGVOYW1lLCB0ZXJtKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBmb3IgYSB0ZXJtIHdpdGhpbiBBcHAgRmllbGRzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHNlYXJjaEFwcEZpZWxkcyh0ZXJtOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFwcEZpZWxkcyhmaWVsZCA9PlxuICAgICAgICAgICAgdGhpcy5jb250YWluc1Rlcm0oZmllbGQuRmllbGROYW1lLCB0ZXJtKSB8fFxuICAgICAgICAgICAgdGhpcy5jb250YWluc1Rlcm0oZmllbGQuRGlzcGxheU5hbWUsIHRlcm0pIHx8XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5zVGVybShmaWVsZC5EZXNjcmlwdGlvbiwgdGVybSkgfHxcbiAgICAgICAgICAgIHRoaXMuY29udGFpbnNUZXJtKGZpZWxkLlN5c3RlbURCRmllbGROYW1lLCB0ZXJtKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBmb3IgYSB0ZXJtIHdpdGhpbiBEYXRhIFNvdXJjZSBRdWVyaWVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHNlYXJjaERhdGFTb3VyY2VRdWVyaWVzKHRlcm06IHN0cmluZyk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YVNvdXJjZVF1ZXJpZXMocXVlcnkgPT5cbiAgICAgICAgICAgIHRoaXMuY29udGFpbnNUZXJtKHF1ZXJ5LlF1ZXJ5TmFtZSwgdGVybSkgfHxcbiAgICAgICAgICAgIHRoaXMuY29udGFpbnNUZXJtKHF1ZXJ5LkRpc3BsYXlOYW1lLCB0ZXJtKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBmb3IgYSB0ZXJtIHdpdGhpbiBBcHAgU2NyZWVuc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZWFyY2hBcHBTY3JlZW5zKHRlcm06IHN0cmluZyk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXBwU2NyZWVucyhzY3JlZW4gPT5cbiAgICAgICAgICAgIHRoaXMuY29udGFpbnNUZXJtKHNjcmVlbi5OYW1lLCB0ZXJtKSB8fFxuICAgICAgICAgICAgdGhpcy5jb250YWluc1Rlcm0oc2NyZWVuLkRlc2NyaXB0aW9uLCB0ZXJtKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBmb3IgYSB0ZXJtIHdpdGhpbiBBcHAgTWVudXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2VhcmNoQXBwTWVudXModGVybTogc3RyaW5nKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBcHBNZW51cyhtZW51ID0+XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5zVGVybShtZW51Lk1lbnVOYW1lLCB0ZXJtKSB8fFxuICAgICAgICAgICAgdGhpcy5jb250YWluc1Rlcm0obWVudS5EaXNwbGF5TmFtZSwgdGVybSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIGlmIGEgc3RyaW5nIGNvbnRhaW5zIGEgc2VhcmNoIHRlcm1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY29udGFpbnNUZXJtKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLCB0ZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdmFsdWUgJiYgdmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIEFwcCBPYmplY3RzIGJhc2VkIG9uIGZpbHRlciBjcml0ZXJpYVxuICAgICAqIFxuICAgICAqIEBwYXJhbSBmaWx0ZXJGbiBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gdG8gYXBwbHkgdG8gYXBwIG9iamVjdHNcbiAgICAgKiBAcGFyYW0gY29sdW1ucyBPcHRpb25hbCBjb2x1bW5zIHRvIGluY2x1ZGUgaW4gdGhlIHJlc3VsdFxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGZpbHRlcmVkIGFwcCBvYmplY3RzXG4gICAgICogXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBHZXQgYWxsIHN5c3RlbSBhcHAgb2JqZWN0c1xuICAgICAqIGNvbnN0IHN5c3RlbU9iamVjdHMgPSBtZXRhZGF0YVV0aWxzLmdldEFwcE9iamVjdHMob2JqID0+IG9iai5Jc1N5c3RlbSA9PT0gdHJ1ZSk7XG4gICAgICogXG4gICAgICogLy8gR2V0IHNwZWNpZmljIGNvbHVtbnMgZnJvbSBub24tZGVwcmVjYXRlZCBvYmplY3RzXG4gICAgICogY29uc3Qgb2JqZWN0cyA9IG1ldGFkYXRhVXRpbHMuZ2V0QXBwT2JqZWN0cyhcbiAgICAgKiAgIG9iaiA9PiAhb2JqLklzRGVwcmVjYXRlZCwgXG4gICAgICogICBbJ0lEJywgJ0Rpc3BsYXlOYW1lJywgJ09iamVjdE5hbWUnXVxuICAgICAqICk7XG4gICAgICovXG4gICAgcHVibGljIGdldEFwcE9iamVjdHMoZmlsdGVyRm4/OiAoKHZhbHVlOiBBcHBPYmplY3QpID0+IGJvb2xlYW4pLCBjb2x1bW5zPzogc3RyaW5nW10pOiBhbnlbXSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYXBwT2JqZWN0cyA9IENvbW1vbi50YWJKc29uLkFwcE9iamVjdHMgfHwgW107XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IGZpbHRlciBpZiBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKGZpbHRlckZuKSB7XG4gICAgICAgICAgICAgICAgYXBwT2JqZWN0cyA9IGFwcE9iamVjdHMuZmlsdGVyKGZpbHRlckZuKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvLyBSZXR1cm4gYWxsIG9iamVjdCBkYXRhIGlmIG5vIGNvbHVtbnMgc3BlY2lmaWVkXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXN1bHRzKGFwcE9iamVjdHMsIGNvbHVtbnMpO1xuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBnZXRBcHBPYmplY3RzOicsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBzcGVjaWZpYyBBcHAgT2JqZWN0IGJ5IElEIG9yIE5hbWVcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYXBwT2JqZWN0IElEIG9yIE5hbWUgb2YgdGhlIGFwcCBvYmplY3QgdG8gcmV0cmlldmVcbiAgICAgKiBAcGFyYW0gY29sdW1ucyBPcHRpb25hbCBjb2x1bW5zIHRvIGluY2x1ZGUgaW4gdGhlIHJlc3VsdFxuICAgICAqIEByZXR1cm5zIFRoZSBhcHAgb2JqZWN0IHdpdGggc3BlY2lmaWVkIGNvbHVtbnMgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKiBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEdldCBhIHNwZWNpZmljIGFwcCBvYmplY3Qgd2l0aCBhbGwgcHJvcGVydGllc1xuICAgICAqIGNvbnN0IGFwcE9iaiA9IG1ldGFkYXRhVXRpbHMuZ2V0QXBwT2JqZWN0RGV0YWlscygnYjQ4ODdkNGQtYmIxZS00ZDUyLWE3ZTgtMmY5NDNkNjllNDRjJyBvciAnVEFCTURfU1lTVEVNJyk7XG4gICAgICogXG4gICAgICogLy8gR2V0IHNwZWNpZmljIGNvbHVtbnMgZnJvbSBhbiBhcHAgb2JqZWN0XG4gICAgICogY29uc3QgYXBwT2JqID0gbWV0YWRhdGFVdGlscy5nZXRBcHBPYmplY3REZXRhaWxzKFxuICAgICAqICAgJ2I0ODg3ZDRkLWJiMWUtNGQ1Mi1hN2U4LTJmOTQzZDY5ZTQ0YycsIFxuICAgICAqICAgWydJRCcsICdEaXNwbGF5TmFtZScsICdPYmplY3ROYW1lJ11cbiAgICAgKiApO1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBcHBPYmplY3REZXRhaWxzKGFwcE9iamVjdDogc3RyaW5nLCBjb2x1bW5zPzogc3RyaW5nW10pOiBhbnkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXBwT2JqZWN0cyhvYmogPT4gb2JqLklEPy50b0xvd2VyQ2FzZSgpID09PSBhcHBPYmplY3Q/LnRvTG93ZXJDYXNlKCkgfHwgb2JqLk9iamVjdE5hbWUgPT09IGFwcE9iamVjdCwgY29sdW1ucyk/LlswXSA/PyBudWxsO1xuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBnZXRBcHBPYmplY3RCeUlkOicsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgZmllbGRzIGFjcm9zcyBhbGwgYXBwIG9iamVjdHMgd2l0aCBmaWx0ZXIgY3JpdGVyaWFcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZmlsdGVyRm4gT3B0aW9uYWwgZmlsdGVyIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGZpZWxkc1xuICAgICAqIEBwYXJhbSBjb2x1bW5zIE9wdGlvbmFsIGNvbHVtbnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVzdWx0XG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgZmlsdGVyZWQgZmllbGRzXG4gICAgICogXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBHZXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhY3Jvc3MgYWxsIG9iamVjdHNcbiAgICAgKiBjb25zdCByZXF1aXJlZEZpZWxkcyA9IG1ldGFkYXRhVXRpbHMuZ2V0QXBwRmllbGRzKGZpZWxkID0+IGZpZWxkLklzUmVxdWlyZWQgPT09IHRydWUpO1xuICAgICAqIFxuICAgICAqIC8vIEdldCBzcGVjaWZpYyBjb2x1bW5zIGZyb20gc2VhcmNoYWJsZSBmaWVsZHNcbiAgICAgKiBjb25zdCBmaWVsZHMgPSBtZXRhZGF0YVV0aWxzLmdldEFwcEZpZWxkcyhcbiAgICAgKiAgIGZpZWxkID0+IGZpZWxkLklzU2VhcmNoYWJsZSA9PT0gdHJ1ZSwgXG4gICAgICogICBbJ0lEJywgJ0Rpc3BsYXlOYW1lJywgJ0ZpZWxkTmFtZSddXG4gICAgICogKTtcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QXBwRmllbGRzKGZpbHRlckZuPzogKCh2YWx1ZTogQXBwRmllbGRzKSA9PiBib29sZWFuKSwgY29sdW1ucz86IHN0cmluZ1tdKTogYW55W10ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCBmaWVsZHMgZnJvbSBhbGwgYXBwIG9iamVjdHNcbiAgICAgICAgICAgIGNvbnN0IGFsbEZpZWxkczogQXBwRmllbGRzW10gPSBbXTtcbiAgICAgICAgICAgIENvbW1vbi50YWJKc29uLkFwcE9iamVjdHMuZm9yRWFjaCgob2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBhbGxGaWVsZHMucHVzaCguLi5vYmouRmllbGRzKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGxldCBmaWx0ZXJlZEZpZWxkcyA9IGFsbEZpZWxkcztcbiAgICAgICAgICAgIGlmIChmaWx0ZXJGbikge1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkRmllbGRzID0gYWxsRmllbGRzLmZpbHRlcihmaWx0ZXJGbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJldHVybiBhbGwgZmllbGQgZGF0YSBpZiBubyBjb2x1bW5zIHNwZWNpZmllZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0UmVzdWx0cyhmaWx0ZXJlZEZpZWxkcywgY29sdW1ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBnZXRBcHBGaWVsZHM6JywgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBmaWVsZHMgZm9yIGEgc3BlY2lmaWMgYXBwIG9iamVjdFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcHBPYmplY3QgSUQgb3IgTmFtZSBvZiB0aGUgYXBwIG9iamVjdFxuICAgICAqIEBwYXJhbSBmaWx0ZXJGbiBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gZm9yIGZpZWxkc1xuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGZpZWxkcyBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3RcbiAgICAgKiBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEdldCBhbGwgZmllbGRzIGZvciBhbiBvYmplY3RcbiAgICAgKiBjb25zdCBmaWVsZHMgPSBtZXRhZGF0YVV0aWxzLmdldEFwcEZpZWxkc0J5QXBwT2JqZWN0KCdiNDg4N2Q0ZC1iYjFlLTRkNTItYTdlOC0yZjk0M2Q2OWU0NGMnIG9yICdUQUJNRF9TWVNURU0nKTtcbiAgICAgKiBcbiAgICAgKiAvLyBHZXQgb25seSByZXF1aXJlZCBmaWVsZHNcbiAgICAgKiBjb25zdCByZXF1aXJlZEZpZWxkcyA9IG1ldGFkYXRhVXRpbHMuZ2V0QXBwRmllbGRzQnlBcHBPYmplY3QoXG4gICAgICogICAnYjQ4ODdkNGQtYmIxZS00ZDUyLWE3ZTgtMmY5NDNkNjllNDRjJyxcbiAgICAgKiAgIGZpZWxkID0+IGZpZWxkLklzUmVxdWlyZWQgPT09IHRydWVcbiAgICAgKiApO1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBcHBGaWVsZHNCeUFwcE9iamVjdChcbiAgICAgICAgYXBwT2JqZWN0OiBzdHJpbmcsXG4gICAgICAgIGZpbHRlckZuPzogKCh2YWx1ZTogQXBwRmllbGRzLCBpbmRleDogbnVtYmVyLCBhcnJheTogQXBwRmllbGRzW10pID0+IGJvb2xlYW4pLFxuICAgICAgICBjb2x1bW5zPzogc3RyaW5nW11cbiAgICApOiBhbnlbXSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEFwcE9iamVjdDogYW55ID0gdGhpcy5nZXRBcHBPYmplY3REZXRhaWxzKGFwcE9iamVjdCk7XG4gICAgICAgICAgICBpZiAoIWZpbHRlcmVkQXBwT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmllbGRzID0gZmlsdGVyZWRBcHBPYmplY3QuRmllbGRzIHx8IFtdO1xuXG4gICAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChmaWx0ZXJGbikge1xuICAgICAgICAgICAgICAgIGZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoZmlsdGVyRm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXN1bHRzKGZpZWxkcywgY29sdW1ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBnZXRBcHBGaWVsZEJ5SWQ6JywgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXRzIGxvb2t1cCBmaWVsZHMgZm9yIGEgc3BlY2lmaWMgYXBwIG9iamVjdFxuICAgICogXG4gICAgKiBAcGFyYW0gYXBwT2JqZWN0IElEIG9yIE5hbWUgb2YgdGhlIGFwcCBvYmplY3RcbiAgICAqIEBwYXJhbSBmaWx0ZXJGbiBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gZm9yIGxvb2t1cCBmaWVsZHNcbiAgICAqIEBwYXJhbSBjb2x1bW5zIE9wdGlvbmFsIGNvbHVtbnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVzdWx0XG4gICAgKiBAcmV0dXJucyBBcnJheSBvZiBsb29rdXAgZmllbGRzIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdFxuICAgICogXG4gICAgKiBAZXhhbXBsZVxuICAgICogLy8gR2V0IGFsbCBsb29rdXAgZmllbGRzIGZvciBhbiBvYmplY3RcbiAgICAqIGNvbnN0IGxvb2t1cEZpZWxkcyA9IG1ldGFkYXRhVXRpbHMuZ2V0TG9va3VwRmllbGRzQnlBcHBPYmplY3QoJ1RBQkRfQmx1ZXByaW50X1NMQVNjaGVtZXMnKTtcbiAgICAqIFxuICAgICogLy8gR2V0IHNwZWNpZmljIGxvb2t1cCBmaWVsZHNcbiAgICAqIGNvbnN0IGZpZWxkcyA9IG1ldGFkYXRhVXRpbHMuZ2V0TG9va3VwRmllbGRzQnlBcHBPYmplY3QoXG4gICAgKiAgICdiNDg4N2Q0ZC1iYjFlLTRkNTItYTdlOC0yZjk0M2Q2OWU0NGMnLFxuICAgICogICBmaWVsZCA9PiBmaWVsZC5Jc1JlcXVpcmVkID09PSB0cnVlXG4gICAgKiApO1xuICAgICovXG4gICAgcHVibGljIGdldExvb2t1cEZpZWxkc0J5QXBwT2JqZWN0KFxuICAgICAgICBhcHBPYmplY3Q6IHN0cmluZyxcbiAgICAgICAgZmlsdGVyRm4/OiAoKHZhbHVlOiBBcHBGaWVsZHMpID0+IGJvb2xlYW4pLFxuICAgICAgICBjb2x1bW5zPzogc3RyaW5nW11cbiAgICApOiBhbnlbXSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBHZXQgZmllbGRzIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCB0aGF0IGFyZSBsb29rdXBzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBcHBGaWVsZHNCeUFwcE9iamVjdChcbiAgICAgICAgICAgICAgICBhcHBPYmplY3QsXG4gICAgICAgICAgICAgICAgZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmllbGQgaXMgYSBsb29rdXAgdHlwZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0xvb2t1cCA9IGZpZWxkLkxvb2tVcERldGFpbHMgIT0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSBhZGRpdGlvbmFsIHVzZXIgZmlsdGVyIGlmIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0xvb2t1cCAmJiAoIWZpbHRlckZuIHx8IGZpbHRlckZuKGZpZWxkKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gZ2V0QXBwT2JqZWN0TG9va3VwRmllbGRzOicsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgZGF0YSBzb3VyY2UgcXVlcmllcyB3aXRoIGZpbHRlciBjcml0ZXJpYVxuICAgICAqIFxuICAgICAqIEBwYXJhbSBmaWx0ZXJGbiBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gdG8gYXBwbHkgdG8gcXVlcmllc1xuICAgICAqIEBwYXJhbSBjb2x1bW5zIE9wdGlvbmFsIGNvbHVtbnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVzdWx0XG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgZmlsdGVyZWQgZGF0YSBzb3VyY2UgcXVlcmllc1xuICAgICAqIFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gR2V0IGFsbCBxdWVyaWVzIHdpdGggYSBzcGVjaWZpYyBuYW1pbmcgcGF0dGVyblxuICAgICAqIGNvbnN0IHF1ZXJpZXMgPSBtZXRhZGF0YVV0aWxzLmdldERhdGFTb3VyY2VRdWVyaWVzKHF1ZXJ5ID0+IHF1ZXJ5LlF1ZXJ5TmFtZS5pbmNsdWRlcygnTGlzdCcpKTtcbiAgICAgKiBcbiAgICAgKiAvLyBHZXQgc3BlY2lmaWMgY29sdW1ucyBmcm9tIGFsbCBxdWVyaWVzXG4gICAgICogY29uc3QgcXVlcmllcyA9IG1ldGFkYXRhVXRpbHMuZ2V0RGF0YVNvdXJjZVF1ZXJpZXMoXG4gICAgICogICB1bmRlZmluZWQsIFxuICAgICAqICAgWydJRCcsICdRdWVyeU5hbWUnLCAnRGlzcGxheU5hbWUnXVxuICAgICAqICk7XG4gICAgICovXG4gICAgcHVibGljIGdldERhdGFTb3VyY2VRdWVyaWVzKGZpbHRlckZuPzogKCh2YWx1ZTogRGF0YVNvdXJjZVF1ZXJpZXMpID0+IGJvb2xlYW4pLCBjb2x1bW5zPzogc3RyaW5nW10pOiBhbnlbXSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBHZXQgYWxsIGRhdGEgc291cmNlIHF1ZXJpZXMgZnJvbSBhbGwgYXBwIG9iamVjdHNcbiAgICAgICAgICAgIGNvbnN0IGFsbFF1ZXJpZXM6IERhdGFTb3VyY2VRdWVyaWVzW10gPSBbXTtcbiAgICAgICAgICAgIENvbW1vbi50YWJKc29uLkFwcE9iamVjdHMuZm9yRWFjaCgob2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob2JqLkRhdGFTb3VyY2VRdWVyaWVzICYmIG9iai5EYXRhU291cmNlUXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsbFF1ZXJpZXMucHVzaCguLi5vYmouRGF0YVNvdXJjZVF1ZXJpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGxldCBmaWx0ZXJlZFF1ZXJpZXMgPSBhbGxRdWVyaWVzO1xuICAgICAgICAgICAgaWYgKGZpbHRlckZuKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRRdWVyaWVzID0gYWxsUXVlcmllcy5maWx0ZXIoZmlsdGVyRm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXN1bHRzKGZpbHRlcmVkUXVlcmllcywgY29sdW1ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBnZXREYXRhU291cmNlUXVlcmllczonLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGRhdGEgc291cmNlIHF1ZXJpZXMgZm9yIGEgc3BlY2lmaWMgYXBwIG9iamVjdFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcHBPYmplY3QgSUQgb3IgTmFtZSBvZiB0aGUgYXBwIG9iamVjdFxuICAgICAqIEBwYXJhbSBmaWx0ZXJGbiBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gZm9yIHF1ZXJpZXNcbiAgICAgKiBAcGFyYW0gY29sdW1ucyBPcHRpb25hbCBjb2x1bW5zIHRvIGluY2x1ZGUgaW4gdGhlIHJlc3VsdFxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIHF1ZXJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0XG4gICAgICogXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBHZXQgYWxsIHF1ZXJpZXMgZm9yIGFuIG9iamVjdFxuICAgICAqIGNvbnN0IHF1ZXJpZXMgPSBtZXRhZGF0YVV0aWxzLmdldERhdGFTb3VyY2VRdWVyaWVzQnlBcHBPYmplY3QoJ2I0ODg3ZDRkLWJiMWUtNGQ1Mi1hN2U4LTJmOTQzZDY5ZTQ0YycpO1xuICAgICAqIFxuICAgICAqIC8vIEdldCBxdWVyaWVzIHdpdGggc3BlY2lmaWMgcGF0dGVyblxuICAgICAqIGNvbnN0IGZpbHRlcmVkUXVlcmllcyA9IG1ldGFkYXRhVXRpbHMuZ2V0RGF0YVNvdXJjZVF1ZXJpZXNCeUFwcE9iamVjdChcbiAgICAgKiAgICdUQUJEX0JsdWVwcmludF9TTEFTY2hlbWVzJyxcbiAgICAgKiAgIHF1ZXJ5ID0+IHF1ZXJ5LlF1ZXJ5TmFtZS5pbmNsdWRlcygnTGlzdCcpXG4gICAgICogKTtcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGF0YVNvdXJjZVF1ZXJpZXNCeUFwcE9iamVjdChcbiAgICAgICAgYXBwT2JqZWN0OiBzdHJpbmcsXG4gICAgICAgIGZpbHRlckZuPzogKCh2YWx1ZTogRGF0YVNvdXJjZVF1ZXJpZXMpID0+IGJvb2xlYW4pLFxuICAgICAgICBjb2x1bW5zPzogc3RyaW5nW11cbiAgICApOiBhbnlbXSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEFwcE9iamVjdDogYW55ID0gdGhpcy5nZXRBcHBPYmplY3REZXRhaWxzKGFwcE9iamVjdCk7XG4gICAgICAgICAgICBpZiAoIWZpbHRlcmVkQXBwT2JqZWN0IHx8ICFmaWx0ZXJlZEFwcE9iamVjdC5EYXRhU291cmNlUXVlcmllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHF1ZXJpZXMgPSBmaWx0ZXJlZEFwcE9iamVjdC5EYXRhU291cmNlUXVlcmllcztcblxuICAgICAgICAgICAgLy8gQXBwbHkgZmlsdGVyIGlmIHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAoZmlsdGVyRm4pIHtcbiAgICAgICAgICAgICAgICBxdWVyaWVzID0gcXVlcmllcy5maWx0ZXIoZmlsdGVyRm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXN1bHRzKHF1ZXJpZXMsIGNvbHVtbnMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gZ2V0QXBwT2JqZWN0UXVlcmllczonLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgc3BlY2lmaWMgRGF0YSBTb3VyY2UgUXVlcnkgYnkgSUQgb3IgTmFtZVxuICAgICAqIFxuICAgICAqIEBwYXJhbSBxdWVyeSBJRCBvciBOYW1lIG9mIHRoZSBkYXRhIHNvdXJjZSBxdWVyeSB0byByZXRyaWV2ZVxuICAgICAqIEBwYXJhbSBjb2x1bW5zIE9wdGlvbmFsIGNvbHVtbnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVzdWx0XG4gICAgICogQHJldHVybnMgVGhlIGRhdGEgc291cmNlIHF1ZXJ5IHdpdGggc3BlY2lmaWVkIGNvbHVtbnMgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKiBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEdldCBhIHNwZWNpZmljIHF1ZXJ5IHdpdGggYWxsIHByb3BlcnRpZXNcbiAgICAgKiBjb25zdCBxdWVyeSA9IG1ldGFkYXRhVXRpbHMuZ2V0RGF0YVNvdXJjZVF1ZXJ5RGV0YWlscygnNzNlNTkwZDAtYzRlYi00NjRkLWFiZjktMDE5NDNlMzBhZTA5Jyk7XG4gICAgICogXG4gICAgICogLy8gR2V0IHNwZWNpZmljIGNvbHVtbnMgZnJvbSBhIHF1ZXJ5IGJ5IG5hbWVcbiAgICAgKiBjb25zdCBxdWVyeSA9IG1ldGFkYXRhVXRpbHMuZ2V0RGF0YVNvdXJjZVF1ZXJ5RGV0YWlscyhcbiAgICAgKiAgICdHZXRfU0xBU2NoZW1lc19MaXN0JyxcbiAgICAgKiAgIFsnSUQnLCAnUXVlcnlOYW1lJywgJ0Rpc3BsYXlOYW1lJ11cbiAgICAgKiApO1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXREYXRhU291cmNlUXVlcnlEZXRhaWxzKHF1ZXJ5OiBzdHJpbmcsIGNvbHVtbnM/OiBzdHJpbmdbXSk6IGFueSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRhU291cmNlUXVlcmllcyhxID0+XG4gICAgICAgICAgICAgICAgcS5JRD8udG9Mb3dlckNhc2UoKSA9PT0gcXVlcnk/LnRvTG93ZXJDYXNlKCkgfHwgcS5RdWVyeU5hbWUgPT09IHF1ZXJ5LFxuICAgICAgICAgICAgICAgIGNvbHVtbnNcbiAgICAgICAgICAgICk/LlswXSA/PyBudWxsO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gZ2V0RGF0YVNvdXJjZVF1ZXJ5OicsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBmaWVsZHMgZnJvbSBhIGRhdGEgc291cmNlIHF1ZXJ5XG4gICAgICogXG4gICAgICogQHBhcmFtIHF1ZXJ5IElEIG9yIE5hbWUgb2YgdGhlIGRhdGEgc291cmNlIHF1ZXJ5XG4gICAgICogQHBhcmFtIGZpbHRlckZuIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiBmb3IgcXVlcnkgZmllbGRzXG4gICAgICogQHBhcmFtIGNvbHVtbnMgT3B0aW9uYWwgY29sdW1ucyB0byBpbmNsdWRlIGluIHRoZSByZXN1bHRcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgcXVlcnkgd2l0aCBhcHAgZmllbGQgZGV0YWlsc1xuICAgICAqIFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gR2V0IGFsbCBmaWVsZHMgZm9yIGEgcXVlcnlcbiAgICAgKiBjb25zdCBxdWVyeUZpZWxkcyA9IG1ldGFkYXRhVXRpbHMuZ2V0RGF0YVNvdXJjZVF1ZXJ5RmllbGRzKCc3M2U1OTBkMC1jNGViLTQ2NGQtYWJmOS0wMTk0M2UzMGFlMDknKTtcbiAgICAgKiBcbiAgICAgKiAvLyBHZXQgZmllbGRzIGZvciBhIHF1ZXJ5IGJ5IG5hbWVcbiAgICAgKiBjb25zdCBxdWVyeUZpZWxkcyA9IG1ldGFkYXRhVXRpbHMuZ2V0RGF0YVNvdXJjZVF1ZXJ5RmllbGRzKCdHZXRfU0xBU2NoZW1lc19MaXN0Jyk7XG4gICAgICogXG4gICAgICogLy8gR2V0IGZpZWxkcyB3aXRoIGZpbHRlciBhbmQgc3BlY2lmaWMgY29sdW1uc1xuICAgICAqIGNvbnN0IGZpZWxkcyA9IG1ldGFkYXRhVXRpbHMuZ2V0RGF0YVNvdXJjZVF1ZXJ5RmllbGRzKFxuICAgICAqICAgJzczZTU5MGQwLWM0ZWItNDY0ZC1hYmY5LTAxOTQzZTMwYWUwOScsXG4gICAgICogICBmaWVsZCA9PiBmaWVsZC5GaWVsZFR5cGUgPT09IDEsXG4gICAgICogICBbJ0lEJywgJ0FwcEZpZWxkSUQnLCAnRmllbGRUeXBlJ11cbiAgICAgKiApO1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWVsZHNCeURTUShcbiAgICAgICAgcXVlcnk6IHN0cmluZyxcbiAgICAgICAgZmlsdGVyRm4/OiAoKHZhbHVlOiBEYXRhU291cmNlUXVlcmllc19GaWVsZHMpID0+IGJvb2xlYW4pLFxuICAgICAgICBjb2x1bW5zPzogc3RyaW5nW11cbiAgICApOiBhbnlbXSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBxdWVyeSB1c2luZyBvdXIgZXhpc3RpbmcgbWV0aG9kXG4gICAgICAgICAgICBjb25zdCBkc1F1ZXJ5ID0gdGhpcy5nZXREYXRhU291cmNlUXVlcnlEZXRhaWxzKHF1ZXJ5KTtcbiAgICAgICAgICAgIGlmICghZHNRdWVyeSB8fCAhZHNRdWVyeS5GaWVsZHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR2V0IGVuaGFuY2VkIGZpZWxkcyB3aXRoIGFwcCBmaWVsZCBkZXRhaWxzXG4gICAgICAgICAgICBsZXQgcXVlcnlGaWVsZHMgPSB0aGlzLmVuaGFuY2VRdWVyeUZpZWxkc1dpdGhBcHBGaWVsZHMoZHNRdWVyeSk7XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IGZpbHRlciBpZiBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKGZpbHRlckZuKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlGaWVsZHMgPSBxdWVyeUZpZWxkcy5maWx0ZXIoZmlsdGVyRm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXN1bHRzKHF1ZXJ5RmllbGRzLCBjb2x1bW5zKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGdldERhdGFTb3VyY2VRdWVyeUZpZWxkczonLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmhhbmNlcyBxdWVyeSBmaWVsZHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIGFwcCBmaWVsZCBkZXRhaWxzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGVuaGFuY2VRdWVyeUZpZWxkc1dpdGhBcHBGaWVsZHMoZHNRdWVyeTogRGF0YVNvdXJjZVF1ZXJpZXMpOiBhbnlbXSB7XG4gICAgICAgIGlmICghZHNRdWVyeSB8fCAhZHNRdWVyeS5GaWVsZHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCB0aGUgcGFyZW50IGFwcCBvYmplY3RcbiAgICAgICAgY29uc3QgcGFyZW50QXBwT2JqZWN0ID0gdGhpcy5maW5kUGFyZW50QXBwT2JqZWN0Rm9yUXVlcnkoZHNRdWVyeSk7XG4gICAgICAgIGlmICghcGFyZW50QXBwT2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZHNRdWVyeS5GaWVsZHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgYXBwIGZpZWxkIGRldGFpbHMgdG8gZWFjaCBxdWVyeSBmaWVsZFxuICAgICAgICByZXR1cm4gZHNRdWVyeS5GaWVsZHMubWFwKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhcHBGaWVsZCA9IHRoaXMuZmluZEFwcEZpZWxkQnlJZChwYXJlbnRBcHBPYmplY3QsIGZpZWxkLkFwcEZpZWxkSUQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgICAgICAgICBGaWVsZDogYXBwRmllbGQgfHwge31cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBwYXJlbnQgYXBwIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgc3BlY2lmaWMgZGF0YSBzb3VyY2UgcXVlcnlcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZFBhcmVudEFwcE9iamVjdEZvclF1ZXJ5KGRzUXVlcnk6IERhdGFTb3VyY2VRdWVyaWVzKTogQXBwT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXBwT2JqZWN0cyhvYmogPT5cbiAgICAgICAgICAgIG9iai5EYXRhU291cmNlUXVlcmllcz8uc29tZSgocTogYW55KSA9PlxuICAgICAgICAgICAgICAgIHEuSUQ/LnRvTG93ZXJDYXNlKCkgPT09IGRzUXVlcnkuSUQ/LnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgICAgICAgICBxLlF1ZXJ5TmFtZSA9PT0gZHNRdWVyeS5RdWVyeU5hbWVcbiAgICAgICAgICAgIClcbiAgICAgICAgKVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBhbiBhcHAgZmllbGQgYnkgSUQgd2l0aGluIGEgc3BlY2lmaWMgYXBwIG9iamVjdFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kQXBwRmllbGRCeUlkKGFwcE9iamVjdDogQXBwT2JqZWN0LCBmaWVsZElkOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBpZiAoIWFwcE9iamVjdCB8fCAhYXBwT2JqZWN0LkZpZWxkcz8ubGVuZ3RoIHx8ICFmaWVsZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcE9iamVjdC5GaWVsZHMuZmluZChcbiAgICAgICAgICAgIChmaWVsZDogYW55KSA9PiBmaWVsZC5JRD8udG9Mb3dlckNhc2UoKSA9PT0gZmllbGRJZD8udG9Mb3dlckNhc2UoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgcXVlcnkgcGFyYW1ldGVycyBmcm9tIGEgZGF0YSBzb3VyY2UgcXVlcnlcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcXVlcnkgSUQgb3IgTmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UgcXVlcnlcbiAgICAgKiBAcGFyYW0gZmlsdGVyRm4gT3B0aW9uYWwgZmlsdGVyIGZ1bmN0aW9uIGZvciBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIGNvbHVtbnMgT3B0aW9uYWwgY29sdW1ucyB0byBpbmNsdWRlIGluIHRoZSByZXN1bHRcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgc3BlY2lmaWVkIHF1ZXJ5XG4gICAgICogXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBHZXQgYWxsIHBhcmFtZXRlcnMgZm9yIGEgcXVlcnlcbiAgICAgKiBjb25zdCBxdWVyeVBhcmFtcyA9IG1ldGFkYXRhVXRpbHMuZ2V0UGFyYW1ldGVyc0J5RFNRKCc3M2U1OTBkMC1jNGViLTQ2NGQtYWJmOS0wMTk0M2UzMGFlMDknKTtcbiAgICAgKiBcbiAgICAgKiAvLyBHZXQgYWxsIHBhcmFtZXRlcnMgZm9yIGEgcXVlcnkgYnkgbmFtZVxuICAgICAqIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbWV0YWRhdGFVdGlscy5nZXRQYXJhbWV0ZXJzQnlEU1EoJ0dldF9TTEFTY2hlbWVzX0xpc3QnKTtcbiAgICAgKiBcbiAgICAgKiAvLyBHZXQgbWFuZGF0b3J5IHBhcmFtZXRlcnMgb25seVxuICAgICAqIGNvbnN0IG1hbmRhdG9yeVBhcmFtcyA9IG1ldGFkYXRhVXRpbHMuZ2V0UGFyYW1ldGVyc0J5RFNRKFxuICAgICAqICAgJzczZTU5MGQwLWM0ZWItNDY0ZC1hYmY5LTAxOTQzZTMwYWUwOScsXG4gICAgICogICBwYXJhbSA9PiBwYXJhbS5Jc01hbmRhdG9yeSA9PT0gdHJ1ZVxuICAgICAqICk7XG4gICAgICovXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnNCeURTUShcbiAgICAgICAgcXVlcnk6IHN0cmluZyxcbiAgICAgICAgZmlsdGVyRm4/OiAoKHZhbHVlOiBQYXJhbWV0ZXJzKSA9PiBib29sZWFuKSxcbiAgICAgICAgY29sdW1ucz86IHN0cmluZ1tdXG4gICAgKTogYW55W10ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRmluZCB0aGUgcXVlcnkgdXNpbmcgb3VyIGV4aXN0aW5nIG1ldGhvZFxuICAgICAgICAgICAgY29uc3QgZHNRdWVyeSA9IHRoaXMuZ2V0RGF0YVNvdXJjZVF1ZXJ5RGV0YWlscyhxdWVyeSk7XG4gICAgICAgICAgICBpZiAoIWRzUXVlcnkgfHwgIWRzUXVlcnkuUGFyYW1ldGVycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzOiBQYXJhbWV0ZXJzW10gPSBkc1F1ZXJ5LlBhcmFtZXRlcnMgfHwgW107XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IGZpbHRlciBpZiBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKGZpbHRlckZuKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLmZpbHRlcihmaWx0ZXJGbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdFJlc3VsdHMocXVlcnlQYXJhbWV0ZXJzLCBjb2x1bW5zKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGdldERhdGFTb3VyY2VRdWVyeVBhcmFtZXRlcnM6JywgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXRzIEFwcCBTY3JlZW5zIHdpdGggZmlsdGVyIGNyaXRlcmlhXG4gICAgKiBcbiAgICAqIEBwYXJhbSBmaWx0ZXJGbiBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gdG8gYXBwbHkgdG8gYXBwIHNjcmVlbnNcbiAgICAqIEBwYXJhbSBjb2x1bW5zIE9wdGlvbmFsIGNvbHVtbnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVzdWx0XG4gICAgKiBAcmV0dXJucyBBcnJheSBvZiBmaWx0ZXJlZCBhcHAgc2NyZWVuc1xuICAgICogXG4gICAgKiBAZXhhbXBsZVxuICAgICogLy8gR2V0IGFsbCBzeXN0ZW0gc2NyZWVuc1xuICAgICogY29uc3Qgc3lzdGVtU2NyZWVucyA9IG1ldGFkYXRhVXRpbHMuZ2V0QXBwU2NyZWVucyhzY3JlZW4gPT4gc2NyZWVuLklzU3lzdGVtUmVjb3JkID09PSB0cnVlKTtcbiAgICAqIFxuICAgICogLy8gR2V0IHNwZWNpZmljIGNvbHVtbnMgZnJvbSBhbGwgc2NyZWVuc1xuICAgICogY29uc3Qgc2NyZWVucyA9IG1ldGFkYXRhVXRpbHMuZ2V0QXBwU2NyZWVucyhcbiAgICAqICAgdW5kZWZpbmVkLCBcbiAgICAqICAgWydJRCcsICdOYW1lJywgJ1NjcmVlblR5cGUnXVxuICAgICogKTtcbiAgICAqL1xuICAgIHB1YmxpYyBnZXRBcHBTY3JlZW5zKGZpbHRlckZuPzogKCh2YWx1ZTogQXBwU2NyZWVuKSA9PiBib29sZWFuKSwgY29sdW1ucz86IHN0cmluZ1tdKTogYW55W10ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGFwcFNjcmVlbnMgPSBDb21tb24udGFiSnNvbi5BcHBTY3JlZW5zIHx8IFtdO1xuXG4gICAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChmaWx0ZXJGbikge1xuICAgICAgICAgICAgICAgIGFwcFNjcmVlbnMgPSBhcHBTY3JlZW5zLmZpbHRlcihmaWx0ZXJGbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdFJlc3VsdHMoYXBwU2NyZWVucywgY29sdW1ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBnZXRBcHBTY3JlZW5zOicsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBzcGVjaWZpYyBBcHAgU2NyZWVuIGJ5IElEIG9yIE5hbWVcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gc2NyZWVuIElEIG9yIE5hbWUgb2YgdGhlIGFwcCBzY3JlZW4gdG8gcmV0cmlldmVcbiAgICAgKiBAcGFyYW0gY29sdW1ucyBPcHRpb25hbCBjb2x1bW5zIHRvIGluY2x1ZGUgaW4gdGhlIHJlc3VsdFxuICAgICAqIEByZXR1cm5zIFRoZSBhcHAgc2NyZWVuIHdpdGggc3BlY2lmaWVkIGNvbHVtbnMgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKiBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEdldCBhIHNwZWNpZmljIHNjcmVlbiB3aXRoIGFsbCBwcm9wZXJ0aWVzXG4gICAgICogY29uc3Qgc2NyZWVuID0gbWV0YWRhdGFVdGlscy5nZXRBcHBTY3JlZW4oJ2E1Y2Q2MzllLTMxYmEtNGQzMy04ODAwLTAwNWE1MjQ4ZGZiMicpO1xuICAgICAqIFxuICAgICAqIC8vIEdldCBzcGVjaWZpYyBjb2x1bW5zIGZyb20gYSBzY3JlZW4gYnkgbmFtZVxuICAgICAqIGNvbnN0IHNjcmVlbiA9IG1ldGFkYXRhVXRpbHMuZ2V0QXBwU2NyZWVuKFxuICAgICAqICAgJ05ldyBEZXRhaWwgUm9sZS9QZXJtaXNzaW9uIEFwcG9qZWN0IGFjZXNzIHdpc2UnLFxuICAgICAqICAgWydJRCcsICdOYW1lJywgJ1NjcmVlblR5cGUnXVxuICAgICAqICk7XG4gICAgICovXG4gICAgcHVibGljIGdldEFwcFNjcmVlbihzY3JlZW46IHN0cmluZywgY29sdW1ucz86IHN0cmluZ1tdKTogYW55IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEFwcFNjcmVlbnMoc2NyID0+XG4gICAgICAgICAgICAgICAgc2NyLklEPy50b0xvd2VyQ2FzZSgpID09PSBzY3JlZW4/LnRvTG93ZXJDYXNlKCkgfHwgc2NyLk5hbWUgPT09IHNjcmVlbixcbiAgICAgICAgICAgICAgICBjb2x1bW5zXG4gICAgICAgICAgICApPy5bMF0gPz8gbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGdldEFwcFNjcmVlbjonLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgQXBwIE1lbnVzIHdpdGggZmlsdGVyIGNyaXRlcmlhXG4gICAgICogXG4gICAgICogQHBhcmFtIGZpbHRlckZuIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiB0byBhcHBseSB0byBhcHAgbWVudXNcbiAgICAgKiBAcGFyYW0gY29sdW1ucyBPcHRpb25hbCBjb2x1bW5zIHRvIGluY2x1ZGUgaW4gdGhlIHJlc3VsdFxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGZpbHRlcmVkIGFwcCBtZW51c1xuICAgICAqIFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gR2V0IGFsbCB0b3AtbGV2ZWwgbWVudXNcbiAgICAgKiBjb25zdCB0b3BNZW51cyA9IG1ldGFkYXRhVXRpbHMuZ2V0QXBwTWVudXMobWVudSA9PiAhbWVudS5QYXJlbnRJRCk7XG4gICAgICogXG4gICAgICogLy8gR2V0IHNwZWNpZmljIGNvbHVtbnMgZnJvbSBhbGwgbWVudXNcbiAgICAgKiBjb25zdCBtZW51cyA9IG1ldGFkYXRhVXRpbHMuZ2V0QXBwTWVudXMoXG4gICAgICogICB1bmRlZmluZWQsIFxuICAgICAqICAgWydJRCcsICdNZW51TmFtZScsICdEaXNwbGF5TmFtZScsICdTY3JlZW5JRCddXG4gICAgICogKTtcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QXBwTWVudXMoZmlsdGVyRm4/OiAoKHZhbHVlOiBBcHBNZW51KSA9PiBib29sZWFuKSwgY29sdW1ucz86IHN0cmluZ1tdKTogYW55W10ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGFwcE1lbnVzID0gQ29tbW9uLnRhYkpzb24uQXBwTWVudXMgfHwgW107XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IGZpbHRlciBpZiBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKGZpbHRlckZuKSB7XG4gICAgICAgICAgICAgICAgYXBwTWVudXMgPSBhcHBNZW51cy5maWx0ZXIoZmlsdGVyRm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXN1bHRzKGFwcE1lbnVzLCBjb2x1bW5zKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGdldEFwcE1lbnVzOicsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgb3JnYW5pemF0aW9uIGluZm9ybWF0aW9uIHdpdGggZmlsdGVyIGNyaXRlcmlhXG4gICAgICogXG4gICAgICogQHBhcmFtIGZpbHRlckZuIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiB0byBhcHBseSB0byBvcmdhbml6YXRpb25zXG4gICAgICogQHBhcmFtIGNvbHVtbnMgT3B0aW9uYWwgY29sdW1ucyB0byBpbmNsdWRlIGluIHRoZSByZXN1bHRcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBmaWx0ZXJlZCBvcmdhbml6YXRpb25zXG4gICAgICogXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBHZXQgYWxsIG9yZ2FuaXphdGlvbnNcbiAgICAgKiBjb25zdCBvcmdzID0gbWV0YWRhdGFVdGlscy5nZXRPcmdzKCk7XG4gICAgICogXG4gICAgICogLy8gR2V0IG9yZ2FuaXphdGlvbnMgd2l0aCBzcGVjaWZpYyBzdWJkb21haW4gcGF0dGVyblxuICAgICAqIGNvbnN0IHNwZWNpZmljT3JncyA9IG1ldGFkYXRhVXRpbHMuZ2V0T3JncyhcbiAgICAgKiAgIG9yZyA9PiBvcmcuU3ViZG9tYWluPy5pbmNsdWRlcygndGVzdCcpXG4gICAgICogKTtcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T3JncyhmaWx0ZXJGbj86ICgodmFsdWU6IE9yZ0luZm8pID0+IGJvb2xlYW4pLCBjb2x1bW5zPzogc3RyaW5nW10pOiBhbnlbXSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgb3JnYW5pemF0aW9ucyA9IENvbW1vbi50YWJKc29uLk9yZ0luZm9zIHx8IFtdO1xuXG4gICAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChmaWx0ZXJGbikge1xuICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbnMgPSBvcmdhbml6YXRpb25zLmZpbHRlcihmaWx0ZXJGbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdFJlc3VsdHMob3JnYW5pemF0aW9ucywgY29sdW1ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBnZXRPcmdhbml6YXRpb25zOicsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBzcGVjaWZpYyBvcmdhbml6YXRpb24gYnkgSUQgb3IgTmFtZVxuICAgICAqIFxuICAgICAqIEBwYXJhbSBvcmdhbml6YXRpb24gSUQgb3IgT3JnYW5pemF0aW9uTmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uXG4gICAgICogQHBhcmFtIGNvbHVtbnMgT3B0aW9uYWwgY29sdW1ucyB0byBpbmNsdWRlIGluIHRoZSByZXN1bHRcbiAgICAgKiBAcmV0dXJucyBUaGUgb3JnYW5pemF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICogXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBHZXQgb3JnYW5pemF0aW9uIGJ5IElEXG4gICAgICogY29uc3Qgb3JnID0gbWV0YWRhdGFVdGlscy5nZXRPcmdJbmZvRGV0YWlscygnMGVjM2QwZjEtYjJlYy00N2I3LTgzMDUtYjc2N2QwZTVlYTYzJyk7XG4gICAgICogXG4gICAgICogLy8gR2V0IG9yZ2FuaXphdGlvbiBieSBuYW1lXG4gICAgICogY29uc3Qgb3JnID0gbWV0YWRhdGFVdGlscy5nZXRPcmdJbmZvRGV0YWlscygnU3F1YWRGb2N1cycpO1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPcmdJbmZvRGV0YWlscyhvcmdhbml6YXRpb246IHN0cmluZywgY29sdW1ucz86IHN0cmluZ1tdKTogYW55IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE9yZ3Mob3JnID0+XG4gICAgICAgICAgICAgICAgb3JnLklEPy50b0xvd2VyQ2FzZSgpID09PSBvcmdhbml6YXRpb24/LnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgICAgICAgICBvcmcuT3JnYW5pemF0aW9uTmFtZSA9PT0gb3JnYW5pemF0aW9uIHx8XG4gICAgICAgICAgICAgICAgb3JnLlN1YmRvbWFpbiA9PT0gb3JnYW5pemF0aW9uLFxuICAgICAgICAgICAgICAgIGNvbHVtbnNcbiAgICAgICAgICAgIClbMF0gfHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGdldE9yZ2FuaXphdGlvbjonLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0iXX0=
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
1
|
+
export var MetadataEntityType;
|
|
2
|
+
(function (MetadataEntityType) {
|
|
3
|
+
MetadataEntityType["APP_OBJECTS"] = "AppObjects";
|
|
4
|
+
MetadataEntityType["APP_FIELDS"] = "AppFields";
|
|
5
|
+
MetadataEntityType["DATA_SOURCE_QUERIES"] = "DataSourceQueries";
|
|
6
|
+
MetadataEntityType["APP_SCREENS"] = "AppScreens";
|
|
7
|
+
MetadataEntityType["APP_MENUS"] = "AppMenus";
|
|
8
|
+
})(MetadataEntityType || (MetadataEntityType = {}));
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGF0YS1hY2Nlc3Mvc3JjL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9pbnRlcmZhY2VzL3NjaGVtYS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0JBLE1BQU0sQ0FBTixJQUFZLGtCQU1YO0FBTkQsV0FBWSxrQkFBa0I7SUFDNUIsZ0RBQTBCLENBQUE7SUFDMUIsOENBQXdCLENBQUE7SUFDeEIsK0RBQXlDLENBQUE7SUFDekMsZ0RBQTBCLENBQUE7SUFDMUIsNENBQXNCLENBQUE7QUFDeEIsQ0FBQyxFQU5XLGtCQUFrQixLQUFsQixrQkFBa0IsUUFNN0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFNjaGVtYVJlc3BvbnNlIHtcbiAgUmVxdWVzdElkOiBzdHJpbmdcbiAgSXNTdWNjZXNzOiBib29sZWFuXG4gIFJlc3VsdDogc3RyaW5nXG4gIFN0YXR1c0NvZGU6IHN0cmluZ1xuICBSZWNvcmRBZmZlY3R0ZWQ6IG51bWJlclxuICBUb3RhbFJlY29yZHM6IG51bWJlclxuICBUb3RhbEV4ZWN1dGlvblRpbWU6IG51bWJlclxuICBMb2c6IGFueVtdXG4gIEVycm9yczogYW55W11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdJbmZvIHtcbiAgSUQ6IHN0cmluZztcbiAgT3JnYW5pemF0aW9uTmFtZTogc3RyaW5nO1xuICBQcmltYXJ5Q29udGFjdDogYW55O1xuICBBZGRyZXNzOiBhbnk7XG4gIExvY2FsZVNldHRpbmdzOiBzdHJpbmcgfCBudWxsO1xuICBTdWJkb21haW46IHN0cmluZztcbiAgVGVuYW50Q29kZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGVudW0gTWV0YWRhdGFFbnRpdHlUeXBlIHtcbiAgQVBQX09CSkVDVFMgPSAnQXBwT2JqZWN0cycsXG4gIEFQUF9GSUVMRFMgPSAnQXBwRmllbGRzJyxcbiAgREFUQV9TT1VSQ0VfUVVFUklFUyA9ICdEYXRhU291cmNlUXVlcmllcycsXG4gIEFQUF9TQ1JFRU5TID0gJ0FwcFNjcmVlbnMnLFxuICBBUFBfTUVOVVMgPSAnQXBwTWVudXMnXG59Il19
|
package/index.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export * from './lib/tab-core-utility/app/helpers/common/dsq.helpers';
|
|
|
20
20
|
export * from './lib/tab-core-utility/app/helpers/common/req-res.helpers';
|
|
21
21
|
export * from './lib/tab-core-utility/app/helpers/common/where-clause.helpers';
|
|
22
22
|
export * from './lib/tab-core-utility/app/helpers/common/template.helpers';
|
|
23
|
+
export * from './lib/tab-core-utility/app/helpers/common/meta-data.helpers';
|
|
23
24
|
export * from './lib/tab-core-utility/app/helpers/screen/forms.helpers';
|
|
24
25
|
export * from './lib/tab-core-utility/app/helpers/screen/grid-column-data.helpers';
|
|
25
26
|
export * from './lib/tab-core-utility/app/helpers/screen/grid.helpers';
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { MetadataEntityType, OrgInfo } from "../../interfaces/schema.interface";
|
|
2
|
+
import { AppMenu, AppObject, AppScreen } from "../../models/app-object.class";
|
|
3
|
+
import { AppFields, DataSourceQueries, DataSourceQueries_Fields, Parameters } from "../../models/data-source-queries.class";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* MetadataUtils - Utility service for retrieving and manipulating application metadata
|
|
7
|
+
*
|
|
8
|
+
* This service provides methods to extract, filter, and format different parts of the
|
|
9
|
+
* application metadata, including objects, fields, screens, menus, etc.
|
|
10
|
+
*/
|
|
11
|
+
export declare class MetadataHelper {
|
|
12
|
+
private formatResults;
|
|
13
|
+
/**
|
|
14
|
+
* Search across all metadata for a term
|
|
15
|
+
*
|
|
16
|
+
* @param searchTerm Term to search for
|
|
17
|
+
* @param entityTypes Optional types of entities to search (if not provided, searches all)
|
|
18
|
+
* @returns Search results grouped by entity type
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Search across all metadata
|
|
22
|
+
* const results = metadataUtils.searchAcrossMetadata('Blueprint');
|
|
23
|
+
*
|
|
24
|
+
* // Search only in app objects and screens
|
|
25
|
+
* const results = metadataUtils.searchAcrossMetadata(
|
|
26
|
+
* 'Role',
|
|
27
|
+
* [MetadataEntityType.APP_OBJECTS, MetadataEntityType.APP_SCREENS]
|
|
28
|
+
* );
|
|
29
|
+
*/
|
|
30
|
+
searchAcrossMetadata(searchTerm: string, entityTypes?: MetadataEntityType[]): Record<string, any[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Search for a term within App Objects
|
|
33
|
+
* @private
|
|
34
|
+
*/
|
|
35
|
+
private searchAppObjects;
|
|
36
|
+
/**
|
|
37
|
+
* Search for a term within App Fields
|
|
38
|
+
* @private
|
|
39
|
+
*/
|
|
40
|
+
private searchAppFields;
|
|
41
|
+
/**
|
|
42
|
+
* Search for a term within Data Source Queries
|
|
43
|
+
* @private
|
|
44
|
+
*/
|
|
45
|
+
private searchDataSourceQueries;
|
|
46
|
+
/**
|
|
47
|
+
* Search for a term within App Screens
|
|
48
|
+
* @private
|
|
49
|
+
*/
|
|
50
|
+
private searchAppScreens;
|
|
51
|
+
/**
|
|
52
|
+
* Search for a term within App Menus
|
|
53
|
+
* @private
|
|
54
|
+
*/
|
|
55
|
+
private searchAppMenus;
|
|
56
|
+
/**
|
|
57
|
+
* Helper method to check if a string contains a search term
|
|
58
|
+
* @private
|
|
59
|
+
*/
|
|
60
|
+
private containsTerm;
|
|
61
|
+
/**
|
|
62
|
+
* Gets App Objects based on filter criteria
|
|
63
|
+
*
|
|
64
|
+
* @param filterFn Optional filter function to apply to app objects
|
|
65
|
+
* @param columns Optional columns to include in the result
|
|
66
|
+
* @returns Array of filtered app objects
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* // Get all system app objects
|
|
70
|
+
* const systemObjects = metadataUtils.getAppObjects(obj => obj.IsSystem === true);
|
|
71
|
+
*
|
|
72
|
+
* // Get specific columns from non-deprecated objects
|
|
73
|
+
* const objects = metadataUtils.getAppObjects(
|
|
74
|
+
* obj => !obj.IsDeprecated,
|
|
75
|
+
* ['ID', 'DisplayName', 'ObjectName']
|
|
76
|
+
* );
|
|
77
|
+
*/
|
|
78
|
+
getAppObjects(filterFn?: ((value: AppObject) => boolean), columns?: string[]): any[];
|
|
79
|
+
/**
|
|
80
|
+
* Gets a specific App Object by ID or Name
|
|
81
|
+
*
|
|
82
|
+
* @param appObject ID or Name of the app object to retrieve
|
|
83
|
+
* @param columns Optional columns to include in the result
|
|
84
|
+
* @returns The app object with specified columns or null if not found
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* // Get a specific app object with all properties
|
|
88
|
+
* const appObj = metadataUtils.getAppObjectDetails('b4887d4d-bb1e-4d52-a7e8-2f943d69e44c' or 'TABMD_SYSTEM');
|
|
89
|
+
*
|
|
90
|
+
* // Get specific columns from an app object
|
|
91
|
+
* const appObj = metadataUtils.getAppObjectDetails(
|
|
92
|
+
* 'b4887d4d-bb1e-4d52-a7e8-2f943d69e44c',
|
|
93
|
+
* ['ID', 'DisplayName', 'ObjectName']
|
|
94
|
+
* );
|
|
95
|
+
*/
|
|
96
|
+
getAppObjectDetails(appObject: string, columns?: string[]): any;
|
|
97
|
+
/**
|
|
98
|
+
* Gets all fields across all app objects with filter criteria
|
|
99
|
+
*
|
|
100
|
+
* @param filterFn Optional filter function to apply to fields
|
|
101
|
+
* @param columns Optional columns to include in the result
|
|
102
|
+
* @returns Array of filtered fields
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* // Get all required fields across all objects
|
|
106
|
+
* const requiredFields = metadataUtils.getAppFields(field => field.IsRequired === true);
|
|
107
|
+
*
|
|
108
|
+
* // Get specific columns from searchable fields
|
|
109
|
+
* const fields = metadataUtils.getAppFields(
|
|
110
|
+
* field => field.IsSearchable === true,
|
|
111
|
+
* ['ID', 'DisplayName', 'FieldName']
|
|
112
|
+
* );
|
|
113
|
+
*/
|
|
114
|
+
getAppFields(filterFn?: ((value: AppFields) => boolean), columns?: string[]): any[];
|
|
115
|
+
/**
|
|
116
|
+
* Gets fields for a specific app object
|
|
117
|
+
*
|
|
118
|
+
* @param appObject ID or Name of the app object
|
|
119
|
+
* @param filterFn Optional filter function for fields
|
|
120
|
+
* @returns Array of fields for the specified object
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* // Get all fields for an object
|
|
124
|
+
* const fields = metadataUtils.getAppFieldsByAppObject('b4887d4d-bb1e-4d52-a7e8-2f943d69e44c' or 'TABMD_SYSTEM');
|
|
125
|
+
*
|
|
126
|
+
* // Get only required fields
|
|
127
|
+
* const requiredFields = metadataUtils.getAppFieldsByAppObject(
|
|
128
|
+
* 'b4887d4d-bb1e-4d52-a7e8-2f943d69e44c',
|
|
129
|
+
* field => field.IsRequired === true
|
|
130
|
+
* );
|
|
131
|
+
*/
|
|
132
|
+
getAppFieldsByAppObject(appObject: string, filterFn?: ((value: AppFields, index: number, array: AppFields[]) => boolean), columns?: string[]): any[];
|
|
133
|
+
/**
|
|
134
|
+
* Gets lookup fields for a specific app object
|
|
135
|
+
*
|
|
136
|
+
* @param appObject ID or Name of the app object
|
|
137
|
+
* @param filterFn Optional filter function for lookup fields
|
|
138
|
+
* @param columns Optional columns to include in the result
|
|
139
|
+
* @returns Array of lookup fields for the specified object
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* // Get all lookup fields for an object
|
|
143
|
+
* const lookupFields = metadataUtils.getLookupFieldsByAppObject('TABD_Blueprint_SLASchemes');
|
|
144
|
+
*
|
|
145
|
+
* // Get specific lookup fields
|
|
146
|
+
* const fields = metadataUtils.getLookupFieldsByAppObject(
|
|
147
|
+
* 'b4887d4d-bb1e-4d52-a7e8-2f943d69e44c',
|
|
148
|
+
* field => field.IsRequired === true
|
|
149
|
+
* );
|
|
150
|
+
*/
|
|
151
|
+
getLookupFieldsByAppObject(appObject: string, filterFn?: ((value: AppFields) => boolean), columns?: string[]): any[];
|
|
152
|
+
/**
|
|
153
|
+
* Gets data source queries with filter criteria
|
|
154
|
+
*
|
|
155
|
+
* @param filterFn Optional filter function to apply to queries
|
|
156
|
+
* @param columns Optional columns to include in the result
|
|
157
|
+
* @returns Array of filtered data source queries
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* // Get all queries with a specific naming pattern
|
|
161
|
+
* const queries = metadataUtils.getDataSourceQueries(query => query.QueryName.includes('List'));
|
|
162
|
+
*
|
|
163
|
+
* // Get specific columns from all queries
|
|
164
|
+
* const queries = metadataUtils.getDataSourceQueries(
|
|
165
|
+
* undefined,
|
|
166
|
+
* ['ID', 'QueryName', 'DisplayName']
|
|
167
|
+
* );
|
|
168
|
+
*/
|
|
169
|
+
getDataSourceQueries(filterFn?: ((value: DataSourceQueries) => boolean), columns?: string[]): any[];
|
|
170
|
+
/**
|
|
171
|
+
* Gets data source queries for a specific app object
|
|
172
|
+
*
|
|
173
|
+
* @param appObject ID or Name of the app object
|
|
174
|
+
* @param filterFn Optional filter function for queries
|
|
175
|
+
* @param columns Optional columns to include in the result
|
|
176
|
+
* @returns Array of queries for the specified object
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* // Get all queries for an object
|
|
180
|
+
* const queries = metadataUtils.getDataSourceQueriesByAppObject('b4887d4d-bb1e-4d52-a7e8-2f943d69e44c');
|
|
181
|
+
*
|
|
182
|
+
* // Get queries with specific pattern
|
|
183
|
+
* const filteredQueries = metadataUtils.getDataSourceQueriesByAppObject(
|
|
184
|
+
* 'TABD_Blueprint_SLASchemes',
|
|
185
|
+
* query => query.QueryName.includes('List')
|
|
186
|
+
* );
|
|
187
|
+
*/
|
|
188
|
+
getDataSourceQueriesByAppObject(appObject: string, filterFn?: ((value: DataSourceQueries) => boolean), columns?: string[]): any[];
|
|
189
|
+
/**
|
|
190
|
+
* Gets a specific Data Source Query by ID or Name
|
|
191
|
+
*
|
|
192
|
+
* @param query ID or Name of the data source query to retrieve
|
|
193
|
+
* @param columns Optional columns to include in the result
|
|
194
|
+
* @returns The data source query with specified columns or null if not found
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* // Get a specific query with all properties
|
|
198
|
+
* const query = metadataUtils.getDataSourceQueryDetails('73e590d0-c4eb-464d-abf9-01943e30ae09');
|
|
199
|
+
*
|
|
200
|
+
* // Get specific columns from a query by name
|
|
201
|
+
* const query = metadataUtils.getDataSourceQueryDetails(
|
|
202
|
+
* 'Get_SLASchemes_List',
|
|
203
|
+
* ['ID', 'QueryName', 'DisplayName']
|
|
204
|
+
* );
|
|
205
|
+
*/
|
|
206
|
+
getDataSourceQueryDetails(query: string, columns?: string[]): any;
|
|
207
|
+
/**
|
|
208
|
+
* Gets fields from a data source query
|
|
209
|
+
*
|
|
210
|
+
* @param query ID or Name of the data source query
|
|
211
|
+
* @param filterFn Optional filter function for query fields
|
|
212
|
+
* @param columns Optional columns to include in the result
|
|
213
|
+
* @returns Array of fields for the specified query with app field details
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* // Get all fields for a query
|
|
217
|
+
* const queryFields = metadataUtils.getDataSourceQueryFields('73e590d0-c4eb-464d-abf9-01943e30ae09');
|
|
218
|
+
*
|
|
219
|
+
* // Get fields for a query by name
|
|
220
|
+
* const queryFields = metadataUtils.getDataSourceQueryFields('Get_SLASchemes_List');
|
|
221
|
+
*
|
|
222
|
+
* // Get fields with filter and specific columns
|
|
223
|
+
* const fields = metadataUtils.getDataSourceQueryFields(
|
|
224
|
+
* '73e590d0-c4eb-464d-abf9-01943e30ae09',
|
|
225
|
+
* field => field.FieldType === 1,
|
|
226
|
+
* ['ID', 'AppFieldID', 'FieldType']
|
|
227
|
+
* );
|
|
228
|
+
*/
|
|
229
|
+
getFieldsByDSQ(query: string, filterFn?: ((value: DataSourceQueries_Fields) => boolean), columns?: string[]): any[];
|
|
230
|
+
/**
|
|
231
|
+
* Enhances query fields with their corresponding app field details
|
|
232
|
+
* @private
|
|
233
|
+
*/
|
|
234
|
+
private enhanceQueryFieldsWithAppFields;
|
|
235
|
+
/**
|
|
236
|
+
* Finds the parent app object that contains a specific data source query
|
|
237
|
+
* @private
|
|
238
|
+
*/
|
|
239
|
+
private findParentAppObjectForQuery;
|
|
240
|
+
/**
|
|
241
|
+
* Finds an app field by ID within a specific app object
|
|
242
|
+
* @private
|
|
243
|
+
*/
|
|
244
|
+
private findAppFieldById;
|
|
245
|
+
/**
|
|
246
|
+
* Gets query parameters from a data source query
|
|
247
|
+
*
|
|
248
|
+
* @param query ID or Name of the data source query
|
|
249
|
+
* @param filterFn Optional filter function for query parameters
|
|
250
|
+
* @param columns Optional columns to include in the result
|
|
251
|
+
* @returns Array of parameters for the specified query
|
|
252
|
+
*
|
|
253
|
+
* @example
|
|
254
|
+
* // Get all parameters for a query
|
|
255
|
+
* const queryParams = metadataUtils.getParametersByDSQ('73e590d0-c4eb-464d-abf9-01943e30ae09');
|
|
256
|
+
*
|
|
257
|
+
* // Get all parameters for a query by name
|
|
258
|
+
* const queryParams = metadataUtils.getParametersByDSQ('Get_SLASchemes_List');
|
|
259
|
+
*
|
|
260
|
+
* // Get mandatory parameters only
|
|
261
|
+
* const mandatoryParams = metadataUtils.getParametersByDSQ(
|
|
262
|
+
* '73e590d0-c4eb-464d-abf9-01943e30ae09',
|
|
263
|
+
* param => param.IsMandatory === true
|
|
264
|
+
* );
|
|
265
|
+
*/
|
|
266
|
+
getParametersByDSQ(query: string, filterFn?: ((value: Parameters) => boolean), columns?: string[]): any[];
|
|
267
|
+
/**
|
|
268
|
+
* Gets App Screens with filter criteria
|
|
269
|
+
*
|
|
270
|
+
* @param filterFn Optional filter function to apply to app screens
|
|
271
|
+
* @param columns Optional columns to include in the result
|
|
272
|
+
* @returns Array of filtered app screens
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* // Get all system screens
|
|
276
|
+
* const systemScreens = metadataUtils.getAppScreens(screen => screen.IsSystemRecord === true);
|
|
277
|
+
*
|
|
278
|
+
* // Get specific columns from all screens
|
|
279
|
+
* const screens = metadataUtils.getAppScreens(
|
|
280
|
+
* undefined,
|
|
281
|
+
* ['ID', 'Name', 'ScreenType']
|
|
282
|
+
* );
|
|
283
|
+
*/
|
|
284
|
+
getAppScreens(filterFn?: ((value: AppScreen) => boolean), columns?: string[]): any[];
|
|
285
|
+
/**
|
|
286
|
+
* Gets a specific App Screen by ID or Name
|
|
287
|
+
*
|
|
288
|
+
* @param screen ID or Name of the app screen to retrieve
|
|
289
|
+
* @param columns Optional columns to include in the result
|
|
290
|
+
* @returns The app screen with specified columns or null if not found
|
|
291
|
+
*
|
|
292
|
+
* @example
|
|
293
|
+
* // Get a specific screen with all properties
|
|
294
|
+
* const screen = metadataUtils.getAppScreen('a5cd639e-31ba-4d33-8800-005a5248dfb2');
|
|
295
|
+
*
|
|
296
|
+
* // Get specific columns from a screen by name
|
|
297
|
+
* const screen = metadataUtils.getAppScreen(
|
|
298
|
+
* 'New Detail Role/Permission Appoject acess wise',
|
|
299
|
+
* ['ID', 'Name', 'ScreenType']
|
|
300
|
+
* );
|
|
301
|
+
*/
|
|
302
|
+
getAppScreen(screen: string, columns?: string[]): any;
|
|
303
|
+
/**
|
|
304
|
+
* Gets App Menus with filter criteria
|
|
305
|
+
*
|
|
306
|
+
* @param filterFn Optional filter function to apply to app menus
|
|
307
|
+
* @param columns Optional columns to include in the result
|
|
308
|
+
* @returns Array of filtered app menus
|
|
309
|
+
*
|
|
310
|
+
* @example
|
|
311
|
+
* // Get all top-level menus
|
|
312
|
+
* const topMenus = metadataUtils.getAppMenus(menu => !menu.ParentID);
|
|
313
|
+
*
|
|
314
|
+
* // Get specific columns from all menus
|
|
315
|
+
* const menus = metadataUtils.getAppMenus(
|
|
316
|
+
* undefined,
|
|
317
|
+
* ['ID', 'MenuName', 'DisplayName', 'ScreenID']
|
|
318
|
+
* );
|
|
319
|
+
*/
|
|
320
|
+
getAppMenus(filterFn?: ((value: AppMenu) => boolean), columns?: string[]): any[];
|
|
321
|
+
/**
|
|
322
|
+
* Gets organization information with filter criteria
|
|
323
|
+
*
|
|
324
|
+
* @param filterFn Optional filter function to apply to organizations
|
|
325
|
+
* @param columns Optional columns to include in the result
|
|
326
|
+
* @returns Array of filtered organizations
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* // Get all organizations
|
|
330
|
+
* const orgs = metadataUtils.getOrgs();
|
|
331
|
+
*
|
|
332
|
+
* // Get organizations with specific subdomain pattern
|
|
333
|
+
* const specificOrgs = metadataUtils.getOrgs(
|
|
334
|
+
* org => org.Subdomain?.includes('test')
|
|
335
|
+
* );
|
|
336
|
+
*/
|
|
337
|
+
getOrgs(filterFn?: ((value: OrgInfo) => boolean), columns?: string[]): any[];
|
|
338
|
+
/**
|
|
339
|
+
* Gets a specific organization by ID or Name
|
|
340
|
+
*
|
|
341
|
+
* @param organization ID or OrganizationName of the organization
|
|
342
|
+
* @param columns Optional columns to include in the result
|
|
343
|
+
* @returns The organization or null if not found
|
|
344
|
+
*
|
|
345
|
+
* @example
|
|
346
|
+
* // Get organization by ID
|
|
347
|
+
* const org = metadataUtils.getOrgInfoDetails('0ec3d0f1-b2ec-47b7-8305-b767d0e5ea63');
|
|
348
|
+
*
|
|
349
|
+
* // Get organization by name
|
|
350
|
+
* const org = metadataUtils.getOrgInfoDetails('SquadFocus');
|
|
351
|
+
*/
|
|
352
|
+
getOrgInfoDetails(organization: string, columns?: string[]): any;
|
|
353
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MetadataHelper, never>;
|
|
354
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<MetadataHelper>;
|
|
355
|
+
}
|
|
@@ -9,3 +9,19 @@ export interface SchemaResponse {
|
|
|
9
9
|
Log: any[];
|
|
10
10
|
Errors: any[];
|
|
11
11
|
}
|
|
12
|
+
export interface OrgInfo {
|
|
13
|
+
ID: string;
|
|
14
|
+
OrganizationName: string;
|
|
15
|
+
PrimaryContact: any;
|
|
16
|
+
Address: any;
|
|
17
|
+
LocaleSettings: string | null;
|
|
18
|
+
Subdomain: string;
|
|
19
|
+
TenantCode: string | null;
|
|
20
|
+
}
|
|
21
|
+
export declare enum MetadataEntityType {
|
|
22
|
+
APP_OBJECTS = "AppObjects",
|
|
23
|
+
APP_FIELDS = "AppFields",
|
|
24
|
+
DATA_SOURCE_QUERIES = "DataSourceQueries",
|
|
25
|
+
APP_SCREENS = "AppScreens",
|
|
26
|
+
APP_MENUS = "AppMenus"
|
|
27
|
+
}
|
|
@@ -2,18 +2,18 @@ import { Observable } from "rxjs";
|
|
|
2
2
|
import { LoginUserRequest } from "../app/interfaces/auth.interface";
|
|
3
3
|
export declare const authStore: import("@angular/core").Type<{
|
|
4
4
|
token: import("@angular/core").Signal<string>;
|
|
5
|
-
name: import("@angular/core").Signal<string>;
|
|
6
5
|
id: import("@angular/core").Signal<any>;
|
|
7
6
|
email: import("@angular/core").Signal<string>;
|
|
7
|
+
name: import("@angular/core").Signal<string>;
|
|
8
8
|
avatar: import("@angular/core").Signal<string>;
|
|
9
9
|
status: import("@angular/core").Signal<string>;
|
|
10
10
|
checkUserlogin: () => boolean;
|
|
11
11
|
login: (API_URL: string, credentials: LoginUserRequest) => Observable<any>;
|
|
12
12
|
} & import("@ngrx/signals").StateSignal<{
|
|
13
13
|
token: string;
|
|
14
|
-
name: string;
|
|
15
14
|
id: any;
|
|
16
15
|
email: string;
|
|
16
|
+
name: string;
|
|
17
17
|
avatar: string;
|
|
18
18
|
status: string;
|
|
19
19
|
}>>;
|