docdex 0.2.22 → 0.2.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -5
- package/README.md +18 -14
- package/assets/agents.md +36 -0
- package/bin/docdex.js +6 -11
- package/lib/install.js +38 -136
- package/lib/postinstall_setup.js +575 -116
- package/lib/uninstall.js +263 -34
- package/package.json +2 -4
- package/bin/docdex-mcp-server.js +0 -66
- package/lib/playwright_fetch.js +0 -174
- package/lib/playwright_install.js +0 -302
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
|
|
4
|
-
const fs = require("node:fs");
|
|
5
|
-
const os = require("node:os");
|
|
6
|
-
const path = require("node:path");
|
|
7
|
-
const { spawnSync } = require("node:child_process");
|
|
8
|
-
|
|
9
|
-
const DEFAULT_BROWSERS = ["chromium"];
|
|
10
|
-
const ALLOWED_BROWSERS = new Set(["chromium", "firefox", "webkit"]);
|
|
11
|
-
const MANIFEST_FILE = "manifest.json";
|
|
12
|
-
|
|
13
|
-
function defaultBrowsersPath() {
|
|
14
|
-
return path.join(os.homedir(), ".docdex", "state", "bin", "playwright");
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function resolveBrowsersPath(env = process.env, overridePath) {
|
|
18
|
-
if (overridePath) return overridePath;
|
|
19
|
-
const envPath = String(env.PLAYWRIGHT_BROWSERS_PATH || "").trim();
|
|
20
|
-
return envPath || defaultBrowsersPath();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function normalizeBrowserList(input) {
|
|
24
|
-
let list = [];
|
|
25
|
-
if (Array.isArray(input)) {
|
|
26
|
-
list = input;
|
|
27
|
-
} else if (typeof input === "string") {
|
|
28
|
-
list = input.split(",");
|
|
29
|
-
}
|
|
30
|
-
const normalized = list
|
|
31
|
-
.map((value) => String(value || "").trim().toLowerCase())
|
|
32
|
-
.filter(Boolean);
|
|
33
|
-
const unique = [];
|
|
34
|
-
const seen = new Set();
|
|
35
|
-
const base = normalized.length > 0 ? normalized : DEFAULT_BROWSERS;
|
|
36
|
-
for (const name of base) {
|
|
37
|
-
if (!ALLOWED_BROWSERS.has(name)) {
|
|
38
|
-
throw new Error(`unsupported browser: ${name}`);
|
|
39
|
-
}
|
|
40
|
-
if (!seen.has(name)) {
|
|
41
|
-
seen.add(name);
|
|
42
|
-
unique.push(name);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return unique;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function resolvePlaywrightCliPath() {
|
|
49
|
-
let pkgPath;
|
|
50
|
-
try {
|
|
51
|
-
pkgPath = require.resolve("playwright/package.json");
|
|
52
|
-
} catch {}
|
|
53
|
-
if (pkgPath) {
|
|
54
|
-
const pkgDir = path.dirname(pkgPath);
|
|
55
|
-
try {
|
|
56
|
-
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
57
|
-
const binRel =
|
|
58
|
-
typeof pkg?.bin === "string" ? pkg.bin : pkg?.bin?.playwright;
|
|
59
|
-
if (binRel) {
|
|
60
|
-
const binPath = path.join(pkgDir, binRel);
|
|
61
|
-
if (fs.existsSync(binPath)) return binPath;
|
|
62
|
-
}
|
|
63
|
-
} catch {}
|
|
64
|
-
const cliPath = path.join(pkgDir, "cli.js");
|
|
65
|
-
if (fs.existsSync(cliPath)) return cliPath;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const candidates = ["playwright/cli", "playwright/cli.js", "playwright/lib/cli/cli.js"];
|
|
69
|
-
for (const candidate of candidates) {
|
|
70
|
-
try {
|
|
71
|
-
return require.resolve(candidate);
|
|
72
|
-
} catch {
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
throw new Error("playwright CLI not found; install the playwright dependency");
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function loadPlaywright() {
|
|
80
|
-
return require("playwright");
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function loadBrowsersJson() {
|
|
84
|
-
try {
|
|
85
|
-
const corePkg = require.resolve("playwright-core/package.json");
|
|
86
|
-
const coreDir = path.dirname(corePkg);
|
|
87
|
-
const coreBrowsers = path.join(coreDir, "browsers.json");
|
|
88
|
-
if (fs.existsSync(coreBrowsers)) {
|
|
89
|
-
return JSON.parse(fs.readFileSync(coreBrowsers, "utf8"));
|
|
90
|
-
}
|
|
91
|
-
} catch {}
|
|
92
|
-
try {
|
|
93
|
-
return require("playwright/browsers.json");
|
|
94
|
-
} catch {}
|
|
95
|
-
throw new Error("playwright browsers.json not found; install playwright-core");
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function loadPlaywrightVersion() {
|
|
99
|
-
return require("playwright/package.json").version;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function resolveExecutablePath(playwright, name) {
|
|
103
|
-
switch (name) {
|
|
104
|
-
case "chromium":
|
|
105
|
-
return playwright.chromium.executablePath();
|
|
106
|
-
case "firefox":
|
|
107
|
-
return playwright.firefox.executablePath();
|
|
108
|
-
case "webkit":
|
|
109
|
-
return playwright.webkit.executablePath();
|
|
110
|
-
default:
|
|
111
|
-
return "";
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function resolveRevision(browsersJson, name) {
|
|
116
|
-
const entries = Array.isArray(browsersJson?.browsers) ? browsersJson.browsers : [];
|
|
117
|
-
const match = entries.find((entry) => entry?.name === name);
|
|
118
|
-
return match?.revision ? String(match.revision) : "unknown";
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function buildManifest({
|
|
122
|
-
browsers,
|
|
123
|
-
browsersPath,
|
|
124
|
-
playwright,
|
|
125
|
-
browsersJson,
|
|
126
|
-
playwrightVersion,
|
|
127
|
-
now = new Date(),
|
|
128
|
-
allowMissing = false,
|
|
129
|
-
logger = console
|
|
130
|
-
}) {
|
|
131
|
-
const installed = browsers.map((name) => {
|
|
132
|
-
const executablePath = resolveExecutablePath(playwright, name);
|
|
133
|
-
if (!executablePath || !fs.existsSync(executablePath)) {
|
|
134
|
-
if (allowMissing) {
|
|
135
|
-
logger?.warn?.(`[docdex] playwright ${name} executable missing at ${executablePath || "<unknown>"}`);
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
throw new Error(`playwright ${name} executable missing at ${executablePath || "<unknown>"}`);
|
|
139
|
-
}
|
|
140
|
-
return {
|
|
141
|
-
name,
|
|
142
|
-
version: resolveRevision(browsersJson, name),
|
|
143
|
-
path: executablePath
|
|
144
|
-
};
|
|
145
|
-
}).filter(Boolean);
|
|
146
|
-
return {
|
|
147
|
-
installed_at: now.toISOString(),
|
|
148
|
-
browsers_path: browsersPath,
|
|
149
|
-
playwright_version: playwrightVersion,
|
|
150
|
-
browsers: installed
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function installPlaywrightBrowsers({
|
|
155
|
-
browsers,
|
|
156
|
-
env = process.env,
|
|
157
|
-
browsersPath,
|
|
158
|
-
spawnSyncFn = spawnSync,
|
|
159
|
-
logger = console,
|
|
160
|
-
playwright,
|
|
161
|
-
browsersJson,
|
|
162
|
-
playwrightVersion,
|
|
163
|
-
resolveCliPath = resolvePlaywrightCliPath,
|
|
164
|
-
now
|
|
165
|
-
} = {}) {
|
|
166
|
-
const selected = normalizeBrowserList(browsers);
|
|
167
|
-
const resolvedPath = resolveBrowsersPath(env, browsersPath);
|
|
168
|
-
fs.mkdirSync(resolvedPath, { recursive: true });
|
|
169
|
-
|
|
170
|
-
const cliPath = resolveCliPath();
|
|
171
|
-
const runInstall = (names) =>
|
|
172
|
-
spawnSyncFn(process.execPath, [cliPath, "install", ...names], {
|
|
173
|
-
stdio: "inherit",
|
|
174
|
-
env: childEnv
|
|
175
|
-
});
|
|
176
|
-
const childEnv = {
|
|
177
|
-
...env,
|
|
178
|
-
PLAYWRIGHT_BROWSERS_PATH: resolvedPath
|
|
179
|
-
};
|
|
180
|
-
const result = runInstall(selected);
|
|
181
|
-
if (result?.error) {
|
|
182
|
-
throw new Error(result.error.message || String(result.error));
|
|
183
|
-
}
|
|
184
|
-
const installError =
|
|
185
|
-
result?.status && result.status !== 0
|
|
186
|
-
? (result.stderr ? String(result.stderr).trim() : `playwright install failed (${result.status})`)
|
|
187
|
-
: null;
|
|
188
|
-
|
|
189
|
-
process.env.PLAYWRIGHT_BROWSERS_PATH = resolvedPath;
|
|
190
|
-
const playwrightRuntime = playwright || loadPlaywright();
|
|
191
|
-
const browsersMetadata = browsersJson || loadBrowsersJson();
|
|
192
|
-
const version = playwrightVersion || loadPlaywrightVersion();
|
|
193
|
-
const manifest = buildManifest({
|
|
194
|
-
browsers: selected,
|
|
195
|
-
browsersPath: resolvedPath,
|
|
196
|
-
playwright: playwrightRuntime,
|
|
197
|
-
browsersJson: browsersMetadata,
|
|
198
|
-
playwrightVersion: version,
|
|
199
|
-
now,
|
|
200
|
-
allowMissing: true,
|
|
201
|
-
logger
|
|
202
|
-
});
|
|
203
|
-
if (!manifest.browsers || manifest.browsers.length === 0 && selected.length > 1) {
|
|
204
|
-
const recovered = [];
|
|
205
|
-
for (const name of selected) {
|
|
206
|
-
const attempt = runInstall([name]);
|
|
207
|
-
if (attempt?.error) {
|
|
208
|
-
logger?.warn?.(`[docdex] playwright ${name} install failed: ${attempt.error.message || attempt.error}`);
|
|
209
|
-
continue;
|
|
210
|
-
}
|
|
211
|
-
if (attempt?.status && attempt.status !== 0) {
|
|
212
|
-
logger?.warn?.(
|
|
213
|
-
`[docdex] playwright ${name} install failed (${attempt.status})`
|
|
214
|
-
);
|
|
215
|
-
continue;
|
|
216
|
-
}
|
|
217
|
-
const partial = buildManifest({
|
|
218
|
-
browsers: [name],
|
|
219
|
-
browsersPath: resolvedPath,
|
|
220
|
-
playwright: playwrightRuntime,
|
|
221
|
-
browsersJson: browsersMetadata,
|
|
222
|
-
playwrightVersion: version,
|
|
223
|
-
now,
|
|
224
|
-
allowMissing: true,
|
|
225
|
-
logger
|
|
226
|
-
});
|
|
227
|
-
recovered.push(...partial.browsers);
|
|
228
|
-
}
|
|
229
|
-
if (recovered.length > 0) {
|
|
230
|
-
manifest.browsers = recovered;
|
|
231
|
-
logger?.warn?.(
|
|
232
|
-
`[docdex] playwright install partially succeeded: ${recovered
|
|
233
|
-
.map((entry) => entry.name)
|
|
234
|
-
.join(", ")}`
|
|
235
|
-
);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
if (!manifest.browsers || manifest.browsers.length === 0) {
|
|
239
|
-
throw new Error(installError || "playwright install produced no usable browsers");
|
|
240
|
-
}
|
|
241
|
-
if (installError) {
|
|
242
|
-
logger?.warn?.(`[docdex] playwright install completed with errors: ${installError}`);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
const manifestPath = path.join(resolvedPath, MANIFEST_FILE);
|
|
246
|
-
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n");
|
|
247
|
-
logger?.warn?.(`[docdex] Playwright browsers installed: ${selected.join(", ")}`);
|
|
248
|
-
logger?.warn?.(`[docdex] Playwright manifest saved: ${manifestPath}`);
|
|
249
|
-
|
|
250
|
-
return { manifest, manifestPath };
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
function parseArgs(argv) {
|
|
254
|
-
const parsed = { browsers: null, path: null, json: false };
|
|
255
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
256
|
-
const value = argv[i];
|
|
257
|
-
if (value === "--browsers" && argv[i + 1]) {
|
|
258
|
-
parsed.browsers = argv[i + 1];
|
|
259
|
-
i += 1;
|
|
260
|
-
continue;
|
|
261
|
-
}
|
|
262
|
-
if (value === "--path" && argv[i + 1]) {
|
|
263
|
-
parsed.path = argv[i + 1];
|
|
264
|
-
i += 1;
|
|
265
|
-
continue;
|
|
266
|
-
}
|
|
267
|
-
if (value === "--json") {
|
|
268
|
-
parsed.json = true;
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
return parsed;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
function main() {
|
|
275
|
-
try {
|
|
276
|
-
const args = parseArgs(process.argv.slice(2));
|
|
277
|
-
const result = installPlaywrightBrowsers({
|
|
278
|
-
browsers: args.browsers,
|
|
279
|
-
browsersPath: args.path
|
|
280
|
-
});
|
|
281
|
-
if (args.json) {
|
|
282
|
-
process.stdout.write(JSON.stringify(result.manifest, null, 2) + "\n");
|
|
283
|
-
}
|
|
284
|
-
} catch (err) {
|
|
285
|
-
const message = err?.message || String(err);
|
|
286
|
-
console.error(`[docdex] playwright install failed: ${message}`);
|
|
287
|
-
process.exit(1);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
if (require.main === module) {
|
|
292
|
-
main();
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
module.exports = {
|
|
296
|
-
buildManifest,
|
|
297
|
-
defaultBrowsersPath,
|
|
298
|
-
installPlaywrightBrowsers,
|
|
299
|
-
normalizeBrowserList,
|
|
300
|
-
resolveBrowsersPath,
|
|
301
|
-
resolvePlaywrightCliPath
|
|
302
|
-
};
|