Skip to content
This repository was archived by the owner on Aug 24, 2019. It is now read-only.

Commit f9ba9d0

Browse files
committed
feat(h2x-core): add state support
1 parent 3447d97 commit f9ba9d0

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

packages/h2x-core/src/index.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import parse from 'h2x-parse'
33
import generate from 'h2x-generate'
44
import traverse from 'h2x-traverse'
55

6-
76
const reduceVisitors = (visitors, opts) => {
87
Object.keys(visitors).forEach(key => {
98
const visitor = visitors[key]
@@ -31,9 +30,9 @@ const mergePlugins = plugins =>
3130

3231
export { traverse, generate }
3332

34-
export function transform(code, { plugins = [] } = {}) {
33+
export function transform(code, { plugins = [], state = {} } = {}) {
3534
const ast = parse(code)
3635
const { visitor, generator } = mergePlugins(plugins)
37-
traverse(ast, visitor)
36+
traverse(ast, visitor, state)
3837
return generate(ast, generator)
3938
}

packages/h2x-core/src/index.test.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,37 @@ describe('transform', () => {
3131
const result = transform(code, { plugins: [simpleJsx] })
3232
expect(result).toBe(`<div />\n`)
3333
})
34+
35+
it('should support state', () => {
36+
class JSXNode {
37+
static [NODE_TYPE] = 'JSXElement'
38+
39+
constructor(name) {
40+
this.name = name
41+
}
42+
}
43+
44+
const simpleJsx = () => ({
45+
visitor: {
46+
HTMLElement: {
47+
enter(path, state) {
48+
state.tags.push(path.node.tagName)
49+
path.replace(new JSXNode('div'))
50+
},
51+
},
52+
},
53+
generator: {
54+
JSXElement: {
55+
enter(path, generator) {
56+
generator.writeLine(`<${path.node.name} />`)
57+
},
58+
},
59+
},
60+
})
61+
const state = { tags: [] }
62+
const code = `<div></div>`
63+
const result = transform(code, { plugins: [simpleJsx], state })
64+
expect(result).toBe(`<div />\n`)
65+
expect(state.tags).toEqual(['DIV'])
66+
})
3467
})

0 commit comments

Comments
 (0)