@tolgee/core
Advanced tools
Comparing version
@@ -46,4 +46,12 @@ 'use strict'; | ||
} | ||
function getErrorMessage(error) { | ||
if (typeof error === 'string') { | ||
return error; | ||
} | ||
else if (typeof (error === null || error === void 0 ? void 0 : error.message) === 'string') { | ||
return error.message; | ||
} | ||
} | ||
const EventEmitter = () => { | ||
const EventEmitter = (isActive) => { | ||
let handlers = []; | ||
@@ -62,3 +70,5 @@ const listen = (handler) => { | ||
const emit = (data) => { | ||
handlers.forEach((handler) => handler({ value: data })); | ||
if (isActive()) { | ||
handlers.forEach((handler) => handler({ value: data })); | ||
} | ||
}; | ||
@@ -68,3 +78,3 @@ return Object.freeze({ listen, emit }); | ||
const EventEmitterSelective = (getFallbackNs, getDefaultNs) => { | ||
const EventEmitterSelective = (isActive, getFallbackNs, getDefaultNs) => { | ||
const listeners = new Set(); | ||
@@ -143,9 +153,11 @@ const partialListeners = new Set(); | ||
const emit = (ns, delayed) => { | ||
queue.push(ns); | ||
if (!delayed) { | ||
solveQueue(); | ||
if (isActive()) { | ||
queue.push(ns); | ||
if (!delayed) { | ||
solveQueue(); | ||
} | ||
else { | ||
setTimeout(solveQueue, 0); | ||
} | ||
} | ||
else { | ||
setTimeout(solveQueue, 0); | ||
} | ||
}; | ||
@@ -156,10 +168,14 @@ return Object.freeze({ listenSome, listen, emit }); | ||
const Events = (getFallbackNs, getDefaultNs) => { | ||
const onPendingLanguageChange = EventEmitter(); | ||
const onLanguageChange = EventEmitter(); | ||
const onLoadingChange = EventEmitter(); | ||
const onFetchingChange = EventEmitter(); | ||
const onInitialLoaded = EventEmitter(); | ||
const onRunningChange = EventEmitter(); | ||
const onCacheChange = EventEmitter(); | ||
const onUpdate = EventEmitterSelective(getFallbackNs, getDefaultNs); | ||
let emitterActive = true; | ||
function isActive() { | ||
return emitterActive; | ||
} | ||
const onPendingLanguageChange = EventEmitter(isActive); | ||
const onLanguageChange = EventEmitter(isActive); | ||
const onLoadingChange = EventEmitter(isActive); | ||
const onFetchingChange = EventEmitter(isActive); | ||
const onInitialLoaded = EventEmitter(isActive); | ||
const onRunningChange = EventEmitter(isActive); | ||
const onCacheChange = EventEmitter(isActive); | ||
const onUpdate = EventEmitterSelective(isActive, getFallbackNs, getDefaultNs); | ||
onInitialLoaded.listen(() => onUpdate.emit()); | ||
@@ -190,2 +206,5 @@ onLanguageChange.listen(() => onUpdate.emit()); | ||
}; | ||
function setEmmiterActive(active) { | ||
emitterActive = active; | ||
} | ||
return Object.freeze({ | ||
@@ -200,2 +219,3 @@ onPendingLanguageChange, | ||
onUpdate, | ||
setEmmiterActive, | ||
on, | ||
@@ -440,5 +460,74 @@ }); | ||
/****************************************************************************** | ||
Copyright (c) Microsoft Corporation. | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted. | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */ | ||
function __rest(s, e) { | ||
var t = {}; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { | ||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) | ||
t[p[i]] = s[p[i]]; | ||
} | ||
return t; | ||
} | ||
const defaultObserverOptions = { | ||
tagAttributes: { | ||
textarea: ['placeholder'], | ||
input: ['value', 'placeholder'], | ||
img: ['alt'], | ||
'*': ['aria-label', 'title'], | ||
}, | ||
restrictedElements: ['script', 'style'], | ||
highlightKeys: ['Alt'], | ||
highlightColor: 'rgb(255, 0, 0)', | ||
highlightWidth: 5, | ||
inputPrefix: '%-%tolgee:', | ||
inputSuffix: '%-%', | ||
passToParent: ['option', 'optgroup'], | ||
}; | ||
const DEFAULT_FORMAT_ERROR = 'invalid'; | ||
const defaultValues = { | ||
defaultNs: '', | ||
observerOptions: defaultObserverOptions, | ||
observerType: 'invisible', | ||
onFormatError: DEFAULT_FORMAT_ERROR, | ||
}; | ||
const combineOptions = (...states) => { | ||
let result = {}; | ||
states.forEach((state) => { | ||
result = Object.assign(Object.assign(Object.assign({}, result), state), { observerOptions: Object.assign(Object.assign({}, result.observerOptions), state === null || state === void 0 ? void 0 : state.observerOptions) }); | ||
}); | ||
return result; | ||
}; | ||
const initState = (options, previousState) => { | ||
const initialOptions = combineOptions(defaultValues, previousState === null || previousState === void 0 ? void 0 : previousState.initialOptions, options); | ||
// remove extra '/' from url end | ||
initialOptions.apiUrl = sanitizeUrl(initialOptions.apiUrl); | ||
return { | ||
initialOptions, | ||
activeNamespaces: (previousState === null || previousState === void 0 ? void 0 : previousState.activeNamespaces) || new Map(), | ||
language: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
pendingLanguage: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
isInitialLoading: false, | ||
isRunning: false, | ||
}; | ||
}; | ||
const Plugins = (getLanguage, getInitialOptions, getAvailableLanguages, getTranslationNs, getTranslation, changeTranslation) => { | ||
let prepared = false; | ||
let onPrepareQueue = []; | ||
const plugins = { | ||
@@ -504,3 +593,3 @@ ui: undefined, | ||
const setUi = (ui) => { | ||
plugins.ui = (ui === null || ui === void 0 ? void 0 : ui.UI) || ui; | ||
plugins.ui = ui; | ||
}; | ||
@@ -513,2 +602,5 @@ const hasUi = () => { | ||
}; | ||
const getLanguageStorage = () => { | ||
return instances.languageStorage; | ||
}; | ||
const setStoredLanguage = (language) => { | ||
@@ -553,7 +645,7 @@ var _a; | ||
}; | ||
const run = (isDev) => { | ||
var _a, _b; | ||
if (!instances.ui && plugins.ui) { | ||
const run = () => { | ||
var _a, _b, _c; | ||
if (!instances.ui) { | ||
const { apiKey, apiUrl, projectId } = getInitialOptions(); | ||
instances.ui = new plugins.ui({ | ||
instances.ui = (_a = plugins.ui) === null || _a === void 0 ? void 0 : _a.call(plugins, { | ||
apiKey: apiKey, | ||
@@ -567,3 +659,3 @@ apiUrl: apiUrl, | ||
if (!instances.observer) { | ||
instances.observer = (_a = plugins.observer) === null || _a === void 0 ? void 0 : _a.call(plugins, { | ||
instances.observer = (_b = plugins.observer) === null || _b === void 0 ? void 0 : _b.call(plugins, { | ||
translate, | ||
@@ -574,3 +666,3 @@ onClick, | ||
} | ||
(_b = instances.observer) === null || _b === void 0 ? void 0 : _b.run({ mouseHighlight: isDev }); | ||
(_c = instances.observer) === null || _c === void 0 ? void 0 : _c.run({ mouseHighlight: true }); | ||
}; | ||
@@ -618,5 +710,2 @@ const getDevBackend = () => { | ||
}; | ||
const onPrepare = (callback) => { | ||
onPrepareQueue.push(callback); | ||
}; | ||
function addPlugin(tolgeeInstance, plugin) { | ||
@@ -634,28 +723,42 @@ const pluginTools = Object.freeze({ | ||
setLanguageStorage, | ||
onPrepare, | ||
}); | ||
plugin(tolgeeInstance, pluginTools); | ||
if (prepared) { | ||
prepare(); | ||
} | ||
} | ||
function formatTranslation({ key, translation, defaultValue, noWrap, params, orEmpty, ns, formatEnabled, }) { | ||
var _a; | ||
function formatTranslation(_a) { | ||
var _b; | ||
var { formatEnabled } = _a, props = __rest(_a, ["formatEnabled"]); | ||
const { key, translation, defaultValue, noWrap, params, orEmpty, ns } = props; | ||
const formattableTranslation = translation || defaultValue; | ||
let result = formattableTranslation || (orEmpty ? '' : key); | ||
if (instances.observer && !noWrap) { | ||
result = instances.observer.wrap({ | ||
key, | ||
translation: result, | ||
defaultValue, | ||
params, | ||
ns, | ||
}); | ||
} | ||
const language = getLanguage(); | ||
const isFormatEnabled = formatEnabled || !((_a = instances.observer) === null || _a === void 0 ? void 0 : _a.outputNotFormattable); | ||
if (formattableTranslation && language && isFormatEnabled) { | ||
for (const formatter of instances.formatters) { | ||
result = formatter.format({ | ||
const isFormatEnabled = formatEnabled || !((_b = instances.observer) === null || _b === void 0 ? void 0 : _b.outputNotFormattable); | ||
const wrap = (result) => { | ||
if (instances.observer && !noWrap) { | ||
return instances.observer.wrap({ | ||
key, | ||
translation: result, | ||
defaultValue, | ||
params, | ||
ns, | ||
}); | ||
} | ||
return result; | ||
}; | ||
result = wrap(result); | ||
try { | ||
if (formattableTranslation && language && isFormatEnabled) { | ||
for (const formatter of instances.formatters) { | ||
result = formatter.format({ | ||
translation: result, | ||
language, | ||
params, | ||
}); | ||
} | ||
} | ||
if (instances.finalFormatter && | ||
formattableTranslation && | ||
language && | ||
isFormatEnabled) { | ||
result = instances.finalFormatter.format({ | ||
translation: result, | ||
language, | ||
@@ -666,11 +769,19 @@ params, | ||
} | ||
if (instances.finalFormatter && | ||
formattableTranslation && | ||
language && | ||
isFormatEnabled) { | ||
result = instances.finalFormatter.format({ | ||
translation: result, | ||
language, | ||
params, | ||
}); | ||
catch (e) { | ||
// eslint-disable-next-line no-console | ||
console.error(e); | ||
const errorMessage = getErrorMessage(e) || DEFAULT_FORMAT_ERROR; | ||
const onFormatError = getInitialOptions().onFormatError; | ||
const formatErrorType = typeof onFormatError; | ||
if (formatErrorType === 'string') { | ||
result = onFormatError; | ||
} | ||
else if (formatErrorType === 'function') { | ||
result = onFormatError(errorMessage, props); | ||
} | ||
else { | ||
result = DEFAULT_FORMAT_ERROR; | ||
} | ||
// wrap error message, so it's detectable | ||
result = wrap(result); | ||
} | ||
@@ -689,12 +800,3 @@ return result; | ||
}; | ||
function prepare() { | ||
prepared = true; | ||
while (onPrepareQueue.length) { | ||
const queue = onPrepareQueue; | ||
onPrepareQueue = []; | ||
queue.forEach((callback) => callback()); | ||
} | ||
} | ||
return Object.freeze({ | ||
prepare, | ||
addPlugin, | ||
@@ -706,2 +808,3 @@ formatTranslation, | ||
getLanguageDetector, | ||
getLanguageStorage, | ||
getInitialLanguage, | ||
@@ -737,44 +840,2 @@ setStoredLanguage, | ||
const defaultObserverOptions = { | ||
tagAttributes: { | ||
textarea: ['placeholder'], | ||
input: ['value', 'placeholder'], | ||
img: ['alt'], | ||
'*': ['aria-label', 'title'], | ||
}, | ||
restrictedElements: ['script', 'style'], | ||
highlightKeys: ['Alt'], | ||
highlightColor: 'rgb(255, 0, 0)', | ||
highlightWidth: 5, | ||
inputPrefix: '%-%tolgee:', | ||
inputSuffix: '%-%', | ||
passToParent: ['option', 'optgroup'], | ||
}; | ||
const defaultValues = { | ||
defaultNs: '', | ||
observerOptions: defaultObserverOptions, | ||
observerType: 'invisible', | ||
}; | ||
const combineOptions = (...states) => { | ||
let result = {}; | ||
states.forEach((state) => { | ||
result = Object.assign(Object.assign(Object.assign({}, result), state), { observerOptions: Object.assign(Object.assign({}, result.observerOptions), state === null || state === void 0 ? void 0 : state.observerOptions) }); | ||
}); | ||
return result; | ||
}; | ||
const initState = (options, previousState) => { | ||
const initialOptions = combineOptions(defaultValues, previousState === null || previousState === void 0 ? void 0 : previousState.initialOptions, options); | ||
// remove extra '/' from url end | ||
initialOptions.apiUrl = sanitizeUrl(initialOptions.apiUrl); | ||
return { | ||
initialOptions, | ||
activeNamespaces: (previousState === null || previousState === void 0 ? void 0 : previousState.activeNamespaces) || new Map(), | ||
language: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
pendingLanguage: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
isInitialLoading: false, | ||
isRunning: false, | ||
}; | ||
}; | ||
const State = (onLanguageChange, onPendingLanguageChange, onRunningChange) => { | ||
@@ -917,29 +978,2 @@ let state = initState(); | ||
/****************************************************************************** | ||
Copyright (c) Microsoft Corporation. | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted. | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */ | ||
function __rest(s, e) { | ||
var t = {}; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { | ||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) | ||
t[p[i]] = s[p[i]]; | ||
} | ||
return t; | ||
} | ||
function parseCombinedOptions(_a) { | ||
@@ -1142,4 +1176,4 @@ var { ns, noWrap, orEmpty, params } = _a, rest = __rest(_a, ["ns", "noWrap", "orEmpty", "params"]); | ||
const checkCorrectConfiguration = () => { | ||
const languageDetector = pluginService.getLanguageDetector(); | ||
if (languageDetector) { | ||
const languageComputable = pluginService.getLanguageDetector() || pluginService.getLanguageStorage(); | ||
if (languageComputable) { | ||
const availableLanguages = state.getAvailableLanguages(); | ||
@@ -1151,3 +1185,3 @@ if (!availableLanguages) { | ||
if (!state.getLanguage() && !state.getInitialOptions().defaultLanguage) { | ||
if (languageDetector) { | ||
if (languageComputable) { | ||
throw new Error(missingOptionError('defaultLanguage')); | ||
@@ -1168,3 +1202,3 @@ } | ||
state.setRunning(true); | ||
pluginService.run(isDev()); | ||
pluginService.run(); | ||
result = loadInitial(); | ||
@@ -1232,2 +1266,6 @@ } | ||
/** | ||
* Turn off/on events emitting. Is on by default. | ||
*/ | ||
setEmmiterActive: controller.setEmmiterActive, | ||
/** | ||
* @return current language if set. | ||
@@ -1346,3 +1384,5 @@ */ | ||
/** | ||
* Override creadentials passed on initialization | ||
* Override creadentials passed on initialization. | ||
* | ||
* When called in running state, tolgee stops and runs again. | ||
*/ | ||
@@ -1353,3 +1393,5 @@ overrideCredentials(credentials) { | ||
/** | ||
* Add tolgee plugin. | ||
* Add tolgee plugin after initialization. | ||
* | ||
* When called in running state, tolgee stops and runs again. | ||
*/ | ||
@@ -1383,3 +1425,3 @@ addPlugin(plugin) { | ||
*/ | ||
const Tolgee = () => { | ||
const TolgeeCore = () => { | ||
const state = { | ||
@@ -1562,3 +1604,3 @@ plugins: [], | ||
exports.FormatSimple = FormatSimple; | ||
exports.Tolgee = Tolgee; | ||
exports.TolgeeCore = TolgeeCore; | ||
exports.getFallback = getFallback; | ||
@@ -1565,0 +1607,0 @@ exports.getFallbackArray = getFallbackArray; |
@@ -1,2 +0,2 @@ | ||
"use strict";function e(e){return Boolean(e&&"function"==typeof e.then)}Object.defineProperty(exports,"__esModule",{value:!0});const n=(n,t)=>e(n)?Promise.resolve(n).then(t):t(n),t=e=>`Tolgee: You need to specify '${e}' option`;function a(e){return"string"==typeof e?[e]:Array.isArray(e)?e:void 0}function i(e){return a(e)||[]}function o(e,n){return"object"!=typeof(t=n)||Array.isArray(t)||null===t?i(n):i(null==n?void 0:n[e]);var t}function r(e){return Array.from(new Set(e))}function s(e){return e?e.replace(/\/+$/,""):e}const c=()=>{let e=[];return Object.freeze({listen:n=>{const t=e=>{n(e)};return e.push(t),{unsubscribe:()=>{e=e.filter((e=>t!==e))}}},emit:n=>{e.forEach((e=>e({value:n})))}})},g=(e,n)=>{const t=new Set,a=new Set;let o=[];const r=()=>{if(0===o.length)return;const n=o;o=[],t.forEach((e=>{e({value:void 0})}));let i=new Set;n.forEach((e=>{void 0===e?i=void 0:void 0!==i&&e.forEach((e=>i.add(e)))}));(n=>{const t=new Set(e());a.forEach((e=>{(void 0===n||-1!==(null==n?void 0:n.findIndex((n=>t.has(n)||e.namespaces.has(n)))))&&e.fn({value:void 0})}))})(i?Array.from(i.keys()):void 0)};return Object.freeze({listenSome:e=>{const t={fn:n=>{e(n)},namespaces:new Set};a.add(t);const o={unsubscribe:()=>{a.delete(t)},subscribeNs:e=>(i(e).forEach((e=>t.namespaces.add(e))),void 0===e&&t.namespaces.add(n()),o)};return o},listen:e=>{t.add(e);return{unsubscribe:()=>{t.delete(e)}}},emit:(e,n)=>{o.push(e),n?setTimeout(r,0):r()}})},u=e=>{const n=new Map;return Object.entries(e).forEach((([e,t])=>{null!=t&&("object"!=typeof t?n.set(e,t):u(t).forEach(((t,a)=>{n.set(e+"."+a,t)})))})),n},l=e=>{const[n,...t]=e.split(":");return{language:n,namespace:t.join(":")||""}},d=({language:e,namespace:n})=>n?`${e}:${n}`:e,f=(e,n,t,a,o,s,c)=>{const g=new Map,f=new Map;let p={},v=0;function h(n,t,a){const i=d(n);f.set(i,{data:u(t),version:a}),e.emit(n)}function b(e,n){h(e,n,v)}function m(e,n=!1){const t=f.get(d(e));return t&&n?t.version===v:Boolean(t)}function O(e){var n;return null===(n=f.get(d(a(e))))||void 0===n?void 0:n.data}function y(e){let t;if(!t){const n=p[d(e)];"function"==typeof n&&(t=n())}return t||(t=n(e)),t}return Object.freeze({addStaticData:function(e){e&&(p=Object.assign(Object.assign({},p),e),Object.entries(e).forEach((([e,n])=>{if("function"!=typeof n){const t=l(e),a=f.get(e);a&&0!==a.version||h(t,n,0)}})))},invalidate:function(){g.clear(),v+=1},addRecord:b,exists:m,getRecord:O,getTranslation:function(e,n){var t;return null===(t=f.get(d(e)))||void 0===t?void 0:t.data.get(n)},getTranslationNs:function(e,n,t){var a;for(const i of e)for(const e of n){const n=null===(a=f.get(d({language:e,namespace:i})))||void 0===a?void 0:a.data.get(t);if(null!=n)return[i]}return r(e)},getTranslationFallback:function(e,n,t){var a;for(const i of e)for(const e of n){const n=null===(a=f.get(d({language:e,namespace:i})))||void 0===a?void 0:a.data.get(t);if(null!=n)return n}},changeTranslation:function(n,t,a){var i;const o=null===(i=f.get(d(n)))||void 0===i?void 0:i.data;null==o||o.set(t,a),e.emit(Object.assign(Object.assign({},n),{key:t}))},isFetching:function(e){if(o())return!0;if(void 0===e)return g.size>0;const n=i(e);return Boolean(Array.from(g.keys()).find((e=>n.includes(l(e).namespace))))},isLoading:function(e,n){const t=i(n);return Boolean(o()||Array.from(g.keys()).find((n=>{const a=l(n);return(!t.length||t.includes(a.namespace))&&!m({namespace:a.namespace,language:e})})))},loadRecords:async function(e,n){const i=e.map((e=>{const i=a(e),o=d(i),r=g.get(o);if(r)return{new:!1,promise:r,keyObject:i,cacheKey:o};const s=function(e,n){var a;let i;return n&&(i=null===(a=t(e))||void 0===a?void 0:a.catch((()=>(console.warn("Tolgee: Failed to fetch data from dev backend"),y(e))))),i||(i=y(e)),i}(i,n)||Promise.resolve(void 0);return g.set(o,s),{new:!0,promise:s,keyObject:i,cacheKey:o}}));s.notify(),c.notify();const o=await Promise.all(i.map((e=>e.promise)));return i.forEach(((e,n)=>{const t=g.get(e.cacheKey)!==e.promise;if(e.new&&!t){g.delete(e.cacheKey);const t=o[n];t?b(e.keyObject,t):O(e.keyObject)||b(e.keyObject,{})}})),s.notify(),c.notify(),i.map((e=>O(e.keyObject)))},getAllRecords:function(){return Array.from(f.entries()).map((([e,n])=>Object.assign(Object.assign({},l(e)),{data:n.data})))}})},p=(t,a,i,o,r,s)=>{let c=!1,g=[];const u={ui:void 0,observer:void 0},l={formatters:[],finalFormatter:void 0,observer:void 0,devBackend:void 0,backends:[],ui:void 0,languageDetector:void 0,languageStorage:void 0},d=async({keysAndDefaults:e,event:n})=>{var t;const a=e.map((({key:e,ns:n,defaultValue:t})=>({key:e,defaultValue:t,ns:o({key:e,ns:n}),translation:r({key:e,ns:n})})));null===(t=l.ui)||void 0===t||t.handleElementClick(a,n)},f=(e,n)=>{var t,a;return(null===(a=null===(t=l.observer)||void 0===t?void 0:t.highlight)||void 0===a?void 0:a.call(t,e,n))||{unhighlight(){}}},p=e=>{const n=r({key:e.key,ns:e.ns});return E(Object.assign(Object.assign({},e),{translation:n,formatEnabled:!0}))},v=e=>{u.observer=e},h=()=>Boolean(u.observer),b=e=>{e&&l.formatters.push(e)},m=e=>{l.finalFormatter=e},O=e=>{u.ui=(null==e?void 0:e.UI)||e},y=()=>Boolean(u.ui),L=e=>{l.languageStorage=e},j=e=>{l.languageDetector=e},k=e=>{e&&l.backends.push(e)},w=e=>{l.devBackend=e},R=()=>l.devBackend,N=e=>{g.push(e)};function E({key:e,translation:n,defaultValue:a,noWrap:i,params:o,orEmpty:r,ns:s,formatEnabled:c}){var g;const u=n||a;let d=u||(r?"":e);l.observer&&!i&&(d=l.observer.wrap({key:e,translation:d,defaultValue:a,params:o,ns:s}));const f=t(),p=c||!(null===(g=l.observer)||void 0===g?void 0:g.outputNotFormattable);if(u&&f&&p)for(const e of l.formatters)d=e.format({translation:d,language:f,params:o});return l.finalFormatter&&u&&f&&p&&(d=l.finalFormatter.format({translation:d,language:f,params:o})),d}function I(){for(c=!0;g.length;){const e=g;g=[],e.forEach((e=>e()))}}return Object.freeze({prepare:I,addPlugin:function(e,n){n(e,Object.freeze({setFinalFormatter:m,addFormatter:b,setObserver:v,hasObserver:h,setUi:O,hasUi:y,setDevBackend:w,addBackend:k,setLanguageDetector:j,setLanguageStorage:L,onPrepare:N})),c&&I()},formatTranslation:E,getDevBackend:R,getBackendRecord:({language:n,namespace:t})=>{for(const a of l.backends){const i=a.getRecord({language:n,namespace:t});if(e(i))return null==i?void 0:i.catch((e=>(console.error(e),{})));if(void 0!==i)return i}},getBackendDevRecord:({language:e,namespace:n})=>{var t;const{apiKey:i,apiUrl:o,projectId:r}=a();return null===(t=l.devBackend)||void 0===t?void 0:t.getRecord({apiKey:i,apiUrl:o,projectId:r,language:e,namespace:n})},getLanguageDetector:()=>l.languageDetector,getInitialLanguage:()=>{var e;const t=i(),a=null===(e=l.languageStorage)||void 0===e?void 0:e.getLanguage();return n(a,(e=>t&&!t.includes(e)||!e?(()=>{if(!l.languageDetector)return;const e=i();return l.languageDetector.getLanguage({availableLanguages:e})})():e))},setStoredLanguage:e=>{var n;null===(n=l.languageStorage)||void 0===n||n.setLanguage(e)},run:e=>{var n,t;if(!l.ui&&u.ui){const{apiKey:e,apiUrl:n,projectId:t}=a();l.ui=new u.ui({apiKey:e,apiUrl:n,projectId:t,highlight:f,changeTranslation:s})}l.observer||(l.observer=null===(n=u.observer)||void 0===n?void 0:n.call(u,{translate:p,onClick:d,options:a().observerOptions})),null===(t=l.observer)||void 0===t||t.run({mouseHighlight:e})},stop:()=>{var e;l.ui=void 0,null===(e=l.observer)||void 0===e||e.stop()},retranslate:()=>{var e;null===(e=l.observer)||void 0===e||e.retranslate()},highlight:f,unwrap:e=>{var n;return l.observer?null===(n=l.observer)||void 0===n?void 0:n.unwrap(e):{text:e,keys:[]}},wrap:e=>{var n;return l.observer?null===(n=l.observer)||void 0===n?void 0:n.wrap(e):e.translation},hasDevBackend:function(){return Boolean(R())}})},v=(e,n,t)=>{let a=e;return Object.freeze({init:function(e){a=e},notify:function(){const e=n();a!==e&&t(e),a=e}})},h={defaultNs:"",observerOptions:{tagAttributes:{textarea:["placeholder"],input:["value","placeholder"],img:["alt"],"*":["aria-label","title"]},restrictedElements:["script","style"],highlightKeys:["Alt"],highlightColor:"rgb(255, 0, 0)",highlightWidth:5,inputPrefix:"%-%tolgee:",inputSuffix:"%-%",passToParent:["option","optgroup"]},observerType:"invisible"},b=(...e)=>{let n={};return e.forEach((e=>{n=Object.assign(Object.assign(Object.assign({},n),e),{observerOptions:Object.assign(Object.assign({},n.observerOptions),null==e?void 0:e.observerOptions)})})),n},m=(e,n)=>{const t=b(h,null==n?void 0:n.initialOptions,e);return t.apiUrl=s(t.apiUrl),{initialOptions:t,activeNamespaces:(null==n?void 0:n.activeNamespaces)||new Map,language:null==n?void 0:n.language,pendingLanguage:null==n?void 0:n.language,isInitialLoading:!1,isRunning:!1}};function O(e){var{ns:n,noWrap:t,orEmpty:a,params:i}=e,o=function(e,n){var t={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&n.indexOf(a)<0&&(t[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(a=Object.getOwnPropertySymbols(e);i<a.length;i++)n.indexOf(a[i])<0&&Object.prototype.propertyIsEnumerable.call(e,a[i])&&(t[a[i]]=e[a[i]])}return t}(e,["ns","noWrap","orEmpty","params"]);const r={ns:n,noWrap:t,orEmpty:a};return Object.assign(Object.assign({},r),{params:Object.assign({},o)})}const y=(e,...n)=>{let t,a={};return"object"==typeof e?a=e:(a.key=e,"string"==typeof n[0]?(a.defaultValue=n[0],t=n[1]):"object"==typeof n[0]&&(t=n[0])),t&&(a=Object.assign(Object.assign({},O(t)),a)),a},L=({options:a})=>{const u=((e,n)=>{const t=c(),a=c(),i=c(),o=c(),r=c(),s=c(),u=c(),l=g(e,n);return r.listen((()=>l.emit())),a.listen((()=>l.emit())),u.listen((({value:e})=>{l.emit([e.namespace],!0)})),Object.freeze({onPendingLanguageChange:t,onLanguageChange:a,onLoadingChange:i,onFetchingChange:o,onInitialLoaded:r,onRunningChange:s,onCacheChange:u,onUpdate:l,on:(e,n)=>{switch(e){case"pendingLanguage":return t.listen(n);case"language":return a.listen(n);case"loading":return i.listen(n);case"fetching":return o.listen(n);case"initialLoad":return r.listen(n);case"running":return s.listen(n);case"cache":return u.listen(n);case"update":return l.listen(n)}}})})(j,k),d=v(!1,(()=>L.isFetching()),u.onFetchingChange.emit),h=v(!1,(()=>I()),u.onLoadingChange.emit),b=((e,n,t)=>{let a,c=m();function g(){return c.language||c.initialOptions.language}function u(){return Object.assign(Object.assign({},c.initialOptions),a)}return Object.freeze({init:function(e){c=m(e,c)},isRunning:function(){return c.isRunning},setRunning:function(e){c.isRunning!==e&&(c.isRunning=e,t.emit(e))},isInitialLoading:function(){return c.isInitialLoading},setInitialLoading:function(e){c.isInitialLoading=e},getLanguage:g,setLanguage:function(n){c.language!==n&&(c.language=n,e.emit(n))},getPendingLanguage:function(){return c.pendingLanguage||g()},setPendingLanguage:function(e){c.pendingLanguage!==e&&(c.pendingLanguage=e,n.emit(e))},getInitialOptions:u,addActiveNs:function(e){i(e).forEach((e=>{const n=c.activeNamespaces.get(e);void 0!==n?c.activeNamespaces.set(e,n+1):c.activeNamespaces.set(e,1)}))},removeActiveNs:function(e){i(e).forEach((e=>{const n=c.activeNamespaces.get(e);void 0!==n&&n>1?c.activeNamespaces.set(e,n-1):c.activeNamespaces.delete(e)}))},getRequiredNamespaces:function(){return r([...c.initialOptions.ns||[c.initialOptions.defaultNs],...i(c.initialOptions.fallbackNs),...c.activeNamespaces.keys()])},getFallbackLangs:function(e){const n=e||g();return n?r([n,...o(n,c.initialOptions.fallbackLanguage)]):[]},getFallbackNs:function(){return i(c.initialOptions.fallbackNs)},getDefaultNs:function(e){return void 0===e?c.initialOptions.defaultNs:e},getAvailableLanguages:function(){if(c.initialOptions.availableLanguages)return c.initialOptions.availableLanguages;if(c.initialOptions.staticData){const e=Object.keys(c.initialOptions.staticData).map((e=>l(e).language));return Array.from(new Set(e))}},withDefaultNs:function(e){return{namespace:void 0===e.namespace?u().defaultNs:e.namespace,language:e.language}},overrideCredentials:function(e){a=e?Object.assign(Object.assign({},e),{apiUrl:s(e.apiUrl)}):void 0}})})(u.onLanguageChange,u.onPendingLanguageChange,u.onRunningChange),O=p(b.getLanguage,b.getInitialOptions,b.getAvailableLanguages,(function({key:e,ns:n}){const t=b.getFallbackLangs(),a=w(n);return L.getTranslationNs(a,t,e)}),F,N),L=f(u.onCacheChange,O.getBackendRecord,O.getBackendDevRecord,b.withDefaultNs,b.isInitialLoading,d,h);function j(){return b.getFallbackNs()}function k(e){return b.getDefaultNs(e)}function w(e){return[...i(k(e)),...j()]}function R(e){return[...i(e||k()),...b.getRequiredNamespaces()]}function N(e,n,t){const a=b.withDefaultNs(e),i=L.getTranslation(a,n);return L.changeTranslation(a,n,t),{revert:()=>{L.changeTranslation(a,n,i)}}}function E(e){b.init(e),L.addStaticData(b.getInitialOptions().staticData)}function I(e){return L.isLoading(b.getLanguage(),e)}function D(){return Boolean(b.getInitialOptions().apiKey&&b.getInitialOptions().apiUrl)}function A(e,t){const a=function(e,n){const t=b.getFallbackLangs(e),a=R(n),i=[];return t.forEach((e=>{a.forEach((n=>{L.exists({language:e,namespace:n},!0)||i.push({language:e,namespace:n})}))})),i}(e,t);if(a.length)return n(P(a),(()=>{}))}function F({key:e,ns:n}){const t=w(n),a=b.getFallbackLangs();return L.getTranslationFallback(t,a,e)}function S(){const a=n(function(){if(b.getLanguage())return;if(!b.getInitialOptions().defaultLanguage)throw new Error(t("defaultLanguage"));const e=O.getInitialLanguage();return n(e,(e=>{const n=e||b.getInitialOptions().defaultLanguage;n&&b.setLanguage(n)}))}(),(()=>A()));if(e(a))return b.setInitialLoading(!0),d.notify(),h.notify(),Promise.resolve(a).then((()=>{b.setInitialLoading(!1),d.notify(),h.notify(),u.onInitialLoaded.emit()}));u.onInitialLoaded.emit()}function P(e){return L.loadRecords(e,D())}a&&E(a),u.onUpdate.listen((()=>{b.isRunning()&&O.retranslate()}));return Object.freeze(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},u),b),O),L),{init:E,changeLanguage:async function(e){b.getPendingLanguage()===e&&b.getLanguage()===e||(b.setPendingLanguage(e),b.isRunning()&&await A(e),e===b.getPendingLanguage()&&(b.setLanguage(e),O.setStoredLanguage(e)))},getTranslation:F,changeTranslation:N,addActiveNs:async function(e,n){n||b.addActiveNs(e),b.isRunning()&&await A(void 0,e)},loadRecords:P,loadRecord:async function(e){return(await P([e]))[0]},isLoading:I,isLoaded:function(e){const n=b.getLanguage();if(!n)return!1;const t=b.getFallbackLangs(n),a=R(e),i=[];return t.forEach((e=>{a.forEach((n=>{L.exists({language:e,namespace:n})||i.push({language:e,namespace:n})}))})),0===i.length},t:(...e)=>{const n=y(...e),t=F(n);return O.formatTranslation(Object.assign(Object.assign({},n),{translation:t}))},isDev:D,run:function(){let e;return(()=>{const e=O.getLanguageDetector();if(e&&!b.getAvailableLanguages())throw new Error(t("availableLanguages"));if(!b.getLanguage()&&!b.getInitialOptions().defaultLanguage)throw e?new Error(t("defaultLanguage")):new Error(t("language"))})(),b.isRunning()||(D()&&L.invalidate(),b.setRunning(!0),O.run(D()),e=S()),Promise.resolve(e)},stop:function(){b.isRunning()&&(O.stop(),b.setRunning(!1))}}))};class j extends Error{constructor(e,n,t){let a;a=0===e?"Empty parameter":1===e?"Unexpected character":"Unexpected end",super(`Tolgee parser: ${a} at ${n} in "${t}"`),this.code=e,this.index=n}}function k(e){return/\s/.test(e)}const w=new Set([2,1,0]),R=new Set(["{","}","'"]);function N(e,n){const[t,a]=function(e){let n=0,t="",a="",i="";const o=[],r=[];let s=0;function c(n){throw new j(n,s,e)}const g=()=>{o.push(t),t=""},u=()=>{""===a&&c(0),r.push(a),a=""};for(s=0;s<e.length;s++)switch(i=e[s],n){case 0:"'"===i?(t+=i,n=1):"{"===i?(g(),n=3):(t+=i,n=0);break;case 1:R.has(i)?(t=t.slice(0,-1)+i,n=2):(t+=i,n=0);break;case 2:"'"===i?n=0:(t+=i,n=2);break;case 3:"}"===i?(u(),n=0):k(i)?""!==a&&(u(),n=4):(/[0-9a-zA-Z_]/.test(i)||c(1),a+=i,n=3);break;case 4:"}"==i?n=0:k(i)?n=4:c(1)}return w.has(n)||c(2),g(),[o,r]}(e),i=[t[0]];for(let o=1;o<t.length;o++){const r=null==n?void 0:n[a[o-1]];if(void 0===r)throw new Error(`Missing parameter "${a[o-1]}" in "${e}"`);i.push(String(r)),i.push(t[o])}return i.join("")}exports.FormatSimple=()=>(e,n)=>(n.setFinalFormatter({format:({translation:e,params:n})=>N(e,n)}),e),exports.Tolgee=()=>{const e={plugins:[],options:{}},n=Object.freeze({use:t=>(e.plugins.push(t),n),updateDefaults:t=>(e.options=b(e.options,t),n),init(n){const t=(e=>{const n=L({options:e}),t=e=>{const t=n.isRunning();t&&n.stop(),e(),t&&n.run()},a=Object.freeze({on:n.on,onNsUpdate:n.onUpdate.listenSome,getLanguage:n.getLanguage,getPendingLanguage:n.getPendingLanguage,changeLanguage:n.changeLanguage,changeTranslation:n.changeTranslation,addActiveNs:n.addActiveNs,removeActiveNs:n.removeActiveNs,loadRecords:n.loadRecords,loadRecord:n.loadRecord,addStaticData:n.addStaticData,getRecord:n.getRecord,getAllRecords:n.getAllRecords,isLoaded:n.isLoaded,isInitialLoading:n.isInitialLoading,isLoading:n.isLoading,isFetching:n.isFetching,isRunning:n.isRunning,run:n.run,stop:n.stop,t:n.t,highlight:n.highlight,getInitialOptions:n.getInitialOptions,isDev:n.isDev,wrap:n.wrap,unwrap:n.unwrap,overrideCredentials(e){t((()=>n.overrideCredentials(e)))},addPlugin(e){e&&t((()=>n.addPlugin(a,e)))},updateOptions(e){e&&t((()=>n.init(e)))}});return a})(b(e.options,n));return e.plugins.forEach(t.addPlugin),t}});return n},exports.getFallback=a,exports.getFallbackArray=i,exports.getTranslateProps=y; | ||
"use strict";function e(e){return Boolean(e&&"function"==typeof e.then)}Object.defineProperty(exports,"__esModule",{value:!0});const n=(n,t)=>e(n)?Promise.resolve(n).then(t):t(n),t=e=>`Tolgee: You need to specify '${e}' option`;function a(e){return"string"==typeof e?[e]:Array.isArray(e)?e:void 0}function i(e){return a(e)||[]}function o(e,n){return"object"!=typeof(t=n)||Array.isArray(t)||null===t?i(n):i(null==n?void 0:n[e]);var t}function r(e){return Array.from(new Set(e))}function s(e){return e?e.replace(/\/+$/,""):e}const c=e=>{let n=[];return Object.freeze({listen:e=>{const t=n=>{e(n)};return n.push(t),{unsubscribe:()=>{n=n.filter((e=>t!==e))}}},emit:t=>{e()&&n.forEach((e=>e({value:t})))}})},g=(e,n,t)=>{const a=new Set,o=new Set;let r=[];const s=()=>{if(0===r.length)return;const e=r;r=[],a.forEach((e=>{e({value:void 0})}));let t=new Set;e.forEach((e=>{void 0===e?t=void 0:void 0!==t&&e.forEach((e=>t.add(e)))}));(e=>{const t=new Set(n());o.forEach((n=>{(void 0===e||-1!==(null==e?void 0:e.findIndex((e=>t.has(e)||n.namespaces.has(e)))))&&n.fn({value:void 0})}))})(t?Array.from(t.keys()):void 0)};return Object.freeze({listenSome:e=>{const n={fn:n=>{e(n)},namespaces:new Set};o.add(n);const a={unsubscribe:()=>{o.delete(n)},subscribeNs:e=>(i(e).forEach((e=>n.namespaces.add(e))),void 0===e&&n.namespaces.add(t()),a)};return a},listen:e=>{a.add(e);return{unsubscribe:()=>{a.delete(e)}}},emit:(n,t)=>{e()&&(r.push(n),t?setTimeout(s,0):s())}})},u=e=>{const n=new Map;return Object.entries(e).forEach((([e,t])=>{null!=t&&("object"!=typeof t?n.set(e,t):u(t).forEach(((t,a)=>{n.set(e+"."+a,t)})))})),n},l=e=>{const[n,...t]=e.split(":");return{language:n,namespace:t.join(":")||""}},d=({language:e,namespace:n})=>n?`${e}:${n}`:e,f=(e,n,t,a,o,s,c)=>{const g=new Map,f=new Map;let p={},v=0;function h(n,t,a){const i=d(n);f.set(i,{data:u(t),version:a}),e.emit(n)}function b(e,n){h(e,n,v)}function m(e,n=!1){const t=f.get(d(e));return t&&n?t.version===v:Boolean(t)}function y(e){var n;return null===(n=f.get(d(a(e))))||void 0===n?void 0:n.data}function O(e){let t;if(!t){const n=p[d(e)];"function"==typeof n&&(t=n())}return t||(t=n(e)),t}return Object.freeze({addStaticData:function(e){e&&(p=Object.assign(Object.assign({},p),e),Object.entries(e).forEach((([e,n])=>{if("function"!=typeof n){const t=l(e),a=f.get(e);a&&0!==a.version||h(t,n,0)}})))},invalidate:function(){g.clear(),v+=1},addRecord:b,exists:m,getRecord:y,getTranslation:function(e,n){var t;return null===(t=f.get(d(e)))||void 0===t?void 0:t.data.get(n)},getTranslationNs:function(e,n,t){var a;for(const i of e)for(const e of n){const n=null===(a=f.get(d({language:e,namespace:i})))||void 0===a?void 0:a.data.get(t);if(null!=n)return[i]}return r(e)},getTranslationFallback:function(e,n,t){var a;for(const i of e)for(const e of n){const n=null===(a=f.get(d({language:e,namespace:i})))||void 0===a?void 0:a.data.get(t);if(null!=n)return n}},changeTranslation:function(n,t,a){var i;const o=null===(i=f.get(d(n)))||void 0===i?void 0:i.data;null==o||o.set(t,a),e.emit(Object.assign(Object.assign({},n),{key:t}))},isFetching:function(e){if(o())return!0;if(void 0===e)return g.size>0;const n=i(e);return Boolean(Array.from(g.keys()).find((e=>n.includes(l(e).namespace))))},isLoading:function(e,n){const t=i(n);return Boolean(o()||Array.from(g.keys()).find((n=>{const a=l(n);return(!t.length||t.includes(a.namespace))&&!m({namespace:a.namespace,language:e})})))},loadRecords:async function(e,n){const i=e.map((e=>{const i=a(e),o=d(i),r=g.get(o);if(r)return{new:!1,promise:r,keyObject:i,cacheKey:o};const s=function(e,n){var a;let i;return n&&(i=null===(a=t(e))||void 0===a?void 0:a.catch((()=>(console.warn("Tolgee: Failed to fetch data from dev backend"),O(e))))),i||(i=O(e)),i}(i,n)||Promise.resolve(void 0);return g.set(o,s),{new:!0,promise:s,keyObject:i,cacheKey:o}}));s.notify(),c.notify();const o=await Promise.all(i.map((e=>e.promise)));return i.forEach(((e,n)=>{const t=g.get(e.cacheKey)!==e.promise;if(e.new&&!t){g.delete(e.cacheKey);const t=o[n];t?b(e.keyObject,t):y(e.keyObject)||b(e.keyObject,{})}})),s.notify(),c.notify(),i.map((e=>y(e.keyObject)))},getAllRecords:function(){return Array.from(f.entries()).map((([e,n])=>Object.assign(Object.assign({},l(e)),{data:n.data})))}})};function p(e,n){var t={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&n.indexOf(a)<0&&(t[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(a=Object.getOwnPropertySymbols(e);i<a.length;i++)n.indexOf(a[i])<0&&Object.prototype.propertyIsEnumerable.call(e,a[i])&&(t[a[i]]=e[a[i]])}return t}const v={defaultNs:"",observerOptions:{tagAttributes:{textarea:["placeholder"],input:["value","placeholder"],img:["alt"],"*":["aria-label","title"]},restrictedElements:["script","style"],highlightKeys:["Alt"],highlightColor:"rgb(255, 0, 0)",highlightWidth:5,inputPrefix:"%-%tolgee:",inputSuffix:"%-%",passToParent:["option","optgroup"]},observerType:"invisible",onFormatError:"invalid"},h=(...e)=>{let n={};return e.forEach((e=>{n=Object.assign(Object.assign(Object.assign({},n),e),{observerOptions:Object.assign(Object.assign({},n.observerOptions),null==e?void 0:e.observerOptions)})})),n},b=(e,n)=>{const t=h(v,null==n?void 0:n.initialOptions,e);return t.apiUrl=s(t.apiUrl),{initialOptions:t,activeNamespaces:(null==n?void 0:n.activeNamespaces)||new Map,language:null==n?void 0:n.language,pendingLanguage:null==n?void 0:n.language,isInitialLoading:!1,isRunning:!1}},m=(t,a,i,o,r,s)=>{const c={ui:void 0,observer:void 0},g={formatters:[],finalFormatter:void 0,observer:void 0,devBackend:void 0,backends:[],ui:void 0,languageDetector:void 0,languageStorage:void 0},u=async({keysAndDefaults:e,event:n})=>{var t;const a=e.map((({key:e,ns:n,defaultValue:t})=>({key:e,defaultValue:t,ns:o({key:e,ns:n}),translation:r({key:e,ns:n})})));null===(t=g.ui)||void 0===t||t.handleElementClick(a,n)},l=(e,n)=>{var t,a;return(null===(a=null===(t=g.observer)||void 0===t?void 0:t.highlight)||void 0===a?void 0:a.call(t,e,n))||{unhighlight(){}}},d=e=>{const n=r({key:e.key,ns:e.ns});return R(Object.assign(Object.assign({},e),{translation:n,formatEnabled:!0}))},f=e=>{c.observer=e},v=()=>Boolean(c.observer),h=e=>{e&&g.formatters.push(e)},b=e=>{g.finalFormatter=e},m=e=>{c.ui=e},y=()=>Boolean(c.ui),O=e=>{g.languageStorage=e},L=e=>{g.languageDetector=e},j=e=>{e&&g.backends.push(e)},k=e=>{g.devBackend=e},w=()=>g.devBackend;function R(e){var n,{formatEnabled:i}=e,o=p(e,["formatEnabled"]);const{key:r,translation:s,defaultValue:c,noWrap:u,params:l,orEmpty:d,ns:f}=o,v=s||c;let h=v||(d?"":r);const b=t(),m=i||!(null===(n=g.observer)||void 0===n?void 0:n.outputNotFormattable),y=e=>g.observer&&!u?g.observer.wrap({key:r,translation:e,defaultValue:c,params:l,ns:f}):e;h=y(h);try{if(v&&b&&m)for(const e of g.formatters)h=e.format({translation:h,language:b,params:l});g.finalFormatter&&v&&b&&m&&(h=g.finalFormatter.format({translation:h,language:b,params:l}))}catch(e){console.error(e);const n=("string"==typeof(O=e)?O:"string"==typeof(null==O?void 0:O.message)?O.message:void 0)||"invalid",t=a().onFormatError,i=typeof t;h="string"===i?t:"function"===i?t(n,o):"invalid",h=y(h)}var O;return h}return Object.freeze({addPlugin:function(e,n){n(e,Object.freeze({setFinalFormatter:b,addFormatter:h,setObserver:f,hasObserver:v,setUi:m,hasUi:y,setDevBackend:k,addBackend:j,setLanguageDetector:L,setLanguageStorage:O}))},formatTranslation:R,getDevBackend:w,getBackendRecord:({language:n,namespace:t})=>{for(const a of g.backends){const i=a.getRecord({language:n,namespace:t});if(e(i))return null==i?void 0:i.catch((e=>(console.error(e),{})));if(void 0!==i)return i}},getBackendDevRecord:({language:e,namespace:n})=>{var t;const{apiKey:i,apiUrl:o,projectId:r}=a();return null===(t=g.devBackend)||void 0===t?void 0:t.getRecord({apiKey:i,apiUrl:o,projectId:r,language:e,namespace:n})},getLanguageDetector:()=>g.languageDetector,getLanguageStorage:()=>g.languageStorage,getInitialLanguage:()=>{var e;const t=i(),a=null===(e=g.languageStorage)||void 0===e?void 0:e.getLanguage();return n(a,(e=>t&&!t.includes(e)||!e?(()=>{if(!g.languageDetector)return;const e=i();return g.languageDetector.getLanguage({availableLanguages:e})})():e))},setStoredLanguage:e=>{var n;null===(n=g.languageStorage)||void 0===n||n.setLanguage(e)},run:()=>{var e,n,t;if(!g.ui){const{apiKey:n,apiUrl:t,projectId:i}=a();g.ui=null===(e=c.ui)||void 0===e?void 0:e.call(c,{apiKey:n,apiUrl:t,projectId:i,highlight:l,changeTranslation:s})}g.observer||(g.observer=null===(n=c.observer)||void 0===n?void 0:n.call(c,{translate:d,onClick:u,options:a().observerOptions})),null===(t=g.observer)||void 0===t||t.run({mouseHighlight:!0})},stop:()=>{var e;g.ui=void 0,null===(e=g.observer)||void 0===e||e.stop()},retranslate:()=>{var e;null===(e=g.observer)||void 0===e||e.retranslate()},highlight:l,unwrap:e=>{var n;return g.observer?null===(n=g.observer)||void 0===n?void 0:n.unwrap(e):{text:e,keys:[]}},wrap:e=>{var n;return g.observer?null===(n=g.observer)||void 0===n?void 0:n.wrap(e):e.translation},hasDevBackend:function(){return Boolean(w())}})},y=(e,n,t)=>{let a=e;return Object.freeze({init:function(e){a=e},notify:function(){const e=n();a!==e&&t(e),a=e}})};const O=(e,...n)=>{let t,a={};return"object"==typeof e?a=e:(a.key=e,"string"==typeof n[0]?(a.defaultValue=n[0],t=n[1]):"object"==typeof n[0]&&(t=n[0])),t&&(a=Object.assign(Object.assign({},function(e){var{ns:n,noWrap:t,orEmpty:a,params:i}=e,o=p(e,["ns","noWrap","orEmpty","params"]);const r={ns:n,noWrap:t,orEmpty:a};return Object.assign(Object.assign({},r),{params:Object.assign({},o)})}(t)),a)),a},L=({options:a})=>{const u=((e,n)=>{let t=!0;function a(){return t}const i=c(a),o=c(a),r=c(a),s=c(a),u=c(a),l=c(a),d=c(a),f=g(a,e,n);return u.listen((()=>f.emit())),o.listen((()=>f.emit())),d.listen((({value:e})=>{f.emit([e.namespace],!0)})),Object.freeze({onPendingLanguageChange:i,onLanguageChange:o,onLoadingChange:r,onFetchingChange:s,onInitialLoaded:u,onRunningChange:l,onCacheChange:d,onUpdate:f,setEmmiterActive:function(e){t=e},on:(e,n)=>{switch(e){case"pendingLanguage":return i.listen(n);case"language":return o.listen(n);case"loading":return r.listen(n);case"fetching":return s.listen(n);case"initialLoad":return u.listen(n);case"running":return l.listen(n);case"cache":return d.listen(n);case"update":return f.listen(n)}}})})(j,k),d=y(!1,(()=>L.isFetching()),u.onFetchingChange.emit),p=y(!1,(()=>A()),u.onLoadingChange.emit),v=((e,n,t)=>{let a,c=b();function g(){return c.language||c.initialOptions.language}function u(){return Object.assign(Object.assign({},c.initialOptions),a)}return Object.freeze({init:function(e){c=b(e,c)},isRunning:function(){return c.isRunning},setRunning:function(e){c.isRunning!==e&&(c.isRunning=e,t.emit(e))},isInitialLoading:function(){return c.isInitialLoading},setInitialLoading:function(e){c.isInitialLoading=e},getLanguage:g,setLanguage:function(n){c.language!==n&&(c.language=n,e.emit(n))},getPendingLanguage:function(){return c.pendingLanguage||g()},setPendingLanguage:function(e){c.pendingLanguage!==e&&(c.pendingLanguage=e,n.emit(e))},getInitialOptions:u,addActiveNs:function(e){i(e).forEach((e=>{const n=c.activeNamespaces.get(e);void 0!==n?c.activeNamespaces.set(e,n+1):c.activeNamespaces.set(e,1)}))},removeActiveNs:function(e){i(e).forEach((e=>{const n=c.activeNamespaces.get(e);void 0!==n&&n>1?c.activeNamespaces.set(e,n-1):c.activeNamespaces.delete(e)}))},getRequiredNamespaces:function(){return r([...c.initialOptions.ns||[c.initialOptions.defaultNs],...i(c.initialOptions.fallbackNs),...c.activeNamespaces.keys()])},getFallbackLangs:function(e){const n=e||g();return n?r([n,...o(n,c.initialOptions.fallbackLanguage)]):[]},getFallbackNs:function(){return i(c.initialOptions.fallbackNs)},getDefaultNs:function(e){return void 0===e?c.initialOptions.defaultNs:e},getAvailableLanguages:function(){if(c.initialOptions.availableLanguages)return c.initialOptions.availableLanguages;if(c.initialOptions.staticData){const e=Object.keys(c.initialOptions.staticData).map((e=>l(e).language));return Array.from(new Set(e))}},withDefaultNs:function(e){return{namespace:void 0===e.namespace?u().defaultNs:e.namespace,language:e.language}},overrideCredentials:function(e){a=e?Object.assign(Object.assign({},e),{apiUrl:s(e.apiUrl)}):void 0}})})(u.onLanguageChange,u.onPendingLanguageChange,u.onRunningChange),h=m(v.getLanguage,v.getInitialOptions,v.getAvailableLanguages,(function({key:e,ns:n}){const t=v.getFallbackLangs(),a=w(n);return L.getTranslationNs(a,t,e)}),D,E),L=f(u.onCacheChange,h.getBackendRecord,h.getBackendDevRecord,v.withDefaultNs,v.isInitialLoading,d,p);function j(){return v.getFallbackNs()}function k(e){return v.getDefaultNs(e)}function w(e){return[...i(k(e)),...j()]}function R(e){return[...i(e||k()),...v.getRequiredNamespaces()]}function E(e,n,t){const a=v.withDefaultNs(e),i=L.getTranslation(a,n);return L.changeTranslation(a,n,t),{revert:()=>{L.changeTranslation(a,n,i)}}}function N(e){v.init(e),L.addStaticData(v.getInitialOptions().staticData)}function A(e){return L.isLoading(v.getLanguage(),e)}function F(){return Boolean(v.getInitialOptions().apiKey&&v.getInitialOptions().apiUrl)}function I(e,t){const a=function(e,n){const t=v.getFallbackLangs(e),a=R(n),i=[];return t.forEach((e=>{a.forEach((n=>{L.exists({language:e,namespace:n},!0)||i.push({language:e,namespace:n})}))})),i}(e,t);if(a.length)return n(P(a),(()=>{}))}function D({key:e,ns:n}){const t=w(n),a=v.getFallbackLangs();return L.getTranslationFallback(t,a,e)}function S(){const a=n(function(){if(v.getLanguage())return;if(!v.getInitialOptions().defaultLanguage)throw new Error(t("defaultLanguage"));const e=h.getInitialLanguage();return n(e,(e=>{const n=e||v.getInitialOptions().defaultLanguage;n&&v.setLanguage(n)}))}(),(()=>I()));if(e(a))return v.setInitialLoading(!0),d.notify(),p.notify(),Promise.resolve(a).then((()=>{v.setInitialLoading(!1),d.notify(),p.notify(),u.onInitialLoaded.emit()}));u.onInitialLoaded.emit()}function P(e){return L.loadRecords(e,F())}a&&N(a),u.onUpdate.listen((()=>{v.isRunning()&&h.retranslate()}));return Object.freeze(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},u),v),h),L),{init:N,changeLanguage:async function(e){v.getPendingLanguage()===e&&v.getLanguage()===e||(v.setPendingLanguage(e),v.isRunning()&&await I(e),e===v.getPendingLanguage()&&(v.setLanguage(e),h.setStoredLanguage(e)))},getTranslation:D,changeTranslation:E,addActiveNs:async function(e,n){n||v.addActiveNs(e),v.isRunning()&&await I(void 0,e)},loadRecords:P,loadRecord:async function(e){return(await P([e]))[0]},isLoading:A,isLoaded:function(e){const n=v.getLanguage();if(!n)return!1;const t=v.getFallbackLangs(n),a=R(e),i=[];return t.forEach((e=>{a.forEach((n=>{L.exists({language:e,namespace:n})||i.push({language:e,namespace:n})}))})),0===i.length},t:(...e)=>{const n=O(...e),t=D(n);return h.formatTranslation(Object.assign(Object.assign({},n),{translation:t}))},isDev:F,run:function(){let e;return(()=>{const e=h.getLanguageDetector()||h.getLanguageStorage();if(e&&!v.getAvailableLanguages())throw new Error(t("availableLanguages"));if(!v.getLanguage()&&!v.getInitialOptions().defaultLanguage)throw e?new Error(t("defaultLanguage")):new Error(t("language"))})(),v.isRunning()||(F()&&L.invalidate(),v.setRunning(!0),h.run(),e=S()),Promise.resolve(e)},stop:function(){v.isRunning()&&(h.stop(),v.setRunning(!1))}}))};class j extends Error{constructor(e,n,t){let a;a=0===e?"Empty parameter":1===e?"Unexpected character":"Unexpected end",super(`Tolgee parser: ${a} at ${n} in "${t}"`),this.code=e,this.index=n}}function k(e){return/\s/.test(e)}const w=new Set([2,1,0]),R=new Set(["{","}","'"]);function E(e,n){const[t,a]=function(e){let n=0,t="",a="",i="";const o=[],r=[];let s=0;function c(n){throw new j(n,s,e)}const g=()=>{o.push(t),t=""},u=()=>{""===a&&c(0),r.push(a),a=""};for(s=0;s<e.length;s++)switch(i=e[s],n){case 0:"'"===i?(t+=i,n=1):"{"===i?(g(),n=3):(t+=i,n=0);break;case 1:R.has(i)?(t=t.slice(0,-1)+i,n=2):(t+=i,n=0);break;case 2:"'"===i?n=0:(t+=i,n=2);break;case 3:"}"===i?(u(),n=0):k(i)?""!==a&&(u(),n=4):(/[0-9a-zA-Z_]/.test(i)||c(1),a+=i,n=3);break;case 4:"}"==i?n=0:k(i)?n=4:c(1)}return w.has(n)||c(2),g(),[o,r]}(e),i=[t[0]];for(let o=1;o<t.length;o++){const r=null==n?void 0:n[a[o-1]];if(void 0===r)throw new Error(`Missing parameter "${a[o-1]}" in "${e}"`);i.push(String(r)),i.push(t[o])}return i.join("")}exports.FormatSimple=()=>(e,n)=>(n.setFinalFormatter({format:({translation:e,params:n})=>E(e,n)}),e),exports.TolgeeCore=()=>{const e={plugins:[],options:{}},n=Object.freeze({use:t=>(e.plugins.push(t),n),updateDefaults:t=>(e.options=h(e.options,t),n),init(n){const t=(e=>{const n=L({options:e}),t=e=>{const t=n.isRunning();t&&n.stop(),e(),t&&n.run()},a=Object.freeze({on:n.on,onNsUpdate:n.onUpdate.listenSome,setEmmiterActive:n.setEmmiterActive,getLanguage:n.getLanguage,getPendingLanguage:n.getPendingLanguage,changeLanguage:n.changeLanguage,changeTranslation:n.changeTranslation,addActiveNs:n.addActiveNs,removeActiveNs:n.removeActiveNs,loadRecords:n.loadRecords,loadRecord:n.loadRecord,addStaticData:n.addStaticData,getRecord:n.getRecord,getAllRecords:n.getAllRecords,isLoaded:n.isLoaded,isInitialLoading:n.isInitialLoading,isLoading:n.isLoading,isFetching:n.isFetching,isRunning:n.isRunning,run:n.run,stop:n.stop,t:n.t,highlight:n.highlight,getInitialOptions:n.getInitialOptions,isDev:n.isDev,wrap:n.wrap,unwrap:n.unwrap,overrideCredentials(e){t((()=>n.overrideCredentials(e)))},addPlugin(e){e&&t((()=>n.addPlugin(a,e)))},updateOptions(e){e&&t((()=>n.init(e)))}});return a})(h(e.options,n));return e.plugins.forEach(t.addPlugin),t}});return n},exports.getFallback=a,exports.getFallbackArray=i,exports.getTranslateProps=O; | ||
//# sourceMappingURL=tolgee.cjs.min.js.map |
@@ -42,4 +42,12 @@ function isPromise(value) { | ||
} | ||
function getErrorMessage(error) { | ||
if (typeof error === 'string') { | ||
return error; | ||
} | ||
else if (typeof (error === null || error === void 0 ? void 0 : error.message) === 'string') { | ||
return error.message; | ||
} | ||
} | ||
const EventEmitter = () => { | ||
const EventEmitter = (isActive) => { | ||
let handlers = []; | ||
@@ -58,3 +66,5 @@ const listen = (handler) => { | ||
const emit = (data) => { | ||
handlers.forEach((handler) => handler({ value: data })); | ||
if (isActive()) { | ||
handlers.forEach((handler) => handler({ value: data })); | ||
} | ||
}; | ||
@@ -64,3 +74,3 @@ return Object.freeze({ listen, emit }); | ||
const EventEmitterSelective = (getFallbackNs, getDefaultNs) => { | ||
const EventEmitterSelective = (isActive, getFallbackNs, getDefaultNs) => { | ||
const listeners = new Set(); | ||
@@ -139,9 +149,11 @@ const partialListeners = new Set(); | ||
const emit = (ns, delayed) => { | ||
queue.push(ns); | ||
if (!delayed) { | ||
solveQueue(); | ||
if (isActive()) { | ||
queue.push(ns); | ||
if (!delayed) { | ||
solveQueue(); | ||
} | ||
else { | ||
setTimeout(solveQueue, 0); | ||
} | ||
} | ||
else { | ||
setTimeout(solveQueue, 0); | ||
} | ||
}; | ||
@@ -152,10 +164,14 @@ return Object.freeze({ listenSome, listen, emit }); | ||
const Events = (getFallbackNs, getDefaultNs) => { | ||
const onPendingLanguageChange = EventEmitter(); | ||
const onLanguageChange = EventEmitter(); | ||
const onLoadingChange = EventEmitter(); | ||
const onFetchingChange = EventEmitter(); | ||
const onInitialLoaded = EventEmitter(); | ||
const onRunningChange = EventEmitter(); | ||
const onCacheChange = EventEmitter(); | ||
const onUpdate = EventEmitterSelective(getFallbackNs, getDefaultNs); | ||
let emitterActive = true; | ||
function isActive() { | ||
return emitterActive; | ||
} | ||
const onPendingLanguageChange = EventEmitter(isActive); | ||
const onLanguageChange = EventEmitter(isActive); | ||
const onLoadingChange = EventEmitter(isActive); | ||
const onFetchingChange = EventEmitter(isActive); | ||
const onInitialLoaded = EventEmitter(isActive); | ||
const onRunningChange = EventEmitter(isActive); | ||
const onCacheChange = EventEmitter(isActive); | ||
const onUpdate = EventEmitterSelective(isActive, getFallbackNs, getDefaultNs); | ||
onInitialLoaded.listen(() => onUpdate.emit()); | ||
@@ -186,2 +202,5 @@ onLanguageChange.listen(() => onUpdate.emit()); | ||
}; | ||
function setEmmiterActive(active) { | ||
emitterActive = active; | ||
} | ||
return Object.freeze({ | ||
@@ -196,2 +215,3 @@ onPendingLanguageChange, | ||
onUpdate, | ||
setEmmiterActive, | ||
on, | ||
@@ -436,5 +456,74 @@ }); | ||
/****************************************************************************** | ||
Copyright (c) Microsoft Corporation. | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted. | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */ | ||
function __rest(s, e) { | ||
var t = {}; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { | ||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) | ||
t[p[i]] = s[p[i]]; | ||
} | ||
return t; | ||
} | ||
const defaultObserverOptions = { | ||
tagAttributes: { | ||
textarea: ['placeholder'], | ||
input: ['value', 'placeholder'], | ||
img: ['alt'], | ||
'*': ['aria-label', 'title'], | ||
}, | ||
restrictedElements: ['script', 'style'], | ||
highlightKeys: ['Alt'], | ||
highlightColor: 'rgb(255, 0, 0)', | ||
highlightWidth: 5, | ||
inputPrefix: '%-%tolgee:', | ||
inputSuffix: '%-%', | ||
passToParent: ['option', 'optgroup'], | ||
}; | ||
const DEFAULT_FORMAT_ERROR = 'invalid'; | ||
const defaultValues = { | ||
defaultNs: '', | ||
observerOptions: defaultObserverOptions, | ||
observerType: 'invisible', | ||
onFormatError: DEFAULT_FORMAT_ERROR, | ||
}; | ||
const combineOptions = (...states) => { | ||
let result = {}; | ||
states.forEach((state) => { | ||
result = Object.assign(Object.assign(Object.assign({}, result), state), { observerOptions: Object.assign(Object.assign({}, result.observerOptions), state === null || state === void 0 ? void 0 : state.observerOptions) }); | ||
}); | ||
return result; | ||
}; | ||
const initState = (options, previousState) => { | ||
const initialOptions = combineOptions(defaultValues, previousState === null || previousState === void 0 ? void 0 : previousState.initialOptions, options); | ||
// remove extra '/' from url end | ||
initialOptions.apiUrl = sanitizeUrl(initialOptions.apiUrl); | ||
return { | ||
initialOptions, | ||
activeNamespaces: (previousState === null || previousState === void 0 ? void 0 : previousState.activeNamespaces) || new Map(), | ||
language: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
pendingLanguage: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
isInitialLoading: false, | ||
isRunning: false, | ||
}; | ||
}; | ||
const Plugins = (getLanguage, getInitialOptions, getAvailableLanguages, getTranslationNs, getTranslation, changeTranslation) => { | ||
let prepared = false; | ||
let onPrepareQueue = []; | ||
const plugins = { | ||
@@ -500,3 +589,3 @@ ui: undefined, | ||
const setUi = (ui) => { | ||
plugins.ui = (ui === null || ui === void 0 ? void 0 : ui.UI) || ui; | ||
plugins.ui = ui; | ||
}; | ||
@@ -509,2 +598,5 @@ const hasUi = () => { | ||
}; | ||
const getLanguageStorage = () => { | ||
return instances.languageStorage; | ||
}; | ||
const setStoredLanguage = (language) => { | ||
@@ -549,7 +641,7 @@ var _a; | ||
}; | ||
const run = (isDev) => { | ||
var _a, _b; | ||
if (!instances.ui && plugins.ui) { | ||
const run = () => { | ||
var _a, _b, _c; | ||
if (!instances.ui) { | ||
const { apiKey, apiUrl, projectId } = getInitialOptions(); | ||
instances.ui = new plugins.ui({ | ||
instances.ui = (_a = plugins.ui) === null || _a === void 0 ? void 0 : _a.call(plugins, { | ||
apiKey: apiKey, | ||
@@ -563,3 +655,3 @@ apiUrl: apiUrl, | ||
if (!instances.observer) { | ||
instances.observer = (_a = plugins.observer) === null || _a === void 0 ? void 0 : _a.call(plugins, { | ||
instances.observer = (_b = plugins.observer) === null || _b === void 0 ? void 0 : _b.call(plugins, { | ||
translate, | ||
@@ -570,3 +662,3 @@ onClick, | ||
} | ||
(_b = instances.observer) === null || _b === void 0 ? void 0 : _b.run({ mouseHighlight: isDev }); | ||
(_c = instances.observer) === null || _c === void 0 ? void 0 : _c.run({ mouseHighlight: true }); | ||
}; | ||
@@ -614,5 +706,2 @@ const getDevBackend = () => { | ||
}; | ||
const onPrepare = (callback) => { | ||
onPrepareQueue.push(callback); | ||
}; | ||
function addPlugin(tolgeeInstance, plugin) { | ||
@@ -630,28 +719,42 @@ const pluginTools = Object.freeze({ | ||
setLanguageStorage, | ||
onPrepare, | ||
}); | ||
plugin(tolgeeInstance, pluginTools); | ||
if (prepared) { | ||
prepare(); | ||
} | ||
} | ||
function formatTranslation({ key, translation, defaultValue, noWrap, params, orEmpty, ns, formatEnabled, }) { | ||
var _a; | ||
function formatTranslation(_a) { | ||
var _b; | ||
var { formatEnabled } = _a, props = __rest(_a, ["formatEnabled"]); | ||
const { key, translation, defaultValue, noWrap, params, orEmpty, ns } = props; | ||
const formattableTranslation = translation || defaultValue; | ||
let result = formattableTranslation || (orEmpty ? '' : key); | ||
if (instances.observer && !noWrap) { | ||
result = instances.observer.wrap({ | ||
key, | ||
translation: result, | ||
defaultValue, | ||
params, | ||
ns, | ||
}); | ||
} | ||
const language = getLanguage(); | ||
const isFormatEnabled = formatEnabled || !((_a = instances.observer) === null || _a === void 0 ? void 0 : _a.outputNotFormattable); | ||
if (formattableTranslation && language && isFormatEnabled) { | ||
for (const formatter of instances.formatters) { | ||
result = formatter.format({ | ||
const isFormatEnabled = formatEnabled || !((_b = instances.observer) === null || _b === void 0 ? void 0 : _b.outputNotFormattable); | ||
const wrap = (result) => { | ||
if (instances.observer && !noWrap) { | ||
return instances.observer.wrap({ | ||
key, | ||
translation: result, | ||
defaultValue, | ||
params, | ||
ns, | ||
}); | ||
} | ||
return result; | ||
}; | ||
result = wrap(result); | ||
try { | ||
if (formattableTranslation && language && isFormatEnabled) { | ||
for (const formatter of instances.formatters) { | ||
result = formatter.format({ | ||
translation: result, | ||
language, | ||
params, | ||
}); | ||
} | ||
} | ||
if (instances.finalFormatter && | ||
formattableTranslation && | ||
language && | ||
isFormatEnabled) { | ||
result = instances.finalFormatter.format({ | ||
translation: result, | ||
language, | ||
@@ -662,11 +765,19 @@ params, | ||
} | ||
if (instances.finalFormatter && | ||
formattableTranslation && | ||
language && | ||
isFormatEnabled) { | ||
result = instances.finalFormatter.format({ | ||
translation: result, | ||
language, | ||
params, | ||
}); | ||
catch (e) { | ||
// eslint-disable-next-line no-console | ||
console.error(e); | ||
const errorMessage = getErrorMessage(e) || DEFAULT_FORMAT_ERROR; | ||
const onFormatError = getInitialOptions().onFormatError; | ||
const formatErrorType = typeof onFormatError; | ||
if (formatErrorType === 'string') { | ||
result = onFormatError; | ||
} | ||
else if (formatErrorType === 'function') { | ||
result = onFormatError(errorMessage, props); | ||
} | ||
else { | ||
result = DEFAULT_FORMAT_ERROR; | ||
} | ||
// wrap error message, so it's detectable | ||
result = wrap(result); | ||
} | ||
@@ -685,12 +796,3 @@ return result; | ||
}; | ||
function prepare() { | ||
prepared = true; | ||
while (onPrepareQueue.length) { | ||
const queue = onPrepareQueue; | ||
onPrepareQueue = []; | ||
queue.forEach((callback) => callback()); | ||
} | ||
} | ||
return Object.freeze({ | ||
prepare, | ||
addPlugin, | ||
@@ -702,2 +804,3 @@ formatTranslation, | ||
getLanguageDetector, | ||
getLanguageStorage, | ||
getInitialLanguage, | ||
@@ -733,44 +836,2 @@ setStoredLanguage, | ||
const defaultObserverOptions = { | ||
tagAttributes: { | ||
textarea: ['placeholder'], | ||
input: ['value', 'placeholder'], | ||
img: ['alt'], | ||
'*': ['aria-label', 'title'], | ||
}, | ||
restrictedElements: ['script', 'style'], | ||
highlightKeys: ['Alt'], | ||
highlightColor: 'rgb(255, 0, 0)', | ||
highlightWidth: 5, | ||
inputPrefix: '%-%tolgee:', | ||
inputSuffix: '%-%', | ||
passToParent: ['option', 'optgroup'], | ||
}; | ||
const defaultValues = { | ||
defaultNs: '', | ||
observerOptions: defaultObserverOptions, | ||
observerType: 'invisible', | ||
}; | ||
const combineOptions = (...states) => { | ||
let result = {}; | ||
states.forEach((state) => { | ||
result = Object.assign(Object.assign(Object.assign({}, result), state), { observerOptions: Object.assign(Object.assign({}, result.observerOptions), state === null || state === void 0 ? void 0 : state.observerOptions) }); | ||
}); | ||
return result; | ||
}; | ||
const initState = (options, previousState) => { | ||
const initialOptions = combineOptions(defaultValues, previousState === null || previousState === void 0 ? void 0 : previousState.initialOptions, options); | ||
// remove extra '/' from url end | ||
initialOptions.apiUrl = sanitizeUrl(initialOptions.apiUrl); | ||
return { | ||
initialOptions, | ||
activeNamespaces: (previousState === null || previousState === void 0 ? void 0 : previousState.activeNamespaces) || new Map(), | ||
language: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
pendingLanguage: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
isInitialLoading: false, | ||
isRunning: false, | ||
}; | ||
}; | ||
const State = (onLanguageChange, onPendingLanguageChange, onRunningChange) => { | ||
@@ -913,29 +974,2 @@ let state = initState(); | ||
/****************************************************************************** | ||
Copyright (c) Microsoft Corporation. | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted. | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */ | ||
function __rest(s, e) { | ||
var t = {}; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { | ||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) | ||
t[p[i]] = s[p[i]]; | ||
} | ||
return t; | ||
} | ||
function parseCombinedOptions(_a) { | ||
@@ -1138,4 +1172,4 @@ var { ns, noWrap, orEmpty, params } = _a, rest = __rest(_a, ["ns", "noWrap", "orEmpty", "params"]); | ||
const checkCorrectConfiguration = () => { | ||
const languageDetector = pluginService.getLanguageDetector(); | ||
if (languageDetector) { | ||
const languageComputable = pluginService.getLanguageDetector() || pluginService.getLanguageStorage(); | ||
if (languageComputable) { | ||
const availableLanguages = state.getAvailableLanguages(); | ||
@@ -1147,3 +1181,3 @@ if (!availableLanguages) { | ||
if (!state.getLanguage() && !state.getInitialOptions().defaultLanguage) { | ||
if (languageDetector) { | ||
if (languageComputable) { | ||
throw new Error(missingOptionError('defaultLanguage')); | ||
@@ -1164,3 +1198,3 @@ } | ||
state.setRunning(true); | ||
pluginService.run(isDev()); | ||
pluginService.run(); | ||
result = loadInitial(); | ||
@@ -1228,2 +1262,6 @@ } | ||
/** | ||
* Turn off/on events emitting. Is on by default. | ||
*/ | ||
setEmmiterActive: controller.setEmmiterActive, | ||
/** | ||
* @return current language if set. | ||
@@ -1342,3 +1380,5 @@ */ | ||
/** | ||
* Override creadentials passed on initialization | ||
* Override creadentials passed on initialization. | ||
* | ||
* When called in running state, tolgee stops and runs again. | ||
*/ | ||
@@ -1349,3 +1389,5 @@ overrideCredentials(credentials) { | ||
/** | ||
* Add tolgee plugin. | ||
* Add tolgee plugin after initialization. | ||
* | ||
* When called in running state, tolgee stops and runs again. | ||
*/ | ||
@@ -1379,3 +1421,3 @@ addPlugin(plugin) { | ||
*/ | ||
const Tolgee = () => { | ||
const TolgeeCore = () => { | ||
const state = { | ||
@@ -1557,3 +1599,3 @@ plugins: [], | ||
export { FormatSimple, Tolgee, getFallback, getFallbackArray, getTranslateProps }; | ||
export { FormatSimple, TolgeeCore, getFallback, getFallbackArray, getTranslateProps }; | ||
//# sourceMappingURL=tolgee.esm.js.map |
@@ -48,4 +48,12 @@ (function (global, factory) { | ||
} | ||
function getErrorMessage(error) { | ||
if (typeof error === 'string') { | ||
return error; | ||
} | ||
else if (typeof (error === null || error === void 0 ? void 0 : error.message) === 'string') { | ||
return error.message; | ||
} | ||
} | ||
const EventEmitter = () => { | ||
const EventEmitter = (isActive) => { | ||
let handlers = []; | ||
@@ -64,3 +72,5 @@ const listen = (handler) => { | ||
const emit = (data) => { | ||
handlers.forEach((handler) => handler({ value: data })); | ||
if (isActive()) { | ||
handlers.forEach((handler) => handler({ value: data })); | ||
} | ||
}; | ||
@@ -70,3 +80,3 @@ return Object.freeze({ listen, emit }); | ||
const EventEmitterSelective = (getFallbackNs, getDefaultNs) => { | ||
const EventEmitterSelective = (isActive, getFallbackNs, getDefaultNs) => { | ||
const listeners = new Set(); | ||
@@ -145,9 +155,11 @@ const partialListeners = new Set(); | ||
const emit = (ns, delayed) => { | ||
queue.push(ns); | ||
if (!delayed) { | ||
solveQueue(); | ||
if (isActive()) { | ||
queue.push(ns); | ||
if (!delayed) { | ||
solveQueue(); | ||
} | ||
else { | ||
setTimeout(solveQueue, 0); | ||
} | ||
} | ||
else { | ||
setTimeout(solveQueue, 0); | ||
} | ||
}; | ||
@@ -158,10 +170,14 @@ return Object.freeze({ listenSome, listen, emit }); | ||
const Events = (getFallbackNs, getDefaultNs) => { | ||
const onPendingLanguageChange = EventEmitter(); | ||
const onLanguageChange = EventEmitter(); | ||
const onLoadingChange = EventEmitter(); | ||
const onFetchingChange = EventEmitter(); | ||
const onInitialLoaded = EventEmitter(); | ||
const onRunningChange = EventEmitter(); | ||
const onCacheChange = EventEmitter(); | ||
const onUpdate = EventEmitterSelective(getFallbackNs, getDefaultNs); | ||
let emitterActive = true; | ||
function isActive() { | ||
return emitterActive; | ||
} | ||
const onPendingLanguageChange = EventEmitter(isActive); | ||
const onLanguageChange = EventEmitter(isActive); | ||
const onLoadingChange = EventEmitter(isActive); | ||
const onFetchingChange = EventEmitter(isActive); | ||
const onInitialLoaded = EventEmitter(isActive); | ||
const onRunningChange = EventEmitter(isActive); | ||
const onCacheChange = EventEmitter(isActive); | ||
const onUpdate = EventEmitterSelective(isActive, getFallbackNs, getDefaultNs); | ||
onInitialLoaded.listen(() => onUpdate.emit()); | ||
@@ -192,2 +208,5 @@ onLanguageChange.listen(() => onUpdate.emit()); | ||
}; | ||
function setEmmiterActive(active) { | ||
emitterActive = active; | ||
} | ||
return Object.freeze({ | ||
@@ -202,2 +221,3 @@ onPendingLanguageChange, | ||
onUpdate, | ||
setEmmiterActive, | ||
on, | ||
@@ -442,5 +462,74 @@ }); | ||
/****************************************************************************** | ||
Copyright (c) Microsoft Corporation. | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted. | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */ | ||
function __rest(s, e) { | ||
var t = {}; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { | ||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) | ||
t[p[i]] = s[p[i]]; | ||
} | ||
return t; | ||
} | ||
const defaultObserverOptions = { | ||
tagAttributes: { | ||
textarea: ['placeholder'], | ||
input: ['value', 'placeholder'], | ||
img: ['alt'], | ||
'*': ['aria-label', 'title'], | ||
}, | ||
restrictedElements: ['script', 'style'], | ||
highlightKeys: ['Alt'], | ||
highlightColor: 'rgb(255, 0, 0)', | ||
highlightWidth: 5, | ||
inputPrefix: '%-%tolgee:', | ||
inputSuffix: '%-%', | ||
passToParent: ['option', 'optgroup'], | ||
}; | ||
const DEFAULT_FORMAT_ERROR = 'invalid'; | ||
const defaultValues = { | ||
defaultNs: '', | ||
observerOptions: defaultObserverOptions, | ||
observerType: 'invisible', | ||
onFormatError: DEFAULT_FORMAT_ERROR, | ||
}; | ||
const combineOptions = (...states) => { | ||
let result = {}; | ||
states.forEach((state) => { | ||
result = Object.assign(Object.assign(Object.assign({}, result), state), { observerOptions: Object.assign(Object.assign({}, result.observerOptions), state === null || state === void 0 ? void 0 : state.observerOptions) }); | ||
}); | ||
return result; | ||
}; | ||
const initState = (options, previousState) => { | ||
const initialOptions = combineOptions(defaultValues, previousState === null || previousState === void 0 ? void 0 : previousState.initialOptions, options); | ||
// remove extra '/' from url end | ||
initialOptions.apiUrl = sanitizeUrl(initialOptions.apiUrl); | ||
return { | ||
initialOptions, | ||
activeNamespaces: (previousState === null || previousState === void 0 ? void 0 : previousState.activeNamespaces) || new Map(), | ||
language: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
pendingLanguage: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
isInitialLoading: false, | ||
isRunning: false, | ||
}; | ||
}; | ||
const Plugins = (getLanguage, getInitialOptions, getAvailableLanguages, getTranslationNs, getTranslation, changeTranslation) => { | ||
let prepared = false; | ||
let onPrepareQueue = []; | ||
const plugins = { | ||
@@ -506,3 +595,3 @@ ui: undefined, | ||
const setUi = (ui) => { | ||
plugins.ui = (ui === null || ui === void 0 ? void 0 : ui.UI) || ui; | ||
plugins.ui = ui; | ||
}; | ||
@@ -515,2 +604,5 @@ const hasUi = () => { | ||
}; | ||
const getLanguageStorage = () => { | ||
return instances.languageStorage; | ||
}; | ||
const setStoredLanguage = (language) => { | ||
@@ -555,7 +647,7 @@ var _a; | ||
}; | ||
const run = (isDev) => { | ||
var _a, _b; | ||
if (!instances.ui && plugins.ui) { | ||
const run = () => { | ||
var _a, _b, _c; | ||
if (!instances.ui) { | ||
const { apiKey, apiUrl, projectId } = getInitialOptions(); | ||
instances.ui = new plugins.ui({ | ||
instances.ui = (_a = plugins.ui) === null || _a === void 0 ? void 0 : _a.call(plugins, { | ||
apiKey: apiKey, | ||
@@ -569,3 +661,3 @@ apiUrl: apiUrl, | ||
if (!instances.observer) { | ||
instances.observer = (_a = plugins.observer) === null || _a === void 0 ? void 0 : _a.call(plugins, { | ||
instances.observer = (_b = plugins.observer) === null || _b === void 0 ? void 0 : _b.call(plugins, { | ||
translate, | ||
@@ -576,3 +668,3 @@ onClick, | ||
} | ||
(_b = instances.observer) === null || _b === void 0 ? void 0 : _b.run({ mouseHighlight: isDev }); | ||
(_c = instances.observer) === null || _c === void 0 ? void 0 : _c.run({ mouseHighlight: true }); | ||
}; | ||
@@ -620,5 +712,2 @@ const getDevBackend = () => { | ||
}; | ||
const onPrepare = (callback) => { | ||
onPrepareQueue.push(callback); | ||
}; | ||
function addPlugin(tolgeeInstance, plugin) { | ||
@@ -636,28 +725,42 @@ const pluginTools = Object.freeze({ | ||
setLanguageStorage, | ||
onPrepare, | ||
}); | ||
plugin(tolgeeInstance, pluginTools); | ||
if (prepared) { | ||
prepare(); | ||
} | ||
} | ||
function formatTranslation({ key, translation, defaultValue, noWrap, params, orEmpty, ns, formatEnabled, }) { | ||
var _a; | ||
function formatTranslation(_a) { | ||
var _b; | ||
var { formatEnabled } = _a, props = __rest(_a, ["formatEnabled"]); | ||
const { key, translation, defaultValue, noWrap, params, orEmpty, ns } = props; | ||
const formattableTranslation = translation || defaultValue; | ||
let result = formattableTranslation || (orEmpty ? '' : key); | ||
if (instances.observer && !noWrap) { | ||
result = instances.observer.wrap({ | ||
key, | ||
translation: result, | ||
defaultValue, | ||
params, | ||
ns, | ||
}); | ||
} | ||
const language = getLanguage(); | ||
const isFormatEnabled = formatEnabled || !((_a = instances.observer) === null || _a === void 0 ? void 0 : _a.outputNotFormattable); | ||
if (formattableTranslation && language && isFormatEnabled) { | ||
for (const formatter of instances.formatters) { | ||
result = formatter.format({ | ||
const isFormatEnabled = formatEnabled || !((_b = instances.observer) === null || _b === void 0 ? void 0 : _b.outputNotFormattable); | ||
const wrap = (result) => { | ||
if (instances.observer && !noWrap) { | ||
return instances.observer.wrap({ | ||
key, | ||
translation: result, | ||
defaultValue, | ||
params, | ||
ns, | ||
}); | ||
} | ||
return result; | ||
}; | ||
result = wrap(result); | ||
try { | ||
if (formattableTranslation && language && isFormatEnabled) { | ||
for (const formatter of instances.formatters) { | ||
result = formatter.format({ | ||
translation: result, | ||
language, | ||
params, | ||
}); | ||
} | ||
} | ||
if (instances.finalFormatter && | ||
formattableTranslation && | ||
language && | ||
isFormatEnabled) { | ||
result = instances.finalFormatter.format({ | ||
translation: result, | ||
language, | ||
@@ -668,11 +771,19 @@ params, | ||
} | ||
if (instances.finalFormatter && | ||
formattableTranslation && | ||
language && | ||
isFormatEnabled) { | ||
result = instances.finalFormatter.format({ | ||
translation: result, | ||
language, | ||
params, | ||
}); | ||
catch (e) { | ||
// eslint-disable-next-line no-console | ||
console.error(e); | ||
const errorMessage = getErrorMessage(e) || DEFAULT_FORMAT_ERROR; | ||
const onFormatError = getInitialOptions().onFormatError; | ||
const formatErrorType = typeof onFormatError; | ||
if (formatErrorType === 'string') { | ||
result = onFormatError; | ||
} | ||
else if (formatErrorType === 'function') { | ||
result = onFormatError(errorMessage, props); | ||
} | ||
else { | ||
result = DEFAULT_FORMAT_ERROR; | ||
} | ||
// wrap error message, so it's detectable | ||
result = wrap(result); | ||
} | ||
@@ -691,12 +802,3 @@ return result; | ||
}; | ||
function prepare() { | ||
prepared = true; | ||
while (onPrepareQueue.length) { | ||
const queue = onPrepareQueue; | ||
onPrepareQueue = []; | ||
queue.forEach((callback) => callback()); | ||
} | ||
} | ||
return Object.freeze({ | ||
prepare, | ||
addPlugin, | ||
@@ -708,2 +810,3 @@ formatTranslation, | ||
getLanguageDetector, | ||
getLanguageStorage, | ||
getInitialLanguage, | ||
@@ -739,44 +842,2 @@ setStoredLanguage, | ||
const defaultObserverOptions = { | ||
tagAttributes: { | ||
textarea: ['placeholder'], | ||
input: ['value', 'placeholder'], | ||
img: ['alt'], | ||
'*': ['aria-label', 'title'], | ||
}, | ||
restrictedElements: ['script', 'style'], | ||
highlightKeys: ['Alt'], | ||
highlightColor: 'rgb(255, 0, 0)', | ||
highlightWidth: 5, | ||
inputPrefix: '%-%tolgee:', | ||
inputSuffix: '%-%', | ||
passToParent: ['option', 'optgroup'], | ||
}; | ||
const defaultValues = { | ||
defaultNs: '', | ||
observerOptions: defaultObserverOptions, | ||
observerType: 'invisible', | ||
}; | ||
const combineOptions = (...states) => { | ||
let result = {}; | ||
states.forEach((state) => { | ||
result = Object.assign(Object.assign(Object.assign({}, result), state), { observerOptions: Object.assign(Object.assign({}, result.observerOptions), state === null || state === void 0 ? void 0 : state.observerOptions) }); | ||
}); | ||
return result; | ||
}; | ||
const initState = (options, previousState) => { | ||
const initialOptions = combineOptions(defaultValues, previousState === null || previousState === void 0 ? void 0 : previousState.initialOptions, options); | ||
// remove extra '/' from url end | ||
initialOptions.apiUrl = sanitizeUrl(initialOptions.apiUrl); | ||
return { | ||
initialOptions, | ||
activeNamespaces: (previousState === null || previousState === void 0 ? void 0 : previousState.activeNamespaces) || new Map(), | ||
language: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
pendingLanguage: previousState === null || previousState === void 0 ? void 0 : previousState.language, | ||
isInitialLoading: false, | ||
isRunning: false, | ||
}; | ||
}; | ||
const State = (onLanguageChange, onPendingLanguageChange, onRunningChange) => { | ||
@@ -919,29 +980,2 @@ let state = initState(); | ||
/****************************************************************************** | ||
Copyright (c) Microsoft Corporation. | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted. | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */ | ||
function __rest(s, e) { | ||
var t = {}; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { | ||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) | ||
t[p[i]] = s[p[i]]; | ||
} | ||
return t; | ||
} | ||
function parseCombinedOptions(_a) { | ||
@@ -1144,4 +1178,4 @@ var { ns, noWrap, orEmpty, params } = _a, rest = __rest(_a, ["ns", "noWrap", "orEmpty", "params"]); | ||
const checkCorrectConfiguration = () => { | ||
const languageDetector = pluginService.getLanguageDetector(); | ||
if (languageDetector) { | ||
const languageComputable = pluginService.getLanguageDetector() || pluginService.getLanguageStorage(); | ||
if (languageComputable) { | ||
const availableLanguages = state.getAvailableLanguages(); | ||
@@ -1153,3 +1187,3 @@ if (!availableLanguages) { | ||
if (!state.getLanguage() && !state.getInitialOptions().defaultLanguage) { | ||
if (languageDetector) { | ||
if (languageComputable) { | ||
throw new Error(missingOptionError('defaultLanguage')); | ||
@@ -1170,3 +1204,3 @@ } | ||
state.setRunning(true); | ||
pluginService.run(isDev()); | ||
pluginService.run(); | ||
result = loadInitial(); | ||
@@ -1234,2 +1268,6 @@ } | ||
/** | ||
* Turn off/on events emitting. Is on by default. | ||
*/ | ||
setEmmiterActive: controller.setEmmiterActive, | ||
/** | ||
* @return current language if set. | ||
@@ -1348,3 +1386,5 @@ */ | ||
/** | ||
* Override creadentials passed on initialization | ||
* Override creadentials passed on initialization. | ||
* | ||
* When called in running state, tolgee stops and runs again. | ||
*/ | ||
@@ -1355,3 +1395,5 @@ overrideCredentials(credentials) { | ||
/** | ||
* Add tolgee plugin. | ||
* Add tolgee plugin after initialization. | ||
* | ||
* When called in running state, tolgee stops and runs again. | ||
*/ | ||
@@ -1385,3 +1427,3 @@ addPlugin(plugin) { | ||
*/ | ||
const Tolgee = () => { | ||
const TolgeeCore = () => { | ||
const state = { | ||
@@ -1564,3 +1606,3 @@ plugins: [], | ||
exports.FormatSimple = FormatSimple; | ||
exports.Tolgee = Tolgee; | ||
exports.TolgeeCore = TolgeeCore; | ||
exports.getFallback = getFallback; | ||
@@ -1567,0 +1609,0 @@ exports.getFallbackArray = getFallbackArray; |
@@ -1,2 +0,2 @@ | ||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self)["@tolgee/core"]={})}(this,(function(e){"use strict";function n(e){return Boolean(e&&"function"==typeof e.then)}const t=(e,t)=>n(e)?Promise.resolve(e).then(t):t(e),a=e=>`Tolgee: You need to specify '${e}' option`;function i(e){return"string"==typeof e?[e]:Array.isArray(e)?e:void 0}function o(e){return i(e)||[]}function r(e,n){return"object"!=typeof(t=n)||Array.isArray(t)||null===t?o(n):o(null==n?void 0:n[e]);var t}function s(e){return Array.from(new Set(e))}function c(e){return e?e.replace(/\/+$/,""):e}const g=()=>{let e=[];return Object.freeze({listen:n=>{const t=e=>{n(e)};return e.push(t),{unsubscribe:()=>{e=e.filter((e=>t!==e))}}},emit:n=>{e.forEach((e=>e({value:n})))}})},u=(e,n)=>{const t=new Set,a=new Set;let i=[];const r=()=>{if(0===i.length)return;const n=i;i=[],t.forEach((e=>{e({value:void 0})}));let o=new Set;n.forEach((e=>{void 0===e?o=void 0:void 0!==o&&e.forEach((e=>o.add(e)))}));(n=>{const t=new Set(e());a.forEach((e=>{(void 0===n||-1!==(null==n?void 0:n.findIndex((n=>t.has(n)||e.namespaces.has(n)))))&&e.fn({value:void 0})}))})(o?Array.from(o.keys()):void 0)};return Object.freeze({listenSome:e=>{const t={fn:n=>{e(n)},namespaces:new Set};a.add(t);const i={unsubscribe:()=>{a.delete(t)},subscribeNs:e=>(o(e).forEach((e=>t.namespaces.add(e))),void 0===e&&t.namespaces.add(n()),i)};return i},listen:e=>{t.add(e);return{unsubscribe:()=>{t.delete(e)}}},emit:(e,n)=>{i.push(e),n?setTimeout(r,0):r()}})},l=e=>{const n=new Map;return Object.entries(e).forEach((([e,t])=>{null!=t&&("object"!=typeof t?n.set(e,t):l(t).forEach(((t,a)=>{n.set(e+"."+a,t)})))})),n},d=e=>{const[n,...t]=e.split(":");return{language:n,namespace:t.join(":")||""}},f=({language:e,namespace:n})=>n?`${e}:${n}`:e,p=(e,n,t,a,i,r,c)=>{const g=new Map,u=new Map;let p={},v=0;function h(n,t,a){const i=f(n);u.set(i,{data:l(t),version:a}),e.emit(n)}function b(e,n){h(e,n,v)}function m(e,n=!1){const t=u.get(f(e));return t&&n?t.version===v:Boolean(t)}function y(e){var n;return null===(n=u.get(f(a(e))))||void 0===n?void 0:n.data}function O(e){let t;if(!t){const n=p[f(e)];"function"==typeof n&&(t=n())}return t||(t=n(e)),t}return Object.freeze({addStaticData:function(e){e&&(p=Object.assign(Object.assign({},p),e),Object.entries(e).forEach((([e,n])=>{if("function"!=typeof n){const t=d(e),a=u.get(e);a&&0!==a.version||h(t,n,0)}})))},invalidate:function(){g.clear(),v+=1},addRecord:b,exists:m,getRecord:y,getTranslation:function(e,n){var t;return null===(t=u.get(f(e)))||void 0===t?void 0:t.data.get(n)},getTranslationNs:function(e,n,t){var a;for(const i of e)for(const e of n){const n=null===(a=u.get(f({language:e,namespace:i})))||void 0===a?void 0:a.data.get(t);if(null!=n)return[i]}return s(e)},getTranslationFallback:function(e,n,t){var a;for(const i of e)for(const e of n){const n=null===(a=u.get(f({language:e,namespace:i})))||void 0===a?void 0:a.data.get(t);if(null!=n)return n}},changeTranslation:function(n,t,a){var i;const o=null===(i=u.get(f(n)))||void 0===i?void 0:i.data;null==o||o.set(t,a),e.emit(Object.assign(Object.assign({},n),{key:t}))},isFetching:function(e){if(i())return!0;if(void 0===e)return g.size>0;const n=o(e);return Boolean(Array.from(g.keys()).find((e=>n.includes(d(e).namespace))))},isLoading:function(e,n){const t=o(n);return Boolean(i()||Array.from(g.keys()).find((n=>{const a=d(n);return(!t.length||t.includes(a.namespace))&&!m({namespace:a.namespace,language:e})})))},loadRecords:async function(e,n){const i=e.map((e=>{const i=a(e),o=f(i),r=g.get(o);if(r)return{new:!1,promise:r,keyObject:i,cacheKey:o};const s=function(e,n){var a;let i;return n&&(i=null===(a=t(e))||void 0===a?void 0:a.catch((()=>(console.warn("Tolgee: Failed to fetch data from dev backend"),O(e))))),i||(i=O(e)),i}(i,n)||Promise.resolve(void 0);return g.set(o,s),{new:!0,promise:s,keyObject:i,cacheKey:o}}));r.notify(),c.notify();const o=await Promise.all(i.map((e=>e.promise)));return i.forEach(((e,n)=>{const t=g.get(e.cacheKey)!==e.promise;if(e.new&&!t){g.delete(e.cacheKey);const t=o[n];t?b(e.keyObject,t):y(e.keyObject)||b(e.keyObject,{})}})),r.notify(),c.notify(),i.map((e=>y(e.keyObject)))},getAllRecords:function(){return Array.from(u.entries()).map((([e,n])=>Object.assign(Object.assign({},d(e)),{data:n.data})))}})},v=(e,a,i,o,r,s)=>{let c=!1,g=[];const u={ui:void 0,observer:void 0},l={formatters:[],finalFormatter:void 0,observer:void 0,devBackend:void 0,backends:[],ui:void 0,languageDetector:void 0,languageStorage:void 0},d=async({keysAndDefaults:e,event:n})=>{var t;const a=e.map((({key:e,ns:n,defaultValue:t})=>({key:e,defaultValue:t,ns:o({key:e,ns:n}),translation:r({key:e,ns:n})})));null===(t=l.ui)||void 0===t||t.handleElementClick(a,n)},f=(e,n)=>{var t,a;return(null===(a=null===(t=l.observer)||void 0===t?void 0:t.highlight)||void 0===a?void 0:a.call(t,e,n))||{unhighlight(){}}},p=e=>{const n=r({key:e.key,ns:e.ns});return E(Object.assign(Object.assign({},e),{translation:n,formatEnabled:!0}))},v=e=>{u.observer=e},h=()=>Boolean(u.observer),b=e=>{e&&l.formatters.push(e)},m=e=>{l.finalFormatter=e},y=e=>{u.ui=(null==e?void 0:e.UI)||e},O=()=>Boolean(u.ui),L=e=>{l.languageStorage=e},j=e=>{l.languageDetector=e},k=e=>{e&&l.backends.push(e)},w=e=>{l.devBackend=e},R=()=>l.devBackend,N=e=>{g.push(e)};function E({key:n,translation:t,defaultValue:a,noWrap:i,params:o,orEmpty:r,ns:s,formatEnabled:c}){var g;const u=t||a;let d=u||(r?"":n);l.observer&&!i&&(d=l.observer.wrap({key:n,translation:d,defaultValue:a,params:o,ns:s}));const f=e(),p=c||!(null===(g=l.observer)||void 0===g?void 0:g.outputNotFormattable);if(u&&f&&p)for(const e of l.formatters)d=e.format({translation:d,language:f,params:o});return l.finalFormatter&&u&&f&&p&&(d=l.finalFormatter.format({translation:d,language:f,params:o})),d}function I(){for(c=!0;g.length;){const e=g;g=[],e.forEach((e=>e()))}}return Object.freeze({prepare:I,addPlugin:function(e,n){n(e,Object.freeze({setFinalFormatter:m,addFormatter:b,setObserver:v,hasObserver:h,setUi:y,hasUi:O,setDevBackend:w,addBackend:k,setLanguageDetector:j,setLanguageStorage:L,onPrepare:N})),c&&I()},formatTranslation:E,getDevBackend:R,getBackendRecord:({language:e,namespace:t})=>{for(const a of l.backends){const i=a.getRecord({language:e,namespace:t});if(n(i))return null==i?void 0:i.catch((e=>(console.error(e),{})));if(void 0!==i)return i}},getBackendDevRecord:({language:e,namespace:n})=>{var t;const{apiKey:i,apiUrl:o,projectId:r}=a();return null===(t=l.devBackend)||void 0===t?void 0:t.getRecord({apiKey:i,apiUrl:o,projectId:r,language:e,namespace:n})},getLanguageDetector:()=>l.languageDetector,getInitialLanguage:()=>{var e;const n=i(),a=null===(e=l.languageStorage)||void 0===e?void 0:e.getLanguage();return t(a,(e=>n&&!n.includes(e)||!e?(()=>{if(!l.languageDetector)return;const e=i();return l.languageDetector.getLanguage({availableLanguages:e})})():e))},setStoredLanguage:e=>{var n;null===(n=l.languageStorage)||void 0===n||n.setLanguage(e)},run:e=>{var n,t;if(!l.ui&&u.ui){const{apiKey:e,apiUrl:n,projectId:t}=a();l.ui=new u.ui({apiKey:e,apiUrl:n,projectId:t,highlight:f,changeTranslation:s})}l.observer||(l.observer=null===(n=u.observer)||void 0===n?void 0:n.call(u,{translate:p,onClick:d,options:a().observerOptions})),null===(t=l.observer)||void 0===t||t.run({mouseHighlight:e})},stop:()=>{var e;l.ui=void 0,null===(e=l.observer)||void 0===e||e.stop()},retranslate:()=>{var e;null===(e=l.observer)||void 0===e||e.retranslate()},highlight:f,unwrap:e=>{var n;return l.observer?null===(n=l.observer)||void 0===n?void 0:n.unwrap(e):{text:e,keys:[]}},wrap:e=>{var n;return l.observer?null===(n=l.observer)||void 0===n?void 0:n.wrap(e):e.translation},hasDevBackend:function(){return Boolean(R())}})},h=(e,n,t)=>{let a=e;return Object.freeze({init:function(e){a=e},notify:function(){const e=n();a!==e&&t(e),a=e}})},b={defaultNs:"",observerOptions:{tagAttributes:{textarea:["placeholder"],input:["value","placeholder"],img:["alt"],"*":["aria-label","title"]},restrictedElements:["script","style"],highlightKeys:["Alt"],highlightColor:"rgb(255, 0, 0)",highlightWidth:5,inputPrefix:"%-%tolgee:",inputSuffix:"%-%",passToParent:["option","optgroup"]},observerType:"invisible"},m=(...e)=>{let n={};return e.forEach((e=>{n=Object.assign(Object.assign(Object.assign({},n),e),{observerOptions:Object.assign(Object.assign({},n.observerOptions),null==e?void 0:e.observerOptions)})})),n},y=(e,n)=>{const t=m(b,null==n?void 0:n.initialOptions,e);return t.apiUrl=c(t.apiUrl),{initialOptions:t,activeNamespaces:(null==n?void 0:n.activeNamespaces)||new Map,language:null==n?void 0:n.language,pendingLanguage:null==n?void 0:n.language,isInitialLoading:!1,isRunning:!1}};function O(e){var{ns:n,noWrap:t,orEmpty:a,params:i}=e,o=function(e,n){var t={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&n.indexOf(a)<0&&(t[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(a=Object.getOwnPropertySymbols(e);i<a.length;i++)n.indexOf(a[i])<0&&Object.prototype.propertyIsEnumerable.call(e,a[i])&&(t[a[i]]=e[a[i]])}return t}(e,["ns","noWrap","orEmpty","params"]);const r={ns:n,noWrap:t,orEmpty:a};return Object.assign(Object.assign({},r),{params:Object.assign({},o)})}const L=(e,...n)=>{let t,a={};return"object"==typeof e?a=e:(a.key=e,"string"==typeof n[0]?(a.defaultValue=n[0],t=n[1]):"object"==typeof n[0]&&(t=n[0])),t&&(a=Object.assign(Object.assign({},O(t)),a)),a},j=({options:e})=>{const i=((e,n)=>{const t=g(),a=g(),i=g(),o=g(),r=g(),s=g(),c=g(),l=u(e,n);return r.listen((()=>l.emit())),a.listen((()=>l.emit())),c.listen((({value:e})=>{l.emit([e.namespace],!0)})),Object.freeze({onPendingLanguageChange:t,onLanguageChange:a,onLoadingChange:i,onFetchingChange:o,onInitialLoaded:r,onRunningChange:s,onCacheChange:c,onUpdate:l,on:(e,n)=>{switch(e){case"pendingLanguage":return t.listen(n);case"language":return a.listen(n);case"loading":return i.listen(n);case"fetching":return o.listen(n);case"initialLoad":return r.listen(n);case"running":return s.listen(n);case"cache":return c.listen(n);case"update":return l.listen(n)}}})})(j,k),l=h(!1,(()=>O.isFetching()),i.onFetchingChange.emit),f=h(!1,(()=>I()),i.onLoadingChange.emit),b=((e,n,t)=>{let a,i=y();function g(){return i.language||i.initialOptions.language}function u(){return Object.assign(Object.assign({},i.initialOptions),a)}return Object.freeze({init:function(e){i=y(e,i)},isRunning:function(){return i.isRunning},setRunning:function(e){i.isRunning!==e&&(i.isRunning=e,t.emit(e))},isInitialLoading:function(){return i.isInitialLoading},setInitialLoading:function(e){i.isInitialLoading=e},getLanguage:g,setLanguage:function(n){i.language!==n&&(i.language=n,e.emit(n))},getPendingLanguage:function(){return i.pendingLanguage||g()},setPendingLanguage:function(e){i.pendingLanguage!==e&&(i.pendingLanguage=e,n.emit(e))},getInitialOptions:u,addActiveNs:function(e){o(e).forEach((e=>{const n=i.activeNamespaces.get(e);void 0!==n?i.activeNamespaces.set(e,n+1):i.activeNamespaces.set(e,1)}))},removeActiveNs:function(e){o(e).forEach((e=>{const n=i.activeNamespaces.get(e);void 0!==n&&n>1?i.activeNamespaces.set(e,n-1):i.activeNamespaces.delete(e)}))},getRequiredNamespaces:function(){return s([...i.initialOptions.ns||[i.initialOptions.defaultNs],...o(i.initialOptions.fallbackNs),...i.activeNamespaces.keys()])},getFallbackLangs:function(e){const n=e||g();return n?s([n,...r(n,i.initialOptions.fallbackLanguage)]):[]},getFallbackNs:function(){return o(i.initialOptions.fallbackNs)},getDefaultNs:function(e){return void 0===e?i.initialOptions.defaultNs:e},getAvailableLanguages:function(){if(i.initialOptions.availableLanguages)return i.initialOptions.availableLanguages;if(i.initialOptions.staticData){const e=Object.keys(i.initialOptions.staticData).map((e=>d(e).language));return Array.from(new Set(e))}},withDefaultNs:function(e){return{namespace:void 0===e.namespace?u().defaultNs:e.namespace,language:e.language}},overrideCredentials:function(e){a=e?Object.assign(Object.assign({},e),{apiUrl:c(e.apiUrl)}):void 0}})})(i.onLanguageChange,i.onPendingLanguageChange,i.onRunningChange),m=v(b.getLanguage,b.getInitialOptions,b.getAvailableLanguages,(function({key:e,ns:n}){const t=b.getFallbackLangs(),a=w(n);return O.getTranslationNs(a,t,e)}),F,N),O=p(i.onCacheChange,m.getBackendRecord,m.getBackendDevRecord,b.withDefaultNs,b.isInitialLoading,l,f);function j(){return b.getFallbackNs()}function k(e){return b.getDefaultNs(e)}function w(e){return[...o(k(e)),...j()]}function R(e){return[...o(e||k()),...b.getRequiredNamespaces()]}function N(e,n,t){const a=b.withDefaultNs(e),i=O.getTranslation(a,n);return O.changeTranslation(a,n,t),{revert:()=>{O.changeTranslation(a,n,i)}}}function E(e){b.init(e),O.addStaticData(b.getInitialOptions().staticData)}function I(e){return O.isLoading(b.getLanguage(),e)}function D(){return Boolean(b.getInitialOptions().apiKey&&b.getInitialOptions().apiUrl)}function A(e,n){const a=function(e,n){const t=b.getFallbackLangs(e),a=R(n),i=[];return t.forEach((e=>{a.forEach((n=>{O.exists({language:e,namespace:n},!0)||i.push({language:e,namespace:n})}))})),i}(e,n);if(a.length)return t(P(a),(()=>{}))}function F({key:e,ns:n}){const t=w(n),a=b.getFallbackLangs();return O.getTranslationFallback(t,a,e)}function S(){const e=t(function(){if(b.getLanguage())return;if(!b.getInitialOptions().defaultLanguage)throw new Error(a("defaultLanguage"));const e=m.getInitialLanguage();return t(e,(e=>{const n=e||b.getInitialOptions().defaultLanguage;n&&b.setLanguage(n)}))}(),(()=>A()));if(n(e))return b.setInitialLoading(!0),l.notify(),f.notify(),Promise.resolve(e).then((()=>{b.setInitialLoading(!1),l.notify(),f.notify(),i.onInitialLoaded.emit()}));i.onInitialLoaded.emit()}function P(e){return O.loadRecords(e,D())}e&&E(e),i.onUpdate.listen((()=>{b.isRunning()&&m.retranslate()}));return Object.freeze(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},i),b),m),O),{init:E,changeLanguage:async function(e){b.getPendingLanguage()===e&&b.getLanguage()===e||(b.setPendingLanguage(e),b.isRunning()&&await A(e),e===b.getPendingLanguage()&&(b.setLanguage(e),m.setStoredLanguage(e)))},getTranslation:F,changeTranslation:N,addActiveNs:async function(e,n){n||b.addActiveNs(e),b.isRunning()&&await A(void 0,e)},loadRecords:P,loadRecord:async function(e){return(await P([e]))[0]},isLoading:I,isLoaded:function(e){const n=b.getLanguage();if(!n)return!1;const t=b.getFallbackLangs(n),a=R(e),i=[];return t.forEach((e=>{a.forEach((n=>{O.exists({language:e,namespace:n})||i.push({language:e,namespace:n})}))})),0===i.length},t:(...e)=>{const n=L(...e),t=F(n);return m.formatTranslation(Object.assign(Object.assign({},n),{translation:t}))},isDev:D,run:function(){let e;return(()=>{const e=m.getLanguageDetector();if(e&&!b.getAvailableLanguages())throw new Error(a("availableLanguages"));if(!b.getLanguage()&&!b.getInitialOptions().defaultLanguage)throw e?new Error(a("defaultLanguage")):new Error(a("language"))})(),b.isRunning()||(D()&&O.invalidate(),b.setRunning(!0),m.run(D()),e=S()),Promise.resolve(e)},stop:function(){b.isRunning()&&(m.stop(),b.setRunning(!1))}}))};class k extends Error{constructor(e,n,t){let a;a=0===e?"Empty parameter":1===e?"Unexpected character":"Unexpected end",super(`Tolgee parser: ${a} at ${n} in "${t}"`),this.code=e,this.index=n}}function w(e){return/\s/.test(e)}const R=new Set([2,1,0]),N=new Set(["{","}","'"]);function E(e,n){const[t,a]=function(e){let n=0,t="",a="",i="";const o=[],r=[];let s=0;function c(n){throw new k(n,s,e)}const g=()=>{o.push(t),t=""},u=()=>{""===a&&c(0),r.push(a),a=""};for(s=0;s<e.length;s++)switch(i=e[s],n){case 0:"'"===i?(t+=i,n=1):"{"===i?(g(),n=3):(t+=i,n=0);break;case 1:N.has(i)?(t=t.slice(0,-1)+i,n=2):(t+=i,n=0);break;case 2:"'"===i?n=0:(t+=i,n=2);break;case 3:"}"===i?(u(),n=0):w(i)?""!==a&&(u(),n=4):(/[0-9a-zA-Z_]/.test(i)||c(1),a+=i,n=3);break;case 4:"}"==i?n=0:w(i)?n=4:c(1)}return R.has(n)||c(2),g(),[o,r]}(e),i=[t[0]];for(let o=1;o<t.length;o++){const r=null==n?void 0:n[a[o-1]];if(void 0===r)throw new Error(`Missing parameter "${a[o-1]}" in "${e}"`);i.push(String(r)),i.push(t[o])}return i.join("")}e.FormatSimple=()=>(e,n)=>(n.setFinalFormatter({format:({translation:e,params:n})=>E(e,n)}),e),e.Tolgee=()=>{const e={plugins:[],options:{}},n=Object.freeze({use:t=>(e.plugins.push(t),n),updateDefaults:t=>(e.options=m(e.options,t),n),init(n){const t=(e=>{const n=j({options:e}),t=e=>{const t=n.isRunning();t&&n.stop(),e(),t&&n.run()},a=Object.freeze({on:n.on,onNsUpdate:n.onUpdate.listenSome,getLanguage:n.getLanguage,getPendingLanguage:n.getPendingLanguage,changeLanguage:n.changeLanguage,changeTranslation:n.changeTranslation,addActiveNs:n.addActiveNs,removeActiveNs:n.removeActiveNs,loadRecords:n.loadRecords,loadRecord:n.loadRecord,addStaticData:n.addStaticData,getRecord:n.getRecord,getAllRecords:n.getAllRecords,isLoaded:n.isLoaded,isInitialLoading:n.isInitialLoading,isLoading:n.isLoading,isFetching:n.isFetching,isRunning:n.isRunning,run:n.run,stop:n.stop,t:n.t,highlight:n.highlight,getInitialOptions:n.getInitialOptions,isDev:n.isDev,wrap:n.wrap,unwrap:n.unwrap,overrideCredentials(e){t((()=>n.overrideCredentials(e)))},addPlugin(e){e&&t((()=>n.addPlugin(a,e)))},updateOptions(e){e&&t((()=>n.init(e)))}});return a})(m(e.options,n));return e.plugins.forEach(t.addPlugin),t}});return n},e.getFallback=i,e.getFallbackArray=o,e.getTranslateProps=L,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self)["@tolgee/core"]={})}(this,(function(e){"use strict";function n(e){return Boolean(e&&"function"==typeof e.then)}const t=(e,t)=>n(e)?Promise.resolve(e).then(t):t(e),a=e=>`Tolgee: You need to specify '${e}' option`;function i(e){return"string"==typeof e?[e]:Array.isArray(e)?e:void 0}function o(e){return i(e)||[]}function r(e,n){return"object"!=typeof(t=n)||Array.isArray(t)||null===t?o(n):o(null==n?void 0:n[e]);var t}function s(e){return Array.from(new Set(e))}function c(e){return e?e.replace(/\/+$/,""):e}const g=e=>{let n=[];return Object.freeze({listen:e=>{const t=n=>{e(n)};return n.push(t),{unsubscribe:()=>{n=n.filter((e=>t!==e))}}},emit:t=>{e()&&n.forEach((e=>e({value:t})))}})},u=(e,n,t)=>{const a=new Set,i=new Set;let r=[];const s=()=>{if(0===r.length)return;const e=r;r=[],a.forEach((e=>{e({value:void 0})}));let t=new Set;e.forEach((e=>{void 0===e?t=void 0:void 0!==t&&e.forEach((e=>t.add(e)))}));(e=>{const t=new Set(n());i.forEach((n=>{(void 0===e||-1!==(null==e?void 0:e.findIndex((e=>t.has(e)||n.namespaces.has(e)))))&&n.fn({value:void 0})}))})(t?Array.from(t.keys()):void 0)};return Object.freeze({listenSome:e=>{const n={fn:n=>{e(n)},namespaces:new Set};i.add(n);const a={unsubscribe:()=>{i.delete(n)},subscribeNs:e=>(o(e).forEach((e=>n.namespaces.add(e))),void 0===e&&n.namespaces.add(t()),a)};return a},listen:e=>{a.add(e);return{unsubscribe:()=>{a.delete(e)}}},emit:(n,t)=>{e()&&(r.push(n),t?setTimeout(s,0):s())}})},l=e=>{const n=new Map;return Object.entries(e).forEach((([e,t])=>{null!=t&&("object"!=typeof t?n.set(e,t):l(t).forEach(((t,a)=>{n.set(e+"."+a,t)})))})),n},d=e=>{const[n,...t]=e.split(":");return{language:n,namespace:t.join(":")||""}},f=({language:e,namespace:n})=>n?`${e}:${n}`:e,p=(e,n,t,a,i,r,c)=>{const g=new Map,u=new Map;let p={},v=0;function h(n,t,a){const i=f(n);u.set(i,{data:l(t),version:a}),e.emit(n)}function b(e,n){h(e,n,v)}function m(e,n=!1){const t=u.get(f(e));return t&&n?t.version===v:Boolean(t)}function y(e){var n;return null===(n=u.get(f(a(e))))||void 0===n?void 0:n.data}function O(e){let t;if(!t){const n=p[f(e)];"function"==typeof n&&(t=n())}return t||(t=n(e)),t}return Object.freeze({addStaticData:function(e){e&&(p=Object.assign(Object.assign({},p),e),Object.entries(e).forEach((([e,n])=>{if("function"!=typeof n){const t=d(e),a=u.get(e);a&&0!==a.version||h(t,n,0)}})))},invalidate:function(){g.clear(),v+=1},addRecord:b,exists:m,getRecord:y,getTranslation:function(e,n){var t;return null===(t=u.get(f(e)))||void 0===t?void 0:t.data.get(n)},getTranslationNs:function(e,n,t){var a;for(const i of e)for(const e of n){const n=null===(a=u.get(f({language:e,namespace:i})))||void 0===a?void 0:a.data.get(t);if(null!=n)return[i]}return s(e)},getTranslationFallback:function(e,n,t){var a;for(const i of e)for(const e of n){const n=null===(a=u.get(f({language:e,namespace:i})))||void 0===a?void 0:a.data.get(t);if(null!=n)return n}},changeTranslation:function(n,t,a){var i;const o=null===(i=u.get(f(n)))||void 0===i?void 0:i.data;null==o||o.set(t,a),e.emit(Object.assign(Object.assign({},n),{key:t}))},isFetching:function(e){if(i())return!0;if(void 0===e)return g.size>0;const n=o(e);return Boolean(Array.from(g.keys()).find((e=>n.includes(d(e).namespace))))},isLoading:function(e,n){const t=o(n);return Boolean(i()||Array.from(g.keys()).find((n=>{const a=d(n);return(!t.length||t.includes(a.namespace))&&!m({namespace:a.namespace,language:e})})))},loadRecords:async function(e,n){const i=e.map((e=>{const i=a(e),o=f(i),r=g.get(o);if(r)return{new:!1,promise:r,keyObject:i,cacheKey:o};const s=function(e,n){var a;let i;return n&&(i=null===(a=t(e))||void 0===a?void 0:a.catch((()=>(console.warn("Tolgee: Failed to fetch data from dev backend"),O(e))))),i||(i=O(e)),i}(i,n)||Promise.resolve(void 0);return g.set(o,s),{new:!0,promise:s,keyObject:i,cacheKey:o}}));r.notify(),c.notify();const o=await Promise.all(i.map((e=>e.promise)));return i.forEach(((e,n)=>{const t=g.get(e.cacheKey)!==e.promise;if(e.new&&!t){g.delete(e.cacheKey);const t=o[n];t?b(e.keyObject,t):y(e.keyObject)||b(e.keyObject,{})}})),r.notify(),c.notify(),i.map((e=>y(e.keyObject)))},getAllRecords:function(){return Array.from(u.entries()).map((([e,n])=>Object.assign(Object.assign({},d(e)),{data:n.data})))}})};function v(e,n){var t={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&n.indexOf(a)<0&&(t[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(a=Object.getOwnPropertySymbols(e);i<a.length;i++)n.indexOf(a[i])<0&&Object.prototype.propertyIsEnumerable.call(e,a[i])&&(t[a[i]]=e[a[i]])}return t}const h="invalid",b={defaultNs:"",observerOptions:{tagAttributes:{textarea:["placeholder"],input:["value","placeholder"],img:["alt"],"*":["aria-label","title"]},restrictedElements:["script","style"],highlightKeys:["Alt"],highlightColor:"rgb(255, 0, 0)",highlightWidth:5,inputPrefix:"%-%tolgee:",inputSuffix:"%-%",passToParent:["option","optgroup"]},observerType:"invisible",onFormatError:h},m=(...e)=>{let n={};return e.forEach((e=>{n=Object.assign(Object.assign(Object.assign({},n),e),{observerOptions:Object.assign(Object.assign({},n.observerOptions),null==e?void 0:e.observerOptions)})})),n},y=(e,n)=>{const t=m(b,null==n?void 0:n.initialOptions,e);return t.apiUrl=c(t.apiUrl),{initialOptions:t,activeNamespaces:(null==n?void 0:n.activeNamespaces)||new Map,language:null==n?void 0:n.language,pendingLanguage:null==n?void 0:n.language,isInitialLoading:!1,isRunning:!1}},O=(e,a,i,o,r,s)=>{const c={ui:void 0,observer:void 0},g={formatters:[],finalFormatter:void 0,observer:void 0,devBackend:void 0,backends:[],ui:void 0,languageDetector:void 0,languageStorage:void 0},u=async({keysAndDefaults:e,event:n})=>{var t;const a=e.map((({key:e,ns:n,defaultValue:t})=>({key:e,defaultValue:t,ns:o({key:e,ns:n}),translation:r({key:e,ns:n})})));null===(t=g.ui)||void 0===t||t.handleElementClick(a,n)},l=(e,n)=>{var t,a;return(null===(a=null===(t=g.observer)||void 0===t?void 0:t.highlight)||void 0===a?void 0:a.call(t,e,n))||{unhighlight(){}}},d=e=>{const n=r({key:e.key,ns:e.ns});return E(Object.assign(Object.assign({},e),{translation:n,formatEnabled:!0}))},f=e=>{c.observer=e},p=()=>Boolean(c.observer),b=e=>{e&&g.formatters.push(e)},m=e=>{g.finalFormatter=e},y=e=>{c.ui=e},O=()=>Boolean(c.ui),L=e=>{g.languageStorage=e},j=e=>{g.languageDetector=e},k=e=>{e&&g.backends.push(e)},w=e=>{g.devBackend=e},R=()=>g.devBackend;function E(n){var t,{formatEnabled:i}=n,o=v(n,["formatEnabled"]);const{key:r,translation:s,defaultValue:c,noWrap:u,params:l,orEmpty:d,ns:f}=o,p=s||c;let b=p||(d?"":r);const m=e(),y=i||!(null===(t=g.observer)||void 0===t?void 0:t.outputNotFormattable),O=e=>g.observer&&!u?g.observer.wrap({key:r,translation:e,defaultValue:c,params:l,ns:f}):e;b=O(b);try{if(p&&m&&y)for(const e of g.formatters)b=e.format({translation:b,language:m,params:l});g.finalFormatter&&p&&m&&y&&(b=g.finalFormatter.format({translation:b,language:m,params:l}))}catch(e){console.error(e);const n=("string"==typeof(L=e)?L:"string"==typeof(null==L?void 0:L.message)?L.message:void 0)||h,t=a().onFormatError,i=typeof t;b="string"===i?t:"function"===i?t(n,o):h,b=O(b)}var L;return b}return Object.freeze({addPlugin:function(e,n){n(e,Object.freeze({setFinalFormatter:m,addFormatter:b,setObserver:f,hasObserver:p,setUi:y,hasUi:O,setDevBackend:w,addBackend:k,setLanguageDetector:j,setLanguageStorage:L}))},formatTranslation:E,getDevBackend:R,getBackendRecord:({language:e,namespace:t})=>{for(const a of g.backends){const i=a.getRecord({language:e,namespace:t});if(n(i))return null==i?void 0:i.catch((e=>(console.error(e),{})));if(void 0!==i)return i}},getBackendDevRecord:({language:e,namespace:n})=>{var t;const{apiKey:i,apiUrl:o,projectId:r}=a();return null===(t=g.devBackend)||void 0===t?void 0:t.getRecord({apiKey:i,apiUrl:o,projectId:r,language:e,namespace:n})},getLanguageDetector:()=>g.languageDetector,getLanguageStorage:()=>g.languageStorage,getInitialLanguage:()=>{var e;const n=i(),a=null===(e=g.languageStorage)||void 0===e?void 0:e.getLanguage();return t(a,(e=>n&&!n.includes(e)||!e?(()=>{if(!g.languageDetector)return;const e=i();return g.languageDetector.getLanguage({availableLanguages:e})})():e))},setStoredLanguage:e=>{var n;null===(n=g.languageStorage)||void 0===n||n.setLanguage(e)},run:()=>{var e,n,t;if(!g.ui){const{apiKey:n,apiUrl:t,projectId:i}=a();g.ui=null===(e=c.ui)||void 0===e?void 0:e.call(c,{apiKey:n,apiUrl:t,projectId:i,highlight:l,changeTranslation:s})}g.observer||(g.observer=null===(n=c.observer)||void 0===n?void 0:n.call(c,{translate:d,onClick:u,options:a().observerOptions})),null===(t=g.observer)||void 0===t||t.run({mouseHighlight:!0})},stop:()=>{var e;g.ui=void 0,null===(e=g.observer)||void 0===e||e.stop()},retranslate:()=>{var e;null===(e=g.observer)||void 0===e||e.retranslate()},highlight:l,unwrap:e=>{var n;return g.observer?null===(n=g.observer)||void 0===n?void 0:n.unwrap(e):{text:e,keys:[]}},wrap:e=>{var n;return g.observer?null===(n=g.observer)||void 0===n?void 0:n.wrap(e):e.translation},hasDevBackend:function(){return Boolean(R())}})},L=(e,n,t)=>{let a=e;return Object.freeze({init:function(e){a=e},notify:function(){const e=n();a!==e&&t(e),a=e}})};const j=(e,...n)=>{let t,a={};return"object"==typeof e?a=e:(a.key=e,"string"==typeof n[0]?(a.defaultValue=n[0],t=n[1]):"object"==typeof n[0]&&(t=n[0])),t&&(a=Object.assign(Object.assign({},function(e){var{ns:n,noWrap:t,orEmpty:a,params:i}=e,o=v(e,["ns","noWrap","orEmpty","params"]);const r={ns:n,noWrap:t,orEmpty:a};return Object.assign(Object.assign({},r),{params:Object.assign({},o)})}(t)),a)),a},k=({options:e})=>{const i=((e,n)=>{let t=!0;function a(){return t}const i=g(a),o=g(a),r=g(a),s=g(a),c=g(a),l=g(a),d=g(a),f=u(a,e,n);return c.listen((()=>f.emit())),o.listen((()=>f.emit())),d.listen((({value:e})=>{f.emit([e.namespace],!0)})),Object.freeze({onPendingLanguageChange:i,onLanguageChange:o,onLoadingChange:r,onFetchingChange:s,onInitialLoaded:c,onRunningChange:l,onCacheChange:d,onUpdate:f,setEmmiterActive:function(e){t=e},on:(e,n)=>{switch(e){case"pendingLanguage":return i.listen(n);case"language":return o.listen(n);case"loading":return r.listen(n);case"fetching":return s.listen(n);case"initialLoad":return c.listen(n);case"running":return l.listen(n);case"cache":return d.listen(n);case"update":return f.listen(n)}}})})(m,k),l=L(!1,(()=>b.isFetching()),i.onFetchingChange.emit),f=L(!1,(()=>A()),i.onLoadingChange.emit),v=((e,n,t)=>{let a,i=y();function g(){return i.language||i.initialOptions.language}function u(){return Object.assign(Object.assign({},i.initialOptions),a)}return Object.freeze({init:function(e){i=y(e,i)},isRunning:function(){return i.isRunning},setRunning:function(e){i.isRunning!==e&&(i.isRunning=e,t.emit(e))},isInitialLoading:function(){return i.isInitialLoading},setInitialLoading:function(e){i.isInitialLoading=e},getLanguage:g,setLanguage:function(n){i.language!==n&&(i.language=n,e.emit(n))},getPendingLanguage:function(){return i.pendingLanguage||g()},setPendingLanguage:function(e){i.pendingLanguage!==e&&(i.pendingLanguage=e,n.emit(e))},getInitialOptions:u,addActiveNs:function(e){o(e).forEach((e=>{const n=i.activeNamespaces.get(e);void 0!==n?i.activeNamespaces.set(e,n+1):i.activeNamespaces.set(e,1)}))},removeActiveNs:function(e){o(e).forEach((e=>{const n=i.activeNamespaces.get(e);void 0!==n&&n>1?i.activeNamespaces.set(e,n-1):i.activeNamespaces.delete(e)}))},getRequiredNamespaces:function(){return s([...i.initialOptions.ns||[i.initialOptions.defaultNs],...o(i.initialOptions.fallbackNs),...i.activeNamespaces.keys()])},getFallbackLangs:function(e){const n=e||g();return n?s([n,...r(n,i.initialOptions.fallbackLanguage)]):[]},getFallbackNs:function(){return o(i.initialOptions.fallbackNs)},getDefaultNs:function(e){return void 0===e?i.initialOptions.defaultNs:e},getAvailableLanguages:function(){if(i.initialOptions.availableLanguages)return i.initialOptions.availableLanguages;if(i.initialOptions.staticData){const e=Object.keys(i.initialOptions.staticData).map((e=>d(e).language));return Array.from(new Set(e))}},withDefaultNs:function(e){return{namespace:void 0===e.namespace?u().defaultNs:e.namespace,language:e.language}},overrideCredentials:function(e){a=e?Object.assign(Object.assign({},e),{apiUrl:c(e.apiUrl)}):void 0}})})(i.onLanguageChange,i.onPendingLanguageChange,i.onRunningChange),h=O(v.getLanguage,v.getInitialOptions,v.getAvailableLanguages,(function({key:e,ns:n}){const t=v.getFallbackLangs(),a=w(n);return b.getTranslationNs(a,t,e)}),D,E),b=p(i.onCacheChange,h.getBackendRecord,h.getBackendDevRecord,v.withDefaultNs,v.isInitialLoading,l,f);function m(){return v.getFallbackNs()}function k(e){return v.getDefaultNs(e)}function w(e){return[...o(k(e)),...m()]}function R(e){return[...o(e||k()),...v.getRequiredNamespaces()]}function E(e,n,t){const a=v.withDefaultNs(e),i=b.getTranslation(a,n);return b.changeTranslation(a,n,t),{revert:()=>{b.changeTranslation(a,n,i)}}}function N(e){v.init(e),b.addStaticData(v.getInitialOptions().staticData)}function A(e){return b.isLoading(v.getLanguage(),e)}function F(){return Boolean(v.getInitialOptions().apiKey&&v.getInitialOptions().apiUrl)}function I(e,n){const a=function(e,n){const t=v.getFallbackLangs(e),a=R(n),i=[];return t.forEach((e=>{a.forEach((n=>{b.exists({language:e,namespace:n},!0)||i.push({language:e,namespace:n})}))})),i}(e,n);if(a.length)return t(T(a),(()=>{}))}function D({key:e,ns:n}){const t=w(n),a=v.getFallbackLangs();return b.getTranslationFallback(t,a,e)}function S(){const e=t(function(){if(v.getLanguage())return;if(!v.getInitialOptions().defaultLanguage)throw new Error(a("defaultLanguage"));const e=h.getInitialLanguage();return t(e,(e=>{const n=e||v.getInitialOptions().defaultLanguage;n&&v.setLanguage(n)}))}(),(()=>I()));if(n(e))return v.setInitialLoading(!0),l.notify(),f.notify(),Promise.resolve(e).then((()=>{v.setInitialLoading(!1),l.notify(),f.notify(),i.onInitialLoaded.emit()}));i.onInitialLoaded.emit()}function T(e){return b.loadRecords(e,F())}e&&N(e),i.onUpdate.listen((()=>{v.isRunning()&&h.retranslate()}));return Object.freeze(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},i),v),h),b),{init:N,changeLanguage:async function(e){v.getPendingLanguage()===e&&v.getLanguage()===e||(v.setPendingLanguage(e),v.isRunning()&&await I(e),e===v.getPendingLanguage()&&(v.setLanguage(e),h.setStoredLanguage(e)))},getTranslation:D,changeTranslation:E,addActiveNs:async function(e,n){n||v.addActiveNs(e),v.isRunning()&&await I(void 0,e)},loadRecords:T,loadRecord:async function(e){return(await T([e]))[0]},isLoading:A,isLoaded:function(e){const n=v.getLanguage();if(!n)return!1;const t=v.getFallbackLangs(n),a=R(e),i=[];return t.forEach((e=>{a.forEach((n=>{b.exists({language:e,namespace:n})||i.push({language:e,namespace:n})}))})),0===i.length},t:(...e)=>{const n=j(...e),t=D(n);return h.formatTranslation(Object.assign(Object.assign({},n),{translation:t}))},isDev:F,run:function(){let e;return(()=>{const e=h.getLanguageDetector()||h.getLanguageStorage();if(e&&!v.getAvailableLanguages())throw new Error(a("availableLanguages"));if(!v.getLanguage()&&!v.getInitialOptions().defaultLanguage)throw e?new Error(a("defaultLanguage")):new Error(a("language"))})(),v.isRunning()||(F()&&b.invalidate(),v.setRunning(!0),h.run(),e=S()),Promise.resolve(e)},stop:function(){v.isRunning()&&(h.stop(),v.setRunning(!1))}}))};class w extends Error{constructor(e,n,t){let a;a=0===e?"Empty parameter":1===e?"Unexpected character":"Unexpected end",super(`Tolgee parser: ${a} at ${n} in "${t}"`),this.code=e,this.index=n}}function R(e){return/\s/.test(e)}const E=new Set([2,1,0]),N=new Set(["{","}","'"]);function A(e,n){const[t,a]=function(e){let n=0,t="",a="",i="";const o=[],r=[];let s=0;function c(n){throw new w(n,s,e)}const g=()=>{o.push(t),t=""},u=()=>{""===a&&c(0),r.push(a),a=""};for(s=0;s<e.length;s++)switch(i=e[s],n){case 0:"'"===i?(t+=i,n=1):"{"===i?(g(),n=3):(t+=i,n=0);break;case 1:N.has(i)?(t=t.slice(0,-1)+i,n=2):(t+=i,n=0);break;case 2:"'"===i?n=0:(t+=i,n=2);break;case 3:"}"===i?(u(),n=0):R(i)?""!==a&&(u(),n=4):(/[0-9a-zA-Z_]/.test(i)||c(1),a+=i,n=3);break;case 4:"}"==i?n=0:R(i)?n=4:c(1)}return E.has(n)||c(2),g(),[o,r]}(e),i=[t[0]];for(let o=1;o<t.length;o++){const r=null==n?void 0:n[a[o-1]];if(void 0===r)throw new Error(`Missing parameter "${a[o-1]}" in "${e}"`);i.push(String(r)),i.push(t[o])}return i.join("")}e.FormatSimple=()=>(e,n)=>(n.setFinalFormatter({format:({translation:e,params:n})=>A(e,n)}),e),e.TolgeeCore=()=>{const e={plugins:[],options:{}},n=Object.freeze({use:t=>(e.plugins.push(t),n),updateDefaults:t=>(e.options=m(e.options,t),n),init(n){const t=(e=>{const n=k({options:e}),t=e=>{const t=n.isRunning();t&&n.stop(),e(),t&&n.run()},a=Object.freeze({on:n.on,onNsUpdate:n.onUpdate.listenSome,setEmmiterActive:n.setEmmiterActive,getLanguage:n.getLanguage,getPendingLanguage:n.getPendingLanguage,changeLanguage:n.changeLanguage,changeTranslation:n.changeTranslation,addActiveNs:n.addActiveNs,removeActiveNs:n.removeActiveNs,loadRecords:n.loadRecords,loadRecord:n.loadRecord,addStaticData:n.addStaticData,getRecord:n.getRecord,getAllRecords:n.getAllRecords,isLoaded:n.isLoaded,isInitialLoading:n.isInitialLoading,isLoading:n.isLoading,isFetching:n.isFetching,isRunning:n.isRunning,run:n.run,stop:n.stop,t:n.t,highlight:n.highlight,getInitialOptions:n.getInitialOptions,isDev:n.isDev,wrap:n.wrap,unwrap:n.unwrap,overrideCredentials(e){t((()=>n.overrideCredentials(e)))},addPlugin(e){e&&t((()=>n.addPlugin(a,e)))},updateOptions(e){e&&t((()=>n.init(e)))}});return a})(m(e.options,n));return e.plugins.forEach(t.addPlugin),t}});return n},e.getFallback=i,e.getFallbackArray=o,e.getTranslateProps=j,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
//# sourceMappingURL=tolgee.umd.min.js.map |
@@ -34,6 +34,6 @@ import { CacheDescriptor, NsFallback, TolgeeOptions, TFnType, KeyAndNamespacesInternal } from '../types'; | ||
}[]; | ||
prepare: () => void; | ||
addPlugin: (tolgeeInstance: Readonly<{ | ||
on: import("../types").TolgeeOn<keyof import("../types").EventType>; | ||
onNsUpdate: (handler: import("../types").Listener<undefined>) => import("../types").SubscriptionSelective; | ||
setEmmiterActive: (active: boolean) => void; | ||
getLanguage: () => string | undefined; | ||
@@ -77,4 +77,5 @@ getPendingLanguage: () => string | undefined; | ||
staticData?: import("./State/initState").TolgeeStaticData | undefined; | ||
observerType: "invisible" | "text"; | ||
observerOptions: import("./State/observerOptions").ObserverOptionsInternal; | ||
observerType: "invisible" | "text"; | ||
onFormatError: import("../types").OnFormatError; | ||
}; | ||
@@ -88,3 +89,3 @@ isDev: () => boolean; | ||
}>, plugin: import("../types").TolgeePlugin) => void; | ||
formatTranslation: ({ key, translation, defaultValue, noWrap, params, orEmpty, ns, formatEnabled, }: { | ||
formatTranslation: ({ formatEnabled, ...props }: { | ||
key: string; | ||
@@ -102,2 +103,3 @@ defaultValue?: string | undefined; | ||
getLanguageDetector: () => import("../types").LanguageDetectorMiddleware | undefined; | ||
getLanguageStorage: () => import("../types").LanguageStorageMiddleware | undefined; | ||
getInitialLanguage: () => string | Promise<string | undefined> | Promise<string | Promise<string | undefined> | undefined> | undefined; | ||
@@ -130,4 +132,5 @@ setStoredLanguage: (language: string) => void; | ||
staticData?: import("./State/initState").TolgeeStaticData | undefined; | ||
observerType: "invisible" | "text"; | ||
observerOptions: import("./State/observerOptions").ObserverOptionsInternal; | ||
observerType: "invisible" | "text"; | ||
onFormatError: import("../types").OnFormatError; | ||
}; | ||
@@ -150,2 +153,3 @@ removeActiveNs: (ns: NsFallback) => void; | ||
onUpdate: import("./Events/EventEmitterSelective").EventEmitterSelectiveInstance; | ||
setEmmiterActive: (active: boolean) => void; | ||
on: import("../types").TolgeeOn<keyof import("../types").EventType>; | ||
@@ -152,0 +156,0 @@ }>; |
import { Subscription, Listener } from '../../types'; | ||
export declare const EventEmitter: <T>() => EventEmitterInstance<T>; | ||
export declare const EventEmitter: <T>(isActive: () => boolean) => EventEmitterInstance<T>; | ||
export declare type EventEmitterInstance<T> = { | ||
@@ -4,0 +4,0 @@ readonly listen: (handler: Listener<T>) => Subscription; |
import { Subscription, Listener, SubscriptionSelective } from '../../types'; | ||
export declare const EventEmitterSelective: (getFallbackNs: () => string[], getDefaultNs: () => string) => EventEmitterSelectiveInstance; | ||
export declare const EventEmitterSelective: (isActive: () => boolean, getFallbackNs: () => string[], getDefaultNs: () => string) => EventEmitterSelectiveInstance; | ||
export declare type EventEmitterSelectiveInstance = { | ||
@@ -4,0 +4,0 @@ readonly listenSome: (handler: Listener<undefined>) => SubscriptionSelective; |
@@ -11,4 +11,5 @@ import { CacheDescriptorWithKey, TolgeeOn } from '../../types'; | ||
onUpdate: import("./EventEmitterSelective").EventEmitterSelectiveInstance; | ||
setEmmiterActive: (active: boolean) => void; | ||
on: TolgeeOn<keyof import("../../types").EventType>; | ||
}>; | ||
export declare type EventsInstance = ReturnType<typeof Events>; |
@@ -1,6 +0,5 @@ | ||
import { BackendDevMiddleware, BackendGetRecord, TranslatePropsInternal, HighlightInterface, LanguageDetectorMiddleware, ChangeTranslationInterface, WrapperWrapProps, Unwrapped, KeyAndNamespacesInternal, TolgeePlugin, TolgeeInstance, TolgeeOptionsInternal } from '../../types'; | ||
import { BackendDevMiddleware, BackendGetRecord, TranslatePropsInternal, HighlightInterface, LanguageDetectorMiddleware, LanguageStorageMiddleware, ChangeTranslationInterface, WrapperWrapProps, Unwrapped, KeyAndNamespacesInternal, TolgeePlugin, TolgeeInstance, TolgeeOptionsInternal } from '../../types'; | ||
export declare const Plugins: (getLanguage: () => string | undefined, getInitialOptions: () => TolgeeOptionsInternal, getAvailableLanguages: () => string[] | undefined, getTranslationNs: (props: KeyAndNamespacesInternal) => string[], getTranslation: (props: KeyAndNamespacesInternal) => string | undefined, changeTranslation: ChangeTranslationInterface) => Readonly<{ | ||
prepare: () => void; | ||
addPlugin: (tolgeeInstance: TolgeeInstance, plugin: TolgeePlugin) => void; | ||
formatTranslation: ({ key, translation, defaultValue, noWrap, params, orEmpty, ns, formatEnabled, }: { | ||
formatTranslation: ({ formatEnabled, ...props }: { | ||
key: string; | ||
@@ -18,5 +17,6 @@ defaultValue?: string | undefined; | ||
getLanguageDetector: () => LanguageDetectorMiddleware | undefined; | ||
getLanguageStorage: () => LanguageStorageMiddleware | undefined; | ||
getInitialLanguage: () => string | Promise<string | undefined> | Promise<string | Promise<string | undefined> | undefined> | undefined; | ||
setStoredLanguage: (language: string) => void; | ||
run: (isDev: boolean) => void; | ||
run: () => void; | ||
stop: () => void; | ||
@@ -23,0 +23,0 @@ retranslate: () => void; |
@@ -1,3 +0,4 @@ | ||
import { FallbackGeneral, FallbackLanguageOption, TreeTranslationsData } from '../../types'; | ||
import { FallbackGeneral, FallbackLanguageOption, TreeTranslationsData, OnFormatError } from '../../types'; | ||
import { ObserverOptions, ObserverOptionsInternal } from './observerOptions'; | ||
export declare const DEFAULT_FORMAT_ERROR = "invalid"; | ||
export declare type TolgeeStaticData = { | ||
@@ -60,4 +61,14 @@ [key: string]: TreeTranslationsData | (() => Promise<TreeTranslationsData>); | ||
staticData?: TolgeeStaticData; | ||
/** | ||
* Switches between invisible and text observer. (Default: invisible) | ||
*/ | ||
observerType: 'invisible' | 'text'; | ||
/** | ||
* Observer options object. | ||
*/ | ||
observerOptions: ObserverOptionsInternal; | ||
observerType: 'invisible' | 'text'; | ||
/** | ||
* Define what to display in case of formatting error. (Default: 'invalid') | ||
*/ | ||
onFormatError: OnFormatError; | ||
}; | ||
@@ -64,0 +75,0 @@ export declare type TolgeeOptions = Partial<Omit<TolgeeOptionsInternal, 'observerOptions'>> & { |
@@ -26,4 +26,5 @@ import { CacheDescriptor, CacheDescriptorInternal, DevCredentials, NsFallback, NsType } from '../../types'; | ||
staticData?: import("./initState").TolgeeStaticData | undefined; | ||
observerType: "invisible" | "text"; | ||
observerOptions: import("./observerOptions").ObserverOptionsInternal; | ||
observerType: "invisible" | "text"; | ||
onFormatError: import("../../types").OnFormatError; | ||
}; | ||
@@ -30,0 +31,0 @@ addActiveNs: (ns: NsFallback) => void; |
@@ -11,1 +11,2 @@ import { FallbackGeneral, FallbackLanguageOption } from './types'; | ||
export declare function sanitizeUrl(url: string | undefined): string | undefined; | ||
export declare function getErrorMessage(error: any): string | undefined; |
export { getFallback, getFallbackArray } from './helpers'; | ||
export { Tolgee } from './Tolgee'; | ||
export { TolgeeCore } from './TolgeeCore'; | ||
export * from './types'; | ||
export { getTranslateProps } from './TranslateParams'; | ||
export { FormatSimple } from './FormatSimple/FormatSimple'; |
@@ -20,6 +20,6 @@ import type { NsFallback } from './general'; | ||
export declare type Listener<T> = (e: ListenerEvent<T>) => void; | ||
export declare type TolgeeEvent = 'pendingLanguage' | 'language' | 'loading' | 'fetching' | 'initialLoad' | 'running' | 'cache' | 'update'; | ||
export declare type TolgeeEvent = 'language' | 'pendingLanguage' | 'loading' | 'fetching' | 'initialLoad' | 'running' | 'cache' | 'update'; | ||
export interface EventType { | ||
language: string; | ||
pendingLanguage: string; | ||
language: string; | ||
loading: boolean; | ||
@@ -26,0 +26,0 @@ fetching: boolean; |
@@ -7,2 +7,2 @@ export * from './general'; | ||
export type { ObserverOptions, ObserverOptionsInternal, ModifierKey, } from '../Controller/State/observerOptions'; | ||
export type { TolgeeChainer, TolgeeInstance } from '../Tolgee'; | ||
export type { TolgeeChainer, TolgeeInstance } from '../TolgeeCore'; |
import { ChangeTranslationInterface, TreeTranslationsData } from './cache'; | ||
import { NsFallback, NsType, TranslateParams, TranslatePropsInternal } from './general'; | ||
import type { ObserverOptionsInternal } from '../Controller/State/observerOptions'; | ||
import { TolgeeInstance } from '../Tolgee'; | ||
import { TolgeeInstance } from '../TolgeeCore'; | ||
export declare type BackendDevProps = { | ||
@@ -109,10 +109,6 @@ apiUrl?: string; | ||
}; | ||
export interface UiMiddleware { | ||
export declare type UiMiddleware = (props: UiProps) => UiInterface; | ||
export interface UiInterface { | ||
handleElementClick(keysAndDefaults: UiKeyOption[], event: any): Promise<void>; | ||
} | ||
export declare type UiConstructor = new (props: UiProps) => UiMiddleware; | ||
export declare type UiLibMiddleware = { | ||
UI: UiConstructor; | ||
}; | ||
export declare type UiType = UiConstructor | UiLibMiddleware; | ||
export declare type PluginTools = Readonly<{ | ||
@@ -123,3 +119,3 @@ setFinalFormatter: (formatter: FinalFormatterMiddleware | undefined) => void; | ||
hasObserver: () => boolean; | ||
setUi: (ui: UiLibMiddleware | undefined) => void; | ||
setUi: (ui: UiMiddleware | undefined) => void; | ||
hasUi: () => boolean; | ||
@@ -130,4 +126,5 @@ addBackend: (backend: BackendMiddleware | undefined) => void; | ||
setLanguageStorage: (languageStorage: LanguageStorageMiddleware | undefined) => void; | ||
onPrepare: (callback: () => void) => void; | ||
}>; | ||
export declare type TolgeePlugin = (tolgee: TolgeeInstance, tools: PluginTools) => TolgeeInstance; | ||
export declare type FormatErrorHandler = (error: string, info: TranslatePropsInternal) => string; | ||
export declare type OnFormatError = string | FormatErrorHandler; |
{ | ||
"name": "@tolgee/core", | ||
"version": "5.0.0-alpha.1", | ||
"version": "5.0.0-rc.8558283.0", | ||
"description": "Library providing ability to translate messages directly in context of developed application.", | ||
@@ -65,3 +65,3 @@ "main": "./dist/tolgee.cjs.js", | ||
}, | ||
"gitHead": "9c66dbc9a72cc2874cf24abbe99af5eb6df45d50" | ||
"gitHead": "25bd3e76e73b5a83fb01a2341e98f5fd7ff1fd46" | ||
} |
@@ -1,2 +0,2 @@ | ||
import { Tolgee } from '../Tolgee'; | ||
import { TolgeeCore } from '../TolgeeCore'; | ||
import { BackendMiddleware, TolgeePlugin } from '../types'; | ||
@@ -35,3 +35,3 @@ | ||
it('uses plugin to fetch', async () => { | ||
const tolgee = Tolgee() | ||
const tolgee = TolgeeCore() | ||
.use(backendPlugin) | ||
@@ -38,0 +38,0 @@ .init({ |
@@ -1,2 +0,3 @@ | ||
import { Tolgee, TolgeeInstance } from '../Tolgee'; | ||
/* eslint-disable no-console */ | ||
import { TolgeeCore, TolgeeInstance } from '../TolgeeCore'; | ||
import { TolgeePlugin, TreeTranslationsData } from '../types'; | ||
@@ -41,3 +42,3 @@ import { resolvablePromise } from './testTools'; | ||
beforeEach(async () => { | ||
tolgee = Tolgee().init({ | ||
tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -108,2 +109,3 @@ staticData: { | ||
it('keeps data when dev backend throws', async () => { | ||
console.warn = jest.fn(); | ||
const keyUpdateHandler = jest.fn(); | ||
@@ -118,2 +120,3 @@ tolgee.on('update', keyUpdateHandler); | ||
expect(tolgee.t('test.sub')).toEqual('subtestEn'); | ||
expect(console.warn).toBeCalledTimes(1); | ||
}); | ||
@@ -175,3 +178,3 @@ | ||
const [promiseEn, resolveEn] = resolvablePromise<TreeTranslationsData>(); | ||
tolgee = Tolgee().init({ | ||
tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -178,0 +181,0 @@ staticData: { |
@@ -1,2 +0,2 @@ | ||
import { Tolgee } from '../index'; | ||
import { TolgeeCore } from '../index'; | ||
@@ -14,3 +14,3 @@ describe('using tolgee as client', () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -17,0 +17,0 @@ ns: ['common'], |
@@ -1,6 +0,6 @@ | ||
import { Tolgee } from '../index'; | ||
import { TolgeeCore } from '../index'; | ||
describe('events', () => { | ||
it('emits language change event', async () => { | ||
const tolgee = Tolgee().init({ language: 'en' }); | ||
const tolgee = TolgeeCore().init({ language: 'en' }); | ||
const handler = jest.fn((lang) => {}); | ||
@@ -13,3 +13,3 @@ tolgee.on('language', handler); | ||
it('correctly emits translation change listeners', async () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -21,4 +21,4 @@ staticData: { | ||
}); | ||
const helloHandler = jest.fn((data) => {}); | ||
const languageHandler = jest.fn((data) => {}); | ||
const helloHandler = jest.fn(() => {}); | ||
const languageHandler = jest.fn(() => {}); | ||
@@ -35,2 +35,27 @@ tolgee.onNsUpdate(helloHandler); | ||
}); | ||
it('stop emitting when turned off', async () => { | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
staticData: { | ||
en: { hello: 'World', language: 'English' }, | ||
es: { hello: 'Mundo', language: 'Spanish' }, | ||
}, | ||
}); | ||
const eventHandler = jest.fn(() => {}); | ||
tolgee.on('language', eventHandler); | ||
tolgee.on('pendingLanguage', eventHandler); | ||
await tolgee.changeLanguage('es'); | ||
expect(eventHandler).toBeCalledTimes(2); | ||
tolgee.setEmmiterActive(false); | ||
await tolgee.changeLanguage('en'); | ||
expect(eventHandler).toBeCalledTimes(2); | ||
tolgee.setEmmiterActive(true); | ||
await tolgee.changeLanguage('es'); | ||
expect(eventHandler).toBeCalledTimes(4); | ||
}); | ||
}); |
import { FormatSimple } from '../FormatSimple/FormatSimple'; | ||
import { Tolgee } from '../Tolgee'; | ||
import { TolgeeCore } from '../TolgeeCore'; | ||
describe('format simple', () => { | ||
it('works with parameters', () => { | ||
const tolgee = Tolgee() | ||
const tolgee = TolgeeCore() | ||
.use(FormatSimple()) | ||
@@ -14,14 +14,2 @@ .init({ | ||
}); | ||
it('throws an error when parameter missing', () => { | ||
const tolgee = Tolgee() | ||
.use(FormatSimple()) | ||
.init({ | ||
language: 'en', | ||
staticData: { en: { apples: 'Bob has { num } apples' } }, | ||
}); | ||
expect(() => tolgee.t('apples')).toThrow( | ||
'Missing parameter "num" in "Bob has { num } apples"' | ||
); | ||
}); | ||
}); |
@@ -1,2 +0,2 @@ | ||
import { Tolgee } from '../index'; | ||
import { TolgeeCore } from '../index'; | ||
@@ -14,3 +14,3 @@ describe('initialization behavior', () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -52,3 +52,3 @@ ns: ['common'], | ||
it("won't start loading when nothing to load", async () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -77,3 +77,3 @@ staticData: { | ||
it('emits keyUpdate on initialLoad', async () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -80,0 +80,0 @@ staticData: { en: { hello: 'world' } }, |
@@ -1,2 +0,2 @@ | ||
import { Tolgee, TolgeePlugin, TolgeeInstance } from '../index'; | ||
import { TolgeeCore, TolgeePlugin, TolgeeInstance } from '../index'; | ||
@@ -22,3 +22,3 @@ const DetectionPlugin = | ||
it('will detect language without loading', async () => { | ||
tolgee = Tolgee() | ||
tolgee = TolgeeCore() | ||
.use(DetectionPlugin('en')) | ||
@@ -47,3 +47,3 @@ .init({ | ||
it('will detect language async', async () => { | ||
tolgee = Tolgee() | ||
tolgee = TolgeeCore() | ||
.use(DetectionPlugin(Promise.resolve('en'))) | ||
@@ -74,3 +74,3 @@ .init({ | ||
it('will fallback correctly', async () => { | ||
tolgee = Tolgee() | ||
tolgee = TolgeeCore() | ||
.use(DetectionPlugin(Promise.resolve(undefined))) | ||
@@ -91,3 +91,3 @@ .init({ | ||
it('will return key before language is loaded', async () => { | ||
tolgee = Tolgee() | ||
tolgee = TolgeeCore() | ||
.use(DetectionPlugin(Promise.resolve('en'))) | ||
@@ -109,3 +109,3 @@ .init({ | ||
it('will throw error when no avaliableLanguages are set', () => { | ||
tolgee = Tolgee().use(DetectionPlugin('en')).init({ | ||
tolgee = TolgeeCore().use(DetectionPlugin('en')).init({ | ||
defaultLanguage: 'es', | ||
@@ -118,3 +118,3 @@ }); | ||
it('will throw error when no defaultLanguage specified', () => { | ||
tolgee = Tolgee() | ||
tolgee = TolgeeCore() | ||
.use(DetectionPlugin('en')) | ||
@@ -131,3 +131,3 @@ .init({ | ||
it('will throw error when no available languages specified', () => { | ||
tolgee = Tolgee().use(DetectionPlugin('en')).init({}); | ||
tolgee = TolgeeCore().use(DetectionPlugin('en')).init({}); | ||
@@ -134,0 +134,0 @@ expect(() => tolgee.run()).toThrow(/'availableLanguages'/); |
@@ -1,2 +0,2 @@ | ||
import { Tolgee, TreeTranslationsData } from '../index'; | ||
import { TolgeeCore, TreeTranslationsData } from '../index'; | ||
import { resolvablePromise } from './testTools'; | ||
@@ -6,3 +6,3 @@ | ||
it('changes language', async () => { | ||
const tolgee = Tolgee().init({ language: 'en' }); | ||
const tolgee = TolgeeCore().init({ language: 'en' }); | ||
expect(tolgee.getLanguage()).toEqual('en'); | ||
@@ -14,3 +14,3 @@ await tolgee.changeLanguage('es'); | ||
it('returns correct translation', async () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -29,3 +29,3 @@ staticData: { en: { hello: 'World' }, es: { hello: 'Mundo' } }, | ||
const [promiseEs, resolveEs] = resolvablePromise<TreeTranslationsData>(); | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -59,3 +59,3 @@ staticData: { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'es', | ||
@@ -102,3 +102,3 @@ staticData: { | ||
it('will fallback to default value', () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
defaultLanguage: 'en', | ||
@@ -113,3 +113,3 @@ }); | ||
it('will throw error when no language specified', () => { | ||
const tolgee = Tolgee().init({}); | ||
const tolgee = TolgeeCore().init({}); | ||
@@ -121,3 +121,3 @@ expect(() => tolgee.run()).toThrow(/'language'/); | ||
const loadNs = jest.fn(() => Promise.resolve(undefined as any)); | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -124,0 +124,0 @@ fallbackNs: ['fallback'], |
@@ -1,2 +0,2 @@ | ||
import { Tolgee, TolgeePlugin, TolgeeInstance } from '../index'; | ||
import { TolgeeCore, TolgeePlugin, TolgeeInstance } from '../index'; | ||
@@ -25,3 +25,3 @@ describe('language storage plugin', () => { | ||
it('will restore language without loading', async () => { | ||
tolgee = Tolgee() | ||
tolgee = TolgeeCore() | ||
.use(StoragePlugin('en')) | ||
@@ -50,3 +50,3 @@ .init({ | ||
it('will restore language async', async () => { | ||
tolgee = Tolgee() | ||
tolgee = TolgeeCore() | ||
.use(StoragePlugin(Promise.resolve('en'))) | ||
@@ -77,3 +77,3 @@ .init({ | ||
it('will fallback correctly', async () => { | ||
tolgee = Tolgee() | ||
tolgee = TolgeeCore() | ||
.use(StoragePlugin(Promise.resolve(undefined))) | ||
@@ -94,3 +94,3 @@ .init({ | ||
it('will return key before language is loaded', async () => { | ||
tolgee = Tolgee() | ||
tolgee = TolgeeCore() | ||
.use(StoragePlugin(Promise.resolve('en'))) | ||
@@ -112,3 +112,3 @@ .init({ | ||
it('will store language value on language change', async () => { | ||
tolgee = Tolgee() | ||
tolgee = TolgeeCore() | ||
.use(StoragePlugin(Promise.resolve('en'))) | ||
@@ -130,3 +130,3 @@ .init({ | ||
it('will ignore invalid values', () => { | ||
tolgee = Tolgee() | ||
tolgee = TolgeeCore() | ||
.use(StoragePlugin('eq')) | ||
@@ -144,9 +144,8 @@ .init({ | ||
it('will return invalid value if no available languages', () => { | ||
tolgee = Tolgee().use(StoragePlugin('eq')).init({ | ||
it('will throw an error when no available languages are specified', () => { | ||
tolgee = TolgeeCore().use(StoragePlugin('eq')).init({ | ||
defaultLanguage: 'es', | ||
}); | ||
tolgee.run(); | ||
expect(tolgee.getLanguage()).toEqual('eq'); | ||
expect(() => tolgee.run()).toThrowError('availableLanguages'); | ||
}); | ||
}); |
@@ -1,2 +0,2 @@ | ||
import { Tolgee, TreeTranslationsData } from '../index'; | ||
import { TolgeeCore, TreeTranslationsData } from '../index'; | ||
import { resolvablePromise } from './testTools'; | ||
@@ -10,3 +10,3 @@ | ||
const onFetchingHandler = jest.fn(() => {}); | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -13,0 +13,0 @@ staticData: { |
@@ -1,6 +0,6 @@ | ||
import { Tolgee } from '../Tolgee'; | ||
import { TolgeeCore } from '../TolgeeCore'; | ||
describe('namespaces fallback', () => { | ||
test('works with multiple and default', () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -23,3 +23,3 @@ staticData: { | ||
test('works when no fallback specified', () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -41,3 +41,3 @@ staticData: { | ||
test('works when data present but no fallback', () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -60,3 +60,3 @@ staticData: { | ||
test('works with default', () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -63,0 +63,0 @@ staticData: { |
@@ -1,2 +0,2 @@ | ||
import { Tolgee } from '../index'; | ||
import { TolgeeCore } from '../index'; | ||
@@ -11,3 +11,3 @@ const tolgeeWithNamespaces = () => { | ||
return Tolgee().init({ | ||
return TolgeeCore().init({ | ||
language: 'en', | ||
@@ -27,3 +27,3 @@ ns: ['common'], | ||
it('returns correct translation from namespace', () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -41,3 +41,3 @@ staticData: { | ||
it('uses defaultNs', async () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -44,0 +44,0 @@ defaultNs: 'common', |
@@ -1,6 +0,6 @@ | ||
import { Tolgee } from '../Tolgee'; | ||
import { TolgeeCore } from '../TolgeeCore'; | ||
describe('initial options', () => { | ||
it('combines options correctly', () => { | ||
const tolgee = Tolgee() | ||
const tolgee = TolgeeCore() | ||
.updateDefaults({ | ||
@@ -48,3 +48,3 @@ observerType: 'text', | ||
it('sanitizes url', () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'cs', | ||
@@ -51,0 +51,0 @@ apiUrl: 'http://localhost:8080/', |
@@ -1,2 +0,2 @@ | ||
import { Tolgee } from '../Tolgee'; | ||
import { TolgeeCore } from '../TolgeeCore'; | ||
import { | ||
@@ -72,3 +72,3 @@ FinalFormatterMiddleware, | ||
it('wraps and formats translation', () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -87,3 +87,3 @@ staticData: { en: { hello: 'world' } }, | ||
it("won't format when observer doesn't return formattable text", () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -102,3 +102,3 @@ staticData: { en: { hello: 'world' } }, | ||
it("won't wrap before run", () => { | ||
const tolgee = Tolgee().init({ | ||
const tolgee = TolgeeCore().init({ | ||
language: 'en', | ||
@@ -105,0 +105,0 @@ staticData: { en: { hello: 'world' } }, |
@@ -251,4 +251,5 @@ import { Events } from './Events/Events'; | ||
const checkCorrectConfiguration = () => { | ||
const languageDetector = pluginService.getLanguageDetector(); | ||
if (languageDetector) { | ||
const languageComputable = | ||
pluginService.getLanguageDetector() || pluginService.getLanguageStorage(); | ||
if (languageComputable) { | ||
const availableLanguages = state.getAvailableLanguages(); | ||
@@ -260,3 +261,3 @@ if (!availableLanguages) { | ||
if (!state.getLanguage() && !state.getInitialOptions().defaultLanguage) { | ||
if (languageDetector) { | ||
if (languageComputable) { | ||
throw new Error(missingOptionError('defaultLanguage')); | ||
@@ -277,3 +278,3 @@ } else { | ||
state.setRunning(true); | ||
pluginService.run(isDev()); | ||
pluginService.run(); | ||
result = loadInitial(); | ||
@@ -280,0 +281,0 @@ } |
import { Subscription, Listener } from '../../types'; | ||
export const EventEmitter = <T>(): EventEmitterInstance<T> => { | ||
export const EventEmitter = <T>( | ||
isActive: () => boolean | ||
): EventEmitterInstance<T> => { | ||
let handlers: Listener<T>[] = []; | ||
@@ -21,3 +23,5 @@ | ||
const emit = (data: T) => { | ||
handlers.forEach((handler) => handler({ value: data })); | ||
if (isActive()) { | ||
handlers.forEach((handler) => handler({ value: data })); | ||
} | ||
}; | ||
@@ -24,0 +28,0 @@ |
@@ -6,2 +6,3 @@ import { EventEmitterSelective } from './EventEmitterSelective'; | ||
const emitter = EventEmitterSelective( | ||
() => true, | ||
() => [], | ||
@@ -26,2 +27,3 @@ () => 'default' | ||
const emitter = EventEmitterSelective( | ||
() => true, | ||
() => [], | ||
@@ -42,2 +44,3 @@ () => '' | ||
const emitter = EventEmitterSelective( | ||
() => true, | ||
() => ['test', 'opqrst'], | ||
@@ -75,2 +78,3 @@ () => '' | ||
const emitter = EventEmitterSelective( | ||
() => true, | ||
() => ['fallback1', 'fallback2'], | ||
@@ -91,2 +95,21 @@ () => '' | ||
}); | ||
it('switches off emitting', () => { | ||
const emitter = EventEmitterSelective( | ||
() => false, | ||
() => ['fallback1', 'fallback2'], | ||
() => '' | ||
); | ||
const handler = jest.fn(); | ||
emitter.listenSome(handler); | ||
emitter.emit(['fallback1']); | ||
expect(handler).toBeCalledTimes(0); | ||
emitter.emit(['fallback2']); | ||
expect(handler).toBeCalledTimes(0); | ||
emitter.emit(['']); | ||
expect(handler).toBeCalledTimes(0); | ||
}); | ||
}); |
@@ -19,2 +19,3 @@ import { getFallbackArray } from '../../helpers'; | ||
export const EventEmitterSelective = ( | ||
isActive: () => boolean, | ||
getFallbackNs: () => string[], | ||
@@ -115,7 +116,9 @@ getDefaultNs: () => string | ||
const emit = (ns?: string[], delayed?: boolean) => { | ||
queue.push(ns); | ||
if (!delayed) { | ||
solveQueue(); | ||
} else { | ||
setTimeout(solveQueue, 0); | ||
if (isActive()) { | ||
queue.push(ns); | ||
if (!delayed) { | ||
solveQueue(); | ||
} else { | ||
setTimeout(solveQueue, 0); | ||
} | ||
} | ||
@@ -122,0 +125,0 @@ }; |
@@ -9,11 +9,17 @@ import { EventEmitter } from './EventEmitter'; | ||
) => { | ||
const onPendingLanguageChange = EventEmitter<string>(); | ||
const onLanguageChange = EventEmitter<string>(); | ||
const onLoadingChange = EventEmitter<boolean>(); | ||
const onFetchingChange = EventEmitter<boolean>(); | ||
const onInitialLoaded = EventEmitter<void>(); | ||
const onRunningChange = EventEmitter<boolean>(); | ||
const onCacheChange = EventEmitter<CacheDescriptorWithKey>(); | ||
const onUpdate = EventEmitterSelective(getFallbackNs, getDefaultNs); | ||
let emitterActive = true; | ||
function isActive() { | ||
return emitterActive; | ||
} | ||
const onPendingLanguageChange = EventEmitter<string>(isActive); | ||
const onLanguageChange = EventEmitter<string>(isActive); | ||
const onLoadingChange = EventEmitter<boolean>(isActive); | ||
const onFetchingChange = EventEmitter<boolean>(isActive); | ||
const onInitialLoaded = EventEmitter<void>(isActive); | ||
const onRunningChange = EventEmitter<boolean>(isActive); | ||
const onCacheChange = EventEmitter<CacheDescriptorWithKey>(isActive); | ||
const onUpdate = EventEmitterSelective(isActive, getFallbackNs, getDefaultNs); | ||
onInitialLoaded.listen(() => onUpdate.emit()); | ||
@@ -46,2 +52,6 @@ onLanguageChange.listen(() => onUpdate.emit()); | ||
function setEmmiterActive(active: boolean) { | ||
emitterActive = active; | ||
} | ||
return Object.freeze({ | ||
@@ -56,2 +66,3 @@ onPendingLanguageChange, | ||
onUpdate, | ||
setEmmiterActive, | ||
on, | ||
@@ -58,0 +69,0 @@ }); |
@@ -1,2 +0,2 @@ | ||
import { isPromise, valueOrPromise } from '../../helpers'; | ||
import { getErrorMessage, isPromise, valueOrPromise } from '../../helpers'; | ||
import { | ||
@@ -11,7 +11,4 @@ BackendDevMiddleware, | ||
UiMiddleware, | ||
UiLibMiddleware, | ||
UiType, | ||
FinalFormatterMiddleware, | ||
HighlightInterface, | ||
UiConstructor, | ||
UiKeyOption, | ||
@@ -27,3 +24,5 @@ LanguageDetectorMiddleware, | ||
TolgeeOptionsInternal, | ||
FormatErrorHandler, | ||
} from '../../types'; | ||
import { DEFAULT_FORMAT_ERROR } from '../State/initState'; | ||
@@ -38,6 +37,4 @@ export const Plugins = ( | ||
) => { | ||
let prepared = false; | ||
let onPrepareQueue: (() => void)[] = []; | ||
const plugins = { | ||
ui: undefined as UiConstructor | undefined, | ||
ui: undefined as UiMiddleware | undefined, | ||
observer: undefined as ObserverMiddleware | undefined, | ||
@@ -52,3 +49,3 @@ }; | ||
backends: [] as BackendMiddleware[], | ||
ui: undefined as UiMiddleware | undefined, | ||
ui: undefined as ReturnType<UiMiddleware> | undefined, | ||
languageDetector: undefined as LanguageDetectorMiddleware | undefined, | ||
@@ -112,4 +109,4 @@ languageStorage: undefined as LanguageStorageMiddleware | undefined, | ||
const setUi = (ui: UiType | undefined) => { | ||
plugins.ui = (ui as UiLibMiddleware)?.UI || ui; | ||
const setUi = (ui: UiMiddleware | undefined) => { | ||
plugins.ui = ui as UiMiddleware; | ||
}; | ||
@@ -127,2 +124,6 @@ | ||
const getLanguageStorage = () => { | ||
return instances.languageStorage; | ||
}; | ||
const setStoredLanguage = (language: string) => { | ||
@@ -179,6 +180,6 @@ instances.languageStorage?.setLanguage(language); | ||
const run = (isDev: boolean) => { | ||
if (!instances.ui && plugins.ui) { | ||
const run = () => { | ||
if (!instances.ui) { | ||
const { apiKey, apiUrl, projectId } = getInitialOptions(); | ||
instances.ui = new plugins.ui({ | ||
instances.ui = plugins.ui?.({ | ||
apiKey: apiKey!, | ||
@@ -198,3 +199,3 @@ apiUrl: apiUrl!, | ||
} | ||
instances.observer?.run({ mouseHighlight: isDev }); | ||
instances.observer?.run({ mouseHighlight: true }); | ||
}; | ||
@@ -245,6 +246,2 @@ | ||
const onPrepare = (callback: () => void) => { | ||
onPrepareQueue.push(callback); | ||
}; | ||
function addPlugin(tolgeeInstance: TolgeeInstance, plugin: TolgeePlugin) { | ||
@@ -262,31 +259,14 @@ const pluginTools = Object.freeze({ | ||
setLanguageStorage, | ||
onPrepare, | ||
}); | ||
plugin(tolgeeInstance, pluginTools); | ||
if (prepared) { | ||
prepare(); | ||
} | ||
} | ||
function formatTranslation({ | ||
key, | ||
translation, | ||
defaultValue, | ||
noWrap, | ||
params, | ||
orEmpty, | ||
ns, | ||
formatEnabled, | ||
...props | ||
}: TranslatePropsInternal & { formatEnabled?: boolean }) { | ||
const { key, translation, defaultValue, noWrap, params, orEmpty, ns } = | ||
props; | ||
const formattableTranslation = translation || defaultValue; | ||
let result = formattableTranslation || (orEmpty ? '' : key); | ||
if (instances.observer && !noWrap) { | ||
result = instances.observer.wrap({ | ||
key, | ||
translation: result, | ||
defaultValue, | ||
params, | ||
ns, | ||
}); | ||
} | ||
@@ -296,6 +276,35 @@ const language = getLanguage(); | ||
formatEnabled || !instances.observer?.outputNotFormattable; | ||
if (formattableTranslation && language && isFormatEnabled) { | ||
for (const formatter of instances.formatters) { | ||
result = formatter.format({ | ||
const wrap = (result: string) => { | ||
if (instances.observer && !noWrap) { | ||
return instances.observer.wrap({ | ||
key, | ||
translation: result, | ||
defaultValue, | ||
params, | ||
ns, | ||
}); | ||
} | ||
return result; | ||
}; | ||
result = wrap(result); | ||
try { | ||
if (formattableTranslation && language && isFormatEnabled) { | ||
for (const formatter of instances.formatters) { | ||
result = formatter.format({ | ||
translation: result, | ||
language, | ||
params, | ||
}); | ||
} | ||
} | ||
if ( | ||
instances.finalFormatter && | ||
formattableTranslation && | ||
language && | ||
isFormatEnabled | ||
) { | ||
result = instances.finalFormatter.format({ | ||
translation: result, | ||
language, | ||
@@ -305,16 +314,19 @@ params, | ||
} | ||
} catch (e: any) { | ||
// eslint-disable-next-line no-console | ||
console.error(e); | ||
const errorMessage = getErrorMessage(e) || DEFAULT_FORMAT_ERROR; | ||
const onFormatError = getInitialOptions().onFormatError; | ||
const formatErrorType = typeof onFormatError; | ||
if (formatErrorType === 'string') { | ||
result = onFormatError as string; | ||
} else if (formatErrorType === 'function') { | ||
result = (onFormatError as FormatErrorHandler)(errorMessage, props); | ||
} else { | ||
result = DEFAULT_FORMAT_ERROR; | ||
} | ||
// wrap error message, so it's detectable | ||
result = wrap(result); | ||
} | ||
if ( | ||
instances.finalFormatter && | ||
formattableTranslation && | ||
language && | ||
isFormatEnabled | ||
) { | ||
result = instances.finalFormatter.format({ | ||
translation: result, | ||
language, | ||
params, | ||
}); | ||
} | ||
return result; | ||
@@ -334,13 +346,3 @@ } | ||
function prepare() { | ||
prepared = true; | ||
while (onPrepareQueue.length) { | ||
const queue = onPrepareQueue; | ||
onPrepareQueue = []; | ||
queue.forEach((callback) => callback()); | ||
} | ||
} | ||
return Object.freeze({ | ||
prepare, | ||
addPlugin, | ||
@@ -352,2 +354,3 @@ formatTranslation, | ||
getLanguageDetector, | ||
getLanguageStorage, | ||
getInitialLanguage, | ||
@@ -354,0 +357,0 @@ setStoredLanguage, |
@@ -5,2 +5,3 @@ import { | ||
TreeTranslationsData, | ||
OnFormatError, | ||
} from '../../types'; | ||
@@ -14,2 +15,4 @@ import { sanitizeUrl } from '../../helpers'; | ||
export const DEFAULT_FORMAT_ERROR = 'invalid'; | ||
export type TolgeeStaticData = { | ||
@@ -84,5 +87,16 @@ [key: string]: TreeTranslationsData | (() => Promise<TreeTranslationsData>); | ||
/** | ||
* Switches between invisible and text observer. (Default: invisible) | ||
*/ | ||
observerType: 'invisible' | 'text'; | ||
/** | ||
* Observer options object. | ||
*/ | ||
observerOptions: ObserverOptionsInternal; | ||
observerType: 'invisible' | 'text'; | ||
/** | ||
* Define what to display in case of formatting error. (Default: 'invalid') | ||
*/ | ||
onFormatError: OnFormatError; | ||
}; | ||
@@ -109,2 +123,3 @@ | ||
observerType: 'invisible', | ||
onFormatError: DEFAULT_FORMAT_ERROR, | ||
}; | ||
@@ -111,0 +126,0 @@ |
@@ -63,1 +63,9 @@ import { | ||
} | ||
export function getErrorMessage(error: any): string | undefined { | ||
if (typeof error === 'string') { | ||
return error; | ||
} else if (typeof error?.message === 'string') { | ||
return error.message; | ||
} | ||
} |
export { getFallback, getFallbackArray } from './helpers'; | ||
export { Tolgee } from './Tolgee'; | ||
export { TolgeeCore } from './TolgeeCore'; | ||
export * from './types'; | ||
export { getTranslateProps } from './TranslateParams'; | ||
export { FormatSimple } from './FormatSimple/FormatSimple'; |
@@ -23,4 +23,4 @@ import type { NsFallback } from './general'; | ||
export type TolgeeEvent = | ||
| 'language' | ||
| 'pendingLanguage' | ||
| 'language' | ||
| 'loading' | ||
@@ -34,4 +34,4 @@ | 'fetching' | ||
export interface EventType { | ||
language: string; | ||
pendingLanguage: string; | ||
language: string; | ||
loading: boolean; | ||
@@ -38,0 +38,0 @@ fetching: boolean; |
@@ -19,2 +19,2 @@ export * from './general'; | ||
export type { TolgeeChainer, TolgeeInstance } from '../Tolgee'; | ||
export type { TolgeeChainer, TolgeeInstance } from '../TolgeeCore'; |
@@ -9,3 +9,3 @@ import { ChangeTranslationInterface, TreeTranslationsData } from './cache'; | ||
import type { ObserverOptionsInternal } from '../Controller/State/observerOptions'; | ||
import { TolgeeInstance } from '../Tolgee'; | ||
import { TolgeeInstance } from '../TolgeeCore'; | ||
@@ -149,14 +149,8 @@ export type BackendDevProps = { | ||
export interface UiMiddleware { | ||
export type UiMiddleware = (props: UiProps) => UiInterface; | ||
export interface UiInterface { | ||
handleElementClick(keysAndDefaults: UiKeyOption[], event: any): Promise<void>; | ||
} | ||
export type UiConstructor = new (props: UiProps) => UiMiddleware; | ||
export type UiLibMiddleware = { | ||
UI: UiConstructor; | ||
}; | ||
export type UiType = UiConstructor | UiLibMiddleware; | ||
export type PluginTools = Readonly<{ | ||
@@ -167,3 +161,3 @@ setFinalFormatter: (formatter: FinalFormatterMiddleware | undefined) => void; | ||
hasObserver: () => boolean; | ||
setUi: (ui: UiLibMiddleware | undefined) => void; | ||
setUi: (ui: UiMiddleware | undefined) => void; | ||
hasUi: () => boolean; | ||
@@ -178,3 +172,2 @@ addBackend: (backend: BackendMiddleware | undefined) => void; | ||
) => void; | ||
onPrepare: (callback: () => void) => void; | ||
}>; | ||
@@ -186,1 +179,8 @@ | ||
) => TolgeeInstance; | ||
export type FormatErrorHandler = ( | ||
error: string, | ||
info: TranslatePropsInternal | ||
) => string; | ||
export type OnFormatError = string | FormatErrorHandler; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No README
QualityPackage does not have a README. This may indicate a failed publish or a low quality package.
Found 1 instance in 1 package
687339
3.66%84
3.7%9497
3.07%0
-100%175
Infinity%0
-100%