@instawp/cli 0.0.1-beta.1 → 0.0.1-beta.10
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/CHANGELOG.md +131 -0
- package/README.md +58 -10
- package/dist/commands/db.d.ts +2 -0
- package/dist/commands/db.js +331 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/exec.js +62 -3
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/local.d.ts +2 -0
- package/dist/commands/local.js +750 -0
- package/dist/commands/local.js.map +1 -0
- package/dist/commands/login.js +23 -7
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.d.ts +2 -0
- package/dist/commands/logs.js +239 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/open.d.ts +2 -0
- package/dist/commands/open.js +114 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/sites.js +266 -10
- package/dist/commands/sites.js.map +1 -1
- package/dist/commands/sync.js +6 -3
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/teams.js +52 -3
- package/dist/commands/teams.js.map +1 -1
- package/dist/index.js +54 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/api.js +6 -1
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts +10 -1
- package/dist/lib/config.js +47 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/local-env.d.ts +35 -0
- package/dist/lib/local-env.js +299 -0
- package/dist/lib/local-env.js.map +1 -0
- package/dist/lib/output.js +14 -1
- package/dist/lib/output.js.map +1 -1
- package/dist/lib/paths.d.ts +22 -0
- package/dist/lib/paths.js +41 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/sftp-sync.d.ts +24 -0
- package/dist/lib/sftp-sync.js +191 -0
- package/dist/lib/sftp-sync.js.map +1 -0
- package/dist/lib/site-resolver.js +32 -11
- package/dist/lib/site-resolver.js.map +1 -1
- package/dist/lib/ssh-connection.d.ts +17 -0
- package/dist/lib/ssh-connection.js +103 -5
- package/dist/lib/ssh-connection.js.map +1 -1
- package/dist/lib/ssh-keys.js +12 -5
- package/dist/lib/ssh-keys.js.map +1 -1
- package/dist/lib/windows-binaries.d.ts +10 -0
- package/dist/lib/windows-binaries.js +34 -0
- package/dist/lib/windows-binaries.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/package.json +11 -3
- package/scripts/mysql2sqlite +289 -0
- package/vendor/win32/NOTICE.md +31 -0
- package/vendor/win32/busybox.exe +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a local filesystem path to a form rsync understands.
|
|
3
|
+
*
|
|
4
|
+
* rsync uses `host:path` syntax to mean "remote path", so a Windows path like
|
|
5
|
+
* `C:\Users\vikas\file` is interpreted as host `C` + path `\Users\vikas\file`,
|
|
6
|
+
* which fails. The fix is msys-style: `/c/Users/vikas/file`. This matches what
|
|
7
|
+
* rsync from Git for Windows expects and is accepted by cwRsync as well.
|
|
8
|
+
*
|
|
9
|
+
* Non-Windows: pass-through.
|
|
10
|
+
* Remote paths (containing `user@host:`): pass-through.
|
|
11
|
+
*/
|
|
12
|
+
export declare function toRsyncPath(p: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve a path inside the CLI's installed directory (e.g. bundled scripts).
|
|
15
|
+
*
|
|
16
|
+
* `new URL(import.meta.url).pathname` returns `/C:/...` on Windows which is
|
|
17
|
+
* invalid. `fileURLToPath` returns a real OS path.
|
|
18
|
+
*
|
|
19
|
+
* @param importMetaUrl - pass `import.meta.url` from the calling module
|
|
20
|
+
* @param relative - segments relative to the calling module's directory
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveFromModule(importMetaUrl: string, ...relative: string[]): string;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Convert a local filesystem path to a form rsync understands.
|
|
5
|
+
*
|
|
6
|
+
* rsync uses `host:path` syntax to mean "remote path", so a Windows path like
|
|
7
|
+
* `C:\Users\vikas\file` is interpreted as host `C` + path `\Users\vikas\file`,
|
|
8
|
+
* which fails. The fix is msys-style: `/c/Users/vikas/file`. This matches what
|
|
9
|
+
* rsync from Git for Windows expects and is accepted by cwRsync as well.
|
|
10
|
+
*
|
|
11
|
+
* Non-Windows: pass-through.
|
|
12
|
+
* Remote paths (containing `user@host:`): pass-through.
|
|
13
|
+
*/
|
|
14
|
+
export function toRsyncPath(p) {
|
|
15
|
+
if (process.platform !== 'win32')
|
|
16
|
+
return p;
|
|
17
|
+
// Already a remote spec like user@host:path
|
|
18
|
+
if (/^[^/\\:]+@[^:]+:/.test(p))
|
|
19
|
+
return p;
|
|
20
|
+
// Drive letter form: C:\foo\bar or C:/foo/bar → /c/foo/bar
|
|
21
|
+
const m = p.match(/^([A-Za-z]):[\\/](.*)$/);
|
|
22
|
+
if (m) {
|
|
23
|
+
return `/${m[1].toLowerCase()}/${m[2].replace(/\\/g, '/')}`;
|
|
24
|
+
}
|
|
25
|
+
// UNC or other — just normalize separators
|
|
26
|
+
return p.replace(/\\/g, '/');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve a path inside the CLI's installed directory (e.g. bundled scripts).
|
|
30
|
+
*
|
|
31
|
+
* `new URL(import.meta.url).pathname` returns `/C:/...` on Windows which is
|
|
32
|
+
* invalid. `fileURLToPath` returns a real OS path.
|
|
33
|
+
*
|
|
34
|
+
* @param importMetaUrl - pass `import.meta.url` from the calling module
|
|
35
|
+
* @param relative - segments relative to the calling module's directory
|
|
36
|
+
*/
|
|
37
|
+
export function resolveFromModule(importMetaUrl, ...relative) {
|
|
38
|
+
const here = dirname(fileURLToPath(importMetaUrl));
|
|
39
|
+
return resolve(here, ...relative);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,CAAC,CAAC;IAC3C,4CAA4C;IAC5C,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACzC,6DAA6D;IAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,CAAC;QACN,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;IAC9D,CAAC;IACD,2CAA2C;IAC3C,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAqB,EAAE,GAAG,QAAkB;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SshConnection } from '../types.js';
|
|
2
|
+
export interface SftpSyncOptions {
|
|
3
|
+
direction: 'push' | 'pull';
|
|
4
|
+
/** Local directory (contents are synced; trailing slash optional). */
|
|
5
|
+
localPath: string;
|
|
6
|
+
/** Remote directory (POSIX path). */
|
|
7
|
+
remotePath: string;
|
|
8
|
+
/** Names/globs to skip (rsync --exclude equivalents). */
|
|
9
|
+
excludes: string[];
|
|
10
|
+
/** Names/globs that override excludes (rsync --include equivalents). */
|
|
11
|
+
includes?: string[];
|
|
12
|
+
dryRun: boolean;
|
|
13
|
+
/** Called per transferred file/dir for itemized output. */
|
|
14
|
+
onItem?: (action: string, relPath: string) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function makeMatcher(patterns: string[]): (name: string, relPath: string) => boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Recursively transfer a directory tree over SFTP. This is the Windows
|
|
19
|
+
* replacement for rsync-over-ssh: bundled msys rsync can't talk to native
|
|
20
|
+
* Windows OpenSSH (incompatible pipe/signal semantics), so on Windows we use
|
|
21
|
+
* a pure-JS SSH client instead. No delta algorithm — full-file copy — but
|
|
22
|
+
* reliable and dependency-free of native binaries.
|
|
23
|
+
*/
|
|
24
|
+
export declare function syncViaSftp(conn: SshConnection, opts: SftpSyncOptions): Promise<number>;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import SftpClient from 'ssh2-sftp-client';
|
|
2
|
+
// ssh2 is CommonJS — a named ESM import fails at runtime. Use default import.
|
|
3
|
+
import ssh2 from 'ssh2';
|
|
4
|
+
const ssh2Utils = ssh2.utils;
|
|
5
|
+
import { readFileSync, mkdirSync, readdirSync, existsSync } from 'node:fs';
|
|
6
|
+
import { join, posix } from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Build the SSH auth for ssh2. Unencrypted keys (the CLI's own generated
|
|
9
|
+
* cli_key) are passed directly. If the key is encrypted, we don't pass it
|
|
10
|
+
* (ssh2 throws at parse time) — instead we fall back to ssh-agent, which is
|
|
11
|
+
* how rsync/ssh transparently handle encrypted keys. Set INSTAWP_SSH_PASSPHRASE
|
|
12
|
+
* to use an encrypted key without an agent.
|
|
13
|
+
*/
|
|
14
|
+
function buildAuth(conn) {
|
|
15
|
+
const auth = {};
|
|
16
|
+
const passphrase = process.env.INSTAWP_SSH_PASSPHRASE || undefined;
|
|
17
|
+
try {
|
|
18
|
+
const keyContent = readFileSync(conn.privateKeyPath);
|
|
19
|
+
const parsed = ssh2Utils.parseKey(keyContent, passphrase);
|
|
20
|
+
if (!(parsed instanceof Error)) {
|
|
21
|
+
auth.privateKey = keyContent;
|
|
22
|
+
if (passphrase)
|
|
23
|
+
auth.passphrase = passphrase;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// key file unreadable — rely on agent below
|
|
28
|
+
}
|
|
29
|
+
// ssh-agent fallback (also covers encrypted keys already loaded in the agent)
|
|
30
|
+
const agentSock = process.platform === 'win32'
|
|
31
|
+
? '\\\\.\\pipe\\openssh-ssh-agent'
|
|
32
|
+
: process.env.SSH_AUTH_SOCK;
|
|
33
|
+
if (agentSock)
|
|
34
|
+
auth.agent = agentSock;
|
|
35
|
+
return auth;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Convert a simple rsync-style pattern to a RegExp.
|
|
39
|
+
* Supports `*` (any chars except /) and `**` (any chars). Trailing `/` and
|
|
40
|
+
* leading `/` are stripped. Patterns without `/` match a path segment anywhere.
|
|
41
|
+
*/
|
|
42
|
+
function patternToRegExp(pattern) {
|
|
43
|
+
let p = pattern.replace(/\/+$/, '').replace(/^\/+/, '');
|
|
44
|
+
const anchored = pattern.includes('/');
|
|
45
|
+
// Escape regex specials except * and ?
|
|
46
|
+
let re = '';
|
|
47
|
+
for (let i = 0; i < p.length; i++) {
|
|
48
|
+
const c = p[i];
|
|
49
|
+
if (c === '*') {
|
|
50
|
+
if (p[i + 1] === '*') {
|
|
51
|
+
re += '.*';
|
|
52
|
+
i++;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
re += '[^/]*';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else if (c === '?') {
|
|
59
|
+
re += '[^/]';
|
|
60
|
+
}
|
|
61
|
+
else if ('.+^${}()|[]\\'.includes(c)) {
|
|
62
|
+
re += '\\' + c;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
re += c;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { re: new RegExp('^' + re + '$'), anchored };
|
|
69
|
+
}
|
|
70
|
+
export function makeMatcher(patterns) {
|
|
71
|
+
const compiled = patterns.map(patternToRegExp);
|
|
72
|
+
return (name, relPath) => {
|
|
73
|
+
for (const { re, anchored } of compiled) {
|
|
74
|
+
if (anchored) {
|
|
75
|
+
if (re.test(relPath))
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
else if (re.test(name)) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Recursively transfer a directory tree over SFTP. This is the Windows
|
|
87
|
+
* replacement for rsync-over-ssh: bundled msys rsync can't talk to native
|
|
88
|
+
* Windows OpenSSH (incompatible pipe/signal semantics), so on Windows we use
|
|
89
|
+
* a pure-JS SSH client instead. No delta algorithm — full-file copy — but
|
|
90
|
+
* reliable and dependency-free of native binaries.
|
|
91
|
+
*/
|
|
92
|
+
export async function syncViaSftp(conn, opts) {
|
|
93
|
+
const isExcluded = makeMatcher(opts.excludes);
|
|
94
|
+
const isIncluded = makeMatcher(opts.includes ?? []);
|
|
95
|
+
// Always skip these (rsync defaults we hardcoded).
|
|
96
|
+
const skip = (name, relPath) => {
|
|
97
|
+
if (isIncluded(name, relPath))
|
|
98
|
+
return false;
|
|
99
|
+
return isExcluded(name, relPath);
|
|
100
|
+
};
|
|
101
|
+
const client = new SftpClient();
|
|
102
|
+
let transferred = 0;
|
|
103
|
+
const auth = buildAuth(conn);
|
|
104
|
+
if (!auth.privateKey && !auth.agent) {
|
|
105
|
+
opts.onItem?.('error', 'SSH key appears encrypted and no ssh-agent is available. ' +
|
|
106
|
+
'Load the key into ssh-agent, or set INSTAWP_SSH_PASSPHRASE.');
|
|
107
|
+
return 1;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
await client.connect({
|
|
111
|
+
host: conn.host,
|
|
112
|
+
port: conn.port,
|
|
113
|
+
username: conn.username,
|
|
114
|
+
...auth,
|
|
115
|
+
readyTimeout: 30000,
|
|
116
|
+
});
|
|
117
|
+
if (opts.direction === 'pull') {
|
|
118
|
+
const pullDir = async (remoteDir, localDir) => {
|
|
119
|
+
let entries;
|
|
120
|
+
try {
|
|
121
|
+
entries = await client.list(remoteDir);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return; // remote dir missing — nothing to pull
|
|
125
|
+
}
|
|
126
|
+
if (!opts.dryRun)
|
|
127
|
+
mkdirSync(localDir, { recursive: true });
|
|
128
|
+
for (const e of entries) {
|
|
129
|
+
const relPath = posix.relative(opts.remotePath.replace(/\/+$/, ''), posix.join(remoteDir, e.name));
|
|
130
|
+
if (skip(e.name, relPath))
|
|
131
|
+
continue;
|
|
132
|
+
const remoteChild = posix.join(remoteDir, e.name);
|
|
133
|
+
const localChild = join(localDir, e.name);
|
|
134
|
+
if (e.type === 'd') {
|
|
135
|
+
await pullDir(remoteChild, localChild);
|
|
136
|
+
}
|
|
137
|
+
else if (e.type === '-') {
|
|
138
|
+
if (!opts.dryRun)
|
|
139
|
+
await client.fastGet(remoteChild, localChild);
|
|
140
|
+
transferred++;
|
|
141
|
+
opts.onItem?.('recv', relPath);
|
|
142
|
+
}
|
|
143
|
+
// symlinks (type 'l') are skipped — rare in wp-content
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
await pullDir(opts.remotePath.replace(/\/+$/, ''), opts.localPath.replace(/[\\/]+$/, ''));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const remoteRoot = opts.remotePath.replace(/\/+$/, '');
|
|
150
|
+
const localRoot = opts.localPath.replace(/[\\/]+$/, '');
|
|
151
|
+
const pushDir = async (localDir, remoteDir) => {
|
|
152
|
+
if (!existsSync(localDir))
|
|
153
|
+
return;
|
|
154
|
+
if (!opts.dryRun) {
|
|
155
|
+
const exists = await client.exists(remoteDir);
|
|
156
|
+
if (!exists)
|
|
157
|
+
await client.mkdir(remoteDir, true);
|
|
158
|
+
}
|
|
159
|
+
for (const entry of readdirSync(localDir, { withFileTypes: true })) {
|
|
160
|
+
const localChild = join(localDir, entry.name);
|
|
161
|
+
const remoteChild = posix.join(remoteDir, entry.name);
|
|
162
|
+
const relPath = posix.relative(remoteRoot, remoteChild);
|
|
163
|
+
if (skip(entry.name, relPath))
|
|
164
|
+
continue;
|
|
165
|
+
if (entry.isDirectory()) {
|
|
166
|
+
await pushDir(localChild, remoteChild);
|
|
167
|
+
}
|
|
168
|
+
else if (entry.isFile()) {
|
|
169
|
+
if (!opts.dryRun)
|
|
170
|
+
await client.fastPut(localChild, remoteChild);
|
|
171
|
+
transferred++;
|
|
172
|
+
opts.onItem?.('sent', relPath);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
await pushDir(localRoot, remoteRoot);
|
|
177
|
+
}
|
|
178
|
+
return 0;
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
opts.onItem?.('error', err?.message || String(err));
|
|
182
|
+
return 1;
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
try {
|
|
186
|
+
await client.end();
|
|
187
|
+
}
|
|
188
|
+
catch { /* ignore */ }
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=sftp-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sftp-sync.js","sourceRoot":"","sources":["../../src/lib/sftp-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { getClient } from './api.js';
|
|
2
|
+
import { getSiteCache, setSiteCache } from './config.js';
|
|
2
3
|
import { error, info } from './output.js';
|
|
4
|
+
async function fetchSiteById(client, id) {
|
|
5
|
+
const res = await client.get(`/sites/${id}/details`);
|
|
6
|
+
const data = res.data?.data;
|
|
7
|
+
const site = data?.site || data;
|
|
8
|
+
return normalizeSite(site, data);
|
|
9
|
+
}
|
|
3
10
|
export async function resolveSite(identifier) {
|
|
4
11
|
const client = getClient();
|
|
5
12
|
// If purely numeric, fetch directly by ID
|
|
6
13
|
if (/^\d+$/.test(identifier)) {
|
|
7
14
|
try {
|
|
8
|
-
|
|
9
|
-
const data = res.data?.data;
|
|
10
|
-
const site = data?.site || data;
|
|
11
|
-
return normalizeSite(site, data);
|
|
15
|
+
return await fetchSiteById(client, identifier);
|
|
12
16
|
}
|
|
13
17
|
catch (err) {
|
|
14
18
|
if (err.response?.status === 404) {
|
|
@@ -20,7 +24,19 @@ export async function resolveSite(identifier) {
|
|
|
20
24
|
process.exit(1);
|
|
21
25
|
}
|
|
22
26
|
}
|
|
23
|
-
//
|
|
27
|
+
// Check cache for name/domain → ID mapping
|
|
28
|
+
const cachedId = getSiteCache(identifier);
|
|
29
|
+
if (cachedId) {
|
|
30
|
+
try {
|
|
31
|
+
return await fetchSiteById(client, cachedId);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
// Cache stale (site deleted?), fall through to fresh lookup
|
|
35
|
+
if (err.response?.status !== 404)
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Search by name/domain
|
|
24
40
|
try {
|
|
25
41
|
const res = await client.get('/sites', { params: { per_page: 100 } });
|
|
26
42
|
const sites = res.data?.data || [];
|
|
@@ -43,16 +59,21 @@ export async function resolveSite(identifier) {
|
|
|
43
59
|
info('Use the site ID to be specific.');
|
|
44
60
|
process.exit(1);
|
|
45
61
|
}
|
|
46
|
-
// Single match — fetch full details
|
|
62
|
+
// Single match — cache the mapping and fetch full details
|
|
47
63
|
const match = matches[0];
|
|
64
|
+
setSiteCache(identifier, match.id);
|
|
48
65
|
try {
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
66
|
+
const details = await fetchSiteById(client, match.id);
|
|
67
|
+
// Also cache by name and domain for future lookups
|
|
68
|
+
if (match.name)
|
|
69
|
+
setSiteCache(match.name, match.id);
|
|
70
|
+
if (match.sub_domain)
|
|
71
|
+
setSiteCache(match.sub_domain, match.id);
|
|
72
|
+
if (match.domain?.name)
|
|
73
|
+
setSiteCache(match.domain.name, match.id);
|
|
74
|
+
return details;
|
|
53
75
|
}
|
|
54
76
|
catch {
|
|
55
|
-
// Fall back to list data if details endpoint fails
|
|
56
77
|
return normalizeSite(match, match);
|
|
57
78
|
}
|
|
58
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site-resolver.js","sourceRoot":"","sources":["../../src/lib/site-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"site-resolver.js","sourceRoot":"","sources":["../../src/lib/site-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,4 +5,21 @@ export declare function execViaSsh(conn: SshConnection, command: string): {
|
|
|
5
5
|
stderr: string;
|
|
6
6
|
exitCode: number;
|
|
7
7
|
};
|
|
8
|
+
/**
|
|
9
|
+
* Execute a command via SSH and stream stdout directly to a file.
|
|
10
|
+
* Useful for large outputs like database dumps.
|
|
11
|
+
*/
|
|
12
|
+
export declare function execViaSshToFile(conn: SshConnection, command: string, outputPath: string): {
|
|
13
|
+
exitCode: number;
|
|
14
|
+
stderr: string;
|
|
15
|
+
};
|
|
8
16
|
export declare function rsyncViaSsh(conn: SshConnection, source: string, dest: string, extraArgs: string[], dryRun: boolean, stream: boolean): number;
|
|
17
|
+
/**
|
|
18
|
+
* Transfer files between local and remote. On macOS/Linux this shells out to
|
|
19
|
+
* rsync (delta sync). On Windows it uses a pure-JS SFTP client instead —
|
|
20
|
+
* the bundled msys rsync.exe cannot drive native Windows OpenSSH (incompatible
|
|
21
|
+
* pipe/signal semantics → "connection unexpectedly closed"), so rsync-over-ssh
|
|
22
|
+
* is unusable there. Same call shape as rsyncViaSsh; one of source/dest is a
|
|
23
|
+
* `user@host:path` spec.
|
|
24
|
+
*/
|
|
25
|
+
export declare function syncFiles(conn: SshConnection, source: string, dest: string, extraArgs: string[], dryRun: boolean, stream: boolean): Promise<number>;
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import { existsSync, mkdirSync } from 'node:fs';
|
|
4
|
+
import { existsSync, mkdirSync, openSync, closeSync } from 'node:fs';
|
|
5
|
+
import { toRsyncPath } from './paths.js';
|
|
6
|
+
import { syncViaSftp } from './sftp-sync.js';
|
|
5
7
|
const KNOWN_HOSTS = path.join(homedir(), '.instawp', 'known_hosts');
|
|
8
|
+
// Paths embedded into the rsync `-e ssh ...` command are parsed by rsync's
|
|
9
|
+
// internal shell (msys/cygwin sh on Windows), where backslashes are escapes.
|
|
10
|
+
// Use forward slashes throughout. The actual ssh.exe on Windows accepts both.
|
|
11
|
+
function toSshPath(p) {
|
|
12
|
+
return p.replace(/\\/g, '/');
|
|
13
|
+
}
|
|
6
14
|
function ensureKnownHosts() {
|
|
7
15
|
const dir = path.dirname(KNOWN_HOSTS);
|
|
8
16
|
if (!existsSync(dir)) {
|
|
@@ -41,20 +49,47 @@ export function execViaSsh(conn, command) {
|
|
|
41
49
|
exitCode: result.status ?? 1,
|
|
42
50
|
};
|
|
43
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Execute a command via SSH and stream stdout directly to a file.
|
|
54
|
+
* Useful for large outputs like database dumps.
|
|
55
|
+
*/
|
|
56
|
+
export function execViaSshToFile(conn, command, outputPath) {
|
|
57
|
+
ensureKnownHosts();
|
|
58
|
+
const fd = openSync(outputPath, 'w');
|
|
59
|
+
try {
|
|
60
|
+
const result = spawnSync('ssh', ['-T', ...sshArgs(conn), sshTarget(conn)], {
|
|
61
|
+
input: command + '\n',
|
|
62
|
+
stdio: ['pipe', fd, 'pipe'],
|
|
63
|
+
encoding: 'utf-8',
|
|
64
|
+
maxBuffer: 500 * 1024 * 1024, // 500MB
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
exitCode: result.status ?? 1,
|
|
68
|
+
stderr: result.stderr || '',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
closeSync(fd);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
44
75
|
export function rsyncViaSsh(conn, source, dest, extraArgs, dryRun, stream) {
|
|
45
76
|
ensureKnownHosts();
|
|
46
|
-
const
|
|
77
|
+
const keyPath = toSshPath(conn.privateKeyPath);
|
|
78
|
+
const knownHosts = toSshPath(KNOWN_HOSTS);
|
|
79
|
+
const sshCmd = `ssh -i "${keyPath}" -p ${conn.port} -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile="${knownHosts}"`;
|
|
47
80
|
const args = [
|
|
48
|
-
'-
|
|
81
|
+
'-arz',
|
|
82
|
+
'--itemize-changes',
|
|
49
83
|
'--exclude=.git',
|
|
50
84
|
'--exclude=node_modules',
|
|
51
85
|
'--exclude=.DS_Store',
|
|
52
86
|
...(dryRun ? ['--dry-run'] : []),
|
|
53
87
|
...extraArgs,
|
|
54
88
|
'-e', sshCmd,
|
|
55
|
-
source,
|
|
56
|
-
dest,
|
|
89
|
+
toRsyncPath(source),
|
|
90
|
+
toRsyncPath(dest),
|
|
57
91
|
];
|
|
92
|
+
// rsyncViaSsh only runs on macOS/Linux now (Windows uses syncViaSftp).
|
|
58
93
|
const result = spawnSync('rsync', args, {
|
|
59
94
|
stdio: stream ? 'inherit' : ['pipe', 'pipe', 'pipe'],
|
|
60
95
|
encoding: stream ? undefined : 'utf-8',
|
|
@@ -67,4 +102,67 @@ export function rsyncViaSsh(conn, source, dest, extraArgs, dryRun, stream) {
|
|
|
67
102
|
}
|
|
68
103
|
return result.status ?? 1;
|
|
69
104
|
}
|
|
105
|
+
/** Strip a `user@host:` prefix, returning the remote path (or null if not remote). */
|
|
106
|
+
function parseRemoteSpec(spec, conn) {
|
|
107
|
+
const prefix = `${conn.username}@${conn.host}:`;
|
|
108
|
+
if (spec.startsWith(prefix))
|
|
109
|
+
return spec.slice(prefix.length);
|
|
110
|
+
const m = spec.match(/^[^@/\\]+@[^:]+:(.*)$/);
|
|
111
|
+
return m ? m[1] : null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Transfer files between local and remote. On macOS/Linux this shells out to
|
|
115
|
+
* rsync (delta sync). On Windows it uses a pure-JS SFTP client instead —
|
|
116
|
+
* the bundled msys rsync.exe cannot drive native Windows OpenSSH (incompatible
|
|
117
|
+
* pipe/signal semantics → "connection unexpectedly closed"), so rsync-over-ssh
|
|
118
|
+
* is unusable there. Same call shape as rsyncViaSsh; one of source/dest is a
|
|
119
|
+
* `user@host:path` spec.
|
|
120
|
+
*/
|
|
121
|
+
export async function syncFiles(conn, source, dest, extraArgs, dryRun, stream) {
|
|
122
|
+
if (process.platform !== 'win32') {
|
|
123
|
+
return rsyncViaSsh(conn, source, dest, extraArgs, dryRun, stream);
|
|
124
|
+
}
|
|
125
|
+
const destRemote = parseRemoteSpec(dest, conn);
|
|
126
|
+
const sourceRemote = parseRemoteSpec(source, conn);
|
|
127
|
+
let direction;
|
|
128
|
+
let localPath;
|
|
129
|
+
let remotePath;
|
|
130
|
+
if (destRemote !== null) {
|
|
131
|
+
direction = 'push';
|
|
132
|
+
localPath = source;
|
|
133
|
+
remotePath = destRemote;
|
|
134
|
+
}
|
|
135
|
+
else if (sourceRemote !== null) {
|
|
136
|
+
direction = 'pull';
|
|
137
|
+
localPath = dest;
|
|
138
|
+
remotePath = sourceRemote;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
console.error('syncFiles: could not determine remote endpoint from source/dest');
|
|
142
|
+
return 1;
|
|
143
|
+
}
|
|
144
|
+
// rsyncViaSsh hardcodes these defaults; mirror them for SFTP.
|
|
145
|
+
const excludes = ['.git', 'node_modules', '.DS_Store'];
|
|
146
|
+
const includes = [];
|
|
147
|
+
for (const a of extraArgs) {
|
|
148
|
+
if (a.startsWith('--exclude='))
|
|
149
|
+
excludes.push(a.slice('--exclude='.length));
|
|
150
|
+
else if (a.startsWith('--include='))
|
|
151
|
+
includes.push(a.slice('--include='.length));
|
|
152
|
+
}
|
|
153
|
+
return syncViaSftp(conn, {
|
|
154
|
+
direction,
|
|
155
|
+
localPath,
|
|
156
|
+
remotePath,
|
|
157
|
+
excludes,
|
|
158
|
+
includes,
|
|
159
|
+
dryRun,
|
|
160
|
+
onItem: (action, rel) => {
|
|
161
|
+
if (action === 'error')
|
|
162
|
+
console.error(rel);
|
|
163
|
+
else if (rel)
|
|
164
|
+
console.log(` ${action === 'sent' ? '↑' : '↓'} ${rel}`);
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
70
168
|
//# sourceMappingURL=ssh-connection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh-connection.js","sourceRoot":"","sources":["../../src/lib/ssh-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ssh-connection.js","sourceRoot":"","sources":["../../src/lib/ssh-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpE,2EAA2E;AAC3E,6EAA6E;AAC7E,8EAA8E;AAC9E,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,IAAmB;IAClC,gBAAgB,EAAE,CAAC;IACnB,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,cAAc;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,EAAE,kCAAkC;QACxC,IAAI,EAAE,sBAAsB,WAAW,EAAE;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAmB;IACpC,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAmB;IACrD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE;QACnE,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAmB,EAAE,OAAe;IAC7D,yEAAyE;IACzE,yCAAyC;IACzC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE;QACzE,KAAK,EAAE,OAAO,GAAG,IAAI;QACrB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC,CAAC,CAAC;IACH,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAmB,EAAE,OAAe,EAAE,UAAkB;IACvF,gBAAgB,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE;YACzE,KAAK,EAAE,OAAO,GAAG,IAAI;YACrB,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC;YAC3B,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ;SACvC,CAAC,CAAC;QACH,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC;YAC5B,MAAM,EAAG,MAAM,CAAC,MAAiB,IAAI,EAAE;SACxC,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,IAAmB,EACnB,MAAc,EACd,IAAY,EACZ,SAAmB,EACnB,MAAe,EACf,MAAe;IAEf,gBAAgB,EAAE,CAAC;IACnB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,WAAW,OAAO,QAAQ,IAAI,CAAC,IAAI,+DAA+D,UAAU,GAAG,CAAC;IAE/H,MAAM,IAAI,GAAG;QACX,MAAM;QACN,mBAAmB;QACnB,gBAAgB;QAChB,wBAAwB;QACxB,qBAAqB;QACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,GAAG,SAAS;QACZ,IAAI,EAAE,MAAM;QACZ,WAAW,CAAC,MAAM,CAAC;QACnB,WAAW,CAAC,IAAI,CAAC;KAClB,CAAC;IAEF,uEAAuE;IACvE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;QACtC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QACpD,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;KACvC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,sFAAsF;AACtF,SAAS,eAAe,CAAC,IAAY,EAAE,IAAmB;IACxD,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;IAChD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC9C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAmB,EACnB,MAAc,EACd,IAAY,EACZ,SAAmB,EACnB,MAAe,EACf,MAAe;IAEf,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnD,IAAI,SAA0B,CAAC;IAC/B,IAAI,SAAiB,CAAC;IACtB,IAAI,UAAkB,CAAC;IACvB,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,SAAS,GAAG,MAAM,CAAC;QAAC,SAAS,GAAG,MAAM,CAAC;QAAC,UAAU,GAAG,UAAU,CAAC;IAClE,CAAC;SAAM,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QACjC,SAAS,GAAG,MAAM,CAAC;QAAC,SAAS,GAAG,IAAI,CAAC;QAAC,UAAU,GAAG,YAAY,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;aACvE,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,EAAE;QACvB,SAAS;QACT,SAAS;QACT,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YACtB,IAAI,MAAM,KAAK,OAAO;gBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;iBACtC,IAAI,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;QACzE,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/lib/ssh-keys.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { existsSync, readFileSync, mkdirSync } from 'node:fs';
|
|
1
|
+
import { existsSync, readFileSync, mkdirSync, unlinkSync } from 'node:fs';
|
|
2
2
|
import { execSync } from 'node:child_process';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { getClient } from './api.js';
|
|
6
6
|
import { getSshCache, setSshCache, clearSshCache } from './config.js';
|
|
7
|
-
import { error, spinner } from './output.js';
|
|
7
|
+
import { error, info, spinner } from './output.js';
|
|
8
8
|
const INSTAWP_DIR = path.join(homedir(), '.instawp');
|
|
9
9
|
const CLI_KEY_PATH = path.join(INSTAWP_DIR, 'cli_key');
|
|
10
10
|
const CLI_KEY_PUB_PATH = CLI_KEY_PATH + '.pub';
|
|
@@ -40,15 +40,22 @@ function parseKeyMaterial(pubContent) {
|
|
|
40
40
|
}
|
|
41
41
|
function generateCliKey() {
|
|
42
42
|
ensureInstawpDir();
|
|
43
|
+
// Remove old key if it exists (so ssh-keygen doesn't prompt to overwrite)
|
|
43
44
|
try {
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
if (existsSync(CLI_KEY_PATH))
|
|
46
|
+
unlinkSync(CLI_KEY_PATH);
|
|
47
|
+
if (existsSync(CLI_KEY_PUB_PATH))
|
|
48
|
+
unlinkSync(CLI_KEY_PUB_PATH);
|
|
49
|
+
}
|
|
50
|
+
catch { /* ignore */ }
|
|
51
|
+
try {
|
|
52
|
+
execSync(`ssh-keygen -t rsa -b 4096 -f "${CLI_KEY_PATH}" -N "" -C "instawp-cli"`, {
|
|
46
53
|
stdio: 'ignore',
|
|
47
|
-
shell: '/bin/sh',
|
|
48
54
|
});
|
|
49
55
|
}
|
|
50
56
|
catch {
|
|
51
57
|
error('Failed to generate SSH key. Ensure ssh-keygen (OpenSSH) is installed.');
|
|
58
|
+
info('Windows: Settings → Apps → Optional Features → OpenSSH Client');
|
|
52
59
|
process.exit(1);
|
|
53
60
|
}
|
|
54
61
|
return {
|
package/dist/lib/ssh-keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh-keys.js","sourceRoot":"","sources":["../../src/lib/ssh-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ssh-keys.js","sourceRoot":"","sources":["../../src/lib/ssh-keys.ts"],"names":[],"mappings":"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"}
|