94 lines
3.1 KiB
JavaScript
94 lines
3.1 KiB
JavaScript
|
function debounce(fn, delay) {
|
||
|
let handle
|
||
|
return () => {
|
||
|
clearTimeout(handle)
|
||
|
handle = setTimeout(fn, delay)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* eslint-disable no-undef */
|
||
|
const hooks = []
|
||
|
window.__registerBeforePerformReactRefresh = (cb) => {
|
||
|
hooks.push(cb)
|
||
|
}
|
||
|
const enqueueUpdate = debounce(async () => {
|
||
|
if (hooks.length) await Promise.all(hooks.map((cb) => cb()))
|
||
|
exports.performReactRefresh()
|
||
|
}, 16)
|
||
|
|
||
|
// Taken from https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/main/lib/runtime/RefreshUtils.js#L141
|
||
|
// This allows to resister components not detected by SWC like styled component
|
||
|
function registerExportsForReactRefresh(filename, moduleExports) {
|
||
|
for (const key in moduleExports) {
|
||
|
if (key === '__esModule') continue
|
||
|
const exportValue = moduleExports[key]
|
||
|
if (exports.isLikelyComponentType(exportValue)) {
|
||
|
// 'export' is required to avoid key collision when renamed exports that
|
||
|
// shadow a local component name: https://github.com/vitejs/vite-plugin-react/issues/116
|
||
|
// The register function has an identity check to not register twice the same component,
|
||
|
// so this is safe to not used the same key here.
|
||
|
exports.register(exportValue, filename + ' export ' + key)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function validateRefreshBoundaryAndEnqueueUpdate(id, prevExports, nextExports) {
|
||
|
const ignoredExports = window.__getReactRefreshIgnoredExports?.({ id }) ?? []
|
||
|
if (
|
||
|
predicateOnExport(
|
||
|
ignoredExports,
|
||
|
prevExports,
|
||
|
(key) => key in nextExports,
|
||
|
) !== true
|
||
|
) {
|
||
|
return 'Could not Fast Refresh (export removed)'
|
||
|
}
|
||
|
if (
|
||
|
predicateOnExport(
|
||
|
ignoredExports,
|
||
|
nextExports,
|
||
|
(key) => key in prevExports,
|
||
|
) !== true
|
||
|
) {
|
||
|
return 'Could not Fast Refresh (new export)'
|
||
|
}
|
||
|
|
||
|
let hasExports = false
|
||
|
const allExportsAreComponentsOrUnchanged = predicateOnExport(
|
||
|
ignoredExports,
|
||
|
nextExports,
|
||
|
(key, value) => {
|
||
|
hasExports = true
|
||
|
if (exports.isLikelyComponentType(value)) return true
|
||
|
return prevExports[key] === nextExports[key]
|
||
|
},
|
||
|
)
|
||
|
if (hasExports && allExportsAreComponentsOrUnchanged === true) {
|
||
|
enqueueUpdate()
|
||
|
} else {
|
||
|
return `Could not Fast Refresh ("${allExportsAreComponentsOrUnchanged}" export is incompatible). Learn more at https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#consistent-components-exports`
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function predicateOnExport(ignoredExports, moduleExports, predicate) {
|
||
|
for (const key in moduleExports) {
|
||
|
if (key === '__esModule') continue
|
||
|
if (ignoredExports.includes(key)) continue
|
||
|
const desc = Object.getOwnPropertyDescriptor(moduleExports, key)
|
||
|
if (desc && desc.get) return key
|
||
|
if (!predicate(key, moduleExports[key])) return key
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// Hides vite-ignored dynamic import so that Vite can skip analysis if no other
|
||
|
// dynamic import is present (https://github.com/vitejs/vite/pull/12732)
|
||
|
function __hmr_import(module) {
|
||
|
return import(/* @vite-ignore */ module)
|
||
|
}
|
||
|
|
||
|
exports.__hmr_import = __hmr_import
|
||
|
exports.registerExportsForReactRefresh = registerExportsForReactRefresh
|
||
|
exports.validateRefreshBoundaryAndEnqueueUpdate =
|
||
|
validateRefreshBoundaryAndEnqueueUpdate
|