import { promises as fs } from 'node:fs'; | |
import path from 'node:path'; | |
// List of options that changes the prebundling result | |
/** @type {(keyof import('../types/options.d.ts').ResolvedOptions)[]} */ | |
const PREBUNDLE_SENSITIVE_OPTIONS = [ | |
'compilerOptions', | |
'configFile', | |
'experimental', | |
'extensions', | |
'ignorePluginPreprocessors', | |
'preprocess' | |
]; | |
/** | |
* @param {string} cacheDir | |
* @param {import('../types/options.d.ts').ResolvedOptions} options | |
* @returns {Promise<boolean>} Whether the Svelte metadata has changed | |
*/ | |
export async function saveSvelteMetadata(cacheDir, options) { | |
const svelteMetadata = generateSvelteMetadata(options); | |
const svelteMetadataPath = path.resolve(cacheDir, '_svelte_metadata.json'); | |
const currentSvelteMetadata = JSON.stringify(svelteMetadata, (_, value) => { | |
// Handle preprocessors | |
return typeof value === 'function' ? value.toString() : value; | |
}); | |
/** @type {string | undefined} */ | |
let existingSvelteMetadata; | |
try { | |
existingSvelteMetadata = await fs.readFile(svelteMetadataPath, 'utf8'); | |
} catch { | |
// ignore | |
} | |
await fs.mkdir(cacheDir, { recursive: true }); | |
await fs.writeFile(svelteMetadataPath, currentSvelteMetadata); | |
return currentSvelteMetadata !== existingSvelteMetadata; | |
} | |
/** | |
* @param {import('../types/options.d.ts').ResolvedOptions} options | |
* @returns {Partial<import('../types/options.d.ts').ResolvedOptions>} | |
*/ | |
function generateSvelteMetadata(options) { | |
/** @type {Record<string, any>} */ | |
const metadata = {}; | |
for (const key of PREBUNDLE_SENSITIVE_OPTIONS) { | |
metadata[key] = options[key]; | |
} | |
return metadata; | |
} | |