vue-property-decorator-transpiler
Version:
Transpiles classes written in vue-property-decorator back to simple Vue component global registration.
112 lines (89 loc) • 3.12 kB
Markdown
# vue-property-decorator-transpiler
Transpiles classes written in [vue-property-decorator](https://www.npmjs.com/package/vue-property-decorator) back to simple Vue component global registration.
I created this package because I really enjoy the coding experience of vue-property-decorator, but I really don't like the way it runs, with all the modules and requirings etc. I want to develop using vue-property-decorator, but end up with the old-fashioned Vue component global registration code, and this package does exactly that.
For the moment this package does not fully support all syntaxes of vue-property-decorator, and everything that is currently supported is demonstrated in the example below.
## License
MIT License
## Install
```bash
npm install vue-property-decorator-transpiler --save-dev
```
## Usage
```javascript
var transpiler = require('vue-property-decorator-transpiler');
var result = transpiler(code);
```
Since version 2, you can pass a template string to `transpiler` as a second argument, and it will be precompiled into render function in the resulted code.
Now if the `code` looks like this:
```typescript
import { Component, Vue, Prop, Watch, Provide, Inject } from 'vue-property-decorator';
({
name: "test",
template: "#testTemplate"
})
export default class TestComponent extends Vue {
(Object) readonly prop!: Object;
(String) readonly text: string = "default"; // one way to define default value
({default: "default"}) readonly text2!: string; // another way to define default value
// I add "private" or "public" just to remind myself of different
// types of declarations. It makes no difference to the transpiler.
private field: string = "abc";
('foo') foo = 'foo';
('bar') readonly bar!: string;
get computed() { return 123; }
// Transpiler recognizes all default events of Vue.
private created() { console.log("created"); }
// Transpiler will drop the name of the methods decorated by @Watch
('field') onFieldChanged(v: string) {
console.log("field: " + v);
}
public method() {
console.log("method called.");
}
};
```
The `result` will look like this (formatted for clarity; the package does not format the output code, so that you can use any other package for that purpose)
```javascript
Vue.component('test', {
template: '#testTemplate',
data() {
return {
field: "abc",
foo: 'foo'
};
},
props: {
prop: Object,
text: {
type: String,
default: "default"
},
text2: {
default: "default"
}
},
provide() {
return {
'foo': this.foo
};
},
inject: {
bar: 'bar'
},
watch: {
'field'(v) {
console.log("field: " + v);
}
},
computed: {
computed() { return 123; }
},
methods: {
method() {
console.log("method called.");
}
},
created() { console.log("created"); }
});
```
If the `name` option is not specified in the `` declaration, it will use the lowercased class name as the name of the component; and if the `template` option is not spcified, it will assume that the template has an id equals to the name of the component.