diff --git a/.circleci/config.yml b/.circleci/config.yml index d5d30803..de8b0335 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,4 +24,4 @@ jobs: key: node-10-dependencies-{{ checksum "package.json" }} # run tests! - - run: npm run test + - run: yarn test diff --git a/e2e/3.x/babel-in-package/components/Basic.vue b/e2e/3.x/babel-in-package/components/Basic.vue new file mode 100644 index 00000000..a37429b0 --- /dev/null +++ b/e2e/3.x/babel-in-package/components/Basic.vue @@ -0,0 +1,47 @@ + + + + + + + diff --git a/e2e/3.x/babel-in-package/components/Coffee.vue b/e2e/3.x/babel-in-package/components/Coffee.vue new file mode 100644 index 00000000..565a528b --- /dev/null +++ b/e2e/3.x/babel-in-package/components/Coffee.vue @@ -0,0 +1,9 @@ + + + diff --git a/e2e/3.x/babel-in-package/components/TypeScript.vue b/e2e/3.x/babel-in-package/components/TypeScript.vue new file mode 100644 index 00000000..5abb6115 --- /dev/null +++ b/e2e/3.x/babel-in-package/components/TypeScript.vue @@ -0,0 +1,22 @@ + + + diff --git a/e2e/3.x/babel-in-package/components/TypeScriptChild.vue b/e2e/3.x/babel-in-package/components/TypeScriptChild.vue new file mode 100644 index 00000000..299bc3b8 --- /dev/null +++ b/e2e/3.x/babel-in-package/components/TypeScriptChild.vue @@ -0,0 +1,13 @@ + + + diff --git a/e2e/3.x/babel-in-package/package.json b/e2e/3.x/babel-in-package/package.json new file mode 100644 index 00000000..23c24c39 --- /dev/null +++ b/e2e/3.x/babel-in-package/package.json @@ -0,0 +1,38 @@ +{ + "name": "vue3-babel-in-package", + "version": "1.0.0", + "license": "MIT", + "private": true, + "scripts": { + "test": "jest --no-cache test.js" + }, + "dependencies": { + "vue": "^3.0.3" + }, + "devDependencies": { + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.0", + "@vue/compiler-sfc": "^3.0.3", + "coffeescript": "^2.3.2", + "jest": "^26.0.0", + "ts-jest": "^26.4.4", + "typescript": "^4.1.2", + "vue3-jest": "^26.0.0-alpha.10" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "vue" + ], + "transform": { + "^.+\\.js$": "babel-jest", + "^.+\\.vue$": "vue3-jest" + } + }, + "babel": { + "presets": [ + "@babel/env" + ] + } +} diff --git a/e2e/3.x/babel-in-package/test.js b/e2e/3.x/babel-in-package/test.js new file mode 100644 index 00000000..8bc52e74 --- /dev/null +++ b/e2e/3.x/babel-in-package/test.js @@ -0,0 +1,36 @@ +import { createApp, h } from 'vue' + +import TypeScript from './components/TypeScript.vue' +import Basic from './components/Basic.vue' +import Coffee from './components/Coffee.vue' + +function mount(Component, props, slots) { + document.getElementsByTagName('html')[0].innerHTML = '' + const el = document.createElement('div') + el.id = 'app' + document.body.appendChild(el) + const Parent = { + render() { + return h(Component, props, slots) + } + } + createApp(Parent).mount(el) +} + +test('processes .vue files', () => { + mount(Basic) + expect(document.querySelector('h1').textContent).toBe( + 'Welcome to Your Vue.js App' + ) +}) + +test('processes .vue file with lang set to coffee', () => { + mount(Coffee) + expect(document.querySelector('h1').textContent).toBe('Coffee') +}) + +test('processes .vue files with lang set to typescript', () => { + mount(TypeScript) + expect(document.querySelector('#parent').textContent).toBe('Parent') + expect(document.querySelector('#child').textContent).toBe('Child') +}) diff --git a/e2e/3.x/babel-in-package/tsconfig.json b/e2e/3.x/babel-in-package/tsconfig.json new file mode 100644 index 00000000..d3fd602d --- /dev/null +++ b/e2e/3.x/babel-in-package/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "es6"], + "module": "ES2015", + "moduleResolution": "node", + "types": ["vue-typescript-import-dts", "node"], + "isolatedModules": false, + "experimentalDecorators": true, + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "suppressImplicitAnyIndexErrors": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true + } +} diff --git a/e2e/3.x/basic/__snapshots__/test.js.snap b/e2e/3.x/basic/__snapshots__/test.js.snap new file mode 100644 index 00000000..a10f241c --- /dev/null +++ b/e2e/3.x/basic/__snapshots__/test.js.snap @@ -0,0 +1,91 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`generates source maps for .vue files 1`] = ` +"\\"use strict\\"; + +Object.defineProperty(exports, \\"__esModule\\", { + value: true +}); +exports[\\"default\\"] = void 0; +var _default = { + name: 'basic', + computed: { + headingClasses: function headingClasses() { + return { + red: this.isCrazy, + blue: !this.isCrazy, + shadow: this.isCrazy + }; + } + }, + data: function data() { + return { + msg: 'Welcome to Your Vue.js App', + isCrazy: false + }; + }, + methods: { + toggleClass: function toggleClass() { + this.isCrazy = !this.isCrazy; + } + } +}; +exports[\\"default\\"] = _default; +\\"use strict\\"; +Object.defineProperty(exports, \\"__esModule\\", { value: true }); +exports.render = void 0; +var vue_1 = require(\\"vue\\"); +var _hoisted_1 = { class: \\"hello\\" }; +function render(_ctx, _cache) { + return (vue_1.openBlock(), vue_1.createBlock(\\"div\\", _hoisted_1, [ + vue_1.createVNode(\\"h1\\", { class: _ctx.headingClasses }, vue_1.toDisplayString(_ctx.msg), 3 /* TEXT, CLASS */) + ])); +} +exports.render = render; +;exports.default = {...exports.default, render};;exports.default = {...exports.default, __cssModules: {\\"css\\":{\\"testA\\":\\"testA\\"},\\"$style\\":{\\"testB\\":\\"testB\\"}}}" +`; + +exports[`generates source maps using src attributes 1`] = ` +"\\"use strict\\"; + +Object.defineProperty(exports, \\"__esModule\\", { + value: true +}); +exports[\\"default\\"] = void 0; +var _default = { + name: 'basic', + computed: { + headingClasses: function headingClasses() { + return { + red: this.isCrazy, + blue: !this.isCrazy, + shadow: this.isCrazy + }; + } + }, + data: function data() { + return { + msg: 'Welcome to Your Vue.js App', + isCrazy: false + }; + }, + methods: { + toggleClass: function toggleClass() { + this.isCrazy = !this.isCrazy; + } + } +}; +exports[\\"default\\"] = _default; +\\"use strict\\"; +Object.defineProperty(exports, \\"__esModule\\", { value: true }); +exports.render = void 0; +var vue_1 = require(\\"vue\\"); +var _hoisted_1 = { class: \\"hello\\" }; +function render(_ctx, _cache) { + return (vue_1.openBlock(), vue_1.createBlock(\\"div\\", _hoisted_1, [ + vue_1.createVNode(\\"h1\\", { class: _ctx.headingClasses }, vue_1.toDisplayString(_ctx.msg), 3 /* TEXT, CLASS */) + ])); +} +exports.render = render; +;exports.default = {...exports.default, render};" +`; diff --git a/e2e/3.x/basic/babel.config.js b/e2e/3.x/basic/babel.config.js new file mode 100644 index 00000000..3ba5f43c --- /dev/null +++ b/e2e/3.x/basic/babel.config.js @@ -0,0 +1,4 @@ +module.exports = { + presets: ['@babel/preset-env'], + plugins: ['transform-vue-jsx'] +} diff --git a/e2e/3.x/basic/components/Basic.vue b/e2e/3.x/basic/components/Basic.vue new file mode 100644 index 00000000..a37429b0 --- /dev/null +++ b/e2e/3.x/basic/components/Basic.vue @@ -0,0 +1,47 @@ + + + + + + + diff --git a/e2e/3.x/basic/components/BasicSrc.html b/e2e/3.x/basic/components/BasicSrc.html new file mode 100644 index 00000000..67c4dfde --- /dev/null +++ b/e2e/3.x/basic/components/BasicSrc.html @@ -0,0 +1,3 @@ +
+

{{ msg }}

+
\ No newline at end of file diff --git a/e2e/3.x/basic/components/BasicSrc.js b/e2e/3.x/basic/components/BasicSrc.js new file mode 100644 index 00000000..3aeef17c --- /dev/null +++ b/e2e/3.x/basic/components/BasicSrc.js @@ -0,0 +1,23 @@ +export default { + name: 'basic', + computed: { + headingClasses: function headingClasses() { + return { + red: this.isCrazy, + blue: !this.isCrazy, + shadow: this.isCrazy + } + } + }, + data: function data() { + return { + msg: 'Welcome to Your Vue.js App', + isCrazy: false + } + }, + methods: { + toggleClass: function toggleClass() { + this.isCrazy = !this.isCrazy + } + } +} diff --git a/e2e/3.x/basic/components/BasicSrc.vue b/e2e/3.x/basic/components/BasicSrc.vue new file mode 100644 index 00000000..2fbf9f1e --- /dev/null +++ b/e2e/3.x/basic/components/BasicSrc.vue @@ -0,0 +1,3 @@ + + + diff --git a/e2e/3.x/basic/components/ClassComponent.vue b/e2e/3.x/basic/components/ClassComponent.vue new file mode 100644 index 00000000..2902ddd7 --- /dev/null +++ b/e2e/3.x/basic/components/ClassComponent.vue @@ -0,0 +1,27 @@ + + + diff --git a/e2e/3.x/basic/components/ClassComponentProperty.vue b/e2e/3.x/basic/components/ClassComponentProperty.vue new file mode 100644 index 00000000..413c9eba --- /dev/null +++ b/e2e/3.x/basic/components/ClassComponentProperty.vue @@ -0,0 +1,20 @@ + + + diff --git a/e2e/3.x/basic/components/ClassComponentWithMixin.vue b/e2e/3.x/basic/components/ClassComponentWithMixin.vue new file mode 100644 index 00000000..807ecb61 --- /dev/null +++ b/e2e/3.x/basic/components/ClassComponentWithMixin.vue @@ -0,0 +1,12 @@ + + + diff --git a/e2e/3.x/basic/components/ClassMixin.ts b/e2e/3.x/basic/components/ClassMixin.ts new file mode 100644 index 00000000..560fc353 --- /dev/null +++ b/e2e/3.x/basic/components/ClassMixin.ts @@ -0,0 +1,5 @@ +import { Vue } from 'vue-class-component' + +export default class ClassMixin extends Vue { + message = 'Hello world!' +} diff --git a/e2e/3.x/basic/components/Coffee.vue b/e2e/3.x/basic/components/Coffee.vue new file mode 100644 index 00000000..565a528b --- /dev/null +++ b/e2e/3.x/basic/components/Coffee.vue @@ -0,0 +1,9 @@ + + + diff --git a/e2e/3.x/basic/components/CoffeeScript.vue b/e2e/3.x/basic/components/CoffeeScript.vue new file mode 100644 index 00000000..5b1adc0f --- /dev/null +++ b/e2e/3.x/basic/components/CoffeeScript.vue @@ -0,0 +1,8 @@ + + + diff --git a/e2e/3.x/basic/components/Constructor.vue b/e2e/3.x/basic/components/Constructor.vue new file mode 100644 index 00000000..c81625e8 --- /dev/null +++ b/e2e/3.x/basic/components/Constructor.vue @@ -0,0 +1,9 @@ + + + diff --git a/e2e/3.x/basic/components/FunctionalRenderFn.vue b/e2e/3.x/basic/components/FunctionalRenderFn.vue new file mode 100644 index 00000000..eccb3f2e --- /dev/null +++ b/e2e/3.x/basic/components/FunctionalRenderFn.vue @@ -0,0 +1,12 @@ + diff --git a/e2e/3.x/basic/components/FunctionalSFC.vue b/e2e/3.x/basic/components/FunctionalSFC.vue new file mode 100644 index 00000000..1395f320 --- /dev/null +++ b/e2e/3.x/basic/components/FunctionalSFC.vue @@ -0,0 +1,5 @@ + diff --git a/e2e/3.x/basic/components/FunctionalSFCParent.vue b/e2e/3.x/basic/components/FunctionalSFCParent.vue new file mode 100644 index 00000000..01509456 --- /dev/null +++ b/e2e/3.x/basic/components/FunctionalSFCParent.vue @@ -0,0 +1,14 @@ + + + diff --git a/e2e/3.x/basic/components/Jade.vue b/e2e/3.x/basic/components/Jade.vue new file mode 100644 index 00000000..4195a137 --- /dev/null +++ b/e2e/3.x/basic/components/Jade.vue @@ -0,0 +1,9 @@ + + + diff --git a/e2e/3.x/basic/components/Jsx.vue b/e2e/3.x/basic/components/Jsx.vue new file mode 100644 index 00000000..958891b9 --- /dev/null +++ b/e2e/3.x/basic/components/Jsx.vue @@ -0,0 +1,7 @@ + diff --git a/e2e/3.x/basic/components/NamedExport.vue b/e2e/3.x/basic/components/NamedExport.vue new file mode 100644 index 00000000..1d2c6f0f --- /dev/null +++ b/e2e/3.x/basic/components/NamedExport.vue @@ -0,0 +1,7 @@ + diff --git a/e2e/3.x/basic/components/NoScript.vue b/e2e/3.x/basic/components/NoScript.vue new file mode 100644 index 00000000..976b9f7d --- /dev/null +++ b/e2e/3.x/basic/components/NoScript.vue @@ -0,0 +1,12 @@ + + + diff --git a/e2e/3.x/basic/components/Pug.vue b/e2e/3.x/basic/components/Pug.vue new file mode 100644 index 00000000..c6a467a8 --- /dev/null +++ b/e2e/3.x/basic/components/Pug.vue @@ -0,0 +1,11 @@ + + + diff --git a/e2e/3.x/basic/components/PugBase.pug b/e2e/3.x/basic/components/PugBase.pug new file mode 100644 index 00000000..93fdad14 --- /dev/null +++ b/e2e/3.x/basic/components/PugBase.pug @@ -0,0 +1,2 @@ +div(class='pug-base') + block component \ No newline at end of file diff --git a/e2e/3.x/basic/components/PugRelativeExtends.vue b/e2e/3.x/basic/components/PugRelativeExtends.vue new file mode 100644 index 00000000..dd528953 --- /dev/null +++ b/e2e/3.x/basic/components/PugRelativeExtends.vue @@ -0,0 +1,11 @@ + + + diff --git a/e2e/3.x/basic/components/RenderFunction.vue b/e2e/3.x/basic/components/RenderFunction.vue new file mode 100644 index 00000000..1fe90c5c --- /dev/null +++ b/e2e/3.x/basic/components/RenderFunction.vue @@ -0,0 +1,9 @@ + diff --git a/e2e/3.x/basic/components/ScriptSetup.vue b/e2e/3.x/basic/components/ScriptSetup.vue new file mode 100644 index 00000000..b077ffcb --- /dev/null +++ b/e2e/3.x/basic/components/ScriptSetup.vue @@ -0,0 +1,18 @@ + + + diff --git a/e2e/3.x/basic/components/SourceMapsSrc.vue b/e2e/3.x/basic/components/SourceMapsSrc.vue new file mode 100644 index 00000000..2fbf9f1e --- /dev/null +++ b/e2e/3.x/basic/components/SourceMapsSrc.vue @@ -0,0 +1,3 @@ + + + diff --git a/e2e/3.x/basic/components/TsSrc.ts b/e2e/3.x/basic/components/TsSrc.ts new file mode 100644 index 00000000..3aeef17c --- /dev/null +++ b/e2e/3.x/basic/components/TsSrc.ts @@ -0,0 +1,23 @@ +export default { + name: 'basic', + computed: { + headingClasses: function headingClasses() { + return { + red: this.isCrazy, + blue: !this.isCrazy, + shadow: this.isCrazy + } + } + }, + data: function data() { + return { + msg: 'Welcome to Your Vue.js App', + isCrazy: false + } + }, + methods: { + toggleClass: function toggleClass() { + this.isCrazy = !this.isCrazy + } + } +} diff --git a/e2e/3.x/basic/components/TsSrc.vue b/e2e/3.x/basic/components/TsSrc.vue new file mode 100644 index 00000000..c4054806 --- /dev/null +++ b/e2e/3.x/basic/components/TsSrc.vue @@ -0,0 +1,3 @@ + + + diff --git a/e2e/3.x/basic/components/TypeScript.vue b/e2e/3.x/basic/components/TypeScript.vue new file mode 100644 index 00000000..5abb6115 --- /dev/null +++ b/e2e/3.x/basic/components/TypeScript.vue @@ -0,0 +1,22 @@ + + + diff --git a/e2e/3.x/basic/components/TypeScriptChild.vue b/e2e/3.x/basic/components/TypeScriptChild.vue new file mode 100644 index 00000000..299bc3b8 --- /dev/null +++ b/e2e/3.x/basic/components/TypeScriptChild.vue @@ -0,0 +1,13 @@ + + + diff --git a/e2e/3.x/basic/components/coffee.spec.js b/e2e/3.x/basic/components/coffee.spec.js new file mode 100644 index 00000000..163edcb2 --- /dev/null +++ b/e2e/3.x/basic/components/coffee.spec.js @@ -0,0 +1,28 @@ +import { shallowMount, mount } from '@vue/test-utils' +import Coffee from './resources/Coffee.vue' +import CoffeeScript from './resources/CoffeeScript.vue' +import CoffeeES6 from './resources/CoffeeES6.vue' +import CoffeeScriptES6 from './resources/CoffeeScriptES6.vue' + +describe('Test CoffeeScript - coffee.spec.js', () => { + test('processes .vue file with lang set to coffee', () => { + shallowMount(Coffee) + }) + + test('processes .vue file with lang set to coffeescript', () => { + shallowMount(CoffeeScript) + }) + + test('processes .vue file with lang set to coffee (ES6)', () => { + shallowMount(CoffeeES6) + }) + + test('processes .vue file with lang set to coffeescript (ES6)', () => { + shallowMount(CoffeeScriptES6) + }) + + test('processes .vue file with lang set to coffeescript (ES6)', () => { + const wrapper = mount(CoffeeScriptES6) + expect(typeof wrapper).toBe('object') + }) +}) diff --git a/e2e/3.x/basic/components/relative/PugRelativeBase.pug b/e2e/3.x/basic/components/relative/PugRelativeBase.pug new file mode 100644 index 00000000..2347fc06 --- /dev/null +++ b/e2e/3.x/basic/components/relative/PugRelativeBase.pug @@ -0,0 +1,2 @@ +div(class='pug-relative-base') + block component \ No newline at end of file diff --git a/e2e/3.x/basic/package.json b/e2e/3.x/basic/package.json new file mode 100644 index 00000000..95365075 --- /dev/null +++ b/e2e/3.x/basic/package.json @@ -0,0 +1,52 @@ +{ + "name": "vue3-basic", + "version": "1.0.0", + "license": "MIT", + "private": true, + "scripts": { + "test": "jest --no-cache --coverage test.js" + }, + "dependencies": { + "vue": "^3.0.3" + }, + "devDependencies": { + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.0", + "@vue/compiler-sfc": "^3.0.3", + "babel-helper-vue-jsx-merge-props": "^2.0.3", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-vue-jsx": "^3.7.0", + "coffeescript": "^2.3.2", + "jade": "^1.11.0", + "jest": "^26.0.0", + "pug": "^2.0.3", + "ts-jest": "^26.4.4", + "typescript": "^4.1.2", + "vue-class-component": "^8.0.0-beta.4", + "vue3-jest": "^26.0.0-alpha.10", + "vue-property-decorator": "^10.0.0-rc.3" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "vue", + "ts" + ], + "transform": { + "^.+\\.ts$": "ts-jest", + "^.+\\.js$": "babel-jest", + "^.+\\.vue$": "vue3-jest" + }, + "moduleNameMapper": { + "^~?__styles/(.*)$": "/components/styles/$1" + }, + "globals": { + "vue-jest": { + "pug": { + "basedir": "./" + } + } + } + } +} diff --git a/e2e/3.x/basic/test.js b/e2e/3.x/basic/test.js new file mode 100644 index 00000000..16360102 --- /dev/null +++ b/e2e/3.x/basic/test.js @@ -0,0 +1,190 @@ +import { createApp, h, nextTick } from 'vue' +import { resolve } from 'path' +import { readFileSync } from 'fs' + +import BasicSrc from './components/BasicSrc.vue' +import TsSrc from './components/TsSrc.vue' +import Pug from './components/Pug.vue' +import Coffee from './components/Coffee.vue' +import Basic from './components/Basic.vue' +import ClassComponent from './components/ClassComponent.vue' +import ClassComponentWithMixin from './components/ClassComponentWithMixin.vue' +import ClassComponentProperty from './components/ClassComponentProperty.vue' +import TypeScript from './components/TypeScript.vue' +import jestVue from 'vue3-jest' +import RenderFunction from './components/RenderFunction.vue' +import FunctionalSFC from './components/FunctionalSFC.vue' +import CoffeeScript from './components/CoffeeScript.vue' +import FunctionalSFCParent from './components/FunctionalSFCParent.vue' +import NoScript from './components/NoScript.vue' +import PugRelative from './components/PugRelativeExtends.vue' +import { randomExport } from './components/NamedExport.vue' +import ScriptSetup from './components/ScriptSetup.vue' +import FunctionalRenderFn from './components/FunctionalRenderFn.vue' + +// TODO: JSX for Vue 3? TSX? +import Jsx from './components/Jsx.vue' + +function mount(Component, props, slots) { + document.getElementsByTagName('html')[0].innerHTML = '' + const el = document.createElement('div') + el.id = 'app' + document.body.appendChild(el) + const Parent = { + render() { + return h(Component, props, slots) + } + } + createApp(Parent).mount(el) +} + +test('supports diff --git a/e2e/3.x/javascript/components/Coffee.vue b/e2e/3.x/javascript/components/Coffee.vue new file mode 100644 index 00000000..565a528b --- /dev/null +++ b/e2e/3.x/javascript/components/Coffee.vue @@ -0,0 +1,9 @@ + + + diff --git a/e2e/3.x/javascript/package.json b/e2e/3.x/javascript/package.json new file mode 100644 index 00000000..64b0db6e --- /dev/null +++ b/e2e/3.x/javascript/package.json @@ -0,0 +1,35 @@ +{ + "name": "vue3-javascript", + "version": "1.0.0", + "license": "MIT", + "private": true, + "scripts": { + "test": "jest --no-cache test.js" + }, + "dependencies": { + "vue": "^3.0.3" + }, + "devDependencies": { + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.0", + "coffeescript": "^2.3.2", + "jest": "^26.0.0", + "vue3-jest": "^26.0.0-alpha.10" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "vue" + ], + "transform": { + "^.+\\.js$": "babel-jest", + "^.+\\.vue$": "vue3-jest" + } + }, + "babel": { + "presets": [ + "@babel/env" + ] + } +} diff --git a/e2e/3.x/javascript/test.js b/e2e/3.x/javascript/test.js new file mode 100644 index 00000000..01b9fe18 --- /dev/null +++ b/e2e/3.x/javascript/test.js @@ -0,0 +1,29 @@ +import { createApp, h } from 'vue' + +import Basic from './components/Basic.vue' +import Coffee from './components/Coffee.vue' + +function mount(Component, props, slots) { + document.getElementsByTagName('html')[0].innerHTML = '' + const el = document.createElement('div') + el.id = 'app' + document.body.appendChild(el) + const Parent = { + render() { + return h(Component, props, slots) + } + } + createApp(Parent).mount(el) +} + +test('processes .vue files', () => { + mount(Basic) + expect(document.querySelector('h1').textContent).toBe( + 'Welcome to Your Vue.js App' + ) +}) + +test('processes .vue file with lang set to coffee', () => { + mount(Coffee) + expect(document.querySelector('h1').textContent).toBe('Coffee') +}) diff --git a/e2e/3.x/style/babel.config.js b/e2e/3.x/style/babel.config.js new file mode 100644 index 00000000..7db9b6f5 --- /dev/null +++ b/e2e/3.x/style/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['@babel/preset-env'] +} diff --git a/e2e/3.x/style/components/External.vue b/e2e/3.x/style/components/External.vue new file mode 100644 index 00000000..90b1df56 --- /dev/null +++ b/e2e/3.x/style/components/External.vue @@ -0,0 +1,13 @@ + + + diff --git a/e2e/3.x/style/components/Less.vue b/e2e/3.x/style/components/Less.vue new file mode 100644 index 00000000..dcbcba42 --- /dev/null +++ b/e2e/3.x/style/components/Less.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/e2e/3.x/style/components/PostCss.vue b/e2e/3.x/style/components/PostCss.vue new file mode 100644 index 00000000..a96aadec --- /dev/null +++ b/e2e/3.x/style/components/PostCss.vue @@ -0,0 +1,30 @@ + + + + + + + diff --git a/e2e/3.x/style/components/Sass.vue b/e2e/3.x/style/components/Sass.vue new file mode 100644 index 00000000..77228766 --- /dev/null +++ b/e2e/3.x/style/components/Sass.vue @@ -0,0 +1,39 @@ + + + + + + + + + diff --git a/e2e/3.x/style/components/Scss.vue b/e2e/3.x/style/components/Scss.vue new file mode 100644 index 00000000..5f987a89 --- /dev/null +++ b/e2e/3.x/style/components/Scss.vue @@ -0,0 +1,43 @@ + + + + + + + + + diff --git a/e2e/3.x/style/components/Stylus.vue b/e2e/3.x/style/components/Stylus.vue new file mode 100644 index 00000000..b1db654c --- /dev/null +++ b/e2e/3.x/style/components/Stylus.vue @@ -0,0 +1,33 @@ + + + + + + + diff --git a/e2e/3.x/style/components/relative/resource.styl b/e2e/3.x/style/components/relative/resource.styl new file mode 100644 index 00000000..a1417501 --- /dev/null +++ b/e2e/3.x/style/components/relative/resource.styl @@ -0,0 +1 @@ +standard-space = 11px \ No newline at end of file diff --git a/e2e/3.x/style/components/styles/external.css b/e2e/3.x/style/components/styles/external.css new file mode 100644 index 00000000..365af23e --- /dev/null +++ b/e2e/3.x/style/components/styles/external.css @@ -0,0 +1,3 @@ +.testClass { + background-color: red; +} diff --git a/e2e/3.x/style/components/styles/less-a.less b/e2e/3.x/style/components/styles/less-a.less new file mode 100644 index 00000000..6b45a74c --- /dev/null +++ b/e2e/3.x/style/components/styles/less-a.less @@ -0,0 +1,7 @@ +@import "variables"; +.c { + color: @primary-color; +} +.d { + background-color: @primary-color; +} diff --git a/e2e/3.x/style/components/styles/sass-a.sass b/e2e/3.x/style/components/styles/sass-a.sass new file mode 100644 index 00000000..222ddb76 --- /dev/null +++ b/e2e/3.x/style/components/styles/sass-a.sass @@ -0,0 +1,4 @@ +@import "./sass-b" + +.a + background-color: blue diff --git a/e2e/3.x/style/components/styles/sass-b.sass b/e2e/3.x/style/components/styles/sass-b.sass new file mode 100644 index 00000000..ec96d2c0 --- /dev/null +++ b/e2e/3.x/style/components/styles/sass-b.sass @@ -0,0 +1,2 @@ +.b + background-color: blue diff --git a/e2e/3.x/style/components/styles/scss-a.scss b/e2e/3.x/style/components/styles/scss-a.scss new file mode 100644 index 00000000..30630635 --- /dev/null +++ b/e2e/3.x/style/components/styles/scss-a.scss @@ -0,0 +1,5 @@ +@import "./scss-b"; + +.a { + background-color: blue +} diff --git a/e2e/3.x/style/components/styles/scss-b.scss b/e2e/3.x/style/components/styles/scss-b.scss new file mode 100644 index 00000000..b8341292 --- /dev/null +++ b/e2e/3.x/style/components/styles/scss-b.scss @@ -0,0 +1,3 @@ +.b { + background-color: blue; +} diff --git a/e2e/3.x/style/package.json b/e2e/3.x/style/package.json new file mode 100644 index 00000000..2e3724b2 --- /dev/null +++ b/e2e/3.x/style/package.json @@ -0,0 +1,50 @@ +{ + "name": "vue3-style", + "version": "1.0.0", + "license": "MIT", + "private": true, + "scripts": { + "test": "jest --no-cache test.js" + }, + "dependencies": { + "@vue/compiler-sfc": "^3.0.3", + "vue": "^3.0.3" + }, + "devDependencies": { + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.0", + "@vue/test-utils": "^1.1.0", + "jest": "^26.0.0", + "less": "^3.9.0", + "postcss": "^7.0.13", + "sass": "^1.23.7", + "stylus": "^0.54.5", + "vue3-jest": "^26.0.0-alpha.10" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "vue" + ], + "transform": { + "^.+\\.js$": "babel-jest", + "^.+\\.vue$": "vue3-jest" + }, + "moduleNameMapper": { + "^~?__styles/(.*)$": "/components/styles/$1" + }, + "globals": { + "vue-jest": { + "resources": { + "scss": [ + "variables.scss" + ], + "less": [ + "variables.less" + ] + } + } + } + } +} diff --git a/e2e/3.x/style/test.js b/e2e/3.x/style/test.js new file mode 100644 index 00000000..f4c6047e --- /dev/null +++ b/e2e/3.x/style/test.js @@ -0,0 +1,81 @@ +// TODO: Support styles +// +import { createApp, h } from 'vue' + +import Less from './components/Less.vue' +import Stylus from './components/Stylus.vue' +import Scss from './components/Scss.vue' +import Sass from './components/Sass.vue' +import PostCss from './components/PostCss.vue' +import External from './components/External.vue' + +function mount(Component, props, slots) { + document.getElementsByTagName('html')[0].innerHTML = '' + const el = document.createElement('div') + el.id = 'app' + document.body.appendChild(el) + const Parent = { + render() { + return h(Component, props, slots) + } + } + createApp(Parent).mount(el) +} + +test('processes Less', () => { + mount(Less) + expect(document.getElementById('app').innerHTML).toEqual( + '
a
b
c
d
' + ) +}) + +test('processes PostCSS', () => { + mount(PostCss) + expect(document.getElementById('app').innerHTML).toEqual( + '
' + ) + // expect(wrapper.is('section')).toBeTruthy() + // expect(wrapper.vm.$style.a).toEqual('a') + // expect(wrapper.vm.$style.b).toEqual('b') +}) + +test('processes Sass', () => { + mount(Sass) + expect(document.getElementById('app').innerHTML).toEqual( + '
' + ) + // expect(wrapper.vm.$style.a).toEqual('a') + // expect(wrapper.vm.$style.b).toEqual('b') + // expect(wrapper.vm.$style.c).toEqual('c') + // expect(wrapper.vm.$style.light).toBeUndefined() +}) + +test('processes SCSS with resources', () => { + mount(Scss) + expect(document.getElementById('app').innerHTML).toEqual( + '
' + ) + // expect(wrapper.vm.$style.a).toEqual('a') + // expect(wrapper.vm.$style.b).toEqual('b') + // expect(wrapper.vm.$style.c).toEqual('c') +}) + +test('process Stylus', () => { + mount(Stylus) + expect(document.getElementById('app').innerHTML).toEqual( + '
' + ) + // expect(wrapper.vm).toBeTruthy() + // expect(wrapper.vm.css.a).toEqual('a') + // expect(wrapper.vm.$style.b).toEqual('b') +}) + +test('process External', () => { + mount(External) + expect(document.getElementById('app').innerHTML).toEqual( + '
' + ) + // expect(wrapper.vm).toBeTruthy() + // expect(wrapper.vm.$style.xtestClass).toEqual('xtestClass') + // expect(wrapper.vm.css.a).toEqual('a') +}) diff --git a/e2e/3.x/style/variables.less b/e2e/3.x/style/variables.less new file mode 100644 index 00000000..7b9ea3f9 --- /dev/null +++ b/e2e/3.x/style/variables.less @@ -0,0 +1 @@ +@primary-color: "red"; diff --git a/e2e/3.x/style/variables.scss b/e2e/3.x/style/variables.scss new file mode 100644 index 00000000..d7cf8edb --- /dev/null +++ b/e2e/3.x/style/variables.scss @@ -0,0 +1 @@ +$primary-color: #333; diff --git a/e2e/3.x/typescript/package.json b/e2e/3.x/typescript/package.json new file mode 100644 index 00000000..293dd389 --- /dev/null +++ b/e2e/3.x/typescript/package.json @@ -0,0 +1,42 @@ +{ + "name": "vue3-typescript", + "version": "1.0.0", + "license": "MIT", + "private": true, + "scripts": { + "test": "jest --no-cache ./sub-project/test.js" + }, + "dependencies": { + "@vue/compiler-sfc": "^3.0.3", + "vue": "^3.0.3" + }, + "devDependencies": { + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.0", + "jest": "^26.0.0", + "ts-jest": "^26.4.4", + "typescript": "^4.1.2", + "vue3-jest": "^26.0.0-alpha.10" + }, + "jest": { + "globals": { + "vue-jest": { + "tsConfig": "./sub-project/tsconfig.json" + } + }, + "moduleFileExtensions": [ + "js", + "json", + "vue" + ], + "transform": { + "^.+\\.js$": "babel-jest", + "^.+\\.vue$": "vue3-jest" + } + }, + "babel": { + "presets": [ + "@babel/env" + ] + } +} diff --git a/e2e/3.x/typescript/sub-project/components/Basic.vue b/e2e/3.x/typescript/sub-project/components/Basic.vue new file mode 100644 index 00000000..7e5a8d1f --- /dev/null +++ b/e2e/3.x/typescript/sub-project/components/Basic.vue @@ -0,0 +1,48 @@ + + + + + + + diff --git a/e2e/3.x/typescript/sub-project/test.js b/e2e/3.x/typescript/sub-project/test.js new file mode 100644 index 00000000..e2a326ae --- /dev/null +++ b/e2e/3.x/typescript/sub-project/test.js @@ -0,0 +1,23 @@ +import { createApp, h } from 'vue' + +import Basic from './components/Basic.vue' + +function mount(Component, props, slots) { + document.getElementsByTagName('html')[0].innerHTML = '' + const el = document.createElement('div') + el.id = 'app' + document.body.appendChild(el) + const Parent = { + render() { + return h(Component, props, slots) + } + } + createApp(Parent).mount(el) +} + +test('processes .vue files', () => { + mount(Basic) + expect(document.querySelector('h1').textContent).toBe( + 'Welcome to Your Vue.js App' + ) +}) diff --git a/e2e/3.x/typescript/sub-project/tsconfig.json b/e2e/3.x/typescript/sub-project/tsconfig.json new file mode 100644 index 00000000..8073706e --- /dev/null +++ b/e2e/3.x/typescript/sub-project/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "es6"], + "module": "es2015", + "moduleResolution": "node", + "types": ["vue-typescript-import-dts", "node"], + "isolatedModules": false, + "experimentalDecorators": true, + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "suppressImplicitAnyIndexErrors": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true, + "allowJs": true + } +} diff --git a/package.json b/package.json index db023e05..7fb27fef 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,9 @@ "packages": [ "packages/*", "e2e/**" + ], + "nohoist": [ + "**/vue" ] }, "scripts": { diff --git a/packages/vue3-jest/lib/constants.js b/packages/vue3-jest/lib/constants.js new file mode 100644 index 00000000..742ef7d4 --- /dev/null +++ b/packages/vue3-jest/lib/constants.js @@ -0,0 +1,6 @@ +module.exports = { + vueOptionsNamespace: '__options__', + defaultVueJestConfig: { + transform: {} + } +} diff --git a/packages/vue3-jest/lib/ensure-require.js b/packages/vue3-jest/lib/ensure-require.js new file mode 100644 index 00000000..17f40920 --- /dev/null +++ b/packages/vue3-jest/lib/ensure-require.js @@ -0,0 +1,40 @@ +const throwError = require('./utils').throwError + +module.exports = function(name, deps) { + let i, len + let missing = [] + if (typeof deps === 'string') { + deps = [deps] + } + for (i = 0, len = deps.length; i < len; i++) { + let mis + let req = deps[i] + if (typeof req === 'string') { + mis = req + } else { + mis = req[1] + req = req[0] + } + try { + // hack for babel-runtime because it does not expose "main" field + if (req === 'babel-runtime') { + req = 'babel-runtime/core-js' + } + require.resolve(req) + } catch (e) { + missing.push(mis) + } + } + if (missing.length > 0) { + let message = 'You are trying to use "' + name + '". ' + let npmInstall = 'npm install --save-dev ' + missing.join(' ') + if (missing.length > 1) { + const last = missing.pop() + message += missing.join(', ') + ' and ' + last + ' are ' + } else { + message += missing[0] + ' is ' + } + message += 'missing.\n\nTo install run:\n' + npmInstall + throwError(message) + } +} diff --git a/packages/vue3-jest/lib/generate-code.js b/packages/vue3-jest/lib/generate-code.js new file mode 100644 index 00000000..f4af783a --- /dev/null +++ b/packages/vue3-jest/lib/generate-code.js @@ -0,0 +1,67 @@ +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, + filename, + stylesResult +) { + var node = new SourceNode(null, null, null) + addToSourceMap(node, scriptResult) + addToSourceMap(node, scriptSetupResult) + addToSourceMap(node, templateResult) + + var tempOutput = node.toString() + + if ( + // vue-property-decorator also exports Vue, which can be used to create a class component. + // In that case vue-class-component is not present in the tempOutput. + tempOutput.includes('vue-class-component') || + tempOutput.includes('vue-property-decorator') + ) { + node.add(` + ;exports.default = { + ...exports.default.__vccBase, + ...exports.default.__vccOpts + };`) + } + + if (tempOutput.includes('exports.render = render;')) { + node.add(';exports.default = {...exports.default, render};') + } else { + // node.add(';exports.default = {...exports.default};') + } + if (Array.isArray(stylesResult)) { + const mergedStyle = {} + stylesResult.forEach(styleObj => { + const { code, moduleName } = styleObj + mergedStyle[moduleName] = { + ...(mergedStyle[moduleName] || {}), + ...(JSON.parse(code) || {}) + } + }) + node.add( + `;exports.default = {...exports.default, __cssModules: ${JSON.stringify( + mergedStyle + )}}` + ) + } + + return node.toStringWithSourceMap({ file: filename }) +} diff --git a/packages/vue3-jest/lib/index.js b/packages/vue3-jest/lib/index.js new file mode 100644 index 00000000..616e6263 --- /dev/null +++ b/packages/vue3-jest/lib/index.js @@ -0,0 +1,24 @@ +const crypto = require('crypto') +const babelJest = require('babel-jest') + +module.exports = { + process: require('./process'), + getCacheKey: function getCacheKey( + fileData, + filename, + configString, + { config, instrument, rootDir } + ) { + return crypto + .createHash('md5') + .update( + babelJest.getCacheKey(fileData, filename, configString, { + config, + instrument, + rootDir + }), + 'hex' + ) + .digest('hex') + } +} diff --git a/packages/vue3-jest/lib/map-lines.js b/packages/vue3-jest/lib/map-lines.js new file mode 100644 index 00000000..c05b69ce --- /dev/null +++ b/packages/vue3-jest/lib/map-lines.js @@ -0,0 +1,55 @@ +const { SourceMapGenerator, SourceMapConsumer } = require('source-map') + +// based on @vue/compiler-sfc mapLines +module.exports = function mapLines(oldMap, newMap) { + if (!oldMap) return newMap + if (!newMap) return oldMap + + const oldMapConsumer = new SourceMapConsumer(oldMap) + const newMapConsumer = new SourceMapConsumer(newMap) + const mergedMapGenerator = new SourceMapGenerator() + + newMapConsumer.eachMapping(m => { + if (m.originalLine == null) { + return + } + + const origPosInOldMap = oldMapConsumer.originalPositionFor({ + line: m.originalLine, + column: m.originalColumn + }) + + if (origPosInOldMap.source == null) { + return + } + + mergedMapGenerator.addMapping({ + generated: { + line: m.generatedLine, + column: m.generatedColumn + }, + original: { + line: origPosInOldMap.line, // map line + // use current column, since the oldMap produced by @vue/compiler-sfc + // does not + column: m.originalColumn + }, + source: origPosInOldMap.source, + name: origPosInOldMap.name + }) + }) + + // source-map's type definition is incomplete + const generator = mergedMapGenerator + oldMapConsumer.sources.forEach(sourceFile => { + generator._sources.add(sourceFile) + const sourceContent = oldMapConsumer.sourceContentFor(sourceFile) + if (sourceContent != null) { + mergedMapGenerator.setSourceContent(sourceFile, sourceContent) + } + }) + + generator._sourceRoot = oldMap.sourceRoot + generator._file = oldMap.file + return generator.toJSON() +} diff --git a/packages/vue3-jest/lib/module-name-mapper-helper.js b/packages/vue3-jest/lib/module-name-mapper-helper.js new file mode 100644 index 00000000..85ed1c23 --- /dev/null +++ b/packages/vue3-jest/lib/module-name-mapper-helper.js @@ -0,0 +1,57 @@ +const path = require('path') +const matchModuleImport = /^[^?]*~/ +/** + * Resolves the path to the file/module. + * + * @param {String} to - the name of the file to resolve to + * @param {String} importPath - the local path + * @param {String} fileType - extension of the file to be resolved + * @returns {String} path - path to the file to import + */ +function resolve(to, importPath, fileType) { + importPath = + path.extname(importPath) === '' ? `${importPath}.${fileType}` : importPath + if (path.isAbsolute(importPath)) { + return importPath + } else if (matchModuleImport.test(importPath)) { + return require.resolve(importPath.replace(matchModuleImport, '')) + } + return path.join(path.dirname(to), importPath) +} + +/** + * Applies the moduleNameMapper substitution from the jest config + * + * @param {String} source - the original string + * @param {String} filePath - the path of the current file (where the source originates) + * @param {Object} jestConfig - the jestConfig holding the moduleNameMapper settings + * @param {Object} fileType - extn of the file to be resolved + * @returns {String} path - the final path to import (including replacements via moduleNameMapper) + */ +module.exports = function applyModuleNameMapper( + source, + filePath, + jestConfig = {}, + fileType = '' +) { + if (!jestConfig.moduleNameMapper) return source + // Extract the moduleNameMapper settings from the jest config. TODO: In case of development via babel@7, somehow the jestConfig.moduleNameMapper might end up being an Array. After a proper upgrade to babel@7 we should probably fix this. + const module = Array.isArray(jestConfig.moduleNameMapper) + ? jestConfig.moduleNameMapper + : Object.entries(jestConfig.moduleNameMapper) + + const importPath = module.reduce((acc, [regex, replacement]) => { + const matches = acc.match(regex) + + if (matches === null) { + return acc + } + + return replacement.replace( + /\$([0-9]+)/g, + (_, index) => matches[parseInt(index, 10)] + ) + }, source) + + return resolve(filePath, importPath, fileType) +} diff --git a/packages/vue3-jest/lib/process-custom-blocks.js b/packages/vue3-jest/lib/process-custom-blocks.js new file mode 100644 index 00000000..17516fa5 --- /dev/null +++ b/packages/vue3-jest/lib/process-custom-blocks.js @@ -0,0 +1,41 @@ +const { getVueJestConfig, getCustomTransformer } = require('./utils') +const vueOptionsNamespace = require('./constants').vueOptionsNamespace + +function applyTransformer( + transformer, + blocks, + vueOptionsNamespace, + filename, + config +) { + return transformer.process({ blocks, vueOptionsNamespace, filename, config }) +} + +function groupByType(acc, block) { + acc[block.type] = acc[block.type] || [] + acc[block.type].push(block) + return acc +} + +module.exports = function(allBlocks, filename, config) { + const blocksByType = allBlocks.reduce(groupByType, {}) + const code = [] + for (const [type, blocks] of Object.entries(blocksByType)) { + const transformer = getCustomTransformer( + getVueJestConfig(config).transform, + type + ) + if (transformer) { + const codeStr = applyTransformer( + transformer, + blocks, + vueOptionsNamespace, + filename, + config + ) + code.push(codeStr) + } + } + + return code.length ? code.join('\n') : '' +} diff --git a/packages/vue3-jest/lib/process-style.js b/packages/vue3-jest/lib/process-style.js new file mode 100644 index 00000000..14a59305 --- /dev/null +++ b/packages/vue3-jest/lib/process-style.js @@ -0,0 +1,102 @@ +const { compileStyle } = require('@vue/compiler-sfc') +const path = require('path') +const fs = require('fs') +const cssExtract = require('extract-from-css') +const getVueJestConfig = require('./utils').getVueJestConfig +const applyModuleNameMapper = require('./module-name-mapper-helper') +const getCustomTransformer = require('./utils').getCustomTransformer +const logResultErrors = require('./utils').logResultErrors +const loadSrc = require('./utils').loadSrc + +function getGlobalResources(resources, lang) { + let globalResources = '' + if (resources && resources[lang]) { + globalResources = resources[lang] + .map(resource => path.resolve(process.cwd(), resource)) + .filter(resourcePath => fs.existsSync(resourcePath)) + .map(resourcePath => fs.readFileSync(resourcePath).toString()) + .join('\n') + } + return globalResources +} + +function extractClassMap(cssCode) { + const cssNames = cssExtract.extractClasses(cssCode) + const cssMap = {} + for (let i = 0, l = cssNames.length; i < l; i++) { + cssMap[cssNames[i]] = cssNames[i] + } + return cssMap +} + +function getPreprocessOptions(lang, filePath, jestConfig) { + if (lang === 'scss' || lang === 'sass') { + return { + importer: (url, prev, done) => ({ + file: applyModuleNameMapper( + url, + prev === 'stdin' ? filePath : prev, + jestConfig, + lang + ) + }) + } + } + if (lang === 'styl' || lang === 'stylus' || lang === 'less') { + return { + paths: [path.dirname(filePath), process.cwd()] + } + } +} + +module.exports = function processStyle(stylePart, filePath, config = {}) { + const vueJestConfig = getVueJestConfig(config) + + if (stylePart.src && !stylePart.content) { + stylePart.content = loadSrc(stylePart.src, filePath) + } + + if (vueJestConfig.experimentalCSSCompile === false || !stylePart.content) { + return '{}' + } + + let content = + getGlobalResources(vueJestConfig.resources, stylePart.lang) + + stylePart.content + + const transformer = + getCustomTransformer(vueJestConfig['transform'], stylePart.lang) || {} + + // pre process + if (transformer.preprocess) { + content = transformer.preprocess(content, filePath, config, stylePart.attrs) + } + + // transform + if (transformer.process) { + content = transformer.process(content, filePath, config, stylePart.attrs) + } else { + const preprocessOptions = getPreprocessOptions( + stylePart.lang, + filePath, + config + ) + const result = compileStyle({ + id: `vue-jest-${filePath}`, + source: content, + filePath, + preprocessLang: stylePart.lang, + preprocessOptions, + scoped: false + }) + logResultErrors(result) + content = result.code + } + + // post process + if (transformer.postprocess) { + return transformer.postprocess(content, filePath, config, stylePart.attrs) + } + + return JSON.stringify(extractClassMap(content)) +} diff --git a/packages/vue3-jest/lib/process.js b/packages/vue3-jest/lib/process.js new file mode 100644 index 00000000..d16f330f --- /dev/null +++ b/packages/vue3-jest/lib/process.js @@ -0,0 +1,158 @@ +const { parse, compileTemplate, compileScript } = require('@vue/compiler-sfc') +const { transform } = require('@babel/core') +const babelTransformer = require('babel-jest') + +const typescriptTransformer = require('./transformers/typescript') +const coffeescriptTransformer = require('./transformers/coffee') +const _processStyle = require('./process-style') +// const processCustomBlocks = require('./process-custom-blocks') +const getVueJestConfig = require('./utils').getVueJestConfig +const getTsJestConfig = require('./utils').getTsJestConfig +const logResultErrors = require('./utils').logResultErrors +const stripInlineSourceMap = require('./utils').stripInlineSourceMap +const getCustomTransformer = require('./utils').getCustomTransformer +const loadSrc = require('./utils').loadSrc +const generateCode = require('./generate-code') +const mapLines = require('./map-lines') + +function resolveTransformer(lang = 'js', vueJestConfig) { + const transformer = getCustomTransformer(vueJestConfig['transform'], lang) + if (/^typescript$|tsx?$/.test(lang)) { + return transformer || typescriptTransformer + } else if (/^coffee$|coffeescript$/.test(lang)) { + return transformer || coffeescriptTransformer + } else { + return transformer || babelTransformer + } +} + +function processScript(scriptPart, filePath, config) { + if (!scriptPart) { + return null + } + + let content = scriptPart.content + let filename = filePath + if (scriptPart.src) { + content = loadSrc(scriptPart.src, filePath) + filename = scriptPart.src + } + + const vueJestConfig = getVueJestConfig(config) + const transformer = resolveTransformer(scriptPart.lang, vueJestConfig) + + const result = transformer.process(content, filename, config) + result.code = stripInlineSourceMap(result.code) + result.map = mapLines(scriptPart.map, result.map) + return result +} + +function processScriptSetup(descriptor, filePath, config) { + if (!descriptor.scriptSetup) { + return null + } + const content = compileScript(descriptor, { id: filePath }) + const contentMap = mapLines(descriptor.scriptSetup.map, content.map) + + const vueJestConfig = getVueJestConfig(config) + const transformer = resolveTransformer( + descriptor.scriptSetup.lang, + vueJestConfig + ) + + const result = transformer.process(content.content, filePath, config) + result.map = mapLines(contentMap, result.map) + + return result +} + +function processTemplate(descriptor, filename, config) { + const { template, scriptSetup } = descriptor + + if (!template) { + return null + } + + const vueJestConfig = getVueJestConfig(config) + + if (template.src) { + template.content = loadSrc(template.src, filename) + } + + let bindings + if (scriptSetup) { + const scriptSetupResult = compileScript(descriptor, { id: filename }) + bindings = scriptSetupResult.bindings + } + + const result = compileTemplate({ + id: filename, + source: template.content, + filename, + preprocessLang: template.lang, + preprocessOptions: vueJestConfig[template.lang], + compilerOptions: { + bindingMetadata: bindings, + mode: 'module' + } + }) + + logResultErrors(result) + + const tsconfig = getTsJestConfig(config) + + if (tsconfig) { + // they are using TypeScript. + const { transpileModule } = require('typescript') + const { outputText } = transpileModule(result.code, { tsconfig }) + return { code: outputText } + } else { + // babel + const babelify = transform(result.code, { filename: 'file.js' }) + + return { + code: babelify.code + } + } +} + +function processStyle(styles, filename, config) { + if (!styles) { + return null + } + + const filteredStyles = styles + .filter(style => style.module) + .map(style => ({ + code: _processStyle(style, filename, config), + moduleName: style.module === true ? '$style' : style.module + })) + + return filteredStyles.length ? filteredStyles : null +} + +module.exports = function(src, filename, config) { + const { descriptor } = parse(src, { filename }) + + const templateResult = processTemplate(descriptor, filename, config) + const scriptResult = processScript(descriptor.script, filename, config) + const scriptSetupResult = processScriptSetup(descriptor, filename, config) + const stylesResult = processStyle(descriptor.styles, filename, config) + // const customBlocksResult = processCustomBlocks( + // descriptor.customBlocks, + // filename, + // config + // ) + const output = generateCode( + scriptResult, + scriptSetupResult, + templateResult, + filename, + stylesResult + ) + + return { + code: output.code, + map: output.map.toString() + } +} diff --git a/packages/vue3-jest/lib/transformers/coffee.js b/packages/vue3-jest/lib/transformers/coffee.js new file mode 100644 index 00000000..8455ff6f --- /dev/null +++ b/packages/vue3-jest/lib/transformers/coffee.js @@ -0,0 +1,26 @@ +const ensureRequire = require('../ensure-require.js') +const throwError = require('../utils').throwError +const getBabelOptions = require('../utils').getBabelOptions + +module.exports = { + process(src, filename, config) { + ensureRequire('coffee', ['coffeescript']) + const coffee = require('coffeescript') + const babelOptions = getBabelOptions(filename) + let compiled + try { + compiled = coffee.compile(src, { + filename, + bare: true, + sourceMap: true, + transpile: babelOptions + }) + } catch (err) { + throwError(err) + } + return { + code: compiled.js, + map: compiled.v3SourceMap + } + } +} diff --git a/packages/vue3-jest/lib/transformers/typescript.js b/packages/vue3-jest/lib/transformers/typescript.js new file mode 100644 index 00000000..a3913f77 --- /dev/null +++ b/packages/vue3-jest/lib/transformers/typescript.js @@ -0,0 +1,52 @@ +const ensureRequire = require('../ensure-require') +const babelJest = require('babel-jest') +const { + getBabelOptions, + getTsJestConfig, + stripInlineSourceMap, + getCustomTransformer, + getVueJestConfig +} = require('../utils') + +module.exports = { + process(scriptContent, filePath, config) { + ensureRequire('typescript', ['typescript']) + const typescript = require('typescript') + const vueJestConfig = getVueJestConfig(config) + const tsconfig = getTsJestConfig(config) + const babelOptions = getBabelOptions(filePath) + + const res = typescript.transpileModule(scriptContent, { + ...tsconfig, + fileName: filePath + }) + + res.outputText = stripInlineSourceMap(res.outputText) + + const inputSourceMap = + res.sourceMapText !== undefined ? JSON.parse(res.sourceMapText) : '' + + // handle ES modules in TS source code in case user uses non commonjs module + // output and there is no .babelrc. + let inlineBabelOptions = {} + if ( + tsconfig.compilerOptions.module !== typescript.ModuleKind.CommonJS && + !babelOptions + ) { + inlineBabelOptions = { + plugins: [require('@babel/plugin-transform-modules-commonjs')] + } + } + const customTransformer = + getCustomTransformer(vueJestConfig['transform'], 'js') || {} + const transformer = customTransformer.process + ? customTransformer + : babelJest.createTransformer( + Object.assign(inlineBabelOptions, { + inputSourceMap + }) + ) + + return transformer.process(res.outputText, filePath, config) + } +} diff --git a/packages/vue3-jest/lib/utils.js b/packages/vue3-jest/lib/utils.js new file mode 100644 index 00000000..2949ed21 --- /dev/null +++ b/packages/vue3-jest/lib/utils.js @@ -0,0 +1,170 @@ +const constants = require('./constants') +const loadPartialConfig = require('@babel/core').loadPartialConfig +const { resolveSync: resolveTsConfigSync } = require('tsconfig') +const chalk = require('chalk') +const path = require('path') +const fs = require('fs') + +const fetchTransformer = function fetchTransformer(key, obj) { + for (const exp in obj) { + const matchKey = new RegExp(exp) + if (matchKey.test(key)) { + return obj[exp] + } + } + return null +} + +const resolvePath = function resolvePath(pathToResolve) { + return /^(\.\.\/|\.\/|\/)/.test(pathToResolve) + ? path.resolve(process.cwd(), pathToResolve) + : pathToResolve +} + +const info = function info(msg) { + console.info(chalk.blue('\n[vue-jest]: ' + msg + '\n')) +} + +const warn = function warn(msg) { + console.warn(chalk.red('\n[vue-jest]: ' + msg + '\n')) +} + +const transformContent = function transformContent( + content, + filePath, + config, + transformer, + attrs +) { + if (!transformer) { + return content + } + try { + return transformer(content, filePath, config, attrs) + } catch (err) { + warn(`There was an error while compiling ${filePath} ${err}`) + } + return content +} + +const getVueJestConfig = function getVueJestConfig(jestConfig) { + return ( + (jestConfig && jestConfig.globals && jestConfig.globals['vue-jest']) || {} + ) +} +const getBabelOptions = function loadBabelOptions(filename, options = {}) { + const opts = Object.assign(options, { + caller: { + name: 'vue-jest', + supportsStaticESM: false + }, + filename, + sourceMaps: 'both' + }) + return loadPartialConfig(opts).options +} + +const getTsJestConfig = function getTsJestConfig(config) { + const tsConfigPath = path.resolve( + process.cwd(), + getVueJestConfig(config).tsConfig || '' + ) + const isUsingTs = resolveTsConfigSync(tsConfigPath) + if (!isUsingTs) { + return null + } + + const createTransformer = require('ts-jest').createTransformer + const tr = createTransformer() + const configSet = tr.configsFor(config) + const tsConfig = configSet.typescript || configSet.parsedTsConfig + // Force es5 to prevent const vue_1 = require('vue') from conflicting + return { compilerOptions: { ...tsConfig.options, target: 'es5' } } +} + +function isValidTransformer(transformer) { + return ( + isFunction(transformer.process) || + isFunction(transformer.postprocess) || + isFunction(transformer.preprocess) + ) +} + +const isFunction = fn => typeof fn === 'function' + +const getCustomTransformer = function getCustomTransformer( + transform = {}, + lang +) { + transform = { ...constants.defaultVueJestConfig.transform, ...transform } + + const transformerPath = fetchTransformer(lang, transform) + + if (!transformerPath) { + return null + } + + let transformer + if ( + typeof transformerPath === 'string' && + require(resolvePath(transformerPath)) + ) { + transformer = require(resolvePath(transformerPath)) + } else if (typeof transformerPath === 'object') { + transformer = transformerPath + } + + if (!isValidTransformer(transformer)) { + throwError( + `transformer must contain at least one process, preprocess, or ` + + `postprocess method` + ) + } + + return transformer +} + +const throwError = function error(msg) { + throw new Error('\n[vue-jest] Error: ' + msg + '\n') +} + +const stripInlineSourceMap = function(str) { + return str.slice(0, str.indexOf('//# sourceMappingURL')) +} + +const logResultErrors = result => { + if (result.errors.length) { + result.errors.forEach(function(msg) { + console.error('\n' + chalk.red(msg) + '\n') + }) + throwError('Vue template compilation failed') + } +} + +const loadSrc = (src, filePath) => { + var dir = path.dirname(filePath) + var srcPath = path.resolve(dir, src) + try { + return fs.readFileSync(srcPath, 'utf-8') + } catch (e) { + throwError( + 'Failed to load src: "' + src + '" from file: "' + filePath + '"' + ) + } +} + +module.exports = { + stripInlineSourceMap, + throwError, + logResultErrors, + getCustomTransformer, + getTsJestConfig, + getBabelOptions, + getVueJestConfig, + transformContent, + info, + warn, + resolvePath, + fetchTransformer, + loadSrc +} diff --git a/packages/vue3-jest/package.json b/packages/vue3-jest/package.json new file mode 100644 index 00000000..6e8286ed --- /dev/null +++ b/packages/vue3-jest/package.json @@ -0,0 +1,77 @@ +{ + "name": "vue3-jest", + "version": "26.0.0-alpha.10", + "description": "Jest Vue transform", + "main": "lib/index.js", + "files": [ + "lib" + ], + "keywords": [ + "jest", + "vue", + "jest vue", + "jest vue transform", + "jest vue preprocessor", + "vue jest", + "vue jest", + "vue jest transform", + "vue jest preprocessor" + ], + "scripts": { + "release": "semantic-release", + "test": "echo \"There are no unit tests yet. Run e2e/3.x/ tests instead.\"" + }, + "author": "Edd Yerburgh", + "license": "MIT", + "devDependencies": { + "@babel/core": "^7.9.0", + "@vue/compiler-sfc": "^3.0.3", + "babel-core": "^7.0.0-bridge.0", + "babel-jest": "^26.0.0", + "conventional-changelog": "^1.1.5", + "jest": "^26.0.0", + "semantic-release": "^15.13.2", + "ts-jest": "^26.4.4", + "typescript": "^4.1.2", + "vue": "^3.0.3" + }, + "peerDependencies": { + "@babel/core": "7.x", + "babel-jest": "26.x", + "jest": "26.x", + "ts-jest": "26.x", + "typescript": ">= 3.x", + "vue": "^3.0.0-0" + }, + "peerDependenciesMeta": { + "ts-jest": { + "optional": true + }, + "typescript": { + "optional": true + } + }, + "dependencies": { + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "chalk": "^2.1.0", + "convert-source-map": "^1.6.0", + "extract-from-css": "^0.4.4", + "source-map": "0.5.6", + "tsconfig": "^7.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/vuejs/vue-jest.git" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{js,json,css,md,vue}": [ + "yarn format", + "git add" + ] + } +} diff --git a/yarn.lock b/yarn.lock index 0f5e4c1f..ce3033d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -257,6 +257,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + "@babel/helper-regex@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" @@ -338,6 +343,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" + integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== + "@babel/helper-wrap-function@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" @@ -391,6 +401,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== +"@babel/parser@^7.12.0", "@babel/parser@^7.13.9": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" + integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== + "@babel/parser@^7.6.0", "@babel/parser@^7.9.6": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.12.tgz#ba320059420774394d3b0c0233ba40e4250b81d1" @@ -594,6 +609,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-arrow-functions@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" @@ -1008,6 +1030,14 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.12.0", "@babel/types@^7.13.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" + integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + to-fast-properties "^2.0.0" + "@babel/types@^7.6.1", "@babel/types@^7.9.6": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.12.tgz#edbf99208ef48852acdff1c8a681a1e4ade580cd" @@ -1213,6 +1243,27 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + "@jest/types@^25.5.0": version "25.5.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" @@ -1234,6 +1285,17 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + "@nodelib/fs.scandir@2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" @@ -1419,6 +1481,11 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@types/babel-types@*", "@types/babel-types@^7.0.0": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.9.tgz#01d7b86949f455402a94c788883fe4ba574cad41" + integrity sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA== + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": version "7.1.9" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" @@ -1452,10 +1519,22 @@ dependencies: "@babel/types" "^7.3.0" +"@types/babylon@^6.16.2": + version "6.16.5" + resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.5.tgz#1c5641db69eb8cdf378edd25b4be7754beeb48b4" + integrity sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w== + dependencies: + "@types/babel-types" "*" + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" +"@types/estree@^0.0.48": + version "0.0.48" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.48.tgz#18dc8091b285df90db2f25aa7d906cfc394b7f74" + integrity sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew== + "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -1537,6 +1616,16 @@ version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + "@types/yargs-parser@*": version "15.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" @@ -1548,6 +1637,56 @@ dependencies: "@types/yargs-parser" "*" +"@vue/compiler-core@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.1.2.tgz#31ab1d88e1706a5c7a545faeeb64c31bd0101db0" + integrity sha512-nHmq7vLjq/XM2IMbZUcKWoH5sPXa2uR/nIKZtjbK5F3TcbnYE/zKsrSUR9WZJ03unlwotNBX1OyxVt9HbWD7/Q== + dependencies: + "@babel/parser" "^7.12.0" + "@babel/types" "^7.12.0" + "@vue/shared" "3.1.2" + estree-walker "^2.0.1" + source-map "^0.6.1" + +"@vue/compiler-dom@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.1.2.tgz#75a7731bcc5d9718183a3c56c18e992f7c13e7b1" + integrity sha512-k2+SWcWH0jL6WQAX7Or2ONqu5MbtTgTO0dJrvebQYzgqaKMXNI90RNeWeCxS4BnNFMDONpHBeFgbwbnDWIkmRg== + dependencies: + "@vue/compiler-core" "3.1.2" + "@vue/shared" "3.1.2" + +"@vue/compiler-sfc@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.1.2.tgz#23ff1e366d887b964899568bffcb11e3d0511fc4" + integrity sha512-SeG/2+DvwejQ7oAiSx8BrDh5qOdqCYHGClPiTvVIHTfSIHiS2JjMbCANdDCjHkTOh/O7WZzo2JhdKm98bRBxTw== + dependencies: + "@babel/parser" "^7.13.9" + "@babel/types" "^7.13.0" + "@types/estree" "^0.0.48" + "@vue/compiler-core" "3.1.2" + "@vue/compiler-dom" "3.1.2" + "@vue/compiler-ssr" "3.1.2" + "@vue/shared" "3.1.2" + consolidate "^0.16.0" + estree-walker "^2.0.1" + hash-sum "^2.0.0" + lru-cache "^5.1.1" + magic-string "^0.25.7" + merge-source-map "^1.1.0" + postcss "^8.1.10" + postcss-modules "^4.0.0" + postcss-selector-parser "^6.0.4" + source-map "^0.6.1" + +"@vue/compiler-ssr@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.1.2.tgz#e33ad0876d9b96f0950e22b0e174b94c1b049d2d" + integrity sha512-BwXo9LFk5OSWdMyZQ4bX1ELHX0Z/9F+ld/OaVnpUPzAZCHslBYLvyKUVDwv2C/lpLjRffpC2DOUEdl1+RP1aGg== + dependencies: + "@vue/compiler-dom" "3.1.2" + "@vue/shared" "3.1.2" + "@vue/component-compiler-utils@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.1.1.tgz#d4ef8f80292674044ad6211e336a302e4d2a6575" @@ -1562,6 +1701,35 @@ source-map "~0.6.1" vue-template-es2015-compiler "^1.9.0" +"@vue/reactivity@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.1.2.tgz#66fa530dd726d2fef285ae55d02106a727db463b" + integrity sha512-glJzJoN2xE7I2lRvwKM5u1BHRPTd1yc8iaf//Lai/78/uYAvE5DXp5HzWRFOwMlbRvMGJHIQjOqoxj87cDAaag== + dependencies: + "@vue/shared" "3.1.2" + +"@vue/runtime-core@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.1.2.tgz#f4dbc503cfc9a02ab5f1ebe002c3322512064a54" + integrity sha512-gsPZG4dRIkixuuKmoj4P9IHgfT0yaFLcqWOM5F/bCk0nxQn1XtxH8oUehWuET726KhbukvDoJfe9G2CKviy80w== + dependencies: + "@vue/reactivity" "3.1.2" + "@vue/shared" "3.1.2" + +"@vue/runtime-dom@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.1.2.tgz#0fd8724f14bc7ba64b6c954d874a8d8a4fcb5fe9" + integrity sha512-QvINxjLucEZFzp5f0NVu7JqWYCv5TKQfkH2FDs/N6QNE4iKcYtKrWdT0HKfABnVXG28Znqv6rIH0dH4ZAOwxpA== + dependencies: + "@vue/runtime-core" "3.1.2" + "@vue/shared" "3.1.2" + csstype "^2.6.8" + +"@vue/shared@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.1.2.tgz#1069c0bc7d6f4bd15ccf3a5f3be29450aca368f9" + integrity sha512-EmH/poaDWBPJaPILXNI/1fvUbArJQmmTyVCwvvyDYDFnkPoTclAbHRAtyIvqfez7jybTDn077HTNILpxlsoWhg== + "@vue/test-utils@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.1.0.tgz#76305e73a786c921ede1352849614e26c7113f94" @@ -1594,6 +1762,13 @@ acorn-globals@^1.0.3: dependencies: acorn "^2.1.0" +acorn-globals@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= + dependencies: + acorn "^4.0.4" + acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -1619,6 +1794,16 @@ acorn@^2.1.0: version "2.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" +acorn@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= + +acorn@^4.0.4, acorn@~4.0.2: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= + acorn@^6.0.2, acorn@^6.0.7: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" @@ -1969,6 +2154,20 @@ babel-jest@^23.6.0: babel-plugin-istanbul "^4.1.6" babel-preset-jest "^23.2.0" +babel-jest@^26.0.0: + version "26.6.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" + integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== + dependencies: + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + babel-jest@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.3.0.tgz#10d0ca4b529ca3e7d1417855ef7d7bd6fc0c3463" @@ -2036,6 +2235,16 @@ babel-plugin-jest-hoist@^26.2.0: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" + integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" @@ -2069,6 +2278,24 @@ babel-preset-current-node-syntax@^0.1.3: "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + babel-preset-jest@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" @@ -2084,6 +2311,14 @@ babel-preset-jest@^26.3.0: babel-plugin-jest-hoist "^26.2.0" babel-preset-current-node-syntax "^0.1.3" +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== + dependencies: + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" + babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -2170,6 +2405,11 @@ before-after-hook@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + bin-links@^1.1.2, bin-links@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.8.tgz#bd39aadab5dc4bdac222a07df5baf1af745b2228" @@ -2186,7 +2426,7 @@ binary-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" -bluebird@^3.1.1, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: +bluebird@^3.1.1, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -2470,7 +2710,7 @@ character-parser@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-1.2.1.tgz#c0dde4ab182713b919b970959a123ecc1a30fcd6" -character-parser@^2.2.0: +character-parser@^2.1.1, character-parser@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= @@ -2533,6 +2773,13 @@ clean-css@^3.1.9: commander "2.8.x" source-map "0.4.x" +clean-css@^4.1.11: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -2806,6 +3053,23 @@ consolidate@^0.15.1: dependencies: bluebird "^3.1.1" +consolidate@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16" + integrity sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ== + dependencies: + bluebird "^3.7.2" + +constantinople@^3.0.1, constantinople@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647" + integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw== + dependencies: + "@types/babel-types" "^7.0.0" + "@types/babylon" "^6.16.2" + babel-types "^6.26.0" + babylon "^6.18.0" + constantinople@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" @@ -3151,6 +3415,11 @@ cssstyle@^2.2.0: dependencies: cssom "~0.3.6" +csstype@^2.6.8: + version "2.6.17" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.17.tgz#4cf30eb87e1d1a005d8b6510f95292413f6a1c0e" + integrity sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A== + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -3482,6 +3751,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" @@ -3774,6 +4048,11 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -4218,6 +4497,13 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +generic-names@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872" + integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ== + dependencies: + loader-utils "^1.1.0" + genfun@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" @@ -4541,6 +4827,11 @@ hash-sum@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" +hash-sum@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" + integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== + he@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -4647,6 +4938,16 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: dependencies: safer-buffer ">= 2.1.2 < 3" +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" @@ -4935,6 +5236,14 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" +is-expression@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f" + integrity sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8= + dependencies: + acorn "~4.0.2" + object-assign "^4.0.1" + is-expression@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" @@ -5455,6 +5764,27 @@ jest-haste-map@^26.3.0: optionalDependencies: fsevents "^2.1.2" +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + jest-jasmine2@^26.4.2: version "26.4.2" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz#18a9d5bec30904267ac5e9797570932aec1e2257" @@ -5618,6 +5948,14 @@ jest-serializer@^26.3.0: "@types/node" "*" graceful-fs "^4.2.4" +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + jest-snapshot@^26.4.2: version "26.4.2" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.4.2.tgz#87d3ac2f2bd87ea8003602fbebd8fcb9e94104f6" @@ -5651,6 +5989,18 @@ jest-util@26.x, jest-util@^26.3.0: is-ci "^2.0.0" micromatch "^4.0.2" +jest-util@^26.1.0, jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + jest-validate@^26.4.2: version "26.4.2" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.4.2.tgz#e871b0dfe97747133014dcf6445ee8018398f39c" @@ -5685,6 +6035,15 @@ jest-worker@^26.3.0: merge-stream "^2.0.0" supports-color "^7.0.0" +jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + jest@26.x, jest@^26.0.0: version "26.4.2" resolved "https://registry.yarnpkg.com/jest/-/jest-26.4.2.tgz#7e8bfb348ec33f5459adeaffc1a25d5752d9d312" @@ -5704,7 +6063,7 @@ js-beautify@^1.6.12: mkdirp "~0.5.1" nopt "~4.0.1" -js-stringify@^1.0.2: +js-stringify@^1.0.1, js-stringify@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= @@ -5803,6 +6162,13 @@ json5@2.x, json5@^2.1.2: dependencies: minimist "^1.2.5" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + json5@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" @@ -6168,6 +6534,15 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" +loader-utils@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -6228,6 +6603,11 @@ lodash._root@~3.0.0: resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + lodash.capitalize@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" @@ -6304,7 +6684,7 @@ lodash.without@~4.4.0: resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.2.1: +lodash@4.x, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.2.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6376,6 +6756,13 @@ macos-release@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" +magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -6722,6 +7109,11 @@ mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +nanoid@^3.1.23: + version "3.1.23" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" + integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -7648,6 +8040,48 @@ postcss-message-helpers@^2.0.0: resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4= +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-modules@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.1.3.tgz#c4c4c41d98d97d24c70e88dacfc97af5a4b3e21d" + integrity sha512-dBT39hrXe4OAVYJe/2ZuIZ9BzYhOe7t+IhedYeQ2OxKwDpAGlkEN/fR0fGnrbx4BvgbMReRX4hCubYK9cE/pJQ== + dependencies: + generic-names "^2.0.1" + icss-replace-symbols "^1.1.0" + lodash.camelcase "^4.3.0" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + string-hash "^1.1.1" + postcss-selector-parser@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" @@ -7656,11 +8090,24 @@ postcss-selector-parser@^6.0.2: indexes-of "^1.0.1" uniq "^1.0.1" +postcss-selector-parser@^6.0.4: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-value-parser@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== +postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + postcss@^6.0.23: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" @@ -7679,6 +8126,15 @@ postcss@^7.0.13, postcss@^7.0.14: source-map "^0.6.1" supports-color "^6.1.0" +postcss@^8.1.10: + version "8.3.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.5.tgz#982216b113412bc20a86289e91eb994952a5b709" + integrity sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.23" + source-map-js "^0.6.2" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -7813,6 +8269,15 @@ psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== +pug-attrs@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.4.tgz#b2f44c439e4eb4ad5d4ef25cac20d18ad28cc336" + integrity sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ== + dependencies: + constantinople "^3.0.1" + js-stringify "^1.0.1" + pug-runtime "^2.0.5" + pug-attrs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" @@ -7822,6 +8287,20 @@ pug-attrs@^3.0.0: js-stringify "^1.0.2" pug-runtime "^3.0.0" +pug-code-gen@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.3.tgz#122eb9ada9b5bf601705fe15aaa0a7d26bc134ab" + integrity sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA== + dependencies: + constantinople "^3.1.2" + doctypes "^1.1.0" + js-stringify "^1.0.1" + pug-attrs "^2.0.4" + pug-error "^1.3.3" + pug-runtime "^2.0.5" + void-elements "^2.0.1" + with "^5.0.0" + pug-code-gen@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz#ad190f4943133bf186b60b80de483100e132e2ce" @@ -7836,11 +8315,29 @@ pug-code-gen@^3.0.2: void-elements "^3.1.0" with "^7.0.0" +pug-error@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.3.tgz#f342fb008752d58034c185de03602dd9ffe15fa6" + integrity sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ== + pug-error@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5" integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ== +pug-filters@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.1.tgz#ab2cc82db9eeccf578bda89130e252a0db026aa7" + integrity sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg== + dependencies: + clean-css "^4.1.11" + constantinople "^3.0.1" + jstransformer "1.0.0" + pug-error "^1.3.3" + pug-walk "^1.1.8" + resolve "^1.1.6" + uglify-js "^2.6.1" + pug-filters@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" @@ -7852,6 +8349,15 @@ pug-filters@^4.0.0: pug-walk "^2.0.0" resolve "^1.15.1" +pug-lexer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.1.0.tgz#531cde48c7c0b1fcbbc2b85485c8665e31489cfd" + integrity sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA== + dependencies: + character-parser "^2.1.1" + is-expression "^3.0.0" + pug-error "^1.3.3" + pug-lexer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" @@ -7861,6 +8367,14 @@ pug-lexer@^5.0.0: is-expression "^4.0.0" pug-error "^2.0.0" +pug-linker@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.6.tgz#f5bf218b0efd65ce6670f7afc51658d0f82989fb" + integrity sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg== + dependencies: + pug-error "^1.3.3" + pug-walk "^1.1.8" + pug-linker@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" @@ -7869,6 +8383,14 @@ pug-linker@^4.0.0: pug-error "^2.0.0" pug-walk "^2.0.0" +pug-load@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.12.tgz#d38c85eb85f6e2f704dea14dcca94144d35d3e7b" + integrity sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg== + dependencies: + object-assign "^4.1.0" + pug-walk "^1.1.8" + pug-load@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" @@ -7877,6 +8399,14 @@ pug-load@^3.0.0: object-assign "^4.1.1" pug-walk "^2.0.0" +pug-parser@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.1.tgz#03e7ada48b6840bd3822f867d7d90f842d0ffdc9" + integrity sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA== + dependencies: + pug-error "^1.3.3" + token-stream "0.0.1" + pug-parser@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" @@ -7885,11 +8415,23 @@ pug-parser@^6.0.0: pug-error "^2.0.0" token-stream "1.0.0" +pug-runtime@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.5.tgz#6da7976c36bf22f68e733c359240d8ae7a32953a" + integrity sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw== + pug-runtime@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== +pug-strip-comments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz#cc1b6de1f6e8f5931cf02ec66cdffd3f50eaf8a8" + integrity sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw== + dependencies: + pug-error "^1.3.3" + pug-strip-comments@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" @@ -7897,11 +8439,30 @@ pug-strip-comments@^2.0.0: dependencies: pug-error "^2.0.0" +pug-walk@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz#b408f67f27912f8c21da2f45b7230c4bd2a5ea7a" + integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA== + pug-walk@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== +pug@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.4.tgz#ee7682ec0a60494b38d48a88f05f3b0ac931377d" + integrity sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw== + dependencies: + pug-code-gen "^2.0.2" + pug-filters "^3.1.1" + pug-lexer "^4.1.0" + pug-linker "^3.0.6" + pug-load "^2.0.12" + pug-parser "^5.0.1" + pug-runtime "^2.0.5" + pug-strip-comments "^1.0.4" + pug@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.1.tgz#9b287554043e6d18852673a382b0350595bdc067" @@ -8376,6 +8937,14 @@ resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" +resolve@^1.1.6, resolve@^1.15.1: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + resolve@^1.10.0, resolve@^1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -8389,14 +8958,6 @@ resolve@^1.12.0, resolve@^1.13.1: dependencies: path-parse "^1.0.6" -resolve@^1.15.1: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - resolve@^1.3.2, resolve@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" @@ -8772,6 +9333,11 @@ sorted-union-stream@~2.1.3: from2 "^1.3.0" stream-iterate "^1.1.0" +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -8823,6 +9389,11 @@ source-map@~0.1.7: dependencies: amdefine ">=0.0.4" +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + spawn-error-forwarder@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz#1afd94738e999b0346d7b9fc373be55e07577029" @@ -8967,6 +9538,11 @@ string-argv@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736" +string-hash@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + string-length@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" @@ -9131,7 +9707,7 @@ strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@^2.0.0, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -9357,6 +9933,11 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +token-stream@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" + integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo= + token-stream@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" @@ -9435,6 +10016,32 @@ ts-jest@^26.3.0: semver "7.x" yargs-parser "18.x" +ts-jest@^26.4.4: + version "26.5.6" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.6.tgz#c32e0746425274e1dfe333f43cd3c800e014ec35" + integrity sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA== + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + jest-util "^26.1.0" + json5 "2.x" + lodash "4.x" + make-error "1.x" + mkdirp "1.x" + semver "7.x" + yargs-parser "20.x" + +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + tslib@^1.10.0, tslib@^1.9.0: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" @@ -9495,7 +10102,12 @@ typescript@^3.2.2: version "3.8.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" -uglify-js@^2.4.19: +typescript@^4.1.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.4.tgz#3f85b986945bcf31071decdd96cf8bfa65f9dcbc" + integrity sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew== + +uglify-js@^2.4.19, uglify-js@^2.6.1: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" dependencies: @@ -9658,7 +10270,7 @@ use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -9718,14 +10330,19 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +void-elements@^2.0.1, void-elements@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + void-elements@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= -void-elements@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" +vue-class-component@^8.0.0-beta.4: + version "8.0.0-rc.1" + resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-8.0.0-rc.1.tgz#db692cd97656eb9a08206c03d0b7398cdb1d9420" + integrity sha512-w1nMzsT/UdbDAXKqhwTmSoyuJzUXKrxLE77PCFVuC6syr8acdFDAq116xgvZh9UCuV0h+rlCtxXolr3Hi3HyPQ== vue-eslint-parser@^5.0.0: version "5.0.0" @@ -9738,6 +10355,11 @@ vue-eslint-parser@^5.0.0: esquery "^1.0.1" lodash "^4.17.11" +vue-property-decorator@^10.0.0-rc.3: + version "10.0.0-rc.3" + resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-10.0.0-rc.3.tgz#bb0cb2c7c31dc41149eb432f2104fb82dc3d95be" + integrity sha512-EGqjf8Lq+kTausZzfLB1ynWOcyay8ZLAc5p2VlKGEX2q+BjYw84oZxr6IcdwuxGIdNmriZqPUX6AlAluBdnbEg== + vue-template-compiler@^2.4.2, vue-template-compiler@^2.5.21: version "2.6.14" resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz#a2f0e7d985670d42c9c9ee0d044fed7690f4f763" @@ -9755,6 +10377,15 @@ vue@^2.4.2, vue@^2.5.21: resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ== +vue@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.1.2.tgz#647f8e3949a3d600771dca25d50225dc3e594c64" + integrity sha512-q/rbKpb7aofax4ugqu2k/uj7BYuNPcd6Z5/qJtfkJQsE0NkwVoCyeSh7IZGH61hChwYn3CEkh4bHolvUPxlQ+w== + dependencies: + "@vue/compiler-dom" "3.1.2" + "@vue/runtime-dom" "3.1.2" + "@vue/shared" "3.1.2" + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -9854,6 +10485,14 @@ windows-release@^3.1.0: dependencies: execa "^1.0.0" +with@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe" + integrity sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4= + dependencies: + acorn "^3.1.0" + acorn-globals "^3.0.0" + with@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" @@ -10011,6 +10650,11 @@ yargs-parser@18.x, yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@20.x: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"