Skip to content

Commit

Permalink
feat(better-define): support vite hmr
Browse files Browse the repository at this point in the history
closes #153
  • Loading branch information
sxzz committed Nov 20, 2022
1 parent 2b42db8 commit c7a60bf
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 4 deletions.
5 changes: 5 additions & 0 deletions .changeset/few-pigs-switch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@vue-macros/better-define': minor
---

support vite hmr
46 changes: 43 additions & 3 deletions packages/better-define/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ import { existsSync } from 'node:fs'
import { createUnplugin } from 'unplugin'
import { createFilter } from '@rollup/pluginutils'
import { REGEX_SETUP_SFC, REGEX_VUE_SFC } from '@vue-macros/common'
import { setResolveTSFileIdImpl } from '@vue-macros/api'
import { setResolveTSFileIdImpl, tsFileCache } from '@vue-macros/api'
import { transformBetterDefine } from './core'
import type { ModuleNode } from 'vite'
import type { ResolveTSFileIdImpl } from '@vue-macros/api'
import type { PluginContext } from 'rollup'
import type { FilterPattern } from '@rollup/pluginutils'
Expand Down Expand Up @@ -32,6 +33,20 @@ export default createUnplugin<Options | undefined>((userOptions = {}, meta) => {
const options = resolveOptions(userOptions)
const filter = createFilter(options.include, options.exclude)

const referencedFiles = new Map<
string /* file */,
Set<string /* importer */>
>()

function collectReferencedFile(importer: string, file: string) {
if (!importer) return
if (!referencedFiles.has(file)) {
referencedFiles.set(file, new Set([importer]))
} else {
referencedFiles.get(file)!.add(importer)
}
}

return {
name,
enforce: 'pre',
Expand All @@ -42,10 +57,16 @@ export default createUnplugin<Options | undefined>((userOptions = {}, meta) => {
const resolveFn: ResolveTSFileIdImpl = async (id, importer) => {
let resolved = (await ctx.resolve(id, importer))?.id
if (!resolved) return
if (existsSync(resolved)) return resolved
if (existsSync(resolved)) {
collectReferencedFile(importer, resolved)
return resolved
}

resolved = (await ctx.resolve(resolved))?.id
if (resolved && existsSync(resolved)) return resolved
if (resolved && existsSync(resolved)) {
collectReferencedFile(importer, resolved)
return resolved
}
}
setResolveTSFileIdImpl(resolveFn)
}
Expand All @@ -68,6 +89,25 @@ export default createUnplugin<Options | undefined>((userOptions = {}, meta) => {
configResolved(config) {
options.isProduction = config.isProduction
},

handleHotUpdate({ file, server }) {
function getAffectedModules(file: string): Set<ModuleNode> {
if (!referencedFiles.has(file)) return new Set([])
const modules = new Set<ModuleNode>([])
for (const importer of referencedFiles.get(file)!) {
const mods = server.moduleGraph.getModulesByFile(importer)
if (mods) mods.forEach((m) => modules.add(m))

getAffectedModules(importer).forEach((m) => modules.add(m))
}
return modules
}

if (tsFileCache[file]) delete tsFileCache[file]

const modules = getAffectedModules(file)
return Array.from(modules)
},
},
}
})
3 changes: 3 additions & 0 deletions playground/vue3/src/examples/better-define/another-types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export type AnotherType = {
baz: string
}
4 changes: 3 additions & 1 deletion playground/vue3/src/examples/better-define/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import type { AnotherType } from './another-types'

export type Str = string
export interface BaseProps {
export interface BaseProps extends AnotherType {
name: Str
age: number
}
Expand Down

0 comments on commit c7a60bf

Please sign in to comment.