babel-plugin-strip-decorator
Babal plugin to remove decorators based on their identifiers.
Last updated 4 years ago by elie.rotenberg .
MIT · Repository · Bugs · Original npm · Tarball · package.json
$ cnpm install babel-plugin-strip-decorator 
SYNC missed versions from official npm registry.

babel-plugin-strip-decorator

Babel plugin which strips all decorators with the given identifier. Use case in mind is to remove dev-only typechecking decorators such as typecheck-decorator.

Example

Use the transform as following:

import stripDecorator from 'babel-plugin-strip-decorator';

babel.transform(code, {
  plugins: [{
    // the name of the target decorator has no '@'
    transformer: stripDecorator('devDecorator'),
    // must be applied before es7.decorators transform
    position: 'before',
  }],
});

In this case, the following code:

class A {
  @devDecorator()
  method() { ... }
}

is transformed into code equivalent to:

class A {
  method() { ... }
}

API

stripDecorator(...decoratorNames) returns a babel plugin which removes all occurences of decorators in the form @decoratorName or @decoratorName(...) where decoratorName is any string in decoratorNames.

babel.transform(code, {
  plugins: [
    { transformer: stripDecorator(
      'decoratorA',
      'decoratorB',
      'decoratorC'
    ), position: 'before' },
  ],
});

This will remove all occurences of decorators named either decoratorA, decoratorB or decoratorC.

Notes

This plugin is intentionally dumb and simple. It looks for a decorator with a given string identifier. It doesn't care whether this decorator actually exists or whatever. This is a feature, not a bug, eg. you can have 2 references to the same decorator (eg. @prodTypecheck and @devTypecheck both mapping to @typecheck) but only strip one (eg. strip @devTypecheck but leave @prodTypecheck).

Also note that the decorator invokation is completely stripped away. Any side effects caused by the then-stripped decorator invokation is also removed (relying on such a side effect would probably be a code smell in the first place anyway though).

For example the following code would break if stripDecorator('causeSideEffect') is applied:

let a = 0;
class A {
  @causeSideEffect(a = a + 1)
  test() { ... }
}
assert(a === 1); // will throw only if stripDecorator('causeSideEffect') is applied

Current Tags

  • 1.0.0                                ...           latest (4 years ago)

2 Versions

  • 1.0.0                                ...           4 years ago
  • 0.0.1                                ...           4 years ago
Maintainers (1)
Downloads
Today 0
This Week 0
This Month 2
Last Day 0
Last Week 2
Last Month 0
Dependencies (1)
Dev Dependencies (15)
Dependents (1)

Copyright 2014 - 2016 © taobao.org |