Skip to content

Commit

Permalink
fix: Vue SFC filter for vue-loader
Browse files Browse the repository at this point in the history
revert #347, but remove `version === 2`
  • Loading branch information
sxzz committed Nov 28, 2023
1 parent 035012e commit 10a1306
Show file tree
Hide file tree
Showing 23 changed files with 317 additions and 259 deletions.
26 changes: 14 additions & 12 deletions packages/better-define/src/index.ts
@@ -1,12 +1,11 @@
import { createUnplugin } from 'unplugin'
import { type UnpluginContextMeta, createUnplugin } from 'unplugin'
import {
type BaseOptions,
FilterFileType,
type MarkRequired,
REGEX_SETUP_SFC,
REGEX_VUE_SFC,
REGEX_VUE_SUB,
createFilter,
detectVueVersion,
getFilterPattern,
} from '@vue-macros/common'
import { RollupResolve, setResolveTSFileIdImpl } from '@vue-macros/api'
import { generatePluginName } from '#macros' assert { type: 'macro' }
Expand All @@ -22,11 +21,17 @@ export type OptionsResolved = MarkRequired<
'include' | 'version' | 'isProduction'
>

function resolveOptions(options: Options): OptionsResolved {
function resolveOptions(
options: Options,
framework: UnpluginContextMeta['framework'],
): OptionsResolved {
const version = options.version || detectVueVersion()

const include = getFilterPattern(
[FilterFileType.VUE_SFC_WITH_SETUP, FilterFileType.SETUP_SFC],
framework,
)
return {
include: [REGEX_VUE_SFC, REGEX_SETUP_SFC, REGEX_VUE_SUB],
include,
isProduction: process.env.NODE_ENV === 'production',
...options,
version,
Expand All @@ -37,7 +42,7 @@ const name = generatePluginName()

export default createUnplugin<Options | undefined, false>(
(userOptions = {}, { framework }) => {
const options = resolveOptions(userOptions)
const options = resolveOptions(userOptions, framework)
const filter = createFilter(options)

const { resolve, handleHotUpdate } = RollupResolve()
Expand All @@ -52,10 +57,7 @@ export default createUnplugin<Options | undefined, false>(
}
},

transformInclude(id) {
return filter(id)
},

transformInclude: filter,
async transform(code, id) {
try {
return await transformBetterDefine(code, id, options.isProduction)
Expand Down
32 changes: 16 additions & 16 deletions packages/chain-call/src/index.ts
@@ -1,23 +1,29 @@
import { createUnplugin } from 'unplugin'
import { type UnpluginContextMeta, createUnplugin } from 'unplugin'
import {
type BaseOptions,
FilterFileType,
type MarkRequired,
REGEX_SETUP_SFC,
REGEX_VUE_SFC,
REGEX_VUE_SUB,
createFilter,
detectVueVersion,
getFilterPattern,
} from '@vue-macros/common'
import { generatePluginName } from '#macros' assert { type: 'macro' }
import { transformChainCall } from './core'

export type Options = BaseOptions
export type OptionsResolved = MarkRequired<Options, 'include' | 'version'>

function resolveOption(options: Options): OptionsResolved {
function resolveOptions(
options: Options,
framework: UnpluginContextMeta['framework'],
): OptionsResolved {
const version = options.version || detectVueVersion()
const include = getFilterPattern(
[FilterFileType.VUE_SFC_WITH_SETUP, FilterFileType.SETUP_SFC],
framework,
)
return {
include: [REGEX_VUE_SFC, REGEX_SETUP_SFC, REGEX_VUE_SUB],
include,
...options,
version,
}
Expand All @@ -26,21 +32,15 @@ function resolveOption(options: Options): OptionsResolved {
const name = generatePluginName()

export default createUnplugin<Options | undefined, false>(
(userOptions = {}) => {
const options = resolveOption(userOptions)
(userOptions = {}, { framework }) => {
const options = resolveOptions(userOptions, framework)
const filter = createFilter(options)

return {
name,
enforce: 'pre',

transformInclude(id) {
return filter(id)
},

transform(code, id) {
return transformChainCall(code, id)
},
transformInclude: filter,
transform: transformChainCall,
}
},
)
5 changes: 5 additions & 0 deletions packages/common/src/constants.ts
Expand Up @@ -22,7 +22,12 @@ export const REGEX_SETUP_SFC = /\.setup\.[cm]?[jt]sx?$/
export const REGEX_SETUP_SFC_SUB = /\.setup\.[cm]?[jt]sx?((?!vue&).)*$/

export const REGEX_VUE_SFC = /\.vue$/

/** webpack only */
export const REGEX_VUE_SUB = /\.vue\?vue&type=script/
/** webpack only */
export const REGEX_VUE_SUB_SETUP = /\.vue\?vue&type=script&setup=true/

export const REGEX_NODE_MODULES = /node_modules/
export const REGEX_SUPPORTED_EXT = /\.([cm]?[jt]sx?|vue)$/

Expand Down
43 changes: 42 additions & 1 deletion packages/common/src/unplugin.ts
Expand Up @@ -3,6 +3,13 @@ import {
createFilter as createRollupFilter,
} from '@rollup/pluginutils'
import { generateTransform } from 'magic-string-ast'
import {
REGEX_SETUP_SFC,
REGEX_SRC_FILE,
REGEX_VUE_SFC,
REGEX_VUE_SUB,
REGEX_VUE_SUB_SETUP,
} from './constants'
import type { ResolvedOptions } from '@vitejs/plugin-vue'
import type { Plugin } from 'rollup'
import type { Plugin as VitePlugin } from 'vite'
Expand All @@ -20,7 +27,10 @@ export function createFilter(options: BaseOptions) {
return createRollupFilter(options.include, options.exclude)
}

export { normalizePath } from '@rollup/pluginutils'
export {
normalizePath,
createFilter as createRollupFilter,
} from '@rollup/pluginutils'

export interface VuePluginApi {
options: ResolvedOptions
Expand Down Expand Up @@ -54,3 +64,34 @@ export function getVuePluginApi(

return api
}

export enum FilterFileType {
/** Vue SFC */
VUE_SFC,
/** Vue SFC with `<script setup>` */
VUE_SFC_WITH_SETUP,
/** foo.setup.tsx */
SETUP_SFC,
/** Source files */
SRC_FILE,
}

export function getFilterPattern(
types: FilterFileType[],
framework?: string,
): RegExp[] {
const filter: RegExp[] = []
if (types.includes(FilterFileType.VUE_SFC)) {
filter.push(framework === 'webpack' ? REGEX_VUE_SUB : REGEX_VUE_SFC)
}
if (types.includes(FilterFileType.VUE_SFC_WITH_SETUP)) {
filter.push(framework === 'webpack' ? REGEX_VUE_SUB_SETUP : REGEX_VUE_SFC)
}
if (types.includes(FilterFileType.SETUP_SFC)) {
filter.push(REGEX_SETUP_SFC)
}
if (types.includes(FilterFileType.SRC_FILE)) {
filter.push(REGEX_SRC_FILE)
}
return filter
}
29 changes: 15 additions & 14 deletions packages/define-emit/src/index.ts
@@ -1,12 +1,11 @@
import { createUnplugin } from 'unplugin'
import { type UnpluginContextMeta, createUnplugin } from 'unplugin'
import {
type BaseOptions,
FilterFileType,
type MarkRequired,
REGEX_SETUP_SFC,
REGEX_VUE_SFC,
REGEX_VUE_SUB,
createFilter,
detectVueVersion,
getFilterPattern,
} from '@vue-macros/common'
import { RollupResolve, setResolveTSFileIdImpl } from '@vue-macros/api'
import { generatePluginName } from '#macros' assert { type: 'macro' }
Expand All @@ -22,10 +21,17 @@ export type OptionsResolved = MarkRequired<
'include' | 'version' | 'isProduction'
>

function resolveOption(options: Options): OptionsResolved {
function resolveOptions(
options: Options,
framework: UnpluginContextMeta['framework'],
): OptionsResolved {
const version = options.version || detectVueVersion()
const include = getFilterPattern(
[FilterFileType.VUE_SFC_WITH_SETUP, FilterFileType.SETUP_SFC],
framework,
)
return {
include: [REGEX_VUE_SFC, REGEX_SETUP_SFC, REGEX_VUE_SUB],
include,
isProduction: process.env.NODE_ENV === 'production',
...options,
version,
Expand All @@ -36,7 +42,7 @@ const name = generatePluginName()

export default createUnplugin<Options | undefined, false>(
(userOptions = {}, { framework }) => {
const options = resolveOption(userOptions)
const options = resolveOptions(userOptions, framework)
const filter = createFilter(options)
const { resolve, handleHotUpdate } = RollupResolve()

Expand All @@ -50,13 +56,8 @@ export default createUnplugin<Options | undefined, false>(
}
},

transformInclude(id) {
return filter(id)
},

transform(code, id) {
return transformDefineEmit(code, id)
},
transformInclude: filter,
transform: transformDefineEmit,

vite: {
configResolved(config) {
Expand Down
27 changes: 15 additions & 12 deletions packages/define-models/src/index.ts
@@ -1,12 +1,11 @@
import { createUnplugin } from 'unplugin'
import { type UnpluginContextMeta, createUnplugin } from 'unplugin'
import {
type BaseOptions,
FilterFileType,
type MarkRequired,
REGEX_SETUP_SFC,
REGEX_VUE_SFC,
REGEX_VUE_SUB,
createFilter,
detectVueVersion,
getFilterPattern,
normalizePath,
} from '@vue-macros/common'
import { generatePluginName } from '#macros' assert { type: 'macro' }
Expand All @@ -33,10 +32,17 @@ export type OptionsResolved = MarkRequired<
'include' | 'version' | 'unified'
>

function resolveOption(options: Options): OptionsResolved {
function resolveOptions(
options: Options,
framework: UnpluginContextMeta['framework'],
): OptionsResolved {
const version = options.version || detectVueVersion()
const include = getFilterPattern(
[FilterFileType.VUE_SFC_WITH_SETUP, FilterFileType.SETUP_SFC],
framework,
)
return {
include: [REGEX_VUE_SFC, REGEX_SETUP_SFC, REGEX_VUE_SUB],
include,
unified: true,
...options,
version,
Expand All @@ -46,8 +52,8 @@ function resolveOption(options: Options): OptionsResolved {
const name = generatePluginName()

export default createUnplugin<Options | undefined, false>(
(userOptions = {}) => {
const options = resolveOption(userOptions)
(userOptions = {}, { framework }) => {
const options = resolveOptions(userOptions, framework)
const filter = createFilter(options)

return {
Expand All @@ -68,10 +74,7 @@ export default createUnplugin<Options | undefined, false>(
else if (id === useVmodelHelperId) return useVmodelHelperCode
},

transformInclude(id) {
return filter(id)
},

transformInclude: filter,
transform(code, id) {
return transformDefineModels(code, id, options.version, options.unified)
},
Expand Down
32 changes: 16 additions & 16 deletions packages/define-options/src/index.ts
@@ -1,23 +1,29 @@
import { createUnplugin } from 'unplugin'
import { type UnpluginContextMeta, createUnplugin } from 'unplugin'
import {
type BaseOptions,
FilterFileType,
type MarkRequired,
REGEX_SETUP_SFC,
REGEX_VUE_SFC,
REGEX_VUE_SUB,
createFilter,
detectVueVersion,
getFilterPattern,
} from '@vue-macros/common'
import { generatePluginName } from '#macros' assert { type: 'macro' }
import { transformDefineOptions } from './core'

export type Options = BaseOptions
export type OptionsResolved = MarkRequired<Options, 'include' | 'version'>

function resolveOption(options: Options): OptionsResolved {
function resolveOptions(
options: Options,
framework: UnpluginContextMeta['framework'],
): OptionsResolved {
const version = options.version || detectVueVersion()
const include = getFilterPattern(
[FilterFileType.VUE_SFC_WITH_SETUP, FilterFileType.SETUP_SFC],
framework,
)
return {
include: [REGEX_VUE_SFC, REGEX_SETUP_SFC, REGEX_VUE_SUB],
include,
...options,
version,
}
Expand All @@ -26,21 +32,15 @@ function resolveOption(options: Options): OptionsResolved {
const name = generatePluginName()

export default createUnplugin<Options | undefined, false>(
(userOptions = {}) => {
const options = resolveOption(userOptions)
(userOptions = {}, { framework }) => {
const options = resolveOptions(userOptions, framework)
const filter = createFilter(options)

return {
name,
enforce: 'pre',

transformInclude(id) {
return filter(id)
},

transform(code, id) {
return transformDefineOptions(code, id)
},
transformInclude: filter,
transform: transformDefineOptions,
}
},
)
Expand Down

0 comments on commit 10a1306

Please sign in to comment.