@c-rex/core 0.1.11 → 0.1.13

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/sdk.mjs ADDED
@@ -0,0 +1,360 @@
1
+ // src/utils.ts
2
+ var formatIssuer = (issuer) => {
3
+ let newIssuer = issuer;
4
+ const lastChar = newIssuer.charAt(newIssuer.length - 1);
5
+ if (lastChar !== "/") {
6
+ newIssuer += "/";
7
+ }
8
+ newIssuer += ".well-known/openid-configuration";
9
+ return newIssuer;
10
+ };
11
+ var mergeConfigs = (defaultConfig, envVars) => {
12
+ const definedEnvVars = {};
13
+ for (const key in envVars) {
14
+ if (envVars[key] !== void 0) {
15
+ definedEnvVars[key] = envVars[key];
16
+ }
17
+ }
18
+ return {
19
+ ...defaultConfig,
20
+ ...definedEnvVars
21
+ };
22
+ };
23
+ var generateWarnings = (vars) => {
24
+ const warnings = [];
25
+ vars.forEach((variable) => {
26
+ const value = process.env[variable.key];
27
+ if (value === void 0) {
28
+ warnings.push(`Missing environment variable ${variable.key}, using default value: ${variable.default}`);
29
+ }
30
+ });
31
+ return warnings;
32
+ };
33
+ var createUserOIDCConfig = () => {
34
+ const warnings = [];
35
+ const userDefaults = {
36
+ secret: "dummy",
37
+ scope: "openid profile crex.ids.api crex.ids.api.public",
38
+ enabled: true
39
+ };
40
+ const userEnvs = {
41
+ id: process.env.CREX_IDS_ID,
42
+ secret: process.env.CREX_IDS_SECRET,
43
+ scope: process.env.CREX_IDS_USER_SCOPES,
44
+ issuer: process.env.CREX_IDS_ISSUER == void 0 ? void 0 : formatIssuer(process.env.CREX_IDS_ISSUER),
45
+ enabled: process.env.CREX_IDS_USER_LOGIN_ENABLE == void 0 ? void 0 : process.env.CREX_IDS_USER_LOGIN_ENABLE == "true"
46
+ };
47
+ const user = mergeConfigs(userDefaults, userEnvs);
48
+ if (user.enabled) {
49
+ const disableOIDCVars = [
50
+ { key: "CREX_IDS_ID", value: process.env.CREX_IDS_ID },
51
+ { key: "CREX_IDS_ISSUER", value: process.env.CREX_IDS_ISSUER }
52
+ ];
53
+ disableOIDCVars.forEach((variable) => {
54
+ if (variable.value === void 0) {
55
+ user.enabled = false;
56
+ warnings.push(`Missing environment variable ${variable.key}, disabling client and login`);
57
+ }
58
+ });
59
+ }
60
+ if (user.enabled) {
61
+ const userWarningVars = [
62
+ { key: "CREX_IDS_USER_SCOPES", default: user.scope },
63
+ { key: "CREX_IDS_SECRET", default: user.secret },
64
+ { key: "CREX_IDS_USER_LOGIN_ENABLE", default: user.enabled }
65
+ ];
66
+ const aux = generateWarnings(userWarningVars);
67
+ warnings.push(...aux);
68
+ }
69
+ return { user, warnings };
70
+ };
71
+ var createClientOIDCConfig = () => {
72
+ const warnings = [];
73
+ const clientDefault = {
74
+ secret: "dummy",
75
+ enabled: true
76
+ };
77
+ const clientEnvs = {
78
+ id: process.env.CREX_IDS_ID,
79
+ issuer: process.env.CREX_IDS_ISSUER == void 0 ? void 0 : formatIssuer(process.env.CREX_IDS_ISSUER),
80
+ secret: process.env.CREX_IDS_SECRET,
81
+ enabled: process.env.CREX_IDS_CLIENT_LOGIN_ENABLE == void 0 ? void 0 : process.env.CREX_IDS_CLIENT_LOGIN_ENABLE == "true"
82
+ };
83
+ const client = mergeConfigs(clientDefault, clientEnvs);
84
+ if (client.enabled) {
85
+ const disableOIDCVars = [
86
+ { key: "CREX_IDS_ID", value: process.env.CREX_IDS_ID },
87
+ { key: "CREX_IDS_ISSUER", value: process.env.CREX_IDS_ISSUER }
88
+ ];
89
+ disableOIDCVars.forEach((variable) => {
90
+ if (variable.value === void 0) {
91
+ client.enabled = false;
92
+ warnings.push(`Missing environment variable ${variable.key}, disabling client and login`);
93
+ }
94
+ });
95
+ }
96
+ if (client.enabled) {
97
+ const clientWarningVars = [
98
+ { key: "CREX_IDS_SECRET", default: client.secret },
99
+ { key: "CREX_IDS_CLIENT_LOGIN_ENABLE", default: client.enabled }
100
+ ];
101
+ const aux = generateWarnings(clientWarningVars);
102
+ warnings.push(...aux);
103
+ }
104
+ return { client, warnings };
105
+ };
106
+ var createConsoleLoggerConfig = () => {
107
+ const warnings = [];
108
+ const consoleLoggerDefaults = {
109
+ minimumLevel: "info",
110
+ silent: false
111
+ };
112
+ const consoleLoggerEnvs = {
113
+ minimumLevel: process.env.LOG_CONSOLE_LEVEL,
114
+ silent: process.env.LOG_CONSOLE_SILENT == void 0 ? void 0 : process.env.LOG_CONSOLE_SILENT == "true"
115
+ };
116
+ const consoleLogger = mergeConfigs(consoleLoggerDefaults, consoleLoggerEnvs);
117
+ if (consoleLogger.silent == false) {
118
+ const consoleWarningsVars = [
119
+ { key: "LOG_CONSOLE_SILENT", default: consoleLogger.silent },
120
+ { key: "LOG_CONSOLE_LEVEL", default: consoleLogger.minimumLevel }
121
+ ];
122
+ const aux = generateWarnings(consoleWarningsVars);
123
+ warnings.push(...aux);
124
+ }
125
+ return {
126
+ consoleLogger,
127
+ warnings
128
+ };
129
+ };
130
+ var createGraylogLoggerConfig = () => {
131
+ const warnings = [];
132
+ const graylogDefaults = {
133
+ app: "app name not set",
134
+ minimumLevel: "info",
135
+ silent: false,
136
+ hostname: "https://log.c-rex.net",
137
+ port: 12202,
138
+ categoriesLevel: ["NoLicense", "Scenario", "Document", "Search", "Notification", "History", "UserProfile"]
139
+ };
140
+ const graylogEnvs = {
141
+ app: process.env.LOG_GRAYLOG_APP_NAME,
142
+ silent: process.env.LOG_GRAYLOG_SILENT == void 0 ? void 0 : process.env.LOG_GRAYLOG_SILENT == "true",
143
+ hostname: process.env.LOG_GRAYLOG_HOSTNAME,
144
+ port: process.env.LOG_GRAYLOG_PORT == void 0 ? void 0 : Number(process.env.LOG_GRAYLOG_PORT),
145
+ minimumLevel: process.env.LOG_GRAYLOG_LEVEL,
146
+ categoriesLevel: process.env.LOG_GRAYLOG_CATEGORIES == void 0 ? void 0 : process.env.LOG_GRAYLOG_CATEGORIES.split(",")
147
+ };
148
+ const graylog = mergeConfigs(graylogDefaults, graylogEnvs);
149
+ if (graylog.silent == false) {
150
+ const graylogWarningVars = [
151
+ { key: "LOG_GRAYLOG_APP_NAME", default: graylog.app },
152
+ { key: "LOG_GRAYLOG_HOSTNAME", default: graylog.hostname },
153
+ { key: "LOG_GRAYLOG_LEVEL", default: graylog.minimumLevel },
154
+ { key: "LOG_GRAYLOG_SILENT", default: graylog.silent },
155
+ { key: "LOG_GRAYLOG_CATEGORIES", default: graylog.categoriesLevel },
156
+ { key: "LOG_GRAYLOG_PORT", default: graylog.port }
157
+ ];
158
+ const aux = generateWarnings(graylogWarningVars);
159
+ warnings.push(...aux);
160
+ }
161
+ return {
162
+ graylog,
163
+ warnings
164
+ };
165
+ };
166
+ var createMatomoLoggerConfig = () => {
167
+ const warnings = [];
168
+ const matomoDefaults = {
169
+ app: "NextJsProjectName",
170
+ minimumLevel: "info",
171
+ silent: true,
172
+ hostname: "",
173
+ port: 0,
174
+ categoriesLevel: ["NoLicense", "Scenario", "Document", "Search", "Notification", "History", "UserProfile"]
175
+ };
176
+ const matomoEnvs = {
177
+ app: process.env.LOG_MATOMO_APP_NAME,
178
+ silent: process.env.LOG_MATOMO_SILENT == void 0 ? void 0 : process.env.LOG_MATOMO_SILENT == "true",
179
+ hostname: process.env.LOG_MATOMO_HOSTNAME,
180
+ port: process.env.LOG_MATOMO_PORT == void 0 ? void 0 : Number(process.env.LOG_MATOMO_PORT),
181
+ minimumLevel: process.env.LOG_MATOMO_LEVEL,
182
+ categoriesLevel: process.env.LOG_MATOMO_CATEGORIES == void 0 ? void 0 : process.env.LOG_MATOMO_CATEGORIES.split(",")
183
+ };
184
+ const matomo = mergeConfigs(matomoDefaults, matomoEnvs);
185
+ const matomoSilentVars = [
186
+ { key: "LOG_MATOMO_SILENT", value: process.env.LOG_MATOMO_SILENT },
187
+ { key: "LOG_MATOMO_HOSTNAME", value: process.env.LOG_MATOMO_HOSTNAME },
188
+ { key: "LOG_MATOMO_PORT", value: process.env.LOG_MATOMO_PORT }
189
+ ];
190
+ matomoSilentVars.forEach((variable) => {
191
+ if (variable.value === void 0) {
192
+ matomo.silent = true;
193
+ warnings.push(`Missing environment variable ${variable.key}, setting matomo logger to silent`);
194
+ }
195
+ });
196
+ if (matomo.silent == false) {
197
+ const matomoWarningVars = [
198
+ { key: "LOG_MATOMO_APP_NAME", default: matomo.app },
199
+ { key: "LOG_MATOMO_LEVEL", default: matomo.minimumLevel },
200
+ { key: "LOG_MATOMO_CATEGORIES", default: matomo.categoriesLevel }
201
+ ];
202
+ const aux = generateWarnings(matomoWarningVars);
203
+ warnings.push(...aux);
204
+ }
205
+ return {
206
+ matomo,
207
+ warnings
208
+ };
209
+ };
210
+
211
+ // src/sdk.ts
212
+ import { cookies } from "next/headers";
213
+
214
+ // ../constants/src/index.ts
215
+ var SDK_CONFIG_KEY = "crex-sdk-config";
216
+ var DEFAULT_COOKIE_LIMIT = 30 * 24 * 60 * 60 * 1e3;
217
+
218
+ // src/sdk.ts
219
+ var CrexSDK = class {
220
+ userAuthConfig;
221
+ customerConfig;
222
+ cookiesConfig;
223
+ async getUserAuthConfig() {
224
+ if (this.userAuthConfig) {
225
+ return this.userAuthConfig;
226
+ }
227
+ if (!this.customerConfig) {
228
+ this.customerConfig = this.getServerConfig();
229
+ }
230
+ const user = this.customerConfig.OIDC.user;
231
+ const userInfoEndPoint = this.customerConfig.OIDC.issuerMetadata?.userinfo_endpoint;
232
+ if (user.enabled) {
233
+ this.userAuthConfig = {
234
+ providers: [
235
+ {
236
+ id: "crex",
237
+ name: "CREX",
238
+ type: "oauth",
239
+ version: "2.0",
240
+ clientId: user.id,
241
+ wellKnown: user.issuer,
242
+ clientSecret: user.secret,
243
+ authorization: {
244
+ params: {
245
+ scope: user.scope,
246
+ prompt: "login"
247
+ }
248
+ },
249
+ idToken: true,
250
+ checks: ["pkce", "state"],
251
+ async profile(_, tokens) {
252
+ const res = await fetch(userInfoEndPoint, {
253
+ headers: {
254
+ Authorization: `Bearer ${tokens.access_token}`
255
+ }
256
+ });
257
+ const userinfo = await res.json();
258
+ return {
259
+ id: userinfo.sub,
260
+ name: userinfo.name,
261
+ email: userinfo.email
262
+ };
263
+ },
264
+ callbacks: {
265
+ async jwt({ token, account }) {
266
+ if (account) {
267
+ token.id_token = account.id_token;
268
+ }
269
+ return token;
270
+ },
271
+ async session({ session, token }) {
272
+ session.id_token = token.id_token;
273
+ return session;
274
+ }
275
+ }
276
+ }
277
+ ]
278
+ };
279
+ }
280
+ ;
281
+ return this.userAuthConfig;
282
+ }
283
+ createCustomerConfig(CUSTOMER_CONFIG, shouldLog) {
284
+ const requiredEnvVars = ["CREX_API_URL", "NEXT_PUBLIC_API_URL"];
285
+ const errors = requiredEnvVars.map((key) => {
286
+ const value = process.env[key];
287
+ if (value === void 0) {
288
+ return `Missing required environment variable: ${key}`;
289
+ }
290
+ return "";
291
+ }).filter((item) => item.length > 0);
292
+ const { user, warnings: userWarnings } = createUserOIDCConfig();
293
+ const { client, warnings: clientWarnings } = createClientOIDCConfig();
294
+ const { matomo, warnings: matomoWarnings } = createMatomoLoggerConfig();
295
+ const { graylog, warnings: graylogWarnings } = createGraylogLoggerConfig();
296
+ const { consoleLogger, warnings: consoleWarnings } = createConsoleLoggerConfig();
297
+ const warnings = [
298
+ ...clientWarnings,
299
+ ...consoleWarnings,
300
+ ...userWarnings,
301
+ ...graylogWarnings,
302
+ ...matomoWarnings
303
+ ];
304
+ if (shouldLog) {
305
+ if (errors.length > 0) throw new Error(errors.join("\n"));
306
+ if (warnings.length > 0) console.warn(warnings.join("\n"));
307
+ }
308
+ const cookiesConfig = {
309
+ publicNextApiUrl: process.env.NEXT_PUBLIC_API_URL,
310
+ ...CUSTOMER_CONFIG,
311
+ OIDC: {
312
+ clientEnabled: client.enabled,
313
+ userEnabled: user.enabled
314
+ }
315
+ };
316
+ let baseUrl = process.env.CREX_API_URL;
317
+ const lastChar = baseUrl.charAt(baseUrl.length - 1);
318
+ if (lastChar !== "/") {
319
+ baseUrl += "/";
320
+ }
321
+ baseUrl += "iirds/v1/";
322
+ const config = {
323
+ baseUrl,
324
+ OIDC: { client, user },
325
+ logs: { console: consoleLogger, graylog, matomo },
326
+ ...CUSTOMER_CONFIG
327
+ };
328
+ return { cookiesConfig, config };
329
+ }
330
+ getClientConfig = () => {
331
+ const jsonConfigs = cookies().get(SDK_CONFIG_KEY)?.value;
332
+ if (!jsonConfigs) {
333
+ throw new Error("Configs not found");
334
+ }
335
+ const configs = JSON.parse(jsonConfigs);
336
+ return configs;
337
+ };
338
+ getServerConfig() {
339
+ if (!global.__GLOBAL_CONFIG__) {
340
+ throw new Error("Server config not initialized");
341
+ }
342
+ return global.__GLOBAL_CONFIG__;
343
+ }
344
+ initializeConfig(config) {
345
+ if (global.__GLOBAL_CONFIG__) return global.__GLOBAL_CONFIG__;
346
+ global.__GLOBAL_CONFIG__ = config;
347
+ return global.__GLOBAL_CONFIG__;
348
+ }
349
+ updateConfigProp(key, value) {
350
+ if (!global.__GLOBAL_CONFIG__) {
351
+ throw new Error("Server config not initialized");
352
+ }
353
+ global.__GLOBAL_CONFIG__[key] = value;
354
+ return global.__GLOBAL_CONFIG__;
355
+ }
356
+ };
357
+ export {
358
+ CrexSDK
359
+ };
360
+ //# sourceMappingURL=sdk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts","../src/sdk.ts","../../constants/src/index.ts"],"sourcesContent":["import { WarningVars } from \"@c-rex/types\";\nimport { logInfo, OIDCInterface } from \"@c-rex/interfaces\";\nimport { LogLevelType } from \"@c-rex/types\";\nimport { LogCategoriesType } from \"@c-rex/types\";\n\nconst formatIssuer = (issuer: string): string => {\n let newIssuer = issuer\n const lastChar = newIssuer.charAt(newIssuer.length - 1)\n if (lastChar !== \"/\") {\n newIssuer += \"/\"\n }\n newIssuer += \".well-known/openid-configuration\"\n\n return newIssuer;\n}\n\nexport const mergeConfigs = <T>(defaultConfig: Partial<T>, envVars: Partial<T>): T => {\n const definedEnvVars: T = {} as T;\n\n for (const key in envVars) {\n if (envVars[key] !== undefined) {\n definedEnvVars[key] = envVars[key];\n }\n }\n\n return {\n ...defaultConfig,\n ...definedEnvVars,\n };\n}\n\nexport const generateWarnings = (vars: WarningVars[]): string[] => {\n\n const warnings: string[] = []\n\n vars.forEach((variable) => {\n const value = process.env[variable.key];\n if (value === undefined) {\n warnings.push(`Missing environment variable ${variable.key}, using default value: ${variable.default}`)\n }\n })\n\n return warnings;\n}\n\nexport const createUserOIDCConfig = (): { user: OIDCInterface, warnings: string[] } => {\n const warnings: string[] = []\n const userDefaults: Partial<OIDCInterface> = {\n secret: \"dummy\",\n scope: \"openid profile crex.ids.api crex.ids.api.public\",\n enabled: true,\n }\n const userEnvs: Partial<OIDCInterface> = {\n id: process.env.CREX_IDS_ID,\n secret: process.env.CREX_IDS_SECRET,\n scope: process.env.CREX_IDS_USER_SCOPES,\n issuer: process.env.CREX_IDS_ISSUER == undefined ? undefined : formatIssuer(process.env.CREX_IDS_ISSUER),\n enabled: process.env.CREX_IDS_USER_LOGIN_ENABLE == undefined ? undefined : process.env.CREX_IDS_USER_LOGIN_ENABLE == \"true\",\n }\n const user: OIDCInterface = mergeConfigs<OIDCInterface>(userDefaults, userEnvs);\n\n if (user.enabled) {\n const disableOIDCVars = [\n { key: \"CREX_IDS_ID\", value: process.env.CREX_IDS_ID },\n { key: \"CREX_IDS_ISSUER\", value: process.env.CREX_IDS_ISSUER },\n ]\n disableOIDCVars.forEach((variable) => {\n if (variable.value === undefined) {\n user.enabled = false\n\n warnings.push(`Missing environment variable ${variable.key}, disabling client and login`)\n }\n })\n\n }\n\n if (user.enabled) {\n const userWarningVars = [\n { key: \"CREX_IDS_USER_SCOPES\", default: user.scope },\n { key: \"CREX_IDS_SECRET\", default: user.secret },\n { key: \"CREX_IDS_USER_LOGIN_ENABLE\", default: user.enabled }\n ]\n const aux = generateWarnings(userWarningVars)\n warnings.push(...aux);\n }\n\n return { user, warnings }\n}\n\nexport const createClientOIDCConfig = (): { client: OIDCInterface, warnings: string[] } => {\n const warnings: string[] = []\n const clientDefault: Partial<OIDCInterface> = {\n secret: \"dummy\",\n enabled: true,\n }\n const clientEnvs: Partial<OIDCInterface> = {\n id: process.env.CREX_IDS_ID,\n issuer: process.env.CREX_IDS_ISSUER == undefined ? undefined : formatIssuer(process.env.CREX_IDS_ISSUER),\n secret: process.env.CREX_IDS_SECRET,\n enabled: process.env.CREX_IDS_CLIENT_LOGIN_ENABLE == undefined ? undefined : process.env.CREX_IDS_CLIENT_LOGIN_ENABLE == \"true\",\n }\n const client: OIDCInterface = mergeConfigs<OIDCInterface>(clientDefault, clientEnvs);\n\n if (client.enabled) {\n const disableOIDCVars = [\n { key: \"CREX_IDS_ID\", value: process.env.CREX_IDS_ID },\n { key: \"CREX_IDS_ISSUER\", value: process.env.CREX_IDS_ISSUER },\n ]\n disableOIDCVars.forEach((variable) => {\n if (variable.value === undefined) {\n client.enabled = false\n warnings.push(`Missing environment variable ${variable.key}, disabling client and login`)\n }\n })\n }\n\n if (client.enabled) {\n const clientWarningVars = [\n { key: \"CREX_IDS_SECRET\", default: client.secret },\n { key: \"CREX_IDS_CLIENT_LOGIN_ENABLE\", default: client.enabled }\n ]\n\n const aux = generateWarnings(clientWarningVars)\n warnings.push(...aux);\n }\n\n return { client, warnings }\n}\n\nexport const createConsoleLoggerConfig = (): { consoleLogger: Omit<logInfo, \"hostname\" | \"app\" | \"categoriesLevel\">, warnings: string[]; } => {\n const warnings: string[] = []\n\n const consoleLoggerDefaults: Partial<logInfo> = {\n minimumLevel: \"info\" as LogLevelType,\n silent: false,\n }\n const consoleLoggerEnvs: Partial<logInfo> = {\n minimumLevel: process.env.LOG_CONSOLE_LEVEL as LogLevelType,\n silent: process.env.LOG_CONSOLE_SILENT == undefined ? undefined : process.env.LOG_CONSOLE_SILENT == \"true\",\n }\n const consoleLogger: logInfo = mergeConfigs<logInfo>(consoleLoggerDefaults, consoleLoggerEnvs);\n\n if (consoleLogger.silent == false) {\n const consoleWarningsVars = [\n { key: \"LOG_CONSOLE_SILENT\", default: consoleLogger.silent },\n { key: \"LOG_CONSOLE_LEVEL\", default: consoleLogger.minimumLevel }\n ]\n const aux = generateWarnings(consoleWarningsVars)\n warnings.push(...aux);\n }\n\n return {\n consoleLogger,\n warnings\n }\n}\n\nexport const createGraylogLoggerConfig = (): { graylog: logInfo, warnings: string[] } => {\n const warnings: string[] = []\n\n const graylogDefaults: Partial<logInfo> = {\n app: \"app name not set\",\n minimumLevel: \"info\" as LogLevelType,\n silent: false,\n hostname: \"https://log.c-rex.net\",\n port: 12202,\n categoriesLevel: [\"NoLicense\", \"Scenario\", \"Document\", \"Search\", \"Notification\", \"History\", \"UserProfile\"],\n }\n const graylogEnvs: Partial<logInfo> = {\n app: process.env.LOG_GRAYLOG_APP_NAME,\n silent: process.env.LOG_GRAYLOG_SILENT == undefined ? undefined : process.env.LOG_GRAYLOG_SILENT == \"true\",\n hostname: process.env.LOG_GRAYLOG_HOSTNAME,\n port: process.env.LOG_GRAYLOG_PORT == undefined ? undefined : Number(process.env.LOG_GRAYLOG_PORT),\n minimumLevel: process.env.LOG_GRAYLOG_LEVEL as any,\n categoriesLevel: process.env.LOG_GRAYLOG_CATEGORIES == undefined ? undefined : process.env.LOG_GRAYLOG_CATEGORIES.split(\",\") as LogCategoriesType[],\n }\n const graylog: logInfo = mergeConfigs<logInfo>(graylogDefaults, graylogEnvs);\n\n if (graylog.silent == false) {\n const graylogWarningVars = [\n { key: \"LOG_GRAYLOG_APP_NAME\", default: graylog.app },\n { key: \"LOG_GRAYLOG_HOSTNAME\", default: graylog.hostname },\n { key: \"LOG_GRAYLOG_LEVEL\", default: graylog.minimumLevel },\n { key: \"LOG_GRAYLOG_SILENT\", default: graylog.silent },\n { key: \"LOG_GRAYLOG_CATEGORIES\", default: graylog.categoriesLevel },\n { key: \"LOG_GRAYLOG_PORT\", default: graylog.port }\n ]\n const aux = generateWarnings(graylogWarningVars)\n warnings.push(...aux);\n }\n\n return {\n graylog,\n warnings\n }\n}\n\nexport const createMatomoLoggerConfig = (): { matomo: logInfo, warnings: string[] } => {\n const warnings: string[] = []\n\n const matomoDefaults: Partial<logInfo> = {\n app: \"NextJsProjectName\",\n minimumLevel: \"info\" as LogLevelType,\n silent: true,\n hostname: \"\",\n port: 0,\n categoriesLevel: [\"NoLicense\", \"Scenario\", \"Document\", \"Search\", \"Notification\", \"History\", \"UserProfile\"],\n }\n const matomoEnvs: Partial<logInfo> = {\n app: process.env.LOG_MATOMO_APP_NAME,\n silent: process.env.LOG_MATOMO_SILENT == undefined ? undefined : process.env.LOG_MATOMO_SILENT == \"true\",\n hostname: process.env.LOG_MATOMO_HOSTNAME,\n port: process.env.LOG_MATOMO_PORT == undefined ? undefined : Number(process.env.LOG_MATOMO_PORT),\n minimumLevel: process.env.LOG_MATOMO_LEVEL as any,\n categoriesLevel: process.env.LOG_MATOMO_CATEGORIES == undefined ? undefined : process.env.LOG_MATOMO_CATEGORIES.split(\",\") as LogCategoriesType[],\n }\n const matomo: logInfo = mergeConfigs<logInfo>(matomoDefaults, matomoEnvs);\n\n\n const matomoSilentVars = [\n { key: \"LOG_MATOMO_SILENT\", value: process.env.LOG_MATOMO_SILENT },\n { key: \"LOG_MATOMO_HOSTNAME\", value: process.env.LOG_MATOMO_HOSTNAME },\n { key: \"LOG_MATOMO_PORT\", value: process.env.LOG_MATOMO_PORT }\n ]\n matomoSilentVars.forEach((variable) => {\n if (variable.value === undefined) {\n matomo.silent = true\n warnings.push(`Missing environment variable ${variable.key}, setting matomo logger to silent`)\n }\n })\n\n if (matomo.silent == false) {\n const matomoWarningVars = [\n { key: \"LOG_MATOMO_APP_NAME\", default: matomo.app },\n { key: \"LOG_MATOMO_LEVEL\", default: matomo.minimumLevel },\n { key: \"LOG_MATOMO_CATEGORIES\", default: matomo.categoriesLevel }\n ]\n const aux = generateWarnings(matomoWarningVars)\n warnings.push(...aux);\n }\n\n return {\n matomo,\n warnings\n }\n}\n\n","import { ConfigInterface, CookiesConfigs, CustomerConfig } from \"@c-rex/interfaces\";\nimport {\n createClientOIDCConfig,\n createConsoleLoggerConfig,\n createGraylogLoggerConfig,\n createMatomoLoggerConfig,\n createUserOIDCConfig\n} from \"./utils\";\nimport { cookies } from \"next/headers\";\nimport { SDK_CONFIG_KEY } from \"@c-rex/constants\";\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __GLOBAL_CONFIG__: ConfigInterface | null;\n}\n\n/**\n * SDK class for the CREX application.\n * Provides configuration and authentication functionality.\n */\nexport class CrexSDK {\n public userAuthConfig!: any;\n public customerConfig!: ConfigInterface;\n public cookiesConfig!: CookiesConfigs;\n\n public async getUserAuthConfig() {\n if (this.userAuthConfig) {\n return this.userAuthConfig;\n }\n\n if (!this.customerConfig) {\n this.customerConfig = this.getServerConfig()\n }\n\n const user = this.customerConfig.OIDC.user;\n const userInfoEndPoint = this.customerConfig.OIDC.issuerMetadata?.userinfo_endpoint;\n if (user.enabled) {\n this.userAuthConfig = {\n providers: [\n {\n id: \"crex\",\n name: \"CREX\",\n type: \"oauth\",\n version: \"2.0\",\n clientId: user.id,\n wellKnown: user.issuer,\n clientSecret: user.secret,\n authorization: {\n params: {\n scope: user.scope,\n prompt: \"login\"\n }\n },\n idToken: true,\n checks: [\"pkce\", \"state\"],\n async profile(_: any, tokens: any) {\n const res = await fetch(userInfoEndPoint, {\n headers: {\n Authorization: `Bearer ${tokens.access_token}`,\n },\n });\n\n const userinfo = await res.json();\n\n return {\n id: userinfo.sub,\n name: userinfo.name,\n email: userinfo.email,\n };\n },\n callbacks: {\n async jwt({ token, account }: any) {\n if (account) {\n token.id_token = account.id_token;\n }\n return token;\n },\n async session({ session, token }: any) {\n session.id_token = token.id_token;\n return session;\n },\n },\n },\n ]\n }\n };\n\n return this.userAuthConfig;\n }\n\n public createCustomerConfig(CUSTOMER_CONFIG: CustomerConfig, shouldLog: boolean): { cookiesConfig: CookiesConfigs, config: ConfigInterface } {\n\n const requiredEnvVars = [\"CREX_API_URL\", \"NEXT_PUBLIC_API_URL\"]\n\n const errors = requiredEnvVars.map(key => {\n const value = process.env[key];\n if (value === undefined) {\n return `Missing required environment variable: ${key}`;\n }\n\n return \"\"\n }).filter(item => item.length > 0)\n\n const { user, warnings: userWarnings } = createUserOIDCConfig()\n const { client, warnings: clientWarnings } = createClientOIDCConfig()\n const { matomo, warnings: matomoWarnings } = createMatomoLoggerConfig()\n const { graylog, warnings: graylogWarnings } = createGraylogLoggerConfig()\n const { consoleLogger, warnings: consoleWarnings } = createConsoleLoggerConfig()\n\n const warnings = [\n ...clientWarnings,\n ...consoleWarnings,\n ...userWarnings,\n ...graylogWarnings,\n ...matomoWarnings\n ]\n\n if (shouldLog) {\n if (errors.length > 0) throw new Error(errors.join('\\n'));\n if (warnings.length > 0) console.warn(warnings.join('\\n'));\n }\n\n const cookiesConfig: CookiesConfigs = {\n publicNextApiUrl: process.env.NEXT_PUBLIC_API_URL!,\n ...CUSTOMER_CONFIG,\n OIDC: {\n clientEnabled: client.enabled,\n userEnabled: user.enabled,\n },\n }\n\n let baseUrl = process.env.CREX_API_URL!\n const lastChar = baseUrl.charAt(baseUrl.length - 1)\n if (lastChar !== \"/\") {\n baseUrl += \"/\"\n }\n baseUrl += \"iirds/v1/\"\n\n const config: ConfigInterface = {\n baseUrl,\n OIDC: { client, user },\n logs: { console: consoleLogger, graylog, matomo, },\n ...CUSTOMER_CONFIG,\n }\n\n return { cookiesConfig, config };\n }\n\n public getClientConfig = (): CookiesConfigs => {\n const jsonConfigs = cookies().get(SDK_CONFIG_KEY)?.value;\n if (!jsonConfigs) {\n throw new Error('Configs not found');\n }\n\n const configs: CookiesConfigs = JSON.parse(jsonConfigs);\n\n return configs;\n }\n\n public getServerConfig() {\n if (!global.__GLOBAL_CONFIG__) {\n throw new Error('Server config not initialized');\n }\n return global.__GLOBAL_CONFIG__;\n }\n\n public initializeConfig(config: ConfigInterface) {\n if (global.__GLOBAL_CONFIG__) return global.__GLOBAL_CONFIG__;\n global.__GLOBAL_CONFIG__ = config;\n return global.__GLOBAL_CONFIG__;\n }\n\n public updateConfigProp(key: keyof ConfigInterface, value: any) {\n if (!global.__GLOBAL_CONFIG__) {\n throw new Error('Server config not initialized');\n }\n global.__GLOBAL_CONFIG__[key] = value;\n return global.__GLOBAL_CONFIG__;\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 \"table-with-images\",\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};\n\nexport const MARKER_COLORS = [\n \"red-500\",\n \"orange-500\",\n \"yellow-400\",\n \"green-500\",\n \"teal-500\",\n \"blue-500\",\n \"sky-500\",\n \"purple-500\",\n \"pink-500\",\n \"gray-500\",\n \"neutral-800\",\n \"cyan-500\",\n \"lime-500\",\n \"amber-500\",\n \"indigo-500\",\n];"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c-rex/core",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "files": [
5
5
  "dist"
6
6
  ],
@@ -20,17 +20,23 @@
20
20
  "require": "./dist/logger.js",
21
21
  "default": "./dist/logger.js"
22
22
  },
23
+ "./sdk": {
24
+ "types": "./dist/sdk.d.ts",
25
+ "import": "./dist/sdk.mjs",
26
+ "require": "./dist/sdk.js",
27
+ "default": "./dist/sdk.js"
28
+ },
23
29
  "./cookies": {
24
30
  "types": "./dist/api/cookies.d.ts",
25
31
  "import": "./dist/api/cookies.mjs",
26
32
  "require": "./dist/api/cookies.js",
27
33
  "default": "./dist/api/cookies.js"
28
34
  },
29
- "./token": {
30
- "types": "./dist/api/token.d.ts",
31
- "import": "./dist/api/token.mjs",
32
- "require": "./dist/api/token.js",
33
- "default": "./dist/api/token.js"
35
+ "./OIDC": {
36
+ "types": "./dist/api/OIDC.d.ts",
37
+ "import": "./dist/api/OIDC.mjs",
38
+ "require": "./dist/api/OIDC.js",
39
+ "default": "./dist/api/OIDC.js"
34
40
  },
35
41
  "./rpc": {
36
42
  "types": "./dist/api/rpc.d.ts",
package/dist/api/token.js DELETED
@@ -1,67 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/api/token.ts
21
- var token_exports = {};
22
- __export(token_exports, {
23
- postMethod: () => postMethod
24
- });
25
- module.exports = __toCommonJS(token_exports);
26
- var import_server = require("next/server");
27
- var import_openid_client = require("openid-client");
28
-
29
- // ../constants/src/index.ts
30
- var DEFAULT_COOKIE_LIMIT = 30 * 24 * 60 * 60 * 1e3;
31
- var CREX_TOKEN_HEADER_KEY = "crex-token";
32
-
33
- // src/api/token.ts
34
- var import_next_cookies = require("@c-rex/utils/next-cookies");
35
- var postMethod = async () => {
36
- try {
37
- const customerConfig = await (0, import_next_cookies.getServerConfigs)();
38
- const issuer = await import_openid_client.Issuer.discover(customerConfig.OIDC.client.issuer);
39
- const client = new issuer.Client({
40
- client_id: customerConfig.OIDC.client.id,
41
- client_secret: customerConfig.OIDC.client.secret
42
- });
43
- const tokenSet = await client.grant({ grant_type: "client_credentials" });
44
- const token = tokenSet.access_token;
45
- if (!token) {
46
- return import_server.NextResponse.json({ error: "Failed to get token" }, { status: 500 });
47
- }
48
- const response = import_server.NextResponse.json({ token });
49
- response.cookies.set({
50
- name: CREX_TOKEN_HEADER_KEY,
51
- value: token,
52
- httpOnly: true,
53
- secure: process.env.NODE_ENV === "production",
54
- sameSite: "lax",
55
- path: "/",
56
- expires: tokenSet.expires_at ? new Date(tokenSet.expires_at * 1e3) : void 0
57
- });
58
- return response;
59
- } catch (error) {
60
- return import_server.NextResponse.json({ error: String(error) }, { status: 500 });
61
- }
62
- };
63
- // Annotate the CommonJS export names for ESM import in node:
64
- 0 && (module.exports = {
65
- postMethod
66
- });
67
- //# sourceMappingURL=token.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/api/token.ts","../../../constants/src/index.ts"],"sourcesContent":["import { NextResponse } from 'next/server';\nimport { Issuer } from 'openid-client';\nimport { CREX_TOKEN_HEADER_KEY } from '@c-rex/constants';\nimport { getServerConfigs } from '@c-rex/utils/next-cookies';\n\n/**\n * Retrieves an access token using client credentials flow from the configured OIDC provider\n * \n * @returns NextResponse with success status or error message\n * @throws Error if token retrieval fails\n */\nexport const postMethod = async (): Promise<NextResponse> => {\n try {\n const customerConfig = await getServerConfigs();\n\n const issuer = await Issuer.discover(customerConfig.OIDC.client.issuer);\n const client = new issuer.Client({\n client_id: customerConfig.OIDC.client.id,\n client_secret: customerConfig.OIDC.client.secret,\n });\n const tokenSet = await client.grant({ grant_type: 'client_credentials' });\n\n const token = tokenSet.access_token!;\n\n if (!token) {\n return NextResponse.json({ error: 'Failed to get token' }, { status: 500 });\n }\n\n const response = NextResponse.json({ token: token });\n\n response.cookies.set({\n name: CREX_TOKEN_HEADER_KEY,\n value: token,\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n expires: tokenSet.expires_at ? new Date(tokenSet.expires_at * 1000) : undefined\n });\n\n return response;\n\n } catch (error) {\n return NextResponse.json({ error: String(error) }, { status: 500 });\n }\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};"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA6B;AAC7B,2BAAuB;;;AC4EhB,IAAM,uBAAuB,KAAK,KAAK,KAAK,KAAK;AAQjD,IAAM,wBAAwB;;;ADlFrC,0BAAiC;AAQ1B,IAAM,aAAa,YAAmC;AACzD,MAAI;AACA,UAAM,iBAAiB,UAAM,sCAAiB;AAE9C,UAAM,SAAS,MAAM,4BAAO,SAAS,eAAe,KAAK,OAAO,MAAM;AACtE,UAAM,SAAS,IAAI,OAAO,OAAO;AAAA,MAC7B,WAAW,eAAe,KAAK,OAAO;AAAA,MACtC,eAAe,eAAe,KAAK,OAAO;AAAA,IAC9C,CAAC;AACD,UAAM,WAAW,MAAM,OAAO,MAAM,EAAE,YAAY,qBAAqB,CAAC;AAExE,UAAM,QAAQ,SAAS;AAEvB,QAAI,CAAC,OAAO;AACR,aAAO,2BAAa,KAAK,EAAE,OAAO,sBAAsB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC9E;AAEA,UAAM,WAAW,2BAAa,KAAK,EAAE,MAAa,CAAC;AAEnD,aAAS,QAAQ,IAAI;AAAA,MACjB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,MACV,QAAQ,QAAQ,IAAI,aAAa;AAAA,MACjC,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,SAAS,aAAa,IAAI,KAAK,SAAS,aAAa,GAAI,IAAI;AAAA,IAC1E,CAAC;AAED,WAAO;AAAA,EAEX,SAAS,OAAO;AACZ,WAAO,2BAAa,KAAK,EAAE,OAAO,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACtE;AACJ;","names":[]}
@@ -1,42 +0,0 @@
1
- // src/api/token.ts
2
- import { NextResponse } from "next/server";
3
- import { Issuer } from "openid-client";
4
-
5
- // ../constants/src/index.ts
6
- var DEFAULT_COOKIE_LIMIT = 30 * 24 * 60 * 60 * 1e3;
7
- var CREX_TOKEN_HEADER_KEY = "crex-token";
8
-
9
- // src/api/token.ts
10
- import { getServerConfigs } from "@c-rex/utils/next-cookies";
11
- var postMethod = async () => {
12
- try {
13
- const customerConfig = await getServerConfigs();
14
- const issuer = await Issuer.discover(customerConfig.OIDC.client.issuer);
15
- const client = new issuer.Client({
16
- client_id: customerConfig.OIDC.client.id,
17
- client_secret: customerConfig.OIDC.client.secret
18
- });
19
- const tokenSet = await client.grant({ grant_type: "client_credentials" });
20
- const token = tokenSet.access_token;
21
- if (!token) {
22
- return NextResponse.json({ error: "Failed to get token" }, { status: 500 });
23
- }
24
- const response = NextResponse.json({ token });
25
- response.cookies.set({
26
- name: CREX_TOKEN_HEADER_KEY,
27
- value: token,
28
- httpOnly: true,
29
- secure: process.env.NODE_ENV === "production",
30
- sameSite: "lax",
31
- path: "/",
32
- expires: tokenSet.expires_at ? new Date(tokenSet.expires_at * 1e3) : void 0
33
- });
34
- return response;
35
- } catch (error) {
36
- return NextResponse.json({ error: String(error) }, { status: 500 });
37
- }
38
- };
39
- export {
40
- postMethod
41
- };
42
- //# sourceMappingURL=token.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/api/token.ts","../../../constants/src/index.ts"],"sourcesContent":["import { NextResponse } from 'next/server';\nimport { Issuer } from 'openid-client';\nimport { CREX_TOKEN_HEADER_KEY } from '@c-rex/constants';\nimport { getServerConfigs } from '@c-rex/utils/next-cookies';\n\n/**\n * Retrieves an access token using client credentials flow from the configured OIDC provider\n * \n * @returns NextResponse with success status or error message\n * @throws Error if token retrieval fails\n */\nexport const postMethod = async (): Promise<NextResponse> => {\n try {\n const customerConfig = await getServerConfigs();\n\n const issuer = await Issuer.discover(customerConfig.OIDC.client.issuer);\n const client = new issuer.Client({\n client_id: customerConfig.OIDC.client.id,\n client_secret: customerConfig.OIDC.client.secret,\n });\n const tokenSet = await client.grant({ grant_type: 'client_credentials' });\n\n const token = tokenSet.access_token!;\n\n if (!token) {\n return NextResponse.json({ error: 'Failed to get token' }, { status: 500 });\n }\n\n const response = NextResponse.json({ token: token });\n\n response.cookies.set({\n name: CREX_TOKEN_HEADER_KEY,\n value: token,\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n expires: tokenSet.expires_at ? new Date(tokenSet.expires_at * 1000) : undefined\n });\n\n return response;\n\n } catch (error) {\n return NextResponse.json({ error: String(error) }, { status: 500 });\n }\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};"],"mappings":";AAAA,SAAS,oBAAoB;AAC7B,SAAS,cAAc;;;AC4EhB,IAAM,uBAAuB,KAAK,KAAK,KAAK,KAAK;AAQjD,IAAM,wBAAwB;;;ADlFrC,SAAS,wBAAwB;AAQ1B,IAAM,aAAa,YAAmC;AACzD,MAAI;AACA,UAAM,iBAAiB,MAAM,iBAAiB;AAE9C,UAAM,SAAS,MAAM,OAAO,SAAS,eAAe,KAAK,OAAO,MAAM;AACtE,UAAM,SAAS,IAAI,OAAO,OAAO;AAAA,MAC7B,WAAW,eAAe,KAAK,OAAO;AAAA,MACtC,eAAe,eAAe,KAAK,OAAO;AAAA,IAC9C,CAAC;AACD,UAAM,WAAW,MAAM,OAAO,MAAM,EAAE,YAAY,qBAAqB,CAAC;AAExE,UAAM,QAAQ,SAAS;AAEvB,QAAI,CAAC,OAAO;AACR,aAAO,aAAa,KAAK,EAAE,OAAO,sBAAsB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC9E;AAEA,UAAM,WAAW,aAAa,KAAK,EAAE,MAAa,CAAC;AAEnD,aAAS,QAAQ,IAAI;AAAA,MACjB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,MACV,QAAQ,QAAQ,IAAI,aAAa;AAAA,MACjC,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,SAAS,aAAa,IAAI,KAAK,SAAS,aAAa,GAAI,IAAI;AAAA,IAC1E,CAAC;AAED,WAAO;AAAA,EAEX,SAAS,OAAO;AACZ,WAAO,aAAa,KAAK,EAAE,OAAO,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACtE;AACJ;","names":[]}