@git.zone/cli 3.2.0 → 4.0.0
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/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/classes.gitzoneconfig.js +1 -1
- package/dist_ts/classes.project.js +1 -1
- package/dist_ts/gitzone.cli.js +1 -1
- package/dist_ts/gitzone.logging.js +1 -1
- package/dist_ts/helpers.changelog.js +1 -1
- package/dist_ts/helpers.climode.js +1 -1
- package/dist_ts/helpers.smartconfig.js +61 -11
- package/dist_ts/helpers.smartconfigmigrations.js +1 -1
- package/dist_ts/helpers.tsdocker.js +1 -1
- package/dist_ts/helpers.workflow.js +1 -1
- package/dist_ts/index.js +1 -1
- package/dist_ts/mod_audit/index.js +1 -1
- package/dist_ts/mod_commit/index.js +1 -1
- package/dist_ts/mod_commit/mod.helpers.js +1 -1
- package/dist_ts/mod_commit/mod.plugins.js +1 -1
- package/dist_ts/mod_commit/mod.ui.js +1 -1
- package/dist_ts/mod_config/classes.commitconfig.js +1 -1
- package/dist_ts/mod_config/classes.releaseconfig.js +1 -1
- package/dist_ts/mod_config/index.js +2 -2
- package/dist_ts/mod_config/mod.plugins.js +1 -1
- package/dist_ts/mod_deprecate/index.js +1 -1
- package/dist_ts/mod_deprecate/mod.plugins.js +1 -1
- package/dist_ts/mod_docker/classes.dockerpruner.js +7 -1
- package/dist_ts/mod_docker/index.js +1 -1
- package/dist_ts/mod_docker/mod.plugins.js +1 -1
- package/dist_ts/mod_format/classes.baseformatter.js +1 -1
- package/dist_ts/mod_format/classes.diffreporter.js +1 -1
- package/dist_ts/mod_format/classes.formatcontext.js +1 -1
- package/dist_ts/mod_format/classes.formatplanner.js +1 -1
- package/dist_ts/mod_format/classes.formatstats.js +1 -1
- package/dist_ts/mod_format/formatters/assets.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/cleanup.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/copy.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/gitignore.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/license.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/packagejson.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/prettier.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/readme.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/smartconfig.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/templates.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/tsconfig.formatter.js +1 -1
- package/dist_ts/mod_format/index.js +1 -1
- package/dist_ts/mod_format/interfaces.format.js +1 -1
- package/dist_ts/mod_format/mod.plugins.js +1 -1
- package/dist_ts/mod_helpers/index.js +1 -1
- package/dist_ts/mod_helpers/mod.plugins.js +1 -1
- package/dist_ts/mod_meta/index.js +1 -1
- package/dist_ts/mod_meta/meta.classes.meta.js +1 -1
- package/dist_ts/mod_meta/meta.interfaces.js +1 -1
- package/dist_ts/mod_meta/meta.plugins.js +1 -1
- package/dist_ts/mod_open/index.js +1 -1
- package/dist_ts/mod_open/mod.plugins.js +1 -1
- package/dist_ts/mod_release/index.js +4 -4
- package/dist_ts/mod_release/mod.plugins.js +1 -1
- package/dist_ts/mod_services/classes.dockercontainer.d.ts +50 -3
- package/dist_ts/mod_services/classes.dockercontainer.js +646 -84
- package/dist_ts/mod_services/classes.globalregistry.d.ts +10 -24
- package/dist_ts/mod_services/classes.globalregistry.js +210 -62
- package/dist_ts/mod_services/classes.globalregistrystore.d.ts +48 -0
- package/dist_ts/mod_services/classes.globalregistrystore.js +156 -0
- package/dist_ts/mod_services/classes.interprocesslock.d.ts +21 -0
- package/dist_ts/mod_services/classes.interprocesslock.js +141 -0
- package/dist_ts/mod_services/classes.serviceconfiguration.d.ts +15 -12
- package/dist_ts/mod_services/classes.serviceconfiguration.js +188 -91
- package/dist_ts/mod_services/classes.servicedatamarker.d.ts +32 -7
- package/dist_ts/mod_services/classes.servicedatamarker.js +145 -49
- package/dist_ts/mod_services/classes.servicemanager.d.ts +70 -28
- package/dist_ts/mod_services/classes.servicemanager.js +995 -421
- package/dist_ts/mod_services/classes.servicenames.d.ts +8 -0
- package/dist_ts/mod_services/classes.servicenames.js +54 -0
- package/dist_ts/mod_services/classes.serviceoptions.js +1 -1
- package/dist_ts/mod_services/classes.servicepruner.d.ts +3 -0
- package/dist_ts/mod_services/classes.servicepruner.js +208 -46
- package/dist_ts/mod_services/helpers.js +1 -1
- package/dist_ts/mod_services/index.d.ts +2 -0
- package/dist_ts/mod_services/index.js +81 -58
- package/dist_ts/mod_services/mod.plugins.js +1 -1
- package/dist_ts/mod_standard/index.js +2 -2
- package/dist_ts/mod_standard/mod.plugins.js +1 -1
- package/dist_ts/mod_start/index.js +1 -1
- package/dist_ts/mod_start/mod.plugins.js +1 -1
- package/dist_ts/mod_template/index.js +1 -1
- package/dist_ts/mod_template/mod.plugins.js +1 -1
- package/dist_ts/mod_tools/classes.packagemanager.js +1 -1
- package/dist_ts/mod_tools/index.js +1 -1
- package/dist_ts/mod_tools/mod.plugins.js +1 -1
- package/dist_ts/paths.js +1 -1
- package/dist_ts/plugins.d.ts +3 -1
- package/dist_ts/plugins.js +4 -2
- package/dist_ts_migration/001.service-selection.d.ts +9 -0
- package/dist_ts_migration/001.service-selection.js +51 -0
- package/dist_ts_migration/002.runtime-config.d.ts +19 -0
- package/dist_ts_migration/002.runtime-config.js +170 -0
- package/dist_ts_migration/003.service-data-marker.d.ts +9 -0
- package/dist_ts_migration/003.service-data-marker.js +156 -0
- package/dist_ts_migration/004.global-registry.d.ts +13 -0
- package/dist_ts_migration/004.global-registry.js +165 -0
- package/dist_ts_migration/index.d.ts +11 -0
- package/dist_ts_migration/index.js +59 -0
- package/package.json +6 -3
- package/readme.hints.md +102 -25
- package/readme.md +123 -28
- package/readme.plan.md +29 -16
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/helpers.smartconfig.ts +63 -10
- package/ts/mod_config/index.ts +1 -1
- package/ts/mod_docker/classes.dockerpruner.ts +6 -0
- package/ts/mod_release/index.ts +3 -3
- package/ts/mod_services/classes.dockercontainer.ts +912 -96
- package/ts/mod_services/classes.globalregistry.ts +290 -89
- package/ts/mod_services/classes.globalregistrystore.ts +279 -0
- package/ts/mod_services/classes.interprocesslock.ts +189 -0
- package/ts/mod_services/classes.serviceconfiguration.ts +215 -108
- package/ts/mod_services/classes.servicedatamarker.ts +210 -52
- package/ts/mod_services/classes.servicemanager.ts +1332 -512
- package/ts/mod_services/classes.servicenames.ts +76 -0
- package/ts/mod_services/classes.servicepruner.ts +310 -52
- package/ts/mod_services/index.ts +89 -62
- package/ts/mod_standard/index.ts +1 -1
- package/ts/plugins.ts +4 -0
- package/ts_migration/001.service-selection.ts +77 -0
- package/ts_migration/002.runtime-config.ts +218 -0
- package/ts_migration/003.service-data-marker.ts +216 -0
- package/ts_migration/004.global-registry.ts +272 -0
- package/ts_migration/index.ts +83 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TServiceName } from './classes.servicedatamarker.js';
|
|
2
|
+
export declare const allowedServiceNames: TServiceName[];
|
|
3
|
+
/** Normalize interactive/CLI input. The legacy provider name is deliberately absent. */
|
|
4
|
+
export declare const normalizeUserServiceName: (serviceArg: string) => string;
|
|
5
|
+
export declare const normalizeUserServiceNames: (servicesArg: readonly string[]) => string[];
|
|
6
|
+
export declare const assertSupportedCliSchema: (cliConfigArg: Record<string, any>) => void;
|
|
7
|
+
/** Read only canonical persisted service names after the startup migration ran. */
|
|
8
|
+
export declare const readPersistedServiceConfiguration: (cwdArg?: string) => Promise<string[]>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { CLI_NAMESPACE, getCliConfigValueFromData, getCliNamespaceConfig, readSmartconfigFile, } from '../helpers.smartconfig.js';
|
|
2
|
+
export const allowedServiceNames = [
|
|
3
|
+
'mongodb',
|
|
4
|
+
'objectstorage',
|
|
5
|
+
'elasticsearch',
|
|
6
|
+
];
|
|
7
|
+
/** Normalize interactive/CLI input. The legacy provider name is deliberately absent. */
|
|
8
|
+
export const normalizeUserServiceName = (serviceArg) => {
|
|
9
|
+
switch (serviceArg) {
|
|
10
|
+
case 'mongo':
|
|
11
|
+
case 'mongodb':
|
|
12
|
+
return 'mongodb';
|
|
13
|
+
case 'objectstorage':
|
|
14
|
+
case 's3':
|
|
15
|
+
return 'objectstorage';
|
|
16
|
+
case 'elastic':
|
|
17
|
+
case 'elasticsearch':
|
|
18
|
+
case 'es':
|
|
19
|
+
return 'elasticsearch';
|
|
20
|
+
default:
|
|
21
|
+
return serviceArg;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
export const normalizeUserServiceNames = (servicesArg) => {
|
|
25
|
+
return Array.from(new Set(servicesArg
|
|
26
|
+
.map((serviceArg) => normalizeUserServiceName(serviceArg.trim()))
|
|
27
|
+
.filter(Boolean)));
|
|
28
|
+
};
|
|
29
|
+
export const assertSupportedCliSchema = (cliConfigArg) => {
|
|
30
|
+
if (cliConfigArg.schemaVersion !== undefined &&
|
|
31
|
+
(!Number.isInteger(cliConfigArg.schemaVersion) ||
|
|
32
|
+
cliConfigArg.schemaVersion < 1 ||
|
|
33
|
+
cliConfigArg.schemaVersion > 2)) {
|
|
34
|
+
throw new Error(`${CLI_NAMESPACE} uses an unsupported schema version.`);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
/** Read only canonical persisted service names after the startup migration ran. */
|
|
38
|
+
export const readPersistedServiceConfiguration = async (cwdArg = process.cwd()) => {
|
|
39
|
+
const smartconfigData = await readSmartconfigFile(cwdArg);
|
|
40
|
+
assertSupportedCliSchema(getCliNamespaceConfig(smartconfigData));
|
|
41
|
+
const rawServices = getCliConfigValueFromData(smartconfigData, 'services');
|
|
42
|
+
if (rawServices === undefined) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
if (!Array.isArray(rawServices) || !rawServices.every((service) => typeof service === 'string')) {
|
|
46
|
+
throw new Error('Persisted services configuration must be an array of service names.');
|
|
47
|
+
}
|
|
48
|
+
if (rawServices.some((service) => !allowedServiceNames.some((allowedService) => allowedService === service)) ||
|
|
49
|
+
new Set(rawServices).size !== rawServices.length) {
|
|
50
|
+
throw new Error('Persisted services configuration is not canonical.');
|
|
51
|
+
}
|
|
52
|
+
return [...rawServices];
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2aWNlbmFtZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9tb2Rfc2VydmljZXMvY2xhc3Nlcy5zZXJ2aWNlbmFtZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGFBQWEsRUFDYix5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLG1CQUFtQixHQUNwQixNQUFNLDJCQUEyQixDQUFDO0FBR25DLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFtQjtJQUNqRCxTQUFTO0lBQ1QsZUFBZTtJQUNmLGVBQWU7Q0FDaEIsQ0FBQztBQUVGLHdGQUF3RjtBQUN4RixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLFVBQWtCLEVBQVUsRUFBRTtJQUNyRSxRQUFRLFVBQVUsRUFBRSxDQUFDO1FBQ25CLEtBQUssT0FBTyxDQUFDO1FBQ2IsS0FBSyxTQUFTO1lBQ1osT0FBTyxTQUFTLENBQUM7UUFDbkIsS0FBSyxlQUFlLENBQUM7UUFDckIsS0FBSyxJQUFJO1lBQ1AsT0FBTyxlQUFlLENBQUM7UUFDekIsS0FBSyxTQUFTLENBQUM7UUFDZixLQUFLLGVBQWUsQ0FBQztRQUNyQixLQUFLLElBQUk7WUFDUCxPQUFPLGVBQWUsQ0FBQztRQUN6QjtZQUNFLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLFdBQThCLEVBQVksRUFBRTtJQUNwRixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQ2YsSUFBSSxHQUFHLENBQ0wsV0FBVztTQUNSLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7U0FDaEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUNuQixDQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLFlBQWlDLEVBQVEsRUFBRTtJQUNsRixJQUNFLFlBQVksQ0FBQyxhQUFhLEtBQUssU0FBUztRQUN4QyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO1lBQzVDLFlBQVksQ0FBQyxhQUFhLEdBQUcsQ0FBQztZQUM5QixZQUFZLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxFQUNqQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGFBQWEsc0NBQXNDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLEtBQUssRUFDcEQsU0FBaUIsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUNYLEVBQUU7SUFDckIsTUFBTSxlQUFlLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxRCx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sV0FBVyxHQUFHLHlCQUF5QixDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzRSxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM5QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDaEcsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFDRCxJQUNFLFdBQVcsQ0FBQyxJQUFJLENBQ2QsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxjQUFjLEtBQUssT0FBTyxDQUFDLENBQ3ZGO1FBQ0QsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxNQUFNLEVBQ2hELENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDO0FBQzFCLENBQUMsQ0FBQyJ9
|
|
@@ -90,4 +90,4 @@ export const resolveMongoAuth = (declaredOptionsArg, localValueArg) => {
|
|
|
90
90
|
}
|
|
91
91
|
return { authEnabled: true, source: 'default' };
|
|
92
92
|
};
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2aWNlb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL21vZF9zZXJ2aWNlcy9jbGFzc2VzLnNlcnZpY2VvcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLG9CQUFvQixHQUNyQixNQUFNLDJCQUEyQixDQUFDO0FBR25DOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsZ0JBQWdCLENBQUM7QUFleEQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFjLEVBQWdDLEVBQUU7SUFDckUsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUUsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUNyQyxNQUFjLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFDRCxFQUFFO0lBQzVCLE1BQU0sZUFBZSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkQsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFvQixFQUFFLENBQUM7SUFDcEMsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENB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
|
|
@@ -55,6 +55,7 @@ export interface IServicePrunePlan {
|
|
|
55
55
|
id: string;
|
|
56
56
|
name: string;
|
|
57
57
|
projectPath: string;
|
|
58
|
+
service: TServiceName;
|
|
58
59
|
}>;
|
|
59
60
|
dataDirsToRemove: Array<{
|
|
60
61
|
projectPath: string;
|
|
@@ -99,4 +100,6 @@ export declare class ServicePruner {
|
|
|
99
100
|
*/
|
|
100
101
|
applyPlan(planArg: IServicePrunePlan): Promise<void>;
|
|
101
102
|
private isClaimedByExactlyOneProject;
|
|
103
|
+
private withProjectServiceLocks;
|
|
104
|
+
private isLegacyContainerReference;
|
|
102
105
|
}
|
|
@@ -2,11 +2,39 @@ import * as plugins from './mod.plugins.js';
|
|
|
2
2
|
import * as helpers from './helpers.js';
|
|
3
3
|
import { DockerContainer } from './classes.dockercontainer.js';
|
|
4
4
|
import { GlobalRegistry } from './classes.globalregistry.js';
|
|
5
|
-
import { getServiceDataDirectory, isSafeServiceDataPath,
|
|
5
|
+
import { getServiceContainerLabels, getServiceDataDirectory, hasExactServiceContainerLabels, isSafeServiceDataPath, isLegacyMinioContainerLabels, isServiceOperationHelperLabels, markerProvesServiceDataDirectory, readServiceDataMarker, recordServiceDataDirectory, serviceImages, serviceNames, serviceToolLabel, } from './classes.servicedatamarker.js';
|
|
6
|
+
import { withServiceDataOperationLock } from './classes.interprocesslock.js';
|
|
6
7
|
import { logger } from '../gitzone.logging.js';
|
|
7
8
|
/** Default inactivity threshold before a project is even considered stale. */
|
|
8
9
|
export const defaultStaleDays = 30;
|
|
9
10
|
const dayInMs = 24 * 60 * 60 * 1000;
|
|
11
|
+
const hasGitZoneLabels = (labelsArg) => {
|
|
12
|
+
return Object.keys(labelsArg).some((keyArg) => keyArg.startsWith('git.zone.'));
|
|
13
|
+
};
|
|
14
|
+
const getRegisteredServiceForContainer = (projectArg, containerNameArg) => {
|
|
15
|
+
if (!projectArg) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const matches = [];
|
|
19
|
+
if (projectArg.containers.mongo === containerNameArg)
|
|
20
|
+
matches.push('mongodb');
|
|
21
|
+
if (projectArg.containers.objectstorage === containerNameArg)
|
|
22
|
+
matches.push('objectstorage');
|
|
23
|
+
if (projectArg.containers.elasticsearch === containerNameArg)
|
|
24
|
+
matches.push('elasticsearch');
|
|
25
|
+
return matches.length === 1 ? matches[0] : undefined;
|
|
26
|
+
};
|
|
27
|
+
const hasCanonicalServiceLabels = (containerArg, projectPathArg) => {
|
|
28
|
+
const service = serviceNames.find((serviceArg) => containerArg.labels['git.zone.service'] === serviceArg);
|
|
29
|
+
if (!service) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return hasExactServiceContainerLabels(containerArg.labels, getServiceContainerLabels({
|
|
33
|
+
projectPath: projectPathArg,
|
|
34
|
+
service,
|
|
35
|
+
dataPath: getServiceDataDirectory(projectPathArg, service),
|
|
36
|
+
}));
|
|
37
|
+
};
|
|
10
38
|
/**
|
|
11
39
|
* Plans and applies reclamation of resources created by `gitzone services`.
|
|
12
40
|
*
|
|
@@ -52,6 +80,7 @@ export class ServicePruner {
|
|
|
52
80
|
// versions). Their names are only trusted when exactly one registry entry
|
|
53
81
|
// claims them.
|
|
54
82
|
const nameClaims = new Map();
|
|
83
|
+
const legacyNameClaims = new Map();
|
|
55
84
|
for (const [projectPath, project] of Object.entries(registryProjects)) {
|
|
56
85
|
for (const containerName of Object.values(project.containers)) {
|
|
57
86
|
if (!containerName) {
|
|
@@ -61,9 +90,14 @@ export class ServicePruner {
|
|
|
61
90
|
claims.push(projectPath);
|
|
62
91
|
nameClaims.set(containerName, claims);
|
|
63
92
|
}
|
|
93
|
+
if (project.legacy?.minioContainer) {
|
|
94
|
+
const claims = legacyNameClaims.get(project.legacy.minioContainer) || [];
|
|
95
|
+
claims.push(projectPath);
|
|
96
|
+
legacyNameClaims.set(project.legacy.minioContainer, claims);
|
|
97
|
+
}
|
|
64
98
|
}
|
|
65
99
|
let legacyContainers = [];
|
|
66
|
-
if (dockerAvailable && nameClaims.size > 0) {
|
|
100
|
+
if (dockerAvailable && (nameClaims.size > 0 || legacyNameClaims.size > 0)) {
|
|
67
101
|
try {
|
|
68
102
|
// One `docker ps -a` for all claimed names rather than one per name:
|
|
69
103
|
// each shell-out is a spawned child process, and this runs on every
|
|
@@ -73,7 +107,7 @@ export class ServicePruner {
|
|
|
73
107
|
const allIds = await this.docker.listIds([]);
|
|
74
108
|
const candidateIds = allIds.filter((id) => !labeledIds.has(id));
|
|
75
109
|
const inspected = await this.docker.inspectMany(candidateIds);
|
|
76
|
-
legacyContainers = inspected.filter((container) => nameClaims.has(container.name));
|
|
110
|
+
legacyContainers = inspected.filter((container) => nameClaims.has(container.name) || legacyNameClaims.has(container.name));
|
|
77
111
|
}
|
|
78
112
|
catch (error) {
|
|
79
113
|
dockerAvailable = false;
|
|
@@ -122,7 +156,10 @@ export class ServicePruner {
|
|
|
122
156
|
// so such projects are forced to `unknown` and nothing is reclaimed.
|
|
123
157
|
const ambiguousProjectPaths = new Set();
|
|
124
158
|
for (const container of legacyContainers) {
|
|
125
|
-
const claims =
|
|
159
|
+
const claims = [
|
|
160
|
+
...(nameClaims.get(container.name) || []),
|
|
161
|
+
...(legacyNameClaims.get(container.name) || []),
|
|
162
|
+
];
|
|
126
163
|
if (claims.length !== 1) {
|
|
127
164
|
skipped.push({
|
|
128
165
|
target: container.name,
|
|
@@ -172,13 +209,34 @@ export class ServicePruner {
|
|
|
172
209
|
state = 'live';
|
|
173
210
|
stateReason = `active ${inactiveDays} day(s) ago`;
|
|
174
211
|
}
|
|
175
|
-
const anyContainerRunning = candidate.containers.some((container) => container.running);
|
|
176
212
|
// Containers
|
|
177
213
|
const containerReports = [];
|
|
178
214
|
for (const container of candidate.containers) {
|
|
179
215
|
let reclaimable = false;
|
|
180
216
|
let reason;
|
|
181
|
-
|
|
217
|
+
const labelOwned = hasCanonicalServiceLabels(container, candidate.projectPath);
|
|
218
|
+
const registryClaims = nameClaims.get(container.name) || [];
|
|
219
|
+
const registeredService = getRegisteredServiceForContainer(candidate.registryEntry, container.name);
|
|
220
|
+
const registryOwned = !hasGitZoneLabels(container.labels) &&
|
|
221
|
+
registeredService !== undefined &&
|
|
222
|
+
registeredService !== 'objectstorage' &&
|
|
223
|
+
registryClaims.length === 1 &&
|
|
224
|
+
plugins.path.resolve(registryClaims[0]) === candidate.projectPath;
|
|
225
|
+
const legacyContainer = isLegacyMinioContainerLabels(container.labels) ||
|
|
226
|
+
legacyNameClaims.has(container.name);
|
|
227
|
+
const operationHelper = isServiceOperationHelperLabels(container.labels);
|
|
228
|
+
if (legacyContainer) {
|
|
229
|
+
reason = 'legacy MinIO migration resource; preserved and never pruned';
|
|
230
|
+
}
|
|
231
|
+
else if (operationHelper) {
|
|
232
|
+
reason = 'transient service operation helper; owned only by its invocation';
|
|
233
|
+
}
|
|
234
|
+
else if (!labelOwned && !registryOwned) {
|
|
235
|
+
reason = hasGitZoneLabels(container.labels)
|
|
236
|
+
? 'GitZone ownership labels are incomplete or noncanonical'
|
|
237
|
+
: 'container has no unambiguous registry ownership claim';
|
|
238
|
+
}
|
|
239
|
+
else if (!dockerAvailable) {
|
|
182
240
|
reason = 'docker unavailable';
|
|
183
241
|
}
|
|
184
242
|
else if (state === 'live') {
|
|
@@ -203,22 +261,38 @@ export class ServicePruner {
|
|
|
203
261
|
reason,
|
|
204
262
|
});
|
|
205
263
|
if (reclaimable) {
|
|
264
|
+
const service = serviceNames.find((serviceArg) => container.labels['git.zone.service'] === serviceArg) || registeredService;
|
|
265
|
+
if (!service) {
|
|
266
|
+
throw new Error(`Could not identify service for container ${container.name}.`);
|
|
267
|
+
}
|
|
206
268
|
containersToRemove.push({
|
|
207
269
|
id: container.id,
|
|
208
270
|
name: container.name,
|
|
209
271
|
projectPath: candidate.projectPath,
|
|
272
|
+
service,
|
|
210
273
|
});
|
|
211
274
|
}
|
|
212
275
|
}
|
|
213
276
|
// Data directories
|
|
214
|
-
const ownershipProven = !!marker || !!candidate.registryEntry;
|
|
215
277
|
const dataReports = [];
|
|
216
278
|
let totalDataBytes = 0;
|
|
217
279
|
let reclaimableDataBytes = 0;
|
|
218
280
|
for (const service of serviceNames) {
|
|
219
281
|
const dataPath = getServiceDataDirectory(candidate.projectPath, service);
|
|
220
|
-
const
|
|
221
|
-
const
|
|
282
|
+
const pendingDeletionPath = await this.docker.getPendingDataDeletionPath(candidate.projectPath, service);
|
|
283
|
+
const preservedContainer = containerReports.find((containerArg, indexArg) => !containerArg.reclaimable &&
|
|
284
|
+
(!pendingDeletionPath ||
|
|
285
|
+
!isServiceOperationHelperLabels(candidate.containers[indexArg].labels)));
|
|
286
|
+
const ownershipProven = service === 'objectstorage'
|
|
287
|
+
? markerProvesServiceDataDirectory(marker, candidate.projectPath, service) ||
|
|
288
|
+
candidate.containers.some((containerArg) => containerArg.labels['git.zone.service'] === 'objectstorage' &&
|
|
289
|
+
hasCanonicalServiceLabels(containerArg, candidate.projectPath))
|
|
290
|
+
: !!marker || !!candidate.registryEntry;
|
|
291
|
+
const canonicalExists = await plugins.smartfs.directory(dataPath).exists();
|
|
292
|
+
const exists = canonicalExists || !!pendingDeletionPath;
|
|
293
|
+
const sizeBytes = exists
|
|
294
|
+
? await helpers.getDirectorySize(canonicalExists ? dataPath : pendingDeletionPath)
|
|
295
|
+
: 0;
|
|
222
296
|
totalDataBytes += sizeBytes;
|
|
223
297
|
let reclaimable = false;
|
|
224
298
|
let reason;
|
|
@@ -249,9 +323,8 @@ export class ServicePruner {
|
|
|
249
323
|
reason = `mounted by a running container (${mountConflict})`;
|
|
250
324
|
blockedByRunningBytes += sizeBytes;
|
|
251
325
|
}
|
|
252
|
-
else if (
|
|
253
|
-
reason =
|
|
254
|
-
blockedByRunningBytes += sizeBytes;
|
|
326
|
+
else if (preservedContainer) {
|
|
327
|
+
reason = `container ${preservedContainer.name} is preserved or still active`;
|
|
255
328
|
}
|
|
256
329
|
else {
|
|
257
330
|
reclaimable = true;
|
|
@@ -274,13 +347,21 @@ export class ServicePruner {
|
|
|
274
347
|
// exists would make it invisible to prune, `stop -g` and `cleanup -g`,
|
|
275
348
|
// leaving it running forever under `restart: unless-stopped`.
|
|
276
349
|
if (state === 'orphaned' && candidate.registryEntry) {
|
|
277
|
-
if (candidate.
|
|
350
|
+
if (candidate.registryEntry.legacy?.minioContainer) {
|
|
351
|
+
skipped.push({
|
|
352
|
+
target: candidate.projectPath,
|
|
353
|
+
reason: `preserving legacy MinIO registry reference: ${candidate.registryEntry.legacy.minioContainer}`,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
else if (dockerAvailable && candidate.containers.length === 0) {
|
|
278
357
|
registryEntriesToRemove.push(candidate.projectPath);
|
|
279
358
|
}
|
|
280
359
|
else {
|
|
281
360
|
skipped.push({
|
|
282
361
|
target: candidate.projectPath,
|
|
283
|
-
reason:
|
|
362
|
+
reason: dockerAvailable
|
|
363
|
+
? `project directory is gone but ${candidate.containers.length} container(s) remain; keeping the registry entry so they stay identifiable`
|
|
364
|
+
: 'project directory is gone but Docker is unavailable; keeping the registry entry so containers remain identifiable',
|
|
284
365
|
});
|
|
285
366
|
}
|
|
286
367
|
}
|
|
@@ -323,29 +404,54 @@ export class ServicePruner {
|
|
|
323
404
|
* removing something that may since have become live.
|
|
324
405
|
*/
|
|
325
406
|
async applyPlan(planArg) {
|
|
326
|
-
if (!planArg.dockerAvailable &&
|
|
327
|
-
|
|
407
|
+
if (!planArg.dockerAvailable &&
|
|
408
|
+
(planArg.containersToRemove.length > 0 ||
|
|
409
|
+
planArg.dataDirsToRemove.length > 0 ||
|
|
410
|
+
planArg.registryEntriesToRemove.length > 0)) {
|
|
411
|
+
throw new Error('Refusing to apply service pruning without a reachable Docker daemon');
|
|
328
412
|
}
|
|
329
413
|
// Containers first, so their mounts stop protecting the data we then remove.
|
|
330
414
|
if (planArg.containersToRemove.length > 0) {
|
|
331
|
-
const current = await this.docker.inspectMany(planArg.containersToRemove.map((container) => container.id));
|
|
332
415
|
for (const planned of planArg.containersToRemove) {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
416
|
+
await withServiceDataOperationLock(planned.projectPath, planned.service, async () => {
|
|
417
|
+
const [container] = await this.docker.inspectMany([planned.id]);
|
|
418
|
+
if (!container || container.id !== planned.id || container.name !== planned.name) {
|
|
419
|
+
throw new Error(`Refusing to remove vanished or changed container: ${planned.name}`);
|
|
420
|
+
}
|
|
421
|
+
if (container.running) {
|
|
422
|
+
throw new Error(`Refusing to remove running container: ${container.name}`);
|
|
423
|
+
}
|
|
424
|
+
if (await plugins.smartfs.directory(planned.projectPath).exists()) {
|
|
425
|
+
const currentEntry = Object.entries(await this.globalRegistry.getAllProjects()).find(([projectPathArg]) => plugins.path.resolve(projectPathArg) === planned.projectPath)?.[1];
|
|
426
|
+
if (!currentEntry) {
|
|
427
|
+
throw new Error(`Refusing container for a project without current activity evidence: ${container.name}`);
|
|
428
|
+
}
|
|
429
|
+
const inactiveDays = Math.floor((Date.now() - currentEntry.lastActive) / dayInMs);
|
|
430
|
+
if (inactiveDays <= this.staleDays) {
|
|
431
|
+
throw new Error(`Refusing container for a project that became active: ${container.name} (${inactiveDays}d)`);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
const labelOwned = hasCanonicalServiceLabels(container, planned.projectPath);
|
|
435
|
+
const registryOwned = !hasGitZoneLabels(container.labels) &&
|
|
436
|
+
(await this.isClaimedByExactlyOneProject(container.name, planned.projectPath));
|
|
437
|
+
if (isLegacyMinioContainerLabels(container.labels) ||
|
|
438
|
+
isServiceOperationHelperLabels(container.labels) ||
|
|
439
|
+
(await this.isLegacyContainerReference(container.name))) {
|
|
440
|
+
throw new Error(`Refusing to remove preserved service container: ${container.name}`);
|
|
441
|
+
}
|
|
442
|
+
if (!labelOwned && !registryOwned) {
|
|
443
|
+
throw new Error(`Refusing to remove container with unproven ownership: ${container.name}`);
|
|
444
|
+
}
|
|
445
|
+
if (labelOwned &&
|
|
446
|
+
container.labels['git.zone.service'] === 'objectstorage' &&
|
|
447
|
+
(await plugins.smartfs
|
|
448
|
+
.directory(getServiceDataDirectory(planned.projectPath, 'objectstorage'))
|
|
449
|
+
.exists())) {
|
|
450
|
+
await recordServiceDataDirectory(planned.projectPath, 'objectstorage');
|
|
451
|
+
}
|
|
452
|
+
await this.docker.execArgv(['rm', container.id], { timeoutMs: 60_000 });
|
|
453
|
+
logger.log('ok', `Removed container ${container.name}`);
|
|
454
|
+
});
|
|
349
455
|
}
|
|
350
456
|
}
|
|
351
457
|
// Data directories. Cheap, local invariants are re-checked first so an
|
|
@@ -359,7 +465,10 @@ export class ServicePruner {
|
|
|
359
465
|
}
|
|
360
466
|
const marker = await readServiceDataMarker(planned.projectPath);
|
|
361
467
|
const registered = await this.globalRegistry.isRegistered(planned.projectPath);
|
|
362
|
-
|
|
468
|
+
const ownershipProven = planned.service === 'objectstorage'
|
|
469
|
+
? markerProvesServiceDataDirectory(marker, planned.projectPath, planned.service)
|
|
470
|
+
: !!marker || registered;
|
|
471
|
+
if (!ownershipProven) {
|
|
363
472
|
throw new Error(`Refusing data path with unproven ownership: ${planned.path}`);
|
|
364
473
|
}
|
|
365
474
|
// Re-verify staleness: the project may have been started between
|
|
@@ -378,33 +487,86 @@ export class ServicePruner {
|
|
|
378
487
|
if (conflict) {
|
|
379
488
|
throw new Error(`Refusing mounted data path: ${planned.path} is used by ${conflict}`);
|
|
380
489
|
}
|
|
381
|
-
|
|
490
|
+
const pendingDeletionPath = await this.docker.getPendingDataDeletionPath(planned.projectPath, planned.service);
|
|
491
|
+
if (!(await plugins.smartfs.directory(planned.path).exists()) &&
|
|
492
|
+
!pendingDeletionPath) {
|
|
382
493
|
continue;
|
|
383
494
|
}
|
|
384
|
-
// Escalates to a
|
|
495
|
+
// Escalates to a root one-off container when the contents belong to
|
|
385
496
|
// the container user; throws rather than deleting only part of the tree.
|
|
386
|
-
await this.docker.removeDataDirectory(planned.path, serviceImages[planned.service]
|
|
497
|
+
await this.docker.removeDataDirectory(planned.path, serviceImages[planned.service], {
|
|
498
|
+
projectPath: planned.projectPath,
|
|
499
|
+
service: planned.service,
|
|
500
|
+
preDeleteCheck: async () => {
|
|
501
|
+
const latestProjects = await this.globalRegistry.getAllProjects();
|
|
502
|
+
const latestEntry = Object.entries(latestProjects).find(([projectPathArg]) => plugins.path.resolve(projectPathArg) === planned.projectPath)?.[1];
|
|
503
|
+
if (!latestEntry) {
|
|
504
|
+
throw new Error(`Refusing data path without a current activity record: ${planned.path}`);
|
|
505
|
+
}
|
|
506
|
+
const inactiveDays = Math.floor((Date.now() - latestEntry.lastActive) / dayInMs);
|
|
507
|
+
if (inactiveDays <= this.staleDays) {
|
|
508
|
+
throw new Error(`Refusing data path for a project that became active: ${planned.path} (${inactiveDays}d)`);
|
|
509
|
+
}
|
|
510
|
+
},
|
|
511
|
+
});
|
|
387
512
|
logger.log('ok', `Removed data directory ${planned.path}`);
|
|
388
513
|
}
|
|
389
514
|
}
|
|
390
515
|
// Registry metadata last, so a failure above leaves the claim intact.
|
|
391
516
|
for (const projectPath of planArg.registryEntriesToRemove) {
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
517
|
+
await this.withProjectServiceLocks(projectPath, async () => {
|
|
518
|
+
if (await plugins.smartfs.directory(projectPath).exists()) {
|
|
519
|
+
throw new Error(`Refusing to unregister an existing project: ${projectPath}`);
|
|
520
|
+
}
|
|
521
|
+
const currentProject = Object.entries(await this.globalRegistry.getAllProjects()).find(([registeredPathArg]) => plugins.path.resolve(registeredPathArg) === projectPath)?.[1];
|
|
522
|
+
if (!currentProject) {
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
if (currentProject.legacy?.minioContainer) {
|
|
526
|
+
throw new Error(`Refusing to unregister preserved legacy container evidence: ${currentProject.legacy.minioContainer}`);
|
|
527
|
+
}
|
|
528
|
+
const projectContainerIds = await this.docker.listIds([
|
|
529
|
+
`label=git.zone.project-path=${projectPath}`,
|
|
530
|
+
]);
|
|
531
|
+
if (projectContainerIds.length > 0) {
|
|
532
|
+
throw new Error(`Refusing to unregister ${projectPath}: a project-labeled container appeared after planning.`);
|
|
533
|
+
}
|
|
534
|
+
for (const containerName of Object.values(currentProject.containers)) {
|
|
535
|
+
if (!containerName)
|
|
536
|
+
continue;
|
|
537
|
+
const ids = await this.docker.listIds([`name=^/${containerName}$`]);
|
|
538
|
+
if (ids.length > 0) {
|
|
539
|
+
throw new Error(`Refusing to unregister ${projectPath}: container ${containerName} appeared after planning.`);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
await this.globalRegistry.unregisterProject(projectPath, currentProject);
|
|
543
|
+
logger.log('ok', `Unregistered ${projectPath}`);
|
|
544
|
+
});
|
|
397
545
|
}
|
|
398
546
|
}
|
|
399
547
|
async isClaimedByExactlyOneProject(containerNameArg, projectPathArg) {
|
|
400
548
|
const projects = await this.globalRegistry.getAllProjects();
|
|
401
549
|
const claims = [];
|
|
402
550
|
for (const [projectPath, project] of Object.entries(projects)) {
|
|
403
|
-
|
|
404
|
-
|
|
551
|
+
const service = getRegisteredServiceForContainer(project, containerNameArg);
|
|
552
|
+
if (service) {
|
|
553
|
+
claims.push({ projectPath: plugins.path.resolve(projectPath), service });
|
|
405
554
|
}
|
|
406
555
|
}
|
|
407
|
-
return claims.length === 1 &&
|
|
556
|
+
return (claims.length === 1 &&
|
|
557
|
+
claims[0].service !== 'objectstorage' &&
|
|
558
|
+
claims[0].projectPath === plugins.path.resolve(projectPathArg));
|
|
559
|
+
}
|
|
560
|
+
async withProjectServiceLocks(projectPathArg, actionArg, serviceIndexArg = 0) {
|
|
561
|
+
const service = serviceNames[serviceIndexArg];
|
|
562
|
+
if (!service) {
|
|
563
|
+
return actionArg();
|
|
564
|
+
}
|
|
565
|
+
return withServiceDataOperationLock(projectPathArg, service, () => this.withProjectServiceLocks(projectPathArg, actionArg, serviceIndexArg + 1));
|
|
566
|
+
}
|
|
567
|
+
async isLegacyContainerReference(containerNameArg) {
|
|
568
|
+
const projects = await this.globalRegistry.getAllProjects();
|
|
569
|
+
return Object.values(projects).some((project) => project.legacy?.minioContainer === containerNameArg);
|
|
408
570
|
}
|
|
409
571
|
}
|
|
410
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2aWNlcHJ1bmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX3NlcnZpY2VzL2NsYXNzZXMuc2VydmljZXBydW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQThCLE1BQU0sOEJBQThCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGNBQWMsRUFBMkIsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLGFBQWEsRUFDYixZQUFZLEVBQ1osZ0JBQWdCLEdBRWpCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRS9DLDhFQUE4RTtBQUM5RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFnRm5DLE1BQU0sT0FBTyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUVwQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFDaEIsTUFBTSxDQUFrQjtJQUN4QixjQUFjLENBQWlCO0lBQy9CLFNBQVMsQ0FBUztJQUUxQixZQUFZLGFBQW9DLEVBQUU7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixN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
|
|
572
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2aWNlcHJ1bmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvbW9kX3NlcnZpY2VzL2NsYXNzZXMuc2VydmljZXBydW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQThCLE1BQU0sOEJBQThCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGNBQWMsRUFBMkIsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qiw4QkFBOEIsRUFDOUIscUJBQXFCLEVBQ3JCLDRCQUE0QixFQUM1Qiw4QkFBOEIsRUFDOUIsZ0NBQWdDLEVBQ2hDLHFCQUFxQixFQUNyQiwwQkFBMEIsRUFDMUIsYUFBYSxFQUNiLFlBQVksRUFDWixnQkFBZ0IsR0FFakIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsOEVBQThFO0FBQzlFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQXFGbkMsTUFBTSxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXBDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxTQUFpQyxFQUFXLEVBQUU7SUFDdEUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLENBQUMsQ0FBQztBQUVGLE1BQU0sZ0NBQWdDLEdB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
|