Skip to content

Commit 704fee9

Browse files
committed
feat(compiler-vapor): support custom generate operation
1 parent 2696f14 commit 704fee9

File tree

6 files changed

+21
-14
lines changed

6 files changed

+21
-14
lines changed

packages/compiler-vapor/src/generate.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,14 @@ import {
1919
} from './generators/utils'
2020
import { setTemplateRefIdent } from './generators/templateRef'
2121

22-
export type CodegenOptions = Omit<BaseCodegenOptions, 'optimizeImports'>
22+
type CustomGenOperation = (
23+
opers: any,
24+
context: CodegenContext,
25+
) => CodeFragment[] | void
26+
27+
export type CodegenOptions = Omit<BaseCodegenOptions, 'optimizeImports'> & {
28+
customGenOperation?: CustomGenOperation | null
29+
}
2330

2431
export class CodegenContext {
2532
options: Required<CodegenOptions>
@@ -87,6 +94,7 @@ export class CodegenContext {
8794
inline: false,
8895
bindingMetadata: {},
8996
expressionPlugins: [],
97+
customGenOperation: null,
9098
}
9199
this.options = extend(defaultOptions, options)
92100
this.block = ir.block

packages/compiler-vapor/src/generators/operation.ts

+5
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ export function genOperation(
8888
case IRNodeTypes.GET_TEXT_CHILD:
8989
return genGetTextChild(oper, context)
9090
default:
91+
if (context.options.customGenOperation) {
92+
const result = context.options.customGenOperation(oper, context)
93+
if (result) return result
94+
}
95+
9196
const exhaustiveCheck: never = oper
9297
throw new Error(
9398
`Unhandled operation type in genOperation: ${exhaustiveCheck}`,

packages/compiler-vapor/src/generators/text.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ export function genSetText(
1010
context: CodegenContext,
1111
): CodeFragment[] {
1212
const { helper } = context
13-
const { element, values, generated, jsx } = oper
14-
const texts = combineValues(values, context, jsx)
13+
const { element, values, generated } = oper
14+
const texts = combineValues(values, context)
1515
return [
1616
NEWLINE,
1717
...genCall(helper('setText'), `${generated ? 'x' : 'n'}${element}`, texts),
@@ -21,16 +21,15 @@ export function genSetText(
2121
function combineValues(
2222
values: SimpleExpressionNode[],
2323
context: CodegenContext,
24-
jsx?: boolean,
2524
): CodeFragment[] {
2625
return values.flatMap((value, i) => {
2726
let exp = genExpression(value, context)
28-
if (!jsx && getLiteralExpressionValue(value) == null) {
27+
if (getLiteralExpressionValue(value) == null) {
2928
// dynamic, wrap with toDisplayString
3029
exp = genCall(context.helper('toDisplayString'), exp)
3130
}
3231
if (i > 0) {
33-
exp.unshift(jsx ? ', ' : ' + ')
32+
exp.unshift(' + ')
3433
}
3534
return exp
3635
})

packages/compiler-vapor/src/generators/utils.ts

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import {
1010
import { isArray, isString } from '@vue/shared'
1111
import type { CodegenContext } from '../generate'
1212

13+
export { genExpression } from './expression'
14+
1315
export const NEWLINE: unique symbol = Symbol(__DEV__ ? `newline` : ``)
1416
/** increase offset but don't push actual code */
1517
export const LF: unique symbol = Symbol(__DEV__ ? `line feed` : ``)

packages/compiler-vapor/src/index.ts

+1-7
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,7 @@ export {
1313
type CodegenOptions,
1414
type VaporCodegenResult,
1515
} from './generate'
16-
export {
17-
genCall,
18-
genMulti,
19-
buildCodeFragment,
20-
codeFragmentToString,
21-
type CodeFragment,
22-
} from './generators/utils'
16+
export * from './generators/utils'
2317
export {
2418
wrapTemplate,
2519
compile,

packages/compiler-vapor/src/ir/index.ts

-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ export interface SetTextIRNode extends BaseIRNode {
124124
element: number
125125
values: SimpleExpressionNode[]
126126
generated?: boolean // whether this is a generated empty text node by `processTextLikeContainer`
127-
jsx?: boolean
128127
}
129128

130129
export type KeyOverride = [find: string, replacement: string]

0 commit comments

Comments
 (0)