├── .env ├── .prettierignore ├── .env.production ├── .env.development ├── .browserslistrc ├── config ├── config.default.js ├── config.development.js ├── config.analyse-bundle.js └── config.production.js ├── public ├── robots.txt ├── favicon.ico ├── img │ └── icons │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── mstile-150x150.png │ │ ├── apple-touch-icon.png │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── apple-touch-icon-60x60.png │ │ ├── apple-touch-icon-76x76.png │ │ ├── apple-touch-icon-120x120.png │ │ ├── apple-touch-icon-152x152.png │ │ ├── apple-touch-icon-180x180.png │ │ ├── msapplication-icon-144x144.png │ │ ├── android-chrome-maskable-192x192.png │ │ ├── android-chrome-maskable-512x512.png │ │ └── safari-pinned-tab.svg └── index.html ├── .env.staging ├── .prettierrc ├── .stylelintrc.json ├── cypress.json ├── jest.config.js ├── babel.config.js ├── src ├── assets │ └── logo.png ├── views │ ├── About.vue │ └── Home.vue ├── theme │ └── custom-media-definition.css ├── components │ └── HelloWorld.vue ├── store │ └── index.js ├── App.vue ├── main.js ├── router │ └── index.js └── registerServiceWorker.js ├── tests ├── e2e │ ├── .eslintrc.js │ ├── specs │ │ └── test.js │ ├── support │ │ ├── index.js │ │ └── commands.js │ └── plugins │ │ └── index.js └── unit │ └── example.spec.js ├── .gitignore ├── postcss.config.js ├── .vscode └── settings.json ├── vue.config.js ├── .eslintrc.js ├── LICENSE ├── .github └── workflows │ ├── pull-request-workflow.yml │ ├── deploy-prod.yml │ └── deploy-staging.yml └── package.json /.env: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist/ -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | VUE_APP_ENV=production -------------------------------------------------------------------------------- /.env.development: -------------------------------------------------------------------------------- 1 | VUE_APP_ENV=development -------------------------------------------------------------------------------- /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | -------------------------------------------------------------------------------- /config/config.default.js: -------------------------------------------------------------------------------- 1 | module.exports = {} 2 | -------------------------------------------------------------------------------- /config/config.development.js: -------------------------------------------------------------------------------- 1 | module.exports = {} 2 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /.env.staging: -------------------------------------------------------------------------------- 1 | NODE_ENV=production 2 | VUE_APP_ENV=staging -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": false 4 | } 5 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "stylelint-config-standard" 3 | } 4 | -------------------------------------------------------------------------------- /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "pluginsFile": "tests/e2e/plugins/index.js" 3 | } 4 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: '@vue/cli-plugin-unit-jest' 3 | } 4 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@vue/cli-plugin-babel/preset'] 3 | } 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/favicon.ico -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/src/assets/logo.png -------------------------------------------------------------------------------- /src/views/About.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /public/img/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/favicon-16x16.png -------------------------------------------------------------------------------- /public/img/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/favicon-32x32.png -------------------------------------------------------------------------------- /public/img/icons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/mstile-150x150.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/apple-touch-icon.png -------------------------------------------------------------------------------- /public/img/icons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/img/icons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /src/theme/custom-media-definition.css: -------------------------------------------------------------------------------- 1 | @custom-media --mobile screen and (max-width: 1280px); 2 | @custom-media --desktop screen and (min-width: 1281px); 3 | -------------------------------------------------------------------------------- /public/img/icons/msapplication-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/msapplication-icon-144x144.png -------------------------------------------------------------------------------- /public/img/icons/android-chrome-maskable-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/android-chrome-maskable-192x192.png -------------------------------------------------------------------------------- /public/img/icons/android-chrome-maskable-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/vuejs-boilerplate/master/public/img/icons/android-chrome-maskable-512x512.png -------------------------------------------------------------------------------- /tests/e2e/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: ['cypress'], 3 | env: { 4 | mocha: true, 5 | 'cypress/globals': true 6 | }, 7 | rules: { 8 | strict: 'off' 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | 4 | Vue.use(Vuex) 5 | 6 | export default new Vuex.Store({ 7 | state: {}, 8 | mutations: {}, 9 | actions: {}, 10 | modules: {} 11 | }) 12 | -------------------------------------------------------------------------------- /tests/e2e/specs/test.js: -------------------------------------------------------------------------------- 1 | // https://docs.cypress.io/api/introduction/api.html 2 | 3 | describe('My First Test', () => { 4 | it('Visits the app root url', () => { 5 | cy.visit('/') 6 | cy.contains('h1', 'Welcome to Your Vue.js App') 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import './registerServiceWorker' 4 | import router from './router' 5 | import store from './store' 6 | 7 | Vue.config.productionTip = false 8 | 9 | new Vue({ 10 | router, 11 | store, 12 | render: h => h(App) 13 | }).$mount('#app') 14 | -------------------------------------------------------------------------------- /src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | /tests/e2e/videos/ 6 | /tests/e2e/screenshots/ 7 | 8 | # local env files 9 | .env.local 10 | .env.*.local 11 | 12 | # Log files 13 | npm-debug.log* 14 | yarn-debug.log* 15 | yarn-error.log* 16 | 17 | # Editor directories and files 18 | .idea 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line import/no-extraneous-dependencies 2 | const postcssPresetEnv = require('postcss-preset-env') 3 | 4 | module.exports = () => ({ 5 | plugins: [ 6 | postcssPresetEnv({ 7 | stage: 3, 8 | importFrom: './src/theme/custom-media-definition.css', 9 | features: { 'custom-media-queries': true } 10 | }) 11 | ] 12 | }) 13 | -------------------------------------------------------------------------------- /config/config.analyse-bundle.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line import/no-extraneous-dependencies 2 | const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer') 3 | 4 | module.exports = { 5 | configureWebpack: { 6 | plugins: [ 7 | /* Refer to https://www.npmjs.com/package/webpack-bundle-analyzer for more details */ 8 | new BundleAnalyzerPlugin() 9 | ] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tests/unit/example.spec.js: -------------------------------------------------------------------------------- 1 | import { shallowMount } from '@vue/test-utils' 2 | import HelloWorld from '@/components/HelloWorld.vue' 3 | 4 | describe('HelloWorld.vue', () => { 5 | it('renders props.msg when passed', () => { 6 | const msg = 'new message' 7 | const wrapper = shallowMount(HelloWorld, { 8 | propsData: { msg } 9 | }) 10 | expect(wrapper.text()).toMatch(msg) 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "vetur.validation.template": false, 3 | 4 | "editor.codeActionsOnSave": { 5 | "source.fixAll": true 6 | }, 7 | "eslint.options": { "extensions": [".html", ".js", ".vue", ".scss"] }, 8 | "eslint.validate": ["javascript", "vue"], 9 | 10 | "javascript.validate.enable": false, 11 | "javascript.format.enable": false, 12 | 13 | "[scss]": { 14 | "editor.formatOnSave": true 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /config/config.production.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line import/no-extraneous-dependencies 2 | const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer') 3 | 4 | module.exports = { 5 | configureWebpack: { 6 | plugins: [ 7 | /* Refer to https://www.npmjs.com/package/webpack-bundle-analyzer for more details */ 8 | new BundleAnalyzerPlugin({ 9 | analyzerMode: 'disabled', 10 | generateStatsFile: true 11 | }) 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= htmlWebpackPlugin.options.title %> 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueRouter from 'vue-router' 3 | import Home from '../views/Home.vue' 4 | 5 | Vue.use(VueRouter) 6 | 7 | const routes = [ 8 | { 9 | path: '/', 10 | name: 'Home', 11 | component: Home 12 | }, 13 | { 14 | path: '/about', 15 | name: 'About', 16 | // route level code-splitting 17 | // this generates a separate chunk (about.[hash].js) for this route 18 | // which is lazy-loaded when the route is visited. 19 | component: () => 20 | import(/* webpackChunkName: "client-chunk-about" */ '../views/About.vue') 21 | } 22 | ] 23 | 24 | const router = new VueRouter({ 25 | mode: 'history', 26 | base: process.env.BASE_URL, 27 | routes 28 | }) 29 | 30 | export default router 31 | -------------------------------------------------------------------------------- /tests/e2e/support/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands' 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | const merge = require('webpack-merge') 2 | const path = require('path') 3 | const fs = require('fs') 4 | const defaultConfiguration = require('./config/config.default') 5 | 6 | // eslint-disable-next-line no-underscore-dangle 7 | global.__rootDirname = path.join(__dirname, 'dist') 8 | 9 | const environmentConfigurationPath = `./config/config.${process.env.NODE_ENV}.js` 10 | 11 | const environmentConfiguration = fs.existsSync(environmentConfigurationPath) 12 | ? require(environmentConfigurationPath) // eslint-disable-line 13 | : {} 14 | 15 | const config = merge(defaultConfiguration, environmentConfiguration) 16 | 17 | if (process.env.NODE_ENV === 'analyse-bundle') { 18 | process.env.NODE_ENV = 'production' 19 | } 20 | 21 | module.exports = config 22 | -------------------------------------------------------------------------------- /tests/e2e/support/commands.js: -------------------------------------------------------------------------------- 1 | // *********************************************** 2 | // This example commands.js shows you how to 3 | // create various custom commands and overwrite 4 | // existing commands. 5 | // 6 | // For more comprehensive examples of custom 7 | // commands please read more here: 8 | // https://on.cypress.io/custom-commands 9 | // *********************************************** 10 | // 11 | // 12 | // -- This is a parent command -- 13 | // Cypress.Commands.add("login", (email, password) => { ... }) 14 | // 15 | // 16 | // -- This is a child command -- 17 | // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) 18 | // 19 | // 20 | // -- This is a dual command -- 21 | // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) 22 | // 23 | // 24 | // -- This is will overwrite an existing command -- 25 | // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) 26 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | extends: [ 7 | 'airbnb-base', 8 | 'plugin:vue/recommended', 9 | 'plugin:vue/strongly-recommended', 10 | 'plugin:vue/essential', 11 | 'plugin:vue/base', 12 | 'eslint:recommended', 13 | '@vue/prettier' 14 | ], 15 | parserOptions: { 16 | parser: 'babel-eslint' 17 | }, 18 | rules: { 19 | 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 20 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 21 | 'vue/require-default-prop': 'off', 22 | 'import/no-unresolved': 'off', 23 | 'no-param-reassign': 'off', 24 | 'no-return-assign': 'off', 25 | 'no-var': 2, 26 | 'prefer-const': 2 27 | }, 28 | overrides: [ 29 | { 30 | files: [ 31 | '**/__tests__/*.{j,t}s?(x)', 32 | '**/tests/unit/**/*.spec.{j,t}s?(x)' 33 | ], 34 | env: { 35 | jest: true 36 | } 37 | } 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /tests/e2e/plugins/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable arrow-body-style */ 2 | // https://docs.cypress.io/guides/guides/plugins-guide.html 3 | 4 | // if you need a custom webpack configuration you can uncomment the following import 5 | // and then use the `file:preprocessor` event 6 | // as explained in the cypress docs 7 | // https://docs.cypress.io/api/plugins/preprocessors-api.html#Examples 8 | 9 | // /* eslint-disable import/no-extraneous-dependencies, global-require */ 10 | // const webpack = require('@cypress/webpack-preprocessor') 11 | 12 | module.exports = (on, config) => { 13 | // on('file:preprocessor', webpack({ 14 | // webpackOptions: require('@vue/cli-service/webpack.config'), 15 | // watchOptions: {} 16 | // })) 17 | 18 | return { 19 | ...config, 20 | fixturesFolder: 'tests/e2e/fixtures', 21 | integrationFolder: 'tests/e2e/specs', 22 | screenshotsFolder: 'tests/e2e/screenshots', 23 | videosFolder: 'tests/e2e/videos', 24 | supportFile: 'tests/e2e/support/index.js' 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/registerServiceWorker.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | import { register } from 'register-service-worker' 3 | 4 | if (process.env.NODE_ENV === 'production') { 5 | register(`${process.env.BASE_URL}service-worker.js`, { 6 | ready() { 7 | console.log( 8 | 'App is being served from cache by a service worker.\n' + 9 | 'For more details, visit https://goo.gl/AFskqB' 10 | ) 11 | }, 12 | registered() { 13 | console.log('Service worker has been registered.') 14 | }, 15 | cached() { 16 | console.log('Content has been cached for offline use.') 17 | }, 18 | updatefound() { 19 | console.log('New content is downloading.') 20 | }, 21 | updated() { 22 | console.log('New content is available; please refresh.') 23 | }, 24 | offline() { 25 | console.log( 26 | 'No internet connection found. App is running in offline mode.' 27 | ) 28 | }, 29 | error(error) { 30 | console.error('Error during service worker registration:', error) 31 | } 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Franck Abgrall 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/pull-request-workflow.yml: -------------------------------------------------------------------------------- 1 | name: Pull request workflow 2 | 3 | on: 4 | pull_request: 5 | 6 | jobs: 7 | pr: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v1 11 | - uses: actions/setup-node@v1 12 | with: 13 | node-version: 12 14 | - name: Get yarn cache directory path 15 | id: yarn-cache-dir-path 16 | run: echo "::set-output name=dir::$(yarn cache dir)" 17 | - name: Get yarn cache directory path 18 | id: current-branch 19 | run: echo "::set-output name=branch-name::$(echo ${GITHUB_REF##*/})" 20 | - uses: actions/cache@v1 21 | with: 22 | path: ${{ steps.yarn-cache-dir-path.outputs.dir }} 23 | key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock') }} 24 | restore-keys: | 25 | ${{ runner.os }}-node-modules- 26 | ${{ runner.os }}- 27 | - name: Install dependencies 28 | run: yarn 29 | - name: Check prettier 30 | run: yarn prettier:check 31 | - name: Check linter 32 | run: yarn lint:check 33 | - name: Check style linter 34 | run: yarn stylelint:check 35 | - name: Run unit tests 36 | run: yarn test:unit 37 | - name: Run e2e tests 38 | run: yarn test:e2e:headless 39 | - name: Build 40 | run: yarn build 41 | - name: Bundlesize check 42 | run: yarn bundlesize -------------------------------------------------------------------------------- /.github/workflows/deploy-prod.yml: -------------------------------------------------------------------------------- 1 | name: Deploy prod workflow 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | deploy-prod: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v1 13 | - uses: actions/setup-node@v1 14 | with: 15 | node-version: 12 16 | - name: Get yarn cache directory path 17 | id: yarn-cache-dir-path 18 | run: echo "::set-output name=dir::$(yarn cache dir)" 19 | - name: Get yarn cache directory path 20 | id: current-branch 21 | run: echo "::set-output name=branch-name::$(echo ${GITHUB_REF##*/})" 22 | - uses: actions/cache@v1 23 | with: 24 | path: ${{ steps.yarn-cache-dir-path.outputs.dir }} 25 | key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock') }} 26 | restore-keys: | 27 | ${{ runner.os }}-node-modules- 28 | ${{ runner.os }}- 29 | - name: Install dependencies 30 | run: yarn 31 | - name: Check prettier 32 | run: yarn prettier:check 33 | - name: Check linter 34 | run: yarn lint:check 35 | - name: Check style linter 36 | run: yarn stylelint:check 37 | - name: Run unit tests 38 | run: yarn test:unit 39 | - name: Run e2e tests 40 | run: yarn test:e2e:headless 41 | - name: Build prod 42 | run: yarn build:prod 43 | - name: Bundlesize check 44 | run: yarn bundlesize 45 | - name: Deploy prod 46 | run: | 47 | echo "Deploy prod" 48 | -------------------------------------------------------------------------------- /.github/workflows/deploy-staging.yml: -------------------------------------------------------------------------------- 1 | name: Deploy staging workflow 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'release/**' 7 | 8 | jobs: 9 | deploy-staging: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v1 13 | - uses: actions/setup-node@v1 14 | with: 15 | node-version: 12 16 | - name: Get yarn cache directory path 17 | id: yarn-cache-dir-path 18 | run: echo "::set-output name=dir::$(yarn cache dir)" 19 | - name: Get yarn cache directory path 20 | id: current-branch 21 | run: echo "::set-output name=branch-name::$(echo ${GITHUB_REF##*/})" 22 | - uses: actions/cache@v1 23 | with: 24 | path: ${{ steps.yarn-cache-dir-path.outputs.dir }} 25 | key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock') }} 26 | restore-keys: | 27 | ${{ runner.os }}-node-modules- 28 | ${{ runner.os }}- 29 | - name: Install dependencies 30 | run: yarn 31 | - name: Check prettier 32 | run: yarn prettier:check 33 | - name: Check linter 34 | run: yarn lint:check 35 | - name: Check style linter 36 | run: yarn stylelint:check 37 | - name: Run unit tests 38 | run: yarn test:unit 39 | - name: Run e2e tests 40 | run: yarn test:e2e:headless 41 | - name: Build staging 42 | run: yarn build:staging 43 | - name: Bundlesize check 44 | run: yarn bundlesize 45 | - name: Deploy staging 46 | run: | 47 | echo "Deploy staging" 48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vuejs-boilerplate", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "build:staging": "vue-cli-service build --mode staging", 9 | "build:prod": "vue-cli-service build --mode production", 10 | "test:unit": "vue-cli-service test:unit", 11 | "test:e2e": "vue-cli-service test:e2e", 12 | "test:e2e:headless": "vue-cli-service test:e2e --headless", 13 | "lint:check": "vue-cli-service lint --no-fix", 14 | "lint:fix": "vue-cli-service lint", 15 | "prettier": "prettier \"**/*.{vue,scss,sass,css,js,json}\"", 16 | "prettier:check": "yarn prettier -- --check", 17 | "prettier:fix": "yarn prettier -- --write", 18 | "stylelint:check": "stylelint \"**/*.{vue,scss,sass,css}\"", 19 | "analyse:bundle": "NODE_ENV=analyse-bundle vue-cli-service build", 20 | "bundlesize": "bundlesize" 21 | }, 22 | "dependencies": { 23 | "core-js": "^3.6.4", 24 | "register-service-worker": "^1.6.2", 25 | "vue": "^2.6.11", 26 | "vue-router": "^3.1.5", 27 | "vuex": "^3.1.2" 28 | }, 29 | "devDependencies": { 30 | "@vue/cli-plugin-babel": "~4.2.0", 31 | "@vue/cli-plugin-e2e-cypress": "~4.2.0", 32 | "@vue/cli-plugin-eslint": "~4.2.0", 33 | "@vue/cli-plugin-pwa": "~4.2.0", 34 | "@vue/cli-plugin-router": "~4.2.0", 35 | "@vue/cli-plugin-unit-jest": "~4.2.0", 36 | "@vue/cli-plugin-vuex": "~4.2.0", 37 | "@vue/cli-service": "~4.2.0", 38 | "@vue/eslint-config-prettier": "^6.0.0", 39 | "@vue/test-utils": "1.0.0-beta.31", 40 | "babel-eslint": "^10.0.3", 41 | "eslint": "^6.7.2", 42 | "eslint-config-airbnb-base": "^14.0.0", 43 | "eslint-plugin-import": "^2.20.1", 44 | "eslint-plugin-prettier": "^3.1.1", 45 | "eslint-plugin-vue": "^6.1.2", 46 | "postcss-cssnext": "^3.1.0", 47 | "postcss-preset-env": "^6.7.0", 48 | "prettier": "^1.19.1", 49 | "stylelint": "^13.2.0", 50 | "stylelint-config-standard": "^20.0.0", 51 | "vue-template-compiler": "^2.6.11", 52 | "webpack-bundle-analyzer": "^3.6.0", 53 | "webpack-merge": "^4.2.2", 54 | "bundlesize": "github:kefranabg/bundlesize" 55 | }, 56 | "engines": { 57 | "npm": ">=5.5.0", 58 | "node": ">=12.1.0" 59 | }, 60 | "bundlesize": [ 61 | { 62 | "path": "./dist/js/chunk-vendors*.js", 63 | "maxSize": "50 kB" 64 | }, 65 | { 66 | "path": "./dist/js/app*.js", 67 | "maxSize": "10 kB" 68 | }, 69 | { 70 | "path": "./dist/js/client-chunk-*.js", 71 | "maxSize": "5 kB" 72 | } 73 | ] 74 | } 75 | -------------------------------------------------------------------------------- /public/img/icons/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 148 | 149 | 150 | --------------------------------------------------------------------------------