velocious 1.0.597 → 1.0.598
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/README.md +2 -2
- package/build/background-jobs/main.js +42 -32
- package/build/src/background-jobs/main.d.ts +15 -10
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +42 -34
- package/build/src/testing/factory/node/definition-reload-policy.d.ts +97 -0
- package/build/src/testing/factory/node/definition-reload-policy.d.ts.map +1 -0
- package/build/src/testing/factory/node/definition-reload-policy.js +133 -0
- package/build/src/testing/factory/node/load-definitions.d.ts +4 -1
- package/build/src/testing/factory/node/load-definitions.d.ts.map +1 -1
- package/build/src/testing/factory/node/load-definitions.js +27 -4
- package/build/src/testing/test-runner.js +7 -7
- package/build/testing/factory/node/definition-reload-policy.js +149 -0
- package/build/testing/factory/node/load-definitions.js +29 -5
- package/build/testing/test-runner.js +6 -6
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/src/background-jobs/main.js +42 -32
- package/src/testing/factory/node/definition-reload-policy.js +149 -0
- package/src/testing/factory/node/load-definitions.js +29 -5
- package/src/testing/test-runner.js +6 -6
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default maximum number of cache-busted factory definition import attempts a
|
|
3
|
+
* single Node process may perform. Chosen conservatively from the
|
|
4
|
+
* `factory-esm-reload-retention` benchmark evidence: each cache-busted import
|
|
5
|
+
* retains roughly 6 KB of heap in Node's ESM module map, so the default bounds
|
|
6
|
+
* retained definition modules to a few tens of MB before the owning process
|
|
7
|
+
* must be recycled. This module is intentionally Node-only; browser-safe factory
|
|
8
|
+
* code must never import it.
|
|
9
|
+
*/
|
|
10
|
+
export declare const DEFAULT_DEFINITION_RELOAD_BUDGET = 4096;
|
|
11
|
+
/**
|
|
12
|
+
* Rejected when code tries to configure the process-global reload budget more
|
|
13
|
+
* than once or after any valid cache-busted import reservation was attempted.
|
|
14
|
+
* Retained ESM modules and their accounting live for the process lifetime, so
|
|
15
|
+
* changing the budget can never begin a new in-process policy epoch.
|
|
16
|
+
*/
|
|
17
|
+
export declare class DefinitionReloadConfigurationError extends Error {
|
|
18
|
+
budget: number;
|
|
19
|
+
configured: boolean;
|
|
20
|
+
current: number;
|
|
21
|
+
requestedBudget: number;
|
|
22
|
+
/**
|
|
23
|
+
* Creates the error.
|
|
24
|
+
* @param {object} args - Details.
|
|
25
|
+
* @param {number} args.current - Cache-busted imports already reserved.
|
|
26
|
+
* @param {number} args.budget - Active process-global import budget.
|
|
27
|
+
* @param {number} args.requestedBudget - Rejected replacement budget.
|
|
28
|
+
* @param {boolean} args.configured - Whether an explicit budget was already configured.
|
|
29
|
+
*/
|
|
30
|
+
constructor({ budget, configured, current, requestedBudget }: {
|
|
31
|
+
current: number;
|
|
32
|
+
budget: number;
|
|
33
|
+
requestedBudget: number;
|
|
34
|
+
configured: boolean;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Rejected when a reload would push the process over its cache-busted import
|
|
39
|
+
* budget. The rejection happens synchronously before any registry reset or
|
|
40
|
+
* import, so the currently loaded registry stays usable. Node never evicts
|
|
41
|
+
* retained ESM module instances, so only recycling/restarting the owning Node
|
|
42
|
+
* process reclaims the memory and refreshes edited dependency modules.
|
|
43
|
+
*/
|
|
44
|
+
export declare class DefinitionRecycleRequiredError extends Error {
|
|
45
|
+
current: number;
|
|
46
|
+
budget: number;
|
|
47
|
+
requested: number;
|
|
48
|
+
/**
|
|
49
|
+
* Creates the error.
|
|
50
|
+
* @param {object} args - Details.
|
|
51
|
+
* @param {number} args.current - Cache-busted import attempts already reserved in this process.
|
|
52
|
+
* @param {number} args.budget - Process-global import budget.
|
|
53
|
+
* @param {number} args.requested - Import attempts the rejected reload needed.
|
|
54
|
+
*/
|
|
55
|
+
constructor({ current, budget, requested }: {
|
|
56
|
+
current: number;
|
|
57
|
+
budget: number;
|
|
58
|
+
requested: number;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns the process-global cache-busted import budget.
|
|
63
|
+
* @returns {number} - The budget.
|
|
64
|
+
*/
|
|
65
|
+
export declare function getDefinitionReloadBudget(): number;
|
|
66
|
+
/**
|
|
67
|
+
* Reads the cache-busted import attempts reserved so far in this process,
|
|
68
|
+
* across every registry and target. Combined with {@link getDefinitionReloadBudget}
|
|
69
|
+
* this is the deterministic process-global census for the recycle policy.
|
|
70
|
+
* @returns {number} - Reserved count.
|
|
71
|
+
*/
|
|
72
|
+
export declare function peekDefinitionReloadBudget(): number;
|
|
73
|
+
/**
|
|
74
|
+
* Configures the one process-global import budget exactly once and only before
|
|
75
|
+
* the first valid reservation attempt. There is exactly one budget for the whole
|
|
76
|
+
* process, so no combination of registries or targets can create independent
|
|
77
|
+
* budgets that defeat the global limit. Retained-import accounting is never
|
|
78
|
+
* reset in-process.
|
|
79
|
+
* @param {number} budget - New budget.
|
|
80
|
+
* @returns {void}
|
|
81
|
+
*/
|
|
82
|
+
export declare function setDefinitionReloadBudget(budget: number): void;
|
|
83
|
+
/**
|
|
84
|
+
* Preflights and reserves a whole reload batch synchronously. Malformed counts
|
|
85
|
+
* are rejected before configuration is sealed or accounting changes. Every valid
|
|
86
|
+
* request, including zero and a rejected over-budget request, seals configuration
|
|
87
|
+
* before capacity is evaluated. Throws {@link DefinitionRecycleRequiredError}
|
|
88
|
+
* when the requested batch would push the process over its budget. The check and
|
|
89
|
+
* reservation run in one synchronous step, so concurrent reloads cannot race past
|
|
90
|
+
* the budget. The reservation is deliberately conservative: it covers every
|
|
91
|
+
* import attempt in the batch, so a mid-batch import failure still counts its
|
|
92
|
+
* attempts as retained modules.
|
|
93
|
+
* @param {number} requested - Cache-busted import attempts the reload will perform.
|
|
94
|
+
* @returns {void}
|
|
95
|
+
*/
|
|
96
|
+
export declare function reserveDefinitionReloadBudget(requested: number): void;
|
|
97
|
+
//# sourceMappingURL=definition-reload-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition-reload-policy.d.ts","sourceRoot":"","sources":["../../../../../src/testing/factory/node/definition-reload-policy.js"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,eAAO,MAAM,gCAAgC,OAAO,CAAA;AAEpD;;;;;GAKG;AACH,qBAAa,kCAAmC,SAAQ,KAAK;IAgBpD,MAAM;IACN,UAAU;IACV,OAAO;IACP,eAAe;IAlBtB;;;;;;;OAOG;IACH,YAAY,EAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAC,EALvD;QAAqB,OAAO,EAApB,MAAM,CACd;QAAqB,MAAM,EAAnB,MAAM,CACd;QAAqB,eAAe,EAA5B,MAAM,CACd;QAAsB,UAAU,EAAxB,OAAO,CACjB;KACyD,EAWzD;CACF;AAED;;;;;;GAMG;AACH,qBAAa,8BAA+B,SAAQ,KAAK;IAWhD,OAAO;IACP,MAAM;IACN,SAAS;IAZhB;;;;;;OAMG;IACH,YAAY,EAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAC,EAJrC;QAAqB,OAAO,EAApB,MAAM,CACd;QAAqB,MAAM,EAAnB,MAAM,CACd;QAAqB,SAAS,EAAtB,MAAM,CAChB;KACuC,EAMvC;CACF;AAcD;;;GAGG;AACH,wBAAgB,yBAAyB,IAF5B,MAAM,CAIlB;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAF7B,MAAM,CAIlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAHrC,MAGqC,GAFnC,IAAI,CAkBhB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAH5C,MAG4C,GAF1C,IAAI,CAchB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* Default maximum number of cache-busted factory definition import attempts a
|
|
4
|
+
* single Node process may perform. Chosen conservatively from the
|
|
5
|
+
* `factory-esm-reload-retention` benchmark evidence: each cache-busted import
|
|
6
|
+
* retains roughly 6 KB of heap in Node's ESM module map, so the default bounds
|
|
7
|
+
* retained definition modules to a few tens of MB before the owning process
|
|
8
|
+
* must be recycled. This module is intentionally Node-only; browser-safe factory
|
|
9
|
+
* code must never import it.
|
|
10
|
+
*/
|
|
11
|
+
export const DEFAULT_DEFINITION_RELOAD_BUDGET = 4096;
|
|
12
|
+
/**
|
|
13
|
+
* Rejected when code tries to configure the process-global reload budget more
|
|
14
|
+
* than once or after any valid cache-busted import reservation was attempted.
|
|
15
|
+
* Retained ESM modules and their accounting live for the process lifetime, so
|
|
16
|
+
* changing the budget can never begin a new in-process policy epoch.
|
|
17
|
+
*/
|
|
18
|
+
export class DefinitionReloadConfigurationError extends Error {
|
|
19
|
+
/**
|
|
20
|
+
* Creates the error.
|
|
21
|
+
* @param {object} args - Details.
|
|
22
|
+
* @param {number} args.current - Cache-busted imports already reserved.
|
|
23
|
+
* @param {number} args.budget - Active process-global import budget.
|
|
24
|
+
* @param {number} args.requestedBudget - Rejected replacement budget.
|
|
25
|
+
* @param {boolean} args.configured - Whether an explicit budget was already configured.
|
|
26
|
+
*/
|
|
27
|
+
constructor({ budget, configured, current, requestedBudget }) {
|
|
28
|
+
const reason = configured
|
|
29
|
+
? "the process-global definition reload budget was already configured"
|
|
30
|
+
: "a definition reload reservation was already attempted";
|
|
31
|
+
super(`Cannot configure definition reload budget to ${requestedBudget}: ${reason} (current=${current}, budget=${budget}). Configuration is allowed exactly once before the first reservation; only process exit resets retained-module accounting.`);
|
|
32
|
+
this.name = "DefinitionReloadConfigurationError";
|
|
33
|
+
this.budget = budget;
|
|
34
|
+
this.configured = configured;
|
|
35
|
+
this.current = current;
|
|
36
|
+
this.requestedBudget = requestedBudget;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Rejected when a reload would push the process over its cache-busted import
|
|
41
|
+
* budget. The rejection happens synchronously before any registry reset or
|
|
42
|
+
* import, so the currently loaded registry stays usable. Node never evicts
|
|
43
|
+
* retained ESM module instances, so only recycling/restarting the owning Node
|
|
44
|
+
* process reclaims the memory and refreshes edited dependency modules.
|
|
45
|
+
*/
|
|
46
|
+
export class DefinitionRecycleRequiredError extends Error {
|
|
47
|
+
/**
|
|
48
|
+
* Creates the error.
|
|
49
|
+
* @param {object} args - Details.
|
|
50
|
+
* @param {number} args.current - Cache-busted import attempts already reserved in this process.
|
|
51
|
+
* @param {number} args.budget - Process-global import budget.
|
|
52
|
+
* @param {number} args.requested - Import attempts the rejected reload needed.
|
|
53
|
+
*/
|
|
54
|
+
constructor({ current, budget, requested }) {
|
|
55
|
+
super(`Factory definition reload import budget exhausted (current=${current}, budget=${budget}, requested=${requested}). Recycle or restart the owning Node process: every reload imports a fresh cache-busted module instance and Node never evicts them, so process recycling is the only reclamation boundary.`);
|
|
56
|
+
this.name = "DefinitionRecycleRequiredError";
|
|
57
|
+
this.current = current;
|
|
58
|
+
this.budget = budget;
|
|
59
|
+
this.requested = requested;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** @type {number} - The single process-global import budget. */
|
|
63
|
+
let importBudget = DEFAULT_DEFINITION_RELOAD_BUDGET;
|
|
64
|
+
/** @type {number} - Cache-busted import attempts reserved so far across every registry and target. */
|
|
65
|
+
let reservedImports = 0;
|
|
66
|
+
/** @type {boolean} - Whether the process-global budget was explicitly configured. */
|
|
67
|
+
let budgetConfigured = false;
|
|
68
|
+
/** @type {boolean} - Whether any valid complete reload batch reservation was attempted. */
|
|
69
|
+
let reservationStarted = false;
|
|
70
|
+
/**
|
|
71
|
+
* Returns the process-global cache-busted import budget.
|
|
72
|
+
* @returns {number} - The budget.
|
|
73
|
+
*/
|
|
74
|
+
export function getDefinitionReloadBudget() {
|
|
75
|
+
return importBudget;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Reads the cache-busted import attempts reserved so far in this process,
|
|
79
|
+
* across every registry and target. Combined with {@link getDefinitionReloadBudget}
|
|
80
|
+
* this is the deterministic process-global census for the recycle policy.
|
|
81
|
+
* @returns {number} - Reserved count.
|
|
82
|
+
*/
|
|
83
|
+
export function peekDefinitionReloadBudget() {
|
|
84
|
+
return reservedImports;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Configures the one process-global import budget exactly once and only before
|
|
88
|
+
* the first valid reservation attempt. There is exactly one budget for the whole
|
|
89
|
+
* process, so no combination of registries or targets can create independent
|
|
90
|
+
* budgets that defeat the global limit. Retained-import accounting is never
|
|
91
|
+
* reset in-process.
|
|
92
|
+
* @param {number} budget - New budget.
|
|
93
|
+
* @returns {void}
|
|
94
|
+
*/
|
|
95
|
+
export function setDefinitionReloadBudget(budget) {
|
|
96
|
+
if (!Number.isInteger(budget) || budget < 1) {
|
|
97
|
+
throw new TypeError(`Definition reload budget must be a positive integer, got ${JSON.stringify(budget)}`);
|
|
98
|
+
}
|
|
99
|
+
if (budgetConfigured || reservationStarted) {
|
|
100
|
+
throw new DefinitionReloadConfigurationError({
|
|
101
|
+
budget: importBudget,
|
|
102
|
+
configured: budgetConfigured,
|
|
103
|
+
current: reservedImports,
|
|
104
|
+
requestedBudget: budget
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
importBudget = budget;
|
|
108
|
+
budgetConfigured = true;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Preflights and reserves a whole reload batch synchronously. Malformed counts
|
|
112
|
+
* are rejected before configuration is sealed or accounting changes. Every valid
|
|
113
|
+
* request, including zero and a rejected over-budget request, seals configuration
|
|
114
|
+
* before capacity is evaluated. Throws {@link DefinitionRecycleRequiredError}
|
|
115
|
+
* when the requested batch would push the process over its budget. The check and
|
|
116
|
+
* reservation run in one synchronous step, so concurrent reloads cannot race past
|
|
117
|
+
* the budget. The reservation is deliberately conservative: it covers every
|
|
118
|
+
* import attempt in the batch, so a mid-batch import failure still counts its
|
|
119
|
+
* attempts as retained modules.
|
|
120
|
+
* @param {number} requested - Cache-busted import attempts the reload will perform.
|
|
121
|
+
* @returns {void}
|
|
122
|
+
*/
|
|
123
|
+
export function reserveDefinitionReloadBudget(requested) {
|
|
124
|
+
if (!Number.isInteger(requested) || requested < 0) {
|
|
125
|
+
throw new TypeError(`Definition reload reservation must be a non-negative integer, got ${typeof requested} ${String(requested)}`);
|
|
126
|
+
}
|
|
127
|
+
reservationStarted = true;
|
|
128
|
+
if (reservedImports + requested > importBudget) {
|
|
129
|
+
throw new DefinitionRecycleRequiredError({ current: reservedImports, budget: importBudget, requested });
|
|
130
|
+
}
|
|
131
|
+
reservedImports += requested;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi1yZWxvYWQtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Rlc3RpbmcvZmFjdG9yeS9ub2RlL2RlZmluaXRpb24tcmVsb2FkLXBvbGljeS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLENBQUE7QUFFcEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sa0NBQW1DLFNBQVEsS0FBSztJQUMzRDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBQztRQUN4RCxNQUFNLE1BQU0sR0FBRyxVQUFVO1lBQ3ZCLENBQUMsQ0FBQyxvRUFBb0U7WUFDdEUsQ0FBQyxDQUFDLHVEQUF1RCxDQUFBO1FBRTNELEtBQUssQ0FBQyxnREFBZ0QsZUFBZSxLQUFLLE1BQU0sYUFBYSxPQUFPLFlBQVksTUFBTSw2SEFBNkgsQ0FBQyxDQUFBO1FBQ3BQLElBQUksQ0FBQyxJQUFJLEdBQUcsb0NBQW9DLENBQUE7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUE7SUFDeEMsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLDhCQUErQixTQUFRLEtBQUs7SUFDdkQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDO1FBQ3RDLEtBQUssQ0FBQyw4REFBOEQsT0FBTyxZQUFZLE1BQU0sZUFBZSxTQUFTLDZMQUE2TCxDQUFDLENBQUE7UUFDblQsSUFBSSxDQUFDLElBQUksR0FBRyxnQ0FBZ0MsQ0FBQTtRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtJQUM1QixDQUFDO0NBQ0Y7QUFFRCxnRUFBZ0U7QUFDaEUsSUFBSSxZQUFZLEdBQUcsZ0NBQWdDLENBQUE7QUFFbkQsc0dBQXNHO0FBQ3RHLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQTtBQUV2QixxRkFBcUY7QUFDckYsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7QUFFNUIsMkZBQTJGO0FBQzNGLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFBO0FBRTlCOzs7R0FHRztBQUNILE1BQU0sVUFBVSx5QkFBeUI7SUFDdkMsT0FBTyxZQUFZLENBQUE7QUFDckIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQjtJQUN4QyxPQUFPLGVBQWUsQ0FBQTtBQUN4QixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsTUFBTTtJQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyw0REFBNEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDM0csQ0FBQztJQUVELElBQUksZ0JBQWdCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksa0NBQWtDLENBQUM7WUFDM0MsTUFBTSxFQUFFLFlBQVk7WUFDcEIsVUFBVSxFQUFFLGdCQUFnQjtZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixlQUFlLEVBQUUsTUFBTTtTQUN4QixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsWUFBWSxHQUFHLE1BQU0sQ0FBQTtJQUNyQixnQkFBZ0IsR0FBRyxJQUFJLENBQUE7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxTQUFTO0lBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUksU0FBUyxDQUFDLHFFQUFxRSxPQUFPLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ25JLENBQUM7SUFFRCxrQkFBa0IsR0FBRyxJQUFJLENBQUE7SUFFekIsSUFBSSxlQUFlLEdBQUcsU0FBUyxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSw4QkFBOEIsQ0FBQyxFQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZHLENBQUM7SUFFRCxlQUFlLElBQUksU0FBUyxDQUFBO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGNhY2hlLWJ1c3RlZCBmYWN0b3J5IGRlZmluaXRpb24gaW1wb3J0IGF0dGVtcHRzIGFcbiAqIHNpbmdsZSBOb2RlIHByb2Nlc3MgbWF5IHBlcmZvcm0uIENob3NlbiBjb25zZXJ2YXRpdmVseSBmcm9tIHRoZVxuICogYGZhY3RvcnktZXNtLXJlbG9hZC1yZXRlbnRpb25gIGJlbmNobWFyayBldmlkZW5jZTogZWFjaCBjYWNoZS1idXN0ZWQgaW1wb3J0XG4gKiByZXRhaW5zIHJvdWdobHkgNiBLQiBvZiBoZWFwIGluIE5vZGUncyBFU00gbW9kdWxlIG1hcCwgc28gdGhlIGRlZmF1bHQgYm91bmRzXG4gKiByZXRhaW5lZCBkZWZpbml0aW9uIG1vZHVsZXMgdG8gYSBmZXcgdGVucyBvZiBNQiBiZWZvcmUgdGhlIG93bmluZyBwcm9jZXNzXG4gKiBtdXN0IGJlIHJlY3ljbGVkLiBUaGlzIG1vZHVsZSBpcyBpbnRlbnRpb25hbGx5IE5vZGUtb25seTsgYnJvd3Nlci1zYWZlIGZhY3RvcnlcbiAqIGNvZGUgbXVzdCBuZXZlciBpbXBvcnQgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RFRklOSVRJT05fUkVMT0FEX0JVREdFVCA9IDQwOTZcblxuLyoqXG4gKiBSZWplY3RlZCB3aGVuIGNvZGUgdHJpZXMgdG8gY29uZmlndXJlIHRoZSBwcm9jZXNzLWdsb2JhbCByZWxvYWQgYnVkZ2V0IG1vcmVcbiAqIHRoYW4gb25jZSBvciBhZnRlciBhbnkgdmFsaWQgY2FjaGUtYnVzdGVkIGltcG9ydCByZXNlcnZhdGlvbiB3YXMgYXR0ZW1wdGVkLlxuICogUmV0YWluZWQgRVNNIG1vZHVsZXMgYW5kIHRoZWlyIGFjY291bnRpbmcgbGl2ZSBmb3IgdGhlIHByb2Nlc3MgbGlmZXRpbWUsIHNvXG4gKiBjaGFuZ2luZyB0aGUgYnVkZ2V0IGNhbiBuZXZlciBiZWdpbiBhIG5ldyBpbi1wcm9jZXNzIHBvbGljeSBlcG9jaC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlZmluaXRpb25SZWxvYWRDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlcnJvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBEZXRhaWxzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5jdXJyZW50IC0gQ2FjaGUtYnVzdGVkIGltcG9ydHMgYWxyZWFkeSByZXNlcnZlZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYnVkZ2V0IC0gQWN0aXZlIHByb2Nlc3MtZ2xvYmFsIGltcG9ydCBidWRnZXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLnJlcXVlc3RlZEJ1ZGdldCAtIFJlamVjdGVkIHJlcGxhY2VtZW50IGJ1ZGdldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhcmdzLmNvbmZpZ3VyZWQgLSBXaGV0aGVyIGFuIGV4cGxpY2l0IGJ1ZGdldCB3YXMgYWxyZWFkeSBjb25maWd1cmVkLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2J1ZGdldCwgY29uZmlndXJlZCwgY3VycmVudCwgcmVxdWVzdGVkQnVkZ2V0fSkge1xuICAgIGNvbnN0IHJlYXNvbiA9IGNvbmZpZ3VyZWRcbiAgICAgID8gXCJ0aGUgcHJvY2Vzcy1nbG9iYWwgZGVmaW5pdGlvbiByZWxvYWQgYnVkZ2V0IHdhcyBhbHJlYWR5IGNvbmZpZ3VyZWRcIlxuICAgICAgOiBcImEgZGVmaW5pdGlvbiByZWxvYWQgcmVzZXJ2YXRpb24gd2FzIGFscmVhZHkgYXR0ZW1wdGVkXCJcblxuICAgIHN1cGVyKGBDYW5ub3QgY29uZmlndXJlIGRlZmluaXRpb24gcmVsb2FkIGJ1ZGdldCB0byAke3JlcXVlc3RlZEJ1ZGdldH06ICR7cmVhc29ufSAoY3VycmVudD0ke2N1cnJlbnR9LCBidWRnZXQ9JHtidWRnZXR9KS4gQ29uZmlndXJhdGlvbiBpcyBhbGxvd2VkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpcnN0IHJlc2VydmF0aW9uOyBvbmx5IHByb2Nlc3MgZXhpdCByZXNldHMgcmV0YWluZWQtbW9kdWxlIGFjY291bnRpbmcuYClcbiAgICB0aGlzLm5hbWUgPSBcIkRlZmluaXRpb25SZWxvYWRDb25maWd1cmF0aW9uRXJyb3JcIlxuICAgIHRoaXMuYnVkZ2V0ID0gYnVkZ2V0XG4gICAgdGhpcy5jb25maWd1cmVkID0gY29uZmlndXJlZFxuICAgIHRoaXMuY3VycmVudCA9IGN1cnJlbnRcbiAgICB0aGlzLnJlcXVlc3RlZEJ1ZGdldCA9IHJlcXVlc3RlZEJ1ZGdldFxuICB9XG59XG5cbi8qKlxuICogUmVqZWN0ZWQgd2hlbiBhIHJlbG9hZCB3b3VsZCBwdXNoIHRoZSBwcm9jZXNzIG92ZXIgaXRzIGNhY2hlLWJ1c3RlZCBpbXBvcnRcbiAqIGJ1ZGdldC4gVGhlIHJlamVjdGlvbiBoYXBwZW5zIHN5bmNocm9ub3VzbHkgYmVmb3JlIGFueSByZWdpc3RyeSByZXNldCBvclxuICogaW1wb3J0LCBzbyB0aGUgY3VycmVudGx5IGxvYWRlZCByZWdpc3RyeSBzdGF5cyB1c2FibGUuIE5vZGUgbmV2ZXIgZXZpY3RzXG4gKiByZXRhaW5lZCBFU00gbW9kdWxlIGluc3RhbmNlcywgc28gb25seSByZWN5Y2xpbmcvcmVzdGFydGluZyB0aGUgb3duaW5nIE5vZGVcbiAqIHByb2Nlc3MgcmVjbGFpbXMgdGhlIG1lbW9yeSBhbmQgcmVmcmVzaGVzIGVkaXRlZCBkZXBlbmRlbmN5IG1vZHVsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZpbml0aW9uUmVjeWNsZVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlcnJvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBEZXRhaWxzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5jdXJyZW50IC0gQ2FjaGUtYnVzdGVkIGltcG9ydCBhdHRlbXB0cyBhbHJlYWR5IHJlc2VydmVkIGluIHRoaXMgcHJvY2Vzcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYnVkZ2V0IC0gUHJvY2Vzcy1nbG9iYWwgaW1wb3J0IGJ1ZGdldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MucmVxdWVzdGVkIC0gSW1wb3J0IGF0dGVtcHRzIHRoZSByZWplY3RlZCByZWxvYWQgbmVlZGVkLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2N1cnJlbnQsIGJ1ZGdldCwgcmVxdWVzdGVkfSkge1xuICAgIHN1cGVyKGBGYWN0b3J5IGRlZmluaXRpb24gcmVsb2FkIGltcG9ydCBidWRnZXQgZXhoYXVzdGVkIChjdXJyZW50PSR7Y3VycmVudH0sIGJ1ZGdldD0ke2J1ZGdldH0sIHJlcXVlc3RlZD0ke3JlcXVlc3RlZH0pLiBSZWN5Y2xlIG9yIHJlc3RhcnQgdGhlIG93bmluZyBOb2RlIHByb2Nlc3M6IGV2ZXJ5IHJlbG9hZCBpbXBvcnRzIGEgZnJlc2ggY2FjaGUtYnVzdGVkIG1vZHVsZSBpbnN0YW5jZSBhbmQgTm9kZSBuZXZlciBldmljdHMgdGhlbSwgc28gcHJvY2VzcyByZWN5Y2xpbmcgaXMgdGhlIG9ubHkgcmVjbGFtYXRpb24gYm91bmRhcnkuYClcbiAgICB0aGlzLm5hbWUgPSBcIkRlZmluaXRpb25SZWN5Y2xlUmVxdWlyZWRFcnJvclwiXG4gICAgdGhpcy5jdXJyZW50ID0gY3VycmVudFxuICAgIHRoaXMuYnVkZ2V0ID0gYnVkZ2V0XG4gICAgdGhpcy5yZXF1ZXN0ZWQgPSByZXF1ZXN0ZWRcbiAgfVxufVxuXG4vKiogQHR5cGUge251bWJlcn0gLSBUaGUgc2luZ2xlIHByb2Nlc3MtZ2xvYmFsIGltcG9ydCBidWRnZXQuICovXG5sZXQgaW1wb3J0QnVkZ2V0ID0gREVGQVVMVF9ERUZJTklUSU9OX1JFTE9BRF9CVURHRVRcblxuLyoqIEB0eXBlIHtudW1iZXJ9IC0gQ2FjaGUtYnVzdGVkIGltcG9ydCBhdHRlbXB0cyByZXNlcnZlZCBzbyBmYXIgYWNyb3NzIGV2ZXJ5IHJlZ2lzdHJ5IGFuZCB0YXJnZXQuICovXG5sZXQgcmVzZXJ2ZWRJbXBvcnRzID0gMFxuXG4vKiogQHR5cGUge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgcHJvY2Vzcy1nbG9iYWwgYnVkZ2V0IHdhcyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQuICovXG5sZXQgYnVkZ2V0Q29uZmlndXJlZCA9IGZhbHNlXG5cbi8qKiBAdHlwZSB7Ym9vbGVhbn0gLSBXaGV0aGVyIGFueSB2YWxpZCBjb21wbGV0ZSByZWxvYWQgYmF0Y2ggcmVzZXJ2YXRpb24gd2FzIGF0dGVtcHRlZC4gKi9cbmxldCByZXNlcnZhdGlvblN0YXJ0ZWQgPSBmYWxzZVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHByb2Nlc3MtZ2xvYmFsIGNhY2hlLWJ1c3RlZCBpbXBvcnQgYnVkZ2V0LlxuICogQHJldHVybnMge251bWJlcn0gLSBUaGUgYnVkZ2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5pdGlvblJlbG9hZEJ1ZGdldCgpIHtcbiAgcmV0dXJuIGltcG9ydEJ1ZGdldFxufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjYWNoZS1idXN0ZWQgaW1wb3J0IGF0dGVtcHRzIHJlc2VydmVkIHNvIGZhciBpbiB0aGlzIHByb2Nlc3MsXG4gKiBhY3Jvc3MgZXZlcnkgcmVnaXN0cnkgYW5kIHRhcmdldC4gQ29tYmluZWQgd2l0aCB7QGxpbmsgZ2V0RGVmaW5pdGlvblJlbG9hZEJ1ZGdldH1cbiAqIHRoaXMgaXMgdGhlIGRldGVybWluaXN0aWMgcHJvY2Vzcy1nbG9iYWwgY2Vuc3VzIGZvciB0aGUgcmVjeWNsZSBwb2xpY3kuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFJlc2VydmVkIGNvdW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGVla0RlZmluaXRpb25SZWxvYWRCdWRnZXQoKSB7XG4gIHJldHVybiByZXNlcnZlZEltcG9ydHNcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBvbmUgcHJvY2Vzcy1nbG9iYWwgaW1wb3J0IGJ1ZGdldCBleGFjdGx5IG9uY2UgYW5kIG9ubHkgYmVmb3JlXG4gKiB0aGUgZmlyc3QgdmFsaWQgcmVzZXJ2YXRpb24gYXR0ZW1wdC4gVGhlcmUgaXMgZXhhY3RseSBvbmUgYnVkZ2V0IGZvciB0aGUgd2hvbGVcbiAqIHByb2Nlc3MsIHNvIG5vIGNvbWJpbmF0aW9uIG9mIHJlZ2lzdHJpZXMgb3IgdGFyZ2V0cyBjYW4gY3JlYXRlIGluZGVwZW5kZW50XG4gKiBidWRnZXRzIHRoYXQgZGVmZWF0IHRoZSBnbG9iYWwgbGltaXQuIFJldGFpbmVkLWltcG9ydCBhY2NvdW50aW5nIGlzIG5ldmVyXG4gKiByZXNldCBpbi1wcm9jZXNzLlxuICogQHBhcmFtIHtudW1iZXJ9IGJ1ZGdldCAtIE5ldyBidWRnZXQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmluaXRpb25SZWxvYWRCdWRnZXQoYnVkZ2V0KSB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihidWRnZXQpIHx8IGJ1ZGdldCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBEZWZpbml0aW9uIHJlbG9hZCBidWRnZXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGdvdCAke0pTT04uc3RyaW5naWZ5KGJ1ZGdldCl9YClcbiAgfVxuXG4gIGlmIChidWRnZXRDb25maWd1cmVkIHx8IHJlc2VydmF0aW9uU3RhcnRlZCkge1xuICAgIHRocm93IG5ldyBEZWZpbml0aW9uUmVsb2FkQ29uZmlndXJhdGlvbkVycm9yKHtcbiAgICAgIGJ1ZGdldDogaW1wb3J0QnVkZ2V0LFxuICAgICAgY29uZmlndXJlZDogYnVkZ2V0Q29uZmlndXJlZCxcbiAgICAgIGN1cnJlbnQ6IHJlc2VydmVkSW1wb3J0cyxcbiAgICAgIHJlcXVlc3RlZEJ1ZGdldDogYnVkZ2V0XG4gICAgfSlcbiAgfVxuXG4gIGltcG9ydEJ1ZGdldCA9IGJ1ZGdldFxuICBidWRnZXRDb25maWd1cmVkID0gdHJ1ZVxufVxuXG4vKipcbiAqIFByZWZsaWdodHMgYW5kIHJlc2VydmVzIGEgd2hvbGUgcmVsb2FkIGJhdGNoIHN5bmNocm9ub3VzbHkuIE1hbGZvcm1lZCBjb3VudHNcbiAqIGFyZSByZWplY3RlZCBiZWZvcmUgY29uZmlndXJhdGlvbiBpcyBzZWFsZWQgb3IgYWNjb3VudGluZyBjaGFuZ2VzLiBFdmVyeSB2YWxpZFxuICogcmVxdWVzdCwgaW5jbHVkaW5nIHplcm8gYW5kIGEgcmVqZWN0ZWQgb3Zlci1idWRnZXQgcmVxdWVzdCwgc2VhbHMgY29uZmlndXJhdGlvblxuICogYmVmb3JlIGNhcGFjaXR5IGlzIGV2YWx1YXRlZC4gVGhyb3dzIHtAbGluayBEZWZpbml0aW9uUmVjeWNsZVJlcXVpcmVkRXJyb3J9XG4gKiB3aGVuIHRoZSByZXF1ZXN0ZWQgYmF0Y2ggd291bGQgcHVzaCB0aGUgcHJvY2VzcyBvdmVyIGl0cyBidWRnZXQuIFRoZSBjaGVjayBhbmRcbiAqIHJlc2VydmF0aW9uIHJ1biBpbiBvbmUgc3luY2hyb25vdXMgc3RlcCwgc28gY29uY3VycmVudCByZWxvYWRzIGNhbm5vdCByYWNlIHBhc3RcbiAqIHRoZSBidWRnZXQuIFRoZSByZXNlcnZhdGlvbiBpcyBkZWxpYmVyYXRlbHkgY29uc2VydmF0aXZlOiBpdCBjb3ZlcnMgZXZlcnlcbiAqIGltcG9ydCBhdHRlbXB0IGluIHRoZSBiYXRjaCwgc28gYSBtaWQtYmF0Y2ggaW1wb3J0IGZhaWx1cmUgc3RpbGwgY291bnRzIGl0c1xuICogYXR0ZW1wdHMgYXMgcmV0YWluZWQgbW9kdWxlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSByZXF1ZXN0ZWQgLSBDYWNoZS1idXN0ZWQgaW1wb3J0IGF0dGVtcHRzIHRoZSByZWxvYWQgd2lsbCBwZXJmb3JtLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNlcnZlRGVmaW5pdGlvblJlbG9hZEJ1ZGdldChyZXF1ZXN0ZWQpIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHJlcXVlc3RlZCkgfHwgcmVxdWVzdGVkIDwgMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYERlZmluaXRpb24gcmVsb2FkIHJlc2VydmF0aW9uIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290ICR7dHlwZW9mIHJlcXVlc3RlZH0gJHtTdHJpbmcocmVxdWVzdGVkKX1gKVxuICB9XG5cbiAgcmVzZXJ2YXRpb25TdGFydGVkID0gdHJ1ZVxuXG4gIGlmIChyZXNlcnZlZEltcG9ydHMgKyByZXF1ZXN0ZWQgPiBpbXBvcnRCdWRnZXQpIHtcbiAgICB0aHJvdyBuZXcgRGVmaW5pdGlvblJlY3ljbGVSZXF1aXJlZEVycm9yKHtjdXJyZW50OiByZXNlcnZlZEltcG9ydHMsIGJ1ZGdldDogaW1wb3J0QnVkZ2V0LCByZXF1ZXN0ZWR9KVxuICB9XG5cbiAgcmVzZXJ2ZWRJbXBvcnRzICs9IHJlcXVlc3RlZFxufVxuIl19
|
|
@@ -15,7 +15,10 @@ export declare function loadDefinitions(registry: import("../factory-registry.js
|
|
|
15
15
|
/**
|
|
16
16
|
* Fully reloads definitions: resets the registry (dropping every factory, trait,
|
|
17
17
|
* sequence, callback and default) and re-imports the target files with cache
|
|
18
|
-
* busting so edited definitions take effect.
|
|
18
|
+
* busting so edited definitions take effect. The resolved batch is preflighted
|
|
19
|
+
* against the process-global import budget before the reset, and a
|
|
20
|
+
* `DefinitionRecycleRequiredError` is raised before any mutation when the batch
|
|
21
|
+
* would exceed the budget.
|
|
19
22
|
* @param {import("../factory-registry.js").default} registry - Registry to reload.
|
|
20
23
|
* @param {string | string[]} target - File path, directory, or list of paths.
|
|
21
24
|
* @returns {Promise<string[]>} - The reloaded file paths, in load order.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-definitions.d.ts","sourceRoot":"","sources":["../../../../../src/testing/factory/node/load-definitions.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"load-definitions.d.ts","sourceRoot":"","sources":["../../../../../src/testing/factory/node/load-definitions.js"],"names":[],"mappings":"AAyDA;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EALnC,OAAO,wBAAwB,EAAE,OAKE,EAAE,MAAM,EAJ3C,MAAM,GAAG,MAAM,EAI4B,EAAE,EAAC,MAAc,EAAC,AAHrE,CACA,EADQ;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAGiD,GAFhE,OAAO,CAAC,MAAM,EAAE,CAAC,CAM7B;AAuCD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAJrC,OAAO,wBAAwB,EAAE,OAII,EAAE,MAAM,EAH7C,MAAM,GAAG,MAAM,EAG8B,GAF3C,OAAO,CAAC,MAAM,EAAE,CAAC,CAM7B"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { pathToFileURL } from "node:url";
|
|
3
3
|
import { readdir, stat } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
+
import { reserveDefinitionReloadBudget } from "./definition-reload-policy.js";
|
|
5
6
|
/**
|
|
6
7
|
* Monotonic cache-busting counter shared by reloads. Kept module-local so a reload
|
|
7
8
|
* imports a fresh module instance rather than the cached one.
|
|
@@ -58,6 +59,25 @@ async function resolveFiles(target) {
|
|
|
58
59
|
*/
|
|
59
60
|
export async function loadDefinitions(registry, target, { reload = false } = {}) {
|
|
60
61
|
const files = await resolveFiles(target);
|
|
62
|
+
return await loadResolvedDefinitionFiles({ files, registry, reload });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Loads definition files that have already been resolved into a deterministic
|
|
66
|
+
* sorted list. When `reload` is set, the whole batch is preflighted and reserved
|
|
67
|
+
* against the process-global import budget before any registry reset or import
|
|
68
|
+
* attempt, so a rejected reload never mutates the registry.
|
|
69
|
+
* @param {object} args - Options object.
|
|
70
|
+
* @param {string[]} args.files - Resolved, sorted definition file paths.
|
|
71
|
+
* @param {import("../factory-registry.js").default} args.registry - Registry to define into.
|
|
72
|
+
* @param {boolean} args.reload - Whether to cache-bust the imports.
|
|
73
|
+
* @param {boolean} [args.reset] - Whether to reset the registry first.
|
|
74
|
+
* @returns {Promise<string[]>} - The loaded file paths, in load order.
|
|
75
|
+
*/
|
|
76
|
+
async function loadResolvedDefinitionFiles({ files, registry, reload, reset = false }) {
|
|
77
|
+
if (reload)
|
|
78
|
+
reserveDefinitionReloadBudget(files.length);
|
|
79
|
+
if (reset)
|
|
80
|
+
registry.reset();
|
|
61
81
|
for (const file of files) {
|
|
62
82
|
let href = pathToFileURL(file).href;
|
|
63
83
|
if (reload) {
|
|
@@ -75,13 +95,16 @@ export async function loadDefinitions(registry, target, { reload = false } = {})
|
|
|
75
95
|
/**
|
|
76
96
|
* Fully reloads definitions: resets the registry (dropping every factory, trait,
|
|
77
97
|
* sequence, callback and default) and re-imports the target files with cache
|
|
78
|
-
* busting so edited definitions take effect.
|
|
98
|
+
* busting so edited definitions take effect. The resolved batch is preflighted
|
|
99
|
+
* against the process-global import budget before the reset, and a
|
|
100
|
+
* `DefinitionRecycleRequiredError` is raised before any mutation when the batch
|
|
101
|
+
* would exceed the budget.
|
|
79
102
|
* @param {import("../factory-registry.js").default} registry - Registry to reload.
|
|
80
103
|
* @param {string | string[]} target - File path, directory, or list of paths.
|
|
81
104
|
* @returns {Promise<string[]>} - The reloaded file paths, in load order.
|
|
82
105
|
*/
|
|
83
106
|
export async function reloadDefinitions(registry, target) {
|
|
84
|
-
|
|
85
|
-
return await
|
|
107
|
+
const files = await resolveFiles(target);
|
|
108
|
+
return await loadResolvedDefinitionFiles({ files, registry, reload: true, reset: true });
|
|
86
109
|
}
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1kZWZpbml0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy90ZXN0aW5nL2ZhY3Rvcnkvbm9kZS9sb2FkLWRlZmluaXRpb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sVUFBVSxDQUFBO0FBQ3RDLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDOUMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBRTVCOzs7O0dBSUc7QUFDSCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFckI7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQUMsU0FBUztJQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUMvRCx1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO0lBRWhCLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVqRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDdEQsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsWUFBWSxDQUFDLE1BQU07SUFDaEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUN4RSxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNyQyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUVsQyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUU7UUFBRSxPQUFPLE1BQU0scUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFckUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ25CLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUMsR0FBRyxFQUFFO0lBQzNFLE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRXhDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUVuQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsYUFBYSxJQUFJLENBQUMsQ0FBQTtZQUNsQixJQUFJLElBQUksa0JBQWtCLGFBQWEsRUFBRSxDQUFBO1FBQzNDLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVqQyxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixJQUFJLG9EQUFvRCxDQUFDLENBQUE7UUFDdEcsQ0FBQztRQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDMUIsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxNQUFNO0lBQ3RELFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUVoQixPQUFPLE1BQU0sZUFBZSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtBQUNoRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7cGF0aFRvRmlsZVVSTH0gZnJvbSBcIm5vZGU6dXJsXCJcbmltcG9ydCB7cmVhZGRpciwgc3RhdH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5cbi8qKlxuICogTW9ub3RvbmljIGNhY2hlLWJ1c3RpbmcgY291bnRlciBzaGFyZWQgYnkgcmVsb2Fkcy4gS2VwdCBtb2R1bGUtbG9jYWwgc28gYSByZWxvYWRcbiAqIGltcG9ydHMgYSBmcmVzaCBtb2R1bGUgaW5zdGFuY2UgcmF0aGVyIHRoYW4gdGhlIGNhY2hlZCBvbmUuXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5sZXQgcmVsb2FkQ291bnRlciA9IDBcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb2xsZWN0cyBgLmpzYCBmaWxlcyB1bmRlciBhIGRpcmVjdG9yeSBpbiBhIGRldGVybWluaXN0aWNcbiAqIChsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQpIG9yZGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdG9yeSAtIERpcmVjdG9yeSB0byBzY2FuLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFNvcnRlZCBhYnNvbHV0ZSBmaWxlIHBhdGhzLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0RGlyZWN0b3J5RmlsZXMoZGlyZWN0b3J5KSB7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSwge3dpdGhGaWxlVHlwZXM6IHRydWV9KVxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBmaWxlcyA9IFtdXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBbLi4uZW50cmllc10uc29ydCgobGVmdCwgcmlnaHQpID0+IChsZWZ0Lm5hbWUgPCByaWdodC5uYW1lID8gLTEgOiAxKSkpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpXG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgZmlsZXMucHVzaCguLi5hd2FpdCBjb2xsZWN0RGlyZWN0b3J5RmlsZXMoZnVsbFBhdGgpKVxuICAgIH0gZWxzZSBpZiAoZW50cnkubmFtZS5lbmRzV2l0aChcIi5qc1wiKSkge1xuICAgICAgZmlsZXMucHVzaChmdWxsUGF0aClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlsZXNcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGxvYWQgdGFyZ2V0IChhIHNpbmdsZSBmaWxlLCBhIGRpcmVjdG9yeSwgb3IgYW4gZXhwbGljaXQgbGlzdCkgaW50byBhXG4gKiBkZXRlcm1pbmlzdGljLCBkZS1kdXBsaWNhdGVkIGxpc3Qgb2YgYWJzb2x1dGUgZGVmaW5pdGlvbiBmaWxlIHBhdGhzLlxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gdGFyZ2V0IC0gRmlsZSBwYXRoLCBkaXJlY3RvcnksIG9yIGxpc3Qgb2YgcGF0aHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gU29ydGVkLCBkZS1kdXBsaWNhdGVkIGFic29sdXRlIGZpbGUgcGF0aHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVGaWxlcyh0YXJnZXQpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh0YXJnZXQubWFwKChlbnRyeSkgPT4gcGF0aC5yZXNvbHZlKGVudHJ5KSkpXS5zb3J0KClcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKHRhcmdldClcbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0KHJlc29sdmVkKVxuXG4gIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gYXdhaXQgY29sbGVjdERpcmVjdG9yeUZpbGVzKHJlc29sdmVkKVxuXG4gIHJldHVybiBbcmVzb2x2ZWRdXG59XG5cbi8qKlxuICogTG9hZHMgVmVsb2Npb3VzIGZhY3RvcnkgZGVmaW5pdGlvbiBmaWxlcyAoTm9kZSBvbmx5KS4gRWFjaCBmaWxlIG11c3RcbiAqIGRlZmF1bHQtZXhwb3J0IGEgYChyZWdpc3RyeSkgPT4gdm9pZGAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGludG8gdGhlIHJlZ2lzdHJ5LlxuICogRmlsZXMgbG9hZCBpbiBkZXRlcm1pbmlzdGljIHBhdGggb3JkZXIuIFRoaXMgbW9kdWxlIGlzIGludGVudGlvbmFsbHkgTm9kZS1vbmx5XG4gKiAoZmlsZXN5c3RlbSArIGR5bmFtaWMgaW1wb3J0KSBhbmQgbXVzdCBuZXZlciBiZSBpbXBvcnRlZCBmcm9tIGJyb3dzZXIvTWV0cm9cbiAqIGJ1bmRsZXM7IGltcG9ydCB0aGUgYnJvd3Nlci1zYWZlIGNvcmUgZnJvbSBgLi4vaW5kZXguanNgIHRoZXJlIGluc3RlYWQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gcmVnaXN0cnkgLSBSZWdpc3RyeSB0byBkZWZpbmUgaW50by5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW119IHRhcmdldCAtIEZpbGUgcGF0aCwgZGlyZWN0b3J5LCBvciBsaXN0IG9mIHBhdGhzLlxuICogQHBhcmFtIHt7cmVsb2FkPzogYm9vbGVhbn19IFtvcHRpb25zXSAtIE9wdGlvbnMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gVGhlIGxvYWRlZCBmaWxlIHBhdGhzLCBpbiBsb2FkIG9yZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZERlZmluaXRpb25zKHJlZ2lzdHJ5LCB0YXJnZXQsIHtyZWxvYWQgPSBmYWxzZX0gPSB7fSkge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlc29sdmVGaWxlcyh0YXJnZXQpXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgbGV0IGhyZWYgPSBwYXRoVG9GaWxlVVJMKGZpbGUpLmhyZWZcblxuICAgIGlmIChyZWxvYWQpIHtcbiAgICAgIHJlbG9hZENvdW50ZXIgKz0gMVxuICAgICAgaHJlZiArPSBgP2ZhY3RvcnlSZWxvYWQ9JHtyZWxvYWRDb3VudGVyfWBcbiAgICB9XG5cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoaHJlZilcblxuICAgIGlmICh0eXBlb2YgbW9kdWxlLmRlZmF1bHQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWN0b3J5IGRlZmluaXRpb24gZmlsZSAke2ZpbGV9IG11c3QgZGVmYXVsdC1leHBvcnQgYSAocmVnaXN0cnkpID0+IHZvaWQgZnVuY3Rpb25gKVxuICAgIH1cblxuICAgIG1vZHVsZS5kZWZhdWx0KHJlZ2lzdHJ5KVxuICB9XG5cbiAgcmV0dXJuIGZpbGVzXG59XG5cbi8qKlxuICogRnVsbHkgcmVsb2FkcyBkZWZpbml0aW9uczogcmVzZXRzIHRoZSByZWdpc3RyeSAoZHJvcHBpbmcgZXZlcnkgZmFjdG9yeSwgdHJhaXQsXG4gKiBzZXF1ZW5jZSwgY2FsbGJhY2sgYW5kIGRlZmF1bHQpIGFuZCByZS1pbXBvcnRzIHRoZSB0YXJnZXQgZmlsZXMgd2l0aCBjYWNoZVxuICogYnVzdGluZyBzbyBlZGl0ZWQgZGVmaW5pdGlvbnMgdGFrZSBlZmZlY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gcmVnaXN0cnkgLSBSZWdpc3RyeSB0byByZWxvYWQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSB0YXJnZXQgLSBGaWxlIHBhdGgsIGRpcmVjdG9yeSwgb3IgbGlzdCBvZiBwYXRocy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBUaGUgcmVsb2FkZWQgZmlsZSBwYXRocywgaW4gbG9hZCBvcmRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbG9hZERlZmluaXRpb25zKHJlZ2lzdHJ5LCB0YXJnZXQpIHtcbiAgcmVnaXN0cnkucmVzZXQoKVxuXG4gIHJldHVybiBhd2FpdCBsb2FkRGVmaW5pdGlvbnMocmVnaXN0cnksIHRhcmdldCwge3JlbG9hZDogdHJ1ZX0pXG59XG4iXX0=
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1kZWZpbml0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy90ZXN0aW5nL2ZhY3Rvcnkvbm9kZS9sb2FkLWRlZmluaXRpb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDaEQsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBRTdFOzs7O0dBSUc7QUFDSCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFckI7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQUMsU0FBUztJQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUMvRCx1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO0lBRWhCLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVqRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxN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QUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiXG5pbXBvcnQgeyByZWFkZGlyLCBzdGF0IH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyByZXNlcnZlRGVmaW5pdGlvblJlbG9hZEJ1ZGdldCB9IGZyb20gXCIuL2RlZmluaXRpb24tcmVsb2FkLXBvbGljeS5qc1wiXG5cbi8qKlxuICogTW9ub3RvbmljIGNhY2hlLWJ1c3RpbmcgY291bnRlciBzaGFyZWQgYnkgcmVsb2Fkcy4gS2VwdCBtb2R1bGUtbG9jYWwgc28gYSByZWxvYWRcbiAqIGltcG9ydHMgYSBmcmVzaCBtb2R1bGUgaW5zdGFuY2UgcmF0aGVyIHRoYW4gdGhlIGNhY2hlZCBvbmUuXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5sZXQgcmVsb2FkQ291bnRlciA9IDBcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb2xsZWN0cyBgLmpzYCBmaWxlcyB1bmRlciBhIGRpcmVjdG9yeSBpbiBhIGRldGVybWluaXN0aWNcbiAqIChsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQpIG9yZGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdG9yeSAtIERpcmVjdG9yeSB0byBzY2FuLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFNvcnRlZCBhYnNvbHV0ZSBmaWxlIHBhdGhzLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0RGlyZWN0b3J5RmlsZXMoZGlyZWN0b3J5KSB7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSwge3dpdGhGaWxlVHlwZXM6IHRydWV9KVxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBmaWxlcyA9IFtdXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBbLi4uZW50cmllc10uc29ydCgobGVmdCwgcmlnaHQpID0+IChsZWZ0Lm5hbWUgPCByaWdodC5uYW1lID8gLTEgOiAxKSkpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpXG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgZmlsZXMucHVzaCguLi5hd2FpdCBjb2xsZWN0RGlyZWN0b3J5RmlsZXMoZnVsbFBhdGgpKVxuICAgIH0gZWxzZSBpZiAoZW50cnkubmFtZS5lbmRzV2l0aChcIi5qc1wiKSkge1xuICAgICAgZmlsZXMucHVzaChmdWxsUGF0aClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlsZXNcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGxvYWQgdGFyZ2V0IChhIHNpbmdsZSBmaWxlLCBhIGRpcmVjdG9yeSwgb3IgYW4gZXhwbGljaXQgbGlzdCkgaW50byBhXG4gKiBkZXRlcm1pbmlzdGljLCBkZS1kdXBsaWNhdGVkIGxpc3Qgb2YgYWJzb2x1dGUgZGVmaW5pdGlvbiBmaWxlIHBhdGhzLlxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gdGFyZ2V0IC0gRmlsZSBwYXRoLCBkaXJlY3RvcnksIG9yIGxpc3Qgb2YgcGF0aHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gU29ydGVkLCBkZS1kdXBsaWNhdGVkIGFic29sdXRlIGZpbGUgcGF0aHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVGaWxlcyh0YXJnZXQpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh0YXJnZXQubWFwKChlbnRyeSkgPT4gcGF0aC5yZXNvbHZlKGVudHJ5KSkpXS5zb3J0KClcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKHRhcmdldClcbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0KHJlc29sdmVkKVxuXG4gIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gYXdhaXQgY29sbGVjdERpcmVjdG9yeUZpbGVzKHJlc29sdmVkKVxuXG4gIHJldHVybiBbcmVzb2x2ZWRdXG59XG5cbi8qKlxuICogTG9hZHMgVmVsb2Npb3VzIGZhY3RvcnkgZGVmaW5pdGlvbiBmaWxlcyAoTm9kZSBvbmx5KS4gRWFjaCBmaWxlIG11c3RcbiAqIGRlZmF1bHQtZXhwb3J0IGEgYChyZWdpc3RyeSkgPT4gdm9pZGAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGludG8gdGhlIHJlZ2lzdHJ5LlxuICogRmlsZXMgbG9hZCBpbiBkZXRlcm1pbmlzdGljIHBhdGggb3JkZXIuIFRoaXMgbW9kdWxlIGlzIGludGVudGlvbmFsbHkgTm9kZS1vbmx5XG4gKiAoZmlsZXN5c3RlbSArIGR5bmFtaWMgaW1wb3J0KSBhbmQgbXVzdCBuZXZlciBiZSBpbXBvcnRlZCBmcm9tIGJyb3dzZXIvTWV0cm9cbiAqIGJ1bmRsZXM7IGltcG9ydCB0aGUgYnJvd3Nlci1zYWZlIGNvcmUgZnJvbSBgLi4vaW5kZXguanNgIHRoZXJlIGluc3RlYWQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gcmVnaXN0cnkgLSBSZWdpc3RyeSB0byBkZWZpbmUgaW50by5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW119IHRhcmdldCAtIEZpbGUgcGF0aCwgZGlyZWN0b3J5LCBvciBsaXN0IG9mIHBhdGhzLlxuICogQHBhcmFtIHt7cmVsb2FkPzogYm9vbGVhbn19IFtvcHRpb25zXSAtIE9wdGlvbnMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gVGhlIGxvYWRlZCBmaWxlIHBhdGhzLCBpbiBsb2FkIG9yZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZERlZmluaXRpb25zKHJlZ2lzdHJ5LCB0YXJnZXQsIHtyZWxvYWQgPSBmYWxzZX0gPSB7fSkge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlc29sdmVGaWxlcyh0YXJnZXQpXG5cbiAgcmV0dXJuIGF3YWl0IGxvYWRSZXNvbHZlZERlZmluaXRpb25GaWxlcyh7ZmlsZXMsIHJlZ2lzdHJ5LCByZWxvYWR9KVxufVxuXG4vKipcbiAqIExvYWRzIGRlZmluaXRpb24gZmlsZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiByZXNvbHZlZCBpbnRvIGEgZGV0ZXJtaW5pc3RpY1xuICogc29ydGVkIGxpc3QuIFdoZW4gYHJlbG9hZGAgaXMgc2V0LCB0aGUgd2hvbGUgYmF0Y2ggaXMgcHJlZmxpZ2h0ZWQgYW5kIHJlc2VydmVkXG4gKiBhZ2FpbnN0IHRoZSBwcm9jZXNzLWdsb2JhbCBpbXBvcnQgYnVkZ2V0IGJlZm9yZSBhbnkgcmVnaXN0cnkgcmVzZXQgb3IgaW1wb3J0XG4gKiBhdHRlbXB0LCBzbyBhIHJlamVjdGVkIHJlbG9hZCBuZXZlciBtdXRhdGVzIHRoZSByZWdpc3RyeS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLmZpbGVzIC0gUmVzb2x2ZWQsIHNvcnRlZCBkZWZpbml0aW9uIGZpbGUgcGF0aHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gYXJncy5yZWdpc3RyeSAtIFJlZ2lzdHJ5IHRvIGRlZmluZSBpbnRvLlxuICogQHBhcmFtIHtib29sZWFufSBhcmdzLnJlbG9hZCAtIFdoZXRoZXIgdG8gY2FjaGUtYnVzdCB0aGUgaW1wb3J0cy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MucmVzZXRdIC0gV2hldGhlciB0byByZXNldCB0aGUgcmVnaXN0cnkgZmlyc3QuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gVGhlIGxvYWRlZCBmaWxlIHBhdGhzLCBpbiBsb2FkIG9yZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkUmVzb2x2ZWREZWZpbml0aW9uRmlsZXMoe2ZpbGVzLCByZWdpc3RyeSwgcmVsb2FkLCByZXNldCA9IGZhbHNlfSkge1xuICBpZiAocmVsb2FkKSByZXNlcnZlRGVmaW5pdGlvblJlbG9hZEJ1ZGdldChmaWxlcy5sZW5ndGgpXG5cbiAgaWYgKHJlc2V0KSByZWdpc3RyeS5yZXNldCgpXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgbGV0IGhyZWYgPSBwYXRoVG9GaWxlVVJMKGZpbGUpLmhyZWZcblxuICAgIGlmIChyZWxvYWQpIHtcbiAgICAgIHJlbG9hZENvdW50ZXIgKz0gMVxuICAgICAgaHJlZiArPSBgP2ZhY3RvcnlSZWxvYWQ9JHtyZWxvYWRDb3VudGVyfWBcbiAgICB9XG5cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoaHJlZilcblxuICAgIGlmICh0eXBlb2YgbW9kdWxlLmRlZmF1bHQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWN0b3J5IGRlZmluaXRpb24gZmlsZSAke2ZpbGV9IG11c3QgZGVmYXVsdC1leHBvcnQgYSAocmVnaXN0cnkpID0+IHZvaWQgZnVuY3Rpb25gKVxuICAgIH1cblxuICAgIG1vZHVsZS5kZWZhdWx0KHJlZ2lzdHJ5KVxuICB9XG5cbiAgcmV0dXJuIGZpbGVzXG59XG5cbi8qKlxuICogRnVsbHkgcmVsb2FkcyBkZWZpbml0aW9uczogcmVzZXRzIHRoZSByZWdpc3RyeSAoZHJvcHBpbmcgZXZlcnkgZmFjdG9yeSwgdHJhaXQsXG4gKiBzZXF1ZW5jZSwgY2FsbGJhY2sgYW5kIGRlZmF1bHQpIGFuZCByZS1pbXBvcnRzIHRoZSB0YXJnZXQgZmlsZXMgd2l0aCBjYWNoZVxuICogYnVzdGluZyBzbyBlZGl0ZWQgZGVmaW5pdGlvbnMgdGFrZSBlZmZlY3QuIFRoZSByZXNvbHZlZCBiYXRjaCBpcyBwcmVmbGlnaHRlZFxuICogYWdhaW5zdCB0aGUgcHJvY2Vzcy1nbG9iYWwgaW1wb3J0IGJ1ZGdldCBiZWZvcmUgdGhlIHJlc2V0LCBhbmQgYVxuICogYERlZmluaXRpb25SZWN5Y2xlUmVxdWlyZWRFcnJvcmAgaXMgcmFpc2VkIGJlZm9yZSBhbnkgbXV0YXRpb24gd2hlbiB0aGUgYmF0Y2hcbiAqIHdvdWxkIGV4Y2VlZCB0aGUgYnVkZ2V0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mYWN0b3J5LXJlZ2lzdHJ5LmpzXCIpLmRlZmF1bHR9IHJlZ2lzdHJ5IC0gUmVnaXN0cnkgdG8gcmVsb2FkLlxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gdGFyZ2V0IC0gRmlsZSBwYXRoLCBkaXJlY3RvcnksIG9yIGxpc3Qgb2YgcGF0aHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gVGhlIHJlbG9hZGVkIGZpbGUgcGF0aHMsIGluIGxvYWQgb3JkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxvYWREZWZpbml0aW9ucyhyZWdpc3RyeSwgdGFyZ2V0KSB7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVzb2x2ZUZpbGVzKHRhcmdldClcblxuICByZXR1cm4gYXdhaXQgbG9hZFJlc29sdmVkRGVmaW5pdGlvbkZpbGVzKHtmaWxlcywgcmVnaXN0cnksIHJlbG9hZDogdHJ1ZSwgcmVzZXQ6IHRydWV9KVxufVxuIl19
|