@sveltekit-i18n/base 1.3.3 → 1.3.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.
package/README.md CHANGED
@@ -85,14 +85,13 @@ export const { t, locale, locales, loading, loadTranslations } = new i18n(config
85
85
  ...load your translations in `+layout.js`...
86
86
 
87
87
  ```js
88
- import { locale, loadTranslations } from '$lib/translations';
88
+ import { loadTranslations } from '$lib/translations';
89
89
 
90
+ /** @type {import('@sveltejs/kit').Load} */
90
91
  export const load = async ({ url }) => {
91
92
  const { pathname } = url;
92
93
 
93
- const defaultLocale = 'en'; // get from cookie, user session, ...
94
-
95
- const initLocale = locale.get() || defaultLocale; // set default if no locale already set
94
+ const initLocale = 'en'; // get from cookie, user session, ...
96
95
 
97
96
  await loadTranslations(initLocale, pathname); // keep this just before the `return`
98
97
 
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var H=Object.defineProperty,q=Object.defineProperties;var B=Object.getOwnPropertyDescriptors;var S=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,A=Object.prototype.propertyIsEnumerable;var $=(s,t,e)=>t in s?H(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e,n=(s,t)=>{for(var e in t||(t={}))j.call(t,e)&&$(s,e,t[e]);if(S)for(var e of S(t))A.call(t,e)&&$(s,e,t[e]);return s},u=(s,t)=>q(s,B(t));var T=(s,t)=>{var e={};for(var a in s)j.call(s,a)&&t.indexOf(a)<0&&(e[a]=s[a]);if(s!=null&&S)for(var a of S(s))t.indexOf(a)<0&&A.call(s,a)&&(e[a]=s[a]);return e};var _store = require('svelte/store');var C=["error","warn","debug"],z=({logger:s=console,level:t=C[1],prefix:e="[i18n]: "})=>C.reduce((a,r,i)=>u(n({},a),{[r]:o=>C.indexOf(t)>=i&&s[r](`${e}${o}`)}),{}),d=z({}),N=s=>{d=s};var F=l=>{var c=l,{parser:s,key:t,params:e,translations:a,locale:r,fallbackLocale:i}=c,o=T(c,["parser","key","params","translations","locale","fallbackLocale"]);if(!t)return d.warn(`No translation key provided ('${r}' locale). Skipping translation...`),"";if(!r)return d.warn(`No locale provided for '${t}' key. Skipping translation...`),"";let f=(a[r]||{})[t];return i&&f===void 0&&(f=(a[i]||{})[t]),o.hasOwnProperty("fallbackValue")&&f===void 0?o.fallbackValue:s.parse(f,e,r,t)},p=(...s)=>s.length?s.filter(t=>!!t).map(t=>{let e=`${t}`.toLowerCase();try{let[a]=Intl.Collator.supportedLocalesOf(t);if(!a)throw new Error;e=a}catch(a){d.warn(`'${t}' locale is non-standard.`)}return e}):[],x=(s,t,e)=>Object.keys(s||{}).reduce((a,r)=>{let i=s[r],o=e?`${e}.${r}`:`${r}`;return t&&Array.isArray(i)?u(n({},a),{[o]:i.map(l=>x(l,t))}):i&&typeof i=="object"?n(n({},a),x(i,t,o)):u(n({},a),{[o]:i})},{}),G=s=>s.reduce((t,{key:e,data:a,locale:r})=>{if(!a)return t;let[i]=p(r),o=u(n({},t[i]||{}),{[e]:a});return u(n({},t),{[i]:o})},{}),V=async s=>{try{let t=await Promise.all(s.map(r=>{var i=r,{loader:e}=i,a=T(i,["loader"]);return new Promise(async o=>{let l;try{l=await e()}catch(c){d.error(`Failed to load translation. Verify your '${a.locale}' > '${a.key}' Loader.`),d.error(c)}o(u(n({loader:e},a),{data:l}))})}));return G(t)}catch(t){d.error(t)}return{}},E=s=>t=>{try{if(typeof t=="string")return t===s;if(typeof t=="object")return t.test(s)}catch(e){d.error("Invalid route config!")}return!1},W=(s,t)=>{let e=!0;try{e=Object.keys(s).filter(a=>s[a]!==void 0).every(a=>s[a]===t[a])}catch(a){}return e};var D=1e3*60*60*24,O= exports.default =class{constructor(t){this.cachedAt=0;this.loadedKeys={};this.currentRoute=_store.writable.call(void 0, );this.config=_store.writable.call(void 0, );this.isLoading=_store.writable.call(void 0, !1);this.promises=new Set;this.loading={subscribe:this.isLoading.subscribe,toPromise:(t,e)=>{let a=Array.from(this.promises).filter(r=>W({locale:p(t)[0],route:e},r)).map(({promise:r})=>r);return Promise.all(a)},get:()=>_store.get.call(void 0, this.isLoading)};this.privateRawTranslations=_store.writable.call(void 0, {});this.rawTranslations={subscribe:this.privateRawTranslations.subscribe,get:()=>_store.get.call(void 0, this.rawTranslations)};this.privateTranslations=_store.writable.call(void 0, {});this.translations={subscribe:this.privateTranslations.subscribe,get:()=>_store.get.call(void 0, this.translations)};this.locales=u(n({},_store.derived.call(void 0, [this.config,this.privateTranslations],([t,e])=>{if(!t)return[];let{loaders:a=[]}=t,r=a.map(({locale:o})=>o),i=Object.keys(e).map(o=>o);return Array.from(new Set([...p(...r),...p(...i)]))},[])),{get:()=>_store.get.call(void 0, this.locales)});this.internalLocale=_store.writable.call(void 0, );this.loaderTrigger=_store.derived.call(void 0, [this.internalLocale,this.currentRoute],([t,e],a)=>{var r,i;t!==void 0&&e!==void 0&&!(t===((r=_store.get.call(void 0, this.loaderTrigger))==null?void 0:r[0])&&e===((i=_store.get.call(void 0, this.loaderTrigger))==null?void 0:i[1]))&&(d.debug("Triggering translation load..."),a([t,e]))},[]);this.localeHelper=_store.writable.call(void 0, );this.locale={subscribe:this.localeHelper.subscribe,forceSet:this.localeHelper.set,set:this.internalLocale.set,update:this.internalLocale.update,get:()=>_store.get.call(void 0, this.locale)};this.initialized=_store.derived.call(void 0, [this.locale,this.currentRoute,this.privateTranslations],([t,e,a],r)=>{_store.get.call(void 0, this.initialized)||r(t!==void 0&&e!==void 0&&!!Object.keys(a).length)});this.translation=_store.derived.call(void 0, [this.privateTranslations,this.locale,this.isLoading],([t,e,a],r)=>{let i=t[e];i&&Object.keys(i).length&&!a&&r(i)},{});this.t=u(n({},_store.derived.call(void 0, [this.config,this.translation],r=>{var[i]=r,o=i,{parser:t,fallbackLocale:e}=o,a=T(o,["parser","fallbackLocale"]);return(l,...c)=>F(n({parser:t,key:l,params:c,translations:this.translations.get(),locale:this.locale.get(),fallbackLocale:e},a.hasOwnProperty("fallbackValue")?{fallbackValue:a.fallbackValue}:{}))})),{get:(t,...e)=>_store.get.call(void 0, this.t)(t,...e)});this.l=u(n({},_store.derived.call(void 0, [this.config,this.translations],i=>{var[o,...l]=i,c=o,{parser:t,fallbackLocale:e}=c,a=T(c,["parser","fallbackLocale"]),[r]=l;return(f,b,...R)=>F(n({parser:t,key:b,params:R,translations:r,locale:f,fallbackLocale:e},a.hasOwnProperty("fallbackValue")?{fallbackValue:a.fallbackValue}:{}))})),{get:(t,e,...a)=>_store.get.call(void 0, this.l)(t,e,...a)});this.getLocale=t=>{let{fallbackLocale:e=""}=_store.get.call(void 0, this.config)||{},a=t||e;if(!a)return"";let r=this.locales.get();return r.find(o=>p(a).includes(o))||r.find(o=>p(e).includes(o))||""};this.setLocale=t=>{if(t&&t!==_store.get.call(void 0, this.internalLocale))return d.debug(`Setting '${t}' locale.`),this.internalLocale.set(t),this.loading.toPromise(t,_store.get.call(void 0, this.currentRoute))};this.setRoute=t=>{if(t!==_store.get.call(void 0, this.currentRoute)){d.debug(`Setting '${t}' route.`),this.currentRoute.set(t);let e=_store.get.call(void 0, this.internalLocale);return this.loading.toPromise(e,t)}};this.loadConfig=async t=>{await this.configLoader(t)};this.getTranslationProps=async(t=this.locale.get(),e=_store.get.call(void 0, this.currentRoute))=>{let a=_store.get.call(void 0, this.config);if(!a||!t)return[];let r=this.translations.get(),{loaders:i,fallbackLocale:o="",cache:l=D}=a||{},c=Number.isNaN(+l)?D:+l;this.cachedAt?Date.now()>c+this.cachedAt&&(d.debug("Refreshing cache."),this.loadedKeys={},this.cachedAt=0):(d.debug("Setting cache timestamp."),this.cachedAt=Date.now());let[f,b]=p(t,o),R=r[f],I=r[b],k=(i||[]).map(K=>{var L=K,{locale:h}=L,y=T(L,["locale"]);return u(n({},y),{locale:p(h)[0]})}).filter(({routes:h})=>!h||(h||[]).some(E(e))).filter(({key:h,locale:y})=>y===f&&(!R||!(this.loadedKeys[f]||[]).includes(h))||o&&y===b&&(!I||!(this.loadedKeys[b]||[]).includes(h)));if(k.length){this.isLoading.set(!0),d.debug("Fetching translations...");let h=await V(k);this.isLoading.set(!1);let y=Object.keys(h).reduce((L,P)=>u(n({},L),{[P]:Object.keys(h[P])}),{}),K=k.filter(({key:L,locale:P})=>(y[P]||[]).some(w=>`${w}`.startsWith(L))).reduce((L,{key:P,locale:w})=>u(n({},L),{[w]:[...L[w]||[],P]}),{});return[h,K]}return[]};this.addTranslations=(t,e)=>{if(!t)return;let a=_store.get.call(void 0, this.config),{preprocess:r}=a||{};d.debug("Adding translations...");let i=Object.keys(t||{});this.privateRawTranslations.update(o=>i.reduce((l,c)=>u(n({},l),{[c]:n(n({},l[c]||{}),t[c])}),o)),this.privateTranslations.update(o=>i.reduce((l,c)=>{let f=!0,b=t[c];return typeof r=="function"&&(b=r(b)),(typeof r=="function"||r==="none")&&(f=!1),u(n({},l),{[c]:n(n({},l[c]||{}),f?x(b,r==="preserveArrays"):b)})},o)),i.forEach(o=>{let l=Object.keys(t[o]).map(c=>`${c}`.split(".")[0]);e&&(l=e[o]),this.loadedKeys[o]=Array.from(new Set([...this.loadedKeys[o]||[],...l||[]]))})};this.loader=async([t,e])=>{let a=this.getLocale(t)||void 0;d.debug(`Adding loader promise for '${a}' locale and '${e}' route.`);let r=(async()=>{let i=await this.getTranslationProps(a,e);i.length&&this.addTranslations(...i)})();this.promises.add({locale:a,route:e,promise:r}),r.then(()=>{a&&this.locale.get()!==a&&this.locale.forceSet(a)})};this.loadTranslations=(t,e=_store.get.call(void 0, this.currentRoute)||"")=>{let a=this.getLocale(t);if(a)return this.setRoute(e),this.setLocale(a),this.loading.toPromise(a,e)};this.loaderTrigger.subscribe(this.loader),this.isLoading.subscribe(async e=>{e&&this.promises.size&&(await this.loading.toPromise(),this.promises.clear(),d.debug("Loader promises have been purged."))}),t&&this.loadConfig(t)}async configLoader(t){if(!t)return d.error("No config provided!");let l=t,{initLocale:e,fallbackLocale:a,translations:r,log:i}=l,o=T(l,["initLocale","fallbackLocale","translations","log"]);i&&N(z(i)),[e]=p(e),[a]=p(a),d.debug("Setting config."),this.config.set(n({initLocale:e,fallbackLocale:a,translations:r},o)),r&&this.addTranslations(r),await this.loadTranslations(e)}};exports.default = O;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var H=Object.defineProperty,q=Object.defineProperties;var B=Object.getOwnPropertyDescriptors;var S=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,N=Object.prototype.propertyIsEnumerable;var j=(o,t,e)=>t in o?H(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e,n=(o,t)=>{for(var e in t||(t={}))A.call(t,e)&&j(o,e,t[e]);if(S)for(var e of S(t))N.call(t,e)&&j(o,e,t[e]);return o},u=(o,t)=>q(o,B(t));var T=(o,t)=>{var e={};for(var a in o)A.call(o,a)&&t.indexOf(a)<0&&(e[a]=o[a]);if(o!=null&&S)for(var a of S(o))t.indexOf(a)<0&&N.call(o,a)&&(e[a]=o[a]);return e};var _store = require('svelte/store');var C=["error","warn","debug"],z=({logger:o=console,level:t=C[1],prefix:e="[i18n]: "})=>C.reduce((a,r,s)=>u(n({},a),{[r]:i=>C.indexOf(t)>=s&&o[r](`${e}${i}`)}),{}),d=z({}),V=o=>{d=o};var F=l=>{var c=l,{parser:o,key:t,params:e,translations:a,locale:r,fallbackLocale:s}=c,i=T(c,["parser","key","params","translations","locale","fallbackLocale"]);if(!t)return d.warn(`No translation key provided ('${r}' locale). Skipping translation...`),"";if(!r)return d.warn(`No locale provided for '${t}' key. Skipping translation...`),"";let f=(a[r]||{})[t];return s&&f===void 0&&(f=(a[s]||{})[t]),i.hasOwnProperty("fallbackValue")&&f===void 0?i.fallbackValue:o.parse(f,e,r,t)},h=(...o)=>o.length?o.filter(t=>!!t).map(t=>{let e=`${t}`.toLowerCase();try{let[a]=Intl.Collator.supportedLocalesOf(t);if(!a)throw new Error;e=a}catch(a){d.warn(`'${t}' locale is non-standard.`)}return e}):[],x=(o,t,e)=>Object.keys(o||{}).reduce((a,r)=>{let s=o[r],i=e?`${e}.${r}`:`${r}`;return t&&Array.isArray(s)?u(n({},a),{[i]:s.map(l=>x(l,t))}):s&&typeof s=="object"?n(n({},a),x(s,t,i)):u(n({},a),{[i]:s})},{}),G=o=>o.reduce((t,{key:e,data:a,locale:r})=>{if(!a)return t;let[s]=h(r),i=u(n({},t[s]||{}),{[e]:a});return u(n({},t),{[s]:i})},{}),E=async o=>{try{let t=await Promise.all(o.map(r=>{var s=r,{loader:e}=s,a=T(s,["loader"]);return new Promise(async i=>{let l;try{l=await e()}catch(c){d.error(`Failed to load translation. Verify your '${a.locale}' > '${a.key}' Loader.`),d.error(c)}i(u(n({loader:e},a),{data:l}))})}));return G(t)}catch(t){d.error(t)}return{}},W=o=>t=>{try{if(typeof t=="string")return t===o;if(typeof t=="object")return t.test(o)}catch(e){d.error("Invalid route config!")}return!1},O=(o,t)=>{let e=!0;try{e=Object.keys(o).filter(a=>o[a]!==void 0).every(a=>o[a]===t[a])}catch(a){}return e};var D=1e3*60*60*24,K= exports.default =class{constructor(t){this.cachedAt=0;this.loadedKeys={};this.currentRoute=_store.writable.call(void 0, );this.config=_store.writable.call(void 0, );this.isLoading=_store.writable.call(void 0, !1);this.promises=new Set;this.loading={subscribe:this.isLoading.subscribe,toPromise:(t,e)=>{let{fallbackLocale:a}=_store.get.call(void 0, this.config),r=Array.from(this.promises).filter(s=>{let i=O({locale:h(t)[0],route:e},s);return a&&(i=i||O({locale:h(a)[0],route:e},s)),i}).map(({promise:s})=>s);return Promise.all(r)},get:()=>_store.get.call(void 0, this.isLoading)};this.privateRawTranslations=_store.writable.call(void 0, {});this.rawTranslations={subscribe:this.privateRawTranslations.subscribe,get:()=>_store.get.call(void 0, this.rawTranslations)};this.privateTranslations=_store.writable.call(void 0, {});this.translations={subscribe:this.privateTranslations.subscribe,get:()=>_store.get.call(void 0, this.translations)};this.locales=u(n({},_store.derived.call(void 0, [this.config,this.privateTranslations],([t,e])=>{if(!t)return[];let{loaders:a=[]}=t,r=a.map(({locale:i})=>i),s=Object.keys(e).map(i=>i);return Array.from(new Set([...h(...r),...h(...s)]))},[])),{get:()=>_store.get.call(void 0, this.locales)});this.internalLocale=_store.writable.call(void 0, );this.loaderTrigger=_store.derived.call(void 0, [this.internalLocale,this.currentRoute],([t,e],a)=>{var r,s;t!==void 0&&e!==void 0&&!(t===((r=_store.get.call(void 0, this.loaderTrigger))==null?void 0:r[0])&&e===((s=_store.get.call(void 0, this.loaderTrigger))==null?void 0:s[1]))&&(d.debug("Triggering translation load..."),a([t,e]))},[]);this.localeHelper=_store.writable.call(void 0, );this.locale={subscribe:this.localeHelper.subscribe,forceSet:this.localeHelper.set,set:this.internalLocale.set,update:this.internalLocale.update,get:()=>_store.get.call(void 0, this.locale)};this.initialized=_store.derived.call(void 0, [this.locale,this.currentRoute,this.privateTranslations],([t,e,a],r)=>{_store.get.call(void 0, this.initialized)||r(t!==void 0&&e!==void 0&&!!Object.keys(a).length)});this.translation=_store.derived.call(void 0, [this.privateTranslations,this.locale,this.isLoading],([t,e,a],r)=>{let s=t[e];s&&Object.keys(s).length&&!a&&r(s)},{});this.t=u(n({},_store.derived.call(void 0, [this.config,this.translation],r=>{var[s]=r,i=s,{parser:t,fallbackLocale:e}=i,a=T(i,["parser","fallbackLocale"]);return(l,...c)=>F(n({parser:t,key:l,params:c,translations:this.translations.get(),locale:this.locale.get(),fallbackLocale:e},a.hasOwnProperty("fallbackValue")?{fallbackValue:a.fallbackValue}:{}))})),{get:(t,...e)=>_store.get.call(void 0, this.t)(t,...e)});this.l=u(n({},_store.derived.call(void 0, [this.config,this.translations],s=>{var[i,...l]=s,c=i,{parser:t,fallbackLocale:e}=c,a=T(c,["parser","fallbackLocale"]),[r]=l;return(f,b,...R)=>F(n({parser:t,key:b,params:R,translations:r,locale:f,fallbackLocale:e},a.hasOwnProperty("fallbackValue")?{fallbackValue:a.fallbackValue}:{}))})),{get:(t,e,...a)=>_store.get.call(void 0, this.l)(t,e,...a)});this.getLocale=t=>{let{fallbackLocale:e}=_store.get.call(void 0, this.config)||{},a=t||e;if(!a)return;let r=this.locales.get();return r.find(i=>h(a).includes(i))||r.find(i=>h(e).includes(i))};this.setLocale=t=>{if(t&&t!==_store.get.call(void 0, this.internalLocale))return d.debug(`Setting '${t}' locale.`),this.internalLocale.set(t),this.loading.toPromise(t,_store.get.call(void 0, this.currentRoute))};this.setRoute=t=>{if(t!==_store.get.call(void 0, this.currentRoute)){d.debug(`Setting '${t}' route.`),this.currentRoute.set(t);let e=_store.get.call(void 0, this.internalLocale);return this.loading.toPromise(e,t)}};this.loadConfig=async t=>{await this.configLoader(t)};this.getTranslationProps=async(t=this.locale.get(),e=_store.get.call(void 0, this.currentRoute))=>{let a=_store.get.call(void 0, this.config);if(!a||!t)return[];let r=this.translations.get(),{loaders:s,fallbackLocale:i="",cache:l=D}=a||{},c=Number.isNaN(+l)?D:+l;this.cachedAt?Date.now()>c+this.cachedAt&&(d.debug("Refreshing cache."),this.loadedKeys={},this.cachedAt=0):(d.debug("Setting cache timestamp."),this.cachedAt=Date.now());let[f,b]=h(t,i),R=r[f],I=r[b],k=(s||[]).map($=>{var L=$,{locale:p}=L,y=T(L,["locale"]);return u(n({},y),{locale:h(p)[0]})}).filter(({routes:p})=>!p||(p||[]).some(W(e))).filter(({key:p,locale:y})=>y===f&&(!R||!(this.loadedKeys[f]||[]).includes(p))||i&&y===b&&(!I||!(this.loadedKeys[b]||[]).includes(p)));if(k.length){this.isLoading.set(!0),d.debug("Fetching translations...");let p=await E(k);this.isLoading.set(!1);let y=Object.keys(p).reduce((L,P)=>u(n({},L),{[P]:Object.keys(p[P])}),{}),$=k.filter(({key:L,locale:P})=>(y[P]||[]).some(w=>`${w}`.startsWith(L))).reduce((L,{key:P,locale:w})=>u(n({},L),{[w]:[...L[w]||[],P]}),{});return[p,$]}return[]};this.addTranslations=(t,e)=>{if(!t)return;let a=_store.get.call(void 0, this.config),{preprocess:r}=a||{};d.debug("Adding translations...");let s=Object.keys(t||{});this.privateRawTranslations.update(i=>s.reduce((l,c)=>u(n({},l),{[c]:n(n({},l[c]||{}),t[c])}),i)),this.privateTranslations.update(i=>s.reduce((l,c)=>{let f=!0,b=t[c];return typeof r=="function"&&(b=r(b)),(typeof r=="function"||r==="none")&&(f=!1),u(n({},l),{[c]:n(n({},l[c]||{}),f?x(b,r==="preserveArrays"):b)})},i)),s.forEach(i=>{let l=Object.keys(t[i]).map(c=>`${c}`.split(".")[0]);e&&(l=e[i]),this.loadedKeys[i]=Array.from(new Set([...this.loadedKeys[i]||[],...l||[]]))})};this.loader=async([t,e])=>{let a=this.getLocale(t)||void 0;d.debug(`Adding loader promise for '${a}' locale and '${e}' route.`);let r=(async()=>{let s=await this.getTranslationProps(a,e);s.length&&this.addTranslations(...s)})();this.promises.add({locale:a,route:e,promise:r}),r.then(()=>{a&&this.locale.get()!==a&&this.locale.forceSet(a)})};this.loadTranslations=(t,e=_store.get.call(void 0, this.currentRoute)||"")=>{let a=this.getLocale(t);if(a)return this.setRoute(e),this.setLocale(a),this.loading.toPromise(a,e)};this.loaderTrigger.subscribe(this.loader),this.isLoading.subscribe(async e=>{e&&this.promises.size&&(await this.loading.toPromise(),this.promises.clear(),d.debug("Loader promises have been purged."))}),t&&this.loadConfig(t)}async configLoader(t){if(!t)return d.error("No config provided!");let l=t,{initLocale:e,fallbackLocale:a,translations:r,log:s}=l,i=T(l,["initLocale","fallbackLocale","translations","log"]);s&&V(z(s)),[e]=h(e),[a]=h(a),d.debug("Setting config."),this.config.set(n({initLocale:e,fallbackLocale:a,translations:r},i)),r&&this.addTranslations(r),e&&await this.loadTranslations(e)}};exports.default = K;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var H=Object.defineProperty,q=Object.defineProperties;var B=Object.getOwnPropertyDescriptors;var S=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,A=Object.prototype.propertyIsEnumerable;var $=(s,t,e)=>t in s?H(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e,n=(s,t)=>{for(var e in t||(t={}))j.call(t,e)&&$(s,e,t[e]);if(S)for(var e of S(t))A.call(t,e)&&$(s,e,t[e]);return s},u=(s,t)=>q(s,B(t));var T=(s,t)=>{var e={};for(var a in s)j.call(s,a)&&t.indexOf(a)<0&&(e[a]=s[a]);if(s!=null&&S)for(var a of S(s))t.indexOf(a)<0&&A.call(s,a)&&(e[a]=s[a]);return e};import{derived as v,get as g,writable as m}from"svelte/store";var C=["error","warn","debug"],z=({logger:s=console,level:t=C[1],prefix:e="[i18n]: "})=>C.reduce((a,r,i)=>u(n({},a),{[r]:o=>C.indexOf(t)>=i&&s[r](`${e}${o}`)}),{}),d=z({}),N=s=>{d=s};var F=l=>{var c=l,{parser:s,key:t,params:e,translations:a,locale:r,fallbackLocale:i}=c,o=T(c,["parser","key","params","translations","locale","fallbackLocale"]);if(!t)return d.warn(`No translation key provided ('${r}' locale). Skipping translation...`),"";if(!r)return d.warn(`No locale provided for '${t}' key. Skipping translation...`),"";let f=(a[r]||{})[t];return i&&f===void 0&&(f=(a[i]||{})[t]),o.hasOwnProperty("fallbackValue")&&f===void 0?o.fallbackValue:s.parse(f,e,r,t)},p=(...s)=>s.length?s.filter(t=>!!t).map(t=>{let e=`${t}`.toLowerCase();try{let[a]=Intl.Collator.supportedLocalesOf(t);if(!a)throw new Error;e=a}catch(a){d.warn(`'${t}' locale is non-standard.`)}return e}):[],x=(s,t,e)=>Object.keys(s||{}).reduce((a,r)=>{let i=s[r],o=e?`${e}.${r}`:`${r}`;return t&&Array.isArray(i)?u(n({},a),{[o]:i.map(l=>x(l,t))}):i&&typeof i=="object"?n(n({},a),x(i,t,o)):u(n({},a),{[o]:i})},{}),G=s=>s.reduce((t,{key:e,data:a,locale:r})=>{if(!a)return t;let[i]=p(r),o=u(n({},t[i]||{}),{[e]:a});return u(n({},t),{[i]:o})},{}),V=async s=>{try{let t=await Promise.all(s.map(r=>{var i=r,{loader:e}=i,a=T(i,["loader"]);return new Promise(async o=>{let l;try{l=await e()}catch(c){d.error(`Failed to load translation. Verify your '${a.locale}' > '${a.key}' Loader.`),d.error(c)}o(u(n({loader:e},a),{data:l}))})}));return G(t)}catch(t){d.error(t)}return{}},E=s=>t=>{try{if(typeof t=="string")return t===s;if(typeof t=="object")return t.test(s)}catch(e){d.error("Invalid route config!")}return!1},W=(s,t)=>{let e=!0;try{e=Object.keys(s).filter(a=>s[a]!==void 0).every(a=>s[a]===t[a])}catch(a){}return e};var D=1e3*60*60*24,O=class{constructor(t){this.cachedAt=0;this.loadedKeys={};this.currentRoute=m();this.config=m();this.isLoading=m(!1);this.promises=new Set;this.loading={subscribe:this.isLoading.subscribe,toPromise:(t,e)=>{let a=Array.from(this.promises).filter(r=>W({locale:p(t)[0],route:e},r)).map(({promise:r})=>r);return Promise.all(a)},get:()=>g(this.isLoading)};this.privateRawTranslations=m({});this.rawTranslations={subscribe:this.privateRawTranslations.subscribe,get:()=>g(this.rawTranslations)};this.privateTranslations=m({});this.translations={subscribe:this.privateTranslations.subscribe,get:()=>g(this.translations)};this.locales=u(n({},v([this.config,this.privateTranslations],([t,e])=>{if(!t)return[];let{loaders:a=[]}=t,r=a.map(({locale:o})=>o),i=Object.keys(e).map(o=>o);return Array.from(new Set([...p(...r),...p(...i)]))},[])),{get:()=>g(this.locales)});this.internalLocale=m();this.loaderTrigger=v([this.internalLocale,this.currentRoute],([t,e],a)=>{var r,i;t!==void 0&&e!==void 0&&!(t===((r=g(this.loaderTrigger))==null?void 0:r[0])&&e===((i=g(this.loaderTrigger))==null?void 0:i[1]))&&(d.debug("Triggering translation load..."),a([t,e]))},[]);this.localeHelper=m();this.locale={subscribe:this.localeHelper.subscribe,forceSet:this.localeHelper.set,set:this.internalLocale.set,update:this.internalLocale.update,get:()=>g(this.locale)};this.initialized=v([this.locale,this.currentRoute,this.privateTranslations],([t,e,a],r)=>{g(this.initialized)||r(t!==void 0&&e!==void 0&&!!Object.keys(a).length)});this.translation=v([this.privateTranslations,this.locale,this.isLoading],([t,e,a],r)=>{let i=t[e];i&&Object.keys(i).length&&!a&&r(i)},{});this.t=u(n({},v([this.config,this.translation],r=>{var[i]=r,o=i,{parser:t,fallbackLocale:e}=o,a=T(o,["parser","fallbackLocale"]);return(l,...c)=>F(n({parser:t,key:l,params:c,translations:this.translations.get(),locale:this.locale.get(),fallbackLocale:e},a.hasOwnProperty("fallbackValue")?{fallbackValue:a.fallbackValue}:{}))})),{get:(t,...e)=>g(this.t)(t,...e)});this.l=u(n({},v([this.config,this.translations],i=>{var[o,...l]=i,c=o,{parser:t,fallbackLocale:e}=c,a=T(c,["parser","fallbackLocale"]),[r]=l;return(f,b,...R)=>F(n({parser:t,key:b,params:R,translations:r,locale:f,fallbackLocale:e},a.hasOwnProperty("fallbackValue")?{fallbackValue:a.fallbackValue}:{}))})),{get:(t,e,...a)=>g(this.l)(t,e,...a)});this.getLocale=t=>{let{fallbackLocale:e=""}=g(this.config)||{},a=t||e;if(!a)return"";let r=this.locales.get();return r.find(o=>p(a).includes(o))||r.find(o=>p(e).includes(o))||""};this.setLocale=t=>{if(t&&t!==g(this.internalLocale))return d.debug(`Setting '${t}' locale.`),this.internalLocale.set(t),this.loading.toPromise(t,g(this.currentRoute))};this.setRoute=t=>{if(t!==g(this.currentRoute)){d.debug(`Setting '${t}' route.`),this.currentRoute.set(t);let e=g(this.internalLocale);return this.loading.toPromise(e,t)}};this.loadConfig=async t=>{await this.configLoader(t)};this.getTranslationProps=async(t=this.locale.get(),e=g(this.currentRoute))=>{let a=g(this.config);if(!a||!t)return[];let r=this.translations.get(),{loaders:i,fallbackLocale:o="",cache:l=D}=a||{},c=Number.isNaN(+l)?D:+l;this.cachedAt?Date.now()>c+this.cachedAt&&(d.debug("Refreshing cache."),this.loadedKeys={},this.cachedAt=0):(d.debug("Setting cache timestamp."),this.cachedAt=Date.now());let[f,b]=p(t,o),R=r[f],I=r[b],k=(i||[]).map(K=>{var L=K,{locale:h}=L,y=T(L,["locale"]);return u(n({},y),{locale:p(h)[0]})}).filter(({routes:h})=>!h||(h||[]).some(E(e))).filter(({key:h,locale:y})=>y===f&&(!R||!(this.loadedKeys[f]||[]).includes(h))||o&&y===b&&(!I||!(this.loadedKeys[b]||[]).includes(h)));if(k.length){this.isLoading.set(!0),d.debug("Fetching translations...");let h=await V(k);this.isLoading.set(!1);let y=Object.keys(h).reduce((L,P)=>u(n({},L),{[P]:Object.keys(h[P])}),{}),K=k.filter(({key:L,locale:P})=>(y[P]||[]).some(w=>`${w}`.startsWith(L))).reduce((L,{key:P,locale:w})=>u(n({},L),{[w]:[...L[w]||[],P]}),{});return[h,K]}return[]};this.addTranslations=(t,e)=>{if(!t)return;let a=g(this.config),{preprocess:r}=a||{};d.debug("Adding translations...");let i=Object.keys(t||{});this.privateRawTranslations.update(o=>i.reduce((l,c)=>u(n({},l),{[c]:n(n({},l[c]||{}),t[c])}),o)),this.privateTranslations.update(o=>i.reduce((l,c)=>{let f=!0,b=t[c];return typeof r=="function"&&(b=r(b)),(typeof r=="function"||r==="none")&&(f=!1),u(n({},l),{[c]:n(n({},l[c]||{}),f?x(b,r==="preserveArrays"):b)})},o)),i.forEach(o=>{let l=Object.keys(t[o]).map(c=>`${c}`.split(".")[0]);e&&(l=e[o]),this.loadedKeys[o]=Array.from(new Set([...this.loadedKeys[o]||[],...l||[]]))})};this.loader=async([t,e])=>{let a=this.getLocale(t)||void 0;d.debug(`Adding loader promise for '${a}' locale and '${e}' route.`);let r=(async()=>{let i=await this.getTranslationProps(a,e);i.length&&this.addTranslations(...i)})();this.promises.add({locale:a,route:e,promise:r}),r.then(()=>{a&&this.locale.get()!==a&&this.locale.forceSet(a)})};this.loadTranslations=(t,e=g(this.currentRoute)||"")=>{let a=this.getLocale(t);if(a)return this.setRoute(e),this.setLocale(a),this.loading.toPromise(a,e)};this.loaderTrigger.subscribe(this.loader),this.isLoading.subscribe(async e=>{e&&this.promises.size&&(await this.loading.toPromise(),this.promises.clear(),d.debug("Loader promises have been purged."))}),t&&this.loadConfig(t)}async configLoader(t){if(!t)return d.error("No config provided!");let l=t,{initLocale:e,fallbackLocale:a,translations:r,log:i}=l,o=T(l,["initLocale","fallbackLocale","translations","log"]);i&&N(z(i)),[e]=p(e),[a]=p(a),d.debug("Setting config."),this.config.set(n({initLocale:e,fallbackLocale:a,translations:r},o)),r&&this.addTranslations(r),await this.loadTranslations(e)}};export{O as default};
1
+ var H=Object.defineProperty,q=Object.defineProperties;var B=Object.getOwnPropertyDescriptors;var S=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,N=Object.prototype.propertyIsEnumerable;var j=(o,t,e)=>t in o?H(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e,n=(o,t)=>{for(var e in t||(t={}))A.call(t,e)&&j(o,e,t[e]);if(S)for(var e of S(t))N.call(t,e)&&j(o,e,t[e]);return o},u=(o,t)=>q(o,B(t));var T=(o,t)=>{var e={};for(var a in o)A.call(o,a)&&t.indexOf(a)<0&&(e[a]=o[a]);if(o!=null&&S)for(var a of S(o))t.indexOf(a)<0&&N.call(o,a)&&(e[a]=o[a]);return e};import{derived as v,get as g,writable as m}from"svelte/store";var C=["error","warn","debug"],z=({logger:o=console,level:t=C[1],prefix:e="[i18n]: "})=>C.reduce((a,r,s)=>u(n({},a),{[r]:i=>C.indexOf(t)>=s&&o[r](`${e}${i}`)}),{}),d=z({}),V=o=>{d=o};var F=l=>{var c=l,{parser:o,key:t,params:e,translations:a,locale:r,fallbackLocale:s}=c,i=T(c,["parser","key","params","translations","locale","fallbackLocale"]);if(!t)return d.warn(`No translation key provided ('${r}' locale). Skipping translation...`),"";if(!r)return d.warn(`No locale provided for '${t}' key. Skipping translation...`),"";let f=(a[r]||{})[t];return s&&f===void 0&&(f=(a[s]||{})[t]),i.hasOwnProperty("fallbackValue")&&f===void 0?i.fallbackValue:o.parse(f,e,r,t)},h=(...o)=>o.length?o.filter(t=>!!t).map(t=>{let e=`${t}`.toLowerCase();try{let[a]=Intl.Collator.supportedLocalesOf(t);if(!a)throw new Error;e=a}catch(a){d.warn(`'${t}' locale is non-standard.`)}return e}):[],x=(o,t,e)=>Object.keys(o||{}).reduce((a,r)=>{let s=o[r],i=e?`${e}.${r}`:`${r}`;return t&&Array.isArray(s)?u(n({},a),{[i]:s.map(l=>x(l,t))}):s&&typeof s=="object"?n(n({},a),x(s,t,i)):u(n({},a),{[i]:s})},{}),G=o=>o.reduce((t,{key:e,data:a,locale:r})=>{if(!a)return t;let[s]=h(r),i=u(n({},t[s]||{}),{[e]:a});return u(n({},t),{[s]:i})},{}),E=async o=>{try{let t=await Promise.all(o.map(r=>{var s=r,{loader:e}=s,a=T(s,["loader"]);return new Promise(async i=>{let l;try{l=await e()}catch(c){d.error(`Failed to load translation. Verify your '${a.locale}' > '${a.key}' Loader.`),d.error(c)}i(u(n({loader:e},a),{data:l}))})}));return G(t)}catch(t){d.error(t)}return{}},W=o=>t=>{try{if(typeof t=="string")return t===o;if(typeof t=="object")return t.test(o)}catch(e){d.error("Invalid route config!")}return!1},O=(o,t)=>{let e=!0;try{e=Object.keys(o).filter(a=>o[a]!==void 0).every(a=>o[a]===t[a])}catch(a){}return e};var D=1e3*60*60*24,K=class{constructor(t){this.cachedAt=0;this.loadedKeys={};this.currentRoute=m();this.config=m();this.isLoading=m(!1);this.promises=new Set;this.loading={subscribe:this.isLoading.subscribe,toPromise:(t,e)=>{let{fallbackLocale:a}=g(this.config),r=Array.from(this.promises).filter(s=>{let i=O({locale:h(t)[0],route:e},s);return a&&(i=i||O({locale:h(a)[0],route:e},s)),i}).map(({promise:s})=>s);return Promise.all(r)},get:()=>g(this.isLoading)};this.privateRawTranslations=m({});this.rawTranslations={subscribe:this.privateRawTranslations.subscribe,get:()=>g(this.rawTranslations)};this.privateTranslations=m({});this.translations={subscribe:this.privateTranslations.subscribe,get:()=>g(this.translations)};this.locales=u(n({},v([this.config,this.privateTranslations],([t,e])=>{if(!t)return[];let{loaders:a=[]}=t,r=a.map(({locale:i})=>i),s=Object.keys(e).map(i=>i);return Array.from(new Set([...h(...r),...h(...s)]))},[])),{get:()=>g(this.locales)});this.internalLocale=m();this.loaderTrigger=v([this.internalLocale,this.currentRoute],([t,e],a)=>{var r,s;t!==void 0&&e!==void 0&&!(t===((r=g(this.loaderTrigger))==null?void 0:r[0])&&e===((s=g(this.loaderTrigger))==null?void 0:s[1]))&&(d.debug("Triggering translation load..."),a([t,e]))},[]);this.localeHelper=m();this.locale={subscribe:this.localeHelper.subscribe,forceSet:this.localeHelper.set,set:this.internalLocale.set,update:this.internalLocale.update,get:()=>g(this.locale)};this.initialized=v([this.locale,this.currentRoute,this.privateTranslations],([t,e,a],r)=>{g(this.initialized)||r(t!==void 0&&e!==void 0&&!!Object.keys(a).length)});this.translation=v([this.privateTranslations,this.locale,this.isLoading],([t,e,a],r)=>{let s=t[e];s&&Object.keys(s).length&&!a&&r(s)},{});this.t=u(n({},v([this.config,this.translation],r=>{var[s]=r,i=s,{parser:t,fallbackLocale:e}=i,a=T(i,["parser","fallbackLocale"]);return(l,...c)=>F(n({parser:t,key:l,params:c,translations:this.translations.get(),locale:this.locale.get(),fallbackLocale:e},a.hasOwnProperty("fallbackValue")?{fallbackValue:a.fallbackValue}:{}))})),{get:(t,...e)=>g(this.t)(t,...e)});this.l=u(n({},v([this.config,this.translations],s=>{var[i,...l]=s,c=i,{parser:t,fallbackLocale:e}=c,a=T(c,["parser","fallbackLocale"]),[r]=l;return(f,b,...R)=>F(n({parser:t,key:b,params:R,translations:r,locale:f,fallbackLocale:e},a.hasOwnProperty("fallbackValue")?{fallbackValue:a.fallbackValue}:{}))})),{get:(t,e,...a)=>g(this.l)(t,e,...a)});this.getLocale=t=>{let{fallbackLocale:e}=g(this.config)||{},a=t||e;if(!a)return;let r=this.locales.get();return r.find(i=>h(a).includes(i))||r.find(i=>h(e).includes(i))};this.setLocale=t=>{if(t&&t!==g(this.internalLocale))return d.debug(`Setting '${t}' locale.`),this.internalLocale.set(t),this.loading.toPromise(t,g(this.currentRoute))};this.setRoute=t=>{if(t!==g(this.currentRoute)){d.debug(`Setting '${t}' route.`),this.currentRoute.set(t);let e=g(this.internalLocale);return this.loading.toPromise(e,t)}};this.loadConfig=async t=>{await this.configLoader(t)};this.getTranslationProps=async(t=this.locale.get(),e=g(this.currentRoute))=>{let a=g(this.config);if(!a||!t)return[];let r=this.translations.get(),{loaders:s,fallbackLocale:i="",cache:l=D}=a||{},c=Number.isNaN(+l)?D:+l;this.cachedAt?Date.now()>c+this.cachedAt&&(d.debug("Refreshing cache."),this.loadedKeys={},this.cachedAt=0):(d.debug("Setting cache timestamp."),this.cachedAt=Date.now());let[f,b]=h(t,i),R=r[f],I=r[b],k=(s||[]).map($=>{var L=$,{locale:p}=L,y=T(L,["locale"]);return u(n({},y),{locale:h(p)[0]})}).filter(({routes:p})=>!p||(p||[]).some(W(e))).filter(({key:p,locale:y})=>y===f&&(!R||!(this.loadedKeys[f]||[]).includes(p))||i&&y===b&&(!I||!(this.loadedKeys[b]||[]).includes(p)));if(k.length){this.isLoading.set(!0),d.debug("Fetching translations...");let p=await E(k);this.isLoading.set(!1);let y=Object.keys(p).reduce((L,P)=>u(n({},L),{[P]:Object.keys(p[P])}),{}),$=k.filter(({key:L,locale:P})=>(y[P]||[]).some(w=>`${w}`.startsWith(L))).reduce((L,{key:P,locale:w})=>u(n({},L),{[w]:[...L[w]||[],P]}),{});return[p,$]}return[]};this.addTranslations=(t,e)=>{if(!t)return;let a=g(this.config),{preprocess:r}=a||{};d.debug("Adding translations...");let s=Object.keys(t||{});this.privateRawTranslations.update(i=>s.reduce((l,c)=>u(n({},l),{[c]:n(n({},l[c]||{}),t[c])}),i)),this.privateTranslations.update(i=>s.reduce((l,c)=>{let f=!0,b=t[c];return typeof r=="function"&&(b=r(b)),(typeof r=="function"||r==="none")&&(f=!1),u(n({},l),{[c]:n(n({},l[c]||{}),f?x(b,r==="preserveArrays"):b)})},i)),s.forEach(i=>{let l=Object.keys(t[i]).map(c=>`${c}`.split(".")[0]);e&&(l=e[i]),this.loadedKeys[i]=Array.from(new Set([...this.loadedKeys[i]||[],...l||[]]))})};this.loader=async([t,e])=>{let a=this.getLocale(t)||void 0;d.debug(`Adding loader promise for '${a}' locale and '${e}' route.`);let r=(async()=>{let s=await this.getTranslationProps(a,e);s.length&&this.addTranslations(...s)})();this.promises.add({locale:a,route:e,promise:r}),r.then(()=>{a&&this.locale.get()!==a&&this.locale.forceSet(a)})};this.loadTranslations=(t,e=g(this.currentRoute)||"")=>{let a=this.getLocale(t);if(a)return this.setRoute(e),this.setLocale(a),this.loading.toPromise(a,e)};this.loaderTrigger.subscribe(this.loader),this.isLoading.subscribe(async e=>{e&&this.promises.size&&(await this.loading.toPromise(),this.promises.clear(),d.debug("Loader promises have been purged."))}),t&&this.loadConfig(t)}async configLoader(t){if(!t)return d.error("No config provided!");let l=t,{initLocale:e,fallbackLocale:a,translations:r,log:s}=l,i=T(l,["initLocale","fallbackLocale","translations","log"]);s&&V(z(s)),[e]=h(e),[a]=h(a),d.debug("Setting config."),this.config.set(n({initLocale:e,fallbackLocale:a,translations:r},i)),r&&this.addTranslations(r),e&&await this.loadTranslations(e)}};export{K as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltekit-i18n/base",
3
- "version": "1.3.3",
3
+ "version": "1.3.5",
4
4
  "description": "Base functionality of sveltekit-i18n library with a support for external message parsers.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -51,10 +51,10 @@
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/jest": "^29.5.2",
54
- "@typescript-eslint/eslint-plugin": "^5.7.0",
55
- "@typescript-eslint/parser": "^5.7.0",
54
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
55
+ "@typescript-eslint/parser": "^6.0.0",
56
56
  "eslint": "^8.4.1",
57
- "eslint-config-airbnb-typescript": "^17.0.0",
57
+ "eslint-config-airbnb-typescript": "^17.1.0",
58
58
  "eslint-plugin-import": "^2.25.3",
59
59
  "jest": "^29.6.0",
60
60
  "pre-commit": "^1.2.2",