diff --git a/.changeset/brave-badgers-cheer.md b/.changeset/brave-badgers-cheer.md
new file mode 100644
index 000000000..f47434bdd
--- /dev/null
+++ b/.changeset/brave-badgers-cheer.md
@@ -0,0 +1,6 @@
+---
+'@vue-macros/jsx-directive': minor
+'unplugin-vue-macros': minor
+---
+
+add jsx-directive plugin
diff --git a/docs/.vitepress/locales/common.ts b/docs/.vitepress/locales/common.ts
index bbb673244..f51d8dfa2 100644
--- a/docs/.vitepress/locales/common.ts
+++ b/docs/.vitepress/locales/common.ts
@@ -173,6 +173,10 @@ export const sidebar = (lang: string): DefaultTheme.SidebarItem[] => {
text: 'exportExpose',
link: `${urlPrefix}/features/export-expose`,
},
+ {
+ text: 'jsxDirective',
+ link: `${urlPrefix}/features/jsx-directive`,
+ },
],
},
],
diff --git a/docs/features/jsx-directive.md b/docs/features/jsx-directive.md
new file mode 100644
index 000000000..f8fc5b2f7
--- /dev/null
+++ b/docs/features/jsx-directive.md
@@ -0,0 +1,37 @@
+# jsxDirective
+
+
+
+`v-if` and `v-for` directive for jsx.
+
+| Features | Supported |
+| :----------: | :----------------: |
+| Vue 3 | :white_check_mark: |
+| Nuxt 3 | :white_check_mark: |
+| Vue 2 | :white_check_mark: |
+| Volar(v-for) | :x: |
+
+## Usage
+
+```vue
+
+```
diff --git a/docs/zh-CN/features/jsx-directive.md b/docs/zh-CN/features/jsx-directive.md
new file mode 100644
index 000000000..f8fc5b2f7
--- /dev/null
+++ b/docs/zh-CN/features/jsx-directive.md
@@ -0,0 +1,37 @@
+# jsxDirective
+
+
+
+`v-if` and `v-for` directive for jsx.
+
+| Features | Supported |
+| :----------: | :----------------: |
+| Vue 3 | :white_check_mark: |
+| Nuxt 3 | :white_check_mark: |
+| Vue 2 | :white_check_mark: |
+| Volar(v-for) | :x: |
+
+## Usage
+
+```vue
+
+```
diff --git a/packages/jsx-directive/README.md b/packages/jsx-directive/README.md
new file mode 100644
index 000000000..f1aaec9a7
--- /dev/null
+++ b/packages/jsx-directive/README.md
@@ -0,0 +1,3 @@
+# @vue-macros/jsx-directive [](https://npmjs.com/package/@vue-macros/jsx-directive)
+
+Please refer to [README.md](https://github.com/sxzz/vue-macros#readme)
diff --git a/packages/jsx-directive/package.json b/packages/jsx-directive/package.json
new file mode 100644
index 000000000..84d3556f8
--- /dev/null
+++ b/packages/jsx-directive/package.json
@@ -0,0 +1,118 @@
+{
+ "name": "@vue-macros/jsx-directive",
+ "version": "0.0.0",
+ "packageManager": "pnpm@8.6.7",
+ "description": "jsx-directive feature from Vue Macros.",
+ "keywords": [
+ "vue-macros",
+ "macros",
+ "vue",
+ "sfc",
+ "setup",
+ "script-setup",
+ "jsx-directive",
+ "unplugin"
+ ],
+ "license": "MIT",
+ "homepage": "https://github.com/sxzz/vue-macros#readme",
+ "bugs": {
+ "url": "https://github.com/sxzz/vue-macros/issues"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sxzz/vue-macros.git",
+ "directory": "packages/jsx-directive"
+ },
+ "author": "zhiyuanzmj",
+ "contributors": [
+ "三咲智子 "
+ ],
+ "files": [
+ "dist"
+ ],
+ "main": "dist/index.js",
+ "module": "dist/index.mjs",
+ "types": "dist/index.d.ts",
+ "exports": {
+ ".": {
+ "dev": "./src/index.ts",
+ "types": {
+ "require": "./dist/index.d.ts",
+ "import": "./dist/index.d.mts"
+ },
+ "require": "./dist/index.js",
+ "import": "./dist/index.mjs"
+ },
+ "./api": {
+ "dev": "./src/api.ts",
+ "types": {
+ "require": "./dist/api.d.ts",
+ "import": "./dist/api.d.mts"
+ },
+ "require": "./dist/api.js",
+ "import": "./dist/api.mjs"
+ },
+ "./esbuild": {
+ "dev": "./src/esbuild.ts",
+ "types": {
+ "require": "./dist/esbuild.d.ts",
+ "import": "./dist/esbuild.d.mts"
+ },
+ "require": "./dist/esbuild.js",
+ "import": "./dist/esbuild.mjs"
+ },
+ "./rollup": {
+ "dev": "./src/rollup.ts",
+ "types": {
+ "require": "./dist/rollup.d.ts",
+ "import": "./dist/rollup.d.mts"
+ },
+ "require": "./dist/rollup.js",
+ "import": "./dist/rollup.mjs"
+ },
+ "./vite": {
+ "dev": "./src/vite.ts",
+ "types": {
+ "require": "./dist/vite.d.ts",
+ "import": "./dist/vite.d.mts"
+ },
+ "require": "./dist/vite.js",
+ "import": "./dist/vite.mjs"
+ },
+ "./webpack": {
+ "dev": "./src/webpack.ts",
+ "types": {
+ "require": "./dist/webpack.d.ts",
+ "import": "./dist/webpack.d.mts"
+ },
+ "require": "./dist/webpack.js",
+ "import": "./dist/webpack.mjs"
+ },
+ "./*": [
+ "./*",
+ "./*.d.ts"
+ ]
+ },
+ "typesVersions": {
+ "*": {
+ "*": [
+ "./dist/*",
+ "./*"
+ ]
+ }
+ },
+ "scripts": {
+ "build": "tsup && tsx ../../scripts/postbuild.ts",
+ "dev": "DEV=true tsup"
+ },
+ "dependencies": {
+ "@vue-macros/common": "workspace:~",
+ "unplugin": "^1.3.1"
+ },
+ "devDependencies": {
+ "vue": "^3.3.4"
+ },
+ "engines": {
+ "node": ">=16.14.0"
+ }
+}
diff --git a/packages/jsx-directive/src/api.ts b/packages/jsx-directive/src/api.ts
new file mode 100644
index 000000000..46d458ad7
--- /dev/null
+++ b/packages/jsx-directive/src/api.ts
@@ -0,0 +1 @@
+export * from './core'
diff --git a/packages/jsx-directive/src/core/index.ts b/packages/jsx-directive/src/core/index.ts
new file mode 100644
index 000000000..7aeffc440
--- /dev/null
+++ b/packages/jsx-directive/src/core/index.ts
@@ -0,0 +1,42 @@
+import { type Program } from '@babel/types'
+import {
+ MagicString,
+ babelParse,
+ getLang,
+ getTransformResult,
+ parseSFC,
+} from '@vue-macros/common'
+import { vIfTransform } from './v-if'
+import { vForTransform } from './v-for'
+
+export function transformJsxVueDirective(code: string, id: string) {
+ const lang = getLang(id)
+ let asts: {
+ ast: Program
+ offset: number
+ }[] = []
+ if (lang === 'vue') {
+ const { scriptSetup, getSetupAst, script, getScriptAst } = parseSFC(
+ code,
+ id
+ )
+ if (script) {
+ asts.push({ ast: getScriptAst()!, offset: script.loc.start.offset })
+ }
+ if (scriptSetup) {
+ asts.push({ ast: getSetupAst()!, offset: scriptSetup.loc.start.offset })
+ }
+ } else if (['jsx', 'tsx'].includes(lang)) {
+ asts = [{ ast: babelParse(code, lang), offset: 0 }]
+ } else {
+ return
+ }
+
+ const s = new MagicString(code)
+ for (const { ast, offset } of asts) {
+ vIfTransform(ast, s, offset)
+ vForTransform(ast, s, offset)
+ }
+
+ return getTransformResult(s, id)
+}
diff --git a/packages/jsx-directive/src/core/v-for.ts b/packages/jsx-directive/src/core/v-for.ts
new file mode 100644
index 000000000..3f91b3551
--- /dev/null
+++ b/packages/jsx-directive/src/core/v-for.ts
@@ -0,0 +1,50 @@
+import {
+ type JSXAttribute,
+ type JSXElement,
+ type Node,
+ type Program,
+} from '@babel/types'
+import { type MagicString, walkAST } from '@vue-macros/common'
+
+export function vForTransform(ast: Program, s: MagicString, offset = 0) {
+ if (!s.sliceNode(ast, { offset }).includes('v-for')) return
+
+ const nodes: {
+ node: JSXElement
+ attribute: JSXAttribute
+ }[] = []
+
+ walkAST(ast, {
+ enter(node) {
+ if (node.type !== 'JSXElement') return
+
+ const attribute = node.openingElement.attributes.find(
+ (i): i is JSXAttribute =>
+ i.type === 'JSXAttribute' && ['v-for'].includes(`${i.name.name}`)
+ )
+ if (attribute) {
+ nodes.push({
+ node,
+ attribute,
+ })
+ }
+ },
+ })
+
+ nodes.forEach(({ node, attribute }) => {
+ if (`${attribute.name.name}` === 'v-for') {
+ if (!attribute.value) return
+ const [i, list] = s
+ .slice(
+ attribute.value.start! + offset + 1,
+ attribute.value.end! + offset - 1
+ )
+ .split(/\s+in\s+/)
+
+ s.appendLeft(node.start! + offset, ` { ${list}.map(${i}=> `)
+
+ s.appendRight(node.end! + offset, ') }')
+ s.remove(attribute.start! + offset - 1, attribute.end! + offset)
+ }
+ })
+}
diff --git a/packages/jsx-directive/src/core/v-if.ts b/packages/jsx-directive/src/core/v-if.ts
new file mode 100644
index 000000000..d9f52120b
--- /dev/null
+++ b/packages/jsx-directive/src/core/v-if.ts
@@ -0,0 +1,63 @@
+import {
+ type JSXAttribute,
+ type JSXElement,
+ type Node,
+ type Program,
+} from '@babel/types'
+import { type MagicString, walkAST } from '@vue-macros/common'
+
+export function vIfTransform(ast: Program, s: MagicString, offset = 0) {
+ if (!s.sliceNode(ast, { offset }).includes('v-if')) return
+
+ const nodeMap = new Map<
+ Node,
+ {
+ node: JSXElement
+ attribute: JSXAttribute
+ }[]
+ >()
+
+ walkAST(ast, {
+ enter(node, parent) {
+ if (node.type !== 'JSXElement') return
+
+ const attribute = node.openingElement.attributes.find(
+ (i) =>
+ i.type === 'JSXAttribute' &&
+ ['v-if', 'v-else-if', 'v-else'].includes(`${i.name.name}`)
+ ) as JSXAttribute
+ if (attribute) {
+ if (!nodeMap.has(parent!)) nodeMap.set(parent!, [])
+
+ nodeMap.get(parent!)?.push({
+ node,
+ attribute,
+ })
+ }
+ },
+ })
+
+ const nodes = [...nodeMap.values()].flat()
+ nodes.forEach(({ node, attribute }, index) => {
+ if (['v-if', 'v-else-if'].includes(`${attribute.name.name}`)) {
+ if (attribute.value)
+ s.appendLeft(
+ node.start! + offset,
+ `${attribute.name.name === 'v-if' ? '{ ' : ''}${s.slice(
+ attribute.value.start! + offset + 1,
+ attribute.value.end! + offset - 1
+ )} ? `
+ )
+
+ s.appendRight(
+ node.end! + offset,
+ `${nodes[index + 1]?.attribute.name.name}`.startsWith('v-else')
+ ? ' :'
+ : " : '' }"
+ )
+ s.remove(attribute.start! + offset - 1, attribute.end! + offset)
+ } else {
+ s.appendRight(node.end! + offset, ' }')
+ }
+ })
+}
diff --git a/packages/jsx-directive/src/esbuild.ts b/packages/jsx-directive/src/esbuild.ts
new file mode 100644
index 000000000..71f1e0952
--- /dev/null
+++ b/packages/jsx-directive/src/esbuild.ts
@@ -0,0 +1,3 @@
+import unplugin from '.'
+
+export default unplugin.esbuild
diff --git a/packages/jsx-directive/src/index.ts b/packages/jsx-directive/src/index.ts
new file mode 100644
index 000000000..7497d408d
--- /dev/null
+++ b/packages/jsx-directive/src/index.ts
@@ -0,0 +1,45 @@
+import { createUnplugin } from 'unplugin'
+import {
+ type BaseOptions,
+ type MarkRequired,
+ REGEX_LANG_JSX,
+ REGEX_NODE_MODULES,
+ createFilter,
+ detectVueVersion,
+} from '@vue-macros/common'
+import { transformJsxVueDirective } from './core'
+
+export type Options = BaseOptions
+export type OptionsResolved = MarkRequired
+
+function resolveOption(options: Options): OptionsResolved {
+ const version = options.version || detectVueVersion()
+ return {
+ include: [REGEX_LANG_JSX],
+ exclude: [REGEX_NODE_MODULES],
+ ...options,
+ version,
+ }
+}
+
+const name = 'unplugin-jsx-vue-directive'
+
+export default createUnplugin(
+ (userOptions = {}) => {
+ const options = resolveOption(userOptions)
+ const filter = createFilter(options)
+
+ return {
+ name,
+ enforce: 'pre',
+
+ transformInclude(id) {
+ return filter(id)
+ },
+
+ transform(code, id) {
+ return transformJsxVueDirective(code, id)
+ },
+ }
+ }
+)
diff --git a/packages/jsx-directive/src/rollup.ts b/packages/jsx-directive/src/rollup.ts
new file mode 100644
index 000000000..ed6909cd3
--- /dev/null
+++ b/packages/jsx-directive/src/rollup.ts
@@ -0,0 +1,3 @@
+import unplugin from '.'
+
+export default unplugin.rollup
diff --git a/packages/jsx-directive/src/vite.ts b/packages/jsx-directive/src/vite.ts
new file mode 100644
index 000000000..589f4b964
--- /dev/null
+++ b/packages/jsx-directive/src/vite.ts
@@ -0,0 +1,3 @@
+import unplugin from '.'
+
+export default unplugin.vite
diff --git a/packages/jsx-directive/src/webpack.ts b/packages/jsx-directive/src/webpack.ts
new file mode 100644
index 000000000..83091ee31
--- /dev/null
+++ b/packages/jsx-directive/src/webpack.ts
@@ -0,0 +1,3 @@
+import unplugin from '.'
+
+export default unplugin.webpack
diff --git a/packages/jsx-directive/tests/__snapshots__/v-for.test.ts.snap b/packages/jsx-directive/tests/__snapshots__/v-for.test.ts.snap
new file mode 100644
index 000000000..46ae1546e
--- /dev/null
+++ b/packages/jsx-directive/tests/__snapshots__/v-for.test.ts.snap
@@ -0,0 +1,31 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`jsx-vue-directive > v-for > ./fixtures/v-for/v-for.setup.tsx 1`] = `
+"// @ts-nocheck
+const list = [1, 2, 3]
+
+export default () => (
+ <>
+ { list.map((i, index)=> ) }
+ >
+)
+"
+`;
+
+exports[`jsx-vue-directive > v-for > ./fixtures/v-for/v-for.vue 1`] = `
+"
+"
+`;
diff --git a/packages/jsx-directive/tests/__snapshots__/v-if.test.ts.snap b/packages/jsx-directive/tests/__snapshots__/v-if.test.ts.snap
new file mode 100644
index 000000000..994bd9a28
--- /dev/null
+++ b/packages/jsx-directive/tests/__snapshots__/v-if.test.ts.snap
@@ -0,0 +1,132 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`jsx-vue-directive > v-if > ./fixtures/v-if/v-else.setup.tsx 1`] = `
+"const { foo = 2 } = defineProps<{
+ foo: number
+}>()
+
+export default () => (
+ <>
+ { foo === 0 ? 0
:
+ foo === 1 ? 1
:
+ 2
}
+ >
+)
+"
+`;
+
+exports[`jsx-vue-directive > v-if > ./fixtures/v-if/v-else.vue 1`] = `
+"
+"
+`;
+
+exports[`jsx-vue-directive > v-if > ./fixtures/v-if/v-else-if.setup.tsx 1`] = `
+"const { foo = 0 } = defineProps<{
+ foo: number
+}>()
+
+export default () => (
+ <>
+ { foo === 0 ? 0
:
+ foo === 1 ? 1
:
+ foo === 2 ? 2
: '' }
+ >
+)
+"
+`;
+
+exports[`jsx-vue-directive > v-if > ./fixtures/v-if/v-else-if.vue 1`] = `
+"
+"
+`;
+
+exports[`jsx-vue-directive > v-if > ./fixtures/v-if/v-if.setup.tsx 1`] = `
+"const { foo } = defineProps<{
+ foo: number
+}>()
+
+export default () => {
+ return (
+ <>
+ { foo === 0 ? 0
: '' }
+ { foo === 1 ? 1
: '' }
+ >
+ )
+}
+"
+`;
+
+exports[`jsx-vue-directive > v-if > ./fixtures/v-if/v-if.vue 1`] = `
+"
+"
+`;
+
+exports[`jsx-vue-directive > v-if > ./fixtures/v-if/v-if-nested.setup.tsx 1`] = `
+"const { foo = 0 } = defineProps<{
+ foo: number
+}>()
+
+export default () => (
+ <>
+ { foo === 0 ?
+ { foo === 0 ?
0-0
:
+ foo === 1 ?
0-1
:
+
0-2
}
+
: '' }
+ >
+)
+"
+`;
+
+exports[`jsx-vue-directive > v-if > ./fixtures/v-if/v-if-nested.vue 1`] = `
+"
+"
+`;
diff --git a/packages/jsx-directive/tests/fixtures/v-for/v-for.setup.tsx b/packages/jsx-directive/tests/fixtures/v-for/v-for.setup.tsx
new file mode 100644
index 000000000..da86c63b5
--- /dev/null
+++ b/packages/jsx-directive/tests/fixtures/v-for/v-for.setup.tsx
@@ -0,0 +1,10 @@
+// @ts-nocheck
+const list = [1, 2, 3]
+
+export default () => (
+ <>
+
+ >
+)
diff --git a/packages/jsx-directive/tests/fixtures/v-for/v-for.vue b/packages/jsx-directive/tests/fixtures/v-for/v-for.vue
new file mode 100644
index 000000000..1a02d3b31
--- /dev/null
+++ b/packages/jsx-directive/tests/fixtures/v-for/v-for.vue
@@ -0,0 +1,12 @@
+
diff --git a/packages/jsx-directive/tests/fixtures/v-if/v-else-if.setup.tsx b/packages/jsx-directive/tests/fixtures/v-if/v-else-if.setup.tsx
new file mode 100644
index 000000000..d5a33d750
--- /dev/null
+++ b/packages/jsx-directive/tests/fixtures/v-if/v-else-if.setup.tsx
@@ -0,0 +1,11 @@
+const { foo = 0 } = defineProps<{
+ foo: number
+}>()
+
+export default () => (
+ <>
+ 0
+ 1
+ 2
+ >
+)
diff --git a/packages/jsx-directive/tests/fixtures/v-if/v-else-if.vue b/packages/jsx-directive/tests/fixtures/v-if/v-else-if.vue
new file mode 100644
index 000000000..da1af84cc
--- /dev/null
+++ b/packages/jsx-directive/tests/fixtures/v-if/v-else-if.vue
@@ -0,0 +1,12 @@
+
diff --git a/packages/jsx-directive/tests/fixtures/v-if/v-else.setup.tsx b/packages/jsx-directive/tests/fixtures/v-if/v-else.setup.tsx
new file mode 100644
index 000000000..942017f0b
--- /dev/null
+++ b/packages/jsx-directive/tests/fixtures/v-if/v-else.setup.tsx
@@ -0,0 +1,11 @@
+const { foo = 2 } = defineProps<{
+ foo: number
+}>()
+
+export default () => (
+ <>
+ 0
+ 1
+ 2
+ >
+)
diff --git a/packages/jsx-directive/tests/fixtures/v-if/v-else.vue b/packages/jsx-directive/tests/fixtures/v-if/v-else.vue
new file mode 100644
index 000000000..044834c51
--- /dev/null
+++ b/packages/jsx-directive/tests/fixtures/v-if/v-else.vue
@@ -0,0 +1,13 @@
+
diff --git a/packages/jsx-directive/tests/fixtures/v-if/v-if-nested.setup.tsx b/packages/jsx-directive/tests/fixtures/v-if/v-if-nested.setup.tsx
new file mode 100644
index 000000000..1d6c049b8
--- /dev/null
+++ b/packages/jsx-directive/tests/fixtures/v-if/v-if-nested.setup.tsx
@@ -0,0 +1,13 @@
+const { foo = 0 } = defineProps<{
+ foo: number
+}>()
+
+export default () => (
+ <>
+
+ >
+)
diff --git a/packages/jsx-directive/tests/fixtures/v-if/v-if-nested.vue b/packages/jsx-directive/tests/fixtures/v-if/v-if-nested.vue
new file mode 100644
index 000000000..481f61217
--- /dev/null
+++ b/packages/jsx-directive/tests/fixtures/v-if/v-if-nested.vue
@@ -0,0 +1,15 @@
+
diff --git a/packages/jsx-directive/tests/fixtures/v-if/v-if.setup.tsx b/packages/jsx-directive/tests/fixtures/v-if/v-if.setup.tsx
new file mode 100644
index 000000000..29561a3fe
--- /dev/null
+++ b/packages/jsx-directive/tests/fixtures/v-if/v-if.setup.tsx
@@ -0,0 +1,12 @@
+const { foo } = defineProps<{
+ foo: number
+}>()
+
+export default () => {
+ return (
+ <>
+ 0
+ 1
+ >
+ )
+}
diff --git a/packages/jsx-directive/tests/fixtures/v-if/v-if.vue b/packages/jsx-directive/tests/fixtures/v-if/v-if.vue
new file mode 100644
index 000000000..7a34fef18
--- /dev/null
+++ b/packages/jsx-directive/tests/fixtures/v-if/v-if.vue
@@ -0,0 +1,12 @@
+
diff --git a/packages/jsx-directive/tests/v-for.test.ts b/packages/jsx-directive/tests/v-for.test.ts
new file mode 100644
index 000000000..a3a38be69
--- /dev/null
+++ b/packages/jsx-directive/tests/v-for.test.ts
@@ -0,0 +1,17 @@
+import { describe } from 'vitest'
+import { testFixtures } from 'packages/test-utils/src'
+import { transformJsxVueDirective } from '../src/api'
+
+describe('jsx-vue-directive', () => {
+ describe('v-for', async () => {
+ await testFixtures(
+ import.meta.glob('./fixtures/v-for/*.{vue,jsx,tsx}', {
+ eager: true,
+ as: 'raw',
+ }),
+ (args, id, code) => {
+ return transformJsxVueDirective(code, id)?.code
+ }
+ )
+ })
+})
diff --git a/packages/jsx-directive/tests/v-if.test.ts b/packages/jsx-directive/tests/v-if.test.ts
new file mode 100644
index 000000000..45bf9f5f5
--- /dev/null
+++ b/packages/jsx-directive/tests/v-if.test.ts
@@ -0,0 +1,17 @@
+import { describe } from 'vitest'
+import { testFixtures } from 'packages/test-utils/src'
+import { transformJsxVueDirective } from '../src/api'
+
+describe('jsx-vue-directive', () => {
+ describe('v-if', async () => {
+ await testFixtures(
+ import.meta.glob('./fixtures/v-if/*.{vue,jsx,tsx}', {
+ eager: true,
+ as: 'raw',
+ }),
+ (args, id, code) => {
+ return transformJsxVueDirective(code, id)?.code
+ }
+ )
+ })
+})
diff --git a/packages/jsx-directive/tsup.config.ts b/packages/jsx-directive/tsup.config.ts
new file mode 100644
index 000000000..1605eae16
--- /dev/null
+++ b/packages/jsx-directive/tsup.config.ts
@@ -0,0 +1 @@
+export { default } from '../../tsup.config.js'
diff --git a/packages/macros/package.json b/packages/macros/package.json
index 2b875fc34..fbe37ed3e 100644
--- a/packages/macros/package.json
+++ b/packages/macros/package.json
@@ -112,6 +112,7 @@
"@vue-macros/export-expose": "workspace:*",
"@vue-macros/export-props": "workspace:*",
"@vue-macros/hoist-static": "workspace:*",
+ "@vue-macros/jsx-directive": "workspace:*",
"@vue-macros/named-template": "workspace:*",
"@vue-macros/reactivity-transform": "workspace:*",
"@vue-macros/setup-block": "workspace:*",
diff --git a/packages/macros/src/index.ts b/packages/macros/src/index.ts
index 5e9567a71..d0ddc99cd 100644
--- a/packages/macros/src/index.ts
+++ b/packages/macros/src/index.ts
@@ -48,6 +48,9 @@ import VueExportProps, {
import VueHoistStatic, {
type Options as OptionsHoistStatic,
} from '@vue-macros/hoist-static'
+import VueJsxDirective, {
+ type Options as OptionsJsxDirective,
+} from '@vue-macros/jsx-directive'
import VueNamedTemplate, {
type Options as OptionsNamedTemplate,
} from '@vue-macros/named-template'
@@ -81,6 +84,7 @@ export interface FeatureOptionsMap {
exportExpose: OptionsExportExpose
exportProps: OptionsExportProps
hoistStatic: OptionsHoistStatic
+ jsxDirective: OptionsJsxDirective
namedTemplate: OptionsNamedTemplate
reactivityTransform: OptionsReactivityTransform
setupBlock: OptionsSetupBlock
@@ -135,6 +139,7 @@ export function resolveOptions({
exportExpose,
exportProps,
hoistStatic,
+ jsxDirective,
namedTemplate,
reactivityTransform,
setupBlock,
@@ -204,6 +209,9 @@ export function resolveOptions({
{ version },
false
),
+ jsxDirective: resolveSubOptions<'jsxDirective'>(jsxDirective, {
+ version,
+ }),
hoistStatic: resolveSubOptions<'hoistStatic'>(hoistStatic, { version }),
namedTemplate: resolveSubOptions<'namedTemplate'>(namedTemplate, {
version,
@@ -299,6 +307,7 @@ export default createCombinePlugin(
),
resolvePlugin(VueHoistStatic, framework, options.hoistStatic),
resolvePlugin(VueDefineOptions, framework, options.defineOptions),
+ resolvePlugin(VueJsxDirective, framework, options.jsxDirective),
options.plugins.vue,
options.plugins.vueJsx,
resolvePlugin(VueDefineRender, framework, options.defineRender),
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7676cab40..6b983e754 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -399,6 +399,19 @@ importers:
specifier: ^1.4.0
version: 1.4.0
+ packages/jsx-directive:
+ dependencies:
+ '@vue-macros/common':
+ specifier: workspace:~
+ version: link:../common
+ unplugin:
+ specifier: ^1.3.1
+ version: 1.4.0
+ devDependencies:
+ vue:
+ specifier: ^3.3.4
+ version: 3.3.4
+
packages/macros:
dependencies:
'@vue-macros/better-define':
@@ -443,6 +456,9 @@ importers:
'@vue-macros/hoist-static':
specifier: workspace:*
version: link:../hoist-static
+ '@vue-macros/jsx-directive':
+ specifier: workspace:*
+ version: link:../jsx-directive
'@vue-macros/named-template':
specifier: workspace:*
version: link:../named-template