velocious 1.0.404 → 1.0.405
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.
|
@@ -7,6 +7,7 @@ export default class VelociousDatabaseInitializerFromRequireContext {
|
|
|
7
7
|
requireContext: ModelClassRequireContextType;
|
|
8
8
|
});
|
|
9
9
|
requireContext: ModelClassRequireContextType;
|
|
10
|
+
logger: Logger;
|
|
10
11
|
/**
|
|
11
12
|
* @param {object} args - Options object.
|
|
12
13
|
* @param {import("../configuration.js").default} args.configuration - Configuration instance.
|
|
@@ -15,6 +16,33 @@ export default class VelociousDatabaseInitializerFromRequireContext {
|
|
|
15
16
|
initialize({ configuration, ...restArgs }: {
|
|
16
17
|
configuration: import("../configuration.js").default;
|
|
17
18
|
}): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Initializes a model's record metadata and its translation table (if any).
|
|
21
|
+
* @param {object} args - Options object.
|
|
22
|
+
* @param {import("../configuration.js").default} args.configuration - Configuration instance.
|
|
23
|
+
* @param {typeof import("./record/index.js").default} args.modelClass - Model class to initialize.
|
|
24
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
25
|
+
*/
|
|
26
|
+
_initializeModelRecord({ configuration, modelClass }: {
|
|
27
|
+
configuration: import("../configuration.js").default;
|
|
28
|
+
modelClass: typeof import("./record/index.js").default;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Models opting out of eager metadata loading (`setEagerLoadRecordMetadata(false)`)
|
|
32
|
+
* are still initialized at startup when their (optional) table is present, so that
|
|
33
|
+
* synchronous query building such as `.where(...)` works without callers having to
|
|
34
|
+
* call `ensureInitialized()` first. When the table — or its connection — is not
|
|
35
|
+
* available the model is left deferred so startup still succeeds; it can then
|
|
36
|
+
* initialize lazily the first time a terminal query method (find/create/etc.) runs.
|
|
37
|
+
* @param {object} args - Options object.
|
|
38
|
+
* @param {import("../configuration.js").default} args.configuration - Configuration instance.
|
|
39
|
+
* @param {typeof import("./record/index.js").default} args.modelClass - Model class to initialize.
|
|
40
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
41
|
+
*/
|
|
42
|
+
_bestEffortInitializeDeferredModel({ configuration, modelClass }: {
|
|
43
|
+
configuration: import("../configuration.js").default;
|
|
44
|
+
modelClass: typeof import("./record/index.js").default;
|
|
45
|
+
}): Promise<void>;
|
|
18
46
|
}
|
|
19
47
|
export type ModelClassRequireContextIDFunctionType = (id: string) => {
|
|
20
48
|
default: typeof import("./record/index.js").default;
|
|
@@ -23,4 +51,5 @@ export type ModelClassRequireContextType = ModelClassRequireContextIDFunctionTyp
|
|
|
23
51
|
keys: () => string[];
|
|
24
52
|
id: string;
|
|
25
53
|
};
|
|
54
|
+
import Logger from "../logger.js";
|
|
26
55
|
//# sourceMappingURL=initializer-from-require-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initializer-from-require-context.d.ts","sourceRoot":"","sources":["../../../src/database/initializer-from-require-context.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"initializer-from-require-context.d.ts","sourceRoot":"","sources":["../../../src/database/initializer-from-require-context.js"],"names":[],"mappings":"AAaA;IACE;;;OAGG;IACH,6CAFG;QAA2C,cAAc,EAAjD,4BAA4B;KACtC,EAMA;IAFC,6CAAoC;IACpC,eAA8B;IAGhC;;;;OAIG;IACH,2CAHG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;KAC7C,GAAU,OAAO,CAAC,IAAI,CAAC,CAsBzB;IAED;;;;;;OAMG;IACH,sDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACY,UAAU,EAA3D,cAAc,mBAAmB,EAAE,OAAO;KAClD,GAAU,OAAO,CAAC,IAAI,CAAC,CAQzB;IAED;;;;;;;;;;;OAWG;IACH,kEAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACY,UAAU,EAA3D,cAAc,mBAAmB,EAAE,OAAO;KAClD,GAAU,OAAO,CAAC,IAAI,CAAC,CAmBzB;CACF;qDA9FY,CAAC,EAAE,EAAE,MAAM,KAAK;IAAC,OAAO,EAAE,cAAc,mBAAmB,EAAE,OAAO,CAAA;CAAC;2CACrE,sCAAsC,GAAG;IACjD,IAAI,EAAE,MAAM,MAAM,EAAE,CAAC;IACrB,EAAE,EAAE,MAAM,CAAA;CACX;mBAGe,cAAc"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* id: string
|
|
7
7
|
* }} ModelClassRequireContextType
|
|
8
8
|
*/
|
|
9
|
+
import Logger from "../logger.js";
|
|
9
10
|
import restArgsError from "../utils/rest-args-error.js";
|
|
10
11
|
export default class VelociousDatabaseInitializerFromRequireContext {
|
|
11
12
|
/**
|
|
@@ -15,6 +16,7 @@ export default class VelociousDatabaseInitializerFromRequireContext {
|
|
|
15
16
|
constructor({ requireContext, ...restArgs }) {
|
|
16
17
|
restArgsError(restArgs);
|
|
17
18
|
this.requireContext = requireContext;
|
|
19
|
+
this.logger = new Logger(this);
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
20
22
|
* @param {object} args - Options object.
|
|
@@ -32,14 +34,54 @@ export default class VelociousDatabaseInitializerFromRequireContext {
|
|
|
32
34
|
throw new Error(`Model wasn't exported from: ${fileName}`);
|
|
33
35
|
if (!modelClass.getEagerLoadRecordMetadata()) {
|
|
34
36
|
modelClass.registerRecordClass({ configuration });
|
|
37
|
+
await this._bestEffortInitializeDeferredModel({ configuration, modelClass });
|
|
35
38
|
continue;
|
|
36
39
|
}
|
|
37
|
-
await
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
await this._initializeModelRecord({ configuration, modelClass });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Initializes a model's record metadata and its translation table (if any).
|
|
45
|
+
* @param {object} args - Options object.
|
|
46
|
+
* @param {import("../configuration.js").default} args.configuration - Configuration instance.
|
|
47
|
+
* @param {typeof import("./record/index.js").default} args.modelClass - Model class to initialize.
|
|
48
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
49
|
+
*/
|
|
50
|
+
async _initializeModelRecord({ configuration, modelClass }) {
|
|
51
|
+
await modelClass.initializeRecord({ configuration });
|
|
52
|
+
if (await modelClass.hasTranslationsTable()) {
|
|
53
|
+
await modelClass.getTranslationClass().initializeRecord({ configuration });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Models opting out of eager metadata loading (`setEagerLoadRecordMetadata(false)`)
|
|
58
|
+
* are still initialized at startup when their (optional) table is present, so that
|
|
59
|
+
* synchronous query building such as `.where(...)` works without callers having to
|
|
60
|
+
* call `ensureInitialized()` first. When the table — or its connection — is not
|
|
61
|
+
* available the model is left deferred so startup still succeeds; it can then
|
|
62
|
+
* initialize lazily the first time a terminal query method (find/create/etc.) runs.
|
|
63
|
+
* @param {object} args - Options object.
|
|
64
|
+
* @param {import("../configuration.js").default} args.configuration - Configuration instance.
|
|
65
|
+
* @param {typeof import("./record/index.js").default} args.modelClass - Model class to initialize.
|
|
66
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
67
|
+
*/
|
|
68
|
+
async _bestEffortInitializeDeferredModel({ configuration, modelClass }) {
|
|
69
|
+
try {
|
|
70
|
+
const connection = modelClass.connection({ enforceTenantDatabaseScope: false });
|
|
71
|
+
const table = await connection.getTableByName(modelClass.tableName(), { throwError: false });
|
|
72
|
+
if (!table)
|
|
73
|
+
return;
|
|
74
|
+
await this._initializeModelRecord({ configuration, modelClass });
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
// The optional table - or, for a translated model, its <table>_translations
|
|
78
|
+
// table (initializeRecord -> _defineTranslationMethods initializes the
|
|
79
|
+
// translation class) - is missing, or its connection is unavailable. Re-register
|
|
80
|
+
// to drop any partial metadata and leave the model deferred so startup still
|
|
81
|
+
// succeeds; it initializes lazily on first terminal use.
|
|
82
|
+
this.logger.debug(`Leaving ${modelClass.name} deferred - table metadata unavailable at startup`, error);
|
|
83
|
+
modelClass.registerRecordClass({ configuration });
|
|
42
84
|
}
|
|
43
85
|
}
|
|
44
86
|
}
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZXItZnJvbS1yZXF1aXJlLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2UvaW5pdGlhbGl6ZXItZnJvbS1yZXF1aXJlLWNvbnRleHQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7Ozs7R0FNRztBQUVILE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RCxNQUFNLENBQUMsT0FBTyxPQUFPLDhDQUE4QztJQUNqRTs7O09BR0c7SUFDSCxZQUFZLEVBQUMsY0FBYyxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQ3ZDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQTtRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFDLGFBQWEsRUFBRSxHQUFHLFFBQVEsRUFBQztRQUMzQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBRXRELElBQUksQ0FBQyxnQkFBZ0I7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsUUFBUSxFQUFFLENBQUMsQ0FBQTtZQUV0RixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUE7WUFFM0MsSUFBSSxDQUFDLFVBQVU7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsUUFBUSxFQUFFLENBQUMsQ0FBQTtZQUUzRSxJQUFJLENBQUMsVUFBVSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsQ0FBQztnQkFDN0MsVUFBVSxDQUFDLG1CQUFtQixDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtnQkFDL0MsTUFBTSxJQUFJLENBQUMsa0NBQWtDLENBQUMsRUFBQyxhQUFhLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtnQkFDMUUsU0FBUTtZQUNWLENBQUM7WUFFRCxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUFDLEVBQUMsYUFBYSxFQUFFLFVBQVUsRUFBQztRQUN0RCxNQUFNLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLENBQUE7UUFFbEQsSUFBSSxNQUFNLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7WUFDNUMsTUFBTSxVQUFVLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLENBQUE7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxFQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUM7UUFDbEUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFDLDBCQUEwQixFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7WUFDN0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1lBRTFGLElBQUksQ0FBQyxLQUFLO2dCQUFFLE9BQU07WUFFbEIsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBQyxhQUFhLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtRQUNoRSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLDRFQUE0RTtZQUM1RSx1RUFBdUU7WUFDdkUsaUZBQWlGO1lBQ2pGLDZFQUE2RTtZQUM3RSx5REFBeUQ7WUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxVQUFVLENBQUMsSUFBSSxtREFBbUQsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUN2RyxVQUFVLENBQUMsbUJBQW1CLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFBO1FBQ2pELENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAdHlwZWRlZiB7KGlkOiBzdHJpbmcpID0+IHtkZWZhdWx0OiB0eXBlb2YgaW1wb3J0KFwiLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH19IE1vZGVsQ2xhc3NSZXF1aXJlQ29udGV4dElERnVuY3Rpb25UeXBlXG4gKiBAdHlwZWRlZiB7TW9kZWxDbGFzc1JlcXVpcmVDb250ZXh0SURGdW5jdGlvblR5cGUgJiB7XG4gKiAgIGtleXM6ICgpID0+IHN0cmluZ1tdLFxuICogICBpZDogc3RyaW5nXG4gKiB9fSBNb2RlbENsYXNzUmVxdWlyZUNvbnRleHRUeXBlXG4gKi9cblxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZUluaXRpYWxpemVyRnJvbVJlcXVpcmVDb250ZXh0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7TW9kZWxDbGFzc1JlcXVpcmVDb250ZXh0VHlwZX0gYXJncy5yZXF1aXJlQ29udGV4dCAtIFJlcXVpcmUgY29udGV4dC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtyZXF1aXJlQ29udGV4dCwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIHRoaXMucmVxdWlyZUNvbnRleHQgPSByZXF1aXJlQ29udGV4dFxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSh7Y29uZmlndXJhdGlvbiwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgdGhpcy5yZXF1aXJlQ29udGV4dC5rZXlzKCkpIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3NJbXBvcnQgPSB0aGlzLnJlcXVpcmVDb250ZXh0KGZpbGVOYW1lKVxuXG4gICAgICBpZiAoIW1vZGVsQ2xhc3NJbXBvcnQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgaW1wb3J0IG1vZGVsIGNsYXNzIGZyb20gJHtmaWxlTmFtZX1gKVxuXG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gbW9kZWxDbGFzc0ltcG9ydC5kZWZhdWx0XG5cbiAgICAgIGlmICghbW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCB3YXNuJ3QgZXhwb3J0ZWQgZnJvbTogJHtmaWxlTmFtZX1gKVxuXG4gICAgICBpZiAoIW1vZGVsQ2xhc3MuZ2V0RWFnZXJMb2FkUmVjb3JkTWV0YWRhdGEoKSkge1xuICAgICAgICBtb2RlbENsYXNzLnJlZ2lzdGVyUmVjb3JkQ2xhc3Moe2NvbmZpZ3VyYXRpb259KVxuICAgICAgICBhd2FpdCB0aGlzLl9iZXN0RWZmb3J0SW5pdGlhbGl6ZURlZmVycmVkTW9kZWwoe2NvbmZpZ3VyYXRpb24sIG1vZGVsQ2xhc3N9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9pbml0aWFsaXplTW9kZWxSZWNvcmQoe2NvbmZpZ3VyYXRpb24sIG1vZGVsQ2xhc3N9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIG1vZGVsJ3MgcmVjb3JkIG1ldGFkYXRhIGFuZCBpdHMgdHJhbnNsYXRpb24gdGFibGUgKGlmIGFueSkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBpbml0aWFsaXplLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2luaXRpYWxpemVNb2RlbFJlY29yZCh7Y29uZmlndXJhdGlvbiwgbW9kZWxDbGFzc30pIHtcbiAgICBhd2FpdCBtb2RlbENsYXNzLmluaXRpYWxpemVSZWNvcmQoe2NvbmZpZ3VyYXRpb259KVxuXG4gICAgaWYgKGF3YWl0IG1vZGVsQ2xhc3MuaGFzVHJhbnNsYXRpb25zVGFibGUoKSkge1xuICAgICAgYXdhaXQgbW9kZWxDbGFzcy5nZXRUcmFuc2xhdGlvbkNsYXNzKCkuaW5pdGlhbGl6ZVJlY29yZCh7Y29uZmlndXJhdGlvbn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vZGVscyBvcHRpbmcgb3V0IG9mIGVhZ2VyIG1ldGFkYXRhIGxvYWRpbmcgKGBzZXRFYWdlckxvYWRSZWNvcmRNZXRhZGF0YShmYWxzZSlgKVxuICAgKiBhcmUgc3RpbGwgaW5pdGlhbGl6ZWQgYXQgc3RhcnR1cCB3aGVuIHRoZWlyIChvcHRpb25hbCkgdGFibGUgaXMgcHJlc2VudCwgc28gdGhhdFxuICAgKiBzeW5jaHJvbm91cyBxdWVyeSBidWlsZGluZyBzdWNoIGFzIGAud2hlcmUoLi4uKWAgd29ya3Mgd2l0aG91dCBjYWxsZXJzIGhhdmluZyB0b1xuICAgKiBjYWxsIGBlbnN1cmVJbml0aWFsaXplZCgpYCBmaXJzdC4gV2hlbiB0aGUgdGFibGUg4oCUIG9yIGl0cyBjb25uZWN0aW9uIOKAlCBpcyBub3RcbiAgICogYXZhaWxhYmxlIHRoZSBtb2RlbCBpcyBsZWZ0IGRlZmVycmVkIHNvIHN0YXJ0dXAgc3RpbGwgc3VjY2VlZHM7IGl0IGNhbiB0aGVuXG4gICAqIGluaXRpYWxpemUgbGF6aWx5IHRoZSBmaXJzdCB0aW1lIGEgdGVybWluYWwgcXVlcnkgbWV0aG9kIChmaW5kL2NyZWF0ZS9ldGMuKSBydW5zLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9iZXN0RWZmb3J0SW5pdGlhbGl6ZURlZmVycmVkTW9kZWwoe2NvbmZpZ3VyYXRpb24sIG1vZGVsQ2xhc3N9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBtb2RlbENsYXNzLmNvbm5lY3Rpb24oe2VuZm9yY2VUZW5hbnREYXRhYmFzZVNjb3BlOiBmYWxzZX0pXG4gICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0VGFibGVCeU5hbWUobW9kZWxDbGFzcy50YWJsZU5hbWUoKSwge3Rocm93RXJyb3I6IGZhbHNlfSlcblxuICAgICAgaWYgKCF0YWJsZSkgcmV0dXJuXG5cbiAgICAgIGF3YWl0IHRoaXMuX2luaXRpYWxpemVNb2RlbFJlY29yZCh7Y29uZmlndXJhdGlvbiwgbW9kZWxDbGFzc30pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFRoZSBvcHRpb25hbCB0YWJsZSAtIG9yLCBmb3IgYSB0cmFuc2xhdGVkIG1vZGVsLCBpdHMgPHRhYmxlPl90cmFuc2xhdGlvbnNcbiAgICAgIC8vIHRhYmxlIChpbml0aWFsaXplUmVjb3JkIC0+IF9kZWZpbmVUcmFuc2xhdGlvbk1ldGhvZHMgaW5pdGlhbGl6ZXMgdGhlXG4gICAgICAvLyB0cmFuc2xhdGlvbiBjbGFzcykgLSBpcyBtaXNzaW5nLCBvciBpdHMgY29ubmVjdGlvbiBpcyB1bmF2YWlsYWJsZS4gUmUtcmVnaXN0ZXJcbiAgICAgIC8vIHRvIGRyb3AgYW55IHBhcnRpYWwgbWV0YWRhdGEgYW5kIGxlYXZlIHRoZSBtb2RlbCBkZWZlcnJlZCBzbyBzdGFydHVwIHN0aWxsXG4gICAgICAvLyBzdWNjZWVkczsgaXQgaW5pdGlhbGl6ZXMgbGF6aWx5IG9uIGZpcnN0IHRlcm1pbmFsIHVzZS5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBMZWF2aW5nICR7bW9kZWxDbGFzcy5uYW1lfSBkZWZlcnJlZCAtIHRhYmxlIG1ldGFkYXRhIHVuYXZhaWxhYmxlIGF0IHN0YXJ0dXBgLCBlcnJvcilcbiAgICAgIG1vZGVsQ2xhc3MucmVnaXN0ZXJSZWNvcmRDbGFzcyh7Y29uZmlndXJhdGlvbn0pXG4gICAgfVxuICB9XG59XG4iXX0=
|