laxy-verify 0.1.2 → 1.0.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.
- package/README.md +150 -163
- package/dist/badge.d.ts +1 -0
- package/dist/badge.js +11 -0
- package/dist/build.d.ts +11 -0
- package/dist/build.js +59 -0
- package/dist/cli.d.ts +2 -2
- package/dist/cli.js +257 -102
- package/dist/comment.d.ts +20 -0
- package/dist/comment.js +53 -0
- package/dist/config.d.ts +34 -16
- package/dist/config.js +118 -55
- package/dist/detect.d.ts +10 -0
- package/dist/detect.js +97 -0
- package/dist/github.d.ts +8 -0
- package/dist/github.js +11 -0
- package/dist/grade.d.ts +37 -0
- package/dist/grade.js +57 -0
- package/dist/init.d.ts +1 -0
- package/dist/init.js +85 -0
- package/dist/lighthouse.d.ts +7 -0
- package/dist/lighthouse.js +94 -0
- package/dist/serve.d.ts +12 -0
- package/dist/serve.js +83 -0
- package/dist/status.d.ts +6 -0
- package/dist/status.js +33 -0
- package/package.json +29 -44
- package/action.yml +0 -97
- package/dist/build-runner.d.ts +0 -22
- package/dist/build-runner.js +0 -156
- package/dist/build-runner.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/dev-server.d.ts +0 -8
- package/dist/dev-server.js +0 -81
- package/dist/dev-server.js.map +0 -1
- package/dist/lighthouse-runner.d.ts +0 -10
- package/dist/lighthouse-runner.js +0 -119
- package/dist/lighthouse-runner.js.map +0 -1
- package/dist/project-runtime.d.ts +0 -32
- package/dist/project-runtime.js +0 -99
- package/dist/project-runtime.js.map +0 -1
- package/dist/reporter.d.ts +0 -21
- package/dist/reporter.js +0 -100
- package/dist/reporter.js.map +0 -1
- package/dist/verification.d.ts +0 -42
- package/dist/verification.js +0 -105
- package/dist/verification.js.map +0 -1
package/dist/serve.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import * as http from "node:http";
|
|
3
|
+
import treeKill from "tree-kill";
|
|
4
|
+
export class PortConflictError extends Error {
|
|
5
|
+
constructor(port) {
|
|
6
|
+
super(`Port ${port} is already in use — please free the port or configure a different one in .laxy.yml`);
|
|
7
|
+
this.name = "PortConflictError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class DevServerTimeoutError extends Error {
|
|
11
|
+
constructor(port, timeoutSec) {
|
|
12
|
+
super(`Dev server did not respond on port ${port} within ${timeoutSec}s`);
|
|
13
|
+
this.name = "DevServerTimeoutError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function httpGet(url) {
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
http
|
|
19
|
+
.get(url, { timeout: 2000 }, (res) => {
|
|
20
|
+
resolve(res.statusCode ?? null);
|
|
21
|
+
})
|
|
22
|
+
.on("error", () => {
|
|
23
|
+
resolve(null);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export async function startDevServer(command, port, timeoutSec) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
console.log(`Starting dev server: ${command}`);
|
|
30
|
+
const proc = spawn(command, {
|
|
31
|
+
shell: true,
|
|
32
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
33
|
+
env: { ...process.env, PORT: String(port) },
|
|
34
|
+
});
|
|
35
|
+
// Pipe output to console
|
|
36
|
+
proc.stdout?.on("data", (chunk) => {
|
|
37
|
+
const lines = chunk.toString().split("\n").filter(Boolean);
|
|
38
|
+
for (const line of lines)
|
|
39
|
+
console.log(` [dev] ${line}`);
|
|
40
|
+
});
|
|
41
|
+
proc.stderr?.on("data", (chunk) => {
|
|
42
|
+
const lines = chunk.toString().split("\n").filter(Boolean);
|
|
43
|
+
for (const line of lines)
|
|
44
|
+
console.error(` [dev] ${line}`);
|
|
45
|
+
});
|
|
46
|
+
proc.on("error", (err) => {
|
|
47
|
+
if (err.code === "EADDRINUSE") {
|
|
48
|
+
reject(new PortConflictError(port));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
reject(new Error(`Dev server error: ${err.message}`));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// Poll healthcheck
|
|
55
|
+
const deadline = Date.now() + timeoutSec * 1000;
|
|
56
|
+
const poll = async () => {
|
|
57
|
+
if (Date.now() >= deadline) {
|
|
58
|
+
if (proc.pid)
|
|
59
|
+
treeKill(proc.pid, "SIGKILL");
|
|
60
|
+
reject(new DevServerTimeoutError(port, timeoutSec));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const status = await httpGet(`http://localhost:${port}/`);
|
|
64
|
+
if (status !== null) {
|
|
65
|
+
if (status === 200) {
|
|
66
|
+
console.log(`Dev server ready on port ${port} (HTTP ${status})`);
|
|
67
|
+
resolve({ pid: proc.pid, port });
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.log(`Dev server returned HTTP ${status} — continuing anyway`);
|
|
71
|
+
resolve({ pid: proc.pid, port });
|
|
72
|
+
}
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
setTimeout(poll, 500);
|
|
76
|
+
};
|
|
77
|
+
poll();
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
export function stopDevServer(pid) {
|
|
81
|
+
console.log(`Stopping dev server (PID ${pid})`);
|
|
82
|
+
treeKill(pid, "SIGKILL");
|
|
83
|
+
}
|
package/dist/status.d.ts
ADDED
package/dist/status.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getGitHubContext } from "./github.js";
|
|
2
|
+
export async function createStatusCheck(result) {
|
|
3
|
+
const ctx = getGitHubContext();
|
|
4
|
+
if (!ctx)
|
|
5
|
+
return;
|
|
6
|
+
const [owner, repo] = ctx.repository.split("/");
|
|
7
|
+
const description = `Laxy Verify — ${result.grade}`;
|
|
8
|
+
const state = result.exitCode === 0 ? "success" : "failure";
|
|
9
|
+
const targetUrl = `${process.env.GITHUB_SERVER_URL ?? "https://github.com"}/${ctx.repository}/actions/runs/${process.env.GITHUB_RUN_ID ?? ""}`;
|
|
10
|
+
const url = `https://api.github.com/repos/${owner}/${repo}/statuses/${ctx.sha}`;
|
|
11
|
+
try {
|
|
12
|
+
const res = await fetch(url, {
|
|
13
|
+
method: "POST",
|
|
14
|
+
headers: {
|
|
15
|
+
Authorization: `Bearer ${ctx.token}`,
|
|
16
|
+
Accept: "application/vnd.github.v3+json",
|
|
17
|
+
"Content-Type": "application/json",
|
|
18
|
+
},
|
|
19
|
+
body: JSON.stringify({
|
|
20
|
+
state,
|
|
21
|
+
description,
|
|
22
|
+
target_url: targetUrl,
|
|
23
|
+
context: "laxy-verify",
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
26
|
+
if (!res.ok) {
|
|
27
|
+
console.warn(`GitHub Status Check API returned ${res.status} — skipping status`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.warn(`GitHub Status Check request failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
package/package.json
CHANGED
|
@@ -1,44 +1,29 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "laxy-verify",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Frontend quality gate: build
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"laxy-verify": "dist/cli.js"
|
|
8
|
-
},
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"dependencies": {
|
|
31
|
-
"@lhci/cli": "^0.14.0",
|
|
32
|
-
"chalk": "^5.3.0",
|
|
33
|
-
"commander": "^12.0.0",
|
|
34
|
-
"yaml": "^2.4.0"
|
|
35
|
-
},
|
|
36
|
-
"devDependencies": {
|
|
37
|
-
"@types/node": "^20.0.0",
|
|
38
|
-
"typescript": "^5.6.0",
|
|
39
|
-
"vitest": "^2.0.0"
|
|
40
|
-
},
|
|
41
|
-
"engines": {
|
|
42
|
-
"node": ">=20"
|
|
43
|
-
}
|
|
44
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "laxy-verify",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Frontend quality gate: build + Lighthouse verification",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"laxy-verify": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"start": "node dist/cli.js",
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"test:coverage": "vitest run --coverage"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@lhci/cli": "^0.14.0",
|
|
20
|
+
"js-yaml": "^4.1.0",
|
|
21
|
+
"tree-kill": "^1.2.2"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/js-yaml": "^4.0.9",
|
|
25
|
+
"@types/node": "^20.0.0",
|
|
26
|
+
"typescript": "^5.4.0",
|
|
27
|
+
"vitest": "^2.0.0"
|
|
28
|
+
}
|
|
29
|
+
}
|
package/action.yml
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
name: 'Laxy Verify'
|
|
2
|
-
description: 'Frontend quality gate: build check + Lighthouse audit + verification grade'
|
|
3
|
-
inputs:
|
|
4
|
-
threshold-config:
|
|
5
|
-
description: 'Path to .laxy.yml threshold config'
|
|
6
|
-
required: false
|
|
7
|
-
default: '.laxy.yml'
|
|
8
|
-
node-version:
|
|
9
|
-
description: 'Node.js version'
|
|
10
|
-
required: false
|
|
11
|
-
default: '20'
|
|
12
|
-
skip-lighthouse:
|
|
13
|
-
description: 'Skip Lighthouse, run build check only'
|
|
14
|
-
required: false
|
|
15
|
-
default: 'false'
|
|
16
|
-
outputs:
|
|
17
|
-
grade:
|
|
18
|
-
description: 'Verification grade (Gold/Silver/Bronze/Unverified)'
|
|
19
|
-
value: ${{ steps.verify.outputs.grade }}
|
|
20
|
-
report:
|
|
21
|
-
description: 'JSON report string'
|
|
22
|
-
value: ${{ steps.verify.outputs.report }}
|
|
23
|
-
runs:
|
|
24
|
-
using: 'composite'
|
|
25
|
-
steps:
|
|
26
|
-
- name: Setup Node.js
|
|
27
|
-
uses: actions/setup-node@v4
|
|
28
|
-
with:
|
|
29
|
-
node-version: ${{ inputs.node-version }}
|
|
30
|
-
|
|
31
|
-
- name: Install dependencies
|
|
32
|
-
shell: bash
|
|
33
|
-
run: npm ci
|
|
34
|
-
|
|
35
|
-
- name: Run Laxy Verify
|
|
36
|
-
id: verify
|
|
37
|
-
shell: bash
|
|
38
|
-
run: |
|
|
39
|
-
SKIP_FLAG=""
|
|
40
|
-
if [ "${{ inputs.skip-lighthouse }}" = "true" ]; then
|
|
41
|
-
SKIP_FLAG="--skip-lighthouse"
|
|
42
|
-
fi
|
|
43
|
-
npx laxy-verify . --format json --ci $SKIP_FLAG > laxy-report.json 2>&1 || true
|
|
44
|
-
GRADE=$(node -e "const r=JSON.parse(require('fs').readFileSync('laxy-report.json','utf8'));console.log(r.grade)")
|
|
45
|
-
echo "grade=$GRADE" >> $GITHUB_OUTPUT
|
|
46
|
-
echo "report=$(cat laxy-report.json)" >> $GITHUB_OUTPUT
|
|
47
|
-
|
|
48
|
-
- name: Post PR Comment
|
|
49
|
-
if: github.event_name == 'pull_request'
|
|
50
|
-
uses: actions/github-script@v7
|
|
51
|
-
with:
|
|
52
|
-
script: |
|
|
53
|
-
const fs = require('fs');
|
|
54
|
-
let report;
|
|
55
|
-
try {
|
|
56
|
-
report = JSON.parse(fs.readFileSync('laxy-report.json', 'utf8'));
|
|
57
|
-
} catch {
|
|
58
|
-
console.log('No report file found');
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Generate markdown from report
|
|
63
|
-
const npx = process.platform === 'win32' ? 'npx.cmd' : 'npx';
|
|
64
|
-
const { execSync } = require('child_process');
|
|
65
|
-
let md;
|
|
66
|
-
try {
|
|
67
|
-
md = execSync(`${npx} laxy-verify . --format md --ci --skip-lighthouse 2>/dev/null || true`).toString();
|
|
68
|
-
} catch {
|
|
69
|
-
md = `## Laxy Verify — ${report.grade}\n\nSee JSON report for details.`;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Find existing comment
|
|
73
|
-
const marker = '<!-- laxy-verify -->';
|
|
74
|
-
const { data: comments } = await github.rest.issues.listComments({
|
|
75
|
-
owner: context.repo.owner,
|
|
76
|
-
repo: context.repo.repo,
|
|
77
|
-
issue_number: context.issue.number,
|
|
78
|
-
});
|
|
79
|
-
const existing = comments.find(c => c.body?.includes(marker));
|
|
80
|
-
|
|
81
|
-
const body = md.includes(marker) ? md : `${marker}\n${md}`;
|
|
82
|
-
|
|
83
|
-
if (existing) {
|
|
84
|
-
await github.rest.issues.updateComment({
|
|
85
|
-
owner: context.repo.owner,
|
|
86
|
-
repo: context.repo.repo,
|
|
87
|
-
comment_id: existing.id,
|
|
88
|
-
body,
|
|
89
|
-
});
|
|
90
|
-
} else {
|
|
91
|
-
await github.rest.issues.createComment({
|
|
92
|
-
owner: context.repo.owner,
|
|
93
|
-
repo: context.repo.repo,
|
|
94
|
-
issue_number: context.issue.number,
|
|
95
|
-
body,
|
|
96
|
-
});
|
|
97
|
-
}
|
package/dist/build-runner.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export interface BuildError {
|
|
2
|
-
file?: string;
|
|
3
|
-
line?: number;
|
|
4
|
-
col?: number;
|
|
5
|
-
code?: string;
|
|
6
|
-
message: string;
|
|
7
|
-
raw: string;
|
|
8
|
-
}
|
|
9
|
-
export interface BuildCheckResult {
|
|
10
|
-
success: boolean;
|
|
11
|
-
errors: string[];
|
|
12
|
-
structuredErrors: BuildError[];
|
|
13
|
-
warnings: string[];
|
|
14
|
-
duration: number;
|
|
15
|
-
output: string;
|
|
16
|
-
}
|
|
17
|
-
export declare function parseBuildOutput(output: string): {
|
|
18
|
-
errors: string[];
|
|
19
|
-
structuredErrors: BuildError[];
|
|
20
|
-
warnings: string[];
|
|
21
|
-
};
|
|
22
|
-
export declare function runBuild(projectPath: string): Promise<BuildCheckResult>;
|
package/dist/build-runner.js
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { spawn } from "child_process";
|
|
2
|
-
import { readFileSync, existsSync, readdirSync } from "fs";
|
|
3
|
-
import { join } from "path";
|
|
4
|
-
import { detectRuntimeFromFiles, getBuildCommandCandidates, parseProjectPackageJson, } from "./project-runtime.js";
|
|
5
|
-
function parseErrorLine(raw) {
|
|
6
|
-
const clean = raw.trim();
|
|
7
|
-
if (!clean)
|
|
8
|
-
return null;
|
|
9
|
-
const tsMatch = clean.match(/^(.+?)\((\d+),(\d+)\):\s+error\s+(TS\d+):\s+(.+)$/);
|
|
10
|
-
if (tsMatch) {
|
|
11
|
-
return {
|
|
12
|
-
file: tsMatch[1].trim(),
|
|
13
|
-
line: parseInt(tsMatch[2], 10),
|
|
14
|
-
col: parseInt(tsMatch[3], 10),
|
|
15
|
-
code: tsMatch[4],
|
|
16
|
-
message: tsMatch[5].slice(0, 200),
|
|
17
|
-
raw: clean.slice(0, 250),
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
if (/error TS\d+:|Module not found|Cannot find module|Failed to resolve|SyntaxError:|Unexpected token|Build error occurred|Failed to compile/i.test(clean)) {
|
|
21
|
-
return { message: clean.slice(0, 200), raw: clean.slice(0, 250) };
|
|
22
|
-
}
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
export function parseBuildOutput(output) {
|
|
26
|
-
const errors = [];
|
|
27
|
-
const structuredErrors = [];
|
|
28
|
-
const warnings = [];
|
|
29
|
-
for (const line of output.split("\n")) {
|
|
30
|
-
const clean = line.trim();
|
|
31
|
-
if (!clean)
|
|
32
|
-
continue;
|
|
33
|
-
const structured = parseErrorLine(clean);
|
|
34
|
-
if (structured) {
|
|
35
|
-
errors.push(structured.raw);
|
|
36
|
-
structuredErrors.push(structured);
|
|
37
|
-
}
|
|
38
|
-
else if (/^warn|warning:/i.test(clean)) {
|
|
39
|
-
warnings.push(clean.slice(0, 150));
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return {
|
|
43
|
-
errors: errors.slice(0, 20),
|
|
44
|
-
structuredErrors: structuredErrors.slice(0, 20),
|
|
45
|
-
warnings: warnings.slice(0, 10),
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
function extractFallbackBuildErrors(output, exitCode) {
|
|
49
|
-
const meaningfulLines = output
|
|
50
|
-
.split("\n")
|
|
51
|
-
.map((l) => l.trim())
|
|
52
|
-
.filter(Boolean)
|
|
53
|
-
.filter((l) => !/^warn|warning:|^> |^npm notice/i.test(l));
|
|
54
|
-
const likelyErrorLines = meaningfulLines.filter((l) => /error|failed|unable|cannot|missing|unexpected|resolve|exception|ELIFECYCLE|ERR!/i.test(l));
|
|
55
|
-
const selected = (likelyErrorLines.length > 0 ? likelyErrorLines : meaningfulLines)
|
|
56
|
-
.slice(-5)
|
|
57
|
-
.map((l) => l.slice(0, 200));
|
|
58
|
-
if (selected.length > 0)
|
|
59
|
-
return Array.from(new Set(selected));
|
|
60
|
-
return [`Build failed with exit code ${exitCode ?? "unknown"} but produced no parsed diagnostics.`];
|
|
61
|
-
}
|
|
62
|
-
function runBuildCommand(command, projectPath) {
|
|
63
|
-
const startTime = Date.now();
|
|
64
|
-
return new Promise((resolve) => {
|
|
65
|
-
const cmd = process.platform === "win32" ? `chcp 65001 > nul && ${command.cmd}` : command.cmd;
|
|
66
|
-
const child = spawn(cmd, command.args, {
|
|
67
|
-
cwd: projectPath,
|
|
68
|
-
shell: true,
|
|
69
|
-
env: { ...process.env, CI: "true", NODE_ENV: "production" },
|
|
70
|
-
});
|
|
71
|
-
let output = "";
|
|
72
|
-
child.stdout?.on("data", (d) => { output += d.toString(); });
|
|
73
|
-
child.stderr?.on("data", (d) => { output += d.toString(); });
|
|
74
|
-
const timeout = setTimeout(() => {
|
|
75
|
-
child.kill();
|
|
76
|
-
resolve({
|
|
77
|
-
success: false,
|
|
78
|
-
errors: ["Build timed out after 90s"],
|
|
79
|
-
structuredErrors: [{ message: "Build timed out after 90s", raw: "Build timed out after 90s" }],
|
|
80
|
-
warnings: [],
|
|
81
|
-
duration: 90000,
|
|
82
|
-
output: output.slice(-1000),
|
|
83
|
-
});
|
|
84
|
-
}, 90000);
|
|
85
|
-
child.on("close", (code) => {
|
|
86
|
-
clearTimeout(timeout);
|
|
87
|
-
const duration = Date.now() - startTime;
|
|
88
|
-
let { errors, structuredErrors, warnings } = parseBuildOutput(output);
|
|
89
|
-
if (code !== 0 && errors.length === 0) {
|
|
90
|
-
const fallback = extractFallbackBuildErrors(output, code);
|
|
91
|
-
errors = fallback;
|
|
92
|
-
structuredErrors = fallback.map((raw) => ({ message: raw.slice(0, 200), raw }));
|
|
93
|
-
}
|
|
94
|
-
resolve({ success: code === 0, errors, structuredErrors, warnings, duration, output: output.slice(-2000) });
|
|
95
|
-
});
|
|
96
|
-
child.on("error", (err) => {
|
|
97
|
-
clearTimeout(timeout);
|
|
98
|
-
resolve({
|
|
99
|
-
success: false,
|
|
100
|
-
errors: [`Build process error: ${err.message}`],
|
|
101
|
-
structuredErrors: [{ message: `Build process error: ${err.message}`, raw: err.message }],
|
|
102
|
-
warnings: [],
|
|
103
|
-
duration: Date.now() - startTime,
|
|
104
|
-
output: "",
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
export async function runBuild(projectPath) {
|
|
110
|
-
const packageJsonPath = join(projectPath, "package.json");
|
|
111
|
-
if (!existsSync(packageJsonPath)) {
|
|
112
|
-
return {
|
|
113
|
-
success: false,
|
|
114
|
-
errors: ["Not a Node.js project: package.json not found"],
|
|
115
|
-
structuredErrors: [{ message: "Not a Node.js project", raw: "package.json not found" }],
|
|
116
|
-
warnings: [],
|
|
117
|
-
duration: 0,
|
|
118
|
-
output: "",
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
const pkgContent = readFileSync(packageJsonPath, "utf-8");
|
|
122
|
-
const packageJson = parseProjectPackageJson(pkgContent);
|
|
123
|
-
const candidateFiles = readdirSync(projectPath).filter((f) => !f.startsWith("."));
|
|
124
|
-
const runtime = detectRuntimeFromFiles(candidateFiles, packageJson);
|
|
125
|
-
const npm = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
126
|
-
const npx = process.platform === "win32" ? "npx.cmd" : "npx";
|
|
127
|
-
const buildCommands = getBuildCommandCandidates(runtime, { npmCommand: npm, npxCommand: npx });
|
|
128
|
-
if (buildCommands.length === 0) {
|
|
129
|
-
return {
|
|
130
|
-
success: false,
|
|
131
|
-
errors: ["No build command found in package.json"],
|
|
132
|
-
structuredErrors: [{ message: "No build command found", raw: "No build script in package.json" }],
|
|
133
|
-
warnings: [],
|
|
134
|
-
duration: 0,
|
|
135
|
-
output: "",
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
for (const command of buildCommands) {
|
|
139
|
-
const result = await runBuildCommand(command, projectPath);
|
|
140
|
-
if (result.success)
|
|
141
|
-
return result;
|
|
142
|
-
// If this wasn't a "command not found" error, stop trying
|
|
143
|
-
if (!/missing script|command not found|is not recognized/i.test(result.output)) {
|
|
144
|
-
return result;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
return {
|
|
148
|
-
success: false,
|
|
149
|
-
errors: ["All build commands failed"],
|
|
150
|
-
structuredErrors: [{ message: "All build commands failed", raw: "No build command succeeded" }],
|
|
151
|
-
warnings: [],
|
|
152
|
-
duration: 0,
|
|
153
|
-
output: "",
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=build-runner.js.map
|
package/dist/build-runner.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-runner.js","sourceRoot":"","sources":["../src/build-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/dev-server.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type ChildProcess } from "child_process";
|
|
2
|
-
export interface DevServerHandle {
|
|
3
|
-
process: ChildProcess;
|
|
4
|
-
port: number;
|
|
5
|
-
url: string;
|
|
6
|
-
}
|
|
7
|
-
export declare function startDevServer(projectPath: string, port: number): Promise<DevServerHandle>;
|
|
8
|
-
export declare function stopDevServer(handle: DevServerHandle): void;
|
package/dist/dev-server.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { spawn } from "child_process";
|
|
2
|
-
import http from "http";
|
|
3
|
-
import { readFileSync, readdirSync } from "fs";
|
|
4
|
-
import { join } from "path";
|
|
5
|
-
import { detectRuntimeFromFiles, getDevCommandCandidates, parseProjectPackageJson, } from "./project-runtime.js";
|
|
6
|
-
function waitForPort(port, timeoutMs = 30000) {
|
|
7
|
-
const start = Date.now();
|
|
8
|
-
return new Promise((resolve, reject) => {
|
|
9
|
-
const check = () => {
|
|
10
|
-
const req = http.get(`http://localhost:${port}`, (res) => {
|
|
11
|
-
res.resume();
|
|
12
|
-
resolve(res.statusCode ?? 0);
|
|
13
|
-
});
|
|
14
|
-
req.on("error", () => {
|
|
15
|
-
if (Date.now() - start > timeoutMs) {
|
|
16
|
-
reject(new Error(`Dev server did not respond on port ${port} within ${timeoutMs / 1000}s`));
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
setTimeout(check, 1000);
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
req.setTimeout(3000, () => {
|
|
23
|
-
req.destroy();
|
|
24
|
-
if (Date.now() - start > timeoutMs) {
|
|
25
|
-
reject(new Error(`Dev server timed out on port ${port}`));
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
setTimeout(check, 1000);
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
check();
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
export async function startDevServer(projectPath, port) {
|
|
36
|
-
const pkgContent = readFileSync(join(projectPath, "package.json"), "utf-8");
|
|
37
|
-
const packageJson = parseProjectPackageJson(pkgContent);
|
|
38
|
-
const candidateFiles = readdirSync(projectPath).filter((f) => !f.startsWith("."));
|
|
39
|
-
const runtime = detectRuntimeFromFiles(candidateFiles, packageJson);
|
|
40
|
-
const npm = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
41
|
-
const npx = process.platform === "win32" ? "npx.cmd" : "npx";
|
|
42
|
-
const devCommands = getDevCommandCandidates(runtime, { port, npmCommand: npm, npxCommand: npx });
|
|
43
|
-
if (devCommands.length === 0) {
|
|
44
|
-
throw new Error("No dev server command found");
|
|
45
|
-
}
|
|
46
|
-
const command = devCommands[0];
|
|
47
|
-
const cmd = process.platform === "win32" ? `chcp 65001 > nul && ${command.cmd}` : command.cmd;
|
|
48
|
-
const child = spawn(cmd, command.args, {
|
|
49
|
-
cwd: projectPath,
|
|
50
|
-
shell: true,
|
|
51
|
-
env: { ...process.env, PORT: String(port) },
|
|
52
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
53
|
-
});
|
|
54
|
-
// Drain stdout/stderr to prevent buffer blocking
|
|
55
|
-
child.stdout?.resume();
|
|
56
|
-
child.stderr?.resume();
|
|
57
|
-
const statusCode = await waitForPort(port);
|
|
58
|
-
if (statusCode !== 200 && statusCode !== 304) {
|
|
59
|
-
child.kill();
|
|
60
|
-
throw new Error(`Dev server returned HTTP ${statusCode}. Check environment variables.`);
|
|
61
|
-
}
|
|
62
|
-
return {
|
|
63
|
-
process: child,
|
|
64
|
-
port,
|
|
65
|
-
url: `http://localhost:${port}`,
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
export function stopDevServer(handle) {
|
|
69
|
-
try {
|
|
70
|
-
if (process.platform === "win32") {
|
|
71
|
-
spawn("taskkill", ["/pid", String(handle.process.pid), "/f", "/t"], { shell: true });
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
handle.process.kill("SIGTERM");
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
// already dead
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=dev-server.js.map
|
package/dist/dev-server.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { LighthouseScores } from "./verification.js";
|
|
2
|
-
export interface LighthouseResult {
|
|
3
|
-
scores: LighthouseScores | null;
|
|
4
|
-
error?: string;
|
|
5
|
-
}
|
|
6
|
-
export declare function runLighthouse(projectPath: string, options?: {
|
|
7
|
-
port?: number;
|
|
8
|
-
runs?: number;
|
|
9
|
-
ciMode?: boolean;
|
|
10
|
-
}): Promise<LighthouseResult>;
|