From 40d3251c8e7cc8fd1ef67e4f06b8ab68f588bb7c Mon Sep 17 00:00:00 2001 From: Konstantin Barabanov Date: Tue, 9 Dec 2025 19:19:32 +0300 Subject: [PATCH 1/4] feat: types for prerender options and result; better result checks --- src/plugins/prerender-plugin.js | 13 ++++++++----- src/plugins/types.d.ts | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/plugins/prerender-plugin.js b/src/plugins/prerender-plugin.js index 4c8bc22..b1b2ed3 100644 --- a/src/plugins/prerender-plugin.js +++ b/src/plugins/prerender-plugin.js @@ -382,7 +382,7 @@ export function prerenderPlugin({ prerenderScript, renderTarget, additionalPrere return message; }; - /** @type {import('./types.d.ts').Head} */ + /** @type {Partial} */ let head = { lang: '', title: '', elements: new Set() }; let prerender; @@ -420,9 +420,12 @@ export function prerenderPlugin({ prerenderScript, renderTarget, additionalPrere } catch {} } + /** @type {import('./types.d.ts').PrerenderResult | string} */ let result; try { - result = await prerender({ ssr: true, url: route.url, route }); + /** @type {import('./types.d.ts').PrerenderOptions} */ + const options = { ssr: true, url: route.url, route }; + result = await prerender(options); } catch (e) { const message = await handlePrerenderError(e); this.error(message); @@ -438,7 +441,7 @@ export function prerenderPlugin({ prerenderScript, renderTarget, additionalPrere head = { lang: '', title: '', elements: new Set() }; // Add any discovered links to the list of routes to pre-render: - if (result.links) { + if (typeof result === 'object' && result.links) { for (let url of result.links) { const parsed = new URL(url, 'http://localhost'); url = parsed.pathname.replace(/\/$/, '') || '/'; @@ -494,9 +497,9 @@ export function prerenderPlugin({ prerenderScript, renderTarget, additionalPrere const target = htmlDoc.querySelector(renderTarget); if (!target) this.error( - result.renderTarget == 'body' + renderTarget == 'body' ? '`renderTarget` was not specified in plugin options and does not exist in input HTML template' - : `Unable to detect prerender renderTarget "${result.selector}" in input HTML template`, + : `Unable to detect prerender renderTarget "${renderTarget}" in input HTML template`, ); target.insertAdjacentHTML('afterbegin', body); diff --git a/src/plugins/types.d.ts b/src/plugins/types.d.ts index d13ad3c..d21d31f 100644 --- a/src/plugins/types.d.ts +++ b/src/plugins/types.d.ts @@ -14,3 +14,19 @@ export interface PrerenderedRoute { url: string; _discoveredBy?: PrerenderedRoute; } + +export interface PrerenderOptions { + ssr: true; + url: string; + route: PrerenderedRoute; +} + +export interface PrerenderResult { + html?: string; + head?: Partial; + links?: Set; + /** + * @description Caution: should be a valid JSON object + */ + data?: any; +} From 47c62051ee02f08df32b8dd859de9156f1b2bc4e Mon Sep 17 00:00:00 2001 From: Ryan Christian Date: Thu, 5 Feb 2026 23:52:52 -0600 Subject: [PATCH 2/4] chore: Revert unnecessary changes --- src/plugins/prerender-plugin.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/plugins/prerender-plugin.js b/src/plugins/prerender-plugin.js index b1b2ed3..215fd8c 100644 --- a/src/plugins/prerender-plugin.js +++ b/src/plugins/prerender-plugin.js @@ -420,12 +420,10 @@ export function prerenderPlugin({ prerenderScript, renderTarget, additionalPrere } catch {} } - /** @type {import('./types.d.ts').PrerenderResult | string} */ + /** @type {import('./types.d.ts').PrerenderResult} */ let result; try { - /** @type {import('./types.d.ts').PrerenderOptions} */ - const options = { ssr: true, url: route.url, route }; - result = await prerender(options); + result = await prerender({ ssr: true, url: route.url, route }); } catch (e) { const message = await handlePrerenderError(e); this.error(message); @@ -441,7 +439,7 @@ export function prerenderPlugin({ prerenderScript, renderTarget, additionalPrere head = { lang: '', title: '', elements: new Set() }; // Add any discovered links to the list of routes to pre-render: - if (typeof result === 'object' && result.links) { + if (result.links) { for (let url of result.links) { const parsed = new URL(url, 'http://localhost'); url = parsed.pathname.replace(/\/$/, '') || '/'; From 4d9886fd1763cd8374b8d05177da61b772f505b9 Mon Sep 17 00:00:00 2001 From: Ryan Christian Date: Thu, 5 Feb 2026 23:53:04 -0600 Subject: [PATCH 3/4] fix: Correct & re-export types --- src/index.d.ts | 2 ++ src/plugins/types.d.ts | 13 +++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/index.d.ts b/src/index.d.ts index ac11103..bd5f476 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -13,3 +13,5 @@ export interface PreviewMiddlewareOptions { export type Options = PrerenderOptions & PreviewMiddlewareOptions; export function vitePrerenderPlugin(options?: Options): Plugin[]; + +export type { PrerenderArguments, PrerenderResult } from './plugins/types.d.ts'; diff --git a/src/plugins/types.d.ts b/src/plugins/types.d.ts index d21d31f..7f4dc80 100644 --- a/src/plugins/types.d.ts +++ b/src/plugins/types.d.ts @@ -15,18 +15,15 @@ export interface PrerenderedRoute { _discoveredBy?: PrerenderedRoute; } -export interface PrerenderOptions { +export interface PrerenderArguments { ssr: true; url: string; route: PrerenderedRoute; } -export interface PrerenderResult { - html?: string; - head?: Partial; +export type PrerenderResult = { + html: string; links?: Set; - /** - * @description Caution: should be a valid JSON object - */ data?: any; -} + head?: Partial; +} | string From 2b4bc8473fccf1afbf741f165728c675800bd4b2 Mon Sep 17 00:00:00 2001 From: Ryan Christian Date: Thu, 5 Feb 2026 23:53:24 -0600 Subject: [PATCH 4/4] chore: Ensure TS LSP raises errors on `.d.ts` files --- jsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jsconfig.json b/jsconfig.json index b6cd47d..9e05e54 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -6,6 +6,7 @@ "allowJs": true, "checkJs": true, "resolveJsonModule": true, - "noEmit": true + "noEmit": true, + "skipLibCheck": false } }