import {
+ locStub,
generate,
NodeTypes,
RootNode,
- SourceLocation,
createSimpleExpression,
Namespaces,
ElementTypes,
- CallExpression,
createObjectExpression,
createObjectProperty,
createArrayExpression,
- ElementNode,
createCompoundExpression,
createInterpolation,
- createSequenceExpression
+ createSequenceExpression,
+ createCallExpression,
+ createConditionalExpression
} from '../src'
import {
CREATE_VNODE,
TO_STRING,
RENDER_LIST
} from '../src/runtimeConstants'
-
-const mockLoc: SourceLocation = {
- source: ``,
- start: {
- offset: 0,
- line: 1,
- column: 1
- },
- end: {
- offset: 3,
- line: 1,
- column: 4
- }
-}
+import { createElementWithCodegen } from './testUtils'
function createRoot(options: Partial<RootNode> = {}): RootNode {
return {
imports: [],
statements: [],
hoists: [],
- loc: mockLoc,
+ loc: locStub,
...options
}
}
test('hoists', () => {
const root = createRoot({
hoists: [
- createSimpleExpression(`hello`, false, mockLoc),
+ createSimpleExpression(`hello`, false, locStub),
createObjectExpression(
[
createObjectProperty(
- createSimpleExpression(`id`, true, mockLoc),
- createSimpleExpression(`foo`, true, mockLoc)
+ createSimpleExpression(`id`, true, locStub),
+ createSimpleExpression(`foo`, true, locStub)
)
],
- mockLoc
+ locStub
)
]
})
type: NodeTypes.TEXT,
content: 'hello',
isEmpty: false,
- loc: mockLoc
+ loc: locStub
}
]
})
test('interpolation', () => {
const { code } = generate(
createRoot({
- children: [createInterpolation(`hello`, mockLoc)]
+ children: [createInterpolation(`hello`, locStub)]
})
)
expect(code).toMatch(`return _${TO_STRING}(hello)`)
{
type: NodeTypes.COMMENT,
content: 'foo',
- loc: mockLoc
+ loc: locStub
}
]
})
type: NodeTypes.TEXT,
content: 'foo',
isEmpty: false,
- loc: mockLoc
+ loc: locStub
},
- createInterpolation(`hello`, mockLoc),
+ createInterpolation(`hello`, locStub),
{
type: NodeTypes.COMMENT,
content: 'foo',
- loc: mockLoc
+ loc: locStub
}
]
})
type: NodeTypes.TEXT,
content: 'foo',
isEmpty: false,
- loc: mockLoc
+ loc: locStub
},
- createInterpolation(`hello`, mockLoc),
+ createInterpolation(`hello`, locStub),
{
type: NodeTypes.COMMENT,
content: 'foo',
- loc: mockLoc
+ loc: locStub
}
]
}),
children: [
createCompoundExpression([
`_ctx.`,
- createSimpleExpression(`foo`, false, mockLoc),
+ createSimpleExpression(`foo`, false, locStub),
` + `,
{
type: NodeTypes.INTERPOLATION,
- loc: mockLoc,
- content: createSimpleExpression(`bar`, false, mockLoc)
+ loc: locStub,
+ content: createSimpleExpression(`bar`, false, locStub)
}
])
]
children: [
{
type: NodeTypes.IF,
- loc: mockLoc,
+ loc: locStub,
branches: [],
codegenNode: createSequenceExpression([
createSimpleExpression('foo', false),
children: [
{
type: NodeTypes.FOR,
- loc: mockLoc,
- source: createSimpleExpression(`list`, false, mockLoc),
- valueAlias: createSimpleExpression(`v`, false, mockLoc),
- keyAlias: createSimpleExpression(`k`, false, mockLoc),
- objectIndexAlias: createSimpleExpression(`i`, false, mockLoc),
- children: [createInterpolation(`v`, mockLoc)]
+ loc: locStub,
+ source: createSimpleExpression(`list`, false, locStub),
+ valueAlias: createSimpleExpression(`v`, false, locStub),
+ keyAlias: createSimpleExpression(`k`, false, locStub),
+ objectIndexAlias: createSimpleExpression(`i`, false, locStub),
+ children: [createInterpolation(`v`, locStub)]
}
]
})
children: [
{
type: NodeTypes.FOR,
- loc: mockLoc,
- source: createSimpleExpression(`list`, false, mockLoc),
- valueAlias: createSimpleExpression(`v`, false, mockLoc),
- keyAlias: createSimpleExpression(`k`, false, mockLoc),
- objectIndexAlias: createSimpleExpression(`i`, false, mockLoc),
- children: [createInterpolation(`v`, mockLoc)]
+ loc: locStub,
+ source: createSimpleExpression(`list`, false, locStub),
+ valueAlias: createSimpleExpression(`v`, false, locStub),
+ keyAlias: createSimpleExpression(`k`, false, locStub),
+ objectIndexAlias: createSimpleExpression(`i`, false, locStub),
+ children: [createInterpolation(`v`, locStub)]
}
]
}),
children: [
{
type: NodeTypes.FOR,
- loc: mockLoc,
- source: createSimpleExpression(`list`, false, mockLoc),
+ loc: locStub,
+ source: createSimpleExpression(`list`, false, locStub),
valueAlias: undefined,
- keyAlias: createSimpleExpression(`k`, false, mockLoc),
- objectIndexAlias: createSimpleExpression(`i`, false, mockLoc),
- children: [createInterpolation(`v`, mockLoc)]
+ keyAlias: createSimpleExpression(`k`, false, locStub),
+ objectIndexAlias: createSimpleExpression(`i`, false, locStub),
+ children: [createInterpolation(`v`, locStub)]
}
]
})
children: [
{
type: NodeTypes.FOR,
- loc: mockLoc,
- source: createSimpleExpression(`list`, false, mockLoc),
- valueAlias: createSimpleExpression(`v`, false, mockLoc),
+ loc: locStub,
+ source: createSimpleExpression(`list`, false, locStub),
+ valueAlias: createSimpleExpression(`v`, false, locStub),
keyAlias: undefined,
- objectIndexAlias: createSimpleExpression(`i`, false, mockLoc),
- children: [createInterpolation(`v`, mockLoc)]
+ objectIndexAlias: createSimpleExpression(`i`, false, locStub),
+ children: [createInterpolation(`v`, locStub)]
}
]
})
children: [
{
type: NodeTypes.FOR,
- loc: mockLoc,
- source: createSimpleExpression(`list`, false, mockLoc),
+ loc: locStub,
+ source: createSimpleExpression(`list`, false, locStub),
valueAlias: undefined,
keyAlias: undefined,
- objectIndexAlias: createSimpleExpression(`i`, false, mockLoc),
- children: [createInterpolation(`v`, mockLoc)]
+ objectIndexAlias: createSimpleExpression(`i`, false, locStub),
+ children: [createInterpolation(`v`, locStub)]
}
]
})
ns: Namespaces.HTML,
isSelfClosing: false,
tag: `Comp`,
- loc: mockLoc,
+ loc: locStub,
props: [],
children: [],
codegenNode: {
type: NodeTypes.JS_CALL_EXPRESSION,
- loc: mockLoc,
+ loc: locStub,
callee: `_${CREATE_VNODE}`,
arguments: [
`Comp`,
`0`,
{
type: NodeTypes.JS_OBJECT_EXPRESSION,
- loc: mockLoc,
+ loc: locStub,
properties: [
{
type: NodeTypes.JS_PROPERTY,
- loc: mockLoc,
+ loc: locStub,
key: {
type: NodeTypes.SIMPLE_EXPRESSION,
isStatic: true,
content: `default`,
- loc: mockLoc
+ loc: locStub
},
value: {
type: NodeTypes.JS_SLOT_FUNCTION,
- loc: mockLoc,
+ loc: locStub,
params: {
type: NodeTypes.SIMPLE_EXPRESSION,
isStatic: false,
content: `{ foo }`,
- loc: mockLoc
+ loc: locStub
},
returns: [
{
type: NodeTypes.INTERPOLATION,
- loc: mockLoc,
+ loc: locStub,
content: {
type: NodeTypes.SIMPLE_EXPRESSION,
isStatic: false,
content: `foo`,
- loc: mockLoc
+ loc: locStub
}
}
]
})
test('callExpression + objectExpression + arrayExpression', () => {
- function createElementWithCodegen(
- args: CallExpression['arguments']
- ): ElementNode {
- return {
- type: NodeTypes.ELEMENT,
- loc: mockLoc,
- ns: Namespaces.HTML,
- tag: 'div',
- tagType: ElementTypes.ELEMENT,
- isSelfClosing: false,
- props: [],
- children: [],
- codegenNode: {
- type: NodeTypes.JS_CALL_EXPRESSION,
- loc: mockLoc,
- callee: CREATE_VNODE,
- arguments: args
- }
- }
- }
-
const { code } = generate(
createRoot({
children: [
createObjectExpression(
[
createObjectProperty(
- createSimpleExpression(`id`, true, mockLoc),
- createSimpleExpression(`foo`, true, mockLoc)
+ createSimpleExpression(`id`, true, locStub),
+ createSimpleExpression(`foo`, true, locStub)
),
createObjectProperty(
- createSimpleExpression(`prop`, false, mockLoc),
- createSimpleExpression(`bar`, false, mockLoc)
+ createSimpleExpression(`prop`, false, locStub),
+ createSimpleExpression(`bar`, false, locStub)
),
// compound expression as computed key
createObjectProperty(
{
type: NodeTypes.COMPOUND_EXPRESSION,
- loc: mockLoc,
+ loc: locStub,
children: [
`foo + `,
- createSimpleExpression(`bar`, false, mockLoc)
+ createSimpleExpression(`bar`, false, locStub)
]
},
- createSimpleExpression(`bar`, false, mockLoc)
+ createSimpleExpression(`bar`, false, locStub)
)
],
- mockLoc
+ locStub
),
// ChildNode[]
[
[
createObjectProperty(
// should quote the key!
- createSimpleExpression(`some-key`, true, mockLoc),
- createSimpleExpression(`foo`, true, mockLoc)
+ createSimpleExpression(`some-key`, true, locStub),
+ createSimpleExpression(`foo`, true, locStub)
)
],
- mockLoc
+ locStub
)
])
],
'foo',
{
type: NodeTypes.JS_CALL_EXPRESSION,
- loc: mockLoc,
+ loc: locStub,
callee: CREATE_VNODE,
arguments: [`"p"`]
}
],
- mockLoc
+ locStub
)
])
]
expect(code).toMatchSnapshot()
})
- test.todo('SequenceExpression')
+ test('SequenceExpression', () => {
+ const { code } = generate(
+ createRoot({
+ children: [
+ {
+ type: NodeTypes.IF,
+ loc: locStub,
+ branches: [],
+ codegenNode: createSequenceExpression([
+ createSimpleExpression(`foo`, false),
+ createCallExpression(`bar`, [`baz`])
+ ])
+ }
+ ]
+ })
+ )
+ expect(code).toMatch(`return (foo, bar(baz))`)
+ expect(code).toMatchSnapshot()
+ })
- test.todo('ConditionalExpression')
+ test('ConditionalExpression', () => {
+ const { code } = generate(
+ createRoot({
+ children: [
+ {
+ type: NodeTypes.IF,
+ loc: locStub,
+ branches: [],
+ codegenNode: createSequenceExpression([
+ createSimpleExpression(`foo`, false),
+ createConditionalExpression(
+ createSimpleExpression(`ok`, false),
+ createCallExpression(`foo`),
+ createConditionalExpression(
+ createSimpleExpression(`orNot`, false),
+ createCallExpression(`bar`),
+ createCallExpression(`baz`)
+ )
+ )
+ ])
+ }
+ ]
+ })
+ )
+ expect(code).toMatch(
+ `return (foo, ok
+ ? foo()
+ : orNot
+ ? bar()
+ : baz())`
+ )
+ expect(code).toMatchSnapshot()
+ })
})