@vue/vue2-jest
Version:
Jest transformer for Vue 2
107 lines (94 loc) • 2.79 kB
JavaScript
const namespace = require('./constants').vueOptionsNamespace
const { SourceNode, SourceMapConsumer } = require('source-map')
function addToSourceMap(node, result) {
if (result && result.code) {
if (result.map) {
node.add(
SourceNode.fromStringWithSourceMap(
result.code,
new SourceMapConsumer(result.map)
)
)
} else {
node.add(result.code)
}
}
}
module.exports = function generateCode(
scriptResult,
scriptSetupResult,
templateResult,
stylesResult,
customBlocksResult,
isFunctional,
filename
) {
var node = new SourceNode(null, null)
if (scriptResult || scriptSetupResult) {
scriptResult && addToSourceMap(node, scriptResult)
scriptSetupResult && addToSourceMap(node, scriptSetupResult)
} else {
node.add(
`Object.defineProperty(exports, "__esModule", {\n` +
` value: true\n` +
`});\n` +
'module.exports.default = {};\n'
)
}
node.add(
`var ${namespace} = typeof exports.default === 'function' ` +
`? exports.default.options ` +
`: exports.default\n`
)
if (templateResult) {
addToSourceMap(node, templateResult)
node.replaceRight(
'var _c = _vm._self._c || _h',
'/* istanbul ignore next */\nvar _c = _vm._self._c || _h'
)
node.add(
`\n__options__.render = render\n` +
`${namespace}.staticRenderFns = staticRenderFns\n`
)
if (isFunctional) {
node.add(`${namespace}.functional = true\n`)
node.add(`${namespace}._compiled = true\n`)
}
}
if (stylesResult) {
const styleStr = stylesResult
.map(
({ code, moduleName }) =>
`if(!this['${moduleName}']) {\n` +
` this['${moduleName}'] = {};\n` +
`}\n` +
`this['${moduleName}'] = Object.assign(\n` +
`this['${moduleName}'], ${code});\n`
)
.join('')
if (isFunctional) {
node.add(
`;(function() {\n` +
` var originalRender = ${namespace}.render\n` +
` var styleFn = function () { ${styleStr} }\n` +
` ${namespace}.render = function renderWithStyleInjection (h, context) {\n` +
` styleFn.call(context)\n` +
` return originalRender(h, context)\n` +
` }\n` +
`})()\n`
)
} else {
node.add(
`;(function() {\n` +
` var beforeCreate = ${namespace}.beforeCreate\n` +
` var styleFn = function () { ${styleStr} }\n` +
` ${namespace}.beforeCreate = beforeCreate ? [].concat(beforeCreate, styleFn) : [styleFn]\n` +
`})()\n`
)
}
}
if (customBlocksResult) {
node.add(`;\n ${customBlocksResult}`)
}
return node.toStringWithSourceMap({ file: filename })
}