Function parameter decorator transform plugin for babel v7, just like typescript.
npm install babel-plugin-parameter-decorator



Function parameter decorator transform plugin for babel v7, just like typescript parameter decorator
``javascript
function validate(target, property, descriptor) {
const fn = descriptor.value;
descriptor.value = function (...args) {
const metadata = meta_${property};${metadata.key} is required
target[metadata].forEach(function (metadata) {
if (args[metadata.index] === undefined) {
throw new Error();
}
});
return fn.apply(this, args);
};
return descriptor;
}
function required(key) {
return function (target, propertyKey, parameterIndex) {
const metadata = meta_${propertyKey};
target[metadata] = [
...(target[metadata] || []),
{
index: parameterIndex,
key
}
]
};
}
class Greeter {
constructor(message) {
this.greeting = message;
}
@validate
greet(@required('name') name) {
return "Hello " + name + ", " + this.greeting;
}
}
`
#### NOTE:
This package depends on @babel/plugin-proposal-decorators.
npm install @babel/plugin-proposal-decorators babel-plugin-parameter-decorator -D
And the .babelrc looks like:
``
{
"plugins": [
["@babel/plugin-proposal-decorators", { "legacy": true }],
"babel-plugin-parameter-decorator"
]
}
By default, @babel/preset-typescript will remove imports only referenced in Decorators.onlyRemoveTypeImports
Since this is prone to break Decorators, make sure disable it by setting to true:
``
{
...
"presets": [
[
"@babel/preset-typescript",
{ "onlyRemoveTypeImports": true }
]
]
...
}
If you'd like to compile typescript files by babel, the file extensions .ts or .tsx expected, or we will get runtime error!
š Hopefully this plugin would get along with typescript private/public keywords in constructor. For example,
`typescript
@Factory
class Greeter {
private counter: Counter = this.sentinel.counter;
constructor(private greeting: string, @Inject(Sentinel) private sentinel: Sentinel) {
}
@validate
greet(@required('name') name: string) {
return "Hello " + name + ", " + this.greeting;
}
count() {
return this.counter.number;
}
}
`.babelrc
And your looks like:
```
{
"presets": [
"@babel/preset-env",
"@babel/preset-typescript"
],
"plugins": [
["@babel/plugin-proposal-decorators", { "legacy": true }],
["@babel/plugin-proposal-class-properties", { "loose" : true }],
"babel-plugin-parameter-decorator"
]
}