Skip to content

Commit

Permalink
typescript fix for i18next v22
Browse files Browse the repository at this point in the history
  • Loading branch information
adrai committed Oct 26, 2022
1 parent 8d199fc commit 0ee5832
Show file tree
Hide file tree
Showing 5 changed files with 1,182 additions and 364 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
### 7.0.0

- typescript fix for i18next v22

### 6.1.8

- fix export order for typescript [267](https://github.com/i18next/i18next-browser-languageDetector/issues/267)
Expand Down
83 changes: 10 additions & 73 deletions i18nextBrowserLanguageDetector.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
Object.defineProperty(target, descriptor.key, descriptor);
}
}

function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
Expand All @@ -45,103 +44,80 @@

// eslint-disable-next-line no-control-regex
var fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;

var serializeCookie = function serializeCookie(name, val, options) {
var opt = options || {};
opt.path = opt.path || '/';
var value = encodeURIComponent(val);
var str = "".concat(name, "=").concat(value);

if (opt.maxAge > 0) {
var maxAge = opt.maxAge - 0;
if (Number.isNaN(maxAge)) throw new Error('maxAge should be a Number');
str += "; Max-Age=".concat(Math.floor(maxAge));
}

if (opt.domain) {
if (!fieldContentRegExp.test(opt.domain)) {
throw new TypeError('option domain is invalid');
}

str += "; Domain=".concat(opt.domain);
}

if (opt.path) {
if (!fieldContentRegExp.test(opt.path)) {
throw new TypeError('option path is invalid');
}

str += "; Path=".concat(opt.path);
}

if (opt.expires) {
if (typeof opt.expires.toUTCString !== 'function') {
throw new TypeError('option expires is invalid');
}

str += "; Expires=".concat(opt.expires.toUTCString());
}

if (opt.httpOnly) str += '; HttpOnly';
if (opt.secure) str += '; Secure';

if (opt.sameSite) {
var sameSite = typeof opt.sameSite === 'string' ? opt.sameSite.toLowerCase() : opt.sameSite;

switch (sameSite) {
case true:
str += '; SameSite=Strict';
break;

case 'lax':
str += '; SameSite=Lax';
break;

case 'strict':
str += '; SameSite=Strict';
break;

case 'none':
str += '; SameSite=None';
break;

default:
throw new TypeError('option sameSite is invalid');
}
}

return str;
};

var cookie = {
create: function create(name, value, minutes, domain) {
var cookieOptions = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {
path: '/',
sameSite: 'strict'
};

if (minutes) {
cookieOptions.expires = new Date();
cookieOptions.expires.setTime(cookieOptions.expires.getTime() + minutes * 60 * 1000);
}

if (domain) cookieOptions.domain = domain;
document.cookie = serializeCookie(name, encodeURIComponent(value), cookieOptions);
},
read: function read(name) {
var nameEQ = "".concat(name, "=");
var ca = document.cookie.split(';');

for (var i = 0; i < ca.length; i++) {
var c = ca[i];

while (c.charAt(0) === ' ') {
c = c.substring(1, c.length);
}

if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
}

return null;
},
remove: function remove(name) {
Expand All @@ -152,12 +128,10 @@
name: 'cookie',
lookup: function lookup(options) {
var found;

if (options.lookupCookie && typeof document !== 'undefined') {
var c = cookie.read(options.lookupCookie);
if (c) found = c;
}

return found;
},
cacheUserLanguage: function cacheUserLanguage(lng, options) {
Expand All @@ -171,39 +145,30 @@
name: 'querystring',
lookup: function lookup(options) {
var found;

if (typeof window !== 'undefined') {
var search = window.location.search;

if (!window.location.search && window.location.hash && window.location.hash.indexOf('?') > -1) {
search = window.location.hash.substring(window.location.hash.indexOf('?'));
}

var query = search.substring(1);
var params = query.split('&');

for (var i = 0; i < params.length; i++) {
var pos = params[i].indexOf('=');

if (pos > 0) {
var key = params[i].substring(0, pos);

if (key === options.lookupQuerystring) {
found = params[i].substring(pos + 1);
}
}
}
}

return found;
}
};

var hasLocalStorageSupport = null;

var localStorageAvailable = function localStorageAvailable() {
if (hasLocalStorageSupport !== null) return hasLocalStorageSupport;

try {
hasLocalStorageSupport = window !== 'undefined' && window.localStorage !== null;
var testKey = 'i18next.translate.boo';
Expand All @@ -212,20 +177,16 @@
} catch (e) {
hasLocalStorageSupport = false;
}

return hasLocalStorageSupport;
};

var localStorage = {
name: 'localStorage',
lookup: function lookup(options) {
var found;

if (options.lookupLocalStorage && localStorageAvailable()) {
var lng = window.localStorage.getItem(options.lookupLocalStorage);
if (lng) found = lng;
}

return found;
},
cacheUserLanguage: function cacheUserLanguage(lng, options) {
Expand All @@ -236,10 +197,8 @@
};

var hasSessionStorageSupport = null;

var sessionStorageAvailable = function sessionStorageAvailable() {
if (hasSessionStorageSupport !== null) return hasSessionStorageSupport;

try {
hasSessionStorageSupport = window !== 'undefined' && window.sessionStorage !== null;
var testKey = 'i18next.translate.boo';
Expand All @@ -248,20 +207,16 @@
} catch (e) {
hasSessionStorageSupport = false;
}

return hasSessionStorageSupport;
};

var sessionStorage = {
name: 'sessionStorage',
lookup: function lookup(options) {
var found;

if (options.lookupSessionStorage && sessionStorageAvailable()) {
var lng = window.sessionStorage.getItem(options.lookupSessionStorage);
if (lng) found = lng;
}

return found;
},
cacheUserLanguage: function cacheUserLanguage(lng, options) {
Expand All @@ -275,24 +230,20 @@
name: 'navigator',
lookup: function lookup(options) {
var found = [];

if (typeof navigator !== 'undefined') {
if (navigator.languages) {
// chrome only; not an array, so can't use .push.apply instead of iterating
for (var i = 0; i < navigator.languages.length; i++) {
found.push(navigator.languages[i]);
}
}

if (navigator.userLanguage) {
found.push(navigator.userLanguage);
}

if (navigator.language) {
found.push(navigator.language);
}
}

return found.length > 0 ? found : undefined;
}
};
Expand All @@ -302,11 +253,9 @@
lookup: function lookup(options) {
var found;
var htmlTag = options.htmlTag || (typeof document !== 'undefined' ? document.documentElement : null);

if (htmlTag && typeof htmlTag.getAttribute === 'function') {
found = htmlTag.getAttribute('lang');
}

return found;
}
};
Expand All @@ -315,23 +264,19 @@
name: 'path',
lookup: function lookup(options) {
var found;

if (typeof window !== 'undefined') {
var language = window.location.pathname.match(/\/([a-zA-Z-]*)/g);

if (language instanceof Array) {
if (typeof options.lookupFromPathIndex === 'number') {
if (typeof language[options.lookupFromPathIndex] !== 'string') {
return undefined;
}

found = language[options.lookupFromPathIndex].replace('/', '');
} else {
found = language[0].replace('/', '');
}
}
}

return found;
}
};
Expand All @@ -340,14 +285,15 @@
name: 'subdomain',
lookup: function lookup(options) {
// If given get the subdomain index else 1
var lookupFromSubdomainIndex = typeof options.lookupFromSubdomainIndex === 'number' ? options.lookupFromSubdomainIndex + 1 : 1; // get all matches if window.location. is existing
var lookupFromSubdomainIndex = typeof options.lookupFromSubdomainIndex === 'number' ? options.lookupFromSubdomainIndex + 1 : 1;
// get all matches if window.location. is existing
// first item of match is the match itself and the second is the first group macht which sould be the first subdomain match
// is the hostname no public domain get the or option of localhost
var language = typeof window !== 'undefined' && window.location && window.location.hostname && window.location.hostname.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);

var language = typeof window !== 'undefined' && window.location && window.location.hostname && window.location.hostname.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i); // if there is no match (null) return undefined

if (!language) return undefined; // return the given group match

// if there is no match (null) return undefined
if (!language) return undefined;
// return the given group match
return language[lookupFromSubdomainIndex];
}
};
Expand All @@ -361,31 +307,28 @@
lookupSessionStorage: 'i18nextLng',
// cache user language
caches: ['localStorage'],
excludeCacheFor: ['cimode'] // cookieMinutes: 10,
excludeCacheFor: ['cimode']
// cookieMinutes: 10,
// cookieDomain: 'myDomain'

};
}

var Browser = /*#__PURE__*/function () {
function Browser(services) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

_classCallCheck(this, Browser);

this.type = 'languageDetector';
this.detectors = {};
this.init(services, options);
}

_createClass(Browser, [{
key: "init",
value: function init(services) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var i18nOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
this.services = services;
this.options = defaults(options, this.options || {}, getDefaults()); // backwards compatibility
this.options = defaults(options, this.options || {}, getDefaults());

// backwards compatibility
if (this.options.lookupFromUrlIndex) this.options.lookupFromPathIndex = this.options.lookupFromUrlIndex;
this.i18nOptions = i18nOptions;
this.addDetector(cookie$1);
Expand All @@ -406,26 +349,22 @@
key: "detect",
value: function detect(detectionOrder) {
var _this = this;

if (!detectionOrder) detectionOrder = this.options.order;
var detected = [];
detectionOrder.forEach(function (detectorName) {
if (_this.detectors[detectorName]) {
var lookup = _this.detectors[detectorName].lookup(_this.options);

if (lookup && typeof lookup === 'string') lookup = [lookup];
if (lookup) detected = detected.concat(lookup);
}
});
if (this.services.languageUtils.getBestMatchFromCodes) return detected; // new i18next v19.5.0

return detected.length > 0 ? detected[0] : null; // a little backward compatibility
}
}, {
key: "cacheUserLanguage",
value: function cacheUserLanguage(lng, caches) {
var _this2 = this;

if (!caches) caches = this.options.caches;
if (!caches) return;
if (this.options.excludeCacheFor && this.options.excludeCacheFor.indexOf(lng) > -1) return;
Expand All @@ -434,10 +373,8 @@
});
}
}]);

return Browser;
}();

Browser.type = 'languageDetector';

return Browser;
Expand Down
2 changes: 1 addition & 1 deletion index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ export default class I18nextBrowserLanguageDetector implements i18next.LanguageD
}

declare module 'i18next' {
interface PluginOptions {
interface CustomPluginOptions {
detection?: DetectorOptions;
}
}
Loading

0 comments on commit 0ee5832

Please sign in to comment.