pressship 0.1.2 → 0.1.4

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 (43) hide show
  1. package/.claude/skills/wordpress-plugin-publish/SKILL.md +153 -0
  2. package/README.md +285 -280
  3. package/assets/logo-new.png +0 -0
  4. package/assets/pressship-dark.png +0 -0
  5. package/assets/pressship-square-dark.png +0 -0
  6. package/assets/pressship-square.png +0 -0
  7. package/assets/pressship-symbol-dark.png +0 -0
  8. package/assets/pressship-symbol.png +0 -0
  9. package/assets/pressship-wordmark-dark.png +0 -0
  10. package/assets/pressship-wordmark.png +0 -0
  11. package/assets/pressship.png +0 -0
  12. package/dist/cli.js +40 -2
  13. package/dist/cli.js.map +1 -1
  14. package/dist/package/ignore.js +2 -0
  15. package/dist/package/ignore.js.map +1 -1
  16. package/dist/plugin/demo.d.ts +44 -0
  17. package/dist/plugin/demo.js +207 -0
  18. package/dist/plugin/demo.js.map +1 -0
  19. package/dist/plugin/info.d.ts +84 -0
  20. package/dist/plugin/info.js +209 -0
  21. package/dist/plugin/info.js.map +1 -0
  22. package/dist/plugin/list.d.ts +24 -0
  23. package/dist/plugin/list.js +174 -0
  24. package/dist/plugin/list.js.map +1 -0
  25. package/dist/svn/credentials.d.ts +9 -0
  26. package/dist/svn/credentials.js +94 -0
  27. package/dist/svn/credentials.js.map +1 -0
  28. package/dist/svn/get.d.ts +45 -0
  29. package/dist/svn/get.js +139 -0
  30. package/dist/svn/get.js.map +1 -0
  31. package/dist/svn/release.d.ts +1 -0
  32. package/dist/svn/release.js +90 -13
  33. package/dist/svn/release.js.map +1 -1
  34. package/dist/svn/subversion.d.ts +18 -0
  35. package/dist/svn/subversion.js +171 -0
  36. package/dist/svn/subversion.js.map +1 -0
  37. package/dist/utils/paths.d.ts +1 -0
  38. package/dist/utils/paths.js +3 -0
  39. package/dist/utils/paths.js.map +1 -1
  40. package/dist/wordpress-org/publish.d.ts +1 -0
  41. package/dist/wordpress-org/publish.js +4 -2
  42. package/dist/wordpress-org/publish.js.map +1 -1
  43. package/package.json +6 -1
@@ -0,0 +1,209 @@
1
+ import path from "node:path";
2
+ import { z } from "zod";
3
+ import { discoverPluginProject } from "./discover.js";
4
+ import { ui } from "../ui.js";
5
+ import { pathExists } from "../utils/paths.js";
6
+ const infoOptionsSchema = z.object({
7
+ json: z.boolean().default(false)
8
+ });
9
+ export async function info(target, rawOptions = {}) {
10
+ const options = infoOptionsSchema.parse(rawOptions);
11
+ const result = options.json
12
+ ? await getPluginInfo(target)
13
+ : await ui.task("Reading plugin info", () => getPluginInfo(target), (value) => `Found ${value.name}`);
14
+ if (options.json) {
15
+ console.log(JSON.stringify(result, null, 2));
16
+ return;
17
+ }
18
+ printPluginInfo(result);
19
+ }
20
+ export async function getPluginInfo(target) {
21
+ const resolvedTarget = target ?? process.cwd();
22
+ if (isLocalPluginTarget(resolvedTarget)) {
23
+ return localPluginInfo(await discoverPluginProject(resolvedTarget));
24
+ }
25
+ return fetchHostedPluginInfo(slugFromHostedTarget(resolvedTarget));
26
+ }
27
+ export function localPluginInfo(project) {
28
+ return {
29
+ source: "local",
30
+ rootDir: project.rootDir,
31
+ mainFile: project.mainFile,
32
+ readmePath: project.readmePath,
33
+ name: project.headers.pluginName,
34
+ slug: project.slug,
35
+ version: project.version,
36
+ description: project.headers.description,
37
+ author: project.headers.author,
38
+ pluginUri: project.headers.pluginUri,
39
+ authorUri: project.headers.authorUri,
40
+ textDomain: project.headers.textDomain,
41
+ domainPath: project.headers.domainPath,
42
+ requiresAtLeast: project.headers.requiresAtLeast ?? project.readme?.requiresAtLeast,
43
+ requiresPhp: project.headers.requiresPhp ?? project.readme?.requiresPhp,
44
+ license: project.headers.license ?? project.readme?.license,
45
+ licenseUri: project.headers.licenseUri ?? project.readme?.licenseUri,
46
+ readme: project.readme
47
+ };
48
+ }
49
+ export async function fetchHostedPluginInfo(slug) {
50
+ const url = new URL("https://api.wordpress.org/plugins/info/1.2/");
51
+ url.searchParams.set("action", "plugin_information");
52
+ url.searchParams.set("request[slug]", slug);
53
+ const response = await fetch(url);
54
+ const body = (await response.json());
55
+ if (!response.ok || body.error) {
56
+ throw new Error(body.error ? `WordPress.org plugin not found: ${slug}` : `Could not fetch plugin info for ${slug}.`);
57
+ }
58
+ return hostedPluginInfoFromApi(body, slug);
59
+ }
60
+ export function hostedPluginInfoFromApi(body, fallbackSlug) {
61
+ const slug = body.slug ?? fallbackSlug;
62
+ return {
63
+ source: "wordpress.org",
64
+ name: body.name ?? slug,
65
+ slug,
66
+ version: body.version,
67
+ author: cleanText(body.author),
68
+ authorProfile: body.author_profile,
69
+ homepage: body.homepage,
70
+ pluginUrl: `https://wordpress.org/plugins/${slug}/`,
71
+ downloadUrl: body.download_link,
72
+ requires: normalizeApiVersion(body.requires),
73
+ tested: body.tested,
74
+ requiresPhp: normalizeApiVersion(body.requires_php),
75
+ activeInstalls: body.active_installs,
76
+ lastUpdated: body.last_updated,
77
+ added: body.added,
78
+ rating: body.rating === undefined ? undefined : body.rating / 20,
79
+ ratingPercent: body.rating,
80
+ ratingCount: body.num_ratings,
81
+ supportThreads: body.support_threads,
82
+ supportThreadsResolved: body.support_threads_resolved,
83
+ tags: normalizeTags(body.tags),
84
+ description: cleanText(body.sections?.description),
85
+ changelog: cleanText(body.sections?.changelog)
86
+ };
87
+ }
88
+ export function slugFromHostedTarget(target) {
89
+ try {
90
+ const url = new URL(target);
91
+ const parts = url.pathname.split("/").filter(Boolean);
92
+ const pluginIndex = parts.indexOf("plugins");
93
+ const slug = pluginIndex >= 0 ? parts[pluginIndex + 1] : parts.at(-1);
94
+ if (slug) {
95
+ return slug;
96
+ }
97
+ }
98
+ catch {
99
+ // Not a URL; treat it as a slug below.
100
+ }
101
+ return target.replace(/^\/+|\/+$/g, "");
102
+ }
103
+ function isLocalPluginTarget(target) {
104
+ return target === "." || target.startsWith("..") || target.startsWith(`.${path.sep}`) || path.isAbsolute(target) || pathExists(target);
105
+ }
106
+ function printPluginInfo(result) {
107
+ ui.section(result.name);
108
+ ui.keyValue("Source", result.source);
109
+ ui.keyValue("Slug", result.slug);
110
+ ui.keyValue("Version", result.version ?? "unknown");
111
+ if (result.source === "local") {
112
+ ui.keyValue("Path", ui.path(result.rootDir));
113
+ ui.keyValue("Main file", ui.path(path.relative(result.rootDir, result.mainFile)));
114
+ ui.keyValue("Readme", result.readmePath ? ui.path(path.relative(result.rootDir, result.readmePath)) : "missing");
115
+ ui.keyValue("Author", result.author ?? "unknown");
116
+ ui.keyValue("Text domain", result.textDomain ?? "unknown");
117
+ ui.keyValue("Requires WP", result.requiresAtLeast ?? "unknown");
118
+ ui.keyValue("Requires PHP", result.requiresPhp ?? "unknown");
119
+ ui.keyValue("Stable tag", result.readme?.stableTag ?? "unknown");
120
+ ui.keyValue("Tested up to", result.readme?.testedUpTo ?? "unknown");
121
+ ui.keyValue("License", result.license ?? "unknown");
122
+ printList("Tags", result.readme?.tags);
123
+ printList("Contributors", result.readme?.contributors);
124
+ printLongText("Description", result.description);
125
+ return;
126
+ }
127
+ ui.keyValue("Author", result.author ?? "unknown");
128
+ ui.keyValue("Active", formatActiveInstalls(result.activeInstalls));
129
+ ui.keyValue("Requires WP", result.requires ? `${result.requires}+` : "unknown");
130
+ ui.keyValue("Tested up to", result.tested ?? "unknown");
131
+ ui.keyValue("Requires PHP", result.requiresPhp ? `${result.requiresPhp}+` : "unknown");
132
+ ui.keyValue("Last updated", result.lastUpdated ?? "unknown");
133
+ ui.keyValue("Added", result.added ?? "unknown");
134
+ ui.keyValue("Rating", formatRating(result));
135
+ ui.keyValue("Support", formatSupport(result));
136
+ ui.keyValue("URL", ui.path(result.pluginUrl));
137
+ if (result.downloadUrl) {
138
+ ui.keyValue("Download", ui.path(result.downloadUrl));
139
+ }
140
+ printList("Tags", result.tags);
141
+ printLongText("Description", result.description);
142
+ }
143
+ function printList(label, values) {
144
+ if (!values || values.length === 0) {
145
+ ui.keyValue(label, "none");
146
+ return;
147
+ }
148
+ ui.keyValue(label, values.join(", "));
149
+ }
150
+ function printLongText(label, value) {
151
+ if (!value) {
152
+ return;
153
+ }
154
+ ui.section(label);
155
+ console.log(value);
156
+ }
157
+ function normalizeTags(tags) {
158
+ if (Array.isArray(tags)) {
159
+ return tags;
160
+ }
161
+ if (!tags) {
162
+ return [];
163
+ }
164
+ return Object.values(tags);
165
+ }
166
+ function cleanText(value) {
167
+ if (!value) {
168
+ return undefined;
169
+ }
170
+ const text = value
171
+ .replace(/<[^>]+>/g, " ")
172
+ .replace(/&nbsp;/g, " ")
173
+ .replace(/&amp;/g, "&")
174
+ .replace(/&quot;/g, '"')
175
+ .replace(/&#039;|&apos;/g, "'")
176
+ .replace(/&lt;/g, "<")
177
+ .replace(/&gt;/g, ">")
178
+ .replace(/&#(\d+);/g, (_match, code) => String.fromCodePoint(Number(code)))
179
+ .replace(/&#x([0-9a-f]+);/gi, (_match, code) => String.fromCodePoint(Number.parseInt(code, 16)))
180
+ .replace(/\s+/g, " ")
181
+ .trim();
182
+ return text || undefined;
183
+ }
184
+ function normalizeApiVersion(value) {
185
+ if (typeof value !== "string") {
186
+ return undefined;
187
+ }
188
+ const trimmed = value.trim();
189
+ return trimmed && trimmed !== "0" ? trimmed : undefined;
190
+ }
191
+ function formatActiveInstalls(value) {
192
+ if (value === undefined) {
193
+ return "unknown";
194
+ }
195
+ return `${new Intl.NumberFormat("en-US").format(value)}+`;
196
+ }
197
+ function formatRating(result) {
198
+ if (result.rating === undefined || result.ratingCount === undefined) {
199
+ return "unknown";
200
+ }
201
+ return `${result.rating.toFixed(1)}/5 (${result.ratingCount})`;
202
+ }
203
+ function formatSupport(result) {
204
+ if (result.supportThreads === undefined || result.supportThreadsResolved === undefined) {
205
+ return "unknown";
206
+ }
207
+ return `${result.supportThreadsResolved}/${result.supportThreads} resolved`;
208
+ }
209
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/plugin/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ declare const listOptionsSchema: z.ZodObject<{
3
+ json: z.ZodDefault<z.ZodBoolean>;
4
+ public: z.ZodDefault<z.ZodBoolean>;
5
+ }, z.core.$strip>;
6
+ export type ListOptions = z.input<typeof listOptionsSchema>;
7
+ export type ListedPlugin = {
8
+ name: string;
9
+ slug: string;
10
+ url: string;
11
+ author?: string;
12
+ activeInstalls?: string;
13
+ testedWith?: string;
14
+ roles: Array<"contributor" | "committer">;
15
+ };
16
+ export type PluginListResult = {
17
+ username: string;
18
+ source: "public" | "logged-in";
19
+ plugins: ListedPlugin[];
20
+ };
21
+ export declare function listPlugins(username: string | undefined, rawOptions?: ListOptions): Promise<void>;
22
+ export declare function getPluginList(username: string | undefined, options?: ListOptions): Promise<PluginListResult>;
23
+ export declare function parsePluginArchiveHtml(html: string, username: string): ListedPlugin[];
24
+ export {};
@@ -0,0 +1,174 @@
1
+ import { z } from "zod";
2
+ import { hasSavedSession, openBrowserSession } from "../auth/session.js";
3
+ import { getWordPressOrgAccount } from "../auth/whoami.js";
4
+ import { ui } from "../ui.js";
5
+ const listOptionsSchema = z.object({
6
+ json: z.boolean().default(false),
7
+ public: z.boolean().default(false)
8
+ });
9
+ export async function listPlugins(username, rawOptions = {}) {
10
+ const options = listOptionsSchema.parse(rawOptions);
11
+ const result = options.json
12
+ ? await getPluginList(username, options)
13
+ : await ui.task("Listing WordPress.org plugins", () => getPluginList(username, options), (value) => `Found ${value.plugins.length} plugin${value.plugins.length === 1 ? "" : "s"} for ${value.username}`);
14
+ if (options.json) {
15
+ console.log(JSON.stringify(result, null, 2));
16
+ return;
17
+ }
18
+ printPluginList(result);
19
+ }
20
+ export async function getPluginList(username, options = {}) {
21
+ const resolvedUsername = username ?? (await inferCurrentUsername());
22
+ const canUseLoggedInArchive = !options.public && (await shouldUseLoggedInArchive(resolvedUsername, username));
23
+ const plugins = canUseLoggedInArchive
24
+ ? await fetchLoggedInAuthorArchive(resolvedUsername)
25
+ : await fetchPublicAuthorArchive(resolvedUsername);
26
+ return {
27
+ username: resolvedUsername,
28
+ source: canUseLoggedInArchive ? "logged-in" : "public",
29
+ plugins: dedupeListedPlugins(plugins)
30
+ };
31
+ }
32
+ export function parsePluginArchiveHtml(html, username) {
33
+ const cards = html.match(/<li\b[^>]*\btype-plugin\b[\s\S]*?<\/li>/g) ?? [];
34
+ return cards.map((card) => parsePluginCard(card, username)).filter((plugin) => Boolean(plugin));
35
+ }
36
+ async function inferCurrentUsername() {
37
+ if (!(await hasSavedSession())) {
38
+ throw new Error("No username passed and no WordPress.org browser session found. Run `pressship login` or pass a username.");
39
+ }
40
+ return (await getWordPressOrgAccount()).username;
41
+ }
42
+ async function shouldUseLoggedInArchive(resolvedUsername, originalUsername) {
43
+ if (!(await hasSavedSession())) {
44
+ return false;
45
+ }
46
+ if (!originalUsername) {
47
+ return true;
48
+ }
49
+ try {
50
+ const account = await getWordPressOrgAccount();
51
+ return account.username.toLowerCase() === resolvedUsername.toLowerCase();
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ async function fetchPublicAuthorArchive(username) {
58
+ const plugins = [];
59
+ let nextUrl = getAuthorArchiveUrl(username);
60
+ for (let page = 0; nextUrl && page < 20; page += 1) {
61
+ const response = await fetch(nextUrl);
62
+ const html = await response.text();
63
+ if (!response.ok) {
64
+ throw new Error(`Could not fetch WordPress.org plugin list for ${username}.`);
65
+ }
66
+ plugins.push(...parsePluginArchiveHtml(html, username));
67
+ nextUrl = getNextArchivePageUrl(html);
68
+ }
69
+ return plugins;
70
+ }
71
+ async function fetchLoggedInAuthorArchive(username) {
72
+ const { context, page } = await openBrowserSession({ headless: true });
73
+ const plugins = [];
74
+ let nextUrl = getAuthorArchiveUrl(username);
75
+ try {
76
+ for (let pageCount = 0; nextUrl && pageCount < 20; pageCount += 1) {
77
+ await page.goto(nextUrl, { waitUntil: "domcontentloaded" });
78
+ const html = await page.content();
79
+ plugins.push(...parsePluginArchiveHtml(html, username));
80
+ nextUrl = getNextArchivePageUrl(html);
81
+ }
82
+ }
83
+ finally {
84
+ await context.browser()?.close();
85
+ }
86
+ return plugins;
87
+ }
88
+ function parsePluginCard(card, username) {
89
+ const linkMatch = card.match(/<h3[^>]*class=["'][^"']*entry-title[^"']*["'][\s\S]*?<a[^>]+href=["']([^"']*\/plugins\/([^/"']+)\/)["'][^>]*>([\s\S]*?)<\/a>/i);
90
+ if (!linkMatch) {
91
+ return undefined;
92
+ }
93
+ const classValue = card.match(/<li\b[^>]*class=["']([^"']+)["']/i)?.[1] ?? "";
94
+ const normalizedUsername = username.toLowerCase();
95
+ const roles = [];
96
+ if (classValue.toLowerCase().split(/\s+/).includes(`plugin_contributors-${normalizedUsername}`)) {
97
+ roles.push("contributor");
98
+ }
99
+ if (classValue.toLowerCase().split(/\s+/).includes(`plugin_committers-${normalizedUsername}`)) {
100
+ roles.push("committer");
101
+ }
102
+ return {
103
+ name: cleanText(linkMatch[3]) ?? linkMatch[2],
104
+ slug: linkMatch[2],
105
+ url: normalizePluginUrl(linkMatch[1]),
106
+ author: cleanText(card.match(/<span class=["']plugin-author["'][\s\S]*?<span>([\s\S]*?)<\/span>/i)?.[1]),
107
+ activeInstalls: cleanText(card.match(/<span class=["']active-installs["'][\s\S]*?<span>([\s\S]*?)<\/span>/i)?.[1]),
108
+ testedWith: cleanText(card.match(/<span class=["']tested-with["'][\s\S]*?<span>([\s\S]*?)<\/span>/i)?.[1]),
109
+ roles: roles.length > 0 ? roles : ["contributor"]
110
+ };
111
+ }
112
+ function getAuthorArchiveUrl(username) {
113
+ return `https://wordpress.org/plugins/author/${encodeURIComponent(username)}/`;
114
+ }
115
+ function getNextArchivePageUrl(html) {
116
+ const nextHref = html.match(/<a[^>]+rel=["']next["'][^>]+href=["']([^"']+)["']/i)?.[1] ??
117
+ html.match(/<a[^>]+href=["']([^"']+)["'][^>]+rel=["']next["']/i)?.[1];
118
+ return nextHref ? normalizePluginUrl(nextHref) : undefined;
119
+ }
120
+ function dedupeListedPlugins(plugins) {
121
+ const bySlug = new Map();
122
+ for (const plugin of plugins) {
123
+ const existing = bySlug.get(plugin.slug);
124
+ if (!existing) {
125
+ bySlug.set(plugin.slug, plugin);
126
+ continue;
127
+ }
128
+ bySlug.set(plugin.slug, {
129
+ ...existing,
130
+ ...plugin,
131
+ roles: Array.from(new Set([...existing.roles, ...plugin.roles]))
132
+ });
133
+ }
134
+ return Array.from(bySlug.values()).sort((a, b) => a.name.localeCompare(b.name));
135
+ }
136
+ function printPluginList(result) {
137
+ ui.section(`${result.username} (${result.source})`);
138
+ if (result.plugins.length === 0) {
139
+ ui.warn(result.source === "public"
140
+ ? "No public contributor plugins found. Log in and run `pressship ls` to include plugins where you only have SVN commit access."
141
+ : "No plugins found.");
142
+ return;
143
+ }
144
+ for (const plugin of result.plugins) {
145
+ ui.section(plugin.name);
146
+ ui.keyValue("Slug", plugin.slug);
147
+ ui.keyValue("Role", plugin.roles.join(", "));
148
+ ui.keyValue("Active", plugin.activeInstalls ?? "unknown");
149
+ ui.keyValue("Tested", plugin.testedWith ?? "unknown");
150
+ ui.keyValue("URL", ui.path(plugin.url));
151
+ }
152
+ }
153
+ function normalizePluginUrl(value) {
154
+ return value.startsWith("//") ? `https:${value}` : new URL(value, "https://wordpress.org").toString();
155
+ }
156
+ function cleanText(value) {
157
+ if (!value) {
158
+ return undefined;
159
+ }
160
+ const text = value
161
+ .replace(/<[^>]+>/g, " ")
162
+ .replace(/&nbsp;/g, " ")
163
+ .replace(/&amp;/g, "&")
164
+ .replace(/&quot;/g, '"')
165
+ .replace(/&#039;|&apos;/g, "'")
166
+ .replace(/&lt;/g, "<")
167
+ .replace(/&gt;/g, ">")
168
+ .replace(/&#(\d+);/g, (_match, code) => String.fromCodePoint(Number(code)))
169
+ .replace(/&#x([0-9a-f]+);/gi, (_match, code) => String.fromCodePoint(Number.parseInt(code, 16)))
170
+ .replace(/\s+/g, " ")
171
+ .trim();
172
+ return text || undefined;
173
+ }
174
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/plugin/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type SvnCredentials = {
2
+ username: string;
3
+ password: string;
4
+ };
5
+ export declare function resolveSvnCredentials(username?: string): Promise<SvnCredentials>;
6
+ export declare function resolveSvnUsername(): Promise<string>;
7
+ export declare function getSavedSvnPassword(username: string): Promise<string | undefined>;
8
+ export declare function saveSvnPassword(username: string, svnPassword: string): Promise<void>;
9
+ export declare function getSvnPasswordUrl(username: string): string;
@@ -0,0 +1,94 @@
1
+ import { input, password } from "@inquirer/prompts";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { z } from "zod";
4
+ import { hasSavedSession, openBrowserSession } from "../auth/session.js";
5
+ import { getWordPressOrgAccount } from "../auth/whoami.js";
6
+ import { ui } from "../ui.js";
7
+ import { ensureConfigDir, getSvnCredentialsPath, pathExists } from "../utils/paths.js";
8
+ const svnCredentialsSchema = z.object({
9
+ credentials: z.record(z.string(), z.object({
10
+ password: z.string().min(1)
11
+ }))
12
+ });
13
+ export async function resolveSvnCredentials(username) {
14
+ const resolvedUsername = username ?? (await resolveSvnUsername());
15
+ const savedPassword = await getSavedSvnPassword(resolvedUsername);
16
+ if (savedPassword) {
17
+ return { username: resolvedUsername, password: savedPassword };
18
+ }
19
+ if (!process.stdin.isTTY) {
20
+ throw new Error(`No saved WordPress.org SVN password found for ${resolvedUsername}. Generate one at ${getSvnPasswordUrl(resolvedUsername)} and run this command interactively once.`);
21
+ }
22
+ ui.section("WordPress.org SVN password");
23
+ const svnPasswordUrl = getSvnPasswordUrl(resolvedUsername);
24
+ ui.info(`Open ${ui.path(svnPasswordUrl)}`);
25
+ ui.info("Generate an SVN password there, then paste it below. Pressship will save it locally for future releases.");
26
+ const openedContext = await openSvnPasswordPage(svnPasswordUrl);
27
+ try {
28
+ const svnPassword = await password({
29
+ message: `SVN password for ${resolvedUsername}`,
30
+ mask: "*",
31
+ validate: (value) => (value.trim() ? true : "Enter the generated WordPress.org SVN password.")
32
+ });
33
+ await saveSvnPassword(resolvedUsername, svnPassword);
34
+ ui.success(`Saved SVN password for ${resolvedUsername} in ${ui.path(getSvnCredentialsPath())}`);
35
+ return { username: resolvedUsername, password: svnPassword };
36
+ }
37
+ finally {
38
+ await openedContext?.browser()?.close().catch(() => undefined);
39
+ }
40
+ }
41
+ export async function resolveSvnUsername() {
42
+ if (await hasSavedSession()) {
43
+ try {
44
+ return (await getWordPressOrgAccount()).username;
45
+ }
46
+ catch {
47
+ // Fall through to prompt; the browser session may be stale.
48
+ }
49
+ }
50
+ if (!process.stdin.isTTY) {
51
+ throw new Error("Could not infer a WordPress.org username. Re-run with `--username <username>`.");
52
+ }
53
+ return input({
54
+ message: "WordPress.org SVN username",
55
+ validate: (value) => (value.trim() ? true : "Enter your WordPress.org username.")
56
+ });
57
+ }
58
+ export async function getSavedSvnPassword(username) {
59
+ const file = await readSvnCredentialsFile();
60
+ return file.credentials[username]?.password;
61
+ }
62
+ export async function saveSvnPassword(username, svnPassword) {
63
+ await ensureConfigDir();
64
+ const file = await readSvnCredentialsFile();
65
+ file.credentials[username] = { password: svnPassword };
66
+ await writeFile(getSvnCredentialsPath(), `${JSON.stringify(file, null, 2)}\n`, { mode: 0o600 });
67
+ }
68
+ export function getSvnPasswordUrl(username) {
69
+ return `https://profiles.wordpress.org/${encodeURIComponent(username)}/profile/edit/group/3/?screen=svn-password`;
70
+ }
71
+ async function openSvnPasswordPage(url) {
72
+ try {
73
+ const { context, page } = await openBrowserSession({ headless: false });
74
+ await page.goto(url, { waitUntil: "domcontentloaded" });
75
+ return context;
76
+ }
77
+ catch {
78
+ ui.warn("Could not open the SVN password page automatically. Open the URL above in your browser.");
79
+ return undefined;
80
+ }
81
+ }
82
+ async function readSvnCredentialsFile() {
83
+ const credentialsPath = getSvnCredentialsPath();
84
+ if (!pathExists(credentialsPath)) {
85
+ return { credentials: {} };
86
+ }
87
+ try {
88
+ return svnCredentialsSchema.parse(JSON.parse(await readFile(credentialsPath, "utf8")));
89
+ }
90
+ catch {
91
+ return { credentials: {} };
92
+ }
93
+ }
94
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/svn/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ declare const getOptionsSchema: z.ZodObject<{
3
+ json: z.ZodDefault<z.ZodBoolean>;
4
+ installSvn: z.ZodDefault<z.ZodBoolean>;
5
+ }, z.core.$strip>;
6
+ export type GetOptions = z.input<typeof getOptionsSchema>;
7
+ export type SvnGetRuntimeOptions = {
8
+ installSvn?: boolean;
9
+ interactive?: boolean;
10
+ quiet?: boolean;
11
+ };
12
+ export type SvnGetAction = "checkout" | "update";
13
+ export type SvnInfo = {
14
+ workingCopyRoot?: string;
15
+ url?: string;
16
+ relativeUrl?: string;
17
+ repositoryRoot?: string;
18
+ repositoryUuid?: string;
19
+ revision?: string;
20
+ nodeKind?: string;
21
+ schedule?: string;
22
+ lastChangedAuthor?: string;
23
+ lastChangedRevision?: string;
24
+ lastChangedDate?: string;
25
+ };
26
+ export type SvnGetResult = {
27
+ slug: string;
28
+ action: SvnGetAction;
29
+ svnUrl: string;
30
+ path: string;
31
+ info: SvnInfo;
32
+ layout: {
33
+ trunk: boolean;
34
+ assets: boolean;
35
+ tags: boolean;
36
+ tagCount: number;
37
+ };
38
+ };
39
+ export declare function getPlugin(slugOrUrl: string, destination: string | undefined, rawOptions?: GetOptions): Promise<void>;
40
+ export declare function checkoutOrUpdatePlugin(slug: string, checkoutPath: string, options?: SvnGetRuntimeOptions): Promise<SvnGetResult>;
41
+ export declare function resolveCheckoutPath(slug: string, destination: string | undefined): string;
42
+ export declare function getPluginSvnUrl(slug: string): string;
43
+ export declare function resolveSvnGetAction(checkoutPath: string): Promise<SvnGetAction>;
44
+ export declare function parseSvnInfo(output: string): SvnInfo;
45
+ export {};