@jasonshimmy/vite-plugin-cer-app 0.28.3 → 0.29.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 +2 -0
- package/dist/cli/adapters/cloudflare.d.ts +2 -2
- package/dist/cli/adapters/cloudflare.d.ts.map +1 -1
- package/dist/cli/adapters/cloudflare.js +83 -159
- package/dist/cli/adapters/cloudflare.js.map +1 -1
- package/dist/cli/adapters/deployment-mode.d.ts +10 -0
- package/dist/cli/adapters/deployment-mode.d.ts.map +1 -0
- package/dist/cli/adapters/deployment-mode.js +59 -0
- package/dist/cli/adapters/deployment-mode.js.map +1 -0
- package/dist/cli/adapters/netlify.d.ts +5 -4
- package/dist/cli/adapters/netlify.d.ts.map +1 -1
- package/dist/cli/adapters/netlify.js +26 -150
- package/dist/cli/adapters/netlify.js.map +1 -1
- package/dist/cli/adapters/vercel.d.ts +2 -3
- package/dist/cli/adapters/vercel.d.ts.map +1 -1
- package/dist/cli/adapters/vercel.js +36 -111
- package/dist/cli/adapters/vercel.js.map +1 -1
- package/dist/cli/adapters/web-bridge.d.ts +3 -0
- package/dist/cli/adapters/web-bridge.d.ts.map +1 -0
- package/dist/cli/adapters/web-bridge.js +110 -0
- package/dist/cli/adapters/web-bridge.js.map +1 -0
- package/dist/cli/checks/lighthouse.d.ts +6 -0
- package/dist/cli/checks/lighthouse.d.ts.map +1 -1
- package/dist/cli/checks/lighthouse.js +49 -44
- package/dist/cli/checks/lighthouse.js.map +1 -1
- package/dist/cli/checks/performance.d.ts +3 -0
- package/dist/cli/checks/performance.d.ts.map +1 -1
- package/dist/cli/checks/performance.js +56 -15
- package/dist/cli/checks/performance.js.map +1 -1
- package/dist/cli/checks/quality.d.ts +35 -0
- package/dist/cli/checks/quality.d.ts.map +1 -0
- package/dist/cli/checks/quality.js +72 -0
- package/dist/cli/checks/quality.js.map +1 -0
- package/dist/cli/checks/seo.d.ts +9 -0
- package/dist/cli/checks/seo.d.ts.map +1 -0
- package/dist/cli/checks/seo.js +40 -0
- package/dist/cli/checks/seo.js.map +1 -0
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +2 -51
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +12 -0
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/dev.d.ts +4 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +1 -72
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +1 -4
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +4 -73
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/preview-paths.d.ts +3 -0
- package/dist/cli/commands/preview-paths.d.ts.map +1 -0
- package/dist/cli/commands/preview-paths.js +8 -0
- package/dist/cli/commands/preview-paths.js.map +1 -0
- package/dist/cli/commands/preview.d.ts +11 -0
- package/dist/cli/commands/preview.d.ts.map +1 -1
- package/dist/cli/commands/preview.js +124 -458
- package/dist/cli/commands/preview.js.map +1 -1
- package/dist/cli/config.d.ts +3 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +68 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/create/templates/spa/package.json.tpl +1 -1
- package/dist/cli/create/templates/ssg/package.json.tpl +1 -1
- package/dist/cli/create/templates/ssr/package.json.tpl +1 -1
- package/dist/plugin/build-ssg.d.ts.map +1 -1
- package/dist/plugin/build-ssg.js +79 -9
- package/dist/plugin/build-ssg.js.map +1 -1
- package/dist/plugin/build-ssr.d.ts.map +1 -1
- package/dist/plugin/build-ssr.js +3 -1
- package/dist/plugin/build-ssr.js.map +1 -1
- package/dist/plugin/dev-server.d.ts +8 -0
- package/dist/plugin/dev-server.d.ts.map +1 -1
- package/dist/plugin/dev-server.js.map +1 -1
- package/dist/plugin/dts-generator.d.ts.map +1 -1
- package/dist/plugin/dts-generator.js +3 -0
- package/dist/plugin/dts-generator.js.map +1 -1
- package/dist/plugin/html-post-process.d.ts +1 -1
- package/dist/plugin/html-post-process.d.ts.map +1 -1
- package/dist/plugin/html-post-process.js +7 -5
- package/dist/plugin/html-post-process.js.map +1 -1
- package/dist/plugin/index.d.ts +1 -4
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +26 -8
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/server-content.d.ts +3 -0
- package/dist/plugin/server-content.d.ts.map +1 -0
- package/dist/plugin/server-content.js +25 -0
- package/dist/plugin/server-content.js.map +1 -0
- package/dist/plugin/transforms/auto-import.d.ts.map +1 -1
- package/dist/plugin/transforms/auto-import.js +6 -5
- package/dist/plugin/transforms/auto-import.js.map +1 -1
- package/dist/plugin/virtual/content-components.d.ts +3 -1
- package/dist/plugin/virtual/content-components.d.ts.map +1 -1
- package/dist/plugin/virtual/content-components.js +104 -21
- package/dist/plugin/virtual/content-components.js.map +1 -1
- package/dist/runtime/app-template.d.ts.map +1 -1
- package/dist/runtime/app-template.js +18 -8
- package/dist/runtime/app-template.js.map +1 -1
- package/dist/runtime/composables/index.d.ts +2 -0
- package/dist/runtime/composables/index.d.ts.map +1 -1
- package/dist/runtime/composables/index.js +1 -0
- package/dist/runtime/composables/index.js.map +1 -1
- package/dist/runtime/composables/render-content.d.ts +10 -0
- package/dist/runtime/composables/render-content.d.ts.map +1 -0
- package/dist/runtime/composables/render-content.js +21 -0
- package/dist/runtime/composables/render-content.js.map +1 -0
- package/dist/runtime/composables/use-auth.d.ts.map +1 -1
- package/dist/runtime/composables/use-auth.js +14 -6
- package/dist/runtime/composables/use-auth.js.map +1 -1
- package/dist/runtime/composables/use-content-page.d.ts +2 -0
- package/dist/runtime/composables/use-content-page.d.ts.map +1 -1
- package/dist/runtime/composables/use-content-page.js +1 -1
- package/dist/runtime/composables/use-content-page.js.map +1 -1
- package/dist/runtime/content/client.d.ts +2 -3
- package/dist/runtime/content/client.d.ts.map +1 -1
- package/dist/runtime/content/client.js +4 -5
- package/dist/runtime/content/client.js.map +1 -1
- package/dist/runtime/entry-server-template.d.ts.map +1 -1
- package/dist/runtime/entry-server-template.js +45 -15
- package/dist/runtime/entry-server-template.js.map +1 -1
- package/dist/runtime/isr-handler.d.ts +4 -15
- package/dist/runtime/isr-handler.d.ts.map +1 -1
- package/dist/runtime/isr-handler.js +64 -45
- package/dist/runtime/isr-handler.js.map +1 -1
- package/dist/runtime/request-dispatcher.d.ts +31 -0
- package/dist/runtime/request-dispatcher.d.ts.map +1 -0
- package/dist/runtime/request-dispatcher.js +152 -0
- package/dist/runtime/request-dispatcher.js.map +1 -0
- package/dist/runtime/route-matching.d.ts +20 -0
- package/dist/runtime/route-matching.d.ts.map +1 -0
- package/dist/runtime/route-matching.js +45 -0
- package/dist/runtime/route-matching.js.map +1 -0
- package/dist/types/api.d.ts +3 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/config.d.ts +27 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/content.d.ts +2 -0
- package/dist/types/content.d.ts.map +1 -1
- package/dist/types/page.d.ts +11 -7
- package/dist/types/page.d.ts.map +1 -1
- package/package.json +23 -9
- package/dist/cli/commands/preview-isr.d.ts +0 -66
- package/dist/cli/commands/preview-isr.d.ts.map +0 -1
- package/dist/cli/commands/preview-isr.js +0 -132
- package/dist/cli/commands/preview-isr.js.map +0 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/** Shared Web Request/Response bridge emitted into Netlify and Cloudflare entrypoints. */
|
|
2
|
+
export const WEB_BRIDGE = String.raw `
|
|
3
|
+
async function toNodeRequest(webReq) {
|
|
4
|
+
const url = new URL(webReq.url)
|
|
5
|
+
const body = webReq.body && !['GET', 'HEAD'].includes(webReq.method) ? webReq.body : []
|
|
6
|
+
return Object.assign(Readable.from(body), {
|
|
7
|
+
url: url.pathname + url.search, method: webReq.method,
|
|
8
|
+
headers: { host: url.host, ...Object.fromEntries(webReq.headers.entries()) },
|
|
9
|
+
})
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function createNodeResponse(method) {
|
|
13
|
+
const { readable, writable } = new TransformStream()
|
|
14
|
+
const writer = writable.getWriter()
|
|
15
|
+
const encoder = new TextEncoder()
|
|
16
|
+
const headers = {}
|
|
17
|
+
let resolve, reject, committed = false, bodyless = false, _ended = false
|
|
18
|
+
const promise = new Promise((yes, no) => { resolve = yes; reject = no })
|
|
19
|
+
const res = Object.assign(new EventEmitter(), {
|
|
20
|
+
statusCode: 200,
|
|
21
|
+
setHeader(name, value) {
|
|
22
|
+
if (committed) throw new Error('Headers already sent')
|
|
23
|
+
headers[name.toLowerCase()] = value
|
|
24
|
+
return this
|
|
25
|
+
},
|
|
26
|
+
getHeader(name) { return headers[name.toLowerCase()] },
|
|
27
|
+
getHeaders() { return { ...headers } },
|
|
28
|
+
removeHeader(name) {
|
|
29
|
+
if (committed) throw new Error('Headers already sent')
|
|
30
|
+
delete headers[name.toLowerCase()]
|
|
31
|
+
},
|
|
32
|
+
flushHeaders() {
|
|
33
|
+
if (committed) return
|
|
34
|
+
const responseHeaders = new Headers()
|
|
35
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
36
|
+
for (const item of Array.isArray(value) ? value : [value]) responseHeaders.append(name, String(item))
|
|
37
|
+
}
|
|
38
|
+
bodyless = method === 'HEAD' || [204, 205, 304].includes(res.statusCode)
|
|
39
|
+
try {
|
|
40
|
+
const response = new Response(bodyless ? null : readable, { status: res.statusCode, headers: responseHeaders })
|
|
41
|
+
committed = true
|
|
42
|
+
resolve(response)
|
|
43
|
+
} catch (error) { reject(error); this.destroy(error) }
|
|
44
|
+
},
|
|
45
|
+
writeHead(status, reasonOrHeaders, extraHeaders) {
|
|
46
|
+
this.statusCode = status
|
|
47
|
+
for (const [name, value] of Object.entries(extraHeaders ?? (typeof reasonOrHeaders === 'object' ? reasonOrHeaders : {}))) this.setHeader(name, value)
|
|
48
|
+
this.flushHeaders()
|
|
49
|
+
return this
|
|
50
|
+
},
|
|
51
|
+
write(chunk, encoding, callback) {
|
|
52
|
+
if (_ended) return false
|
|
53
|
+
this.flushHeaders()
|
|
54
|
+
if (bodyless) { (typeof encoding === 'function' ? encoding : callback)?.(); return true }
|
|
55
|
+
const pending = writer.write(typeof chunk === 'string' ? encoder.encode(chunk) : chunk)
|
|
56
|
+
const ready = writer.desiredSize > 0
|
|
57
|
+
void pending.then(() => {
|
|
58
|
+
(typeof encoding === 'function' ? encoding : callback)?.()
|
|
59
|
+
if (!ready && !_ended) this.emit('drain')
|
|
60
|
+
}).catch((error) => this.destroy(error))
|
|
61
|
+
return ready
|
|
62
|
+
},
|
|
63
|
+
end(chunk, encoding, callback) {
|
|
64
|
+
if (_ended) return this
|
|
65
|
+
if (chunk !== undefined && typeof chunk !== 'function') this.write(chunk, encoding)
|
|
66
|
+
this.flushHeaders()
|
|
67
|
+
_ended = true
|
|
68
|
+
void writer.close().then(() => {
|
|
69
|
+
this.emit('finish')
|
|
70
|
+
;(typeof chunk === 'function' ? chunk : typeof encoding === 'function' ? encoding : callback)?.()
|
|
71
|
+
}).catch((error) => this.destroy(error))
|
|
72
|
+
return this
|
|
73
|
+
},
|
|
74
|
+
destroy(error) {
|
|
75
|
+
if (this.destroyed) return this
|
|
76
|
+
this.destroyed = true
|
|
77
|
+
_ended = true
|
|
78
|
+
if (!committed) reject(error ?? new Error('Response aborted'))
|
|
79
|
+
void writer.abort(error).catch(() => {})
|
|
80
|
+
this.emit('close')
|
|
81
|
+
return this
|
|
82
|
+
},
|
|
83
|
+
destroyed: false,
|
|
84
|
+
})
|
|
85
|
+
Object.defineProperties(res, {
|
|
86
|
+
headersSent: { get: () => committed },
|
|
87
|
+
writableEnded: { get: () => _ended },
|
|
88
|
+
})
|
|
89
|
+
// Reader cancellation must stop the producer even when no write is pending.
|
|
90
|
+
void writer.closed.catch((error) => res.destroy(error))
|
|
91
|
+
return { res, promise }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function handleRequest(webReq, dispatchRequest) {
|
|
95
|
+
const nodeReq = await toNodeRequest(webReq)
|
|
96
|
+
const { res, promise } = createNodeResponse(webReq.method)
|
|
97
|
+
const abort = () => res.destroy(webReq.signal.reason)
|
|
98
|
+
webReq.signal.addEventListener('abort', abort, { once: true })
|
|
99
|
+
const cleanup = () => webReq.signal.removeEventListener('abort', abort)
|
|
100
|
+
res.once('finish', cleanup)
|
|
101
|
+
res.once('close', () => { cleanup(); nodeReq.destroy() })
|
|
102
|
+
if (webReq.signal.aborted) abort()
|
|
103
|
+
else void Promise.resolve().then(() => dispatchRequest(nodeReq, res)).catch((error) => {
|
|
104
|
+
if (res.headersSent) res.destroy(error)
|
|
105
|
+
else if (!res.writableEnded) { res.statusCode = 500; res.end('Internal Server Error') }
|
|
106
|
+
})
|
|
107
|
+
return promise
|
|
108
|
+
}
|
|
109
|
+
`;
|
|
110
|
+
//# sourceMappingURL=web-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-bridge.js","sourceRoot":"","sources":["../../../src/cli/adapters/web-bridge.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2GnC,CAAA"}
|
|
@@ -9,10 +9,16 @@ export interface LighthouseAuditOptions {
|
|
|
9
9
|
categories?: string[];
|
|
10
10
|
/** Chromium-family executable. Defaults to CHROME_PATH or a known platform installation. */
|
|
11
11
|
chromePath?: string;
|
|
12
|
+
/** Persistent artifacts directory. Reports are never discarded on failure. */
|
|
13
|
+
reportsDir?: string;
|
|
14
|
+
ignoreCertificateErrors?: boolean;
|
|
15
|
+
onRun?: (url: string, run: number, scores: Record<string, number>, metrics: Record<string, number>) => void;
|
|
12
16
|
}
|
|
13
17
|
export interface LighthouseUrlReport {
|
|
14
18
|
url: string;
|
|
15
19
|
medians: Record<string, number>;
|
|
20
|
+
metrics: Record<string, number>;
|
|
21
|
+
reportsDir: string;
|
|
16
22
|
}
|
|
17
23
|
export interface ChromiumDiscoveryOptions {
|
|
18
24
|
environment?: Record<string, string | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lighthouse.d.ts","sourceRoot":"","sources":["../../../src/cli/checks/lighthouse.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,qBAAqB,YAChC,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,KAAK,CACG,CAAA;AAEV,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAIxD;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,4FAA4F;IAC5F,UAAU,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"lighthouse.d.ts","sourceRoot":"","sources":["../../../src/cli/checks/lighthouse.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,qBAAqB,YAChC,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,KAAK,CACG,CAAA;AAEV,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAIxD;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,4FAA4F;IAC5F,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;CAC5G;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CACnC;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM,GAAG,SAAS,CA8BjG;AAaD,0FAA0F;AAC1F,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAiEhC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
|
-
import { mkdtemp,
|
|
3
|
+
import { mkdtemp, mkdir, readFile } from 'node:fs/promises';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join, resolve } from 'node:path';
|
|
6
6
|
export const LIGHTHOUSE_CATEGORIES = [
|
|
@@ -68,54 +68,59 @@ export async function runLighthouseAudit(options) {
|
|
|
68
68
|
const attempts = Math.max(1, options.attempts ?? 3);
|
|
69
69
|
const chromePath = options.chromePath?.trim() || findChromiumExecutable();
|
|
70
70
|
const environment = chromePath ? { ...process.env, CHROME_PATH: chromePath } : process.env;
|
|
71
|
-
|
|
71
|
+
if (!existsSync(cli))
|
|
72
|
+
throw new Error('Install lighthouse in the application to run this optional check.');
|
|
73
|
+
const reportsDir = options.reportsDir ? resolve(options.reportsDir) : await mkdtemp(join(tmpdir(), 'cer-lighthouse-'));
|
|
74
|
+
await mkdir(reportsDir, { recursive: true });
|
|
72
75
|
const result = [];
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
lastError = error;
|
|
98
|
-
if (attempt < attempts) {
|
|
99
|
-
await new Promise((resolveWait) => setTimeout(resolveWait, attempt * 250));
|
|
100
|
-
}
|
|
101
|
-
}
|
|
76
|
+
for (const [urlIndex, url] of options.urls.entries()) {
|
|
77
|
+
const metrics = {};
|
|
78
|
+
const scores = Object.fromEntries(categories.map((category) => [category, []]));
|
|
79
|
+
for (let runIndex = 0; runIndex < runs; runIndex += 1) {
|
|
80
|
+
const outputPath = join(reportsDir, `${urlIndex}-${runIndex}.json`);
|
|
81
|
+
const args = [
|
|
82
|
+
cli,
|
|
83
|
+
url,
|
|
84
|
+
'--quiet',
|
|
85
|
+
`--chrome-flags=--headless --no-sandbox${options.ignoreCertificateErrors ? ' --ignore-certificate-errors' : ''}`,
|
|
86
|
+
`--only-categories=${categories.join(',')}`,
|
|
87
|
+
'--output=json',
|
|
88
|
+
`--output-path=${outputPath}`,
|
|
89
|
+
];
|
|
90
|
+
if (options.preset)
|
|
91
|
+
args.push(`--preset=${options.preset}`);
|
|
92
|
+
let lastError;
|
|
93
|
+
for (let attempt = 1; attempt <= attempts; attempt += 1) {
|
|
94
|
+
try {
|
|
95
|
+
await run(process.execPath, args, environment);
|
|
96
|
+
lastError = undefined;
|
|
97
|
+
break;
|
|
102
98
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
99
|
+
catch (error) {
|
|
100
|
+
lastError = error;
|
|
101
|
+
if (attempt < attempts) {
|
|
102
|
+
await new Promise((resolveWait) => setTimeout(resolveWait, attempt * 250));
|
|
103
|
+
}
|
|
108
104
|
}
|
|
109
105
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
106
|
+
if (lastError)
|
|
107
|
+
throw lastError;
|
|
108
|
+
const report = JSON.parse(await readFile(outputPath, 'utf8'));
|
|
109
|
+
const rawMetrics = Object.fromEntries(['first-contentful-paint', 'largest-contentful-paint', 'total-blocking-time', 'cumulative-layout-shift'].map((key) => [key, report.audits?.[key]?.numericValue ?? 0]));
|
|
110
|
+
for (const [key, value] of Object.entries(rawMetrics))
|
|
111
|
+
(metrics[key] ??= []).push(value);
|
|
112
|
+
options.onRun?.(url, runIndex + 1, Object.fromEntries(categories.map((key) => [key, report.categories[key]?.score ?? 0])), rawMetrics);
|
|
113
|
+
for (const category of categories) {
|
|
114
|
+
scores[category].push(report.categories[category]?.score ?? 0);
|
|
115
|
+
}
|
|
114
116
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
result.push({
|
|
118
|
+
url,
|
|
119
|
+
reportsDir,
|
|
120
|
+
metrics: Object.fromEntries(Object.entries(metrics).map(([key, values]) => [key, median(values)])),
|
|
121
|
+
medians: Object.fromEntries(categories.map((category) => [category, median(scores[category])])),
|
|
122
|
+
});
|
|
119
123
|
}
|
|
124
|
+
return result;
|
|
120
125
|
}
|
|
121
126
|
//# sourceMappingURL=lighthouse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lighthouse.js","sourceRoot":"","sources":["../../../src/cli/checks/lighthouse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"lighthouse.js","sourceRoot":"","sources":["../../../src/cli/checks/lighthouse.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,9 @@ export interface PerformanceBudgetReport {
|
|
|
10
10
|
htmlBytes: number;
|
|
11
11
|
initialJsGzipBytes: number;
|
|
12
12
|
entryJsGzipBytes: number;
|
|
13
|
+
/** Bytes requested through modulepreload, independent of execution timing. */
|
|
14
|
+
preloadedJsGzipBytes: number;
|
|
15
|
+
startupAssets: string[];
|
|
13
16
|
failures: string[];
|
|
14
17
|
}
|
|
15
18
|
/** Measure framework-neutral SSG output budgets and build-integrity signals. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../../src/cli/checks/performance.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,gFAAgF;AAChF,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,
|
|
1
|
+
{"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../../src/cli/checks/performance.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,8EAA8E;IAC9E,oBAAoB,EAAE,MAAM,CAAA;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,gFAAgF;AAChF,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAoGlC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { gzipSync } from 'node:zlib';
|
|
2
2
|
import { readFile, readdir, stat } from 'node:fs/promises';
|
|
3
|
-
import { basename, join, resolve } from 'node:path';
|
|
3
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
4
4
|
/** Measure framework-neutral SSG output budgets and build-integrity signals. */
|
|
5
5
|
export async function checkPerformanceBudgets(options = {}) {
|
|
6
6
|
const outputDir = resolve(options.outputDir ?? 'dist');
|
|
@@ -10,24 +10,65 @@ export async function checkPerformanceBudgets(options = {}) {
|
|
|
10
10
|
const html = await readFile(htmlPath, 'utf8');
|
|
11
11
|
const htmlBytes = (await stat(htmlPath)).size;
|
|
12
12
|
const failures = [];
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
const localAsset = (url, importer = outputDir) => {
|
|
14
|
+
if (/^(?:[a-z]+:)?\/\//i.test(url))
|
|
15
|
+
return null;
|
|
16
|
+
const name = url.split(/[?#]/)[0];
|
|
17
|
+
const path = name.startsWith('/') ? resolve(outputDir, `.${name}`) : resolve(importer, name);
|
|
18
|
+
return path.startsWith(outputDir + '/') && /\.m?js$/.test(path) ? path : null;
|
|
19
|
+
};
|
|
20
|
+
const preloadRoots = [...html.matchAll(/<link\b[^>]*rel=["']modulepreload["'][^>]*href=["']([^"']+)["']/g)].map((m) => m[1]);
|
|
21
|
+
const entryRoots = [
|
|
22
|
+
...[...html.matchAll(/<script\b[^>]*src=["']([^"']+\.m?js(?:[?#][^"']*)?)["']/g)].map((m) => m[1]),
|
|
23
|
+
// CER's first-paint bootstrap is an inline import, even when preloads are disabled.
|
|
24
|
+
...[...html.matchAll(/\bimport\(\s*["']([^"']+\.m?js)["']\s*\)/g)].map((m) => m[1]),
|
|
25
|
+
];
|
|
26
|
+
let manifest = {};
|
|
27
|
+
for (const file of ['cer-client-manifest.json', '.vite/manifest.json', 'client/.vite/manifest.json']) {
|
|
19
28
|
try {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if (name.startsWith('index-'))
|
|
23
|
-
entryJsGzipBytes += bytes;
|
|
29
|
+
manifest = JSON.parse(await readFile(join(outputDir, file), 'utf8'));
|
|
30
|
+
break;
|
|
24
31
|
}
|
|
25
|
-
catch {
|
|
26
|
-
|
|
32
|
+
catch { /* older builds */ }
|
|
33
|
+
}
|
|
34
|
+
const byFile = new Map(Object.values(manifest).map((entry) => [resolve(outputDir, entry.file), entry]));
|
|
35
|
+
const sizes = new Map();
|
|
36
|
+
async function graph(roots) {
|
|
37
|
+
const visited = new Set();
|
|
38
|
+
async function visit(path) {
|
|
39
|
+
if (!path || visited.has(path))
|
|
40
|
+
return;
|
|
41
|
+
visited.add(path);
|
|
42
|
+
try {
|
|
43
|
+
const source = await readFile(path, 'utf8');
|
|
44
|
+
sizes.set(path, gzipSync(source).byteLength);
|
|
45
|
+
const entry = byFile.get(path);
|
|
46
|
+
const dependencies = entry
|
|
47
|
+
? (entry.imports ?? []).map((key) => manifest[key]?.file).filter((file) => !!file).map((file) => localAsset('/' + file))
|
|
48
|
+
: [...source.matchAll(/(?:\b(?:import|export)\s*(?:[^;"']*?\sfrom\s*)?)["']([^"']+)["']/g)].map((m) => localAsset(m[1], dirname(path)));
|
|
49
|
+
await Promise.all(dependencies.map(visit));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
failures.push(`${options.page ?? '/'} references missing JavaScript asset ${path.slice(outputDir.length + 1)}`);
|
|
53
|
+
}
|
|
27
54
|
}
|
|
55
|
+
await Promise.all(roots.map((url) => visit(localAsset(url))));
|
|
56
|
+
return visited;
|
|
57
|
+
}
|
|
58
|
+
let startupRoots = [];
|
|
59
|
+
try {
|
|
60
|
+
const startup = JSON.parse(await readFile(join(outputDir, 'cer-startup-manifest.json'), 'utf8'));
|
|
61
|
+
startupRoots = (startup[page ? '/' + page : '/'] ?? []).map((file) => '/' + file);
|
|
28
62
|
}
|
|
63
|
+
catch { /* Older builds do not emit a content startup manifest. */ }
|
|
64
|
+
const startup = await graph([...entryRoots, ...preloadRoots, ...startupRoots]);
|
|
65
|
+
const preloaded = await graph(preloadRoots);
|
|
66
|
+
const sum = (paths) => [...paths].reduce((total, path) => total + (sizes.get(path) ?? 0), 0);
|
|
67
|
+
const initialJsGzipBytes = sum(startup);
|
|
68
|
+
const preloadedJsGzipBytes = sum(preloaded);
|
|
69
|
+
const entryJsGzipBytes = sum(new Set(entryRoots.map((url) => localAsset(url)).filter((path) => !!path)));
|
|
29
70
|
if (options.maxHtmlBytes !== undefined && htmlBytes > options.maxHtmlBytes) {
|
|
30
|
-
failures.push(
|
|
71
|
+
failures.push(`${options.page ?? '/'} is ${htmlBytes.toLocaleString()} bytes (budget: ${options.maxHtmlBytes.toLocaleString()})`);
|
|
31
72
|
}
|
|
32
73
|
if (options.maxInitialJsGzipBytes !== undefined &&
|
|
33
74
|
initialJsGzipBytes > options.maxInitialJsGzipBytes) {
|
|
@@ -56,6 +97,6 @@ export async function checkPerformanceBudgets(options = {}) {
|
|
|
56
97
|
failures.push(`missing ${basename(join(outputDir, 'ssg-manifest.json'))}`);
|
|
57
98
|
}
|
|
58
99
|
}
|
|
59
|
-
return { htmlBytes, initialJsGzipBytes, entryJsGzipBytes, failures };
|
|
100
|
+
return { htmlBytes, initialJsGzipBytes, entryJsGzipBytes, preloadedJsGzipBytes, startupAssets: [...startup].map((path) => path.slice(outputDir.length + 1)).sort(), failures };
|
|
60
101
|
}
|
|
61
102
|
//# sourceMappingURL=performance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../src/cli/checks/performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../src/cli/checks/performance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { LIGHTHOUSE_CATEGORIES, type LighthouseUrlReport } from './lighthouse.js';
|
|
2
|
+
export { startPreview, closePreview } from '../commands/preview.js';
|
|
3
|
+
export { checkPerformanceBudgets } from './performance.js';
|
|
4
|
+
export { checkBuiltLinks } from './links.js';
|
|
5
|
+
export { checkSeo } from './seo.js';
|
|
6
|
+
export { runLighthouseAudit, findChromiumExecutable } from './lighthouse.js';
|
|
7
|
+
export interface LighthouseProfile {
|
|
8
|
+
name: string;
|
|
9
|
+
path: string;
|
|
10
|
+
preset?: 'desktop';
|
|
11
|
+
/** Local preview response cookies for a returning-visitor profile. */
|
|
12
|
+
cookies?: string[];
|
|
13
|
+
thresholds?: Partial<Record<typeof LIGHTHOUSE_CATEGORIES[number], number>>;
|
|
14
|
+
}
|
|
15
|
+
export interface LighthouseSuiteOptions {
|
|
16
|
+
root?: string;
|
|
17
|
+
profiles: LighthouseProfile[];
|
|
18
|
+
runs?: number;
|
|
19
|
+
attempts?: number;
|
|
20
|
+
port?: number;
|
|
21
|
+
chromePath?: string;
|
|
22
|
+
/** Default true: direct Vite HTTP/2 preview. Requires openssl or supplied TLS options. */
|
|
23
|
+
https?: boolean | import('vite').PreviewOptions['https'];
|
|
24
|
+
reportsDir?: string;
|
|
25
|
+
thresholds?: LighthouseProfile['thresholds'];
|
|
26
|
+
}
|
|
27
|
+
export interface LighthouseSuiteReport {
|
|
28
|
+
profiles: Array<LighthouseUrlReport & {
|
|
29
|
+
name: string;
|
|
30
|
+
}>;
|
|
31
|
+
failures: string[];
|
|
32
|
+
}
|
|
33
|
+
/** Own preview lifecycle and retain scores, raw metrics and the full optional Lighthouse reports. */
|
|
34
|
+
export declare function runLighthouseSuite(options: LighthouseSuiteOptions): Promise<LighthouseSuiteReport>;
|
|
35
|
+
//# sourceMappingURL=quality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../../../src/cli/checks/quality.ts"],"names":[],"mappings":"AAMA,OAAO,EAAsB,qBAAqB,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAE5E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;CAC3E;AACD,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0FAA0F;IAC1F,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IACxD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAA;CAC7C;AACD,MAAM,WAAW,qBAAqB;IAAG,QAAQ,EAAE,KAAK,CAAC,mBAAmB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE;AAEtH,qGAAqG;AACrG,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA6CxG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join, resolve } from 'node:path';
|
|
6
|
+
import { startPreview, closePreview } from '../commands/preview.js';
|
|
7
|
+
import { runLighthouseAudit, LIGHTHOUSE_CATEGORIES } from './lighthouse.js';
|
|
8
|
+
export { startPreview, closePreview } from '../commands/preview.js';
|
|
9
|
+
export { checkPerformanceBudgets } from './performance.js';
|
|
10
|
+
export { checkBuiltLinks } from './links.js';
|
|
11
|
+
export { checkSeo } from './seo.js';
|
|
12
|
+
export { runLighthouseAudit, findChromiumExecutable } from './lighthouse.js';
|
|
13
|
+
/** Own preview lifecycle and retain scores, raw metrics and the full optional Lighthouse reports. */
|
|
14
|
+
export async function runLighthouseSuite(options) {
|
|
15
|
+
for (const [name, value] of Object.entries({ runs: options.runs ?? 3, attempts: options.attempts ?? 1 })) {
|
|
16
|
+
if (!Number.isSafeInteger(value) || value < 1)
|
|
17
|
+
throw new Error(`${name} must be a positive integer`);
|
|
18
|
+
}
|
|
19
|
+
for (const profile of options.profiles) {
|
|
20
|
+
if (!profile.path.startsWith('/') || profile.path.startsWith('//'))
|
|
21
|
+
throw new Error(`Profile ${profile.name} must use a local path`);
|
|
22
|
+
for (const threshold of Object.values({ ...options.thresholds, ...profile.thresholds })) {
|
|
23
|
+
if (!Number.isFinite(threshold) || threshold < 0 || threshold > 1)
|
|
24
|
+
throw new Error('Lighthouse thresholds must be between 0 and 1');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const names = options.profiles.map((profile) => profile.name);
|
|
28
|
+
if (new Set(names).size !== names.length)
|
|
29
|
+
throw new Error('Lighthouse profile names must be unique');
|
|
30
|
+
const root = resolve(options.root ?? process.cwd());
|
|
31
|
+
const certificates = await mkdtemp(join(tmpdir(), 'cer-audit-cert-'));
|
|
32
|
+
let https = options.https === false ? undefined : typeof options.https === 'object' ? options.https : undefined;
|
|
33
|
+
const parent = resolve(options.reportsDir ?? join(root, '.cer/reports/lighthouse'));
|
|
34
|
+
await mkdir(parent, { recursive: true });
|
|
35
|
+
const reportsDir = await mkdtemp(join(parent, new Date().toISOString().replace(/[:.]/g, '-') + '-'));
|
|
36
|
+
console.log(`[lighthouse] Reports: ${reportsDir}`);
|
|
37
|
+
const result = { profiles: [], failures: [] };
|
|
38
|
+
try {
|
|
39
|
+
if (options.https !== false && !https) {
|
|
40
|
+
const key = join(certificates, 'key.pem'), cert = join(certificates, 'cert.pem');
|
|
41
|
+
execFileSync('openssl', ['req', '-x509', '-newkey', 'rsa:2048', '-nodes', '-keyout', key, '-out', cert, '-days', '1', '-subj', '/CN=localhost', '-addext', 'subjectAltName=DNS:localhost,IP:127.0.0.1'], { stdio: 'ignore' });
|
|
42
|
+
https = { key: readFileSync(key), cert: readFileSync(cert) };
|
|
43
|
+
}
|
|
44
|
+
for (const profile of options.profiles) {
|
|
45
|
+
if (!/^[a-z0-9][a-z0-9_-]*$/i.test(profile.name))
|
|
46
|
+
throw new Error(`Invalid profile name: ${profile.name}`);
|
|
47
|
+
const server = await startPreview({ root, host: '127.0.0.1', port: options.port ?? 4173, preview: { https, headers: profile.cookies?.length ? { 'Set-Cookie': profile.cookies } : undefined } });
|
|
48
|
+
try {
|
|
49
|
+
const url = new URL(profile.path, server.resolvedUrls?.local[0] ?? `${https ? 'https' : 'http'}://127.0.0.1:${options.port ?? 4173}`).href;
|
|
50
|
+
const [report] = await runLighthouseAudit({ root, urls: [url], runs: options.runs, attempts: options.attempts, preset: profile.preset, chromePath: options.chromePath, ignoreCertificateErrors: !!https, reportsDir: join(reportsDir, profile.name), onRun: (_url, run, scores, metrics) => {
|
|
51
|
+
console.log(`[lighthouse] ${profile.name} run ${run}: ${Object.entries(scores).map(([key, value]) => `${key}=${Math.round(value * 100)}`).join(' ')}; ${Object.entries(metrics).map(([key, value]) => `${key}=${value.toFixed(3)}`).join(' ')}`);
|
|
52
|
+
} });
|
|
53
|
+
result.profiles.push({ ...report, name: profile.name });
|
|
54
|
+
for (const category of LIGHTHOUSE_CATEGORIES) {
|
|
55
|
+
const threshold = profile.thresholds?.[category] ?? options.thresholds?.[category] ?? 1;
|
|
56
|
+
if ((report.medians[category] ?? 0) < threshold)
|
|
57
|
+
result.failures.push(`${profile.name}: ${category}=${Math.round(report.medians[category] * 100)} (required ${threshold * 100})`);
|
|
58
|
+
}
|
|
59
|
+
console.log(`[lighthouse] ${profile.name} median: ${JSON.stringify(report.medians)}`);
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
await closePreview(server);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
await writeFile(join(reportsDir, 'summary.json'), JSON.stringify(result, null, 2));
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
await rm(certificates, { recursive: true, force: true });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.js","sourceRoot":"","sources":["../../../src/cli/checks/quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** General SSG invariants; content/provider assertions stay with the application. */
|
|
2
|
+
export declare function checkSeo(options: {
|
|
3
|
+
outputDir?: string;
|
|
4
|
+
siteUrl: string;
|
|
5
|
+
}): Promise<{
|
|
6
|
+
pages: number;
|
|
7
|
+
failures: string[];
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=seo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../../src/cli/checks/seo.ts"],"names":[],"mappings":"AAGA,qFAAqF;AACrF,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAwB/H"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
/** General SSG invariants; content/provider assertions stay with the application. */
|
|
4
|
+
export async function checkSeo(options) {
|
|
5
|
+
const root = resolve(options.outputDir ?? 'dist'), failures = [];
|
|
6
|
+
const manifest = JSON.parse(await readFile(join(root, 'ssg-manifest.json'), 'utf8'));
|
|
7
|
+
const sitemap = await readFile(join(root, 'sitemap.xml'), 'utf8');
|
|
8
|
+
const locations = [...sitemap.matchAll(/<loc>([^<]+)<\/loc>/g)].map((match) => match[1].replace(/&/g, '&'));
|
|
9
|
+
if (new Set(locations).size !== locations.length)
|
|
10
|
+
failures.push('Sitemap has duplicate URLs');
|
|
11
|
+
const expected = new Set();
|
|
12
|
+
for (const path of manifest.paths) {
|
|
13
|
+
const html = await readFile(join(root, path === '/' ? 'index.html' : `${path.slice(1)}/index.html`), 'utf8');
|
|
14
|
+
const canonical = options.siteUrl.replace(/\/$/, '') + (path === '/' ? '' : path);
|
|
15
|
+
const links = [...html.matchAll(/<link\b[^>]*rel=["']canonical["'][^>]*href=["']([^"']+)["']/gi)];
|
|
16
|
+
if (links.length !== 1 || links[0]?.[1] !== canonical)
|
|
17
|
+
failures.push(`${path}: expected one canonical ${canonical}`);
|
|
18
|
+
const noindex = /<meta\b[^>]*name=["']robots["'][^>]*content=["'][^"']*\bnoindex\b/i.test(html);
|
|
19
|
+
if (!noindex)
|
|
20
|
+
expected.add(canonical);
|
|
21
|
+
if (/<p>\s*<(?:document-list|modeler-section)\b/i.test(html))
|
|
22
|
+
failures.push(`${path}: block component nested in paragraph`);
|
|
23
|
+
}
|
|
24
|
+
for (const url of expected)
|
|
25
|
+
if (!locations.includes(url))
|
|
26
|
+
failures.push(`Sitemap missing ${url}`);
|
|
27
|
+
for (const url of locations)
|
|
28
|
+
if (!expected.has(url))
|
|
29
|
+
failures.push(`Sitemap includes nonindexable or unknown URL ${url}`);
|
|
30
|
+
try {
|
|
31
|
+
const html = await readFile(join(root, '404.html'), 'utf8');
|
|
32
|
+
if (!/<meta\b[^>]*name=["']robots["'][^>]*content=["'][^"']*\bnoindex\b/i.test(html))
|
|
33
|
+
failures.push('404 document must be noindex');
|
|
34
|
+
if (/<link\b[^>]*rel=["']canonical["']/i.test(html))
|
|
35
|
+
failures.push('404 document must omit canonical');
|
|
36
|
+
}
|
|
37
|
+
catch { /* Vite/CER can provide a default noindex 404 at preview time. */ }
|
|
38
|
+
return { pages: manifest.paths.length, failures };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=seo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo.js","sourceRoot":"","sources":["../../../src/cli/checks/seo.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkCnC,wBAAgB,YAAY,IAAI,OAAO,CA4EtC"}
|