Skip to content

Commit

Permalink
feat: suppport ast transform hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
antfu committed Aug 22, 2021
1 parent 0437983 commit e0b0a78
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 17 deletions.
2 changes: 1 addition & 1 deletion src/core/macros.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {
} from '@babel/types'
import { types as t } from '@babel/core'
import { parseExpression } from '@babel/parser'
import { PropTypeData } from './types'
import { PropTypeData } from '../types'

// Special compiler macros
const DEFINE_PROPS = 'defineProps'
Expand Down
7 changes: 5 additions & 2 deletions src/core/parseSFC.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Parser as HTMLParser } from 'htmlparser2'
import { parse, ParserOptions } from '@babel/parser'
import { camelize, capitalize, isHTMLTag, isSVGTag, isVoidTag } from '@vue/shared'
import { ParsedSFC, ScriptTagMeta } from './types'
import { ParsedSFC, ScriptSetupTransformOptions, ScriptTagMeta } from '../types'
import { getIdentifierUsages } from './identifiers'

export function parseSFC(code: string, id?: string): ParsedSFC {
export function parseSFC(code: string, id?: string, options?: ScriptSetupTransformOptions): ParsedSFC {
const components = new Set<string>()
const expressions = new Set<string>()
const identifiers = new Set<string>()
Expand Down Expand Up @@ -138,6 +138,9 @@ export function parseSFC(code: string, id?: string): ParsedSFC {
scriptSetup.ast = parse(scriptSetup.content, parserOptions).program
script.ast = parse(script.content || '', parserOptions).program

scriptSetup.ast = options?.astTransforms?.scriptSetup?.(scriptSetup.ast) || scriptSetup.ast
script.ast = options?.astTransforms?.script?.(script.ast) || script.ast

return {
id,
template: {
Expand Down
5 changes: 3 additions & 2 deletions src/core/transform.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import MagicString from 'magic-string'
import { ScriptSetupTransformOptions } from '../types'
import { parseSFC } from './parseSFC'
import { transformScriptSetup } from './transformScriptSetup'

export function transform(input: string, id?: string) {
export function transform(input: string, id?: string, options?: ScriptSetupTransformOptions) {
const s = new MagicString(input)
const sfc = parseSFC(input, id)
const { code } = transformScriptSetup(sfc)
const { code } = transformScriptSetup(sfc, options)

const attributes = {
...sfc.script.attrs,
Expand Down
10 changes: 6 additions & 4 deletions src/core/transformScriptSetup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import { types as t } from '@babel/core'
import { camelize, capitalize } from '@vue/shared'
import traverse from '@babel/traverse'
import generate from '@babel/generator'
import { ParsedSFC } from './types'
import { ParsedSFC, ScriptSetupTransformOptions } from '../types'
import { applyMacros } from './macros'
import { getIdentifierDeclarations } from './identifiers'

export function transformScriptSetup(sfc: ParsedSFC) {
export function transformScriptSetup(sfc: ParsedSFC, options?: ScriptSetupTransformOptions) {
const { scriptSetup, script, template } = sfc

const imports = scriptSetup.ast.body.filter(n => n.type === 'ImportDeclaration')
Expand All @@ -31,7 +31,7 @@ export function transformScriptSetup(sfc: ParsedSFC) {
)

// append `<script setup>` imports to `<script>`
const ast = t.program([
let ast = t.program([
...imports,
...script.ast.body,
])
Expand Down Expand Up @@ -139,7 +139,7 @@ export function transformScriptSetup(sfc: ParsedSFC) {
)
}

if (!hasBody) {
if (!hasBody && !options?.astTransforms) {
return {
ast: null,
code: '',
Expand All @@ -152,6 +152,8 @@ export function transformScriptSetup(sfc: ParsedSFC) {
t.exportDefaultDeclaration(__sfc) as any,
)

ast = options?.astTransforms?.post?.(ast, sfc) || ast

return {
ast,
code: generate(ast).code,
Expand Down
10 changes: 5 additions & 5 deletions src/core/types.ts → src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ export interface PropTypeData {
}

export interface ScriptSetupTransformOptions {

}

export interface ScriptSetupTransformContext {

astTransforms?: {
script?: (ast: Program) => Program
scriptSetup?: (ast: Program) => Program
post?: (ast: Program, sfc: ParsedSFC) => Program
}
}
7 changes: 4 additions & 3 deletions src/unplugin.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import { createUnplugin } from 'unplugin'
import { ScriptSetupTransformOptions } from './types'
import { transform } from '.'

const scriptSetupRE = /<script\s+setup/

export default createUnplugin(() => ({
export default createUnplugin<ScriptSetupTransformOptions>(options => ({
name: 'vue2-script-setup-transform',
enforce: 'pre',
transformInclude(id) {
return id.endsWith('.vue')
},
transform(code) {
transform(code, id) {
if (scriptSetupRE.test(code))
return transform(code)
return transform(code, id, options)
},
}))

0 comments on commit e0b0a78

Please sign in to comment.