|
import fs from 'node:fs'; |
|
import { log } from './log.js'; |
|
import { knownSvelteConfigNames } from './load-svelte-config.js'; |
|
import path from 'node:path'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function setupWatchers(options, cache, requestParser) { |
|
const { server, configFile: svelteConfigFile } = options; |
|
if (!server) { |
|
return; |
|
} |
|
const { watcher, ws } = server; |
|
const { root, server: serverConfig } = server.config; |
|
|
|
const emitChangeEventOnDependants = (filename) => { |
|
const dependants = cache.getDependants(filename); |
|
dependants.forEach((dependant) => { |
|
if (fs.existsSync(dependant)) { |
|
log.debug( |
|
`emitting virtual change event for "${dependant}" because depdendency "${filename}" changed`, |
|
undefined, |
|
'hmr' |
|
); |
|
watcher.emit('change', dependant); |
|
} |
|
}); |
|
}; |
|
|
|
const removeUnlinkedFromCache = (filename) => { |
|
const svelteRequest = requestParser(filename, false); |
|
if (svelteRequest) { |
|
const removedFromCache = cache.remove(svelteRequest); |
|
if (removedFromCache) { |
|
log.debug(`cleared VitePluginSvelteCache for deleted file ${filename}`, undefined, 'hmr'); |
|
} |
|
} |
|
}; |
|
|
|
const triggerViteRestart = (filename) => { |
|
if (serverConfig.middlewareMode) { |
|
|
|
|
|
const message = |
|
'Svelte config change detected, restart your dev process to apply the changes.'; |
|
log.info(message, filename); |
|
ws.send({ |
|
type: 'error', |
|
err: { message, stack: '', plugin: 'vite-plugin-svelte', id: filename } |
|
}); |
|
} else { |
|
log.info(`svelte config changed: restarting vite server. - file: ${filename}`); |
|
server.restart(); |
|
} |
|
}; |
|
|
|
|
|
|
|
const listenerCollection = { |
|
add: [], |
|
change: [emitChangeEventOnDependants], |
|
unlink: [removeUnlinkedFromCache, emitChangeEventOnDependants] |
|
}; |
|
|
|
if (svelteConfigFile !== false) { |
|
|
|
const possibleSvelteConfigs = knownSvelteConfigNames.map((cfg) => path.join(root, cfg)); |
|
|
|
const restartOnConfigAdd = (filename) => { |
|
if (possibleSvelteConfigs.includes(filename)) { |
|
triggerViteRestart(filename); |
|
} |
|
}; |
|
|
|
|
|
const restartOnConfigChange = (filename) => { |
|
if (filename === svelteConfigFile) { |
|
triggerViteRestart(filename); |
|
} |
|
}; |
|
|
|
if (svelteConfigFile) { |
|
listenerCollection.change.push(restartOnConfigChange); |
|
listenerCollection.unlink.push(restartOnConfigChange); |
|
} else { |
|
listenerCollection.add.push(restartOnConfigAdd); |
|
} |
|
} |
|
|
|
Object.entries(listenerCollection).forEach(([evt, listeners]) => { |
|
if (listeners.length > 0) { |
|
watcher.on(evt, (filename) => listeners.forEach((listener) => listener(filename))); |
|
} |
|
}); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function ensureWatchedFile(watcher, file, root) { |
|
if ( |
|
file && |
|
|
|
!file.startsWith(root + '/') && |
|
|
|
!file.includes('\0') && |
|
fs.existsSync(file) |
|
) { |
|
|
|
watcher.add(path.resolve(file)); |
|
} |
|
} |
|
|