@zlooks.cn/cli 1.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.
Files changed (81) hide show
  1. package/dist/command/index.d.ts +3 -0
  2. package/dist/command/index.d.ts.map +1 -0
  3. package/dist/command/index.js +145 -0
  4. package/dist/command/index.js.map +1 -0
  5. package/dist/deploy.d.ts +35 -0
  6. package/dist/deploy.d.ts.map +1 -0
  7. package/dist/deploy.js +312 -0
  8. package/dist/deploy.js.map +1 -0
  9. package/dist/deployment.d.ts +18 -0
  10. package/dist/deployment.d.ts.map +1 -0
  11. package/dist/deployment.js +26 -0
  12. package/dist/deployment.js.map +1 -0
  13. package/dist/doctor.d.ts +24 -0
  14. package/dist/doctor.d.ts.map +1 -0
  15. package/dist/doctor.js +78 -0
  16. package/dist/doctor.js.map +1 -0
  17. package/dist/export/export-operation.d.ts +34 -0
  18. package/dist/export/export-operation.d.ts.map +1 -0
  19. package/dist/export/export-operation.js +69 -0
  20. package/dist/export/export-operation.js.map +1 -0
  21. package/dist/export/legacy-export.d.ts +129 -0
  22. package/dist/export/legacy-export.d.ts.map +1 -0
  23. package/dist/export/legacy-export.js +334 -0
  24. package/dist/export/legacy-export.js.map +1 -0
  25. package/dist/export/legacy-source.d.ts +16 -0
  26. package/dist/export/legacy-source.d.ts.map +1 -0
  27. package/dist/export/legacy-source.js +164 -0
  28. package/dist/export/legacy-source.js.map +1 -0
  29. package/dist/global-packages.d.ts +24 -0
  30. package/dist/global-packages.d.ts.map +1 -0
  31. package/dist/global-packages.js +89 -0
  32. package/dist/global-packages.js.map +1 -0
  33. package/dist/import/import-operation.d.ts +6 -0
  34. package/dist/import/import-operation.d.ts.map +1 -0
  35. package/dist/import/import-operation.js +16 -0
  36. package/dist/import/import-operation.js.map +1 -0
  37. package/dist/npm-registry.d.ts +11 -0
  38. package/dist/npm-registry.d.ts.map +1 -0
  39. package/dist/npm-registry.js +20 -0
  40. package/dist/npm-registry.js.map +1 -0
  41. package/dist/operations.d.ts +33 -0
  42. package/dist/operations.d.ts.map +1 -0
  43. package/dist/operations.js +270 -0
  44. package/dist/operations.js.map +1 -0
  45. package/dist/package-manifest.d.ts +16 -0
  46. package/dist/package-manifest.d.ts.map +1 -0
  47. package/dist/package-manifest.js +72 -0
  48. package/dist/package-manifest.js.map +1 -0
  49. package/dist/package-updates.d.ts +13 -0
  50. package/dist/package-updates.d.ts.map +1 -0
  51. package/dist/package-updates.js +41 -0
  52. package/dist/package-updates.js.map +1 -0
  53. package/dist/pm2.d.ts +28 -0
  54. package/dist/pm2.d.ts.map +1 -0
  55. package/dist/pm2.js +72 -0
  56. package/dist/pm2.js.map +1 -0
  57. package/dist/prompt.d.ts +49 -0
  58. package/dist/prompt.d.ts.map +1 -0
  59. package/dist/prompt.js +25 -0
  60. package/dist/prompt.js.map +1 -0
  61. package/dist/release-environment.d.ts +6 -0
  62. package/dist/release-environment.d.ts.map +1 -0
  63. package/dist/release-environment.js +19 -0
  64. package/dist/release-environment.js.map +1 -0
  65. package/dist/service-catalog.d.ts +10 -0
  66. package/dist/service-catalog.d.ts.map +1 -0
  67. package/dist/service-catalog.js +28 -0
  68. package/dist/service-catalog.js.map +1 -0
  69. package/dist/setup.d.ts +39 -0
  70. package/dist/setup.d.ts.map +1 -0
  71. package/dist/setup.js +413 -0
  72. package/dist/setup.js.map +1 -0
  73. package/dist/system.d.ts +5 -0
  74. package/dist/system.d.ts.map +1 -0
  75. package/dist/system.js +11 -0
  76. package/dist/system.js.map +1 -0
  77. package/dist/topology.d.ts +11 -0
  78. package/dist/topology.d.ts.map +1 -0
  79. package/dist/topology.js +78 -0
  80. package/dist/topology.js.map +1 -0
  81. package/package.json +51 -0
@@ -0,0 +1,270 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { restartServices } from './deployment.js';
4
+ import { installGlobalPackage, listGlobalZlooksPackages, packageNameFromSpec, parsePackageInstallRequest, uninstallGlobalPackage, } from './global-packages.js';
5
+ import { loadActiveNpmRegistry } from './npm-registry.js';
6
+ import { createPackageVersionPlan, resolvePublishedVersion, } from './package-updates.js';
7
+ import { deletePm2Service, listManagedProcesses, startPm2Service, stopPm2Service, } from './pm2.js';
8
+ import { SERVICES } from './service-catalog.js';
9
+ import { loadZlooksEnvironment, releaseTagForEnvironment } from './release-environment.js';
10
+ import { planTopology, trimTopologyDependencies } from './topology.js';
11
+ export async function installOperation(packageSpec, options, runtime) {
12
+ const installedBefore = listGlobalZlooksPackages(runtime.npm);
13
+ const managedBefore = listManagedProcesses(runtime.pm2);
14
+ const specs = packageSpec ? [packageSpec] : await runtime.selectMany('Select built-in services to install:', SERVICES.map((service) => ({
15
+ name: service.packageName,
16
+ detail: describeState(service.packageName, installedBefore, managedBefore),
17
+ })));
18
+ if (specs.length === 0)
19
+ return;
20
+ const envFile = resolve(runtime.cwd, options.env);
21
+ const activeRegistry = loadActiveNpmRegistry(envFile);
22
+ const environment = loadZlooksEnvironment(envFile);
23
+ const tag = releaseTagForEnvironment(environment);
24
+ const installedByName = new Map(installedBefore.map((manifest) => [manifest.name, manifest]));
25
+ const plans = specs.map((spec) => {
26
+ const request = parsePackageInstallRequest(spec);
27
+ const target = request.version
28
+ ?? resolvePublishedVersion(request.name, tag, activeRegistry, runtime.npm);
29
+ return createPackageVersionPlan(request.name, installedByName.get(request.name)?.version, target);
30
+ });
31
+ renderVersionPlan(environment, tag, plans, runtime);
32
+ assertNoDowngrades(plans);
33
+ const changes = plans.filter((plan) => plan.action === 'install' || plan.action === 'upgrade');
34
+ if (changes.length === 0) {
35
+ runtime.write('No package installation or update is required.\n');
36
+ }
37
+ else if (!await runtime.confirm(`Confirm installations or upgrades for ${changes.length} package${changes.length === 1 ? '' : 's'}?`, false)) {
38
+ runtime.write('Package installation cancelled.\n');
39
+ return;
40
+ }
41
+ else {
42
+ for (const plan of changes) {
43
+ installGlobalPackage(`${plan.name}@${plan.targetVersion}`, activeRegistry, runtime.npm);
44
+ }
45
+ }
46
+ const installed = changes.length === 0 ? installedBefore : listGlobalZlooksPackages(runtime.npm);
47
+ const selected = plans.map((plan) => requireInstalledVersion(plan, installed));
48
+ const shouldStart = options.start === true
49
+ || (options.skipStart !== true && await runtime.confirm('Start installed services now?', true));
50
+ if (!shouldStart)
51
+ return;
52
+ if (!existsSync(envFile)) {
53
+ throw new Error(`Environment file not found: ${envFile}. Run zlooks setup first.`);
54
+ }
55
+ await startInstalledClosure(selected, installed, listManagedProcesses(runtime.pm2), envFile, runtime);
56
+ }
57
+ export async function uninstallOperation(packageName, yes, runtime) {
58
+ const installed = listGlobalZlooksPackages(runtime.npm, { allowExecutableCollisions: true });
59
+ const selectedNames = packageName ? [packageNameFromSpec(packageName)] : await runtime.selectMany('Select installed Zlooks services to uninstall:', installed.map((manifest) => ({ name: manifest.name, detail: `${manifest.version}\t${manifest.kind}` })));
60
+ if (selectedNames.length === 0)
61
+ return;
62
+ const selectedSet = new Set(selectedNames);
63
+ const managed = listManagedProcesses(runtime.pm2);
64
+ const managedByName = new Map(managed.map((process) => [process.name, process]));
65
+ const managedManifests = managed.map((process) => requireInstalled(process.name, installed));
66
+ for (const manifest of managedManifests) {
67
+ const removedDependency = manifest.dependsOn.find((dependency) => selectedSet.has(dependency));
68
+ if (!selectedSet.has(manifest.name) && removedDependency) {
69
+ throw new Error(`${manifest.name} still depends on ${removedDependency}`);
70
+ }
71
+ }
72
+ const selected = selectedNames.map((name) => requireInstalled(name, installed));
73
+ const confirmed = yes || await runtime.confirm('Uninstall selected services? Running services will be stopped and removed.', false);
74
+ if (!confirmed)
75
+ return;
76
+ const plan = planTopology(selected.map((manifest) => ({
77
+ ...manifest,
78
+ dependsOn: manifest.dependsOn.filter((dependency) => selectedSet.has(dependency)),
79
+ })));
80
+ for (const manifest of plan.stop) {
81
+ const process = managedByName.get(manifest.name);
82
+ if (process) {
83
+ stopPm2Service(process.pmId, runtime.pm2);
84
+ deletePm2Service(process.pmId, runtime.pm2);
85
+ }
86
+ uninstallGlobalPackage(manifest.name, runtime.npm);
87
+ }
88
+ }
89
+ export async function stopOperation(runtime) {
90
+ const processes = listManagedProcesses(runtime.pm2);
91
+ const installed = listGlobalZlooksPackages(runtime.npm, { allowExecutableCollisions: true });
92
+ const byName = new Map(processes.map((process) => [process.name, process]));
93
+ const installedByName = new Map(installed.map((manifest) => [manifest.name, manifest]));
94
+ const manifests = trimTopologyDependencies(processes.flatMap((process) => {
95
+ const manifest = installedByName.get(process.name);
96
+ return manifest ? [manifest] : [];
97
+ }));
98
+ const plan = planTopology(manifests);
99
+ for (const manifest of plan.stop)
100
+ stopPm2Service(byName.get(manifest.name).pmId, runtime.pm2);
101
+ const plannedNames = new Set(manifests.map((manifest) => manifest.name));
102
+ for (const process of processes.filter((item) => !plannedNames.has(item.name))) {
103
+ stopPm2Service(process.pmId, runtime.pm2);
104
+ }
105
+ }
106
+ export async function restartOperation(runtime) {
107
+ const { processes, manifests } = loadManagedManifests(runtime);
108
+ const byName = new Map(processes.map((process) => [process.name, process]));
109
+ const results = await restartServices(manifests, {
110
+ stop: async (name) => {
111
+ const pmId = byName.get(name).pmId;
112
+ stopPm2Service(pmId, runtime.pm2);
113
+ deletePm2Service(pmId, runtime.pm2);
114
+ },
115
+ start: async (_name, manifest) => startPm2Service(manifest, runtime.environmentFile, runtime.pm2),
116
+ });
117
+ reportResults(results, runtime);
118
+ }
119
+ export async function updateOperation(runtime) {
120
+ const { manifests } = loadManagedManifests(runtime);
121
+ if (manifests.length === 0)
122
+ return;
123
+ const plan = planTopology(manifests);
124
+ const activeRegistry = loadActiveNpmRegistry(runtime.environmentFile);
125
+ const environment = loadZlooksEnvironment(runtime.environmentFile);
126
+ const tag = releaseTagForEnvironment(environment);
127
+ const versions = plan.start.map((manifest) => createPackageVersionPlan(manifest.name, manifest.version, resolvePublishedVersion(manifest.name, tag, activeRegistry, runtime.npm)));
128
+ renderVersionPlan(environment, tag, versions, runtime);
129
+ assertNoDowngrades(versions);
130
+ const upgrades = versions.filter((version) => version.action === 'upgrade');
131
+ if (upgrades.length === 0) {
132
+ runtime.write('No package updates are available.\n');
133
+ return;
134
+ }
135
+ if (!await runtime.confirm(`Confirm updates for ${upgrades.length} package${upgrades.length === 1 ? '' : 's'}?`, false)) {
136
+ runtime.write('Package update cancelled.\n');
137
+ return;
138
+ }
139
+ for (const version of upgrades) {
140
+ installGlobalPackage(`${version.name}@${version.targetVersion}`, activeRegistry, runtime.npm);
141
+ }
142
+ const installed = listGlobalZlooksPackages(runtime.npm);
143
+ for (const version of upgrades)
144
+ requireInstalledVersion(version, installed);
145
+ }
146
+ export async function databaseOperation(operation, packageName, options, runtime) {
147
+ const installed = listGlobalZlooksPackages(runtime.npm);
148
+ const processes = listManagedProcesses(runtime.pm2);
149
+ const installedByName = new Map(installed.map((manifest) => [manifest.name, manifest]));
150
+ let manifests;
151
+ if (packageName) {
152
+ if (!processes.some((process) => process.name === packageName)) {
153
+ throw new Error(`PM2-managed Zlooks package not found: ${packageName}`);
154
+ }
155
+ const selected = requireInstalled(packageName, installed);
156
+ if (!selected.databaseCommands.includes(operation)) {
157
+ throw new Error(`${selected.name} does not support db ${operation}`);
158
+ }
159
+ manifests = [selected];
160
+ }
161
+ else {
162
+ const managed = planTopology(trimTopologyDependencies(processes.flatMap((process) => {
163
+ const manifest = installedByName.get(process.name);
164
+ return manifest ? [manifest] : [];
165
+ }))).start;
166
+ const capable = managed.filter((manifest) => manifest.databaseCommands.includes(operation));
167
+ if (capable.length === 0) {
168
+ runtime.write(`No PM2-managed packages support db ${operation}.\n`);
169
+ return;
170
+ }
171
+ const selected = new Set(await runtime.selectMany(`Select PM2-managed packages for db ${operation} (press a to select all):`, capable.map((manifest) => ({
172
+ name: manifest.name,
173
+ detail: `${manifest.version}\t${manifest.description}`,
174
+ }))));
175
+ manifests = capable.filter((manifest) => selected.has(manifest.name));
176
+ }
177
+ const envFile = resolve(runtime.cwd, options.env);
178
+ for (const manifest of manifests) {
179
+ runtime.write(`RUN\t${manifest.name}\tdb ${operation}\n`);
180
+ runtime.service.exec(manifest.bin, ['db', operation, `--env=${envFile}`]);
181
+ runtime.write(`DONE\t${manifest.name}\tdb ${operation}\n`);
182
+ }
183
+ }
184
+ export function serviceListOperation(runtime) {
185
+ const installed = listGlobalZlooksPackages(runtime.npm);
186
+ const managed = listManagedProcesses(runtime.pm2);
187
+ for (const service of SERVICES) {
188
+ runtime.write(`${service.packageName}\t${service.bin}\t${describeState(service.packageName, installed, managed)}\n`);
189
+ }
190
+ }
191
+ async function startInstalledClosure(selected, installed, managed, envFile, runtime) {
192
+ const installedByName = new Map(installed.map((manifest) => [manifest.name, manifest]));
193
+ const closure = new Map();
194
+ const add = (manifest) => {
195
+ if (closure.has(manifest.name))
196
+ return;
197
+ closure.set(manifest.name, manifest);
198
+ for (const dependency of manifest.dependsOn)
199
+ add(requireInstalled(dependency, installed));
200
+ };
201
+ selected.forEach(add);
202
+ const managedByName = new Map(managed.map((process) => [process.name, process]));
203
+ const plan = planTopology([...closure.values()]);
204
+ const ready = new Set(managed.filter((process) => process.status === 'online').map((process) => process.name));
205
+ for (const manifest of plan.start) {
206
+ if (ready.has(manifest.name))
207
+ continue;
208
+ if (manifest.dependsOn.some((dependency) => !ready.has(dependency))) {
209
+ throw new Error(`${manifest.name} is blocked by a dependency that is not ready`);
210
+ }
211
+ const current = managedByName.get(manifest.name);
212
+ if (current)
213
+ deletePm2Service(current.pmId, runtime.pm2);
214
+ startPm2Service(manifest, envFile, runtime.pm2);
215
+ ready.add(manifest.name);
216
+ }
217
+ }
218
+ function loadManagedManifests(runtime) {
219
+ const processes = listManagedProcesses(runtime.pm2);
220
+ const installed = listGlobalZlooksPackages(runtime.npm);
221
+ return {
222
+ processes,
223
+ manifests: trimTopologyDependencies(processes.map((process) => requireInstalled(process.name, installed))),
224
+ };
225
+ }
226
+ function requireInstalled(name, manifests) {
227
+ const manifest = manifests.find((candidate) => candidate.name === name);
228
+ if (!manifest)
229
+ throw new Error(`Installed Zlooks package not found: ${name}`);
230
+ return manifest;
231
+ }
232
+ function requireInstalledVersion(plan, manifests) {
233
+ const manifest = requireInstalled(plan.name, manifests);
234
+ if (manifest.version !== plan.targetVersion) {
235
+ throw new Error(`Installed version mismatch for ${plan.name}: expected ${plan.targetVersion}, got ${manifest.version}`);
236
+ }
237
+ return manifest;
238
+ }
239
+ function describeState(name, manifests, processes) {
240
+ const manifest = manifests.find((candidate) => candidate.name === name);
241
+ const process = processes.find((candidate) => candidate.name === name);
242
+ return `${manifest?.version ?? 'not-installed'}\t${process?.status ?? 'not-managed'}`;
243
+ }
244
+ function reportResults(results, runtime) {
245
+ for (const result of results) {
246
+ runtime.write(`${result.status.toUpperCase()}\t${result.name}${result.error ? `\t${result.error}` : ''}\n`);
247
+ }
248
+ if (results.some((result) => result.status !== 'ready'))
249
+ process.exitCode = 1;
250
+ }
251
+ function renderVersionPlan(environment, tag, plans, runtime) {
252
+ runtime.write(`Environment\t${environment}\n`);
253
+ runtime.write(`Package Tag\t${tag}\n`);
254
+ runtime.write('NAME\tCURRENT\tTARGET\tACTION\n');
255
+ for (const plan of plans) {
256
+ runtime.write([
257
+ plan.name,
258
+ plan.currentVersion ?? 'not-installed',
259
+ plan.targetVersion,
260
+ plan.action.toUpperCase(),
261
+ ].join('\t') + '\n');
262
+ }
263
+ }
264
+ function assertNoDowngrades(plans) {
265
+ const downgrades = plans.filter((plan) => plan.action === 'downgrade');
266
+ if (downgrades.length === 0)
267
+ return;
268
+ throw new Error(`Downgrade is only allowed by zlooks deploy rollback: ${downgrades.map((plan) => (`${plan.name} ${plan.currentVersion} -> ${plan.targetVersion}`)).join(', ')}`);
269
+ }
270
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type ZlooksPackageKind = 'service' | 'theme';
2
+ export type ZlooksDatabaseCommand = 'sync' | 'migrate';
3
+ export type ZlooksPackageName = string;
4
+ export interface ZlooksPackageManifest {
5
+ readonly name: ZlooksPackageName;
6
+ readonly version: string;
7
+ readonly bin: string;
8
+ readonly kind: ZlooksPackageKind;
9
+ readonly description: string;
10
+ readonly dependsOn: readonly ZlooksPackageName[];
11
+ readonly nodeConditions: readonly string[];
12
+ readonly databaseCommands: readonly ZlooksDatabaseCommand[];
13
+ }
14
+ export declare function parseZlooksPackageManifest(input: unknown): ZlooksPackageManifest;
15
+ export declare function isZlooksPackageName(name: string): boolean;
16
+ //# sourceMappingURL=package-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manifest.d.ts","sourceRoot":"","sources":["../src/package-manifest.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAAC;AACpD,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,SAAS,CAAC;AACvD,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEvC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC7D;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CA8DhF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIzD"}
@@ -0,0 +1,72 @@
1
+ import { valid as validSemver } from 'semver';
2
+ export function parseZlooksPackageManifest(input) {
3
+ if (!isRecord(input))
4
+ throw new Error('Package manifest must be an object');
5
+ const name = input.name;
6
+ if (typeof name !== 'string' || !isZlooksPackageName(name)) {
7
+ throw new Error('Invalid Zlooks deployable package name');
8
+ }
9
+ if (typeof input.version !== 'string' || validSemver(input.version) === null) {
10
+ throw new Error(`${name} must declare a valid exact SemVer version`);
11
+ }
12
+ if (!isRecord(input.bin) || Object.keys(input.bin).length !== 1) {
13
+ throw new Error(`${name} must expose exactly one executable`);
14
+ }
15
+ const [bin] = Object.keys(input.bin);
16
+ if (!bin)
17
+ throw new Error(`${name} must expose exactly one executable`);
18
+ const packageSegment = name.slice(name.lastIndexOf('/') + 1);
19
+ const expectedBin = name.startsWith('@zlooks.cn/') ? `zlooks-${packageSegment}` : packageSegment;
20
+ if (bin !== expectedBin)
21
+ throw new Error(`${name} must expose the ${expectedBin} executable`);
22
+ if (input.bin[bin] !== 'dist/command/index.js') {
23
+ throw new Error(`${name} executable must target dist/command/index.js`);
24
+ }
25
+ if (!isRecord(input.zlooks))
26
+ throw new Error(`${name} must declare zlooks metadata`);
27
+ const kind = input.zlooks.kind;
28
+ if (kind !== 'service' && kind !== 'theme') {
29
+ throw new Error(`${name} must declare zlooks.kind as service or theme`);
30
+ }
31
+ const description = input.zlooks.description;
32
+ if (typeof description !== 'string' || description.trim().length === 0) {
33
+ throw new Error(`${name} must declare zlooks.description`);
34
+ }
35
+ const dependencies = input.zlooks.dependsOn;
36
+ if (!Array.isArray(dependencies) || dependencies.some((dependency) => (typeof dependency !== 'string' || !isZlooksPackageName(dependency)))) {
37
+ throw new Error(`${name} must declare zlooks.dependsOn as Zlooks package names`);
38
+ }
39
+ if (new Set(dependencies).size !== dependencies.length || dependencies.includes(name)) {
40
+ throw new Error(`${name} contains invalid duplicate or self dependencies`);
41
+ }
42
+ const nodeConditions = input.zlooks.nodeConditions ?? [];
43
+ if (!Array.isArray(nodeConditions) || nodeConditions.some((condition) => (typeof condition !== 'string' || !/^[a-z0-9-]+$/.test(condition))) || new Set(nodeConditions).size !== nodeConditions.length) {
44
+ throw new Error(`${name} contains invalid zlooks.nodeConditions`);
45
+ }
46
+ const commands = input.zlooks.commands ?? {};
47
+ if (!isRecord(commands))
48
+ throw new Error(`${name} contains invalid zlooks.commands`);
49
+ const databaseCommands = commands.db ?? [];
50
+ if (!Array.isArray(databaseCommands) || databaseCommands.some((command) => (command !== 'sync' && command !== 'migrate')) || new Set(databaseCommands).size !== databaseCommands.length) {
51
+ throw new Error(`${name} contains invalid zlooks.commands.db`);
52
+ }
53
+ return {
54
+ name,
55
+ version: input.version,
56
+ bin,
57
+ kind,
58
+ description: description.trim(),
59
+ dependsOn: [...dependencies],
60
+ nodeConditions: [...nodeConditions],
61
+ databaseCommands: [...databaseCommands],
62
+ };
63
+ }
64
+ export function isZlooksPackageName(name) {
65
+ return /^@zlooks\.cn\/[a-z0-9][a-z0-9-]*-server$/.test(name)
66
+ || /^@[a-z0-9][a-z0-9._-]*\/zlooks-[a-z0-9][a-z0-9-]*-server$/.test(name)
67
+ || /^zlooks-[a-z0-9][a-z0-9-]*-server$/.test(name);
68
+ }
69
+ function isRecord(value) {
70
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
71
+ }
72
+ //# sourceMappingURL=package-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manifest.js","sourceRoot":"","sources":["../src/package-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { NpmRuntime } from './global-packages.js';
2
+ import type { ActiveNpmRegistry } from './npm-registry.js';
3
+ import type { ZlooksReleaseTag } from './release-environment.js';
4
+ export type PackageVersionAction = 'install' | 'upgrade' | 'unchanged' | 'downgrade';
5
+ export interface PackageVersionPlan {
6
+ readonly name: string;
7
+ readonly currentVersion?: string;
8
+ readonly targetVersion: string;
9
+ readonly action: PackageVersionAction;
10
+ }
11
+ export declare function resolvePublishedVersion(name: string, tag: ZlooksReleaseTag, registry: ActiveNpmRegistry, npm: NpmRuntime): string;
12
+ export declare function createPackageVersionPlan(name: string, currentVersion: string | undefined, targetVersion: string): PackageVersionPlan;
13
+ //# sourceMappingURL=package-updates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-updates.d.ts","sourceRoot":"","sources":["../src/package-updates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;AAErF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;CACvC;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,EACrB,QAAQ,EAAE,iBAAiB,EAC3B,GAAG,EAAE,UAAU,GACd,MAAM,CAkBR;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,aAAa,EAAE,MAAM,GACpB,kBAAkB,CAWpB"}
@@ -0,0 +1,41 @@
1
+ import { compare, valid as validSemver } from 'semver';
2
+ export function resolvePublishedVersion(name, tag, registry, npm) {
3
+ const output = npm.exec([
4
+ 'view', `${name}@${tag}`, 'version', '--json', `--registry=${registry}`,
5
+ ], { silent: true });
6
+ let parsed;
7
+ try {
8
+ parsed = JSON.parse(output);
9
+ }
10
+ catch (error) {
11
+ throw new Error(`${name}@${tag} did not resolve to one exact SemVer version`, { cause: error });
12
+ }
13
+ if (typeof parsed !== 'string') {
14
+ throw new Error(`${name}@${tag} did not resolve to one exact SemVer version`);
15
+ }
16
+ const version = validSemver(parsed);
17
+ if (version === null) {
18
+ throw new Error(`${name}@${tag} did not resolve to one exact SemVer version`);
19
+ }
20
+ return version;
21
+ }
22
+ export function createPackageVersionPlan(name, currentVersion, targetVersion) {
23
+ const target = requireExactVersion(name, targetVersion);
24
+ if (currentVersion === undefined)
25
+ return { name, targetVersion: target, action: 'install' };
26
+ const current = requireExactVersion(name, currentVersion);
27
+ const precedence = compare(target, current);
28
+ return {
29
+ name,
30
+ currentVersion: current,
31
+ targetVersion: target,
32
+ action: precedence > 0 ? 'upgrade' : precedence < 0 ? 'downgrade' : 'unchanged',
33
+ };
34
+ }
35
+ function requireExactVersion(name, value) {
36
+ const version = validSemver(value);
37
+ if (version === null)
38
+ throw new Error(`${name} has an invalid exact SemVer version: ${value}`);
39
+ return version;
40
+ }
41
+ //# sourceMappingURL=package-updates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-updates.js","sourceRoot":"","sources":["../src/package-updates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAcvD,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,GAAqB,EACrB,QAA2B,EAC3B,GAAe;IAEf,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC;QACtB,MAAM,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,QAAQ,EAAE;KACxE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACrB,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,GAAG,8CAA8C,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,GAAG,8CAA8C,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,GAAG,8CAA8C,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,IAAY,EACZ,cAAkC,EAClC,aAAqB;IAErB,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC5F,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO;QACL,IAAI;QACJ,cAAc,EAAE,OAAO;QACvB,aAAa,EAAE,MAAM;QACrB,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;KAChF,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,KAAa;IACtD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,OAAO,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,yCAAyC,KAAK,EAAE,CAAC,CAAC;IAC/F,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/pm2.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ export declare const ZLOOKS_PM2_NAMESPACE = "zlooks";
2
+ export declare const PM2_READY_TIMEOUT_MS = 120000;
3
+ interface Pm2ListEntry {
4
+ readonly pm_id?: unknown;
5
+ readonly name?: unknown;
6
+ readonly pm2_env?: {
7
+ readonly namespace?: unknown;
8
+ readonly status?: unknown;
9
+ };
10
+ }
11
+ export interface ManagedProcess {
12
+ readonly pmId: number;
13
+ readonly name: string;
14
+ readonly status: string;
15
+ }
16
+ export interface Pm2CommandRuntime {
17
+ exec(args: readonly string[], options?: {
18
+ readonly env?: NodeJS.ProcessEnv;
19
+ readonly silent?: boolean;
20
+ }): string;
21
+ }
22
+ export declare function selectManagedProcesses(entries: readonly Pm2ListEntry[]): ManagedProcess[];
23
+ export declare function listManagedProcesses(runtime: Pm2CommandRuntime): readonly ManagedProcess[];
24
+ export declare function startPm2Service(manifest: import('./package-manifest.js').ZlooksPackageManifest, envFile: string, runtime: Pm2CommandRuntime): void;
25
+ export declare function stopPm2Service(pmId: number, runtime: Pm2CommandRuntime): void;
26
+ export declare function deletePm2Service(pmId: number, runtime: Pm2CommandRuntime): void;
27
+ export {};
28
+ //# sourceMappingURL=pm2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm2.d.ts","sourceRoot":"","sources":["../src/pm2.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAC7C,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAE5C,UAAU,YAAY;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,CAAC;CAClH;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,cAAc,EAAE,CAqBzF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,cAAc,EAAE,CAK1F;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,uBAAuB,EAAE,qBAAqB,EAC/D,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,GACzB,IAAI,CAWN;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAE7E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAE/E"}
package/dist/pm2.js ADDED
@@ -0,0 +1,72 @@
1
+ export const ZLOOKS_PM2_NAMESPACE = 'zlooks';
2
+ export const PM2_READY_TIMEOUT_MS = 120_000;
3
+ export function selectManagedProcesses(entries) {
4
+ const selected = entries.flatMap((entry) => {
5
+ if (entry.pm2_env?.namespace !== ZLOOKS_PM2_NAMESPACE || typeof entry.name !== 'string')
6
+ return [];
7
+ if (!Number.isInteger(entry.pm_id) || entry.pm_id < 0) {
8
+ throw new Error(`Zlooks process ${entry.name} has no valid PM2 id`);
9
+ }
10
+ return [{
11
+ pmId: entry.pm_id,
12
+ name: entry.name,
13
+ status: typeof entry.pm2_env.status === 'string' ? entry.pm2_env.status : 'unknown',
14
+ }];
15
+ });
16
+ const names = new Set();
17
+ const ids = new Set();
18
+ for (const process of selected) {
19
+ if (names.has(process.name))
20
+ throw new Error(`Duplicate PM2 process identity: ${process.name}`);
21
+ if (ids.has(process.pmId))
22
+ throw new Error(`Duplicate PM2 id: ${process.pmId}`);
23
+ names.add(process.name);
24
+ ids.add(process.pmId);
25
+ }
26
+ return selected;
27
+ }
28
+ export function listManagedProcesses(runtime) {
29
+ const output = runtime.exec(['jlist'], { silent: true });
30
+ const parsed = JSON.parse(output);
31
+ if (!Array.isArray(parsed))
32
+ throw new Error('PM2 process list must be an array');
33
+ return selectManagedProcesses(parsed);
34
+ }
35
+ export function startPm2Service(manifest, envFile, runtime) {
36
+ const command = `${manifest.bin} start --env=${shellQuote(envFile)}`;
37
+ runtime.exec([
38
+ 'start', command,
39
+ '--name', manifest.name,
40
+ '--namespace', ZLOOKS_PM2_NAMESPACE,
41
+ '--wait-ready',
42
+ '--listen-timeout', String(PM2_READY_TIMEOUT_MS),
43
+ ], {
44
+ env: serviceEnvironment(manifest),
45
+ });
46
+ }
47
+ export function stopPm2Service(pmId, runtime) {
48
+ runtime.exec(['stop', String(pmId)], { silent: true });
49
+ }
50
+ export function deletePm2Service(pmId, runtime) {
51
+ runtime.exec(['delete', String(pmId)], { silent: true });
52
+ }
53
+ function shellQuote(value) {
54
+ return `'${value.replaceAll("'", "'\\''")}'`;
55
+ }
56
+ function serviceEnvironment(manifest) {
57
+ const required = manifest.nodeConditions.map((condition) => `--conditions=${condition}`).join(' ');
58
+ const inherited = process.env.NODE_OPTIONS?.trim() ?? '';
59
+ const environment = { ...process.env };
60
+ for (const key of [
61
+ 'REGISTRY_HOST',
62
+ 'REGISTRY_PORT',
63
+ 'HILE_ADVERTISE_HOST',
64
+ 'ACTIVE_REGISTRY',
65
+ 'ZLOOKS_ENVIRONMENT',
66
+ ]) {
67
+ delete environment[key];
68
+ }
69
+ environment.NODE_OPTIONS = [inherited, required].filter(Boolean).join(' ');
70
+ return environment;
71
+ }
72
+ //# sourceMappingURL=pm2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm2.js","sourceRoot":"","sources":["../src/pm2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export interface PromptChoice<T> {
2
+ readonly name: string;
3
+ readonly value: T;
4
+ readonly description?: string;
5
+ }
6
+ export interface InteractivePrompts {
7
+ input(options: {
8
+ readonly message: string;
9
+ readonly default?: string;
10
+ readonly validate?: (value: string) => boolean | string;
11
+ }): Promise<string>;
12
+ number(options: {
13
+ readonly message: string;
14
+ readonly default?: number;
15
+ readonly min?: number;
16
+ readonly max?: number;
17
+ readonly required?: boolean;
18
+ }): Promise<number | undefined>;
19
+ password(options: {
20
+ readonly message: string;
21
+ readonly mask?: string;
22
+ readonly validate?: (value: string) => boolean | string;
23
+ }): Promise<string>;
24
+ confirm(options: {
25
+ readonly message: string;
26
+ readonly default?: boolean;
27
+ }): Promise<boolean>;
28
+ select<T>(options: {
29
+ readonly message: string;
30
+ readonly choices: readonly PromptChoice<T>[];
31
+ }): Promise<T>;
32
+ checkbox<T>(options: {
33
+ readonly message: string;
34
+ readonly choices: readonly PromptChoice<T>[];
35
+ readonly required?: boolean;
36
+ readonly shortcuts?: {
37
+ readonly all?: string | null;
38
+ readonly invert?: string | null;
39
+ };
40
+ }): Promise<T[]>;
41
+ }
42
+ export declare const interactivePrompts: InteractivePrompts;
43
+ export declare function confirm(message: string, defaultValue?: boolean): Promise<boolean>;
44
+ export declare function selectMany(message: string, choices: readonly {
45
+ readonly name: string;
46
+ readonly detail: string;
47
+ }[]): Promise<readonly string[]>;
48
+ export declare function isPromptCancellation(error: unknown): boolean;
49
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClJ,MAAM,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjL,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClJ,OAAO,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7F,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3G,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CACrO;AAED,eAAO,MAAM,kBAAkB,EAAE,kBAOhC,CAAC;AAEF,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAErF;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,GACrE,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAO5B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE5D"}