@git.zone/cli 3.2.1 → 5.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/.smartconfig.json +0 -1
- 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.d.ts +0 -2
- package/dist_ts/helpers.workflow.js +23 -12
- 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.d.ts +3 -3
- package/dist_ts/mod_commit/mod.helpers.js +10 -10
- 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 +23 -24
- 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/helpers.releasebranch.d.ts +46 -0
- package/dist_ts/mod_release/helpers.releasebranch.js +579 -0
- package/dist_ts/mod_release/index.d.ts +10 -0
- package/dist_ts/mod_release/index.js +300 -92
- 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 +144 -41
- package/readme.plan.md +29 -16
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/helpers.smartconfig.ts +63 -10
- package/ts/helpers.workflow.ts +41 -12
- package/ts/mod_commit/mod.helpers.ts +12 -8
- package/ts/mod_config/index.ts +22 -23
- package/ts/mod_docker/classes.dockerpruner.ts +6 -0
- package/ts/mod_release/helpers.releasebranch.ts +1282 -0
- package/ts/mod_release/index.ts +608 -129
- 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,170 @@
|
|
|
1
|
+
import * as plugins from '../dist_ts/plugins.js';
|
|
2
|
+
import { deriveS3BucketName, isValidS3BucketName, } from '../dist_ts/mod_services/classes.serviceconfiguration.js';
|
|
3
|
+
import { withInterProcessLock } from '../dist_ts/mod_services/classes.interprocesslock.js';
|
|
4
|
+
const isPlainObject = (valueArg) => typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg);
|
|
5
|
+
const stringFields = [
|
|
6
|
+
'PROJECT_NAME',
|
|
7
|
+
'MONGODB_HOST',
|
|
8
|
+
'MONGODB_NAME',
|
|
9
|
+
'MONGODB_PORT',
|
|
10
|
+
'MONGODB_USER',
|
|
11
|
+
'MONGODB_PASS',
|
|
12
|
+
'MONGODB_URL',
|
|
13
|
+
'S3_HOST',
|
|
14
|
+
'S3_PORT',
|
|
15
|
+
'S3_UI_PORT',
|
|
16
|
+
'S3_CONSOLE_PORT',
|
|
17
|
+
'S3_ACCESSKEY',
|
|
18
|
+
'S3_SECRETKEY',
|
|
19
|
+
'S3_ADMIN_PASSWORD',
|
|
20
|
+
'S3_REGION',
|
|
21
|
+
'S3_BUCKET',
|
|
22
|
+
'S3_ENDPOINT',
|
|
23
|
+
'ELASTICSEARCH_HOST',
|
|
24
|
+
'ELASTICSEARCH_PORT',
|
|
25
|
+
'ELASTICSEARCH_USER',
|
|
26
|
+
'ELASTICSEARCH_PASS',
|
|
27
|
+
'ELASTICSEARCH_URL',
|
|
28
|
+
];
|
|
29
|
+
const booleanFields = ['MONGODB_AUTH_ENABLED', 'S3_USESSL'];
|
|
30
|
+
const portFields = [
|
|
31
|
+
'MONGODB_PORT',
|
|
32
|
+
'S3_PORT',
|
|
33
|
+
'S3_UI_PORT',
|
|
34
|
+
'S3_CONSOLE_PORT',
|
|
35
|
+
'ELASTICSEARCH_PORT',
|
|
36
|
+
];
|
|
37
|
+
const assertValidPort = (nameArg, valueArg) => {
|
|
38
|
+
if (typeof valueArg !== 'string' || !/^\d{1,5}$/u.test(valueArg)) {
|
|
39
|
+
throw new Error(`Cannot migrate .nogit/env.json: ${nameArg} must be a decimal port string.`);
|
|
40
|
+
}
|
|
41
|
+
const port = Number(valueArg);
|
|
42
|
+
if (!Number.isSafeInteger(port) || port < 1 || port > 65_535) {
|
|
43
|
+
throw new Error(`Cannot migrate .nogit/env.json: ${nameArg} is outside the TCP port range.`);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
/** Validate every known persisted field before a migration is allowed to write. */
|
|
47
|
+
export const assertServiceRuntimeConfigMigrationInput = (configArg) => {
|
|
48
|
+
if (!isPlainObject(configArg)) {
|
|
49
|
+
throw new Error('Cannot migrate .nogit/env.json: root must be a JSON object.');
|
|
50
|
+
}
|
|
51
|
+
for (const field of stringFields) {
|
|
52
|
+
if (Object.hasOwn(configArg, field) &&
|
|
53
|
+
(typeof configArg[field] !== 'string' || !configArg[field].trim())) {
|
|
54
|
+
throw new Error(`Cannot migrate .nogit/env.json: ${field} must be a non-empty string.`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
for (const field of booleanFields) {
|
|
58
|
+
if (Object.hasOwn(configArg, field) && typeof configArg[field] !== 'boolean') {
|
|
59
|
+
throw new Error(`Cannot migrate .nogit/env.json: ${field} must be a boolean.`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
for (const field of portFields) {
|
|
63
|
+
if (Object.hasOwn(configArg, field)) {
|
|
64
|
+
assertValidPort(field, configArg[field]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const s3Port = configArg.S3_PORT;
|
|
68
|
+
const uiPort = configArg.S3_UI_PORT ?? configArg.S3_CONSOLE_PORT;
|
|
69
|
+
if (s3Port !== undefined && uiPort !== undefined && s3Port === uiPort) {
|
|
70
|
+
throw new Error('Cannot migrate .nogit/env.json: S3 API and UI ports must differ.');
|
|
71
|
+
}
|
|
72
|
+
return configArg;
|
|
73
|
+
};
|
|
74
|
+
/** Repair only the exact invalid bucket value generated by older GitZone releases. */
|
|
75
|
+
export const repairLegacyGeneratedS3Bucket = (projectNameArg, bucketArg) => {
|
|
76
|
+
const legacyGeneratedBucket = `${projectNameArg}-documents`;
|
|
77
|
+
if (bucketArg !== legacyGeneratedBucket || isValidS3BucketName(bucketArg)) {
|
|
78
|
+
return { bucket: bucketArg, repaired: false };
|
|
79
|
+
}
|
|
80
|
+
return { bucket: deriveS3BucketName(projectNameArg), repaired: true };
|
|
81
|
+
};
|
|
82
|
+
/** Convert only shipped ObjectStorage predecessor fields and generated values. */
|
|
83
|
+
export const migrateLegacyServiceRuntimeConfigValue = (configArg) => {
|
|
84
|
+
const source = assertServiceRuntimeConfigMigrationInput(configArg);
|
|
85
|
+
const config = { ...source };
|
|
86
|
+
let migrated = false;
|
|
87
|
+
if (Object.hasOwn(config, 'S3_CONSOLE_PORT')) {
|
|
88
|
+
const legacyPort = config.S3_CONSOLE_PORT;
|
|
89
|
+
if (Object.hasOwn(config, 'S3_UI_PORT') && config.S3_UI_PORT !== legacyPort) {
|
|
90
|
+
throw new Error('Cannot migrate .nogit/env.json: S3_CONSOLE_PORT and S3_UI_PORT contain different values. ' +
|
|
91
|
+
'Choose the intended management UI port explicitly, keep it as S3_UI_PORT, and remove S3_CONSOLE_PORT.');
|
|
92
|
+
}
|
|
93
|
+
config.S3_UI_PORT = legacyPort;
|
|
94
|
+
delete config.S3_CONSOLE_PORT;
|
|
95
|
+
migrated = true;
|
|
96
|
+
}
|
|
97
|
+
if (!Object.hasOwn(config, 'S3_ADMIN_PASSWORD')) {
|
|
98
|
+
config.S3_ADMIN_PASSWORD = plugins.crypto.randomBytes(24).toString('base64url');
|
|
99
|
+
migrated = true;
|
|
100
|
+
}
|
|
101
|
+
if (!Object.hasOwn(config, 'S3_REGION')) {
|
|
102
|
+
config.S3_REGION = 'us-east-1';
|
|
103
|
+
migrated = true;
|
|
104
|
+
}
|
|
105
|
+
if (typeof config.PROJECT_NAME === 'string' && typeof config.S3_BUCKET === 'string') {
|
|
106
|
+
const repair = repairLegacyGeneratedS3Bucket(config.PROJECT_NAME, config.S3_BUCKET);
|
|
107
|
+
if (repair.repaired) {
|
|
108
|
+
config.S3_BUCKET = repair.bucket;
|
|
109
|
+
migrated = true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
assertServiceRuntimeConfigMigrationInput(config);
|
|
113
|
+
return { config, migrated };
|
|
114
|
+
};
|
|
115
|
+
const readRuntimeConfig = async (projectPathArg) => {
|
|
116
|
+
const configPath = plugins.path.join(projectPathArg, '.nogit', 'env.json');
|
|
117
|
+
if (!(await plugins.smartfs.file(configPath).exists())) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
const content = (await plugins.smartfs.file(configPath).encoding('utf8').read());
|
|
121
|
+
try {
|
|
122
|
+
return JSON.parse(content);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
throw new Error('Cannot migrate .nogit/env.json: file contains invalid JSON.');
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const writeRuntimeConfigAtomic = async (projectPathArg, configArg) => {
|
|
129
|
+
const configPath = plugins.path.join(projectPathArg, '.nogit', 'env.json');
|
|
130
|
+
const tempPath = `${configPath}.tmp-${process.pid}-${plugins.crypto
|
|
131
|
+
.randomBytes(12)
|
|
132
|
+
.toString('hex')}`;
|
|
133
|
+
try {
|
|
134
|
+
await plugins.fs.writeFile(tempPath, `${JSON.stringify(configArg, null, 2)}\n`, {
|
|
135
|
+
encoding: 'utf8',
|
|
136
|
+
flag: 'wx',
|
|
137
|
+
mode: 0o600,
|
|
138
|
+
});
|
|
139
|
+
await plugins.fs.rename(tempPath, configPath);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
await plugins.fs.rm(tempPath, { force: true }).catch(() => { });
|
|
143
|
+
throw new Error('Cannot migrate .nogit/env.json atomically.', { cause: error });
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
export const preflightServiceRuntimeConfigMigration = async (projectPathArg) => {
|
|
147
|
+
const parsed = await readRuntimeConfig(projectPathArg);
|
|
148
|
+
if (parsed !== undefined) {
|
|
149
|
+
migrateLegacyServiceRuntimeConfigValue(parsed);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
export const runServiceRuntimeConfigMigration = async (projectPathArg) => {
|
|
153
|
+
await preflightServiceRuntimeConfigMigration(projectPathArg);
|
|
154
|
+
const configPath = plugins.path.join(projectPathArg, '.nogit', 'env.json');
|
|
155
|
+
return withInterProcessLock({
|
|
156
|
+
lockPath: `${configPath}.lock`,
|
|
157
|
+
description: 'Service runtime configuration',
|
|
158
|
+
}, async () => {
|
|
159
|
+
const parsed = await readRuntimeConfig(projectPathArg);
|
|
160
|
+
if (parsed === undefined) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
const migration = migrateLegacyServiceRuntimeConfigValue(parsed);
|
|
164
|
+
if (migration.migrated) {
|
|
165
|
+
await writeRuntimeConfigAtomic(projectPathArg, migration.config);
|
|
166
|
+
}
|
|
167
|
+
return migration.migrated;
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDAyLnJ1bnRpbWUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfbWlncmF0aW9uLzAwMi5ydW50aW1lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEdBQ3BCLE1BQU0sb0RBQW9ELENBQUM7QUFDNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFdEYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxRQUFpQixFQUF1QyxFQUFFLENBQy9FLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVoRixNQUFNLFlBQVksR0FBRztJQUNuQixjQUFjO0lBQ2QsY0FBYztJQUNkLGNBQWM7SUFDZCxjQUFjO0lBQ2QsY0FBYztJQUNkLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULFNBQVM7SUFDVCxZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCxjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCxXQUFXO0lBQ1gsYUFBYTtJQUNiLG9CQUFvQjtJQUNwQixvQkFBb0I7SUFDcEIsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixtQkFBbUI7Q0FDWCxDQUFDO0FBRVgsTUFBTSxhQUFhLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxXQUFXLENBQVUsQ0FBQztBQUNyRSxNQUFNLFVBQVUsR0FBRztJQUNqQixjQUFjO0lBQ2QsU0FBUztJQUNULFlBQVk7SUFDWixpQkFBaUI7SUFDakIsb0JBQW9CO0NBQ1osQ0FBQztBQUVYLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBZSxFQUFFLFFBQWlCLEVBQVEsRUFBRTtJQUNuRSxJQUFJLE9BQU8sUUFBUSxLQUFL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
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type IServiceDataMarker } from '../dist_ts/mod_services/classes.servicedatamarker.js';
|
|
2
|
+
export interface IServiceDataMarkerMigrationResult {
|
|
3
|
+
marker?: IServiceDataMarker;
|
|
4
|
+
migrated: boolean;
|
|
5
|
+
}
|
|
6
|
+
/** Convert the exact shipped v1 marker without reinterpreting legacy storage data. */
|
|
7
|
+
export declare const migrateServiceDataMarkerValue: (markerArg: unknown, projectPathArg: string) => IServiceDataMarkerMigrationResult;
|
|
8
|
+
export declare const preflightServiceDataMarkerMigration: (projectPathArg: string) => Promise<IServiceDataMarker | undefined>;
|
|
9
|
+
export declare const runServiceDataMarkerMigration: (projectPathArg: string) => Promise<IServiceDataMarker | undefined>;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import * as plugins from '../dist_ts/plugins.js';
|
|
2
|
+
import { getLegacyMinioDataDirectory, getServiceDataDirectory, getServiceDataMarkerLockPath, getServiceDataMarkerPath, isValidServiceDataMarker, serviceDataMarkerSchemaVersion, serviceDataOwner, } from '../dist_ts/mod_services/classes.servicedatamarker.js';
|
|
3
|
+
import { withInterProcessLock } from '../dist_ts/mod_services/classes.interprocesslock.js';
|
|
4
|
+
const isPlainObject = (valueArg) => typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg);
|
|
5
|
+
const hasOnlyKeys = (valueArg, allowedKeysArg) => Object.keys(valueArg).every((keyArg) => allowedKeysArg.includes(keyArg));
|
|
6
|
+
const isValidServiceDataMarkerV1 = (markerArg) => {
|
|
7
|
+
if (!isPlainObject(markerArg) ||
|
|
8
|
+
!hasOnlyKeys(markerArg, [
|
|
9
|
+
'owner',
|
|
10
|
+
'kind',
|
|
11
|
+
'schemaVersion',
|
|
12
|
+
'projectPath',
|
|
13
|
+
'safeToPrune',
|
|
14
|
+
'createdAt',
|
|
15
|
+
'dataDirectories',
|
|
16
|
+
]) ||
|
|
17
|
+
markerArg.owner !== serviceDataOwner ||
|
|
18
|
+
markerArg.kind !== 'service-data' ||
|
|
19
|
+
markerArg.schemaVersion !== 1 ||
|
|
20
|
+
markerArg.safeToPrune !== true ||
|
|
21
|
+
typeof markerArg.projectPath !== 'string' ||
|
|
22
|
+
!markerArg.projectPath ||
|
|
23
|
+
typeof markerArg.createdAt !== 'string' ||
|
|
24
|
+
!markerArg.createdAt ||
|
|
25
|
+
!Array.isArray(markerArg.dataDirectories)) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const projectPath = plugins.path.resolve(markerArg.projectPath);
|
|
29
|
+
const seenServices = new Set();
|
|
30
|
+
for (const entry of markerArg.dataDirectories) {
|
|
31
|
+
const service = isPlainObject(entry) ? entry.service : undefined;
|
|
32
|
+
if (!isPlainObject(entry) ||
|
|
33
|
+
!hasOnlyKeys(entry, ['service', 'path']) ||
|
|
34
|
+
typeof service !== 'string' ||
|
|
35
|
+
!['mongodb', 'minio', 'elasticsearch'].includes(service) ||
|
|
36
|
+
seenServices.has(service) ||
|
|
37
|
+
typeof entry.path !== 'string') {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const expectedPath = service === 'minio'
|
|
41
|
+
? getLegacyMinioDataDirectory(projectPath)
|
|
42
|
+
: getServiceDataDirectory(projectPath, service);
|
|
43
|
+
if (plugins.path.resolve(entry.path) !== expectedPath) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
seenServices.add(service);
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
};
|
|
50
|
+
/** Convert the exact shipped v1 marker without reinterpreting legacy storage data. */
|
|
51
|
+
export const migrateServiceDataMarkerValue = (markerArg, projectPathArg) => {
|
|
52
|
+
const projectPath = plugins.path.resolve(projectPathArg);
|
|
53
|
+
if (isValidServiceDataMarker(markerArg)) {
|
|
54
|
+
return {
|
|
55
|
+
marker: plugins.path.resolve(markerArg.projectPath) === projectPath ? markerArg : undefined,
|
|
56
|
+
migrated: false,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (!isValidServiceDataMarkerV1(markerArg) ||
|
|
60
|
+
plugins.path.resolve(markerArg.projectPath) !== projectPath) {
|
|
61
|
+
return { migrated: false };
|
|
62
|
+
}
|
|
63
|
+
const dataDirectories = markerArg.dataDirectories
|
|
64
|
+
.filter((entry) => entry.service !== 'minio')
|
|
65
|
+
.map((entry) => ({
|
|
66
|
+
service: entry.service,
|
|
67
|
+
path: plugins.path.resolve(entry.path),
|
|
68
|
+
}))
|
|
69
|
+
.sort((entryA, entryB) => entryA.service.localeCompare(entryB.service));
|
|
70
|
+
const legacyEntry = markerArg.dataDirectories.find((entry) => entry.service === 'minio');
|
|
71
|
+
const marker = {
|
|
72
|
+
owner: serviceDataOwner,
|
|
73
|
+
kind: 'service-data',
|
|
74
|
+
schemaVersion: serviceDataMarkerSchemaVersion,
|
|
75
|
+
projectPath,
|
|
76
|
+
safeToPrune: true,
|
|
77
|
+
createdAt: markerArg.createdAt,
|
|
78
|
+
dataDirectories,
|
|
79
|
+
...(legacyEntry
|
|
80
|
+
? {
|
|
81
|
+
legacyDataDirectories: [
|
|
82
|
+
{
|
|
83
|
+
service: 'minio',
|
|
84
|
+
path: plugins.path.resolve(legacyEntry.path),
|
|
85
|
+
safeToPrune: false,
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
}
|
|
89
|
+
: {}),
|
|
90
|
+
};
|
|
91
|
+
return { marker, migrated: true };
|
|
92
|
+
};
|
|
93
|
+
const readServiceDataMarkerMigrationInput = async (projectPathArg) => {
|
|
94
|
+
const markerPath = getServiceDataMarkerPath(projectPathArg);
|
|
95
|
+
if (!(await plugins.smartfs.file(markerPath).exists())) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
let parsed;
|
|
99
|
+
try {
|
|
100
|
+
const content = (await plugins.smartfs.file(markerPath).encoding('utf8').read());
|
|
101
|
+
parsed = JSON.parse(content);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
throw new Error(`Cannot migrate invalid service data marker: ${markerPath}`);
|
|
105
|
+
}
|
|
106
|
+
return parsed;
|
|
107
|
+
};
|
|
108
|
+
export const preflightServiceDataMarkerMigration = async (projectPathArg) => {
|
|
109
|
+
const markerPath = getServiceDataMarkerPath(projectPathArg);
|
|
110
|
+
const parsed = await readServiceDataMarkerMigrationInput(projectPathArg);
|
|
111
|
+
if (parsed === undefined) {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
const result = migrateServiceDataMarkerValue(parsed, projectPathArg);
|
|
115
|
+
if (!result.marker) {
|
|
116
|
+
throw new Error(`Cannot migrate invalid or foreign service data marker: ${markerPath}`);
|
|
117
|
+
}
|
|
118
|
+
return result.marker;
|
|
119
|
+
};
|
|
120
|
+
export const runServiceDataMarkerMigration = async (projectPathArg) => {
|
|
121
|
+
await preflightServiceDataMarkerMigration(projectPathArg);
|
|
122
|
+
const markerPath = getServiceDataMarkerPath(projectPathArg);
|
|
123
|
+
return withInterProcessLock({
|
|
124
|
+
lockPath: getServiceDataMarkerLockPath(projectPathArg),
|
|
125
|
+
description: 'Service data marker',
|
|
126
|
+
}, async () => {
|
|
127
|
+
const parsed = await readServiceDataMarkerMigrationInput(projectPathArg);
|
|
128
|
+
if (parsed === undefined) {
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
const result = migrateServiceDataMarkerValue(parsed, projectPathArg);
|
|
132
|
+
if (!result.marker) {
|
|
133
|
+
throw new Error(`Cannot migrate invalid or foreign service data marker: ${markerPath}`);
|
|
134
|
+
}
|
|
135
|
+
if (result.migrated) {
|
|
136
|
+
const tempPath = `${markerPath}.tmp-${process.pid}-${plugins.crypto
|
|
137
|
+
.randomBytes(12)
|
|
138
|
+
.toString('hex')}`;
|
|
139
|
+
try {
|
|
140
|
+
await plugins.fs.writeFile(tempPath, `${JSON.stringify(result.marker, null, 2)}\n`, {
|
|
141
|
+
encoding: 'utf8',
|
|
142
|
+
flag: 'wx',
|
|
143
|
+
});
|
|
144
|
+
await plugins.fs.rename(tempPath, markerPath);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
await plugins.fs.rm(tempPath, { force: true }).catch(() => { });
|
|
148
|
+
throw new Error(`Cannot migrate service data marker atomically: ${markerPath}`, {
|
|
149
|
+
cause: error,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return result.marker;
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDAzLnNlcnZpY2UtZGF0YS1tYXJrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb24vMDAzLnNlcnZpY2UtZGF0YS1tYXJrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUN2Qiw0QkFBNEIsRUFDNUIsd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN4Qiw4QkFBOEIsRUFDOUIsZ0JBQWdCLEdBS2pCLE1BQU0saURBQWlELENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFldEYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxRQUFpQixFQUF1QyxFQUFFLENBQy9FLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVoRixNQUFNLFdBQVcsR0FBRyxDQUNsQixRQUFpQyxFQUNqQyxjQUFpQyxFQUN4QixFQUFFLENBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUUzRSxNQUFNLDBCQUEwQixHQUFHLENBQUMsU0FBa0IsRUFBcUMsRUFBRTtJQUMzRixJQUNFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztRQUN6QixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7WUFDdEIsT0FBTztZQUNQLE1BQU07WUFDTixlQUFlO1lBQ2YsYUFBYTtZQUNiLGFBQWE7WUFDYixXQUFXO1lBQ1gsaUJBQWlCO1NBQ2xCLENBQUM7UUFDRixTQUFTLENBQUMsS0FBSyxLQUFLLGdCQUFnQjtRQUNwQyxTQUFTLENB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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type IGlobalRegistryTransactionResult, type IGlobalRegistryData } from '../dist_ts/mod_services/classes.globalregistrystore.js';
|
|
2
|
+
export interface IGlobalRegistryMigrationResult {
|
|
3
|
+
data: IGlobalRegistryData;
|
|
4
|
+
migrated: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface IGlobalRegistryMigrationStore {
|
|
7
|
+
readRaw(): Promise<unknown>;
|
|
8
|
+
transact<T>(operationArg: (rawDataArg: unknown) => Promise<IGlobalRegistryTransactionResult<T>> | IGlobalRegistryTransactionResult<T>): Promise<T>;
|
|
9
|
+
}
|
|
10
|
+
/** Convert the exact legacy registry fields without activating old provider resources. */
|
|
11
|
+
export declare const migrateLegacyGlobalRegistryData: (dataArg: unknown) => IGlobalRegistryMigrationResult;
|
|
12
|
+
export declare const preflightGlobalRegistryMigration: (storeArg?: IGlobalRegistryMigrationStore) => Promise<IGlobalRegistryData>;
|
|
13
|
+
export declare const runGlobalRegistryMigration: (storeArg?: IGlobalRegistryMigrationStore) => Promise<IGlobalRegistryData>;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import * as plugins from '../dist_ts/plugins.js';
|
|
2
|
+
import { migratePersistedServiceNamesValue } from './001.service-selection.js';
|
|
3
|
+
import { GlobalRegistryStore, } from '../dist_ts/mod_services/classes.globalregistrystore.js';
|
|
4
|
+
const isPlainObject = (valueArg) => typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg);
|
|
5
|
+
const assertAllowedKeys = (valueArg, allowedKeysArg, contextArg) => {
|
|
6
|
+
if (Object.keys(valueArg).some((keyArg) => !allowedKeysArg.includes(keyArg))) {
|
|
7
|
+
throw new Error(`Cannot migrate global services registry: ${contextArg} contains unsupported fields.`);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
const assertOptionalStrings = (valueArg, keysArg, contextArg) => {
|
|
11
|
+
for (const key of keysArg) {
|
|
12
|
+
if (valueArg[key] !== undefined && (typeof valueArg[key] !== 'string' || !valueArg[key])) {
|
|
13
|
+
throw new Error(`Cannot migrate global services registry: ${contextArg}.${key} must be a non-empty string.`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const assertOptionalNumbers = (valueArg, keysArg, contextArg) => {
|
|
18
|
+
for (const key of keysArg) {
|
|
19
|
+
if (valueArg[key] !== undefined && !Number.isFinite(valueArg[key])) {
|
|
20
|
+
throw new Error(`Cannot migrate global services registry: ${contextArg}.${key} must be a finite number.`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
/** Convert the exact legacy registry fields without activating old provider resources. */
|
|
25
|
+
export const migrateLegacyGlobalRegistryData = (dataArg) => {
|
|
26
|
+
if (!isPlainObject(dataArg)) {
|
|
27
|
+
throw new Error('Cannot migrate global services registry: root must be a JSON object.');
|
|
28
|
+
}
|
|
29
|
+
const source = dataArg;
|
|
30
|
+
assertAllowedKeys(source, ['schemaVersion', 'projects'], 'root');
|
|
31
|
+
if (source.schemaVersion !== undefined && source.schemaVersion !== 2) {
|
|
32
|
+
throw new Error('Cannot migrate global services registry: unsupported schema version.');
|
|
33
|
+
}
|
|
34
|
+
if (source.projects === undefined) {
|
|
35
|
+
if (source.schemaVersion === 2) {
|
|
36
|
+
throw new Error('Cannot migrate global services registry: projects map is missing.');
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
data: { schemaVersion: 2, projects: {} },
|
|
40
|
+
migrated: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (!isPlainObject(source.projects)) {
|
|
44
|
+
throw new Error('Cannot migrate global services registry: projects must be a JSON object.');
|
|
45
|
+
}
|
|
46
|
+
let migrated = source.schemaVersion !== 2;
|
|
47
|
+
const projects = {};
|
|
48
|
+
for (const [projectPath, rawProject] of Object.entries(source.projects)) {
|
|
49
|
+
if (!isPlainObject(rawProject)) {
|
|
50
|
+
throw new Error(`Cannot migrate global services registry for ${projectPath}: project must be a JSON object.`);
|
|
51
|
+
}
|
|
52
|
+
assertAllowedKeys(rawProject, [
|
|
53
|
+
'projectPath',
|
|
54
|
+
'projectName',
|
|
55
|
+
'containers',
|
|
56
|
+
'ports',
|
|
57
|
+
'legacy',
|
|
58
|
+
'enabledServices',
|
|
59
|
+
'lastActive',
|
|
60
|
+
], `project ${projectPath}`);
|
|
61
|
+
if (typeof rawProject.projectPath !== 'string' ||
|
|
62
|
+
!rawProject.projectPath ||
|
|
63
|
+
plugins.path.resolve(rawProject.projectPath) !== plugins.path.resolve(projectPath)) {
|
|
64
|
+
throw new Error(`Cannot migrate global services registry for ${projectPath}: project path is invalid or inconsistent.`);
|
|
65
|
+
}
|
|
66
|
+
if (typeof rawProject.projectName !== 'string' || !rawProject.projectName) {
|
|
67
|
+
throw new Error(`Cannot migrate global services registry for ${projectPath}: project name is invalid.`);
|
|
68
|
+
}
|
|
69
|
+
if (!isPlainObject(rawProject.containers) || !isPlainObject(rawProject.ports)) {
|
|
70
|
+
throw new Error(`Cannot migrate global services registry for ${projectPath}: containers and ports must be JSON objects.`);
|
|
71
|
+
}
|
|
72
|
+
if (!Array.isArray(rawProject.enabledServices)) {
|
|
73
|
+
throw new Error(`Cannot migrate global services registry for ${projectPath}: enabledServices must be an array.`);
|
|
74
|
+
}
|
|
75
|
+
if (typeof rawProject.lastActive !== 'number' ||
|
|
76
|
+
!Number.isFinite(rawProject.lastActive)) {
|
|
77
|
+
throw new Error(`Cannot migrate global services registry for ${projectPath}: lastActive must be a finite number.`);
|
|
78
|
+
}
|
|
79
|
+
const rawContainers = rawProject.containers;
|
|
80
|
+
const rawPorts = rawProject.ports;
|
|
81
|
+
assertAllowedKeys(rawContainers, ['mongo', 'minio', 'objectstorage', 'elasticsearch'], `project ${projectPath} containers`);
|
|
82
|
+
assertOptionalStrings(rawContainers, ['mongo', 'minio', 'objectstorage', 'elasticsearch'], `project ${projectPath}.containers`);
|
|
83
|
+
assertAllowedKeys(rawPorts, ['mongo', 's3', 's3Console', 's3Ui', 'elasticsearch'], `project ${projectPath} ports`);
|
|
84
|
+
assertOptionalNumbers(rawPorts, ['mongo', 's3', 's3Console', 's3Ui', 'elasticsearch'], `project ${projectPath}.ports`);
|
|
85
|
+
let rawLegacy = {};
|
|
86
|
+
if (rawProject.legacy !== undefined) {
|
|
87
|
+
if (!isPlainObject(rawProject.legacy)) {
|
|
88
|
+
throw new Error(`Cannot migrate global services registry for ${projectPath}: legacy must be a JSON object.`);
|
|
89
|
+
}
|
|
90
|
+
rawLegacy = rawProject.legacy;
|
|
91
|
+
assertAllowedKeys(rawLegacy, ['minioContainer'], `project ${projectPath} legacy`);
|
|
92
|
+
assertOptionalStrings(rawLegacy, ['minioContainer'], `project ${projectPath}.legacy`);
|
|
93
|
+
if (!rawLegacy.minioContainer) {
|
|
94
|
+
throw new Error(`Cannot migrate global services registry for ${projectPath}: empty legacy evidence is invalid.`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (rawLegacy.minioContainer !== undefined &&
|
|
98
|
+
rawContainers.minio !== undefined &&
|
|
99
|
+
rawLegacy.minioContainer !== rawContainers.minio) {
|
|
100
|
+
throw new Error(`Cannot migrate global services registry for ${projectPath}: legacy MinIO references differ.`);
|
|
101
|
+
}
|
|
102
|
+
const minioContainer = typeof rawLegacy.minioContainer === 'string'
|
|
103
|
+
? rawLegacy.minioContainer
|
|
104
|
+
: typeof rawContainers.minio === 'string'
|
|
105
|
+
? rawContainers.minio
|
|
106
|
+
: undefined;
|
|
107
|
+
if (typeof rawContainers.minio === 'string') {
|
|
108
|
+
migrated = true;
|
|
109
|
+
}
|
|
110
|
+
if (rawPorts.s3Ui !== undefined &&
|
|
111
|
+
rawPorts.s3Console !== undefined &&
|
|
112
|
+
rawPorts.s3Ui !== rawPorts.s3Console) {
|
|
113
|
+
throw new Error(`Cannot migrate global services registry for ${projectPath}: s3Ui and s3Console differ.`);
|
|
114
|
+
}
|
|
115
|
+
if (rawPorts.s3Console !== undefined) {
|
|
116
|
+
migrated = true;
|
|
117
|
+
}
|
|
118
|
+
const s3UiPort = rawPorts.s3Ui ?? rawPorts.s3Console;
|
|
119
|
+
const serviceMigration = migratePersistedServiceNamesValue(rawProject.enabledServices);
|
|
120
|
+
migrated ||= serviceMigration.migrated;
|
|
121
|
+
projects[projectPath] = {
|
|
122
|
+
projectPath: rawProject.projectPath,
|
|
123
|
+
projectName: rawProject.projectName,
|
|
124
|
+
containers: {
|
|
125
|
+
...(typeof rawContainers.mongo === 'string' ? { mongo: rawContainers.mongo } : {}),
|
|
126
|
+
...(typeof rawContainers.objectstorage === 'string'
|
|
127
|
+
? { objectstorage: rawContainers.objectstorage }
|
|
128
|
+
: {}),
|
|
129
|
+
...(typeof rawContainers.elasticsearch === 'string'
|
|
130
|
+
? { elasticsearch: rawContainers.elasticsearch }
|
|
131
|
+
: {}),
|
|
132
|
+
},
|
|
133
|
+
ports: {
|
|
134
|
+
...(typeof rawPorts.mongo === 'number' ? { mongo: rawPorts.mongo } : {}),
|
|
135
|
+
...(typeof rawPorts.s3 === 'number' ? { s3: rawPorts.s3 } : {}),
|
|
136
|
+
...(typeof s3UiPort === 'number' ? { s3Ui: s3UiPort } : {}),
|
|
137
|
+
...(typeof rawPorts.elasticsearch === 'number'
|
|
138
|
+
? { elasticsearch: rawPorts.elasticsearch }
|
|
139
|
+
: {}),
|
|
140
|
+
},
|
|
141
|
+
...(minioContainer ? { legacy: { minioContainer } } : {}),
|
|
142
|
+
enabledServices: serviceMigration.services,
|
|
143
|
+
lastActive: rawProject.lastActive,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
data: { schemaVersion: 2, projects },
|
|
148
|
+
migrated,
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
const createDefaultStore = () => new GlobalRegistryStore();
|
|
152
|
+
export const preflightGlobalRegistryMigration = async (storeArg = createDefaultStore()) => {
|
|
153
|
+
return migrateLegacyGlobalRegistryData(await storeArg.readRaw()).data;
|
|
154
|
+
};
|
|
155
|
+
export const runGlobalRegistryMigration = async (storeArg = createDefaultStore()) => {
|
|
156
|
+
await preflightGlobalRegistryMigration(storeArg);
|
|
157
|
+
return storeArg.transact((rawData) => {
|
|
158
|
+
const migration = migrateLegacyGlobalRegistryData(rawData);
|
|
159
|
+
return {
|
|
160
|
+
result: migration.data,
|
|
161
|
+
...(migration.migrated ? { writeData: migration.data } : {}),
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDA0Lmdsb2JhbC1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX21pZ3JhdGlvbi8wMDQuZ2xvYmFsLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0UsT0FBTyxFQUNMLG1CQUFtQixHQUlwQixNQUFNLG1EQUFtRCxDQUFDO0FBZ0IzRCxNQUFNLGFBQWEsR0FBRyxDQUFDLFFBQWlCLEVBQXVDLEVBQUUsQ0FDL0UsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRWhGLE1BQU0saUJBQWlCLEdBQUcsQ0FDeEIsUUFBaUMsRUFDakMsY0FBaUMsRUFDakMsVUFBa0IsRUFDWixFQUFFO0lBQ1IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RSxNQUFNLElBQUksS0FBSyxDQUNiLDRDQUE0QyxVQUFVLCtCQUErQixDQUN0RixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0scUJBQXFCLEdBQUcsQ0FDNUIsUUFBaUMsRUFDakMsT0FBMEIsRUFDMUIsVUFBa0IsRUFDWixFQUFFO0lBQ1IsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMxQixJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsR0FB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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type TServiceMigrationScope = 'global-registry' | 'service-selection' | 'runtime-config' | 'service-data-marker';
|
|
2
|
+
export interface IServiceMigrationRunOptions {
|
|
3
|
+
projectPath?: string;
|
|
4
|
+
scopes: readonly TServiceMigrationScope[];
|
|
5
|
+
}
|
|
6
|
+
/** Run only the persisted-state migrations required by one command profile. */
|
|
7
|
+
export declare const runServiceMigrations: (optionsArg: IServiceMigrationRunOptions) => Promise<void>;
|
|
8
|
+
export * from './001.service-selection.js';
|
|
9
|
+
export * from './002.runtime-config.js';
|
|
10
|
+
export * from './003.service-data-marker.js';
|
|
11
|
+
export * from './004.global-registry.js';
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { preflightServiceSelectionMigration, runServiceSelectionMigration, } from './001.service-selection.js';
|
|
2
|
+
import { preflightServiceRuntimeConfigMigration, runServiceRuntimeConfigMigration, } from './002.runtime-config.js';
|
|
3
|
+
import { preflightServiceDataMarkerMigration, runServiceDataMarkerMigration, } from './003.service-data-marker.js';
|
|
4
|
+
import { preflightGlobalRegistryMigration, runGlobalRegistryMigration, } from './004.global-registry.js';
|
|
5
|
+
const migrationOrder = [
|
|
6
|
+
'global-registry',
|
|
7
|
+
'service-selection',
|
|
8
|
+
'runtime-config',
|
|
9
|
+
'service-data-marker',
|
|
10
|
+
];
|
|
11
|
+
/** Run only the persisted-state migrations required by one command profile. */
|
|
12
|
+
export const runServiceMigrations = async (optionsArg) => {
|
|
13
|
+
const scopes = new Set(optionsArg.scopes);
|
|
14
|
+
const needsProjectPath = [...scopes].some((scopeArg) => scopeArg !== 'global-registry');
|
|
15
|
+
if (needsProjectPath && !optionsArg.projectPath) {
|
|
16
|
+
throw new Error('Project-scoped service migrations require a project path.');
|
|
17
|
+
}
|
|
18
|
+
// Validate every selected store before the first migration is allowed to write.
|
|
19
|
+
for (const scope of migrationOrder) {
|
|
20
|
+
if (!scopes.has(scope)) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (scope === 'global-registry') {
|
|
24
|
+
await preflightGlobalRegistryMigration();
|
|
25
|
+
}
|
|
26
|
+
else if (scope === 'service-selection') {
|
|
27
|
+
await preflightServiceSelectionMigration(optionsArg.projectPath);
|
|
28
|
+
}
|
|
29
|
+
else if (scope === 'runtime-config') {
|
|
30
|
+
await preflightServiceRuntimeConfigMigration(optionsArg.projectPath);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
await preflightServiceDataMarkerMigration(optionsArg.projectPath);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
for (const scope of migrationOrder) {
|
|
37
|
+
if (!scopes.has(scope)) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (scope === 'global-registry') {
|
|
41
|
+
await runGlobalRegistryMigration();
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (scope === 'service-selection') {
|
|
45
|
+
await runServiceSelectionMigration(optionsArg.projectPath);
|
|
46
|
+
}
|
|
47
|
+
else if (scope === 'runtime-config') {
|
|
48
|
+
await runServiceRuntimeConfigMigration(optionsArg.projectPath);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
await runServiceDataMarkerMigration(optionsArg.projectPath);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
export * from './001.service-selection.js';
|
|
56
|
+
export * from './002.runtime-config.js';
|
|
57
|
+
export * from './003.service-data-marker.js';
|
|
58
|
+
export * from './004.global-registry.js';
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGtDQUFrQyxFQUNsQyw0QkFBNEIsR0FDN0IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsc0NBQXNDLEVBQ3RDLGdDQUFnQyxHQUNqQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxtQ0FBbUMsRUFDbkMsNkJBQTZCLEdBQzlCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUNMLGdDQUFnQyxFQUNoQywwQkFBMEIsR0FDM0IsTUFBTSwwQkFBMEIsQ0FBQztBQWFsQyxNQUFNLGNBQWMsR0FBNkI7SUFDL0MsaUJBQWlCO0lBQ2pCLG1CQUFtQjtJQUNuQixnQkFBZ0I7SUFDaEIscUJBQXFCO0NBQ3RCLENBQUM7QUFFRiwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUN2QyxVQUF1QyxFQUN4QixFQUFFO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsS0FBSyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hGLElBQUksZ0JBQWdCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxnRkFBZ0Y7SUFDaEYsS0FBSyxNQUFNLEtBQUssSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxLQUFLLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztZQUNoQyxNQUFNLGdDQUFnQyxFQUFFLENBQUM7UUFDM0MsQ0FBQzthQUFNLElBQUksS0FBSyxLQUFLLG1CQUFtQixFQUFFLENBQUM7WUFDekMsTUFBTSxrQ0FBa0MsQ0FBQyxVQUFVLENBQUMsV0FBWSxDQUFDLENBQUM7UUFDcEUsQ0FBQzthQUFNLElBQUksS0FBSyxLQUFLLGdCQUFnQixFQUFFLENBQUM7WUFDdEMsTUFBTSxzQ0FBc0MsQ0FBQyxVQUFVLENBQUMsV0FBWSxDQUFDLENBQUM7UUFDeEUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLG1DQUFtQyxDQUFDLFVBQVUsQ0FBQyxXQUFZLENBQUMsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxLQUFLLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksS0FBSyxLQUFLLGlCQUFpQixFQUFFLENBQUM7WUFDaEMsTUFBTSwwQkFBMEIsRUFBRSxDQUFDO1lBQ25DLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxLQUFLLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztZQUNsQyxNQUFNLDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxXQUFZLENBQUMsQ0FBQztRQUM5RCxDQUFDO2FBQU0sSUFBSSxLQUFLLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztZQUN0QyxNQUFNLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxXQUFZLENBQUMsQ0FBQztRQUNsRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sNkJBQTZCLENBQUMsVUFBVSxDQUFDLFdBQVksQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYywwQkFBMEIsQ0FBQyJ9
|