dinocollab-core 2.1.29 → 2.1.31
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/src/http-service/base/crud-service-base.js +1 -1
- package/dist/src/http-service/base/crud-service-base.js.map +1 -1
- package/dist/src/http-service/base/helpers.js +1 -1
- package/dist/src/http-service/base/helpers.js.map +1 -1
- package/dist/src/http-service/graphql/app-profile.js +1 -1
- package/dist/src/http-service/graphql/app-profile.js.map +1 -1
- package/dist/types/http-service/base/helpers.d.ts +9 -0
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{inherits as
|
|
1
|
+
import{inherits as r,createClass as n,classCallCheck as t,callSuper as e,defineProperty as a,asyncToGenerator as u,regenerator as s}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{resolveBaseUrl as i,fetchDelay as o}from"./helpers.js";import{createHttpService as c}from"./gateway.js";import l from"./service-base.js";var f=function(){function f(r){var n;return t(this,f),n=e(this,f,[c(i(r))]),a(n,"all",function(r,t,e){var a;return o(u(s().m(function e(){var a;return s().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,n.tryPushNotify(n.post,"All",r,{headers:{"Content-Type":"application/json"},signal:t});case 1:return a=e.v,e.a(2,a)}},e)})),null!==(a=null==e?void 0:e.delay)&&void 0!==a?a:500)}),a(n,"single",function(r,t){return o(u(s().m(function e(){var a;return s().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,n.tryGet("Get",{params:{Id:r},signal:t});case 1:return a=e.v,e.a(2,a)}},e)})),500)}),a(n,"create",function(r,t,e){var a;return o(u(s().m(function e(){var a;return s().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,n.pushNotify(n.post,"Create",r,{signal:t});case 1:return a=e.v,e.a(2,a)}},e)})),null!==(a=null==e?void 0:e.delay)&&void 0!==a?a:500)}),a(n,"update",function(r,t,e){return o(u(s().m(function a(){var u;return s().w(function(a){for(;;)switch(a.n){case 0:return a.n=1,n.pushNotify(n.put,"Update",t,{signal:e,params:{Id:r}});case 1:return u=a.v,a.a(2,u)}},a)})),500)}),a(n,"updatePatch",function(r,t,e){return o(u(s().m(function a(){var u;return s().w(function(a){for(;;)switch(a.n){case 0:return a.n=1,n.pushNotify(n.patch,"Patch",t,{signal:e,params:{Id:r}});case 1:return u=a.v,a.a(2,u)}},a)})),500)}),a(n,"remove",function(r,t){return o(u(s().m(function e(){var a;return s().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,n.pushNotify(n.delete,"Delete",{params:{Id:r},signal:t});case 1:return a=e.v,e.a(2,a)}},e)})),500)}),n}return r(f,l),n(f)}();export{f as default};
|
|
2
2
|
//# sourceMappingURL=crud-service-base.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud-service-base.js","sources":["../../../../src/http-service/base/crud-service-base.ts"],"sourcesContent":["import { fetchDelay } from './helpers'\r\nimport { createHttpService } from './gateway'\r\nimport type { IFilterModelSwagger, IReponseAll } from './types'\r\nimport ServiceBase from './service-base'\r\n\r\n/**\r\n * Base class for HTTP CRUD services.\r\n *\r\n * @template T - Entity type.\r\n * @template K - Entity ID type.\r\n *\r\n * Provides common methods:\r\n * - all: Get list with filter and pagination\r\n * - single: Get detail by ID\r\n * - create: Add new entity\r\n * - update: Update entity by ID\r\n * - remove: Delete entity by ID\r\n *\r\n * Supports request cancellation and artificial delay.\r\n */\r\nclass CRUDServiceBase<T, K> extends ServiceBase {\r\n constructor(baseUri: string) {\r\n super(createHttpService(
|
|
1
|
+
{"version":3,"file":"crud-service-base.js","sources":["../../../../src/http-service/base/crud-service-base.ts"],"sourcesContent":["import { fetchDelay, resolveBaseUrl } from './helpers'\r\nimport { createHttpService } from './gateway'\r\nimport type { IFilterModelSwagger, IReponseAll } from './types'\r\nimport ServiceBase from './service-base'\r\n\r\n/**\r\n * Base class for HTTP CRUD services.\r\n *\r\n * @template T - Entity type.\r\n * @template K - Entity ID type.\r\n *\r\n * Provides common methods:\r\n * - all: Get list with filter and pagination\r\n * - single: Get detail by ID\r\n * - create: Add new entity\r\n * - update: Update entity by ID\r\n * - remove: Delete entity by ID\r\n *\r\n * Supports request cancellation and artificial delay.\r\n */\r\nclass CRUDServiceBase<T, K> extends ServiceBase {\r\n constructor(baseUri: string) {\r\n super(createHttpService(resolveBaseUrl(baseUri)))\r\n }\r\n /**\r\n * Fetches a list of entities with optional filters and pagination.\r\n *\r\n * @param filters - Filters and pagination options.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @param options - Optional delay configuration.\r\n * @returns A promise resolving to the response containing the list of entities.\r\n */\r\n all = (filters: Partial<IFilterModelSwagger<T>>, signal?: AbortSignal, options?: { delay?: number }) => {\r\n return fetchDelay(async () => {\r\n const data = await this.tryPushNotify(this.post<IReponseAll<T>>, 'All', filters, {\r\n headers: { 'Content-Type': 'application/json' },\r\n signal\r\n })\r\n return data\r\n }, options?.delay ?? 500)\r\n }\r\n /**\r\n * Fetches a single entity by its ID.\r\n *\r\n * @param id - The ID of the entity to fetch.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the entity data.\r\n */\r\n single = (id: K, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.tryGet<T>('Get', { params: { Id: id }, signal })\r\n return data\r\n }, 500)\r\n }\r\n /**\r\n * Creates a new entity.\r\n *\r\n * @param model - The entity data to create.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @param options - Optional delay configuration.\r\n * @returns A promise resolving to the created entity data.\r\n */\r\n create = (model: Partial<T>, signal?: AbortSignal, options?: { delay?: number }) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.post<T>, 'Create', model, { signal })\r\n return data\r\n }, options?.delay ?? 500)\r\n }\r\n /**\r\n * Updates an existing entity by its ID.\r\n *\r\n * @param id - The ID of the entity to update.\r\n * @param model - The partial entity data to update.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the updated entity data.\r\n */\r\n update = (id: K, model: Partial<T>, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.put<T>, 'Update', model, { signal, params: { Id: id } })\r\n return data\r\n }, 500)\r\n }\r\n /**\r\n * HTTP PATCH request with automatic authentication\r\n *\r\n * @param id - The ID of the entity to update.\r\n * @param model - The partial entity data to update.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the updated entity data.\r\n */\r\n updatePatch = (id: K, model: Partial<T>, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.patch<T>, 'Patch', model, { signal, params: { Id: id } })\r\n return data\r\n }, 500)\r\n }\r\n /**\r\n * Deletes an entity by its ID.\r\n *\r\n * @param id - The ID of the entity to delete.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the deletion response.\r\n */\r\n remove = (id: K, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.delete<T>, 'Delete', { params: { Id: id }, signal })\r\n return data\r\n }, 500)\r\n }\r\n}\r\n\r\nexport default CRUDServiceBase\r\n"],"names":["CRUDServiceBase","baseUri","_this","_classCallCheck","_callSuper","this","createHttpService","resolveBaseUrl","_defineProperty","filters","signal","options","_options$delay","fetchDelay","_asyncToGenerator","_regenerator","m","_callee","data","w","_context","n","tryPushNotify","post","headers","v","a","delay","id","_callee2","_context2","tryGet","params","Id","model","_options$delay2","_callee3","_context3","pushNotify","_callee4","_context4","put","_callee5","_context5","patch","_callee6","_context6","_inherits","ServiceBase","_createClass"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{asyncToGenerator as r,regenerator as
|
|
1
|
+
import{asyncToGenerator as r,regenerator as n,slicedToArray as e}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{authService as o,ApplicationPaths as t}from"partner-oidc-auth";var i=globalThis.ApiAlertContext;"development"===process.env.NODE_ENV&&(globalThis.authService=o);var u=function(r){return new Promise(function(n){return setTimeout(n,r)})},a=function(){var o=r(n().m(function r(o,t){var i,a,s;return n().w(function(r){for(;;)switch(r.n){case 0:return r.n=1,Promise.all([o(),u(t)]);case 1:return i=r.v,a=e(i,1),s=a[0],r.a(2,s)}},r)}));return function(r,n){return o.apply(this,arguments)}}(),s=function(r){var n=process.env.APP_API_URL||window.location.origin||"";if(!r)return n;try{return new URL(r),r}catch(e){return"".concat(n).concat(r)}},l=function(r){var n,e,o,t,u,a=Object.values(null!==(n=null!==(e=null===(o=r.response)||void 0===o||null===(o=o.data)||void 0===o?void 0:o.errors)&&void 0!==e?e:null===(t=r.response)||void 0===t?void 0:t.data)&&void 0!==n?n:{}).filter(function(r){return r.length>0}).map(function(r){return r[0]});a.length<1||null==i||null===(u=i.ApiAlert)||void 0===u||u.PushError(a.join("\n"))},c=function(){var e=r(n().m(function r(e){var u,a,s,l,c,d,v,p,f,h;return n().w(function(r){for(;;)switch(r.n){case 0:if(403!==(null===(u=e.response)||void 0===u?void 0:u.status)){r.n=7;break}d=e.response.data,h=d.Code,r.n=3===h?1:1===h?3:5;break;case 1:return r.n=2,o.signOut({returnUrl:o.getReturnUrl()});case 2:return r.a(3,6);case 3:return r.n=4,null===(v=o.userManager)||void 0===v?void 0:v.revokeTokens(["access_token"]);case 4:return window.location.replace(t.Origin("")),r.a(3,6);case 5:return window.location.replace(t.Origin(t.IdentityAccessDenied)),r.a(3,6);case 6:r.n=8;break;case 7:401===(null===(a=e.response)||void 0===a?void 0:a.status)||"ERR_CANCELED"===e.code||((null!==(s=null===(l=e.response)||void 0===l?void 0:l.status)&&void 0!==s?s:500)>=500?"ERR_CANCELED"!==e.code&&(null==i||null===(p=i.ApiAlert)||void 0===p||p.PushError("An error has occurred!")):404===(null===(c=e.response)||void 0===c?void 0:c.status)&&(null==i||null===(f=i.ApiAlert)||void 0===f||f.PushError("Resource not found!")));case 8:return r.a(2,Promise.reject(e))}},r)}));return function(r){return e.apply(this,arguments)}}();export{i as ApiAlertContext,a as fetchDelay,c as handleResponseError,l as processError,s as resolveBaseUrl,u as sleep};
|
|
2
2
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../../../../src/http-service/base/helpers.ts"],"sourcesContent":["import { AxiosError } from 'axios'\r\nimport { ApplicationPaths, authService } from 'partner-oidc-auth'\r\nimport type { IApiContext } from './type.api-alert'\r\n\r\nexport const ApiAlertContext = (globalThis as any).ApiAlertContext as IApiContext | undefined\r\n\r\nif (process.env.NODE_ENV === 'development') {\r\n ;(globalThis as any).authService = authService\r\n}\r\n\r\nexport const sleep = (sec: number) => new Promise((res) => setTimeout(res, sec))\r\n\r\nexport const fetchDelay = async function <TModel>(action: () => Promise<TModel>, sec: number) {\r\n const [res] = await Promise.all([action(), sleep(sec)])\r\n return res\r\n}\r\n\r\ninterface ErrorModel {\r\n [key: string]: string[]\r\n}\r\n\r\n/**\r\n * Processes axios errors and displays error messages to the user\r\n * @param err - The axios error containing response data\r\n */\r\nexport const processError = (err: AxiosError<ErrorModel>) => {\r\n const errorMessages = Object.values(err.response?.data?.errors ?? err.response?.data ?? {})\r\n .filter((x) => x.length > 0)\r\n .map((x) => x[0])\r\n if (errorMessages.length < 1) return\r\n ApiAlertContext?.ApiAlert?.PushError(errorMessages.join('\\n'))\r\n}\r\n\r\n/**\r\n * Checks if the current user's token is expired.\r\n * @returns {Promise<boolean>} True if token is expired or user not logged in, false otherwise.\r\n */\r\nexport const checkTokenExpiry = async () => {\r\n try {\r\n const user = await authService.getUser()\r\n if (!user) {\r\n console.log('No user is currently logged in.')\r\n return true\r\n }\r\n\r\n const now = Math.floor(Date.now() / 1000) // Current time in seconds since epoch\r\n const expiresIn = user.exp - now\r\n\r\n if (expiresIn <= 0) {\r\n console.log('The token has expired.')\r\n return true\r\n } else {\r\n console.log(`The token will expire in ${expiresIn} seconds.`)\r\n return false\r\n }\r\n } catch (error) {\r\n console.error('Error checking token expiry:', error)\r\n return true\r\n }\r\n}\r\n/**\r\n * Refreshes the token once if at least 4 seconds have passed since the last refresh.\r\n * Uses localStorage key 'ltt' to track last refresh time.\r\n */\r\nexport const refreshTokenOnce = async () => {\r\n const timeStamp = new Date().getTime() - parseInt(localStorage.getItem('ltt') ?? '0')\r\n localStorage.setItem('ltt', new Date().getTime().toString())\r\n if (timeStamp >= 4000) {\r\n try {\r\n await authService.ensureUserManagerInitialized()\r\n await authService.signIn({})\r\n } catch (e) {\r\n console.log(e)\r\n }\r\n }\r\n}\r\n/**\r\n * Handles errors from Axios HTTP responses.\r\n * Redirects or signs out user based on error code and status.\r\n * @param {AxiosError} err - The error object from Axios.\r\n * @returns {Promise<never>} Always rejects with the error.\r\n */\r\nexport const handleResponseError = async (err: AxiosError) => {\r\n if (err.response?.status === 403) {\r\n const dataError: { Code: number; Message: string } = err.response.data as any\r\n switch (dataError.Code) {\r\n case 3: {\r\n await authService.signOut({ returnUrl: authService.getReturnUrl() })\r\n break\r\n }\r\n case 1: {\r\n await authService.userManager?.revokeTokens(['access_token'])\r\n window.location.replace(ApplicationPaths.Origin(''))\r\n break\r\n }\r\n default: {\r\n window.location.replace(ApplicationPaths.Origin(ApplicationPaths.IdentityAccessDenied))\r\n break\r\n }\r\n }\r\n } else if (err.response?.status === 401) {\r\n } else if (err.code === 'ERR_CANCELED') {\r\n } else if ((err.response?.status ?? 500) >= 500) {\r\n if (err.code !== 'ERR_CANCELED') {\r\n ApiAlertContext?.ApiAlert?.PushError('An error has occurred!')\r\n }\r\n } else if (err.response?.status === 404) {\r\n ApiAlertContext?.ApiAlert?.PushError('Resource not found!')\r\n }\r\n return Promise.reject(err)\r\n}\r\n"],"names":["ApiAlertContext","globalThis","process","env","NODE_ENV","authService","sleep","sec","Promise","res","setTimeout","fetchDelay","_ref","_asyncToGenerator","_regenerator","m","_callee","action","_yield$Promise$all","_yield$Promise$all2","w","_context","n","all","v","_slicedToArray","a","_x","_x2","apply","this","arguments","processError","err","_ref2","_err$response$data$er","_err$response","_err$response2","_ApiAlertContext$ApiA","errorMessages","Object","values","response","data","errors","filter","x","length","map","ApiAlert","PushError","join","handleResponseError","_ref5","_callee4","_err$response3","_err$response4","_err$response$status","_err$response5","_err$response6","dataError","_authService$userMana","_ApiAlertContext$ApiA2","_ApiAlertContext$ApiA3","_t3","_context4","status","Code","signOut","returnUrl","getReturnUrl","userManager","revokeTokens","
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../../src/http-service/base/helpers.ts"],"sourcesContent":["import { AxiosError } from 'axios'\r\nimport { ApplicationPaths, authService } from 'partner-oidc-auth'\r\nimport type { IApiContext } from './type.api-alert'\r\n\r\nexport const ApiAlertContext = (globalThis as any).ApiAlertContext as IApiContext | undefined\r\n\r\nif (process.env.NODE_ENV === 'development') {\r\n ;(globalThis as any).authService = authService\r\n}\r\n\r\nexport const sleep = (sec: number) => new Promise((res) => setTimeout(res, sec))\r\n\r\nexport const fetchDelay = async function <TModel>(action: () => Promise<TModel>, sec: number) {\r\n const [res] = await Promise.all([action(), sleep(sec)])\r\n return res\r\n}\r\n\r\n/**\r\n * Resolves a base URL string into a full base URL.\r\n * - If `baseUri` is already a full URL, it is returned as-is.\r\n * - Otherwise it is prefixed with `REACT_APP_ADMIN_API` or `window.location.origin`.\r\n *\r\n * This lets callers pass either a full URL (e.g. `https://api.example.com/v1`) or\r\n * a path suffix (e.g. `/api/v1`) and get a proper base URL for the HTTP client.\r\n */\r\nexport const resolveBaseUrl = (baseUri: string) => {\r\n const prefix = process.env.APP_API_URL || window.location.origin || ''\r\n if (!baseUri) return prefix\r\n try {\r\n // new URL will succeed for absolute URLs like \"https://...\" or \"http://...\".\r\n // If it parses, treat it as a full URL and return as-is.\r\n new URL(baseUri)\r\n return baseUri\r\n } catch {\r\n // For relative paths, prefix with configured API base or current origin.\r\n return `${prefix}${baseUri}`\r\n }\r\n}\r\n\r\ninterface ErrorModel {\r\n [key: string]: string[]\r\n}\r\n\r\n/**\r\n * Processes axios errors and displays error messages to the user\r\n * @param err - The axios error containing response data\r\n */\r\nexport const processError = (err: AxiosError<ErrorModel>) => {\r\n const errorMessages = Object.values(err.response?.data?.errors ?? err.response?.data ?? {})\r\n .filter((x) => x.length > 0)\r\n .map((x) => x[0])\r\n if (errorMessages.length < 1) return\r\n ApiAlertContext?.ApiAlert?.PushError(errorMessages.join('\\n'))\r\n}\r\n\r\n/**\r\n * Checks if the current user's token is expired.\r\n * @returns {Promise<boolean>} True if token is expired or user not logged in, false otherwise.\r\n */\r\nexport const checkTokenExpiry = async () => {\r\n try {\r\n const user = await authService.getUser()\r\n if (!user) {\r\n console.log('No user is currently logged in.')\r\n return true\r\n }\r\n\r\n const now = Math.floor(Date.now() / 1000) // Current time in seconds since epoch\r\n const expiresIn = user.exp - now\r\n\r\n if (expiresIn <= 0) {\r\n console.log('The token has expired.')\r\n return true\r\n } else {\r\n console.log(`The token will expire in ${expiresIn} seconds.`)\r\n return false\r\n }\r\n } catch (error) {\r\n console.error('Error checking token expiry:', error)\r\n return true\r\n }\r\n}\r\n/**\r\n * Refreshes the token once if at least 4 seconds have passed since the last refresh.\r\n * Uses localStorage key 'ltt' to track last refresh time.\r\n */\r\nexport const refreshTokenOnce = async () => {\r\n const timeStamp = new Date().getTime() - parseInt(localStorage.getItem('ltt') ?? '0')\r\n localStorage.setItem('ltt', new Date().getTime().toString())\r\n if (timeStamp >= 4000) {\r\n try {\r\n await authService.ensureUserManagerInitialized()\r\n await authService.signIn({})\r\n } catch (e) {\r\n console.log(e)\r\n }\r\n }\r\n}\r\n/**\r\n * Handles errors from Axios HTTP responses.\r\n * Redirects or signs out user based on error code and status.\r\n * @param {AxiosError} err - The error object from Axios.\r\n * @returns {Promise<never>} Always rejects with the error.\r\n */\r\nexport const handleResponseError = async (err: AxiosError) => {\r\n if (err.response?.status === 403) {\r\n const dataError: { Code: number; Message: string } = err.response.data as any\r\n switch (dataError.Code) {\r\n case 3: {\r\n await authService.signOut({ returnUrl: authService.getReturnUrl() })\r\n break\r\n }\r\n case 1: {\r\n await authService.userManager?.revokeTokens(['access_token'])\r\n window.location.replace(ApplicationPaths.Origin(''))\r\n break\r\n }\r\n default: {\r\n window.location.replace(ApplicationPaths.Origin(ApplicationPaths.IdentityAccessDenied))\r\n break\r\n }\r\n }\r\n } else if (err.response?.status === 401) {\r\n } else if (err.code === 'ERR_CANCELED') {\r\n } else if ((err.response?.status ?? 500) >= 500) {\r\n if (err.code !== 'ERR_CANCELED') {\r\n ApiAlertContext?.ApiAlert?.PushError('An error has occurred!')\r\n }\r\n } else if (err.response?.status === 404) {\r\n ApiAlertContext?.ApiAlert?.PushError('Resource not found!')\r\n }\r\n return Promise.reject(err)\r\n}\r\n"],"names":["ApiAlertContext","globalThis","process","env","NODE_ENV","authService","sleep","sec","Promise","res","setTimeout","fetchDelay","_ref","_asyncToGenerator","_regenerator","m","_callee","action","_yield$Promise$all","_yield$Promise$all2","w","_context","n","all","v","_slicedToArray","a","_x","_x2","apply","this","arguments","resolveBaseUrl","baseUri","prefix","APP_API_URL","window","location","origin","URL","_unused","concat","processError","err","_ref2","_err$response$data$er","_err$response","_err$response2","_ApiAlertContext$ApiA","errorMessages","Object","values","response","data","errors","filter","x","length","map","ApiAlert","PushError","join","handleResponseError","_ref5","_callee4","_err$response3","_err$response4","_err$response$status","_err$response5","_err$response6","dataError","_authService$userMana","_ApiAlertContext$ApiA2","_ApiAlertContext$ApiA3","_t3","_context4","status","Code","signOut","returnUrl","getReturnUrl","userManager","revokeTokens","replace","ApplicationPaths","Origin","IdentityAccessDenied","code","reject","_x3"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createClass as
|
|
1
|
+
import{createClass as n,classCallCheck as e,defineProperty as r,asyncToGenerator as t,regenerator as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{authService as a}from"partner-oidc-auth";import{EAppName as s}from"./types.js";var o;!function(n){n.Admin="Admin",n.User="User",n.Manage="Manage"}(o||(o={}));var l=new(n(function n(){var l=this;e(this,n),r(this,"getAppName",function(){var n,e;return null!==(n=null===(e=l.window)||void 0===e||null===(e=e.env)||void 0===e?void 0:e.REACT_APP_NAME)&&void 0!==n?n:s.ClientApp}),r(this,"isAdmin",function(n){return(null!=n?n:[]).some(function(n){return n===o.Admin})&&l.getAppName()===s.ClientAdmin}),r(this,"getGraphqlSite",t(i().m(function n(){var e,r,t;return i().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,a.getRoles();case 1:e=n.v,r=l.getAppName(),t=r,n.n=t===s.ClientAdmin?2:(s.ClientApp,3);break;case 2:return n.a(2,l.isAdmin(e)?o.Admin:o.Manage);case 3:return n.a(2,o.User);case 4:return n.a(2)}},n)}))),this.window=global.window}));export{l as AppProfile};
|
|
2
2
|
//# sourceMappingURL=app-profile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-profile.js","sources":["../../../../src/http-service/graphql/app-profile.ts"],"sourcesContent":["import { authService } from 'partner-oidc-auth'\r\nimport { EAppName } from './types'\r\n\r\nenum RoleKeyInternalSite {\r\n Admin = 'Admin',\r\n User = 'User',\r\n Manage = 'Manage'\r\n}\r\n\r\nclass AppProfileBase {\r\n window: Window & { [key: string]: any }\r\n constructor() {\r\n this.window = global.window\r\n }\r\n\r\n getAppName = () => this.window
|
|
1
|
+
{"version":3,"file":"app-profile.js","sources":["../../../../src/http-service/graphql/app-profile.ts"],"sourcesContent":["import { authService } from 'partner-oidc-auth'\r\nimport { EAppName } from './types'\r\n\r\nenum RoleKeyInternalSite {\r\n Admin = 'Admin',\r\n User = 'User',\r\n Manage = 'Manage'\r\n}\r\n\r\nclass AppProfileBase {\r\n window: Window & { [key: string]: any }\r\n constructor() {\r\n this.window = global.window\r\n }\r\n\r\n getAppName = () => (this.window?.env?.REACT_APP_NAME as EAppName) ?? EAppName.ClientApp\r\n\r\n isAdmin = (roles?: string[]) => {\r\n return (roles ?? []).some((e) => e === RoleKeyInternalSite.Admin) && this.getAppName() === EAppName.ClientAdmin\r\n }\r\n\r\n getGraphqlSite = async () => {\r\n const roles = await authService.getRoles()\r\n const appName = this.getAppName()\r\n switch (appName) {\r\n case EAppName.ClientAdmin:\r\n return this.isAdmin(roles) ? RoleKeyInternalSite.Admin : RoleKeyInternalSite.Manage\r\n case EAppName.ClientApp:\r\n default:\r\n return RoleKeyInternalSite.User\r\n }\r\n }\r\n}\r\n\r\nexport const AppProfile = new AppProfileBase()\r\n"],"names":["RoleKeyInternalSite","AppProfile","_createClass","AppProfileBase","_this","this","_classCallCheck","_defineProperty","_this$window$env$REAC","_this$window","window","env","REACT_APP_NAME","EAppName","ClientApp","roles","some","e","Admin","getAppName","ClientAdmin","_asyncToGenerator","_regenerator","m","_callee","appName","_t","w","_context","n","authService","getRoles","v","a","isAdmin","Manage","User","global"],"mappings":"kPAGA,IAAKA,GAAL,SAAKA,GACHA,EAAA,MAAA,QACAA,EAAA,KAAA,OACAA,EAAA,OAAA,QACD,CAJD,CAAKA,IAAAA,EAIJ,CAAA,IAAA,IA2BYC,EAAa,IAzBNC,EAElB,SAAAC,IAAA,IAAAC,EAAAC,KAAAC,OAAAH,GAAAI,EAIaF,KAAA,aAAA,WAAA,IAAAG,EAAAC,EAAA,OAAoD,QAApDD,EAAkB,QAAlBC,EAAOL,EAAKM,cAAM,IAAAD,GAAK,QAALA,EAAXA,EAAaE,WAAG,IAAAF,OAAA,EAAhBA,EAAkBG,sBAA2B,IAAAJ,EAAAA,EAAIK,EAASC,SAAS,GAAAP,EAAAF,KAAA,UAE7E,SAACU,GACT,OAAQA,QAAAA,EAAS,IAAIC,KAAK,SAACC,GAAC,OAAKA,IAAMjB,EAAoBkB,KAAM,IAAId,EAAKe,eAAiBN,EAASO,cACrGb,EAAAF,KAAA,iBAAAgB,EAAAC,IAAAC,EAEgB,SAAAC,IAAA,IAAAT,EAAAU,EAAAC,EAAA,OAAAJ,IAAAK,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,OAAAD,EAAAC,EAAA,EACKC,EAAYC,WAAU,KAAA,EAApChB,EAAKa,EAAAI,EACLP,EAAUrB,EAAKe,aAAYO,EACzBD,EAAOG,EAAAC,EAAAH,IACRb,EAASO,YAAWM,GAEpBb,EAASC,UAAS,GAAA,MAAA,KAAA,EAAA,OAAAc,EAAAK,EADd7B,EAAAA,EAAK8B,QAAQnB,GAASf,EAAoBkB,MAAQlB,EAAoBmC,QAAM,KAAA,EAAA,OAAAP,EAAAK,EAG5EjC,EAAAA,EAAoBoC,MAAI,KAAA,EAAA,OAAAR,EAAAK,EAAA,GAAA,EAAAT,EAEpC,KAnBCnB,KAAKK,OAAS2B,OAAO3B,MACvB"}
|
|
@@ -3,6 +3,15 @@ import type { IApiContext } from './type.api-alert';
|
|
|
3
3
|
export declare const ApiAlertContext: IApiContext | undefined;
|
|
4
4
|
export declare const sleep: (sec: number) => Promise<unknown>;
|
|
5
5
|
export declare const fetchDelay: <TModel>(action: () => Promise<TModel>, sec: number) => Promise<TModel>;
|
|
6
|
+
/**
|
|
7
|
+
* Resolves a base URL string into a full base URL.
|
|
8
|
+
* - If `baseUri` is already a full URL, it is returned as-is.
|
|
9
|
+
* - Otherwise it is prefixed with `REACT_APP_ADMIN_API` or `window.location.origin`.
|
|
10
|
+
*
|
|
11
|
+
* This lets callers pass either a full URL (e.g. `https://api.example.com/v1`) or
|
|
12
|
+
* a path suffix (e.g. `/api/v1`) and get a proper base URL for the HTTP client.
|
|
13
|
+
*/
|
|
14
|
+
export declare const resolveBaseUrl: (baseUri: string) => string;
|
|
6
15
|
interface ErrorModel {
|
|
7
16
|
[key: string]: string[];
|
|
8
17
|
}
|