@nitra/vite-boot 3.6.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/apollo.js +6 -2
- package/src/login.js +3 -3
- package/src/router.js +13 -1
- package/src/sentry.js +3 -0
- package/src/token.js +8 -6
- package/src/user.js +12 -0
package/package.json
CHANGED
package/src/apollo.js
CHANGED
|
@@ -5,6 +5,10 @@ import { GraphQLWsLink } from '@apollo/client/link/subscriptions'
|
|
|
5
5
|
import { checkToken, refreshToken, getToken } from './token.js'
|
|
6
6
|
import { user } from './user.js'
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @param options
|
|
11
|
+
*/
|
|
8
12
|
function createRestartableClient(options) {
|
|
9
13
|
let restartRequested = false
|
|
10
14
|
let restart = () => {
|
|
@@ -73,7 +77,7 @@ const wsLink = new GraphQLWsLink(wsClient)
|
|
|
73
77
|
const errorLink = onError(({ graphQLErrors, networkError }) => {
|
|
74
78
|
if (graphQLErrors) {
|
|
75
79
|
for (const err of graphQLErrors) {
|
|
76
|
-
console.error('graphQLErrors:
|
|
80
|
+
console.error('graphQLErrors:', err)
|
|
77
81
|
}
|
|
78
82
|
}
|
|
79
83
|
|
|
@@ -90,7 +94,7 @@ const errorLink = onError(({ graphQLErrors, networkError }) => {
|
|
|
90
94
|
// // Роль не підходить хашурі
|
|
91
95
|
// router.push('/logout')
|
|
92
96
|
} else {
|
|
93
|
-
console.log(`[Network error]
|
|
97
|
+
console.log(`[Network error]:`, networkError?.message, networkError)
|
|
94
98
|
}
|
|
95
99
|
}
|
|
96
100
|
})
|
package/src/login.js
CHANGED
|
@@ -23,9 +23,9 @@ export async function autoLogin() {
|
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* Вхід або на попередню або на кореневу сторінку
|
|
26
|
-
*
|
|
27
|
-
* @param {
|
|
28
|
-
* @param
|
|
26
|
+
* @param {object} decoded
|
|
27
|
+
* @param {string} raw? - необов'язково, але потрібно якщо використовується localStorage
|
|
28
|
+
* @param raw
|
|
29
29
|
*/
|
|
30
30
|
export async function defaultLogin(decoded, raw) {
|
|
31
31
|
// Якщо задано що токен з localStorage
|
package/src/router.js
CHANGED
|
@@ -3,10 +3,18 @@ import { user, setUser } from './user.js'
|
|
|
3
3
|
|
|
4
4
|
export let router
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @param r
|
|
9
|
+
*/
|
|
6
10
|
export function setRouter(r) {
|
|
7
11
|
router = r
|
|
8
12
|
}
|
|
9
13
|
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
* @param to
|
|
17
|
+
*/
|
|
10
18
|
export function canUserAccess(to) {
|
|
11
19
|
// Якщо сторінка без обмеження по ролям то дозволяємо завжди
|
|
12
20
|
if (to.meta?.layout === 404 || to.meta?.layout === 'blank') {
|
|
@@ -36,13 +44,17 @@ export function canUserAccess(to) {
|
|
|
36
44
|
}
|
|
37
45
|
|
|
38
46
|
// Якщо вказано - чи входить в дозволені користувачу
|
|
39
|
-
if (to.meta?.roles.
|
|
47
|
+
if (to.meta?.roles.includes(user.role)) {
|
|
40
48
|
return true
|
|
41
49
|
}
|
|
42
50
|
|
|
43
51
|
return false
|
|
44
52
|
}
|
|
45
53
|
|
|
54
|
+
/**
|
|
55
|
+
*
|
|
56
|
+
* @param to
|
|
57
|
+
*/
|
|
46
58
|
export function canUserAccessMetaRoles(to) {
|
|
47
59
|
// Якщо сторінка без обмеження по ролям то дозволяємо завжди
|
|
48
60
|
if (to.meta?.layout === 404 || to.meta?.layout === 'blank' || !to.meta?.roles) {
|
package/src/sentry.js
CHANGED
|
@@ -4,6 +4,8 @@ import { router } from './router.js'
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Ініціалізація Sentry
|
|
7
|
+
* @param app
|
|
8
|
+
* @param tracing
|
|
7
9
|
*/
|
|
8
10
|
export const bootSentry = (app, tracing = 0) => {
|
|
9
11
|
if (!import.meta.env.VITE_SENTRY) {
|
|
@@ -14,6 +16,7 @@ export const bootSentry = (app, tracing = 0) => {
|
|
|
14
16
|
app,
|
|
15
17
|
dsn: import.meta.env.VITE_SENTRY,
|
|
16
18
|
ignoreErrors: [
|
|
19
|
+
'connection_error',
|
|
17
20
|
'Socket closed',
|
|
18
21
|
'ResizeObserver loop limit exceeded',
|
|
19
22
|
'Apollo client with id default not found',
|
package/src/token.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import jwtDecode from '@nitra/jwt-decode'
|
|
2
|
-
import {
|
|
2
|
+
import { apolloClient, wsClient } from './apollo.js'
|
|
3
3
|
import { defaultLogin } from './login.js'
|
|
4
|
-
import {
|
|
4
|
+
import { setUser, unsetUser } from './user.js'
|
|
5
5
|
|
|
6
6
|
// @ts-ignore
|
|
7
7
|
const allowedRoles = import.meta.env.VITE_HASURA_ROLE.split(',')
|
|
@@ -9,7 +9,6 @@ const allowedRoles = import.meta.env.VITE_HASURA_ROLE.split(',')
|
|
|
9
9
|
/**
|
|
10
10
|
* Запам'ятовуємо поточну сторінку
|
|
11
11
|
* та перенаправляємо на сторінку входу
|
|
12
|
-
*
|
|
13
12
|
* @param {string} token - JWT токен
|
|
14
13
|
* @returns {{result: string, decoded?: {}}} - Повертає результат перевірки токена
|
|
15
14
|
*/
|
|
@@ -21,7 +20,7 @@ export function checkToken(token) {
|
|
|
21
20
|
return { result: 'cleaned' }
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
if (!decoded['https://hasura.io/jwt/claims']['x-hasura-allowed-roles'].some(x => allowedRoles.
|
|
23
|
+
if (!decoded['https://hasura.io/jwt/claims']['x-hasura-allowed-roles'].some(x => allowedRoles.includes(x))) {
|
|
25
24
|
// Виходимо
|
|
26
25
|
return { result: 'broken-role' }
|
|
27
26
|
}
|
|
@@ -40,7 +39,7 @@ export function checkToken(token) {
|
|
|
40
39
|
*/
|
|
41
40
|
export function getToken() {
|
|
42
41
|
// інакше з кукі
|
|
43
|
-
const cookieObj = new URLSearchParams(document.cookie.replaceAll('; ', '&'))
|
|
42
|
+
const cookieObj = new URLSearchParams(document.cookie.replaceAll('; ', '&'))
|
|
44
43
|
const token = cookieObj.get('__session')
|
|
45
44
|
if (token) {
|
|
46
45
|
return token
|
|
@@ -60,9 +59,12 @@ export function cleanToken() {
|
|
|
60
59
|
localStorage.removeItem('__session')
|
|
61
60
|
|
|
62
61
|
// @ts-ignore
|
|
63
|
-
document.cookie = `__session=; Max-Age=0; path=/; domain=${import.meta.env.VITE_DOMAIN}` // eslint-disable-line
|
|
62
|
+
document.cookie = `__session=; Max-Age=0; path=/; domain=${import.meta.env.VITE_DOMAIN}` // eslint-disable-line unicorn/no-document-cookie
|
|
64
63
|
}
|
|
65
64
|
|
|
65
|
+
/**
|
|
66
|
+
*
|
|
67
|
+
*/
|
|
66
68
|
export async function refreshToken() {
|
|
67
69
|
try {
|
|
68
70
|
const token = getToken()
|
package/src/user.js
CHANGED
|
@@ -2,10 +2,17 @@ const allowedRoles = import.meta.env.VITE_HASURA_ROLE.split(',')
|
|
|
2
2
|
|
|
3
3
|
export let user = {}
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
5
8
|
export function unsetUser() {
|
|
6
9
|
user = {}
|
|
7
10
|
}
|
|
8
11
|
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* @param u
|
|
15
|
+
*/
|
|
9
16
|
export function setUser(u) {
|
|
10
17
|
user = u
|
|
11
18
|
|
|
@@ -15,6 +22,11 @@ export function setUser(u) {
|
|
|
15
22
|
user.role = intersect[0]
|
|
16
23
|
}
|
|
17
24
|
|
|
25
|
+
/**
|
|
26
|
+
*
|
|
27
|
+
* @param a
|
|
28
|
+
* @param b
|
|
29
|
+
*/
|
|
18
30
|
function intersection(a, b) {
|
|
19
31
|
const setA = new Set(a)
|
|
20
32
|
return b.filter(value => setA.has(value))
|