pagespeed-quest 0.6.2 → 0.7.1
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/build/command.js +7 -2
- package/build/dependency.js +3 -2
- package/build/lighthouse-summary.d.ts +35 -0
- package/build/lighthouse-summary.js +189 -0
- package/build/lighthouse.d.ts +3 -0
- package/build/lighthouse.js +18 -1
- package/build/loadshow.d.ts +4 -2
- package/build/loadshow.js +31 -23
- package/package.json +4 -3
- package/scripts/postinstall.js +99 -0
package/build/command.js
CHANGED
|
@@ -44,10 +44,13 @@ function registerLighthouseCommands(main) {
|
|
|
44
44
|
const playback = lighthouse.command('playback');
|
|
45
45
|
playback.description('Playback contents for lighthouse');
|
|
46
46
|
playback.action(async () => {
|
|
47
|
-
const
|
|
47
|
+
const inventoryDir = main.opts().inventory || './inventory';
|
|
48
|
+
const inventoryRepository = new InventoryRepository(inventoryDir);
|
|
48
49
|
const artifactsDir = lighthouse.opts().artifacts || './artifacts';
|
|
49
50
|
const quiet = !!lighthouse.opts().quiet;
|
|
50
51
|
const timeout = Number(lighthouse.opts().timeout || '30000');
|
|
52
|
+
// Load inventory for traffic statistics
|
|
53
|
+
const inventory = await inventoryRepository.loadInventory();
|
|
51
54
|
await withPlaybackProxy({
|
|
52
55
|
inventoryRepository,
|
|
53
56
|
}, dependency, async (proxy) => {
|
|
@@ -59,6 +62,8 @@ function registerLighthouseCommands(main) {
|
|
|
59
62
|
artifactsDir,
|
|
60
63
|
headless: quiet,
|
|
61
64
|
timeout,
|
|
65
|
+
inventoryDir,
|
|
66
|
+
resources: inventory.resources,
|
|
62
67
|
}, dependency);
|
|
63
68
|
dependency.logger?.info('Lighthouse completed');
|
|
64
69
|
});
|
|
@@ -153,4 +158,4 @@ registerLighthouseCommands(main);
|
|
|
153
158
|
registerLoadshowCommands(main);
|
|
154
159
|
registerProxyCommands(main);
|
|
155
160
|
main.parse(process.argv);
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQTtBQUU5QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFHNUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRXZGLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUE7QUFFbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixFQUFFLGFBQWEsQ0FBQyxDQUFBO0FBRTFFLFNBQVMsMEJBQTBCLENBQUMsSUFBYTtJQUMvQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQzdDLFVBQVUsQ0FBQyxXQUFXLENBQUMsbURBQW1ELENBQUMsQ0FBQTtJQUMzRSxVQUFVLENBQUMsTUFBTSxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQ2hGLFVBQVUsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUN2RCxVQUFVLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBRXhFLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDakQsU0FB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
|
package/build/dependency.js
CHANGED
|
@@ -24,8 +24,9 @@ export class Dependency {
|
|
|
24
24
|
await execa(lighthousePath, args, { stdout: 'inherit', stderr: 'inherit' });
|
|
25
25
|
}
|
|
26
26
|
async executeLoadshow(args) {
|
|
27
|
-
const
|
|
27
|
+
const binaryName = process.platform === 'win32' ? 'loadshow.exe' : 'loadshow';
|
|
28
|
+
const loadshowPath = process.env.LOADSHOW_PATH || `./bin/${binaryName}`;
|
|
28
29
|
await execa(loadshowPath, args, { stdout: 'inherit', stderr: 'inherit' });
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwZW5kZW5jeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXBlbmRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQTtBQUU3QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFBO0FBQzdCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUl2QixNQUFNLE9BQU8sVUFBVTtJQUNyQixNQUFNLENBQWM7SUFFcEI7UUFDRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNqQixLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksTUFBTTtZQUN0QyxTQUFTLEVBQUU7Z0JBQ1QsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLE9BQU8sRUFBRTtvQkFDUCxRQUFRLEVBQUUsSUFBSTtvQkFDZCxNQUFNLEVBQUUsY0FBYztvQkFDdEIsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUM7aUJBQ3ZGO2FBQ0Y7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFlO1FBQzFCLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQWM7UUFDcEMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksZ0NBQWdDLENBQUE7UUFDdEYsTUFBTSxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDN0UsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBYztRQUNsQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7UUFDN0UsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksU0FBUyxVQUFVLEVBQUUsQ0FBQTtRQUN2RSxNQUFNLEtBQUssQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQTtJQUMzRSxDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Resource } from './inventory.js';
|
|
2
|
+
import { DependencyInterface } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Lighthouse audit result structure
|
|
5
|
+
*/
|
|
6
|
+
export interface LighthouseAudit {
|
|
7
|
+
id: string;
|
|
8
|
+
title: string;
|
|
9
|
+
score: number | null;
|
|
10
|
+
numericValue?: number;
|
|
11
|
+
displayValue?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Lighthouse JSON report structure (partial)
|
|
15
|
+
*/
|
|
16
|
+
export interface LighthouseReport {
|
|
17
|
+
categories: {
|
|
18
|
+
performance: {
|
|
19
|
+
id: string;
|
|
20
|
+
title: string;
|
|
21
|
+
score: number | null;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
audits: Record<string, LighthouseAudit>;
|
|
25
|
+
}
|
|
26
|
+
export interface GenerateLighthouseSummaryInput {
|
|
27
|
+
jsonPath: string;
|
|
28
|
+
outputPath: string;
|
|
29
|
+
inventoryDir?: string;
|
|
30
|
+
resources?: Resource[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Generates a Markdown summary from a Lighthouse JSON report
|
|
34
|
+
*/
|
|
35
|
+
export declare function generateLighthouseSummary(opts: GenerateLighthouseSummaryInput, dependency: Pick<DependencyInterface, 'logger' | 'mkdirp'>): Promise<void>;
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import Path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Performance metrics to extract from Lighthouse report
|
|
5
|
+
* Weights are based on Lighthouse v10+ scoring
|
|
6
|
+
*/
|
|
7
|
+
const PERFORMANCE_METRICS = [
|
|
8
|
+
{ id: 'largest-contentful-paint', abbr: 'LCP', unit: 'ms', weight: 0.25 },
|
|
9
|
+
{ id: 'cumulative-layout-shift', abbr: 'CLS', unit: '', weight: 0.25 },
|
|
10
|
+
{ id: 'total-blocking-time', abbr: 'TBT', unit: 'ms', weight: 0.3 },
|
|
11
|
+
{ id: 'first-contentful-paint', abbr: 'FCP', unit: 'ms', weight: 0.1 },
|
|
12
|
+
{ id: 'speed-index', abbr: 'SI', unit: 'ms', weight: 0.1 },
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Maps MIME type to resource type category
|
|
16
|
+
*/
|
|
17
|
+
function getResourceType(mime) {
|
|
18
|
+
if (!mime)
|
|
19
|
+
return 'other';
|
|
20
|
+
if (mime.includes('html'))
|
|
21
|
+
return 'document';
|
|
22
|
+
if (mime.includes('css'))
|
|
23
|
+
return 'stylesheet';
|
|
24
|
+
// cspell:ignore ecmascript
|
|
25
|
+
if (mime.includes('javascript') || mime.includes('ecmascript'))
|
|
26
|
+
return 'script';
|
|
27
|
+
if (mime.startsWith('image/'))
|
|
28
|
+
return 'image';
|
|
29
|
+
if (mime.includes('font') || mime.includes('woff') || mime.includes('ttf') || mime.includes('otf'))
|
|
30
|
+
return 'font';
|
|
31
|
+
return 'other';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Formats bytes to human-readable string (KB, MB, etc.)
|
|
35
|
+
*/
|
|
36
|
+
function formatBytes(bytes) {
|
|
37
|
+
if (bytes < 1024)
|
|
38
|
+
return `${bytes} B`;
|
|
39
|
+
if (bytes < 1024 * 1024)
|
|
40
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
41
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Calculates traffic statistics by resource type
|
|
45
|
+
*/
|
|
46
|
+
async function calculateResourceStats(resources, inventoryDir) {
|
|
47
|
+
const statsMap = new Map();
|
|
48
|
+
// Initialize all resource types
|
|
49
|
+
const types = ['document', 'stylesheet', 'script', 'image', 'font', 'other'];
|
|
50
|
+
for (const type of types) {
|
|
51
|
+
statsMap.set(type, { type, count: 0, trafficSize: 0, resourceSize: 0 });
|
|
52
|
+
}
|
|
53
|
+
for (const resource of resources) {
|
|
54
|
+
if (!resource.contentFilePath)
|
|
55
|
+
continue;
|
|
56
|
+
const type = getResourceType(resource.contentTypeMime);
|
|
57
|
+
const stat = statsMap.get(type);
|
|
58
|
+
if (!stat)
|
|
59
|
+
continue;
|
|
60
|
+
try {
|
|
61
|
+
const filePath = Path.join(inventoryDir, resource.contentFilePath);
|
|
62
|
+
const fileStat = await fs.stat(filePath);
|
|
63
|
+
const resourceSize = fileStat.size;
|
|
64
|
+
// Traffic size: if content-encoding exists, estimate compressed size
|
|
65
|
+
// Otherwise use resource size
|
|
66
|
+
// Note: The file is stored decompressed, so we estimate traffic size
|
|
67
|
+
// based on typical compression ratios for each type
|
|
68
|
+
let trafficSize = resourceSize;
|
|
69
|
+
if (resource.contentEncoding) {
|
|
70
|
+
// For compressed resources, estimate traffic size based on typical ratios
|
|
71
|
+
// These are rough estimates - actual values would require re-compression
|
|
72
|
+
const compressionRatios = {
|
|
73
|
+
document: 0.2,
|
|
74
|
+
stylesheet: 0.15,
|
|
75
|
+
script: 0.25,
|
|
76
|
+
image: 0.95,
|
|
77
|
+
font: 0.7,
|
|
78
|
+
other: 0.5,
|
|
79
|
+
};
|
|
80
|
+
trafficSize = Math.round(resourceSize * compressionRatios[type]);
|
|
81
|
+
}
|
|
82
|
+
stat.count++;
|
|
83
|
+
stat.trafficSize += trafficSize;
|
|
84
|
+
stat.resourceSize += resourceSize;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// File not found or other error - skip
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Filter out types with no resources and sort by fixed order
|
|
91
|
+
const typeOrder = ['document', 'stylesheet', 'script', 'image', 'font', 'other'];
|
|
92
|
+
const stats = Array.from(statsMap.values())
|
|
93
|
+
.filter((s) => s.count > 0)
|
|
94
|
+
.sort((a, b) => typeOrder.indexOf(a.type) - typeOrder.indexOf(b.type));
|
|
95
|
+
const totals = stats.reduce((acc, s) => ({
|
|
96
|
+
trafficSize: acc.trafficSize + s.trafficSize,
|
|
97
|
+
resourceSize: acc.resourceSize + s.resourceSize,
|
|
98
|
+
}), { trafficSize: 0, resourceSize: 0 });
|
|
99
|
+
return { stats, totals };
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Formats a score as a percentage integer
|
|
103
|
+
*/
|
|
104
|
+
function formatScore(score) {
|
|
105
|
+
if (score === null)
|
|
106
|
+
return 'N/A';
|
|
107
|
+
return `${Math.round(score * 100)}`;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Formats a numeric value in milliseconds (rounded to integer)
|
|
111
|
+
* For CLS, returns the raw value with 3 decimal places
|
|
112
|
+
*/
|
|
113
|
+
function formatValue(numericValue, unit) {
|
|
114
|
+
if (numericValue === undefined)
|
|
115
|
+
return 'N/A';
|
|
116
|
+
if (unit === '') {
|
|
117
|
+
// CLS - no unit, show decimal value
|
|
118
|
+
return numericValue.toFixed(3);
|
|
119
|
+
}
|
|
120
|
+
// Time-based metrics - round to integer ms
|
|
121
|
+
return `${Math.round(numericValue)} ${unit}`;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Generates a Markdown summary from a Lighthouse JSON report
|
|
125
|
+
*/
|
|
126
|
+
export async function generateLighthouseSummary(opts, dependency) {
|
|
127
|
+
// Read and parse the Lighthouse JSON report
|
|
128
|
+
const jsonContent = await fs.readFile(opts.jsonPath, 'utf-8');
|
|
129
|
+
const report = JSON.parse(jsonContent);
|
|
130
|
+
// Extract overall performance score
|
|
131
|
+
const overallScore = report.categories?.performance?.score;
|
|
132
|
+
// Build the Markdown content
|
|
133
|
+
const lines = [];
|
|
134
|
+
lines.push('# Lighthouse Performance Summary');
|
|
135
|
+
lines.push('');
|
|
136
|
+
// Section 1: Metric Values
|
|
137
|
+
lines.push('## Metrics');
|
|
138
|
+
lines.push('');
|
|
139
|
+
for (const metric of PERFORMANCE_METRICS) {
|
|
140
|
+
const audit = report.audits[metric.id];
|
|
141
|
+
if (audit) {
|
|
142
|
+
const value = formatValue(audit.numericValue, metric.unit);
|
|
143
|
+
lines.push(`- ${metric.abbr} ${value}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
lines.push('');
|
|
147
|
+
// Section 2: Scores
|
|
148
|
+
lines.push('## Scores');
|
|
149
|
+
lines.push('');
|
|
150
|
+
for (const metric of PERFORMANCE_METRICS) {
|
|
151
|
+
const audit = report.audits[metric.id];
|
|
152
|
+
if (audit) {
|
|
153
|
+
const score = formatScore(audit.score);
|
|
154
|
+
const weight = `x${metric.weight.toFixed(2)}`;
|
|
155
|
+
lines.push(`- ${metric.abbr} ${score} ${weight}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
lines.push(`- **Overall** ${formatScore(overallScore)}`);
|
|
159
|
+
lines.push('');
|
|
160
|
+
// Section 3: Resource Traffic (if inventory data is provided)
|
|
161
|
+
if (opts.resources && opts.inventoryDir) {
|
|
162
|
+
const { stats, totals } = await calculateResourceStats(opts.resources, opts.inventoryDir);
|
|
163
|
+
if (stats.length > 0) {
|
|
164
|
+
// Traffic section (compressed/transferred size)
|
|
165
|
+
lines.push('## Traffic: Type / Count / Size / Bytes');
|
|
166
|
+
lines.push('');
|
|
167
|
+
for (const stat of stats) {
|
|
168
|
+
lines.push(`- ${stat.type} / ${stat.count} / ${formatBytes(stat.trafficSize)} / ${stat.trafficSize}`);
|
|
169
|
+
}
|
|
170
|
+
lines.push(`- **total** / ${stats.reduce((sum, s) => sum + s.count, 0)} / ${formatBytes(totals.trafficSize)} / ${totals.trafficSize}`);
|
|
171
|
+
lines.push('');
|
|
172
|
+
// Resource section (decompressed/original size)
|
|
173
|
+
lines.push('## Resource: Type / Count / Size / Bytes');
|
|
174
|
+
lines.push('');
|
|
175
|
+
for (const stat of stats) {
|
|
176
|
+
lines.push(`- ${stat.type} / ${stat.count} / ${formatBytes(stat.resourceSize)} / ${stat.resourceSize}`);
|
|
177
|
+
}
|
|
178
|
+
lines.push(`- **total** / ${stats.reduce((sum, s) => sum + s.count, 0)} / ${formatBytes(totals.resourceSize)} / ${totals.resourceSize}`);
|
|
179
|
+
lines.push('');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Ensure output directory exists
|
|
183
|
+
const outputDir = Path.dirname(opts.outputPath);
|
|
184
|
+
await dependency.mkdirp(outputDir);
|
|
185
|
+
// Write the summary file
|
|
186
|
+
await fs.writeFile(opts.outputPath, lines.join('\n'), 'utf-8');
|
|
187
|
+
dependency.logger?.info(`Lighthouse summary saved to ${opts.outputPath}`);
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRob3VzZS1zdW1tYXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xpZ2h0aG91c2Utc3VtbWFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBOEJ2Qjs7O0dBR0c7QUFDSCxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLEVBQUUsRUFBRSxFQUFFLDBCQUEwQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO0lBQ3pFLEVBQUUsRUFBRSxFQUFFLHlCQUF5QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO0lBQ3RFLEVBQUUsRUFBRSxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO0lBQ25FLEVBQUUsRUFBRSxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO0lBQ3RFLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtDQUMzRCxDQUFBO0FBd0JEOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsSUFBd0I7SUFDL0MsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLE9BQU8sQ0FBQTtJQUN6QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxVQUFVLENBQUE7SUFDNUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sWUFBWSxDQUFBO0lB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
|
package/build/lighthouse.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Resource } from './inventory.js';
|
|
1
2
|
import { DependencyInterface, DeviceType } from './types.js';
|
|
2
3
|
export interface ExecLighthouseInput {
|
|
3
4
|
url: string;
|
|
@@ -8,5 +9,7 @@ export interface ExecLighthouseInput {
|
|
|
8
9
|
headless: boolean;
|
|
9
10
|
timeout: number;
|
|
10
11
|
captureScoreAndMetrics?: boolean;
|
|
12
|
+
inventoryDir?: string;
|
|
13
|
+
resources?: Resource[];
|
|
11
14
|
}
|
|
12
15
|
export declare function execLighthouse(opts: ExecLighthouseInput, dependency: Pick<DependencyInterface, 'mkdirp' | 'executeLighthouse' | 'logger'>): Promise<void>;
|
package/build/lighthouse.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Path from 'path';
|
|
2
2
|
import { captureLighthouseDigest } from './lighthouse-digest.js';
|
|
3
|
+
import { generateLighthouseSummary } from './lighthouse-summary.js';
|
|
3
4
|
export async function execLighthouse(opts, dependency) {
|
|
4
5
|
const artifactsDir = opts.artifactsDir || './artifacts';
|
|
5
6
|
await dependency.mkdirp(artifactsDir);
|
|
@@ -43,5 +44,21 @@ export async function execLighthouse(opts, dependency) {
|
|
|
43
44
|
dependency.logger?.warn(`Failed to capture Lighthouse score and metrics: ${error}`);
|
|
44
45
|
}
|
|
45
46
|
}
|
|
47
|
+
// Generate summary markdown
|
|
48
|
+
if (opts.artifactsDir) {
|
|
49
|
+
const jsonPath = `${outputPath}.report.json`;
|
|
50
|
+
const summaryPath = Path.join(artifactsDir, 'summary.md');
|
|
51
|
+
try {
|
|
52
|
+
await generateLighthouseSummary({
|
|
53
|
+
jsonPath,
|
|
54
|
+
outputPath: summaryPath,
|
|
55
|
+
inventoryDir: opts.inventoryDir,
|
|
56
|
+
resources: opts.resources,
|
|
57
|
+
}, dependency);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
dependency.logger?.warn(`Failed to generate Lighthouse summary: ${error}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
46
63
|
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRob3VzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9saWdodGhvdXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUd2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUNoRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQWdCbkUsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQ2xDLElBQXlCLEVBQ3pCLFVBQWdGO0lBRWhGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksYUFBYSxDQUFBO0lBQ3ZELE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUVyQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQTtJQUM5QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUN4RCxNQUFNLElBQUksR0FBYTtRQUNyQixJQUFJLENBQUMsR0FBRztRQUNSLGVBQWU7UUFDZixvQkFBb0I7UUFDcEIsaUJBQWlCLFVBQVUsRUFBRTtRQUM3QiwrQkFBK0I7UUFDL0IsaUJBQWlCLFVBQVUsRUFBRTtRQUM3Qiw0Q0FBNEM7UUFDNUMsNEJBQTRCLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO1FBQ3hFLDZEQUE2RDtRQUM3RCxzQkFBc0I7UUFDdEIsK0JBQStCO1FBQy9CLHVDQUF1QztRQUN2QyxxQ0FBcUM7UUFDckMsc0NBQXNDO0tBQ3ZDLENBQUE7SUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUVoRCxNQUFNLFdBQVcsR0FBYSxDQUFDLDZCQUE2QixFQUFFLG1DQUFtQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtJQUNsSCxJQUFJLElBQUksQ0FBQyxRQUFRO1FBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUV0RCxJQUFJLElBQUksQ0FBQyxJQUFJO1FBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUVsQyxNQUFNLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUV4QyxvREFBb0Q7SUFDcEQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssS0FBSyxFQUFFO1FBQ3pDLE1BQU0sUUFBUSxHQUFHLEdBQUcsVUFBVSxjQUFjLENBQUE7UUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLENBQUMsQ0FBQTtRQUVuRSxJQUFJO1lBQ0YsTUFBTSx1QkFBdUIsQ0FDM0I7Z0JBQ0UsUUFBUTtnQkFDUixVQUFVLEVBQUUsVUFBVTthQUN2QixFQUNELFVBQVUsQ0FDWCxDQUFBO1NBQ0Y7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLG1EQUFtRCxLQUFLLEVBQUUsQ0FBQyxDQUFBO1NBQ3BGO0tBQ0Y7SUFFRCw0QkFBNEI7SUFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLEdBQUcsVUFBVSxjQUFjLENBQUE7UUFDNUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFFekQsSUFBSTtZQUNGLE1BQU0seUJBQXlCLENBQzdCO2dCQUNFLFFBQVE7Z0JBQ1IsVUFBVSxFQUFFLFdBQVc7Z0JBQ3ZCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQzFCLEVBQ0QsVUFBVSxDQUNYLENBQUE7U0FDRjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsMENBQTBDLEtBQUssRUFBRSxDQUFDLENBQUE7U0FDM0U7S0FDRjtBQUNILENBQUMifQ==
|
package/build/loadshow.d.ts
CHANGED
|
@@ -8,12 +8,14 @@ export interface ExecLoadshowInput {
|
|
|
8
8
|
credit?: string;
|
|
9
9
|
}
|
|
10
10
|
export interface ExecLoadshowSpec {
|
|
11
|
+
preset?: 'desktop' | 'mobile';
|
|
11
12
|
viewportWidth?: number;
|
|
12
13
|
columns?: number;
|
|
13
14
|
cpuThrottling?: number;
|
|
14
|
-
|
|
15
|
-
userAgent?: string;
|
|
15
|
+
timeoutSec?: number;
|
|
16
16
|
proxyPort?: number;
|
|
17
17
|
credit?: string;
|
|
18
|
+
debugDir?: string;
|
|
19
|
+
outputSummary?: string;
|
|
18
20
|
}
|
|
19
21
|
export declare function execLoadshow(input: ExecLoadshowInput, dependency: Pick<DependencyInterface, 'mkdirp' | 'executeLoadshow'>): Promise<void>;
|
package/build/loadshow.js
CHANGED
|
@@ -1,54 +1,62 @@
|
|
|
1
1
|
import Path from 'path';
|
|
2
|
-
import { defaultConfig, desktopConfig } from 'lighthouse';
|
|
3
2
|
function execSpecToCommandArgs(spec) {
|
|
4
3
|
const args = [];
|
|
4
|
+
// preset
|
|
5
|
+
if (spec.preset !== undefined)
|
|
6
|
+
args.push('--preset', spec.preset);
|
|
5
7
|
// layout
|
|
6
8
|
if (spec.columns !== undefined)
|
|
7
|
-
args.push('
|
|
8
|
-
//
|
|
9
|
+
args.push('--columns', String(spec.columns));
|
|
10
|
+
// browser settings
|
|
9
11
|
if (spec.viewportWidth !== undefined)
|
|
10
|
-
args.push('-
|
|
12
|
+
args.push('--viewport-width', String(spec.viewportWidth));
|
|
11
13
|
if (spec.cpuThrottling !== undefined)
|
|
12
|
-
args.push('-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
// recording.puppeteer
|
|
18
|
-
const chromeArgs = ['--ignore-certificate-errors'];
|
|
14
|
+
args.push('--cpu-throttling', String(spec.cpuThrottling));
|
|
15
|
+
// timeout
|
|
16
|
+
if (spec.timeoutSec !== undefined)
|
|
17
|
+
args.push('--timeout-sec', String(spec.timeoutSec));
|
|
18
|
+
// proxy settings
|
|
19
19
|
if (spec.proxyPort !== undefined) {
|
|
20
|
-
|
|
20
|
+
args.push('--proxy-server', `http://localhost:${spec.proxyPort}`);
|
|
21
|
+
args.push('--ignore-https-errors');
|
|
21
22
|
}
|
|
22
|
-
args.push('-u', 'recording.puppeteer.args=' + chromeArgs.join(','));
|
|
23
23
|
// credit
|
|
24
24
|
if (spec.credit)
|
|
25
|
-
args.push('
|
|
25
|
+
args.push('--credit', spec.credit);
|
|
26
|
+
// debug directory
|
|
27
|
+
if (spec.debugDir)
|
|
28
|
+
args.push('--debug-dir', spec.debugDir);
|
|
29
|
+
// output summary
|
|
30
|
+
if (spec.outputSummary)
|
|
31
|
+
args.push('--output-summary', spec.outputSummary);
|
|
26
32
|
return args;
|
|
27
33
|
}
|
|
28
34
|
export async function execLoadshow(input, dependency) {
|
|
29
35
|
const artifactsDir = input.artifactsDir || './artifacts';
|
|
30
36
|
const loadshowDir = Path.join(artifactsDir, 'loadshow');
|
|
31
37
|
const outputPath = Path.join(artifactsDir, 'loadshow.mp4');
|
|
38
|
+
const summaryPath = Path.join(loadshowDir, 'summary.md');
|
|
32
39
|
await dependency.mkdirp(loadshowDir);
|
|
33
40
|
// By form factor
|
|
34
|
-
const
|
|
41
|
+
const preset = input.deviceType === 'desktop' ? 'desktop' : 'mobile';
|
|
35
42
|
const customByDevice = input.deviceType === 'desktop' ? { columns: 2 } : { columns: 3 };
|
|
43
|
+
// Convert timeout from milliseconds to seconds
|
|
44
|
+
const timeoutSec = Math.ceil(input.timeout / 1000);
|
|
36
45
|
// Basic spec
|
|
37
|
-
const userAgent = lighthouseByDevice.settings?.emulatedUserAgent;
|
|
38
46
|
const spec = {
|
|
47
|
+
preset,
|
|
39
48
|
proxyPort: input.proxyPort,
|
|
40
49
|
columns: customByDevice.columns,
|
|
41
|
-
|
|
42
|
-
cpuThrottling: lighthouseByDevice.settings?.throttling?.cpuSlowdownMultiplier,
|
|
43
|
-
userAgent: typeof userAgent === 'string' ? userAgent : undefined,
|
|
44
|
-
timeoutMs: input.timeout,
|
|
50
|
+
timeoutSec,
|
|
45
51
|
credit: input.credit,
|
|
52
|
+
debugDir: loadshowDir,
|
|
53
|
+
outputSummary: summaryPath,
|
|
46
54
|
};
|
|
47
55
|
const args = [];
|
|
48
56
|
args.push('record');
|
|
49
|
-
args.push('-a', loadshowDir);
|
|
50
57
|
args.push(...execSpecToCommandArgs(spec));
|
|
51
|
-
args.push(
|
|
58
|
+
args.push('--output', outputPath);
|
|
59
|
+
args.push(input.url);
|
|
52
60
|
await dependency.executeLoadshow(args);
|
|
53
61
|
}
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZHNob3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbG9hZHNob3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBeUJ2QixTQUFTLHFCQUFxQixDQUFDLElBQXNCO0lBQ25ELE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQTtJQUV6QixTQUFTO0lBQ1QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVM7UUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFakUsU0FBUztJQUNULElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO1FBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBRTVFLG1CQUFtQjtJQUNuQixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUztRQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO0lBQy9GLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTO1FBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7SUFFL0YsVUFBVTtJQUNWLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTO1FBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBRXRGLGlCQUFpQjtJQUNqQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLElBQUksQ0FBQyxTQUFTLEVB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pagespeed-quest",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A framework for efficient web front-end speed improvement",
|
|
6
6
|
"main": "build/index.js",
|
|
@@ -46,7 +46,8 @@
|
|
|
46
46
|
"prepare-release": "run-s reset-hard test cov:check doc:html version doc:publish",
|
|
47
47
|
"adhoc": "yarn build && node build/adhoc.js",
|
|
48
48
|
"command": "yarn build && node build/command.js",
|
|
49
|
-
"prepublishOnly": "yarn build"
|
|
49
|
+
"prepublishOnly": "yarn build",
|
|
50
|
+
"postinstall": "node scripts/postinstall.js"
|
|
50
51
|
},
|
|
51
52
|
"engines": {
|
|
52
53
|
"node": ">=18"
|
|
@@ -57,7 +58,6 @@
|
|
|
57
58
|
"iconv-lite": "^0.6.3",
|
|
58
59
|
"jschardet": "^3.0.0",
|
|
59
60
|
"lighthouse": "^12.2.1",
|
|
60
|
-
"loadshow": "1.2.0",
|
|
61
61
|
"node-html-to-image": "^5.0.0",
|
|
62
62
|
"node-watch": "^0.7.4",
|
|
63
63
|
"pino": "^9.4.0",
|
|
@@ -93,6 +93,7 @@
|
|
|
93
93
|
},
|
|
94
94
|
"files": [
|
|
95
95
|
"build",
|
|
96
|
+
"scripts",
|
|
96
97
|
"!**/*.spec.*",
|
|
97
98
|
"!**/*.json",
|
|
98
99
|
"CHANGELOG.md",
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { createWriteStream, mkdirSync, chmodSync, existsSync, unlinkSync } from 'fs'
|
|
4
|
+
import { pipeline } from 'stream/promises'
|
|
5
|
+
import { createGunzip } from 'zlib'
|
|
6
|
+
import { extract } from 'tar'
|
|
7
|
+
import { fileURLToPath } from 'url'
|
|
8
|
+
import { dirname, join } from 'path'
|
|
9
|
+
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
11
|
+
const __dirname = dirname(__filename)
|
|
12
|
+
|
|
13
|
+
const LOADSHOW_VERSION = 'v1.3.0'
|
|
14
|
+
const REPO = 'ideamans/go-loadshow'
|
|
15
|
+
|
|
16
|
+
function getPlatformInfo() {
|
|
17
|
+
const platform = process.platform
|
|
18
|
+
const arch = process.arch
|
|
19
|
+
|
|
20
|
+
if (platform === 'darwin' && arch === 'arm64') {
|
|
21
|
+
return { os: 'darwin', arch: 'arm64', ext: 'tar.gz' }
|
|
22
|
+
} else if (platform === 'darwin' && arch === 'x64') {
|
|
23
|
+
// macOS x64 is not available, fall back to arm64 (Rosetta 2)
|
|
24
|
+
return { os: 'darwin', arch: 'arm64', ext: 'tar.gz' }
|
|
25
|
+
} else if (platform === 'linux' && arch === 'x64') {
|
|
26
|
+
return { os: 'linux', arch: 'amd64', ext: 'tar.gz' }
|
|
27
|
+
} else if (platform === 'linux' && arch === 'arm64') {
|
|
28
|
+
return { os: 'linux', arch: 'arm64', ext: 'tar.gz' }
|
|
29
|
+
} else if (platform === 'win32' && arch === 'x64') {
|
|
30
|
+
return { os: 'windows', arch: 'amd64', ext: 'zip' }
|
|
31
|
+
} else {
|
|
32
|
+
throw new Error(`Unsupported platform: ${platform} ${arch}`)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function downloadFile(url, destPath) {
|
|
37
|
+
const response = await fetch(url, { redirect: 'follow' })
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
throw new Error(`Failed to download: ${response.status} ${response.statusText}`)
|
|
40
|
+
}
|
|
41
|
+
const fileStream = createWriteStream(destPath)
|
|
42
|
+
await pipeline(response.body, fileStream)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function extractTarGz(archivePath, destDir) {
|
|
46
|
+
const { execSync } = await import('child_process')
|
|
47
|
+
execSync(`tar -xzf "${archivePath}" -C "${destDir}"`, { stdio: 'inherit' })
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function extractZip(archivePath, destDir) {
|
|
51
|
+
const { execSync } = await import('child_process')
|
|
52
|
+
execSync(`unzip -o "${archivePath}" -d "${destDir}"`, { stdio: 'inherit' })
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function main() {
|
|
56
|
+
const binDir = join(__dirname, '..', 'bin')
|
|
57
|
+
const platformInfo = getPlatformInfo()
|
|
58
|
+
|
|
59
|
+
const assetName = `loadshow_${LOADSHOW_VERSION}_${platformInfo.os}_${platformInfo.arch}.${platformInfo.ext}`
|
|
60
|
+
const downloadUrl = `https://github.com/${REPO}/releases/download/${LOADSHOW_VERSION}/${assetName}`
|
|
61
|
+
|
|
62
|
+
console.log(`Downloading go-loadshow ${LOADSHOW_VERSION} for ${platformInfo.os}/${platformInfo.arch}...`)
|
|
63
|
+
console.log(`URL: ${downloadUrl}`)
|
|
64
|
+
|
|
65
|
+
// Create bin directory if not exists
|
|
66
|
+
if (!existsSync(binDir)) {
|
|
67
|
+
mkdirSync(binDir, { recursive: true })
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const archivePath = join(binDir, assetName)
|
|
71
|
+
const binaryName = platformInfo.os === 'windows' ? 'loadshow.exe' : 'loadshow'
|
|
72
|
+
const binaryPath = join(binDir, binaryName)
|
|
73
|
+
|
|
74
|
+
// Download archive
|
|
75
|
+
await downloadFile(downloadUrl, archivePath)
|
|
76
|
+
console.log('Download complete. Extracting...')
|
|
77
|
+
|
|
78
|
+
// Extract archive
|
|
79
|
+
if (platformInfo.ext === 'tar.gz') {
|
|
80
|
+
await extractTarGz(archivePath, binDir)
|
|
81
|
+
} else {
|
|
82
|
+
await extractZip(archivePath, binDir)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Make binary executable (Unix only)
|
|
86
|
+
if (platformInfo.os !== 'windows') {
|
|
87
|
+
chmodSync(binaryPath, 0o755)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Clean up archive
|
|
91
|
+
unlinkSync(archivePath)
|
|
92
|
+
|
|
93
|
+
console.log(`go-loadshow installed successfully at ${binaryPath}`)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
main().catch((err) => {
|
|
97
|
+
console.error('Failed to install go-loadshow:', err.message)
|
|
98
|
+
process.exit(1)
|
|
99
|
+
})
|