Skip to content

Commit 752092f

Browse files
committed
Use umd module as a default entry, add e2e tests, improve error message
1 parent 40a3920 commit 752092f

File tree

8 files changed

+1791
-45
lines changed

8 files changed

+1791
-45
lines changed

jest.config.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module.exports = {
2+
"preset": "jest-puppeteer",
3+
testPathIgnorePatterns: ['/node_modules/', 'dist'],
4+
transform: {
5+
"^.+\\.ts?$": "ts-jest"
6+
},
7+
}

package-lock.json

Lines changed: 1659 additions & 41 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
"types": "dist/src/index.d.ts",
88
"scripts": {
99
"build": "rollup -c",
10-
"build:watch": "rollup -c -w"
10+
"build:watch": "rollup -c -w",
11+
"test": "npm run build && jest"
1112
},
1213
"repository": {
1314
"type": "git",
@@ -27,11 +28,17 @@
2728
},
2829
"homepage": "https://github.com/CyberAP/vue-component-media-queries#readme",
2930
"devDependencies": {
31+
"@types/expect-puppeteer": "^4.4.3",
32+
"@types/jest": "^26.0.7",
33+
"@types/jest-environment-puppeteer": "^4.3.2",
3034
"@vue/test-utils": "^1.0.3",
3135
"jest": "^26.1.0",
36+
"jest-puppeteer": "^4.4.0",
37+
"puppeteer": "^5.2.1",
3238
"rollup": "^1.27.14",
3339
"rollup-plugin-terser": "^5.1.3",
3440
"rollup-plugin-typescript2": "^0.25.3",
41+
"ts-jest": "^26.1.3",
3542
"tslib": "^1.10.0",
3643
"typescript": "^3.7.4",
3744
"vue": "^2.6.0"

rollup.config.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ export default {
77
output: [
88
{
99
file: pkg.main,
10-
format: 'cjs',
10+
format: 'umd',
11+
name: 'VueComponentMediaQueries',
12+
globals: {
13+
vue: 'Vue'
14+
}
1115
},
1216
{
1317
file: pkg.module,

src/MatchMedia.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export const MatchMedia = Vue.extend({
7373
console.error(
7474
`
7575
[vue-component-media-queries]:
76-
A 'query' prop or a <MediaQueryProvider> component inside parent component tree is required.
76+
<MatchMedia /> should be a descendant of a <MediaQueryProvider /> component tree or have a 'query' prop.
7777
`
7878
);
7979
}

tests/index.html

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
2+
<script src="../dist/index.js"></script>
3+
4+
<div id="csr"></div>
5+
6+
<div id="ssrDesktop" data-server-rendered="true"><div data-test-ssr-desktop="true">isDesktop</div></div>
7+
8+
<div id="ssrMobile" data-server-rendered="true"><div data-test-ssr-mobile="true">isMobile</div></div>
9+
10+
<script>
11+
const { MediaQueryProvider, MatchMedia } = VueComponentMediaQueries;
12+
const queries = { mobile: '(max-width: 800px)' }
13+
14+
var csr = new Vue({
15+
render(h) {
16+
return h(MediaQueryProvider, { props: { queries } }, [
17+
h('div', [
18+
h(MatchMedia, {
19+
scopedSlots: {
20+
default({ mobile }) {
21+
return h('div', { attrs: { 'data-test-csr': true } }, mobile ? 'isMobile' : 'isDesktop')
22+
}
23+
}
24+
})
25+
])
26+
])
27+
}
28+
}).$mount('#csr');
29+
30+
var ssrDesktop = new Vue({
31+
render(h) {
32+
return h(MediaQueryProvider, { props: { queries } }, [
33+
h('div', [
34+
h(MatchMedia, {
35+
scopedSlots: {
36+
default({ mobile }) {
37+
return h('div', { attrs: { 'data-test-ssr-desktop': true } }, mobile ? 'isMobile' : 'isDesktop')
38+
}
39+
}
40+
})
41+
])
42+
])
43+
}
44+
}).$mount('#ssrDesktop');
45+
46+
var ssrMobile = new Vue({
47+
render(h) {
48+
return h(MediaQueryProvider, { props: { queries } }, [
49+
h('div', [
50+
h(MatchMedia, {
51+
scopedSlots: {
52+
default({ mobile }) {
53+
return h('div', { attrs: { 'data-test-ssr-mobile': true } }, mobile ? 'isMobile' : 'isDesktop')
54+
}
55+
}
56+
})
57+
])
58+
])
59+
}
60+
}).$mount('#ssrMobile');
61+
</script>

tests/index.spec.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const path = require('path');
2+
3+
const baseUrl = `file://${path.resolve(__dirname, './index.html')}`
4+
5+
describe('e2e: Client Side Rendering', () => {
6+
it('supports media queries', async () => {
7+
await page.goto(baseUrl);
8+
await page.setViewport({
9+
width: 640,
10+
height: 480,
11+
deviceScaleFactor: 1,
12+
});
13+
14+
await page.waitFor('[data-test-csr]');
15+
expect(await page.$eval('[data-test-csr]', el => el.textContent)).toBe('isMobile');
16+
17+
await page.setViewport({
18+
width: 1040,
19+
height: 480,
20+
deviceScaleFactor: 1,
21+
});
22+
await page.waitFor(100);
23+
expect(await page.$eval('[data-test-csr]', el => el.textContent)).toBe('isDesktop');
24+
});
25+
});
26+
27+
describe('e2e: Server Side Rendering', () => {
28+
it('does not produce hydration errors', async () => {
29+
const messages: any[] = [];
30+
31+
page.on('console', (message) => {
32+
messages.push(message)
33+
});
34+
35+
await page.goto(baseUrl);
36+
await page.setViewport({
37+
width: 640,
38+
height: 480,
39+
deviceScaleFactor: 1,
40+
});
41+
42+
await page.waitFor('[data-test-ssr-mobile]');
43+
await page.waitFor('[data-test-ssr-desktop]');
44+
expect(await page.$eval('[data-test-ssr-mobile]', el => el.textContent)).toBe('isMobile');
45+
expect(await page.$eval('[data-test-ssr-desktop]', el => el.textContent)).toBe('isMobile');
46+
47+
expect(messages).toMatchObject([]);
48+
});
49+
});

tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"preserveConstEnums": true,
1212
"sourceMap": true,
1313
"outDir": "dist",
14-
"rootDir": ".",
14+
"rootDir": "."
1515
},
1616
"include": [
1717
"src/**/*"

0 commit comments

Comments
 (0)