@instawp/cli 0.0.1-beta.1 → 0.0.1-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/exec.js +26 -0
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/local.d.ts +2 -0
- package/dist/commands/local.js +694 -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/sites.js +190 -10
- package/dist/commands/sites.js.map +1 -1
- package/dist/commands/sync.js +2 -1
- 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 +16 -0
- 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/site-resolver.js +32 -11
- package/dist/lib/site-resolver.js.map +1 -1
- package/dist/lib/ssh-connection.d.ts +8 -0
- package/dist/lib/ssh-connection.js +26 -2
- 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/types.d.ts +8 -0
- package/package.json +3 -2
- package/scripts/mysql2sqlite +289 -0
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import { registerSyncCommand } from './commands/sync.js';
|
|
|
10
10
|
import { registerSshCommand } from './commands/ssh.js';
|
|
11
11
|
import { registerExecCommand, registerWpCommand } from './commands/exec.js';
|
|
12
12
|
import { registerTeamsCommand } from './commands/teams.js';
|
|
13
|
+
import { registerLocalCommand } from './commands/local.js';
|
|
13
14
|
const require = createRequire(import.meta.url);
|
|
14
15
|
const { version } = require('../package.json');
|
|
15
16
|
// Early --json detection so it works in any argv position
|
|
@@ -38,6 +39,8 @@ registerSshCommand(program);
|
|
|
38
39
|
registerSyncCommand(program);
|
|
39
40
|
// -- Teams --
|
|
40
41
|
registerTeamsCommand(program);
|
|
42
|
+
// -- Local dev --
|
|
43
|
+
registerLocalCommand(program);
|
|
41
44
|
// Custom help layout
|
|
42
45
|
program.configureHelp({
|
|
43
46
|
sortSubcommands: false,
|
|
@@ -54,6 +57,7 @@ ${d('Auth')}
|
|
|
54
57
|
${d('Sites')}
|
|
55
58
|
${c('create')} Create a new WordPress site
|
|
56
59
|
${c('sites list')} List all sites
|
|
60
|
+
${c('sites php')} View or update PHP version/settings
|
|
57
61
|
${c('sites delete')} Delete a site
|
|
58
62
|
|
|
59
63
|
${d('Remote Access')}
|
|
@@ -62,13 +66,25 @@ ${d('Remote Access')}
|
|
|
62
66
|
${c('ssh')} ${d('<site>')} Interactive SSH session
|
|
63
67
|
${c('sync')} ${d('push|pull')} Sync wp-content via rsync
|
|
64
68
|
|
|
69
|
+
${d('Local Development')}
|
|
70
|
+
${c('local create')} Create and start a local WordPress site
|
|
71
|
+
${c('local clone')} Clone an InstaWP cloud site to local
|
|
72
|
+
${c('local start')} Start an existing local site
|
|
73
|
+
${c('local stop')} Stop a background local site
|
|
74
|
+
${c('local push')} Push local wp-content to InstaWP cloud
|
|
75
|
+
${c('local pull')} Pull cloud wp-content to local site
|
|
76
|
+
${c('local list')} List local sites
|
|
77
|
+
${c('local delete')} Delete a local site
|
|
78
|
+
|
|
65
79
|
${d('Teams')}
|
|
66
80
|
${c('teams list')} List teams
|
|
81
|
+
${c('teams switch')} Switch active team
|
|
67
82
|
${c('teams members')} List team members
|
|
68
83
|
|
|
69
84
|
${d('Examples')}
|
|
70
85
|
$ instawp login
|
|
71
86
|
$ instawp create --name my-site
|
|
87
|
+
$ instawp local create --name blog
|
|
72
88
|
$ instawp wp my-site plugin list
|
|
73
89
|
$ instawp exec my-site php -v --api
|
|
74
90
|
$ instawp ssh my-site
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/api.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
-
import { getToken, getApiUrl, clearConfig } from './config.js';
|
|
2
|
+
import { getToken, getApiUrl, getTeamId, clearConfig } from './config.js';
|
|
3
3
|
import { error } from './output.js';
|
|
4
4
|
let client = null;
|
|
5
5
|
export function getClient() {
|
|
@@ -16,6 +16,11 @@ export function getClient() {
|
|
|
16
16
|
if (token) {
|
|
17
17
|
config.headers.Authorization = `Bearer ${token}`;
|
|
18
18
|
}
|
|
19
|
+
// Inject team_id into all requests if set
|
|
20
|
+
const teamId = getTeamId();
|
|
21
|
+
if (teamId) {
|
|
22
|
+
config.params = { ...config.params, team_id: teamId };
|
|
23
|
+
}
|
|
19
24
|
return config;
|
|
20
25
|
});
|
|
21
26
|
client.interceptors.response.use((response) => response, (err) => {
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,IAAI,MAAM,GAAyB,IAAI,CAAC;AAExC,MAAM,UAAU,SAAS;IACvB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,OAAO,GAAG,GAAG,SAAS,EAAE,SAAS,CAAC;IACxC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACpB,OAAO;QACP,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAC9E,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;QACnD,CAAC;QACD,0CAA0C;QAC1C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC9B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,CAAC,GAAe,EAAE,EAAE;QAClB,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACjC,WAAW,EAAE,CAAC;YACd,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACjC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
|
-
import type { UserInfo, SshConnectionCache } from '../types.js';
|
|
1
|
+
import type { UserInfo, SshConnectionCache, LocalInstance } from '../types.js';
|
|
2
2
|
export declare function getToken(): string | null;
|
|
3
3
|
export declare function getApiUrl(): string;
|
|
4
4
|
export declare function setToken(token: string): void;
|
|
5
5
|
export declare function setUser(user: UserInfo): void;
|
|
6
6
|
export declare function getUser(): UserInfo | null;
|
|
7
7
|
export declare function setApiUrl(url: string): void;
|
|
8
|
+
export declare function getTeamId(): number | null;
|
|
9
|
+
export declare function setTeamId(id: number): void;
|
|
10
|
+
export declare function clearTeamId(): void;
|
|
8
11
|
export declare function clearConfig(): void;
|
|
12
|
+
export declare function getSiteCache(identifier: string): number | null;
|
|
13
|
+
export declare function setSiteCache(identifier: string, siteId: number): void;
|
|
14
|
+
export declare function getLocalInstances(): Record<string, LocalInstance>;
|
|
15
|
+
export declare function getLocalInstance(name: string): LocalInstance | null;
|
|
16
|
+
export declare function setLocalInstance(instance: LocalInstance): void;
|
|
17
|
+
export declare function removeLocalInstance(name: string): void;
|
|
9
18
|
export declare function getSshCache(siteId: number): SshConnectionCache | null;
|
|
10
19
|
export declare function setSshCache(siteId: number, entry: SshConnectionCache): void;
|
|
11
20
|
export declare function clearSshCache(siteId?: number): void;
|
package/dist/lib/config.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Conf from 'conf';
|
|
2
2
|
const SSH_CACHE_TTL = 60 * 60 * 1000; // 1 hour
|
|
3
|
+
const SITE_CACHE_TTL = 10 * 60 * 1000; // 10 minutes
|
|
3
4
|
const config = new Conf({
|
|
4
5
|
projectName: 'instawp',
|
|
5
6
|
schema: {
|
|
@@ -7,6 +8,9 @@ const config = new Conf({
|
|
|
7
8
|
token: { type: 'string', default: '' },
|
|
8
9
|
user: { type: 'object', default: {} },
|
|
9
10
|
ssh_cache: { type: 'object', default: {} },
|
|
11
|
+
site_cache: { type: 'object', default: {} },
|
|
12
|
+
local_instances: { type: 'object', default: {} },
|
|
13
|
+
team_id: { type: 'number', default: 0 },
|
|
10
14
|
},
|
|
11
15
|
});
|
|
12
16
|
export function getToken() {
|
|
@@ -34,9 +38,52 @@ export function getUser() {
|
|
|
34
38
|
export function setApiUrl(url) {
|
|
35
39
|
config.set('api_url', url);
|
|
36
40
|
}
|
|
41
|
+
export function getTeamId() {
|
|
42
|
+
const id = config.get('team_id');
|
|
43
|
+
return id || null;
|
|
44
|
+
}
|
|
45
|
+
export function setTeamId(id) {
|
|
46
|
+
config.set('team_id', id);
|
|
47
|
+
}
|
|
48
|
+
export function clearTeamId() {
|
|
49
|
+
config.set('team_id', 0);
|
|
50
|
+
}
|
|
37
51
|
export function clearConfig() {
|
|
38
52
|
config.clear();
|
|
39
53
|
}
|
|
54
|
+
export function getSiteCache(identifier) {
|
|
55
|
+
const cache = config.get('site_cache');
|
|
56
|
+
const entry = cache?.[identifier.toLowerCase()];
|
|
57
|
+
if (!entry)
|
|
58
|
+
return null;
|
|
59
|
+
if (Date.now() - entry.cachedAt > SITE_CACHE_TTL) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return entry.id;
|
|
63
|
+
}
|
|
64
|
+
export function setSiteCache(identifier, siteId) {
|
|
65
|
+
const cache = config.get('site_cache') || {};
|
|
66
|
+
cache[identifier.toLowerCase()] = { id: siteId, cachedAt: Date.now() };
|
|
67
|
+
config.set('site_cache', cache);
|
|
68
|
+
}
|
|
69
|
+
// Local instance management
|
|
70
|
+
export function getLocalInstances() {
|
|
71
|
+
return config.get('local_instances') || {};
|
|
72
|
+
}
|
|
73
|
+
export function getLocalInstance(name) {
|
|
74
|
+
const instances = getLocalInstances();
|
|
75
|
+
return instances[name] || null;
|
|
76
|
+
}
|
|
77
|
+
export function setLocalInstance(instance) {
|
|
78
|
+
const instances = getLocalInstances();
|
|
79
|
+
instances[instance.name] = instance;
|
|
80
|
+
config.set('local_instances', instances);
|
|
81
|
+
}
|
|
82
|
+
export function removeLocalInstance(name) {
|
|
83
|
+
const instances = getLocalInstances();
|
|
84
|
+
delete instances[name];
|
|
85
|
+
config.set('local_instances', instances);
|
|
86
|
+
}
|
|
40
87
|
export function getSshCache(siteId) {
|
|
41
88
|
const cache = config.get('ssh_cache');
|
|
42
89
|
const entry = cache?.[String(siteId)];
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { LocalInstance } from '../types.js';
|
|
2
|
+
export declare function getLocalBaseDir(): string;
|
|
3
|
+
export declare function getInstanceDir(name: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* Check if downloads.w.org is reachable (WordPress Playground downloads from here).
|
|
6
|
+
* Returns null if OK, or an error message string.
|
|
7
|
+
*/
|
|
8
|
+
export declare function checkPlaygroundConnectivity(): Promise<string | null>;
|
|
9
|
+
export declare function getNextPort(instances: Record<string, LocalInstance>): Promise<number>;
|
|
10
|
+
export declare function createInstanceDir(name: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Ensure auto-login mu-plugin exists (for instances created before this was added).
|
|
13
|
+
*/
|
|
14
|
+
export declare function ensureAutoLogin(instance: LocalInstance): void;
|
|
15
|
+
export declare function deleteInstanceDir(name: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Starts the Playground server in the foreground.
|
|
18
|
+
* Watches stdout for the ready URL and calls onReady when detected.
|
|
19
|
+
* Returns a promise that resolves when the server exits.
|
|
20
|
+
*/
|
|
21
|
+
export declare function startServer(instance: LocalInstance, opts?: {
|
|
22
|
+
blueprint?: string;
|
|
23
|
+
onReady?: (url: string) => void;
|
|
24
|
+
}): Promise<number>;
|
|
25
|
+
/**
|
|
26
|
+
* Starts the Playground server in the background.
|
|
27
|
+
* Spawns detached with output going to a log file.
|
|
28
|
+
* Polls until the server is ready, then returns.
|
|
29
|
+
*/
|
|
30
|
+
export declare function startServerBackground(instance: LocalInstance, blueprint?: string): Promise<{
|
|
31
|
+
pid: number;
|
|
32
|
+
url: string;
|
|
33
|
+
}>;
|
|
34
|
+
export declare function stopServer(instance: LocalInstance): boolean;
|
|
35
|
+
export declare function isServerRunning(instance: LocalInstance): boolean;
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import net from 'node:net';
|
|
6
|
+
const LOCAL_BASE_DIR = join(homedir(), '.instawp', 'local');
|
|
7
|
+
const DEFAULT_PORT_START = 9400;
|
|
8
|
+
/**
|
|
9
|
+
* Returns [command, prefixArgs] for running wp-playground-cli.
|
|
10
|
+
* Prefers the global binary (faster) over npx (slower).
|
|
11
|
+
*/
|
|
12
|
+
function getPlaygroundCommand() {
|
|
13
|
+
// Check for globally installed binary first (0.7s vs 1.4s npx overhead)
|
|
14
|
+
const cmd = process.platform === 'win32' ? 'where' : 'which';
|
|
15
|
+
const result = spawnSync(cmd, ['wp-playground-cli'], { stdio: 'pipe' });
|
|
16
|
+
if (result.status === 0) {
|
|
17
|
+
return ['wp-playground-cli', []];
|
|
18
|
+
}
|
|
19
|
+
return ['npx', ['--yes', '@wp-playground/cli']];
|
|
20
|
+
}
|
|
21
|
+
export function getLocalBaseDir() {
|
|
22
|
+
return LOCAL_BASE_DIR;
|
|
23
|
+
}
|
|
24
|
+
export function getInstanceDir(name) {
|
|
25
|
+
return join(LOCAL_BASE_DIR, name);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if downloads.w.org is reachable (WordPress Playground downloads from here).
|
|
29
|
+
* Returns null if OK, or an error message string.
|
|
30
|
+
*/
|
|
31
|
+
export async function checkPlaygroundConnectivity() {
|
|
32
|
+
try {
|
|
33
|
+
const controller = new AbortController();
|
|
34
|
+
const timer = setTimeout(() => controller.abort(), 8000);
|
|
35
|
+
await fetch('https://downloads.w.org', { signal: controller.signal, method: 'HEAD' });
|
|
36
|
+
clearTimeout(timer);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Check if the alternative domain works
|
|
41
|
+
try {
|
|
42
|
+
const controller = new AbortController();
|
|
43
|
+
const timer = setTimeout(() => controller.abort(), 8000);
|
|
44
|
+
await fetch('https://downloads.wordpress.org', { signal: controller.signal, method: 'HEAD' });
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
return 'downloads.w.org is unreachable from your network (downloads.wordpress.org works).\n' +
|
|
47
|
+
'WordPress Playground CLI requires access to downloads.w.org.\n' +
|
|
48
|
+
'Try: adding "192.0.77.48 downloads.w.org" to /etc/hosts, or use a VPN/different network.';
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return 'Cannot reach WordPress download servers (downloads.w.org and downloads.wordpress.org).\n' +
|
|
52
|
+
'Check your internet connection.';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function isPortAvailable(port) {
|
|
57
|
+
return new Promise((resolve) => {
|
|
58
|
+
const server = net.createServer();
|
|
59
|
+
server.once('error', () => resolve(false));
|
|
60
|
+
server.once('listening', () => {
|
|
61
|
+
server.close(() => resolve(true));
|
|
62
|
+
});
|
|
63
|
+
server.listen(port, '127.0.0.1');
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
export async function getNextPort(instances) {
|
|
67
|
+
const usedPorts = new Set(Object.values(instances).map(i => i.port));
|
|
68
|
+
let port = DEFAULT_PORT_START;
|
|
69
|
+
while (usedPorts.has(port) || !(await isPortAvailable(port))) {
|
|
70
|
+
port++;
|
|
71
|
+
if (port > 9500)
|
|
72
|
+
throw new Error('No available ports in range 9400-9500');
|
|
73
|
+
}
|
|
74
|
+
return port;
|
|
75
|
+
}
|
|
76
|
+
const AUTO_LOGIN_MU_PLUGIN = `<?php
|
|
77
|
+
/**
|
|
78
|
+
* Auto-login for local development. Injected by InstaWP CLI.
|
|
79
|
+
* Visit /?instawp-login to set the auth cookie and redirect to wp-admin.
|
|
80
|
+
*/
|
|
81
|
+
error_reporting(E_ERROR | E_PARSE);
|
|
82
|
+
@ini_set('display_errors', '0');
|
|
83
|
+
add_action('plugins_loaded', function() {
|
|
84
|
+
if (!isset(\$_GET['instawp-login'])) return;
|
|
85
|
+
\$user = get_user_by('login', 'admin');
|
|
86
|
+
if (!\$user) {
|
|
87
|
+
\$admins = get_users(['role' => 'administrator', 'number' => 1]);
|
|
88
|
+
\$user = \$admins[0] ?? null;
|
|
89
|
+
}
|
|
90
|
+
if (\$user) {
|
|
91
|
+
wp_set_current_user(\$user->ID);
|
|
92
|
+
wp_set_auth_cookie(\$user->ID, true);
|
|
93
|
+
wp_safe_redirect(admin_url());
|
|
94
|
+
exit;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
`;
|
|
98
|
+
export function createInstanceDir(name) {
|
|
99
|
+
const dir = getInstanceDir(name);
|
|
100
|
+
if (existsSync(dir)) {
|
|
101
|
+
throw new Error(`Instance "${name}" already exists at ${dir}`);
|
|
102
|
+
}
|
|
103
|
+
const wpContentDir = join(dir, 'wp-content');
|
|
104
|
+
const muPluginsDir = join(wpContentDir, 'mu-plugins');
|
|
105
|
+
mkdirSync(muPluginsDir, { recursive: true });
|
|
106
|
+
writeFileSync(join(muPluginsDir, '0-instawp-auto-login.php'), AUTO_LOGIN_MU_PLUGIN);
|
|
107
|
+
return dir;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Ensure auto-login mu-plugin exists (for instances created before this was added).
|
|
111
|
+
*/
|
|
112
|
+
export function ensureAutoLogin(instance) {
|
|
113
|
+
const muPluginsDir = join(instance.path, 'wp-content', 'mu-plugins');
|
|
114
|
+
const pluginPath = join(muPluginsDir, '0-instawp-auto-login.php');
|
|
115
|
+
if (!existsSync(pluginPath)) {
|
|
116
|
+
mkdirSync(muPluginsDir, { recursive: true });
|
|
117
|
+
writeFileSync(pluginPath, AUTO_LOGIN_MU_PLUGIN);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export function deleteInstanceDir(name) {
|
|
121
|
+
const dir = getInstanceDir(name);
|
|
122
|
+
if (existsSync(dir)) {
|
|
123
|
+
rmSync(dir, { recursive: true, force: true });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function buildServerArgs(instance, blueprint) {
|
|
127
|
+
const wpContentDir = join(instance.path, 'wp-content');
|
|
128
|
+
const isClone = existsSync(join(instance.path, 'sqlite-import.sql')) ||
|
|
129
|
+
existsSync(join(wpContentDir, 'database', '.ht.sqlite'));
|
|
130
|
+
const args = [
|
|
131
|
+
'server',
|
|
132
|
+
`--port=${instance.port}`,
|
|
133
|
+
`--php=${instance.php}`,
|
|
134
|
+
`--wp=${instance.wp}`,
|
|
135
|
+
'--login',
|
|
136
|
+
];
|
|
137
|
+
if (isClone) {
|
|
138
|
+
// For cloned sites: mount subdirs individually AFTER install.
|
|
139
|
+
// This lets Playground set up db.php internally while our data persists.
|
|
140
|
+
const subdirs = ['database', 'plugins', 'themes', 'uploads', 'mu-plugins'];
|
|
141
|
+
for (const subdir of subdirs) {
|
|
142
|
+
const hostDir = join(wpContentDir, subdir);
|
|
143
|
+
if (existsSync(hostDir)) {
|
|
144
|
+
args.push(`--mount=${hostDir}:/wordpress/wp-content/${subdir}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Mount non-core root files (CLAUDE.md, .htaccess, etc.)
|
|
148
|
+
const skipFiles = new Set(['wp-content', 'database.sql', 'sqlite-import.sql', 'clone-blueprint.json', 'import-blueprint.json', 'import-db.php']);
|
|
149
|
+
for (const file of readdirSync(instance.path)) {
|
|
150
|
+
if (skipFiles.has(file) || file.startsWith('.'))
|
|
151
|
+
continue;
|
|
152
|
+
const filePath = join(instance.path, file);
|
|
153
|
+
const stat = statSync(filePath);
|
|
154
|
+
if (stat.isFile()) {
|
|
155
|
+
args.push(`--mount=${filePath}:/wordpress/${file}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Use clone blueprint if it exists (has AST driver + login step)
|
|
159
|
+
if (!blueprint) {
|
|
160
|
+
const cloneBlueprintPath = join(instance.path, 'clone-blueprint.json');
|
|
161
|
+
if (existsSync(cloneBlueprintPath)) {
|
|
162
|
+
blueprint = cloneBlueprintPath;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// For fresh sites: mount entire wp-content before install for persistence
|
|
168
|
+
args.push(`--mount-before-install=${wpContentDir}:/wordpress/wp-content`);
|
|
169
|
+
}
|
|
170
|
+
if (blueprint) {
|
|
171
|
+
args.push(`--blueprint=${blueprint}`);
|
|
172
|
+
}
|
|
173
|
+
return args;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Starts the Playground server in the foreground.
|
|
177
|
+
* Watches stdout for the ready URL and calls onReady when detected.
|
|
178
|
+
* Returns a promise that resolves when the server exits.
|
|
179
|
+
*/
|
|
180
|
+
export function startServer(instance, opts) {
|
|
181
|
+
const args = buildServerArgs(instance, opts?.blueprint);
|
|
182
|
+
const [cmd, prefixArgs] = getPlaygroundCommand();
|
|
183
|
+
return new Promise((resolve, reject) => {
|
|
184
|
+
const child = spawn(cmd, [...prefixArgs, ...args], {
|
|
185
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
186
|
+
cwd: instance.path,
|
|
187
|
+
});
|
|
188
|
+
let readyFired = false;
|
|
189
|
+
// Watch stdout for the server URL to detect readiness
|
|
190
|
+
child.stdout?.on('data', (data) => {
|
|
191
|
+
const text = data.toString();
|
|
192
|
+
process.stdout.write(data);
|
|
193
|
+
if (!readyFired && opts?.onReady) {
|
|
194
|
+
// Playground CLI prints the URL when ready (e.g. "http://127.0.0.1:9400")
|
|
195
|
+
const urlMatch = text.match(/https?:\/\/127\.0\.0\.1:\d+/);
|
|
196
|
+
if (urlMatch) {
|
|
197
|
+
readyFired = true;
|
|
198
|
+
opts.onReady(urlMatch[0]);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
child.stderr?.on('data', (data) => {
|
|
203
|
+
process.stderr.write(data);
|
|
204
|
+
});
|
|
205
|
+
child.on('error', (err) => {
|
|
206
|
+
reject(err);
|
|
207
|
+
});
|
|
208
|
+
child.on('close', (code) => {
|
|
209
|
+
// Restore terminal state — Playground CLI can leave it in raw mode
|
|
210
|
+
if (process.stdin.isTTY) {
|
|
211
|
+
process.stdin.setRawMode?.(false);
|
|
212
|
+
}
|
|
213
|
+
if (process.platform !== 'win32') {
|
|
214
|
+
spawnSync('stty', ['sane'], { stdio: 'inherit' });
|
|
215
|
+
}
|
|
216
|
+
resolve(code ?? 0);
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Starts the Playground server in the background.
|
|
222
|
+
* Spawns detached with output going to a log file.
|
|
223
|
+
* Polls until the server is ready, then returns.
|
|
224
|
+
*/
|
|
225
|
+
export async function startServerBackground(instance, blueprint) {
|
|
226
|
+
const args = buildServerArgs(instance, blueprint);
|
|
227
|
+
const [cmd, prefixArgs] = getPlaygroundCommand();
|
|
228
|
+
const logFile = join(instance.path, 'server.log');
|
|
229
|
+
const pidFile = join(instance.path, 'server.pid');
|
|
230
|
+
// Spawn fully detached with output to log file
|
|
231
|
+
const logFd = openSync(logFile, 'w');
|
|
232
|
+
const child = spawn(cmd, [...prefixArgs, ...args], {
|
|
233
|
+
stdio: ['ignore', logFd, logFd],
|
|
234
|
+
cwd: instance.path,
|
|
235
|
+
detached: true,
|
|
236
|
+
});
|
|
237
|
+
const pid = child.pid;
|
|
238
|
+
writeFileSync(pidFile, String(pid));
|
|
239
|
+
child.unref();
|
|
240
|
+
closeSync(logFd);
|
|
241
|
+
// Poll the log file for the ready URL
|
|
242
|
+
const url = `http://127.0.0.1:${instance.port}`;
|
|
243
|
+
const maxWait = 120000;
|
|
244
|
+
const start = Date.now();
|
|
245
|
+
while (Date.now() - start < maxWait) {
|
|
246
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
247
|
+
// Check if process is still alive
|
|
248
|
+
try {
|
|
249
|
+
process.kill(pid, 0);
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
const log = existsSync(logFile) ? readFileSync(logFile, 'utf-8') : '';
|
|
253
|
+
throw new Error(`Server exited unexpectedly. Log:\n${log.slice(-500)}`);
|
|
254
|
+
}
|
|
255
|
+
// Check if server is responding
|
|
256
|
+
try {
|
|
257
|
+
const controller = new AbortController();
|
|
258
|
+
const timer = setTimeout(() => controller.abort(), 2000);
|
|
259
|
+
const res = await fetch(url, { signal: controller.signal, redirect: 'manual' });
|
|
260
|
+
clearTimeout(timer);
|
|
261
|
+
if (res.status === 200 || res.status === 302) {
|
|
262
|
+
return { pid, url };
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
// Not ready yet
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
throw new Error(`Server did not become ready within 120s. Check ${logFile}`);
|
|
270
|
+
}
|
|
271
|
+
export function stopServer(instance) {
|
|
272
|
+
const pidFile = join(instance.path, 'server.pid');
|
|
273
|
+
if (!existsSync(pidFile))
|
|
274
|
+
return false;
|
|
275
|
+
const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);
|
|
276
|
+
try {
|
|
277
|
+
process.kill(pid, 'SIGTERM');
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// Already dead
|
|
281
|
+
}
|
|
282
|
+
rmSync(pidFile, { force: true });
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
export function isServerRunning(instance) {
|
|
286
|
+
const pidFile = join(instance.path, 'server.pid');
|
|
287
|
+
if (!existsSync(pidFile))
|
|
288
|
+
return false;
|
|
289
|
+
const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);
|
|
290
|
+
try {
|
|
291
|
+
process.kill(pid, 0);
|
|
292
|
+
return true;
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
rmSync(pidFile, { force: true });
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=local-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-env.js","sourceRoot":"","sources":["../../src/lib/local-env.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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"}
|