browser-language
Advanced tools
Comparing version 1.3.0 to 1.4.0
@@ -0,1 +1,9 @@ | ||
v1.4.0 / 2015-09-13 | ||
================== | ||
* Rename cookie option `age` to `maxAge` | ||
* Add `encryptionSecret` (options) | ||
* Add `encryptionOptions` (options) | ||
* Install `cookie-encryption`@1.4.0 | ||
v1.3.0 / 2015-08-08 | ||
@@ -2,0 +10,0 @@ ================== |
99
index.js
@@ -6,3 +6,3 @@ 'use strict'; | ||
* @subpackage main | ||
* @version 1.3.0 | ||
* @version 1.4.0 | ||
* @author hex7c0 <hex7c0@gmail.com> | ||
@@ -16,2 +16,3 @@ * @copyright hex7c0 2014 | ||
*/ | ||
var headerRegex = /([a-z]{2})/ig; | ||
var all = { | ||
@@ -133,3 +134,3 @@ 'ab': 'Abkhazian', | ||
path: my.path, | ||
maxAge: my.age, | ||
maxAge: my.maxAge, | ||
httpOnly: my.httpOnly, | ||
@@ -142,2 +143,31 @@ secure: my.secure, | ||
/** | ||
* detect browser language | ||
* | ||
* @param {String} ll - default language as fallback | ||
* @param {String} header - accept-language header | ||
* @param {Object} lang - languages dictionary | ||
* @returns {String} | ||
*/ | ||
function detect(ll, header, lang) { | ||
if (header) { // check | ||
var language = header.match(headerRegex); // grep languages header | ||
language = language.filter(function(elem, pos, self) { // remove duplicate | ||
return self.indexOf(elem.toLowerCase()) === pos; | ||
}); | ||
var tmp; | ||
for (var i = 0, ii = language.length; i < ii; ++i) { // detect righ language | ||
if ((tmp = lang[language[i]])) { | ||
return tmp; | ||
} | ||
} | ||
} | ||
return ll; // return default | ||
} | ||
/** | ||
* setting options | ||
@@ -159,3 +189,3 @@ * | ||
path: String(options.path || '/'), | ||
age: Number(options.age) || 1000 * 3600 * 24 * 365, | ||
maxAge: Number(options.maxAge) || 1000 * 3600 * 24 * 365, | ||
httpOnly: Boolean(options.httpOnly), | ||
@@ -176,3 +206,2 @@ secure: Boolean(options.secure), | ||
process.env.lang = lang._default; | ||
// return | ||
@@ -184,2 +213,46 @@ var cookie = 'cookies'; | ||
if (typeof options.encryptionSecret === 'string') { | ||
var vault = require('cookie-encryption'); | ||
var encryptionOptions = opt.encryptionOptions || Object.create(null); | ||
vault = vault(options.encryptionSecret, { | ||
cookie: my.cookie, | ||
cipher: encryptionOptions.cipher, | ||
encoding: encryptionOptions.encoding, | ||
extra: encryptionOptions.extra, | ||
domain: encryptionOptions.domain || my.domain, | ||
path: encryptionOptions.path || my.path, | ||
maxAge: encryptionOptions.maxAge || my.maxAge, | ||
httpOnly: encryptionOptions.httpOnly || my.httpOnly, | ||
secure: encryptionOptions.secure || my.secure, | ||
signed: encryptionOptions.signed || my.signed | ||
}); | ||
/** | ||
* detect language and (if accepted) build it. Store information on cookie | ||
* | ||
* @function browser | ||
* @param {Object} req - client request | ||
* @param {Object} res - response to client | ||
* @param {next} next - continue routes | ||
*/ | ||
return function browser(req, res, next) { | ||
var biscotto; | ||
try { | ||
biscotto = vault.read(req); | ||
} catch (e) { // fails to decrpy | ||
biscotto = undefined; | ||
} | ||
if (biscotto && lang[biscotto]) { // lookup | ||
req[cookie][my.cookie] = biscotto; | ||
return next(); | ||
} | ||
var ll = detect(lang._default, req.headers['accept-language'], lang); | ||
req[cookie][my.cookie] = vault.write(req, ll); // populate req[cookie] by module | ||
return next(); | ||
}; | ||
} | ||
/** | ||
@@ -201,20 +274,6 @@ * detect language and (if accepted) build it. Store information on cookie | ||
} | ||
var ll = lang._default; | ||
var search = req.headers['accept-language']; | ||
if (search) { // check | ||
var language = search.match(/([a-z]{2,2})/ig); | ||
// remove duplicate | ||
language = language.filter(function(elem, pos, self) { | ||
return self.indexOf(elem.toLowerCase()) === pos; | ||
}); | ||
for (var i = 0, ii = language.length; i < ii; ++i) { | ||
search = lang[language[i]]; | ||
if (search) { | ||
ll = search; | ||
break; | ||
} | ||
} | ||
} | ||
var ll = detect(lang._default, req.headers['accept-language'], lang); | ||
biscotto[my.cookie] = set(my, res, ll); | ||
return next(); | ||
@@ -221,0 +280,0 @@ }; |
@@ -7,3 +7,3 @@ "use strict"; | ||
path: my.path, | ||
maxAge: my.age, | ||
maxAge: my.maxAge, | ||
httpOnly: my.httpOnly, | ||
@@ -15,2 +15,13 @@ secure: my.secure, | ||
function detect(ll, header, lang) { | ||
if (header) { | ||
var language = header.match(headerRegex); | ||
language = language.filter(function(elem, pos, self) { | ||
return self.indexOf(elem.toLowerCase()) === pos; | ||
}); | ||
for (var tmp, i = 0, ii = language.length; ii > i; ++i) if (tmp = lang[language[i]]) return tmp; | ||
} | ||
return ll; | ||
} | ||
function language(opt) { | ||
@@ -21,3 +32,3 @@ var options = opt || Object.create(null), include = __dirname + "/min/lib/dictionary.js", lang = options.dictionary || require(include).LANG, my = { | ||
path: String(options.path || "/"), | ||
age: Number(options.age) || 31536e6, | ||
maxAge: Number(options.maxAge) || 31536e6, | ||
httpOnly: Boolean(options.httpOnly), | ||
@@ -30,16 +41,31 @@ secure: Boolean(options.secure), | ||
var cookie = "cookies"; | ||
return my.signed && (cookie = "signedCookies"), function(req, res, next) { | ||
if (my.signed && (cookie = "signedCookies"), "string" == typeof options.encryptionSecret) { | ||
var vault = require("cookie-encryption"), encryptionOptions = opt.encryptionOptions || Object.create(null); | ||
return vault = vault(options.encryptionSecret, { | ||
cookie: my.cookie, | ||
cipher: encryptionOptions.cipher, | ||
encoding: encryptionOptions.encoding, | ||
extra: encryptionOptions.extra, | ||
domain: encryptionOptions.domain || my.domain, | ||
path: encryptionOptions.path || my.path, | ||
maxAge: encryptionOptions.maxAge || my.maxAge, | ||
httpOnly: encryptionOptions.httpOnly || my.httpOnly, | ||
secure: encryptionOptions.secure || my.secure, | ||
signed: encryptionOptions.signed || my.signed | ||
}), function(req, res, next) { | ||
var biscotto; | ||
try { | ||
biscotto = vault.read(req); | ||
} catch (e) { | ||
biscotto = void 0; | ||
} | ||
if (biscotto && lang[biscotto]) return req[cookie][my.cookie] = biscotto, next(); | ||
var ll = detect(lang._default, req.headers["accept-language"], lang); | ||
return req[cookie][my.cookie] = vault.write(req, ll), next(); | ||
}; | ||
} | ||
return function(req, res, next) { | ||
var biscotto = req[cookie]; | ||
if (void 0 === biscotto) biscotto = Object.create(null); else if (lang[biscotto[my.cookie]]) return next(); | ||
var ll = lang._default, search = req.headers["accept-language"]; | ||
if (search) { | ||
var language = search.match(/([a-z]{2,2})/gi); | ||
language = language.filter(function(elem, pos, self) { | ||
return self.indexOf(elem.toLowerCase()) === pos; | ||
}); | ||
for (var i = 0, ii = language.length; ii > i; ++i) if (search = lang[language[i]]) { | ||
ll = search; | ||
break; | ||
} | ||
} | ||
var ll = detect(lang._default, req.headers["accept-language"], lang); | ||
return biscotto[my.cookie] = set(my, res, ll), next(); | ||
@@ -49,3 +75,3 @@ }; | ||
var all = { | ||
var headerRegex = /([a-z]{2})/gi, all = { | ||
ab: "Abkhazian", | ||
@@ -52,0 +78,0 @@ af: "Afrikaans", |
{ | ||
"version": "1.3.0", | ||
"version": "1.4.0", | ||
"name": "browser-language", | ||
@@ -31,2 +31,3 @@ "description": "grab browser language and store on cookie", | ||
"dependencies": { | ||
"cookie-encryption": "1.4.0" | ||
}, | ||
@@ -40,6 +41,6 @@ "devDependencies": { | ||
"grunt-contrib-jshint": "~0.11", | ||
"grunt-endline": "~0.2", | ||
"grunt-endline": "~0.3", | ||
"istanbul": "~0.3", | ||
"mocha": "~2.2", | ||
"supertest": "~1.0" | ||
"mocha": "~2.3", | ||
"supertest": "~1.1" | ||
}, | ||
@@ -46,0 +47,0 @@ "engines": { |
@@ -51,2 +51,4 @@ # [browser-language](http://supergiovane.tk/#/browser-language) | ||
Check [Cookie options](http://expressjs.com/api.html#res.cookie) | ||
### language(options) | ||
@@ -64,6 +66,7 @@ | ||
- `path` - **String** Path of cookie *(default "/")* | ||
- `age` - **Number** Age of cookie in millisecond *(default "1 year")* | ||
- `maxAge` - **Number** Age of cookie in millisecond *(default "1 year")* | ||
- `httpOnly` - **Boolean** Flag for http only cookie *(default "false")* | ||
- `secure` - **Boolean** Flag for using cookie over TLS/SSL *(default "false")* | ||
- `signed` - **Boolean** Will use the secret passed to cookieParser(secret) to sign the value *(default "false")* | ||
- `encryption` - **Object** Configuration for [cookie-encryption](https://github.com/hex7c0/cookie-encryption) *(defaut "deactivated")* | ||
@@ -70,0 +73,0 @@ `dictionary` object with correct value to be added, otherwise using a default dictionary inside *./lib/dictionary.js* |
54173
498
78
1
+ Addedcookie-encryption@1.4.0
+ Addedarc4@3.2.0(transitive)
+ Addedautokey@2.2.0(transitive)
+ Addedcookie-encryption@1.4.0(transitive)
+ Addedlodash@3.10.1(transitive)