@belocal/js-sdk 0.1.11 → 0.2.0
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 +12 -9
- package/dist/browser.cjs +2 -2
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.ts +3 -0
- package/dist/browser.mjs +2 -2
- package/dist/browser.mjs.map +1 -1
- package/package.json +11 -5
package/README.md
CHANGED
|
@@ -31,15 +31,6 @@ const engine = new BelocalEngine({
|
|
|
31
31
|
});
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
### Translation with Context
|
|
35
|
-
```javascript
|
|
36
|
-
const translated = await engine.t(
|
|
37
|
-
'Hello María!',
|
|
38
|
-
'es'
|
|
39
|
-
);
|
|
40
|
-
console.log(translated); // "¡Hola María!"
|
|
41
|
-
```
|
|
42
|
-
|
|
43
34
|
## Automatic Environment Detection
|
|
44
35
|
|
|
45
36
|
The SDK uses conditional exports to automatically load the optimal build:
|
|
@@ -72,6 +63,18 @@ const options: BelocalEngineOptions = {
|
|
|
72
63
|
const engine = new BelocalEngine(options);
|
|
73
64
|
```
|
|
74
65
|
|
|
66
|
+
## Development
|
|
67
|
+
|
|
68
|
+
### Testing
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Run all tests
|
|
72
|
+
npm test
|
|
73
|
+
|
|
74
|
+
# Run tests in watch mode
|
|
75
|
+
npm run test:watch
|
|
76
|
+
```
|
|
77
|
+
|
|
75
78
|
## License
|
|
76
79
|
|
|
77
80
|
MIT
|
package/dist/browser.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
'use strict';function
|
|
2
|
-
exports.BelocalEngine=
|
|
1
|
+
'use strict';var jsMd5=require('js-md5');function h(r){return async({text:e,lang:t,ctx:s})=>{let a=`${r.baseUrl}${r.path}`,o=new AbortController,i=r.timeoutMs?setTimeout(()=>o.abort(),r.timeoutMs):null;r.debug&&console.log(`[BeLocal Browser Transport] Translating "${e}" to ${t} with url ${a}`);try{let n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",...r.headers},body:JSON.stringify({text:e,lang:t,ctx:s}),signal:o.signal});if(!n.ok){let g=`HTTP ${n.status}: ${n.statusText}`;throw r.debug&&console.error("[BeLocal Browser Transport] Request failed:",g),new Error(g)}let l=await n.json();return r.debug&&console.log(`[BeLocal Browser Transport] Translation successful: "${l.text||e}"`),l.text||e}finally{i&&clearTimeout(i);}}}var c=class{constructor(e="belocal_"){this.prefix=e;}get(e){try{return localStorage.getItem(this.prefix+e)}catch{return null}}set(e,t){try{localStorage.setItem(this.prefix+e,t);}catch{}}isAvailable(){try{let e=this.prefix+"__test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}};var p=class{constructor(){this.storage=new Map;}get(e){return this.storage.get(e)||null}set(e,t){this.storage.set(e,t);}isAvailable(){return true}};var u=class{constructor(e){let{apiKey:t,baseUrl:s="https://dynamic.belocal.dev",path:a="/v1/translate",timeoutMs:o=1e4,debug:i=false}=e;this.debug=i;let n=new c("belocal_translations_");n.isAvailable()?this.cache=n:this.cache=new p,this.isCacheAvailable=this.cache.isAvailable();let l={Authorization:`Bearer ${t}`};this.transport=h({baseUrl:s,path:a,headers:l,timeoutMs:o,debug:this.debug}),this.debug&&(console.log("[BeLocal Engine] Browser transport created with config:",{baseUrl:s,path:a,timeoutMs:o}),console.log("[BeLocal Engine] Cache available:",this.isCacheAvailable));}async t(e,t,s){let a=this.generateCacheKey(e,t,s);if(this.isCacheAvailable){let i=this.cache.get(a);if(i)return this.debug&&console.log("[BeLocal Engine] Cache hit for:",e),i}let o=await this.transport({text:e,lang:t,ctx:s});return this.isCacheAvailable&&(this.cache.set(a,o),this.debug&&console.log("[BeLocal Engine] Cached translation for:",e)),o}generateCacheKey(e,t,s){return jsMd5.md5(JSON.stringify({text:e,lang:t,ctx:s||null}))}};
|
|
2
|
+
exports.BelocalEngine=u;exports.createBrowserTransport=h;//# sourceMappingURL=browser.cjs.map
|
|
3
3
|
//# sourceMappingURL=browser.cjs.map
|
package/dist/browser.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transports/browser.ts","../src/core/engine/browser.ts"],"names":["createBrowserTransport","config","text","lang","ctx","url","controller","timeoutId","response","errorMsg","result","BelocalEngine","options","apiKey","baseUrl","path","timeoutMs","debug","authHeaders"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/transports/browser.ts","../src/cache/localStorage.ts","../src/cache/local.ts","../src/core/engine/browser.ts"],"names":["createBrowserTransport","config","text","lang","ctx","url","controller","timeoutId","response","errorMsg","result","LocalStorageCache","prefix","key","value","testKey","LocalCache","BelocalEngine","options","apiKey","baseUrl","path","timeoutMs","debug","localStorageCache","authHeaders","cacheKey","cachedResult","md5"],"mappings":"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","file":"browser.cjs","sourcesContent":["import type { Transport } from '../core/types';\n\nexport interface BrowserTransportConfig {\n baseUrl: string;\n path?: string;\n headers?: Record<string, string>;\n timeoutMs?: number;\n debug?: boolean;\n}\n\nexport function createBrowserTransport(config: BrowserTransportConfig): Transport {\n return async ({ text, lang, ctx }) => {\n const url = `${config.baseUrl}${config.path}`;\n const controller = new AbortController();\n const timeoutId = config.timeoutMs ? setTimeout(() => controller.abort(), config.timeoutMs) : null;\n\n if (config.debug) {\n console.log(`[BeLocal Browser Transport] Translating \"${text}\" to ${lang} with url ${url}`);\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers,\n },\n body: JSON.stringify({ text, lang, ctx }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorMsg = `HTTP ${response.status}: ${response.statusText}`;\n if (config.debug) {\n console.error(`[BeLocal Browser Transport] Request failed:`, errorMsg);\n }\n throw new Error(errorMsg);\n }\n\n const result = await response.json();\n if (config.debug) {\n console.log(`[BeLocal Browser Transport] Translation successful: \"${result.text || text}\"`);\n }\n return result.text || text;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n };\n}","import type { Cache } from './types';\n\nexport class LocalStorageCache implements Cache {\n private prefix: string;\n\n constructor(prefix: string = 'belocal_') {\n this.prefix = prefix;\n }\n\n get(key: string): string | null {\n try {\n return localStorage.getItem(this.prefix + key);\n } catch {\n // localStorage might not be available in some environments\n return null;\n }\n }\n\n set(key: string, value: string): void {\n try {\n localStorage.setItem(this.prefix + key, value);\n } catch {\n // localStorage might not be available or quota exceeded\n // Silently fail\n }\n }\n\n isAvailable(): boolean {\n try {\n const testKey = this.prefix + '__test__';\n localStorage.setItem(testKey, 'test');\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { Cache } from './types';\n\nexport class LocalCache implements Cache {\n private storage = new Map<string, string>();\n\n get(key: string): string | null {\n return this.storage.get(key) || null;\n }\n\n set(key: string, value: string): void {\n this.storage.set(key, value);\n }\n\n isAvailable(): boolean {\n return true;\n }\n}\n","import type { BelocalEngineOptions, KV, Lang, Transport } from '../types';\nimport { createBrowserTransport } from '../../transports/browser';\nimport { LocalStorageCache } from '../../cache/localStorage';\nimport { LocalCache } from '../../cache/local';\nimport type { Cache } from '../../cache/types';\nimport { md5 } from 'js-md5';\n\nexport class BelocalEngine {\n private transport: Transport;\n private debug: boolean;\n private cache: Cache;\n private isCacheAvailable: boolean;\n\n constructor(options: BelocalEngineOptions) {\n const {\n apiKey,\n baseUrl = 'https://dynamic.belocal.dev',\n path = '/v1/translate',\n timeoutMs = 10000,\n debug = false\n } = options;\n\n this.debug = debug;\n \n // Try localStorage first, fallback to local cache\n const localStorageCache = new LocalStorageCache('belocal_translations_');\n if (localStorageCache.isAvailable()) {\n this.cache = localStorageCache;\n } else {\n this.cache = new LocalCache();\n }\n this.isCacheAvailable = this.cache.isAvailable();\n\n const authHeaders = {\n 'Authorization': `Bearer ${apiKey}`\n };\n\n this.transport = createBrowserTransport({\n baseUrl,\n path,\n headers: authHeaders,\n timeoutMs,\n debug: this.debug\n });\n\n if (this.debug) {\n console.log('[BeLocal Engine] Browser transport created with config:', {\n baseUrl,\n path,\n timeoutMs\n });\n console.log('[BeLocal Engine] Cache available:', this.isCacheAvailable);\n }\n }\n\n async t(text: string, lang: Lang, ctx?: KV): Promise<string> {\n // Generate cache key from parameters\n const cacheKey = this.generateCacheKey(text, lang, ctx);\n \n // Try to get from cache first\n if (this.isCacheAvailable) {\n const cachedResult = this.cache.get(cacheKey);\n if (cachedResult) {\n if (this.debug) {\n console.log('[BeLocal Engine] Cache hit for:', text);\n }\n return cachedResult;\n }\n }\n\n // Cache miss, get translation from transport\n const result = await this.transport({ text, lang, ctx });\n \n // Store in cache\n if (this.isCacheAvailable) {\n this.cache.set(cacheKey, result);\n if (this.debug) {\n console.log('[BeLocal Engine] Cached translation for:', text);\n }\n }\n\n return result;\n }\n\n private generateCacheKey(text: string, lang: Lang, ctx?: KV): string {\n const data = {\n text,\n lang,\n ctx: ctx || null\n };\n return md5(JSON.stringify(data));\n }\n}\n\n// Re-export types and transport\nexport type { BelocalEngineOptions, Lang, KV } from '../types';\nexport { createBrowserTransport } from '../../transports/browser';\n"]}
|
package/dist/browser.d.ts
CHANGED
|
@@ -26,8 +26,11 @@ declare function createBrowserTransport(config: BrowserTransportConfig): Transpo
|
|
|
26
26
|
declare class BelocalEngine {
|
|
27
27
|
private transport;
|
|
28
28
|
private debug;
|
|
29
|
+
private cache;
|
|
30
|
+
private isCacheAvailable;
|
|
29
31
|
constructor(options: BelocalEngineOptions);
|
|
30
32
|
t(text: string, lang: Lang, ctx?: KV): Promise<string>;
|
|
33
|
+
private generateCacheKey;
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
export { BelocalEngine, type BelocalEngineOptions, type KV, type Lang, createBrowserTransport };
|
package/dist/browser.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
function
|
|
2
|
-
export{
|
|
1
|
+
import {md5}from'js-md5';function h(r){return async({text:e,lang:t,ctx:s})=>{let a=`${r.baseUrl}${r.path}`,o=new AbortController,i=r.timeoutMs?setTimeout(()=>o.abort(),r.timeoutMs):null;r.debug&&console.log(`[BeLocal Browser Transport] Translating "${e}" to ${t} with url ${a}`);try{let n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",...r.headers},body:JSON.stringify({text:e,lang:t,ctx:s}),signal:o.signal});if(!n.ok){let g=`HTTP ${n.status}: ${n.statusText}`;throw r.debug&&console.error("[BeLocal Browser Transport] Request failed:",g),new Error(g)}let l=await n.json();return r.debug&&console.log(`[BeLocal Browser Transport] Translation successful: "${l.text||e}"`),l.text||e}finally{i&&clearTimeout(i);}}}var c=class{constructor(e="belocal_"){this.prefix=e;}get(e){try{return localStorage.getItem(this.prefix+e)}catch{return null}}set(e,t){try{localStorage.setItem(this.prefix+e,t);}catch{}}isAvailable(){try{let e=this.prefix+"__test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}};var p=class{constructor(){this.storage=new Map;}get(e){return this.storage.get(e)||null}set(e,t){this.storage.set(e,t);}isAvailable(){return true}};var u=class{constructor(e){let{apiKey:t,baseUrl:s="https://dynamic.belocal.dev",path:a="/v1/translate",timeoutMs:o=1e4,debug:i=false}=e;this.debug=i;let n=new c("belocal_translations_");n.isAvailable()?this.cache=n:this.cache=new p,this.isCacheAvailable=this.cache.isAvailable();let l={Authorization:`Bearer ${t}`};this.transport=h({baseUrl:s,path:a,headers:l,timeoutMs:o,debug:this.debug}),this.debug&&(console.log("[BeLocal Engine] Browser transport created with config:",{baseUrl:s,path:a,timeoutMs:o}),console.log("[BeLocal Engine] Cache available:",this.isCacheAvailable));}async t(e,t,s){let a=this.generateCacheKey(e,t,s);if(this.isCacheAvailable){let i=this.cache.get(a);if(i)return this.debug&&console.log("[BeLocal Engine] Cache hit for:",e),i}let o=await this.transport({text:e,lang:t,ctx:s});return this.isCacheAvailable&&(this.cache.set(a,o),this.debug&&console.log("[BeLocal Engine] Cached translation for:",e)),o}generateCacheKey(e,t,s){return md5(JSON.stringify({text:e,lang:t,ctx:s||null}))}};
|
|
2
|
+
export{u as BelocalEngine,h as createBrowserTransport};//# sourceMappingURL=browser.mjs.map
|
|
3
3
|
//# sourceMappingURL=browser.mjs.map
|
package/dist/browser.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transports/browser.ts","../src/core/engine/browser.ts"],"names":["createBrowserTransport","config","text","lang","ctx","url","controller","timeoutId","response","errorMsg","result","BelocalEngine","options","apiKey","baseUrl","path","timeoutMs","debug","authHeaders"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/transports/browser.ts","../src/cache/localStorage.ts","../src/cache/local.ts","../src/core/engine/browser.ts"],"names":["createBrowserTransport","config","text","lang","ctx","url","controller","timeoutId","response","errorMsg","result","LocalStorageCache","prefix","key","value","testKey","LocalCache","BelocalEngine","options","apiKey","baseUrl","path","timeoutMs","debug","localStorageCache","authHeaders","cacheKey","cachedResult","md5"],"mappings":"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","file":"browser.mjs","sourcesContent":["import type { Transport } from '../core/types';\n\nexport interface BrowserTransportConfig {\n baseUrl: string;\n path?: string;\n headers?: Record<string, string>;\n timeoutMs?: number;\n debug?: boolean;\n}\n\nexport function createBrowserTransport(config: BrowserTransportConfig): Transport {\n return async ({ text, lang, ctx }) => {\n const url = `${config.baseUrl}${config.path}`;\n const controller = new AbortController();\n const timeoutId = config.timeoutMs ? setTimeout(() => controller.abort(), config.timeoutMs) : null;\n\n if (config.debug) {\n console.log(`[BeLocal Browser Transport] Translating \"${text}\" to ${lang} with url ${url}`);\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers,\n },\n body: JSON.stringify({ text, lang, ctx }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorMsg = `HTTP ${response.status}: ${response.statusText}`;\n if (config.debug) {\n console.error(`[BeLocal Browser Transport] Request failed:`, errorMsg);\n }\n throw new Error(errorMsg);\n }\n\n const result = await response.json();\n if (config.debug) {\n console.log(`[BeLocal Browser Transport] Translation successful: \"${result.text || text}\"`);\n }\n return result.text || text;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n };\n}","import type { Cache } from './types';\n\nexport class LocalStorageCache implements Cache {\n private prefix: string;\n\n constructor(prefix: string = 'belocal_') {\n this.prefix = prefix;\n }\n\n get(key: string): string | null {\n try {\n return localStorage.getItem(this.prefix + key);\n } catch {\n // localStorage might not be available in some environments\n return null;\n }\n }\n\n set(key: string, value: string): void {\n try {\n localStorage.setItem(this.prefix + key, value);\n } catch {\n // localStorage might not be available or quota exceeded\n // Silently fail\n }\n }\n\n isAvailable(): boolean {\n try {\n const testKey = this.prefix + '__test__';\n localStorage.setItem(testKey, 'test');\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { Cache } from './types';\n\nexport class LocalCache implements Cache {\n private storage = new Map<string, string>();\n\n get(key: string): string | null {\n return this.storage.get(key) || null;\n }\n\n set(key: string, value: string): void {\n this.storage.set(key, value);\n }\n\n isAvailable(): boolean {\n return true;\n }\n}\n","import type { BelocalEngineOptions, KV, Lang, Transport } from '../types';\nimport { createBrowserTransport } from '../../transports/browser';\nimport { LocalStorageCache } from '../../cache/localStorage';\nimport { LocalCache } from '../../cache/local';\nimport type { Cache } from '../../cache/types';\nimport { md5 } from 'js-md5';\n\nexport class BelocalEngine {\n private transport: Transport;\n private debug: boolean;\n private cache: Cache;\n private isCacheAvailable: boolean;\n\n constructor(options: BelocalEngineOptions) {\n const {\n apiKey,\n baseUrl = 'https://dynamic.belocal.dev',\n path = '/v1/translate',\n timeoutMs = 10000,\n debug = false\n } = options;\n\n this.debug = debug;\n \n // Try localStorage first, fallback to local cache\n const localStorageCache = new LocalStorageCache('belocal_translations_');\n if (localStorageCache.isAvailable()) {\n this.cache = localStorageCache;\n } else {\n this.cache = new LocalCache();\n }\n this.isCacheAvailable = this.cache.isAvailable();\n\n const authHeaders = {\n 'Authorization': `Bearer ${apiKey}`\n };\n\n this.transport = createBrowserTransport({\n baseUrl,\n path,\n headers: authHeaders,\n timeoutMs,\n debug: this.debug\n });\n\n if (this.debug) {\n console.log('[BeLocal Engine] Browser transport created with config:', {\n baseUrl,\n path,\n timeoutMs\n });\n console.log('[BeLocal Engine] Cache available:', this.isCacheAvailable);\n }\n }\n\n async t(text: string, lang: Lang, ctx?: KV): Promise<string> {\n // Generate cache key from parameters\n const cacheKey = this.generateCacheKey(text, lang, ctx);\n \n // Try to get from cache first\n if (this.isCacheAvailable) {\n const cachedResult = this.cache.get(cacheKey);\n if (cachedResult) {\n if (this.debug) {\n console.log('[BeLocal Engine] Cache hit for:', text);\n }\n return cachedResult;\n }\n }\n\n // Cache miss, get translation from transport\n const result = await this.transport({ text, lang, ctx });\n \n // Store in cache\n if (this.isCacheAvailable) {\n this.cache.set(cacheKey, result);\n if (this.debug) {\n console.log('[BeLocal Engine] Cached translation for:', text);\n }\n }\n\n return result;\n }\n\n private generateCacheKey(text: string, lang: Lang, ctx?: KV): string {\n const data = {\n text,\n lang,\n ctx: ctx || null\n };\n return md5(JSON.stringify(data));\n }\n}\n\n// Re-export types and transport\nexport type { BelocalEngineOptions, Lang, KV } from '../types';\nexport { createBrowserTransport } from '../../transports/browser';\n"]}
|
package/package.json
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@belocal/js-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "BeLocal runtime JS SDK for on-demand translation (browser + node)",
|
|
5
5
|
"scripts": {
|
|
6
|
-
"test": "
|
|
6
|
+
"test": "vitest run",
|
|
7
|
+
"test:watch": "vitest",
|
|
7
8
|
"build": "tsup",
|
|
8
9
|
"clean": "rimraf dist",
|
|
9
10
|
"dev": "tsup --watch",
|
|
10
11
|
"typecheck": "tsc --noEmit",
|
|
11
12
|
"prepare": "npm run build",
|
|
12
|
-
"prepublishOnly": "npm run build"
|
|
13
|
+
"prepublishOnly": "npm run test && npm run build"
|
|
13
14
|
},
|
|
14
15
|
"repository": {
|
|
15
16
|
"type": "git",
|
|
@@ -24,9 +25,12 @@
|
|
|
24
25
|
},
|
|
25
26
|
"homepage": "https://gitlab.com/digitalwinddev/belocal/sdk/js#readme",
|
|
26
27
|
"devDependencies": {
|
|
28
|
+
"@types/js-md5": "^0.8.0",
|
|
27
29
|
"@types/node": "^24.5.2",
|
|
30
|
+
"jsdom": "^27.0.0",
|
|
28
31
|
"tsup": "^8.5.0",
|
|
29
|
-
"typescript": "^5.9.2"
|
|
32
|
+
"typescript": "^5.9.2",
|
|
33
|
+
"vitest": "^3.2.4"
|
|
30
34
|
},
|
|
31
35
|
"main": "./dist/index.cjs",
|
|
32
36
|
"module": "./dist/index.mjs",
|
|
@@ -55,5 +59,7 @@
|
|
|
55
59
|
"README.md",
|
|
56
60
|
"LICENSE"
|
|
57
61
|
],
|
|
58
|
-
"dependencies": {
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"js-md5": "^0.8.3"
|
|
64
|
+
}
|
|
59
65
|
}
|