@sveltekit-i18n/base 1.0.0-rc.8 → 1.1.1

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
@@ -5,7 +5,6 @@
5
5
  # @sveltekit-i18n/base
6
6
  This repository contains the base functionality of [sveltekit-i18n](https://github.com/sveltekit-i18n/lib) and provides support for external message parsers.
7
7
 
8
- __IMPORTANT: THIS PACKAGE IS STILL UNDER DEVELOPMENT - API MAY VARY UNTIL 1.0.0__
9
8
 
10
9
  ## Key features
11
10
 
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- var T=Object.defineProperty,O=Object.defineProperties,A=Object.getOwnPropertyDescriptor,W=Object.getOwnPropertyDescriptors,D=Object.getOwnPropertyNames,y=Object.getOwnPropertySymbols;var x=Object.prototype.hasOwnProperty,K=Object.prototype.propertyIsEnumerable;var F=(r,t,e)=>t in r?T(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e,l=(r,t)=>{for(var e in t||(t={}))x.call(t,e)&&F(r,e,t[e]);if(y)for(var e of y(t))K.call(t,e)&&F(r,e,t[e]);return r},c=(r,t)=>O(r,W(t)),I=r=>T(r,"__esModule",{value:!0});var L=(r,t)=>{var e={};for(var s in r)x.call(r,s)&&t.indexOf(s)<0&&(e[s]=r[s]);if(r!=null&&y)for(var s of y(r))t.indexOf(s)<0&&K.call(r,s)&&(e[s]=r[s]);return e};var $=(r,t)=>{for(var e in t)T(r,e,{get:t[e],enumerable:!0})},V=(r,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of D(t))!x.call(r,a)&&(e||a!=="default")&&T(r,a,{get:()=>t[a],enumerable:!(s=A(t,a))||s.enumerable});return r};var M=(r=>(t,e)=>r&&r.get(t)||(e=V(I({}),t,1),r&&r.set(t,e),e))(typeof WeakMap!="undefined"?new WeakMap:0);var B={};$(B,{default:()=>R});var o=require("svelte/store");var h=r=>{if(!r||!r.length)return[];let t=r;return Array.isArray(t)||(t=[t]),t.filter(e=>!!e).map(e=>{let s=`${e}`.toLowerCase();try{[s]=Intl.Collator.supportedLocalesOf(e)}catch{console.warn(`Non-standard locale provided: '${r}' => '${t}'. Check your 'translations' and 'loaders' in i18n config...`)}return s})},P=(r,t)=>Object.keys(r||{}).reduce((e,s)=>{let a=r[s],i=t?`${t}.${s}`:`${s}`;return a&&typeof a=="object"?l(l({},e),P(a,i)):c(l({},e),{[i]:a})},{}),N=async r=>{try{return(await Promise.all(r.map(a=>{var i=a,{loader:e}=i,s=L(i,["loader"]);return new Promise(async n=>{let f;try{f=await e()}catch(b){console.error(`Failed to load translation. Verify your '${s.locale}' > '${s.key}' Loader.`),console.error(b)}n(c(l({loader:e},s),{data:f}))})}))).reduce((e,{key:s,data:a,locale:i})=>{if(!a)return e;let n=h(i)[0];return c(l({},e),{[n]:P(c(l({},e[n]||{}),{[s]:a}))})},{})}catch(t){console.error(t)}return{}},j=r=>t=>{try{if(typeof t=="string")return t===r;if(typeof t=="object")return t.test(r)}catch{throw new Error("Invalid route config!")}return!1};var z=1e3*60*60*24,R=class{constructor(t){this.cachedAt=0;this.loadedKeys={};this.currentRoute=(0,o.writable)();this.config=(0,o.writable)();this.isLoading=(0,o.writable)(!1);this.promises=[];this.loading={subscribe:this.isLoading.subscribe,toPromise:t=>t?this.promises[t]:Promise.all(this.promises),get:()=>(0,o.get)(this.isLoading)};this.privateTranslations=(0,o.writable)({});this.translations={subscribe:this.privateTranslations.subscribe,get:()=>(0,o.get)(this.translations)};this.locales=c(l({},(0,o.derived)([this.config,this.privateTranslations],([t,e])=>{if(!t)return[];let{loaders:s=[]}=t,a=s.map(({locale:n})=>h(n)[0]),i=Object.keys(e).map(n=>h(n)[0]);return[...new Set([...a,...i])]},[])),{get:()=>(0,o.get)(this.locales)});this.internalLocale=(0,o.writable)();this.locale=c(l({set:this.internalLocale.set,update:this.internalLocale.update},(0,o.derived)(this.internalLocale,(t,e)=>{let s=this.getLocale(t);s&&s!==this.locale.get()&&e(s)})),{get:()=>(0,o.get)(this.locale)});this.loaderTrigger=(0,o.derived)([this.internalLocale,this.currentRoute],([t,e],s)=>{t!==void 0&&e!==void 0&&s([t,e])},[]);this.initialized=(0,o.derived)([this.locale,this.currentRoute,this.privateTranslations],([t,e,s],a)=>{(0,o.get)(this.initialized)||a(t!==void 0&&e!==void 0&&!!Object.keys(s).length)});this.translation=(0,o.derived)([this.privateTranslations,this.locale,this.isLoading],([t,e,s],a)=>{let i=t[e];i&&Object.keys(i).length&&!s&&a(i)},{});this.translate=({parser:t,key:e,params:s,translations:a,locale:i,fallbackLocale:n})=>{if(!(e&&i))return console.warn("No translation key or locale provided. Skipping translation..."),"";let f=(a[i]||{})[e];return n&&f===void 0&&(f=(a[n]||{})[e]),t.parse(f,s,i,e)};this.t=c(l({},(0,o.derived)([this.config,this.translation],([{parser:t,fallbackLocale:e}])=>(s,...a)=>this.translate({parser:t,key:s,params:a,translations:this.translations.get(),locale:this.locale.get(),fallbackLocale:e}))),{get:(t,...e)=>(0,o.get)(this.t)(t,...e)});this.l=c(l({},(0,o.derived)([this.config,this.translations],([{parser:t,fallbackLocale:e},s])=>(a,i,...n)=>this.translate({parser:t,key:i,params:n,translations:s,locale:a,fallbackLocale:e}))),{get:(t,e,...s)=>(0,o.get)(this.l)(t,e,...s)});this.getLocale=t=>{if(!t)return"";let s=this.locales.get().find(a=>a===h(t)[0])||"";return h(s)[0]||""};this.setLocale=async t=>{if(!t)return;let e=this.promises.length;this.internalLocale.set(h(t)[0]),await this.loading.toPromise(e)};this.setRoute=async t=>{let e=this.promises.length;t!==(0,o.get)(this.currentRoute)&&this.currentRoute.set(t),await this.loading.toPromise(e)};this.loadConfig=async t=>{await this.configLoader(t)};this.getTranslationProps=async(t=this.locale.get(),e=(0,o.get)(this.currentRoute))=>{let s=(0,o.get)(this.config);if(!s||!t)return[];let a=this.translations.get(),{loaders:i,fallbackLocale:n="",cache:f=z}=s||{},b=Number.isNaN(+f)?z:+f;this.cachedAt?Date.now()>b+this.cachedAt&&(this.loadedKeys={},this.cachedAt=0):this.cachedAt=Date.now();let[v,w]=h([t,n]),k=a[v],E=a[w],C=(i||[]).map(S=>{var g=S,{locale:d}=g,u=L(g,["locale"]);return c(l({},u),{locale:h(d)[0]})}).filter(({routes:d})=>!d||(d||[]).some(j(e))).filter(({key:d,locale:u})=>u===v&&(!k||!(this.loadedKeys[v]||[]).includes(d))||n&&u===w&&(!E||!(this.loadedKeys[w]||[]).includes(d)));if(C.length){this.isLoading.set(!0);let d=await N(C);this.isLoading.set(!1);let u=Object.keys(d).reduce((g,p)=>c(l({},g),{[p]:Object.keys(d[p])}),{}),S=C.filter(({key:g,locale:p})=>(u[p]||[]).some(m=>`${m}`.startsWith(g))).reduce((g,{key:p,locale:m})=>c(l({},g),{[m]:[...g[m]||[],p]}),{});return[d,S]}return[]};this.addTranslations=(t,e)=>{if(!t)return;let s=Object.keys(t||{});this.privateTranslations.update(a=>s.reduce((i,n)=>c(l({},i),{[n]:l(l({},i[n]||{}),P(t[n]))}),a)),s.forEach(a=>{let i=Object.keys(t[a]).map(n=>`${n}`.split(".")[0]);e&&(i=e[a]),this.loadedKeys[a]=Array.from(new Set([...this.loadedKeys[a]||[],...i||[]]))})};this.translationLoader=async t=>{let e=this.promises.length;this.promises.push(new Promise(async s=>{let a=await this.getTranslationProps(t);a.length&&this.addTranslations(...a),this.setLocale(t),s()})),await this.loading.toPromise(e)};this.loadTranslations=async(t,e=(0,o.get)(this.currentRoute)||"")=>{if(!t)return;let s=this.promises.length;this.setRoute(e),this.setLocale(t),await this.loading.toPromise(s)};t&&this.loadConfig(t),this.loaderTrigger.subscribe(([e])=>this.translationLoader(e)),this.isLoading.subscribe(async e=>{e&&(await this.loading.toPromise(),this.promises=[])})}async configLoader(t){if(!t)throw new Error("No config provided!");let n=t,{initLocale:e,fallbackLocale:s,translations:a}=n,i=L(n,["initLocale","fallbackLocale","translations"]);e=h(e)[0],s=h(s)[0],this.config.set(l({initLocale:e,fallbackLocale:s,translations:a},i)),a&&this.addTranslations(a),await this.loadTranslations(e)}};module.exports=M(B);0&&(module.exports={});
1
+ var y=Object.defineProperty,W=Object.defineProperties,D=Object.getOwnPropertyDescriptor,I=Object.getOwnPropertyDescriptors,H=Object.getOwnPropertyNames,L=Object.getOwnPropertySymbols;var x=Object.prototype.hasOwnProperty,K=Object.prototype.propertyIsEnumerable;var z=(a,e,t)=>e in a?y(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,l=(a,e)=>{for(var t in e||(e={}))x.call(e,t)&&z(a,t,e[t]);if(L)for(var t of L(e))K.call(e,t)&&z(a,t,e[t]);return a},d=(a,e)=>W(a,I(e)),V=a=>y(a,"__esModule",{value:!0});var b=(a,e)=>{var t={};for(var s in a)x.call(a,s)&&e.indexOf(s)<0&&(t[s]=a[s]);if(a!=null&&L)for(var s of L(a))e.indexOf(s)<0&&K.call(a,s)&&(t[s]=a[s]);return t};var M=(a,e)=>{for(var t in e)y(a,t,{get:e[t],enumerable:!0})},q=(a,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of H(e))!x.call(a,r)&&(t||r!=="default")&&y(a,r,{get:()=>e[r],enumerable:!(s=D(e,r))||s.enumerable});return a};var B=(a=>(e,t)=>a&&a.get(e)||(t=q(V({}),e,1),a&&a.set(e,t),t))(typeof WeakMap!="undefined"?new WeakMap:0);var J={};M(J,{default:()=>R});var n=require("svelte/store");var C=({parser:a,key:e,params:t,translations:s,locale:r,fallbackLocale:i})=>{if(!(e&&r))return console.warn("[i18n]: No translation key or locale provided. Skipping translation..."),"";let o=(s[r]||{})[e];return i&&o===void 0&&(o=(s[i]||{})[e]),a.parse(o,t,r,e)},h=(...a)=>a.length?a.filter(e=>!!e).map(e=>{let t=`${e}`.toLowerCase();try{[t]=Intl.Collator.supportedLocalesOf(e)}catch{console.warn(`[i18n]: Non-standard locale provided: '${a}'. Check your 'translations' and 'loaders' in i18n config...`)}return t}):[],T=(a,e)=>Object.keys(a||{}).reduce((t,s)=>{let r=a[s],i=e?`${e}.${s}`:`${s}`;return r&&typeof r=="object"?l(l({},t),T(r,i)):d(l({},t),{[i]:r})},{}),j=async a=>{try{return(await Promise.all(a.map(r=>{var i=r,{loader:t}=i,s=b(i,["loader"]);return new Promise(async o=>{let c;try{c=await t()}catch(P){console.error(`[i18n]: Failed to load translation. Verify your '${s.locale}' > '${s.key}' Loader.`),console.error(P)}o(d(l({loader:t},s),{data:c}))})}))).reduce((t,{key:s,data:r,locale:i})=>{if(!r)return t;let[o]=h(i);return d(l({},t),{[o]:T(d(l({},t[o]||{}),{[s]:r}))})},{})}catch(e){console.error(e)}return{}},k=a=>e=>{try{if(typeof e=="string")return e===a;if(typeof e=="object")return e.test(a)}catch{throw new Error("[i18n]: Invalid route config!")}return!1},N=(a,e)=>{let t=!0;try{t=Object.keys(a).filter(s=>a[s]!==void 0).every(s=>a[s]===e[s])}catch{}return t};var A=1e3*60*60*24,R=class{constructor(e){this.cachedAt=0;this.loadedKeys={};this.currentRoute=(0,n.writable)();this.config=(0,n.writable)();this.isLoading=(0,n.writable)(!1);this.promises=new Set;this.loading={subscribe:this.isLoading.subscribe,toPromise:(e,t)=>{let s=Array.from(this.promises).filter(r=>N({locale:h(e)[0],route:t},r)).map(({promise:r})=>r);return Promise.all(s)},get:()=>(0,n.get)(this.isLoading)};this.privateTranslations=(0,n.writable)({});this.translations={subscribe:this.privateTranslations.subscribe,get:()=>(0,n.get)(this.translations)};this.locales=d(l({},(0,n.derived)([this.config,this.privateTranslations],([e,t])=>{if(!e)return[];let{loaders:s=[]}=e,r=s.map(({locale:o})=>h(o)[0]),i=Object.keys(t).map(o=>h(o)[0]);return Array.from(new Set([...r,...i]))},[])),{get:()=>(0,n.get)(this.locales)});this.internalLocale=(0,n.writable)();this.loaderTrigger=(0,n.derived)([this.internalLocale,this.currentRoute],([e,t],s)=>{var r,i,o;e!==void 0&&t!==void 0&&(e!==((r=(0,n.get)(this.loaderTrigger))==null?void 0:r[0])||t!==((i=(0,n.get)(this.loaderTrigger))==null?void 0:i[1]))&&((o=(0,n.get)(this.config))!=null&&o.debug&&console.debug("[i18n]: Triggering translation load..."),s([e,t]))},[]);this.localeHelper=(0,n.writable)();this.locale={subscribe:this.localeHelper.subscribe,forceSet:this.localeHelper.set,set:this.internalLocale.set,update:this.internalLocale.update,get:()=>(0,n.get)(this.locale)};this.initialized=(0,n.derived)([this.locale,this.currentRoute,this.privateTranslations],([e,t,s],r)=>{(0,n.get)(this.initialized)||r(e!==void 0&&t!==void 0&&!!Object.keys(s).length)});this.translation=(0,n.derived)([this.privateTranslations,this.locale,this.isLoading],([e,t,s],r)=>{let i=e[t];i&&Object.keys(i).length&&!s&&r(i)},{});this.t=d(l({},(0,n.derived)([this.config,this.translation],([{parser:e,fallbackLocale:t}])=>(s,...r)=>C({parser:e,key:s,params:r,translations:this.translations.get(),locale:this.locale.get(),fallbackLocale:t}))),{get:(e,...t)=>(0,n.get)(this.t)(e,...t)});this.l=d(l({},(0,n.derived)([this.config,this.translations],([{parser:e,fallbackLocale:t},s])=>(r,i,...o)=>C({parser:e,key:i,params:o,translations:s,locale:r,fallbackLocale:t}))),{get:(e,t,...s)=>(0,n.get)(this.l)(e,t,...s)});this.getLocale=e=>{if(!e)return"";let s=this.locales.get().find(r=>r===h(e)[0])||"";return h(s)[0]||""};this.setLocale=e=>{var s;if(!e)return;let[t]=h(e);if(t!==(0,n.get)(this.internalLocale))return(s=(0,n.get)(this.config))!=null&&s.debug&&console.debug(`[i18n]: Setting '${t}' locale.`),this.internalLocale.set(t),this.loading.toPromise(e,(0,n.get)(this.currentRoute))};this.setRoute=e=>{var t;if(e!==(0,n.get)(this.currentRoute)){(t=(0,n.get)(this.config))!=null&&t.debug&&console.debug(`[i18n]: Setting '${e}' route.`),this.currentRoute.set(e);let s=(0,n.get)(this.internalLocale);return this.loading.toPromise(s,e)}};this.loadConfig=async e=>{await this.configLoader(e)};this.getTranslationProps=async(e=this.locale.get(),t=(0,n.get)(this.currentRoute))=>{let s=(0,n.get)(this.config);if(!s||!e)return[];let r=this.translations.get(),{loaders:i,fallbackLocale:o="",cache:c=A}=s||{},P=Number.isNaN(+c)?A:+c;this.cachedAt?Date.now()>P+this.cachedAt&&(s!=null&&s.debug&&console.debug("[i18n]: Refreshing cache."),this.loadedKeys={},this.cachedAt=0):(s!=null&&s.debug&&console.debug("[i18n]: Setting cache timestamp."),this.cachedAt=Date.now());let[v,S]=h(e,o),O=r[v],E=r[S],w=(i||[]).map(F=>{var u=F,{locale:g}=u,f=b(u,["locale"]);return d(l({},f),{locale:h(g)[0]})}).filter(({routes:g})=>!g||(g||[]).some(k(t))).filter(({key:g,locale:f})=>f===v&&(!O||!(this.loadedKeys[v]||[]).includes(g))||o&&f===S&&(!E||!(this.loadedKeys[S]||[]).includes(g)));if(w.length){this.isLoading.set(!0),s!=null&&s.debug&&console.debug("[i18n]: Fetching translations...");let g=await j(w);this.isLoading.set(!1);let f=Object.keys(g).reduce((u,p)=>d(l({},u),{[p]:Object.keys(g[p])}),{}),F=w.filter(({key:u,locale:p})=>(f[p]||[]).some(m=>`${m}`.startsWith(u))).reduce((u,{key:p,locale:m})=>d(l({},u),{[m]:[...u[m]||[],p]}),{});return[g,F]}return[]};this.addTranslations=(e,t)=>{var r;if(!e)return;(r=(0,n.get)(this.config))!=null&&r.debug&&console.debug("[i18n]: Adding translations...");let s=Object.keys(e||{});this.privateTranslations.update(i=>s.reduce((o,c)=>d(l({},o),{[c]:l(l({},o[c]||{}),T(e[c]))}),i)),s.forEach(i=>{let o=Object.keys(e[i]).map(c=>`${c}`.split(".")[0]);t&&(o=t[i]),this.loadedKeys[i]=Array.from(new Set([...this.loadedKeys[i]||[],...o||[]]))})};this.loader=async([e,t])=>{var r;(r=(0,n.get)(this.config))!=null&&r.debug&&console.debug("[i18n]: Adding loader promise.");let s=(async()=>{let i=await this.getTranslationProps(e,t);i.length&&this.addTranslations(...i)})();this.promises.add({locale:e,route:t,promise:s}),s.then(()=>{let i=this.getLocale(e);i&&this.locale.get()!==i&&this.locale.forceSet(i)})};this.loadTranslations=(e,t=(0,n.get)(this.currentRoute)||"")=>{if(!!e)return this.setRoute(t),this.setLocale(e),this.loading.toPromise(e,t)};e&&this.loadConfig(e),this.loaderTrigger.subscribe(this.loader),this.isLoading.subscribe(async t=>{var s;t&&this.promises.size&&(await this.loading.toPromise(),this.promises.clear(),(s=(0,n.get)(this.config))!=null&&s.debug&&console.debug("[i18n]: Loader promises have been purged."))})}async configLoader(e){if(!e)throw new Error("[i18n]: No config provided!");let c=e,{initLocale:t,fallbackLocale:s,translations:r,debug:i}=c,o=b(c,["initLocale","fallbackLocale","translations","debug"]);t=h(t)[0],s=h(s)[0],i&&console.debug("[i18n]: Setting config."),this.config.set(l({initLocale:t,fallbackLocale:s,translations:r,debug:i},o)),r&&this.addTranslations(r),await this.loadTranslations(t)}};module.exports=B(J);0&&(module.exports={});
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ declare type ExtendedStore<T, Get = () => T, Store = Readable<T>> = Store & {
4
4
  get: Get;
5
5
  };
6
6
  declare type LoadingStore = Readable<boolean> & {
7
- toPromise: (id?: number) => Promise<void[] | void>;
7
+ toPromise: (locale?: Config.Locale, route?: string) => Promise<void[] | void>;
8
8
  get: () => boolean;
9
9
  };
10
10
  declare module DotNotation {
@@ -27,6 +27,7 @@ declare module Config {
27
27
  fallbackLocale?: FallbackLocale;
28
28
  parser: Parser.T<P>;
29
29
  cache?: number;
30
+ debug?: boolean;
30
31
  };
31
32
  }
32
33
  declare module Loader {
@@ -59,7 +60,7 @@ declare module Translations {
59
60
  type FetchTranslations = (loaders: Loader.LoaderModule[]) => Promise<SerializedTranslations>;
60
61
  type TranslationFunction<P extends Parser.Params = Parser.Params> = (key: string, ...restParams: P) => any;
61
62
  type LocalTranslationFunction<P extends Parser.Params = Parser.Params> = (locale: Config.Locale, key: string, ...restParams: P) => any;
62
- type Translate<P extends Parser.Params = Parser.Params> = (props: {
63
+ type Translate = <P extends Parser.Params = Parser.Params>(props: {
63
64
  parser: Parser.T<P>;
64
65
  key: string;
65
66
  params: P;
@@ -89,23 +90,25 @@ declare class I18n<ParserParams extends Parser.Params = any> {
89
90
  translations: ExtendedStore<Translations.SerializedTranslations>;
90
91
  locales: ExtendedStore<Config.Locale[]>;
91
92
  private internalLocale;
92
- locale: ExtendedStore<Config.Locale, () => Config.Locale, Writable<string>>;
93
93
  private loaderTrigger;
94
+ private localeHelper;
95
+ locale: ExtendedStore<Config.Locale, () => Config.Locale, Writable<string>> & {
96
+ forceSet: any;
97
+ };
94
98
  initialized: Readable<boolean>;
95
99
  private translation;
96
- private translate;
97
100
  t: ExtendedStore<Translations.TranslationFunction<ParserParams>, Translations.TranslationFunction<ParserParams>>;
98
101
  l: ExtendedStore<Translations.LocalTranslationFunction<ParserParams>, Translations.LocalTranslationFunction<ParserParams>>;
99
102
  private getLocale;
100
- setLocale: (locale?: string | undefined) => Promise<void>;
101
- setRoute: (route: string) => Promise<void>;
103
+ setLocale: (locale?: string | undefined) => Promise<void | void[]> | undefined;
104
+ setRoute: (route: string) => Promise<void | void[]> | undefined;
102
105
  configLoader(config: Config.T<ParserParams>): Promise<void>;
103
106
  loadConfig: (config: Config.T<ParserParams>) => Promise<void>;
104
107
  getTranslationProps: ($locale?: string, $route?: string) => Promise<[Translations.SerializedTranslations, Loader.IndexedKeys] | [
105
108
  ]>;
106
109
  addTranslations: (translations?: Translations.SerializedTranslations | undefined, keys?: Loader.IndexedKeys | undefined) => void;
107
- private translationLoader;
108
- loadTranslations: (locale: Config.Locale, route?: string) => Promise<void>;
110
+ private loader;
111
+ loadTranslations: (locale: Config.Locale, route?: string) => Promise<void | void[]> | undefined;
109
112
  }
110
113
 
111
114
  export { Config, Loader, Parser, Translations, I18n as default };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var A=Object.defineProperty,W=Object.defineProperties;var D=Object.getOwnPropertyDescriptors;var P=Object.getOwnPropertySymbols;var F=Object.prototype.hasOwnProperty,K=Object.prototype.propertyIsEnumerable;var S=(r,t,e)=>t in r?A(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e,n=(r,t)=>{for(var e in t||(t={}))F.call(t,e)&&S(r,e,t[e]);if(P)for(var e of P(t))K.call(t,e)&&S(r,e,t[e]);return r},l=(r,t)=>W(r,D(t));var m=(r,t)=>{var e={};for(var s in r)F.call(r,s)&&t.indexOf(s)<0&&(e[s]=r[s]);if(r!=null&&P)for(var s of P(r))t.indexOf(s)<0&&K.call(r,s)&&(e[s]=r[s]);return e};import{derived as u,get as h,writable as y}from"svelte/store";var d=r=>{if(!r||!r.length)return[];let t=r;return Array.isArray(t)||(t=[t]),t.filter(e=>!!e).map(e=>{let s=`${e}`.toLowerCase();try{[s]=Intl.Collator.supportedLocalesOf(e)}catch{console.warn(`Non-standard locale provided: '${r}' => '${t}'. Check your 'translations' and 'loaders' in i18n config...`)}return s})},b=(r,t)=>Object.keys(r||{}).reduce((e,s)=>{let a=r[s],i=t?`${t}.${s}`:`${s}`;return a&&typeof a=="object"?n(n({},e),b(a,i)):l(n({},e),{[i]:a})},{}),N=async r=>{try{return(await Promise.all(r.map(a=>{var i=a,{loader:e}=i,s=m(i,["loader"]);return new Promise(async o=>{let f;try{f=await e()}catch(v){console.error(`Failed to load translation. Verify your '${s.locale}' > '${s.key}' Loader.`),console.error(v)}o(l(n({loader:e},s),{data:f}))})}))).reduce((e,{key:s,data:a,locale:i})=>{if(!a)return e;let o=d(i)[0];return l(n({},e),{[o]:b(l(n({},e[o]||{}),{[s]:a}))})},{})}catch(t){console.error(t)}return{}},j=r=>t=>{try{if(typeof t=="string")return t===r;if(typeof t=="object")return t.test(r)}catch{throw new Error("Invalid route config!")}return!1};var z=1e3*60*60*24,k=class{constructor(t){this.cachedAt=0;this.loadedKeys={};this.currentRoute=y();this.config=y();this.isLoading=y(!1);this.promises=[];this.loading={subscribe:this.isLoading.subscribe,toPromise:t=>t?this.promises[t]:Promise.all(this.promises),get:()=>h(this.isLoading)};this.privateTranslations=y({});this.translations={subscribe:this.privateTranslations.subscribe,get:()=>h(this.translations)};this.locales=l(n({},u([this.config,this.privateTranslations],([t,e])=>{if(!t)return[];let{loaders:s=[]}=t,a=s.map(({locale:o})=>d(o)[0]),i=Object.keys(e).map(o=>d(o)[0]);return[...new Set([...a,...i])]},[])),{get:()=>h(this.locales)});this.internalLocale=y();this.locale=l(n({set:this.internalLocale.set,update:this.internalLocale.update},u(this.internalLocale,(t,e)=>{let s=this.getLocale(t);s&&s!==this.locale.get()&&e(s)})),{get:()=>h(this.locale)});this.loaderTrigger=u([this.internalLocale,this.currentRoute],([t,e],s)=>{t!==void 0&&e!==void 0&&s([t,e])},[]);this.initialized=u([this.locale,this.currentRoute,this.privateTranslations],([t,e,s],a)=>{h(this.initialized)||a(t!==void 0&&e!==void 0&&!!Object.keys(s).length)});this.translation=u([this.privateTranslations,this.locale,this.isLoading],([t,e,s],a)=>{let i=t[e];i&&Object.keys(i).length&&!s&&a(i)},{});this.translate=({parser:t,key:e,params:s,translations:a,locale:i,fallbackLocale:o})=>{if(!(e&&i))return console.warn("No translation key or locale provided. Skipping translation..."),"";let f=(a[i]||{})[e];return o&&f===void 0&&(f=(a[o]||{})[e]),t.parse(f,s,i,e)};this.t=l(n({},u([this.config,this.translation],([{parser:t,fallbackLocale:e}])=>(s,...a)=>this.translate({parser:t,key:s,params:a,translations:this.translations.get(),locale:this.locale.get(),fallbackLocale:e}))),{get:(t,...e)=>h(this.t)(t,...e)});this.l=l(n({},u([this.config,this.translations],([{parser:t,fallbackLocale:e},s])=>(a,i,...o)=>this.translate({parser:t,key:i,params:o,translations:s,locale:a,fallbackLocale:e}))),{get:(t,e,...s)=>h(this.l)(t,e,...s)});this.getLocale=t=>{if(!t)return"";let s=this.locales.get().find(a=>a===d(t)[0])||"";return d(s)[0]||""};this.setLocale=async t=>{if(!t)return;let e=this.promises.length;this.internalLocale.set(d(t)[0]),await this.loading.toPromise(e)};this.setRoute=async t=>{let e=this.promises.length;t!==h(this.currentRoute)&&this.currentRoute.set(t),await this.loading.toPromise(e)};this.loadConfig=async t=>{await this.configLoader(t)};this.getTranslationProps=async(t=this.locale.get(),e=h(this.currentRoute))=>{let s=h(this.config);if(!s||!t)return[];let a=this.translations.get(),{loaders:i,fallbackLocale:o="",cache:f=z}=s||{},v=Number.isNaN(+f)?z:+f;this.cachedAt?Date.now()>v+this.cachedAt&&(this.loadedKeys={},this.cachedAt=0):this.cachedAt=Date.now();let[w,C]=d([t,o]),E=a[w],O=a[C],x=(i||[]).map(R=>{var g=R,{locale:c}=g,p=m(g,["locale"]);return l(n({},p),{locale:d(c)[0]})}).filter(({routes:c})=>!c||(c||[]).some(j(e))).filter(({key:c,locale:p})=>p===w&&(!E||!(this.loadedKeys[w]||[]).includes(c))||o&&p===C&&(!O||!(this.loadedKeys[C]||[]).includes(c)));if(x.length){this.isLoading.set(!0);let c=await N(x);this.isLoading.set(!1);let p=Object.keys(c).reduce((g,L)=>l(n({},g),{[L]:Object.keys(c[L])}),{}),R=x.filter(({key:g,locale:L})=>(p[L]||[]).some(T=>`${T}`.startsWith(g))).reduce((g,{key:L,locale:T})=>l(n({},g),{[T]:[...g[T]||[],L]}),{});return[c,R]}return[]};this.addTranslations=(t,e)=>{if(!t)return;let s=Object.keys(t||{});this.privateTranslations.update(a=>s.reduce((i,o)=>l(n({},i),{[o]:n(n({},i[o]||{}),b(t[o]))}),a)),s.forEach(a=>{let i=Object.keys(t[a]).map(o=>`${o}`.split(".")[0]);e&&(i=e[a]),this.loadedKeys[a]=Array.from(new Set([...this.loadedKeys[a]||[],...i||[]]))})};this.translationLoader=async t=>{let e=this.promises.length;this.promises.push(new Promise(async s=>{let a=await this.getTranslationProps(t);a.length&&this.addTranslations(...a),this.setLocale(t),s()})),await this.loading.toPromise(e)};this.loadTranslations=async(t,e=h(this.currentRoute)||"")=>{if(!t)return;let s=this.promises.length;this.setRoute(e),this.setLocale(t),await this.loading.toPromise(s)};t&&this.loadConfig(t),this.loaderTrigger.subscribe(([e])=>this.translationLoader(e)),this.isLoading.subscribe(async e=>{e&&(await this.loading.toPromise(),this.promises=[])})}async configLoader(t){if(!t)throw new Error("No config provided!");let o=t,{initLocale:e,fallbackLocale:s,translations:a}=o,i=m(o,["initLocale","fallbackLocale","translations"]);e=d(e)[0],s=d(s)[0],this.config.set(n({initLocale:e,fallbackLocale:s,translations:a},i)),a&&this.addTranslations(a),await this.loadTranslations(e)}};export{k as default};
1
+ var D=Object.defineProperty,I=Object.defineProperties;var H=Object.getOwnPropertyDescriptors;var T=Object.getOwnPropertySymbols;var z=Object.prototype.hasOwnProperty,K=Object.prototype.propertyIsEnumerable;var F=(i,e,t)=>e in i?D(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t,l=(i,e)=>{for(var t in e||(e={}))z.call(e,t)&&F(i,t,e[t]);if(T)for(var t of T(e))K.call(e,t)&&F(i,t,e[t]);return i},d=(i,e)=>I(i,H(e));var L=(i,e)=>{var t={};for(var s in i)z.call(i,s)&&e.indexOf(s)<0&&(t[s]=i[s]);if(i!=null&&T)for(var s of T(i))e.indexOf(s)<0&&K.call(i,s)&&(t[s]=i[s]);return t};import{derived as b,get as o,writable as m}from"svelte/store";var C=({parser:i,key:e,params:t,translations:s,locale:r,fallbackLocale:a})=>{if(!(e&&r))return console.warn("[i18n]: No translation key or locale provided. Skipping translation..."),"";let n=(s[r]||{})[e];return a&&n===void 0&&(n=(s[a]||{})[e]),i.parse(n,t,r,e)},h=(...i)=>i.length?i.filter(e=>!!e).map(e=>{let t=`${e}`.toLowerCase();try{[t]=Intl.Collator.supportedLocalesOf(e)}catch{console.warn(`[i18n]: Non-standard locale provided: '${i}'. Check your 'translations' and 'loaders' in i18n config...`)}return t}):[],P=(i,e)=>Object.keys(i||{}).reduce((t,s)=>{let r=i[s],a=e?`${e}.${s}`:`${s}`;return r&&typeof r=="object"?l(l({},t),P(r,a)):d(l({},t),{[a]:r})},{}),j=async i=>{try{return(await Promise.all(i.map(r=>{var a=r,{loader:t}=a,s=L(a,["loader"]);return new Promise(async n=>{let c;try{c=await t()}catch(v){console.error(`[i18n]: Failed to load translation. Verify your '${s.locale}' > '${s.key}' Loader.`),console.error(v)}n(d(l({loader:t},s),{data:c}))})}))).reduce((t,{key:s,data:r,locale:a})=>{if(!r)return t;let[n]=h(a);return d(l({},t),{[n]:P(d(l({},t[n]||{}),{[s]:r}))})},{})}catch(e){console.error(e)}return{}},k=i=>e=>{try{if(typeof e=="string")return e===i;if(typeof e=="object")return e.test(i)}catch{throw new Error("[i18n]: Invalid route config!")}return!1},N=(i,e)=>{let t=!0;try{t=Object.keys(i).filter(s=>i[s]!==void 0).every(s=>i[s]===e[s])}catch{}return t};var A=1e3*60*60*24,O=class{constructor(e){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:(e,t)=>{let s=Array.from(this.promises).filter(r=>N({locale:h(e)[0],route:t},r)).map(({promise:r})=>r);return Promise.all(s)},get:()=>o(this.isLoading)};this.privateTranslations=m({});this.translations={subscribe:this.privateTranslations.subscribe,get:()=>o(this.translations)};this.locales=d(l({},b([this.config,this.privateTranslations],([e,t])=>{if(!e)return[];let{loaders:s=[]}=e,r=s.map(({locale:n})=>h(n)[0]),a=Object.keys(t).map(n=>h(n)[0]);return Array.from(new Set([...r,...a]))},[])),{get:()=>o(this.locales)});this.internalLocale=m();this.loaderTrigger=b([this.internalLocale,this.currentRoute],([e,t],s)=>{var r,a,n;e!==void 0&&t!==void 0&&(e!==((r=o(this.loaderTrigger))==null?void 0:r[0])||t!==((a=o(this.loaderTrigger))==null?void 0:a[1]))&&((n=o(this.config))!=null&&n.debug&&console.debug("[i18n]: Triggering translation load..."),s([e,t]))},[]);this.localeHelper=m();this.locale={subscribe:this.localeHelper.subscribe,forceSet:this.localeHelper.set,set:this.internalLocale.set,update:this.internalLocale.update,get:()=>o(this.locale)};this.initialized=b([this.locale,this.currentRoute,this.privateTranslations],([e,t,s],r)=>{o(this.initialized)||r(e!==void 0&&t!==void 0&&!!Object.keys(s).length)});this.translation=b([this.privateTranslations,this.locale,this.isLoading],([e,t,s],r)=>{let a=e[t];a&&Object.keys(a).length&&!s&&r(a)},{});this.t=d(l({},b([this.config,this.translation],([{parser:e,fallbackLocale:t}])=>(s,...r)=>C({parser:e,key:s,params:r,translations:this.translations.get(),locale:this.locale.get(),fallbackLocale:t}))),{get:(e,...t)=>o(this.t)(e,...t)});this.l=d(l({},b([this.config,this.translations],([{parser:e,fallbackLocale:t},s])=>(r,a,...n)=>C({parser:e,key:a,params:n,translations:s,locale:r,fallbackLocale:t}))),{get:(e,t,...s)=>o(this.l)(e,t,...s)});this.getLocale=e=>{if(!e)return"";let s=this.locales.get().find(r=>r===h(e)[0])||"";return h(s)[0]||""};this.setLocale=e=>{var s;if(!e)return;let[t]=h(e);if(t!==o(this.internalLocale))return(s=o(this.config))!=null&&s.debug&&console.debug(`[i18n]: Setting '${t}' locale.`),this.internalLocale.set(t),this.loading.toPromise(e,o(this.currentRoute))};this.setRoute=e=>{var t;if(e!==o(this.currentRoute)){(t=o(this.config))!=null&&t.debug&&console.debug(`[i18n]: Setting '${e}' route.`),this.currentRoute.set(e);let s=o(this.internalLocale);return this.loading.toPromise(s,e)}};this.loadConfig=async e=>{await this.configLoader(e)};this.getTranslationProps=async(e=this.locale.get(),t=o(this.currentRoute))=>{let s=o(this.config);if(!s||!e)return[];let r=this.translations.get(),{loaders:a,fallbackLocale:n="",cache:c=A}=s||{},v=Number.isNaN(+c)?A:+c;this.cachedAt?Date.now()>v+this.cachedAt&&(s!=null&&s.debug&&console.debug("[i18n]: Refreshing cache."),this.loadedKeys={},this.cachedAt=0):(s!=null&&s.debug&&console.debug("[i18n]: Setting cache timestamp."),this.cachedAt=Date.now());let[S,w]=h(e,n),E=r[S],W=r[w],x=(a||[]).map(R=>{var u=R,{locale:g}=u,f=L(u,["locale"]);return d(l({},f),{locale:h(g)[0]})}).filter(({routes:g})=>!g||(g||[]).some(k(t))).filter(({key:g,locale:f})=>f===S&&(!E||!(this.loadedKeys[S]||[]).includes(g))||n&&f===w&&(!W||!(this.loadedKeys[w]||[]).includes(g)));if(x.length){this.isLoading.set(!0),s!=null&&s.debug&&console.debug("[i18n]: Fetching translations...");let g=await j(x);this.isLoading.set(!1);let f=Object.keys(g).reduce((u,p)=>d(l({},u),{[p]:Object.keys(g[p])}),{}),R=x.filter(({key:u,locale:p})=>(f[p]||[]).some(y=>`${y}`.startsWith(u))).reduce((u,{key:p,locale:y})=>d(l({},u),{[y]:[...u[y]||[],p]}),{});return[g,R]}return[]};this.addTranslations=(e,t)=>{var r;if(!e)return;(r=o(this.config))!=null&&r.debug&&console.debug("[i18n]: Adding translations...");let s=Object.keys(e||{});this.privateTranslations.update(a=>s.reduce((n,c)=>d(l({},n),{[c]:l(l({},n[c]||{}),P(e[c]))}),a)),s.forEach(a=>{let n=Object.keys(e[a]).map(c=>`${c}`.split(".")[0]);t&&(n=t[a]),this.loadedKeys[a]=Array.from(new Set([...this.loadedKeys[a]||[],...n||[]]))})};this.loader=async([e,t])=>{var r;(r=o(this.config))!=null&&r.debug&&console.debug("[i18n]: Adding loader promise.");let s=(async()=>{let a=await this.getTranslationProps(e,t);a.length&&this.addTranslations(...a)})();this.promises.add({locale:e,route:t,promise:s}),s.then(()=>{let a=this.getLocale(e);a&&this.locale.get()!==a&&this.locale.forceSet(a)})};this.loadTranslations=(e,t=o(this.currentRoute)||"")=>{if(!!e)return this.setRoute(t),this.setLocale(e),this.loading.toPromise(e,t)};e&&this.loadConfig(e),this.loaderTrigger.subscribe(this.loader),this.isLoading.subscribe(async t=>{var s;t&&this.promises.size&&(await this.loading.toPromise(),this.promises.clear(),(s=o(this.config))!=null&&s.debug&&console.debug("[i18n]: Loader promises have been purged."))})}async configLoader(e){if(!e)throw new Error("[i18n]: No config provided!");let c=e,{initLocale:t,fallbackLocale:s,translations:r,debug:a}=c,n=L(c,["initLocale","fallbackLocale","translations","debug"]);t=h(t)[0],s=h(s)[0],a&&console.debug("[i18n]: Setting config."),this.config.set(l({initLocale:t,fallbackLocale:s,translations:r,debug:a},n)),r&&this.addTranslations(r),await this.loadTranslations(t)}};export{O as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltekit-i18n/base",
3
- "version": "1.0.0-rc.8",
3
+ "version": "1.1.1",
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",