@nocobase/app-installer 0.1.0-beta.6 → 0.1.0-beta.8

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.
@@ -0,0 +1,331 @@
1
+ import { list } from 'tar';
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { createReadStream } from 'node:fs';
4
+ import { mkdtemp, rm, stat } from 'node:fs/promises';
5
+ import os from 'node:os';
6
+ import path from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { Flags } from '@oclif/core';
9
+ import { quoteForShell } from '@nocobase/cli-envelope';
10
+ import { createOfflineBundle } from "./offline-bundle.js";
11
+ import { CommandFailedError, runCommand } from "./run-command.js";
12
+ import { EXIT_INVALID, InstallerError } from "./errors.js";
13
+ import { INSTALLER_PACKAGE } from "./invocation.js";
14
+ import { checkHealth } from "./health.js";
15
+ export const SSH_FLAGS = {
16
+ ssh: Flags.string({
17
+ description: 'SSH destination (user@host or SSH config alias). The server needs no internet access.',
18
+ }),
19
+ 'ssh-port': Flags.integer({
20
+ min: 1,
21
+ max: 65535,
22
+ description: 'SSH port; otherwise use system SSH configuration.',
23
+ }),
24
+ 'ssh-identity': Flags.string({
25
+ description: 'Local SSH private key file; SSH agent and config work without this flag.',
26
+ }),
27
+ 'ssh-config': Flags.string({
28
+ description: 'Local SSH config file, including ProxyJump and remote PATH setup.',
29
+ }),
30
+ 'ssh-timeout': Flags.integer({
31
+ min: 1,
32
+ default: 1800,
33
+ description: 'Maximum seconds for each remote execution or transfer. A timeout does not imply rollback.',
34
+ }),
35
+ };
36
+ export async function sha256(file) {
37
+ const hash = createHash('sha256');
38
+ for await (const chunk of createReadStream(file))
39
+ hash.update(chunk);
40
+ return hash.digest('hex');
41
+ }
42
+ export function sshArgs(flags, scp = false) {
43
+ const host = flags.ssh;
44
+ if (typeof host !== 'string' ||
45
+ !/^(?:[\w.-]+@)?[\w.:[\]-]+$/u.test(host) ||
46
+ host.startsWith('-')) {
47
+ throw new InstallerError('INVALID_USAGE', '--ssh must be a host, user@host or SSH config alias, not a shell command or URL.', { exitCode: EXIT_INVALID });
48
+ }
49
+ const args = [
50
+ '-o',
51
+ 'BatchMode=yes',
52
+ '-o',
53
+ 'StrictHostKeyChecking=yes',
54
+ '-o',
55
+ 'ConnectTimeout=15',
56
+ ];
57
+ if (flags['ssh-port'])
58
+ args.push(scp ? '-P' : '-p', String(flags['ssh-port']));
59
+ if (flags['ssh-identity'])
60
+ args.push('-i', String(flags['ssh-identity']));
61
+ if (flags['ssh-config'])
62
+ args.push('-F', String(flags['ssh-config']));
63
+ return args;
64
+ }
65
+ /** Keep recovery commands on the machine whose files and processes they address. */
66
+ function remoteSuggestion(suggestion, flags) {
67
+ const run = suggestion.run;
68
+ if (!run)
69
+ return suggestion;
70
+ const installerIndex = run.command === 'npx'
71
+ ? run.args.findIndex((arg) => arg.startsWith(INSTALLER_PACKAGE + '@'))
72
+ : -1;
73
+ if (installerIndex >= 0) {
74
+ const connection = Object.entries(flags)
75
+ .filter(([key, value]) => key in SSH_FLAGS && value !== undefined)
76
+ .flatMap(([key, value]) => [`--${key}`, String(value)]);
77
+ return {
78
+ ...suggestion,
79
+ run: {
80
+ command: process.execPath,
81
+ args: [
82
+ fileURLToPath(new URL('../../bin/run.js', import.meta.url)),
83
+ ...run.args.slice(installerIndex + 1),
84
+ ...connection,
85
+ ],
86
+ },
87
+ };
88
+ }
89
+ // Archive rebuilds and dependency changes belong in the local application project.
90
+ if (run.command === 'pnpm')
91
+ return {
92
+ ...suggestion,
93
+ message: `In the local application project: ${suggestion.message}`,
94
+ };
95
+ return {
96
+ ...suggestion,
97
+ run: {
98
+ command: 'ssh',
99
+ args: [
100
+ ...sshArgs(flags),
101
+ String(flags.ssh),
102
+ [run.command, ...run.args].map(quoteForShell).join(' '),
103
+ ],
104
+ },
105
+ };
106
+ }
107
+ /** Read the manifest without extracting executable files on the local machine. */
108
+ export async function inspectArchive(file) {
109
+ let text = '';
110
+ let bytes = 0;
111
+ let manifests = 0;
112
+ await list({
113
+ file,
114
+ onReadEntry(entry) {
115
+ bytes += entry.size;
116
+ if (entry.path.replace(/^\.\//u, '') === 'dist/package.json') {
117
+ manifests += 1;
118
+ if (entry.size > 1024 * 1024)
119
+ throw new Error('Archive manifest is too large');
120
+ entry.on('data', (chunk) => {
121
+ text += chunk.toString();
122
+ });
123
+ }
124
+ },
125
+ });
126
+ if (manifests !== 1)
127
+ throw new InstallerError('ARCHIVE_INVALID', 'Archive must contain exactly one dist/package.json.');
128
+ return { manifest: JSON.parse(text), bytes };
129
+ }
130
+ /** Runs before upload. Node and standard Linux tools are prerequisites, not downloaded on the server. */
131
+ const PREFLIGHT = `
132
+ const fs = require('node:fs'); const path = require('node:path');
133
+ const {spawnSync} = require('node:child_process');
134
+ let input=''; process.stdin.setEncoding('utf8'); process.stdin.on('data',x=>input+=x);
135
+ process.stdin.on('end',()=>{try {
136
+ const r=JSON.parse(input);
137
+ if(process.platform!=='linux'||Number(process.versions.node.split('.')[0])<24) throw Error('Linux and Node.js 24+ are required');
138
+ const t=r.target; const libc=process.report.getReport().header.glibcVersionRuntime?'glibc':'musl';
139
+ if(t&&(t.platform!==process.platform||t.arch!==process.arch||t.nodeMajor!==Number(process.versions.node.split('.')[0])||(t.libc&&t.libc!==libc)))throw Error('Archive build target does not match remote platform, architecture, libc or Node major');
140
+ for(const bin of ['tar','pm2']) {const p=spawnSync('sh',['-c','command -v '+bin],{encoding:'utf8'});if(p.status!==0)throw Error(bin+' is missing from the SSH session PATH');}
141
+ let parent=r.dir;while(!fs.existsSync(parent))parent=path.dirname(parent);
142
+ if(!fs.statSync(parent).isDirectory())throw Error('Target parent is not a directory');
143
+ fs.accessSync(parent,fs.constants.W_OK|fs.constants.X_OK);
144
+ for(const dir of [parent,'/tmp']) {const disk=fs.statfsSync(dir);if(disk.bavail*disk.bsize<r.bytes)throw Error('Insufficient disk space in '+dir);}
145
+ fs.mkdirSync(r.staging,{mode:0o700});
146
+ console.log(JSON.stringify({platform:process.platform,arch:process.arch,node:process.versions.node}));
147
+ }catch(e){console.error(e.message);process.exitCode=2;}});
148
+ `;
149
+ export async function runRemote(command, flags, directory, explicit, deps) {
150
+ const ssh = sshArgs(flags);
151
+ const host = String(flags.ssh);
152
+ const root = directory ?? flags.dir;
153
+ if (typeof root !== 'string' ||
154
+ !path.posix.isAbsolute(root) ||
155
+ path.posix.normalize(root) === '/' ||
156
+ root.includes('\0') ||
157
+ root.includes('\n')) {
158
+ throw new InstallerError('INVALID_USAGE', 'SSH operations require an explicit absolute target --dir other than /.', { exitCode: EXIT_INVALID });
159
+ }
160
+ if (directory && flags.dir && directory !== flags.dir)
161
+ throw new InstallerError('INVALID_USAGE', 'Directory argument and --dir disagree.', { exitCode: EXIT_INVALID });
162
+ if (flags.app || flags.rebuild || (command === 'upgrade' && flags.to))
163
+ throw new InstallerError('INVALID_USAGE', 'SSH deployment is archive-only; --app, --rebuild and npm --to require server internet access.', { exitCode: EXIT_INVALID });
164
+ if (['deploy', 'install', 'upgrade'].includes(command) && !flags.archive)
165
+ throw new InstallerError('INVALID_USAGE', '--archive is required for SSH installation and upgrade.', { exitCode: EXIT_INVALID });
166
+ const env = {};
167
+ for (const setting of (flags['set-from-env'] ?? [])) {
168
+ const name = setting.slice(setting.indexOf('=') + 1);
169
+ if (!setting.includes('=') ||
170
+ !/^[A-Za-z_][A-Za-z0-9_]*$/u.test(name) ||
171
+ process.env[name] === undefined)
172
+ throw new InstallerError('INVALID_USAGE', '--set-from-env must name an existing local environment variable.', { exitCode: EXIT_INVALID });
173
+ // Restrict transport to generated names: a user setting must not override PATH, NODE_OPTIONS or the remote runtime.
174
+ const generated = `NOCOBASE_REMOTE_SECRET_${Object.keys(env).length}`;
175
+ env[generated] = process.env[name];
176
+ }
177
+ const secrets = Object.values(env).filter(Boolean);
178
+ const redact = (text) => secrets.reduce((out, secret) => out
179
+ .split(JSON.stringify(secret).slice(1, -1))
180
+ .join('[REDACTED]')
181
+ .split(secret)
182
+ .join('[REDACTED]'), text);
183
+ const local = await mkdtemp(path.join(os.tmpdir(), 'nocobase-ssh-'));
184
+ const staging = `/tmp/nocobase-deploy-${randomUUID()}`;
185
+ const run = deps.run ?? runCommand;
186
+ const timeoutMs = Number(flags['ssh-timeout'] ?? 1800) * 1000;
187
+ let executing = false;
188
+ let staged = false;
189
+ try {
190
+ const bundle = path.join(local, 'installer.tar.gz');
191
+ await createOfflineBundle(bundle);
192
+ const archive = typeof flags.archive === 'string'
193
+ ? path.resolve(deps.cwd ?? process.cwd(), flags.archive)
194
+ : undefined;
195
+ const bundleHash = await sha256(bundle);
196
+ const archiveHash = archive ? await sha256(archive) : undefined;
197
+ const inspected = archive ? await inspectArchive(archive) : undefined;
198
+ if (inspected && !inspected.manifest.nocobase?.buildTarget)
199
+ throw new InstallerError('ARCHIVE_INVALID', 'Archive is missing its build target.');
200
+ const bytes = (await stat(bundle)).size * 10 + (inspected?.bytes ?? 0) * 2;
201
+ deps.reporter.progress(`Checking SSH target ${host}`);
202
+ await run('ssh', [...ssh, host, `node -e ${quoteForShell(PREFLIGHT)}`], {
203
+ input: JSON.stringify({
204
+ dir: root,
205
+ staging,
206
+ bytes,
207
+ target: inspected?.manifest.nocobase?.buildTarget,
208
+ }),
209
+ timeoutMs: 30_000,
210
+ });
211
+ staged = true;
212
+ deps.reporter.progress('Uploading offline installer and application archive');
213
+ await run('scp', [...sshArgs(flags, true), bundle, `${host}:${staging}/installer.tar.gz`], { timeoutMs });
214
+ if (archive)
215
+ await run('scp', [...sshArgs(flags, true), archive, `${host}:${staging}/app.tar.gz`], { timeoutMs });
216
+ const verify = `const fs=require('node:fs'),crypto=require('node:crypto');(async()=>{for(const [file,expected] of ${JSON.stringify([[`${staging}/installer.tar.gz`, bundleHash], ...(archive ? [[`${staging}/app.tar.gz`, archiveHash]] : [])])}){const hash=crypto.createHash('sha256');for await(const chunk of fs.createReadStream(file))hash.update(chunk);if(hash.digest('hex')!==expected)throw Error('Upload checksum mismatch');}})().catch(e=>{console.error(e.message);process.exitCode=2});`;
217
+ await run('ssh', [
218
+ ...ssh,
219
+ host,
220
+ `node -e ${quoteForShell(verify)} && tar -xzf ${quoteForShell(staging + '/installer.tar.gz')} -C ${quoteForShell(staging)}`,
221
+ ], { timeoutMs });
222
+ const forwarded = Object.fromEntries(Object.entries(flags).filter(([key]) => !(key in SSH_FLAGS)));
223
+ forwarded.dir = root;
224
+ forwarded.archive = archive ? staging + '/app.tar.gz' : undefined;
225
+ if (flags['set-from-env'])
226
+ forwarded['set-from-env'] = flags['set-from-env'].map((x, i) => `${x.slice(0, x.indexOf('='))}=NOCOBASE_REMOTE_SECRET_${i}`);
227
+ const request = {
228
+ command,
229
+ flags: forwarded,
230
+ explicit,
231
+ env,
232
+ ...(archive
233
+ ? { archive: { file: staging + '/app.tar.gz', sha256: archiveHash } }
234
+ : {}),
235
+ };
236
+ executing = true;
237
+ let response;
238
+ let exitCode = 0;
239
+ try {
240
+ response = await run('ssh', [
241
+ ...ssh,
242
+ host,
243
+ `node ${quoteForShell(staging + '/installer/dist/remote-entry.js')}`,
244
+ ], { input: JSON.stringify(request), timeoutMs });
245
+ }
246
+ catch (error) {
247
+ if (error instanceof InstallerError && error.code === 'INTERRUPTED')
248
+ throw new Error('Local SSH execution was interrupted before returning a remote result.', { cause: error });
249
+ if (!(error instanceof CommandFailedError) ||
250
+ error.exitCode === 255 ||
251
+ error.exitCode === null)
252
+ throw error;
253
+ response = error;
254
+ exitCode = error.exitCode;
255
+ }
256
+ let envelope;
257
+ try {
258
+ envelope = JSON.parse(redact(response.stdout));
259
+ }
260
+ catch {
261
+ throw new Error('Remote installer did not return a JSON result');
262
+ }
263
+ for (const warning of envelope.warnings ?? [])
264
+ deps.reporter.warn(warning);
265
+ if (envelope.ok && exitCode !== 0)
266
+ throw new Error('Remote process exited nonzero despite a success envelope');
267
+ if (!envelope.ok)
268
+ throw new InstallerError(envelope.error?.code ?? 'REMOTE_FAILED', envelope.error?.message ?? 'Remote operation failed.', {
269
+ exitCode: exitCode || 1,
270
+ details: {
271
+ ...envelope.error?.details,
272
+ ssh: host,
273
+ directory: root,
274
+ staging,
275
+ },
276
+ suggestions: (envelope.error?.suggestions ?? []).map((suggestion) => remoteSuggestion(suggestion, flags)),
277
+ });
278
+ const result = envelope.result ?? {};
279
+ let publicHealth = null;
280
+ const url = typeof result.url === 'string'
281
+ ? result.url
282
+ : result.endpoints?.url;
283
+ if (url && result.started !== false) {
284
+ publicHealth = await checkHealth(url.replace(/\/$/u, '') + '/api/healthz', deps.fetchImpl);
285
+ if (!publicHealth)
286
+ deps.reporter.warn('Remote operation succeeded, but the public health URL is not reachable from this machine. Check routing, firewall and reverse proxy.');
287
+ }
288
+ await run('ssh', [...ssh, host, `rm -rf -- ${quoteForShell(staging)}`], {
289
+ timeoutMs: 30_000,
290
+ }).catch(() => deps.reporter.warn(`Could not remove remote staging directory ${staging}.`));
291
+ return {
292
+ status: envelope.status ?? 'success',
293
+ result: {
294
+ ...result,
295
+ remote: {
296
+ host,
297
+ directory: root,
298
+ publicHealth,
299
+ archiveSha256: archiveHash ?? null,
300
+ },
301
+ },
302
+ summary: [
303
+ `Remote ${command} succeeded on ${host}`,
304
+ ` Directory ${root}`,
305
+ ...(url ? [` URL ${url}`] : []),
306
+ ],
307
+ };
308
+ }
309
+ catch (error) {
310
+ if (error instanceof InstallerError)
311
+ throw error;
312
+ throw new InstallerError(executing ? 'REMOTE_STATE_UNKNOWN' : 'SSH_TRANSFER_FAILED', executing
313
+ ? 'SSH execution did not return a complete result. The server may still be deploying; query status before retrying.'
314
+ : 'SSH precheck or transfer failed; the application was not changed.', {
315
+ details: {
316
+ ssh: host,
317
+ directory: root,
318
+ ...(staged ? { staging } : {}),
319
+ diagnostic: redact(error instanceof CommandFailedError
320
+ ? error.stderr
321
+ : error instanceof Error
322
+ ? error.message
323
+ : String(error)),
324
+ },
325
+ });
326
+ }
327
+ finally {
328
+ await rm(local, { recursive: true, force: true });
329
+ }
330
+ }
331
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/lib/remote.ts"],"names":[],"mappings":"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"}
@@ -45,9 +45,13 @@ export const runCommand = (command, args, options = {}) => new Promise((resolve,
45
45
  const child = spawn(command, args, {
46
46
  cwd: options.cwd,
47
47
  env: options.env,
48
- stdio: ['ignore', 'pipe', 'pipe'],
48
+ stdio: [options.input === undefined ? 'ignore' : 'pipe', 'pipe', 'pipe'],
49
49
  detached: true,
50
50
  });
51
+ child.stdin?.on('error', () => {
52
+ /* A child may exit before reading stdin; close reports its status. */
53
+ });
54
+ child.stdin?.end(options.input);
51
55
  let stdout = '';
52
56
  let stderr = '';
53
57
  let stopReason;
@@ -65,11 +69,11 @@ export const runCommand = (command, args, options = {}) => new Promise((resolve,
65
69
  : undefined;
66
70
  timer?.unref();
67
71
  const stopListening = onInterrupt(() => stop('interrupt'));
68
- child.stdout.on('data', (chunk) => {
72
+ child.stdout?.on('data', (chunk) => {
69
73
  stdout += chunk.toString();
70
74
  options.echo?.write(chunk);
71
75
  });
72
- child.stderr.on('data', (chunk) => {
76
+ child.stderr?.on('data', (chunk) => {
73
77
  stderr += chunk.toString();
74
78
  options.echo?.write(chunk);
75
79
  });
@@ -1 +1 @@
1
- {"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/lib/run-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/lib/run-command.ts"],"names":[],"mappings":"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"}
package/dist/lib/state.js CHANGED
@@ -25,7 +25,7 @@ export async function readState(layout) {
25
25
  throw error;
26
26
  }
27
27
  const state = JSON.parse(text);
28
- if (state.schemaVersion !== 1) {
28
+ if (state.schemaVersion !== 1 && state.schemaVersion !== 2) {
29
29
  throw new InstallerError('STATE_UNSUPPORTED', `installer.json has schemaVersion ${String(state.schemaVersion)}, which this app-installer does not understand.`, {
30
30
  exitCode: EXIT_INVALID,
31
31
  suggestions: [
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/lib/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/lib/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { Writable } from 'node:stream';
2
+ import { readAppEnv, endpointsOf } from "./lib/env-file.js";
3
+ import { layoutOf } from "./lib/layout.js";
4
+ /** Private SSH entry: the request and secrets arrive over stdin, never in process arguments or files. */
5
+ import { existsSync } from 'node:fs';
6
+ import { readFile } from 'node:fs/promises';
7
+ import path from 'node:path';
8
+ import { createRequire } from 'node:module';
9
+ import { runInstaller } from "./cli.js";
10
+ import { INSTALL_FLAGS } from "./commands/install.js";
11
+ import { UPGRADE_FLAGS } from "./commands/upgrade.js";
12
+ import { ROLLBACK_FLAGS } from "./commands/rollback.js";
13
+ import { STATUS_FLAGS } from "./commands/status.js";
14
+ import { errorEnvelope, exitCodeOf } from "./lib/output.js";
15
+ import { EXIT_INVALID, InstallerError } from "./lib/errors.js";
16
+ import { sha256 } from "./lib/remote.js";
17
+ let input = '';
18
+ for await (const chunk of process.stdin)
19
+ input += String(chunk);
20
+ let command = 'remote';
21
+ try {
22
+ const request = JSON.parse(input);
23
+ command = request.command;
24
+ const root = String(request.flags.dir);
25
+ if (!path.isAbsolute(root) || root === '/')
26
+ throw new InstallerError('INVALID_USAGE', 'An absolute application directory is required.');
27
+ if (request.archive &&
28
+ (await sha256(request.archive.file)) !== request.archive.sha256)
29
+ throw new InstallerError('CHECKSUM_MISMATCH', 'Application archive checksum does not match.');
30
+ for (const [key, value] of Object.entries(request.env)) {
31
+ if (!/^NOCOBASE_REMOTE_SECRET_\d+$/u.test(key))
32
+ throw new InstallerError('INVALID_USAGE', 'Invalid transported environment variable.');
33
+ process.env[key] = value;
34
+ }
35
+ const stateFile = path.join(root, 'installer.json');
36
+ if (command === 'deploy')
37
+ command = existsSync(stateFile) ? 'upgrade' : 'install';
38
+ if (command === 'install' && request.flags['repair-checksums'] !== undefined)
39
+ throw new InstallerError('INVALID_USAGE', 'Checksum repair approval applies only to upgrading an existing installation.', { exitCode: EXIT_INVALID });
40
+ if (command === 'upgrade') {
41
+ const state = JSON.parse(await readFile(stateFile, 'utf8'));
42
+ if (state.source?.kind !== 'archive')
43
+ throw new InstallerError('REMOTE_SOURCE_UNSUPPORTED', 'Offline SSH upgrades require an archive installation.');
44
+ const installOnly = request.explicit.filter((key) => key in INSTALL_FLAGS && !(key in UPGRADE_FLAGS) && key !== 'json');
45
+ if (installOnly.length)
46
+ throw new InstallerError('INVALID_USAGE', `An existing installation preserves its configuration; remove install-only flags: ${installOnly.map((x) => '--' + x).join(', ')}.`);
47
+ }
48
+ const definitions = {
49
+ install: INSTALL_FLAGS,
50
+ upgrade: UPGRADE_FLAGS,
51
+ rollback: ROLLBACK_FLAGS,
52
+ status: STATUS_FLAGS,
53
+ };
54
+ if (!(command in definitions))
55
+ throw new InstallerError('INVALID_USAGE', 'Unsupported remote operation.');
56
+ const definition = definitions[command];
57
+ const argv = [command, '--json'];
58
+ for (const [key, value] of Object.entries(request.flags)) {
59
+ if (key === 'json' || !(key in definition) || value === undefined)
60
+ continue;
61
+ if (typeof value === 'boolean') {
62
+ if (value)
63
+ argv.push('--' + key);
64
+ else if (['start', 'restore'].includes(key))
65
+ argv.push('--no-' + key);
66
+ }
67
+ else if (Array.isArray(value))
68
+ for (const item of value)
69
+ argv.push(`--${key}=${item}`);
70
+ else
71
+ argv.push(`--${key}=${value}`);
72
+ }
73
+ const metadata = createRequire(import.meta.url)('../package.json');
74
+ let output = '';
75
+ const stdout = new Writable({
76
+ write(chunk, _encoding, callback) {
77
+ output += chunk.toString();
78
+ callback();
79
+ },
80
+ });
81
+ process.exitCode = await runInstaller({
82
+ argv,
83
+ version: metadata.version,
84
+ stdout,
85
+ });
86
+ const envelope = JSON.parse(output);
87
+ if (envelope.ok &&
88
+ envelope.result &&
89
+ ['upgrade', 'rollback'].includes(command)) {
90
+ envelope.result.endpoints = endpointsOf(await readAppEnv(layoutOf(root)));
91
+ }
92
+ process.stdout.write(JSON.stringify(envelope) + '\n');
93
+ }
94
+ catch (error) {
95
+ process.stdout.write(JSON.stringify(errorEnvelope(command, error, [])) + '\n');
96
+ process.exitCode = exitCodeOf(error);
97
+ }
98
+ //# sourceMappingURL=remote-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-entry.js","sourceRoot":"","sources":["../src/remote-entry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/app-installer",
3
- "version": "0.1.0-beta.6",
3
+ "version": "0.1.0-beta.8",
4
4
  "description": "Install, upgrade and roll back a NocoBase 3 application on a server from a deployment archive.",
5
5
  "type": "module",
6
6
  "prettier": "@nocobase/dev-config/prettier",
@@ -28,6 +28,8 @@
28
28
  "publint": "^0.3.24",
29
29
  "typescript": "^6.0.3",
30
30
  "vitest": "^4.1.10",
31
+ "@nocobase/db": "^1.0.0-beta.20",
32
+ "@nocobase/db-sqlite": "^0.1.0-beta.5",
31
33
  "@nocobase/dev-config": "0.1.0-beta.22"
32
34
  },
33
35
  "publishConfig": {