@c-rex/core 0.1.1 → 0.1.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/requests.ts","../../constants/src/index.ts","../../utils/src/utils.ts","../../utils/src/memory.ts","../../utils/src/classMerge.ts","../../utils/src/treeOfContent.ts","../../utils/src/articles.ts","../src/sdk.ts"],"sourcesContent":["//Do not export logger.ts. Logger must be exported as an another entrypoint on package.json\nexport * from \"./requests\";\nexport * from \"./sdk\";","import axios, { AxiosResponse, Method, AxiosInstance } from \"axios\";\nimport { API, SDK_CONFIG_KEY } from \"@c-rex/constants\";\nimport { Issuer } from \"openid-client\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { call, getFromMemory, saveInMemory } from \"@c-rex/utils\";\nimport { getCookie } from \"@c-rex/utils/next-cookies\";\n\nconst CREX_TOKEN_HEADER_KEY = \"crex-token\";\nconst CREX_TOKEN_EXPIRY_HEADER_KEY = \"crex-token-expiry\";\n\ninterface APIGenericResponse<T> extends AxiosResponse {\n data: T;\n statusCode: number;\n}\n\ninterface CallParams {\n url: string;\n method: Method;\n body?: any;\n headers?: any;\n params?: any;\n}\n\nexport class CrexApi {\n private customerConfig!: ConfigInterface;\n private apiClient!: AxiosInstance;\n\n private async manageToken() {\n const headersAux: Record<string, string> = {};\n\n if (this.customerConfig.OIDC.client.enabled) {\n let token = getFromMemory(CREX_TOKEN_HEADER_KEY);\n let tokenExpiry = getFromMemory(CREX_TOKEN_EXPIRY_HEADER_KEY);\n\n const now = Math.floor(Date.now() / 1000);\n\n if (!(token && tokenExpiry > now + 60)) {\n const { token: tokenAux, tokenExpiry: tokenExpiryAux } = await this.getToken();\n\n token = tokenAux;\n\n saveInMemory(token, CREX_TOKEN_HEADER_KEY);\n saveInMemory(tokenExpiryAux, CREX_TOKEN_EXPIRY_HEADER_KEY);\n }\n\n headersAux['Authorization'] = `Bearer ${token}`;\n }\n\n return headersAux;\n }\n\n private async getToken(): Promise<{\n token: string;\n tokenExpiry: number;\n }> {\n let token = \"\";\n let tokenExpiry = 0;\n\n try {\n const now = Math.floor(Date.now() / 1000);\n const issuer = await Issuer.discover(this.customerConfig.OIDC.client.issuer);\n const client = new issuer.Client({\n client_id: this.customerConfig.OIDC.client.id,\n client_secret: this.customerConfig.OIDC.client.secret,\n });\n const tokenSet = await client.grant({ grant_type: 'client_credentials' });\n\n token = tokenSet.access_token!;\n tokenExpiry = now + tokenSet.expires_at!;\n\n console.log('token', token);\n\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `API.getToken error when request ${this.customerConfig.OIDC.client.issuer}. Error: ${error}`\n });\n }\n\n return {\n token,\n tokenExpiry\n };\n }\n\n private async initAPI() {\n if (!this.customerConfig) {\n const jsonConfigs = await getCookie(SDK_CONFIG_KEY);\n if (!jsonConfigs) {\n throw new Error(\"SDK not initialized\");\n }\n this.customerConfig = JSON.parse(jsonConfigs) as ConfigInterface;\n }\n if (!this.apiClient) {\n this.apiClient = axios.create({\n baseURL: this.customerConfig.baseUrl,\n })\n }\n }\n\n async execute<T>({\n url,\n method,\n params,\n body,\n headers = {},\n }: CallParams): Promise<T> {\n\n await this.initAPI();\n\n let response: APIGenericResponse<T> | undefined = undefined;\n\n headers = {\n ...headers,\n ...await this.manageToken(),\n };\n\n for (let retry = 0; retry < API.MAX_RETRY; retry++) {\n try {\n response = await this.apiClient.request({\n url,\n method,\n data: body,\n params,\n headers,\n });\n\n break;\n } catch (error) {\n //TODO: add logger\n console.log(\n \"error\",\n `API.execute ${retry + 1}º error when request ${url}. Error: ${error}`\n );\n\n if (retry === API.MAX_RETRY - 1) {\n throw error;\n }\n }\n }\n\n if (response) {\n return response.data;\n }\n\n throw new Error(\"API.execute error: Failed to retrieve a valid response\");\n }\n}","export const ALL = \"*\"\n\nexport const LOG_CATEGORIES = [\n \"NoLicense\",\n \"Scenario\",\n \"Favorites\",\n \"Subscription\",\n \"Share\",\n \"Document\",\n \"Search\",\n \"History\",\n \"Notification\",\n \"UserProfile\",\n] as const;\n\nexport const LOG_LEVELS = {\n critical: 2,\n error: 3,\n warning: 4,\n info: 6,\n debug: 7,\n} as const;\n\nexport const RESULT_VIEW_STYLES = [\n \"cards\",\n \"table\",\n] as const;\n\nexport const API = {\n MAX_RETRY: 3,\n API_TIMEOUT: 10000,\n API_HEADERS: {\n \"content-Type\": \"application/json\",\n },\n};\n\nexport const SDK_CONFIG_KEY = \"crex-sdk-config\";\n\nexport const CONTENT_LANG_KEY = \"CONTENT_LANG_KEY\";\n\nexport const AVAILABLE_CONTENT_LANG_KEY = \"AVAILABLE_CONTENT_LANG_KEY\";\n\nexport const UI_LANG_KEY = \"UI_LANG_KEY\";\n\nexport const FLAGS_BY_LANG = {\n \"en\": \"US\",\n \"de\": \"DE\",\n};\n\nexport const DEFAULT_UI_LANG = \"en\";\n\nexport const UI_LANG_OPTIONS = [\"en\", \"de\"];\n\nexport const RESULT_TYPES = {\n TOPIC: \"TOPIC\",\n DOCUMENT: \"DOCUMENT\",\n PACKAGE: \"PACKAGE\",\n} as const;","import { FLAGS_BY_LANG } from \"@c-rex/constants\";\n\nexport const call = async<T = unknown>(method: string, params?: any): Promise<T> => {\n try {\n const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/rpc`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ method, params }),\n });\n\n const json = await res.json();\n\n if (!res.ok) throw new Error(json.error || 'Unknown error');\n\n return json.data;\n } catch (error) {\n console.error(error);\n return null as any;\n }\n}\n\nexport const getCountryCodeByLang = (lang: string): string => {\n const mappedKeys = Object.keys(FLAGS_BY_LANG);\n\n if (!mappedKeys.includes(lang)) {\n return lang\n }\n\n type LangKey = keyof typeof FLAGS_BY_LANG;\n const country = FLAGS_BY_LANG[lang as LangKey]\n\n return country\n}","export function isBrowser() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function saveInMemory(value: any, key: string) {\n if (isBrowser()) throw new Error(\"saveInMemory is not supported in browser\");\n\n if (typeof global !== 'undefined' && !(key in global)) {\n (global as any)[key] = null;\n }\n\n const globalConfig = (global as any)[key] as any;\n\n if (globalConfig === null) {\n (global as any)[key] = value;\n }\n}\n\nexport function getFromMemory(key: string): any {\n if (isBrowser()) throw new Error(\"getFromMemory is not supported in browser\");\n\n return (global as any)[key];\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { DirectoryNodesService } from \"@c-rex/services\";\nimport { DirectoryNodes, informationUnitsDirectories, TreeOfContent } from \"@c-rex/interfaces\";\n\nexport const generateTreeOfContent = async (\n directoryNodes: DirectoryNodes[],\n): Promise<TreeOfContent[]> => {\n\n const service = new DirectoryNodesService();\n\n if (directoryNodes.length == 0) return [];\n if (directoryNodes[0] == undefined) return [];\n\n let id = directoryNodes[0].shortId;\n let response = await service.getItem(id);\n const childList = await getChildrenInfo(response.childNodes);\n let result: TreeOfContent[] = childList;\n\n while (response.parents != undefined) {\n if (response.informationUnits[0] == undefined) return result;\n if (response.labels[0] == undefined) return result;\n if (response.parents[0] == undefined) return result;\n\n const infoId = response.informationUnits[0].shortId;\n const aux = {\n active: true,\n label: response.labels[0].value,\n id: response.shortId,\n link: `/info/${infoId}`,\n children: [...result],\n };\n id = response.parents[0].shortId;\n response = await service.getItem(id);\n\n const tree = await getChildrenInfo(response.childNodes, aux);\n\n result = [...tree];\n }\n\n return result;\n};\n\nconst getChildrenInfo = async (\n childNodes: informationUnitsDirectories[],\n childItem?: TreeOfContent,\n): Promise<TreeOfContent[]> => {\n const result: TreeOfContent[] = [];\n if (childNodes == undefined) return result;\n\n for (const item of childNodes) {\n if (item.labels[0] == undefined) break;\n\n const infoId = await getLink(item.shortId);\n let resultItem: TreeOfContent = {\n active: false,\n label: item.labels[0].value,\n link: `/info/${infoId}`,\n id: item.shortId,\n children: [],\n };\n\n if (childItem?.id == item.shortId) {\n resultItem = childItem;\n }\n result.push(resultItem);\n }\n\n return result;\n};\n\nconst getLink = async (id: string): Promise<string> => {\n const service = new DirectoryNodesService();\n const response = await service.getItem(id);\n\n if (response.informationUnits == undefined) return \"\";\n if (response.informationUnits[0] == undefined) return \"\";\n\n return response.informationUnits[0].shortId;\n};","import { InformationUnitsService, RenditionsService } from \"@c-rex/services\";\nimport { generateBreadcrumbItems, generateTreeOfContent } from \"@c-rex/utils\";\nimport { SidebarAvailableVersionsInterface, TreeOfContent } from \"@c-rex/interfaces\";\n\nexport const loadArticleData = async (id: string) => {\n const renditionService = new RenditionsService();\n const informationService = new InformationUnitsService();\n const informationUnitsItem = await informationService.getItem({ id });\n\n let title = \"\";\n let versionOf = \"\";\n let documentURL = \"\";\n let htmlContent = \"\";\n let treeOfContent: TreeOfContent[] = [];\n let breadcrumbItems: TreeOfContent[] = [];\n let availableVersions: Omit<SidebarAvailableVersionsInterface, \"link\">[] = [];\n\n if (informationUnitsItem != null) {\n if (informationUnitsItem.versionOf != undefined) {\n versionOf = informationUnitsItem.versionOf.shortId\n }\n if (informationUnitsItem.titles != undefined && informationUnitsItem.titles[0] != undefined) {\n title = informationUnitsItem.titles[0].value\n }\n }\n\n if (versionOf != undefined) {\n const versions = await informationService.getList({\n filters: [`versionOf.shortId=${versionOf}`],\n fields: [\"labels\"],\n })\n\n availableVersions = versions.items.map((item) => {\n return {\n shortId: item.shortId,\n lang: item.labels[0]?.language as string,\n country: item.labels[0]?.language.split(\"-\")[1] as string,\n }\n }).sort((a, b) => {\n if (a.lang < b.lang) {\n return -1;\n }\n if (a.lang > b.lang) {\n return 1;\n }\n return 0;\n })\n }\n\n if (informationUnitsItem?.renditions != undefined) {\n htmlContent = await renditionService.getHTMLRendition(informationUnitsItem.renditions)\n documentURL = await renditionService.getDocumentRendition(informationUnitsItem.renditions, \"pdf\")\n\n if (informationUnitsItem?.directoryNodes != undefined) {\n treeOfContent = await generateTreeOfContent(informationUnitsItem.directoryNodes);\n breadcrumbItems = generateBreadcrumbItems(treeOfContent);\n }\n }\n\n return {\n htmlContent,\n treeOfContent,\n breadcrumbItems,\n availableVersions,\n documentURL,\n title\n }\n};","import { SDK_CONFIG_KEY } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { getCookie } from \"@c-rex/utils/next-cookies\";\n\nexport class CrexSDK {\n public userAuthConfig!: any;\n public customerConfig!: ConfigInterface;\n\n private async getConfig() {\n if (!this.customerConfig) {\n const jsonConfigs = await getCookie(SDK_CONFIG_KEY);\n if (!jsonConfigs) {\n throw new Error(\"SDK not initialized\");\n }\n this.customerConfig = JSON.parse(jsonConfigs) as ConfigInterface;\n }\n }\n\n public async getUserAuthConfig() {\n if (this.userAuthConfig) {\n return this.userAuthConfig;\n }\n\n await this.getConfig();\n\n const user = this.customerConfig.OIDC.user;\n if (user.enabled) {\n this.userAuthConfig = {\n providers: [\n {\n id: \"crex\",\n name: \"CREX\",\n type: \"oauth\",\n clientId: user.id,\n wellKnown: user.issuer,\n clientSecret: user.secret,\n authorization: { params: { scope: user.scope } },\n profile(profile: any) {\n return {\n id: profile.id || \"fake Id\",\n name: profile.name || \"Fake Name\",\n email: profile.email || \"fake Email\",\n image: profile.image || \"fake Image\",\n }\n },\n },\n ]\n }\n };\n\n return this.userAuthConfig;\n }\n}"],"mappings":"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","names":["import_services","axios","import_next_cookies"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/requests.ts","../../constants/src/index.ts","../../utils/src/utils.ts","../../utils/src/memory.ts","../../utils/src/classMerge.ts","../../utils/src/token.ts","../src/cache.ts","../src/sdk.ts"],"sourcesContent":["//Do not export logger.ts. Logger must be exported as an another entrypoint on package.json\nexport * from \"./requests\";\nexport * from \"./sdk\";","import axios, { AxiosResponse, Method, AxiosInstance } from \"axios\";\nimport { API } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { call, manageToken } from \"@c-rex/utils\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\nimport { CrexCache } from \"./cache\";\n\n\n/**\n * Interface for API response with generic data type.\n */\ninterface APIGenericResponse<T> extends AxiosResponse {\n data: T;\n statusCode: number;\n}\n\n/**\n * Interface for API call parameters.\n */\ninterface CallParams {\n url: string;\n method: Method;\n body?: any;\n headers?: any;\n params?: any;\n}\n\n/**\n * API client class for the CREX application.\n * Handles API requests with caching, authentication, and retry logic.\n */\nexport class CrexApi {\n private customerConfig!: ConfigInterface;\n private apiClient!: AxiosInstance;\n private cache!: CrexCache;\n\n /**\n * Initializes the API client if it hasn't been initialized yet.\n * Loads customer configuration, creates the axios instance, and initializes the cache.\n * \n * @private\n */\n private async initAPI() {\n if (!this.customerConfig) {\n this.customerConfig = await getConfigs();\n }\n if (!this.apiClient) {\n this.apiClient = axios.create({\n baseURL: this.customerConfig.baseUrl,\n })\n }\n if (!this.cache) {\n this.cache = new CrexCache();\n }\n }\n\n /**\n * Executes an API request with caching, authentication, and retry logic.\n * \n * @param options - Request options\n * @param options.url - The URL to request\n * @param options.method - The HTTP method to use\n * @param options.params - Optional query parameters\n * @param options.body - Optional request body\n * @param options.headers - Optional request headers\n * @returns The response data\n * @throws Error if the request fails after maximum retries\n */\n async execute<T>({\n url,\n method,\n params,\n body,\n headers = {},\n }: CallParams): Promise<T> {\n await this.initAPI();\n\n let response: APIGenericResponse<T> | undefined = undefined;\n /*\n const cacheKey = this.cache.generateCacheKey({ url, method, body, params, headers });\n\n if (method.toUpperCase() === \"GET\") {\n const cachedResponse = await this.cache.get(cacheKey);\n\n if (cachedResponse) {\n\n return JSON.parse(cachedResponse) as T;\n }\n }\n */\n\n if (this.customerConfig.OIDC.client.enabled) {\n const token = await manageToken();\n\n headers = {\n ...headers,\n Authorization: `Bearer ${token}`,\n };\n\n this.apiClient.defaults.headers.common['Authorization'] = `Bearer ${token}`;\n }\n\n for (let retry = 0; retry < API.MAX_RETRY; retry++) {\n try {\n response = await this.apiClient.request({\n url,\n method,\n data: body,\n params,\n headers,\n });\n\n break;\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `API.execute ${retry + 1}º error when request ${url}. Error: ${error}`\n });\n\n if (retry === API.MAX_RETRY - 1) {\n throw error;\n }\n }\n }\n\n if (response) {\n return response.data;\n }\n\n throw new Error(\"API.execute error: Failed to retrieve a valid response\");\n }\n}","export const ALL = \"*\"\n\nexport const LOG_CATEGORIES = [\n \"NoLicense\",\n \"Scenario\",\n \"Favorites\",\n \"Subscription\",\n \"Share\",\n \"Document\",\n \"Search\",\n \"History\",\n \"Notification\",\n \"UserProfile\",\n] as const;\n\nexport const LOG_LEVELS = {\n critical: 2,\n error: 3,\n warning: 4,\n info: 6,\n debug: 7,\n} as const;\n\nexport const RESULT_VIEW_STYLES = [\n \"cards\",\n \"table\",\n] as const;\n\nexport const API = {\n MAX_RETRY: 3,\n API_TIMEOUT: 10000,\n API_HEADERS: {\n \"content-Type\": \"application/json\",\n },\n};\n\nexport const SDK_CONFIG_KEY = \"crex-sdk-config\";\n\nexport const CONTENT_LANG_KEY = \"CONTENT_LANG_KEY\";\n\nexport const AVAILABLE_CONTENT_LANG_KEY = \"AVAILABLE_CONTENT_LANG_KEY\";\n\nexport const UI_LANG_KEY = \"UI_LANG_KEY\";\n\nexport const FLAGS_BY_LANG = {\n \"en\": \"US\",\n \"de\": \"DE\",\n};\n\nexport const DEFAULT_LANG = \"en-US\";\n\nexport const EN_LANG = \"en\";\n\nexport const UI_LANG_OPTIONS = [\"en-us\", \"de-de\"];\n\nexport const TOPICS_TYPE_AND_LINK = \"topics\";\nexport const DOCUMENTS_TYPE_AND_LINK = \"documents\";\n\nexport const TOPIC = \"TOPIC\";\nexport const DOCUMENT = \"DOCUMENT\";\nexport const PACKAGE = \"PACKAGE\";\n\nexport const RESULT_TYPES = {\n TOPIC: TOPIC,\n DOCUMENT: DOCUMENT,\n PACKAGE: PACKAGE,\n} as const;\n\nexport const FILES_EXTENSIONS = {\n PDF: \"application/pdf\",\n HTML: \"text/html\",\n} as const;\n\nexport const DEFAULT_COOKIE_LIMIT = 7 * 24 * 60 * 60 * 1000; // 7 days in milliseconds\n\nexport const ICONS_BY_FILE_EXTENSION = {\n \"application/pdf\": \"FaFilePdf\",\n} as const;\n\nexport const DEFAULT_ICON = \"file\";\n\nexport const CREX_TOKEN_HEADER_KEY = \"crex-token\";","import { FLAGS_BY_LANG } from \"@c-rex/constants\";\n\n/**\n * Makes an asynchronous RPC API call to the server.\n * @param method - The RPC method name to call\n * @param params - Optional parameters to pass to the method\n * @returns A Promise resolving to the response data of type T, or null if an error occurs\n */\nexport const call = async<T = unknown>(method: string, params?: any): Promise<T> => {\n try {\n const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/rpc`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ method, params }),\n credentials: 'include',\n });\n\n const json = await res.json();\n\n if (!res.ok) throw new Error(json.error || 'Unknown error');\n\n return json.data;\n } catch (error) {\n //TODO: add logger\n console.error(error);\n return null as T;\n }\n}\n\n/**\n * Retrieves the country code associated with a given language code.\n * @param lang - The language code to look up (e.g., \"en-US\")\n * @returns The corresponding country code, or the original language code if not found\n */\nexport const getCountryCodeByLang = (lang: string): string => {\n const mappedKeys = Object.keys(FLAGS_BY_LANG);\n\n if (!mappedKeys.includes(lang)) {\n return lang\n }\n\n type LangKey = keyof typeof FLAGS_BY_LANG;\n const country = FLAGS_BY_LANG[lang as LangKey]\n\n return country\n}\n\nexport const getFromCookieString = (cookieString: string, key: string): string => {\n const cookies = cookieString.split(';')\n\n for (const cookie of cookies) {\n const [cookieKey, cookieValue] = cookie.trim().split('=')\n\n if (cookieKey === key) {\n return cookieValue as string;\n }\n }\n\n return ''\n}\n","import { DEFAULT_COOKIE_LIMIT } from \"@c-rex/constants\";\nimport { call } from \"./utils\";\n\n/**\n * Fetches a cookie value from the server API in client-side code.\n * @param key - The key of the cookie to retrieve\n * @returns A Promise resolving to an object containing the key and value of the cookie\n */\nexport const getCookie = async (key: string): Promise<{ key: string, value: string | null }> => {\n const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/cookies?key=${key}`);\n\n if (!res.ok) {\n return { key: key, value: null };\n }\n const json = await res.json();\n\n return json;\n}\n\n/**\n * Sets a cookie value through the server API in client-side code.\n * @param key - The key of the cookie to set\n * @param value - The value to store in the cookie\n * @param maxAge - Optional maximum age of the cookie in seconds. Defaults to DEFAULT_COOKIE_LIMIT if not specified.\n * @returns A Promise that resolves when the cookie has been set\n */\nexport const setCookie = async (key: string, value: string, maxAge?: number): Promise<void> => {\n try {\n\n if (maxAge === undefined) {\n maxAge = DEFAULT_COOKIE_LIMIT;\n }\n\n await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/cookies`, {\n method: 'POST',\n credentials: 'include',\n body: JSON.stringify({\n key: key,\n value: value,\n maxAge: maxAge,\n }),\n });\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `utils.setCookie error: ${error}`\n });\n }\n}\n\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merges multiple class values into a single string using clsx and tailwind-merge.\n * Useful for conditionally applying Tailwind CSS classes.\n * @param inputs - Any number of class values (strings, objects, arrays, etc.)\n * @returns A merged string of class names optimized for Tailwind CSS\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { CREX_TOKEN_HEADER_KEY } from \"@c-rex/constants\";\nimport { getCookie } from \"./memory\";\nimport { call } from \"./utils\";\n\nconst updateToken = async (): Promise<string | null> => {\n try {\n const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/token`, {\n method: 'POST',\n credentials: 'include',\n });\n\n const cookies = response.headers.get(\"set-cookie\");\n if (cookies === null) return null\n\n const aux = cookies.split(`${CREX_TOKEN_HEADER_KEY}=`);\n if (aux.length == 0) return null\n\n const token = aux[1].split(\";\")[0];\n if (token === undefined) throw new Error(\"Token is undefined\");\n\n return token;\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `utils.updateToken error: ${error}`\n });\n return null\n }\n}\n\nexport const manageToken = async (): Promise<string | null> => {\n try {\n\n const hasToken = await getCookie(CREX_TOKEN_HEADER_KEY);\n let token = hasToken.value!;\n\n if (hasToken.value === null) {\n const tokenResult = await updateToken();\n\n if (tokenResult === null) throw new Error(\"Token is undefined\");\n\n token = tokenResult;\n }\n\n return token;\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `utils.manageToken error: ${error}`\n });\n\n return null\n }\n}","import { call, getCookie, setCookie } from \"@c-rex/utils\";\n\n/**\n * Cache class for the CREX application.\n * Provides cookie-based caching functionality for API responses.\n */\nexport class CrexCache {\n /**\n * Retrieves a value from the cache by key.\n * \n * @param key - The cache key to retrieve\n * @returns The cached value as a string, or null if not found\n */\n public async get(key: string): Promise<string | null> {\n const cookie = await getCookie(key);\n\n return cookie.value;\n }\n\n /**\n * Stores a value in the cache with the specified key.\n * Checks if the value size is within cookie size limits (4KB).\n * \n * @param key - The cache key\n * @param value - The value to store\n */\n public async set(key: string, value: string): Promise<void> {\n try {\n const byteLength = new TextEncoder().encode(value).length;\n\n if (byteLength <= 4096) {\n await setCookie(key, value);\n } else {\n console.warn(`Cookie ${key} value is too large to be stored in a single cookie`);\n }\n\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `CrexCache.set error: ${error}`\n });\n }\n }\n\n /**\n * Generates a cache key based on request parameters.\n * Combines URL, method, and optionally params, body, and headers into a single string key.\n * \n * @param options - Request options to generate key from\n * @param options.url - The request URL\n * @param options.method - The HTTP method\n * @param options.body - Optional request body\n * @param options.params - Optional query parameters\n * @param options.headers - Optional request headers\n * @returns A string cache key\n */\n public generateCacheKey({\n url,\n method,\n body,\n params,\n headers,\n }: any) {\n let cacheKey = `${url}-${method}`\n\n if (params !== undefined && Object.keys(params).length > 0) {\n cacheKey += `-${JSON.stringify(params)}`\n }\n if (body !== undefined && Object.keys(body).length > 0) {\n cacheKey += `-${JSON.stringify(body)}`\n }\n if (headers !== undefined && Object.keys(headers).length > 0) {\n cacheKey += `-${JSON.stringify(headers)}`\n }\n\n return cacheKey;\n }\n}","import { ConfigInterface } from \"@c-rex/interfaces\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\n\n/**\n * SDK class for the CREX application.\n * Provides configuration and authentication functionality.\n */\nexport class CrexSDK {\n public userAuthConfig!: any;\n public customerConfig!: ConfigInterface;\n\n /**\n * Retrieves the customer configuration if it hasn't been loaded yet.\n * \n * @private\n */\n private async getConfig() {\n if (!this.customerConfig) {\n this.customerConfig = await getConfigs()\n }\n }\n\n /**\n * Retrieves the user authentication configuration.\n * If not already loaded, it will load the customer configuration and\n * create the auth config based on OIDC settings.\n * \n * @returns The user authentication configuration object\n */\n public async getUserAuthConfig() {\n if (this.userAuthConfig) {\n return this.userAuthConfig;\n }\n\n await this.getConfig();\n\n const user = this.customerConfig.OIDC.user;\n if (user.enabled) {\n this.userAuthConfig = {\n providers: [\n {\n id: \"crex\",\n name: \"CREX\",\n type: \"oauth\",\n clientId: user.id,\n wellKnown: user.issuer,\n clientSecret: user.secret,\n authorization: { params: { scope: user.scope } },\n profile(profile: any) {\n return {\n id: profile.id || \"fake Id\",\n name: profile.name || \"Fake Name\",\n email: profile.email || \"fake Email\",\n image: profile.image || \"fake Image\",\n }\n },\n },\n ]\n }\n };\n\n return this.userAuthConfig;\n }\n}"],"mappings":"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","names":["axios","import_next_cookies"]}
package/dist/index.mjs CHANGED
@@ -9,10 +9,8 @@ var API = {
9
9
  "content-Type": "application/json"
10
10
  }
11
11
  };
12
- var SDK_CONFIG_KEY = "crex-sdk-config";
13
-
14
- // src/requests.ts
15
- import { Issuer } from "openid-client";
12
+ var DEFAULT_COOKIE_LIMIT = 7 * 24 * 60 * 60 * 1e3;
13
+ var CREX_TOKEN_HEADER_KEY = "crex-token";
16
14
 
17
15
  // ../utils/src/utils.ts
18
16
  var call = async (method, params) => {
@@ -20,7 +18,8 @@ var call = async (method, params) => {
20
18
  const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/rpc`, {
21
19
  method: "POST",
22
20
  headers: { "Content-Type": "application/json" },
23
- body: JSON.stringify({ method, params })
21
+ body: JSON.stringify({ method, params }),
22
+ credentials: "include"
24
23
  });
25
24
  const json = await res.json();
26
25
  if (!res.ok) throw new Error(json.error || "Unknown error");
@@ -32,96 +31,187 @@ var call = async (method, params) => {
32
31
  };
33
32
 
34
33
  // ../utils/src/memory.ts
35
- function isBrowser() {
36
- return typeof window !== "undefined" && typeof document !== "undefined";
37
- }
38
- function saveInMemory(value, key) {
39
- if (isBrowser()) throw new Error("saveInMemory is not supported in browser");
40
- if (typeof global !== "undefined" && !(key in global)) {
41
- global[key] = null;
34
+ var getCookie = async (key) => {
35
+ const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/cookies?key=${key}`);
36
+ if (!res.ok) {
37
+ return { key, value: null };
42
38
  }
43
- const globalConfig = global[key];
44
- if (globalConfig === null) {
45
- global[key] = value;
39
+ const json = await res.json();
40
+ return json;
41
+ };
42
+ var setCookie = async (key, value, maxAge) => {
43
+ try {
44
+ if (maxAge === void 0) {
45
+ maxAge = DEFAULT_COOKIE_LIMIT;
46
+ }
47
+ await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/cookies`, {
48
+ method: "POST",
49
+ credentials: "include",
50
+ body: JSON.stringify({
51
+ key,
52
+ value,
53
+ maxAge
54
+ })
55
+ });
56
+ } catch (error) {
57
+ call("CrexLogger.log", {
58
+ level: "error",
59
+ message: `utils.setCookie error: ${error}`
60
+ });
46
61
  }
47
- }
48
- function getFromMemory(key) {
49
- if (isBrowser()) throw new Error("getFromMemory is not supported in browser");
50
- return global[key];
51
- }
62
+ };
52
63
 
53
64
  // ../utils/src/classMerge.ts
54
65
  import { clsx } from "clsx";
55
66
  import { twMerge } from "tailwind-merge";
56
67
 
57
- // ../utils/src/treeOfContent.ts
58
- import { DirectoryNodesService } from "@c-rex/services";
59
-
60
- // ../utils/src/articles.ts
61
- import { InformationUnitsService, RenditionsService } from "@c-rex/services";
68
+ // ../utils/src/token.ts
69
+ var updateToken = async () => {
70
+ try {
71
+ const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/token`, {
72
+ method: "POST",
73
+ credentials: "include"
74
+ });
75
+ const cookies = response.headers.get("set-cookie");
76
+ if (cookies === null) return null;
77
+ const aux = cookies.split(`${CREX_TOKEN_HEADER_KEY}=`);
78
+ if (aux.length == 0) return null;
79
+ const token = aux[1].split(";")[0];
80
+ if (token === void 0) throw new Error("Token is undefined");
81
+ return token;
82
+ } catch (error) {
83
+ call("CrexLogger.log", {
84
+ level: "error",
85
+ message: `utils.updateToken error: ${error}`
86
+ });
87
+ return null;
88
+ }
89
+ };
90
+ var manageToken = async () => {
91
+ try {
92
+ const hasToken = await getCookie(CREX_TOKEN_HEADER_KEY);
93
+ let token = hasToken.value;
94
+ if (hasToken.value === null) {
95
+ const tokenResult = await updateToken();
96
+ if (tokenResult === null) throw new Error("Token is undefined");
97
+ token = tokenResult;
98
+ }
99
+ return token;
100
+ } catch (error) {
101
+ call("CrexLogger.log", {
102
+ level: "error",
103
+ message: `utils.manageToken error: ${error}`
104
+ });
105
+ return null;
106
+ }
107
+ };
62
108
 
63
109
  // src/requests.ts
64
- import { getCookie } from "@c-rex/utils/next-cookies";
65
- var CREX_TOKEN_HEADER_KEY = "crex-token";
66
- var CREX_TOKEN_EXPIRY_HEADER_KEY = "crex-token-expiry";
67
- var CrexApi = class {
68
- customerConfig;
69
- apiClient;
70
- async manageToken() {
71
- const headersAux = {};
72
- if (this.customerConfig.OIDC.client.enabled) {
73
- let token = getFromMemory(CREX_TOKEN_HEADER_KEY);
74
- let tokenExpiry = getFromMemory(CREX_TOKEN_EXPIRY_HEADER_KEY);
75
- const now = Math.floor(Date.now() / 1e3);
76
- if (!(token && tokenExpiry > now + 60)) {
77
- const { token: tokenAux, tokenExpiry: tokenExpiryAux } = await this.getToken();
78
- token = tokenAux;
79
- saveInMemory(token, CREX_TOKEN_HEADER_KEY);
80
- saveInMemory(tokenExpiryAux, CREX_TOKEN_EXPIRY_HEADER_KEY);
81
- }
82
- headersAux["Authorization"] = `Bearer ${token}`;
83
- }
84
- return headersAux;
110
+ import { getConfigs } from "@c-rex/utils/next-cookies";
111
+
112
+ // src/cache.ts
113
+ var CrexCache = class {
114
+ /**
115
+ * Retrieves a value from the cache by key.
116
+ *
117
+ * @param key - The cache key to retrieve
118
+ * @returns The cached value as a string, or null if not found
119
+ */
120
+ async get(key) {
121
+ const cookie = await getCookie(key);
122
+ return cookie.value;
85
123
  }
86
- async getToken() {
87
- let token = "";
88
- let tokenExpiry = 0;
124
+ /**
125
+ * Stores a value in the cache with the specified key.
126
+ * Checks if the value size is within cookie size limits (4KB).
127
+ *
128
+ * @param key - The cache key
129
+ * @param value - The value to store
130
+ */
131
+ async set(key, value) {
89
132
  try {
90
- const now = Math.floor(Date.now() / 1e3);
91
- const issuer = await Issuer.discover(this.customerConfig.OIDC.client.issuer);
92
- const client = new issuer.Client({
93
- client_id: this.customerConfig.OIDC.client.id,
94
- client_secret: this.customerConfig.OIDC.client.secret
95
- });
96
- const tokenSet = await client.grant({ grant_type: "client_credentials" });
97
- token = tokenSet.access_token;
98
- tokenExpiry = now + tokenSet.expires_at;
99
- console.log("token", token);
133
+ const byteLength = new TextEncoder().encode(value).length;
134
+ if (byteLength <= 4096) {
135
+ await setCookie(key, value);
136
+ } else {
137
+ console.warn(`Cookie ${key} value is too large to be stored in a single cookie`);
138
+ }
100
139
  } catch (error) {
101
140
  call("CrexLogger.log", {
102
141
  level: "error",
103
- message: `API.getToken error when request ${this.customerConfig.OIDC.client.issuer}. Error: ${error}`
142
+ message: `CrexCache.set error: ${error}`
104
143
  });
105
144
  }
106
- return {
107
- token,
108
- tokenExpiry
109
- };
110
145
  }
146
+ /**
147
+ * Generates a cache key based on request parameters.
148
+ * Combines URL, method, and optionally params, body, and headers into a single string key.
149
+ *
150
+ * @param options - Request options to generate key from
151
+ * @param options.url - The request URL
152
+ * @param options.method - The HTTP method
153
+ * @param options.body - Optional request body
154
+ * @param options.params - Optional query parameters
155
+ * @param options.headers - Optional request headers
156
+ * @returns A string cache key
157
+ */
158
+ generateCacheKey({
159
+ url,
160
+ method,
161
+ body,
162
+ params,
163
+ headers
164
+ }) {
165
+ let cacheKey = `${url}-${method}`;
166
+ if (params !== void 0 && Object.keys(params).length > 0) {
167
+ cacheKey += `-${JSON.stringify(params)}`;
168
+ }
169
+ if (body !== void 0 && Object.keys(body).length > 0) {
170
+ cacheKey += `-${JSON.stringify(body)}`;
171
+ }
172
+ if (headers !== void 0 && Object.keys(headers).length > 0) {
173
+ cacheKey += `-${JSON.stringify(headers)}`;
174
+ }
175
+ return cacheKey;
176
+ }
177
+ };
178
+
179
+ // src/requests.ts
180
+ var CrexApi = class {
181
+ customerConfig;
182
+ apiClient;
183
+ cache;
184
+ /**
185
+ * Initializes the API client if it hasn't been initialized yet.
186
+ * Loads customer configuration, creates the axios instance, and initializes the cache.
187
+ *
188
+ * @private
189
+ */
111
190
  async initAPI() {
112
191
  if (!this.customerConfig) {
113
- const jsonConfigs = await getCookie(SDK_CONFIG_KEY);
114
- if (!jsonConfigs) {
115
- throw new Error("SDK not initialized");
116
- }
117
- this.customerConfig = JSON.parse(jsonConfigs);
192
+ this.customerConfig = await getConfigs();
118
193
  }
119
194
  if (!this.apiClient) {
120
195
  this.apiClient = axios.create({
121
196
  baseURL: this.customerConfig.baseUrl
122
197
  });
123
198
  }
199
+ if (!this.cache) {
200
+ this.cache = new CrexCache();
201
+ }
124
202
  }
203
+ /**
204
+ * Executes an API request with caching, authentication, and retry logic.
205
+ *
206
+ * @param options - Request options
207
+ * @param options.url - The URL to request
208
+ * @param options.method - The HTTP method to use
209
+ * @param options.params - Optional query parameters
210
+ * @param options.body - Optional request body
211
+ * @param options.headers - Optional request headers
212
+ * @returns The response data
213
+ * @throws Error if the request fails after maximum retries
214
+ */
125
215
  async execute({
126
216
  url,
127
217
  method,
@@ -131,10 +221,14 @@ var CrexApi = class {
131
221
  }) {
132
222
  await this.initAPI();
133
223
  let response = void 0;
134
- headers = {
135
- ...headers,
136
- ...await this.manageToken()
137
- };
224
+ if (this.customerConfig.OIDC.client.enabled) {
225
+ const token = await manageToken();
226
+ headers = {
227
+ ...headers,
228
+ Authorization: `Bearer ${token}`
229
+ };
230
+ this.apiClient.defaults.headers.common["Authorization"] = `Bearer ${token}`;
231
+ }
138
232
  for (let retry = 0; retry < API.MAX_RETRY; retry++) {
139
233
  try {
140
234
  response = await this.apiClient.request({
@@ -146,10 +240,10 @@ var CrexApi = class {
146
240
  });
147
241
  break;
148
242
  } catch (error) {
149
- console.log(
150
- "error",
151
- `API.execute ${retry + 1}\xBA error when request ${url}. Error: ${error}`
152
- );
243
+ call("CrexLogger.log", {
244
+ level: "error",
245
+ message: `API.execute ${retry + 1}\xBA error when request ${url}. Error: ${error}`
246
+ });
153
247
  if (retry === API.MAX_RETRY - 1) {
154
248
  throw error;
155
249
  }
@@ -163,19 +257,27 @@ var CrexApi = class {
163
257
  };
164
258
 
165
259
  // src/sdk.ts
166
- import { getCookie as getCookie2 } from "@c-rex/utils/next-cookies";
260
+ import { getConfigs as getConfigs2 } from "@c-rex/utils/next-cookies";
167
261
  var CrexSDK = class {
168
262
  userAuthConfig;
169
263
  customerConfig;
264
+ /**
265
+ * Retrieves the customer configuration if it hasn't been loaded yet.
266
+ *
267
+ * @private
268
+ */
170
269
  async getConfig() {
171
270
  if (!this.customerConfig) {
172
- const jsonConfigs = await getCookie2(SDK_CONFIG_KEY);
173
- if (!jsonConfigs) {
174
- throw new Error("SDK not initialized");
175
- }
176
- this.customerConfig = JSON.parse(jsonConfigs);
271
+ this.customerConfig = await getConfigs2();
177
272
  }
178
273
  }
274
+ /**
275
+ * Retrieves the user authentication configuration.
276
+ * If not already loaded, it will load the customer configuration and
277
+ * create the auth config based on OIDC settings.
278
+ *
279
+ * @returns The user authentication configuration object
280
+ */
179
281
  async getUserAuthConfig() {
180
282
  if (this.userAuthConfig) {
181
283
  return this.userAuthConfig;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/requests.ts","../../constants/src/index.ts","../../utils/src/utils.ts","../../utils/src/memory.ts","../../utils/src/classMerge.ts","../../utils/src/treeOfContent.ts","../../utils/src/articles.ts","../src/sdk.ts"],"sourcesContent":["import axios, { AxiosResponse, Method, AxiosInstance } from \"axios\";\nimport { API, SDK_CONFIG_KEY } from \"@c-rex/constants\";\nimport { Issuer } from \"openid-client\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { call, getFromMemory, saveInMemory } from \"@c-rex/utils\";\nimport { getCookie } from \"@c-rex/utils/next-cookies\";\n\nconst CREX_TOKEN_HEADER_KEY = \"crex-token\";\nconst CREX_TOKEN_EXPIRY_HEADER_KEY = \"crex-token-expiry\";\n\ninterface APIGenericResponse<T> extends AxiosResponse {\n data: T;\n statusCode: number;\n}\n\ninterface CallParams {\n url: string;\n method: Method;\n body?: any;\n headers?: any;\n params?: any;\n}\n\nexport class CrexApi {\n private customerConfig!: ConfigInterface;\n private apiClient!: AxiosInstance;\n\n private async manageToken() {\n const headersAux: Record<string, string> = {};\n\n if (this.customerConfig.OIDC.client.enabled) {\n let token = getFromMemory(CREX_TOKEN_HEADER_KEY);\n let tokenExpiry = getFromMemory(CREX_TOKEN_EXPIRY_HEADER_KEY);\n\n const now = Math.floor(Date.now() / 1000);\n\n if (!(token && tokenExpiry > now + 60)) {\n const { token: tokenAux, tokenExpiry: tokenExpiryAux } = await this.getToken();\n\n token = tokenAux;\n\n saveInMemory(token, CREX_TOKEN_HEADER_KEY);\n saveInMemory(tokenExpiryAux, CREX_TOKEN_EXPIRY_HEADER_KEY);\n }\n\n headersAux['Authorization'] = `Bearer ${token}`;\n }\n\n return headersAux;\n }\n\n private async getToken(): Promise<{\n token: string;\n tokenExpiry: number;\n }> {\n let token = \"\";\n let tokenExpiry = 0;\n\n try {\n const now = Math.floor(Date.now() / 1000);\n const issuer = await Issuer.discover(this.customerConfig.OIDC.client.issuer);\n const client = new issuer.Client({\n client_id: this.customerConfig.OIDC.client.id,\n client_secret: this.customerConfig.OIDC.client.secret,\n });\n const tokenSet = await client.grant({ grant_type: 'client_credentials' });\n\n token = tokenSet.access_token!;\n tokenExpiry = now + tokenSet.expires_at!;\n\n console.log('token', token);\n\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `API.getToken error when request ${this.customerConfig.OIDC.client.issuer}. Error: ${error}`\n });\n }\n\n return {\n token,\n tokenExpiry\n };\n }\n\n private async initAPI() {\n if (!this.customerConfig) {\n const jsonConfigs = await getCookie(SDK_CONFIG_KEY);\n if (!jsonConfigs) {\n throw new Error(\"SDK not initialized\");\n }\n this.customerConfig = JSON.parse(jsonConfigs) as ConfigInterface;\n }\n if (!this.apiClient) {\n this.apiClient = axios.create({\n baseURL: this.customerConfig.baseUrl,\n })\n }\n }\n\n async execute<T>({\n url,\n method,\n params,\n body,\n headers = {},\n }: CallParams): Promise<T> {\n\n await this.initAPI();\n\n let response: APIGenericResponse<T> | undefined = undefined;\n\n headers = {\n ...headers,\n ...await this.manageToken(),\n };\n\n for (let retry = 0; retry < API.MAX_RETRY; retry++) {\n try {\n response = await this.apiClient.request({\n url,\n method,\n data: body,\n params,\n headers,\n });\n\n break;\n } catch (error) {\n //TODO: add logger\n console.log(\n \"error\",\n `API.execute ${retry + 1}º error when request ${url}. Error: ${error}`\n );\n\n if (retry === API.MAX_RETRY - 1) {\n throw error;\n }\n }\n }\n\n if (response) {\n return response.data;\n }\n\n throw new Error(\"API.execute error: Failed to retrieve a valid response\");\n }\n}","export const ALL = \"*\"\n\nexport const LOG_CATEGORIES = [\n \"NoLicense\",\n \"Scenario\",\n \"Favorites\",\n \"Subscription\",\n \"Share\",\n \"Document\",\n \"Search\",\n \"History\",\n \"Notification\",\n \"UserProfile\",\n] as const;\n\nexport const LOG_LEVELS = {\n critical: 2,\n error: 3,\n warning: 4,\n info: 6,\n debug: 7,\n} as const;\n\nexport const RESULT_VIEW_STYLES = [\n \"cards\",\n \"table\",\n] as const;\n\nexport const API = {\n MAX_RETRY: 3,\n API_TIMEOUT: 10000,\n API_HEADERS: {\n \"content-Type\": \"application/json\",\n },\n};\n\nexport const SDK_CONFIG_KEY = \"crex-sdk-config\";\n\nexport const CONTENT_LANG_KEY = \"CONTENT_LANG_KEY\";\n\nexport const AVAILABLE_CONTENT_LANG_KEY = \"AVAILABLE_CONTENT_LANG_KEY\";\n\nexport const UI_LANG_KEY = \"UI_LANG_KEY\";\n\nexport const FLAGS_BY_LANG = {\n \"en\": \"US\",\n \"de\": \"DE\",\n};\n\nexport const DEFAULT_UI_LANG = \"en\";\n\nexport const UI_LANG_OPTIONS = [\"en\", \"de\"];\n\nexport const RESULT_TYPES = {\n TOPIC: \"TOPIC\",\n DOCUMENT: \"DOCUMENT\",\n PACKAGE: \"PACKAGE\",\n} as const;","import { FLAGS_BY_LANG } from \"@c-rex/constants\";\n\nexport const call = async<T = unknown>(method: string, params?: any): Promise<T> => {\n try {\n const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/rpc`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ method, params }),\n });\n\n const json = await res.json();\n\n if (!res.ok) throw new Error(json.error || 'Unknown error');\n\n return json.data;\n } catch (error) {\n console.error(error);\n return null as any;\n }\n}\n\nexport const getCountryCodeByLang = (lang: string): string => {\n const mappedKeys = Object.keys(FLAGS_BY_LANG);\n\n if (!mappedKeys.includes(lang)) {\n return lang\n }\n\n type LangKey = keyof typeof FLAGS_BY_LANG;\n const country = FLAGS_BY_LANG[lang as LangKey]\n\n return country\n}","export function isBrowser() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function saveInMemory(value: any, key: string) {\n if (isBrowser()) throw new Error(\"saveInMemory is not supported in browser\");\n\n if (typeof global !== 'undefined' && !(key in global)) {\n (global as any)[key] = null;\n }\n\n const globalConfig = (global as any)[key] as any;\n\n if (globalConfig === null) {\n (global as any)[key] = value;\n }\n}\n\nexport function getFromMemory(key: string): any {\n if (isBrowser()) throw new Error(\"getFromMemory is not supported in browser\");\n\n return (global as any)[key];\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { DirectoryNodesService } from \"@c-rex/services\";\nimport { DirectoryNodes, informationUnitsDirectories, TreeOfContent } from \"@c-rex/interfaces\";\n\nexport const generateTreeOfContent = async (\n directoryNodes: DirectoryNodes[],\n): Promise<TreeOfContent[]> => {\n\n const service = new DirectoryNodesService();\n\n if (directoryNodes.length == 0) return [];\n if (directoryNodes[0] == undefined) return [];\n\n let id = directoryNodes[0].shortId;\n let response = await service.getItem(id);\n const childList = await getChildrenInfo(response.childNodes);\n let result: TreeOfContent[] = childList;\n\n while (response.parents != undefined) {\n if (response.informationUnits[0] == undefined) return result;\n if (response.labels[0] == undefined) return result;\n if (response.parents[0] == undefined) return result;\n\n const infoId = response.informationUnits[0].shortId;\n const aux = {\n active: true,\n label: response.labels[0].value,\n id: response.shortId,\n link: `/info/${infoId}`,\n children: [...result],\n };\n id = response.parents[0].shortId;\n response = await service.getItem(id);\n\n const tree = await getChildrenInfo(response.childNodes, aux);\n\n result = [...tree];\n }\n\n return result;\n};\n\nconst getChildrenInfo = async (\n childNodes: informationUnitsDirectories[],\n childItem?: TreeOfContent,\n): Promise<TreeOfContent[]> => {\n const result: TreeOfContent[] = [];\n if (childNodes == undefined) return result;\n\n for (const item of childNodes) {\n if (item.labels[0] == undefined) break;\n\n const infoId = await getLink(item.shortId);\n let resultItem: TreeOfContent = {\n active: false,\n label: item.labels[0].value,\n link: `/info/${infoId}`,\n id: item.shortId,\n children: [],\n };\n\n if (childItem?.id == item.shortId) {\n resultItem = childItem;\n }\n result.push(resultItem);\n }\n\n return result;\n};\n\nconst getLink = async (id: string): Promise<string> => {\n const service = new DirectoryNodesService();\n const response = await service.getItem(id);\n\n if (response.informationUnits == undefined) return \"\";\n if (response.informationUnits[0] == undefined) return \"\";\n\n return response.informationUnits[0].shortId;\n};","import { InformationUnitsService, RenditionsService } from \"@c-rex/services\";\nimport { generateBreadcrumbItems, generateTreeOfContent } from \"@c-rex/utils\";\nimport { SidebarAvailableVersionsInterface, TreeOfContent } from \"@c-rex/interfaces\";\n\nexport const loadArticleData = async (id: string) => {\n const renditionService = new RenditionsService();\n const informationService = new InformationUnitsService();\n const informationUnitsItem = await informationService.getItem({ id });\n\n let title = \"\";\n let versionOf = \"\";\n let documentURL = \"\";\n let htmlContent = \"\";\n let treeOfContent: TreeOfContent[] = [];\n let breadcrumbItems: TreeOfContent[] = [];\n let availableVersions: Omit<SidebarAvailableVersionsInterface, \"link\">[] = [];\n\n if (informationUnitsItem != null) {\n if (informationUnitsItem.versionOf != undefined) {\n versionOf = informationUnitsItem.versionOf.shortId\n }\n if (informationUnitsItem.titles != undefined && informationUnitsItem.titles[0] != undefined) {\n title = informationUnitsItem.titles[0].value\n }\n }\n\n if (versionOf != undefined) {\n const versions = await informationService.getList({\n filters: [`versionOf.shortId=${versionOf}`],\n fields: [\"labels\"],\n })\n\n availableVersions = versions.items.map((item) => {\n return {\n shortId: item.shortId,\n lang: item.labels[0]?.language as string,\n country: item.labels[0]?.language.split(\"-\")[1] as string,\n }\n }).sort((a, b) => {\n if (a.lang < b.lang) {\n return -1;\n }\n if (a.lang > b.lang) {\n return 1;\n }\n return 0;\n })\n }\n\n if (informationUnitsItem?.renditions != undefined) {\n htmlContent = await renditionService.getHTMLRendition(informationUnitsItem.renditions)\n documentURL = await renditionService.getDocumentRendition(informationUnitsItem.renditions, \"pdf\")\n\n if (informationUnitsItem?.directoryNodes != undefined) {\n treeOfContent = await generateTreeOfContent(informationUnitsItem.directoryNodes);\n breadcrumbItems = generateBreadcrumbItems(treeOfContent);\n }\n }\n\n return {\n htmlContent,\n treeOfContent,\n breadcrumbItems,\n availableVersions,\n documentURL,\n title\n }\n};","import { SDK_CONFIG_KEY } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { getCookie } from \"@c-rex/utils/next-cookies\";\n\nexport class CrexSDK {\n public userAuthConfig!: any;\n public customerConfig!: ConfigInterface;\n\n private async getConfig() {\n if (!this.customerConfig) {\n const jsonConfigs = await getCookie(SDK_CONFIG_KEY);\n if (!jsonConfigs) {\n throw new Error(\"SDK not initialized\");\n }\n this.customerConfig = JSON.parse(jsonConfigs) as ConfigInterface;\n }\n }\n\n public async getUserAuthConfig() {\n if (this.userAuthConfig) {\n return this.userAuthConfig;\n }\n\n await this.getConfig();\n\n const user = this.customerConfig.OIDC.user;\n if (user.enabled) {\n this.userAuthConfig = {\n providers: [\n {\n id: \"crex\",\n name: \"CREX\",\n type: \"oauth\",\n clientId: user.id,\n wellKnown: user.issuer,\n clientSecret: user.secret,\n authorization: { params: { scope: user.scope } },\n profile(profile: any) {\n return {\n id: profile.id || \"fake Id\",\n name: profile.name || \"Fake Name\",\n email: profile.email || \"fake Email\",\n image: profile.image || \"fake Image\",\n }\n },\n },\n ]\n }\n };\n\n return this.userAuthConfig;\n }\n}"],"mappings":"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","names":["getCookie"]}
1
+ {"version":3,"sources":["../src/requests.ts","../../constants/src/index.ts","../../utils/src/utils.ts","../../utils/src/memory.ts","../../utils/src/classMerge.ts","../../utils/src/token.ts","../src/cache.ts","../src/sdk.ts"],"sourcesContent":["import axios, { AxiosResponse, Method, AxiosInstance } from \"axios\";\nimport { API } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { call, manageToken } from \"@c-rex/utils\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\nimport { CrexCache } from \"./cache\";\n\n\n/**\n * Interface for API response with generic data type.\n */\ninterface APIGenericResponse<T> extends AxiosResponse {\n data: T;\n statusCode: number;\n}\n\n/**\n * Interface for API call parameters.\n */\ninterface CallParams {\n url: string;\n method: Method;\n body?: any;\n headers?: any;\n params?: any;\n}\n\n/**\n * API client class for the CREX application.\n * Handles API requests with caching, authentication, and retry logic.\n */\nexport class CrexApi {\n private customerConfig!: ConfigInterface;\n private apiClient!: AxiosInstance;\n private cache!: CrexCache;\n\n /**\n * Initializes the API client if it hasn't been initialized yet.\n * Loads customer configuration, creates the axios instance, and initializes the cache.\n * \n * @private\n */\n private async initAPI() {\n if (!this.customerConfig) {\n this.customerConfig = await getConfigs();\n }\n if (!this.apiClient) {\n this.apiClient = axios.create({\n baseURL: this.customerConfig.baseUrl,\n })\n }\n if (!this.cache) {\n this.cache = new CrexCache();\n }\n }\n\n /**\n * Executes an API request with caching, authentication, and retry logic.\n * \n * @param options - Request options\n * @param options.url - The URL to request\n * @param options.method - The HTTP method to use\n * @param options.params - Optional query parameters\n * @param options.body - Optional request body\n * @param options.headers - Optional request headers\n * @returns The response data\n * @throws Error if the request fails after maximum retries\n */\n async execute<T>({\n url,\n method,\n params,\n body,\n headers = {},\n }: CallParams): Promise<T> {\n await this.initAPI();\n\n let response: APIGenericResponse<T> | undefined = undefined;\n /*\n const cacheKey = this.cache.generateCacheKey({ url, method, body, params, headers });\n\n if (method.toUpperCase() === \"GET\") {\n const cachedResponse = await this.cache.get(cacheKey);\n\n if (cachedResponse) {\n\n return JSON.parse(cachedResponse) as T;\n }\n }\n */\n\n if (this.customerConfig.OIDC.client.enabled) {\n const token = await manageToken();\n\n headers = {\n ...headers,\n Authorization: `Bearer ${token}`,\n };\n\n this.apiClient.defaults.headers.common['Authorization'] = `Bearer ${token}`;\n }\n\n for (let retry = 0; retry < API.MAX_RETRY; retry++) {\n try {\n response = await this.apiClient.request({\n url,\n method,\n data: body,\n params,\n headers,\n });\n\n break;\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `API.execute ${retry + 1}º error when request ${url}. Error: ${error}`\n });\n\n if (retry === API.MAX_RETRY - 1) {\n throw error;\n }\n }\n }\n\n if (response) {\n return response.data;\n }\n\n throw new Error(\"API.execute error: Failed to retrieve a valid response\");\n }\n}","export const ALL = \"*\"\n\nexport const LOG_CATEGORIES = [\n \"NoLicense\",\n \"Scenario\",\n \"Favorites\",\n \"Subscription\",\n \"Share\",\n \"Document\",\n \"Search\",\n \"History\",\n \"Notification\",\n \"UserProfile\",\n] as const;\n\nexport const LOG_LEVELS = {\n critical: 2,\n error: 3,\n warning: 4,\n info: 6,\n debug: 7,\n} as const;\n\nexport const RESULT_VIEW_STYLES = [\n \"cards\",\n \"table\",\n] as const;\n\nexport const API = {\n MAX_RETRY: 3,\n API_TIMEOUT: 10000,\n API_HEADERS: {\n \"content-Type\": \"application/json\",\n },\n};\n\nexport const SDK_CONFIG_KEY = \"crex-sdk-config\";\n\nexport const CONTENT_LANG_KEY = \"CONTENT_LANG_KEY\";\n\nexport const AVAILABLE_CONTENT_LANG_KEY = \"AVAILABLE_CONTENT_LANG_KEY\";\n\nexport const UI_LANG_KEY = \"UI_LANG_KEY\";\n\nexport const FLAGS_BY_LANG = {\n \"en\": \"US\",\n \"de\": \"DE\",\n};\n\nexport const DEFAULT_LANG = \"en-US\";\n\nexport const EN_LANG = \"en\";\n\nexport const UI_LANG_OPTIONS = [\"en-us\", \"de-de\"];\n\nexport const TOPICS_TYPE_AND_LINK = \"topics\";\nexport const DOCUMENTS_TYPE_AND_LINK = \"documents\";\n\nexport const TOPIC = \"TOPIC\";\nexport const DOCUMENT = \"DOCUMENT\";\nexport const PACKAGE = \"PACKAGE\";\n\nexport const RESULT_TYPES = {\n TOPIC: TOPIC,\n DOCUMENT: DOCUMENT,\n PACKAGE: PACKAGE,\n} as const;\n\nexport const FILES_EXTENSIONS = {\n PDF: \"application/pdf\",\n HTML: \"text/html\",\n} as const;\n\nexport const DEFAULT_COOKIE_LIMIT = 7 * 24 * 60 * 60 * 1000; // 7 days in milliseconds\n\nexport const ICONS_BY_FILE_EXTENSION = {\n \"application/pdf\": \"FaFilePdf\",\n} as const;\n\nexport const DEFAULT_ICON = \"file\";\n\nexport const CREX_TOKEN_HEADER_KEY = \"crex-token\";","import { FLAGS_BY_LANG } from \"@c-rex/constants\";\n\n/**\n * Makes an asynchronous RPC API call to the server.\n * @param method - The RPC method name to call\n * @param params - Optional parameters to pass to the method\n * @returns A Promise resolving to the response data of type T, or null if an error occurs\n */\nexport const call = async<T = unknown>(method: string, params?: any): Promise<T> => {\n try {\n const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/rpc`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ method, params }),\n credentials: 'include',\n });\n\n const json = await res.json();\n\n if (!res.ok) throw new Error(json.error || 'Unknown error');\n\n return json.data;\n } catch (error) {\n //TODO: add logger\n console.error(error);\n return null as T;\n }\n}\n\n/**\n * Retrieves the country code associated with a given language code.\n * @param lang - The language code to look up (e.g., \"en-US\")\n * @returns The corresponding country code, or the original language code if not found\n */\nexport const getCountryCodeByLang = (lang: string): string => {\n const mappedKeys = Object.keys(FLAGS_BY_LANG);\n\n if (!mappedKeys.includes(lang)) {\n return lang\n }\n\n type LangKey = keyof typeof FLAGS_BY_LANG;\n const country = FLAGS_BY_LANG[lang as LangKey]\n\n return country\n}\n\nexport const getFromCookieString = (cookieString: string, key: string): string => {\n const cookies = cookieString.split(';')\n\n for (const cookie of cookies) {\n const [cookieKey, cookieValue] = cookie.trim().split('=')\n\n if (cookieKey === key) {\n return cookieValue as string;\n }\n }\n\n return ''\n}\n","import { DEFAULT_COOKIE_LIMIT } from \"@c-rex/constants\";\nimport { call } from \"./utils\";\n\n/**\n * Fetches a cookie value from the server API in client-side code.\n * @param key - The key of the cookie to retrieve\n * @returns A Promise resolving to an object containing the key and value of the cookie\n */\nexport const getCookie = async (key: string): Promise<{ key: string, value: string | null }> => {\n const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/cookies?key=${key}`);\n\n if (!res.ok) {\n return { key: key, value: null };\n }\n const json = await res.json();\n\n return json;\n}\n\n/**\n * Sets a cookie value through the server API in client-side code.\n * @param key - The key of the cookie to set\n * @param value - The value to store in the cookie\n * @param maxAge - Optional maximum age of the cookie in seconds. Defaults to DEFAULT_COOKIE_LIMIT if not specified.\n * @returns A Promise that resolves when the cookie has been set\n */\nexport const setCookie = async (key: string, value: string, maxAge?: number): Promise<void> => {\n try {\n\n if (maxAge === undefined) {\n maxAge = DEFAULT_COOKIE_LIMIT;\n }\n\n await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/cookies`, {\n method: 'POST',\n credentials: 'include',\n body: JSON.stringify({\n key: key,\n value: value,\n maxAge: maxAge,\n }),\n });\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `utils.setCookie error: ${error}`\n });\n }\n}\n\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merges multiple class values into a single string using clsx and tailwind-merge.\n * Useful for conditionally applying Tailwind CSS classes.\n * @param inputs - Any number of class values (strings, objects, arrays, etc.)\n * @returns A merged string of class names optimized for Tailwind CSS\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { CREX_TOKEN_HEADER_KEY } from \"@c-rex/constants\";\nimport { getCookie } from \"./memory\";\nimport { call } from \"./utils\";\n\nconst updateToken = async (): Promise<string | null> => {\n try {\n const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/token`, {\n method: 'POST',\n credentials: 'include',\n });\n\n const cookies = response.headers.get(\"set-cookie\");\n if (cookies === null) return null\n\n const aux = cookies.split(`${CREX_TOKEN_HEADER_KEY}=`);\n if (aux.length == 0) return null\n\n const token = aux[1].split(\";\")[0];\n if (token === undefined) throw new Error(\"Token is undefined\");\n\n return token;\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `utils.updateToken error: ${error}`\n });\n return null\n }\n}\n\nexport const manageToken = async (): Promise<string | null> => {\n try {\n\n const hasToken = await getCookie(CREX_TOKEN_HEADER_KEY);\n let token = hasToken.value!;\n\n if (hasToken.value === null) {\n const tokenResult = await updateToken();\n\n if (tokenResult === null) throw new Error(\"Token is undefined\");\n\n token = tokenResult;\n }\n\n return token;\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `utils.manageToken error: ${error}`\n });\n\n return null\n }\n}","import { call, getCookie, setCookie } from \"@c-rex/utils\";\n\n/**\n * Cache class for the CREX application.\n * Provides cookie-based caching functionality for API responses.\n */\nexport class CrexCache {\n /**\n * Retrieves a value from the cache by key.\n * \n * @param key - The cache key to retrieve\n * @returns The cached value as a string, or null if not found\n */\n public async get(key: string): Promise<string | null> {\n const cookie = await getCookie(key);\n\n return cookie.value;\n }\n\n /**\n * Stores a value in the cache with the specified key.\n * Checks if the value size is within cookie size limits (4KB).\n * \n * @param key - The cache key\n * @param value - The value to store\n */\n public async set(key: string, value: string): Promise<void> {\n try {\n const byteLength = new TextEncoder().encode(value).length;\n\n if (byteLength <= 4096) {\n await setCookie(key, value);\n } else {\n console.warn(`Cookie ${key} value is too large to be stored in a single cookie`);\n }\n\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `CrexCache.set error: ${error}`\n });\n }\n }\n\n /**\n * Generates a cache key based on request parameters.\n * Combines URL, method, and optionally params, body, and headers into a single string key.\n * \n * @param options - Request options to generate key from\n * @param options.url - The request URL\n * @param options.method - The HTTP method\n * @param options.body - Optional request body\n * @param options.params - Optional query parameters\n * @param options.headers - Optional request headers\n * @returns A string cache key\n */\n public generateCacheKey({\n url,\n method,\n body,\n params,\n headers,\n }: any) {\n let cacheKey = `${url}-${method}`\n\n if (params !== undefined && Object.keys(params).length > 0) {\n cacheKey += `-${JSON.stringify(params)}`\n }\n if (body !== undefined && Object.keys(body).length > 0) {\n cacheKey += `-${JSON.stringify(body)}`\n }\n if (headers !== undefined && Object.keys(headers).length > 0) {\n cacheKey += `-${JSON.stringify(headers)}`\n }\n\n return cacheKey;\n }\n}","import { ConfigInterface } from \"@c-rex/interfaces\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\n\n/**\n * SDK class for the CREX application.\n * Provides configuration and authentication functionality.\n */\nexport class CrexSDK {\n public userAuthConfig!: any;\n public customerConfig!: ConfigInterface;\n\n /**\n * Retrieves the customer configuration if it hasn't been loaded yet.\n * \n * @private\n */\n private async getConfig() {\n if (!this.customerConfig) {\n this.customerConfig = await getConfigs()\n }\n }\n\n /**\n * Retrieves the user authentication configuration.\n * If not already loaded, it will load the customer configuration and\n * create the auth config based on OIDC settings.\n * \n * @returns The user authentication configuration object\n */\n public async getUserAuthConfig() {\n if (this.userAuthConfig) {\n return this.userAuthConfig;\n }\n\n await this.getConfig();\n\n const user = this.customerConfig.OIDC.user;\n if (user.enabled) {\n this.userAuthConfig = {\n providers: [\n {\n id: \"crex\",\n name: \"CREX\",\n type: \"oauth\",\n clientId: user.id,\n wellKnown: user.issuer,\n clientSecret: user.secret,\n authorization: { params: { scope: user.scope } },\n profile(profile: any) {\n return {\n id: profile.id || \"fake Id\",\n name: profile.name || \"Fake Name\",\n email: profile.email || \"fake Email\",\n image: profile.image || \"fake Image\",\n }\n },\n },\n ]\n }\n };\n\n return this.userAuthConfig;\n }\n}"],"mappings":"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","names":["getConfigs"]}
package/dist/logger.d.mts CHANGED
@@ -1,15 +1,39 @@
1
1
  import winston from 'winston';
2
2
  import { LogLevelType, LogCategoriesType } from '@c-rex/types';
3
3
 
4
+ /**
5
+ * Logger class for the CREX application.
6
+ * Provides logging functionality with multiple transports (Console, Matomo, Graylog).
7
+ */
4
8
  declare class CrexLogger {
5
9
  private customerConfig;
6
10
  logger: winston.Logger;
11
+ /**
12
+ * Initializes the logger instance if it hasn't been initialized yet.
13
+ * Loads customer configuration and creates the logger with appropriate transports.
14
+ *
15
+ * @private
16
+ */
7
17
  private initLogger;
18
+ /**
19
+ * Logs a message with the specified level and optional category.
20
+ *
21
+ * @param options - Logging options
22
+ * @param options.level - The log level (error, warn, info, etc.)
23
+ * @param options.message - The message to log
24
+ * @param options.category - Optional category for the log message
25
+ */
8
26
  log({ level, message, category }: {
9
27
  level: LogLevelType;
10
28
  message: string;
11
29
  category?: LogCategoriesType;
12
30
  }): Promise<void>;
31
+ /**
32
+ * Creates a new Winston logger instance with configured transports.
33
+ *
34
+ * @private
35
+ * @returns A configured Winston logger instance
36
+ */
13
37
  private createLogger;
14
38
  }
15
39
 
package/dist/logger.d.ts CHANGED
@@ -1,15 +1,39 @@
1
1
  import winston from 'winston';
2
2
  import { LogLevelType, LogCategoriesType } from '@c-rex/types';
3
3
 
4
+ /**
5
+ * Logger class for the CREX application.
6
+ * Provides logging functionality with multiple transports (Console, Matomo, Graylog).
7
+ */
4
8
  declare class CrexLogger {
5
9
  private customerConfig;
6
10
  logger: winston.Logger;
11
+ /**
12
+ * Initializes the logger instance if it hasn't been initialized yet.
13
+ * Loads customer configuration and creates the logger with appropriate transports.
14
+ *
15
+ * @private
16
+ */
7
17
  private initLogger;
18
+ /**
19
+ * Logs a message with the specified level and optional category.
20
+ *
21
+ * @param options - Logging options
22
+ * @param options.level - The log level (error, warn, info, etc.)
23
+ * @param options.message - The message to log
24
+ * @param options.category - Optional category for the log message
25
+ */
8
26
  log({ level, message, category }: {
9
27
  level: LogLevelType;
10
28
  message: string;
11
29
  category?: LogCategoriesType;
12
30
  }): Promise<void>;
31
+ /**
32
+ * Creates a new Winston logger instance with configured transports.
33
+ *
34
+ * @private
35
+ * @returns A configured Winston logger instance
36
+ */
13
37
  private createLogger;
14
38
  }
15
39