| | |
| | | Object.defineProperty(exports, "__esModule", { |
| | | value: true |
| | | }); |
| | | exports.FEATURES = void 0; |
| | | exports.enableFeature = enableFeature; |
| | | exports.isLoose = isLoose; |
| | | exports.verifyUsedFeatures = verifyUsedFeatures; |
| | | exports.FEATURES = void 0; |
| | | exports.shouldTransform = shouldTransform; |
| | | |
| | | var _decorators = require("./decorators"); |
| | | |
| | |
| | | return !!(file.get(looseLowPriorityKey) & feature); |
| | | } |
| | | |
| | | function verifyUsedFeatures(path, file) { |
| | | function shouldTransform(path, file) { |
| | | let decoratorPath = null; |
| | | let publicFieldPath = null; |
| | | let privateFieldPath = null; |
| | | let privateMethodPath = null; |
| | | let staticBlockPath = null; |
| | | |
| | | if ((0, _decorators.hasOwnDecorators)(path.node)) { |
| | | if (!hasFeature(file, FEATURES.decorators)) { |
| | | throw path.buildCodeFrameError("Decorators are not enabled." + "\nIf you are using " + '["@babel/plugin-proposal-decorators", { "legacy": true }], ' + 'make sure it comes *before* "@babel/plugin-proposal-class-properties" ' + "and enable loose mode, like so:\n" + '\t["@babel/plugin-proposal-decorators", { "legacy": true }]\n' + '\t["@babel/plugin-proposal-class-properties", { "loose": true }]'); |
| | | decoratorPath = path.get("decorators.0"); |
| | | } |
| | | |
| | | for (const el of path.get("body.body")) { |
| | | if (!decoratorPath && (0, _decorators.hasOwnDecorators)(el.node)) { |
| | | decoratorPath = el.get("decorators.0"); |
| | | } |
| | | |
| | | if (path.isPrivate()) { |
| | | throw path.buildCodeFrameError(`Private ${path.isClassMethod() ? "methods" : "fields"} in decorated classes are not supported yet.`); |
| | | if (!publicFieldPath && el.isClassProperty()) { |
| | | publicFieldPath = el; |
| | | } |
| | | |
| | | if (!privateFieldPath && el.isClassPrivateProperty()) { |
| | | privateFieldPath = el; |
| | | } |
| | | |
| | | if (!privateMethodPath && el.isClassPrivateMethod != null && el.isClassPrivateMethod()) { |
| | | privateMethodPath = el; |
| | | } |
| | | |
| | | if (!staticBlockPath && el.isStaticBlock != null && el.isStaticBlock()) { |
| | | staticBlockPath = el; |
| | | } |
| | | } |
| | | |
| | | if (path.isClassPrivateMethod != null && path.isClassPrivateMethod()) { |
| | | if (!hasFeature(file, FEATURES.privateMethods)) { |
| | | throw path.buildCodeFrameError("Class private methods are not enabled."); |
| | | } |
| | | if (decoratorPath && privateFieldPath) { |
| | | throw privateFieldPath.buildCodeFrameError("Private fields in decorated classes are not supported yet."); |
| | | } |
| | | |
| | | if (path.isPrivateName() && path.parentPath.isBinaryExpression({ |
| | | operator: "in", |
| | | left: path.node |
| | | })) { |
| | | if (!hasFeature(file, FEATURES.privateIn)) { |
| | | throw path.buildCodeFrameError("Private property in checks are not enabled."); |
| | | } |
| | | if (decoratorPath && privateMethodPath) { |
| | | throw privateMethodPath.buildCodeFrameError("Private methods in decorated classes are not supported yet."); |
| | | } |
| | | |
| | | if (path.isProperty()) { |
| | | if (!hasFeature(file, FEATURES.fields)) { |
| | | throw path.buildCodeFrameError("Class fields are not enabled."); |
| | | } |
| | | if (decoratorPath && !hasFeature(file, FEATURES.decorators)) { |
| | | throw path.buildCodeFrameError("Decorators are not enabled." + "\nIf you are using " + '["@babel/plugin-proposal-decorators", { "legacy": true }], ' + 'make sure it comes *before* "@babel/plugin-proposal-class-properties" ' + "and enable loose mode, like so:\n" + '\t["@babel/plugin-proposal-decorators", { "legacy": true }]\n' + '\t["@babel/plugin-proposal-class-properties", { "loose": true }]'); |
| | | } |
| | | |
| | | if (path.isStaticBlock != null && path.isStaticBlock()) { |
| | | if (!hasFeature(file, FEATURES.staticBlocks)) { |
| | | throw path.buildCodeFrameError("Static class blocks are not enabled. " + "Please add `@babel/plugin-proposal-class-static-block` to your configuration."); |
| | | } |
| | | if (privateMethodPath && !hasFeature(file, FEATURES.privateMethods)) { |
| | | throw privateMethodPath.buildCodeFrameError("Class private methods are not enabled. " + "Please add `@babel/plugin-proposal-private-method` to your configuration."); |
| | | } |
| | | |
| | | if ((publicFieldPath || privateFieldPath) && !hasFeature(file, FEATURES.fields) && !hasFeature(file, FEATURES.privateMethods)) { |
| | | throw path.buildCodeFrameError("Class fields are not enabled. " + "Please add `@babel/plugin-proposal-class-properties` to your configuration."); |
| | | } |
| | | |
| | | if (staticBlockPath && !hasFeature(file, FEATURES.staticBlocks)) { |
| | | throw path.buildCodeFrameError("Static class blocks are not enabled. " + "Please add `@babel/plugin-proposal-class-static-block` to your configuration."); |
| | | } |
| | | |
| | | if (decoratorPath || privateMethodPath || staticBlockPath) { |
| | | return true; |
| | | } |
| | | |
| | | if ((publicFieldPath || privateFieldPath) && hasFeature(file, FEATURES.fields)) { |
| | | return true; |
| | | } |
| | | |
| | | return false; |
| | | } |