Skip to content

Fix: support for class component mixins #334

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions e2e/__projects__/basic/components/ClassComponentProperty.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<template>
<div class="hello">
<h1 data-computed>{{ computedMsg }}</h1>
<h2 data-props>{{ msg }}</h2>
</div>
</template>

<script lang="ts">
import { Vue, Prop } from 'vue-property-decorator'

export default class ClassComponent extends Vue {
dataText: string = 'Hello'

@Prop() msg!: string

get computedMsg(): string {
return `Message: ${this.dataText}`
}
}
</script>
12 changes: 12 additions & 0 deletions e2e/__projects__/basic/components/ClassComponentWithMixin.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<template>
<div class="hello">
<h1 data-mixin>{{ message }}</h1>
</div>
</template>

<script lang="ts">
import { mixins } from 'vue-class-component'
import ClassMixin from './ClassMixin'

export default class ClassComponent extends mixins(ClassMixin) {}
</script>
5 changes: 5 additions & 0 deletions e2e/__projects__/basic/components/ClassMixin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { Vue } from 'vue-class-component'

export default class ClassMixin extends Vue {
message = 'Hello world!'
}
7 changes: 5 additions & 2 deletions e2e/__projects__/basic/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,18 @@
"jest": "^26.0.0",
"ts-jest": "^26.4.4",
"typescript": "^4.1.2",
"vue-class-component": "^8.0.0-beta.4"
"vue-class-component": "^8.0.0-beta.4",
"vue-property-decorator": "^10.0.0-rc.3"
},
"jest": {
"moduleFileExtensions": [
"js",
"json",
"vue"
"vue",
"ts"
],
"transform": {
"^.+\\.ts$": "ts-jest",
"^.+\\.js$": "babel-jest",
"^.+\\.vue$": "../../../lib/index.js"
},
Expand Down
21 changes: 21 additions & 0 deletions e2e/__projects__/basic/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import Pug from './components/Pug.vue'
import Coffee from './components/Coffee.vue'
import Basic from './components/Basic.vue'
import ClassComponent from './components/ClassComponent.vue'
import ClassComponentWithMixin from './components/ClassComponentWithMixin.vue'
import ClassComponentProperty from './components/ClassComponentProperty.vue'
import TypeScript from './components/TypeScript.vue'
import jestVue from '../../../'
import RenderFunction from './components/RenderFunction.vue'
Expand Down Expand Up @@ -141,6 +143,25 @@ test('supports class component .vue files', () => {
})
})

test('supports class component .vue files with mixins', () => {
expect.assertions(1)
mount(ClassComponentWithMixin)
expect(document.querySelector('[data-mixin]').textContent).toBe(
'Hello world!'
)
})

test('supports class component .vue files using vue-property-decorator', () => {
expect.assertions(2)
mount(ClassComponentProperty, { msg: 'Props Message' })
expect(document.querySelector('[data-computed]').textContent).toBe(
'Message: Hello'
)
expect(document.querySelector('[data-props]').textContent).toBe(
'Props Message'
)
})

// TODO: How do functional components work in Vue 3?
xtest('processes functional components', () => {
// const clickSpy = jest.fn()
Expand Down
6 changes: 4 additions & 2 deletions lib/generate-code.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,10 @@ module.exports = function generateCode(
var tempOutput = node.toString()

if (
tempOutput.match(/\}\(.*.?Vue\);/) &&
tempOutput.includes('vue-class-component')
// vue-property-decorator also exports Vue, which can be used to create a class component.
// In that case vue-class-component is not present in the tempOutput.
tempOutput.includes('vue-class-component') ||
tempOutput.includes('vue-property-decorator')
) {
node.add(`
;exports.default = {
Expand Down