Skip to content

Commit 6e76d59

Browse files
authored
feat: support custom blocks for Vue 3 (#364)
* feat: support custom blocks for Vue 3 * implement custom blocks
1 parent af556eb commit 6e76d59

File tree

11 files changed

+207
-20
lines changed

11 files changed

+207
-20
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`Basic 1`] = `
4+
Array [
5+
Object {
6+
"en": Object {
7+
"hello": "Hello!",
8+
},
9+
"ja": Object {
10+
"hello": "こんにちは!",
11+
},
12+
},
13+
]
14+
`;
15+
16+
exports[`Multiple blocks 1`] = `
17+
Array [
18+
Object {
19+
"en": Object {
20+
"hello": "Hello!",
21+
},
22+
"ja": Object {
23+
"hello": "こんにちは!",
24+
},
25+
},
26+
Object {
27+
"foo": "foo",
28+
},
29+
]
30+
`;

e2e/3.x/custom-block/babel.config.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = {
2+
presets: ['@babel/preset-env']
3+
}
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<template>
2+
<p>basic custom block</p>
3+
</template>
4+
5+
<script>
6+
export default {
7+
name: 'Basic'
8+
}
9+
</script>
10+
11+
<custom>
12+
{
13+
"en": {
14+
"hello": "Hello!"
15+
},
16+
"ja": {
17+
"hello": "こんにちは!"
18+
}
19+
}
20+
</custom>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<template>
2+
<p>multiple custom block</p>
3+
</template>
4+
5+
<script>
6+
export default {
7+
name: 'Multiple'
8+
}
9+
</script>
10+
11+
<custom>
12+
{
13+
"en": {
14+
"hello": "Hello!"
15+
},
16+
"ja": {
17+
"hello": "こんにちは!"
18+
}
19+
}
20+
</custom>
21+
22+
<custom>
23+
{
24+
"foo": "foo"
25+
}
26+
</custom>

e2e/3.x/custom-block/package.json

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{
2+
"name": "vue3-custom-block",
3+
"version": "1.0.0",
4+
"license": "MIT",
5+
"private": true,
6+
"scripts": {
7+
"test": "jest --no-cache --coverage test.js"
8+
},
9+
"dependencies": {
10+
"vue": "^3.0.3"
11+
},
12+
"devDependencies": {
13+
"@babel/core": "^7.9.0",
14+
"@babel/preset-env": "^7.9.0",
15+
"@vue/compiler-sfc": "^3.0.3",
16+
"jest": "^26.0.0",
17+
"vue3-jest": "^26.0.0-alpha.10"
18+
},
19+
"jest": {
20+
"moduleFileExtensions": [
21+
"js",
22+
"json",
23+
"vue"
24+
],
25+
"transform": {
26+
"^.+\\.js$": "babel-jest",
27+
"^.+\\.vue$": "vue3-jest"
28+
},
29+
"moduleNameMapper": {
30+
"^~?__styles/(.*)$": "<rootDir>/components/styles/$1"
31+
},
32+
"globals": {
33+
"vue-jest": {
34+
"transform": {
35+
"custom": "./transformer.js"
36+
}
37+
}
38+
}
39+
}
40+
}

e2e/3.x/custom-block/test.js

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import Basic from './components/Basic.vue'
2+
import Multiple from './components/Multiple.vue'
3+
4+
test('Basic', () => {
5+
expect(Basic.__custom).toMatchObject([
6+
{
7+
en: {
8+
hello: 'Hello!'
9+
},
10+
ja: {
11+
hello: 'こんにちは!'
12+
}
13+
}
14+
])
15+
expect(Basic.__custom).toMatchSnapshot()
16+
})
17+
18+
test('Multiple blocks', () => {
19+
expect(Multiple.__custom).toMatchObject([
20+
{
21+
en: {
22+
hello: 'Hello!'
23+
},
24+
ja: {
25+
hello: 'こんにちは!'
26+
}
27+
},
28+
{
29+
foo: 'foo'
30+
}
31+
])
32+
expect(Multiple.__custom).toMatchSnapshot()
33+
})

e2e/3.x/custom-block/transformer.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
function convert(content) {
2+
return JSON.stringify(JSON.parse(content))
3+
.replace(/\u2028/g, '\\u2028') // LINE SEPARATOR
4+
.replace(/\u2029/g, '\\u2029') // PARAGRAPH SEPARATOR
5+
.replace(/\\/g, '\\\\')
6+
.replace(/'/g, "\\'")
7+
}
8+
9+
module.exports = {
10+
process({ blocks, componentNamespace, filename, config }) {
11+
const ret = blocks.reduce((codes, block) => {
12+
codes.push(
13+
`${componentNamespace}.__custom = ${componentNamespace}.__custom || [];${componentNamespace}.__custom.push(${convert(
14+
block.content
15+
)});`
16+
)
17+
return codes
18+
}, [])
19+
return ret
20+
}
21+
}

packages/vue3-jest/lib/constants.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
module.exports = {
2-
vueOptionsNamespace: '__options__',
2+
vueComponentNamespace: 'Component',
33
defaultVueJestConfig: {
44
transform: {}
55
}

packages/vue3-jest/lib/generate-code.js

+12-2
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@ function addToSourceMap(node, result) {
1515
}
1616
}
1717

18-
module.exports = function generateCode(
18+
module.exports = function generateCode({
1919
scriptResult,
2020
scriptSetupResult,
2121
templateResult,
22+
customBlocksResult,
23+
componentNamespace,
2224
filename,
2325
stylesResult
24-
) {
26+
}) {
2527
var node = new SourceNode(null, null, null)
2628
addToSourceMap(node, scriptResult)
2729
addToSourceMap(node, scriptSetupResult)
@@ -63,5 +65,13 @@ module.exports = function generateCode(
6365
)
6466
}
6567

68+
if (Array.isArray(customBlocksResult)) {
69+
customBlocksResult.forEach(codes => {
70+
codes.forEach(code => {
71+
node.add(`;((${componentNamespace}) => { ${code} })(exports.default);`)
72+
})
73+
})
74+
}
75+
6676
return node.toStringWithSourceMap({ file: filename })
6777
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
const { getVueJestConfig, getCustomTransformer } = require('./utils')
2-
const vueOptionsNamespace = require('./constants').vueOptionsNamespace
32

43
function applyTransformer(
54
transformer,
65
blocks,
7-
vueOptionsNamespace,
6+
componentNamespace,
87
filename,
98
config
109
) {
11-
return transformer.process({ blocks, vueOptionsNamespace, filename, config })
10+
return transformer.process({ blocks, componentNamespace, filename, config })
1211
}
1312

1413
function groupByType(acc, block) {
@@ -17,9 +16,9 @@ function groupByType(acc, block) {
1716
return acc
1817
}
1918

20-
module.exports = function(allBlocks, filename, config) {
19+
module.exports = (allBlocks, filename, componentNamespace, config) => {
2120
const blocksByType = allBlocks.reduce(groupByType, {})
22-
const code = []
21+
const codes = []
2322
for (const [type, blocks] of Object.entries(blocksByType)) {
2423
const transformer = getCustomTransformer(
2524
getVueJestConfig(config).transform,
@@ -29,13 +28,12 @@ module.exports = function(allBlocks, filename, config) {
2928
const codeStr = applyTransformer(
3029
transformer,
3130
blocks,
32-
vueOptionsNamespace,
31+
componentNamespace,
3332
filename,
3433
config
3534
)
36-
code.push(codeStr)
35+
codes.push(codeStr)
3736
}
3837
}
39-
40-
return code.length ? code.join('\n') : ''
38+
return codes
4139
}

packages/vue3-jest/lib/process.js

+14-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const babelTransformer = require('babel-jest').default
55
const typescriptTransformer = require('./transformers/typescript')
66
const coffeescriptTransformer = require('./transformers/coffee')
77
const _processStyle = require('./process-style')
8-
// const processCustomBlocks = require('./process-custom-blocks')
8+
const processCustomBlocks = require('./process-custom-blocks')
99
const getVueJestConfig = require('./utils').getVueJestConfig
1010
const getTsJestConfig = require('./utils').getTsJestConfig
1111
const logResultErrors = require('./utils').logResultErrors
@@ -14,6 +14,7 @@ const getCustomTransformer = require('./utils').getCustomTransformer
1414
const loadSrc = require('./utils').loadSrc
1515
const generateCode = require('./generate-code')
1616
const mapLines = require('./map-lines')
17+
const vueComponentNamespace = require('./constants').vueComponentNamespace
1718

1819
function resolveTransformer(lang = 'js', vueJestConfig) {
1920
const transformer = getCustomTransformer(vueJestConfig['transform'], lang)
@@ -154,23 +155,28 @@ function processStyle(styles, filename, config) {
154155

155156
module.exports = function(src, filename, config) {
156157
const { descriptor } = parse(src, { filename })
158+
const componentNamespace =
159+
getVueJestConfig(config)['componentNamespace'] || vueComponentNamespace
157160

158161
const templateResult = processTemplate(descriptor, filename, config)
159162
const scriptResult = processScript(descriptor.script, filename, config)
160163
const scriptSetupResult = processScriptSetup(descriptor, filename, config)
161164
const stylesResult = processStyle(descriptor.styles, filename, config)
162-
// const customBlocksResult = processCustomBlocks(
163-
// descriptor.customBlocks,
164-
// filename,
165-
// config
166-
// )
167-
const output = generateCode(
165+
const customBlocksResult = processCustomBlocks(
166+
descriptor.customBlocks,
167+
filename,
168+
componentNamespace,
169+
config
170+
)
171+
const output = generateCode({
168172
scriptResult,
169173
scriptSetupResult,
170174
templateResult,
175+
customBlocksResult,
176+
componentNamespace,
171177
filename,
172178
stylesResult
173-
)
179+
})
174180

175181
return {
176182
code: output.code,

0 commit comments

Comments
 (0)