diff --git a/nuxt.config.js b/nuxt.config.js index 35e23f3..98c145e 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -19,7 +19,11 @@ export default { css: ["@/assets/styles/layout.css", "animate.css/animate.min.css", "@/assets/styles/colors.css"], plugins: ["@/plugins/particles"], components: true, - buildModules: ['@nuxtjs/eslint-module', '@nuxtjs/vuetify'], + buildModules: [ + '@nuxtjs/eslint-module', + '@nuxtjs/vuetify', + ['@pinia/nuxt', { disableVuex: false}] + ], modules: ['@nuxtjs/axios', '@nuxtjs/pwa', ['nuxt-highcharts', {}]], axios: { baseURL: '/', headers: { common: { Accept: 'application/json' }}}, pwa: { manifest: { lang: 'en' }}, @@ -29,11 +33,19 @@ export default { router: { middleware: 'auth' }, build: { extend(config) { - config.module.rules.push({ - test: /\.ya?ml$/, - type: 'json', - use: 'yaml-loader' - }) + const rules = [ + { + test: /\.mjs$/, + include: /node_modules/, + type: "javascript/auto" + }, + { + test: /\.ya?ml$/, + type: 'json', + use: 'yaml-loader' + } + ] + config.module.rules.push(...rules) } } } diff --git a/package-lock.json b/package-lock.json index adcc35f..f3a055f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "@nuxtjs/eslint-config": "^8.0.0", "@nuxtjs/eslint-module": "^3.0.2", "@nuxtjs/vuetify": "^1.12.3", + "@pinia/nuxt": "0.2.1", "@vue/cli-plugin-babel": "5.0.8", "@vue/test-utils": "^1.3.0", "babel-core": "7.0.0-bridge.0", @@ -3720,6 +3721,21 @@ "stack-trace": "0.0.10" } }, + "node_modules/@pinia/nuxt": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@pinia/nuxt/-/nuxt-0.2.1.tgz", + "integrity": "sha512-XPsuClG2ag/zSdSDqU8FRkTxwWKVZTYD6TVTzjMon3l9QZKC9YvW+jdZWasQilLCnU+jWpmhx41YpfIoPSwMbg==", + "dev": true, + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "pinia": ">=2.0.16" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.21", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", @@ -7135,6 +7151,13 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "dev": true, + "peer": true + }, "node_modules/@vue/shared": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.38.tgz", @@ -8626,7 +8649,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "devOptional": true, + "dev": true, "dependencies": { "file-uri-to-path": "1.0.0" } @@ -12939,7 +12962,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "devOptional": true + "dev": true }, "node_modules/fill-range": { "version": "7.0.1", @@ -17986,12 +18009,6 @@ "thenify-all": "^1.0.0" } }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "optional": true - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -19147,6 +19164,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pinia": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.2.4.tgz", + "integrity": "sha512-K7ZhpMY9iJ9ShTC0cR2+PnxdQRuwVIsXDO/WIEV/RnMC/vmSoKDTKW/exNQYPI+4ij10UjXqdNiEHwn47McANQ==", + "dev": true, + "peer": true, + "dependencies": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -24168,6 +24212,32 @@ "resolved": "https://registry.npmjs.org/vue-client-only/-/vue-client-only-2.1.0.tgz", "integrity": "sha512-vKl1skEKn8EK9f8P2ZzhRnuaRHLHrlt1sbRmazlvsx6EiC3A8oWF8YCBrMJzoN+W3OnElwIGbVjsx6/xelY1AA==" }, + "node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/vue-eslint-parser": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", diff --git a/package.json b/package.json index 7b23a40..eae16e1 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "@nuxtjs/eslint-config": "^8.0.0", "@nuxtjs/eslint-module": "^3.0.2", "@nuxtjs/vuetify": "^1.12.3", + "@pinia/nuxt": "0.2.1", "@vue/cli-plugin-babel": "5.0.8", "@vue/test-utils": "^1.3.0", "babel-core": "7.0.0-bridge.0", @@ -47,9 +48,9 @@ "eslint-plugin-vue": "^8.2.0", "jest": "^27.4.4", "jest-transform-yaml": "^1.1.2", + "sinon": "^18.0.0", "vue-jest": "^3.0.4", - "webpack-cli": "^4.10.0", - "sinon": "^18.0.0" + "webpack-cli": "^4.10.0" }, "browserslist": [ "> 0.25%", diff --git a/src/stores/app.js b/src/stores/app.js new file mode 100644 index 0000000..7200834 --- /dev/null +++ b/src/stores/app.js @@ -0,0 +1,39 @@ +import { defineStore } from 'pinia'; +import RESTClient from "../lib/RESTClient"; + +const restClient = new RESTClient(); + +export const useAppStore = defineStore('app', { + state: () => ({ + booted: false, + }), + getters: { + getToken: () => { + const user = JSON.parse(localStorage.getItem("user")); + return user ? user.token : null + } + }, + actions: { + async bootApp (state) { + const token = this.getToken() + if (!state.booted && token) { + try { await restClient.test_token(token) } + catch (error) { + this.commit('user/logout') + localStorage.removeItem("user") + } + finally { + this.setBooted(true); + } + } + else { + this.setBooted(true); + } + }, + setBooted(state, value) { + state.booted = value; + } + } +}) + +