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.
Files changed (47) hide show
  1. package/README.md +150 -163
  2. package/dist/badge.d.ts +1 -0
  3. package/dist/badge.js +11 -0
  4. package/dist/build.d.ts +11 -0
  5. package/dist/build.js +59 -0
  6. package/dist/cli.d.ts +2 -2
  7. package/dist/cli.js +257 -102
  8. package/dist/comment.d.ts +20 -0
  9. package/dist/comment.js +53 -0
  10. package/dist/config.d.ts +34 -16
  11. package/dist/config.js +118 -55
  12. package/dist/detect.d.ts +10 -0
  13. package/dist/detect.js +97 -0
  14. package/dist/github.d.ts +8 -0
  15. package/dist/github.js +11 -0
  16. package/dist/grade.d.ts +37 -0
  17. package/dist/grade.js +57 -0
  18. package/dist/init.d.ts +1 -0
  19. package/dist/init.js +85 -0
  20. package/dist/lighthouse.d.ts +7 -0
  21. package/dist/lighthouse.js +94 -0
  22. package/dist/serve.d.ts +12 -0
  23. package/dist/serve.js +83 -0
  24. package/dist/status.d.ts +6 -0
  25. package/dist/status.js +33 -0
  26. package/package.json +29 -44
  27. package/action.yml +0 -97
  28. package/dist/build-runner.d.ts +0 -22
  29. package/dist/build-runner.js +0 -156
  30. package/dist/build-runner.js.map +0 -1
  31. package/dist/cli.js.map +0 -1
  32. package/dist/config.js.map +0 -1
  33. package/dist/dev-server.d.ts +0 -8
  34. package/dist/dev-server.js +0 -81
  35. package/dist/dev-server.js.map +0 -1
  36. package/dist/lighthouse-runner.d.ts +0 -10
  37. package/dist/lighthouse-runner.js +0 -119
  38. package/dist/lighthouse-runner.js.map +0 -1
  39. package/dist/project-runtime.d.ts +0 -32
  40. package/dist/project-runtime.js +0 -99
  41. package/dist/project-runtime.js.map +0 -1
  42. package/dist/reporter.d.ts +0 -21
  43. package/dist/reporter.js +0 -100
  44. package/dist/reporter.js.map +0 -1
  45. package/dist/verification.d.ts +0 -42
  46. package/dist/verification.js +0 -105
  47. 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
+ }
@@ -0,0 +1,6 @@
1
+ interface StatusResult {
2
+ grade: string;
3
+ exitCode: number;
4
+ }
5
+ export declare function createStatusCheck(result: StatusResult): Promise<void>;
6
+ export {};
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.1.2",
4
- "description": "Frontend quality gate: build check + Lighthouse audit + verification grade",
5
- "type": "module",
6
- "bin": {
7
- "laxy-verify": "dist/cli.js"
8
- },
9
- "scripts": {
10
- "build": "tsc",
11
- "test": "vitest run",
12
- "test:watch": "vitest"
13
- },
14
- "keywords": [
15
- "lighthouse",
16
- "build",
17
- "quality",
18
- "ci",
19
- "github-action",
20
- "verification"
21
- ],
22
- "author": "Sungmin",
23
- "license": "MIT",
24
- "files": [
25
- "dist",
26
- "action.yml",
27
- "action",
28
- "README.md"
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
- }
@@ -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>;
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"build-runner.js","sourceRoot":"","sources":["../src/build-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,GAExB,MAAM,sBAAsB,CAAC;AAoB9B,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACjF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACvB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7B,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAChB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACjC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACzB,CAAC;IACJ,CAAC;IAED,IAAI,0IAA0I,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3J,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAK7C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,gBAAgB,GAAiB,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC5B,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,gBAAgB,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/C,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAc,EAAE,QAAuB;IACzE,MAAM,eAAe,GAAG,MAAM;SAC3B,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACpD,kFAAkF,CAAC,IAAI,CAAC,CAAC,CAAC,CAC3F,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC;SAChF,KAAK,CAAC,CAAC,CAAC,CAAC;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAE/B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,+BAA+B,QAAQ,IAAI,SAAS,sCAAsC,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,eAAe,CAAC,OAAoB,EAAE,WAAmB;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,OAAO,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,EAAE;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,uBAAuB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QAC9F,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE;YACrC,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE;SAC5D,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7D,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,CAAC,2BAA2B,CAAC;gBACrC,gBAAgB,EAAE,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,GAAG,EAAE,2BAA2B,EAAE,CAAC;gBAC9F,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;aAC5B,CAAC,CAAC;QACL,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACtE,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,0BAA0B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC1D,MAAM,GAAG,QAAQ,CAAC;gBAClB,gBAAgB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAClF,CAAC;YACD,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC/C,gBAAgB,EAAE,CAAC,EAAE,OAAO,EAAE,wBAAwB,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;gBACxF,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAChC,MAAM,EAAE,EAAE;aACX,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,WAAmB;IAChD,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,CAAC,+CAA+C,CAAC;YACzD,gBAAgB,EAAE,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,GAAG,EAAE,wBAAwB,EAAE,CAAC;YACvF,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAExD,MAAM,cAAc,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,sBAAsB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAEpE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,MAAM,aAAa,GAAG,yBAAyB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IAE/F,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,CAAC,wCAAwC,CAAC;YAClD,gBAAgB,EAAE,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,GAAG,EAAE,iCAAiC,EAAE,CAAC;YACjG,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC;QAClC,0DAA0D;QAC1D,IAAI,CAAC,qDAAqD,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/E,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,CAAC,2BAA2B,CAAC;QACrC,gBAAgB,EAAE,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,GAAG,EAAE,4BAA4B,EAAE,CAAC;QAC/F,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,EAAE;KACX,CAAC;AACJ,CAAC"}
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAqB,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAAE,YAAY,EAAqB,MAAM,eAAe,CAAC;AAEhE,MAAM,SAAS,GAAG,CAAC,CAAC,CAAK,iBAAiB;AAC1C,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,+BAA+B;AACzD,MAAM,SAAS,GAAG,CAAC,CAAC,CAAM,4BAA4B;AACtD,MAAM,WAAW,GAAG,CAAC,CAAC,CAAI,eAAe;AAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,4EAA4E,CAAC;KACzF,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,CAAC;KAC3C,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,EAAE,SAAS,CAAC;KACxE,MAAM,CAAC,MAAM,EAAE,gDAAgD,CAAC;KAChE,MAAM,CAAC,mBAAmB,EAAE,0CAA0C,CAAC;KACvE,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,EAAE,QAAQ,CAAC;KAChE,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,QAAQ,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAAI,EAAE,EAAE;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAED,cAAc;IACd,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAEtD,iCAAiC;IACjC,IAAI,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvC,IAAI,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAEvC,sBAAsB;IACtB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEhD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAiB;YAC3B,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE;YACrF,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;YAC5B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,eAAe,EAAE,6BAA6B,CAAC;gBAC7C,YAAY,EAAE,KAAK;gBACnB,WAAW,EAAE,WAAW,CAAC,MAAM;aAChC,CAAC;SACH,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAED,gCAAgC;IAChC,IAAI,gBAAgB,GAAG,IAAI,CAAC;IAC5B,IAAI,eAAmC,CAAC;IAExC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE;YAChD,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,IAAI,CAAC,EAAE;SAChB,CAAC,CAAC;QACH,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC;QACnC,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC;IACnC,CAAC;IAED,gBAAgB;IAChB,MAAM,KAAK,GAAG,oBAAoB,CAAC;QACjC,YAAY,EAAE,IAAI;QAClB,gBAAgB,EAAE,gBAAgB,IAAI,SAAS;KAChD,CAAC,CAAC;IAEH,MAAM,MAAM,GAAiB;QAC3B,KAAK;QACL,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE;QACpE,UAAU,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,eAAe,EAAE;QAChE,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,eAAe,EAAE,6BAA6B,CAAC;YAC7C,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE,gBAAgB,IAAI,SAAS;SAChD,CAAC;KACH,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/C,aAAa;IACb,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,QAAQ;YACX,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7B,MAAM;QACR;YACE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -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;
@@ -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
@@ -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>;