pressship 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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +160 -0
  3. package/dist/auth/login.d.ts +1 -0
  4. package/dist/auth/login.js +39 -0
  5. package/dist/auth/login.js.map +1 -0
  6. package/dist/auth/logout.d.ts +1 -0
  7. package/dist/auth/logout.js +12 -0
  8. package/dist/auth/logout.js.map +1 -0
  9. package/dist/auth/session.d.ts +12 -0
  10. package/dist/auth/session.js +72 -0
  11. package/dist/auth/session.js.map +1 -0
  12. package/dist/auth/whoami.d.ts +17 -0
  13. package/dist/auth/whoami.js +108 -0
  14. package/dist/auth/whoami.js.map +1 -0
  15. package/dist/checks/plugin-check-environment.d.ts +16 -0
  16. package/dist/checks/plugin-check-environment.js +209 -0
  17. package/dist/checks/plugin-check-environment.js.map +1 -0
  18. package/dist/checks/plugin-check.d.ts +16 -0
  19. package/dist/checks/plugin-check.js +176 -0
  20. package/dist/checks/plugin-check.js.map +1 -0
  21. package/dist/checks/readme-validator.d.ts +16 -0
  22. package/dist/checks/readme-validator.js +84 -0
  23. package/dist/checks/readme-validator.js.map +1 -0
  24. package/dist/checks/summary.d.ts +3 -0
  25. package/dist/checks/summary.js +73 -0
  26. package/dist/checks/summary.js.map +1 -0
  27. package/dist/cli.d.ts +2 -0
  28. package/dist/cli.js +66 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/package/archive.d.ts +12 -0
  31. package/dist/package/archive.js +64 -0
  32. package/dist/package/archive.js.map +1 -0
  33. package/dist/package/ignore.d.ts +2 -0
  34. package/dist/package/ignore.js +48 -0
  35. package/dist/package/ignore.js.map +1 -0
  36. package/dist/plugin/discover.d.ts +2 -0
  37. package/dist/plugin/discover.js +67 -0
  38. package/dist/plugin/discover.js.map +1 -0
  39. package/dist/plugin/headers.d.ts +3 -0
  40. package/dist/plugin/headers.js +54 -0
  41. package/dist/plugin/headers.js.map +1 -0
  42. package/dist/plugin/readme.d.ts +3 -0
  43. package/dist/plugin/readme.js +103 -0
  44. package/dist/plugin/readme.js.map +1 -0
  45. package/dist/svn/release.d.ts +16 -0
  46. package/dist/svn/release.js +147 -0
  47. package/dist/svn/release.js.map +1 -0
  48. package/dist/types.d.ts +55 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/dist/ui.d.ts +15 -0
  52. package/dist/ui.js +50 -0
  53. package/dist/ui.js.map +1 -0
  54. package/dist/utils/format.d.ts +2 -0
  55. package/dist/utils/format.js +21 -0
  56. package/dist/utils/format.js.map +1 -0
  57. package/dist/utils/paths.d.ts +9 -0
  58. package/dist/utils/paths.js +48 -0
  59. package/dist/utils/paths.js.map +1 -0
  60. package/dist/utils/slug.d.ts +2 -0
  61. package/dist/utils/slug.js +15 -0
  62. package/dist/utils/slug.js.map +1 -0
  63. package/dist/wordpress-org/submit.d.ts +13 -0
  64. package/dist/wordpress-org/submit.js +169 -0
  65. package/dist/wordpress-org/submit.js.map +1 -0
  66. package/package.json +56 -0
@@ -0,0 +1,209 @@
1
+ import { createWriteStream } from "node:fs";
2
+ import { chmod, mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { pipeline } from "node:stream/promises";
5
+ import { execa } from "execa";
6
+ import extract from "extract-zip";
7
+ import { ui } from "../ui.js";
8
+ import { ensureCacheDir, pathExists } from "../utils/paths.js";
9
+ const wpCliUrl = "https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar";
10
+ const pluginCheckZipUrl = "https://downloads.wordpress.org/plugin/plugin-check.zip";
11
+ const sqliteIntegrationZipUrl = "https://downloads.wordpress.org/plugin/sqlite-database-integration.zip";
12
+ export async function prepareManagedPluginCheckEnvironment() {
13
+ const cacheDir = await ensureCacheDir();
14
+ const wpCli = await resolveWpCli(cacheDir);
15
+ const wpPath = path.join(cacheDir, "wordpress");
16
+ await ensureWordPressCore(wpCli, wpPath);
17
+ const requirePath = await ensurePluginCheckPlugin(wpPath);
18
+ return {
19
+ wpCli,
20
+ wpPath,
21
+ requirePath
22
+ };
23
+ }
24
+ export async function resolveWpCli(cacheDir) {
25
+ const systemWp = await execa("wp", ["--version"], { reject: false });
26
+ if (systemWp.exitCode === 0) {
27
+ return { command: "wp", baseArgs: [] };
28
+ }
29
+ const pharPath = path.join(cacheDir, "wp-cli.phar");
30
+ if (!pathExists(pharPath)) {
31
+ ui.info("Downloading WP-CLI for managed Plugin Check.");
32
+ await downloadFile(wpCliUrl, pharPath);
33
+ await chmod(pharPath, 0o755);
34
+ }
35
+ const phpAvailable = await execa("php", ["--version"], { reject: false });
36
+ if (phpAvailable.exitCode !== 0) {
37
+ throw new Error("PHP is required to run the managed WP-CLI phar, but `php` was not found.");
38
+ }
39
+ return { command: "php", baseArgs: [pharPath] };
40
+ }
41
+ async function ensureWordPressCore(wpCli, wpPath) {
42
+ if (!pathExists(path.join(wpPath, "wp-includes", "version.php"))) {
43
+ await mkdir(wpPath, { recursive: true });
44
+ ui.info("Downloading WordPress core for managed Plugin Check.");
45
+ await runWpCli(wpCli, ["core", "download", `--path=${wpPath}`, "--skip-content", "--force"]);
46
+ }
47
+ await ensureSqliteIntegration(wpPath);
48
+ await ensureWpConfig(wpPath);
49
+ await ensureWordPressInstalled(wpCli, wpPath);
50
+ }
51
+ export async function ensureWpConfig(wpPath) {
52
+ const configPath = path.join(wpPath, "wp-config.php");
53
+ if (pathExists(configPath)) {
54
+ return;
55
+ }
56
+ await writeFile(configPath, getManagedWpConfig(), { mode: 0o600 });
57
+ }
58
+ export function getManagedWpConfig() {
59
+ return `<?php
60
+ /**
61
+ * Managed by Pressship for static WordPress.org Plugin Check runs.
62
+ *
63
+ * The checker runs without a real site database for static checks, but WP-CLI
64
+ * still requires wp-config.php to bootstrap WordPress.
65
+ */
66
+ define( 'DB_NAME', 'pressship_plugin_check' );
67
+ define( 'DB_USER', 'pressship' );
68
+ define( 'DB_PASSWORD', 'pressship' );
69
+ define( 'DB_HOST', '127.0.0.1' );
70
+ define( 'DB_CHARSET', 'utf8mb4' );
71
+ define( 'DB_COLLATE', '' );
72
+
73
+ define( 'AUTH_KEY', 'pressship-auth-key' );
74
+ define( 'SECURE_AUTH_KEY', 'pressship-secure-auth-key' );
75
+ define( 'LOGGED_IN_KEY', 'pressship-logged-in-key' );
76
+ define( 'NONCE_KEY', 'pressship-nonce-key' );
77
+ define( 'AUTH_SALT', 'pressship-auth-salt' );
78
+ define( 'SECURE_AUTH_SALT', 'pressship-secure-auth-salt' );
79
+ define( 'LOGGED_IN_SALT', 'pressship-logged-in-salt' );
80
+ define( 'NONCE_SALT', 'pressship-nonce-salt' );
81
+
82
+ $table_prefix = 'wp_';
83
+
84
+ if ( ! defined( 'ABSPATH' ) ) {
85
+ \tdefine( 'ABSPATH', __DIR__ . '/' );
86
+ }
87
+
88
+ require_once ABSPATH . 'wp-settings.php';
89
+ `;
90
+ }
91
+ export async function ensureSqliteIntegration(wpPath) {
92
+ const pluginDir = path.join(wpPath, "wp-content", "plugins", "sqlite-database-integration");
93
+ const dropInPath = path.join(wpPath, "wp-content", "db.php");
94
+ const dropInTemplatePath = path.join(pluginDir, "db.copy");
95
+ if (!pathExists(dropInTemplatePath)) {
96
+ const pluginsDir = path.dirname(pluginDir);
97
+ const zipPath = path.join(pluginsDir, "sqlite-database-integration.zip");
98
+ await mkdir(pluginsDir, { recursive: true });
99
+ ui.info("Downloading SQLite integration for managed WordPress.");
100
+ await downloadFile(sqliteIntegrationZipUrl, zipPath);
101
+ await rm(pluginDir, { recursive: true, force: true });
102
+ await extract(zipPath, { dir: pluginsDir });
103
+ await rm(zipPath, { force: true });
104
+ }
105
+ if (!pathExists(dropInTemplatePath)) {
106
+ throw new Error("Downloaded SQLite integration, but could not find its db.copy drop-in template.");
107
+ }
108
+ await writeFile(dropInPath, await getSqliteDropIn(dropInTemplatePath, pluginDir), { mode: 0o644 });
109
+ }
110
+ export async function getSqliteDropIn(dropInTemplatePath, pluginDir) {
111
+ return getSqliteDropInFromTemplate(await readFile(dropInTemplatePath, "utf8"), pluginDir);
112
+ }
113
+ export function getSqliteDropInFromTemplate(template, pluginDir) {
114
+ const normalizedPluginDir = pluginDir.replace(/\\/g, "/");
115
+ return template
116
+ .replaceAll("{SQLITE_IMPLEMENTATION_FOLDER_PATH}", normalizedPluginDir)
117
+ .replaceAll("{SQLITE_PLUGIN}", "sqlite-database-integration/load.php");
118
+ }
119
+ async function ensureWordPressInstalled(wpCli, wpPath) {
120
+ const isInstalled = await runWpCli(wpCli, ["core", "is-installed", `--path=${wpPath}`], {
121
+ capture: true,
122
+ reject: false
123
+ });
124
+ if (isInstalled.exitCode === 0) {
125
+ return;
126
+ }
127
+ ui.info("Installing managed WordPress site with SQLite.");
128
+ await runWpCli(wpCli, [
129
+ "core",
130
+ "install",
131
+ `--path=${wpPath}`,
132
+ "--url=http://pressship.local",
133
+ "--title=Pressship Plugin Check",
134
+ "--admin_user=pressship",
135
+ "--admin_password=pressship",
136
+ "--admin_email=pressship@example.invalid",
137
+ "--skip-email"
138
+ ]);
139
+ }
140
+ async function ensurePluginCheckPlugin(wpPath) {
141
+ const pluginDir = path.join(wpPath, "wp-content", "plugins", "plugin-check");
142
+ const pluginMainPath = path.join(pluginDir, "plugin.php");
143
+ const cliPath = path.join(pluginDir, "cli.php");
144
+ const requirePath = path.join(wpPath, "wp-content", "pressship-plugin-check-loader.php");
145
+ if (pathExists(pluginMainPath) && pathExists(cliPath)) {
146
+ await writePluginCheckLoader(requirePath, pluginMainPath, pluginDir, cliPath);
147
+ return requirePath;
148
+ }
149
+ const pluginsDir = path.dirname(pluginDir);
150
+ const zipPath = path.join(pluginsDir, "plugin-check.zip");
151
+ await mkdir(pluginsDir, { recursive: true });
152
+ ui.info("Downloading WordPress.org Plugin Check.");
153
+ await downloadFile(pluginCheckZipUrl, zipPath);
154
+ await rm(pluginDir, { recursive: true, force: true });
155
+ await extract(zipPath, { dir: pluginsDir });
156
+ await rm(zipPath, { force: true });
157
+ if (!pathExists(pluginMainPath) || !pathExists(cliPath)) {
158
+ throw new Error("Downloaded Plugin Check, but could not find its WP-CLI loader at plugin-check/cli.php.");
159
+ }
160
+ await writePluginCheckLoader(requirePath, pluginMainPath, pluginDir, cliPath);
161
+ return requirePath;
162
+ }
163
+ async function writePluginCheckLoader(loaderPath, pluginMainPath, pluginDir, cliPath) {
164
+ await writeFile(loaderPath, `<?php
165
+ /**
166
+ * Managed by Pressship to load Plugin Check for WP-CLI.
167
+ */
168
+ if ( ! defined( 'WP_PLUGIN_CHECK_VERSION' ) ) {
169
+ \tdefine( 'WP_PLUGIN_CHECK_VERSION', '1.9.0' );
170
+ }
171
+ if ( ! defined( 'WP_PLUGIN_CHECK_MINIMUM_PHP' ) ) {
172
+ \tdefine( 'WP_PLUGIN_CHECK_MINIMUM_PHP', '7.4' );
173
+ }
174
+ if ( ! defined( 'WP_PLUGIN_CHECK_MAIN_FILE' ) ) {
175
+ \tdefine( 'WP_PLUGIN_CHECK_MAIN_FILE', ${JSON.stringify(pluginMainPath)} );
176
+ }
177
+ if ( ! defined( 'WP_PLUGIN_CHECK_PLUGIN_DIR_PATH' ) ) {
178
+ \tdefine( 'WP_PLUGIN_CHECK_PLUGIN_DIR_PATH', ${JSON.stringify(pluginDir.endsWith(path.sep) ? pluginDir : `${pluginDir}${path.sep}`)} );
179
+ }
180
+ if ( ! defined( 'WP_PLUGIN_CHECK_PLUGIN_DIR_URL' ) ) {
181
+ \tdefine( 'WP_PLUGIN_CHECK_PLUGIN_DIR_URL', '' );
182
+ }
183
+ require_once ${JSON.stringify(cliPath)};
184
+ `, { mode: 0o644 });
185
+ }
186
+ async function runWpCli(wpCli, args, options = {}) {
187
+ const result = await execa(wpCli.command, [...wpCli.baseArgs, ...args], {
188
+ reject: false,
189
+ stdout: options.capture ? "pipe" : "inherit",
190
+ stderr: options.capture ? "pipe" : "inherit"
191
+ });
192
+ if (options.reject !== false && result.exitCode !== 0) {
193
+ throw new Error(`WP-CLI command failed: ${[wpCli.command, ...wpCli.baseArgs, ...args].join(" ")}`);
194
+ }
195
+ return {
196
+ exitCode: result.exitCode ?? 1,
197
+ stdout: result.stdout ?? "",
198
+ stderr: result.stderr ?? ""
199
+ };
200
+ }
201
+ async function downloadFile(url, destination) {
202
+ const response = await fetch(url);
203
+ if (!response.ok || !response.body) {
204
+ throw new Error(`Could not download ${url}: ${response.status} ${response.statusText}`);
205
+ }
206
+ await mkdir(path.dirname(destination), { recursive: true });
207
+ await pipeline(response.body, createWriteStream(destination));
208
+ }
209
+ //# sourceMappingURL=plugin-check-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-check-environment.js","sourceRoot":"","sources":["../../src/checks/plugin-check-environment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Finding } from "../types.js";
2
+ export type PluginCheckOptions = {
3
+ mode?: "new" | "update";
4
+ skip?: boolean;
5
+ extraArgs?: string[];
6
+ wpPath?: string;
7
+ };
8
+ export type PluginCheckResult = {
9
+ skipped: boolean;
10
+ available: boolean;
11
+ findings: Finding[];
12
+ rawOutput?: string;
13
+ };
14
+ export declare function runPluginCheck(target: string, options?: PluginCheckOptions): Promise<PluginCheckResult>;
15
+ export declare function parsePluginCheckOutput(output: string, exitCode?: number): Finding[];
16
+ export declare function getPluginCheckSetupFinding(output: string): Finding | undefined;
@@ -0,0 +1,176 @@
1
+ import { execa } from "execa";
2
+ import { prepareManagedPluginCheckEnvironment } from "./plugin-check-environment.js";
3
+ export async function runPluginCheck(target, options = {}) {
4
+ if (options.skip) {
5
+ return { skipped: true, available: true, findings: [] };
6
+ }
7
+ const environment = await resolvePluginCheckEnvironment(options);
8
+ if (!environment.available) {
9
+ return {
10
+ skipped: false,
11
+ available: false,
12
+ findings: [environment.finding]
13
+ };
14
+ }
15
+ const args = [
16
+ `--path=${environment.wpPath}`,
17
+ ...(environment.requirePath ? [`--require=${environment.requirePath}`] : []),
18
+ "plugin",
19
+ "check",
20
+ target,
21
+ "--format=strict-json",
22
+ "--fields=file,line,column,type,code,message,docs",
23
+ `--mode=${options.mode ?? "new"}`,
24
+ ...(options.extraArgs ?? [])
25
+ ];
26
+ const result = await execa(environment.wpCli.command, [...environment.wpCli.baseArgs, ...args], { reject: false });
27
+ const rawOutput = `${result.stdout}\n${result.stderr}`.trim();
28
+ const setupFinding = getPluginCheckSetupFinding(rawOutput);
29
+ return {
30
+ skipped: false,
31
+ available: !setupFinding,
32
+ rawOutput,
33
+ findings: setupFinding ? [setupFinding] : parsePluginCheckOutput(rawOutput, result.exitCode)
34
+ };
35
+ }
36
+ export function parsePluginCheckOutput(output, exitCode = 0) {
37
+ if (!output.trim()) {
38
+ return exitCode === 0
39
+ ? []
40
+ : [
41
+ {
42
+ severity: "error",
43
+ code: "plugin_check.failed",
44
+ message: "Plugin Check failed without JSON output."
45
+ }
46
+ ];
47
+ }
48
+ const jsonText = extractJson(output);
49
+ if (!jsonText) {
50
+ const setupFinding = getPluginCheckSetupFinding(output);
51
+ if (setupFinding) {
52
+ return [setupFinding];
53
+ }
54
+ return [
55
+ {
56
+ severity: exitCode === 0 ? "warning" : "error",
57
+ code: "plugin_check.unparsed_output",
58
+ message: output
59
+ }
60
+ ];
61
+ }
62
+ try {
63
+ const parsed = JSON.parse(jsonText);
64
+ return normalizePluginCheckFindings(parsed);
65
+ }
66
+ catch {
67
+ return [
68
+ {
69
+ severity: exitCode === 0 ? "warning" : "error",
70
+ code: "plugin_check.invalid_json",
71
+ message: output
72
+ }
73
+ ];
74
+ }
75
+ }
76
+ export function getPluginCheckSetupFinding(output) {
77
+ if (/No WordPress installation found/i.test(output)) {
78
+ return {
79
+ severity: "warning",
80
+ code: "plugin_check.wordpress_path_missing",
81
+ message: "WP-CLI could not find a WordPress installation. Re-run with `--wp-path /path/to/wordpress`, or use `--skip-plugin-check`."
82
+ };
83
+ }
84
+ if (/'check' is not a registered subcommand of 'plugin'|not a registered subcommand/i.test(output)) {
85
+ return {
86
+ severity: "warning",
87
+ code: "plugin_check.command_missing",
88
+ message: "WP-CLI is available, but `wp plugin check` is not registered. Install and activate the WordPress.org Plugin Check plugin in your WordPress install, then pass `--wp-path /path/to/wordpress`, or use `--skip-plugin-check`."
89
+ };
90
+ }
91
+ return undefined;
92
+ }
93
+ function extractJson(output) {
94
+ const trimmed = output.trim();
95
+ if (trimmed.startsWith("[") || trimmed.startsWith("{")) {
96
+ return trimmed;
97
+ }
98
+ const arrayStart = trimmed.indexOf("[");
99
+ const objectStart = trimmed.indexOf("{");
100
+ const start = [arrayStart, objectStart].filter((index) => index >= 0).sort((a, b) => a - b)[0];
101
+ return start === undefined ? undefined : trimmed.slice(start);
102
+ }
103
+ async function resolvePluginCheckEnvironment(options) {
104
+ if (options.wpPath) {
105
+ const systemWp = await execa("wp", ["--version"], { reject: false });
106
+ if (systemWp.exitCode !== 0) {
107
+ return {
108
+ available: false,
109
+ finding: {
110
+ severity: "warning",
111
+ code: "plugin_check.wp_cli_missing",
112
+ message: "WP-CLI was not found. Pressship can manage WP-CLI automatically when `--wp-path` is omitted, or install WP-CLI yourself for this custom path."
113
+ }
114
+ };
115
+ }
116
+ return {
117
+ available: true,
118
+ wpCli: { command: "wp", baseArgs: [] },
119
+ wpPath: options.wpPath
120
+ };
121
+ }
122
+ try {
123
+ const managed = await prepareManagedPluginCheckEnvironment();
124
+ return {
125
+ available: true,
126
+ wpCli: managed.wpCli,
127
+ wpPath: managed.wpPath,
128
+ requirePath: managed.requirePath
129
+ };
130
+ }
131
+ catch (error) {
132
+ return {
133
+ available: false,
134
+ finding: {
135
+ severity: "warning",
136
+ code: "plugin_check.managed_setup_failed",
137
+ message: `Could not prepare managed Plugin Check environment automatically. ${error instanceof Error ? error.message : String(error)} Use \`--skip-plugin-check\` to bypass this step.`
138
+ }
139
+ };
140
+ }
141
+ }
142
+ function normalizePluginCheckFindings(parsed) {
143
+ const records = Array.isArray(parsed)
144
+ ? parsed
145
+ : typeof parsed === "object" && parsed !== null && "results" in parsed && Array.isArray(parsed.results)
146
+ ? parsed.results
147
+ : [];
148
+ return records.flatMap((record) => {
149
+ if (typeof record !== "object" || record === null) {
150
+ return [];
151
+ }
152
+ const item = record;
153
+ const severity = normalizeSeverity(item.type ?? item.severity);
154
+ const message = String(item.message ?? item.description ?? item.title ?? "Plugin Check finding");
155
+ const code = item.code ? String(item.code) : item.check ? String(item.check) : undefined;
156
+ const file = firstString(item.file, item.filename, item.path);
157
+ const line = typeof item.line === "number" ? item.line : undefined;
158
+ const column = typeof item.column === "number" ? item.column : undefined;
159
+ return [{ severity, message, code, file, line, column }];
160
+ });
161
+ }
162
+ function normalizeSeverity(value) {
163
+ const text = String(value ?? "").toLowerCase();
164
+ if (text.includes("error")) {
165
+ return "error";
166
+ }
167
+ if (text.includes("warn")) {
168
+ return "warning";
169
+ }
170
+ return "info";
171
+ }
172
+ function firstString(...values) {
173
+ const value = values.find((item) => typeof item === "string" && item.length > 0);
174
+ return typeof value === "string" ? value : undefined;
175
+ }
176
+ //# sourceMappingURL=plugin-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-check.js","sourceRoot":"","sources":["../../src/checks/plugin-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Finding } from "../types.js";
2
+ export type ReadmeValidationOptions = {
3
+ skipRemote?: boolean;
4
+ headless?: boolean;
5
+ };
6
+ export type ReadmeValidationResult = {
7
+ skippedRemote: boolean;
8
+ findings: Finding[];
9
+ rawRemoteText?: string;
10
+ };
11
+ export declare function validateReadmeFile(readmePath: string, options?: ReadmeValidationOptions): Promise<ReadmeValidationResult>;
12
+ export declare function validateReadmeWithWordPress(contents: string, options?: ReadmeValidationOptions): Promise<{
13
+ findings: Finding[];
14
+ rawRemoteText: string;
15
+ }>;
16
+ export declare function parseReadmeValidatorText(text: string): Finding[];
@@ -0,0 +1,84 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { openBrowserSession } from "../auth/session.js";
3
+ import { parseReadme, validateReadmeLocally } from "../plugin/readme.js";
4
+ export async function validateReadmeFile(readmePath, options = {}) {
5
+ const contents = await readFile(readmePath, "utf8");
6
+ const localFindings = validateReadmeLocally(contents, parseReadme(contents));
7
+ if (options.skipRemote) {
8
+ return { skippedRemote: true, findings: localFindings };
9
+ }
10
+ const remote = await validateReadmeWithWordPress(contents, options);
11
+ return {
12
+ skippedRemote: false,
13
+ findings: [...localFindings, ...remote.findings],
14
+ rawRemoteText: remote.rawRemoteText
15
+ };
16
+ }
17
+ export async function validateReadmeWithWordPress(contents, options = {}) {
18
+ const { context, page } = await openBrowserSession({ headless: options.headless ?? true });
19
+ try {
20
+ await page.goto("https://wordpress.org/plugins/developers/readme-validator/", {
21
+ waitUntil: "domcontentloaded"
22
+ });
23
+ await fillReadmeValidator(page, contents);
24
+ const rawRemoteText = await page.locator("body").innerText({ timeout: 15_000 });
25
+ return {
26
+ rawRemoteText,
27
+ findings: parseReadmeValidatorText(rawRemoteText)
28
+ };
29
+ }
30
+ finally {
31
+ await context.browser()?.close();
32
+ }
33
+ }
34
+ export function parseReadmeValidatorText(text) {
35
+ const lines = text
36
+ .split(/\r?\n/)
37
+ .map((line) => line.trim())
38
+ .filter(Boolean);
39
+ const findings = [];
40
+ for (const line of lines) {
41
+ if (/^(error|warning|notice):/i.test(line)) {
42
+ const [severityText, ...messageParts] = line.split(":");
43
+ findings.push({
44
+ severity: normalizeSeverity(severityText),
45
+ message: messageParts.join(":").trim(),
46
+ code: "readme_validator.remote"
47
+ });
48
+ }
49
+ }
50
+ if (findings.length === 0 && /fatal error|parse error|invalid|not valid/i.test(text)) {
51
+ findings.push({
52
+ severity: "error",
53
+ code: "readme_validator.remote",
54
+ message: compactText(text)
55
+ });
56
+ }
57
+ return findings;
58
+ }
59
+ async function fillReadmeValidator(page, contents) {
60
+ const textarea = page.locator("textarea").first();
61
+ await textarea.fill(contents);
62
+ const submit = page
63
+ .getByRole("button", { name: /validate|submit|check/i })
64
+ .or(page.locator('input[type="submit"]'))
65
+ .first();
66
+ await Promise.all([
67
+ page.waitForLoadState("networkidle").catch(() => undefined),
68
+ submit.click()
69
+ ]);
70
+ }
71
+ function normalizeSeverity(value) {
72
+ const normalized = value.toLowerCase();
73
+ if (normalized.includes("error")) {
74
+ return "error";
75
+ }
76
+ if (normalized.includes("warning")) {
77
+ return "warning";
78
+ }
79
+ return "info";
80
+ }
81
+ function compactText(text) {
82
+ return text.replace(/\s+/g, " ").trim().slice(0, 500);
83
+ }
84
+ //# sourceMappingURL=readme-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readme-validator.js","sourceRoot":"","sources":["../../src/checks/readme-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Finding } from "../types.js";
2
+ export declare function hasBlockingFindings(findings: Finding[]): boolean;
3
+ export declare function printFindings(title: string, findings: Finding[]): void;
@@ -0,0 +1,73 @@
1
+ import { ui } from "../ui.js";
2
+ const useColor = process.stdout.isTTY && !process.env.NO_COLOR;
3
+ export function hasBlockingFindings(findings) {
4
+ return findings.some((finding) => finding.severity === "error");
5
+ }
6
+ export function printFindings(title, findings) {
7
+ if (findings.length === 0) {
8
+ ui.success(`${title}: ${green("no findings")}`);
9
+ return;
10
+ }
11
+ ui.section(`${title}: ${formatCounts(findings)}`);
12
+ for (const finding of findings) {
13
+ const severity = formatSeverity(finding.severity);
14
+ const code = finding.code ? dim(`[${finding.code}]`) : "";
15
+ const location = formatLocation(finding);
16
+ const meta = [code, location].filter(Boolean).join(" ");
17
+ const prefix = meta ? `${severity} ${meta}` : severity;
18
+ console.log(` ${prefix}`);
19
+ console.log(` ${finding.message}`);
20
+ }
21
+ }
22
+ function formatCounts(findings) {
23
+ const errors = findings.filter((finding) => finding.severity === "error").length;
24
+ const warnings = findings.filter((finding) => finding.severity === "warning").length;
25
+ const info = findings.filter((finding) => finding.severity === "info").length;
26
+ const parts = [
27
+ errors ? red(`${errors} error${errors === 1 ? "" : "s"}`) : "",
28
+ warnings ? yellow(`${warnings} warning${warnings === 1 ? "" : "s"}`) : "",
29
+ info ? blue(`${info} info`) : ""
30
+ ].filter(Boolean);
31
+ return parts.join(", ");
32
+ }
33
+ function formatSeverity(severity) {
34
+ if (severity === "error") {
35
+ return red("ERROR");
36
+ }
37
+ if (severity === "warning") {
38
+ return yellow("WARN ");
39
+ }
40
+ return blue("INFO ");
41
+ }
42
+ function formatLocation(finding) {
43
+ if (!finding.file) {
44
+ return dim("(global)");
45
+ }
46
+ const parts = [finding.file, finding.line, finding.column].filter((part) => part !== undefined && part !== 0);
47
+ return cyan(parts.join(":"));
48
+ }
49
+ function bold(value) {
50
+ return color(value, "1");
51
+ }
52
+ function red(value) {
53
+ return color(value, "31");
54
+ }
55
+ function yellow(value) {
56
+ return color(value, "33");
57
+ }
58
+ function green(value) {
59
+ return color(value, "32");
60
+ }
61
+ function blue(value) {
62
+ return color(value, "34");
63
+ }
64
+ function cyan(value) {
65
+ return color(value, "36");
66
+ }
67
+ function dim(value) {
68
+ return color(value, "2");
69
+ }
70
+ function color(value, code) {
71
+ return useColor ? `\u001B[${code}m${value}\u001B[0m` : value;
72
+ }
73
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/checks/summary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAE9B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CAAC,QAAmB;IACrD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,QAAmB;IAC9D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,EAAE,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,EAAE,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAClD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAEvD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,QAAmB;IACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACrF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,KAAK,GAAG;QACZ,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QAC9D,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,WAAW,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QACzE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;KACjC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,QAA6B;IACnD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,cAAc,CAAC,OAAgB;IACtC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAC/D,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,CAAC,CAC3C,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,GAAG,CAAC,KAAa;IACxB,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,GAAG,CAAC,KAAa;IACxB,OAAO,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,IAAY;IACxC,OAAO,QAAQ,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/D,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};