@smartcorehub/localization-sdk 1.0.3491 → 1.0.3500
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/README.md +18 -1
- package/dist/index.d.mts +2 -8
- package/dist/index.d.ts +2 -8
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -35,7 +35,8 @@ const localizationClient = createLocalizationClient({
|
|
|
35
35
|
cache: {
|
|
36
36
|
enabled: true,
|
|
37
37
|
ttlMs: 60000
|
|
38
|
-
}
|
|
38
|
+
},
|
|
39
|
+
enableLogs: true
|
|
39
40
|
});
|
|
40
41
|
|
|
41
42
|
const current = await localizationClient.getCurrentLanguage('home.title');
|
|
@@ -189,6 +190,22 @@ const client = createLocalizationClient({
|
|
|
189
190
|
});
|
|
190
191
|
~~~
|
|
191
192
|
|
|
193
|
+
## Logging opcional
|
|
194
|
+
|
|
195
|
+
O SDK nao gera logs por padrao. Para habilitar, passe `enableLogs: true` no `createLocalizationClient`.
|
|
196
|
+
|
|
197
|
+
~~~ts
|
|
198
|
+
import { createLocalizationClient } from '@smartcorehub/localization-sdk';
|
|
199
|
+
|
|
200
|
+
const client = createLocalizationClient({
|
|
201
|
+
baseUrl: 'https://api.smartcorehub.io/',
|
|
202
|
+
token: 'SEU_TOKEN',
|
|
203
|
+
enableLogs: true
|
|
204
|
+
});
|
|
205
|
+
~~~
|
|
206
|
+
|
|
207
|
+
Quando ativo, o SDK escreve trilhas em `console.debug`, `console.info` e `console.error` para facilitar o rastreio de requests, cache, sucesso e excecoes mapeadas.
|
|
208
|
+
|
|
192
209
|
## Comandos para desenvolvimento do pacote
|
|
193
210
|
|
|
194
211
|
No diretorio do pacote:
|
package/dist/index.d.mts
CHANGED
|
@@ -35,12 +35,6 @@ interface HttpTransport {
|
|
|
35
35
|
request<T>(request: HttpRequest): Promise<HttpResponse<T>>;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
interface SDKLogger {
|
|
39
|
-
debug(message: string): void;
|
|
40
|
-
info(message: string): void;
|
|
41
|
-
warn(message: string): void;
|
|
42
|
-
error(message: string): void;
|
|
43
|
-
}
|
|
44
38
|
interface LocalizationClientOptions {
|
|
45
39
|
readonly baseUrl: string;
|
|
46
40
|
readonly token?: string;
|
|
@@ -54,7 +48,7 @@ interface LocalizationClientOptions {
|
|
|
54
48
|
readonly provider?: CacheProvider;
|
|
55
49
|
readonly ttlMs?: number;
|
|
56
50
|
};
|
|
57
|
-
readonly
|
|
51
|
+
readonly enableLogs?: boolean;
|
|
58
52
|
}
|
|
59
53
|
|
|
60
54
|
interface LocalizationListResource {
|
|
@@ -147,4 +141,4 @@ declare class LocalizationService {
|
|
|
147
141
|
declare const LOCALIZATION_SDK_OPTIONS: InjectionToken<LocalizationClientOptions>;
|
|
148
142
|
declare const LOCALIZATION_CLIENT: InjectionToken<LocalizationClient>;
|
|
149
143
|
|
|
150
|
-
export { type AuthProvider, type CacheProvider, FetchHttpTransport, type HttpRequest, type HttpResponse, type HttpTransport, LOCALIZATION_CLIENT, LOCALIZATION_SDK_OPTIONS, LocalizationAuthError, type LocalizationClient, type LocalizationClientOptions, LocalizationError, type LocalizationListResource, LocalizationNetworkError, LocalizationServerError, LocalizationService, LocalizationTimeoutError, MemoryCacheProvider, ResourceNotFoundError, type ResourceResponse, type
|
|
144
|
+
export { type AuthProvider, type CacheProvider, FetchHttpTransport, type HttpRequest, type HttpResponse, type HttpTransport, LOCALIZATION_CLIENT, LOCALIZATION_SDK_OPTIONS, LocalizationAuthError, type LocalizationClient, type LocalizationClientOptions, LocalizationError, type LocalizationListResource, LocalizationNetworkError, LocalizationServerError, LocalizationService, LocalizationTimeoutError, MemoryCacheProvider, ResourceNotFoundError, type ResourceResponse, type SDKMiddleware, XAuthTokenProvider, createLocalizationClient, provideLocalization };
|
package/dist/index.d.ts
CHANGED
|
@@ -35,12 +35,6 @@ interface HttpTransport {
|
|
|
35
35
|
request<T>(request: HttpRequest): Promise<HttpResponse<T>>;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
interface SDKLogger {
|
|
39
|
-
debug(message: string): void;
|
|
40
|
-
info(message: string): void;
|
|
41
|
-
warn(message: string): void;
|
|
42
|
-
error(message: string): void;
|
|
43
|
-
}
|
|
44
38
|
interface LocalizationClientOptions {
|
|
45
39
|
readonly baseUrl: string;
|
|
46
40
|
readonly token?: string;
|
|
@@ -54,7 +48,7 @@ interface LocalizationClientOptions {
|
|
|
54
48
|
readonly provider?: CacheProvider;
|
|
55
49
|
readonly ttlMs?: number;
|
|
56
50
|
};
|
|
57
|
-
readonly
|
|
51
|
+
readonly enableLogs?: boolean;
|
|
58
52
|
}
|
|
59
53
|
|
|
60
54
|
interface LocalizationListResource {
|
|
@@ -147,4 +141,4 @@ declare class LocalizationService {
|
|
|
147
141
|
declare const LOCALIZATION_SDK_OPTIONS: InjectionToken<LocalizationClientOptions>;
|
|
148
142
|
declare const LOCALIZATION_CLIENT: InjectionToken<LocalizationClient>;
|
|
149
143
|
|
|
150
|
-
export { type AuthProvider, type CacheProvider, FetchHttpTransport, type HttpRequest, type HttpResponse, type HttpTransport, LOCALIZATION_CLIENT, LOCALIZATION_SDK_OPTIONS, LocalizationAuthError, type LocalizationClient, type LocalizationClientOptions, LocalizationError, type LocalizationListResource, LocalizationNetworkError, LocalizationServerError, LocalizationService, LocalizationTimeoutError, MemoryCacheProvider, ResourceNotFoundError, type ResourceResponse, type
|
|
144
|
+
export { type AuthProvider, type CacheProvider, FetchHttpTransport, type HttpRequest, type HttpResponse, type HttpTransport, LOCALIZATION_CLIENT, LOCALIZATION_SDK_OPTIONS, LocalizationAuthError, type LocalizationClient, type LocalizationClientOptions, LocalizationError, type LocalizationListResource, LocalizationNetworkError, LocalizationServerError, LocalizationService, LocalizationTimeoutError, MemoryCacheProvider, ResourceNotFoundError, type ResourceResponse, type SDKMiddleware, XAuthTokenProvider, createLocalizationClient, provideLocalization };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var core=require('@angular/core'),rxjs=require('rxjs');var re=Object.create;var q=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var $=(r,e)=>(e=Symbol[r])?e:Symbol.for("Symbol."+r),v=r=>{throw TypeError(r)};var ne=(r,e,t)=>e in r?q(r,e,{enumerable:true,configurable:true,writable:true,value:t}):r[e]=t;var j=(r,e)=>q(r,"name",{value:e,configurable:true});var V=r=>[,,,re(null)],X=["class","method","getter","setter","accessor","field","value","get","set"],w=r=>r!==void 0&&typeof r!="function"?v("Function expected"):r,ie=(r,e,t,o,n)=>({kind:X[r],name:e,metadata:o,addInitializer:a=>t._?v("Already initialized"):n.push(w(a||null))}),ae=(r,e)=>ne(e,$("metadata"),r[3]),J=(r,e,t,o)=>{for(var n=0,a=r[e>>1],l=a&&a.length;n<l;n++)a[n].call(t);return o},Y=(r,e,t,o,n,a)=>{var s,p,f,i=e&7,m=false,N=0,te=r[N]||(r[N]=[]),u=i&&((n=n.prototype),i<5&&(i>3||!m)&&oe(n,t));j(n,t);for(var k=o.length-1;k>=0;k--)f=ie(i,t,p={},r[3],te),s=(0, o[k])(n,f),p._=1,w(s)&&(n=s);return ae(r,n),u&&q(n,t,u),m?i^4?a:u:n};var g=class{constructor(e){this.token=e;}async getToken(){return this.token?.trim()?this.token:null}};var L=class{constructor(){this.store=new Map;}async get(e){let t=this.store.get(e);return t?t.expiresAt!==void 0&&Date.now()>t.expiresAt?(this.store.delete(e),null):t.value:null}async set(e,t,o){let n=o&&o>0?Date.now()+o:void 0;this.store.set(e,{value:t,expiresAt:n});}async delete(e){this.store.delete(e);}async clear(){this.store.clear();}};var c=class extends Error{constructor(t,o){super(t);this.metadata=o;this.name="LocalizationError";}},C=class extends c{constructor(e="Authentication failed",t){super(e,t),this.name="LocalizationAuthError";}},T=class extends c{constructor(e="Resource not found",t){super(e,t),this.name="ResourceNotFoundError";}},E=class extends c{constructor(e="Localization server error",t){super(e,t),this.name="LocalizationServerError";}},R=class extends c{constructor(e="Network error while contacting localization API",t){super(e,t),this.name="LocalizationNetworkError";}},x=class extends c{constructor(e="Localization request timeout",t){super(e,t),this.name="LocalizationTimeoutError";}};var z=class extends Error{constructor(t,o,n){super(`Request failed with status ${t}`);this.statusCode=t;this.responseBody=o;this.responseHeaders=n;this.name="HttpStatusError";}},P=class extends Error{constructor(t){super(`Request timed out after ${t}ms`);this.timeoutMs=t;this.name="HttpTimeoutError";}},O=class extends Error{constructor(t){super("Network error while sending request");this.causeError=t;this.name="HttpNetworkError";}},A=class{constructor(e){this.options=e;this.fetchFn=e.fetchFn??fetch;}async request(e){let t=e.timeoutMs??this.options.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t),a=new Request(this.resolveUrl(e),{method:e.method,headers:{"Content-Type":"application/json",...this.options.defaultHeaders,...e.headers},body:e.body===void 0?void 0:JSON.stringify(e.body),signal:o.signal});try{let l=await this.runRequestMiddleware(a),s;try{s=await this.fetchFn(l);}catch(h){throw this.isAbortError(h)?new P(t):new O(h)}let p=await this.runResponseMiddleware(s);if(!p.ok){let h=await p.text();throw new z(p.status,h,p.headers)}let f=await this.parseResponse(p);return {status:p.status,headers:p.headers,data:f}}catch(l){throw await this.runErrorMiddleware(this.toError(l)),l}finally{clearTimeout(n);}}resolveUrl(e){let t=new URL(e.path,this.options.baseUrl);return e.query&&Object.entries(e.query).forEach(([o,n])=>{n!==void 0&&t.searchParams.set(o,String(n));}),t.toString()}async runRequestMiddleware(e){let t=e;for(let o of this.options.middleware??[])o.onRequest&&(t=await o.onRequest(t));return t}async runResponseMiddleware(e){let t=e;for(let o of this.options.middleware??[])o.onResponse&&(t=await o.onResponse(t));return t}async runErrorMiddleware(e){for(let t of this.options.middleware??[])t.onError&&await t.onError(e);}async parseResponse(e){return e.status===204?null:(e.headers.get("content-type")??"").includes("application/json")?await e.json():await e.text()}toError(e){return e instanceof Error?e:new Error("Unknown request error")}isAbortError(e){return e instanceof DOMException&&e.name==="AbortError"}};var Q="localization:listResources",I=class{constructor(e){this.dependencies=e;}async getCurrentLanguage(e){return this.validateRequired(e,"resourceKey"),await this.send({method:"GET",path:"api/localization/client/currentlanguage",query:{resourceKey:e}})??""}async getByLanguage(e,t){return this.validateRequired(e,"resourceKey"),this.validateRequired(t,"languageKey"),await this.send({method:"GET",path:"api/localization/client/bylanguage",query:{resourceKey:e,languageKey:t}})??""}async listResources(){let e=await this.dependencies.cacheProvider?.get(Q);if(e)return e;let o=(await this.send({method:"GET",path:"api/localization/client/list"})??[]).map(n=>({key:n.resourceKey,value:n.value,language:n.languageKey}));return await this.dependencies.cacheProvider?.set(Q,o,this.dependencies.cacheTtlMs),o}async invalidateCache(e){if(this.dependencies.cacheProvider){if(e){await this.dependencies.cacheProvider.delete(e);return}await this.dependencies.cacheProvider.clear();}}async send(e){try{let t=await this.dependencies.authProvider?.getToken(),o=t?{...e.headers,"X-Auth-Token":t}:e.headers;return (await this.dependencies.httpTransport.request({...e,headers:o})).data}catch(t){throw this.mapError(t)}}mapError(e){return e instanceof c?e:e instanceof P?new x(e.message):e instanceof O?new R(e.message):e instanceof z?e.statusCode===401||e.statusCode===403?new C("Invalid token for localization endpoint",{statusCode:e.statusCode}):e.statusCode===404?new T("Localization resource was not found",{statusCode:e.statusCode}):e.statusCode>=500?new E("Localization API is unavailable",{statusCode:e.statusCode}):new c(e.message,{statusCode:e.statusCode}):new c("Unexpected localization SDK error")}validateRequired(e,t){if(!e?.trim())throw new c(`${t} is required`)}};function K(r){le(r);let t=r.cache?.enabled??false?r.cache?.provider??new L:void 0,o=new A({baseUrl:r.baseUrl,fetchFn:r.fetchFn,timeoutMs:r.timeoutMs??1e4,defaultHeaders:r.headers,middleware:r.middleware});return new I({httpTransport:o,authProvider:r.authProvider??(r.token?new g(r.token):void 0),cacheProvider:t,cacheTtlMs:r.cache?.ttlMs})}function le(r){if(!r?.baseUrl?.trim())throw new c("baseUrl is required to create localization client")}var _=new core.InjectionToken("LOCALIZATION_SDK_OPTIONS"),b=new core.InjectionToken("LOCALIZATION_CLIENT");function ue(r){return core.makeEnvironmentProviders([{provide:_,useValue:r},{provide:b,useFactory:()=>K(r)}])}var ee,F;ee=[core.Injectable({providedIn:"root"})];exports.LocalizationService=class y{constructor(){this.client=core.inject(b);}getCurrentLanguage(e){return rxjs.from(this.client.getCurrentLanguage(e))}getByLanguage(e,t){return rxjs.from(this.client.getByLanguage(e,t))}listResources(){return rxjs.from(this.client.listResources())}invalidateCache(e){return rxjs.from(this.client.invalidateCache(e))}};F=V(),exports.LocalizationService=Y(F,0,"LocalizationService",ee,exports.LocalizationService),J(F,1,exports.LocalizationService);exports.FetchHttpTransport=A;exports.LOCALIZATION_CLIENT=b;exports.LOCALIZATION_SDK_OPTIONS=_;exports.LocalizationAuthError=C;exports.LocalizationError=c;exports.LocalizationNetworkError=R;exports.LocalizationServerError=E;exports.LocalizationTimeoutError=x;exports.MemoryCacheProvider=L;exports.ResourceNotFoundError=T;exports.XAuthTokenProvider=g;exports.createLocalizationClient=K;exports.provideLocalization=ue;
|
|
1
|
+
'use strict';var core=require('@angular/core'),rxjs=require('rxjs');var ae=Object.create;var K=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var W=(r,e)=>(e=Symbol[r])?e:Symbol.for("Symbol."+r),y=r=>{throw TypeError(r)};var se=(r,e,t)=>e in r?K(r,e,{enumerable:true,configurable:true,writable:true,value:t}):r[e]=t;var V=(r,e)=>K(r,"name",{value:e,configurable:true});var J=r=>[,,,ae(null)],Y=["class","method","getter","setter","accessor","field","value","get","set"],L=r=>r!==void 0&&typeof r!="function"?y("Function expected"):r,ce=(r,e,t,o,n)=>({kind:Y[r],name:e,metadata:o,addInitializer:i=>t._?y("Already initialized"):n.push(L(i||null))}),le=(r,e)=>se(e,W("metadata"),r[3]),Q=(r,e,t,o)=>{for(var n=0,i=r[e>>1],l=i&&i.length;n<l;n++)i[n].call(t);return o},ee=(r,e,t,o,n,i)=>{var c,p,m,a=e&7,h=false,N=0,ne=r[N]||(r[N]=[]),d=a&&((n=n.prototype),a<5&&(a>3||!h)&&ie(n,t));V(n,t);for(var q=o.length-1;q>=0;q--)m=ce(a,t,p={},r[3],ne),c=(0, o[q])(n,m),p._=1,L(c)&&(n=c);return le(r,n),d&&K(n,t,d),h?a^4?i:d:n};var w=class{constructor(e){this.token=e;}async getToken(){return this.token?.trim()?this.token:null}};var C=class{constructor(){this.store=new Map;}async get(e){let t=this.store.get(e);return t?t.expiresAt!==void 0&&Date.now()>t.expiresAt?(this.store.delete(e),null):t.value:null}async set(e,t,o){let n=o&&o>0?Date.now()+o:void 0;this.store.set(e,{value:t,expiresAt:n});}async delete(e){this.store.delete(e);}async clear(){this.store.clear();}};var s=class extends Error{constructor(t,o){super(t);this.metadata=o;this.name="LocalizationError";}},E=class extends s{constructor(e="Authentication failed",t){super(e,t),this.name="LocalizationAuthError";}},T=class extends s{constructor(e="Resource not found",t){super(e,t),this.name="ResourceNotFoundError";}},R=class extends s{constructor(e="Localization server error",t){super(e,t),this.name="LocalizationServerError";}},b=class extends s{constructor(e="Network error while contacting localization API",t){super(e,t),this.name="LocalizationNetworkError";}},z=class extends s{constructor(e="Localization request timeout",t){super(e,t),this.name="LocalizationTimeoutError";}};var P=class extends Error{constructor(t,o,n){super(`Request failed with status ${t}`);this.statusCode=t;this.responseBody=o;this.responseHeaders=n;this.name="HttpStatusError";}},x=class extends Error{constructor(t){super(`Request timed out after ${t}ms`);this.timeoutMs=t;this.name="HttpTimeoutError";}},f=class extends Error{constructor(t){super("Network error while sending request");this.causeError=t;this.name="HttpNetworkError";}},A=class{constructor(e){this.options=e;this.fetchFn=e.fetchFn??fetch;}async request(e){let t=e.timeoutMs??this.options.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t),i=new Request(this.resolveUrl(e),{method:e.method,headers:{"Content-Type":"application/json",...this.options.defaultHeaders,...e.headers},body:e.body===void 0?void 0:JSON.stringify(e.body),signal:o.signal});try{let l=await this.runRequestMiddleware(i),c;try{c=await this.fetchFn(l);}catch(g){throw this.isAbortError(g)?new x(t):new f(g)}let p=await this.runResponseMiddleware(c);if(!p.ok){let g=await p.text();throw new P(p.status,g,p.headers)}let m=await this.parseResponse(p);return {status:p.status,headers:p.headers,data:m}}catch(l){throw await this.runErrorMiddleware(this.toError(l)),l}finally{clearTimeout(n);}}resolveUrl(e){let t=new URL(e.path,this.options.baseUrl);return e.query&&Object.entries(e.query).forEach(([o,n])=>{n!==void 0&&t.searchParams.set(o,String(n));}),t.toString()}async runRequestMiddleware(e){let t=e;for(let o of this.options.middleware??[])o.onRequest&&(t=await o.onRequest(t));return t}async runResponseMiddleware(e){let t=e;for(let o of this.options.middleware??[])o.onResponse&&(t=await o.onResponse(t));return t}async runErrorMiddleware(e){for(let t of this.options.middleware??[])t.onError&&await t.onError(e);}async parseResponse(e){return e.status===204?null:(e.headers.get("content-type")??"").includes("application/json")?await e.json():await e.text()}toError(e){return e instanceof Error?e:new Error("Unknown request error")}isAbortError(e){return e instanceof DOMException&&e.name==="AbortError"}};var te="localization:listResources",H=class{constructor(e,t,o){this.cacheProvider=e;this.cacheTtlMs=t;this.logger=o;}async getListResources(){this.logger.debug(`listResources:start cacheEnabled=${!!this.cacheProvider}`);let e=await this.cacheProvider?.get(te);return e?this.logger.info(`listResources:cache-hit count=${e.length}`):this.logger.debug("listResources:cache-miss"),e}async storeListResources(e){await this.cacheProvider?.set(te,e,this.cacheTtlMs),this.logger.debug(`listResources:cache-store ttlMs=${this.cacheTtlMs??0} count=${e.length}`);}async invalidate(e){if(this.logger.debug(`invalidateCache:start scope=${e??"all"}`),!this.cacheProvider){this.logger.debug("invalidateCache:skipped no-cache-provider");return}if(e){await this.cacheProvider.delete(e),this.logger.info(`invalidateCache:deleted key=${e}`);return}await this.cacheProvider.clear(),this.logger.info("invalidateCache:cleared-all");}};var k=class{constructor(e){this.logger=e;}async run(e,t){try{return await t()}catch(o){let n=this.map(o);throw this.logger.errorForOperation(e,n,o),n}}validateRequired(e,t){if(!e?.trim())throw new s(`${t} is required`)}map(e){return e instanceof s?e:e instanceof x?new z(e.message):e instanceof f?new b(e.message):e instanceof P?this.mapStatusError(e):new s("Unexpected localization SDK error")}preserveCause(e){let t=this.map(e);return t.cause??(t.cause=e),t}mapStatusError(e){return e.statusCode===401||e.statusCode===403?new E("Invalid token for localization endpoint",{statusCode:e.statusCode}):e.statusCode===404?new T("Localization resource was not found",{statusCode:e.statusCode}):e.statusCode>=500?new R("Localization API is unavailable",{statusCode:e.statusCode}):new s(e.message,{statusCode:e.statusCode})}};var pe="[LocalizationSdk]",I=class{constructor(e=false){this.enabled=e;}debug(e){this.write("debug",e);}info(e){this.write("info",e);}errorForOperation(e,t,o){this.write("error",`${e}:error ${this.formatErrorDetails(t,o)}`);}formatErrorDetails(e,t){let o=this.getOriginalCause(e,t),n=this.getErrorMessage(o),i=[`type=${e.name}`,`message=${e.message}`];return n&&n!==e.message&&i.push(`original=${n}`),e instanceof s&&e.metadata?.statusCode&&i.push(`statusCode=${e.metadata.statusCode}`),i.join(" ")}getOriginalCause(e,t){let n=e.cause??t;return n instanceof f?n.causeError:n}getErrorMessage(e){return e instanceof Error?e.message:typeof e=="string"?e:"unknown-error"}write(e,t){if(!this.enabled)return;let o=`${pe} ${t}`;switch(e){case "debug":console.debug(o);break;case "info":console.info(o);break;case "error":console.error(o);break}}};var M=class{constructor(e){this.dependencies=e;this.logger=new I(e.enableLogs),this.cacheHelper=new H(e.cacheProvider,e.cacheTtlMs,this.logger),this.errorHandler=new k(this.logger);}async getCurrentLanguage(e){return this.errorHandler.run("getCurrentLanguage",async()=>{this.errorHandler.validateRequired(e,"resourceKey"),this.logger.debug(`getCurrentLanguage:start resourceKey=${e}`);let t=await this.send({method:"GET",path:"api/localization/client/currentlanguage",query:{resourceKey:e}});return this.logger.info(`getCurrentLanguage:success resourceKey=${e} hasValue=${!!t}`),t??""})}async getByLanguage(e,t){return this.errorHandler.run("getByLanguage",async()=>{this.errorHandler.validateRequired(e,"resourceKey"),this.errorHandler.validateRequired(t,"languageKey"),this.logger.debug(`getByLanguage:start resourceKey=${e} languageKey=${t}`);let o=await this.send({method:"GET",path:"api/localization/client/bylanguage",query:{resourceKey:e,languageKey:t}});return this.logger.info(`getByLanguage:success resourceKey=${e} languageKey=${t} hasValue=${!!o}`),o??""})}async listResources(){return this.errorHandler.run("listResources",async()=>{let e=await this.cacheHelper.getListResources();if(e)return e;let o=(await this.send({method:"GET",path:"api/localization/client/list"})??[]).map(n=>({key:n.resourceKey,value:n.value,language:n.languageKey}));return await this.cacheHelper.storeListResources(o),this.logger.info(`listResources:success count=${o.length}`),o})}async invalidateCache(e){return this.errorHandler.run("invalidateCache",async()=>this.cacheHelper.invalidate(e))}async send(e){try{let t=await this.dependencies.authProvider?.getToken(),o=t?{...e.headers,"X-Auth-Token":t}:e.headers;this.logger.debug(`request:start method=${e.method} path=${e.path} hasAuth=${!!t}`);let n=await this.dependencies.httpTransport.request({...e,headers:o});return this.logger.debug(`request:success method=${e.method} path=${e.path} status=${n.status}`),n.data}catch(t){throw this.errorHandler.preserveCause(t)}}};function _(r){he(r);let t=r.cache?.enabled??false?r.cache?.provider??new C:void 0,o=new A({baseUrl:r.baseUrl,fetchFn:r.fetchFn,timeoutMs:r.timeoutMs??1e4,defaultHeaders:r.headers,middleware:r.middleware});return new M({httpTransport:o,authProvider:r.authProvider??(r.token?new w(r.token):void 0),cacheProvider:t,cacheTtlMs:r.cache?.ttlMs,enableLogs:r.enableLogs??false})}function he(r){if(!r?.baseUrl?.trim())throw new s("baseUrl is required to create localization client")}var B=new core.InjectionToken("LOCALIZATION_SDK_OPTIONS"),O=new core.InjectionToken("LOCALIZATION_CLIENT");function me(r){return core.makeEnvironmentProviders([{provide:B,useValue:r},{provide:O,useFactory:()=>_(r)}])}var oe,U;oe=[core.Injectable({providedIn:"root"})];exports.LocalizationService=class v{constructor(){this.client=core.inject(O);}getCurrentLanguage(e){return rxjs.from(this.client.getCurrentLanguage(e))}getByLanguage(e,t){return rxjs.from(this.client.getByLanguage(e,t))}listResources(){return rxjs.from(this.client.listResources())}invalidateCache(e){return rxjs.from(this.client.invalidateCache(e))}};U=J(),exports.LocalizationService=ee(U,0,"LocalizationService",oe,exports.LocalizationService),Q(U,1,exports.LocalizationService);exports.FetchHttpTransport=A;exports.LOCALIZATION_CLIENT=O;exports.LOCALIZATION_SDK_OPTIONS=B;exports.LocalizationAuthError=E;exports.LocalizationError=s;exports.LocalizationNetworkError=b;exports.LocalizationServerError=R;exports.LocalizationTimeoutError=z;exports.MemoryCacheProvider=C;exports.ResourceNotFoundError=T;exports.XAuthTokenProvider=w;exports.createLocalizationClient=_;exports.provideLocalization=me;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {InjectionToken,Injectable,makeEnvironmentProviders,inject}from'@angular/core';import {from}from'rxjs';var re=Object.create;var q=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var $=(r,e)=>(e=Symbol[r])?e:Symbol.for("Symbol."+r),v=r=>{throw TypeError(r)};var ne=(r,e,t)=>e in r?q(r,e,{enumerable:true,configurable:true,writable:true,value:t}):r[e]=t;var j=(r,e)=>q(r,"name",{value:e,configurable:true});var V=r=>[,,,re(null)],X=["class","method","getter","setter","accessor","field","value","get","set"],w=r=>r!==void 0&&typeof r!="function"?v("Function expected"):r,ie=(r,e,t,o,n)=>({kind:X[r],name:e,metadata:o,addInitializer:a=>t._?v("Already initialized"):n.push(w(a||null))}),ae=(r,e)=>ne(e,$("metadata"),r[3]),J=(r,e,t,o)=>{for(var n=0,a=r[e>>1],l=a&&a.length;n<l;n++)a[n].call(t);return o},Y=(r,e,t,o,n,a)=>{var s,p,f,i=e&7,m=false,N=0,te=r[N]||(r[N]=[]),u=i&&((n=n.prototype),i<5&&(i>3||!m)&&oe(n,t));j(n,t);for(var k=o.length-1;k>=0;k--)f=ie(i,t,p={},r[3],te),s=(0, o[k])(n,f),p._=1,w(s)&&(n=s);return ae(r,n),u&&q(n,t,u),m?i^4?a:u:n};var g=class{constructor(e){this.token=e;}async getToken(){return this.token?.trim()?this.token:null}};var L=class{constructor(){this.store=new Map;}async get(e){let t=this.store.get(e);return t?t.expiresAt!==void 0&&Date.now()>t.expiresAt?(this.store.delete(e),null):t.value:null}async set(e,t,o){let n=o&&o>0?Date.now()+o:void 0;this.store.set(e,{value:t,expiresAt:n});}async delete(e){this.store.delete(e);}async clear(){this.store.clear();}};var c=class extends Error{constructor(t,o){super(t);this.metadata=o;this.name="LocalizationError";}},C=class extends c{constructor(e="Authentication failed",t){super(e,t),this.name="LocalizationAuthError";}},T=class extends c{constructor(e="Resource not found",t){super(e,t),this.name="ResourceNotFoundError";}},E=class extends c{constructor(e="Localization server error",t){super(e,t),this.name="LocalizationServerError";}},R=class extends c{constructor(e="Network error while contacting localization API",t){super(e,t),this.name="LocalizationNetworkError";}},x=class extends c{constructor(e="Localization request timeout",t){super(e,t),this.name="LocalizationTimeoutError";}};var z=class extends Error{constructor(t,o,n){super(`Request failed with status ${t}`);this.statusCode=t;this.responseBody=o;this.responseHeaders=n;this.name="HttpStatusError";}},P=class extends Error{constructor(t){super(`Request timed out after ${t}ms`);this.timeoutMs=t;this.name="HttpTimeoutError";}},O=class extends Error{constructor(t){super("Network error while sending request");this.causeError=t;this.name="HttpNetworkError";}},A=class{constructor(e){this.options=e;this.fetchFn=e.fetchFn??fetch;}async request(e){let t=e.timeoutMs??this.options.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t),a=new Request(this.resolveUrl(e),{method:e.method,headers:{"Content-Type":"application/json",...this.options.defaultHeaders,...e.headers},body:e.body===void 0?void 0:JSON.stringify(e.body),signal:o.signal});try{let l=await this.runRequestMiddleware(a),s;try{s=await this.fetchFn(l);}catch(h){throw this.isAbortError(h)?new P(t):new O(h)}let p=await this.runResponseMiddleware(s);if(!p.ok){let h=await p.text();throw new z(p.status,h,p.headers)}let f=await this.parseResponse(p);return {status:p.status,headers:p.headers,data:f}}catch(l){throw await this.runErrorMiddleware(this.toError(l)),l}finally{clearTimeout(n);}}resolveUrl(e){let t=new URL(e.path,this.options.baseUrl);return e.query&&Object.entries(e.query).forEach(([o,n])=>{n!==void 0&&t.searchParams.set(o,String(n));}),t.toString()}async runRequestMiddleware(e){let t=e;for(let o of this.options.middleware??[])o.onRequest&&(t=await o.onRequest(t));return t}async runResponseMiddleware(e){let t=e;for(let o of this.options.middleware??[])o.onResponse&&(t=await o.onResponse(t));return t}async runErrorMiddleware(e){for(let t of this.options.middleware??[])t.onError&&await t.onError(e);}async parseResponse(e){return e.status===204?null:(e.headers.get("content-type")??"").includes("application/json")?await e.json():await e.text()}toError(e){return e instanceof Error?e:new Error("Unknown request error")}isAbortError(e){return e instanceof DOMException&&e.name==="AbortError"}};var Q="localization:listResources",I=class{constructor(e){this.dependencies=e;}async getCurrentLanguage(e){return this.validateRequired(e,"resourceKey"),await this.send({method:"GET",path:"api/localization/client/currentlanguage",query:{resourceKey:e}})??""}async getByLanguage(e,t){return this.validateRequired(e,"resourceKey"),this.validateRequired(t,"languageKey"),await this.send({method:"GET",path:"api/localization/client/bylanguage",query:{resourceKey:e,languageKey:t}})??""}async listResources(){let e=await this.dependencies.cacheProvider?.get(Q);if(e)return e;let o=(await this.send({method:"GET",path:"api/localization/client/list"})??[]).map(n=>({key:n.resourceKey,value:n.value,language:n.languageKey}));return await this.dependencies.cacheProvider?.set(Q,o,this.dependencies.cacheTtlMs),o}async invalidateCache(e){if(this.dependencies.cacheProvider){if(e){await this.dependencies.cacheProvider.delete(e);return}await this.dependencies.cacheProvider.clear();}}async send(e){try{let t=await this.dependencies.authProvider?.getToken(),o=t?{...e.headers,"X-Auth-Token":t}:e.headers;return (await this.dependencies.httpTransport.request({...e,headers:o})).data}catch(t){throw this.mapError(t)}}mapError(e){return e instanceof c?e:e instanceof P?new x(e.message):e instanceof O?new R(e.message):e instanceof z?e.statusCode===401||e.statusCode===403?new C("Invalid token for localization endpoint",{statusCode:e.statusCode}):e.statusCode===404?new T("Localization resource was not found",{statusCode:e.statusCode}):e.statusCode>=500?new E("Localization API is unavailable",{statusCode:e.statusCode}):new c(e.message,{statusCode:e.statusCode}):new c("Unexpected localization SDK error")}validateRequired(e,t){if(!e?.trim())throw new c(`${t} is required`)}};function K(r){le(r);let t=r.cache?.enabled??false?r.cache?.provider??new L:void 0,o=new A({baseUrl:r.baseUrl,fetchFn:r.fetchFn,timeoutMs:r.timeoutMs??1e4,defaultHeaders:r.headers,middleware:r.middleware});return new I({httpTransport:o,authProvider:r.authProvider??(r.token?new g(r.token):void 0),cacheProvider:t,cacheTtlMs:r.cache?.ttlMs})}function le(r){if(!r?.baseUrl?.trim())throw new c("baseUrl is required to create localization client")}var _=new InjectionToken("LOCALIZATION_SDK_OPTIONS"),b=new InjectionToken("LOCALIZATION_CLIENT");function ue(r){return makeEnvironmentProviders([{provide:_,useValue:r},{provide:b,useFactory:()=>K(r)}])}var ee,F;ee=[Injectable({providedIn:"root"})];var y=class{constructor(){this.client=inject(b);}getCurrentLanguage(e){return from(this.client.getCurrentLanguage(e))}getByLanguage(e,t){return from(this.client.getByLanguage(e,t))}listResources(){return from(this.client.listResources())}invalidateCache(e){return from(this.client.invalidateCache(e))}};F=V(),y=Y(F,0,"LocalizationService",ee,y),J(F,1,y);export{A as FetchHttpTransport,b as LOCALIZATION_CLIENT,_ as LOCALIZATION_SDK_OPTIONS,C as LocalizationAuthError,c as LocalizationError,R as LocalizationNetworkError,E as LocalizationServerError,y as LocalizationService,x as LocalizationTimeoutError,L as MemoryCacheProvider,T as ResourceNotFoundError,g as XAuthTokenProvider,K as createLocalizationClient,ue as provideLocalization};
|
|
1
|
+
import {InjectionToken,Injectable,makeEnvironmentProviders,inject}from'@angular/core';import {from}from'rxjs';var ae=Object.create;var K=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var W=(r,e)=>(e=Symbol[r])?e:Symbol.for("Symbol."+r),y=r=>{throw TypeError(r)};var se=(r,e,t)=>e in r?K(r,e,{enumerable:true,configurable:true,writable:true,value:t}):r[e]=t;var V=(r,e)=>K(r,"name",{value:e,configurable:true});var J=r=>[,,,ae(null)],Y=["class","method","getter","setter","accessor","field","value","get","set"],L=r=>r!==void 0&&typeof r!="function"?y("Function expected"):r,ce=(r,e,t,o,n)=>({kind:Y[r],name:e,metadata:o,addInitializer:i=>t._?y("Already initialized"):n.push(L(i||null))}),le=(r,e)=>se(e,W("metadata"),r[3]),Q=(r,e,t,o)=>{for(var n=0,i=r[e>>1],l=i&&i.length;n<l;n++)i[n].call(t);return o},ee=(r,e,t,o,n,i)=>{var c,p,m,a=e&7,h=false,N=0,ne=r[N]||(r[N]=[]),d=a&&((n=n.prototype),a<5&&(a>3||!h)&&ie(n,t));V(n,t);for(var q=o.length-1;q>=0;q--)m=ce(a,t,p={},r[3],ne),c=(0, o[q])(n,m),p._=1,L(c)&&(n=c);return le(r,n),d&&K(n,t,d),h?a^4?i:d:n};var w=class{constructor(e){this.token=e;}async getToken(){return this.token?.trim()?this.token:null}};var C=class{constructor(){this.store=new Map;}async get(e){let t=this.store.get(e);return t?t.expiresAt!==void 0&&Date.now()>t.expiresAt?(this.store.delete(e),null):t.value:null}async set(e,t,o){let n=o&&o>0?Date.now()+o:void 0;this.store.set(e,{value:t,expiresAt:n});}async delete(e){this.store.delete(e);}async clear(){this.store.clear();}};var s=class extends Error{constructor(t,o){super(t);this.metadata=o;this.name="LocalizationError";}},E=class extends s{constructor(e="Authentication failed",t){super(e,t),this.name="LocalizationAuthError";}},T=class extends s{constructor(e="Resource not found",t){super(e,t),this.name="ResourceNotFoundError";}},R=class extends s{constructor(e="Localization server error",t){super(e,t),this.name="LocalizationServerError";}},b=class extends s{constructor(e="Network error while contacting localization API",t){super(e,t),this.name="LocalizationNetworkError";}},z=class extends s{constructor(e="Localization request timeout",t){super(e,t),this.name="LocalizationTimeoutError";}};var P=class extends Error{constructor(t,o,n){super(`Request failed with status ${t}`);this.statusCode=t;this.responseBody=o;this.responseHeaders=n;this.name="HttpStatusError";}},x=class extends Error{constructor(t){super(`Request timed out after ${t}ms`);this.timeoutMs=t;this.name="HttpTimeoutError";}},f=class extends Error{constructor(t){super("Network error while sending request");this.causeError=t;this.name="HttpNetworkError";}},A=class{constructor(e){this.options=e;this.fetchFn=e.fetchFn??fetch;}async request(e){let t=e.timeoutMs??this.options.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t),i=new Request(this.resolveUrl(e),{method:e.method,headers:{"Content-Type":"application/json",...this.options.defaultHeaders,...e.headers},body:e.body===void 0?void 0:JSON.stringify(e.body),signal:o.signal});try{let l=await this.runRequestMiddleware(i),c;try{c=await this.fetchFn(l);}catch(g){throw this.isAbortError(g)?new x(t):new f(g)}let p=await this.runResponseMiddleware(c);if(!p.ok){let g=await p.text();throw new P(p.status,g,p.headers)}let m=await this.parseResponse(p);return {status:p.status,headers:p.headers,data:m}}catch(l){throw await this.runErrorMiddleware(this.toError(l)),l}finally{clearTimeout(n);}}resolveUrl(e){let t=new URL(e.path,this.options.baseUrl);return e.query&&Object.entries(e.query).forEach(([o,n])=>{n!==void 0&&t.searchParams.set(o,String(n));}),t.toString()}async runRequestMiddleware(e){let t=e;for(let o of this.options.middleware??[])o.onRequest&&(t=await o.onRequest(t));return t}async runResponseMiddleware(e){let t=e;for(let o of this.options.middleware??[])o.onResponse&&(t=await o.onResponse(t));return t}async runErrorMiddleware(e){for(let t of this.options.middleware??[])t.onError&&await t.onError(e);}async parseResponse(e){return e.status===204?null:(e.headers.get("content-type")??"").includes("application/json")?await e.json():await e.text()}toError(e){return e instanceof Error?e:new Error("Unknown request error")}isAbortError(e){return e instanceof DOMException&&e.name==="AbortError"}};var te="localization:listResources",H=class{constructor(e,t,o){this.cacheProvider=e;this.cacheTtlMs=t;this.logger=o;}async getListResources(){this.logger.debug(`listResources:start cacheEnabled=${!!this.cacheProvider}`);let e=await this.cacheProvider?.get(te);return e?this.logger.info(`listResources:cache-hit count=${e.length}`):this.logger.debug("listResources:cache-miss"),e}async storeListResources(e){await this.cacheProvider?.set(te,e,this.cacheTtlMs),this.logger.debug(`listResources:cache-store ttlMs=${this.cacheTtlMs??0} count=${e.length}`);}async invalidate(e){if(this.logger.debug(`invalidateCache:start scope=${e??"all"}`),!this.cacheProvider){this.logger.debug("invalidateCache:skipped no-cache-provider");return}if(e){await this.cacheProvider.delete(e),this.logger.info(`invalidateCache:deleted key=${e}`);return}await this.cacheProvider.clear(),this.logger.info("invalidateCache:cleared-all");}};var k=class{constructor(e){this.logger=e;}async run(e,t){try{return await t()}catch(o){let n=this.map(o);throw this.logger.errorForOperation(e,n,o),n}}validateRequired(e,t){if(!e?.trim())throw new s(`${t} is required`)}map(e){return e instanceof s?e:e instanceof x?new z(e.message):e instanceof f?new b(e.message):e instanceof P?this.mapStatusError(e):new s("Unexpected localization SDK error")}preserveCause(e){let t=this.map(e);return t.cause??(t.cause=e),t}mapStatusError(e){return e.statusCode===401||e.statusCode===403?new E("Invalid token for localization endpoint",{statusCode:e.statusCode}):e.statusCode===404?new T("Localization resource was not found",{statusCode:e.statusCode}):e.statusCode>=500?new R("Localization API is unavailable",{statusCode:e.statusCode}):new s(e.message,{statusCode:e.statusCode})}};var pe="[LocalizationSdk]",I=class{constructor(e=false){this.enabled=e;}debug(e){this.write("debug",e);}info(e){this.write("info",e);}errorForOperation(e,t,o){this.write("error",`${e}:error ${this.formatErrorDetails(t,o)}`);}formatErrorDetails(e,t){let o=this.getOriginalCause(e,t),n=this.getErrorMessage(o),i=[`type=${e.name}`,`message=${e.message}`];return n&&n!==e.message&&i.push(`original=${n}`),e instanceof s&&e.metadata?.statusCode&&i.push(`statusCode=${e.metadata.statusCode}`),i.join(" ")}getOriginalCause(e,t){let n=e.cause??t;return n instanceof f?n.causeError:n}getErrorMessage(e){return e instanceof Error?e.message:typeof e=="string"?e:"unknown-error"}write(e,t){if(!this.enabled)return;let o=`${pe} ${t}`;switch(e){case "debug":console.debug(o);break;case "info":console.info(o);break;case "error":console.error(o);break}}};var M=class{constructor(e){this.dependencies=e;this.logger=new I(e.enableLogs),this.cacheHelper=new H(e.cacheProvider,e.cacheTtlMs,this.logger),this.errorHandler=new k(this.logger);}async getCurrentLanguage(e){return this.errorHandler.run("getCurrentLanguage",async()=>{this.errorHandler.validateRequired(e,"resourceKey"),this.logger.debug(`getCurrentLanguage:start resourceKey=${e}`);let t=await this.send({method:"GET",path:"api/localization/client/currentlanguage",query:{resourceKey:e}});return this.logger.info(`getCurrentLanguage:success resourceKey=${e} hasValue=${!!t}`),t??""})}async getByLanguage(e,t){return this.errorHandler.run("getByLanguage",async()=>{this.errorHandler.validateRequired(e,"resourceKey"),this.errorHandler.validateRequired(t,"languageKey"),this.logger.debug(`getByLanguage:start resourceKey=${e} languageKey=${t}`);let o=await this.send({method:"GET",path:"api/localization/client/bylanguage",query:{resourceKey:e,languageKey:t}});return this.logger.info(`getByLanguage:success resourceKey=${e} languageKey=${t} hasValue=${!!o}`),o??""})}async listResources(){return this.errorHandler.run("listResources",async()=>{let e=await this.cacheHelper.getListResources();if(e)return e;let o=(await this.send({method:"GET",path:"api/localization/client/list"})??[]).map(n=>({key:n.resourceKey,value:n.value,language:n.languageKey}));return await this.cacheHelper.storeListResources(o),this.logger.info(`listResources:success count=${o.length}`),o})}async invalidateCache(e){return this.errorHandler.run("invalidateCache",async()=>this.cacheHelper.invalidate(e))}async send(e){try{let t=await this.dependencies.authProvider?.getToken(),o=t?{...e.headers,"X-Auth-Token":t}:e.headers;this.logger.debug(`request:start method=${e.method} path=${e.path} hasAuth=${!!t}`);let n=await this.dependencies.httpTransport.request({...e,headers:o});return this.logger.debug(`request:success method=${e.method} path=${e.path} status=${n.status}`),n.data}catch(t){throw this.errorHandler.preserveCause(t)}}};function _(r){he(r);let t=r.cache?.enabled??false?r.cache?.provider??new C:void 0,o=new A({baseUrl:r.baseUrl,fetchFn:r.fetchFn,timeoutMs:r.timeoutMs??1e4,defaultHeaders:r.headers,middleware:r.middleware});return new M({httpTransport:o,authProvider:r.authProvider??(r.token?new w(r.token):void 0),cacheProvider:t,cacheTtlMs:r.cache?.ttlMs,enableLogs:r.enableLogs??false})}function he(r){if(!r?.baseUrl?.trim())throw new s("baseUrl is required to create localization client")}var B=new InjectionToken("LOCALIZATION_SDK_OPTIONS"),O=new InjectionToken("LOCALIZATION_CLIENT");function me(r){return makeEnvironmentProviders([{provide:B,useValue:r},{provide:O,useFactory:()=>_(r)}])}var oe,U;oe=[Injectable({providedIn:"root"})];var v=class{constructor(){this.client=inject(O);}getCurrentLanguage(e){return from(this.client.getCurrentLanguage(e))}getByLanguage(e,t){return from(this.client.getByLanguage(e,t))}listResources(){return from(this.client.listResources())}invalidateCache(e){return from(this.client.invalidateCache(e))}};U=J(),v=ee(U,0,"LocalizationService",oe,v),Q(U,1,v);export{A as FetchHttpTransport,O as LOCALIZATION_CLIENT,B as LOCALIZATION_SDK_OPTIONS,E as LocalizationAuthError,s as LocalizationError,b as LocalizationNetworkError,R as LocalizationServerError,v as LocalizationService,z as LocalizationTimeoutError,C as MemoryCacheProvider,T as ResourceNotFoundError,w as XAuthTokenProvider,_ as createLocalizationClient,me as provideLocalization};
|