@jasonshimmy/vite-plugin-cer-app 0.28.2 → 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.
Files changed (184) hide show
  1. package/README.md +2 -0
  2. package/dist/cli/adapters/cloudflare.d.ts +2 -2
  3. package/dist/cli/adapters/cloudflare.d.ts.map +1 -1
  4. package/dist/cli/adapters/cloudflare.js +83 -159
  5. package/dist/cli/adapters/cloudflare.js.map +1 -1
  6. package/dist/cli/adapters/deployment-mode.d.ts +10 -0
  7. package/dist/cli/adapters/deployment-mode.d.ts.map +1 -0
  8. package/dist/cli/adapters/deployment-mode.js +59 -0
  9. package/dist/cli/adapters/deployment-mode.js.map +1 -0
  10. package/dist/cli/adapters/netlify.d.ts +5 -4
  11. package/dist/cli/adapters/netlify.d.ts.map +1 -1
  12. package/dist/cli/adapters/netlify.js +26 -150
  13. package/dist/cli/adapters/netlify.js.map +1 -1
  14. package/dist/cli/adapters/vercel.d.ts +2 -3
  15. package/dist/cli/adapters/vercel.d.ts.map +1 -1
  16. package/dist/cli/adapters/vercel.js +36 -111
  17. package/dist/cli/adapters/vercel.js.map +1 -1
  18. package/dist/cli/adapters/web-bridge.d.ts +3 -0
  19. package/dist/cli/adapters/web-bridge.d.ts.map +1 -0
  20. package/dist/cli/adapters/web-bridge.js +110 -0
  21. package/dist/cli/adapters/web-bridge.js.map +1 -0
  22. package/dist/cli/checks/lighthouse.d.ts +7 -1
  23. package/dist/cli/checks/lighthouse.d.ts.map +1 -1
  24. package/dist/cli/checks/lighthouse.js +49 -44
  25. package/dist/cli/checks/lighthouse.js.map +1 -1
  26. package/dist/cli/checks/links.js.map +1 -1
  27. package/dist/cli/checks/performance.d.ts +3 -0
  28. package/dist/cli/checks/performance.d.ts.map +1 -1
  29. package/dist/cli/checks/performance.js +56 -15
  30. package/dist/cli/checks/performance.js.map +1 -1
  31. package/dist/cli/checks/quality.d.ts +35 -0
  32. package/dist/cli/checks/quality.d.ts.map +1 -0
  33. package/dist/cli/checks/quality.js +72 -0
  34. package/dist/cli/checks/quality.js.map +1 -0
  35. package/dist/cli/checks/seo.d.ts +9 -0
  36. package/dist/cli/checks/seo.d.ts.map +1 -0
  37. package/dist/cli/checks/seo.js +40 -0
  38. package/dist/cli/checks/seo.js.map +1 -0
  39. package/dist/cli/commands/adapt.js.map +1 -1
  40. package/dist/cli/commands/build.d.ts.map +1 -1
  41. package/dist/cli/commands/build.js +2 -51
  42. package/dist/cli/commands/build.js.map +1 -1
  43. package/dist/cli/commands/check.d.ts.map +1 -1
  44. package/dist/cli/commands/check.js +12 -0
  45. package/dist/cli/commands/check.js.map +1 -1
  46. package/dist/cli/commands/dev.d.ts +4 -0
  47. package/dist/cli/commands/dev.d.ts.map +1 -1
  48. package/dist/cli/commands/dev.js +1 -72
  49. package/dist/cli/commands/dev.js.map +1 -1
  50. package/dist/cli/commands/generate.d.ts +1 -4
  51. package/dist/cli/commands/generate.d.ts.map +1 -1
  52. package/dist/cli/commands/generate.js +4 -73
  53. package/dist/cli/commands/generate.js.map +1 -1
  54. package/dist/cli/commands/preview-paths.d.ts +3 -0
  55. package/dist/cli/commands/preview-paths.d.ts.map +1 -0
  56. package/dist/cli/commands/preview-paths.js +8 -0
  57. package/dist/cli/commands/preview-paths.js.map +1 -0
  58. package/dist/cli/commands/preview.d.ts +11 -0
  59. package/dist/cli/commands/preview.d.ts.map +1 -1
  60. package/dist/cli/commands/preview.js +124 -458
  61. package/dist/cli/commands/preview.js.map +1 -1
  62. package/dist/cli/config.d.ts +3 -0
  63. package/dist/cli/config.d.ts.map +1 -0
  64. package/dist/cli/config.js +68 -0
  65. package/dist/cli/config.js.map +1 -0
  66. package/dist/cli/create/index.js.map +1 -1
  67. package/dist/cli/create/templates/spa/package.json.tpl +1 -1
  68. package/dist/cli/create/templates/ssg/package.json.tpl +1 -1
  69. package/dist/cli/create/templates/ssr/package.json.tpl +1 -1
  70. package/dist/plugin/build-ssg.d.ts.map +1 -1
  71. package/dist/plugin/build-ssg.js +81 -15
  72. package/dist/plugin/build-ssg.js.map +1 -1
  73. package/dist/plugin/build-ssr.d.ts.map +1 -1
  74. package/dist/plugin/build-ssr.js +3 -1
  75. package/dist/plugin/build-ssr.js.map +1 -1
  76. package/dist/plugin/content/scanner.d.ts.map +1 -1
  77. package/dist/plugin/content/scanner.js +2 -7
  78. package/dist/plugin/content/scanner.js.map +1 -1
  79. package/dist/plugin/dev-server.d.ts +8 -0
  80. package/dist/plugin/dev-server.d.ts.map +1 -1
  81. package/dist/plugin/dev-server.js.map +1 -1
  82. package/dist/plugin/dts-generator.d.ts.map +1 -1
  83. package/dist/plugin/dts-generator.js +4 -1
  84. package/dist/plugin/dts-generator.js.map +1 -1
  85. package/dist/plugin/file-scanner.d.ts +4 -0
  86. package/dist/plugin/file-scanner.d.ts.map +1 -0
  87. package/dist/plugin/file-scanner.js +59 -0
  88. package/dist/plugin/file-scanner.js.map +1 -0
  89. package/dist/plugin/html-post-process.d.ts +1 -1
  90. package/dist/plugin/html-post-process.d.ts.map +1 -1
  91. package/dist/plugin/html-post-process.js +7 -5
  92. package/dist/plugin/html-post-process.js.map +1 -1
  93. package/dist/plugin/index.d.ts +1 -4
  94. package/dist/plugin/index.d.ts.map +1 -1
  95. package/dist/plugin/index.js +26 -8
  96. package/dist/plugin/index.js.map +1 -1
  97. package/dist/plugin/path-utils.js.map +1 -1
  98. package/dist/plugin/scanner.d.ts +2 -2
  99. package/dist/plugin/scanner.d.ts.map +1 -1
  100. package/dist/plugin/scanner.js +4 -10
  101. package/dist/plugin/scanner.js.map +1 -1
  102. package/dist/plugin/server-content.d.ts +3 -0
  103. package/dist/plugin/server-content.d.ts.map +1 -0
  104. package/dist/plugin/server-content.js +25 -0
  105. package/dist/plugin/server-content.js.map +1 -0
  106. package/dist/plugin/transforms/auto-import.d.ts.map +1 -1
  107. package/dist/plugin/transforms/auto-import.js +6 -5
  108. package/dist/plugin/transforms/auto-import.js.map +1 -1
  109. package/dist/plugin/transforms/head-inject.d.ts.map +1 -1
  110. package/dist/plugin/virtual/composables.js +1 -1
  111. package/dist/plugin/virtual/composables.js.map +1 -1
  112. package/dist/plugin/virtual/content-components.d.ts +3 -1
  113. package/dist/plugin/virtual/content-components.d.ts.map +1 -1
  114. package/dist/plugin/virtual/content-components.js +105 -22
  115. package/dist/plugin/virtual/content-components.js.map +1 -1
  116. package/dist/plugin/virtual/layouts.js +1 -1
  117. package/dist/plugin/virtual/layouts.js.map +1 -1
  118. package/dist/plugin/virtual/middleware.js +1 -1
  119. package/dist/plugin/virtual/middleware.js.map +1 -1
  120. package/dist/plugin/virtual/plugins.js +1 -1
  121. package/dist/plugin/virtual/plugins.js.map +1 -1
  122. package/dist/plugin/virtual/routes.js +1 -1
  123. package/dist/plugin/virtual/routes.js.map +1 -1
  124. package/dist/plugin/virtual/server-api.js +1 -1
  125. package/dist/plugin/virtual/server-api.js.map +1 -1
  126. package/dist/plugin/virtual/server-middleware.js +1 -1
  127. package/dist/plugin/virtual/server-middleware.js.map +1 -1
  128. package/dist/runtime/app-template.d.ts.map +1 -1
  129. package/dist/runtime/app-template.js +18 -8
  130. package/dist/runtime/app-template.js.map +1 -1
  131. package/dist/runtime/composables/index.d.ts +2 -0
  132. package/dist/runtime/composables/index.d.ts.map +1 -1
  133. package/dist/runtime/composables/index.js +1 -0
  134. package/dist/runtime/composables/index.js.map +1 -1
  135. package/dist/runtime/composables/render-content.d.ts +10 -0
  136. package/dist/runtime/composables/render-content.d.ts.map +1 -0
  137. package/dist/runtime/composables/render-content.js +21 -0
  138. package/dist/runtime/composables/render-content.js.map +1 -0
  139. package/dist/runtime/composables/use-active-headings.js.map +1 -1
  140. package/dist/runtime/composables/use-auth.d.ts.map +1 -1
  141. package/dist/runtime/composables/use-auth.js +14 -6
  142. package/dist/runtime/composables/use-auth.js.map +1 -1
  143. package/dist/runtime/composables/use-content-page.d.ts +2 -0
  144. package/dist/runtime/composables/use-content-page.d.ts.map +1 -1
  145. package/dist/runtime/composables/use-content-page.js +1 -1
  146. package/dist/runtime/composables/use-content-page.js.map +1 -1
  147. package/dist/runtime/composables/use-content.d.ts.map +1 -1
  148. package/dist/runtime/composables/use-content.js.map +1 -1
  149. package/dist/runtime/composables/use-cookie.js.map +1 -1
  150. package/dist/runtime/composables/use-runtime-config.js.map +1 -1
  151. package/dist/runtime/composables/use-session.js.map +1 -1
  152. package/dist/runtime/content/client.d.ts +2 -3
  153. package/dist/runtime/content/client.d.ts.map +1 -1
  154. package/dist/runtime/content/client.js +4 -5
  155. package/dist/runtime/content/client.js.map +1 -1
  156. package/dist/runtime/entry-server-template.d.ts.map +1 -1
  157. package/dist/runtime/entry-server-template.js +45 -15
  158. package/dist/runtime/entry-server-template.js.map +1 -1
  159. package/dist/runtime/isr-handler.d.ts +4 -15
  160. package/dist/runtime/isr-handler.d.ts.map +1 -1
  161. package/dist/runtime/isr-handler.js +64 -45
  162. package/dist/runtime/isr-handler.js.map +1 -1
  163. package/dist/runtime/request-dispatcher.d.ts +31 -0
  164. package/dist/runtime/request-dispatcher.d.ts.map +1 -0
  165. package/dist/runtime/request-dispatcher.js +152 -0
  166. package/dist/runtime/request-dispatcher.js.map +1 -0
  167. package/dist/runtime/route-matching.d.ts +20 -0
  168. package/dist/runtime/route-matching.d.ts.map +1 -0
  169. package/dist/runtime/route-matching.js +45 -0
  170. package/dist/runtime/route-matching.js.map +1 -0
  171. package/dist/types/api.d.ts +3 -0
  172. package/dist/types/api.d.ts.map +1 -1
  173. package/dist/types/config.d.ts +27 -0
  174. package/dist/types/config.d.ts.map +1 -1
  175. package/dist/types/config.js.map +1 -1
  176. package/dist/types/content.d.ts +2 -0
  177. package/dist/types/content.d.ts.map +1 -1
  178. package/dist/types/page.d.ts +11 -7
  179. package/dist/types/page.d.ts.map +1 -1
  180. package/package.json +30 -16
  181. package/dist/cli/commands/preview-isr.d.ts +0 -66
  182. package/dist/cli/commands/preview-isr.d.ts.map +0 -1
  183. package/dist/cli/commands/preview-isr.js +0 -132
  184. 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"}
@@ -1,4 +1,4 @@
1
- export declare const LIGHTHOUSE_CATEGORIES: readonly ["performance", "accessibility", "best-practices", "seo"];
1
+ export declare const LIGHTHOUSE_CATEGORIES: readonly ['performance', 'accessibility', 'best-practices', 'seo'];
2
2
  export declare function median(values: readonly number[]): number;
3
3
  export interface LighthouseAuditOptions {
4
4
  root?: string;
@@ -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,oEAKxB,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;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;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,CA4DhC"}
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, readFile, rm } from 'node:fs/promises';
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
- const reportsDir = await mkdtemp(join(tmpdir(), 'cer-lighthouse-'));
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
- try {
74
- for (const [urlIndex, url] of options.urls.entries()) {
75
- const scores = Object.fromEntries(categories.map((category) => [category, []]));
76
- for (let runIndex = 0; runIndex < runs; runIndex += 1) {
77
- const outputPath = join(reportsDir, `${urlIndex}-${runIndex}.json`);
78
- const args = [
79
- cli,
80
- url,
81
- '--quiet',
82
- '--chrome-flags=--headless --no-sandbox',
83
- `--only-categories=${categories.join(',')}`,
84
- '--output=json',
85
- `--output-path=${outputPath}`,
86
- ];
87
- if (options.preset)
88
- args.push(`--preset=${options.preset}`);
89
- let lastError;
90
- for (let attempt = 1; attempt <= attempts; attempt += 1) {
91
- try {
92
- await run(process.execPath, args, environment);
93
- lastError = undefined;
94
- break;
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
- if (lastError)
104
- throw lastError;
105
- const report = JSON.parse(await readFile(outputPath, 'utf8'));
106
- for (const category of categories) {
107
- scores[category].push(report.categories[category]?.score ?? 0);
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
- result.push({
111
- url,
112
- medians: Object.fromEntries(categories.map((category) => [category, median(scores[category])])),
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
- return result;
116
- }
117
- finally {
118
- await rm(reportsDir, { recursive: true, force: true });
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":"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"}
1
+ {"version":3,"file":"lighthouse.js","sourceRoot":"","sources":["../../../src/cli/checks/lighthouse.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"links.js","sourceRoot":"","sources":["../../../src/cli/checks/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAajE,KAAK,UAAU,WAAW,CACxB,SAAiB,EACjB,OAA4B,EAC5B,KAAK,GAAG,CAAC;IAET,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IACjE,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAQ;QAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;aAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;AACrD,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA6B,EAAE;IACnE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC3F,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACnD,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACzC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjG,MAAM,SAAS,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;QACnE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,EAAE,oBAAoB,CAAC,CAAA;QACjG,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC;aACjE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,IAAI,mDAAmD,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAQ;YACrF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAC/B,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;gBAAE,SAAQ;YACxC,KAAK,IAAI,CAAC,CAAA;YAEV,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;YAC3B,IAAI,CAAC;gBAAC,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;YACnF,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YACnD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;YACpD,MAAM,WAAW,GAAG,QAAQ,KAAK,GAAG;gBAClC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;gBAC/B,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,CAAC,CAAA;YACjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAA;YAEtE,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,IAAI,aAAa,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;gBACjG,SAAQ;YACV,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzC,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBAC1B,IAAI,CAAC;oBAAC,EAAE,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;gBACrE,MAAM,UAAU,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;gBAC1E,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;gBACjC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,aAAa,QAAQ,MAAM,QAAQ,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBACvF,IAAI,CAAC,KAAK;oBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,IAAI,cAAc,EAAE,GAAG,CAAC,CAAA;YACvF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;AACjD,CAAC"}
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../../src/cli/checks/links.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,CAkElC"}
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 assetNames = new Set([...html.matchAll(/(?:src|href)=(?:"([^"]+\.js)"|'([^']+\.js)')/g)]
14
- .map((match) => match[1] ?? match[2])
15
- .map((url) => url.slice(url.lastIndexOf('/') + 1)));
16
- let initialJsGzipBytes = 0;
17
- let entryJsGzipBytes = 0;
18
- for (const name of assetNames) {
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
- const bytes = gzipSync(await readFile(join(assetsDir, name))).byteLength;
21
- initialJsGzipBytes += bytes;
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
- failures.push(`homepage references missing JavaScript asset ${name}`);
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(`homepage is ${htmlBytes.toLocaleString()} bytes (budget: ${options.maxHtmlBytes.toLocaleString()})`);
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":"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"}
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"}