├── .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 |
2 |
3 |
This is an about page
4 |
5 |
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 |
2 |
3 |
{{ msg }}
4 |
5 |
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 |
2 |
3 |
4 | Home |
5 | About
6 |
7 |
8 |
9 |
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 |
2 |
3 |

4 |
5 |
6 |
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 |
150 |
--------------------------------------------------------------------------------