@sveltekit-i18n/base 1.0.0-beta.0 → 1.0.0-beta.4

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
@@ -1,6 +1,6 @@
1
1
 
2
2
 
3
- [![npm version](https://badge.fury.io/js/sveltekit-i18n%2Fbase.svg)](https://badge.fury.io/js/sveltekit-i18n%2Fbase) ![](https://github.com/sveltekit-i18n/base/workflows/Tests/badge.svg)
3
+ [![npm version](https://badge.fury.io/js/@sveltekit-i18n%2Fbase.svg)](https://badge.fury.io/js/@sveltekit-i18n%2Fbase) ![](https://github.com/sveltekit-i18n/base/workflows/Tests/badge.svg)
4
4
 
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.
@@ -12,7 +12,7 @@ This repository contains the base functionality of [sveltekit-i18n](https://gith
12
12
  ✅ Custom data sources – no matter if you are using local files or remote API to get your translations\
13
13
  ✅ Module-based – your translations are loaded for visited pages only (and only once!)\
14
14
  ✅ Component-scoped translations – you can create multiple instances with custom definitions\
15
- ✅ Custom modifiers – you can modify the input data the way you really need\
15
+ ✅ Custom parsers – you can use any message syntax you need\
16
16
  ✅ TS support\
17
17
  ✅ No external dependencies
18
18
 
@@ -25,7 +25,7 @@ import parser from '@sveltekit-i18n/parser-default'; // use your preferred parse
25
25
 
26
26
  /** @type {import('@sveltekit-i18n/base').Config} */
27
27
  export const config = ({
28
- parser: parser(),
28
+ parser: parser({}),
29
29
  loaders: [
30
30
  {
31
31
  locale: 'en',
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ var b=Object.defineProperty,E=Object.defineProperties,O=Object.getOwnPropertyDescriptor,W=Object.getOwnPropertyDescriptors,K=Object.getOwnPropertyNames,T=Object.getOwnPropertySymbols;var v=Object.prototype.hasOwnProperty,F=Object.prototype.propertyIsEnumerable;var P=(s,t,e)=>t in s?b(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e,r=(s,t)=>{for(var e in t||(t={}))v.call(t,e)&&P(s,e,t[e]);if(T)for(var e of T(t))F.call(t,e)&&P(s,e,t[e]);return s},c=(s,t)=>E(s,W(t)),D=s=>b(s,"__esModule",{value:!0});var m=(s,t)=>{var e={};for(var o in s)v.call(s,o)&&t.indexOf(o)<0&&(e[o]=s[o]);if(s!=null&&T)for(var o of T(s))t.indexOf(o)<0&&F.call(s,o)&&(e[o]=s[o]);return e};var N=(s,t)=>{for(var e in t)b(s,e,{get:t[e],enumerable:!0})},M=(s,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of K(t))!v.call(s,i)&&(e||i!=="default")&&b(s,i,{get:()=>t[i],enumerable:!(o=O(t,i))||o.enumerable});return s};var z=(s=>(t,e)=>s&&s.get(t)||(e=M(D({}),t,1),s&&s.set(t,e),e))(typeof WeakMap!="undefined"?new WeakMap:0);var V={};N(V,{default:()=>I});var a=require("svelte/store");var d=(s,t={})=>s||t,w=(s,t)=>Object.keys(d(s)).reduce((e,o)=>{let i=s[o],n=t?`${t}.${o}`:`${o}`;return i&&typeof i=="object"?r(r({},e),w(i,n)):c(r({},e),{[n]:i})},{}),x=async s=>{try{return(await Promise.all(s.map(i=>{var n=i,{loader:e}=n,o=m(n,["loader"]);return new Promise(async l=>{let h;try{h=await e()}catch(p){console.error(`Failed to load translation. Verify your '${o.locale}' > '${o.key}' loader.`),console.error(p)}l(c(r({loader:e},o),{data:h}))})}))).reduce((e,{key:o,data:i,locale:n})=>i?c(r({},e),{[n]:w(c(r({},d(e[n])),{[o]:i}))}):e,{})}catch(t){console.error(t)}return{}},$=s=>t=>{try{if(typeof t=="string")return t===s;if(typeof t=="object")return t.test(s)}catch{throw new Error("Invalid route config!")}return!1};var j=class{constructor(t){this.loadedKeys={};this.currentRoute=(0,a.writable)();this.config=(0,a.writable)();this.isLoading=(0,a.writable)(!1);this.promises=[];this.loading={subscribe:this.isLoading.subscribe,toPromise:()=>Promise.all(this.promises),get:()=>(0,a.get)(this.isLoading)};this.privateTranslations=(0,a.writable)({});this.translations={subscribe:this.privateTranslations.subscribe,get:()=>(0,a.get)(this.translations)};this.locales=c(r({},(0,a.derived)([this.config,this.privateTranslations],([t,e])=>{if(!t)return[];let{loaders:o=[]}=t,i=o.map(({locale:l})=>`${l}`.toLowerCase()),n=Object.keys(e).map(l=>`${l}`.toLowerCase());return[...new Set([...i,...n])]},[])),{get:()=>(0,a.get)(this.locales)});this.internalLocale=(0,a.writable)();this.locale=c(r({set:this.internalLocale.set,update:this.internalLocale.update},(0,a.derived)(this.internalLocale,(t,e)=>{let o=t&&`${t}`.toLowerCase(),i=this.getLocale(o);i&&i!==this.locale.get()&&e(i)})),{get:()=>(0,a.get)(this.locale)});this.loaderTrigger=(0,a.derived)([this.internalLocale,this.currentRoute],([t,e],o)=>{t!==void 0&&e!==void 0&&o([t,e])},[]);this.initialized=(0,a.derived)([this.locale,this.currentRoute,this.privateTranslations],([t,e,o],i)=>{(0,a.get)(this.initialized)||i(t!==void 0&&e!==void 0&&!!Object.keys(o).length)});this.translation=(0,a.derived)([this.privateTranslations,this.locale,this.isLoading],([t,e,o],i)=>{let n=t[e];n&&Object.keys(n).length&&!o&&i(n)},{});this.t=c(r({},(0,a.derived)([this.config,this.translation],([{parser:t,fallbackLocale:e}])=>(o,i)=>t==null?void 0:t.parse({key:o,payload:i,translations:this.translations.get(),locale:this.locale.get(),fallbackLocale:e}))),{get:(...t)=>(0,a.get)(this.t)(...t)});this.l=c(r({},(0,a.derived)([this.config,this.translations],([{parser:t,fallbackLocale:e},o])=>(i,n,l)=>t.parse({key:n,payload:l,translations:o,locale:i,fallbackLocale:e}))),{get:(...t)=>(0,a.get)(this.l)(...t)});this.getLocale=t=>t?`${this.locales.get().find(i=>`${i}`.toLowerCase()===`${t}`.toLowerCase())||""}`.toLowerCase():"";this.setLocale=async t=>{!t||(this.internalLocale.set(t),await this.loading.toPromise())};this.setRoute=async t=>{t!==(0,a.get)(this.currentRoute)&&this.currentRoute.set(t),await this.loading.toPromise()};this.loadConfig=async t=>{await this.configLoader(t)};this.addTranslations=(t,e)=>{if(!t)return;let o=Object.keys(d(t));this.privateTranslations.update(i=>o.reduce((n,l)=>c(r({},n),{[l]:r(r({},d(n[l])),w(t[l]))}),i)),o.forEach(i=>{let n=Object.keys(t[i]).map(l=>`${l}`.split(".")[0]);e&&(n=e[i]),this.loadedKeys[i]=Array.from(new Set([...d(this.loadedKeys[i],[]),...d(n,[])]))})};this.getTranslationProps=async(t=this.locale.get(),e=(0,a.get)(this.currentRoute))=>{let o=(0,a.get)(this.config);if(!o||!t)return[];let i=this.translations.get(),{loaders:n,fallbackLocale:l=""}=d(o),h=`${t}`.toLowerCase(),p=l&&`${l}`.toLowerCase(),S=i[h],k=i[p],R=d(n,[]).map(C=>{var u=C,{locale:g}=u,f=m(u,["locale"]);return c(r({},f),{locale:`${g}`.toLowerCase()})}).filter(({routes:g})=>!g||d(g,[]).some($(e))).filter(({key:g,locale:f})=>f===h&&(!S||!d(this.loadedKeys[h],[]).includes(g))||l&&f===p&&(!k||!d(this.loadedKeys[p],[]).includes(g)));if(R.length){this.isLoading.set(!0);let g=await x(R);this.isLoading.set(!1);let f=Object.keys(g).reduce((u,L)=>c(r({},u),{[L]:Object.keys(g[L])}),{}),C=R.filter(({key:u,locale:L})=>d(f[L],[]).some(y=>`${y}`.startsWith(u))).reduce((u,{key:L,locale:y})=>c(r({},u),{[y]:[...u[y]||[],L]}),{});return[g,C]}return[]};this.translationLoader=async t=>{this.promises.push(new Promise(async e=>{let o=await this.getTranslationProps(t);o.length&&this.addTranslations(...o),e()})),await this.loading.toPromise()};this.loadTranslations=async(t,e=(0,a.get)(this.currentRoute)||"")=>{!t||(this.setRoute(e),this.setLocale(t),await this.loading.toPromise())};t&&this.loadConfig(t),this.loaderTrigger.subscribe(()=>this.translationLoader())}async configLoader(t){if(!t)throw new Error("No config!");this.config.set(t);let{initLocale:e="",translations:o}=t;o&&this.addTranslations(o),await this.loadTranslations(e)}};var I=j;module.exports=z(V);0&&(module.exports={});
@@ -23,23 +23,27 @@ type ConfigTranslations = { [locale: string]: Record<string, any> };
23
23
 
24
24
  type Translations = { [locale: string]: Record<string, string> };
25
25
 
26
+ type Parse = <Payload = Record<any, any>>(props: {
27
+ key: string;
28
+ payload?: Payload;
29
+ translations: Translations;
30
+ locale: string;
31
+ fallbackLocale?: string;
32
+ }) => string;
33
+
34
+ type Parser = {
35
+ parse: Parse;
36
+ };
37
+
26
38
  type Config = {
27
- parser: {
28
- parse: (props: {
29
- key: string;
30
- payload: any;
31
- translations: Translations;
32
- locale: string;
33
- fallbackLocale?: string;
34
- }) => string;
35
- };
39
+ parser: Parser;
36
40
  loaders?: LoaderModule[];
37
41
  translations?: ConfigTranslations;
38
42
  initLocale?: string;
39
43
  fallbackLocale?: string;
40
44
  };
41
45
 
42
- declare class export_default{
46
+ declare class I18n {
43
47
  constructor(config?: Config);
44
48
  private loadedKeys;
45
49
  private currentRoute;
@@ -60,6 +64,7 @@ declare class export_default{
60
64
  private getLocale;
61
65
  setLocale: (locale?: string | undefined) => Promise<void>;
62
66
  setRoute: (route: string) => Promise<void>;
67
+ configLoader(config: Config): Promise<void>;
63
68
  loadConfig: (config: Config) => Promise<void>;
64
69
  addTranslations: (translations?: ConfigTranslations | undefined, keys?: Record<string, string[]> | undefined) => void;
65
70
  getTranslationProps: ($locale?: string, $route?: string) => Promise<[ConfigTranslations, Record<string, string[]>] | [
@@ -68,4 +73,4 @@ declare class export_default{
68
73
  loadTranslations: (locale: string, route?: string) => Promise<void>;
69
74
  }
70
75
 
71
- export { Config, export_default as default };
76
+ export { Config, Parse, Parser, I18n as default };
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ var O=Object.defineProperty,W=Object.defineProperties;var K=Object.getOwnPropertyDescriptors;var m=Object.getOwnPropertySymbols;var F=Object.prototype.hasOwnProperty,x=Object.prototype.propertyIsEnumerable;var P=(i,t,e)=>t in i?O(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e,n=(i,t)=>{for(var e in t||(t={}))F.call(t,e)&&P(i,e,t[e]);if(m)for(var e of m(t))x.call(t,e)&&P(i,e,t[e]);return i},l=(i,t)=>W(i,K(t));var w=(i,t)=>{var e={};for(var o in i)F.call(i,o)&&t.indexOf(o)<0&&(e[o]=i[o]);if(i!=null&&m)for(var o of m(i))t.indexOf(o)<0&&x.call(i,o)&&(e[o]=i[o]);return e};import{derived as h,get as g,writable as T}from"svelte/store";var c=(i,t={})=>i||t,R=(i,t)=>Object.keys(c(i)).reduce((e,o)=>{let s=i[o],a=t?`${t}.${o}`:`${o}`;return s&&typeof s=="object"?n(n({},e),R(s,a)):l(n({},e),{[a]:s})},{}),$=async i=>{try{return(await Promise.all(i.map(s=>{var a=s,{loader:e}=a,o=w(a,["loader"]);return new Promise(async r=>{let f;try{f=await e()}catch(y){console.error(`Failed to load translation. Verify your '${o.locale}' > '${o.key}' loader.`),console.error(y)}r(l(n({loader:e},o),{data:f}))})}))).reduce((e,{key:o,data:s,locale:a})=>s?l(n({},e),{[a]:R(l(n({},c(e[a])),{[o]:s}))}):e,{})}catch(t){console.error(t)}return{}},j=i=>t=>{try{if(typeof t=="string")return t===i;if(typeof t=="object")return t.test(i)}catch{throw new Error("Invalid route config!")}return!1};var S=class{constructor(t){this.loadedKeys={};this.currentRoute=T();this.config=T();this.isLoading=T(!1);this.promises=[];this.loading={subscribe:this.isLoading.subscribe,toPromise:()=>Promise.all(this.promises),get:()=>g(this.isLoading)};this.privateTranslations=T({});this.translations={subscribe:this.privateTranslations.subscribe,get:()=>g(this.translations)};this.locales=l(n({},h([this.config,this.privateTranslations],([t,e])=>{if(!t)return[];let{loaders:o=[]}=t,s=o.map(({locale:r})=>`${r}`.toLowerCase()),a=Object.keys(e).map(r=>`${r}`.toLowerCase());return[...new Set([...s,...a])]},[])),{get:()=>g(this.locales)});this.internalLocale=T();this.locale=l(n({set:this.internalLocale.set,update:this.internalLocale.update},h(this.internalLocale,(t,e)=>{let o=t&&`${t}`.toLowerCase(),s=this.getLocale(o);s&&s!==this.locale.get()&&e(s)})),{get:()=>g(this.locale)});this.loaderTrigger=h([this.internalLocale,this.currentRoute],([t,e],o)=>{t!==void 0&&e!==void 0&&o([t,e])},[]);this.initialized=h([this.locale,this.currentRoute,this.privateTranslations],([t,e,o],s)=>{g(this.initialized)||s(t!==void 0&&e!==void 0&&!!Object.keys(o).length)});this.translation=h([this.privateTranslations,this.locale,this.isLoading],([t,e,o],s)=>{let a=t[e];a&&Object.keys(a).length&&!o&&s(a)},{});this.t=l(n({},h([this.config,this.translation],([{parser:t,fallbackLocale:e}])=>(o,s)=>t==null?void 0:t.parse({key:o,payload:s,translations:this.translations.get(),locale:this.locale.get(),fallbackLocale:e}))),{get:(...t)=>g(this.t)(...t)});this.l=l(n({},h([this.config,this.translations],([{parser:t,fallbackLocale:e},o])=>(s,a,r)=>t.parse({key:a,payload:r,translations:o,locale:s,fallbackLocale:e}))),{get:(...t)=>g(this.l)(...t)});this.getLocale=t=>t?`${this.locales.get().find(s=>`${s}`.toLowerCase()===`${t}`.toLowerCase())||""}`.toLowerCase():"";this.setLocale=async t=>{!t||(this.internalLocale.set(t),await this.loading.toPromise())};this.setRoute=async t=>{t!==g(this.currentRoute)&&this.currentRoute.set(t),await this.loading.toPromise()};this.loadConfig=async t=>{await this.configLoader(t)};this.addTranslations=(t,e)=>{if(!t)return;let o=Object.keys(c(t));this.privateTranslations.update(s=>o.reduce((a,r)=>l(n({},a),{[r]:n(n({},c(a[r])),R(t[r]))}),s)),o.forEach(s=>{let a=Object.keys(t[s]).map(r=>`${r}`.split(".")[0]);e&&(a=e[s]),this.loadedKeys[s]=Array.from(new Set([...c(this.loadedKeys[s],[]),...c(a,[])]))})};this.getTranslationProps=async(t=this.locale.get(),e=g(this.currentRoute))=>{let o=g(this.config);if(!o||!t)return[];let s=this.translations.get(),{loaders:a,fallbackLocale:r=""}=c(o),f=`${t}`.toLowerCase(),y=r&&`${r}`.toLowerCase(),k=s[f],E=s[y],v=c(a,[]).map(C=>{var u=C,{locale:d}=u,L=w(u,["locale"]);return l(n({},L),{locale:`${d}`.toLowerCase()})}).filter(({routes:d})=>!d||c(d,[]).some(j(e))).filter(({key:d,locale:L})=>L===f&&(!k||!c(this.loadedKeys[f],[]).includes(d))||r&&L===y&&(!E||!c(this.loadedKeys[y],[]).includes(d)));if(v.length){this.isLoading.set(!0);let d=await $(v);this.isLoading.set(!1);let L=Object.keys(d).reduce((u,p)=>l(n({},u),{[p]:Object.keys(d[p])}),{}),C=v.filter(({key:u,locale:p})=>c(L[p],[]).some(b=>`${b}`.startsWith(u))).reduce((u,{key:p,locale:b})=>l(n({},u),{[b]:[...u[b]||[],p]}),{});return[d,C]}return[]};this.translationLoader=async t=>{this.promises.push(new Promise(async e=>{let o=await this.getTranslationProps(t);o.length&&this.addTranslations(...o),e()})),await this.loading.toPromise()};this.loadTranslations=async(t,e=g(this.currentRoute)||"")=>{!t||(this.setRoute(e),this.setLocale(t),await this.loading.toPromise())};t&&this.loadConfig(t),this.loaderTrigger.subscribe(()=>this.translationLoader())}async configLoader(t){if(!t)throw new Error("No config!");this.config.set(t);let{initLocale:e="",translations:o}=t;o&&this.addTranslations(o),await this.loadTranslations(e)}};var V=S;export{V as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltekit-i18n/base",
3
- "version": "1.0.0-beta.0",
3
+ "version": "1.0.0-beta.4",
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",
@@ -22,8 +22,7 @@
22
22
  "lint": "eslint --fix --ext .ts,.js --ignore-path .gitignore ."
23
23
  },
24
24
  "files": [
25
- "lib",
26
- "types"
25
+ "dist"
27
26
  ],
28
27
  "pre-commit": [
29
28
  "lint"