pressship 0.1.12 → 0.1.13
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/README.md +13 -0
- package/assets/web/app.js +6425 -0
- package/assets/web/harness-sdk-icon-mono.svg +33 -0
- package/assets/web/harness-sdk-icon.svg +120 -0
- package/assets/web/index.html +392 -0
- package/assets/web/style.css +6454 -0
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -1
- package/dist/plugin/demo.d.ts +75 -4
- package/dist/plugin/demo.js +520 -31
- package/dist/plugin/demo.js.map +1 -1
- package/dist/utils/paths.d.ts +5 -0
- package/dist/utils/paths.js +15 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/web/ai-assistance.d.ts +70 -0
- package/dist/web/ai-assistance.js +262 -0
- package/dist/web/ai-assistance.js.map +1 -0
- package/dist/web/index.d.ts +9 -0
- package/dist/web/index.js +34 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/jobs.d.ts +33 -0
- package/dist/web/jobs.js +155 -0
- package/dist/web/jobs.js.map +1 -0
- package/dist/web/open-url.d.ts +1 -0
- package/dist/web/open-url.js +13 -0
- package/dist/web/open-url.js.map +1 -0
- package/dist/web/plugin-check-state.d.ts +47 -0
- package/dist/web/plugin-check-state.js +107 -0
- package/dist/web/plugin-check-state.js.map +1 -0
- package/dist/web/plugin-check.d.ts +11 -0
- package/dist/web/plugin-check.js +124 -0
- package/dist/web/plugin-check.js.map +1 -0
- package/dist/web/ports.d.ts +2 -0
- package/dist/web/ports.js +38 -0
- package/dist/web/ports.js.map +1 -0
- package/dist/web/registry.d.ts +49 -0
- package/dist/web/registry.js +106 -0
- package/dist/web/registry.js.map +1 -0
- package/dist/web/release.d.ts +87 -0
- package/dist/web/release.js +413 -0
- package/dist/web/release.js.map +1 -0
- package/dist/web/server.d.ts +24 -0
- package/dist/web/server.js +1419 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/settings.d.ts +36 -0
- package/dist/web/settings.js +72 -0
- package/dist/web/settings.js.map +1 -0
- package/dist/web/version-state.d.ts +28 -0
- package/dist/web/version-state.js +114 -0
- package/dist/web/version-state.js.map +1 -0
- package/dist/wordpress-org/publish.d.ts +1 -0
- package/dist/wordpress-org/publish.js +4 -2
- package/dist/wordpress-org/publish.js.map +1 -1
- package/dist/wordpress-org/submit.d.ts +1 -0
- package/dist/wordpress-org/submit.js +7 -5
- package/dist/wordpress-org/submit.js.map +1 -1
- package/package.json +4 -1
package/dist/web/jobs.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
export class WebJobManager {
|
|
3
|
+
jobs = new Map();
|
|
4
|
+
create(type, title, run) {
|
|
5
|
+
const job = new InternalWebJob(type, title);
|
|
6
|
+
this.jobs.set(job.snapshot.id, job);
|
|
7
|
+
void job.start(run);
|
|
8
|
+
return job.snapshot;
|
|
9
|
+
}
|
|
10
|
+
get(id) {
|
|
11
|
+
return this.jobs.get(id)?.snapshot;
|
|
12
|
+
}
|
|
13
|
+
list() {
|
|
14
|
+
return Array.from(this.jobs.values()).map((job) => job.snapshot);
|
|
15
|
+
}
|
|
16
|
+
cancel(id) {
|
|
17
|
+
return this.jobs.get(id)?.cancel() ?? false;
|
|
18
|
+
}
|
|
19
|
+
subscribe(id, onEvent, onClose) {
|
|
20
|
+
const job = this.jobs.get(id);
|
|
21
|
+
if (!job) {
|
|
22
|
+
onClose();
|
|
23
|
+
return () => undefined;
|
|
24
|
+
}
|
|
25
|
+
for (const event of job.snapshot.events) {
|
|
26
|
+
onEvent(event);
|
|
27
|
+
}
|
|
28
|
+
if (!["queued", "running"].includes(job.snapshot.status)) {
|
|
29
|
+
onClose();
|
|
30
|
+
return () => undefined;
|
|
31
|
+
}
|
|
32
|
+
return job.subscribe(onEvent, onClose);
|
|
33
|
+
}
|
|
34
|
+
cancelRunningJobs() {
|
|
35
|
+
for (const job of this.jobs.values()) {
|
|
36
|
+
if (job.snapshot.status === "queued" || job.snapshot.status === "running") {
|
|
37
|
+
job.cancel();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
class InternalWebJob {
|
|
43
|
+
emitter = new EventEmitter();
|
|
44
|
+
controller = new AbortController();
|
|
45
|
+
cancelCallbacks = [];
|
|
46
|
+
eventId = 0;
|
|
47
|
+
snapshot;
|
|
48
|
+
constructor(type, title) {
|
|
49
|
+
const now = new Date().toISOString();
|
|
50
|
+
this.snapshot = {
|
|
51
|
+
id: createJobId(),
|
|
52
|
+
type,
|
|
53
|
+
status: "queued",
|
|
54
|
+
title,
|
|
55
|
+
createdAt: now,
|
|
56
|
+
updatedAt: now,
|
|
57
|
+
events: []
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async start(run) {
|
|
61
|
+
this.setStatus("running");
|
|
62
|
+
this.emit("status", { message: "Job started." });
|
|
63
|
+
try {
|
|
64
|
+
const returned = await run({
|
|
65
|
+
signal: this.controller.signal,
|
|
66
|
+
log: (message, data) => this.emit("log", { message, data: redactSecrets(data) }),
|
|
67
|
+
status: (message) => this.emit("status", { message }),
|
|
68
|
+
result: (data) => this.emit("result", redactSecrets(data)),
|
|
69
|
+
registerCancel: (cancel) => {
|
|
70
|
+
this.cancelCallbacks.push(cancel);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
if (returned !== undefined) {
|
|
74
|
+
this.emit("result", redactSecrets(returned));
|
|
75
|
+
}
|
|
76
|
+
if (this.snapshot.status === "cancelled") {
|
|
77
|
+
this.emit("done", { status: "cancelled" });
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.setStatus("succeeded");
|
|
81
|
+
this.emit("done", { status: "succeeded" });
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (this.snapshot.status === "cancelled" || this.controller.signal.aborted) {
|
|
85
|
+
this.setStatus("cancelled");
|
|
86
|
+
this.emit("done", { status: "cancelled" });
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
this.setStatus("failed");
|
|
90
|
+
this.emit("error", { message: error instanceof Error ? error.message : String(error) });
|
|
91
|
+
this.emit("done", { status: "failed" });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
cancel() {
|
|
95
|
+
if (!["queued", "running"].includes(this.snapshot.status)) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
this.controller.abort();
|
|
99
|
+
for (const cancel of this.cancelCallbacks) {
|
|
100
|
+
cancel();
|
|
101
|
+
}
|
|
102
|
+
this.cancelCallbacks = [];
|
|
103
|
+
this.setStatus("cancelled");
|
|
104
|
+
this.emit("status", { message: "Job cancelled." });
|
|
105
|
+
this.emit("done", { status: "cancelled" });
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
subscribe(onEvent, onClose) {
|
|
109
|
+
this.emitter.on("event", onEvent);
|
|
110
|
+
this.emitter.once("close", onClose);
|
|
111
|
+
return () => {
|
|
112
|
+
this.emitter.off("event", onEvent);
|
|
113
|
+
this.emitter.off("close", onClose);
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
setStatus(status) {
|
|
117
|
+
this.snapshot.status = status;
|
|
118
|
+
this.snapshot.updatedAt = new Date().toISOString();
|
|
119
|
+
}
|
|
120
|
+
emit(type, data) {
|
|
121
|
+
const event = {
|
|
122
|
+
id: ++this.eventId,
|
|
123
|
+
type,
|
|
124
|
+
time: new Date().toISOString(),
|
|
125
|
+
data
|
|
126
|
+
};
|
|
127
|
+
this.snapshot.events.push(event);
|
|
128
|
+
this.snapshot.updatedAt = event.time;
|
|
129
|
+
this.emitter.emit("event", event);
|
|
130
|
+
if (type === "done") {
|
|
131
|
+
this.emitter.emit("close");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function createJobId() {
|
|
136
|
+
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
137
|
+
}
|
|
138
|
+
function redactSecrets(value) {
|
|
139
|
+
if (typeof value === "string") {
|
|
140
|
+
return value
|
|
141
|
+
.replace(/(--password\s+)(\S+)/g, "$1<redacted>")
|
|
142
|
+
.replace(/("password"\s*:\s*")([^"]+)(")/g, "$1<redacted>$3");
|
|
143
|
+
}
|
|
144
|
+
if (Array.isArray(value)) {
|
|
145
|
+
return value.map(redactSecrets);
|
|
146
|
+
}
|
|
147
|
+
if (value && typeof value === "object") {
|
|
148
|
+
return Object.fromEntries(Object.entries(value).map(([key, nested]) => [
|
|
149
|
+
key,
|
|
150
|
+
/password|token|storage/i.test(key) ? "<redacted>" : redactSecrets(nested)
|
|
151
|
+
]));
|
|
152
|
+
}
|
|
153
|
+
return value;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/web/jobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function openUrl(url: string): Promise<void>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { execa } from "execa";
|
|
2
|
+
export async function openUrl(url) {
|
|
3
|
+
if (process.platform === "darwin") {
|
|
4
|
+
await execa("open", [url]);
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
if (process.platform === "win32") {
|
|
8
|
+
await execa("cmd", ["/c", "start", "", url]);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
await execa("xdg-open", [url]);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=open-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-url.js","sourceRoot":"","sources":["../../src/web/open-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW;IACvC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type StudioPluginCheckFinding, type StudioPluginCheckSummary } from "./plugin-check.js";
|
|
3
|
+
declare const studioPluginCheckStateSchema: z.ZodObject<{
|
|
4
|
+
pluginId: z.ZodString;
|
|
5
|
+
pluginPath: z.ZodString;
|
|
6
|
+
slug: z.ZodString;
|
|
7
|
+
name: z.ZodString;
|
|
8
|
+
checkedAt: z.ZodString;
|
|
9
|
+
skipped: z.ZodBoolean;
|
|
10
|
+
available: z.ZodBoolean;
|
|
11
|
+
findings: z.ZodArray<z.ZodObject<{
|
|
12
|
+
severity: z.ZodEnum<{
|
|
13
|
+
error: "error";
|
|
14
|
+
warning: "warning";
|
|
15
|
+
info: "info";
|
|
16
|
+
}>;
|
|
17
|
+
message: z.ZodString;
|
|
18
|
+
code: z.ZodOptional<z.ZodString>;
|
|
19
|
+
file: z.ZodOptional<z.ZodString>;
|
|
20
|
+
line: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
column: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
originalFile: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, z.core.$strip>>;
|
|
24
|
+
summary: z.ZodObject<{
|
|
25
|
+
error: z.ZodNumber;
|
|
26
|
+
warning: z.ZodNumber;
|
|
27
|
+
info: z.ZodNumber;
|
|
28
|
+
total: z.ZodNumber;
|
|
29
|
+
blocking: z.ZodBoolean;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
export type StudioPluginCheckState = z.infer<typeof studioPluginCheckStateSchema>;
|
|
33
|
+
export declare function readStudioPluginCheckState(pluginId: string): Promise<StudioPluginCheckState | undefined>;
|
|
34
|
+
export declare function writeStudioPluginCheckState(input: {
|
|
35
|
+
pluginId: string;
|
|
36
|
+
pluginPath: string;
|
|
37
|
+
slug: string;
|
|
38
|
+
name: string;
|
|
39
|
+
skipped: boolean;
|
|
40
|
+
available: boolean;
|
|
41
|
+
findings: StudioPluginCheckFinding[];
|
|
42
|
+
summary: StudioPluginCheckSummary;
|
|
43
|
+
checkedAt?: string;
|
|
44
|
+
}): Promise<StudioPluginCheckState>;
|
|
45
|
+
export declare function removeStudioPluginCheckFindingsForFiles(pluginId: string, files: string[]): Promise<StudioPluginCheckState | undefined>;
|
|
46
|
+
export declare function removeStudioPluginCheckState(pluginId: string): Promise<void>;
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { ensureConfigDir, getWebPluginCheckStatePath, pathExists } from "../utils/paths.js";
|
|
4
|
+
import { summarizeStudioPluginCheckFindings } from "./plugin-check.js";
|
|
5
|
+
const severitySchema = z.enum(["error", "warning", "info"]);
|
|
6
|
+
const studioPluginCheckFindingSchema = z.object({
|
|
7
|
+
severity: severitySchema,
|
|
8
|
+
message: z.string(),
|
|
9
|
+
code: z.string().optional(),
|
|
10
|
+
file: z.string().optional(),
|
|
11
|
+
line: z.number().optional(),
|
|
12
|
+
column: z.number().optional(),
|
|
13
|
+
originalFile: z.string().optional()
|
|
14
|
+
});
|
|
15
|
+
const studioPluginCheckSummarySchema = z.object({
|
|
16
|
+
error: z.number().int().min(0),
|
|
17
|
+
warning: z.number().int().min(0),
|
|
18
|
+
info: z.number().int().min(0),
|
|
19
|
+
total: z.number().int().min(0),
|
|
20
|
+
blocking: z.boolean()
|
|
21
|
+
});
|
|
22
|
+
const studioPluginCheckStateSchema = z.object({
|
|
23
|
+
pluginId: z.string().min(1),
|
|
24
|
+
pluginPath: z.string().min(1),
|
|
25
|
+
slug: z.string().min(1),
|
|
26
|
+
name: z.string().min(1),
|
|
27
|
+
checkedAt: z.string().min(1),
|
|
28
|
+
skipped: z.boolean(),
|
|
29
|
+
available: z.boolean(),
|
|
30
|
+
findings: z.array(studioPluginCheckFindingSchema),
|
|
31
|
+
summary: studioPluginCheckSummarySchema
|
|
32
|
+
});
|
|
33
|
+
const studioPluginCheckStateStoreSchema = z.object({
|
|
34
|
+
version: z.literal(1),
|
|
35
|
+
states: z.record(z.string(), studioPluginCheckStateSchema)
|
|
36
|
+
});
|
|
37
|
+
export async function readStudioPluginCheckState(pluginId) {
|
|
38
|
+
return (await readStudioPluginCheckStateStore()).states[pluginId];
|
|
39
|
+
}
|
|
40
|
+
export async function writeStudioPluginCheckState(input) {
|
|
41
|
+
const store = await readStudioPluginCheckStateStore();
|
|
42
|
+
const state = studioPluginCheckStateSchema.parse({
|
|
43
|
+
...input,
|
|
44
|
+
checkedAt: input.checkedAt ?? new Date().toISOString()
|
|
45
|
+
});
|
|
46
|
+
store.states[input.pluginId] = state;
|
|
47
|
+
await writeStudioPluginCheckStateStore(store);
|
|
48
|
+
return state;
|
|
49
|
+
}
|
|
50
|
+
export async function removeStudioPluginCheckFindingsForFiles(pluginId, files) {
|
|
51
|
+
const targetFiles = new Set(files.map(normalizeStateFilePath).filter((filePath) => Boolean(filePath)));
|
|
52
|
+
if (!targetFiles.size) {
|
|
53
|
+
return readStudioPluginCheckState(pluginId);
|
|
54
|
+
}
|
|
55
|
+
const store = await readStudioPluginCheckStateStore();
|
|
56
|
+
const current = store.states[pluginId];
|
|
57
|
+
if (!current) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const findings = current.findings.filter((finding) => {
|
|
61
|
+
const filePath = normalizeStateFilePath(finding.file);
|
|
62
|
+
return !filePath || !targetFiles.has(filePath);
|
|
63
|
+
});
|
|
64
|
+
if (findings.length === current.findings.length) {
|
|
65
|
+
return current;
|
|
66
|
+
}
|
|
67
|
+
const next = studioPluginCheckStateSchema.parse({
|
|
68
|
+
...current,
|
|
69
|
+
checkedAt: new Date().toISOString(),
|
|
70
|
+
findings,
|
|
71
|
+
summary: summarizeStudioPluginCheckFindings(findings)
|
|
72
|
+
});
|
|
73
|
+
store.states[pluginId] = next;
|
|
74
|
+
await writeStudioPluginCheckStateStore(store);
|
|
75
|
+
return next;
|
|
76
|
+
}
|
|
77
|
+
export async function removeStudioPluginCheckState(pluginId) {
|
|
78
|
+
const store = await readStudioPluginCheckStateStore();
|
|
79
|
+
if (!(pluginId in store.states)) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
delete store.states[pluginId];
|
|
83
|
+
await writeStudioPluginCheckStateStore(store);
|
|
84
|
+
}
|
|
85
|
+
async function readStudioPluginCheckStateStore() {
|
|
86
|
+
const statePath = getWebPluginCheckStatePath();
|
|
87
|
+
if (!pathExists(statePath)) {
|
|
88
|
+
return emptyStore();
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
return studioPluginCheckStateStoreSchema.parse(JSON.parse(await readFile(statePath, "utf8")));
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return emptyStore();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function writeStudioPluginCheckStateStore(store) {
|
|
98
|
+
await ensureConfigDir();
|
|
99
|
+
await writeFile(getWebPluginCheckStatePath(), `${JSON.stringify(store, null, 2)}\n`, { mode: 0o600 });
|
|
100
|
+
}
|
|
101
|
+
function emptyStore() {
|
|
102
|
+
return { version: 1, states: {} };
|
|
103
|
+
}
|
|
104
|
+
function normalizeStateFilePath(filePath) {
|
|
105
|
+
return filePath?.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=plugin-check-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-check-state.js","sourceRoot":"","sources":["../../src/web/plugin-check-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Finding, Severity } from "../types.js";
|
|
2
|
+
export type StudioPluginCheckFinding = Finding & {
|
|
3
|
+
originalFile?: string;
|
|
4
|
+
};
|
|
5
|
+
export type StudioPluginCheckSummary = Record<Severity, number> & {
|
|
6
|
+
total: number;
|
|
7
|
+
blocking: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function normalizeStudioPluginCheckFindings(findings: Finding[], pluginRoot: string, slug?: string): StudioPluginCheckFinding[];
|
|
10
|
+
export declare function addStudioPluginCheckLineHints(findings: StudioPluginCheckFinding[], pluginRoot: string): Promise<StudioPluginCheckFinding[]>;
|
|
11
|
+
export declare function summarizeStudioPluginCheckFindings(findings: Finding[]): StudioPluginCheckSummary;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export function normalizeStudioPluginCheckFindings(findings, pluginRoot, slug) {
|
|
4
|
+
return findings.map((finding) => {
|
|
5
|
+
const file = normalizeStudioPluginCheckPath(finding.file, pluginRoot, slug);
|
|
6
|
+
return file === finding.file
|
|
7
|
+
? { ...finding }
|
|
8
|
+
: {
|
|
9
|
+
...finding,
|
|
10
|
+
file,
|
|
11
|
+
originalFile: finding.file
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export async function addStudioPluginCheckLineHints(findings, pluginRoot) {
|
|
16
|
+
return Promise.all(findings.map(async (finding) => {
|
|
17
|
+
if (isPositiveInteger(finding.line) || !finding.file) {
|
|
18
|
+
return normalizeStudioFindingColumn(finding);
|
|
19
|
+
}
|
|
20
|
+
const line = await inferStudioFindingLine(finding, pluginRoot);
|
|
21
|
+
return normalizeStudioFindingColumn({
|
|
22
|
+
...finding,
|
|
23
|
+
line: line ?? 1
|
|
24
|
+
});
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
export function summarizeStudioPluginCheckFindings(findings) {
|
|
28
|
+
const summary = {
|
|
29
|
+
error: 0,
|
|
30
|
+
warning: 0,
|
|
31
|
+
info: 0,
|
|
32
|
+
total: findings.length,
|
|
33
|
+
blocking: false
|
|
34
|
+
};
|
|
35
|
+
for (const finding of findings) {
|
|
36
|
+
summary[finding.severity] += 1;
|
|
37
|
+
}
|
|
38
|
+
summary.blocking = summary.error > 0;
|
|
39
|
+
return summary;
|
|
40
|
+
}
|
|
41
|
+
function normalizeStudioPluginCheckPath(file, pluginRoot, slug) {
|
|
42
|
+
if (!file) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const root = path.resolve(pluginRoot);
|
|
46
|
+
const normalizedFile = file.replace(/\\/g, "/");
|
|
47
|
+
const absolutePath = path.isAbsolute(file) ? path.resolve(file) : undefined;
|
|
48
|
+
if (absolutePath && (absolutePath === root || absolutePath.startsWith(`${root}${path.sep}`))) {
|
|
49
|
+
return path.relative(root, absolutePath).split(path.sep).join("/");
|
|
50
|
+
}
|
|
51
|
+
const relative = normalizedFile.replace(/^\/+/, "");
|
|
52
|
+
const leadingFolder = slug ?? path.basename(root);
|
|
53
|
+
if (relative === leadingFolder) {
|
|
54
|
+
return "";
|
|
55
|
+
}
|
|
56
|
+
if (relative.startsWith(`${leadingFolder}/`)) {
|
|
57
|
+
return relative.slice(leadingFolder.length + 1);
|
|
58
|
+
}
|
|
59
|
+
return relative;
|
|
60
|
+
}
|
|
61
|
+
async function inferStudioFindingLine(finding, pluginRoot) {
|
|
62
|
+
if (!finding.file) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
if (path.basename(finding.file).toLowerCase() !== "readme.txt") {
|
|
66
|
+
return 1;
|
|
67
|
+
}
|
|
68
|
+
const readmePath = resolveStudioFindingFilePath(pluginRoot, finding.file);
|
|
69
|
+
if (!readmePath) {
|
|
70
|
+
return 1;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
return inferReadmeFindingLine(finding, await readFile(readmePath, "utf8")) ?? 1;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return 1;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function inferReadmeFindingLine(finding, contents) {
|
|
80
|
+
const haystack = `${finding.code ?? ""} ${finding.message}`.toLowerCase();
|
|
81
|
+
const fieldPatterns = [
|
|
82
|
+
[/tested[_\s-]*(up[\s-]*to|upto)|tested up to/, /^\s*tested up to\s*:/i],
|
|
83
|
+
[/stable[_\s-]*tag|stable tag/, /^\s*stable tag\s*:/i],
|
|
84
|
+
[/requires[_\s-]*at[_\s-]*least|requires at least/, /^\s*requires at least\s*:/i],
|
|
85
|
+
[/requires[_\s-]*php|requires php/, /^\s*requires php\s*:/i],
|
|
86
|
+
[/license/, /^\s*license\s*:/i],
|
|
87
|
+
[/contributors?/, /^\s*contributors\s*:/i],
|
|
88
|
+
[/tags?/, /^\s*tags\s*:/i],
|
|
89
|
+
[/donate/, /^\s*donate link\s*:/i]
|
|
90
|
+
];
|
|
91
|
+
for (const [hint, linePattern] of fieldPatterns) {
|
|
92
|
+
if (hint.test(haystack)) {
|
|
93
|
+
const line = findReadmeLine(contents, linePattern);
|
|
94
|
+
if (line) {
|
|
95
|
+
return line;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return findReadmeLine(contents, /^===\s+.+?\s+===$/) ?? 1;
|
|
100
|
+
}
|
|
101
|
+
function findReadmeLine(contents, pattern) {
|
|
102
|
+
const lines = contents.split(/\r?\n/);
|
|
103
|
+
const index = lines.findIndex((line) => pattern.test(line));
|
|
104
|
+
return index >= 0 ? index + 1 : undefined;
|
|
105
|
+
}
|
|
106
|
+
function resolveStudioFindingFilePath(pluginRoot, file) {
|
|
107
|
+
const root = path.resolve(pluginRoot);
|
|
108
|
+
const normalized = file.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
109
|
+
const filePath = path.resolve(root, normalized);
|
|
110
|
+
return filePath === root || filePath.startsWith(`${root}${path.sep}`) ? filePath : undefined;
|
|
111
|
+
}
|
|
112
|
+
function normalizeStudioFindingColumn(finding) {
|
|
113
|
+
if (!isPositiveInteger(finding.line)) {
|
|
114
|
+
return finding;
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
...finding,
|
|
118
|
+
column: isPositiveInteger(finding.column) ? finding.column : 1
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function isPositiveInteger(value) {
|
|
122
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=plugin-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-check.js","sourceRoot":"","sources":["../../src/web/plugin-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createServer } from "node:net";
|
|
2
|
+
export async function resolveFreePort(host, startPort, strict, endPort = startPort + 25) {
|
|
3
|
+
if (startPort === 0) {
|
|
4
|
+
return probePort(host, 0);
|
|
5
|
+
}
|
|
6
|
+
for (let port = startPort; port <= endPort; port += 1) {
|
|
7
|
+
if (await isPortAvailable(host, port)) {
|
|
8
|
+
return port;
|
|
9
|
+
}
|
|
10
|
+
if (strict) {
|
|
11
|
+
break;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
throw new Error(strict
|
|
15
|
+
? `Port ${startPort} is already in use on ${host}.`
|
|
16
|
+
: `No available port found between ${startPort} and ${endPort} on ${host}.`);
|
|
17
|
+
}
|
|
18
|
+
export async function isPortAvailable(host, port) {
|
|
19
|
+
try {
|
|
20
|
+
await probePort(host, port);
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function probePort(host, port) {
|
|
28
|
+
const server = createServer();
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
server.once("error", reject);
|
|
31
|
+
server.listen(port, host, () => {
|
|
32
|
+
const address = server.address();
|
|
33
|
+
const resolvedPort = typeof address === "object" && address ? address.port : port;
|
|
34
|
+
server.close((error) => (error ? reject(error) : resolve(resolvedPort)));
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=ports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/web/ports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,SAAiB,EACjB,MAAe,EACf,OAAO,GAAG,SAAS,GAAG,EAAE;IAExB,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,MAAM;QACJ,CAAC,CAAC,QAAQ,SAAS,yBAAyB,IAAI,GAAG;QACnD,CAAC,CAAC,mCAAmC,SAAS,QAAQ,OAAO,OAAO,IAAI,GAAG,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,IAAY;IAC9D,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,IAAY;IACjD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAClF,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type LocalPluginInfo } from "../plugin/info.js";
|
|
3
|
+
declare const localPluginSourceSchema: z.ZodEnum<{
|
|
4
|
+
manual: "manual";
|
|
5
|
+
clone: "clone";
|
|
6
|
+
}>;
|
|
7
|
+
declare const localPluginEntrySchema: z.ZodObject<{
|
|
8
|
+
id: z.ZodString;
|
|
9
|
+
path: z.ZodString;
|
|
10
|
+
source: z.ZodEnum<{
|
|
11
|
+
manual: "manual";
|
|
12
|
+
clone: "clone";
|
|
13
|
+
}>;
|
|
14
|
+
slug: z.ZodString;
|
|
15
|
+
name: z.ZodString;
|
|
16
|
+
addedAt: z.ZodString;
|
|
17
|
+
updatedAt: z.ZodString;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
declare const localPluginRegistrySchema: z.ZodObject<{
|
|
20
|
+
version: z.ZodLiteral<1>;
|
|
21
|
+
plugins: z.ZodArray<z.ZodObject<{
|
|
22
|
+
id: z.ZodString;
|
|
23
|
+
path: z.ZodString;
|
|
24
|
+
source: z.ZodEnum<{
|
|
25
|
+
manual: "manual";
|
|
26
|
+
clone: "clone";
|
|
27
|
+
}>;
|
|
28
|
+
slug: z.ZodString;
|
|
29
|
+
name: z.ZodString;
|
|
30
|
+
addedAt: z.ZodString;
|
|
31
|
+
updatedAt: z.ZodString;
|
|
32
|
+
}, z.core.$strip>>;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
export type LocalPluginSource = z.infer<typeof localPluginSourceSchema>;
|
|
35
|
+
export type LocalPluginEntry = z.infer<typeof localPluginEntrySchema>;
|
|
36
|
+
export type LocalPluginRegistry = z.infer<typeof localPluginRegistrySchema>;
|
|
37
|
+
export type EnrichedLocalPlugin = LocalPluginEntry & {
|
|
38
|
+
exists: boolean;
|
|
39
|
+
info?: LocalPluginInfo;
|
|
40
|
+
error?: string;
|
|
41
|
+
};
|
|
42
|
+
export declare function readLocalPluginRegistry(): Promise<LocalPluginRegistry>;
|
|
43
|
+
export declare function writeLocalPluginRegistry(registry: LocalPluginRegistry): Promise<void>;
|
|
44
|
+
export declare function listLocalPlugins(): Promise<EnrichedLocalPlugin[]>;
|
|
45
|
+
export declare function getLocalPlugin(id: string): Promise<EnrichedLocalPlugin | undefined>;
|
|
46
|
+
export declare function addLocalPluginPath(pluginPath: string, source?: LocalPluginSource): Promise<EnrichedLocalPlugin>;
|
|
47
|
+
export declare function removeLocalPlugin(id: string): Promise<boolean>;
|
|
48
|
+
export declare function pluginPathId(pluginPath: string): string;
|
|
49
|
+
export {};
|