Socket
Socket
Sign inDemoInstall

@babel/plugin-proposal-decorators

Package Overview
Dependencies
Maintainers
5
Versions
124
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@babel/plugin-proposal-decorators - npm Package Compare versions

Comparing version 7.0.0-beta.44 to 7.0.0-beta.45

lib/transformer-legacy.js

149

lib/index.js

@@ -28,153 +28,24 @@ "use strict";

function _core() {
var data = require("@babel/core");
var _transformer = _interopRequireDefault(require("./transformer"));
_core = function _core() {
return data;
};
var _transformerLegacy = _interopRequireDefault(require("./transformer-legacy"));
return data;
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var buildClassDecorator = (0, _core().template)("\n DECORATOR(CLASS_REF = INNER) || CLASS_REF;\n");
var buildClassPrototype = (0, _core().template)("\n CLASS_REF.prototype;\n");
var buildGetDescriptor = (0, _core().template)("\n Object.getOwnPropertyDescriptor(TARGET, PROPERTY);\n");
var buildGetObjectInitializer = (0, _core().template)("\n (TEMP = Object.getOwnPropertyDescriptor(TARGET, PROPERTY), (TEMP = TEMP ? TEMP.value : undefined), {\n enumerable: true,\n configurable: true,\n writable: true,\n initializer: function(){\n return TEMP;\n }\n })\n");
var _default = (0, _helperPluginUtils().declare)(function (api) {
var _default = (0, _helperPluginUtils().declare)(function (api, options) {
api.assertVersion(7);
var WARNING_CALLS = new WeakSet();
var _options$legacy = options.legacy,
legacy = _options$legacy === void 0 ? false : _options$legacy;
function applyEnsureOrdering(path) {
var decorators = (path.isClass() ? [path].concat(path.get("body.body")) : path.get("properties")).reduce(function (acc, prop) {
return acc.concat(prop.node.decorators || []);
}, []);
var identDecorators = decorators.filter(function (decorator) {
return !_core().types.isIdentifier(decorator.expression);
});
if (identDecorators.length === 0) return;
return _core().types.sequenceExpression(identDecorators.map(function (decorator) {
var expression = decorator.expression;
var id = decorator.expression = path.scope.generateDeclaredUidIdentifier("dec");
return _core().types.assignmentExpression("=", id, expression);
}).concat([path.node]));
if (typeof legacy !== "boolean") {
throw new Error("'legacy' must be a boolean.");
}
function applyClassDecorators(classPath) {
if (!hasClassDecorators(classPath.node)) return;
var decorators = classPath.node.decorators || [];
classPath.node.decorators = null;
var name = classPath.scope.generateDeclaredUidIdentifier("class");
return decorators.map(function (dec) {
return dec.expression;
}).reverse().reduce(function (acc, decorator) {
return buildClassDecorator({
CLASS_REF: _core().types.cloneNode(name),
DECORATOR: _core().types.cloneNode(decorator),
INNER: acc
}).expression;
}, classPath.node);
if (legacy !== true) {
throw new Error("The new decorators proposal is not supported yet." + ' You must pass the `"legacy": true` option to' + " @babel/plugin-proposal-decorators");
}
function hasClassDecorators(classNode) {
return !!(classNode.decorators && classNode.decorators.length);
}
function applyMethodDecorators(path, state) {
if (!hasMethodDecorators(path.node.body.body)) return;
return applyTargetDecorators(path, state, path.node.body.body);
}
function hasMethodDecorators(body) {
return body.some(function (node) {
return node.decorators && node.decorators.length;
});
}
function applyObjectDecorators(path, state) {
if (!hasMethodDecorators(path.node.properties)) return;
return applyTargetDecorators(path, state, path.node.properties);
}
function applyTargetDecorators(path, state, decoratedProps) {
var name = path.scope.generateDeclaredUidIdentifier(path.isClass() ? "class" : "obj");
var exprs = decoratedProps.reduce(function (acc, node) {
var decorators = node.decorators || [];
node.decorators = null;
if (decorators.length === 0) return acc;
if (node.computed) {
throw path.buildCodeFrameError("Computed method/property decorators are not yet supported.");
}
var property = _core().types.isLiteral(node.key) ? node.key : _core().types.stringLiteral(node.key.name);
var target = path.isClass() && !node.static ? buildClassPrototype({
CLASS_REF: name
}).expression : name;
if (_core().types.isClassProperty(node, {
static: false
})) {
var descriptor = path.scope.generateDeclaredUidIdentifier("descriptor");
var initializer = node.value ? _core().types.functionExpression(null, [], _core().types.blockStatement([_core().types.returnStatement(node.value)])) : _core().types.nullLiteral();
node.value = _core().types.callExpression(state.addHelper("initializerWarningHelper"), [descriptor, _core().types.thisExpression()]);
WARNING_CALLS.add(node.value);
acc = acc.concat([_core().types.assignmentExpression("=", descriptor, _core().types.callExpression(state.addHelper("applyDecoratedDescriptor"), [_core().types.cloneNode(target), _core().types.cloneNode(property), _core().types.arrayExpression(decorators.map(function (dec) {
return _core().types.cloneNode(dec.expression);
})), _core().types.objectExpression([_core().types.objectProperty(_core().types.identifier("enumerable"), _core().types.booleanLiteral(true)), _core().types.objectProperty(_core().types.identifier("initializer"), initializer)])]))]);
} else {
acc = acc.concat(_core().types.callExpression(state.addHelper("applyDecoratedDescriptor"), [_core().types.cloneNode(target), _core().types.cloneNode(property), _core().types.arrayExpression(decorators.map(function (dec) {
return _core().types.cloneNode(dec.expression);
})), _core().types.isObjectProperty(node) || _core().types.isClassProperty(node, {
static: true
}) ? buildGetObjectInitializer({
TEMP: path.scope.generateDeclaredUidIdentifier("init"),
TARGET: _core().types.cloneNode(target),
PROPERTY: _core().types.cloneNode(property)
}).expression : buildGetDescriptor({
TARGET: _core().types.cloneNode(target),
PROPERTY: _core().types.cloneNode(property)
}).expression, _core().types.cloneNode(target)]));
}
return acc;
}, []);
return _core().types.sequenceExpression([_core().types.assignmentExpression("=", _core().types.cloneNode(name), path.node), _core().types.sequenceExpression(exprs), _core().types.cloneNode(name)]);
}
return {
inherits: _pluginSyntaxDecorators().default,
visitor: {
ClassDeclaration: function ClassDeclaration(path) {
var node = path.node;
if (!hasClassDecorators(node) && !hasMethodDecorators(node.body.body)) {
return;
}
var ref = node.id ? _core().types.cloneNode(node.id) : path.scope.generateUidIdentifier("class");
var letDeclaration = _core().types.variableDeclaration("let", [_core().types.variableDeclarator(ref, _core().types.toExpression(node))]);
if (path.parentPath.isExportDefaultDeclaration()) {
path.parentPath.replaceWithMultiple([letDeclaration, _core().types.exportNamedDeclaration(null, [_core().types.exportSpecifier(_core().types.cloneNode(ref), _core().types.identifier("default"))])]);
} else {
path.replaceWith(letDeclaration);
}
},
ClassExpression: function ClassExpression(path, state) {
var decoratedClass = applyEnsureOrdering(path) || applyClassDecorators(path, state) || applyMethodDecorators(path, state);
if (decoratedClass) path.replaceWith(decoratedClass);
},
ObjectExpression: function ObjectExpression(path, state) {
var decoratedObject = applyEnsureOrdering(path) || applyObjectDecorators(path, state);
if (decoratedObject) path.replaceWith(decoratedObject);
},
AssignmentExpression: function AssignmentExpression(path, state) {
if (!WARNING_CALLS.has(path.node.right)) return;
path.replaceWith(_core().types.callExpression(state.addHelper("initializerDefineProperty"), [_core().types.cloneNode(path.get("left.object").node), _core().types.stringLiteral(path.get("left.property").node.name), _core().types.cloneNode(path.get("right.arguments")[0].node), _core().types.cloneNode(path.get("right.arguments")[1].node)]));
}
}
visitor: legacy ? _transformerLegacy.default : _transformer.default
};

@@ -181,0 +52,0 @@ });

{
"name": "@babel/plugin-proposal-decorators",
"version": "7.0.0-beta.44",
"version": "7.0.0-beta.45",
"author": "Logan Smyth <loganfsmyth@gmail.com>",

@@ -15,12 +15,12 @@ "license": "MIT",

"dependencies": {
"@babel/helper-plugin-utils": "7.0.0-beta.44",
"@babel/plugin-syntax-decorators": "7.0.0-beta.44"
"@babel/helper-plugin-utils": "7.0.0-beta.45",
"@babel/plugin-syntax-decorators": "7.0.0-beta.45"
},
"peerDependencies": {
"@babel/core": "7.0.0-beta.44"
"@babel/core": "7.0.0-beta.45"
},
"devDependencies": {
"@babel/core": "7.0.0-beta.44",
"@babel/helper-plugin-test-runner": "7.0.0-beta.44"
"@babel/core": "7.0.0-beta.45",
"@babel/helper-plugin-test-runner": "7.0.0-beta.45"
}
}

@@ -65,7 +65,29 @@ # @babel/plugin-proposal-decorators

#### NOTE: Order of Plugins Matters!
### Via CLI
```sh
babel --plugins @babel/plugin-proposal-decorators script.js
```
### Via Node API
```javascript
require("@babel/core").transform("code", {
plugins: ["@babel/plugin-proposal-decorators"]
});
```
## Options
### `legacy`
`boolean`, defaults to `false`.
Use the legacy (stage 1) decorators syntax and behavior.
#### NOTE: Compatibility with `@babel/plugin-proposal-class-properties`
If you are including your plugins manually and using `@babel/plugin-proposal-class-properties`, make sure that `@babel/plugin-proposal-decorators` comes *before* `@babel/plugin-proposal-class-properties`.
Currently, `@babel/plugin-proposal-class-properties` must be used in `loose` mode to support the `@babel/plugin-proposal-decorators`. To use `@babel/plugin-proposal-class-properties` in spec mode with decorators, wait for the next major version of decorators (Stage 2).
When using the `legacy: true` mode, `@babel/plugin-proposal-class-properties` must be used in `loose` mode to support the `@babel/plugin-proposal-decorators`.

@@ -89,3 +111,3 @@ Wrong:

"@babel/plugin-proposal-decorators",
["@babel/plugin-proposal-class-properties", { "loose" : true }]
"@babel/plugin-proposal-class-properties"
]

@@ -95,18 +117,13 @@ }

### Via CLI
```sh
babel --plugins @babel/plugin-proposal-decorators script.js
```json
{
"plugins": [
["@babel/plugin-proposal-decorators", { "legacy": true }],
["@babel/plugin-proposal-class-properties", { "loose" : true }]
]
}
```
### Via Node API
```javascript
require("@babel/core").transform("code", {
plugins: ["@babel/plugin-proposal-decorators"]
});
```
## References
* [Proposal: JavaScript Decorators](https://github.com/wycats/javascript-decorators/blob/master/README.md)
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc