@c-rex/services 0.1.9 → 0.1.11
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 +55 -97
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +56 -98
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -54,11 +54,11 @@ var LOG_LEVELS = {
|
|
|
54
54
|
var API = {
|
|
55
55
|
MAX_RETRY: 3,
|
|
56
56
|
API_TIMEOUT: 1e4,
|
|
57
|
+
RETRY_DELAY: 500,
|
|
57
58
|
API_HEADERS: {
|
|
58
59
|
"content-Type": "application/json"
|
|
59
60
|
}
|
|
60
61
|
};
|
|
61
|
-
var SDK_CONFIG_KEY = "crex-sdk-config";
|
|
62
62
|
var CONTENT_LANG_KEY = "CONTENT_LANG_KEY";
|
|
63
63
|
var UI_LANG_KEY = "UI_LANG_KEY";
|
|
64
64
|
var FLAGS_BY_LANG = {
|
|
@@ -76,7 +76,7 @@ var RESULT_TYPES = {
|
|
|
76
76
|
PACKAGE,
|
|
77
77
|
FRAGMENT
|
|
78
78
|
};
|
|
79
|
-
var DEFAULT_COOKIE_LIMIT =
|
|
79
|
+
var DEFAULT_COOKIE_LIMIT = 30 * 24 * 60 * 60 * 1e3;
|
|
80
80
|
var CREX_TOKEN_HEADER_KEY = "crex-token";
|
|
81
81
|
var WILD_CARD_OPTIONS = {
|
|
82
82
|
BOTH: "BOTH",
|
|
@@ -139,21 +139,22 @@ var GraylogTransport = class extends import_winston_transport2.default {
|
|
|
139
139
|
* @param configs - The application configuration containing logging settings
|
|
140
140
|
*/
|
|
141
141
|
constructor(configs) {
|
|
142
|
+
if (!configs.logs.graylog.hostname || configs.logs.graylog.port === void 0) {
|
|
143
|
+
throw new Error("Graylog hostname and port must be defined");
|
|
144
|
+
}
|
|
142
145
|
super({
|
|
143
146
|
level: configs.logs.graylog.minimumLevel,
|
|
144
147
|
silent: configs.logs.graylog.silent
|
|
145
148
|
});
|
|
146
149
|
this.configs = configs;
|
|
147
150
|
this.graylogTransport = new import_winston_graylog2.default({
|
|
148
|
-
name:
|
|
149
|
-
|
|
150
|
-
silent: false,
|
|
151
|
+
name: configs.logs.graylog.app,
|
|
152
|
+
silent: configs.logs.graylog.silent,
|
|
151
153
|
handleExceptions: false,
|
|
152
154
|
graylog: {
|
|
153
155
|
servers: [
|
|
154
156
|
{ host: "localhost", port: 12201 },
|
|
155
|
-
{ host:
|
|
156
|
-
//TODO: check the URL => https://log.c-rex.net:12202/gelf" GELF??
|
|
157
|
+
{ host: configs.logs.graylog.hostname, port: configs.logs.graylog.port }
|
|
157
158
|
]
|
|
158
159
|
}
|
|
159
160
|
});
|
|
@@ -186,7 +187,7 @@ var CrexLogger = class {
|
|
|
186
187
|
async initLogger() {
|
|
187
188
|
try {
|
|
188
189
|
if (!this.customerConfig) {
|
|
189
|
-
this.customerConfig = await (0, import_next_cookies.
|
|
190
|
+
this.customerConfig = await (0, import_next_cookies.getServerConfigs)();
|
|
190
191
|
}
|
|
191
192
|
if (!this.logger) {
|
|
192
193
|
this.logger = this.createLogger();
|
|
@@ -229,10 +230,12 @@ var CrexLogger = class {
|
|
|
229
230
|
};
|
|
230
231
|
|
|
231
232
|
// ../core/src/requests.ts
|
|
233
|
+
var import_next_cookies2 = require("@c-rex/utils/next-cookies");
|
|
232
234
|
var CrexApi = class {
|
|
233
235
|
customerConfig;
|
|
234
236
|
apiClient;
|
|
235
237
|
logger;
|
|
238
|
+
publicNextApiUrl;
|
|
236
239
|
/**
|
|
237
240
|
* Initializes the API client if it hasn't been initialized yet.
|
|
238
241
|
* Loads customer configuration, creates the axios instance, and initializes the logger.
|
|
@@ -242,16 +245,10 @@ var CrexApi = class {
|
|
|
242
245
|
async initAPI() {
|
|
243
246
|
this.logger = new CrexLogger();
|
|
244
247
|
if (!this.customerConfig) {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
this.logger.log({
|
|
250
|
-
level: "error",
|
|
251
|
-
message: `utils.initAPI error: Config cookie not available`
|
|
252
|
-
});
|
|
253
|
-
throw new Error("Config cookie not available");
|
|
254
|
-
}
|
|
248
|
+
this.customerConfig = await (0, import_next_cookies2.getServerConfigs)();
|
|
249
|
+
}
|
|
250
|
+
if (!this.publicNextApiUrl) {
|
|
251
|
+
this.publicNextApiUrl = await (0, import_next_cookies2.getClientConfigs)().publicNextApiUrl;
|
|
255
252
|
}
|
|
256
253
|
if (!this.apiClient) {
|
|
257
254
|
this.apiClient = import_axios.default.create({
|
|
@@ -260,19 +257,24 @@ var CrexApi = class {
|
|
|
260
257
|
}
|
|
261
258
|
}
|
|
262
259
|
async getToken() {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
260
|
+
for (let retry = 0; retry < API.MAX_RETRY; retry++) {
|
|
261
|
+
try {
|
|
262
|
+
const response = await fetch(`${this.publicNextApiUrl}/api/token`, {
|
|
263
|
+
method: "POST",
|
|
264
|
+
credentials: "include"
|
|
265
|
+
});
|
|
266
|
+
const { token } = await response.json();
|
|
267
|
+
return token;
|
|
268
|
+
} catch (error) {
|
|
269
|
+
this.logger.log({
|
|
270
|
+
level: "error",
|
|
271
|
+
message: `utils.getToken ${retry + 1}\xBA error when request token. Error: ${error}`
|
|
272
|
+
});
|
|
273
|
+
await new Promise((resolve) => setTimeout(resolve, API.RETRY_DELAY));
|
|
274
|
+
if (retry === API.MAX_RETRY) {
|
|
275
|
+
throw error;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
276
278
|
}
|
|
277
279
|
}
|
|
278
280
|
async manageToken() {
|
|
@@ -352,14 +354,6 @@ var CrexApi = class {
|
|
|
352
354
|
};
|
|
353
355
|
|
|
354
356
|
// ../utils/src/utils.ts
|
|
355
|
-
var _generateShaKey = (input) => {
|
|
356
|
-
let hash = 0;
|
|
357
|
-
for (let i = 0; i < input.length; i++) {
|
|
358
|
-
hash = (hash << 5) - hash + input.charCodeAt(i);
|
|
359
|
-
hash |= 0;
|
|
360
|
-
}
|
|
361
|
-
return Math.abs(hash).toString(16);
|
|
362
|
-
};
|
|
363
357
|
var getCountryCodeByLang = (lang) => {
|
|
364
358
|
const mappedKeys = Object.keys(FLAGS_BY_LANG);
|
|
365
359
|
if (!mappedKeys.includes(lang)) {
|
|
@@ -384,35 +378,6 @@ var formatDateToLocale = (date, locale) => {
|
|
|
384
378
|
var import_clsx = require("clsx");
|
|
385
379
|
var import_tailwind_merge = require("tailwind-merge");
|
|
386
380
|
|
|
387
|
-
// ../utils/src/call.ts
|
|
388
|
-
var call = async (method, params) => {
|
|
389
|
-
const shaKey = _generateShaKey(JSON.stringify({ method, params }));
|
|
390
|
-
const cache = localStorage.getItem(shaKey);
|
|
391
|
-
if (cache !== null) {
|
|
392
|
-
const { data, expireDate } = JSON.parse(cache);
|
|
393
|
-
if (new Date(expireDate) > /* @__PURE__ */ new Date()) {
|
|
394
|
-
return JSON.parse(data);
|
|
395
|
-
} else {
|
|
396
|
-
localStorage.removeItem(shaKey);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
const res = await fetch(`/api/rpc`, {
|
|
400
|
-
method: "POST",
|
|
401
|
-
headers: { "Content-Type": "application/json" },
|
|
402
|
-
body: JSON.stringify({ method, params }),
|
|
403
|
-
credentials: "include"
|
|
404
|
-
});
|
|
405
|
-
const json = await res.json();
|
|
406
|
-
if (!res.ok) throw new Error(json.error || "Unknown error");
|
|
407
|
-
const today = /* @__PURE__ */ new Date();
|
|
408
|
-
const result = {
|
|
409
|
-
data: JSON.stringify(json.data),
|
|
410
|
-
expireDate: new Date(today.getTime() + 1e3 * 60 * 60)
|
|
411
|
-
};
|
|
412
|
-
localStorage.setItem(shaKey, JSON.stringify(result));
|
|
413
|
-
return json.data;
|
|
414
|
-
};
|
|
415
|
-
|
|
416
381
|
// ../utils/src/params.ts
|
|
417
382
|
var createParams = (fieldsList, key = "Fields") => fieldsList.map((item) => ({
|
|
418
383
|
key,
|
|
@@ -480,25 +445,17 @@ var BaseService = class {
|
|
|
480
445
|
headers = {},
|
|
481
446
|
transformer = (response) => response
|
|
482
447
|
}) {
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
url += `?${queryParams}`;
|
|
488
|
-
}
|
|
489
|
-
const response = await this.api.execute({
|
|
490
|
-
url,
|
|
491
|
-
method,
|
|
492
|
-
headers
|
|
493
|
-
});
|
|
494
|
-
return await transformer(response);
|
|
495
|
-
} catch (error) {
|
|
496
|
-
call("CrexLogger.log", {
|
|
497
|
-
level: "error",
|
|
498
|
-
message: `BaseService.request error when request ${path}. Error: ${error}`
|
|
499
|
-
});
|
|
500
|
-
throw error;
|
|
448
|
+
let url = `${this.endpoint}${path}`;
|
|
449
|
+
const queryParams = generateQueryParams(params);
|
|
450
|
+
if (queryParams.length > 0) {
|
|
451
|
+
url += `?${queryParams}`;
|
|
501
452
|
}
|
|
453
|
+
const response = await this.api.execute({
|
|
454
|
+
url,
|
|
455
|
+
method,
|
|
456
|
+
headers
|
|
457
|
+
});
|
|
458
|
+
return await transformer(response);
|
|
502
459
|
}
|
|
503
460
|
};
|
|
504
461
|
|
|
@@ -573,11 +530,11 @@ var DirectoryNodesService = class extends BaseService {
|
|
|
573
530
|
};
|
|
574
531
|
|
|
575
532
|
// src/transforms/documentTypes.ts
|
|
576
|
-
var
|
|
533
|
+
var import_next_cookies3 = require("@c-rex/utils/next-cookies");
|
|
577
534
|
var import_headers2 = require("next/headers");
|
|
578
535
|
var transformDocumentTypes = (data) => {
|
|
579
536
|
const labels = [];
|
|
580
|
-
const config = (0,
|
|
537
|
+
const config = (0, import_next_cookies3.getClientConfigs)();
|
|
581
538
|
const contentLanguage = (0, import_headers2.cookies)().get(CONTENT_LANG_KEY)?.value || config.languageSwitcher.default;
|
|
582
539
|
const language = contentLanguage.split("-")[0];
|
|
583
540
|
data.items.forEach((documentItem) => {
|
|
@@ -613,18 +570,19 @@ var DocumentTypesService = class extends BaseService {
|
|
|
613
570
|
};
|
|
614
571
|
|
|
615
572
|
// src/transforms/information.ts
|
|
616
|
-
var
|
|
573
|
+
var import_next_cookies4 = require("@c-rex/utils/next-cookies");
|
|
617
574
|
var import_headers3 = require("next/headers");
|
|
618
575
|
var import_logger2 = require("@c-rex/core/logger");
|
|
619
576
|
var transformInformationUnits = async (data) => {
|
|
620
577
|
const logger = new import_logger2.CrexLogger();
|
|
621
|
-
const
|
|
578
|
+
const frontEndConfig = await (0, import_next_cookies4.getClientConfigs)();
|
|
579
|
+
const backEndConfig = await (0, import_next_cookies4.getServerConfigs)();
|
|
622
580
|
const filteredTags = {};
|
|
623
581
|
const items = data.items.map((item) => {
|
|
624
582
|
const type = item.class.labels.filter((item2) => item2.language === EN_LANG)[0].value.toUpperCase();
|
|
625
583
|
const files = getFileRenditions({ renditions: item?.renditions });
|
|
626
584
|
let link = `/topics/${item.shortId}`;
|
|
627
|
-
if (
|
|
585
|
+
if (frontEndConfig.results.articlePageLayout == "BLOG") {
|
|
628
586
|
link = `/blog/${item.shortId}`;
|
|
629
587
|
} else if (type == RESULT_TYPES.DOCUMENT) {
|
|
630
588
|
link = `/documents/${item.shortId}`;
|
|
@@ -651,7 +609,7 @@ var transformInformationUnits = async (data) => {
|
|
|
651
609
|
type,
|
|
652
610
|
localeType: "",
|
|
653
611
|
shortId: item.shortId,
|
|
654
|
-
disabled:
|
|
612
|
+
disabled: frontEndConfig.results.disabledResults.includes(type),
|
|
655
613
|
link,
|
|
656
614
|
files
|
|
657
615
|
};
|
|
@@ -663,7 +621,7 @@ var transformInformationUnits = async (data) => {
|
|
|
663
621
|
if (!value || !value.items || value.items.length === 0) {
|
|
664
622
|
continue;
|
|
665
623
|
}
|
|
666
|
-
if (!
|
|
624
|
+
if (!backEndConfig.search.tags.includes(key)) {
|
|
667
625
|
continue;
|
|
668
626
|
}
|
|
669
627
|
const aux = value.items.map((item) => {
|
|
@@ -834,10 +792,10 @@ var InformationUnitsService = class extends BaseService {
|
|
|
834
792
|
};
|
|
835
793
|
|
|
836
794
|
// src/language.ts
|
|
837
|
-
var
|
|
795
|
+
var import_next_cookies5 = require("@c-rex/utils/next-cookies");
|
|
838
796
|
var LanguageService = class extends BaseService {
|
|
839
797
|
constructor() {
|
|
840
|
-
const configs = (0,
|
|
798
|
+
const configs = (0, import_next_cookies5.getClientConfigs)();
|
|
841
799
|
super(configs.languageSwitcher.endpoint);
|
|
842
800
|
}
|
|
843
801
|
/**
|
|
@@ -874,12 +832,12 @@ var LanguageService = class extends BaseService {
|
|
|
874
832
|
};
|
|
875
833
|
|
|
876
834
|
// src/transforms/topics.ts
|
|
877
|
-
var
|
|
835
|
+
var import_next_cookies6 = require("@c-rex/utils/next-cookies");
|
|
878
836
|
var import_headers4 = require("next/headers");
|
|
879
837
|
var import_logger3 = require("@c-rex/core/logger");
|
|
880
838
|
var transformTopics = async (data) => {
|
|
881
839
|
const logger = new import_logger3.CrexLogger();
|
|
882
|
-
const config = (0,
|
|
840
|
+
const config = (0, import_next_cookies6.getClientConfigs)();
|
|
883
841
|
const uiLang = ((0, import_headers4.cookies)().get(UI_LANG_KEY)?.value || config.languageSwitcher.default).toLowerCase();
|
|
884
842
|
const items = data.items.map((item) => {
|
|
885
843
|
const type = item.class.labels.filter((item2) => item2.language === EN_LANG)[0].value.toUpperCase();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../core/src/requests.ts","../../constants/src/index.ts","../../core/src/logger.ts","../../core/src/transports/matomo.ts","../../core/src/transports/graylog.ts","../../utils/src/utils.ts","../../utils/src/classMerge.ts","../../utils/src/call.ts","../../utils/src/params.ts","../../utils/src/renditions.ts","../src/baseService.ts","../src/renditions.ts","../src/directoryNodes.ts","../src/transforms/documentTypes.ts","../src/documentTypes.ts","../src/transforms/information.ts","../src/informationUnits.ts","../src/language.ts","../src/transforms/topics.ts","../src/topics.ts"],"sourcesContent":["export * from \"./renditions\"\nexport * from \"./directoryNodes\"\nexport * from \"./documentTypes\"\nexport * from \"./informationUnits\"\nexport * from \"./language\"\nexport * from \"./topics\"","import axios, { AxiosResponse, Method, AxiosInstance } from \"axios\";\nimport { API, CREX_TOKEN_HEADER_KEY, SDK_CONFIG_KEY } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { cookies } from \"next/headers\";\nimport { CrexLogger } from \"./logger\";\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 logger!: CrexLogger;\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 logger.\n * \n * @private\n */\n private async initAPI() {\n this.logger = new CrexLogger();\n\n if (!this.customerConfig) {\n const aux = cookies().get(SDK_CONFIG_KEY);\n if (aux != undefined) {\n this.customerConfig = JSON.parse(aux.value);\n } else {\n this.logger.log({\n level: \"error\",\n message: `utils.initAPI error: Config cookie not available`\n });\n\n throw new Error(\"Config cookie not available\");\n }\n }\n\n if (!this.apiClient) {\n this.apiClient = axios.create({\n baseURL: this.customerConfig.baseUrl,\n })\n }\n }\n\n private async getToken() {\n try {\n const response = await fetch(`${this.customerConfig.publicNextApiUrl}/api/token`, {\n method: 'POST',\n credentials: 'include',\n });\n\n const { token } = await response.json();\n\n return token;\n } catch (error) {\n this.logger.log({\n level: \"error\",\n message: `utils.getToken error: ${error}`\n });\n\n throw error\n }\n }\n\n private async manageToken() {\n try {\n let token = \"\";\n const hasToken = cookies().get(CREX_TOKEN_HEADER_KEY);\n\n if (hasToken == undefined || hasToken.value === null) {\n const tokenResult = await this.getToken();\n\n if (tokenResult === null) throw new Error(\"Token is undefined\");\n\n token = tokenResult;\n } else {\n token = hasToken.value;\n }\n\n return token;\n } catch (error) {\n this.logger.log({\n level: \"error\",\n message: `CrexAPI.manageToken error: ${error}`\n });\n\n throw error\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 if (this.customerConfig.OIDC.client.enabled) {\n const token = await this.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 this.logger.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 BLOG_TYPE_AND_LINK = \"blog\";\nexport const DOCUMENTS_TYPE_AND_LINK = \"documents\";\n\nexport const TOPIC = \"TOPIC\";\nexport const DOCUMENT = \"DOCUMENT\";\nexport const PACKAGE = \"PACKAGE\";\nexport const FRAGMENT = \"FRAGMENT\";\n\nexport const RESULT_TYPES = {\n TOPIC: TOPIC,\n DOCUMENT: DOCUMENT,\n PACKAGE: PACKAGE,\n FRAGMENT: FRAGMENT\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\";\n\nexport const WILD_CARD_OPTIONS = {\n BOTH: \"BOTH\",\n END: \"END\",\n START: \"START\",\n NONE: \"NONE\",\n} as const;\n\nexport const OPERATOR_OPTIONS = {\n AND: \"AND\",\n OR: \"OR\",\n} as const;\n\nexport const ARTICLE_PAGE_LAYOUT = {\n BLOG: \"BLOG\",\n DOCUMENT: \"DOCUMENT\",\n} as const;\n\nexport const DEVICE_OPTIONS = {\n MOBILE: \"mobile\",\n TABLET: \"tablet\",\n DESKTOP: \"desktop\",\n}\nexport const BREAKPOINTS = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};","import winston from \"winston\";\nimport { MatomoTransport } from \"./transports/matomo\";\nimport { GraylogTransport } from \"./transports/graylog\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { LOG_LEVELS } from \"@c-rex/constants\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\n\n/**\n * Logger class for the CREX application.\n * Provides logging functionality with multiple transports (Console, Matomo, Graylog).\n */\nexport class CrexLogger {\n private customerConfig!: ConfigInterface;\n public logger!: winston.Logger;\n\n /**\n * Initializes the logger instance if it hasn't been initialized yet.\n * Loads customer configuration and creates the logger with appropriate transports.\n * \n * @private\n */\n private async initLogger() {\n try {\n if (!this.customerConfig) {\n this.customerConfig = await getConfigs();\n }\n if (!this.logger) {\n this.logger = this.createLogger();\n }\n } catch (error) {\n console.error(\"Error initializing logger:\", error);\n }\n }\n\n /**\n * Logs a message with the specified level and optional category.\n * \n * @param options - Logging options\n * @param options.level - The log level (error, warn, info, etc.)\n * @param options.message - The message to log\n * @param options.category - Optional category for the log message\n */\n public async log({ level, message, category }: {\n level: LogLevelType,\n message: string,\n category?: LogCategoriesType\n }) {\n await this.initLogger();\n this.logger.log(level, message, category);\n }\n\n /**\n * Creates a new Winston logger instance with configured transports.\n * \n * @private\n * @returns A configured Winston logger instance\n */\n private createLogger() {\n return winston.createLogger({\n levels: LOG_LEVELS,\n transports: [\n new winston.transports.Console({\n level: this.customerConfig.logs.console.minimumLevel,\n silent: this.customerConfig.logs.console.silent,\n }),\n new MatomoTransport(this.customerConfig),\n new GraylogTransport(this.customerConfig),\n ],\n });\n }\n}","import Transport from \"winston-transport\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { ALL } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\n\n/**\n * Winston transport for sending logs to Matomo analytics.\n * Extends the base Winston transport with Matomo-specific functionality.\n */\nexport class MatomoTransport extends Transport {\n public matomoTransport: any;\n private configs: ConfigInterface;\n\n /**\n * Creates a new instance of MatomoTransport.\n * \n * @param configs - The application configuration containing logging settings\n */\n constructor(configs: ConfigInterface) {\n super({\n level: configs.logs.matomo.minimumLevel,\n silent: configs.logs.matomo.silent,\n });\n\n this.matomoTransport = new Transport();\n this.configs = configs;\n }\n\n /**\n * Logs a message to Matomo if the message category is included in the configured categories.\n * \n * @param info - The log information including level, message, and category\n * @param callback - Callback function to execute after logging\n */\n log(\n info: { level: LogLevelType, message: string, category: LogCategoriesType },\n callback: () => void,\n ): void {\n const matomoCategory = this.configs.logs.matomo.categoriesLevel\n\n if (matomoCategory.includes(info.category) || matomoCategory.includes(ALL)) {\n this.matomoTransport.log(info, callback);\n }\n }\n}\n","import Transport from \"winston-transport\";\nimport Graylog2Transport from \"winston-graylog2\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { ALL } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\n\n/**\n * Winston transport for sending logs to Graylog.\n * Extends the base Winston transport with Graylog-specific functionality.\n */\nexport class GraylogTransport extends Transport {\n public graylogTransport: any;\n private configs: ConfigInterface\n\n /**\n * Creates a new instance of GraylogTransport.\n * \n * @param configs - The application configuration containing logging settings\n */\n constructor(configs: ConfigInterface) {\n super({\n level: configs.logs.graylog.minimumLevel,\n silent: configs.logs.graylog.silent,\n });\n\n this.configs = configs;\n this.graylogTransport = new Graylog2Transport({\n name: \"crex.net.documentation\",\n //name: \"crex.net.blog\",\n silent: false,\n handleExceptions: false,\n graylog: {\n servers: [\n { host: \"localhost\", port: 12201 },\n { host: \"https://log.c-rex.net\", port: 12202 }\n\n //TODO: check the URL => https://log.c-rex.net:12202/gelf\" GELF??\n ],\n },\n });\n }\n\n /**\n * Logs a message to Graylog if the message category is included in the configured categories.\n * \n * @param info - The log information including level, message, and category\n * @param callback - Callback function to execute after logging\n */\n log(\n info: { level: LogLevelType, message: string, category: LogCategoriesType },\n callback: () => void,\n ): void {\n const graylogCategory = this.configs.logs.graylog.categoriesLevel\n\n if (graylogCategory.includes(info.category) || graylogCategory.includes(ALL)) {\n this.graylogTransport.log(info, callback);\n }\n }\n}\n","import { FLAGS_BY_LANG } from \"@c-rex/constants\";\nimport { AvailableVersionsInterface, informationUnitsResponseItem } from \"@c-rex/interfaces\";\n\nexport const _generateShaKey = (input: string): string => {\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n hash = (hash << 5) - hash + input.charCodeAt(i);\n hash |= 0;\n }\n return Math.abs(hash).toString(16);\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 formatDateToLocale = (date: string, locale: string): string => {\n if (typeof date !== 'string' || !date) {\n return date;\n }\n\n const dateAux = new Date(date);\n return new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: 'long',\n year: 'numeric'\n }).format(dateAux);\n}\n\nexport const createAvailableVersionList = (\n versions: informationUnitsResponseItem[],\n articleLang: string,\n type: string\n): AvailableVersionsInterface[] => {\n\n const availableVersions = versions.map(item => {\n return {\n shortId: item.shortId,\n active: item.language === articleLang,\n lang: item.language,\n country: item.language.split(\"-\")[1],\n link: `/${type}/${item.shortId}`,\n }\n }).sort((a, b) => {\n if (a.lang < b.lang) return -1;\n if (a.lang > b.lang) return 1;\n return 0;\n }) as AvailableVersionsInterface[];\n\n return availableVersions;\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 { _generateShaKey } from \"./utils\"\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\n */\nexport const call = async<T = unknown>(method: string, params?: any): Promise<T> => {\n type result = {\n data: string,\n expireDate: Date,\n }\n\n const shaKey = _generateShaKey(JSON.stringify({ method, params }))\n const cache = localStorage.getItem(shaKey)\n\n if (cache !== null) {\n const { data, expireDate } = JSON.parse(cache) as result\n\n if (new Date(expireDate) > new Date()) {\n return JSON.parse(data) as T\n } else {\n localStorage.removeItem(shaKey)\n }\n }\n\n const res = await fetch(`/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 const today = new Date()\n const result: result = {\n data: JSON.stringify(json.data),\n expireDate: new Date(today.getTime() + 1000 * 60 * 60),\n }\n\n localStorage.setItem(shaKey, JSON.stringify(result))\n\n return json.data;\n}","import { QueryParams } from '@c-rex/types';\n\n/**\n * Creates an array of parameter objects from a list of field values.\n * @param fieldsList - Array of field values to transform into parameter objects\n * @param key - The key to use for each parameter object (defaults to \"Fields\")\n * @returns An array of objects with key-value pairs\n */\nexport const createParams = (fieldsList: string[], key: string = \"Fields\") =>\n fieldsList.map((item) => ({\n key: key,\n value: item,\n }));\n\n/**\n * Generates a URL query string from an array of parameter objects.\n * @param params - Array of QueryParams objects containing key-value pairs\n * @returns A URL-encoded query string\n */\nexport const generateQueryParams = (params: QueryParams[]): string => {\n const queryParams = params\n .map((param) => `${encodeURIComponent(param.key)}=${encodeURIComponent(param.value)}`)\n .join(\"&\");\n return queryParams;\n};\n","import { informationUnitsRenditions } from \"@c-rex/interfaces\";\nimport { DocumentsType } from \"@c-rex/types\";\n\n\nexport const getFileRenditions = ({ renditions }: { renditions: informationUnitsRenditions[] }): DocumentsType => {\n if (renditions == undefined || renditions.length == 0) {\n return {};\n }\n\n const filteredRenditions = renditions.filter(\n (item) => item.format != \"application/xhtml+xml\" && item.format != \"application/json\" && item.format != \"application/llm+xml\"\n );\n\n if (filteredRenditions.length == 0 || filteredRenditions[0] == undefined) {\n return {};\n }\n\n const result: {\n [key: string]: {\n view: string;\n download: string;\n }\n } = {}\n\n filteredRenditions.forEach((item) => {\n const key = item.format\n\n if (result[key] == undefined) {\n result[key] = {\n view: \"\",\n download: \"\"\n }\n }\n\n result[key].download = item.links.filter((link) => link.rel == \"download\")[0]?.href\n result[key].view = item.links.filter((link) => link.rel == \"view\")[0]?.href\n })\n\n return result\n}","import { CrexApi } from \"@c-rex/core\";\nimport { QueryParams } from \"@c-rex/types\";\nimport { call, generateQueryParams } from \"@c-rex/utils\";\nimport { Method } from \"axios\";\n\n/**\n * Base service class that provides common functionality for API interactions.\n * All specific service classes extend this base class.\n */\nexport class BaseService {\n protected api: CrexApi;\n private endpoint: string;\n\n /**\n * Creates a new instance of BaseService.\n * \n * @param endpoint - The API endpoint URL for this service\n */\n constructor(endpoint: string) {\n this.api = new CrexApi();\n this.endpoint = endpoint;\n }\n\n /**\n * Makes an API request to the specified endpoint.\n * \n * @param options - Request configuration options\n * @param options.path - Optional path to append to the endpoint\n * @param options.params - Optional query parameters to include in the request\n * @param options.method - HTTP method to use (defaults to 'get')\n * @param options.transformer - Optional function to transform the response data\n * @returns The response data, optionally transformed\n * @throws Error if the API request fails\n */\n protected async request<T>({\n path = \"\",\n method = \"get\",\n params = [],\n headers = {},\n transformer = (response: any) => response,\n }: {\n path?: string,\n method?: Method,\n params?: QueryParams[],\n headers?: any,\n transformer?: (data: any) => T,\n }): Promise<T> {\n try {\n let url = `${this.endpoint}${path}`;\n\n const queryParams = generateQueryParams(params);\n if (queryParams.length > 0) {\n url += `?${queryParams}`;\n }\n\n const response = await this.api.execute({\n url,\n method,\n headers,\n })\n\n return await transformer(response);\n\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `BaseService.request error when request ${path}. Error: ${error}`\n });\n\n throw error;\n }\n }\n}\n\n","import { BaseService } from \"./baseService\";\nimport { informationUnitsRenditions } from \"@c-rex/interfaces\";\n\n/**\n * Service for interacting with renditions in the API.\n * Provides methods to retrieve and process different types of renditions.\n */\nexport class RenditionsService extends BaseService {\n constructor() {\n super(\"Renditions/\");\n }\n\n /**\n * Retrieves the HTML rendition from a list of renditions.\n * Filters for renditions with format 'application/xhtml+xml' and rel 'view'.\n * \n * @param renditions - Array of rendition objects to process\n * @returns A promise that resolves to the HTML content as a string, or empty string if no suitable rendition is found\n * @throws Error if the API request fails\n */\n public async getHTMLRendition({ renditions }: { renditions: informationUnitsRenditions[] }): Promise<string> {\n const filteredRenditions = renditions.filter(\n (item) => item.format == \"application/xhtml+xml\",\n );\n\n if (filteredRenditions.length == 0 || filteredRenditions[0] == undefined) return \"\";\n const item = filteredRenditions[0];\n const filteredLinks = item.links.filter((item) => item.rel == \"view\");\n\n if (filteredLinks.length == 0 || filteredLinks[0] == undefined) return \"\";\n const url = filteredLinks[0].href;\n const response = await this.api.execute({\n url,\n method: \"get\",\n headers: {\n Accept: \"application/xhtml+xml\",\n },\n })\n\n return response as string;\n }\n}","import { BaseService } from \"./baseService\";\nimport { createParams } from \"@c-rex/utils\";\nimport { DirectoryNodes, DirectoryNodesResponse } from \"@c-rex/interfaces\";\n\n/**\n * Service for interacting with directory nodes in the API.\n * Provides methods to retrieve directory node information.\n */\nexport class DirectoryNodesService extends BaseService {\n constructor() {\n super(\"DirectoryNodes/\");\n }\n\n /**\n * Retrieves a specific directory node by its ID.\n * \n * @param id - The unique identifier of the directory node\n * @returns A promise that resolves to the directory node data\n * @throws Error if the API request fails\n */\n public async getItem(id: string): Promise<DirectoryNodes> {\n return await this.request({\n path: id,\n });\n }\n\n /**\n * Retrieves a list of directory nodes based on specified filters.\n * \n * @param options - Options for filtering the directory nodes list\n * @param options.filters - Optional array of filter strings to apply\n * @returns A promise that resolves to the directory nodes response\n * @throws Error if the API request fails\n */\n public async getList({\n filters = [],\n }: {\n filters?: string[],\n }): Promise<DirectoryNodesResponse> {\n\n const remainFilters = createParams(filters, \"Filter\");\n\n return await this.request({\n params: {\n ...remainFilters,\n },\n });\n }\n}\n","import { CONTENT_LANG_KEY } from \"@c-rex/constants\";\nimport { DefaultRequest } from \"@c-rex/interfaces\";\nimport { DocumentTypesItem } from \"@c-rex/interfaces\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from \"next/headers\";\n\nexport const transformDocumentTypes = (data: DefaultRequest<DocumentTypesItem>) => {\n const labels: { shortId: string, label: string }[] = [];\n const config = getConfigs();\n const contentLanguage = cookies().get(CONTENT_LANG_KEY)?.value || config.languageSwitcher.default;\n const language = contentLanguage.split(\"-\")[0];\n\n data.items.forEach((documentItem) => {\n const label = documentItem.labels.find((item) => item.language.toLowerCase() === language.toLowerCase());\n\n labels.push({\n shortId: documentItem.shortId,\n label: label ? label.value : \"\"\n })\n });\n\n return labels;\n};\n","import { transformDocumentTypes } from \"./transforms/documentTypes\";\nimport { BaseService } from \"./baseService\";\n\n/**\n * Service for interacting with document types in the API.\n * Provides methods to retrieve document type information.\n */\nexport class DocumentTypesService extends BaseService {\n constructor() {\n super(\"DocumentTypes/\");\n }\n\n /**\n * Retrieves document type labels for the specified fields.\n * \n * @returns A promise that resolves to an array of label strings\n * @throws Error if the API request fails\n */\n public async getLabels(): Promise<{ shortId: string, label: string }[]> {\n return await this.request({\n params: [{\n key: \"sparqlWhere\",\n value: \"?iu iirds:is-applicable-for-document-type ?s . ?iu iirds:has-topic-type <https://www.c-rex.net/iirds/td#Blogpost>\"\n }],\n transformer: transformDocumentTypes,\n });\n }\n}\n","import { CONTENT_LANG_KEY, EN_LANG, RESULT_TYPES } from \"@c-rex/constants\";\nimport {\n DefaultRequest,\n informationUnitsResponse,\n informationUnitsItems,\n} from \"@c-rex/interfaces\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from 'next/headers';\nimport { getFileRenditions } from \"@c-rex/utils\";\nimport { CrexLogger } from '@c-rex/core/logger';\nimport { AutocompleteSuggestion } from \"@c-rex/interfaces\";\n\nexport const transformInformationUnits = async (data: DefaultRequest<informationUnitsItems>): Promise<informationUnitsResponse> => {\n const logger = new CrexLogger()\n const config = await getConfigs();\n const filteredTags: any = {}\n\n const items = data.items.map((item) => {\n const type = item.class.labels.filter((item) => item.language === EN_LANG)[0].value.toUpperCase();\n const files = getFileRenditions({ renditions: item?.renditions });\n\n let link = `/topics/${item.shortId}`;\n\n if (config.results.articlePageLayout == \"BLOG\") {\n link = `/blog/${item.shortId}`\n } else if (type == RESULT_TYPES.DOCUMENT) {\n link = `/documents/${item.shortId}`;\n }\n\n let title = \"NO TITLE\"\n let language = \"NO LANGUAGE\"\n\n try {\n if (item.titles) {\n title = item.titles[0].value\n language = item.titles[0].language\n } else {\n title = item.labels[0].value\n language = item.labels[0].language\n }\n } catch {\n logger.log({\n level: \"error\",\n message: `No label or title on item ${item.shortId}`\n })\n }\n\n return {\n language: language,\n title: title,\n type: type,\n localeType: \"\",\n shortId: item.shortId,\n disabled: config.results.disabledResults.includes(type as any),\n link: link,\n files\n }\n });\n\n if (data.tags) {\n const contentLang = (cookies().get(CONTENT_LANG_KEY)?.value || EN_LANG).toLowerCase()\n const splittedContentLang = contentLang.split(\"-\")[0];\n\n for (const [key, value] of Object.entries(data.tags)) {\n\n if (!value || !value.items || value.items.length === 0) {\n continue;\n }\n if (!config.search.tags.includes(key)) {\n continue;\n }\n\n const aux = value.items.map(item => {\n if (item?.shortId === undefined) return null\n if (Number(item.hits) === 0) return null\n if (item?.labels === undefined || item?.labels.length === 0) {\n logger.log({\n level: \"warning\",\n message: `No labels on item with id ${item.shortId} from category ${key}`\n })\n return null;\n }\n\n let label = \"\"\n\n for (const labelItem of item.labels) {\n if (labelItem.language === undefined) {\n logger.log({\n level: \"info\",\n message: `No language on label ${labelItem.value} from category ${key}`\n })\n label = labelItem.value\n break;\n }\n\n if (labelItem.language.toLowerCase() === contentLang || labelItem.language.toLowerCase() === splittedContentLang) {\n label = labelItem.value\n break;\n }\n\n label = labelItem.value\n\n //TODO: fallback in english\n }\n\n return {\n hits: item.hits,\n total: item.total,\n label: label,\n active: false,\n shortId: item.shortId,\n }\n }).filter((item) => item !== null)\n\n if (aux.length === 0) {\n continue;\n }\n\n filteredTags[key] = aux;\n }\n }\n\n return {\n tags: filteredTags,\n items: items,\n pageInfo: data.pageInfo,\n };\n};\n\nexport const transformSuggestions = (data: AutocompleteSuggestion, query: string) => {\n const suggestions: string[] = []\n const comparableList: string[] = []\n\n data.suggestions.forEach((item) => {\n suggestions.push(item.value);\n comparableList.push(item.value.toLowerCase())\n })\n\n if (!comparableList.includes(query.toLowerCase())) {\n return [query, ...suggestions];\n }\n\n return suggestions\n}","import {\n AutocompleteSuggestion,\n informationUnitsResponse,\n informationUnitsItems,\n} from \"@c-rex/interfaces\";\nimport { transformInformationUnits, transformSuggestions } from \"./transforms/information\";\nimport { createParams } from \"@c-rex/utils\";\nimport { BaseService } from \"./baseService\";\nimport { OperatorType, WildCardType } from \"@c-rex/types\";\nimport { OPERATOR_OPTIONS, WILD_CARD_OPTIONS } from \"@c-rex/constants\";\n\n/**\n * Service for interacting with information units in the API.\n * Provides methods to retrieve and search information units.\n */\nexport class InformationUnitsService extends BaseService {\n constructor() {\n super(\"InformationUnits/\");\n }\n\n /**\n * Retrieves a list of information units based on specified criteria.\n * \n * @param options - Options for filtering and paginating the information units list\n * @param options.queries - Optional search query string\n * @param options.page - Optional page number for pagination (defaults to 1)\n * @param options.fields - Optional array of fields to include in the response\n * @param options.filters - Optional array of filter strings to apply\n * @param options.languages - Optional array of language codes to filter by\n * @returns A promise that resolves to the information units response\n * @throws Error if the API request fails\n */\n public async getList({\n queries = \"\",\n page = 1,\n fields = [],\n filters = [],\n tags = [],\n restrict = [],\n languages = [],\n wildcard = WILD_CARD_OPTIONS.BOTH,\n operator = OPERATOR_OPTIONS.AND,\n like = false,\n }: {\n queries?: string,\n page?: number,\n filters?: string[],\n restrict?: string[],\n fields?: string[],\n tags?: string[],\n languages?: string[],\n wildcard?: WildCardType,\n operator?: OperatorType,\n like?: boolean,\n }): Promise<informationUnitsResponse> {\n const remainFields = createParams(fields, \"Fields\");\n const remainFilters = createParams(filters, \"Filter\");\n const restrictions = createParams(restrict, \"Restrict\");\n const remainTags = createParams(tags, \"Tags\");\n const languageParam = `VALUES ?lang { ${languages.map(lang => `\"${lang}\"`).join(\" \")} } ?s iirds:language ?lang .`\n\n const params = [\n { key: \"pageSize\", value: \"12\" },\n { key: \"wildcard\", value: wildcard.toLowerCase() },\n { key: \"PageNumber\", value: page.toString() },\n { key: \"Operator\", value: operator },\n { key: \"Like\", value: like.toString() },\n ...remainTags,\n ...remainFields,\n ...remainFilters,\n ...restrictions\n ];\n if (languages.length > 0) {\n params.push({ key: \"sparqlWhere\", value: languageParam });\n }\n if (queries.length > 0) {\n params.push(\n { key: \"Query\", value: queries },\n );\n }\n\n return await this.request({\n params: params,\n transformer: transformInformationUnits\n });\n }\n\n /**\n * Retrieves a specific information unit by its ID.\n * Includes renditions, directory nodes, version information, titles, languages, and labels.\n * \n * @param options - Options for retrieving the information unit\n * @param options.id - The unique identifier of the information unit\n * @returns A promise that resolves to the information unit data\n * @throws Error if the API request fails\n */\n public async getItem({ id, shouldGetAllFields = false }: { id: string, shouldGetAllFields?: boolean }): Promise<informationUnitsItems> {\n const params = []\n\n if (!shouldGetAllFields) {\n params.push(\n { key: \"Fields\", value: \"renditions\" },\n { key: \"Fields\", value: \"directoryNodes\" },\n { key: \"Fields\", value: \"versionOf\" },\n { key: \"Fields\", value: \"titles\" },\n { key: \"Fields\", value: \"languages\" },\n { key: \"Fields\", value: \"labels\" },\n { key: \"Fields\", value: \"packages\" },\n { key: \"Fields\", value: \"created\" },\n { key: \"Fields\", value: \"revision\" },\n );\n }\n\n return await this.request({\n path: id,\n params,\n });\n }\n\n /**\n * Retrieves autocomplete suggestions based on a query prefix.\n * \n * @param options - Options for retrieving suggestions\n * @param options.query - The query prefix to get suggestions for\n * @param options.language - The language of the suggestions\n * @returns A promise that resolves to an array of suggestion strings\n * @throws Error if the API request fails\n */\n public async getSuggestions(\n { query, language }: { query: string, language: string }\n ): Promise<string[]> {\n\n return await this.request({\n path: 'Suggestions',\n params: [\n { key: \"prefix\", value: query },\n { key: \"lang\", value: language },\n ],\n transformer: (data: AutocompleteSuggestion) => transformSuggestions(data, query)\n });\n }\n}\n","import { LanguageAndCountries } from \"@c-rex/interfaces\";\nimport { BaseService } from \"./baseService\";\nimport { getCountryCodeByLang } from \"@c-rex/utils\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\n\n/**\n * Service for interacting with language-related functionality in the API.\n * Provides methods to retrieve language and country information.\n */\nexport class LanguageService extends BaseService {\n constructor() {\n const configs = getConfigs()\n super(configs.languageSwitcher.endpoint);\n }\n\n /**\n * Retrieves a list of available languages and their associated countries.\n * Transforms the API response to include language code, country code, and original value.\n * \n * @returns A promise that resolves to an array of language and country objects\n * @throws Error if the API request fails\n */\n public async getLanguagesAndCountries(): Promise<LanguageAndCountries[]> {\n return await this.request({\n transformer: (data: { value: string; score: number }[]) => {\n const countryCodeList = data.map((item) => {\n /*\n api -> en, en-US\n default -> en-US. Then use EN-US \n\n api -> en\n default -> en-US. Then use EN\n */\n //should be abble to handle this items: en-US, en, pt, pt-PT, pt-BR \n\n const splittedValue = item.value.split(\"-\")\n const lang = splittedValue[0]\n let country = splittedValue[0]\n\n if (splittedValue.length > 1) {\n country = splittedValue[1]\n } else {\n country = getCountryCodeByLang(lang)\n }\n\n return {\n country: country,\n lang: lang,\n value: item.value,\n }\n })\n\n return countryCodeList.sort((a, b) => {\n return a.value.localeCompare(b.value)\n })\n },\n });\n }\n}\n","import { EN_LANG, RESULT_TYPES, UI_LANG_KEY } from \"@c-rex/constants\";\nimport { DefaultRequest, TopicsRequestItem, DefaultResponse, TopicsResponseItem } from \"@c-rex/interfaces\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from 'next/headers';\nimport { CrexLogger } from '@c-rex/core/logger';\nimport { formatDateToLocale } from \"@c-rex/utils\";\n\nexport const transformTopics = async (data: DefaultRequest<TopicsRequestItem>): Promise<DefaultResponse<TopicsResponseItem, null>> => {\n const logger = new CrexLogger()\n const config = getConfigs();\n const uiLang = (cookies().get(UI_LANG_KEY)?.value || config.languageSwitcher.default).toLowerCase()\n\n const items = data.items.map(item => {\n const type = item.class.labels.filter((item) => item.language === EN_LANG)[0].value.toUpperCase();\n\n let link = `/topics/${item.shortId}`;\n\n if (config.results.articlePageLayout == \"BLOG\") {\n link = `/blog/${item.shortId}`\n } else if (type == RESULT_TYPES.DOCUMENT) {\n link = `/documents/${item.shortId}`;\n }\n\n let title = \"NO TITLE\"\n let language = \"NO LANGUAGE\"\n\n try {\n if (item.titles) {\n title = item.titles[0].value\n language = item.titles[0].language\n } else {\n title = item.labels[0].value\n language = item.labels[0].language\n }\n } catch {\n logger.log({\n level: \"error\",\n message: `No label or title on item ${item.shortId}`\n })\n }\n\n let renditionUrl = \"\"\n const renditions = item.renditions.filter(item => item.format == \"application/xhtml+xml\");\n if (renditions.length > 0 || renditions[0] !== undefined) {\n const filteredLinks = renditions[0].links.filter((renditionItem) => renditionItem.rel == \"view\");\n if (filteredLinks.length > 0 || filteredLinks[0] !== undefined) {\n renditionUrl = filteredLinks[0].href;\n };\n };\n\n let categoryType = type\n if (item.applicableForTypes && item.applicableForTypes.length > 0) {\n const splittedContentLang = uiLang.split(\"-\")[0];\n categoryType = item.applicableForTypes[0].labels.find(item => item.language === splittedContentLang)?.value || categoryType;\n }\n\n return {\n language: language,\n title: title,\n type: categoryType,\n localeType: \"\",\n shortId: item.shortId,\n created: formatDateToLocale(item.created, uiLang),\n disabled: config.results.disabledResults.includes(type as any),\n link: link,\n renditionUrl: renditionUrl,\n image: null,\n description: null,\n }\n })\n\n return {\n tags: null,\n items: items,\n pageInfo: data.pageInfo,\n };\n};\n","import { transformTopics } from \"./transforms/topics\";\nimport { createParams } from \"@c-rex/utils\";\nimport { BaseService } from \"./baseService\";\nimport { OperatorType, WildCardType } from \"@c-rex/types\";\nimport { OPERATOR_OPTIONS, WILD_CARD_OPTIONS } from \"@c-rex/constants\";\nimport { DefaultResponse, TopicsResponseItem } from \"@c-rex/interfaces\";\n\ntype getListProps = {\n queries?: string,\n page?: number,\n filters?: string[],\n fields?: string[],\n languages?: string[],\n wildcard?: WildCardType,\n operator?: OperatorType,\n like?: boolean,\n pageSize?: number\n}\n\n\n/**\n * Service for interacting with information units in the API.\n * Provides methods to retrieve and search information units.\n */\nexport class TopicsService extends BaseService {\n constructor() {\n super(\"Topics/\");\n }\n\n /**\n * Retrieves a list of topics based on specified criteria.\n * \n * @param options - Options for filtering and paginating the topics list\n * @param options.queries - Optional search query string\n * @param options.page - Optional page number for pagination (defaults to 1)\n * @param options.fields - Optional array of fields to include in the response\n * @param options.filters - Optional array of filter strings to apply\n * @param options.languages - Optional array of language codes to filter by\n * @returns A promise that resolves to the information units response\n * @throws Error if the API request fails\n */\n public async getList({\n queries = \"\",\n page = 1,\n fields = [],\n filters = [],\n languages = [],\n wildcard = WILD_CARD_OPTIONS.BOTH,\n operator = OPERATOR_OPTIONS.AND,\n pageSize = 12\n }: getListProps): Promise<DefaultResponse<TopicsResponseItem, null>> {\n const remainFields = createParams(fields, \"Fields\");\n const remainFilters = createParams(filters, \"Filter\");\n\n const params = [\n { key: \"pageSize\", value: pageSize.toString() },\n { key: \"PageNumber\", value: page.toString() },\n { key: \"Sort\", value: \"-created;-score\" },\n { key: \"Operator\", value: operator },\n { key: \"wildcard\", value: wildcard.toLowerCase() },\n ...remainFields,\n ...remainFilters,\n ];\n\n if (languages.length > 0) {\n const languageParam = `VALUES ?lang { ${languages.map(lang => `\"${lang}\"`).join(\" \")} } ?s iirds:language ?lang .`\n params.push({ key: \"sparqlWhere\", value: languageParam });\n }\n if (queries.length > 0) {\n params.push(\n { key: \"Query\", value: queries },\n );\n }\n\n return await this.request({\n params: params,\n transformer: transformTopics\n });\n }\n}\n"],"mappings":"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","names":["Transport","import_winston_transport","Transport","Graylog2Transport","winston","axios","item","import_next_cookies","import_headers","import_next_cookies","import_headers","import_logger","item","import_next_cookies","import_next_cookies","import_headers","import_logger","item"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../core/src/requests.ts","../../constants/src/index.ts","../../core/src/logger.ts","../../core/src/transports/matomo.ts","../../core/src/transports/graylog.ts","../../utils/src/utils.ts","../../utils/src/classMerge.ts","../../utils/src/params.ts","../../utils/src/renditions.ts","../src/baseService.ts","../src/renditions.ts","../src/directoryNodes.ts","../src/transforms/documentTypes.ts","../src/documentTypes.ts","../src/transforms/information.ts","../src/informationUnits.ts","../src/language.ts","../src/transforms/topics.ts","../src/topics.ts"],"sourcesContent":["export * from \"./renditions\"\nexport * from \"./directoryNodes\"\nexport * from \"./documentTypes\"\nexport * from \"./informationUnits\"\nexport * from \"./language\"\nexport * from \"./topics\"","import axios, { AxiosResponse, Method, AxiosInstance } from \"axios\";\nimport { API, CREX_TOKEN_HEADER_KEY, SDK_CONFIG_KEY } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { cookies } from \"next/headers\";\nimport { CrexLogger } from \"./logger\";\nimport { getServerConfigs, getClientConfigs } from \"@c-rex/utils/next-cookies\";\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 logger!: CrexLogger;\n private publicNextApiUrl!: string;\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 logger.\n * \n * @private\n */\n private async initAPI() {\n this.logger = new CrexLogger();\n\n if (!this.customerConfig) {\n this.customerConfig = await getServerConfigs();\n }\n\n if (!this.publicNextApiUrl) {\n this.publicNextApiUrl = await getClientConfigs().publicNextApiUrl;\n }\n\n if (!this.apiClient) {\n this.apiClient = axios.create({\n baseURL: this.customerConfig.baseUrl,\n })\n }\n }\n\n private async getToken() {\n for (let retry = 0; retry < API.MAX_RETRY; retry++) {\n try {\n const response = await fetch(`${this.publicNextApiUrl}/api/token`, {\n method: 'POST',\n credentials: 'include',\n });\n\n const { token } = await response.json();\n\n return token;\n } catch (error) {\n this.logger.log({\n level: \"error\",\n message: `utils.getToken ${retry + 1}º error when request token. Error: ${error}`\n });\n\n await new Promise(resolve => setTimeout(resolve, API.RETRY_DELAY));\n\n if (retry === API.MAX_RETRY) {\n throw error;\n }\n }\n }\n }\n\n private async manageToken() {\n try {\n let token = \"\";\n const hasToken = cookies().get(CREX_TOKEN_HEADER_KEY);\n\n if (hasToken == undefined || hasToken.value === null) {\n const tokenResult = await this.getToken();\n\n if (tokenResult === null) throw new Error(\"Token is undefined\");\n\n token = tokenResult;\n } else {\n token = hasToken.value;\n }\n\n return token;\n } catch (error) {\n this.logger.log({\n level: \"error\",\n message: `CrexAPI.manageToken error: ${error}`\n });\n\n throw error\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 if (this.customerConfig.OIDC.client.enabled) {\n const token = await this.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 this.logger.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 RETRY_DELAY: 500,\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 BLOG_TYPE_AND_LINK = \"blog\";\nexport const DOCUMENTS_TYPE_AND_LINK = \"documents\";\n\nexport const TOPIC = \"TOPIC\";\nexport const DOCUMENT = \"DOCUMENT\";\nexport const PACKAGE = \"PACKAGE\";\nexport const FRAGMENT = \"FRAGMENT\";\n\nexport const RESULT_TYPES = {\n TOPIC: TOPIC,\n DOCUMENT: DOCUMENT,\n PACKAGE: PACKAGE,\n FRAGMENT: FRAGMENT\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 = 30 * 24 * 60 * 60 * 1000; // 30 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\";\n\nexport const WILD_CARD_OPTIONS = {\n BOTH: \"BOTH\",\n END: \"END\",\n START: \"START\",\n NONE: \"NONE\",\n} as const;\n\nexport const OPERATOR_OPTIONS = {\n AND: \"AND\",\n OR: \"OR\",\n} as const;\n\nexport const ARTICLE_PAGE_LAYOUT = {\n BLOG: \"BLOG\",\n DOCUMENT: \"DOCUMENT\",\n} as const;\n\nexport const DEVICE_OPTIONS = {\n MOBILE: \"mobile\",\n TABLET: \"tablet\",\n DESKTOP: \"desktop\",\n}\nexport const BREAKPOINTS = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};","import winston from \"winston\";\nimport { MatomoTransport } from \"./transports/matomo\";\nimport { GraylogTransport } from \"./transports/graylog\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { LOG_LEVELS } from \"@c-rex/constants\";\nimport { getServerConfigs } from \"@c-rex/utils/next-cookies\";\n\n/**\n * Logger class for the CREX application.\n * Provides logging functionality with multiple transports (Console, Matomo, Graylog).\n */\nexport class CrexLogger {\n private customerConfig!: ConfigInterface;\n public logger!: winston.Logger;\n\n /**\n * Initializes the logger instance if it hasn't been initialized yet.\n * Loads customer configuration and creates the logger with appropriate transports.\n * \n * @private\n */\n private async initLogger() {\n try {\n if (!this.customerConfig) {\n this.customerConfig = await getServerConfigs();\n }\n if (!this.logger) {\n this.logger = this.createLogger();\n }\n } catch (error) {\n console.error(\"Error initializing logger:\", error);\n }\n }\n\n /**\n * Logs a message with the specified level and optional category.\n * \n * @param options - Logging options\n * @param options.level - The log level (error, warn, info, etc.)\n * @param options.message - The message to log\n * @param options.category - Optional category for the log message\n */\n public async log({ level, message, category }: {\n level: LogLevelType,\n message: string,\n category?: LogCategoriesType\n }) {\n await this.initLogger();\n this.logger.log(level, message, category);\n }\n\n /**\n * Creates a new Winston logger instance with configured transports.\n * \n * @private\n * @returns A configured Winston logger instance\n */\n private createLogger() {\n return winston.createLogger({\n levels: LOG_LEVELS,\n transports: [\n new winston.transports.Console({\n level: this.customerConfig.logs.console.minimumLevel,\n silent: this.customerConfig.logs.console.silent,\n }),\n new MatomoTransport(this.customerConfig),\n new GraylogTransport(this.customerConfig),\n ],\n });\n }\n}","import Transport from \"winston-transport\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { ALL } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\n\n/**\n * Winston transport for sending logs to Matomo analytics.\n * Extends the base Winston transport with Matomo-specific functionality.\n */\nexport class MatomoTransport extends Transport {\n public matomoTransport: any;\n private configs: ConfigInterface;\n\n /**\n * Creates a new instance of MatomoTransport.\n * \n * @param configs - The application configuration containing logging settings\n */\n constructor(configs: ConfigInterface) {\n super({\n level: configs.logs.matomo.minimumLevel,\n silent: configs.logs.matomo.silent,\n });\n\n this.matomoTransport = new Transport();\n this.configs = configs;\n }\n\n /**\n * Logs a message to Matomo if the message category is included in the configured categories.\n * \n * @param info - The log information including level, message, and category\n * @param callback - Callback function to execute after logging\n */\n log(\n info: { level: LogLevelType, message: string, category: LogCategoriesType },\n callback: () => void,\n ): void {\n const matomoCategory = this.configs.logs.matomo.categoriesLevel\n\n if (matomoCategory.includes(info.category) || matomoCategory.includes(ALL)) {\n this.matomoTransport.log(info, callback);\n }\n }\n}\n","import Transport from \"winston-transport\";\nimport Graylog2Transport from \"winston-graylog2\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { ALL } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\n\n/**\n * Winston transport for sending logs to Graylog.\n * Extends the base Winston transport with Graylog-specific functionality.\n */\nexport class GraylogTransport extends Transport {\n public graylogTransport: any;\n private configs: ConfigInterface\n\n /**\n * Creates a new instance of GraylogTransport.\n * \n * @param configs - The application configuration containing logging settings\n */\n constructor(configs: ConfigInterface) {\n if (!configs.logs.graylog.hostname || configs.logs.graylog.port === undefined) {\n throw new Error(\"Graylog hostname and port must be defined\");\n }\n\n super({\n level: configs.logs.graylog.minimumLevel,\n silent: configs.logs.graylog.silent,\n });\n\n this.configs = configs;\n this.graylogTransport = new Graylog2Transport({\n name: configs.logs.graylog.app,\n silent: configs.logs.graylog.silent,\n handleExceptions: false,\n graylog: {\n servers: [\n { host: \"localhost\", port: 12201 },\n { host: configs.logs.graylog.hostname, port: configs.logs.graylog.port }\n ],\n },\n });\n }\n\n /**\n * Logs a message to Graylog if the message category is included in the configured categories.\n * \n * @param info - The log information including level, message, and category\n * @param callback - Callback function to execute after logging\n */\n log(\n info: { level: LogLevelType, message: string, category: LogCategoriesType },\n callback: () => void,\n ): void {\n const graylogCategory = this.configs.logs.graylog.categoriesLevel\n\n if (graylogCategory.includes(info.category) || graylogCategory.includes(ALL)) {\n this.graylogTransport.log(info, callback);\n }\n }\n}\n","import { FLAGS_BY_LANG } from \"@c-rex/constants\";\nimport { AvailableVersionsInterface, informationUnitsResponseItem } from \"@c-rex/interfaces\";\n\nexport const _generateShaKey = (input: string): string => {\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n hash = (hash << 5) - hash + input.charCodeAt(i);\n hash |= 0;\n }\n return Math.abs(hash).toString(16);\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 formatDateToLocale = (date: string, locale: string): string => {\n if (typeof date !== 'string' || !date) {\n return date;\n }\n\n const dateAux = new Date(date);\n return new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: 'long',\n year: 'numeric'\n }).format(dateAux);\n}\n\nexport const createAvailableVersionList = (\n versions: informationUnitsResponseItem[],\n articleLang: string,\n type: string\n): AvailableVersionsInterface[] => {\n\n const availableVersions = versions.map(item => {\n return {\n shortId: item.shortId,\n active: item.language === articleLang,\n lang: item.language,\n country: item.language.split(\"-\")[1],\n link: `/${type}/${item.shortId}`,\n }\n }).sort((a, b) => {\n if (a.lang < b.lang) return -1;\n if (a.lang > b.lang) return 1;\n return 0;\n }) as AvailableVersionsInterface[];\n\n return availableVersions;\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 { QueryParams } from '@c-rex/types';\n\n/**\n * Creates an array of parameter objects from a list of field values.\n * @param fieldsList - Array of field values to transform into parameter objects\n * @param key - The key to use for each parameter object (defaults to \"Fields\")\n * @returns An array of objects with key-value pairs\n */\nexport const createParams = (fieldsList: string[], key: string = \"Fields\") =>\n fieldsList.map((item) => ({\n key: key,\n value: item,\n }));\n\n/**\n * Generates a URL query string from an array of parameter objects.\n * @param params - Array of QueryParams objects containing key-value pairs\n * @returns A URL-encoded query string\n */\nexport const generateQueryParams = (params: QueryParams[]): string => {\n const queryParams = params\n .map((param) => `${encodeURIComponent(param.key)}=${encodeURIComponent(param.value)}`)\n .join(\"&\");\n return queryParams;\n};\n","import { informationUnitsRenditions } from \"@c-rex/interfaces\";\nimport { DocumentsType } from \"@c-rex/types\";\n\n\nexport const getFileRenditions = ({ renditions }: { renditions: informationUnitsRenditions[] }): DocumentsType => {\n if (renditions == undefined || renditions.length == 0) {\n return {};\n }\n\n const filteredRenditions = renditions.filter(\n (item) => item.format != \"application/xhtml+xml\" && item.format != \"application/json\" && item.format != \"application/llm+xml\"\n );\n\n if (filteredRenditions.length == 0 || filteredRenditions[0] == undefined) {\n return {};\n }\n\n const result: {\n [key: string]: {\n view: string;\n download: string;\n }\n } = {}\n\n filteredRenditions.forEach((item) => {\n const key = item.format\n\n if (result[key] == undefined) {\n result[key] = {\n view: \"\",\n download: \"\"\n }\n }\n\n result[key].download = item.links.filter((link) => link.rel == \"download\")[0]?.href\n result[key].view = item.links.filter((link) => link.rel == \"view\")[0]?.href\n })\n\n return result\n}","import { CrexApi } from \"@c-rex/core\";\nimport { QueryParams } from \"@c-rex/types\";\nimport { generateQueryParams } from \"@c-rex/utils\";\nimport { Method } from \"axios\";\n\n/**\n * Base service class that provides common functionality for API interactions.\n * All specific service classes extend this base class.\n */\nexport class BaseService {\n protected api: CrexApi;\n private endpoint: string;\n\n /**\n * Creates a new instance of BaseService.\n * \n * @param endpoint - The API endpoint URL for this service\n */\n constructor(endpoint: string) {\n this.api = new CrexApi();\n this.endpoint = endpoint;\n }\n\n /**\n * Makes an API request to the specified endpoint.\n * \n * @param options - Request configuration options\n * @param options.path - Optional path to append to the endpoint\n * @param options.params - Optional query parameters to include in the request\n * @param options.method - HTTP method to use (defaults to 'get')\n * @param options.transformer - Optional function to transform the response data\n * @returns The response data, optionally transformed\n * @throws Error if the API request fails\n */\n protected async request<T>({\n path = \"\",\n method = \"get\",\n params = [],\n headers = {},\n transformer = (response: any) => response,\n }: {\n path?: string,\n method?: Method,\n params?: QueryParams[],\n headers?: any,\n transformer?: (data: any) => T,\n }): Promise<T> {\n\n let url = `${this.endpoint}${path}`;\n\n const queryParams = generateQueryParams(params);\n if (queryParams.length > 0) {\n url += `?${queryParams}`;\n }\n\n const response = await this.api.execute({\n url,\n method,\n headers,\n })\n\n return await transformer(response);\n }\n}\n\n","import { BaseService } from \"./baseService\";\nimport { informationUnitsRenditions } from \"@c-rex/interfaces\";\n\n/**\n * Service for interacting with renditions in the API.\n * Provides methods to retrieve and process different types of renditions.\n */\nexport class RenditionsService extends BaseService {\n constructor() {\n super(\"Renditions/\");\n }\n\n /**\n * Retrieves the HTML rendition from a list of renditions.\n * Filters for renditions with format 'application/xhtml+xml' and rel 'view'.\n * \n * @param renditions - Array of rendition objects to process\n * @returns A promise that resolves to the HTML content as a string, or empty string if no suitable rendition is found\n * @throws Error if the API request fails\n */\n public async getHTMLRendition({ renditions }: { renditions: informationUnitsRenditions[] }): Promise<string> {\n const filteredRenditions = renditions.filter(\n (item) => item.format == \"application/xhtml+xml\",\n );\n\n if (filteredRenditions.length == 0 || filteredRenditions[0] == undefined) return \"\";\n const item = filteredRenditions[0];\n const filteredLinks = item.links.filter((item) => item.rel == \"view\");\n\n if (filteredLinks.length == 0 || filteredLinks[0] == undefined) return \"\";\n const url = filteredLinks[0].href;\n const response = await this.api.execute({\n url,\n method: \"get\",\n headers: {\n Accept: \"application/xhtml+xml\",\n },\n })\n\n return response as string;\n }\n}","import { BaseService } from \"./baseService\";\nimport { createParams } from \"@c-rex/utils\";\nimport { DirectoryNodes, DirectoryNodesResponse } from \"@c-rex/interfaces\";\n\n/**\n * Service for interacting with directory nodes in the API.\n * Provides methods to retrieve directory node information.\n */\nexport class DirectoryNodesService extends BaseService {\n constructor() {\n super(\"DirectoryNodes/\");\n }\n\n /**\n * Retrieves a specific directory node by its ID.\n * \n * @param id - The unique identifier of the directory node\n * @returns A promise that resolves to the directory node data\n * @throws Error if the API request fails\n */\n public async getItem(id: string): Promise<DirectoryNodes> {\n return await this.request({\n path: id,\n });\n }\n\n /**\n * Retrieves a list of directory nodes based on specified filters.\n * \n * @param options - Options for filtering the directory nodes list\n * @param options.filters - Optional array of filter strings to apply\n * @returns A promise that resolves to the directory nodes response\n * @throws Error if the API request fails\n */\n public async getList({\n filters = [],\n }: {\n filters?: string[],\n }): Promise<DirectoryNodesResponse> {\n\n const remainFilters = createParams(filters, \"Filter\");\n\n return await this.request({\n params: {\n ...remainFilters,\n },\n });\n }\n}\n","import { CONTENT_LANG_KEY } from \"@c-rex/constants\";\nimport { DefaultRequest } from \"@c-rex/interfaces\";\nimport { DocumentTypesItem } from \"@c-rex/interfaces\";\nimport { getClientConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from \"next/headers\";\n\nexport const transformDocumentTypes = (data: DefaultRequest<DocumentTypesItem>) => {\n const labels: { shortId: string, label: string }[] = [];\n const config = getClientConfigs();\n const contentLanguage = cookies().get(CONTENT_LANG_KEY)?.value || config.languageSwitcher.default;\n const language = contentLanguage.split(\"-\")[0];\n\n data.items.forEach((documentItem) => {\n const label = documentItem.labels.find((item) => item.language.toLowerCase() === language.toLowerCase());\n\n labels.push({\n shortId: documentItem.shortId,\n label: label ? label.value : \"\"\n })\n });\n\n return labels;\n};\n","import { transformDocumentTypes } from \"./transforms/documentTypes\";\nimport { BaseService } from \"./baseService\";\n\n/**\n * Service for interacting with document types in the API.\n * Provides methods to retrieve document type information.\n */\nexport class DocumentTypesService extends BaseService {\n constructor() {\n super(\"DocumentTypes/\");\n }\n\n /**\n * Retrieves document type labels for the specified fields.\n * \n * @returns A promise that resolves to an array of label strings\n * @throws Error if the API request fails\n */\n public async getLabels(): Promise<{ shortId: string, label: string }[]> {\n return await this.request({\n params: [{\n key: \"sparqlWhere\",\n value: \"?iu iirds:is-applicable-for-document-type ?s . ?iu iirds:has-topic-type <https://www.c-rex.net/iirds/td#Blogpost>\"\n }],\n transformer: transformDocumentTypes,\n });\n }\n}\n","import { CONTENT_LANG_KEY, EN_LANG, RESULT_TYPES } from \"@c-rex/constants\";\nimport {\n DefaultRequest,\n informationUnitsResponse,\n informationUnitsItems,\n} from \"@c-rex/interfaces\";\nimport { getServerConfigs, getClientConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from 'next/headers';\nimport { getFileRenditions } from \"@c-rex/utils\";\nimport { CrexLogger } from '@c-rex/core/logger';\nimport { AutocompleteSuggestion } from \"@c-rex/interfaces\";\n\nexport const transformInformationUnits = async (data: DefaultRequest<informationUnitsItems>): Promise<informationUnitsResponse> => {\n const logger = new CrexLogger()\n const frontEndConfig = await getClientConfigs();\n const backEndConfig = await getServerConfigs();\n const filteredTags: any = {}\n\n const items = data.items.map((item) => {\n const type = item.class.labels.filter((item) => item.language === EN_LANG)[0].value.toUpperCase();\n const files = getFileRenditions({ renditions: item?.renditions });\n\n let link = `/topics/${item.shortId}`;\n\n if (frontEndConfig.results.articlePageLayout == \"BLOG\") {\n link = `/blog/${item.shortId}`\n } else if (type == RESULT_TYPES.DOCUMENT) {\n link = `/documents/${item.shortId}`;\n }\n\n let title = \"NO TITLE\"\n let language = \"NO LANGUAGE\"\n\n try {\n if (item.titles) {\n title = item.titles[0].value\n language = item.titles[0].language\n } else {\n title = item.labels[0].value\n language = item.labels[0].language\n }\n } catch {\n logger.log({\n level: \"error\",\n message: `No label or title on item ${item.shortId}`\n })\n }\n\n return {\n language: language,\n title: title,\n type: type,\n localeType: \"\",\n shortId: item.shortId,\n disabled: frontEndConfig.results.disabledResults.includes(type as any),\n link: link,\n files\n }\n });\n\n if (data.tags) {\n const contentLang = (cookies().get(CONTENT_LANG_KEY)?.value || EN_LANG).toLowerCase()\n const splittedContentLang = contentLang.split(\"-\")[0];\n\n for (const [key, value] of Object.entries(data.tags)) {\n\n if (!value || !value.items || value.items.length === 0) {\n continue;\n }\n if (!backEndConfig.search.tags.includes(key)) {\n continue;\n }\n\n const aux = value.items.map(item => {\n if (item?.shortId === undefined) return null\n if (Number(item.hits) === 0) return null\n if (item?.labels === undefined || item?.labels.length === 0) {\n logger.log({\n level: \"warning\",\n message: `No labels on item with id ${item.shortId} from category ${key}`\n })\n return null;\n }\n\n let label = \"\"\n\n for (const labelItem of item.labels) {\n if (labelItem.language === undefined) {\n logger.log({\n level: \"info\",\n message: `No language on label ${labelItem.value} from category ${key}`\n })\n label = labelItem.value\n break;\n }\n\n if (labelItem.language.toLowerCase() === contentLang || labelItem.language.toLowerCase() === splittedContentLang) {\n label = labelItem.value\n break;\n }\n\n label = labelItem.value\n\n //TODO: fallback in english\n }\n\n return {\n hits: item.hits,\n total: item.total,\n label: label,\n active: false,\n shortId: item.shortId,\n }\n }).filter((item) => item !== null)\n\n if (aux.length === 0) {\n continue;\n }\n\n filteredTags[key] = aux;\n }\n }\n\n return {\n tags: filteredTags,\n items: items,\n pageInfo: data.pageInfo,\n };\n};\n\nexport const transformSuggestions = (data: AutocompleteSuggestion, query: string) => {\n const suggestions: string[] = []\n const comparableList: string[] = []\n\n data.suggestions.forEach((item) => {\n suggestions.push(item.value);\n comparableList.push(item.value.toLowerCase())\n })\n\n if (!comparableList.includes(query.toLowerCase())) {\n return [query, ...suggestions];\n }\n\n return suggestions\n}","import {\n AutocompleteSuggestion,\n informationUnitsResponse,\n informationUnitsItems,\n} from \"@c-rex/interfaces\";\nimport { transformInformationUnits, transformSuggestions } from \"./transforms/information\";\nimport { createParams } from \"@c-rex/utils\";\nimport { BaseService } from \"./baseService\";\nimport { OperatorType, WildCardType } from \"@c-rex/types\";\nimport { OPERATOR_OPTIONS, WILD_CARD_OPTIONS } from \"@c-rex/constants\";\n\n/**\n * Service for interacting with information units in the API.\n * Provides methods to retrieve and search information units.\n */\nexport class InformationUnitsService extends BaseService {\n constructor() {\n super(\"InformationUnits/\");\n }\n\n /**\n * Retrieves a list of information units based on specified criteria.\n * \n * @param options - Options for filtering and paginating the information units list\n * @param options.queries - Optional search query string\n * @param options.page - Optional page number for pagination (defaults to 1)\n * @param options.fields - Optional array of fields to include in the response\n * @param options.filters - Optional array of filter strings to apply\n * @param options.languages - Optional array of language codes to filter by\n * @returns A promise that resolves to the information units response\n * @throws Error if the API request fails\n */\n public async getList({\n queries = \"\",\n page = 1,\n fields = [],\n filters = [],\n tags = [],\n restrict = [],\n languages = [],\n wildcard = WILD_CARD_OPTIONS.BOTH,\n operator = OPERATOR_OPTIONS.AND,\n like = false,\n }: {\n queries?: string,\n page?: number,\n filters?: string[],\n restrict?: string[],\n fields?: string[],\n tags?: string[],\n languages?: string[],\n wildcard?: WildCardType,\n operator?: OperatorType,\n like?: boolean,\n }): Promise<informationUnitsResponse> {\n const remainFields = createParams(fields, \"Fields\");\n const remainFilters = createParams(filters, \"Filter\");\n const restrictions = createParams(restrict, \"Restrict\");\n const remainTags = createParams(tags, \"Tags\");\n const languageParam = `VALUES ?lang { ${languages.map(lang => `\"${lang}\"`).join(\" \")} } ?s iirds:language ?lang .`\n\n const params = [\n { key: \"pageSize\", value: \"12\" },\n { key: \"wildcard\", value: wildcard.toLowerCase() },\n { key: \"PageNumber\", value: page.toString() },\n { key: \"Operator\", value: operator },\n { key: \"Like\", value: like.toString() },\n ...remainTags,\n ...remainFields,\n ...remainFilters,\n ...restrictions\n ];\n if (languages.length > 0) {\n params.push({ key: \"sparqlWhere\", value: languageParam });\n }\n if (queries.length > 0) {\n params.push(\n { key: \"Query\", value: queries },\n );\n }\n\n return await this.request({\n params: params,\n transformer: transformInformationUnits\n });\n }\n\n /**\n * Retrieves a specific information unit by its ID.\n * Includes renditions, directory nodes, version information, titles, languages, and labels.\n * \n * @param options - Options for retrieving the information unit\n * @param options.id - The unique identifier of the information unit\n * @returns A promise that resolves to the information unit data\n * @throws Error if the API request fails\n */\n public async getItem({ id, shouldGetAllFields = false }: { id: string, shouldGetAllFields?: boolean }): Promise<informationUnitsItems> {\n const params = []\n\n if (!shouldGetAllFields) {\n params.push(\n { key: \"Fields\", value: \"renditions\" },\n { key: \"Fields\", value: \"directoryNodes\" },\n { key: \"Fields\", value: \"versionOf\" },\n { key: \"Fields\", value: \"titles\" },\n { key: \"Fields\", value: \"languages\" },\n { key: \"Fields\", value: \"labels\" },\n { key: \"Fields\", value: \"packages\" },\n { key: \"Fields\", value: \"created\" },\n { key: \"Fields\", value: \"revision\" },\n );\n }\n\n return await this.request({\n path: id,\n params,\n });\n }\n\n /**\n * Retrieves autocomplete suggestions based on a query prefix.\n * \n * @param options - Options for retrieving suggestions\n * @param options.query - The query prefix to get suggestions for\n * @param options.language - The language of the suggestions\n * @returns A promise that resolves to an array of suggestion strings\n * @throws Error if the API request fails\n */\n public async getSuggestions(\n { query, language }: { query: string, language: string }\n ): Promise<string[]> {\n\n return await this.request({\n path: 'Suggestions',\n params: [\n { key: \"prefix\", value: query },\n { key: \"lang\", value: language },\n ],\n transformer: (data: AutocompleteSuggestion) => transformSuggestions(data, query)\n });\n }\n}\n","import { LanguageAndCountries } from \"@c-rex/interfaces\";\nimport { BaseService } from \"./baseService\";\nimport { getCountryCodeByLang } from \"@c-rex/utils\";\nimport { getClientConfigs } from \"@c-rex/utils/next-cookies\";\n\n/**\n * Service for interacting with language-related functionality in the API.\n * Provides methods to retrieve language and country information.\n */\nexport class LanguageService extends BaseService {\n constructor() {\n const configs = getClientConfigs()\n super(configs.languageSwitcher.endpoint);\n }\n\n /**\n * Retrieves a list of available languages and their associated countries.\n * Transforms the API response to include language code, country code, and original value.\n * \n * @returns A promise that resolves to an array of language and country objects\n * @throws Error if the API request fails\n */\n public async getLanguagesAndCountries(): Promise<LanguageAndCountries[]> {\n return await this.request({\n transformer: (data: { value: string; score: number }[]) => {\n const countryCodeList = data.map((item) => {\n /*\n api -> en, en-US\n default -> en-US. Then use EN-US \n\n api -> en\n default -> en-US. Then use EN\n */\n //should be abble to handle this items: en-US, en, pt, pt-PT, pt-BR \n\n const splittedValue = item.value.split(\"-\")\n const lang = splittedValue[0]\n let country = splittedValue[0]\n\n if (splittedValue.length > 1) {\n country = splittedValue[1]\n } else {\n country = getCountryCodeByLang(lang)\n }\n\n return {\n country: country,\n lang: lang,\n value: item.value,\n }\n })\n\n return countryCodeList.sort((a, b) => {\n return a.value.localeCompare(b.value)\n })\n },\n });\n }\n}\n","import { EN_LANG, RESULT_TYPES, UI_LANG_KEY } from \"@c-rex/constants\";\nimport { DefaultRequest, TopicsRequestItem, DefaultResponse, TopicsResponseItem } from \"@c-rex/interfaces\";\nimport { getClientConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from 'next/headers';\nimport { CrexLogger } from '@c-rex/core/logger';\nimport { formatDateToLocale } from \"@c-rex/utils\";\n\nexport const transformTopics = async (data: DefaultRequest<TopicsRequestItem>): Promise<DefaultResponse<TopicsResponseItem, null>> => {\n const logger = new CrexLogger()\n const config = getClientConfigs();\n const uiLang = (cookies().get(UI_LANG_KEY)?.value || config.languageSwitcher.default).toLowerCase()\n\n const items = data.items.map(item => {\n const type = item.class.labels.filter((item) => item.language === EN_LANG)[0].value.toUpperCase();\n\n let link = `/topics/${item.shortId}`;\n\n if (config.results.articlePageLayout == \"BLOG\") {\n link = `/blog/${item.shortId}`\n } else if (type == RESULT_TYPES.DOCUMENT) {\n link = `/documents/${item.shortId}`;\n }\n\n let title = \"NO TITLE\"\n let language = \"NO LANGUAGE\"\n\n try {\n if (item.titles) {\n title = item.titles[0].value\n language = item.titles[0].language\n } else {\n title = item.labels[0].value\n language = item.labels[0].language\n }\n } catch {\n logger.log({\n level: \"error\",\n message: `No label or title on item ${item.shortId}`\n })\n }\n\n let renditionUrl = \"\"\n const renditions = item.renditions.filter(item => item.format == \"application/xhtml+xml\");\n if (renditions.length > 0 || renditions[0] !== undefined) {\n const filteredLinks = renditions[0].links.filter((renditionItem) => renditionItem.rel == \"view\");\n if (filteredLinks.length > 0 || filteredLinks[0] !== undefined) {\n renditionUrl = filteredLinks[0].href;\n };\n };\n\n let categoryType = type\n if (item.applicableForTypes && item.applicableForTypes.length > 0) {\n const splittedContentLang = uiLang.split(\"-\")[0];\n categoryType = item.applicableForTypes[0].labels.find(item => item.language === splittedContentLang)?.value || categoryType;\n }\n\n return {\n language: language,\n title: title,\n type: categoryType,\n localeType: \"\",\n shortId: item.shortId,\n created: formatDateToLocale(item.created, uiLang),\n disabled: config.results.disabledResults.includes(type as any),\n link: link,\n renditionUrl: renditionUrl,\n image: null,\n description: null,\n }\n })\n\n return {\n tags: null,\n items: items,\n pageInfo: data.pageInfo,\n };\n};\n","import { transformTopics } from \"./transforms/topics\";\nimport { createParams } from \"@c-rex/utils\";\nimport { BaseService } from \"./baseService\";\nimport { OperatorType, WildCardType } from \"@c-rex/types\";\nimport { OPERATOR_OPTIONS, WILD_CARD_OPTIONS } from \"@c-rex/constants\";\nimport { DefaultResponse, TopicsResponseItem } from \"@c-rex/interfaces\";\n\ntype getListProps = {\n queries?: string,\n page?: number,\n filters?: string[],\n fields?: string[],\n languages?: string[],\n wildcard?: WildCardType,\n operator?: OperatorType,\n like?: boolean,\n pageSize?: number\n}\n\n\n/**\n * Service for interacting with information units in the API.\n * Provides methods to retrieve and search information units.\n */\nexport class TopicsService extends BaseService {\n constructor() {\n super(\"Topics/\");\n }\n\n /**\n * Retrieves a list of topics based on specified criteria.\n * \n * @param options - Options for filtering and paginating the topics list\n * @param options.queries - Optional search query string\n * @param options.page - Optional page number for pagination (defaults to 1)\n * @param options.fields - Optional array of fields to include in the response\n * @param options.filters - Optional array of filter strings to apply\n * @param options.languages - Optional array of language codes to filter by\n * @returns A promise that resolves to the information units response\n * @throws Error if the API request fails\n */\n public async getList({\n queries = \"\",\n page = 1,\n fields = [],\n filters = [],\n languages = [],\n wildcard = WILD_CARD_OPTIONS.BOTH,\n operator = OPERATOR_OPTIONS.AND,\n pageSize = 12\n }: getListProps): Promise<DefaultResponse<TopicsResponseItem, null>> {\n const remainFields = createParams(fields, \"Fields\");\n const remainFilters = createParams(filters, \"Filter\");\n\n const params = [\n { key: \"pageSize\", value: pageSize.toString() },\n { key: \"PageNumber\", value: page.toString() },\n { key: \"Sort\", value: \"-created;-score\" },\n { key: \"Operator\", value: operator },\n { key: \"wildcard\", value: wildcard.toLowerCase() },\n ...remainFields,\n ...remainFilters,\n ];\n\n if (languages.length > 0) {\n const languageParam = `VALUES ?lang { ${languages.map(lang => `\"${lang}\"`).join(\" \")} } ?s iirds:language ?lang .`\n params.push({ key: \"sparqlWhere\", value: languageParam });\n }\n if (queries.length > 0) {\n params.push(\n { key: \"Query\", value: queries },\n );\n }\n\n return await this.request({\n params: params,\n transformer: transformTopics\n });\n }\n}\n"],"mappings":"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","names":["Transport","import_winston_transport","Transport","Graylog2Transport","winston","import_next_cookies","axios","item","import_next_cookies","import_headers","import_next_cookies","import_headers","import_logger","item","import_next_cookies","import_next_cookies","import_headers","import_logger","item"]}
|
package/dist/index.mjs
CHANGED
|
@@ -13,11 +13,11 @@ var LOG_LEVELS = {
|
|
|
13
13
|
var API = {
|
|
14
14
|
MAX_RETRY: 3,
|
|
15
15
|
API_TIMEOUT: 1e4,
|
|
16
|
+
RETRY_DELAY: 500,
|
|
16
17
|
API_HEADERS: {
|
|
17
18
|
"content-Type": "application/json"
|
|
18
19
|
}
|
|
19
20
|
};
|
|
20
|
-
var SDK_CONFIG_KEY = "crex-sdk-config";
|
|
21
21
|
var CONTENT_LANG_KEY = "CONTENT_LANG_KEY";
|
|
22
22
|
var UI_LANG_KEY = "UI_LANG_KEY";
|
|
23
23
|
var FLAGS_BY_LANG = {
|
|
@@ -35,7 +35,7 @@ var RESULT_TYPES = {
|
|
|
35
35
|
PACKAGE,
|
|
36
36
|
FRAGMENT
|
|
37
37
|
};
|
|
38
|
-
var DEFAULT_COOKIE_LIMIT =
|
|
38
|
+
var DEFAULT_COOKIE_LIMIT = 30 * 24 * 60 * 60 * 1e3;
|
|
39
39
|
var CREX_TOKEN_HEADER_KEY = "crex-token";
|
|
40
40
|
var WILD_CARD_OPTIONS = {
|
|
41
41
|
BOTH: "BOTH",
|
|
@@ -98,21 +98,22 @@ var GraylogTransport = class extends Transport2 {
|
|
|
98
98
|
* @param configs - The application configuration containing logging settings
|
|
99
99
|
*/
|
|
100
100
|
constructor(configs) {
|
|
101
|
+
if (!configs.logs.graylog.hostname || configs.logs.graylog.port === void 0) {
|
|
102
|
+
throw new Error("Graylog hostname and port must be defined");
|
|
103
|
+
}
|
|
101
104
|
super({
|
|
102
105
|
level: configs.logs.graylog.minimumLevel,
|
|
103
106
|
silent: configs.logs.graylog.silent
|
|
104
107
|
});
|
|
105
108
|
this.configs = configs;
|
|
106
109
|
this.graylogTransport = new Graylog2Transport({
|
|
107
|
-
name:
|
|
108
|
-
|
|
109
|
-
silent: false,
|
|
110
|
+
name: configs.logs.graylog.app,
|
|
111
|
+
silent: configs.logs.graylog.silent,
|
|
110
112
|
handleExceptions: false,
|
|
111
113
|
graylog: {
|
|
112
114
|
servers: [
|
|
113
115
|
{ host: "localhost", port: 12201 },
|
|
114
|
-
{ host:
|
|
115
|
-
//TODO: check the URL => https://log.c-rex.net:12202/gelf" GELF??
|
|
116
|
+
{ host: configs.logs.graylog.hostname, port: configs.logs.graylog.port }
|
|
116
117
|
]
|
|
117
118
|
}
|
|
118
119
|
});
|
|
@@ -132,7 +133,7 @@ var GraylogTransport = class extends Transport2 {
|
|
|
132
133
|
};
|
|
133
134
|
|
|
134
135
|
// ../core/src/logger.ts
|
|
135
|
-
import {
|
|
136
|
+
import { getServerConfigs } from "@c-rex/utils/next-cookies";
|
|
136
137
|
var CrexLogger = class {
|
|
137
138
|
customerConfig;
|
|
138
139
|
logger;
|
|
@@ -145,7 +146,7 @@ var CrexLogger = class {
|
|
|
145
146
|
async initLogger() {
|
|
146
147
|
try {
|
|
147
148
|
if (!this.customerConfig) {
|
|
148
|
-
this.customerConfig = await
|
|
149
|
+
this.customerConfig = await getServerConfigs();
|
|
149
150
|
}
|
|
150
151
|
if (!this.logger) {
|
|
151
152
|
this.logger = this.createLogger();
|
|
@@ -188,10 +189,12 @@ var CrexLogger = class {
|
|
|
188
189
|
};
|
|
189
190
|
|
|
190
191
|
// ../core/src/requests.ts
|
|
192
|
+
import { getServerConfigs as getServerConfigs2, getClientConfigs } from "@c-rex/utils/next-cookies";
|
|
191
193
|
var CrexApi = class {
|
|
192
194
|
customerConfig;
|
|
193
195
|
apiClient;
|
|
194
196
|
logger;
|
|
197
|
+
publicNextApiUrl;
|
|
195
198
|
/**
|
|
196
199
|
* Initializes the API client if it hasn't been initialized yet.
|
|
197
200
|
* Loads customer configuration, creates the axios instance, and initializes the logger.
|
|
@@ -201,16 +204,10 @@ var CrexApi = class {
|
|
|
201
204
|
async initAPI() {
|
|
202
205
|
this.logger = new CrexLogger();
|
|
203
206
|
if (!this.customerConfig) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
this.logger.log({
|
|
209
|
-
level: "error",
|
|
210
|
-
message: `utils.initAPI error: Config cookie not available`
|
|
211
|
-
});
|
|
212
|
-
throw new Error("Config cookie not available");
|
|
213
|
-
}
|
|
207
|
+
this.customerConfig = await getServerConfigs2();
|
|
208
|
+
}
|
|
209
|
+
if (!this.publicNextApiUrl) {
|
|
210
|
+
this.publicNextApiUrl = await getClientConfigs().publicNextApiUrl;
|
|
214
211
|
}
|
|
215
212
|
if (!this.apiClient) {
|
|
216
213
|
this.apiClient = axios.create({
|
|
@@ -219,19 +216,24 @@ var CrexApi = class {
|
|
|
219
216
|
}
|
|
220
217
|
}
|
|
221
218
|
async getToken() {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
219
|
+
for (let retry = 0; retry < API.MAX_RETRY; retry++) {
|
|
220
|
+
try {
|
|
221
|
+
const response = await fetch(`${this.publicNextApiUrl}/api/token`, {
|
|
222
|
+
method: "POST",
|
|
223
|
+
credentials: "include"
|
|
224
|
+
});
|
|
225
|
+
const { token } = await response.json();
|
|
226
|
+
return token;
|
|
227
|
+
} catch (error) {
|
|
228
|
+
this.logger.log({
|
|
229
|
+
level: "error",
|
|
230
|
+
message: `utils.getToken ${retry + 1}\xBA error when request token. Error: ${error}`
|
|
231
|
+
});
|
|
232
|
+
await new Promise((resolve) => setTimeout(resolve, API.RETRY_DELAY));
|
|
233
|
+
if (retry === API.MAX_RETRY) {
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
235
237
|
}
|
|
236
238
|
}
|
|
237
239
|
async manageToken() {
|
|
@@ -311,14 +313,6 @@ var CrexApi = class {
|
|
|
311
313
|
};
|
|
312
314
|
|
|
313
315
|
// ../utils/src/utils.ts
|
|
314
|
-
var _generateShaKey = (input) => {
|
|
315
|
-
let hash = 0;
|
|
316
|
-
for (let i = 0; i < input.length; i++) {
|
|
317
|
-
hash = (hash << 5) - hash + input.charCodeAt(i);
|
|
318
|
-
hash |= 0;
|
|
319
|
-
}
|
|
320
|
-
return Math.abs(hash).toString(16);
|
|
321
|
-
};
|
|
322
316
|
var getCountryCodeByLang = (lang) => {
|
|
323
317
|
const mappedKeys = Object.keys(FLAGS_BY_LANG);
|
|
324
318
|
if (!mappedKeys.includes(lang)) {
|
|
@@ -343,35 +337,6 @@ var formatDateToLocale = (date, locale) => {
|
|
|
343
337
|
import { clsx } from "clsx";
|
|
344
338
|
import { twMerge } from "tailwind-merge";
|
|
345
339
|
|
|
346
|
-
// ../utils/src/call.ts
|
|
347
|
-
var call = async (method, params) => {
|
|
348
|
-
const shaKey = _generateShaKey(JSON.stringify({ method, params }));
|
|
349
|
-
const cache = localStorage.getItem(shaKey);
|
|
350
|
-
if (cache !== null) {
|
|
351
|
-
const { data, expireDate } = JSON.parse(cache);
|
|
352
|
-
if (new Date(expireDate) > /* @__PURE__ */ new Date()) {
|
|
353
|
-
return JSON.parse(data);
|
|
354
|
-
} else {
|
|
355
|
-
localStorage.removeItem(shaKey);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
const res = await fetch(`/api/rpc`, {
|
|
359
|
-
method: "POST",
|
|
360
|
-
headers: { "Content-Type": "application/json" },
|
|
361
|
-
body: JSON.stringify({ method, params }),
|
|
362
|
-
credentials: "include"
|
|
363
|
-
});
|
|
364
|
-
const json = await res.json();
|
|
365
|
-
if (!res.ok) throw new Error(json.error || "Unknown error");
|
|
366
|
-
const today = /* @__PURE__ */ new Date();
|
|
367
|
-
const result = {
|
|
368
|
-
data: JSON.stringify(json.data),
|
|
369
|
-
expireDate: new Date(today.getTime() + 1e3 * 60 * 60)
|
|
370
|
-
};
|
|
371
|
-
localStorage.setItem(shaKey, JSON.stringify(result));
|
|
372
|
-
return json.data;
|
|
373
|
-
};
|
|
374
|
-
|
|
375
340
|
// ../utils/src/params.ts
|
|
376
341
|
var createParams = (fieldsList, key = "Fields") => fieldsList.map((item) => ({
|
|
377
342
|
key,
|
|
@@ -439,25 +404,17 @@ var BaseService = class {
|
|
|
439
404
|
headers = {},
|
|
440
405
|
transformer = (response) => response
|
|
441
406
|
}) {
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
url += `?${queryParams}`;
|
|
447
|
-
}
|
|
448
|
-
const response = await this.api.execute({
|
|
449
|
-
url,
|
|
450
|
-
method,
|
|
451
|
-
headers
|
|
452
|
-
});
|
|
453
|
-
return await transformer(response);
|
|
454
|
-
} catch (error) {
|
|
455
|
-
call("CrexLogger.log", {
|
|
456
|
-
level: "error",
|
|
457
|
-
message: `BaseService.request error when request ${path}. Error: ${error}`
|
|
458
|
-
});
|
|
459
|
-
throw error;
|
|
407
|
+
let url = `${this.endpoint}${path}`;
|
|
408
|
+
const queryParams = generateQueryParams(params);
|
|
409
|
+
if (queryParams.length > 0) {
|
|
410
|
+
url += `?${queryParams}`;
|
|
460
411
|
}
|
|
412
|
+
const response = await this.api.execute({
|
|
413
|
+
url,
|
|
414
|
+
method,
|
|
415
|
+
headers
|
|
416
|
+
});
|
|
417
|
+
return await transformer(response);
|
|
461
418
|
}
|
|
462
419
|
};
|
|
463
420
|
|
|
@@ -532,11 +489,11 @@ var DirectoryNodesService = class extends BaseService {
|
|
|
532
489
|
};
|
|
533
490
|
|
|
534
491
|
// src/transforms/documentTypes.ts
|
|
535
|
-
import {
|
|
492
|
+
import { getClientConfigs as getClientConfigs2 } from "@c-rex/utils/next-cookies";
|
|
536
493
|
import { cookies as cookies2 } from "next/headers";
|
|
537
494
|
var transformDocumentTypes = (data) => {
|
|
538
495
|
const labels = [];
|
|
539
|
-
const config =
|
|
496
|
+
const config = getClientConfigs2();
|
|
540
497
|
const contentLanguage = cookies2().get(CONTENT_LANG_KEY)?.value || config.languageSwitcher.default;
|
|
541
498
|
const language = contentLanguage.split("-")[0];
|
|
542
499
|
data.items.forEach((documentItem) => {
|
|
@@ -572,18 +529,19 @@ var DocumentTypesService = class extends BaseService {
|
|
|
572
529
|
};
|
|
573
530
|
|
|
574
531
|
// src/transforms/information.ts
|
|
575
|
-
import {
|
|
532
|
+
import { getServerConfigs as getServerConfigs3, getClientConfigs as getClientConfigs3 } from "@c-rex/utils/next-cookies";
|
|
576
533
|
import { cookies as cookies3 } from "next/headers";
|
|
577
534
|
import { CrexLogger as CrexLogger2 } from "@c-rex/core/logger";
|
|
578
535
|
var transformInformationUnits = async (data) => {
|
|
579
536
|
const logger = new CrexLogger2();
|
|
580
|
-
const
|
|
537
|
+
const frontEndConfig = await getClientConfigs3();
|
|
538
|
+
const backEndConfig = await getServerConfigs3();
|
|
581
539
|
const filteredTags = {};
|
|
582
540
|
const items = data.items.map((item) => {
|
|
583
541
|
const type = item.class.labels.filter((item2) => item2.language === EN_LANG)[0].value.toUpperCase();
|
|
584
542
|
const files = getFileRenditions({ renditions: item?.renditions });
|
|
585
543
|
let link = `/topics/${item.shortId}`;
|
|
586
|
-
if (
|
|
544
|
+
if (frontEndConfig.results.articlePageLayout == "BLOG") {
|
|
587
545
|
link = `/blog/${item.shortId}`;
|
|
588
546
|
} else if (type == RESULT_TYPES.DOCUMENT) {
|
|
589
547
|
link = `/documents/${item.shortId}`;
|
|
@@ -610,7 +568,7 @@ var transformInformationUnits = async (data) => {
|
|
|
610
568
|
type,
|
|
611
569
|
localeType: "",
|
|
612
570
|
shortId: item.shortId,
|
|
613
|
-
disabled:
|
|
571
|
+
disabled: frontEndConfig.results.disabledResults.includes(type),
|
|
614
572
|
link,
|
|
615
573
|
files
|
|
616
574
|
};
|
|
@@ -622,7 +580,7 @@ var transformInformationUnits = async (data) => {
|
|
|
622
580
|
if (!value || !value.items || value.items.length === 0) {
|
|
623
581
|
continue;
|
|
624
582
|
}
|
|
625
|
-
if (!
|
|
583
|
+
if (!backEndConfig.search.tags.includes(key)) {
|
|
626
584
|
continue;
|
|
627
585
|
}
|
|
628
586
|
const aux = value.items.map((item) => {
|
|
@@ -793,10 +751,10 @@ var InformationUnitsService = class extends BaseService {
|
|
|
793
751
|
};
|
|
794
752
|
|
|
795
753
|
// src/language.ts
|
|
796
|
-
import {
|
|
754
|
+
import { getClientConfigs as getClientConfigs4 } from "@c-rex/utils/next-cookies";
|
|
797
755
|
var LanguageService = class extends BaseService {
|
|
798
756
|
constructor() {
|
|
799
|
-
const configs =
|
|
757
|
+
const configs = getClientConfigs4();
|
|
800
758
|
super(configs.languageSwitcher.endpoint);
|
|
801
759
|
}
|
|
802
760
|
/**
|
|
@@ -833,12 +791,12 @@ var LanguageService = class extends BaseService {
|
|
|
833
791
|
};
|
|
834
792
|
|
|
835
793
|
// src/transforms/topics.ts
|
|
836
|
-
import {
|
|
794
|
+
import { getClientConfigs as getClientConfigs5 } from "@c-rex/utils/next-cookies";
|
|
837
795
|
import { cookies as cookies4 } from "next/headers";
|
|
838
796
|
import { CrexLogger as CrexLogger3 } from "@c-rex/core/logger";
|
|
839
797
|
var transformTopics = async (data) => {
|
|
840
798
|
const logger = new CrexLogger3();
|
|
841
|
-
const config =
|
|
799
|
+
const config = getClientConfigs5();
|
|
842
800
|
const uiLang = (cookies4().get(UI_LANG_KEY)?.value || config.languageSwitcher.default).toLowerCase();
|
|
843
801
|
const items = data.items.map((item) => {
|
|
844
802
|
const type = item.class.labels.filter((item2) => item2.language === EN_LANG)[0].value.toUpperCase();
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/requests.ts","../../constants/src/index.ts","../../core/src/logger.ts","../../core/src/transports/matomo.ts","../../core/src/transports/graylog.ts","../../utils/src/utils.ts","../../utils/src/classMerge.ts","../../utils/src/call.ts","../../utils/src/params.ts","../../utils/src/renditions.ts","../src/baseService.ts","../src/renditions.ts","../src/directoryNodes.ts","../src/transforms/documentTypes.ts","../src/documentTypes.ts","../src/transforms/information.ts","../src/informationUnits.ts","../src/language.ts","../src/transforms/topics.ts","../src/topics.ts"],"sourcesContent":["import axios, { AxiosResponse, Method, AxiosInstance } from \"axios\";\nimport { API, CREX_TOKEN_HEADER_KEY, SDK_CONFIG_KEY } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { cookies } from \"next/headers\";\nimport { CrexLogger } from \"./logger\";\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 logger!: CrexLogger;\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 logger.\n * \n * @private\n */\n private async initAPI() {\n this.logger = new CrexLogger();\n\n if (!this.customerConfig) {\n const aux = cookies().get(SDK_CONFIG_KEY);\n if (aux != undefined) {\n this.customerConfig = JSON.parse(aux.value);\n } else {\n this.logger.log({\n level: \"error\",\n message: `utils.initAPI error: Config cookie not available`\n });\n\n throw new Error(\"Config cookie not available\");\n }\n }\n\n if (!this.apiClient) {\n this.apiClient = axios.create({\n baseURL: this.customerConfig.baseUrl,\n })\n }\n }\n\n private async getToken() {\n try {\n const response = await fetch(`${this.customerConfig.publicNextApiUrl}/api/token`, {\n method: 'POST',\n credentials: 'include',\n });\n\n const { token } = await response.json();\n\n return token;\n } catch (error) {\n this.logger.log({\n level: \"error\",\n message: `utils.getToken error: ${error}`\n });\n\n throw error\n }\n }\n\n private async manageToken() {\n try {\n let token = \"\";\n const hasToken = cookies().get(CREX_TOKEN_HEADER_KEY);\n\n if (hasToken == undefined || hasToken.value === null) {\n const tokenResult = await this.getToken();\n\n if (tokenResult === null) throw new Error(\"Token is undefined\");\n\n token = tokenResult;\n } else {\n token = hasToken.value;\n }\n\n return token;\n } catch (error) {\n this.logger.log({\n level: \"error\",\n message: `CrexAPI.manageToken error: ${error}`\n });\n\n throw error\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 if (this.customerConfig.OIDC.client.enabled) {\n const token = await this.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 this.logger.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 BLOG_TYPE_AND_LINK = \"blog\";\nexport const DOCUMENTS_TYPE_AND_LINK = \"documents\";\n\nexport const TOPIC = \"TOPIC\";\nexport const DOCUMENT = \"DOCUMENT\";\nexport const PACKAGE = \"PACKAGE\";\nexport const FRAGMENT = \"FRAGMENT\";\n\nexport const RESULT_TYPES = {\n TOPIC: TOPIC,\n DOCUMENT: DOCUMENT,\n PACKAGE: PACKAGE,\n FRAGMENT: FRAGMENT\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\";\n\nexport const WILD_CARD_OPTIONS = {\n BOTH: \"BOTH\",\n END: \"END\",\n START: \"START\",\n NONE: \"NONE\",\n} as const;\n\nexport const OPERATOR_OPTIONS = {\n AND: \"AND\",\n OR: \"OR\",\n} as const;\n\nexport const ARTICLE_PAGE_LAYOUT = {\n BLOG: \"BLOG\",\n DOCUMENT: \"DOCUMENT\",\n} as const;\n\nexport const DEVICE_OPTIONS = {\n MOBILE: \"mobile\",\n TABLET: \"tablet\",\n DESKTOP: \"desktop\",\n}\nexport const BREAKPOINTS = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};","import winston from \"winston\";\nimport { MatomoTransport } from \"./transports/matomo\";\nimport { GraylogTransport } from \"./transports/graylog\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { LOG_LEVELS } from \"@c-rex/constants\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\n\n/**\n * Logger class for the CREX application.\n * Provides logging functionality with multiple transports (Console, Matomo, Graylog).\n */\nexport class CrexLogger {\n private customerConfig!: ConfigInterface;\n public logger!: winston.Logger;\n\n /**\n * Initializes the logger instance if it hasn't been initialized yet.\n * Loads customer configuration and creates the logger with appropriate transports.\n * \n * @private\n */\n private async initLogger() {\n try {\n if (!this.customerConfig) {\n this.customerConfig = await getConfigs();\n }\n if (!this.logger) {\n this.logger = this.createLogger();\n }\n } catch (error) {\n console.error(\"Error initializing logger:\", error);\n }\n }\n\n /**\n * Logs a message with the specified level and optional category.\n * \n * @param options - Logging options\n * @param options.level - The log level (error, warn, info, etc.)\n * @param options.message - The message to log\n * @param options.category - Optional category for the log message\n */\n public async log({ level, message, category }: {\n level: LogLevelType,\n message: string,\n category?: LogCategoriesType\n }) {\n await this.initLogger();\n this.logger.log(level, message, category);\n }\n\n /**\n * Creates a new Winston logger instance with configured transports.\n * \n * @private\n * @returns A configured Winston logger instance\n */\n private createLogger() {\n return winston.createLogger({\n levels: LOG_LEVELS,\n transports: [\n new winston.transports.Console({\n level: this.customerConfig.logs.console.minimumLevel,\n silent: this.customerConfig.logs.console.silent,\n }),\n new MatomoTransport(this.customerConfig),\n new GraylogTransport(this.customerConfig),\n ],\n });\n }\n}","import Transport from \"winston-transport\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { ALL } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\n\n/**\n * Winston transport for sending logs to Matomo analytics.\n * Extends the base Winston transport with Matomo-specific functionality.\n */\nexport class MatomoTransport extends Transport {\n public matomoTransport: any;\n private configs: ConfigInterface;\n\n /**\n * Creates a new instance of MatomoTransport.\n * \n * @param configs - The application configuration containing logging settings\n */\n constructor(configs: ConfigInterface) {\n super({\n level: configs.logs.matomo.minimumLevel,\n silent: configs.logs.matomo.silent,\n });\n\n this.matomoTransport = new Transport();\n this.configs = configs;\n }\n\n /**\n * Logs a message to Matomo if the message category is included in the configured categories.\n * \n * @param info - The log information including level, message, and category\n * @param callback - Callback function to execute after logging\n */\n log(\n info: { level: LogLevelType, message: string, category: LogCategoriesType },\n callback: () => void,\n ): void {\n const matomoCategory = this.configs.logs.matomo.categoriesLevel\n\n if (matomoCategory.includes(info.category) || matomoCategory.includes(ALL)) {\n this.matomoTransport.log(info, callback);\n }\n }\n}\n","import Transport from \"winston-transport\";\nimport Graylog2Transport from \"winston-graylog2\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { ALL } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\n\n/**\n * Winston transport for sending logs to Graylog.\n * Extends the base Winston transport with Graylog-specific functionality.\n */\nexport class GraylogTransport extends Transport {\n public graylogTransport: any;\n private configs: ConfigInterface\n\n /**\n * Creates a new instance of GraylogTransport.\n * \n * @param configs - The application configuration containing logging settings\n */\n constructor(configs: ConfigInterface) {\n super({\n level: configs.logs.graylog.minimumLevel,\n silent: configs.logs.graylog.silent,\n });\n\n this.configs = configs;\n this.graylogTransport = new Graylog2Transport({\n name: \"crex.net.documentation\",\n //name: \"crex.net.blog\",\n silent: false,\n handleExceptions: false,\n graylog: {\n servers: [\n { host: \"localhost\", port: 12201 },\n { host: \"https://log.c-rex.net\", port: 12202 }\n\n //TODO: check the URL => https://log.c-rex.net:12202/gelf\" GELF??\n ],\n },\n });\n }\n\n /**\n * Logs a message to Graylog if the message category is included in the configured categories.\n * \n * @param info - The log information including level, message, and category\n * @param callback - Callback function to execute after logging\n */\n log(\n info: { level: LogLevelType, message: string, category: LogCategoriesType },\n callback: () => void,\n ): void {\n const graylogCategory = this.configs.logs.graylog.categoriesLevel\n\n if (graylogCategory.includes(info.category) || graylogCategory.includes(ALL)) {\n this.graylogTransport.log(info, callback);\n }\n }\n}\n","import { FLAGS_BY_LANG } from \"@c-rex/constants\";\nimport { AvailableVersionsInterface, informationUnitsResponseItem } from \"@c-rex/interfaces\";\n\nexport const _generateShaKey = (input: string): string => {\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n hash = (hash << 5) - hash + input.charCodeAt(i);\n hash |= 0;\n }\n return Math.abs(hash).toString(16);\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 formatDateToLocale = (date: string, locale: string): string => {\n if (typeof date !== 'string' || !date) {\n return date;\n }\n\n const dateAux = new Date(date);\n return new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: 'long',\n year: 'numeric'\n }).format(dateAux);\n}\n\nexport const createAvailableVersionList = (\n versions: informationUnitsResponseItem[],\n articleLang: string,\n type: string\n): AvailableVersionsInterface[] => {\n\n const availableVersions = versions.map(item => {\n return {\n shortId: item.shortId,\n active: item.language === articleLang,\n lang: item.language,\n country: item.language.split(\"-\")[1],\n link: `/${type}/${item.shortId}`,\n }\n }).sort((a, b) => {\n if (a.lang < b.lang) return -1;\n if (a.lang > b.lang) return 1;\n return 0;\n }) as AvailableVersionsInterface[];\n\n return availableVersions;\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 { _generateShaKey } from \"./utils\"\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\n */\nexport const call = async<T = unknown>(method: string, params?: any): Promise<T> => {\n type result = {\n data: string,\n expireDate: Date,\n }\n\n const shaKey = _generateShaKey(JSON.stringify({ method, params }))\n const cache = localStorage.getItem(shaKey)\n\n if (cache !== null) {\n const { data, expireDate } = JSON.parse(cache) as result\n\n if (new Date(expireDate) > new Date()) {\n return JSON.parse(data) as T\n } else {\n localStorage.removeItem(shaKey)\n }\n }\n\n const res = await fetch(`/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 const today = new Date()\n const result: result = {\n data: JSON.stringify(json.data),\n expireDate: new Date(today.getTime() + 1000 * 60 * 60),\n }\n\n localStorage.setItem(shaKey, JSON.stringify(result))\n\n return json.data;\n}","import { QueryParams } from '@c-rex/types';\n\n/**\n * Creates an array of parameter objects from a list of field values.\n * @param fieldsList - Array of field values to transform into parameter objects\n * @param key - The key to use for each parameter object (defaults to \"Fields\")\n * @returns An array of objects with key-value pairs\n */\nexport const createParams = (fieldsList: string[], key: string = \"Fields\") =>\n fieldsList.map((item) => ({\n key: key,\n value: item,\n }));\n\n/**\n * Generates a URL query string from an array of parameter objects.\n * @param params - Array of QueryParams objects containing key-value pairs\n * @returns A URL-encoded query string\n */\nexport const generateQueryParams = (params: QueryParams[]): string => {\n const queryParams = params\n .map((param) => `${encodeURIComponent(param.key)}=${encodeURIComponent(param.value)}`)\n .join(\"&\");\n return queryParams;\n};\n","import { informationUnitsRenditions } from \"@c-rex/interfaces\";\nimport { DocumentsType } from \"@c-rex/types\";\n\n\nexport const getFileRenditions = ({ renditions }: { renditions: informationUnitsRenditions[] }): DocumentsType => {\n if (renditions == undefined || renditions.length == 0) {\n return {};\n }\n\n const filteredRenditions = renditions.filter(\n (item) => item.format != \"application/xhtml+xml\" && item.format != \"application/json\" && item.format != \"application/llm+xml\"\n );\n\n if (filteredRenditions.length == 0 || filteredRenditions[0] == undefined) {\n return {};\n }\n\n const result: {\n [key: string]: {\n view: string;\n download: string;\n }\n } = {}\n\n filteredRenditions.forEach((item) => {\n const key = item.format\n\n if (result[key] == undefined) {\n result[key] = {\n view: \"\",\n download: \"\"\n }\n }\n\n result[key].download = item.links.filter((link) => link.rel == \"download\")[0]?.href\n result[key].view = item.links.filter((link) => link.rel == \"view\")[0]?.href\n })\n\n return result\n}","import { CrexApi } from \"@c-rex/core\";\nimport { QueryParams } from \"@c-rex/types\";\nimport { call, generateQueryParams } from \"@c-rex/utils\";\nimport { Method } from \"axios\";\n\n/**\n * Base service class that provides common functionality for API interactions.\n * All specific service classes extend this base class.\n */\nexport class BaseService {\n protected api: CrexApi;\n private endpoint: string;\n\n /**\n * Creates a new instance of BaseService.\n * \n * @param endpoint - The API endpoint URL for this service\n */\n constructor(endpoint: string) {\n this.api = new CrexApi();\n this.endpoint = endpoint;\n }\n\n /**\n * Makes an API request to the specified endpoint.\n * \n * @param options - Request configuration options\n * @param options.path - Optional path to append to the endpoint\n * @param options.params - Optional query parameters to include in the request\n * @param options.method - HTTP method to use (defaults to 'get')\n * @param options.transformer - Optional function to transform the response data\n * @returns The response data, optionally transformed\n * @throws Error if the API request fails\n */\n protected async request<T>({\n path = \"\",\n method = \"get\",\n params = [],\n headers = {},\n transformer = (response: any) => response,\n }: {\n path?: string,\n method?: Method,\n params?: QueryParams[],\n headers?: any,\n transformer?: (data: any) => T,\n }): Promise<T> {\n try {\n let url = `${this.endpoint}${path}`;\n\n const queryParams = generateQueryParams(params);\n if (queryParams.length > 0) {\n url += `?${queryParams}`;\n }\n\n const response = await this.api.execute({\n url,\n method,\n headers,\n })\n\n return await transformer(response);\n\n } catch (error) {\n call(\"CrexLogger.log\", {\n level: \"error\",\n message: `BaseService.request error when request ${path}. Error: ${error}`\n });\n\n throw error;\n }\n }\n}\n\n","import { BaseService } from \"./baseService\";\nimport { informationUnitsRenditions } from \"@c-rex/interfaces\";\n\n/**\n * Service for interacting with renditions in the API.\n * Provides methods to retrieve and process different types of renditions.\n */\nexport class RenditionsService extends BaseService {\n constructor() {\n super(\"Renditions/\");\n }\n\n /**\n * Retrieves the HTML rendition from a list of renditions.\n * Filters for renditions with format 'application/xhtml+xml' and rel 'view'.\n * \n * @param renditions - Array of rendition objects to process\n * @returns A promise that resolves to the HTML content as a string, or empty string if no suitable rendition is found\n * @throws Error if the API request fails\n */\n public async getHTMLRendition({ renditions }: { renditions: informationUnitsRenditions[] }): Promise<string> {\n const filteredRenditions = renditions.filter(\n (item) => item.format == \"application/xhtml+xml\",\n );\n\n if (filteredRenditions.length == 0 || filteredRenditions[0] == undefined) return \"\";\n const item = filteredRenditions[0];\n const filteredLinks = item.links.filter((item) => item.rel == \"view\");\n\n if (filteredLinks.length == 0 || filteredLinks[0] == undefined) return \"\";\n const url = filteredLinks[0].href;\n const response = await this.api.execute({\n url,\n method: \"get\",\n headers: {\n Accept: \"application/xhtml+xml\",\n },\n })\n\n return response as string;\n }\n}","import { BaseService } from \"./baseService\";\nimport { createParams } from \"@c-rex/utils\";\nimport { DirectoryNodes, DirectoryNodesResponse } from \"@c-rex/interfaces\";\n\n/**\n * Service for interacting with directory nodes in the API.\n * Provides methods to retrieve directory node information.\n */\nexport class DirectoryNodesService extends BaseService {\n constructor() {\n super(\"DirectoryNodes/\");\n }\n\n /**\n * Retrieves a specific directory node by its ID.\n * \n * @param id - The unique identifier of the directory node\n * @returns A promise that resolves to the directory node data\n * @throws Error if the API request fails\n */\n public async getItem(id: string): Promise<DirectoryNodes> {\n return await this.request({\n path: id,\n });\n }\n\n /**\n * Retrieves a list of directory nodes based on specified filters.\n * \n * @param options - Options for filtering the directory nodes list\n * @param options.filters - Optional array of filter strings to apply\n * @returns A promise that resolves to the directory nodes response\n * @throws Error if the API request fails\n */\n public async getList({\n filters = [],\n }: {\n filters?: string[],\n }): Promise<DirectoryNodesResponse> {\n\n const remainFilters = createParams(filters, \"Filter\");\n\n return await this.request({\n params: {\n ...remainFilters,\n },\n });\n }\n}\n","import { CONTENT_LANG_KEY } from \"@c-rex/constants\";\nimport { DefaultRequest } from \"@c-rex/interfaces\";\nimport { DocumentTypesItem } from \"@c-rex/interfaces\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from \"next/headers\";\n\nexport const transformDocumentTypes = (data: DefaultRequest<DocumentTypesItem>) => {\n const labels: { shortId: string, label: string }[] = [];\n const config = getConfigs();\n const contentLanguage = cookies().get(CONTENT_LANG_KEY)?.value || config.languageSwitcher.default;\n const language = contentLanguage.split(\"-\")[0];\n\n data.items.forEach((documentItem) => {\n const label = documentItem.labels.find((item) => item.language.toLowerCase() === language.toLowerCase());\n\n labels.push({\n shortId: documentItem.shortId,\n label: label ? label.value : \"\"\n })\n });\n\n return labels;\n};\n","import { transformDocumentTypes } from \"./transforms/documentTypes\";\nimport { BaseService } from \"./baseService\";\n\n/**\n * Service for interacting with document types in the API.\n * Provides methods to retrieve document type information.\n */\nexport class DocumentTypesService extends BaseService {\n constructor() {\n super(\"DocumentTypes/\");\n }\n\n /**\n * Retrieves document type labels for the specified fields.\n * \n * @returns A promise that resolves to an array of label strings\n * @throws Error if the API request fails\n */\n public async getLabels(): Promise<{ shortId: string, label: string }[]> {\n return await this.request({\n params: [{\n key: \"sparqlWhere\",\n value: \"?iu iirds:is-applicable-for-document-type ?s . ?iu iirds:has-topic-type <https://www.c-rex.net/iirds/td#Blogpost>\"\n }],\n transformer: transformDocumentTypes,\n });\n }\n}\n","import { CONTENT_LANG_KEY, EN_LANG, RESULT_TYPES } from \"@c-rex/constants\";\nimport {\n DefaultRequest,\n informationUnitsResponse,\n informationUnitsItems,\n} from \"@c-rex/interfaces\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from 'next/headers';\nimport { getFileRenditions } from \"@c-rex/utils\";\nimport { CrexLogger } from '@c-rex/core/logger';\nimport { AutocompleteSuggestion } from \"@c-rex/interfaces\";\n\nexport const transformInformationUnits = async (data: DefaultRequest<informationUnitsItems>): Promise<informationUnitsResponse> => {\n const logger = new CrexLogger()\n const config = await getConfigs();\n const filteredTags: any = {}\n\n const items = data.items.map((item) => {\n const type = item.class.labels.filter((item) => item.language === EN_LANG)[0].value.toUpperCase();\n const files = getFileRenditions({ renditions: item?.renditions });\n\n let link = `/topics/${item.shortId}`;\n\n if (config.results.articlePageLayout == \"BLOG\") {\n link = `/blog/${item.shortId}`\n } else if (type == RESULT_TYPES.DOCUMENT) {\n link = `/documents/${item.shortId}`;\n }\n\n let title = \"NO TITLE\"\n let language = \"NO LANGUAGE\"\n\n try {\n if (item.titles) {\n title = item.titles[0].value\n language = item.titles[0].language\n } else {\n title = item.labels[0].value\n language = item.labels[0].language\n }\n } catch {\n logger.log({\n level: \"error\",\n message: `No label or title on item ${item.shortId}`\n })\n }\n\n return {\n language: language,\n title: title,\n type: type,\n localeType: \"\",\n shortId: item.shortId,\n disabled: config.results.disabledResults.includes(type as any),\n link: link,\n files\n }\n });\n\n if (data.tags) {\n const contentLang = (cookies().get(CONTENT_LANG_KEY)?.value || EN_LANG).toLowerCase()\n const splittedContentLang = contentLang.split(\"-\")[0];\n\n for (const [key, value] of Object.entries(data.tags)) {\n\n if (!value || !value.items || value.items.length === 0) {\n continue;\n }\n if (!config.search.tags.includes(key)) {\n continue;\n }\n\n const aux = value.items.map(item => {\n if (item?.shortId === undefined) return null\n if (Number(item.hits) === 0) return null\n if (item?.labels === undefined || item?.labels.length === 0) {\n logger.log({\n level: \"warning\",\n message: `No labels on item with id ${item.shortId} from category ${key}`\n })\n return null;\n }\n\n let label = \"\"\n\n for (const labelItem of item.labels) {\n if (labelItem.language === undefined) {\n logger.log({\n level: \"info\",\n message: `No language on label ${labelItem.value} from category ${key}`\n })\n label = labelItem.value\n break;\n }\n\n if (labelItem.language.toLowerCase() === contentLang || labelItem.language.toLowerCase() === splittedContentLang) {\n label = labelItem.value\n break;\n }\n\n label = labelItem.value\n\n //TODO: fallback in english\n }\n\n return {\n hits: item.hits,\n total: item.total,\n label: label,\n active: false,\n shortId: item.shortId,\n }\n }).filter((item) => item !== null)\n\n if (aux.length === 0) {\n continue;\n }\n\n filteredTags[key] = aux;\n }\n }\n\n return {\n tags: filteredTags,\n items: items,\n pageInfo: data.pageInfo,\n };\n};\n\nexport const transformSuggestions = (data: AutocompleteSuggestion, query: string) => {\n const suggestions: string[] = []\n const comparableList: string[] = []\n\n data.suggestions.forEach((item) => {\n suggestions.push(item.value);\n comparableList.push(item.value.toLowerCase())\n })\n\n if (!comparableList.includes(query.toLowerCase())) {\n return [query, ...suggestions];\n }\n\n return suggestions\n}","import {\n AutocompleteSuggestion,\n informationUnitsResponse,\n informationUnitsItems,\n} from \"@c-rex/interfaces\";\nimport { transformInformationUnits, transformSuggestions } from \"./transforms/information\";\nimport { createParams } from \"@c-rex/utils\";\nimport { BaseService } from \"./baseService\";\nimport { OperatorType, WildCardType } from \"@c-rex/types\";\nimport { OPERATOR_OPTIONS, WILD_CARD_OPTIONS } from \"@c-rex/constants\";\n\n/**\n * Service for interacting with information units in the API.\n * Provides methods to retrieve and search information units.\n */\nexport class InformationUnitsService extends BaseService {\n constructor() {\n super(\"InformationUnits/\");\n }\n\n /**\n * Retrieves a list of information units based on specified criteria.\n * \n * @param options - Options for filtering and paginating the information units list\n * @param options.queries - Optional search query string\n * @param options.page - Optional page number for pagination (defaults to 1)\n * @param options.fields - Optional array of fields to include in the response\n * @param options.filters - Optional array of filter strings to apply\n * @param options.languages - Optional array of language codes to filter by\n * @returns A promise that resolves to the information units response\n * @throws Error if the API request fails\n */\n public async getList({\n queries = \"\",\n page = 1,\n fields = [],\n filters = [],\n tags = [],\n restrict = [],\n languages = [],\n wildcard = WILD_CARD_OPTIONS.BOTH,\n operator = OPERATOR_OPTIONS.AND,\n like = false,\n }: {\n queries?: string,\n page?: number,\n filters?: string[],\n restrict?: string[],\n fields?: string[],\n tags?: string[],\n languages?: string[],\n wildcard?: WildCardType,\n operator?: OperatorType,\n like?: boolean,\n }): Promise<informationUnitsResponse> {\n const remainFields = createParams(fields, \"Fields\");\n const remainFilters = createParams(filters, \"Filter\");\n const restrictions = createParams(restrict, \"Restrict\");\n const remainTags = createParams(tags, \"Tags\");\n const languageParam = `VALUES ?lang { ${languages.map(lang => `\"${lang}\"`).join(\" \")} } ?s iirds:language ?lang .`\n\n const params = [\n { key: \"pageSize\", value: \"12\" },\n { key: \"wildcard\", value: wildcard.toLowerCase() },\n { key: \"PageNumber\", value: page.toString() },\n { key: \"Operator\", value: operator },\n { key: \"Like\", value: like.toString() },\n ...remainTags,\n ...remainFields,\n ...remainFilters,\n ...restrictions\n ];\n if (languages.length > 0) {\n params.push({ key: \"sparqlWhere\", value: languageParam });\n }\n if (queries.length > 0) {\n params.push(\n { key: \"Query\", value: queries },\n );\n }\n\n return await this.request({\n params: params,\n transformer: transformInformationUnits\n });\n }\n\n /**\n * Retrieves a specific information unit by its ID.\n * Includes renditions, directory nodes, version information, titles, languages, and labels.\n * \n * @param options - Options for retrieving the information unit\n * @param options.id - The unique identifier of the information unit\n * @returns A promise that resolves to the information unit data\n * @throws Error if the API request fails\n */\n public async getItem({ id, shouldGetAllFields = false }: { id: string, shouldGetAllFields?: boolean }): Promise<informationUnitsItems> {\n const params = []\n\n if (!shouldGetAllFields) {\n params.push(\n { key: \"Fields\", value: \"renditions\" },\n { key: \"Fields\", value: \"directoryNodes\" },\n { key: \"Fields\", value: \"versionOf\" },\n { key: \"Fields\", value: \"titles\" },\n { key: \"Fields\", value: \"languages\" },\n { key: \"Fields\", value: \"labels\" },\n { key: \"Fields\", value: \"packages\" },\n { key: \"Fields\", value: \"created\" },\n { key: \"Fields\", value: \"revision\" },\n );\n }\n\n return await this.request({\n path: id,\n params,\n });\n }\n\n /**\n * Retrieves autocomplete suggestions based on a query prefix.\n * \n * @param options - Options for retrieving suggestions\n * @param options.query - The query prefix to get suggestions for\n * @param options.language - The language of the suggestions\n * @returns A promise that resolves to an array of suggestion strings\n * @throws Error if the API request fails\n */\n public async getSuggestions(\n { query, language }: { query: string, language: string }\n ): Promise<string[]> {\n\n return await this.request({\n path: 'Suggestions',\n params: [\n { key: \"prefix\", value: query },\n { key: \"lang\", value: language },\n ],\n transformer: (data: AutocompleteSuggestion) => transformSuggestions(data, query)\n });\n }\n}\n","import { LanguageAndCountries } from \"@c-rex/interfaces\";\nimport { BaseService } from \"./baseService\";\nimport { getCountryCodeByLang } from \"@c-rex/utils\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\n\n/**\n * Service for interacting with language-related functionality in the API.\n * Provides methods to retrieve language and country information.\n */\nexport class LanguageService extends BaseService {\n constructor() {\n const configs = getConfigs()\n super(configs.languageSwitcher.endpoint);\n }\n\n /**\n * Retrieves a list of available languages and their associated countries.\n * Transforms the API response to include language code, country code, and original value.\n * \n * @returns A promise that resolves to an array of language and country objects\n * @throws Error if the API request fails\n */\n public async getLanguagesAndCountries(): Promise<LanguageAndCountries[]> {\n return await this.request({\n transformer: (data: { value: string; score: number }[]) => {\n const countryCodeList = data.map((item) => {\n /*\n api -> en, en-US\n default -> en-US. Then use EN-US \n\n api -> en\n default -> en-US. Then use EN\n */\n //should be abble to handle this items: en-US, en, pt, pt-PT, pt-BR \n\n const splittedValue = item.value.split(\"-\")\n const lang = splittedValue[0]\n let country = splittedValue[0]\n\n if (splittedValue.length > 1) {\n country = splittedValue[1]\n } else {\n country = getCountryCodeByLang(lang)\n }\n\n return {\n country: country,\n lang: lang,\n value: item.value,\n }\n })\n\n return countryCodeList.sort((a, b) => {\n return a.value.localeCompare(b.value)\n })\n },\n });\n }\n}\n","import { EN_LANG, RESULT_TYPES, UI_LANG_KEY } from \"@c-rex/constants\";\nimport { DefaultRequest, TopicsRequestItem, DefaultResponse, TopicsResponseItem } from \"@c-rex/interfaces\";\nimport { getConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from 'next/headers';\nimport { CrexLogger } from '@c-rex/core/logger';\nimport { formatDateToLocale } from \"@c-rex/utils\";\n\nexport const transformTopics = async (data: DefaultRequest<TopicsRequestItem>): Promise<DefaultResponse<TopicsResponseItem, null>> => {\n const logger = new CrexLogger()\n const config = getConfigs();\n const uiLang = (cookies().get(UI_LANG_KEY)?.value || config.languageSwitcher.default).toLowerCase()\n\n const items = data.items.map(item => {\n const type = item.class.labels.filter((item) => item.language === EN_LANG)[0].value.toUpperCase();\n\n let link = `/topics/${item.shortId}`;\n\n if (config.results.articlePageLayout == \"BLOG\") {\n link = `/blog/${item.shortId}`\n } else if (type == RESULT_TYPES.DOCUMENT) {\n link = `/documents/${item.shortId}`;\n }\n\n let title = \"NO TITLE\"\n let language = \"NO LANGUAGE\"\n\n try {\n if (item.titles) {\n title = item.titles[0].value\n language = item.titles[0].language\n } else {\n title = item.labels[0].value\n language = item.labels[0].language\n }\n } catch {\n logger.log({\n level: \"error\",\n message: `No label or title on item ${item.shortId}`\n })\n }\n\n let renditionUrl = \"\"\n const renditions = item.renditions.filter(item => item.format == \"application/xhtml+xml\");\n if (renditions.length > 0 || renditions[0] !== undefined) {\n const filteredLinks = renditions[0].links.filter((renditionItem) => renditionItem.rel == \"view\");\n if (filteredLinks.length > 0 || filteredLinks[0] !== undefined) {\n renditionUrl = filteredLinks[0].href;\n };\n };\n\n let categoryType = type\n if (item.applicableForTypes && item.applicableForTypes.length > 0) {\n const splittedContentLang = uiLang.split(\"-\")[0];\n categoryType = item.applicableForTypes[0].labels.find(item => item.language === splittedContentLang)?.value || categoryType;\n }\n\n return {\n language: language,\n title: title,\n type: categoryType,\n localeType: \"\",\n shortId: item.shortId,\n created: formatDateToLocale(item.created, uiLang),\n disabled: config.results.disabledResults.includes(type as any),\n link: link,\n renditionUrl: renditionUrl,\n image: null,\n description: null,\n }\n })\n\n return {\n tags: null,\n items: items,\n pageInfo: data.pageInfo,\n };\n};\n","import { transformTopics } from \"./transforms/topics\";\nimport { createParams } from \"@c-rex/utils\";\nimport { BaseService } from \"./baseService\";\nimport { OperatorType, WildCardType } from \"@c-rex/types\";\nimport { OPERATOR_OPTIONS, WILD_CARD_OPTIONS } from \"@c-rex/constants\";\nimport { DefaultResponse, TopicsResponseItem } from \"@c-rex/interfaces\";\n\ntype getListProps = {\n queries?: string,\n page?: number,\n filters?: string[],\n fields?: string[],\n languages?: string[],\n wildcard?: WildCardType,\n operator?: OperatorType,\n like?: boolean,\n pageSize?: number\n}\n\n\n/**\n * Service for interacting with information units in the API.\n * Provides methods to retrieve and search information units.\n */\nexport class TopicsService extends BaseService {\n constructor() {\n super(\"Topics/\");\n }\n\n /**\n * Retrieves a list of topics based on specified criteria.\n * \n * @param options - Options for filtering and paginating the topics list\n * @param options.queries - Optional search query string\n * @param options.page - Optional page number for pagination (defaults to 1)\n * @param options.fields - Optional array of fields to include in the response\n * @param options.filters - Optional array of filter strings to apply\n * @param options.languages - Optional array of language codes to filter by\n * @returns A promise that resolves to the information units response\n * @throws Error if the API request fails\n */\n public async getList({\n queries = \"\",\n page = 1,\n fields = [],\n filters = [],\n languages = [],\n wildcard = WILD_CARD_OPTIONS.BOTH,\n operator = OPERATOR_OPTIONS.AND,\n pageSize = 12\n }: getListProps): Promise<DefaultResponse<TopicsResponseItem, null>> {\n const remainFields = createParams(fields, \"Fields\");\n const remainFilters = createParams(filters, \"Filter\");\n\n const params = [\n { key: \"pageSize\", value: pageSize.toString() },\n { key: \"PageNumber\", value: page.toString() },\n { key: \"Sort\", value: \"-created;-score\" },\n { key: \"Operator\", value: operator },\n { key: \"wildcard\", value: wildcard.toLowerCase() },\n ...remainFields,\n ...remainFilters,\n ];\n\n if (languages.length > 0) {\n const languageParam = `VALUES ?lang { ${languages.map(lang => `\"${lang}\"`).join(\" \")} } ?s iirds:language ?lang .`\n params.push({ key: \"sparqlWhere\", value: languageParam });\n }\n if (queries.length > 0) {\n params.push(\n { key: \"Query\", value: queries },\n );\n }\n\n return await this.request({\n params: params,\n transformer: transformTopics\n });\n }\n}\n"],"mappings":"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","names":["Transport","Transport","item","getConfigs","cookies","getConfigs","cookies","CrexLogger","getConfigs","item","cookies","getConfigs","getConfigs","cookies","CrexLogger","CrexLogger","getConfigs","cookies","item"]}
|
|
1
|
+
{"version":3,"sources":["../../core/src/requests.ts","../../constants/src/index.ts","../../core/src/logger.ts","../../core/src/transports/matomo.ts","../../core/src/transports/graylog.ts","../../utils/src/utils.ts","../../utils/src/classMerge.ts","../../utils/src/params.ts","../../utils/src/renditions.ts","../src/baseService.ts","../src/renditions.ts","../src/directoryNodes.ts","../src/transforms/documentTypes.ts","../src/documentTypes.ts","../src/transforms/information.ts","../src/informationUnits.ts","../src/language.ts","../src/transforms/topics.ts","../src/topics.ts"],"sourcesContent":["import axios, { AxiosResponse, Method, AxiosInstance } from \"axios\";\nimport { API, CREX_TOKEN_HEADER_KEY, SDK_CONFIG_KEY } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { cookies } from \"next/headers\";\nimport { CrexLogger } from \"./logger\";\nimport { getServerConfigs, getClientConfigs } from \"@c-rex/utils/next-cookies\";\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 logger!: CrexLogger;\n private publicNextApiUrl!: string;\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 logger.\n * \n * @private\n */\n private async initAPI() {\n this.logger = new CrexLogger();\n\n if (!this.customerConfig) {\n this.customerConfig = await getServerConfigs();\n }\n\n if (!this.publicNextApiUrl) {\n this.publicNextApiUrl = await getClientConfigs().publicNextApiUrl;\n }\n\n if (!this.apiClient) {\n this.apiClient = axios.create({\n baseURL: this.customerConfig.baseUrl,\n })\n }\n }\n\n private async getToken() {\n for (let retry = 0; retry < API.MAX_RETRY; retry++) {\n try {\n const response = await fetch(`${this.publicNextApiUrl}/api/token`, {\n method: 'POST',\n credentials: 'include',\n });\n\n const { token } = await response.json();\n\n return token;\n } catch (error) {\n this.logger.log({\n level: \"error\",\n message: `utils.getToken ${retry + 1}º error when request token. Error: ${error}`\n });\n\n await new Promise(resolve => setTimeout(resolve, API.RETRY_DELAY));\n\n if (retry === API.MAX_RETRY) {\n throw error;\n }\n }\n }\n }\n\n private async manageToken() {\n try {\n let token = \"\";\n const hasToken = cookies().get(CREX_TOKEN_HEADER_KEY);\n\n if (hasToken == undefined || hasToken.value === null) {\n const tokenResult = await this.getToken();\n\n if (tokenResult === null) throw new Error(\"Token is undefined\");\n\n token = tokenResult;\n } else {\n token = hasToken.value;\n }\n\n return token;\n } catch (error) {\n this.logger.log({\n level: \"error\",\n message: `CrexAPI.manageToken error: ${error}`\n });\n\n throw error\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 if (this.customerConfig.OIDC.client.enabled) {\n const token = await this.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 this.logger.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 RETRY_DELAY: 500,\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 BLOG_TYPE_AND_LINK = \"blog\";\nexport const DOCUMENTS_TYPE_AND_LINK = \"documents\";\n\nexport const TOPIC = \"TOPIC\";\nexport const DOCUMENT = \"DOCUMENT\";\nexport const PACKAGE = \"PACKAGE\";\nexport const FRAGMENT = \"FRAGMENT\";\n\nexport const RESULT_TYPES = {\n TOPIC: TOPIC,\n DOCUMENT: DOCUMENT,\n PACKAGE: PACKAGE,\n FRAGMENT: FRAGMENT\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 = 30 * 24 * 60 * 60 * 1000; // 30 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\";\n\nexport const WILD_CARD_OPTIONS = {\n BOTH: \"BOTH\",\n END: \"END\",\n START: \"START\",\n NONE: \"NONE\",\n} as const;\n\nexport const OPERATOR_OPTIONS = {\n AND: \"AND\",\n OR: \"OR\",\n} as const;\n\nexport const ARTICLE_PAGE_LAYOUT = {\n BLOG: \"BLOG\",\n DOCUMENT: \"DOCUMENT\",\n} as const;\n\nexport const DEVICE_OPTIONS = {\n MOBILE: \"mobile\",\n TABLET: \"tablet\",\n DESKTOP: \"desktop\",\n}\nexport const BREAKPOINTS = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};","import winston from \"winston\";\nimport { MatomoTransport } from \"./transports/matomo\";\nimport { GraylogTransport } from \"./transports/graylog\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { LOG_LEVELS } from \"@c-rex/constants\";\nimport { getServerConfigs } from \"@c-rex/utils/next-cookies\";\n\n/**\n * Logger class for the CREX application.\n * Provides logging functionality with multiple transports (Console, Matomo, Graylog).\n */\nexport class CrexLogger {\n private customerConfig!: ConfigInterface;\n public logger!: winston.Logger;\n\n /**\n * Initializes the logger instance if it hasn't been initialized yet.\n * Loads customer configuration and creates the logger with appropriate transports.\n * \n * @private\n */\n private async initLogger() {\n try {\n if (!this.customerConfig) {\n this.customerConfig = await getServerConfigs();\n }\n if (!this.logger) {\n this.logger = this.createLogger();\n }\n } catch (error) {\n console.error(\"Error initializing logger:\", error);\n }\n }\n\n /**\n * Logs a message with the specified level and optional category.\n * \n * @param options - Logging options\n * @param options.level - The log level (error, warn, info, etc.)\n * @param options.message - The message to log\n * @param options.category - Optional category for the log message\n */\n public async log({ level, message, category }: {\n level: LogLevelType,\n message: string,\n category?: LogCategoriesType\n }) {\n await this.initLogger();\n this.logger.log(level, message, category);\n }\n\n /**\n * Creates a new Winston logger instance with configured transports.\n * \n * @private\n * @returns A configured Winston logger instance\n */\n private createLogger() {\n return winston.createLogger({\n levels: LOG_LEVELS,\n transports: [\n new winston.transports.Console({\n level: this.customerConfig.logs.console.minimumLevel,\n silent: this.customerConfig.logs.console.silent,\n }),\n new MatomoTransport(this.customerConfig),\n new GraylogTransport(this.customerConfig),\n ],\n });\n }\n}","import Transport from \"winston-transport\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { ALL } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\n\n/**\n * Winston transport for sending logs to Matomo analytics.\n * Extends the base Winston transport with Matomo-specific functionality.\n */\nexport class MatomoTransport extends Transport {\n public matomoTransport: any;\n private configs: ConfigInterface;\n\n /**\n * Creates a new instance of MatomoTransport.\n * \n * @param configs - The application configuration containing logging settings\n */\n constructor(configs: ConfigInterface) {\n super({\n level: configs.logs.matomo.minimumLevel,\n silent: configs.logs.matomo.silent,\n });\n\n this.matomoTransport = new Transport();\n this.configs = configs;\n }\n\n /**\n * Logs a message to Matomo if the message category is included in the configured categories.\n * \n * @param info - The log information including level, message, and category\n * @param callback - Callback function to execute after logging\n */\n log(\n info: { level: LogLevelType, message: string, category: LogCategoriesType },\n callback: () => void,\n ): void {\n const matomoCategory = this.configs.logs.matomo.categoriesLevel\n\n if (matomoCategory.includes(info.category) || matomoCategory.includes(ALL)) {\n this.matomoTransport.log(info, callback);\n }\n }\n}\n","import Transport from \"winston-transport\";\nimport Graylog2Transport from \"winston-graylog2\";\nimport { LogCategoriesType, LogLevelType } from \"@c-rex/types\";\nimport { ALL } from \"@c-rex/constants\";\nimport { ConfigInterface } from \"@c-rex/interfaces\";\n\n/**\n * Winston transport for sending logs to Graylog.\n * Extends the base Winston transport with Graylog-specific functionality.\n */\nexport class GraylogTransport extends Transport {\n public graylogTransport: any;\n private configs: ConfigInterface\n\n /**\n * Creates a new instance of GraylogTransport.\n * \n * @param configs - The application configuration containing logging settings\n */\n constructor(configs: ConfigInterface) {\n if (!configs.logs.graylog.hostname || configs.logs.graylog.port === undefined) {\n throw new Error(\"Graylog hostname and port must be defined\");\n }\n\n super({\n level: configs.logs.graylog.minimumLevel,\n silent: configs.logs.graylog.silent,\n });\n\n this.configs = configs;\n this.graylogTransport = new Graylog2Transport({\n name: configs.logs.graylog.app,\n silent: configs.logs.graylog.silent,\n handleExceptions: false,\n graylog: {\n servers: [\n { host: \"localhost\", port: 12201 },\n { host: configs.logs.graylog.hostname, port: configs.logs.graylog.port }\n ],\n },\n });\n }\n\n /**\n * Logs a message to Graylog if the message category is included in the configured categories.\n * \n * @param info - The log information including level, message, and category\n * @param callback - Callback function to execute after logging\n */\n log(\n info: { level: LogLevelType, message: string, category: LogCategoriesType },\n callback: () => void,\n ): void {\n const graylogCategory = this.configs.logs.graylog.categoriesLevel\n\n if (graylogCategory.includes(info.category) || graylogCategory.includes(ALL)) {\n this.graylogTransport.log(info, callback);\n }\n }\n}\n","import { FLAGS_BY_LANG } from \"@c-rex/constants\";\nimport { AvailableVersionsInterface, informationUnitsResponseItem } from \"@c-rex/interfaces\";\n\nexport const _generateShaKey = (input: string): string => {\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n hash = (hash << 5) - hash + input.charCodeAt(i);\n hash |= 0;\n }\n return Math.abs(hash).toString(16);\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 formatDateToLocale = (date: string, locale: string): string => {\n if (typeof date !== 'string' || !date) {\n return date;\n }\n\n const dateAux = new Date(date);\n return new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: 'long',\n year: 'numeric'\n }).format(dateAux);\n}\n\nexport const createAvailableVersionList = (\n versions: informationUnitsResponseItem[],\n articleLang: string,\n type: string\n): AvailableVersionsInterface[] => {\n\n const availableVersions = versions.map(item => {\n return {\n shortId: item.shortId,\n active: item.language === articleLang,\n lang: item.language,\n country: item.language.split(\"-\")[1],\n link: `/${type}/${item.shortId}`,\n }\n }).sort((a, b) => {\n if (a.lang < b.lang) return -1;\n if (a.lang > b.lang) return 1;\n return 0;\n }) as AvailableVersionsInterface[];\n\n return availableVersions;\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 { QueryParams } from '@c-rex/types';\n\n/**\n * Creates an array of parameter objects from a list of field values.\n * @param fieldsList - Array of field values to transform into parameter objects\n * @param key - The key to use for each parameter object (defaults to \"Fields\")\n * @returns An array of objects with key-value pairs\n */\nexport const createParams = (fieldsList: string[], key: string = \"Fields\") =>\n fieldsList.map((item) => ({\n key: key,\n value: item,\n }));\n\n/**\n * Generates a URL query string from an array of parameter objects.\n * @param params - Array of QueryParams objects containing key-value pairs\n * @returns A URL-encoded query string\n */\nexport const generateQueryParams = (params: QueryParams[]): string => {\n const queryParams = params\n .map((param) => `${encodeURIComponent(param.key)}=${encodeURIComponent(param.value)}`)\n .join(\"&\");\n return queryParams;\n};\n","import { informationUnitsRenditions } from \"@c-rex/interfaces\";\nimport { DocumentsType } from \"@c-rex/types\";\n\n\nexport const getFileRenditions = ({ renditions }: { renditions: informationUnitsRenditions[] }): DocumentsType => {\n if (renditions == undefined || renditions.length == 0) {\n return {};\n }\n\n const filteredRenditions = renditions.filter(\n (item) => item.format != \"application/xhtml+xml\" && item.format != \"application/json\" && item.format != \"application/llm+xml\"\n );\n\n if (filteredRenditions.length == 0 || filteredRenditions[0] == undefined) {\n return {};\n }\n\n const result: {\n [key: string]: {\n view: string;\n download: string;\n }\n } = {}\n\n filteredRenditions.forEach((item) => {\n const key = item.format\n\n if (result[key] == undefined) {\n result[key] = {\n view: \"\",\n download: \"\"\n }\n }\n\n result[key].download = item.links.filter((link) => link.rel == \"download\")[0]?.href\n result[key].view = item.links.filter((link) => link.rel == \"view\")[0]?.href\n })\n\n return result\n}","import { CrexApi } from \"@c-rex/core\";\nimport { QueryParams } from \"@c-rex/types\";\nimport { generateQueryParams } from \"@c-rex/utils\";\nimport { Method } from \"axios\";\n\n/**\n * Base service class that provides common functionality for API interactions.\n * All specific service classes extend this base class.\n */\nexport class BaseService {\n protected api: CrexApi;\n private endpoint: string;\n\n /**\n * Creates a new instance of BaseService.\n * \n * @param endpoint - The API endpoint URL for this service\n */\n constructor(endpoint: string) {\n this.api = new CrexApi();\n this.endpoint = endpoint;\n }\n\n /**\n * Makes an API request to the specified endpoint.\n * \n * @param options - Request configuration options\n * @param options.path - Optional path to append to the endpoint\n * @param options.params - Optional query parameters to include in the request\n * @param options.method - HTTP method to use (defaults to 'get')\n * @param options.transformer - Optional function to transform the response data\n * @returns The response data, optionally transformed\n * @throws Error if the API request fails\n */\n protected async request<T>({\n path = \"\",\n method = \"get\",\n params = [],\n headers = {},\n transformer = (response: any) => response,\n }: {\n path?: string,\n method?: Method,\n params?: QueryParams[],\n headers?: any,\n transformer?: (data: any) => T,\n }): Promise<T> {\n\n let url = `${this.endpoint}${path}`;\n\n const queryParams = generateQueryParams(params);\n if (queryParams.length > 0) {\n url += `?${queryParams}`;\n }\n\n const response = await this.api.execute({\n url,\n method,\n headers,\n })\n\n return await transformer(response);\n }\n}\n\n","import { BaseService } from \"./baseService\";\nimport { informationUnitsRenditions } from \"@c-rex/interfaces\";\n\n/**\n * Service for interacting with renditions in the API.\n * Provides methods to retrieve and process different types of renditions.\n */\nexport class RenditionsService extends BaseService {\n constructor() {\n super(\"Renditions/\");\n }\n\n /**\n * Retrieves the HTML rendition from a list of renditions.\n * Filters for renditions with format 'application/xhtml+xml' and rel 'view'.\n * \n * @param renditions - Array of rendition objects to process\n * @returns A promise that resolves to the HTML content as a string, or empty string if no suitable rendition is found\n * @throws Error if the API request fails\n */\n public async getHTMLRendition({ renditions }: { renditions: informationUnitsRenditions[] }): Promise<string> {\n const filteredRenditions = renditions.filter(\n (item) => item.format == \"application/xhtml+xml\",\n );\n\n if (filteredRenditions.length == 0 || filteredRenditions[0] == undefined) return \"\";\n const item = filteredRenditions[0];\n const filteredLinks = item.links.filter((item) => item.rel == \"view\");\n\n if (filteredLinks.length == 0 || filteredLinks[0] == undefined) return \"\";\n const url = filteredLinks[0].href;\n const response = await this.api.execute({\n url,\n method: \"get\",\n headers: {\n Accept: \"application/xhtml+xml\",\n },\n })\n\n return response as string;\n }\n}","import { BaseService } from \"./baseService\";\nimport { createParams } from \"@c-rex/utils\";\nimport { DirectoryNodes, DirectoryNodesResponse } from \"@c-rex/interfaces\";\n\n/**\n * Service for interacting with directory nodes in the API.\n * Provides methods to retrieve directory node information.\n */\nexport class DirectoryNodesService extends BaseService {\n constructor() {\n super(\"DirectoryNodes/\");\n }\n\n /**\n * Retrieves a specific directory node by its ID.\n * \n * @param id - The unique identifier of the directory node\n * @returns A promise that resolves to the directory node data\n * @throws Error if the API request fails\n */\n public async getItem(id: string): Promise<DirectoryNodes> {\n return await this.request({\n path: id,\n });\n }\n\n /**\n * Retrieves a list of directory nodes based on specified filters.\n * \n * @param options - Options for filtering the directory nodes list\n * @param options.filters - Optional array of filter strings to apply\n * @returns A promise that resolves to the directory nodes response\n * @throws Error if the API request fails\n */\n public async getList({\n filters = [],\n }: {\n filters?: string[],\n }): Promise<DirectoryNodesResponse> {\n\n const remainFilters = createParams(filters, \"Filter\");\n\n return await this.request({\n params: {\n ...remainFilters,\n },\n });\n }\n}\n","import { CONTENT_LANG_KEY } from \"@c-rex/constants\";\nimport { DefaultRequest } from \"@c-rex/interfaces\";\nimport { DocumentTypesItem } from \"@c-rex/interfaces\";\nimport { getClientConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from \"next/headers\";\n\nexport const transformDocumentTypes = (data: DefaultRequest<DocumentTypesItem>) => {\n const labels: { shortId: string, label: string }[] = [];\n const config = getClientConfigs();\n const contentLanguage = cookies().get(CONTENT_LANG_KEY)?.value || config.languageSwitcher.default;\n const language = contentLanguage.split(\"-\")[0];\n\n data.items.forEach((documentItem) => {\n const label = documentItem.labels.find((item) => item.language.toLowerCase() === language.toLowerCase());\n\n labels.push({\n shortId: documentItem.shortId,\n label: label ? label.value : \"\"\n })\n });\n\n return labels;\n};\n","import { transformDocumentTypes } from \"./transforms/documentTypes\";\nimport { BaseService } from \"./baseService\";\n\n/**\n * Service for interacting with document types in the API.\n * Provides methods to retrieve document type information.\n */\nexport class DocumentTypesService extends BaseService {\n constructor() {\n super(\"DocumentTypes/\");\n }\n\n /**\n * Retrieves document type labels for the specified fields.\n * \n * @returns A promise that resolves to an array of label strings\n * @throws Error if the API request fails\n */\n public async getLabels(): Promise<{ shortId: string, label: string }[]> {\n return await this.request({\n params: [{\n key: \"sparqlWhere\",\n value: \"?iu iirds:is-applicable-for-document-type ?s . ?iu iirds:has-topic-type <https://www.c-rex.net/iirds/td#Blogpost>\"\n }],\n transformer: transformDocumentTypes,\n });\n }\n}\n","import { CONTENT_LANG_KEY, EN_LANG, RESULT_TYPES } from \"@c-rex/constants\";\nimport {\n DefaultRequest,\n informationUnitsResponse,\n informationUnitsItems,\n} from \"@c-rex/interfaces\";\nimport { getServerConfigs, getClientConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from 'next/headers';\nimport { getFileRenditions } from \"@c-rex/utils\";\nimport { CrexLogger } from '@c-rex/core/logger';\nimport { AutocompleteSuggestion } from \"@c-rex/interfaces\";\n\nexport const transformInformationUnits = async (data: DefaultRequest<informationUnitsItems>): Promise<informationUnitsResponse> => {\n const logger = new CrexLogger()\n const frontEndConfig = await getClientConfigs();\n const backEndConfig = await getServerConfigs();\n const filteredTags: any = {}\n\n const items = data.items.map((item) => {\n const type = item.class.labels.filter((item) => item.language === EN_LANG)[0].value.toUpperCase();\n const files = getFileRenditions({ renditions: item?.renditions });\n\n let link = `/topics/${item.shortId}`;\n\n if (frontEndConfig.results.articlePageLayout == \"BLOG\") {\n link = `/blog/${item.shortId}`\n } else if (type == RESULT_TYPES.DOCUMENT) {\n link = `/documents/${item.shortId}`;\n }\n\n let title = \"NO TITLE\"\n let language = \"NO LANGUAGE\"\n\n try {\n if (item.titles) {\n title = item.titles[0].value\n language = item.titles[0].language\n } else {\n title = item.labels[0].value\n language = item.labels[0].language\n }\n } catch {\n logger.log({\n level: \"error\",\n message: `No label or title on item ${item.shortId}`\n })\n }\n\n return {\n language: language,\n title: title,\n type: type,\n localeType: \"\",\n shortId: item.shortId,\n disabled: frontEndConfig.results.disabledResults.includes(type as any),\n link: link,\n files\n }\n });\n\n if (data.tags) {\n const contentLang = (cookies().get(CONTENT_LANG_KEY)?.value || EN_LANG).toLowerCase()\n const splittedContentLang = contentLang.split(\"-\")[0];\n\n for (const [key, value] of Object.entries(data.tags)) {\n\n if (!value || !value.items || value.items.length === 0) {\n continue;\n }\n if (!backEndConfig.search.tags.includes(key)) {\n continue;\n }\n\n const aux = value.items.map(item => {\n if (item?.shortId === undefined) return null\n if (Number(item.hits) === 0) return null\n if (item?.labels === undefined || item?.labels.length === 0) {\n logger.log({\n level: \"warning\",\n message: `No labels on item with id ${item.shortId} from category ${key}`\n })\n return null;\n }\n\n let label = \"\"\n\n for (const labelItem of item.labels) {\n if (labelItem.language === undefined) {\n logger.log({\n level: \"info\",\n message: `No language on label ${labelItem.value} from category ${key}`\n })\n label = labelItem.value\n break;\n }\n\n if (labelItem.language.toLowerCase() === contentLang || labelItem.language.toLowerCase() === splittedContentLang) {\n label = labelItem.value\n break;\n }\n\n label = labelItem.value\n\n //TODO: fallback in english\n }\n\n return {\n hits: item.hits,\n total: item.total,\n label: label,\n active: false,\n shortId: item.shortId,\n }\n }).filter((item) => item !== null)\n\n if (aux.length === 0) {\n continue;\n }\n\n filteredTags[key] = aux;\n }\n }\n\n return {\n tags: filteredTags,\n items: items,\n pageInfo: data.pageInfo,\n };\n};\n\nexport const transformSuggestions = (data: AutocompleteSuggestion, query: string) => {\n const suggestions: string[] = []\n const comparableList: string[] = []\n\n data.suggestions.forEach((item) => {\n suggestions.push(item.value);\n comparableList.push(item.value.toLowerCase())\n })\n\n if (!comparableList.includes(query.toLowerCase())) {\n return [query, ...suggestions];\n }\n\n return suggestions\n}","import {\n AutocompleteSuggestion,\n informationUnitsResponse,\n informationUnitsItems,\n} from \"@c-rex/interfaces\";\nimport { transformInformationUnits, transformSuggestions } from \"./transforms/information\";\nimport { createParams } from \"@c-rex/utils\";\nimport { BaseService } from \"./baseService\";\nimport { OperatorType, WildCardType } from \"@c-rex/types\";\nimport { OPERATOR_OPTIONS, WILD_CARD_OPTIONS } from \"@c-rex/constants\";\n\n/**\n * Service for interacting with information units in the API.\n * Provides methods to retrieve and search information units.\n */\nexport class InformationUnitsService extends BaseService {\n constructor() {\n super(\"InformationUnits/\");\n }\n\n /**\n * Retrieves a list of information units based on specified criteria.\n * \n * @param options - Options for filtering and paginating the information units list\n * @param options.queries - Optional search query string\n * @param options.page - Optional page number for pagination (defaults to 1)\n * @param options.fields - Optional array of fields to include in the response\n * @param options.filters - Optional array of filter strings to apply\n * @param options.languages - Optional array of language codes to filter by\n * @returns A promise that resolves to the information units response\n * @throws Error if the API request fails\n */\n public async getList({\n queries = \"\",\n page = 1,\n fields = [],\n filters = [],\n tags = [],\n restrict = [],\n languages = [],\n wildcard = WILD_CARD_OPTIONS.BOTH,\n operator = OPERATOR_OPTIONS.AND,\n like = false,\n }: {\n queries?: string,\n page?: number,\n filters?: string[],\n restrict?: string[],\n fields?: string[],\n tags?: string[],\n languages?: string[],\n wildcard?: WildCardType,\n operator?: OperatorType,\n like?: boolean,\n }): Promise<informationUnitsResponse> {\n const remainFields = createParams(fields, \"Fields\");\n const remainFilters = createParams(filters, \"Filter\");\n const restrictions = createParams(restrict, \"Restrict\");\n const remainTags = createParams(tags, \"Tags\");\n const languageParam = `VALUES ?lang { ${languages.map(lang => `\"${lang}\"`).join(\" \")} } ?s iirds:language ?lang .`\n\n const params = [\n { key: \"pageSize\", value: \"12\" },\n { key: \"wildcard\", value: wildcard.toLowerCase() },\n { key: \"PageNumber\", value: page.toString() },\n { key: \"Operator\", value: operator },\n { key: \"Like\", value: like.toString() },\n ...remainTags,\n ...remainFields,\n ...remainFilters,\n ...restrictions\n ];\n if (languages.length > 0) {\n params.push({ key: \"sparqlWhere\", value: languageParam });\n }\n if (queries.length > 0) {\n params.push(\n { key: \"Query\", value: queries },\n );\n }\n\n return await this.request({\n params: params,\n transformer: transformInformationUnits\n });\n }\n\n /**\n * Retrieves a specific information unit by its ID.\n * Includes renditions, directory nodes, version information, titles, languages, and labels.\n * \n * @param options - Options for retrieving the information unit\n * @param options.id - The unique identifier of the information unit\n * @returns A promise that resolves to the information unit data\n * @throws Error if the API request fails\n */\n public async getItem({ id, shouldGetAllFields = false }: { id: string, shouldGetAllFields?: boolean }): Promise<informationUnitsItems> {\n const params = []\n\n if (!shouldGetAllFields) {\n params.push(\n { key: \"Fields\", value: \"renditions\" },\n { key: \"Fields\", value: \"directoryNodes\" },\n { key: \"Fields\", value: \"versionOf\" },\n { key: \"Fields\", value: \"titles\" },\n { key: \"Fields\", value: \"languages\" },\n { key: \"Fields\", value: \"labels\" },\n { key: \"Fields\", value: \"packages\" },\n { key: \"Fields\", value: \"created\" },\n { key: \"Fields\", value: \"revision\" },\n );\n }\n\n return await this.request({\n path: id,\n params,\n });\n }\n\n /**\n * Retrieves autocomplete suggestions based on a query prefix.\n * \n * @param options - Options for retrieving suggestions\n * @param options.query - The query prefix to get suggestions for\n * @param options.language - The language of the suggestions\n * @returns A promise that resolves to an array of suggestion strings\n * @throws Error if the API request fails\n */\n public async getSuggestions(\n { query, language }: { query: string, language: string }\n ): Promise<string[]> {\n\n return await this.request({\n path: 'Suggestions',\n params: [\n { key: \"prefix\", value: query },\n { key: \"lang\", value: language },\n ],\n transformer: (data: AutocompleteSuggestion) => transformSuggestions(data, query)\n });\n }\n}\n","import { LanguageAndCountries } from \"@c-rex/interfaces\";\nimport { BaseService } from \"./baseService\";\nimport { getCountryCodeByLang } from \"@c-rex/utils\";\nimport { getClientConfigs } from \"@c-rex/utils/next-cookies\";\n\n/**\n * Service for interacting with language-related functionality in the API.\n * Provides methods to retrieve language and country information.\n */\nexport class LanguageService extends BaseService {\n constructor() {\n const configs = getClientConfigs()\n super(configs.languageSwitcher.endpoint);\n }\n\n /**\n * Retrieves a list of available languages and their associated countries.\n * Transforms the API response to include language code, country code, and original value.\n * \n * @returns A promise that resolves to an array of language and country objects\n * @throws Error if the API request fails\n */\n public async getLanguagesAndCountries(): Promise<LanguageAndCountries[]> {\n return await this.request({\n transformer: (data: { value: string; score: number }[]) => {\n const countryCodeList = data.map((item) => {\n /*\n api -> en, en-US\n default -> en-US. Then use EN-US \n\n api -> en\n default -> en-US. Then use EN\n */\n //should be abble to handle this items: en-US, en, pt, pt-PT, pt-BR \n\n const splittedValue = item.value.split(\"-\")\n const lang = splittedValue[0]\n let country = splittedValue[0]\n\n if (splittedValue.length > 1) {\n country = splittedValue[1]\n } else {\n country = getCountryCodeByLang(lang)\n }\n\n return {\n country: country,\n lang: lang,\n value: item.value,\n }\n })\n\n return countryCodeList.sort((a, b) => {\n return a.value.localeCompare(b.value)\n })\n },\n });\n }\n}\n","import { EN_LANG, RESULT_TYPES, UI_LANG_KEY } from \"@c-rex/constants\";\nimport { DefaultRequest, TopicsRequestItem, DefaultResponse, TopicsResponseItem } from \"@c-rex/interfaces\";\nimport { getClientConfigs } from \"@c-rex/utils/next-cookies\";\nimport { cookies } from 'next/headers';\nimport { CrexLogger } from '@c-rex/core/logger';\nimport { formatDateToLocale } from \"@c-rex/utils\";\n\nexport const transformTopics = async (data: DefaultRequest<TopicsRequestItem>): Promise<DefaultResponse<TopicsResponseItem, null>> => {\n const logger = new CrexLogger()\n const config = getClientConfigs();\n const uiLang = (cookies().get(UI_LANG_KEY)?.value || config.languageSwitcher.default).toLowerCase()\n\n const items = data.items.map(item => {\n const type = item.class.labels.filter((item) => item.language === EN_LANG)[0].value.toUpperCase();\n\n let link = `/topics/${item.shortId}`;\n\n if (config.results.articlePageLayout == \"BLOG\") {\n link = `/blog/${item.shortId}`\n } else if (type == RESULT_TYPES.DOCUMENT) {\n link = `/documents/${item.shortId}`;\n }\n\n let title = \"NO TITLE\"\n let language = \"NO LANGUAGE\"\n\n try {\n if (item.titles) {\n title = item.titles[0].value\n language = item.titles[0].language\n } else {\n title = item.labels[0].value\n language = item.labels[0].language\n }\n } catch {\n logger.log({\n level: \"error\",\n message: `No label or title on item ${item.shortId}`\n })\n }\n\n let renditionUrl = \"\"\n const renditions = item.renditions.filter(item => item.format == \"application/xhtml+xml\");\n if (renditions.length > 0 || renditions[0] !== undefined) {\n const filteredLinks = renditions[0].links.filter((renditionItem) => renditionItem.rel == \"view\");\n if (filteredLinks.length > 0 || filteredLinks[0] !== undefined) {\n renditionUrl = filteredLinks[0].href;\n };\n };\n\n let categoryType = type\n if (item.applicableForTypes && item.applicableForTypes.length > 0) {\n const splittedContentLang = uiLang.split(\"-\")[0];\n categoryType = item.applicableForTypes[0].labels.find(item => item.language === splittedContentLang)?.value || categoryType;\n }\n\n return {\n language: language,\n title: title,\n type: categoryType,\n localeType: \"\",\n shortId: item.shortId,\n created: formatDateToLocale(item.created, uiLang),\n disabled: config.results.disabledResults.includes(type as any),\n link: link,\n renditionUrl: renditionUrl,\n image: null,\n description: null,\n }\n })\n\n return {\n tags: null,\n items: items,\n pageInfo: data.pageInfo,\n };\n};\n","import { transformTopics } from \"./transforms/topics\";\nimport { createParams } from \"@c-rex/utils\";\nimport { BaseService } from \"./baseService\";\nimport { OperatorType, WildCardType } from \"@c-rex/types\";\nimport { OPERATOR_OPTIONS, WILD_CARD_OPTIONS } from \"@c-rex/constants\";\nimport { DefaultResponse, TopicsResponseItem } from \"@c-rex/interfaces\";\n\ntype getListProps = {\n queries?: string,\n page?: number,\n filters?: string[],\n fields?: string[],\n languages?: string[],\n wildcard?: WildCardType,\n operator?: OperatorType,\n like?: boolean,\n pageSize?: number\n}\n\n\n/**\n * Service for interacting with information units in the API.\n * Provides methods to retrieve and search information units.\n */\nexport class TopicsService extends BaseService {\n constructor() {\n super(\"Topics/\");\n }\n\n /**\n * Retrieves a list of topics based on specified criteria.\n * \n * @param options - Options for filtering and paginating the topics list\n * @param options.queries - Optional search query string\n * @param options.page - Optional page number for pagination (defaults to 1)\n * @param options.fields - Optional array of fields to include in the response\n * @param options.filters - Optional array of filter strings to apply\n * @param options.languages - Optional array of language codes to filter by\n * @returns A promise that resolves to the information units response\n * @throws Error if the API request fails\n */\n public async getList({\n queries = \"\",\n page = 1,\n fields = [],\n filters = [],\n languages = [],\n wildcard = WILD_CARD_OPTIONS.BOTH,\n operator = OPERATOR_OPTIONS.AND,\n pageSize = 12\n }: getListProps): Promise<DefaultResponse<TopicsResponseItem, null>> {\n const remainFields = createParams(fields, \"Fields\");\n const remainFilters = createParams(filters, \"Filter\");\n\n const params = [\n { key: \"pageSize\", value: pageSize.toString() },\n { key: \"PageNumber\", value: page.toString() },\n { key: \"Sort\", value: \"-created;-score\" },\n { key: \"Operator\", value: operator },\n { key: \"wildcard\", value: wildcard.toLowerCase() },\n ...remainFields,\n ...remainFilters,\n ];\n\n if (languages.length > 0) {\n const languageParam = `VALUES ?lang { ${languages.map(lang => `\"${lang}\"`).join(\" \")} } ?s iirds:language ?lang .`\n params.push({ key: \"sparqlWhere\", value: languageParam });\n }\n if (queries.length > 0) {\n params.push(\n { key: \"Query\", value: queries },\n );\n }\n\n return await this.request({\n params: params,\n transformer: transformTopics\n });\n }\n}\n"],"mappings":"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","names":["Transport","Transport","getServerConfigs","item","getClientConfigs","cookies","getServerConfigs","getClientConfigs","cookies","CrexLogger","getClientConfigs","getServerConfigs","item","cookies","getClientConfigs","getClientConfigs","cookies","CrexLogger","CrexLogger","getClientConfigs","cookies","item"]}
|