web-mojo 2.1.153 → 2.1.155

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.
Files changed (68) hide show
  1. package/dist/admin.cjs.js +1 -1
  2. package/dist/admin.es.js +11 -11
  3. package/dist/auth.cjs.js +1 -1
  4. package/dist/auth.cjs.js.map +1 -1
  5. package/dist/auth.es.js +4 -4
  6. package/dist/auth.es.js.map +1 -1
  7. package/dist/charts.cjs.js +1 -1
  8. package/dist/charts.es.js +2 -2
  9. package/dist/chunks/{ContextMenu-DC6cvOTG.js → ContextMenu-BYqSqDnS.js} +2 -2
  10. package/dist/chunks/{ContextMenu-DC6cvOTG.js.map → ContextMenu-BYqSqDnS.js.map} +1 -1
  11. package/dist/chunks/{ContextMenu-DjJQN4sg.js → ContextMenu-CTiHhcC3.js} +2 -2
  12. package/dist/chunks/{ContextMenu-DjJQN4sg.js.map → ContextMenu-CTiHhcC3.js.map} +1 -1
  13. package/dist/chunks/{DataView-Dxv-vfX1.js → DataView-BPogz9nU.js} +2 -2
  14. package/dist/chunks/{DataView-Dxv-vfX1.js.map → DataView-BPogz9nU.js.map} +1 -1
  15. package/dist/chunks/{DataView-gWlnWjl9.js → DataView-_LXFoKxJ.js} +2 -2
  16. package/dist/chunks/{DataView-gWlnWjl9.js.map → DataView-_LXFoKxJ.js.map} +1 -1
  17. package/dist/chunks/{Dialog-D5es1Gad.js → Dialog-BIw4iz3W.js} +5 -5
  18. package/dist/chunks/{Dialog-D5es1Gad.js.map → Dialog-BIw4iz3W.js.map} +1 -1
  19. package/dist/chunks/{Dialog-CWVh4SHk.js → Dialog-BuQrTQ7_.js} +2 -2
  20. package/dist/chunks/{Dialog-CWVh4SHk.js.map → Dialog-BuQrTQ7_.js.map} +1 -1
  21. package/dist/chunks/{FilePreviewView-Dm857m5D.js → FilePreviewView-BYGLS-TT.js} +2 -2
  22. package/dist/chunks/{FilePreviewView-Dm857m5D.js.map → FilePreviewView-BYGLS-TT.js.map} +1 -1
  23. package/dist/chunks/{FilePreviewView-vZQ_R6L4.js → FilePreviewView-_FlzNVa5.js} +6 -6
  24. package/dist/chunks/{FilePreviewView-vZQ_R6L4.js.map → FilePreviewView-_FlzNVa5.js.map} +1 -1
  25. package/dist/chunks/{FormView-CXZOZA1L.js → FormView-B4u2x5sM.js} +2 -2
  26. package/dist/chunks/{FormView-CXZOZA1L.js.map → FormView-B4u2x5sM.js.map} +1 -1
  27. package/dist/chunks/{FormView-CV-j8reS.js → FormView-Bt15WWg9.js} +2 -2
  28. package/dist/chunks/{FormView-CV-j8reS.js.map → FormView-Bt15WWg9.js.map} +1 -1
  29. package/dist/chunks/{MetricsChart-QTPS6P4O.js → MetricsChart-BARLGpgM.js} +3 -3
  30. package/dist/chunks/{MetricsChart-QTPS6P4O.js.map → MetricsChart-BARLGpgM.js.map} +1 -1
  31. package/dist/chunks/{MetricsChart-CajyIntt.js → MetricsChart-Cb36lXZd.js} +2 -2
  32. package/dist/chunks/{MetricsChart-CajyIntt.js.map → MetricsChart-Cb36lXZd.js.map} +1 -1
  33. package/dist/chunks/{PDFViewer-Bkd4YKs1.js → PDFViewer-CaEB4guO.js} +2 -2
  34. package/dist/chunks/{PDFViewer-Bkd4YKs1.js.map → PDFViewer-CaEB4guO.js.map} +1 -1
  35. package/dist/chunks/{PDFViewer-DgLZTg1_.js → PDFViewer-DI-D8m_2.js} +3 -3
  36. package/dist/chunks/{PDFViewer-DgLZTg1_.js.map → PDFViewer-DI-D8m_2.js.map} +1 -1
  37. package/dist/chunks/{Page-CdPnQkJX.js → Page-BIFnANh8.js} +2 -2
  38. package/dist/chunks/{Page-CdPnQkJX.js.map → Page-BIFnANh8.js.map} +1 -1
  39. package/dist/chunks/{Page-vB6LUmsh.js → Page-z4XrwNu8.js} +2 -2
  40. package/dist/chunks/{Page-vB6LUmsh.js.map → Page-z4XrwNu8.js.map} +1 -1
  41. package/dist/chunks/{TokenManager-BXNva8Jk.js → TokenManager-5HHjYzTo.js} +103 -23
  42. package/dist/chunks/TokenManager-5HHjYzTo.js.map +1 -0
  43. package/dist/chunks/TokenManager-gp1JKXNd.js +2 -0
  44. package/dist/chunks/TokenManager-gp1JKXNd.js.map +1 -0
  45. package/dist/chunks/{TopNav-BvPqMucG.js → TopNav-BBQq3REa.js} +2 -2
  46. package/dist/chunks/{TopNav-BvPqMucG.js.map → TopNav-BBQq3REa.js.map} +1 -1
  47. package/dist/chunks/{TopNav-CT8MFVGL.js → TopNav-Jc0GCn3h.js} +2 -2
  48. package/dist/chunks/{TopNav-CT8MFVGL.js.map → TopNav-Jc0GCn3h.js.map} +1 -1
  49. package/dist/chunks/{User-DBBWSDuL.js → User-Bue4ln6z.js} +2 -2
  50. package/dist/chunks/{User-DBBWSDuL.js.map → User-Bue4ln6z.js.map} +1 -1
  51. package/dist/chunks/{User-E_SqtRtc.js → User-CsfPb7v8.js} +2 -2
  52. package/dist/chunks/{User-E_SqtRtc.js.map → User-CsfPb7v8.js.map} +1 -1
  53. package/dist/chunks/{WebApp-DgjEViGQ.js → WebApp-B4BbKCzq.js} +60 -12
  54. package/dist/chunks/{WebApp-DgjEViGQ.js.map → WebApp-B4BbKCzq.js.map} +1 -1
  55. package/dist/chunks/{WebApp-CIU7Jj60.js → WebApp-BV-wlnrW.js} +2 -2
  56. package/dist/chunks/{WebApp-CIU7Jj60.js.map → WebApp-BV-wlnrW.js.map} +1 -1
  57. package/dist/docit.cjs.js +1 -1
  58. package/dist/docit.es.js +7 -7
  59. package/dist/index.cjs.js +1 -1
  60. package/dist/index.cjs.js.map +1 -1
  61. package/dist/index.es.js +26 -19
  62. package/dist/index.es.js.map +1 -1
  63. package/dist/lightbox.cjs.js +1 -1
  64. package/dist/lightbox.es.js +4 -4
  65. package/package.json +1 -1
  66. package/dist/chunks/TokenManager-BXNva8Jk.js.map +0 -1
  67. package/dist/chunks/TokenManager-Bzn4guFm.js +0 -2
  68. package/dist/chunks/TokenManager-Bzn4guFm.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"TokenManager-Bzn4guFm.js","sources":["../../src/core/services/TokenManager.js"],"sourcesContent":["/**\n * Token - Individual JWT token handling\n * Handles decoding, validation, and data extraction for a single token\n */\nclass Token {\n constructor(token) {\n this.token = token;\n this.payload = null;\n this.uid = null;\n this.email = null;\n this.name = null;\n this.exp = null;\n this.iat = null;\n this.isValidToken = false;\n\n this._decode();\n }\n\n /**\n * Decode JWT token payload (client-side only, no verification)\n * @private\n */\n _decode() {\n if (!this.token || typeof this.token !== 'string') {\n return;\n }\n\n try {\n const parts = this.token.split('.');\n if (parts.length !== 3) {\n return;\n }\n\n // Decode the payload (second part)\n const payload = parts[1];\n\n // Handle URL-safe base64\n let base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padding = 4 - (base64.length % 4);\n if (padding !== 4) {\n base64 += '='.repeat(padding);\n }\n\n const decoded = atob(base64);\n this.payload = JSON.parse(decoded);\n\n // Extract common properties\n this.uid = this.payload.uid || this.payload.sub || this.payload.user_id || null;\n this.email = this.payload.email || null;\n this.name = this.payload.name || this.payload.username || null;\n this.exp = this.payload.exp ? new Date(this.payload.exp * 1000) : null;\n this.iat = this.payload.iat ? new Date(this.payload.iat * 1000) : null;\n\n // Determine validity\n this.isValidToken = this._checkValidity();\n } catch (error) {\n console.error('Failed to decode JWT:', error);\n this.payload = null;\n }\n }\n\n /**\n * Check token validity\n * @private\n * @returns {boolean} True if token is valid\n */\n _checkValidity() {\n if (!this.token || !this.payload) {\n return false;\n }\n\n // Check expiry if present\n if (this.payload.exp) {\n const now = Math.floor(Date.now() / 1000);\n return now < this.payload.exp;\n }\n\n // If no expiry, consider valid\n return true;\n }\n\n /**\n * Decode JWT token payload (client-side only, no verification)\n * @returns {object|null} Decoded payload or null if invalid\n */\n decode() {\n return this.payload;\n }\n\n /**\n * Get user ID from token\n * @returns {string|null} User ID or null if not found\n */\n getUserId() {\n return this.uid;\n }\n\n /**\n * Check if token is valid (exists and not expired)\n * @returns {boolean} True if token is valid\n */\n isValid() {\n return this.isValidToken;\n }\n\n /**\n * Check if token will expire soon\n * @param {number} thresholdMinutes - Minutes before expiry to consider \"soon\"\n * @returns {boolean} True if expiring soon\n */\n isExpiringSoon(thresholdMinutes = 5) {\n if (!this.payload?.exp) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n const threshold = thresholdMinutes * 60;\n return (this.payload.exp - now) <= threshold;\n }\n\n /**\n * Check if token is expired\n * @returns {boolean} True if expired\n */\n isExpired() {\n if (!this.payload?.exp) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n return now >= this.payload.exp;\n }\n\n /**\n * Get token age in minutes\n * @returns {number|null} Age in minutes since token was issued, or null if no iat\n */\n getAgeMinutes() {\n if (!this.payload?.iat) {\n return null;\n }\n const now = Math.floor(Date.now() / 1000);\n const ageSeconds = now - this.payload.iat;\n return Math.floor(ageSeconds / 60);\n }\n\n /**\n * Get authorization header value\n * @returns {string|null} Bearer token string or null if no token\n */\n getAuthHeader() {\n return this.token ? `Bearer ${this.token}` : null;\n }\n\n /**\n * Get basic user info from token\n * @returns {object|null} User info or null\n */\n getUserInfo() {\n if (!this.payload) {\n return null;\n }\n\n return {\n uid: this.uid,\n email: this.email,\n name: this.name,\n exp: this.exp,\n iat: this.iat\n };\n }\n}\n\n/**\n * TokenManager - Simplified JWT token handling for MOJO Auth\n * Focuses on core token operations: storage, validation, and user ID extraction\n */\n\nexport default class TokenManager {\n constructor() {\n this.tokenKey = 'mojo_auth_token';\n this.refreshTokenKey = 'mojo_auth_refresh_token';\n this.tokenInstance = null;\n }\n\n /**\n * Store authentication tokens\n * @param {string} token - Access token\n * @param {string} refreshToken - Refresh token (optional)\n * @param {boolean} persistent - Use localStorage if true, sessionStorage if false\n */\n setTokens(token, refreshToken = null, persistent = true) {\n const storage = persistent ? localStorage : sessionStorage;\n this.tokenInstance = new Token(token);\n if (token) {\n storage.setItem(this.tokenKey, token);\n }\n\n if (refreshToken) {\n storage.setItem(this.refreshTokenKey, refreshToken);\n }\n }\n\n /**\n * Get stored access token\n * @returns {string|null} Access token or null if not found\n */\n getToken() {\n return localStorage.getItem(this.tokenKey) ||\n sessionStorage.getItem(this.tokenKey);\n }\n\n /**\n * Get stored refresh token\n * @returns {string|null} Refresh token or null if not found\n */\n getRefreshToken() {\n return localStorage.getItem(this.refreshTokenKey) ||\n sessionStorage.getItem(this.refreshTokenKey);\n }\n\n /**\n * Clear all stored tokens\n */\n clearTokens() {\n localStorage.removeItem(this.tokenKey);\n localStorage.removeItem(this.refreshTokenKey);\n sessionStorage.removeItem(this.tokenKey);\n sessionStorage.removeItem(this.refreshTokenKey);\n }\n\n /**\n * Get Token instance for current stored token\n * @returns {Token|null} Token instance or null if no token\n */\n getTokenInstance() {\n if (!this.tokenInstance) {\n const token = this.getToken();\n this.tokenInstance = token ? new Token(token) : null;\n }\n return this.tokenInstance;\n }\n\n /**\n * Decode JWT token payload (client-side only, no verification)\n * @param {string} token - JWT token\n * @returns {object|null} Decoded payload or null if invalid\n */\n decode(token = null) {\n const jwt = token || this.getToken();\n return new Token(jwt).decode();\n }\n\n /**\n * Get user ID from token\n * @returns {string|null} User ID or null if not found\n */\n getUserId() {\n const currentToken = this.getTokenInstance();\n return currentToken ? currentToken.getUserId() : null;\n }\n\n /**\n * Check if current token is valid (exists and not expired)\n * @returns {boolean} True if token is valid\n */\n isValid() {\n const currentToken = this.getTokenInstance();\n return currentToken ? currentToken.isValid() : false;\n }\n\n /**\n * Check if token will expire soon\n * @param {number} thresholdMinutes - Minutes before expiry to consider \"soon\"\n * @returns {boolean} True if expiring soon\n */\n isExpiringSoon(thresholdMinutes = 5) {\n const currentToken = this.getTokenInstance();\n return currentToken ? currentToken.isExpiringSoon(thresholdMinutes) : false;\n }\n\n /**\n * Get authorization header value\n * @returns {string|null} Bearer token string or null if no token\n */\n getAuthHeader() {\n const currentToken = this.getTokenInstance();\n return currentToken ? currentToken.getAuthHeader() : null;\n }\n\n /**\n * Get basic user info from token\n * @returns {object|null} User info or null\n */\n getUserInfo() {\n const currentToken = this.getTokenInstance();\n return currentToken ? currentToken.getUserInfo() : null;\n }\n\n startAutoRefresh(app) {\n // Implement token watcher logic here\n this.stopAutoRefresh();\n this._tokenWatcher = setInterval(() => {\n // Implement token watcher logic here\n const token = this.getTokenInstance();\n if (!token || !token.isValid() || token.isExpired()) {\n app.events.emit(\"auth:unauthorized\");\n this.stopAutoRefresh();\n return;\n }\n\n if (token.isExpiringSoon() || (token.getAgeMinutes() > 60)) {\n this.refreshToken(app);\n }\n\n }, 60000);\n }\n\n stopAutoRefresh() {\n if (this._tokenWatcher) {\n clearInterval(this._tokenWatcher);\n this._tokenWatcher = null;\n }\n }\n\n async refreshToken(app) {\n // Implement token refresh logic here\n const refresh_token = this.getRefreshToken();\n if (!refresh_token) {\n this.stopAutoRefresh();\n return;\n }\n\n app.rest.POST('/api/token/refresh', { refresh_token })\n .then((response) => {\n const { access_token, refresh_token } = response.data.data;\n this.setTokens(access_token, refresh_token);\n app.rest.setAuthToken(access_token);\n console.log('Token refreshed successfully');\n })\n .catch((error) => {\n this.stopAutoRefresh();\n // this.events.emit(\"tokenRefreshFailed\", error);\n app.showError(`Token refresh failed: ${error.message}`);\n });\n }\n}\n"],"names":["Token","constructor","token","this","payload","uid","email","name","exp","iat","isValidToken","_decode","parts","split","length","base64","replace","padding","repeat","decoded","atob","JSON","parse","sub","user_id","username","Date","_checkValidity","error","console","Math","floor","now","decode","getUserId","isValid","isExpiringSoon","thresholdMinutes","threshold","isExpired","getAgeMinutes","ageSeconds","getAuthHeader","getUserInfo","tokenKey","refreshTokenKey","tokenInstance","setTokens","refreshToken","persistent","storage","localStorage","sessionStorage","setItem","getToken","getItem","getRefreshToken","clearTokens","removeItem","getTokenInstance","jwt","currentToken","startAutoRefresh","app","stopAutoRefresh","_tokenWatcher","setInterval","events","emit","clearInterval","refresh_token","rest","POST","then","response","access_token","data","setAuthToken","log","catch","showError","message"],"mappings":"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"}