@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
package/dist/index.js
CHANGED
|
@@ -10,6 +10,10 @@ 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';
|
|
14
|
+
import { registerDbCommand } from './commands/db.js';
|
|
15
|
+
import { registerOpenCommand } from './commands/open.js';
|
|
16
|
+
import { registerLogsCommand } from './commands/logs.js';
|
|
13
17
|
const require = createRequire(import.meta.url);
|
|
14
18
|
const { version } = require('../package.json');
|
|
15
19
|
// Early --json detection so it works in any argv position
|
|
@@ -32,12 +36,35 @@ registerWhoamiCommand(program);
|
|
|
32
36
|
registerSitesCommand(program);
|
|
33
37
|
registerCreateAlias(program);
|
|
34
38
|
// -- Remote access --
|
|
35
|
-
registerExecCommand(program);
|
|
36
39
|
registerWpCommand(program);
|
|
40
|
+
registerExecCommand(program);
|
|
37
41
|
registerSshCommand(program);
|
|
38
42
|
registerSyncCommand(program);
|
|
43
|
+
registerDbCommand(program);
|
|
44
|
+
registerLogsCommand(program);
|
|
45
|
+
registerOpenCommand(program);
|
|
39
46
|
// -- Teams --
|
|
40
47
|
registerTeamsCommand(program);
|
|
48
|
+
// -- Local dev --
|
|
49
|
+
registerLocalCommand(program);
|
|
50
|
+
// -- Changelog --
|
|
51
|
+
program
|
|
52
|
+
.command('changelog')
|
|
53
|
+
.description('Show recent changes')
|
|
54
|
+
.action(() => {
|
|
55
|
+
const changelogPath = new URL('../CHANGELOG.md', import.meta.url);
|
|
56
|
+
try {
|
|
57
|
+
const fs = require('fs');
|
|
58
|
+
const content = fs.readFileSync(changelogPath, 'utf-8');
|
|
59
|
+
// Show only the latest version
|
|
60
|
+
const sections = content.split(/\n## /);
|
|
61
|
+
const latest = sections[1] ? `## ${sections[1]}` : content;
|
|
62
|
+
console.log(latest.trim());
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
console.log(`Changelog: https://github.com/InstaWP/cli/blob/main/CHANGELOG.md`);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
41
68
|
// Custom help layout
|
|
42
69
|
program.configureHelp({
|
|
43
70
|
sortSubcommands: false,
|
|
@@ -54,25 +81,44 @@ ${d('Auth')}
|
|
|
54
81
|
${d('Sites')}
|
|
55
82
|
${c('create')} Create a new WordPress site
|
|
56
83
|
${c('sites list')} List all sites
|
|
84
|
+
${c('sites creds')} Show WP admin credentials + Magic Login URL
|
|
85
|
+
${c('sites php')} View or update PHP version/settings
|
|
57
86
|
${c('sites delete')} Delete a site
|
|
87
|
+
${c('open')} ${d('<site>')} Open site (or --admin / --magic) in browser
|
|
58
88
|
|
|
59
89
|
${d('Remote Access')}
|
|
60
|
-
${c('
|
|
61
|
-
${c('
|
|
62
|
-
${c('
|
|
63
|
-
${c('
|
|
90
|
+
${c('wp')} ${d('<site>')} ${d('<args>')} WP-CLI on a remote site (primary)
|
|
91
|
+
${c('ssh')} ${d('<site>')} Interactive SSH session
|
|
92
|
+
${c('sync')} ${d('push|pull')} Sync wp-content via rsync
|
|
93
|
+
${c('db')} ${d('push|pull')} Push/pull MySQL database (auto-backup)
|
|
94
|
+
${c('logs')} ${d('<site>')} Tail WP / PHP / nginx logs
|
|
95
|
+
${c('exec')} ${d('<site>')} ${d('<cmd>')} Run arbitrary shell (escape hatch for non-WP)
|
|
96
|
+
|
|
97
|
+
${d('Local Development')}
|
|
98
|
+
${c('local create')} Create and start a local WordPress site
|
|
99
|
+
${c('local clone')} Clone an InstaWP cloud site to local
|
|
100
|
+
${c('local start')} Start an existing local site
|
|
101
|
+
${c('local stop')} Stop a background local site
|
|
102
|
+
${c('local push')} Push local wp-content to InstaWP cloud
|
|
103
|
+
${c('local pull')} Pull cloud wp-content to local site
|
|
104
|
+
${c('local list')} List local sites
|
|
105
|
+
${c('local delete')} Delete a local site
|
|
64
106
|
|
|
65
107
|
${d('Teams')}
|
|
66
108
|
${c('teams list')} List teams
|
|
109
|
+
${c('teams switch')} Switch active team
|
|
67
110
|
${c('teams members')} List team members
|
|
68
111
|
|
|
69
112
|
${d('Examples')}
|
|
70
113
|
$ instawp login
|
|
71
114
|
$ instawp create --name my-site
|
|
115
|
+
$ instawp local create --name blog
|
|
72
116
|
$ instawp wp my-site plugin list
|
|
73
|
-
$ instawp
|
|
74
|
-
$ instawp
|
|
75
|
-
$ instawp
|
|
117
|
+
$ instawp wp my-site -- post list --post_type=page
|
|
118
|
+
$ instawp open my-site --admin
|
|
119
|
+
$ instawp db pull my-site
|
|
120
|
+
$ instawp logs my-site --follow
|
|
121
|
+
$ instawp sites creds my-site
|
|
76
122
|
`;
|
|
77
123
|
});
|
|
78
124
|
// Override default help to only show options (commands are in custom section)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;
|
|
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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"}
|
package/dist/lib/output.js
CHANGED
|
@@ -49,8 +49,21 @@ export function table(headers, rows) {
|
|
|
49
49
|
}
|
|
50
50
|
console.log(t.toString());
|
|
51
51
|
}
|
|
52
|
+
function shouldSuppressSpinner() {
|
|
53
|
+
if (jsonMode)
|
|
54
|
+
return true;
|
|
55
|
+
if (!process.stdout.isTTY)
|
|
56
|
+
return true;
|
|
57
|
+
if (process.env.CI)
|
|
58
|
+
return true;
|
|
59
|
+
if (process.env.INSTAWP_QUIET)
|
|
60
|
+
return true;
|
|
61
|
+
if (process.env.NO_COLOR)
|
|
62
|
+
return true;
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
52
65
|
export function spinner(text) {
|
|
53
|
-
if (
|
|
66
|
+
if (shouldSuppressSpinner()) {
|
|
54
67
|
return { text: '', start() { return this; }, succeed() { }, fail() { }, stop() { } };
|
|
55
68
|
}
|
|
56
69
|
return ora(text);
|
package/dist/lib/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|