| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /**
- * Jest transformer for uni-app `.vue` Single File Components (Vue 2.7).
- *
- * PURPOSE: cfc-frontend's default jest.config.js only transforms `.js` via
- * babel-jest, so `.vue` SFCs cannot be imported by tests. This transformer
- * compiles the SFC `<script>` block (Options API) to CommonJS and precompiles
- * the `<template>` block to a Vue 2 render function (the default `vue` entry
- * in Node is runtime-only and has no template compiler), so tests can `mount`
- * real page components with `@vue/test-utils`.
- *
- * TEST-ONLY infrastructure: this file lives under `__tests__/` and is NOT part
- * of the app runtime. It does not modify any `pages/` / `utils/` business code.
- */
- const { parseComponent, compileTemplate } = require('@vue/compiler-sfc')
- const babel = require('@babel/core')
- module.exports = {
- process(src, filename) {
- const descriptor = parseComponent(src, { filename })
- if (descriptor.errors && descriptor.errors.length) {
- throw new Error('[vue-transform] SFC parse error in ' + filename + ':\n' + descriptor.errors.join('\n'))
- }
- let code = ''
- if (descriptor.script && descriptor.script.content) {
- // Options API: `export default {...}` -> `const __sfc_main = {...}`
- code += descriptor.script.content.replace(/export\s+default/, 'const __sfc_main =')
- } else {
- code += 'const __sfc_main = {}'
- }
- if (descriptor.template && descriptor.template.content) {
- const res = compileTemplate({
- source: descriptor.template.content,
- filename,
- id: filename.replace(/[^\w]/g, '_')
- })
- if (res.errors && res.errors.length) {
- throw new Error('[vue-transform] template compile error in ' + filename + ':\n' + res.errors.join('\n'))
- }
- code += '\n' + res.code
- code += '\n__sfc_main.render = render'
- code += '\n__sfc_main.staticRenderFns = staticRenderFns'
- }
- code += '\nmodule.exports = __sfc_main'
- // Transpile the assembled module to CommonJS (the <script> block keeps ES
- // `import` statements; Node cannot execute them in a jest CJS module).
- const out = babel.transformSync(code, {
- filename,
- presets: [['@babel/preset-env', { targets: { node: 'current' } }]],
- babelrc: false,
- configFile: false
- })
- return { code: out.code, map: null }
- }
- }
|