localwp-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +229 -0
  3. package/dist/backup.d.ts +72 -0
  4. package/dist/backup.js +351 -0
  5. package/dist/backup.js.map +1 -0
  6. package/dist/config.d.ts +24 -0
  7. package/dist/config.js +58 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/environment-check.d.ts +187 -0
  10. package/dist/environment-check.js +174 -0
  11. package/dist/environment-check.js.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +14 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/local-doctor.d.ts +42 -0
  16. package/dist/local-doctor.js +224 -0
  17. package/dist/local-doctor.js.map +1 -0
  18. package/dist/local-sites.d.ts +103 -0
  19. package/dist/local-sites.js +234 -0
  20. package/dist/local-sites.js.map +1 -0
  21. package/dist/local-tooling.d.ts +2 -0
  22. package/dist/local-tooling.js +23 -0
  23. package/dist/local-tooling.js.map +1 -0
  24. package/dist/logs.d.ts +144 -0
  25. package/dist/logs.js +208 -0
  26. package/dist/logs.js.map +1 -0
  27. package/dist/mysql.d.ts +17 -0
  28. package/dist/mysql.js +229 -0
  29. package/dist/mysql.js.map +1 -0
  30. package/dist/permissions.d.ts +4 -0
  31. package/dist/permissions.js +129 -0
  32. package/dist/permissions.js.map +1 -0
  33. package/dist/platform-paths.d.ts +10 -0
  34. package/dist/platform-paths.js +95 -0
  35. package/dist/platform-paths.js.map +1 -0
  36. package/dist/process-utils.d.ts +13 -0
  37. package/dist/process-utils.js +128 -0
  38. package/dist/process-utils.js.map +1 -0
  39. package/dist/prompts.d.ts +2 -0
  40. package/dist/prompts.js +64 -0
  41. package/dist/prompts.js.map +1 -0
  42. package/dist/resources.d.ts +2 -0
  43. package/dist/resources.js +110 -0
  44. package/dist/resources.js.map +1 -0
  45. package/dist/results.d.ts +15 -0
  46. package/dist/results.js +26 -0
  47. package/dist/results.js.map +1 -0
  48. package/dist/server.d.ts +2 -0
  49. package/dist/server.js +23 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/tool-schemas.d.ts +14 -0
  52. package/dist/tool-schemas.js +20 -0
  53. package/dist/tool-schemas.js.map +1 -0
  54. package/dist/tools/backup-site.d.ts +2 -0
  55. package/dist/tools/backup-site.js +42 -0
  56. package/dist/tools/backup-site.js.map +1 -0
  57. package/dist/tools/db-export.d.ts +2 -0
  58. package/dist/tools/db-export.js +40 -0
  59. package/dist/tools/db-export.js.map +1 -0
  60. package/dist/tools/db-import.d.ts +2 -0
  61. package/dist/tools/db-import.js +42 -0
  62. package/dist/tools/db-import.js.map +1 -0
  63. package/dist/tools/execute-wp-cli.d.ts +2 -0
  64. package/dist/tools/execute-wp-cli.js +34 -0
  65. package/dist/tools/execute-wp-cli.js.map +1 -0
  66. package/dist/tools/index.d.ts +2 -0
  67. package/dist/tools/index.js +29 -0
  68. package/dist/tools/index.js.map +1 -0
  69. package/dist/tools/list-local-sites.d.ts +2 -0
  70. package/dist/tools/list-local-sites.js +32 -0
  71. package/dist/tools/list-local-sites.js.map +1 -0
  72. package/dist/tools/local-doctor.d.ts +2 -0
  73. package/dist/tools/local-doctor.js +23 -0
  74. package/dist/tools/local-doctor.js.map +1 -0
  75. package/dist/tools/local-environment-check.d.ts +2 -0
  76. package/dist/tools/local-environment-check.js +32 -0
  77. package/dist/tools/local-environment-check.js.map +1 -0
  78. package/dist/tools/local-logs.d.ts +2 -0
  79. package/dist/tools/local-logs.js +31 -0
  80. package/dist/tools/local-logs.js.map +1 -0
  81. package/dist/tools/local-site-info.d.ts +2 -0
  82. package/dist/tools/local-site-info.js +46 -0
  83. package/dist/tools/local-site-info.js.map +1 -0
  84. package/dist/tools/mysql-execute.d.ts +2 -0
  85. package/dist/tools/mysql-execute.js +46 -0
  86. package/dist/tools/mysql-execute.js.map +1 -0
  87. package/dist/tools/mysql-query.d.ts +2 -0
  88. package/dist/tools/mysql-query.js +43 -0
  89. package/dist/tools/mysql-query.js.map +1 -0
  90. package/dist/tools/mysql-schema.d.ts +2 -0
  91. package/dist/tools/mysql-schema.js +50 -0
  92. package/dist/tools/mysql-schema.js.map +1 -0
  93. package/dist/tools/restore-backup.d.ts +2 -0
  94. package/dist/tools/restore-backup.js +52 -0
  95. package/dist/tools/restore-backup.js.map +1 -0
  96. package/dist/types.d.ts +84 -0
  97. package/dist/types.js +2 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/wp-cli.d.ts +14 -0
  100. package/dist/wp-cli.js +140 -0
  101. package/dist/wp-cli.js.map +1 -0
  102. package/package.json +61 -0
package/dist/logs.d.ts ADDED
@@ -0,0 +1,144 @@
1
+ import type { LogScope, SiteSelection } from "./types.js";
2
+ export declare function clampLogLines(lines: number | undefined): number;
3
+ export declare function collectLocalLogs(selection: SiteSelection, options?: {
4
+ scope?: LogScope;
5
+ lines?: number;
6
+ }): Promise<{
7
+ scope: LogScope;
8
+ requestedLines: number;
9
+ site: {
10
+ id: string;
11
+ name: string;
12
+ status: string;
13
+ domain: string | undefined;
14
+ path: string;
15
+ wpRoot: string;
16
+ localVersion: string | undefined;
17
+ phpVersion: string | null;
18
+ mysqlVersion: string | null;
19
+ httpPort: number | null;
20
+ mysqlPort: number | null;
21
+ } | null;
22
+ siteLogs: ({
23
+ readable: boolean;
24
+ excerpt: null;
25
+ excerptLineCount: number;
26
+ truncatedExcerpt: boolean;
27
+ sizeBytes: null;
28
+ modifiedAt: null;
29
+ key: string;
30
+ label: string;
31
+ path: string;
32
+ source: "site" | "global";
33
+ format: "text" | "csv";
34
+ } | {
35
+ readable: boolean;
36
+ excerpt: string | null;
37
+ excerptLineCount: number;
38
+ truncatedExcerpt: boolean;
39
+ sizeBytes: number;
40
+ modifiedAt: string;
41
+ key: string;
42
+ label: string;
43
+ path: string;
44
+ source: "site" | "global";
45
+ format: "text" | "csv";
46
+ })[];
47
+ globalLogs: ({
48
+ readable: boolean;
49
+ excerpt: null;
50
+ excerptLineCount: number;
51
+ truncatedExcerpt: boolean;
52
+ sizeBytes: null;
53
+ modifiedAt: null;
54
+ key: string;
55
+ label: string;
56
+ path: string;
57
+ source: "site" | "global";
58
+ format: "text" | "csv";
59
+ } | {
60
+ readable: boolean;
61
+ excerpt: string | null;
62
+ excerptLineCount: number;
63
+ truncatedExcerpt: boolean;
64
+ sizeBytes: number;
65
+ modifiedAt: string;
66
+ key: string;
67
+ label: string;
68
+ path: string;
69
+ source: "site" | "global";
70
+ format: "text" | "csv";
71
+ })[];
72
+ }>;
73
+ export declare function summarizeLogAvailability(selection?: SiteSelection): Promise<{
74
+ site: {
75
+ id: string;
76
+ name: string;
77
+ status: string;
78
+ domain: string | undefined;
79
+ path: string;
80
+ wpRoot: string;
81
+ localVersion: string | undefined;
82
+ phpVersion: string | null;
83
+ mysqlVersion: string | null;
84
+ httpPort: number | null;
85
+ mysqlPort: number | null;
86
+ } | null;
87
+ siteLogs: ({
88
+ readable: boolean;
89
+ excerpt: null;
90
+ excerptLineCount: number;
91
+ truncatedExcerpt: boolean;
92
+ sizeBytes: null;
93
+ modifiedAt: null;
94
+ key: string;
95
+ label: string;
96
+ path: string;
97
+ source: "site" | "global";
98
+ format: "text" | "csv";
99
+ } | {
100
+ readable: boolean;
101
+ excerpt: string | null;
102
+ excerptLineCount: number;
103
+ truncatedExcerpt: boolean;
104
+ sizeBytes: number;
105
+ modifiedAt: string;
106
+ key: string;
107
+ label: string;
108
+ path: string;
109
+ source: "site" | "global";
110
+ format: "text" | "csv";
111
+ })[];
112
+ globalLogs: ({
113
+ readable: boolean;
114
+ excerpt: null;
115
+ excerptLineCount: number;
116
+ truncatedExcerpt: boolean;
117
+ sizeBytes: null;
118
+ modifiedAt: null;
119
+ key: string;
120
+ label: string;
121
+ path: string;
122
+ source: "site" | "global";
123
+ format: "text" | "csv";
124
+ } | {
125
+ readable: boolean;
126
+ excerpt: string | null;
127
+ excerptLineCount: number;
128
+ truncatedExcerpt: boolean;
129
+ sizeBytes: number;
130
+ modifiedAt: string;
131
+ key: string;
132
+ label: string;
133
+ path: string;
134
+ source: "site" | "global";
135
+ format: "text" | "csv";
136
+ })[];
137
+ }>;
138
+ export declare function readLastLines(filePath: string, lineCount: number): Promise<{
139
+ excerpt: string;
140
+ excerptLineCount: number;
141
+ truncated: boolean;
142
+ sizeBytes: number;
143
+ modifiedAt: string;
144
+ }>;
package/dist/logs.js ADDED
@@ -0,0 +1,208 @@
1
+ import { open, readdir, stat } from "fs/promises";
2
+ import path from "path";
3
+ import { config } from "./config.js";
4
+ import { buildSiteContext, summarizeSite } from "./local-sites.js";
5
+ import { isReadablePath } from "./process-utils.js";
6
+ const MAX_TAIL_BYTES = 256 * 1024;
7
+ const globalLogPattern = /^local-(?:lightning(?:-verbose)?|by-flywheel)\d*\.log$/i;
8
+ export function clampLogLines(lines) {
9
+ if (!lines) {
10
+ return config.defaultLogTailLines;
11
+ }
12
+ return Math.min(Math.max(lines, 1), config.maxLogTailLines);
13
+ }
14
+ export async function collectLocalLogs(selection, options = {}) {
15
+ const scope = options.scope || "site";
16
+ const lines = clampLogLines(options.lines);
17
+ const includeSite = scope === "site" || scope === "all";
18
+ const includeGlobal = scope === "global" || scope === "all";
19
+ const context = includeSite ? await buildSiteContext(selection) : null;
20
+ const siteLogs = context
21
+ ? await describeLogFiles(buildSiteLogCandidates(context), lines, true)
22
+ : [];
23
+ const globalLogs = includeGlobal
24
+ ? await describeLogFiles(await buildGlobalLogCandidates(), lines, true)
25
+ : [];
26
+ return {
27
+ scope,
28
+ requestedLines: lines,
29
+ site: context ? summarizeSite(context.site) : null,
30
+ siteLogs,
31
+ globalLogs,
32
+ };
33
+ }
34
+ export async function summarizeLogAvailability(selection = {}) {
35
+ let context = null;
36
+ try {
37
+ context = await buildSiteContext(selection);
38
+ }
39
+ catch {
40
+ context = null;
41
+ }
42
+ const [siteLogs, globalLogs] = await Promise.all([
43
+ context
44
+ ? describeLogFiles(buildSiteLogCandidates(context), 0, false)
45
+ : Promise.resolve([]),
46
+ describeLogFiles(await buildGlobalLogCandidates(), 0, false),
47
+ ]);
48
+ return {
49
+ site: context ? summarizeSite(context.site) : null,
50
+ siteLogs,
51
+ globalLogs,
52
+ };
53
+ }
54
+ export async function readLastLines(filePath, lineCount) {
55
+ const handle = await open(filePath, "r");
56
+ try {
57
+ const fileStats = await stat(filePath);
58
+ const bytesToRead = Math.min(fileStats.size, MAX_TAIL_BYTES);
59
+ const start = Math.max(0, fileStats.size - bytesToRead);
60
+ const buffer = Buffer.alloc(bytesToRead);
61
+ if (bytesToRead > 0) {
62
+ await handle.read(buffer, 0, bytesToRead, start);
63
+ }
64
+ const raw = buffer.toString("utf8");
65
+ const lines = raw.split(/\r?\n/);
66
+ if (start > 0 && lines.length > 0) {
67
+ lines.shift();
68
+ }
69
+ if (lines[lines.length - 1] === "") {
70
+ lines.pop();
71
+ }
72
+ const excerptLines = lineCount > 0 ? lines.slice(-lineCount) : [];
73
+ return {
74
+ excerpt: excerptLines.join("\n"),
75
+ excerptLineCount: excerptLines.length,
76
+ truncated: fileStats.size > bytesToRead || lines.length > lineCount,
77
+ sizeBytes: fileStats.size,
78
+ modifiedAt: fileStats.mtime.toISOString(),
79
+ };
80
+ }
81
+ finally {
82
+ await handle.close();
83
+ }
84
+ }
85
+ function buildSiteLogCandidates(context) {
86
+ return [
87
+ {
88
+ key: "wp_debug_log",
89
+ label: "WordPress Debug Log",
90
+ path: path.join(context.wpRoot, "wp-content", "debug.log"),
91
+ source: "site",
92
+ format: "text",
93
+ },
94
+ {
95
+ key: "php_error_log",
96
+ label: "PHP Error Log",
97
+ path: path.join(context.site.absolutePath, "logs", "php", "error.log"),
98
+ source: "site",
99
+ format: "text",
100
+ },
101
+ {
102
+ key: "php_fpm_log",
103
+ label: "PHP-FPM Log",
104
+ path: path.join(context.site.absolutePath, "logs", "php", "php-fpm.log"),
105
+ source: "site",
106
+ format: "text",
107
+ },
108
+ {
109
+ key: "nginx_error_log",
110
+ label: "Site Nginx Error Log",
111
+ path: path.join(context.site.absolutePath, "logs", "nginx", "error.log"),
112
+ source: "site",
113
+ format: "text",
114
+ },
115
+ {
116
+ key: "runtime_nginx_error_log",
117
+ label: "Runtime Nginx Error Log",
118
+ path: path.join(context.runtimeDir, "nginx", "logs", "error.log"),
119
+ source: "site",
120
+ format: "text",
121
+ },
122
+ {
123
+ key: "mysql_general_log",
124
+ label: "MySQL General Log",
125
+ path: path.join(context.runtimeDir, "mysql", "data", "mysql", "general_log.CSV"),
126
+ source: "site",
127
+ format: "csv",
128
+ },
129
+ {
130
+ key: "mysql_slow_log",
131
+ label: "MySQL Slow Log",
132
+ path: path.join(context.runtimeDir, "mysql", "data", "mysql", "slow_log.CSV"),
133
+ source: "site",
134
+ format: "csv",
135
+ },
136
+ ];
137
+ }
138
+ async function buildGlobalLogCandidates() {
139
+ const logDirectory = getGlobalLogDirectory();
140
+ if (!(await isReadablePath(logDirectory))) {
141
+ return [
142
+ {
143
+ key: "local_log_directory",
144
+ label: "Local Global Log Directory",
145
+ path: logDirectory,
146
+ source: "global",
147
+ format: "text",
148
+ },
149
+ ];
150
+ }
151
+ const entries = await readdir(logDirectory, { withFileTypes: true });
152
+ const logFiles = entries
153
+ .filter((entry) => entry.isFile() && globalLogPattern.test(entry.name))
154
+ .map((entry) => entry.name)
155
+ .sort((left, right) => right.localeCompare(left));
156
+ return logFiles.map((fileName) => ({
157
+ key: `global_${fileName.replace(/[^a-z0-9]+/gi, "_").toLowerCase()}`,
158
+ label: `Local App Log: ${fileName}`,
159
+ path: path.join(logDirectory, fileName),
160
+ source: "global",
161
+ format: "text",
162
+ }));
163
+ }
164
+ async function describeLogFiles(candidates, lines, includeContent) {
165
+ return Promise.all(candidates.map(async (candidate) => {
166
+ const readable = await isReadablePath(candidate.path);
167
+ if (!readable) {
168
+ return {
169
+ ...candidate,
170
+ readable: false,
171
+ excerpt: null,
172
+ excerptLineCount: 0,
173
+ truncatedExcerpt: false,
174
+ sizeBytes: null,
175
+ modifiedAt: null,
176
+ };
177
+ }
178
+ const summary = includeContent && lines > 0
179
+ ? await readLastLines(candidate.path, lines)
180
+ : await describeFile(candidate.path);
181
+ return {
182
+ ...candidate,
183
+ readable: true,
184
+ excerpt: includeContent && lines > 0 ? summary.excerpt : null,
185
+ excerptLineCount: summary.excerptLineCount,
186
+ truncatedExcerpt: summary.truncated,
187
+ sizeBytes: summary.sizeBytes,
188
+ modifiedAt: summary.modifiedAt,
189
+ };
190
+ }));
191
+ }
192
+ async function describeFile(filePath) {
193
+ const fileStats = await stat(filePath);
194
+ return {
195
+ excerpt: "",
196
+ excerptLineCount: 0,
197
+ truncated: false,
198
+ sizeBytes: fileStats.size,
199
+ modifiedAt: fileStats.mtime.toISOString(),
200
+ };
201
+ }
202
+ function getGlobalLogDirectory() {
203
+ if (config.platform === "darwin") {
204
+ return path.join(config.homeDir, "Library", "Logs");
205
+ }
206
+ return config.localAppSupportDir;
207
+ }
208
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { SiteContext } from "./types.js";
2
+ export declare function ensureMysqlReady(context: SiteContext): Promise<void>;
3
+ export declare function executeMysqlStatement(context: SiteContext, sql: string, maxRows: number): Promise<{
4
+ columns: string[];
5
+ rows: Record<string, unknown>[];
6
+ totalRows: number;
7
+ returnedRows: number;
8
+ truncated: boolean;
9
+ stderr: string | null;
10
+ }>;
11
+ export declare function validateSafeSqlQuery(sql: string): string;
12
+ export declare function validateFullAccessSql(sql: string): string;
13
+ export declare function normalizeSqlStatement(sql: string): string;
14
+ export declare function getSqlVerb(sql: string): string;
15
+ export declare function buildListTablesSql(databaseName: string): string;
16
+ export declare function buildDescribeTableSql(databaseName: string, tableName: string): string;
17
+ export declare function clampMaxRows(maxRows: number | undefined): number;
package/dist/mysql.js ADDED
@@ -0,0 +1,229 @@
1
+ import { config } from "./config.js";
2
+ import { assertReadable, spawnCommand } from "./process-utils.js";
3
+ const mysqlReadOnlyVerbs = new Set([
4
+ "SELECT",
5
+ "SHOW",
6
+ "DESCRIBE",
7
+ "DESC",
8
+ "EXPLAIN",
9
+ ]);
10
+ export async function ensureMysqlReady(context) {
11
+ if (context.site.status !== "running") {
12
+ throw new Error(`The Local site '${context.site.name}' is not running. Start it in Local before using MySQL tools.`);
13
+ }
14
+ if (context.mysqlSocket) {
15
+ await assertReadable(context.mysqlSocket, `MySQL socket is not available for site '${context.site.name}'`);
16
+ }
17
+ else if (!context.mysqlPort) {
18
+ throw new Error(`No MySQL socket or TCP port is available for site '${context.site.name}'.`);
19
+ }
20
+ }
21
+ export async function executeMysqlStatement(context, sql, maxRows) {
22
+ const args = [
23
+ `--defaults-file=${context.mysqlDefaultsFile}`,
24
+ "--batch",
25
+ "--default-character-set=utf8mb4",
26
+ `--execute=${sql}`,
27
+ ];
28
+ if (context.mysqlSocket) {
29
+ args.push("--protocol=SOCKET", `--socket=${context.mysqlSocket}`);
30
+ }
31
+ else {
32
+ args.push("--protocol=TCP", `--host=${context.mysqlHost || config.defaultMysqlHost}`);
33
+ if (context.mysqlPort) {
34
+ args.push(`--port=${context.mysqlPort}`);
35
+ }
36
+ }
37
+ args.push(context.database);
38
+ const result = await spawnCommand(context.mysql.binaryPath, args, {
39
+ cwd: context.wpRoot,
40
+ env: process.env,
41
+ });
42
+ if (result.timedOut) {
43
+ throw new Error(`MySQL query timed out after ${config.defaultTimeoutMs / 1000}s for site '${context.site.name}'.`);
44
+ }
45
+ if (result.exitCode !== 0) {
46
+ throw new Error([
47
+ `MySQL exited with code ${result.exitCode} for site '${context.site.name}'.`,
48
+ result.stderr,
49
+ result.stdout,
50
+ ]
51
+ .filter(Boolean)
52
+ .join("\n\n"));
53
+ }
54
+ const parsed = parseMysqlBatchOutput(result.stdout, maxRows);
55
+ return {
56
+ columns: parsed.columns,
57
+ rows: parsed.rows,
58
+ totalRows: parsed.totalRows,
59
+ returnedRows: parsed.rows.length,
60
+ truncated: parsed.truncated,
61
+ stderr: result.stderr || null,
62
+ };
63
+ }
64
+ export function validateSafeSqlQuery(sql) {
65
+ const normalizedSql = normalizeSqlStatement(sql);
66
+ const verb = getSqlVerb(normalizedSql);
67
+ if (!mysqlReadOnlyVerbs.has(verb)) {
68
+ throw new Error("The 'safe' profile only allows SELECT, SHOW, DESCRIBE, DESC, and EXPLAIN.");
69
+ }
70
+ return normalizedSql;
71
+ }
72
+ export function validateFullAccessSql(sql) {
73
+ return normalizeSqlStatement(sql);
74
+ }
75
+ export function normalizeSqlStatement(sql) {
76
+ const normalizedSql = stripLeadingSqlComments(sql)
77
+ .replace(/;+\s*$/, "")
78
+ .trim();
79
+ if (!normalizedSql) {
80
+ throw new Error("SQL statement cannot be empty.");
81
+ }
82
+ if (normalizedSql.includes(";")) {
83
+ throw new Error("Only a single SQL statement is allowed.");
84
+ }
85
+ if (/\bINTO\s+OUTFILE\b/i.test(normalizedSql) ||
86
+ /\bINTO\s+DUMPFILE\b/i.test(normalizedSql) ||
87
+ /\bLOAD_FILE\s*\(/i.test(normalizedSql) ||
88
+ /\bLOAD\s+DATA\b/i.test(normalizedSql)) {
89
+ throw new Error("File read/write SQL features are blocked.");
90
+ }
91
+ return normalizedSql;
92
+ }
93
+ export function getSqlVerb(sql) {
94
+ const firstToken = sql.match(/^[A-Za-z]+/);
95
+ if (!firstToken) {
96
+ throw new Error("The SQL statement must start with a SQL verb.");
97
+ }
98
+ return firstToken[0].toUpperCase();
99
+ }
100
+ export function buildListTablesSql(databaseName) {
101
+ return [
102
+ "SELECT",
103
+ " TABLE_NAME,",
104
+ " TABLE_TYPE,",
105
+ " ENGINE,",
106
+ " TABLE_ROWS,",
107
+ " CREATE_TIME,",
108
+ " UPDATE_TIME",
109
+ "FROM INFORMATION_SCHEMA.TABLES",
110
+ `WHERE TABLE_SCHEMA = '${escapeSqlLiteral(databaseName)}'`,
111
+ "ORDER BY TABLE_NAME",
112
+ ].join(" ");
113
+ }
114
+ export function buildDescribeTableSql(databaseName, tableName) {
115
+ return [
116
+ "SELECT",
117
+ " COLUMN_NAME,",
118
+ " COLUMN_TYPE,",
119
+ " IS_NULLABLE,",
120
+ " COLUMN_DEFAULT,",
121
+ " COLUMN_KEY,",
122
+ " EXTRA",
123
+ "FROM INFORMATION_SCHEMA.COLUMNS",
124
+ `WHERE TABLE_SCHEMA = '${escapeSqlLiteral(databaseName)}'`,
125
+ ` AND TABLE_NAME = '${escapeSqlLiteral(tableName)}'`,
126
+ "ORDER BY ORDINAL_POSITION",
127
+ ].join(" ");
128
+ }
129
+ export function clampMaxRows(maxRows) {
130
+ if (!maxRows) {
131
+ return config.defaultMaxRows;
132
+ }
133
+ return Math.min(Math.max(maxRows, 1), config.maxMaxRows);
134
+ }
135
+ function parseMysqlBatchOutput(output, maxRows) {
136
+ const trimmed = output.trim();
137
+ if (!trimmed) {
138
+ return {
139
+ columns: [],
140
+ rows: [],
141
+ totalRows: 0,
142
+ truncated: false,
143
+ };
144
+ }
145
+ const lines = trimmed.split(/\r?\n/);
146
+ const header = lines.shift();
147
+ if (!header) {
148
+ return {
149
+ columns: [],
150
+ rows: [],
151
+ totalRows: 0,
152
+ truncated: false,
153
+ };
154
+ }
155
+ const columns = header.split("\t").map((value) => decodeMysqlHeader(value));
156
+ const rawRows = lines
157
+ .filter((line) => line.length > 0)
158
+ .map((line) => line.split("\t").map(decodeMysqlValue));
159
+ const truncated = rawRows.length > maxRows;
160
+ const limitedRows = rawRows.slice(0, maxRows);
161
+ const rows = limitedRows.map((values) => {
162
+ const row = {};
163
+ columns.forEach((column, index) => {
164
+ row[column] = values[index] ?? null;
165
+ });
166
+ return row;
167
+ });
168
+ return {
169
+ columns,
170
+ rows,
171
+ totalRows: rawRows.length,
172
+ truncated,
173
+ };
174
+ }
175
+ function decodeMysqlValue(value) {
176
+ if (value === "NULL") {
177
+ return null;
178
+ }
179
+ return value.replace(/\\([0btnrZ\\])/g, (_, token) => {
180
+ switch (token) {
181
+ case "0":
182
+ return "\0";
183
+ case "b":
184
+ return "\b";
185
+ case "t":
186
+ return "\t";
187
+ case "n":
188
+ return "\n";
189
+ case "r":
190
+ return "\r";
191
+ case "Z":
192
+ return "\x1a";
193
+ case "\\":
194
+ return "\\";
195
+ default:
196
+ return token;
197
+ }
198
+ });
199
+ }
200
+ function decodeMysqlHeader(value) {
201
+ return decodeMysqlValue(value) ?? "";
202
+ }
203
+ function stripLeadingSqlComments(sql) {
204
+ let result = sql.trimStart();
205
+ while (result) {
206
+ if (result.startsWith("/*")) {
207
+ const endIndex = result.indexOf("*/");
208
+ if (endIndex === -1) {
209
+ throw new Error("SQL contains an unterminated block comment.");
210
+ }
211
+ result = result.slice(endIndex + 2).trimStart();
212
+ continue;
213
+ }
214
+ if (result.startsWith("--") || result.startsWith("#")) {
215
+ const newlineIndex = result.indexOf("\n");
216
+ result =
217
+ newlineIndex === -1
218
+ ? ""
219
+ : result.slice(newlineIndex + 1).trimStart();
220
+ continue;
221
+ }
222
+ break;
223
+ }
224
+ return result;
225
+ }
226
+ function escapeSqlLiteral(value) {
227
+ return String(value).replace(/\\/g, "\\\\").replace(/'/g, "\\'");
228
+ }
229
+ //# sourceMappingURL=mysql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../src/mysql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AccessProfile } from "./types.js";
2
+ export declare function assertAllowedWpFlags(args: string[]): void;
3
+ export declare function assertWpCliPermissions(args: string[]): void;
4
+ export declare function assertWpCliPermissionsForProfile(profile: AccessProfile, args: string[]): void;