astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
244 lines (207 loc) • 5.83 kB
JavaScript
var _interopRequireDefault = require('@babel/runtime/helpers/interopRequireDefault')
Object.defineProperty(exports, '__esModule', {
value: true,
})
exports.expression = expression
exports.statement = statement
exports.statements = statements
var _toConsumableArray2 = _interopRequireDefault(
require('@babel/runtime/helpers/toConsumableArray')
)
var _compileReplacement = _interopRequireDefault(
require('../compileReplacement')
)
var _convertToExpression = _interopRequireDefault(
require('../convertReplacement/convertToExpression')
)
var _convertStatementReplacement = _interopRequireDefault(
require('../convertReplacement/convertStatementReplacement')
)
var _ensureArray = _interopRequireDefault(require('../util/ensureArray'))
var _Astx = _interopRequireDefault(require('../Astx'))
var _CodeFrameError = _interopRequireDefault(require('../util/CodeFrameError'))
var _Placeholder = require('../compileMatcher/Placeholder')
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
function convertQuasis(nodes) {
var captures = {}
var arrayCaptures = {}
var varNames = []
for (var i = 0; i < nodes.length; i++) {
var replacement = void 0
if (typeof nodes[i] === 'string') {
replacement = nodes[i]
} else if (Array.isArray(nodes[i])) {
replacement = nodes[i]
.map(function (n) {
return n instanceof _Astx['default'] ? n.nodes : n
})
.flat()
} else if (nodes[i] instanceof _Astx['default']) {
var astx = nodes[i]
if (
astx.size > 1 ||
(astx.placeholder &&
(0, _Placeholder.getArrayPlaceholder)(astx.placeholder))
) {
replacement = astx.nodes
} else {
replacement = astx.nodes[0]
}
} else if (nodes[i]) {
replacement = nodes[i]
}
if (typeof replacement === 'string') {
varNames.push(replacement)
} else if (Array.isArray(replacement)) {
var name = '$$tpl___'.concat(i)
arrayCaptures[name] = replacement
varNames.push(name)
} else {
var _name = '$tpl___'.concat(i)
if (replacement) captures[_name] = replacement
varNames.push(_name)
}
}
return {
captures: captures,
arrayCaptures: arrayCaptures,
varNames: varNames,
}
}
function statements(code) {
var _this = this
for (
var _len = arguments.length,
nodes = new Array(_len > 1 ? _len - 1 : 0),
_key = 1;
_key < _len;
_key++
) {
nodes[_key - 1] = arguments[_key]
}
var _convertQuasis = convertQuasis(nodes),
captures = _convertQuasis.captures,
arrayCaptures = _convertQuasis.arrayCaptures,
varNames = _convertQuasis.varNames
var src = (0, _toConsumableArray2['default'])(
(0, _ensureArray['default'])(code)
).reduce(function (result, elem, i) {
return result + varNames[i - 1] + elem
})
try {
if (
!nodes.length ||
nodes.every(function (n) {
return typeof n === 'string'
})
)
return this.parseStatements(src)
var result = (0, _compileReplacement['default'])(
this.parseStatements(src).map(function (n) {
return new _this.t.NodePath(n)
}),
{
backend: this,
}
).generate({
captures: captures,
arrayCaptures: arrayCaptures,
})
return (0, _ensureArray['default'])(result).map(
_convertStatementReplacement['default']
)
} catch (error) {
if (error instanceof Error) {
_CodeFrameError['default'].rethrow(error, {
filename: 'statements',
source: src,
})
}
throw error
}
}
function statement(template) {
var _this$template
for (
var _len2 = arguments.length,
nodes = new Array(_len2 > 1 ? _len2 - 1 : 0),
_key2 = 1;
_key2 < _len2;
_key2++
) {
nodes[_key2 - 1] = arguments[_key2]
}
var result = (_this$template = this.template).statements.apply(
_this$template,
[template].concat(nodes)
)
if (result.length !== 1) {
throw new Error('code is not a statement')
}
return result[0]
}
function expression(code) {
for (
var _len3 = arguments.length,
nodes = new Array(_len3 > 1 ? _len3 - 1 : 0),
_key3 = 1;
_key3 < _len3;
_key3++
) {
nodes[_key3 - 1] = arguments[_key3]
}
var _convertQuasis2 = convertQuasis(nodes),
captures = _convertQuasis2.captures,
arrayCaptures = _convertQuasis2.arrayCaptures,
varNames = _convertQuasis2.varNames
var src = (0, _toConsumableArray2['default'])(
(0, _ensureArray['default'])(code)
).reduce(function (result, elem, i) {
return result + varNames[i - 1] + elem
})
try {
if (
!nodes.length ||
nodes.every(function (n) {
return typeof n === 'string'
})
)
return this.parseExpression(src)
var result = (0, _compileReplacement['default'])(
new this.t.NodePath(this.parseExpression(src)),
{
backend: this,
}
).generate({
captures: captures,
arrayCaptures: arrayCaptures,
})
var _expression
if (Array.isArray(result)) {
if (result.length !== 1) {
throw new Error('code is not an expression: '.concat(src))
}
_expression = (0, _convertToExpression['default'])(result[0])
} else {
_expression = (0, _convertToExpression['default'])(result)
}
if (!_expression) {
throw new Error('code is not an expression: '.concat(src))
}
return _expression
} catch (error) {
if (error instanceof Error) {
_CodeFrameError['default'].rethrow(error, {
filename: 'expression',
source: src,
})
}
throw error
}
}