@realtek/core-theme 0.0.299 → 0.0.301

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.
@@ -0,0 +1 @@
1
+ const e=require("./authApi-qTqKoZ1I.cjs");exports.apiGetWithAuth=e.t,exports.ensureToken=e.i,exports.logout=e.m;
@@ -6,6 +6,7 @@ var e = {
6
6
  VITE_SUBMISSIONS_URL: void 0,
7
7
  VITE_JOBS_URL: void 0,
8
8
  VITE_CANDIDATES_URL: void 0,
9
+ VITE_PYOPS_URL: void 0,
9
10
  VITE_APP_ID: void 0
10
11
  };
11
12
  function t(t) {
@@ -18,37 +19,38 @@ function n(e, n = "") {
18
19
  [Symbol.toPrimitive]: () => t(e) || (typeof n == "function" ? n() : n)
19
20
  };
20
21
  }
21
- var r = n("VITE_AUTH_URL"), i = n("VITE_ADMIN_API_URL", () => t("VITE_AUTH_URL") || "http://localhost:9009"), a = n("VITE_ADMIN_APP_ID", () => t("VITE_APP_ID") || "zinnext-dev-api-v1"), o = n("VITE_SUBMISSIONS_URL"), s = n("VITE_JOBS_URL"), c = n("VITE_CANDIDATES_URL"), l = n("VITE_APP_ID");
22
- function u(e = {}) {
22
+ var r = n("VITE_AUTH_URL"), i = n("VITE_ADMIN_API_URL", () => t("VITE_AUTH_URL") || "http://localhost:9009"), a = n("VITE_ADMIN_APP_ID", () => t("VITE_APP_ID") || "zinnext-dev-api-v1"), o = n("VITE_SUBMISSIONS_URL"), s = n("VITE_JOBS_URL"), c = n("VITE_CANDIDATES_URL"), l = n("VITE_PYOPS_URL", "http://localhost:7020/v1"), u = n("VITE_APP_ID");
23
+ function d(e = {}) {
23
24
  let n = t("VITE_APP_ID");
24
25
  return n ? {
25
26
  "X-App-Id": n,
26
27
  ...e
27
28
  } : { ...e };
28
29
  }
29
- function d(e = {}) {
30
+ function f(e = {}) {
30
31
  let n = t("VITE_ADMIN_APP_ID") || t("VITE_APP_ID") || "zinnext-dev-api-v1";
31
32
  return n ? {
32
33
  "X-App-Id": n,
33
34
  ...e
34
35
  } : { ...e };
35
36
  }
36
- function f() {
37
+ function p() {
37
38
  if (typeof window > "u" || typeof window.fetch != "function" || window.__CORE_THEME_APP_ID_PATCHED__) return;
38
39
  let e = [
39
40
  r,
40
41
  i,
41
42
  o,
42
43
  s,
43
- c
44
- ], n = window.fetch.bind(window), a = (e) => typeof e == "string" ? e : e instanceof URL ? e.href : e && typeof e.url == "string" ? e.url : "", l = (t) => !!t && e.some((e) => {
44
+ c,
45
+ l
46
+ ], n = window.fetch.bind(window), a = (e) => typeof e == "string" ? e : e instanceof URL ? e.href : e && typeof e.url == "string" ? e.url : "", u = (t) => !!t && e.some((e) => {
45
47
  let n = String(e);
46
48
  return n && t.startsWith(n);
47
49
  });
48
50
  window.fetch = function(e, r) {
49
51
  try {
50
52
  let o = a(e), s = String(i) && o.startsWith(String(i)) ? t("VITE_ADMIN_APP_ID") || t("VITE_APP_ID") || "zinnext-dev-api-v1" : t("VITE_APP_ID");
51
- if (s && l(o)) {
53
+ if (s && u(o)) {
52
54
  let t = typeof Request < "u" && e instanceof Request, i = new Headers(r && r.headers || (t ? e.headers : void 0));
53
55
  return i.has("X-App-Id") || i.set("X-App-Id", s), t && !(r && r.headers) ? n(new Request(e, { headers: i }), r) : n(e, {
54
56
  ...r || {},
@@ -59,16 +61,16 @@ function f() {
59
61
  return n(e, r);
60
62
  }, window.__CORE_THEME_APP_ID_PATCHED__ = !0;
61
63
  }
62
- f();
63
- function p(e = {}) {
64
+ p();
65
+ function m(e = {}) {
64
66
  typeof window > "u" || (window.__CORE_THEME_CONFIG__ = {
65
67
  ...window.__CORE_THEME_CONFIG__ || {},
66
68
  ...e
67
- }, f());
69
+ }, p());
68
70
  }
69
71
  //#endregion
70
72
  //#region src/services/authApi.js
71
- var m = "authToken", h = "authUser", g = "authLoginSession", _ = "ct_project_id", v = "ct_project_name", y = [
73
+ var h = "authToken", g = "authUser", _ = "authLoginSession", v = "ct_project_id", y = "ct_project_name", b = [
72
74
  "access_token",
73
75
  "refresh_token",
74
76
  "id_token",
@@ -91,20 +93,20 @@ var m = "authToken", h = "authUser", g = "authLoginSession", _ = "ct_project_id"
91
93
  "activeKey",
92
94
  "ct_project_id",
93
95
  "ct_project_name"
94
- ], b = null, x = null;
95
- function S(e) {
96
- x = typeof e == "string" && e.trim() ? e.trim() : null;
96
+ ], x = null, S = null;
97
+ function C(e) {
98
+ S = typeof e == "string" && e.trim() ? e.trim() : null;
97
99
  }
98
- function C() {
99
- x = null;
100
+ function w() {
101
+ S = null;
100
102
  }
101
- function w(e) {
103
+ function T(e) {
102
104
  return e?.token ?? e?.access_token ?? e?.accessToken ?? e?.jwt ?? e?.data?.token ?? e?.data?.access_token ?? e?.data?.accessToken ?? e?.data?.jwt;
103
105
  }
104
- function T(e) {
106
+ function E(e) {
105
107
  return e?.user ?? e?.data?.user ?? e?.data?.profile ?? null;
106
108
  }
107
- function E(e) {
109
+ function D(e) {
108
110
  if (!e || typeof e != "string") return null;
109
111
  try {
110
112
  let t = e.split(".")[1];
@@ -115,27 +117,27 @@ function E(e) {
115
117
  return null;
116
118
  }
117
119
  }
118
- function D(e, t) {
120
+ function O(e, t) {
119
121
  t != null && localStorage.setItem(e, JSON.stringify(t));
120
122
  }
121
- function O(e, t) {
123
+ function k(e, t) {
122
124
  return t?.menus ?? e?.menus ?? {
123
125
  menu: t?.menu ?? e?.menu,
124
126
  footermenu: t?.footermenu ?? e?.footermenu
125
127
  };
126
128
  }
127
- function k(e, t, n) {
128
- let r = e?.data ?? e, i = E(t) ?? {}, a = O(e, r), o = n?.userName ?? n?.name ?? r?.userName ?? r?.name ?? i.userName ?? i.name ?? i.preferred_username ?? i.email, s = n?.preferred_Username ?? n?.preferred_username ?? r?.preferred_Username ?? r?.preferred_username ?? i.preferred_Username ?? i.preferred_username ?? i.email ?? o, c = n?.email ?? r?.email ?? i.email ?? s;
129
- localStorage.setItem("access_token", t), r?.refresh_token && localStorage.setItem("refresh_token", r.refresh_token), r?.id_token !== void 0 && localStorage.setItem("id_token", r.id_token), r?.token_type && localStorage.setItem("token_type", r.token_type), r?.expires_in !== void 0 && localStorage.setItem("expires_in", String(r.expires_in)), r?.refresh_expires_in !== void 0 && localStorage.setItem("refresh_expires_in", String(r.refresh_expires_in)), o && localStorage.setItem("userName", o), s && localStorage.setItem("preferred_Username", s), c && localStorage.setItem("user_Email", c), (r?.roleId ?? i.role_id) && localStorage.setItem("roleId", r?.roleId ?? i.role_id), r?.companyName && localStorage.setItem("companyName", r.companyName), i.userId !== void 0 && localStorage.setItem("userId", String(i.userId)), i.tenantId && localStorage.setItem("tenantId", i.tenantId), i.businessId && localStorage.setItem("businessId", i.businessId), i.businessUnitId && localStorage.setItem("businessUnitId", i.businessUnitId), D("menu", a.menu), D("footermenu", a.footermenu), D("menuPermission", r?.menuPermission), D("default_values", r?.default_values);
129
+ function A(e, t, n) {
130
+ let r = e?.data ?? e, i = D(t) ?? {}, a = k(e, r), o = n?.userName ?? n?.name ?? r?.userName ?? r?.name ?? i.userName ?? i.name ?? i.preferred_username ?? i.email, s = n?.preferred_Username ?? n?.preferred_username ?? r?.preferred_Username ?? r?.preferred_username ?? i.preferred_Username ?? i.preferred_username ?? i.email ?? o, c = n?.email ?? r?.email ?? i.email ?? s;
131
+ localStorage.setItem("access_token", t), r?.refresh_token && localStorage.setItem("refresh_token", r.refresh_token), r?.id_token !== void 0 && localStorage.setItem("id_token", r.id_token), r?.token_type && localStorage.setItem("token_type", r.token_type), r?.expires_in !== void 0 && localStorage.setItem("expires_in", String(r.expires_in)), r?.refresh_expires_in !== void 0 && localStorage.setItem("refresh_expires_in", String(r.refresh_expires_in)), o && localStorage.setItem("userName", o), s && localStorage.setItem("preferred_Username", s), c && localStorage.setItem("user_Email", c), (r?.roleId ?? i.role_id) && localStorage.setItem("roleId", r?.roleId ?? i.role_id), r?.companyName && localStorage.setItem("companyName", r.companyName), i.userId !== void 0 && localStorage.setItem("userId", String(i.userId)), i.tenantId && localStorage.setItem("tenantId", i.tenantId), i.businessId && localStorage.setItem("businessId", i.businessId), i.businessUnitId && localStorage.setItem("businessUnitId", i.businessUnitId), O("menu", a.menu), O("footermenu", a.footermenu), O("menuPermission", r?.menuPermission), O("default_values", r?.default_values);
130
132
  }
131
- function A() {
132
- if (x) return x;
133
- let e = localStorage.getItem(m), t = sessionStorage.getItem(g) === "1";
133
+ function j() {
134
+ if (S) return S;
135
+ let e = localStorage.getItem(h), t = sessionStorage.getItem(_) === "1";
134
136
  return e && t ? e : null;
135
137
  }
136
- function j() {
138
+ function M() {
137
139
  try {
138
- let e = localStorage.getItem(h);
140
+ let e = localStorage.getItem(g);
139
141
  if (e) return JSON.parse(e);
140
142
  } catch {}
141
143
  return {
@@ -145,17 +147,17 @@ function j() {
145
147
  roleId: localStorage.getItem("roleId")
146
148
  };
147
149
  }
148
- function M() {
149
- localStorage.removeItem(m), localStorage.removeItem(h), y.forEach((e) => localStorage.removeItem(e)), sessionStorage.removeItem(g), window.dispatchEvent(new Event("auth:logout"));
150
- }
151
150
  function N() {
151
+ localStorage.removeItem(h), localStorage.removeItem(g), b.forEach((e) => localStorage.removeItem(e)), sessionStorage.removeItem(_), window.dispatchEvent(new Event("auth:logout"));
152
+ }
153
+ function P() {
152
154
  let e = String(localStorage.getItem("roleId") ?? "").trim().toLowerCase();
153
155
  if (e) return e;
154
- let t = E(A()) ?? {};
156
+ let t = D(j()) ?? {};
155
157
  return String(t.role ?? t.roleName ?? t.role_name ?? t.role_id ?? t.roleId ?? "").trim().toLowerCase();
156
158
  }
157
- function P() {
158
- let e = E(A() ?? localStorage.getItem(m)), t = /* @__PURE__ */ new Set(), n = N();
159
+ function F() {
160
+ let e = D(j() ?? localStorage.getItem(h)), t = /* @__PURE__ */ new Set(), n = P();
159
161
  return n && t.add(n), e && ((e?.realm_access?.roles ?? []).forEach((e) => t.add(e)), Object.values(e?.resource_access ?? {}).forEach((e) => {
160
162
  (e?.roles ?? []).forEach((e) => t.add(e));
161
163
  }), [
@@ -166,11 +168,11 @@ function P() {
166
168
  e && t.add(e);
167
169
  })), Array.from(t).map((e) => String(e).toLowerCase());
168
170
  }
169
- function F() {
170
- return N() === "tester" || P().includes("tester");
171
- }
172
171
  function I() {
173
- let e = E(A() ?? localStorage.getItem(m)) ?? {}, t = (e) => {
172
+ return P() === "tester" || F().includes("tester");
173
+ }
174
+ function L() {
175
+ let e = D(j() ?? localStorage.getItem(h)) ?? {}, t = (e) => {
174
176
  if (e == null || e === "") return;
175
177
  let t = Number(e);
176
178
  return Number.isFinite(t) ? t : void 0;
@@ -180,21 +182,21 @@ function I() {
180
182
  userId: t(e.userId ?? e.user_id)
181
183
  };
182
184
  }
183
- function L(e) {
184
- e && (localStorage.setItem(_, String(e.id)), localStorage.setItem(v, String(e.name)));
185
+ function R(e) {
186
+ e && (localStorage.setItem(v, String(e.id)), localStorage.setItem(y, String(e.name)));
185
187
  }
186
- function R() {
187
- let e = localStorage.getItem(_), t = localStorage.getItem(v);
188
+ function z() {
189
+ let e = localStorage.getItem(v), t = localStorage.getItem(y);
188
190
  return !e || !t ? null : {
189
191
  id: Number(e),
190
192
  name: t
191
193
  };
192
194
  }
193
- function z() {
194
- localStorage.removeItem(_), localStorage.removeItem(v);
195
+ function B() {
196
+ localStorage.removeItem(v), localStorage.removeItem(y);
195
197
  }
196
- async function B(e) {
197
- return b || (b = fetch(`${r}/login`, {
198
+ async function V(e) {
199
+ return x || (x = fetch(`${r}/login`, {
198
200
  method: "POST",
199
201
  headers: { "Content-Type": "application/json" },
200
202
  body: JSON.stringify(e)
@@ -204,40 +206,40 @@ async function B(e) {
204
206
  let n = Error(t?.message ?? t?.error ?? `Login failed: ${e.status}`);
205
207
  throw n.status = e.status, n;
206
208
  }
207
- let n = w(t);
209
+ let n = T(t);
208
210
  if (!n) throw Error("No token in login response");
209
- let r = T(t);
210
- return localStorage.setItem(m, n), sessionStorage.setItem(g, "1"), r && localStorage.setItem(h, JSON.stringify(r)), k(t, n, r), window.dispatchEvent(new Event("auth:login")), {
211
+ let r = E(t);
212
+ return localStorage.setItem(h, n), sessionStorage.setItem(_, "1"), r && localStorage.setItem(g, JSON.stringify(r)), A(t, n, r), window.dispatchEvent(new Event("auth:login")), {
211
213
  token: n,
212
214
  user: r,
213
215
  response: t
214
216
  };
215
217
  }).finally(() => {
216
- b = null;
217
- }), b);
218
+ x = null;
219
+ }), x);
218
220
  }
219
- async function V() {
220
- let e = A();
221
+ async function H() {
222
+ let e = j();
221
223
  if (e) return e;
222
224
  let t = /* @__PURE__ */ Error("Authentication required");
223
225
  throw t.status = 401, t;
224
226
  }
225
- async function H() {
227
+ async function U() {
226
228
  return {
227
229
  "Content-Type": "application/json",
228
- Authorization: `Bearer ${await V()}`
230
+ Authorization: `Bearer ${await H()}`
229
231
  };
230
232
  }
231
- async function U(e, t = "", n = {}) {
233
+ async function W(e, t = "", n = {}) {
232
234
  t && typeof t == "object" && (n = t, t = "");
233
- let r = await H(), i = await fetch(`${e}${t || ""}`, {
235
+ let r = await U(), i = await fetch(`${e}${t || ""}`, {
234
236
  ...n,
235
237
  headers: {
236
238
  ...r,
237
239
  ...n.headers
238
240
  }
239
241
  });
240
- i.status === 401 && M();
242
+ i.status === 401 && N();
241
243
  let a = await i.text(), o = {};
242
244
  if (a) try {
243
245
  o = JSON.parse(a);
@@ -250,11 +252,11 @@ async function U(e, t = "", n = {}) {
250
252
  }
251
253
  return o;
252
254
  }
253
- async function W(e, t) {
254
- let n = await U(e, t);
255
+ async function G(e, t) {
256
+ let n = await W(e, t);
255
257
  return n.data ?? n;
256
258
  }
257
259
  //#endregion
258
- export { o as C, u as E, s as S, d as T, i as _, U as a, r as b, R as c, P as d, F as f, L as g, S as h, V as i, A as l, M as m, C as n, I as o, B as p, z as r, N as s, W as t, j as u, a as v, p as w, c as x, l as y };
260
+ export { l as C, d as D, f as E, s as S, m as T, i as _, W as a, r as b, z as c, F as d, I as f, R as g, C as h, H as i, j as l, N as m, w as n, L as o, V as p, B as r, P as s, G as t, M as u, a as v, o as w, c as x, u as y };
259
261
 
260
- //# sourceMappingURL=authApi-CVxnHdIU.js.map
262
+ //# sourceMappingURL=authApi-cJpMRgNq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authApi-cJpMRgNq.js","names":[],"sources":["../src/services/apiConfig.js","../src/services/authApi.js"],"sourcesContent":["// Central API base URLs.\n//\n// When CORE-THEME runs standalone (npm run dev), the values come from\n// src/services/.env (Vite VITE_* vars, baked in at build time).\n//\n// When CORE-THEME is consumed as the published @realtek/core-theme package,\n// host apps can override these values at RUNTIME by setting\n// `window.__CORE_THEME_CONFIG__` before the app renders:\n//\n// <script>\n// window.__CORE_THEME_CONFIG__ = {\n// VITE_AUTH_URL: 'http://192.168.1.66/authapi/v1',\n// VITE_SUBMISSIONS_URL: 'http://192.168.1.66/submissionsapi/v1',\n// VITE_JOBS_URL: 'http://192.168.1.66/jobsapi/v1',\n// VITE_CANDIDATES_URL: 'http://192.168.1.66/candidatesapi/v1',\n// VITE_APP_ID: 'zinnext', // sent as the `X-App-Id` header on every API call\n// VITE_ADMIN_APP_ID: 'zinnext', // optional admin override\n// };\n// </script>\n//\n// Priority: runtime window config > build-time .env fallback.\n\nconst BUILD_TIME_FALLBACK = {\n VITE_AUTH_URL: import.meta.env.VITE_AUTH_URL,\n VITE_ADMIN_API_URL: import.meta.env.VITE_ADMIN_API_URL,\n VITE_ADMIN_APP_ID: import.meta.env.VITE_ADMIN_APP_ID,\n VITE_SUBMISSIONS_URL: import.meta.env.VITE_SUBMISSIONS_URL,\n VITE_JOBS_URL: import.meta.env.VITE_JOBS_URL,\n VITE_CANDIDATES_URL: import.meta.env.VITE_CANDIDATES_URL,\n VITE_PYOPS_URL: import.meta.env.VITE_PYOPS_URL,\n VITE_APP_ID: import.meta.env.VITE_APP_ID,\n};\n\nfunction resolve(key) {\n if (\n typeof window !== 'undefined' &&\n window.__CORE_THEME_CONFIG__ &&\n window.__CORE_THEME_CONFIG__[key] != null\n ) {\n return window.__CORE_THEME_CONFIG__[key];\n }\n return BUILD_TIME_FALLBACK[key];\n}\n\nfunction runtimeValue(key, fallback = '') {\n return {\n toString: () => resolve(key) || (typeof fallback === 'function' ? fallback() : fallback),\n valueOf: () => resolve(key) || (typeof fallback === 'function' ? fallback() : fallback),\n [Symbol.toPrimitive]: () => resolve(key) || (typeof fallback === 'function' ? fallback() : fallback),\n };\n}\n\n// These are intentionally dynamic. Many service files use them inside template\n// literals (`${AUTH_URL}/path`) or pass them to helpers that later build a URL.\n// Resolving at string-conversion time prevents a published package from\n// freezing CORE-THEME's own .env values into consuming apps and Docker builds.\nexport const AUTH_URL = runtimeValue('VITE_AUTH_URL');\nexport const ADMIN_API_URL = runtimeValue(\n 'VITE_ADMIN_API_URL',\n () => resolve('VITE_AUTH_URL') || 'http://localhost:9009',\n);\nexport const ADMIN_APP_ID = runtimeValue('VITE_ADMIN_APP_ID', () => resolve('VITE_APP_ID') || 'zinnext-dev-api-v1');\nexport const SUBMISSIONS_URL = runtimeValue('VITE_SUBMISSIONS_URL');\nexport const JOBS_URL = runtimeValue('VITE_JOBS_URL');\nexport const CANDIDATES_URL = runtimeValue('VITE_CANDIDATES_URL');\nexport const PYOPS_URL = runtimeValue('VITE_PYOPS_URL', 'http://localhost:7020/v1');\n\n// App identifier sent as the `X-App-Id` header on every API request (e.g.\n// 'zinnext', 'lms'). Configured in ONE place — the host's window config (or the\n// build-time .env fallback) — and applied to all calls via the interceptor below.\nexport const APP_ID = runtimeValue('VITE_APP_ID');\n\n// Helper for code that builds headers explicitly: merges `X-App-Id` into a\n// header object without clobbering anything else. (The interceptor below already\n// covers existing calls; this is just a convenience for new code.)\nexport function withAppId(headers = {}) {\n const appId = resolve('VITE_APP_ID');\n return appId ? { 'X-App-Id': appId, ...headers } : { ...headers };\n}\n\nexport function withAdminAppId(headers = {}) {\n const appId = resolve('VITE_ADMIN_APP_ID') || resolve('VITE_APP_ID') || 'zinnext-dev-api-v1';\n return appId ? { 'X-App-Id': appId, ...headers } : { ...headers };\n}\n\n// ── X-App-Id interceptor ──────────────────────────────────────────────────────\n//\n// Rather than editing every inline `headers: {...}` across the service files\n// (and risking new calls forgetting it), we patch `fetch` ONCE so every request\n// to a configured API base URL carries `X-App-Id`. This is scoped strictly to the\n// four API origins, so third-party/asset requests are never touched, and any\n// caller that already set `X-App-Id` explicitly is left as-is.\nfunction installAppIdInterceptor() {\n if (typeof window === 'undefined' || typeof window.fetch !== 'function') return;\n // Guard against double-patching (repeated imports / Vite HMR).\n if (window.__CORE_THEME_APP_ID_PATCHED__) return;\n\n const apiBaseUrls = [AUTH_URL, ADMIN_API_URL, SUBMISSIONS_URL, JOBS_URL, CANDIDATES_URL, PYOPS_URL];\n const originalFetch = window.fetch.bind(window);\n\n const urlOf = (input) => {\n if (typeof input === 'string') return input;\n if (input instanceof URL) return input.href;\n if (input && typeof input.url === 'string') return input.url; // Request object\n return '';\n };\n const isApiRequest = (url) =>\n !!url && apiBaseUrls.some((base) => {\n const value = String(base);\n return value && url.startsWith(value);\n });\n\n window.fetch = function patchedFetch(input, init) {\n try {\n const url = urlOf(input);\n const isAdminRequest = String(ADMIN_API_URL) && url.startsWith(String(ADMIN_API_URL));\n const appId = isAdminRequest\n ? (resolve('VITE_ADMIN_APP_ID') || resolve('VITE_APP_ID') || 'zinnext-dev-api-v1')\n : resolve('VITE_APP_ID');\n if (appId && isApiRequest(url)) {\n const isRequestObj = typeof Request !== 'undefined' && input instanceof Request;\n const headers = new Headers(\n (init && init.headers) || (isRequestObj ? input.headers : undefined),\n );\n if (!headers.has('X-App-Id')) headers.set('X-App-Id', appId);\n if (isRequestObj && !(init && init.headers)) {\n return originalFetch(new Request(input, { headers }), init);\n }\n return originalFetch(input, { ...(init || {}), headers });\n }\n } catch {\n // Any unexpected argument shape: fall through to the untouched request.\n }\n return originalFetch(input, init);\n };\n\n window.__CORE_THEME_APP_ID_PATCHED__ = true;\n}\n\ninstallAppIdInterceptor();\n\n// Optional JS helper (alternative to the index.html <script>). Because the\n// exports above are resolved when this module first loads, call this BEFORE the\n// first import of @realtek/core-theme — e.g. in the host's index.html, not in\n// main.jsx (which runs after imports are evaluated). The index.html <script>\n// approach is the reliable one.\nexport function configureCoreTheme(config = {}) {\n if (typeof window === 'undefined') return;\n window.__CORE_THEME_CONFIG__ = { ...(window.__CORE_THEME_CONFIG__ || {}), ...config };\n installAppIdInterceptor();\n}\n","import { AUTH_URL } from './apiConfig';\n\nconst AUTH_TOKEN_KEY = 'authToken';\nconst AUTH_USER_KEY = 'authUser';\nconst AUTH_LOGIN_SESSION_KEY = 'authLoginSession';\nconst CT_PROJECT_ID_KEY = 'ct_project_id';\nconst CT_PROJECT_NAME_KEY = 'ct_project_name';\nconst LOGIN_STORAGE_KEYS = [\n 'access_token', 'refresh_token', 'id_token', 'token_type', 'expires_in',\n 'refresh_expires_in', 'menu', 'footermenu', 'menuPermission', 'default_values',\n 'roleId', 'companyName', 'preferred_Username', 'user_Email', 'userName',\n 'userId', 'tenantId', 'businessId', 'businessUnitId', 'activeKey',\n 'ct_project_id', 'ct_project_name',\n];\n\nlet loginPromise = null;\nlet runtimeAuthToken = null;\n\nexport function setAuthTokenOverride(token) {\n runtimeAuthToken = typeof token === 'string' && token.trim() ? token.trim() : null;\n}\n\nexport function clearAuthTokenOverride() {\n runtimeAuthToken = null;\n}\n\nfunction extractToken(json) {\n return (\n json?.token ?? json?.access_token ?? json?.accessToken ?? json?.jwt ??\n json?.data?.token ?? json?.data?.access_token ?? json?.data?.accessToken ?? json?.data?.jwt\n );\n}\n\nfunction extractUser(json) {\n return json?.user ?? json?.data?.user ?? json?.data?.profile ?? null;\n}\n\nfunction decodeJwtPayload(token) {\n if (!token || typeof token !== 'string') return null;\n try {\n const payload = token.split('.')[1];\n if (!payload) return null;\n const normalized = payload.replace(/-/g, '+').replace(/_/g, '/');\n return JSON.parse(atob(normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=')));\n } catch {\n return null;\n }\n}\n\nfunction setLocalStorageJson(key, value) {\n if (value === undefined || value === null) return;\n localStorage.setItem(key, JSON.stringify(value));\n}\n\nfunction getLoginMenus(json, data) {\n return data?.menus ?? json?.menus ?? {\n menu: data?.menu ?? json?.menu,\n footermenu: data?.footermenu ?? json?.footermenu,\n };\n}\n\nfunction persistLoginResponse(json, token, user) {\n const data = json?.data ?? json;\n const tokenPayload = decodeJwtPayload(token) ?? {};\n const menus = getLoginMenus(json, data);\n const userName = (\n user?.userName ?? user?.name ?? data?.userName ?? data?.name ??\n tokenPayload.userName ?? tokenPayload.name ?? tokenPayload.preferred_username ?? tokenPayload.email\n );\n const preferredUsername = (\n user?.preferred_Username ?? user?.preferred_username ??\n data?.preferred_Username ?? data?.preferred_username ??\n tokenPayload.preferred_Username ?? tokenPayload.preferred_username ??\n tokenPayload.email ?? userName\n );\n const userEmail = user?.email ?? data?.email ?? tokenPayload.email ?? preferredUsername;\n\n localStorage.setItem('access_token', token);\n if (data?.refresh_token) localStorage.setItem('refresh_token', data.refresh_token);\n if (data?.id_token !== undefined) localStorage.setItem('id_token', data.id_token);\n if (data?.token_type) localStorage.setItem('token_type', data.token_type);\n if (data?.expires_in !== undefined) localStorage.setItem('expires_in', String(data.expires_in));\n if (data?.refresh_expires_in !== undefined) localStorage.setItem('refresh_expires_in', String(data.refresh_expires_in));\n if (userName) localStorage.setItem('userName', userName);\n if (preferredUsername) localStorage.setItem('preferred_Username', preferredUsername);\n if (userEmail) localStorage.setItem('user_Email', userEmail);\n if (data?.roleId ?? tokenPayload.role_id) localStorage.setItem('roleId', data?.roleId ?? tokenPayload.role_id);\n if (data?.companyName) localStorage.setItem('companyName', data.companyName);\n if (tokenPayload.userId !== undefined) localStorage.setItem('userId', String(tokenPayload.userId));\n if (tokenPayload.tenantId) localStorage.setItem('tenantId', tokenPayload.tenantId);\n if (tokenPayload.businessId) localStorage.setItem('businessId', tokenPayload.businessId);\n if (tokenPayload.businessUnitId) localStorage.setItem('businessUnitId', tokenPayload.businessUnitId);\n\n setLocalStorageJson('menu', menus.menu);\n setLocalStorageJson('footermenu', menus.footermenu);\n setLocalStorageJson('menuPermission', data?.menuPermission);\n setLocalStorageJson('default_values', data?.default_values);\n}\n\n// ── Token & Session ──────────────────────────────────────────────────────────\n\nexport function getStoredToken() {\n if (runtimeAuthToken) return runtimeAuthToken;\n const token = localStorage.getItem(AUTH_TOKEN_KEY);\n const hasSession = sessionStorage.getItem(AUTH_LOGIN_SESSION_KEY) === '1';\n return token && hasSession ? token : null;\n}\n\nexport function getStoredUser() {\n try {\n const stored = localStorage.getItem(AUTH_USER_KEY);\n if (stored) return JSON.parse(stored);\n } catch {\n // Fall through to the legacy login fields below.\n }\n return {\n userId: localStorage.getItem('userId'),\n username: localStorage.getItem('userName') || localStorage.getItem('preferred_Username'),\n email: localStorage.getItem('user_Email'),\n roleId: localStorage.getItem('roleId'),\n };\n}\n\nexport function logout() {\n localStorage.removeItem(AUTH_TOKEN_KEY);\n localStorage.removeItem(AUTH_USER_KEY);\n LOGIN_STORAGE_KEYS.forEach((key) => localStorage.removeItem(key));\n sessionStorage.removeItem(AUTH_LOGIN_SESSION_KEY);\n window.dispatchEvent(new Event('auth:logout'));\n}\n\n// ── Role Helpers ─────────────────────────────────────────────────────────────\n\nexport function getCurrentRoleName() {\n const stored = String(localStorage.getItem('roleId') ?? '').trim().toLowerCase();\n if (stored) return stored;\n const payload = decodeJwtPayload(getStoredToken()) ?? {};\n return String(payload.role ?? payload.roleName ?? payload.role_name ?? payload.role_id ?? payload.roleId ?? '').trim().toLowerCase();\n}\n\nexport function getUserRoles() {\n const token = getStoredToken() ?? localStorage.getItem(AUTH_TOKEN_KEY);\n const payload = decodeJwtPayload(token);\n const roles = new Set();\n const stored = getCurrentRoleName();\n if (stored) roles.add(stored);\n if (payload) {\n (payload?.realm_access?.roles ?? []).forEach((role) => roles.add(role));\n Object.values(payload?.resource_access ?? {}).forEach((client) => {\n (client?.roles ?? []).forEach((role) => roles.add(role));\n });\n [payload?.role, payload?.roleName, payload?.role_name].forEach((role) => {\n if (role) roles.add(role);\n });\n }\n return Array.from(roles).map((role) => String(role).toLowerCase());\n}\n\nexport function isTester() {\n return getCurrentRoleName() === 'tester' || getUserRoles().includes('tester');\n}\n\n// getActingIdentity returns the numeric {roleId, userId} of the logged-in user,\n// read from the auth token (falling back to the stored roleId). Used to evaluate\n// admin-configured field autoValueRules for UX only — the gateway re-evaluates\n// the same rules from the token and has the final say, so nothing here is a\n// security boundary.\nexport function getActingIdentity() {\n const payload = decodeJwtPayload(getStoredToken() ?? localStorage.getItem(AUTH_TOKEN_KEY)) ?? {};\n const num = (value) => {\n if (value === undefined || value === null || value === '') return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n };\n return {\n roleId: num(payload.role_id ?? payload.roleId) ?? num(localStorage.getItem('roleId')),\n userId: num(payload.userId ?? payload.user_id),\n };\n}\n\n// ── Project Context ───────────────────────────────────────────────────────────\n\nexport function setSelectedProject(project) {\n if (!project) return;\n localStorage.setItem(CT_PROJECT_ID_KEY, String(project.id));\n localStorage.setItem(CT_PROJECT_NAME_KEY, String(project.name));\n}\n\nexport function getSelectedProject() {\n const id = localStorage.getItem(CT_PROJECT_ID_KEY);\n const name = localStorage.getItem(CT_PROJECT_NAME_KEY);\n if (!id || !name) return null;\n return { id: Number(id), name };\n}\n\nexport function clearSelectedProject() {\n localStorage.removeItem(CT_PROJECT_ID_KEY);\n localStorage.removeItem(CT_PROJECT_NAME_KEY);\n}\n\n// ── Login ────────────────────────────────────────────────────────────────────\n\nexport async function login(credentials) {\n if (loginPromise) return loginPromise;\n\n loginPromise = fetch(`${AUTH_URL}/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(credentials),\n })\n .then(async (res) => {\n const json = await res.json();\n if (!res.ok) {\n const error = new Error(json?.message ?? json?.error ?? `Login failed: ${res.status}`);\n error.status = res.status;\n throw error;\n }\n const token = extractToken(json);\n if (!token) throw new Error('No token in login response');\n const user = extractUser(json);\n localStorage.setItem(AUTH_TOKEN_KEY, token);\n sessionStorage.setItem(AUTH_LOGIN_SESSION_KEY, '1');\n if (user) localStorage.setItem(AUTH_USER_KEY, JSON.stringify(user));\n persistLoginResponse(json, token, user);\n // Let any mounted AuthGuard re-check and reveal the protected content.\n window.dispatchEvent(new Event('auth:login'));\n return { token, user, response: json };\n })\n .finally(() => { loginPromise = null; });\n\n return loginPromise;\n}\n\n// ── HTTP Helpers (exported for use by other service files) ───────────────────\n\nexport async function ensureToken() {\n const token = getStoredToken();\n if (token) return token;\n const error = new Error('Authentication required');\n error.status = 401;\n throw error;\n}\n\nasync function authHeaders() {\n const token = await ensureToken();\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n}\n\nexport async function fetchJsonWithAuth(baseUrl, path = '', options = {}) {\n if (path && typeof path === 'object') {\n options = path;\n path = '';\n }\n\n const headers = await authHeaders();\n const res = await fetch(`${baseUrl}${path || ''}`, {\n ...options,\n headers: { ...headers, ...options.headers },\n });\n if (res.status === 401) logout();\n const text = await res.text();\n let json = {};\n if (text) {\n try {\n json = JSON.parse(text);\n } catch {\n json = { error: text };\n }\n }\n if (!res.ok) {\n const responseError = json?.error ?? json?.message;\n const detail = typeof responseError === 'string'\n ? responseError\n : responseError && Object.keys(responseError).length > 0\n ? JSON.stringify(responseError)\n : '';\n const error = new Error(detail || `API ${res.status}: ${res.statusText}`);\n error.status = res.status;\n error.response = json;\n throw error;\n }\n return json;\n}\n\nexport async function apiGetWithAuth(baseUrl, path) {\n const json = await fetchJsonWithAuth(baseUrl, path);\n return json.data ?? json;\n}\n"],"mappings":";AAsBA,IAAM,IAAsB;CAC1B,eAAA,KAAA;CACA,oBAAA,KAAA;CACA,mBAAA,KAAA;CACA,sBAAA,KAAA;CACA,eAAA,KAAA;CACA,qBAAA,KAAA;CACA,gBAAA,KAAA;CACA,aAAA,KAAA;AACF;AAEA,SAAS,EAAQ,GAAK;CAQpB,OANE,OAAO,SAAW,OAClB,OAAO,yBACP,OAAO,sBAAsB,MAAQ,OAE9B,OAAO,sBAAsB,KAE/B,EAAoB;AAC7B;AAEA,SAAS,EAAa,GAAK,IAAW,IAAI;CACxC,OAAO;EACL,gBAAgB,EAAQ,CAAG,MAAM,OAAO,KAAa,aAAa,EAAS,IAAI;EAC/E,eAAe,EAAQ,CAAG,MAAM,OAAO,KAAa,aAAa,EAAS,IAAI;GAC7E,OAAO,oBAAoB,EAAQ,CAAG,MAAM,OAAO,KAAa,aAAa,EAAS,IAAI;CAC7F;AACF;AAMA,IAAa,IAAW,EAAa,eAAe,GACvC,IAAgB,EAC3B,4BACM,EAAQ,eAAe,KAAK,uBACpC,GACa,IAAe,EAAa,2BAA2B,EAAQ,aAAa,KAAK,oBAAoB,GACrG,IAAkB,EAAa,sBAAsB,GACrD,IAAW,EAAa,eAAe,GACvC,IAAiB,EAAa,qBAAqB,GACnD,IAAY,EAAa,kBAAkB,0BAA0B,GAKrE,IAAS,EAAa,aAAa;AAKhD,SAAgB,EAAU,IAAU,CAAC,GAAG;CACtC,IAAM,IAAQ,EAAQ,aAAa;CACnC,OAAO,IAAQ;EAAE,YAAY;EAAO,GAAG;CAAQ,IAAI,EAAE,GAAG,EAAQ;AAClE;AAEA,SAAgB,EAAe,IAAU,CAAC,GAAG;CAC3C,IAAM,IAAQ,EAAQ,mBAAmB,KAAK,EAAQ,aAAa,KAAK;CACxE,OAAO,IAAQ;EAAE,YAAY;EAAO,GAAG;CAAQ,IAAI,EAAE,GAAG,EAAQ;AAClE;AASA,SAAS,IAA0B;CAGjC,IAFI,OAAO,SAAW,OAAe,OAAO,OAAO,SAAU,cAEzD,OAAO,+BAA+B;CAE1C,IAAM,IAAc;EAAC;EAAU;EAAe;EAAiB;EAAU;EAAgB;CAAS,GAC5F,IAAgB,OAAO,MAAM,KAAK,MAAM,GAExC,KAAS,MACT,OAAO,KAAU,WAAiB,IAClC,aAAiB,MAAY,EAAM,OACnC,KAAS,OAAO,EAAM,OAAQ,WAAiB,EAAM,MAClD,IAEH,KAAgB,MACpB,CAAC,CAAC,KAAO,EAAY,MAAM,MAAS;EAClC,IAAM,IAAQ,OAAO,CAAI;EACzB,OAAO,KAAS,EAAI,WAAW,CAAK;CACtC,CAAC;CA0BH,AAxBA,OAAO,QAAQ,SAAsB,GAAO,GAAM;EAChD,IAAI;GACF,IAAM,IAAM,EAAM,CAAK,GAEjB,IADiB,OAAO,CAAa,KAAK,EAAI,WAAW,OAAO,CAAa,CAAC,IAE/E,EAAQ,mBAAmB,KAAK,EAAQ,aAAa,KAAK,uBAC3D,EAAQ,aAAa;GACzB,IAAI,KAAS,EAAa,CAAG,GAAG;IAC9B,IAAM,IAAe,OAAO,UAAY,OAAe,aAAiB,SAClE,IAAU,IAAI,QACjB,KAAQ,EAAK,YAAa,IAAe,EAAM,UAAU,KAAA,EAC5D;IAKA,OAJK,EAAQ,IAAI,UAAU,KAAG,EAAQ,IAAI,YAAY,CAAK,GACvD,KAAgB,EAAE,KAAQ,EAAK,WAC1B,EAAc,IAAI,QAAQ,GAAO,EAAE,WAAQ,CAAC,GAAG,CAAI,IAErD,EAAc,GAAO;KAAE,GAAI,KAAQ,CAAC;KAAI;IAAQ,CAAC;GAC1D;EACF,QAAQ,CAER;EACA,OAAO,EAAc,GAAO,CAAI;CAClC,GAEA,OAAO,gCAAgC;AACzC;AAEA,EAAwB;AAOxB,SAAgB,EAAmB,IAAS,CAAC,GAAG;CAC1C,OAAO,SAAW,QACtB,OAAO,wBAAwB;EAAE,GAAI,OAAO,yBAAyB,CAAC;EAAI,GAAG;CAAO,GACpF,EAAwB;AAC1B;;;ACpJA,IAAM,IAAiB,aACjB,IAAgB,YAChB,IAAyB,oBACzB,IAAoB,iBACpB,IAAsB,mBACtB,IAAqB;CACzB;CAAgB;CAAiB;CAAY;CAAc;CAC3D;CAAsB;CAAQ;CAAc;CAAkB;CAC9D;CAAU;CAAe;CAAsB;CAAc;CAC7D;CAAU;CAAY;CAAc;CAAkB;CACtD;CAAiB;AACnB,GAEI,IAAe,MACf,IAAmB;AAEvB,SAAgB,EAAqB,GAAO;CAC1C,IAAmB,OAAO,KAAU,YAAY,EAAM,KAAK,IAAI,EAAM,KAAK,IAAI;AAChF;AAEA,SAAgB,IAAyB;CACvC,IAAmB;AACrB;AAEA,SAAS,EAAa,GAAM;CAC1B,OACE,GAAM,SAAS,GAAM,gBAAgB,GAAM,eAAe,GAAM,OAChE,GAAM,MAAM,SAAS,GAAM,MAAM,gBAAgB,GAAM,MAAM,eAAe,GAAM,MAAM;AAE5F;AAEA,SAAS,EAAY,GAAM;CACzB,OAAO,GAAM,QAAQ,GAAM,MAAM,QAAQ,GAAM,MAAM,WAAW;AAClE;AAEA,SAAS,EAAiB,GAAO;CAC/B,IAAI,CAAC,KAAS,OAAO,KAAU,UAAU,OAAO;CAChD,IAAI;EACF,IAAM,IAAU,EAAM,MAAM,GAAG,EAAE;EACjC,IAAI,CAAC,GAAS,OAAO;EACrB,IAAM,IAAa,EAAQ,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;EAC/D,OAAO,KAAK,MAAM,KAAK,EAAW,OAAO,KAAK,KAAK,EAAW,SAAS,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;CACtF,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,EAAoB,GAAK,GAAO;CACnC,KAAiC,QACrC,aAAa,QAAQ,GAAK,KAAK,UAAU,CAAK,CAAC;AACjD;AAEA,SAAS,EAAc,GAAM,GAAM;CACjC,OAAO,GAAM,SAAS,GAAM,SAAS;EACnC,MAAM,GAAM,QAAQ,GAAM;EAC1B,YAAY,GAAM,cAAc,GAAM;CACxC;AACF;AAEA,SAAS,EAAqB,GAAM,GAAO,GAAM;CAC/C,IAAM,IAAO,GAAM,QAAQ,GACrB,IAAe,EAAiB,CAAK,KAAK,CAAC,GAC3C,IAAQ,EAAc,GAAM,CAAI,GAChC,IACJ,GAAM,YAAY,GAAM,QAAQ,GAAM,YAAY,GAAM,QACxD,EAAa,YAAY,EAAa,QAAQ,EAAa,sBAAsB,EAAa,OAE1F,IACJ,GAAM,sBAAsB,GAAM,sBAClC,GAAM,sBAAsB,GAAM,sBAClC,EAAa,sBAAsB,EAAa,sBAChD,EAAa,SAAS,GAElB,IAAY,GAAM,SAAS,GAAM,SAAS,EAAa,SAAS;CAqBtE,AAnBA,aAAa,QAAQ,gBAAgB,CAAK,GACtC,GAAM,iBAAe,aAAa,QAAQ,iBAAiB,EAAK,aAAa,GAC7E,GAAM,aAAa,KAAA,KAAW,aAAa,QAAQ,YAAY,EAAK,QAAQ,GAC5E,GAAM,cAAY,aAAa,QAAQ,cAAc,EAAK,UAAU,GACpE,GAAM,eAAe,KAAA,KAAW,aAAa,QAAQ,cAAc,OAAO,EAAK,UAAU,CAAC,GAC1F,GAAM,uBAAuB,KAAA,KAAW,aAAa,QAAQ,sBAAsB,OAAO,EAAK,kBAAkB,CAAC,GAClH,KAAU,aAAa,QAAQ,YAAY,CAAQ,GACnD,KAAmB,aAAa,QAAQ,sBAAsB,CAAiB,GAC/E,KAAW,aAAa,QAAQ,cAAc,CAAS,IACvD,GAAM,UAAU,EAAa,YAAS,aAAa,QAAQ,UAAU,GAAM,UAAU,EAAa,OAAO,GACzG,GAAM,eAAa,aAAa,QAAQ,eAAe,EAAK,WAAW,GACvE,EAAa,WAAW,KAAA,KAAW,aAAa,QAAQ,UAAU,OAAO,EAAa,MAAM,CAAC,GAC7F,EAAa,YAAU,aAAa,QAAQ,YAAY,EAAa,QAAQ,GAC7E,EAAa,cAAY,aAAa,QAAQ,cAAc,EAAa,UAAU,GACnF,EAAa,kBAAgB,aAAa,QAAQ,kBAAkB,EAAa,cAAc,GAEnG,EAAoB,QAAQ,EAAM,IAAI,GACtC,EAAoB,cAAc,EAAM,UAAU,GAClD,EAAoB,kBAAkB,GAAM,cAAc,GAC1D,EAAoB,kBAAkB,GAAM,cAAc;AAC5D;AAIA,SAAgB,IAAiB;CAC/B,IAAI,GAAkB,OAAO;CAC7B,IAAM,IAAQ,aAAa,QAAQ,CAAc,GAC3C,IAAa,eAAe,QAAQ,CAAsB,MAAM;CACtE,OAAO,KAAS,IAAa,IAAQ;AACvC;AAEA,SAAgB,IAAgB;CAC9B,IAAI;EACF,IAAM,IAAS,aAAa,QAAQ,CAAa;EACjD,IAAI,GAAQ,OAAO,KAAK,MAAM,CAAM;CACtC,QAAQ,CAER;CACA,OAAO;EACL,QAAQ,aAAa,QAAQ,QAAQ;EACrC,UAAU,aAAa,QAAQ,UAAU,KAAK,aAAa,QAAQ,oBAAoB;EACvF,OAAO,aAAa,QAAQ,YAAY;EACxC,QAAQ,aAAa,QAAQ,QAAQ;CACvC;AACF;AAEA,SAAgB,IAAS;CAKvB,AAJA,aAAa,WAAW,CAAc,GACtC,aAAa,WAAW,CAAa,GACrC,EAAmB,SAAS,MAAQ,aAAa,WAAW,CAAG,CAAC,GAChE,eAAe,WAAW,CAAsB,GAChD,OAAO,cAAc,IAAI,MAAM,aAAa,CAAC;AAC/C;AAIA,SAAgB,IAAqB;CACnC,IAAM,IAAS,OAAO,aAAa,QAAQ,QAAQ,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY;CAC/E,IAAI,GAAQ,OAAO;CACnB,IAAM,IAAU,EAAiB,EAAe,CAAC,KAAK,CAAC;CACvD,OAAO,OAAO,EAAQ,QAAQ,EAAQ,YAAY,EAAQ,aAAa,EAAQ,WAAW,EAAQ,UAAU,EAAE,EAAE,KAAK,EAAE,YAAY;AACrI;AAEA,SAAgB,IAAe;CAE7B,IAAM,IAAU,EADF,EAAe,KAAK,aAAa,QAAQ,CAAc,CAC/B,GAChC,oBAAQ,IAAI,IAAI,GAChB,IAAS,EAAmB;CAWlC,OAVI,KAAQ,EAAM,IAAI,CAAM,GACxB,OACD,GAAS,cAAc,SAAS,CAAC,GAAG,SAAS,MAAS,EAAM,IAAI,CAAI,CAAC,GACtE,OAAO,OAAO,GAAS,mBAAmB,CAAC,CAAC,EAAE,SAAS,MAAW;EAChE,CAAC,GAAQ,SAAS,CAAC,GAAG,SAAS,MAAS,EAAM,IAAI,CAAI,CAAC;CACzD,CAAC,GACD;EAAC,GAAS;EAAM,GAAS;EAAU,GAAS;CAAS,EAAE,SAAS,MAAS;EACvE,AAAI,KAAM,EAAM,IAAI,CAAI;CAC1B,CAAC,IAEI,MAAM,KAAK,CAAK,EAAE,KAAK,MAAS,OAAO,CAAI,EAAE,YAAY,CAAC;AACnE;AAEA,SAAgB,IAAW;CACzB,OAAO,EAAmB,MAAM,YAAY,EAAa,EAAE,SAAS,QAAQ;AAC9E;AAOA,SAAgB,IAAoB;CAClC,IAAM,IAAU,EAAiB,EAAe,KAAK,aAAa,QAAQ,CAAc,CAAC,KAAK,CAAC,GACzF,KAAO,MAAU;EACrB,IAAI,KAAiC,QAAQ,MAAU,IAAI;EAC3D,IAAM,IAAS,OAAO,CAAK;EAC3B,OAAO,OAAO,SAAS,CAAM,IAAI,IAAS,KAAA;CAC5C;CACA,OAAO;EACL,QAAQ,EAAI,EAAQ,WAAW,EAAQ,MAAM,KAAK,EAAI,aAAa,QAAQ,QAAQ,CAAC;EACpF,QAAQ,EAAI,EAAQ,UAAU,EAAQ,OAAO;CAC/C;AACF;AAIA,SAAgB,EAAmB,GAAS;CACrC,MACL,aAAa,QAAQ,GAAmB,OAAO,EAAQ,EAAE,CAAC,GAC1D,aAAa,QAAQ,GAAqB,OAAO,EAAQ,IAAI,CAAC;AAChE;AAEA,SAAgB,IAAqB;CACnC,IAAM,IAAK,aAAa,QAAQ,CAAiB,GAC3C,IAAO,aAAa,QAAQ,CAAmB;CAErD,OADI,CAAC,KAAM,CAAC,IAAa,OAClB;EAAE,IAAI,OAAO,CAAE;EAAG;CAAK;AAChC;AAEA,SAAgB,IAAuB;CAErC,AADA,aAAa,WAAW,CAAiB,GACzC,aAAa,WAAW,CAAmB;AAC7C;AAIA,eAAsB,EAAM,GAAa;CA4BvC,OA3BI,MAEJ,IAAe,MAAM,GAAG,EAAS,SAAS;EACxC,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,MAAM,KAAK,UAAU,CAAW;CAClC,CAAC,EACE,KAAK,OAAO,MAAQ;EACnB,IAAM,IAAO,MAAM,EAAI,KAAK;EAC5B,IAAI,CAAC,EAAI,IAAI;GACX,IAAM,IAAY,MAAM,GAAM,WAAW,GAAM,SAAS,iBAAiB,EAAI,QAAQ;GAErF,MADA,EAAM,SAAS,EAAI,QACb;EACR;EACA,IAAM,IAAQ,EAAa,CAAI;EAC/B,IAAI,CAAC,GAAO,MAAU,MAAM,4BAA4B;EACxD,IAAM,IAAO,EAAY,CAAI;EAO7B,OANA,aAAa,QAAQ,GAAgB,CAAK,GAC1C,eAAe,QAAQ,GAAwB,GAAG,GAC9C,KAAM,aAAa,QAAQ,GAAe,KAAK,UAAU,CAAI,CAAC,GAClE,EAAqB,GAAM,GAAO,CAAI,GAEtC,OAAO,cAAc,IAAI,MAAM,YAAY,CAAC,GACrC;GAAE;GAAO;GAAM,UAAU;EAAK;CACvC,CAAC,EACA,cAAc;EAAE,IAAe;CAAM,CAAC,GAElC;AACT;AAIA,eAAsB,IAAc;CAClC,IAAM,IAAQ,EAAe;CAC7B,IAAI,GAAO,OAAO;CAClB,IAAM,IAAQ,gBAAI,MAAM,yBAAyB;CAEjD,MADA,EAAM,SAAS,KACT;AACR;AAEA,eAAe,IAAc;CAE3B,OAAO;EACL,gBAAgB;EAChB,eAAe,UAAU,MAHP,EAAY;CAIhC;AACF;AAEA,eAAsB,EAAkB,GAAS,IAAO,IAAI,IAAU,CAAC,GAAG;CACxE,AAAI,KAAQ,OAAO,KAAS,aAC1B,IAAU,GACV,IAAO;CAGT,IAAM,IAAU,MAAM,EAAY,GAC5B,IAAM,MAAM,MAAM,GAAG,IAAU,KAAQ,MAAM;EACjD,GAAG;EACH,SAAS;GAAE,GAAG;GAAS,GAAG,EAAQ;EAAQ;CAC5C,CAAC;CACD,AAAI,EAAI,WAAW,OAAK,EAAO;CAC/B,IAAM,IAAO,MAAM,EAAI,KAAK,GACxB,IAAO,CAAC;CACZ,IAAI,GACF,IAAI;EACF,IAAO,KAAK,MAAM,CAAI;CACxB,QAAQ;EACN,IAAO,EAAE,OAAO,EAAK;CACvB;CAEF,IAAI,CAAC,EAAI,IAAI;EACX,IAAM,IAAgB,GAAM,SAAS,GAAM,SACrC,IAAS,OAAO,KAAkB,WACpC,IACA,KAAiB,OAAO,KAAK,CAAa,EAAE,SAAS,IACnD,KAAK,UAAU,CAAa,IAC5B,IACA,IAAY,MAAM,KAAU,OAAO,EAAI,OAAO,IAAI,EAAI,YAAY;EAGxE,MAFA,EAAM,SAAS,EAAI,QACnB,EAAM,WAAW,GACX;CACR;CACA,OAAO;AACT;AAEA,eAAsB,EAAe,GAAS,GAAM;CAClD,IAAM,IAAO,MAAM,EAAkB,GAAS,CAAI;CAClD,OAAO,EAAK,QAAQ;AACtB"}
@@ -0,0 +1,2 @@
1
+ import { i as e, m as t, t as n } from "./authApi-cJpMRgNq.js";
2
+ export { n as apiGetWithAuth, e as ensureToken, t as logout };
@@ -0,0 +1,2 @@
1
+ var e={VITE_AUTH_URL:void 0,VITE_ADMIN_API_URL:void 0,VITE_ADMIN_APP_ID:void 0,VITE_SUBMISSIONS_URL:void 0,VITE_JOBS_URL:void 0,VITE_CANDIDATES_URL:void 0,VITE_PYOPS_URL:void 0,VITE_APP_ID:void 0};function t(t){return typeof window<`u`&&window.__CORE_THEME_CONFIG__&&window.__CORE_THEME_CONFIG__[t]!=null?window.__CORE_THEME_CONFIG__[t]:e[t]}function n(e,n=``){return{toString:()=>t(e)||(typeof n==`function`?n():n),valueOf:()=>t(e)||(typeof n==`function`?n():n),[Symbol.toPrimitive]:()=>t(e)||(typeof n==`function`?n():n)}}var r=n(`VITE_AUTH_URL`),i=n(`VITE_ADMIN_API_URL`,()=>t(`VITE_AUTH_URL`)||`http://localhost:9009`),a=n(`VITE_ADMIN_APP_ID`,()=>t(`VITE_APP_ID`)||`zinnext-dev-api-v1`),o=n(`VITE_SUBMISSIONS_URL`),s=n(`VITE_JOBS_URL`),c=n(`VITE_CANDIDATES_URL`),l=n(`VITE_PYOPS_URL`,`http://localhost:7020/v1`),u=n(`VITE_APP_ID`);function d(e={}){let n=t(`VITE_APP_ID`);return n?{"X-App-Id":n,...e}:{...e}}function f(e={}){let n=t(`VITE_ADMIN_APP_ID`)||t(`VITE_APP_ID`)||`zinnext-dev-api-v1`;return n?{"X-App-Id":n,...e}:{...e}}function p(){if(typeof window>`u`||typeof window.fetch!=`function`||window.__CORE_THEME_APP_ID_PATCHED__)return;let e=[r,i,o,s,c,l],n=window.fetch.bind(window),a=e=>typeof e==`string`?e:e instanceof URL?e.href:e&&typeof e.url==`string`?e.url:``,u=t=>!!t&&e.some(e=>{let n=String(e);return n&&t.startsWith(n)});window.fetch=function(e,r){try{let o=a(e),s=String(i)&&o.startsWith(String(i))?t(`VITE_ADMIN_APP_ID`)||t(`VITE_APP_ID`)||`zinnext-dev-api-v1`:t(`VITE_APP_ID`);if(s&&u(o)){let t=typeof Request<`u`&&e instanceof Request,i=new Headers(r&&r.headers||(t?e.headers:void 0));return i.has(`X-App-Id`)||i.set(`X-App-Id`,s),t&&!(r&&r.headers)?n(new Request(e,{headers:i}),r):n(e,{...r||{},headers:i})}}catch{}return n(e,r)},window.__CORE_THEME_APP_ID_PATCHED__=!0}p();function m(e={}){typeof window>`u`||(window.__CORE_THEME_CONFIG__={...window.__CORE_THEME_CONFIG__||{},...e},p())}var h=`authToken`,g=`authUser`,_=`authLoginSession`,v=`ct_project_id`,y=`ct_project_name`,b=[`access_token`,`refresh_token`,`id_token`,`token_type`,`expires_in`,`refresh_expires_in`,`menu`,`footermenu`,`menuPermission`,`default_values`,`roleId`,`companyName`,`preferred_Username`,`user_Email`,`userName`,`userId`,`tenantId`,`businessId`,`businessUnitId`,`activeKey`,`ct_project_id`,`ct_project_name`],x=null,S=null;function C(e){S=typeof e==`string`&&e.trim()?e.trim():null}function w(){S=null}function T(e){return e?.token??e?.access_token??e?.accessToken??e?.jwt??e?.data?.token??e?.data?.access_token??e?.data?.accessToken??e?.data?.jwt}function E(e){return e?.user??e?.data?.user??e?.data?.profile??null}function D(e){if(!e||typeof e!=`string`)return null;try{let t=e.split(`.`)[1];if(!t)return null;let n=t.replace(/-/g,`+`).replace(/_/g,`/`);return JSON.parse(atob(n.padEnd(Math.ceil(n.length/4)*4,`=`)))}catch{return null}}function O(e,t){t!=null&&localStorage.setItem(e,JSON.stringify(t))}function k(e,t){return t?.menus??e?.menus??{menu:t?.menu??e?.menu,footermenu:t?.footermenu??e?.footermenu}}function A(e,t,n){let r=e?.data??e,i=D(t)??{},a=k(e,r),o=n?.userName??n?.name??r?.userName??r?.name??i.userName??i.name??i.preferred_username??i.email,s=n?.preferred_Username??n?.preferred_username??r?.preferred_Username??r?.preferred_username??i.preferred_Username??i.preferred_username??i.email??o,c=n?.email??r?.email??i.email??s;localStorage.setItem(`access_token`,t),r?.refresh_token&&localStorage.setItem(`refresh_token`,r.refresh_token),r?.id_token!==void 0&&localStorage.setItem(`id_token`,r.id_token),r?.token_type&&localStorage.setItem(`token_type`,r.token_type),r?.expires_in!==void 0&&localStorage.setItem(`expires_in`,String(r.expires_in)),r?.refresh_expires_in!==void 0&&localStorage.setItem(`refresh_expires_in`,String(r.refresh_expires_in)),o&&localStorage.setItem(`userName`,o),s&&localStorage.setItem(`preferred_Username`,s),c&&localStorage.setItem(`user_Email`,c),(r?.roleId??i.role_id)&&localStorage.setItem(`roleId`,r?.roleId??i.role_id),r?.companyName&&localStorage.setItem(`companyName`,r.companyName),i.userId!==void 0&&localStorage.setItem(`userId`,String(i.userId)),i.tenantId&&localStorage.setItem(`tenantId`,i.tenantId),i.businessId&&localStorage.setItem(`businessId`,i.businessId),i.businessUnitId&&localStorage.setItem(`businessUnitId`,i.businessUnitId),O(`menu`,a.menu),O(`footermenu`,a.footermenu),O(`menuPermission`,r?.menuPermission),O(`default_values`,r?.default_values)}function j(){if(S)return S;let e=localStorage.getItem(h),t=sessionStorage.getItem(_)===`1`;return e&&t?e:null}function M(){try{let e=localStorage.getItem(g);if(e)return JSON.parse(e)}catch{}return{userId:localStorage.getItem(`userId`),username:localStorage.getItem(`userName`)||localStorage.getItem(`preferred_Username`),email:localStorage.getItem(`user_Email`),roleId:localStorage.getItem(`roleId`)}}function N(){localStorage.removeItem(h),localStorage.removeItem(g),b.forEach(e=>localStorage.removeItem(e)),sessionStorage.removeItem(_),window.dispatchEvent(new Event(`auth:logout`))}function P(){let e=String(localStorage.getItem(`roleId`)??``).trim().toLowerCase();if(e)return e;let t=D(j())??{};return String(t.role??t.roleName??t.role_name??t.role_id??t.roleId??``).trim().toLowerCase()}function F(){let e=D(j()??localStorage.getItem(h)),t=new Set,n=P();return n&&t.add(n),e&&((e?.realm_access?.roles??[]).forEach(e=>t.add(e)),Object.values(e?.resource_access??{}).forEach(e=>{(e?.roles??[]).forEach(e=>t.add(e))}),[e?.role,e?.roleName,e?.role_name].forEach(e=>{e&&t.add(e)})),Array.from(t).map(e=>String(e).toLowerCase())}function I(){return P()===`tester`||F().includes(`tester`)}function L(){let e=D(j()??localStorage.getItem(h))??{},t=e=>{if(e==null||e===``)return;let t=Number(e);return Number.isFinite(t)?t:void 0};return{roleId:t(e.role_id??e.roleId)??t(localStorage.getItem(`roleId`)),userId:t(e.userId??e.user_id)}}function R(e){e&&(localStorage.setItem(v,String(e.id)),localStorage.setItem(y,String(e.name)))}function z(){let e=localStorage.getItem(v),t=localStorage.getItem(y);return!e||!t?null:{id:Number(e),name:t}}function B(){localStorage.removeItem(v),localStorage.removeItem(y)}async function V(e){return x||(x=fetch(`${r}/login`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}).then(async e=>{let t=await e.json();if(!e.ok){let n=Error(t?.message??t?.error??`Login failed: ${e.status}`);throw n.status=e.status,n}let n=T(t);if(!n)throw Error(`No token in login response`);let r=E(t);return localStorage.setItem(h,n),sessionStorage.setItem(_,`1`),r&&localStorage.setItem(g,JSON.stringify(r)),A(t,n,r),window.dispatchEvent(new Event(`auth:login`)),{token:n,user:r,response:t}}).finally(()=>{x=null}),x)}async function H(){let e=j();if(e)return e;let t=Error(`Authentication required`);throw t.status=401,t}async function U(){return{"Content-Type":`application/json`,Authorization:`Bearer ${await H()}`}}async function W(e,t=``,n={}){t&&typeof t==`object`&&(n=t,t=``);let r=await U(),i=await fetch(`${e}${t||``}`,{...n,headers:{...r,...n.headers}});i.status===401&&N();let a=await i.text(),o={};if(a)try{o=JSON.parse(a)}catch{o={error:a}}if(!i.ok){let e=o?.error??o?.message,t=typeof e==`string`?e:e&&Object.keys(e).length>0?JSON.stringify(e):``,n=Error(t||`API ${i.status}: ${i.statusText}`);throw n.status=i.status,n.response=o,n}return o}async function G(e,t){let n=await W(e,t);return n.data??n}Object.defineProperty(exports,"C",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"D",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"E",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"S",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"T",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"w",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return u}});
2
+ //# sourceMappingURL=authApi-qTqKoZ1I.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authApi-qTqKoZ1I.cjs","names":[],"sources":["../src/services/apiConfig.js","../src/services/authApi.js"],"sourcesContent":["// Central API base URLs.\n//\n// When CORE-THEME runs standalone (npm run dev), the values come from\n// src/services/.env (Vite VITE_* vars, baked in at build time).\n//\n// When CORE-THEME is consumed as the published @realtek/core-theme package,\n// host apps can override these values at RUNTIME by setting\n// `window.__CORE_THEME_CONFIG__` before the app renders:\n//\n// <script>\n// window.__CORE_THEME_CONFIG__ = {\n// VITE_AUTH_URL: 'http://192.168.1.66/authapi/v1',\n// VITE_SUBMISSIONS_URL: 'http://192.168.1.66/submissionsapi/v1',\n// VITE_JOBS_URL: 'http://192.168.1.66/jobsapi/v1',\n// VITE_CANDIDATES_URL: 'http://192.168.1.66/candidatesapi/v1',\n// VITE_APP_ID: 'zinnext', // sent as the `X-App-Id` header on every API call\n// VITE_ADMIN_APP_ID: 'zinnext', // optional admin override\n// };\n// </script>\n//\n// Priority: runtime window config > build-time .env fallback.\n\nconst BUILD_TIME_FALLBACK = {\n VITE_AUTH_URL: import.meta.env.VITE_AUTH_URL,\n VITE_ADMIN_API_URL: import.meta.env.VITE_ADMIN_API_URL,\n VITE_ADMIN_APP_ID: import.meta.env.VITE_ADMIN_APP_ID,\n VITE_SUBMISSIONS_URL: import.meta.env.VITE_SUBMISSIONS_URL,\n VITE_JOBS_URL: import.meta.env.VITE_JOBS_URL,\n VITE_CANDIDATES_URL: import.meta.env.VITE_CANDIDATES_URL,\n VITE_PYOPS_URL: import.meta.env.VITE_PYOPS_URL,\n VITE_APP_ID: import.meta.env.VITE_APP_ID,\n};\n\nfunction resolve(key) {\n if (\n typeof window !== 'undefined' &&\n window.__CORE_THEME_CONFIG__ &&\n window.__CORE_THEME_CONFIG__[key] != null\n ) {\n return window.__CORE_THEME_CONFIG__[key];\n }\n return BUILD_TIME_FALLBACK[key];\n}\n\nfunction runtimeValue(key, fallback = '') {\n return {\n toString: () => resolve(key) || (typeof fallback === 'function' ? fallback() : fallback),\n valueOf: () => resolve(key) || (typeof fallback === 'function' ? fallback() : fallback),\n [Symbol.toPrimitive]: () => resolve(key) || (typeof fallback === 'function' ? fallback() : fallback),\n };\n}\n\n// These are intentionally dynamic. Many service files use them inside template\n// literals (`${AUTH_URL}/path`) or pass them to helpers that later build a URL.\n// Resolving at string-conversion time prevents a published package from\n// freezing CORE-THEME's own .env values into consuming apps and Docker builds.\nexport const AUTH_URL = runtimeValue('VITE_AUTH_URL');\nexport const ADMIN_API_URL = runtimeValue(\n 'VITE_ADMIN_API_URL',\n () => resolve('VITE_AUTH_URL') || 'http://localhost:9009',\n);\nexport const ADMIN_APP_ID = runtimeValue('VITE_ADMIN_APP_ID', () => resolve('VITE_APP_ID') || 'zinnext-dev-api-v1');\nexport const SUBMISSIONS_URL = runtimeValue('VITE_SUBMISSIONS_URL');\nexport const JOBS_URL = runtimeValue('VITE_JOBS_URL');\nexport const CANDIDATES_URL = runtimeValue('VITE_CANDIDATES_URL');\nexport const PYOPS_URL = runtimeValue('VITE_PYOPS_URL', 'http://localhost:7020/v1');\n\n// App identifier sent as the `X-App-Id` header on every API request (e.g.\n// 'zinnext', 'lms'). Configured in ONE place — the host's window config (or the\n// build-time .env fallback) — and applied to all calls via the interceptor below.\nexport const APP_ID = runtimeValue('VITE_APP_ID');\n\n// Helper for code that builds headers explicitly: merges `X-App-Id` into a\n// header object without clobbering anything else. (The interceptor below already\n// covers existing calls; this is just a convenience for new code.)\nexport function withAppId(headers = {}) {\n const appId = resolve('VITE_APP_ID');\n return appId ? { 'X-App-Id': appId, ...headers } : { ...headers };\n}\n\nexport function withAdminAppId(headers = {}) {\n const appId = resolve('VITE_ADMIN_APP_ID') || resolve('VITE_APP_ID') || 'zinnext-dev-api-v1';\n return appId ? { 'X-App-Id': appId, ...headers } : { ...headers };\n}\n\n// ── X-App-Id interceptor ──────────────────────────────────────────────────────\n//\n// Rather than editing every inline `headers: {...}` across the service files\n// (and risking new calls forgetting it), we patch `fetch` ONCE so every request\n// to a configured API base URL carries `X-App-Id`. This is scoped strictly to the\n// four API origins, so third-party/asset requests are never touched, and any\n// caller that already set `X-App-Id` explicitly is left as-is.\nfunction installAppIdInterceptor() {\n if (typeof window === 'undefined' || typeof window.fetch !== 'function') return;\n // Guard against double-patching (repeated imports / Vite HMR).\n if (window.__CORE_THEME_APP_ID_PATCHED__) return;\n\n const apiBaseUrls = [AUTH_URL, ADMIN_API_URL, SUBMISSIONS_URL, JOBS_URL, CANDIDATES_URL, PYOPS_URL];\n const originalFetch = window.fetch.bind(window);\n\n const urlOf = (input) => {\n if (typeof input === 'string') return input;\n if (input instanceof URL) return input.href;\n if (input && typeof input.url === 'string') return input.url; // Request object\n return '';\n };\n const isApiRequest = (url) =>\n !!url && apiBaseUrls.some((base) => {\n const value = String(base);\n return value && url.startsWith(value);\n });\n\n window.fetch = function patchedFetch(input, init) {\n try {\n const url = urlOf(input);\n const isAdminRequest = String(ADMIN_API_URL) && url.startsWith(String(ADMIN_API_URL));\n const appId = isAdminRequest\n ? (resolve('VITE_ADMIN_APP_ID') || resolve('VITE_APP_ID') || 'zinnext-dev-api-v1')\n : resolve('VITE_APP_ID');\n if (appId && isApiRequest(url)) {\n const isRequestObj = typeof Request !== 'undefined' && input instanceof Request;\n const headers = new Headers(\n (init && init.headers) || (isRequestObj ? input.headers : undefined),\n );\n if (!headers.has('X-App-Id')) headers.set('X-App-Id', appId);\n if (isRequestObj && !(init && init.headers)) {\n return originalFetch(new Request(input, { headers }), init);\n }\n return originalFetch(input, { ...(init || {}), headers });\n }\n } catch {\n // Any unexpected argument shape: fall through to the untouched request.\n }\n return originalFetch(input, init);\n };\n\n window.__CORE_THEME_APP_ID_PATCHED__ = true;\n}\n\ninstallAppIdInterceptor();\n\n// Optional JS helper (alternative to the index.html <script>). Because the\n// exports above are resolved when this module first loads, call this BEFORE the\n// first import of @realtek/core-theme — e.g. in the host's index.html, not in\n// main.jsx (which runs after imports are evaluated). The index.html <script>\n// approach is the reliable one.\nexport function configureCoreTheme(config = {}) {\n if (typeof window === 'undefined') return;\n window.__CORE_THEME_CONFIG__ = { ...(window.__CORE_THEME_CONFIG__ || {}), ...config };\n installAppIdInterceptor();\n}\n","import { AUTH_URL } from './apiConfig';\n\nconst AUTH_TOKEN_KEY = 'authToken';\nconst AUTH_USER_KEY = 'authUser';\nconst AUTH_LOGIN_SESSION_KEY = 'authLoginSession';\nconst CT_PROJECT_ID_KEY = 'ct_project_id';\nconst CT_PROJECT_NAME_KEY = 'ct_project_name';\nconst LOGIN_STORAGE_KEYS = [\n 'access_token', 'refresh_token', 'id_token', 'token_type', 'expires_in',\n 'refresh_expires_in', 'menu', 'footermenu', 'menuPermission', 'default_values',\n 'roleId', 'companyName', 'preferred_Username', 'user_Email', 'userName',\n 'userId', 'tenantId', 'businessId', 'businessUnitId', 'activeKey',\n 'ct_project_id', 'ct_project_name',\n];\n\nlet loginPromise = null;\nlet runtimeAuthToken = null;\n\nexport function setAuthTokenOverride(token) {\n runtimeAuthToken = typeof token === 'string' && token.trim() ? token.trim() : null;\n}\n\nexport function clearAuthTokenOverride() {\n runtimeAuthToken = null;\n}\n\nfunction extractToken(json) {\n return (\n json?.token ?? json?.access_token ?? json?.accessToken ?? json?.jwt ??\n json?.data?.token ?? json?.data?.access_token ?? json?.data?.accessToken ?? json?.data?.jwt\n );\n}\n\nfunction extractUser(json) {\n return json?.user ?? json?.data?.user ?? json?.data?.profile ?? null;\n}\n\nfunction decodeJwtPayload(token) {\n if (!token || typeof token !== 'string') return null;\n try {\n const payload = token.split('.')[1];\n if (!payload) return null;\n const normalized = payload.replace(/-/g, '+').replace(/_/g, '/');\n return JSON.parse(atob(normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=')));\n } catch {\n return null;\n }\n}\n\nfunction setLocalStorageJson(key, value) {\n if (value === undefined || value === null) return;\n localStorage.setItem(key, JSON.stringify(value));\n}\n\nfunction getLoginMenus(json, data) {\n return data?.menus ?? json?.menus ?? {\n menu: data?.menu ?? json?.menu,\n footermenu: data?.footermenu ?? json?.footermenu,\n };\n}\n\nfunction persistLoginResponse(json, token, user) {\n const data = json?.data ?? json;\n const tokenPayload = decodeJwtPayload(token) ?? {};\n const menus = getLoginMenus(json, data);\n const userName = (\n user?.userName ?? user?.name ?? data?.userName ?? data?.name ??\n tokenPayload.userName ?? tokenPayload.name ?? tokenPayload.preferred_username ?? tokenPayload.email\n );\n const preferredUsername = (\n user?.preferred_Username ?? user?.preferred_username ??\n data?.preferred_Username ?? data?.preferred_username ??\n tokenPayload.preferred_Username ?? tokenPayload.preferred_username ??\n tokenPayload.email ?? userName\n );\n const userEmail = user?.email ?? data?.email ?? tokenPayload.email ?? preferredUsername;\n\n localStorage.setItem('access_token', token);\n if (data?.refresh_token) localStorage.setItem('refresh_token', data.refresh_token);\n if (data?.id_token !== undefined) localStorage.setItem('id_token', data.id_token);\n if (data?.token_type) localStorage.setItem('token_type', data.token_type);\n if (data?.expires_in !== undefined) localStorage.setItem('expires_in', String(data.expires_in));\n if (data?.refresh_expires_in !== undefined) localStorage.setItem('refresh_expires_in', String(data.refresh_expires_in));\n if (userName) localStorage.setItem('userName', userName);\n if (preferredUsername) localStorage.setItem('preferred_Username', preferredUsername);\n if (userEmail) localStorage.setItem('user_Email', userEmail);\n if (data?.roleId ?? tokenPayload.role_id) localStorage.setItem('roleId', data?.roleId ?? tokenPayload.role_id);\n if (data?.companyName) localStorage.setItem('companyName', data.companyName);\n if (tokenPayload.userId !== undefined) localStorage.setItem('userId', String(tokenPayload.userId));\n if (tokenPayload.tenantId) localStorage.setItem('tenantId', tokenPayload.tenantId);\n if (tokenPayload.businessId) localStorage.setItem('businessId', tokenPayload.businessId);\n if (tokenPayload.businessUnitId) localStorage.setItem('businessUnitId', tokenPayload.businessUnitId);\n\n setLocalStorageJson('menu', menus.menu);\n setLocalStorageJson('footermenu', menus.footermenu);\n setLocalStorageJson('menuPermission', data?.menuPermission);\n setLocalStorageJson('default_values', data?.default_values);\n}\n\n// ── Token & Session ──────────────────────────────────────────────────────────\n\nexport function getStoredToken() {\n if (runtimeAuthToken) return runtimeAuthToken;\n const token = localStorage.getItem(AUTH_TOKEN_KEY);\n const hasSession = sessionStorage.getItem(AUTH_LOGIN_SESSION_KEY) === '1';\n return token && hasSession ? token : null;\n}\n\nexport function getStoredUser() {\n try {\n const stored = localStorage.getItem(AUTH_USER_KEY);\n if (stored) return JSON.parse(stored);\n } catch {\n // Fall through to the legacy login fields below.\n }\n return {\n userId: localStorage.getItem('userId'),\n username: localStorage.getItem('userName') || localStorage.getItem('preferred_Username'),\n email: localStorage.getItem('user_Email'),\n roleId: localStorage.getItem('roleId'),\n };\n}\n\nexport function logout() {\n localStorage.removeItem(AUTH_TOKEN_KEY);\n localStorage.removeItem(AUTH_USER_KEY);\n LOGIN_STORAGE_KEYS.forEach((key) => localStorage.removeItem(key));\n sessionStorage.removeItem(AUTH_LOGIN_SESSION_KEY);\n window.dispatchEvent(new Event('auth:logout'));\n}\n\n// ── Role Helpers ─────────────────────────────────────────────────────────────\n\nexport function getCurrentRoleName() {\n const stored = String(localStorage.getItem('roleId') ?? '').trim().toLowerCase();\n if (stored) return stored;\n const payload = decodeJwtPayload(getStoredToken()) ?? {};\n return String(payload.role ?? payload.roleName ?? payload.role_name ?? payload.role_id ?? payload.roleId ?? '').trim().toLowerCase();\n}\n\nexport function getUserRoles() {\n const token = getStoredToken() ?? localStorage.getItem(AUTH_TOKEN_KEY);\n const payload = decodeJwtPayload(token);\n const roles = new Set();\n const stored = getCurrentRoleName();\n if (stored) roles.add(stored);\n if (payload) {\n (payload?.realm_access?.roles ?? []).forEach((role) => roles.add(role));\n Object.values(payload?.resource_access ?? {}).forEach((client) => {\n (client?.roles ?? []).forEach((role) => roles.add(role));\n });\n [payload?.role, payload?.roleName, payload?.role_name].forEach((role) => {\n if (role) roles.add(role);\n });\n }\n return Array.from(roles).map((role) => String(role).toLowerCase());\n}\n\nexport function isTester() {\n return getCurrentRoleName() === 'tester' || getUserRoles().includes('tester');\n}\n\n// getActingIdentity returns the numeric {roleId, userId} of the logged-in user,\n// read from the auth token (falling back to the stored roleId). Used to evaluate\n// admin-configured field autoValueRules for UX only — the gateway re-evaluates\n// the same rules from the token and has the final say, so nothing here is a\n// security boundary.\nexport function getActingIdentity() {\n const payload = decodeJwtPayload(getStoredToken() ?? localStorage.getItem(AUTH_TOKEN_KEY)) ?? {};\n const num = (value) => {\n if (value === undefined || value === null || value === '') return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n };\n return {\n roleId: num(payload.role_id ?? payload.roleId) ?? num(localStorage.getItem('roleId')),\n userId: num(payload.userId ?? payload.user_id),\n };\n}\n\n// ── Project Context ───────────────────────────────────────────────────────────\n\nexport function setSelectedProject(project) {\n if (!project) return;\n localStorage.setItem(CT_PROJECT_ID_KEY, String(project.id));\n localStorage.setItem(CT_PROJECT_NAME_KEY, String(project.name));\n}\n\nexport function getSelectedProject() {\n const id = localStorage.getItem(CT_PROJECT_ID_KEY);\n const name = localStorage.getItem(CT_PROJECT_NAME_KEY);\n if (!id || !name) return null;\n return { id: Number(id), name };\n}\n\nexport function clearSelectedProject() {\n localStorage.removeItem(CT_PROJECT_ID_KEY);\n localStorage.removeItem(CT_PROJECT_NAME_KEY);\n}\n\n// ── Login ────────────────────────────────────────────────────────────────────\n\nexport async function login(credentials) {\n if (loginPromise) return loginPromise;\n\n loginPromise = fetch(`${AUTH_URL}/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(credentials),\n })\n .then(async (res) => {\n const json = await res.json();\n if (!res.ok) {\n const error = new Error(json?.message ?? json?.error ?? `Login failed: ${res.status}`);\n error.status = res.status;\n throw error;\n }\n const token = extractToken(json);\n if (!token) throw new Error('No token in login response');\n const user = extractUser(json);\n localStorage.setItem(AUTH_TOKEN_KEY, token);\n sessionStorage.setItem(AUTH_LOGIN_SESSION_KEY, '1');\n if (user) localStorage.setItem(AUTH_USER_KEY, JSON.stringify(user));\n persistLoginResponse(json, token, user);\n // Let any mounted AuthGuard re-check and reveal the protected content.\n window.dispatchEvent(new Event('auth:login'));\n return { token, user, response: json };\n })\n .finally(() => { loginPromise = null; });\n\n return loginPromise;\n}\n\n// ── HTTP Helpers (exported for use by other service files) ───────────────────\n\nexport async function ensureToken() {\n const token = getStoredToken();\n if (token) return token;\n const error = new Error('Authentication required');\n error.status = 401;\n throw error;\n}\n\nasync function authHeaders() {\n const token = await ensureToken();\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n}\n\nexport async function fetchJsonWithAuth(baseUrl, path = '', options = {}) {\n if (path && typeof path === 'object') {\n options = path;\n path = '';\n }\n\n const headers = await authHeaders();\n const res = await fetch(`${baseUrl}${path || ''}`, {\n ...options,\n headers: { ...headers, ...options.headers },\n });\n if (res.status === 401) logout();\n const text = await res.text();\n let json = {};\n if (text) {\n try {\n json = JSON.parse(text);\n } catch {\n json = { error: text };\n }\n }\n if (!res.ok) {\n const responseError = json?.error ?? json?.message;\n const detail = typeof responseError === 'string'\n ? responseError\n : responseError && Object.keys(responseError).length > 0\n ? JSON.stringify(responseError)\n : '';\n const error = new Error(detail || `API ${res.status}: ${res.statusText}`);\n error.status = res.status;\n error.response = json;\n throw error;\n }\n return json;\n}\n\nexport async function apiGetWithAuth(baseUrl, path) {\n const json = await fetchJsonWithAuth(baseUrl, path);\n return json.data ?? json;\n}\n"],"mappings":"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"}