@spteck/react-controls-v2 2.0.1 → 2.0.3
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/dist/abstractions/IGraphProvider.d.ts +6 -0
- package/dist/abstractions/IGraphProvider.d.ts.map +1 -1
- package/dist/abstractions/providers/DefaultGraphClient.d.ts +1 -0
- package/dist/abstractions/providers/DefaultGraphClient.d.ts.map +1 -1
- package/dist/components/appDashboard/AppDashboard.d.ts.map +1 -1
- package/dist/components/userCard/useUserProfile.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +63 -33
- package/dist/index.mjs.map +1 -1
- package/dist/providers.js +1 -1
- package/dist/providers.js.map +1 -1
- package/dist/providers.mjs +24 -0
- package/dist/providers.mjs.map +1 -1
- package/package.json +1 -1
package/dist/providers.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=Object.defineProperty,t=(t,r,o)=>((t,r,o)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[r]=o)(t,"symbol"!=typeof r?r+"":r,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./ILoggingProvider-C4FFlnQ0.js");exports.ConsoleLoggingProvider=class{constructor(e="ReactControlsUniversal"){t(this,"componentName"),this.componentName=e}log(e,t,o){const
|
|
1
|
+
"use strict";var e=Object.defineProperty,t=(t,r,o)=>((t,r,o)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[r]=o)(t,"symbol"!=typeof r?r+"":r,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./ILoggingProvider-C4FFlnQ0.js");exports.ConsoleLoggingProvider=class{constructor(e="ReactControlsUniversal"){t(this,"componentName"),this.componentName=e}log(e,t,o){const s=`[${this.componentName}]`;switch(t){case r.LogLevel.Verbose:console.debug(s,e,o);break;case r.LogLevel.Info:console.info(s,e,o);break;case r.LogLevel.Warning:console.warn(s,e,o);break;case r.LogLevel.Error:console.error(s,e,o);break;default:console.log(s,e,o)}}error(e,t,r){console.error(`[${this.componentName}]`,e,t,r)}warn(e,t){console.warn(`[${this.componentName}]`,e,t)}info(e,t){console.info(`[${this.componentName}]`,e,t)}verbose(e,t){console.debug(`[${this.componentName}]`,e,t)}},exports.DefaultGraphClient=class{constructor(e){t(this,"baseUrl"),t(this,"accessToken"),t(this,"getAccessToken"),this.baseUrl=e.baseUrl||"https://graph.microsoft.com/v1.0",this.accessToken=e.accessToken,this.getAccessToken=e.getAccessToken}async getHeaders(){let e=this.accessToken;if(this.getAccessToken)try{e=await this.getAccessToken(["User.Read"])}catch(t){console.error("Failed to get access token:",t)}return{Authorization:e?`Bearer ${e}`:"","Content-Type":"application/json"}}buildUrl(e){const t=e.startsWith("/")?e.slice(1):e;return`${this.baseUrl}/${t}`}async get(e){const t=await this.getHeaders(),r=await fetch(this.buildUrl(e),{method:"GET",headers:t});if(!r.ok)throw new Error(`Graph API error: ${r.status} ${r.statusText}`);return r.json()}async post(e,t){const r=await this.getHeaders(),o=await fetch(this.buildUrl(e),{method:"POST",headers:r,body:JSON.stringify(t)});if(!o.ok)throw new Error(`Graph API error: ${o.status} ${o.statusText}`);return o.json()}async patch(e,t){const r=await this.getHeaders(),o=await fetch(this.buildUrl(e),{method:"PATCH",headers:r,body:JSON.stringify(t)});if(!o.ok)throw new Error(`Graph API error: ${o.status} ${o.statusText}`);return o.json()}async delete(e){const t=await this.getHeaders(),r=await fetch(this.buildUrl(e),{method:"DELETE",headers:t});if(!r.ok)throw new Error(`Graph API error: ${r.status} ${r.statusText}`)}async getWithMetadata(e){const t=await this.getHeaders(),r=await fetch(this.buildUrl(e),{method:"GET",headers:t});if(!r.ok)throw new Error(`Graph API error: ${r.status} ${r.statusText}`);return r.json()}async getBlob(e){let t=this.accessToken;if(this.getAccessToken)try{t=await this.getAccessToken(["User.Read"])}catch(s){console.error("Failed to get access token:",s)}const r={Authorization:t?`Bearer ${t}`:""},o=await fetch(this.buildUrl(e),{method:"GET",headers:r});if(!o.ok){if(404===o.status)return;throw new Error(`Graph API error: ${o.status} ${o.statusText}`)}return o.blob()}},exports.LocalStorageProvider=class{constructor(e="rcu_"){t(this,"prefix"),t(this,"memoryFallback"),t(this,"isLocalStorageAvailable"),this.prefix=e,this.memoryFallback=new Map,this.isLocalStorageAvailable=this.checkLocalStorageAvailability()}checkLocalStorageAvailability(){try{const e="__localStorage_test__";return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return!1}}getKey(e){return`${this.prefix}${e}`}async get(e){const t=this.getKey(e);try{let r=null;if(r=this.isLocalStorageAvailable?localStorage.getItem(t):this.memoryFallback.get(t),!r)return;const o=JSON.parse(r);return o.expiration&&Date.now()>o.expiration?void(await this.remove(e)):o.value}catch(r){return void console.error("Error reading from storage:",r)}}async set(e,t,r){const o=this.getKey(e);try{const e={value:t,expiration:r?Date.now()+60*r*1e3:void 0},s=JSON.stringify(e);this.isLocalStorageAvailable?localStorage.setItem(o,s):this.memoryFallback.set(o,s)}catch(s){console.error("Error writing to storage:",s)}}async remove(e){const t=this.getKey(e);try{this.isLocalStorageAvailable?localStorage.removeItem(t):this.memoryFallback.delete(t)}catch(r){console.error("Error removing from storage:",r)}}async clear(){try{if(this.isLocalStorageAvailable){Object.keys(localStorage).forEach(e=>{e.startsWith(this.prefix)&&localStorage.removeItem(e)})}else this.memoryFallback.clear()}catch(e){console.error("Error clearing storage:",e)}}async has(e){return void 0!==await this.get(e)}};
|
|
2
2
|
//# sourceMappingURL=providers.js.map
|
package/dist/providers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sources":["../src/abstractions/providers/ConsoleLoggingProvider.ts","../src/abstractions/providers/DefaultGraphClient.ts","../src/abstractions/providers/LocalStorageProvider.ts"],"sourcesContent":["import { ILoggingProvider, LogLevel, ErrorType } from '../ILoggingProvider';\n\n/**\n * Default console-based logging provider\n * Logs to browser console with appropriate methods based on log level\n */\nexport class ConsoleLoggingProvider implements ILoggingProvider {\n private readonly componentName: string;\n\n constructor(componentName: string = 'ReactControlsUniversal') {\n this.componentName = componentName;\n }\n\n log(message: string, level: LogLevel, data?: any): void {\n const prefix = `[${this.componentName}]`;\n \n switch (level) {\n case LogLevel.Verbose:\n console.debug(prefix, message, data);\n break;\n case LogLevel.Info:\n console.info(prefix, message, data);\n break;\n case LogLevel.Warning:\n console.warn(prefix, message, data);\n break;\n case LogLevel.Error:\n console.error(prefix, message, data);\n break;\n default:\n console.log(prefix, message, data);\n }\n }\n\n error(message: string, error?: Error, errorType?: ErrorType): void {\n console.error(`[${this.componentName}]`, message, error, errorType);\n }\n\n warn(message: string, data?: any): void {\n console.warn(`[${this.componentName}]`, message, data);\n }\n\n info(message: string, data?: any): void {\n console.info(`[${this.componentName}]`, message, data);\n }\n\n verbose(message: string, data?: any): void {\n console.debug(`[${this.componentName}]`, message, data);\n }\n}\n","import { IGraphProvider } from '../IGraphProvider';\n\nexport interface IGraphClientConfig {\n accessToken?: string;\n baseUrl?: string;\n getAccessToken?: (scopes: string[]) => Promise<string>;\n}\n\n/**\n * Default Microsoft Graph client implementation\n * Uses fetch API to make HTTP requests to Microsoft Graph\n */\nexport class DefaultGraphClient implements IGraphProvider {\n private readonly baseUrl: string;\n private accessToken?: string;\n private getAccessToken?: (scopes: string[]) => Promise<string>;\n\n constructor(config: IGraphClientConfig) {\n this.baseUrl = config.baseUrl || 'https://graph.microsoft.com/v1.0';\n this.accessToken = config.accessToken;\n this.getAccessToken = config.getAccessToken;\n }\n\n private async getHeaders(): Promise<HeadersInit> {\n let token = this.accessToken;\n\n // Try to get fresh token if getter is available\n if (this.getAccessToken) {\n try {\n token = await this.getAccessToken(['User.Read']);\n } catch (error) {\n console.error('Failed to get access token:', error);\n }\n }\n\n return {\n 'Authorization': token ? `Bearer ${token}` : '',\n 'Content-Type': 'application/json',\n };\n }\n\n private buildUrl(endpoint: string): string {\n // Remove leading slash if present\n const cleanEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint;\n return `${this.baseUrl}/${cleanEndpoint}`;\n }\n\n async get<T>(endpoint: string): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async post<T>(endpoint: string, data: any): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'POST',\n headers,\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async patch<T>(endpoint: string, data: any): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'PATCH',\n headers,\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async delete(endpoint: string): Promise<void> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'DELETE',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n }\n\n async getWithMetadata<T>(endpoint: string): Promise<{ value: T; '@odata.nextLink'?: string }> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n}\n","import { IStorageProvider } from '../IStorageProvider';\n\ninterface StorageItem<T> {\n value: T;\n expiration?: number;\n}\n\n/**\n * Default LocalStorage-based storage provider\n * Falls back to in-memory storage if LocalStorage is not available\n */\nexport class LocalStorageProvider implements IStorageProvider {\n private readonly prefix: string;\n private readonly memoryFallback: Map<string, any>;\n private readonly isLocalStorageAvailable: boolean;\n\n constructor(prefix: string = 'rcu_') {\n this.prefix = prefix;\n this.memoryFallback = new Map();\n this.isLocalStorageAvailable = this.checkLocalStorageAvailability();\n }\n\n private checkLocalStorageAvailability(): boolean {\n try {\n const test = '__localStorage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n }\n\n private getKey(key: string): string {\n return `${this.prefix}${key}`;\n }\n\n async get<T>(key: string): Promise<T | undefined> {\n const fullKey = this.getKey(key);\n\n try {\n let itemStr: string | null = null;\n\n if (this.isLocalStorageAvailable) {\n itemStr = localStorage.getItem(fullKey);\n } else {\n itemStr = this.memoryFallback.get(fullKey);\n }\n\n if (!itemStr) {\n return undefined;\n }\n\n const item: StorageItem<T> = JSON.parse(itemStr);\n\n // Check expiration\n if (item.expiration && Date.now() > item.expiration) {\n await this.remove(key);\n return undefined;\n }\n\n return item.value;\n } catch (error) {\n console.error('Error reading from storage:', error);\n return undefined;\n }\n }\n\n async set<T>(key: string, value: T, expirationInMinutes?: number): Promise<void> {\n const fullKey = this.getKey(key);\n\n try {\n const item: StorageItem<T> = {\n value,\n expiration: expirationInMinutes \n ? Date.now() + expirationInMinutes * 60 * 1000 \n : undefined,\n };\n\n const itemStr = JSON.stringify(item);\n\n if (this.isLocalStorageAvailable) {\n localStorage.setItem(fullKey, itemStr);\n } else {\n this.memoryFallback.set(fullKey, itemStr);\n }\n } catch (error) {\n console.error('Error writing to storage:', error);\n }\n }\n\n async remove(key: string): Promise<void> {\n const fullKey = this.getKey(key);\n\n try {\n if (this.isLocalStorageAvailable) {\n localStorage.removeItem(fullKey);\n } else {\n this.memoryFallback.delete(fullKey);\n }\n } catch (error) {\n console.error('Error removing from storage:', error);\n }\n }\n\n async clear(): Promise<void> {\n try {\n if (this.isLocalStorageAvailable) {\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(this.prefix)) {\n localStorage.removeItem(key);\n }\n });\n } else {\n this.memoryFallback.clear();\n }\n } catch (error) {\n console.error('Error clearing storage:', error);\n }\n }\n\n async has(key: string): Promise<boolean> {\n const value = await this.get(key);\n return value !== undefined;\n }\n}\n"],"names":["constructor","componentName","__publicField","this","log","message","level","data","prefix","LogLevel","Verbose","console","debug","Info","info","Warning","warn","Error","error","errorType","verbose","config","baseUrl","accessToken","getAccessToken","getHeaders","token","Authorization","buildUrl","endpoint","cleanEndpoint","startsWith","slice","get","headers","response","fetch","method","ok","status","statusText","json","post","body","JSON","stringify","patch","getWithMetadata","memoryFallback","Map","isLocalStorageAvailable","checkLocalStorageAvailability","test","localStorage","setItem","removeItem","getKey","key","fullKey","itemStr","getItem","item","parse","expiration","Date","now","remove","value","set","expirationInMinutes","delete","clear","Object","keys","forEach","has"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"providers.js","sources":["../src/abstractions/providers/ConsoleLoggingProvider.ts","../src/abstractions/providers/DefaultGraphClient.ts","../src/abstractions/providers/LocalStorageProvider.ts"],"sourcesContent":["import { ILoggingProvider, LogLevel, ErrorType } from '../ILoggingProvider';\n\n/**\n * Default console-based logging provider\n * Logs to browser console with appropriate methods based on log level\n */\nexport class ConsoleLoggingProvider implements ILoggingProvider {\n private readonly componentName: string;\n\n constructor(componentName: string = 'ReactControlsUniversal') {\n this.componentName = componentName;\n }\n\n log(message: string, level: LogLevel, data?: any): void {\n const prefix = `[${this.componentName}]`;\n \n switch (level) {\n case LogLevel.Verbose:\n console.debug(prefix, message, data);\n break;\n case LogLevel.Info:\n console.info(prefix, message, data);\n break;\n case LogLevel.Warning:\n console.warn(prefix, message, data);\n break;\n case LogLevel.Error:\n console.error(prefix, message, data);\n break;\n default:\n console.log(prefix, message, data);\n }\n }\n\n error(message: string, error?: Error, errorType?: ErrorType): void {\n console.error(`[${this.componentName}]`, message, error, errorType);\n }\n\n warn(message: string, data?: any): void {\n console.warn(`[${this.componentName}]`, message, data);\n }\n\n info(message: string, data?: any): void {\n console.info(`[${this.componentName}]`, message, data);\n }\n\n verbose(message: string, data?: any): void {\n console.debug(`[${this.componentName}]`, message, data);\n }\n}\n","import { IGraphProvider } from '../IGraphProvider';\n\nexport interface IGraphClientConfig {\n accessToken?: string;\n baseUrl?: string;\n getAccessToken?: (scopes: string[]) => Promise<string>;\n}\n\n/**\n * Default Microsoft Graph client implementation\n * Uses fetch API to make HTTP requests to Microsoft Graph\n */\nexport class DefaultGraphClient implements IGraphProvider {\n private readonly baseUrl: string;\n private accessToken?: string;\n private getAccessToken?: (scopes: string[]) => Promise<string>;\n\n constructor(config: IGraphClientConfig) {\n this.baseUrl = config.baseUrl || 'https://graph.microsoft.com/v1.0';\n this.accessToken = config.accessToken;\n this.getAccessToken = config.getAccessToken;\n }\n\n private async getHeaders(): Promise<HeadersInit> {\n let token = this.accessToken;\n\n // Try to get fresh token if getter is available\n if (this.getAccessToken) {\n try {\n token = await this.getAccessToken(['User.Read']);\n } catch (error) {\n console.error('Failed to get access token:', error);\n }\n }\n\n return {\n 'Authorization': token ? `Bearer ${token}` : '',\n 'Content-Type': 'application/json',\n };\n }\n\n private buildUrl(endpoint: string): string {\n // Remove leading slash if present\n const cleanEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint;\n return `${this.baseUrl}/${cleanEndpoint}`;\n }\n\n async get<T>(endpoint: string): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async post<T>(endpoint: string, data: any): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'POST',\n headers,\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async patch<T>(endpoint: string, data: any): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'PATCH',\n headers,\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async delete(endpoint: string): Promise<void> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'DELETE',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n }\n\n async getWithMetadata<T>(endpoint: string): Promise<{ value: T; '@odata.nextLink'?: string }> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async getBlob(endpoint: string): Promise<Blob | undefined> {\n let token = this.accessToken;\n\n // Try to get fresh token if getter is available\n if (this.getAccessToken) {\n try {\n token = await this.getAccessToken(['User.Read']);\n } catch (error) {\n console.error('Failed to get access token:', error);\n }\n }\n\n const blobHeaders: HeadersInit = {\n 'Authorization': token ? `Bearer ${token}` : '',\n };\n\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'GET',\n headers: blobHeaders,\n });\n\n if (!response.ok) {\n // 404 is common for users without photos, don't throw\n if (response.status === 404) {\n return undefined;\n }\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.blob();\n }\n}\n","import { IStorageProvider } from '../IStorageProvider';\n\ninterface StorageItem<T> {\n value: T;\n expiration?: number;\n}\n\n/**\n * Default LocalStorage-based storage provider\n * Falls back to in-memory storage if LocalStorage is not available\n */\nexport class LocalStorageProvider implements IStorageProvider {\n private readonly prefix: string;\n private readonly memoryFallback: Map<string, any>;\n private readonly isLocalStorageAvailable: boolean;\n\n constructor(prefix: string = 'rcu_') {\n this.prefix = prefix;\n this.memoryFallback = new Map();\n this.isLocalStorageAvailable = this.checkLocalStorageAvailability();\n }\n\n private checkLocalStorageAvailability(): boolean {\n try {\n const test = '__localStorage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n }\n\n private getKey(key: string): string {\n return `${this.prefix}${key}`;\n }\n\n async get<T>(key: string): Promise<T | undefined> {\n const fullKey = this.getKey(key);\n\n try {\n let itemStr: string | null = null;\n\n if (this.isLocalStorageAvailable) {\n itemStr = localStorage.getItem(fullKey);\n } else {\n itemStr = this.memoryFallback.get(fullKey);\n }\n\n if (!itemStr) {\n return undefined;\n }\n\n const item: StorageItem<T> = JSON.parse(itemStr);\n\n // Check expiration\n if (item.expiration && Date.now() > item.expiration) {\n await this.remove(key);\n return undefined;\n }\n\n return item.value;\n } catch (error) {\n console.error('Error reading from storage:', error);\n return undefined;\n }\n }\n\n async set<T>(key: string, value: T, expirationInMinutes?: number): Promise<void> {\n const fullKey = this.getKey(key);\n\n try {\n const item: StorageItem<T> = {\n value,\n expiration: expirationInMinutes \n ? Date.now() + expirationInMinutes * 60 * 1000 \n : undefined,\n };\n\n const itemStr = JSON.stringify(item);\n\n if (this.isLocalStorageAvailable) {\n localStorage.setItem(fullKey, itemStr);\n } else {\n this.memoryFallback.set(fullKey, itemStr);\n }\n } catch (error) {\n console.error('Error writing to storage:', error);\n }\n }\n\n async remove(key: string): Promise<void> {\n const fullKey = this.getKey(key);\n\n try {\n if (this.isLocalStorageAvailable) {\n localStorage.removeItem(fullKey);\n } else {\n this.memoryFallback.delete(fullKey);\n }\n } catch (error) {\n console.error('Error removing from storage:', error);\n }\n }\n\n async clear(): Promise<void> {\n try {\n if (this.isLocalStorageAvailable) {\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(this.prefix)) {\n localStorage.removeItem(key);\n }\n });\n } else {\n this.memoryFallback.clear();\n }\n } catch (error) {\n console.error('Error clearing storage:', error);\n }\n }\n\n async has(key: string): Promise<boolean> {\n const value = await this.get(key);\n return value !== undefined;\n }\n}\n"],"names":["constructor","componentName","__publicField","this","log","message","level","data","prefix","LogLevel","Verbose","console","debug","Info","info","Warning","warn","Error","error","errorType","verbose","config","baseUrl","accessToken","getAccessToken","getHeaders","token","Authorization","buildUrl","endpoint","cleanEndpoint","startsWith","slice","get","headers","response","fetch","method","ok","status","statusText","json","post","body","JSON","stringify","patch","getWithMetadata","getBlob","blobHeaders","blob","memoryFallback","Map","isLocalStorageAvailable","checkLocalStorageAvailability","test","localStorage","setItem","removeItem","getKey","key","fullKey","itemStr","getItem","item","parse","expiration","Date","now","remove","value","set","expirationInMinutes","delete","clear","Object","keys","forEach","has"],"mappings":"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"}
|
package/dist/providers.mjs
CHANGED
|
@@ -217,6 +217,30 @@ class DefaultGraphClient {
|
|
|
217
217
|
}
|
|
218
218
|
return response.json();
|
|
219
219
|
}
|
|
220
|
+
async getBlob(endpoint) {
|
|
221
|
+
let token = this.accessToken;
|
|
222
|
+
if (this.getAccessToken) {
|
|
223
|
+
try {
|
|
224
|
+
token = await this.getAccessToken(["User.Read"]);
|
|
225
|
+
} catch (error) {
|
|
226
|
+
console.error("Failed to get access token:", error);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const blobHeaders = {
|
|
230
|
+
"Authorization": token ? `Bearer ${token}` : ""
|
|
231
|
+
};
|
|
232
|
+
const response = await fetch(this.buildUrl(endpoint), {
|
|
233
|
+
method: "GET",
|
|
234
|
+
headers: blobHeaders
|
|
235
|
+
});
|
|
236
|
+
if (!response.ok) {
|
|
237
|
+
if (response.status === 404) {
|
|
238
|
+
return void 0;
|
|
239
|
+
}
|
|
240
|
+
throw new Error(`Graph API error: ${response.status} ${response.statusText}`);
|
|
241
|
+
}
|
|
242
|
+
return response.blob();
|
|
243
|
+
}
|
|
220
244
|
}
|
|
221
245
|
export {
|
|
222
246
|
ConsoleLoggingProvider,
|
package/dist/providers.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.mjs","sources":["../src/abstractions/providers/ConsoleLoggingProvider.ts","../src/abstractions/providers/LocalStorageProvider.ts","../src/abstractions/providers/DefaultGraphClient.ts"],"sourcesContent":["import { ILoggingProvider, LogLevel, ErrorType } from '../ILoggingProvider';\n\n/**\n * Default console-based logging provider\n * Logs to browser console with appropriate methods based on log level\n */\nexport class ConsoleLoggingProvider implements ILoggingProvider {\n private readonly componentName: string;\n\n constructor(componentName: string = 'ReactControlsUniversal') {\n this.componentName = componentName;\n }\n\n log(message: string, level: LogLevel, data?: any): void {\n const prefix = `[${this.componentName}]`;\n \n switch (level) {\n case LogLevel.Verbose:\n console.debug(prefix, message, data);\n break;\n case LogLevel.Info:\n console.info(prefix, message, data);\n break;\n case LogLevel.Warning:\n console.warn(prefix, message, data);\n break;\n case LogLevel.Error:\n console.error(prefix, message, data);\n break;\n default:\n console.log(prefix, message, data);\n }\n }\n\n error(message: string, error?: Error, errorType?: ErrorType): void {\n console.error(`[${this.componentName}]`, message, error, errorType);\n }\n\n warn(message: string, data?: any): void {\n console.warn(`[${this.componentName}]`, message, data);\n }\n\n info(message: string, data?: any): void {\n console.info(`[${this.componentName}]`, message, data);\n }\n\n verbose(message: string, data?: any): void {\n console.debug(`[${this.componentName}]`, message, data);\n }\n}\n","import { IStorageProvider } from '../IStorageProvider';\n\ninterface StorageItem<T> {\n value: T;\n expiration?: number;\n}\n\n/**\n * Default LocalStorage-based storage provider\n * Falls back to in-memory storage if LocalStorage is not available\n */\nexport class LocalStorageProvider implements IStorageProvider {\n private readonly prefix: string;\n private readonly memoryFallback: Map<string, any>;\n private readonly isLocalStorageAvailable: boolean;\n\n constructor(prefix: string = 'rcu_') {\n this.prefix = prefix;\n this.memoryFallback = new Map();\n this.isLocalStorageAvailable = this.checkLocalStorageAvailability();\n }\n\n private checkLocalStorageAvailability(): boolean {\n try {\n const test = '__localStorage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n }\n\n private getKey(key: string): string {\n return `${this.prefix}${key}`;\n }\n\n async get<T>(key: string): Promise<T | undefined> {\n const fullKey = this.getKey(key);\n\n try {\n let itemStr: string | null = null;\n\n if (this.isLocalStorageAvailable) {\n itemStr = localStorage.getItem(fullKey);\n } else {\n itemStr = this.memoryFallback.get(fullKey);\n }\n\n if (!itemStr) {\n return undefined;\n }\n\n const item: StorageItem<T> = JSON.parse(itemStr);\n\n // Check expiration\n if (item.expiration && Date.now() > item.expiration) {\n await this.remove(key);\n return undefined;\n }\n\n return item.value;\n } catch (error) {\n console.error('Error reading from storage:', error);\n return undefined;\n }\n }\n\n async set<T>(key: string, value: T, expirationInMinutes?: number): Promise<void> {\n const fullKey = this.getKey(key);\n\n try {\n const item: StorageItem<T> = {\n value,\n expiration: expirationInMinutes \n ? Date.now() + expirationInMinutes * 60 * 1000 \n : undefined,\n };\n\n const itemStr = JSON.stringify(item);\n\n if (this.isLocalStorageAvailable) {\n localStorage.setItem(fullKey, itemStr);\n } else {\n this.memoryFallback.set(fullKey, itemStr);\n }\n } catch (error) {\n console.error('Error writing to storage:', error);\n }\n }\n\n async remove(key: string): Promise<void> {\n const fullKey = this.getKey(key);\n\n try {\n if (this.isLocalStorageAvailable) {\n localStorage.removeItem(fullKey);\n } else {\n this.memoryFallback.delete(fullKey);\n }\n } catch (error) {\n console.error('Error removing from storage:', error);\n }\n }\n\n async clear(): Promise<void> {\n try {\n if (this.isLocalStorageAvailable) {\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(this.prefix)) {\n localStorage.removeItem(key);\n }\n });\n } else {\n this.memoryFallback.clear();\n }\n } catch (error) {\n console.error('Error clearing storage:', error);\n }\n }\n\n async has(key: string): Promise<boolean> {\n const value = await this.get(key);\n return value !== undefined;\n }\n}\n","import { IGraphProvider } from '../IGraphProvider';\n\nexport interface IGraphClientConfig {\n accessToken?: string;\n baseUrl?: string;\n getAccessToken?: (scopes: string[]) => Promise<string>;\n}\n\n/**\n * Default Microsoft Graph client implementation\n * Uses fetch API to make HTTP requests to Microsoft Graph\n */\nexport class DefaultGraphClient implements IGraphProvider {\n private readonly baseUrl: string;\n private accessToken?: string;\n private getAccessToken?: (scopes: string[]) => Promise<string>;\n\n constructor(config: IGraphClientConfig) {\n this.baseUrl = config.baseUrl || 'https://graph.microsoft.com/v1.0';\n this.accessToken = config.accessToken;\n this.getAccessToken = config.getAccessToken;\n }\n\n private async getHeaders(): Promise<HeadersInit> {\n let token = this.accessToken;\n\n // Try to get fresh token if getter is available\n if (this.getAccessToken) {\n try {\n token = await this.getAccessToken(['User.Read']);\n } catch (error) {\n console.error('Failed to get access token:', error);\n }\n }\n\n return {\n 'Authorization': token ? `Bearer ${token}` : '',\n 'Content-Type': 'application/json',\n };\n }\n\n private buildUrl(endpoint: string): string {\n // Remove leading slash if present\n const cleanEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint;\n return `${this.baseUrl}/${cleanEndpoint}`;\n }\n\n async get<T>(endpoint: string): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async post<T>(endpoint: string, data: any): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'POST',\n headers,\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async patch<T>(endpoint: string, data: any): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'PATCH',\n headers,\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async delete(endpoint: string): Promise<void> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'DELETE',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n }\n\n async getWithMetadata<T>(endpoint: string): Promise<{ value: T; '@odata.nextLink'?: string }> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"providers.mjs","sources":["../src/abstractions/providers/ConsoleLoggingProvider.ts","../src/abstractions/providers/LocalStorageProvider.ts","../src/abstractions/providers/DefaultGraphClient.ts"],"sourcesContent":["import { ILoggingProvider, LogLevel, ErrorType } from '../ILoggingProvider';\n\n/**\n * Default console-based logging provider\n * Logs to browser console with appropriate methods based on log level\n */\nexport class ConsoleLoggingProvider implements ILoggingProvider {\n private readonly componentName: string;\n\n constructor(componentName: string = 'ReactControlsUniversal') {\n this.componentName = componentName;\n }\n\n log(message: string, level: LogLevel, data?: any): void {\n const prefix = `[${this.componentName}]`;\n \n switch (level) {\n case LogLevel.Verbose:\n console.debug(prefix, message, data);\n break;\n case LogLevel.Info:\n console.info(prefix, message, data);\n break;\n case LogLevel.Warning:\n console.warn(prefix, message, data);\n break;\n case LogLevel.Error:\n console.error(prefix, message, data);\n break;\n default:\n console.log(prefix, message, data);\n }\n }\n\n error(message: string, error?: Error, errorType?: ErrorType): void {\n console.error(`[${this.componentName}]`, message, error, errorType);\n }\n\n warn(message: string, data?: any): void {\n console.warn(`[${this.componentName}]`, message, data);\n }\n\n info(message: string, data?: any): void {\n console.info(`[${this.componentName}]`, message, data);\n }\n\n verbose(message: string, data?: any): void {\n console.debug(`[${this.componentName}]`, message, data);\n }\n}\n","import { IStorageProvider } from '../IStorageProvider';\n\ninterface StorageItem<T> {\n value: T;\n expiration?: number;\n}\n\n/**\n * Default LocalStorage-based storage provider\n * Falls back to in-memory storage if LocalStorage is not available\n */\nexport class LocalStorageProvider implements IStorageProvider {\n private readonly prefix: string;\n private readonly memoryFallback: Map<string, any>;\n private readonly isLocalStorageAvailable: boolean;\n\n constructor(prefix: string = 'rcu_') {\n this.prefix = prefix;\n this.memoryFallback = new Map();\n this.isLocalStorageAvailable = this.checkLocalStorageAvailability();\n }\n\n private checkLocalStorageAvailability(): boolean {\n try {\n const test = '__localStorage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n }\n\n private getKey(key: string): string {\n return `${this.prefix}${key}`;\n }\n\n async get<T>(key: string): Promise<T | undefined> {\n const fullKey = this.getKey(key);\n\n try {\n let itemStr: string | null = null;\n\n if (this.isLocalStorageAvailable) {\n itemStr = localStorage.getItem(fullKey);\n } else {\n itemStr = this.memoryFallback.get(fullKey);\n }\n\n if (!itemStr) {\n return undefined;\n }\n\n const item: StorageItem<T> = JSON.parse(itemStr);\n\n // Check expiration\n if (item.expiration && Date.now() > item.expiration) {\n await this.remove(key);\n return undefined;\n }\n\n return item.value;\n } catch (error) {\n console.error('Error reading from storage:', error);\n return undefined;\n }\n }\n\n async set<T>(key: string, value: T, expirationInMinutes?: number): Promise<void> {\n const fullKey = this.getKey(key);\n\n try {\n const item: StorageItem<T> = {\n value,\n expiration: expirationInMinutes \n ? Date.now() + expirationInMinutes * 60 * 1000 \n : undefined,\n };\n\n const itemStr = JSON.stringify(item);\n\n if (this.isLocalStorageAvailable) {\n localStorage.setItem(fullKey, itemStr);\n } else {\n this.memoryFallback.set(fullKey, itemStr);\n }\n } catch (error) {\n console.error('Error writing to storage:', error);\n }\n }\n\n async remove(key: string): Promise<void> {\n const fullKey = this.getKey(key);\n\n try {\n if (this.isLocalStorageAvailable) {\n localStorage.removeItem(fullKey);\n } else {\n this.memoryFallback.delete(fullKey);\n }\n } catch (error) {\n console.error('Error removing from storage:', error);\n }\n }\n\n async clear(): Promise<void> {\n try {\n if (this.isLocalStorageAvailable) {\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(this.prefix)) {\n localStorage.removeItem(key);\n }\n });\n } else {\n this.memoryFallback.clear();\n }\n } catch (error) {\n console.error('Error clearing storage:', error);\n }\n }\n\n async has(key: string): Promise<boolean> {\n const value = await this.get(key);\n return value !== undefined;\n }\n}\n","import { IGraphProvider } from '../IGraphProvider';\n\nexport interface IGraphClientConfig {\n accessToken?: string;\n baseUrl?: string;\n getAccessToken?: (scopes: string[]) => Promise<string>;\n}\n\n/**\n * Default Microsoft Graph client implementation\n * Uses fetch API to make HTTP requests to Microsoft Graph\n */\nexport class DefaultGraphClient implements IGraphProvider {\n private readonly baseUrl: string;\n private accessToken?: string;\n private getAccessToken?: (scopes: string[]) => Promise<string>;\n\n constructor(config: IGraphClientConfig) {\n this.baseUrl = config.baseUrl || 'https://graph.microsoft.com/v1.0';\n this.accessToken = config.accessToken;\n this.getAccessToken = config.getAccessToken;\n }\n\n private async getHeaders(): Promise<HeadersInit> {\n let token = this.accessToken;\n\n // Try to get fresh token if getter is available\n if (this.getAccessToken) {\n try {\n token = await this.getAccessToken(['User.Read']);\n } catch (error) {\n console.error('Failed to get access token:', error);\n }\n }\n\n return {\n 'Authorization': token ? `Bearer ${token}` : '',\n 'Content-Type': 'application/json',\n };\n }\n\n private buildUrl(endpoint: string): string {\n // Remove leading slash if present\n const cleanEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint;\n return `${this.baseUrl}/${cleanEndpoint}`;\n }\n\n async get<T>(endpoint: string): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async post<T>(endpoint: string, data: any): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'POST',\n headers,\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async patch<T>(endpoint: string, data: any): Promise<T> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'PATCH',\n headers,\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async delete(endpoint: string): Promise<void> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'DELETE',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n }\n\n async getWithMetadata<T>(endpoint: string): Promise<{ value: T; '@odata.nextLink'?: string }> {\n const headers = await this.getHeaders();\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async getBlob(endpoint: string): Promise<Blob | undefined> {\n let token = this.accessToken;\n\n // Try to get fresh token if getter is available\n if (this.getAccessToken) {\n try {\n token = await this.getAccessToken(['User.Read']);\n } catch (error) {\n console.error('Failed to get access token:', error);\n }\n }\n\n const blobHeaders: HeadersInit = {\n 'Authorization': token ? `Bearer ${token}` : '',\n };\n\n const response = await fetch(this.buildUrl(endpoint), {\n method: 'GET',\n headers: blobHeaders,\n });\n\n if (!response.ok) {\n // 404 is common for users without photos, don't throw\n if (response.status === 404) {\n return undefined;\n }\n throw new Error(`Graph API error: ${response.status} ${response.statusText}`);\n }\n\n return response.blob();\n }\n}\n"],"names":[],"mappings":"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"}
|