@actdim/dynstruct 1.0.2 → 1.0.5

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.
Files changed (55) hide show
  1. package/dist/appDomain/adapters.d.ts +10 -0
  2. package/dist/appDomain/adapters.d.ts.map +1 -0
  3. package/dist/appDomain/adapters.es.js +25 -0
  4. package/dist/appDomain/adapters.es.js.map +1 -0
  5. package/dist/appDomain/appContracts.d.ts +24 -9
  6. package/dist/appDomain/appContracts.d.ts.map +1 -1
  7. package/dist/appDomain/appContracts.es.js +12 -9
  8. package/dist/appDomain/appContracts.es.js.map +1 -1
  9. package/dist/appDomain/reactHooks.d.ts +6 -0
  10. package/dist/appDomain/reactHooks.d.ts.map +1 -0
  11. package/dist/appDomain/reactHooks.es.js +12 -0
  12. package/dist/appDomain/reactHooks.es.js.map +1 -0
  13. package/dist/appDomain/security/securityContracts.d.ts +3 -3
  14. package/dist/appDomain/security/securityContracts.d.ts.map +1 -1
  15. package/dist/appDomain/security/securityContracts.es.js.map +1 -1
  16. package/dist/appDomain/security/securityProvider.d.ts +2 -2
  17. package/dist/appDomain/security/securityProvider.es.js.map +1 -1
  18. package/dist/componentModel/DynamicContent.d.ts +14 -0
  19. package/dist/componentModel/DynamicContent.d.ts.map +1 -0
  20. package/dist/componentModel/DynamicContent.es.js +14 -0
  21. package/dist/componentModel/DynamicContent.es.js.map +1 -0
  22. package/dist/componentModel/componentContext.d.ts +8 -0
  23. package/dist/componentModel/componentContext.d.ts.map +1 -0
  24. package/dist/componentModel/componentContext.es.js +77 -0
  25. package/dist/componentModel/componentContext.es.js.map +1 -0
  26. package/dist/componentModel/componentModel.d.ts +58 -34
  27. package/dist/componentModel/componentModel.d.ts.map +1 -1
  28. package/dist/componentModel/componentModel.es.js +263 -134
  29. package/dist/componentModel/componentModel.es.js.map +1 -1
  30. package/dist/componentModel/contracts.d.ts +22 -0
  31. package/dist/componentModel/contracts.d.ts.map +1 -0
  32. package/dist/componentModel/contracts.es.js +2 -0
  33. package/dist/componentModel/contracts.es.js.map +1 -0
  34. package/dist/dist/componentModel/componentContext.es.es.js +15 -0
  35. package/dist/dist/componentModel/componentContext.es.es.js.map +1 -0
  36. package/dist/dist/componentModel/componentModel.es.es.js +260 -0
  37. package/dist/dist/componentModel/componentModel.es.es.js.map +1 -0
  38. package/dist/dist/globals.es.es.js +10 -0
  39. package/dist/dist/globals.es.es.js.map +1 -0
  40. package/dist/dist/reactHooks.es.es.js +9 -0
  41. package/dist/dist/reactHooks.es.es.js.map +1 -0
  42. package/dist/globals.d.ts +11 -0
  43. package/dist/globals.d.ts.map +1 -0
  44. package/dist/globals.es.js +10 -0
  45. package/dist/globals.es.js.map +1 -0
  46. package/dist/net/client.es.js.map +1 -1
  47. package/dist/services/NavService.d.ts +17 -0
  48. package/dist/services/NavService.d.ts.map +1 -0
  49. package/dist/services/NavService.es.js +65 -0
  50. package/dist/services/NavService.es.js.map +1 -0
  51. package/dist/services/StorageService.d.ts +15 -0
  52. package/dist/services/StorageService.d.ts.map +1 -0
  53. package/dist/services/StorageService.es.js +54 -0
  54. package/dist/services/StorageService.es.js.map +1 -0
  55. package/package.json +18 -12
@@ -1 +1 @@
1
- {"version":3,"file":"client.es.js","sources":["../../src/net/client.ts"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\r\nimport httpStatus from \"http-status\";\r\nimport { getResponseResult, IFetcher, IRequestCallbacks, IRequestParams, IRequestState } from \"./request\";\r\nimport { ApiError } from \"./apiError\";\r\nimport { BaseAppBusStruct, BaseAppContext } from \"@/appDomain/appContracts\";\r\nimport { MsgBus } from \"@actdim/msgmesh/msgBusCore\";\r\n\r\n// MLWEB-2172\r\n\r\n// TODO: support request cancellation\r\n// https://stackoverflow.com/questions/31061838/how-do-i-cancel-an-http-fetch-request\r\n// https://mukeshprajapati0251.medium.com/cancel-rest-api-pending-request-1af65e70366d\r\n\r\nexport function extractApiName(name: string, suffixes: string[]): string | null {\r\n if (!name) {\r\n return name;\r\n }\r\n const escaped = suffixes.map((s) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\r\n const group = escaped.join(\"|\");\r\n const pattern = new RegExp(`(_?(${group}))+?$`, \"i\");\r\n\r\n let result = name.replace(pattern, \"\");\r\n\r\n result = result.trim();\r\n return result.length > 0 ? result : name;\r\n}\r\n\r\nconst API_SUFFIXES = [\"api\", \"controller\", \"client\", \"fetcher\"];\r\n// App(Api)ClientBase\r\nexport class ClientBase {\r\n protected baseUrl: string;\r\n protected name: string;\r\n // private requestStates\r\n private requestStateMap: Map<string, IRequestState>;\r\n\r\n private fetcher: IFetcher;\r\n\r\n private msgBus: MsgBus<BaseAppBusStruct>;\r\n\r\n private accessToken: string;\r\n\r\n private init: Promise<any>;\r\n\r\n constructor(context: BaseAppContext, fetcher?: IFetcher) {\r\n this.fetcher = fetcher || window;\r\n this.requestStateMap = new Map<string, IRequestState>();\r\n this.msgBus = context.msgBus;\r\n // TODO: unsubscribe\r\n this.msgBus.on({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\",\r\n callback: (msg) => {\r\n this.accessToken = msg.payload.accessToken;\r\n }\r\n });\r\n this.init = Promise.all([this.getBaseUrlAsync(), this.updateSecurityAsync()]);\r\n }\r\n\r\n protected async getBaseUrlAsync() {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n });\r\n const config = msg.payload;\r\n const apiName = extractApiName(this.name, API_SUFFIXES);\r\n const apiEntry = Object.entries(config.apis).find((entry) => entry[0].toLowerCase() === apiName?.toLowerCase());\r\n this.baseUrl = apiEntry?.[1].url || config.baseUrl;\r\n }\r\n\r\n private async updateSecurityAsync() {\r\n if (!this.accessToken) {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-GET-CONTEXT\"\r\n });\r\n this.accessToken = msg.payload.accessToken;\r\n }\r\n return this.accessToken;\r\n }\r\n\r\n private async addAuthorizationAsync(request: IRequestParams) {\r\n const accessToken = await this.updateSecurityAsync();\r\n if (!accessToken) {\r\n throw ApiError.create({\r\n status: httpStatus.UNAUTHORIZED\r\n });\r\n }\r\n const authorizationHeader = \"Authorization\";\r\n const headers = request.headers;\r\n const headerValue = `Bearer ${accessToken}`;\r\n if (headers instanceof Headers) {\r\n // if (headers.has(authorizationHeader)) {\r\n // headers.delete(authorizationHeader)\r\n // }\r\n // headers.append(authorizationHeader, headerValue);\r\n headers.set(authorizationHeader, headerValue);\r\n } else {\r\n throw new Error(\"Unsupported headers\"); // object type\r\n }\r\n }\r\n\r\n private async executeRequestInternalAsync(request: IRequestState) {\r\n try {\r\n let proceed = true;\r\n const onBeforeSendRequest = request.callbacks && request.callbacks.onBeforeSendRequest;\r\n if (onBeforeSendRequest) {\r\n const event = {\r\n request: request,\r\n cancel: false,\r\n handled: false\r\n } as Parameters<IRequestCallbacks[\"onBeforeSendRequest\"]>[0];\r\n await onBeforeSendRequest(event);\r\n if (event.cancel) {\r\n // interrupt\r\n proceed = false;\r\n request.status = \"canceled\";\r\n if (event.handled) {\r\n request.result = event.result;\r\n } else {\r\n // ApiError?\r\n throw new Error(\"The request was aborted\"); // has been? canceled?\r\n }\r\n }\r\n }\r\n if (proceed) {\r\n request.status = \"executing\";\r\n const response = await this.fetcher.fetch(request.url, request);\r\n ApiError.assert(response, request);\r\n let onResponseRead = request.callbacks && request.callbacks.onResponseRead;\r\n if (!onResponseRead) {\r\n onResponseRead = async (event) => {\r\n const result = await getResponseResult(response, request);\r\n event.result = result;\r\n };\r\n }\r\n const event = {\r\n response: response\r\n } as Parameters<IRequestCallbacks[\"onResponseRead\"]>[0];\r\n\r\n await onResponseRead(event);\r\n request.result = event.result;\r\n request.status = \"succeeded\";\r\n }\r\n } catch (err) {\r\n request.status = \"failed\";\r\n // throw ApiError.create(undefined, request);\r\n throw err;\r\n }\r\n return request;\r\n }\r\n\r\n private async executeRequestAsync(request: IRequestState): Promise<IRequestState> {\r\n let attempt = 0;\r\n do {\r\n try {\r\n if (request.useAuth) {\r\n await this.addAuthorizationAsync(request);\r\n }\r\n return await this.executeRequestInternalAsync(request);\r\n } catch (err) {\r\n if (err instanceof ApiError) {\r\n if (attempt > 0) {\r\n throw err;\r\n }\r\n if (err.status === httpStatus.UPGRADE_REQUIRED) {\r\n // await this.context.msgBus.dispatchAsync({\r\n // channel: \"APP_RELOAD\" // APP_REQUEST_UPDGRADE\r\n // });\r\n throw err;\r\n } else if (err.status === httpStatus.UNAUTHORIZED) {\r\n if (err.response?.headers?.get(\"token-expired\")) {\r\n // token expired or invalid\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-AUTH-REFRESH\"\r\n });\r\n } else {\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-REQUEST-AUTH\"\r\n });\r\n }\r\n // codes:\r\n // TOKEN_EXPIRED\r\n // TOKEN_INVALID\r\n // TOKEN_MISSING\r\n // AUTH_REQUIRED\r\n // header: WWW-Authenticate\r\n continue;\r\n }\r\n continue;\r\n }\r\n throw err;\r\n } finally {\r\n attempt++;\r\n }\r\n } while (true);\r\n }\r\n\r\n // T extends IApiResponse\r\n public async fetchAsync<T>(requestParams: IRequestParams): Promise<T> {\r\n await this.init;\r\n\r\n const defaultParams: Partial<IRequestParams> = {\r\n contentType: \"application/json\",\r\n method: \"POST\",\r\n body: null,\r\n headers: {},\r\n cache: \"default\",\r\n credentials: \"same-origin\",\r\n mode: \"cors\"\r\n };\r\n\r\n requestParams = { ...defaultParams, ...requestParams };\r\n if (!requestParams.id) {\r\n requestParams.id = uuid();\r\n }\r\n\r\n if (!(requestParams.headers instanceof Headers)) {\r\n requestParams.headers = new Headers(requestParams.headers);\r\n }\r\n\r\n requestParams.headers.append(\"Content-Type\", requestParams.contentType);\r\n // \"api-version\"\r\n\r\n if (requestParams.method === \"POST\") {\r\n if (!requestParams.body) {\r\n requestParams.body = \"\";\r\n }\r\n }\r\n\r\n let request = {\r\n ...requestParams,\r\n status: \"queued\",\r\n response: undefined,\r\n result: undefined\r\n } as IRequestState;\r\n\r\n this.requestStateMap.set(requestParams.id, request);\r\n\r\n await this.executeRequestAsync(request);\r\n return request.result;\r\n }\r\n}\r\n/* \r\nif (status === 404) {\r\n return response.text().then((_responseText) => {\r\n let result404: any = null;\r\n result404 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as __API__ProblemDetails;\r\n return throwException(\"Not Found\", status, _responseText, _headers, result404);\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n\r\nBLOB\r\nlet reader = new FileReader();\r\n reader.onload = event => resolve((event.target as any).result);\r\n reader.readAsText(blob);\r\n*/\r\n"],"names":["extractApiName","name","suffixes","group","s","pattern","result","API_SUFFIXES","ClientBase","context","fetcher","msg","config","apiName","apiEntry","entry","request","accessToken","ApiError","httpStatus","authorizationHeader","headers","headerValue","proceed","onBeforeSendRequest","event","response","onResponseRead","getResponseResult","err","attempt","requestParams","uuid"],"mappings":";;;;AAaO,SAASA,EAAeC,GAAcC,GAAmC;AAC5E,MAAI,CAACD;AACD,WAAOA;AAGX,QAAME,IADUD,EAAS,IAAI,CAACE,MAAMA,EAAE,QAAQ,uBAAuB,MAAM,CAAC,EACtD,KAAK,GAAG,GACxBC,IAAU,IAAI,OAAO,OAAOF,CAAK,SAAS,GAAG;AAEnD,MAAIG,IAASL,EAAK,QAAQI,GAAS,EAAE;AAErC,SAAAC,IAASA,EAAO,KAAA,GACTA,EAAO,SAAS,IAAIA,IAASL;AACxC;AAEA,MAAMM,IAAe,CAAC,OAAO,cAAc,UAAU,SAAS;AAEvD,MAAMC,EAAW;AAAA,EACV;AAAA,EACA;AAAA;AAAA,EAEF;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAER,YAAYC,GAAyBC,GAAoB;AACrD,SAAK,UAAUA,KAAW,QAC1B,KAAK,sCAAsB,IAAA,GAC3B,KAAK,SAASD,EAAQ,QAEtB,KAAK,OAAO,GAAG;AAAA,MACX,SAAS;AAAA,MACT,OAAO;AAAA,MACP,UAAU,CAACE,MAAQ;AACf,aAAK,cAAcA,EAAI,QAAQ;AAAA,MACnC;AAAA,IAAA,CACH,GACD,KAAK,OAAO,QAAQ,IAAI,CAAC,KAAK,mBAAmB,KAAK,oBAAA,CAAqB,CAAC;AAAA,EAChF;AAAA,EAEA,MAAgB,kBAAkB;AAI9B,UAAMC,KAHM,MAAM,KAAK,OAAO,cAAc;AAAA,MACxC,SAAS;AAAA,IAAA,CACZ,GACkB,SACbC,IAAUb,EAAe,KAAK,MAAMO,CAAY,GAChDO,IAAW,OAAO,QAAQF,EAAO,IAAI,EAAE,KAAK,CAACG,MAAUA,EAAM,CAAC,EAAE,YAAA,MAAkBF,GAAS,aAAa;AAC9G,SAAK,UAAUC,IAAW,CAAC,EAAE,OAAOF,EAAO;AAAA,EAC/C;AAAA,EAEA,MAAc,sBAAsB;AAChC,QAAI,CAAC,KAAK,aAAa;AACnB,YAAMD,IAAM,MAAM,KAAK,OAAO,cAAc;AAAA,QACxC,SAAS;AAAA,MAAA,CACZ;AACD,WAAK,cAAcA,EAAI,QAAQ;AAAA,IACnC;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAc,sBAAsBK,GAAyB;AACzD,UAAMC,IAAc,MAAM,KAAK,oBAAA;AAC/B,QAAI,CAACA;AACD,YAAMC,EAAS,OAAO;AAAA,QAClB,QAAQC,EAAW;AAAA,MAAA,CACtB;AAEL,UAAMC,IAAsB,iBACtBC,IAAUL,EAAQ,SAClBM,IAAc,UAAUL,CAAW;AACzC,QAAII,aAAmB;AAKnB,MAAAA,EAAQ,IAAID,GAAqBE,CAAW;AAAA;AAE5C,YAAM,IAAI,MAAM,qBAAqB;AAAA,EAE7C;AAAA,EAEA,MAAc,4BAA4BN,GAAwB;AAC9D,QAAI;AACA,UAAIO,IAAU;AACd,YAAMC,IAAsBR,EAAQ,aAAaA,EAAQ,UAAU;AACnE,UAAIQ,GAAqB;AACrB,cAAMC,IAAQ;AAAA,UACV,SAAAT;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,QAAA;AAGb,YADA,MAAMQ,EAAoBC,CAAK,GAC3BA,EAAM;AAIN,cAFAF,IAAU,IACVP,EAAQ,SAAS,YACbS,EAAM;AACN,YAAAT,EAAQ,SAASS,EAAM;AAAA;AAGvB,kBAAM,IAAI,MAAM,yBAAyB;AAAA,MAGrD;AACA,UAAIF,GAAS;AACT,QAAAP,EAAQ,SAAS;AACjB,cAAMU,IAAW,MAAM,KAAK,QAAQ,MAAMV,EAAQ,KAAKA,CAAO;AAC9D,QAAAE,EAAS,OAAOQ,GAAUV,CAAO;AACjC,YAAIW,IAAiBX,EAAQ,aAAaA,EAAQ,UAAU;AAC5D,QAAKW,MACDA,IAAiB,OAAOF,MAAU;AAC9B,gBAAMnB,IAAS,MAAMsB,EAAkBF,GAAUV,CAAO;AACxDS,UAAAA,EAAM,SAASnB;AAAA,QACnB;AAEJ,cAAMmB,IAAQ;AAAA,UACV,UAAAC;AAAA,QAAA;AAGJ,cAAMC,EAAeF,CAAK,GAC1BT,EAAQ,SAASS,EAAM,QACvBT,EAAQ,SAAS;AAAA,MACrB;AAAA,IACJ,SAASa,GAAK;AACV,YAAAb,EAAQ,SAAS,UAEXa;AAAA,IACV;AACA,WAAOb;AAAA,EACX;AAAA,EAEA,MAAc,oBAAoBA,GAAgD;AAC9E,QAAIc,IAAU;AACd;AACI,UAAI;AACA,eAAId,EAAQ,WACR,MAAM,KAAK,sBAAsBA,CAAO,GAErC,MAAM,KAAK,4BAA4BA,CAAO;AAAA,MACzD,SAASa,GAAK;AACV,YAAIA,aAAeX,GAAU;AAIzB,cAHIY,IAAU,KAGVD,EAAI,WAAWV,EAAW;AAI1B,kBAAMU;AACV,cAAWA,EAAI,WAAWV,EAAW,cAAc;AAC/C,YAAIU,EAAI,UAAU,SAAS,IAAI,eAAe,IAE1C,MAAM,KAAK,OAAO,cAAc;AAAA,cAC5B,SAAS;AAAA,YAAA,CACZ,IAED,MAAM,KAAK,OAAO,cAAc;AAAA,cAC5B,SAAS;AAAA,YAAA,CACZ;AAQL;AAAA,UACJ;AACA;AAAA,QACJ;AACA,cAAMA;AAAA,MACV,UAAA;AACI,QAAAC;AAAA,MACJ;AAAA,WACK;AAAA,EACb;AAAA;AAAA,EAGA,MAAa,WAAcC,GAA2C;AAClE,UAAM,KAAK,MAYXA,IAAgB,EAAE,GAV6B;AAAA,MAC3C,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS,CAAA;AAAA,MACT,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM;AAAA,IAAA,GAG0B,GAAGA,EAAA,GAClCA,EAAc,OACfA,EAAc,KAAKC,EAAA,IAGjBD,EAAc,mBAAmB,YACnCA,EAAc,UAAU,IAAI,QAAQA,EAAc,OAAO,IAG7DA,EAAc,QAAQ,OAAO,gBAAgBA,EAAc,WAAW,GAGlEA,EAAc,WAAW,WACpBA,EAAc,SACfA,EAAc,OAAO;AAI7B,QAAIf,IAAU;AAAA,MACV,GAAGe;AAAA,MACH,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,IAAA;AAGZ,gBAAK,gBAAgB,IAAIA,EAAc,IAAIf,CAAO,GAElD,MAAM,KAAK,oBAAoBA,CAAO,GAC/BA,EAAQ;AAAA,EACnB;AACJ;"}
1
+ {"version":3,"file":"client.es.js","sources":["../../src/net/client.ts"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\r\nimport httpStatus from \"http-status\";\r\nimport { getResponseResult, IFetcher, IRequestCallbacks, IRequestParams, IRequestState } from \"./request\";\r\nimport { ApiError } from \"./apiError\";\r\nimport { BaseAppMsgStruct, BaseAppContext } from \"@/appDomain/appContracts\";\r\nimport { MsgBus } from \"@actdim/msgmesh/msgBusCore\";\r\n\r\n// MLWEB-2172\r\n\r\n// TODO: support request cancellation\r\n// https://stackoverflow.com/questions/31061838/how-do-i-cancel-an-http-fetch-request\r\n// https://mukeshprajapati0251.medium.com/cancel-rest-api-pending-request-1af65e70366d\r\n\r\nexport function extractApiName(name: string, suffixes: string[]): string | null {\r\n if (!name) {\r\n return name;\r\n }\r\n const escaped = suffixes.map((s) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\r\n const group = escaped.join(\"|\");\r\n const pattern = new RegExp(`(_?(${group}))+?$`, \"i\");\r\n\r\n let result = name.replace(pattern, \"\");\r\n\r\n result = result.trim();\r\n return result.length > 0 ? result : name;\r\n}\r\n\r\nconst API_SUFFIXES = [\"api\", \"controller\", \"client\", \"fetcher\"];\r\n// App(Api)ClientBase\r\nexport class ClientBase {\r\n protected baseUrl: string;\r\n protected name: string;\r\n // private requestStates\r\n private requestStateMap: Map<string, IRequestState>;\r\n\r\n private fetcher: IFetcher;\r\n\r\n private msgBus: MsgBus<BaseAppMsgStruct>;\r\n\r\n private accessToken: string;\r\n\r\n private init: Promise<any>;\r\n\r\n constructor(context: BaseAppContext, fetcher?: IFetcher) {\r\n this.fetcher = fetcher || window;\r\n this.requestStateMap = new Map<string, IRequestState>();\r\n this.msgBus = context.msgBus;\r\n // TODO: unsubscribe\r\n this.msgBus.on({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\",\r\n callback: (msg) => {\r\n this.accessToken = msg.payload.accessToken;\r\n }\r\n });\r\n this.init = Promise.all([this.getBaseUrlAsync(), this.updateSecurityAsync()]);\r\n }\r\n\r\n protected async getBaseUrlAsync() {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n });\r\n const config = msg.payload;\r\n const apiName = extractApiName(this.name, API_SUFFIXES);\r\n const apiEntry = Object.entries(config.apis).find((entry) => entry[0].toLowerCase() === apiName?.toLowerCase());\r\n this.baseUrl = apiEntry?.[1].url || config.baseUrl;\r\n }\r\n\r\n private async updateSecurityAsync() {\r\n if (!this.accessToken) {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-GET-CONTEXT\"\r\n });\r\n this.accessToken = msg.payload.accessToken;\r\n }\r\n return this.accessToken;\r\n }\r\n\r\n private async addAuthorizationAsync(request: IRequestParams) {\r\n const accessToken = await this.updateSecurityAsync();\r\n if (!accessToken) {\r\n throw ApiError.create({\r\n status: httpStatus.UNAUTHORIZED\r\n });\r\n }\r\n const authorizationHeader = \"Authorization\";\r\n const headers = request.headers;\r\n const headerValue = `Bearer ${accessToken}`;\r\n if (headers instanceof Headers) {\r\n // if (headers.has(authorizationHeader)) {\r\n // headers.delete(authorizationHeader)\r\n // }\r\n // headers.append(authorizationHeader, headerValue);\r\n headers.set(authorizationHeader, headerValue);\r\n } else {\r\n throw new Error(\"Unsupported headers\"); // object type\r\n }\r\n }\r\n\r\n private async executeRequestInternalAsync(request: IRequestState) {\r\n try {\r\n let proceed = true;\r\n const onBeforeSendRequest = request.callbacks && request.callbacks.onBeforeSendRequest;\r\n if (onBeforeSendRequest) {\r\n const event = {\r\n request: request,\r\n cancel: false,\r\n handled: false\r\n } as Parameters<IRequestCallbacks[\"onBeforeSendRequest\"]>[0];\r\n await onBeforeSendRequest(event);\r\n if (event.cancel) {\r\n // interrupt\r\n proceed = false;\r\n request.status = \"canceled\";\r\n if (event.handled) {\r\n request.result = event.result;\r\n } else {\r\n // ApiError?\r\n throw new Error(\"The request was aborted\"); // has been? canceled?\r\n }\r\n }\r\n }\r\n if (proceed) {\r\n request.status = \"executing\";\r\n const response = await this.fetcher.fetch(request.url, request);\r\n ApiError.assert(response, request);\r\n let onResponseRead = request.callbacks && request.callbacks.onResponseRead;\r\n if (!onResponseRead) {\r\n onResponseRead = async (event) => {\r\n const result = await getResponseResult(response, request);\r\n event.result = result;\r\n };\r\n }\r\n const event = {\r\n response: response\r\n } as Parameters<IRequestCallbacks[\"onResponseRead\"]>[0];\r\n\r\n await onResponseRead(event);\r\n request.result = event.result;\r\n request.status = \"succeeded\";\r\n }\r\n } catch (err) {\r\n request.status = \"failed\";\r\n // throw ApiError.create(undefined, request);\r\n throw err;\r\n }\r\n return request;\r\n }\r\n\r\n private async executeRequestAsync(request: IRequestState): Promise<IRequestState> {\r\n let attempt = 0;\r\n do {\r\n try {\r\n if (request.useAuth) {\r\n await this.addAuthorizationAsync(request);\r\n }\r\n return await this.executeRequestInternalAsync(request);\r\n } catch (err) {\r\n if (err instanceof ApiError) {\r\n if (attempt > 0) {\r\n throw err;\r\n }\r\n if (err.status === httpStatus.UPGRADE_REQUIRED) {\r\n // await this.context.msgBus.dispatchAsync({\r\n // channel: \"APP_RELOAD\" // APP_REQUEST_UPDGRADE\r\n // });\r\n throw err;\r\n } else if (err.status === httpStatus.UNAUTHORIZED) {\r\n if (err.response?.headers?.get(\"token-expired\")) {\r\n // token expired or invalid\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-AUTH-REFRESH\"\r\n });\r\n } else {\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-REQUEST-AUTH\"\r\n });\r\n }\r\n // codes:\r\n // TOKEN_EXPIRED\r\n // TOKEN_INVALID\r\n // TOKEN_MISSING\r\n // AUTH_REQUIRED\r\n // header: WWW-Authenticate\r\n continue;\r\n }\r\n continue;\r\n }\r\n throw err;\r\n } finally {\r\n attempt++;\r\n }\r\n } while (true);\r\n }\r\n\r\n // T extends IApiResponse\r\n public async fetchAsync<T>(requestParams: IRequestParams): Promise<T> {\r\n await this.init;\r\n\r\n const defaultParams: Partial<IRequestParams> = {\r\n contentType: \"application/json\",\r\n method: \"POST\",\r\n body: null,\r\n headers: {},\r\n cache: \"default\",\r\n credentials: \"same-origin\",\r\n mode: \"cors\"\r\n };\r\n\r\n requestParams = { ...defaultParams, ...requestParams };\r\n if (!requestParams.id) {\r\n requestParams.id = uuid();\r\n }\r\n\r\n if (!(requestParams.headers instanceof Headers)) {\r\n requestParams.headers = new Headers(requestParams.headers);\r\n }\r\n\r\n requestParams.headers.append(\"Content-Type\", requestParams.contentType);\r\n // \"api-version\"\r\n\r\n if (requestParams.method === \"POST\") {\r\n if (!requestParams.body) {\r\n requestParams.body = \"\";\r\n }\r\n }\r\n\r\n let request = {\r\n ...requestParams,\r\n status: \"queued\",\r\n response: undefined,\r\n result: undefined\r\n } as IRequestState;\r\n\r\n this.requestStateMap.set(requestParams.id, request);\r\n\r\n await this.executeRequestAsync(request);\r\n return request.result;\r\n }\r\n}\r\n/* \r\nif (status === 404) {\r\n return response.text().then((_responseText) => {\r\n let result404: any = null;\r\n result404 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as __API__ProblemDetails;\r\n return throwException(\"Not Found\", status, _responseText, _headers, result404);\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n\r\nBLOB\r\nlet reader = new FileReader();\r\n reader.onload = event => resolve((event.target as any).result);\r\n reader.readAsText(blob);\r\n*/\r\n"],"names":["extractApiName","name","suffixes","group","s","pattern","result","API_SUFFIXES","ClientBase","context","fetcher","msg","config","apiName","apiEntry","entry","request","accessToken","ApiError","httpStatus","authorizationHeader","headers","headerValue","proceed","onBeforeSendRequest","event","response","onResponseRead","getResponseResult","err","attempt","requestParams","uuid"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ComponentParams, ComponentStruct } from '@actdim/dynstruct/componentModel/componentModel';
2
+ import { NavContext } from '@actdim/dynstruct/appDomain/appContracts';
3
+ import { BaseAppBusChannels, BaseAppMsgStruct, NavRoutes } from '../appDomain/appContracts';
4
+ type Struct = ComponentStruct<BaseAppMsgStruct, {
5
+ props: {
6
+ history: NavContext[];
7
+ routes: NavRoutes;
8
+ };
9
+ msgScope: {
10
+ provide: BaseAppBusChannels<'APP-NAV-GOTO' | 'APP-NAV-GET-CONTEXT' | 'APP-NAV-READ-HISTORY' | 'APP-NAV-CONTEXT-CHANGED'>;
11
+ };
12
+ }>;
13
+ export declare const useNavService: (params: ComponentParams<Struct>) => any;
14
+ export type NavServiceStruct = Struct;
15
+ export declare const NavServiceFC: FC<ComponentParams<TStruct>>;
16
+ export {};
17
+ //# sourceMappingURL=NavService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavService.d.ts","sourceRoot":"","sources":["../../src/services/NavService.tsx"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,EACf,eAAe,EAIlB,MAAM,iDAAiD,CAAC;AASzD,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAEtE,OAAO,EACH,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACZ,MAAM,0BAA0B,CAAC;AAElC,KAAK,MAAM,GAAG,eAAe,CACzB,gBAAgB,EAChB;IACI,KAAK,EAAE;QACH,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,MAAM,EAAE,SAAS,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE;QACN,OAAO,EAAE,kBAAkB,CACrB,cAAc,GACd,qBAAqB,GACrB,sBAAsB,GACtB,yBAAyB,CAC9B,CAAC;KACL,CAAC;CACL,CACJ,CAAC;AAIF,eAAO,MAAM,aAAa,GAAI,QAAQ,eAAe,CAAC,MAAM,CAAC,QA6E5D,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC;AACtC,eAAO,MAAM,YAAY,8BAAuB,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { getFC as u, useComponent as l } from "../dist/componentModel/componentModel.es.es.js";
2
+ import { useNavigate as m, useLocation as y, useNavigationType as h, useParams as P, useSearchParams as N } from "react-router-dom";
3
+ import { PersistentStore as v } from "@actdim/utico/store/persistentStore";
4
+ new v("history");
5
+ const A = (r) => {
6
+ const s = m(), n = y(), c = h(), i = P(), [p] = N(), t = l({
7
+ props: {
8
+ history: [],
9
+ routes: void 0
10
+ },
11
+ msgBroker: {
12
+ provide: {
13
+ "APP-NAV-GOTO": {
14
+ in: {
15
+ callback: async (o) => {
16
+ s(o.payload);
17
+ }
18
+ },
19
+ ex: {
20
+ callback: async (o) => {
21
+ const a = o.payload.route;
22
+ s(t.routes[a].path(o.payload.params));
23
+ }
24
+ }
25
+ },
26
+ "APP-NAV-GET-CONTEXT": {
27
+ in: {
28
+ callback: (o) => t.history[t.history.length - 1]
29
+ }
30
+ },
31
+ "APP-NAV-READ-HISTORY": {
32
+ in: {
33
+ callback: (o) => t.history[t.history.length - 1]
34
+ }
35
+ },
36
+ "APP-NAV-CONTEXT-CHANGED": {}
37
+ }
38
+ },
39
+ events: {
40
+ onLayout: (o) => {
41
+ const a = o.history;
42
+ if (a) {
43
+ const e = {
44
+ location: n,
45
+ searchParams: p,
46
+ params: i,
47
+ navType: c
48
+ };
49
+ a.push(e), o.msgBus.dispatch({
50
+ channel: "APP-NAV-CONTEXT-CHANGED",
51
+ group: "in",
52
+ payload: e
53
+ });
54
+ }
55
+ }
56
+ },
57
+ view: () => null
58
+ }, r);
59
+ return t;
60
+ }, E = u(A);
61
+ export {
62
+ E as NavServiceFC,
63
+ A as useNavService
64
+ };
65
+ //# sourceMappingURL=NavService.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavService.es.js","sources":["../../src/services/NavService.tsx"],"sourcesContent":["import {\r\n ComponentParams,\r\n ComponentStruct,\r\n getFC,\r\n useComponent,\r\n Component,\r\n} from '@actdim/dynstruct/componentModel/componentModel';\r\nimport {\r\n To,\r\n useLocation,\r\n useNavigate,\r\n useNavigationType,\r\n useParams,\r\n useSearchParams,\r\n} from 'react-router-dom';\r\nimport { NavContext } from '@actdim/dynstruct/appDomain/appContracts';\r\nimport { PersistentStore } from '@actdim/utico/store/persistentStore';\r\nimport {\r\n BaseAppBusChannels,\r\n BaseAppMsgStruct,\r\n NavRoutes, \r\n} from '@/appDomain/appContracts';\r\n\r\ntype Struct = ComponentStruct<\r\n BaseAppMsgStruct,\r\n {\r\n props: {\r\n history: NavContext[];\r\n routes: NavRoutes;\r\n };\r\n msgScope: {\r\n provide: BaseAppBusChannels<\r\n | 'APP-NAV-GOTO'\r\n | 'APP-NAV-GET-CONTEXT'\r\n | 'APP-NAV-READ-HISTORY'\r\n | 'APP-NAV-CONTEXT-CHANGED'\r\n >;\r\n };\r\n }\r\n>;\r\n\r\nconst store = new PersistentStore('history');\r\n\r\nexport const useNavService = (params: ComponentParams<Struct>) => {\r\n const navigate = useNavigate();\r\n\r\n const location = useLocation();\r\n const navType = useNavigationType();\r\n const nvaParams = useParams();\r\n const [searchParams] = useSearchParams();\r\n\r\n const component: Component<Struct> = {\r\n props: {\r\n history: [],\r\n routes: undefined,\r\n },\r\n msgBroker: {\r\n provide: {\r\n 'APP-NAV-GOTO': {\r\n in: {\r\n callback: async (msg) => {\r\n navigate(msg.payload as To);\r\n },\r\n },\r\n ex: {\r\n callback: async (msg) => {\r\n const route = msg.payload.route;\r\n navigate(model.routes[route].path(msg.payload.params));\r\n },\r\n },\r\n },\r\n 'APP-NAV-GET-CONTEXT': {\r\n in: {\r\n callback: (msg) => {\r\n return model.history[model.history.length - 1];\r\n },\r\n },\r\n },\r\n 'APP-NAV-READ-HISTORY': {\r\n in: {\r\n callback: (msg) => {\r\n return model.history[model.history.length - 1];\r\n },\r\n },\r\n },\r\n 'APP-NAV-CONTEXT-CHANGED': {\r\n \r\n }\r\n },\r\n },\r\n events: {\r\n onLayout: (model) => {\r\n const history = model.history;\r\n if (history) {\r\n const ctx = {\r\n location: location,\r\n searchParams: searchParams,\r\n params: nvaParams,\r\n navType: navType,\r\n };\r\n history.push(ctx);\r\n model.msgBus.dispatch({\r\n channel: 'APP-NAV-CONTEXT-CHANGED',\r\n group: 'in',\r\n payload: ctx,\r\n });\r\n }\r\n },\r\n },\r\n view: () => {\r\n return null;\r\n },\r\n };\r\n\r\n const model = useComponent(component, params);\r\n\r\n // deps\r\n // location, navType, params, searchParams\r\n\r\n return model;\r\n};\r\n\r\nexport type NavServiceStruct = Struct;\r\nexport const NavServiceFC = getFC(useNavService);\r\n"],"names":["PersistentStore","useNavService","params","navigate","useNavigate","location","useLocation","navType","useNavigationType","nvaParams","useParams","searchParams","useSearchParams","model","useComponent","msg","route","history","ctx","NavServiceFC","getFC"],"mappings":";;;AAyCc,IAAIA,EAAgB,SAAS;AAEpC,MAAMC,IAAgB,CAACC,MAAoC;AAC9D,QAAMC,IAAWC,EAAA,GAEXC,IAAWC,EAAA,GACXC,IAAUC,EAAA,GACVC,IAAYC,EAAA,GACZ,CAACC,CAAY,IAAIC,EAAA,GAiEjBC,IAAQC,EA/DuB;AAAA,IACjC,OAAO;AAAA,MACH,SAAS,CAAA;AAAA,MACT,QAAQ;AAAA,IAAA;AAAA,IAEZ,WAAW;AAAA,MACP,SAAS;AAAA,QACL,gBAAgB;AAAA,UACZ,IAAI;AAAA,YACA,UAAU,OAAOC,MAAQ;AACrB,cAAAZ,EAASY,EAAI,OAAa;AAAA,YAC9B;AAAA,UAAA;AAAA,UAEJ,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMC,IAAQD,EAAI,QAAQ;AAC1B,cAAAZ,EAASU,EAAM,OAAOG,CAAK,EAAE,KAAKD,EAAI,QAAQ,MAAM,CAAC;AAAA,YACzD;AAAA,UAAA;AAAA,QACJ;AAAA,QAEJ,uBAAuB;AAAA,UACnB,IAAI;AAAA,YACA,UAAU,CAACA,MACAF,EAAM,QAAQA,EAAM,QAAQ,SAAS,CAAC;AAAA,UACjD;AAAA,QACJ;AAAA,QAEJ,wBAAwB;AAAA,UACpB,IAAI;AAAA,YACA,UAAU,CAACE,MACAF,EAAM,QAAQA,EAAM,QAAQ,SAAS,CAAC;AAAA,UACjD;AAAA,QACJ;AAAA,QAEJ,2BAA2B,CAAA;AAAA,MAE3B;AAAA,IACJ;AAAA,IAEJ,QAAQ;AAAA,MACJ,UAAU,CAACA,MAAU;AACjB,cAAMI,IAAUJ,EAAM;AACtB,YAAII,GAAS;AACT,gBAAMC,IAAM;AAAA,YACR,UAAAb;AAAA,YACA,cAAAM;AAAA,YACA,QAAQF;AAAA,YACR,SAAAF;AAAA,UAAA;AAEJ,UAAAU,EAAQ,KAAKC,CAAG,GAChBL,EAAM,OAAO,SAAS;AAAA,YAClB,SAAS;AAAA,YACT,OAAO;AAAA,YACP,SAASK;AAAA,UAAA,CACZ;AAAA,QACL;AAAA,MACJ;AAAA,IAAA;AAAA,IAEJ,MAAM,MACK;AAAA,EACX,GAGkChB,CAAM;AAK5C,SAAOW;AACX,GAGaM,IAAeC,EAAMnB,CAAa;"}
@@ -0,0 +1,15 @@
1
+ import { ComponentParams, ComponentStruct, ComponentModel } from '@actdim/dynstruct/componentModel/componentModel';
2
+ import { BaseAppBusChannels, BaseAppMsgStruct } from '../appDomain/appContracts';
3
+ type Struct = ComponentStruct<BaseAppMsgStruct, {
4
+ props: {
5
+ name?: string;
6
+ };
7
+ msgScope: {
8
+ provide: BaseAppBusChannels<'APP-KV-STORE-GET' | 'APP-KV-STORE-SET' | 'APP-KV-STORE-REMOVE'>;
9
+ };
10
+ }>;
11
+ export declare const useStorageService: (params: ComponentParams<Struct>) => ComponentModel<Struct>;
12
+ export type StorageServiceStruct = Struct;
13
+ export declare const StorageServiceFC: FC<ComponentParams<TStruct>>;
14
+ export {};
15
+ //# sourceMappingURL=StorageService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageService.d.ts","sourceRoot":"","sources":["../../src/services/StorageService.tsx"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,EACf,eAAe,EAIf,cAAc,EACjB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAqB,MAAM,0BAA0B,CAAC;AAEnG,KAAK,MAAM,GAAG,eAAe,CACzB,gBAAgB,EAChB;IACI,KAAK,EAAE;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE;QACN,OAAO,EAAE,kBAAkB,CACvB,kBAAkB,GAAG,kBAAkB,GAAG,qBAAqB,CAClE,CAAC;KACL,CAAC;CACL,CACJ,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,eAAe,CAAC,MAAM,CAAC,2BA8DhE,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAC1C,eAAO,MAAM,gBAAgB,8BAA2B,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { getFC as i, useComponent as r } from "../dist/componentModel/componentModel.es.es.js";
2
+ import { PersistentStore as y } from "@actdim/utico/store/persistentStore";
3
+ const l = (s) => {
4
+ let t, a, o;
5
+ const n = new Promise((e) => {
6
+ o = e;
7
+ });
8
+ return t = r({
9
+ props: {
10
+ name: ""
11
+ },
12
+ msgBroker: {
13
+ provide: {
14
+ "APP-KV-STORE-GET": {
15
+ in: {
16
+ callback: async (e) => (await n, (await a.getAsync(e.payload.key))?.data.value)
17
+ }
18
+ },
19
+ "APP-KV-STORE-SET": {
20
+ in: {
21
+ callback: async (e) => {
22
+ await n, await a.setAsync(
23
+ {
24
+ key: e.payload.key
25
+ },
26
+ e.payload.value
27
+ );
28
+ }
29
+ }
30
+ },
31
+ "APP-KV-STORE-REMOVE": {
32
+ in: {
33
+ callback: async (e) => {
34
+ await n, await a.deleteAsync(e.payload.key);
35
+ }
36
+ }
37
+ }
38
+ }
39
+ },
40
+ events: {
41
+ onChangeName: () => {
42
+ c();
43
+ }
44
+ }
45
+ }, s), c().then(() => o()), t;
46
+ async function c() {
47
+ a = await y.openAsync(t.name);
48
+ }
49
+ }, k = i(l);
50
+ export {
51
+ k as StorageServiceFC,
52
+ l as useStorageService
53
+ };
54
+ //# sourceMappingURL=StorageService.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageService.es.js","sources":["../../src/services/StorageService.tsx"],"sourcesContent":["import {\r\n ComponentParams,\r\n ComponentStruct,\r\n getFC,\r\n useComponent,\r\n Component,\r\n ComponentModel,\r\n} from '@actdim/dynstruct/componentModel/componentModel';\r\nimport { PersistentStore } from '@actdim/utico/store/persistentStore';\r\nimport { BaseAppBusChannels, BaseAppMsgStruct, useBaseAppContext } from '@/appDomain/appContracts';\r\n\r\ntype Struct = ComponentStruct<\r\n BaseAppMsgStruct,\r\n {\r\n props: {\r\n name?: string;\r\n };\r\n msgScope: {\r\n provide: BaseAppBusChannels<\r\n 'APP-KV-STORE-GET' | 'APP-KV-STORE-SET' | 'APP-KV-STORE-REMOVE'\r\n >;\r\n };\r\n }\r\n>;\r\n\r\nexport const useStorageService = (params: ComponentParams<Struct>) => {\r\n\r\n let model: ComponentModel<Struct>;\r\n\r\n let store: PersistentStore;\r\n let ready: () => void;\r\n const init = new Promise<void>((res) => {\r\n ready = res;\r\n });\r\n\r\n const component: Component<Struct> = {\r\n props: {\r\n name: '',\r\n },\r\n msgBroker: {\r\n provide: {\r\n 'APP-KV-STORE-GET': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n const item = await store.getAsync(msg.payload.key);\r\n return item?.data.value;\r\n },\r\n },\r\n },\r\n 'APP-KV-STORE-SET': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n await store.setAsync(\r\n {\r\n key: msg.payload.key,\r\n },\r\n msg.payload.value,\r\n );\r\n },\r\n },\r\n },\r\n 'APP-KV-STORE-REMOVE': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n await store.deleteAsync(msg.payload.key);\r\n },\r\n },\r\n },\r\n },\r\n },\r\n events: {\r\n onChangeName: () => {\r\n _updateStoreAsync();\r\n },\r\n }, \r\n };\r\n\r\n model = useComponent(component, params);\r\n _updateStoreAsync().then(() => ready());\r\n return model;\r\n\r\n async function _updateStoreAsync() {\r\n store = await PersistentStore.openAsync(model.name);\r\n }\r\n};\r\n\r\nexport type StorageServiceStruct = Struct;\r\nexport const StorageServiceFC = getFC(useStorageService);\r\n"],"names":["useStorageService","params","model","store","ready","init","res","useComponent","msg","_updateStoreAsync","PersistentStore","StorageServiceFC","getFC"],"mappings":";;AAyBO,MAAMA,IAAoB,CAACC,MAAoC;AAElE,MAAIC,GAEAC,GACAC;AACJ,QAAMC,IAAO,IAAI,QAAc,CAACC,MAAQ;AACpC,IAAAF,IAAQE;AAAA,EACZ,CAAC;AA+CD,SAAAJ,IAAQK,EA7C6B;AAAA,IACjC,OAAO;AAAA,MACH,MAAM;AAAA,IAAA;AAAA,IAEV,WAAW;AAAA,MACP,SAAS;AAAA,QACL,oBAAoB;AAAA,UAChB,IAAI;AAAA,YACA,UAAU,OAAOC,OACb,MAAMH,IACO,MAAMF,EAAM,SAASK,EAAI,QAAQ,GAAG,IACpC,KAAK;AAAA,UACtB;AAAA,QACJ;AAAA,QAEJ,oBAAoB;AAAA,UAChB,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMH,GACN,MAAMF,EAAM;AAAA,gBACR;AAAA,kBACI,KAAKK,EAAI,QAAQ;AAAA,gBAAA;AAAA,gBAErBA,EAAI,QAAQ;AAAA,cAAA;AAAA,YAEpB;AAAA,UAAA;AAAA,QACJ;AAAA,QAEJ,uBAAuB;AAAA,UACnB,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMH,GACN,MAAMF,EAAM,YAAYK,EAAI,QAAQ,GAAG;AAAA,YAC3C;AAAA,UAAA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,IAEJ,QAAQ;AAAA,MACJ,cAAc,MAAM;AAChB,QAAAC,EAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EACJ,GAG4BR,CAAM,GACtCQ,IAAoB,KAAK,MAAML,GAAO,GAC/BF;AAEP,iBAAeO,IAAoB;AAC/B,IAAAN,IAAQ,MAAMO,EAAgB,UAAUR,EAAM,IAAI;AAAA,EACtD;AACJ,GAGaS,IAAmBC,EAAMZ,CAAiB;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actdim/dynstruct",
3
- "version": "1.0.2",
3
+ "version": "1.0.5",
4
4
  "description": "A type-safe component system for large-scale apps: explicit dependencies, message bus communication, and structure-first, declarative design",
5
5
  "author": "Pavel Borodaev",
6
6
  "license": "Proprietary",
@@ -50,7 +50,8 @@
50
50
  },
51
51
  "sideEffects": false,
52
52
  "sideEffects?": [],
53
- "scripts": {
53
+ "packageManager": "pnpm@10.21.0",
54
+ "scripts": {
54
55
  "test": "npx vitest --config=vitest.node.config.ts --no-cache",
55
56
  "test:w": "npx vitest --config=vitest.node.config.ts --watch",
56
57
  "test:v8": "npx vite",
@@ -64,9 +65,13 @@
64
65
  "nvm:la": "nvm list available",
65
66
  "nvm:il": "nvm install lts",
66
67
  "format": "prettier --write .",
67
- "format:check": "prettier --check ."
68
+ "format:check": "prettier --check .",
69
+ "storybook": "storybook dev -p 6006",
70
+ "build-storybook": "storybook build"
68
71
  },
69
72
  "peerDependencies": {
73
+ "@actdim/msgmesh": "^1.1.6",
74
+ "@actdim/utico": "^1.0.5",
70
75
  "http-status": "^2.1.0",
71
76
  "jwt-decode": "^4.0.0",
72
77
  "mobx": "^6.15.0",
@@ -77,35 +82,36 @@
77
82
  "react-dom": "^19.2.0",
78
83
  "react-router": "^7.9.3",
79
84
  "react-router-dom": "^7.9.4",
80
- "@actdim/utico": "^1.0.2",
81
- "@actdim/msgmesh": "^1.0.2",
82
85
  "rxjs": "^7.8.2",
83
- "dexie": "^4.2.0",
84
- "moment": "^2.30.1",
85
86
  "uuid": "^13.0.0"
86
87
  },
87
88
  "devDependencies": {
89
+ "@storybook/addon-docs": "10.0.7",
90
+ "@storybook/addon-onboarding": "10.0.7",
91
+ "@storybook/react-vite": "10.0.7",
88
92
  "@swc/core": "^1.15.1",
89
- "@vitejs/plugin-react-swc": "^4.2.1",
90
- "eslint-plugin-react": "^7.37.5",
91
- "eslint-plugin-react-hooks": "^7.0.1",
92
- "eslint-plugin-react-refresh": "^0.4.24",
93
93
  "@types/chai": "^5.2.3",
94
94
  "@types/mocha": "^10.0.10",
95
95
  "@types/node": "^24.10.0",
96
96
  "@typescript-eslint/eslint-plugin": "^8.46.3",
97
97
  "@typescript-eslint/parser": "^8.46.3",
98
+ "@vitejs/plugin-react-swc": "^4.2.1",
98
99
  "chai": "^6.2.0",
99
100
  "eslint": "^9.39.1",
100
101
  "eslint-config-prettier": "^10.1.8",
101
102
  "eslint-formatter-visualstudio": "^9.0.1",
102
- "eslint-plugin-prettier": "^5.5.4",
103
+ "eslint-plugin-prettier": "^5.5.4",
104
+ "eslint-plugin-react": "^7.37.5",
105
+ "eslint-plugin-react-hooks": "^7.0.1",
106
+ "eslint-plugin-react-refresh": "^0.4.24",
107
+ "eslint-plugin-storybook": "10.0.7",
103
108
  "globals": "^16.5.0",
104
109
  "mocha": "^11.7.5",
105
110
  "npm-check-updates": "^19.1.2",
106
111
  "prettier": "^3.6.2",
107
112
  "prettier-plugin-classnames": "^0.8.5",
108
113
  "shx": "^0.4.0",
114
+ "storybook": "10.0.7",
109
115
  "typescript": "^5.9.3",
110
116
  "typescript-eslint": "^8.46.3",
111
117
  "vite": "^7.2.2",