Skip to content

Commit 1dc4982

Browse files
committed
feat: add support for custom blocks inside of the vue-jest global config
1 parent c49525e commit 1dc4982

File tree

8 files changed

+128
-56
lines changed

8 files changed

+128
-56
lines changed

lib/constants.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module.exports = {
2+
vueOptionsNamespace: '__options__',
3+
defaultVueJestConfig: {
4+
transform: {
5+
i18n: require('./transformers/i18n')
6+
}
7+
}
8+
}

lib/generate-code.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
const namespace = require('./constants').vueOptionsNamespace
2+
13
const splitRE = /\r?\n/g
24

35
module.exports = function generateCode(
46
scriptResult,
57
templateResult,
68
stylesResult,
7-
i18nResult,
9+
customBlocksResult,
810
isFunctional
911
) {
1012
let output = ''
@@ -22,7 +24,7 @@ module.exports = function generateCode(
2224
}
2325

2426
output +=
25-
`var __options__ = typeof exports.default === 'function' ` +
27+
`var ${namespace} = typeof exports.default === 'function' ` +
2628
`? exports.default.options ` +
2729
`: exports.default\n`
2830

@@ -38,11 +40,11 @@ module.exports = function generateCode(
3840

3941
output +=
4042
`__options__.render = render\n` +
41-
`__options__.staticRenderFns = staticRenderFns\n`
43+
`${namespace}.staticRenderFns = staticRenderFns\n`
4244

4345
if (isFunctional) {
44-
output += '__options__.functional = true\n'
45-
output += '__options__._compiled = true\n'
46+
output += `${namespace}.functional = true\n`
47+
output += `${namespace}._compiled = true\n`
4648
}
4749
}
4850

@@ -60,25 +62,25 @@ module.exports = function generateCode(
6062
if (isFunctional) {
6163
output +=
6264
`;(function() {\n` +
63-
` var originalRender = __options__.render\n` +
65+
` var originalRender = ${namespace}.render\n` +
6466
` var styleFn = function () { ${styleStr} }\n` +
65-
` __options__.render = function renderWithStyleInjection (h, context) {\n` +
67+
` ${namespace}.render = function renderWithStyleInjection (h, context) {\n` +
6668
` styleFn.call(context)\n` +
6769
` return originalRender(h, context)\n` +
6870
` }\n` +
6971
`})()\n`
7072
} else {
7173
output +=
7274
`;(function() {\n` +
73-
` var beforeCreate = __options__.beforeCreate\n` +
75+
` var beforeCreate = ${namespace}.beforeCreate\n` +
7476
` var styleFn = function () { ${styleStr} }\n` +
75-
` __options__.beforeCreate = beforeCreate ? [].concat(beforeCreate, styleFn) : [styleFn]\n` +
77+
` ${namespace}.beforeCreate = beforeCreate ? [].concat(beforeCreate, styleFn) : [styleFn]\n` +
7678
`})()\n`
7779
}
7880
}
7981

80-
if (i18nResult) {
81-
output += `;\n ${i18nResult}`
82+
if (customBlocksResult) {
83+
output += `;\n ${customBlocksResult}`
8284
}
8385
return {
8486
code: output,

lib/process-custom-blocks.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
const { getVueJestConfig, getCustomTransformer } = require('./utils')
2+
const vueOptionsNamespace = require('./constants').vueOptionsNamespace
3+
4+
function applyTransformer(
5+
transformer,
6+
blocks,
7+
vueOptionsNamespace,
8+
filename,
9+
config
10+
) {
11+
return transformer.process(blocks, vueOptionsNamespace, filename, config)
12+
}
13+
14+
function groupByType(acc, block) {
15+
acc[block.type] = acc[block.type] || []
16+
acc[block.type].push(block)
17+
return acc
18+
}
19+
20+
module.exports = function(allBlocks, filename, config) {
21+
const blocksByType = allBlocks.reduce(groupByType, {})
22+
const code = []
23+
for (const [type, blocks] of Object.entries(blocksByType)) {
24+
const transformer = getCustomTransformer(
25+
getVueJestConfig(config).transform,
26+
type
27+
)
28+
if (transformer) {
29+
const codeStr = applyTransformer(
30+
transformer,
31+
blocks,
32+
vueOptionsNamespace,
33+
filename,
34+
config
35+
)
36+
code.push(codeStr)
37+
}
38+
}
39+
40+
return code.length ? code.join('\n') : ''
41+
}

lib/process.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ const splitRE = /\r?\n/g
22

33
const VueTemplateCompiler = require('vue-template-compiler')
44
const generateSourceMap = require('./generate-source-map')
5-
const typescriptTransformer = require('./typescript-transformer')
6-
const coffeescriptTransformer = require('./coffee-transformer')
5+
const typescriptTransformer = require('./transformers/typescript')
6+
const coffeescriptTransformer = require('./transformers/coffee')
77
const _processStyle = require('./process-style')
8-
const processI18n = require('./process-i18n')
8+
const processCustomBlocks = require('./process-custom-blocks')
99
const getVueJestConfig = require('./utils').getVueJestConfig
1010
const logResultErrors = require('./utils').logResultErrors
1111
const stripInlineSourceMap = require('./utils').stripInlineSourceMap
@@ -100,7 +100,11 @@ module.exports = function(src, filename, config) {
100100
const templateResult = processTemplate(descriptor.template, filename, config)
101101
const scriptResult = processScript(descriptor.script, filename, config)
102102
const stylesResult = processStyle(descriptor.styles, filename, config)
103-
const i18nResult = processI18n(descriptor.customBlocks, filename, config)
103+
const customBlocksResult = processCustomBlocks(
104+
descriptor.customBlocks,
105+
filename,
106+
config
107+
)
104108

105109
const isFunctional =
106110
descriptor.template &&
@@ -114,7 +118,7 @@ module.exports = function(src, filename, config) {
114118
scriptResult,
115119
templateResult,
116120
stylesResult,
117-
i18nResult,
121+
customBlocksResult,
118122
isFunctional
119123
)
120124

lib/coffee-transformer.js renamed to lib/transformers/coffee.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
const ensureRequire = require('./ensure-require.js')
2-
const throwError = require('./utils').throwError
3-
const getBabelOptions = require('./utils').getBabelOptions
1+
const ensureRequire = require('../ensure-require.js')
2+
const throwError = require('../utils').throwError
3+
const getBabelOptions = require('../utils').getBabelOptions
44

55
module.exports = {
66
process(src, filename, config) {

lib/process-i18n.js renamed to lib/transformers/i18n.js

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ const yaml = require('js-yaml')
33
const fs = require('fs')
44
const path = require('path')
55

6-
const VUE_OPTIONS = '__options__'
76
const VUE_I18N_OPTION = '__i18n'
87

98
function convert(source, lang) {
@@ -39,22 +38,24 @@ function parseLanguageAndContent(block, filename) {
3938
}
4039
}
4140

42-
module.exports = function(blocks, filename) {
43-
const base = `${VUE_OPTIONS}.${VUE_I18N_OPTION} = []`
44-
const codes = blocks.map(block => {
45-
if (block.type === 'i18n') {
46-
const value = parseLanguageAndContent(block, filename)
47-
.replace(/\u2028/g, '\\u2028')
48-
.replace(/\u2029/g, '\\u2029')
49-
.replace(/\\/g, '\\\\')
50-
return `${VUE_OPTIONS}.${VUE_I18N_OPTION}.push('${value.replace(
51-
/\u0027/g,
52-
'\\u0027'
53-
)}')`
54-
} else {
55-
return ''
56-
}
57-
})
58-
59-
return codes.length ? [base].concat(codes).join('\n') : ''
41+
module.exports = {
42+
process(blocks, vueOptionsNamespace, filename) {
43+
const base = `${vueOptionsNamespace}.${VUE_I18N_OPTION} = []`
44+
const codes = blocks.map(block => {
45+
if (block.type === 'i18n') {
46+
const value = parseLanguageAndContent(block, filename)
47+
.replace(/\u2028/g, '\\u2028')
48+
.replace(/\u2029/g, '\\u2029')
49+
.replace(/\\/g, '\\\\')
50+
return `${vueOptionsNamespace}.${VUE_I18N_OPTION}.push('${value.replace(
51+
/\u0027/g,
52+
'\\u0027'
53+
)}')`
54+
} else {
55+
return ''
56+
}
57+
})
58+
59+
return codes.length ? [base].concat(codes).join('\n') : ''
60+
}
6061
}

lib/typescript-transformer.js renamed to lib/transformers/typescript.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
const ensureRequire = require('./ensure-require')
1+
const ensureRequire = require('../ensure-require')
22
const babelJest = require('babel-jest')
3-
const getBabelOptions = require('./utils').getBabelOptions
4-
const getTsJestConfig = require('./utils').getTsJestConfig
5-
const stripInlineSourceMap = require('./utils').stripInlineSourceMap
6-
const getCustomTransformer = require('./utils').getCustomTransformer
7-
const getVueJestConfig = require('./utils').getVueJestConfig
3+
const {
4+
getBabelOptions,
5+
getTsJestConfig,
6+
stripInlineSourceMap,
7+
getCustomTransformer,
8+
getVueJestConfig
9+
} = require('../utils')
810

911
module.exports = {
1012
process(scriptContent, filePath, config) {

lib/utils.js

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
const constants = require('./constants')
12
const loadPartialConfig = require('@babel/core').loadPartialConfig
23
const chalk = require('chalk')
34
const path = require('path')
@@ -83,19 +84,32 @@ const getCustomTransformer = function getCustomTransformer(
8384
transform = {},
8485
lang
8586
) {
86-
let transformerPath = fetchTransformer(lang, transform)
87-
if (transformerPath) {
88-
const transformer = require(resolvePath(transformerPath))
89-
90-
if (!isValidTransformer(transformer)) {
91-
throwError(
92-
`transformer must contain at least one process, preprocess, or ` +
93-
`postprocess method`
94-
)
95-
}
96-
return transformer
87+
transform = { ...constants.defaultVueJestConfig.transform, ...transform }
88+
89+
const transformerPath = fetchTransformer(lang, transform)
90+
91+
if (!transformerPath) {
92+
return null
9793
}
98-
return null
94+
95+
let transformer
96+
if (
97+
typeof transformerPath === 'string' &&
98+
require(resolvePath(transformerPath))
99+
) {
100+
transformer = require(resolvePath(transformerPath))
101+
} else if (typeof transformerPath === 'object') {
102+
transformer = transformerPath
103+
}
104+
105+
if (!isValidTransformer(transformer)) {
106+
throwError(
107+
`transformer must contain at least one process, preprocess, or ` +
108+
`postprocess method`
109+
)
110+
}
111+
112+
return transformer
99113
}
100114

101115
const throwError = function error(msg) {

0 commit comments

Comments
 (0)