You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.1 KiB
74 lines
2.1 KiB
'use strict'; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
var helperPluginUtils = require('@babel/helper-plugin-utils'); |
|
var pluginProposalOptionalChaining = require('@babel/plugin-proposal-optional-chaining'); |
|
var helperSkipTransparentExpressionWrappers = require('@babel/helper-skip-transparent-expression-wrappers'); |
|
var core = require('@babel/core'); |
|
|
|
function matchAffectedArguments(argumentNodes) { |
|
const spreadIndex = argumentNodes.findIndex(node => core.types.isSpreadElement(node)); |
|
return spreadIndex >= 0 && spreadIndex !== argumentNodes.length - 1; |
|
} |
|
|
|
function shouldTransform(path) { |
|
let optionalPath = path; |
|
const chains = []; |
|
|
|
while (optionalPath.isOptionalMemberExpression() || optionalPath.isOptionalCallExpression()) { |
|
const { |
|
node |
|
} = optionalPath; |
|
chains.push(node); |
|
|
|
if (optionalPath.isOptionalMemberExpression()) { |
|
optionalPath = helperSkipTransparentExpressionWrappers.skipTransparentExprWrappers(optionalPath.get("object")); |
|
} else if (optionalPath.isOptionalCallExpression()) { |
|
optionalPath = helperSkipTransparentExpressionWrappers.skipTransparentExprWrappers(optionalPath.get("callee")); |
|
} |
|
} |
|
|
|
for (let i = 0; i < chains.length; i++) { |
|
const node = chains[i]; |
|
|
|
if (core.types.isOptionalCallExpression(node) && matchAffectedArguments(node.arguments)) { |
|
if (node.optional) { |
|
return true; |
|
} |
|
|
|
const callee = chains[i + 1]; |
|
|
|
if (core.types.isOptionalMemberExpression(callee, { |
|
optional: true |
|
})) { |
|
return true; |
|
} |
|
} |
|
} |
|
|
|
return false; |
|
} |
|
|
|
var index = helperPluginUtils.declare(api => { |
|
api.assertVersion(7); |
|
const noDocumentAll = api.assumption("noDocumentAll"); |
|
const pureGetters = api.assumption("pureGetters"); |
|
return { |
|
name: "bugfix-v8-spread-parameters-in-optional-chaining", |
|
visitor: { |
|
"OptionalCallExpression|OptionalMemberExpression"(path) { |
|
if (shouldTransform(path)) { |
|
pluginProposalOptionalChaining.transform(path, { |
|
noDocumentAll, |
|
pureGetters |
|
}); |
|
} |
|
} |
|
|
|
} |
|
}; |
|
}); |
|
|
|
exports.default = index; |
|
//# sourceMappingURL=index.js.map
|
|
|