Skip to content

Commit 0afc03f

Browse files
committed
refactor(macros): decouple from @vue/language-core
1 parent 95e9a1c commit 0afc03f

File tree

14 files changed

+168
-176
lines changed

14 files changed

+168
-176
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"version": "2.3.4",
3-
"packageManager": "pnpm@10.4.1",
3+
"packageManager": "pnpm@10.10.0",
44
"description": "Vue JSX Vapor",
55
"type": "module",
66
"keywords": [

packages/babel/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
{
22
"name": "@vue-jsx-vapor/babel",
33
"version": "2.3.4",
4-
"packageManager": "[email protected]",
54
"description": "Vue JSX Vapor Babel Plugin",
65
"type": "module",
76
"keywords": [

packages/compiler/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
{
22
"name": "@vue-jsx-vapor/compiler",
33
"version": "2.3.4",
4-
"packageManager": "[email protected]",
54
"description": "Vue JSX Vapor Compiler",
65
"type": "module",
76
"keywords": [

packages/eslint/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
{
22
"name": "@vue-jsx-vapor/eslint",
33
"version": "2.3.4",
4-
"packageManager": "[email protected]",
54
"description": "Vue JSX Vapor ESLint Plugin",
65
"type": "module",
76
"keywords": [

packages/macros/package.json

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
{
22
"name": "@vue-jsx-vapor/macros",
33
"version": "2.3.4",
4-
"packageManager": "[email protected]",
54
"description": "Macros for Vue JSX Vapor",
65
"type": "module",
76
"keywords": [
@@ -174,7 +173,6 @@
174173
"dependencies": {
175174
"@vue-macros/common": "catalog:",
176175
"@vue/compiler-sfc": "catalog:",
177-
"@vue/language-core": "^2.2.8",
178176
"hash-sum": "catalog:",
179177
"ts-macro": "catalog:",
180178
"unplugin": "catalog:"

packages/macros/src/core/define-component/index.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import type { Node, ObjectExpression } from '@babel/types'
99
export function transformDefineComponent(
1010
root: FunctionalNode,
1111
propsName: string,
12-
map: RootMapValue,
12+
macros: RootMapValue,
1313
s: MagicStringAST,
1414
autoReturnFunction = false,
1515
): void {
16-
if (!map.defineComponent) return
16+
if (!macros.defineComponent) return
1717

18-
const defineComponentName = s.sliceNode(map.defineComponent.callee)
18+
const defineComponentName = s.sliceNode(macros.defineComponent.callee)
1919
if (
2020
defineComponentName &&
2121
!['defineComponent', 'defineVaporComponent'].includes(defineComponentName)
@@ -77,13 +77,13 @@ export function transformDefineComponent(
7777
}
7878
}
7979

80-
transformDefineModel(s, map.defineModel, props)
80+
transformDefineModel(s, macros.defineModel, props)
8181

8282
const propsString = Object.entries(props)
8383
.map(([key, value]) => `'${key}': ${value}`)
8484
.join(', \n')
8585
if (propsString) {
86-
const argument = map.defineComponent.arguments[1]
86+
const argument = macros.defineComponent.arguments[1]
8787
if (!argument) {
8888
s.appendRight(
8989
root.end!,

packages/macros/src/core/define-style.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export function transformDefineStyle(
1111
s: MagicStringAST,
1212
importMap: Map<string, string>,
1313
): void {
14-
const { expression, lang, isDeclaration } = defineStyle
14+
const { expression, lang, isCssModules } = defineStyle
1515
if (expression.arguments[0]?.type !== 'TemplateLiteral') return
1616

1717
let css = s.sliceNode(expression.arguments[0]).slice(1, -1)
@@ -79,16 +79,16 @@ export function transformDefineStyle(
7979
.sliceNode(expression.arguments[0])
8080
.slice(1, -1)
8181
.replaceAll(/\/\/(.*)(?=\n)/g, '/*$1*/')
82-
const module = isDeclaration ? 'module.' : ''
82+
const module = isCssModules ? 'module.' : ''
8383
const importId = `${helperPrefix}/define-style/${index}?scopeId=${scopeId}&scoped=${scoped}&lang.${module}${lang}`
8484
importMap.set(importId, css)
8585
s.appendLeft(
8686
0,
87-
isDeclaration
87+
isCssModules
8888
? `import style${index} from "${importId}";`
8989
: `import "${importId}";`,
9090
)
91-
s.overwriteNode(expression, isDeclaration ? `style${index}` : '')
91+
s.overwriteNode(expression, isCssModules ? `style${index}` : '')
9292
}
9393

9494
function getReturnStatement(root: FunctionalNode) {

packages/macros/src/core/index.ts

+13-13
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export type FunctionalNode =
3131

3232
export type DefineStyle = {
3333
expression: CallExpression
34-
isDeclaration: boolean
34+
isCssModules: boolean
3535
lang: string
3636
}
3737

@@ -57,8 +57,8 @@ export function transformJsxMacros(
5757
const rootMap = getRootMap(ast, s, options)
5858

5959
let defineStyleIndex = 0
60-
for (const [root, map] of rootMap) {
61-
map.defineStyle?.forEach((defineStyle) => {
60+
for (const [root, macros] of rootMap) {
61+
macros.defineStyle?.forEach((defineStyle) => {
6262
transformDefineStyle(defineStyle, defineStyleIndex++, root, s, importMap)
6363
})
6464

@@ -71,7 +71,7 @@ export function transformJsxMacros(
7171
} else if (root.params[0].type === 'ObjectPattern') {
7272
const lastProp = root.params[0].properties.at(-1)
7373
if (
74-
!map.defineComponent &&
74+
!macros.defineComponent &&
7575
lastProp?.type === 'RestElement' &&
7676
lastProp.argument.type === 'Identifier'
7777
) {
@@ -94,25 +94,25 @@ export function transformJsxMacros(
9494
s.appendRight(getParamsStart(root, s.original), propsName)
9595
}
9696

97-
if (map.defineComponent) {
97+
if (macros.defineComponent) {
9898
transformDefineComponent(
9999
root,
100100
propsName,
101-
map,
101+
macros,
102102
s,
103103
options.defineComponent?.autoReturnFunction,
104104
)
105105
}
106-
if (map.defineModel?.length) {
107-
map.defineModel.forEach(({ expression }) => {
106+
if (macros.defineModel?.length) {
107+
macros.defineModel.forEach(({ expression }) => {
108108
transformDefineModel(expression, propsName, s)
109109
})
110110
}
111-
if (map.defineSlots) {
112-
transformDefineSlots(map.defineSlots, s)
111+
if (macros.defineSlots) {
112+
transformDefineSlots(macros.defineSlots, s)
113113
}
114-
if (map.defineExpose) {
115-
transformDefineExpose(map.defineExpose, s, options.version)
114+
if (macros.defineExpose) {
115+
transformDefineExpose(macros.defineExpose, s, options.version)
116116
}
117117
}
118118

@@ -170,7 +170,7 @@ function getRootMap(ast: Program, s: MagicStringAST, options: OptionsResolved) {
170170
: 'css'
171171
;(rootMap.get(root)!.defineStyle ??= []).push({
172172
expression: macroExpression,
173-
isDeclaration: node.type === 'VariableDeclaration',
173+
isCssModules: node.type === 'VariableDeclaration',
174174
lang,
175175
})
176176
} else if (options.defineSlots.alias.includes(macroName)) {
+39-38
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,31 @@
1-
import { HELPER_PREFIX } from '@vue-macros/common'
2-
import { generateClassProperty } from '@vue/language-core/lib/codegen/style/classProperty.js'
3-
import { parseCssClassNames } from '@vue/language-core/lib/utils/parseCssClassNames.js'
41
import { replaceRange } from 'ts-macro'
5-
import type { JsxMacros, TransformOptions } from '.'
2+
import type { DefineStyle, TransformOptions } from '.'
63

74
export function transformDefineStyle(
8-
defineStyles: JsxMacros['defineStyle'],
5+
{ expression, isCssModules }: DefineStyle,
6+
index: number,
97
options: TransformOptions,
108
): void {
11-
if (!defineStyles?.length) return
129
const { ts, codes, ast } = options
13-
defineStyles.forEach(({ expression, isCssModules }, index) => {
14-
if (
15-
isCssModules &&
16-
expression?.arguments[0] &&
17-
!expression.typeArguments &&
18-
ts.isTemplateLiteral(expression.arguments[0])
19-
) {
20-
replaceRange(
21-
codes,
22-
expression.arguments.pos - 1,
23-
expression.arguments.pos - 1,
24-
`<${HELPER_PREFIX}PrettifyLocal<{}`,
25-
...generateCssClassesType(
26-
expression.arguments[0].getText(ast).slice(1, -1),
27-
expression.arguments[0].getStart(ast) + 1,
28-
index,
29-
),
30-
'>>',
31-
)
32-
}
33-
34-
addEmbeddedCode(expression, index, options)
35-
})
36-
}
37-
38-
function* generateCssClassesType(css: string, offset: number, index: number) {
39-
for (const className of [...parseCssClassNames(css)]) {
40-
yield* generateClassProperty(
41-
index,
42-
className.text,
43-
className.offset + offset,
44-
'string',
10+
if (
11+
isCssModules &&
12+
expression?.arguments[0] &&
13+
!expression.typeArguments &&
14+
ts.isTemplateLiteral(expression.arguments[0])
15+
) {
16+
replaceRange(
17+
codes,
18+
expression.arguments.pos - 1,
19+
expression.arguments.pos - 1,
20+
`<{`,
21+
...parseCssClassNames(
22+
expression.arguments[0].getText(ast).slice(1, -1),
23+
).map(({ text }) => `\n'${text.slice(1)}': string`),
24+
'\n}>',
4525
)
4626
}
27+
28+
addEmbeddedCode(expression, index, options)
4729
}
4830

4931
function addEmbeddedCode(
@@ -88,3 +70,22 @@ function addEmbeddedCode(
8870
embeddedCodes: [],
8971
})
9072
}
73+
74+
const commentReg = /(?<=\/\*)[\s\S]*?(?=\*\/)|(?<=\/\/)[\s\S]*?(?=\n)/g
75+
const cssClassNameReg = /(?=(\.[a-z_][-\w]*)[\s.,+~>:#)[{])/gi
76+
const fragmentReg = /(?<=\{)[^{]*(?=(?<!\\);)/g
77+
78+
function parseCssClassNames(css: string) {
79+
for (const reg of [commentReg, fragmentReg]) {
80+
css = css.replace(reg, (match) => ' '.repeat(match.length))
81+
}
82+
const matches = css.matchAll(cssClassNameReg)
83+
const result = []
84+
for (const match of matches) {
85+
const matchText = match[1]
86+
if (matchText) {
87+
result.push({ offset: match.index, text: matchText })
88+
}
89+
}
90+
return result
91+
}

packages/macros/src/volar/global-types.ts

-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ ${defineSlots}
3939
${defineExpose}
4040
${defineStyle}
4141
type ${HELPER_PREFIX}StyleArgs = [style: string, options?: { scoped?: boolean }];
42-
type ${HELPER_PREFIX}PrettifyLocal<T> = { [K in keyof T]: T[K]; } & {};
4342
// @ts-ignore
4443
type __VLS_IsAny<T> = 0 extends 1 & T ? true : false; type __VLS_PickNotAny<A, B> = __VLS_IsAny<A> extends true ? B : A;
4544
`

0 commit comments

Comments
 (0)