@babel/plugin-proposal-decorators
Advanced tools
Comparing version 7.0.0-beta.44 to 7.0.0-beta.45
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) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
11803
5
175
127
1
+ Added@babel/code-frame@7.0.0-beta.45(transitive)
+ Added@babel/core@7.0.0-beta.45(transitive)
+ Added@babel/generator@7.0.0-beta.45(transitive)
+ Added@babel/helper-function-name@7.0.0-beta.45(transitive)
+ Added@babel/helper-get-function-arity@7.0.0-beta.45(transitive)
+ Added@babel/helper-plugin-utils@7.0.0-beta.45(transitive)
+ Added@babel/helper-split-export-declaration@7.0.0-beta.45(transitive)
+ Added@babel/helpers@7.0.0-beta.45(transitive)
+ Added@babel/highlight@7.0.0-beta.45(transitive)
+ Added@babel/plugin-syntax-decorators@7.0.0-beta.45(transitive)
+ Added@babel/template@7.0.0-beta.45(transitive)
+ Added@babel/traverse@7.0.0-beta.45(transitive)
+ Added@babel/types@7.0.0-beta.45(transitive)
+ Addedbabylon@7.0.0-beta.45(transitive)
- Removed@babel/code-frame@7.0.0-beta.44(transitive)
- Removed@babel/core@7.0.0-beta.44(transitive)
- Removed@babel/generator@7.0.0-beta.44(transitive)
- Removed@babel/helper-function-name@7.0.0-beta.44(transitive)
- Removed@babel/helper-get-function-arity@7.0.0-beta.44(transitive)
- Removed@babel/helper-plugin-utils@7.0.0-beta.44(transitive)
- Removed@babel/helper-split-export-declaration@7.0.0-beta.44(transitive)
- Removed@babel/helpers@7.0.0-beta.44(transitive)
- Removed@babel/highlight@7.0.0-beta.44(transitive)
- Removed@babel/plugin-syntax-decorators@7.0.0-beta.44(transitive)
- Removed@babel/template@7.0.0-beta.44(transitive)
- Removed@babel/traverse@7.0.0-beta.44(transitive)
- Removed@babel/types@7.0.0-beta.44(transitive)
- Removedbabylon@7.0.0-beta.44(transitive)