From 5c5b2a6cadbfacba2af0fe3f0314385f0d9cefa8 Mon Sep 17 00:00:00 2001 From: Unknown <24251307+ogiermaitre@users.noreply.github.com> Date: Mon, 19 Mar 2018 16:39:55 +0100 Subject: [PATCH 01/58] Allow to get unit by unique identifier --- repositories/units.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/repositories/units.js b/repositories/units.js index 8256725..203dd1f 100644 --- a/repositories/units.js +++ b/repositories/units.js @@ -9,6 +9,10 @@ module.exports = function (context) { client.executeQuery('(&(objectClass=organizationalunit)(|(accountingNumber=' + accountingNumber + ')))', unitFactory, context.options.modelsMapper.unit, true, next); }; + unitsRepo.getUnitByUniqueIdentifier = function (unitId, next) { + client.executeQuery('(&(objectClass=organizationalunit)(|(uniqueIdentifier=' + unitId + ')))', unitFactory, context.options.modelsMapper.unit, true, next); + }; + unitsRepo.getUnitByName = function (unit, next) { client.executeQuery('(&(objectClass=organizationalunit)(|(ou=' + unit + ')))', unitFactory, context.options.modelsMapper.unit, true, next); }; From 0c5e777b2ed93a67b5b882de9ad54dd1c8240db9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Wed, 5 Feb 2020 10:52:57 +0100 Subject: [PATCH 02/58] [DPR] Make getUnitById deprecated --- repositories/units.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/repositories/units.js b/repositories/units.js index 203dd1f..5ed3f94 100644 --- a/repositories/units.js +++ b/repositories/units.js @@ -4,11 +4,16 @@ module.exports = function (context) { let unitsRepo = {}; let client = context.client; - + + /* DEPRECATED: please use specific methods */ unitsRepo.getUnitById = function (accountingNumber, next) { + unitsRepo.getUnitByAccountingNumber(accountingNumber, next); + }; + + unitsRepo.getUnitByAccountingNumber = function (accountingNumber, next) { client.executeQuery('(&(objectClass=organizationalunit)(|(accountingNumber=' + accountingNumber + ')))', unitFactory, context.options.modelsMapper.unit, true, next); }; - + unitsRepo.getUnitByUniqueIdentifier = function (unitId, next) { client.executeQuery('(&(objectClass=organizationalunit)(|(uniqueIdentifier=' + unitId + ')))', unitFactory, context.options.modelsMapper.unit, true, next); }; From 6e41177b1e4c112c787609cd6c84809b485afb3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Wed, 5 Feb 2020 10:53:22 +0100 Subject: [PATCH 03/58] [FT.] Wildcard before keyword, not only after --- repositories/units.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repositories/units.js b/repositories/units.js index 5ed3f94..13a5dd0 100644 --- a/repositories/units.js +++ b/repositories/units.js @@ -23,7 +23,7 @@ module.exports = function (context) { }; unitsRepo.searchUnitByName = function (unit, next) { - client.executeQuery('(&(objectClass=organizationalunit)(|(ou=' + unit + '*)))', unitFactory, context.options.modelsMapper.unit, false, next); + client.executeQuery('(&(objectClass=organizationalunit)(|(ou=*' + unit + '*)))', unitFactory, context.options.modelsMapper.unit, false, next); }; return unitsRepo; From ab84cb79a14eec52889fb2d96dec310fddc0d11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Wed, 5 Feb 2020 10:53:43 +0100 Subject: [PATCH 04/58] [FIX] Ensure unique email in returned array --- models/user.js | 1 + 1 file changed, 1 insertion(+) diff --git a/models/user.js b/models/user.js index 4047b75..772d961 100644 --- a/models/user.js +++ b/models/user.js @@ -32,6 +32,7 @@ module.exports = function User(ldapUserArray) { userEntry.mail.map(function(mail) { userModel.emails.push(mail); }); + userModel.emails = [...new Set(userModel.emails)]; } else { userModel.emails.push(userEntry.mail); } From 762b2881dc77a0b38288b82cd4069633d0dfbc03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Wed, 5 Feb 2020 10:55:08 +0100 Subject: [PATCH 05/58] [FIX] Exit mocha after tests --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1f66a9a..cd87537 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,6 @@ ], "license": "ISC", "scripts": { - "test": "mocha" + "test": "mocha --exit" } } From dfce5492b0a3b47bd5d4ce47b19bebdb292c8126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Wed, 5 Feb 2020 10:55:32 +0100 Subject: [PATCH 06/58] [TST] Add some units examples --- samples/sample-getUnit.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/samples/sample-getUnit.js b/samples/sample-getUnit.js index 3dafe66..fd6f9a4 100644 --- a/samples/sample-getUnit.js +++ b/samples/sample-getUnit.js @@ -9,6 +9,14 @@ publicLdapContext.units.getUnitByName('enac-it', function(err, data) { console.log(JSON.stringify(data, null, 2)); }); +publicLdapContext.units.getUnitById('0184', function(err, data) { + console.log(JSON.stringify(data, null, 2)); +}); + +publicLdapContext.units.getUnitByUniqueIdentifier(10208, function(err, data) { + console.log(JSON.stringify(data, null, 2)); +}); + /* * Full From dc038cad8f21a3d0326a4bdbc6c46abafa60abc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Wed, 5 Feb 2020 10:55:52 +0100 Subject: [PATCH 07/58] [FIX] Use a valide sciper --- test/sciperTest.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/sciperTest.js b/test/sciperTest.js index 3120711..7386895 100644 --- a/test/sciperTest.js +++ b/test/sciperTest.js @@ -19,8 +19,8 @@ describe('Scipers', function () { }); it('29 chars email', function (done) { - fullLdapContext.users.getUserBySciper(214370, function (err, data) { - assert.ok(data.emails[0].length === 29, "email adresse is long"); + fullLdapContext.users.getUserBySciper(169419, function (err, data) { + assert.ok(data.emails[0].length === 23, "email adresse is long"); done(); }); }); From 2a2abd3551fb061afca6f71248294ad3eb97288a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Wed, 5 Feb 2020 10:56:13 +0100 Subject: [PATCH 08/58] [ADD] Full units mocha tests --- test/unitTest.js | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 test/unitTest.js diff --git a/test/unitTest.js b/test/unitTest.js new file mode 100644 index 0000000..3c118ee --- /dev/null +++ b/test/unitTest.js @@ -0,0 +1,41 @@ +var assert = require('assert'); +var fullLdapContext = require('../context')(); +fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; +describe('Units', function () { + + it('get unit by id', function(done) { + fullLdapContext.units.getUnitById('1906', function (err, data) { + assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); + done(); + }); + }); + + it('get unit by accounting number', function (done) { + fullLdapContext.units.getUnitByAccountingNumber('1906', function (err, data) { + assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); + done(); + }); + }); + + it('get unit by unique identifier', function (done) { + fullLdapContext.units.getUnitByUniqueIdentifier(13030, function (err, data) { + assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); + done(); + }); + }); + + it('get unit by name', function (done) { + fullLdapContext.units.getUnitByName("SI - Full-Stack Development", function (err, data) { + assert.ok(data.uniqueIdentifier === '13030', "Unit unique identifier"); + done(); + }); + }); + + it('search unit by name', function (done) { + fullLdapContext.units.searchUnitByName("Full-Stack Development", function (err, data) { + assert.ok(data[0].uniqueIdentifier === '13030', "Unit unique identifier"); + done(); + }); + }); + +}); \ No newline at end of file From d014d31da5f3620c93476ea4401c2ed89c7febb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Wed, 5 Feb 2020 11:03:26 +0100 Subject: [PATCH 09/58] [UPD] node check update + git links --- package-lock.json | 1265 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 19 +- 2 files changed, 1274 insertions(+), 10 deletions(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..db212e4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1265 @@ +{ + "name": "epfl-ldap", + "version": "0.6.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "requires": { + "precond": "0.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "bunyan": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", + "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", + "requires": { + "dtrace-provider": "~0.8", + "moment": "^2.10.6", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "^7.1.1" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "optional": true, + "requires": { + "nan": "^2.14.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "extsprintf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", + "integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jshint": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.11.0.tgz", + "integrity": "sha512-ooaD/hrBPhu35xXW4gn+o3SOuzht73gdBuffgJzrZBJZPGgGiiTvJEgTyxFvBO2nz0+X1G6etF8SzUODTlLY6Q==", + "dev": true, + "requires": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.11", + "minimatch": "~3.0.2", + "shelljs": "0.3.x", + "strip-json-comments": "1.0.x" + } + }, + "ldap-filter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz", + "integrity": "sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=", + "requires": { + "assert-plus": "0.1.5" + }, + "dependencies": { + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" + } + } + }, + "ldapjs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz", + "integrity": "sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "bunyan": "^1.8.3", + "dashdash": "^1.14.0", + "dtrace-provider": "~0.8", + "ldap-filter": "0.2.2", + "once": "^1.4.0", + "vasync": "^1.6.4", + "verror": "^1.8.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.1.tgz", + "integrity": "sha512-9eWmWTdHLXh72rGrdZjNbG3aa1/3NRPpul1z0D979QpEnFdCG0Q5tv834N+94QEN2cysfV72YocQ3fn87s70fg==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.0", + "yargs-parser": "13.1.1", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "optional": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "requires": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true + }, + "node-cache": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.0.tgz", + "integrity": "sha512-gFQwYdoOztBuPlwg6DKQEf50G+gkK69aqLnw4djkmlHCzeVrLJfwvg9xl4RCAGviTIMUVoqcyoZ/V/wPEu/VVg==", + "requires": { + "clone": "2.x" + } + }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "o-mapper": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/o-mapper/-/o-mapper-1.0.0.tgz", + "integrity": "sha512-gADMK7WrUGAOrrmqU+5S7iFu0GwY7Bwi2vlbCZAlwXTAkqi4gKg3tspeEF/gSwHEh4vxvOsdUNgYrwHRm+8FyQ==" + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "dev": true + }, + "precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "^6.0.1" + } + }, + "safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "vasync": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", + "integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=", + "requires": { + "verror": "1.6.0" + }, + "dependencies": { + "verror": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", + "integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=", + "requires": { + "extsprintf": "1.2.0" + } + } + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + } + } +} diff --git a/package.json b/package.json index cd87537..46135f5 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,28 @@ { "name": "epfl-ldap", - "version": "0.5.0", + "version": "0.6.0", "description": "epfl-ldap", "main": "context.js", - "homepage": "https://github.com/stefanonepa/epfl-ldap", - "author": "stefanonepa", + "homepage": "https://github.com/epfl-idevelop/epfl-ldap-js", + "author": "stefanonepa, idev-fsd", "dependencies": { - "epfl-exceptions": "^0.0.3", - "ldapjs": "^1.0.0", - "node-cache": "^3.0.0", - "o-mapper": "^0.1.2" + "ldapjs": "^1.0.2", + "node-cache": "^5.1.0", + "o-mapper": "^1.0.0" }, "devDependencies": { - "jshint": "^2.8.0", + "jshint": "^2.11.0", "mocha": "*" }, "bugs": { - "url": "https://github.com/stefanonepa/epfl-ldap/issues" + "url": "https://github.com/epfl-idevelop/epfl-ldap-js/issues" }, "directories": { "test": "test" }, "repository": { "type": "git", - "url": "git+https://github.com/stefanonepa/epfl-ldap.git" + "url": "git+https://github.com/epfl-idevelop/epfl-ldap.git" }, "keywords": [ "epfl", From d943c5a7f71431d6e102deba58724225785d8ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 5 Feb 2020 11:49:10 +0100 Subject: [PATCH 10/58] [FIX] LDAP Filter "OR" not needed --- repositories/units.js | 8 ++++---- repositories/users.js | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/repositories/units.js b/repositories/units.js index 13a5dd0..7dd9003 100644 --- a/repositories/units.js +++ b/repositories/units.js @@ -11,19 +11,19 @@ module.exports = function (context) { }; unitsRepo.getUnitByAccountingNumber = function (accountingNumber, next) { - client.executeQuery('(&(objectClass=organizationalunit)(|(accountingNumber=' + accountingNumber + ')))', unitFactory, context.options.modelsMapper.unit, true, next); + client.executeQuery('(&(objectClass=organizationalunit)(accountingNumber=' + accountingNumber + '))', unitFactory, context.options.modelsMapper.unit, true, next); }; unitsRepo.getUnitByUniqueIdentifier = function (unitId, next) { - client.executeQuery('(&(objectClass=organizationalunit)(|(uniqueIdentifier=' + unitId + ')))', unitFactory, context.options.modelsMapper.unit, true, next); + client.executeQuery('(&(objectClass=organizationalunit)(uniqueIdentifier=' + unitId + '))', unitFactory, context.options.modelsMapper.unit, true, next); }; unitsRepo.getUnitByName = function (unit, next) { - client.executeQuery('(&(objectClass=organizationalunit)(|(ou=' + unit + ')))', unitFactory, context.options.modelsMapper.unit, true, next); + client.executeQuery('(&(objectClass=organizationalunit)(ou=' + unit + '))', unitFactory, context.options.modelsMapper.unit, true, next); }; unitsRepo.searchUnitByName = function (unit, next) { - client.executeQuery('(&(objectClass=organizationalunit)(|(ou=*' + unit + '*)))', unitFactory, context.options.modelsMapper.unit, false, next); + client.executeQuery('(&(objectClass=organizationalunit)(ou=*' + unit + '*))', unitFactory, context.options.modelsMapper.unit, false, next); }; return unitsRepo; diff --git a/repositories/users.js b/repositories/users.js index 74167c9..495d835 100644 --- a/repositories/users.js +++ b/repositories/users.js @@ -6,42 +6,42 @@ module.exports = function (context) { let client = context.client; usersRepo.getUserBySciper = function (sciper, next) { - client.executeQuery('(&(objectClass=posixAccount)(|(uniqueIdentifier=' + sciper + ')))', userFactory, context.options.modelsMapper.user, true, next); + client.executeQuery('(&(objectClass=posixAccount)(uniqueIdentifier=' + sciper + '))', userFactory, context.options.modelsMapper.user, true, next); }; usersRepo.getUserByName = function (name, next) { - client.executeQuery('(&(objectClass=posixAccount)(|(cn=' + name + ')))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(cn=' + name + '))', userFactory, context.options.modelsMapper.user, false, next); }; usersRepo.searchUserByName = function (name, next) { - client.executeQuery('(&(objectClass=posixAccount)(|(cn=' + name + '*)))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(cn=' + name + '*))', userFactory, context.options.modelsMapper.user, false, next); }; usersRepo.searchUserByPhone = function (phone, next) { - client.executeQuery('(&(objectClass=posixAccount)(|(telephoneNumber=*' + phone + '*)))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(telephoneNumber=*' + phone + '*))', userFactory, context.options.modelsMapper.user, false, next); }; usersRepo.searchUserByUnitAcronym = function (unitAcronym, next) { - client.executeQuery('(&(objectClass=posixAccount)(|(ou=' + unitAcronym + ')))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(ou=' + unitAcronym + '))', userFactory, context.options.modelsMapper.user, false, next); }; /* The plural forms always return a list, regarding of whether the search * criterion is unique. */ usersRepo.getUsersBySciper = function (sciper, next) { - client.executeQuery('(&(objectClass=posixAccount)(|(uniqueIdentifier=' + sciper + ')))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(uniqueIdentifier=' + sciper + '))', userFactory, context.options.modelsMapper.user, false, next); }; usersRepo.getUsersByName = function (name, next) { - client.executeQuery('(&(objectClass=posixAccount)(|(cn=' + name + ')))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(cn=' + name + '))', userFactory, context.options.modelsMapper.user, false, next); }; usersRepo.getUsersByPhone = function (phone, next) { - client.executeQuery('(&(objectClass=posixAccount)(|(telephoneNumber=*' + phone + '*)))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(telephoneNumber=*' + phone + '*))', userFactory, context.options.modelsMapper.user, false, next); }; usersRepo.getUsersByUnitAcronym = function (unitAcronym, next) { - client.executeQuery('(&(objectClass=posixAccount)(|(ou=' + unitAcronym + ')))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(ou=' + unitAcronym + '))', userFactory, context.options.modelsMapper.user, false, next); }; return usersRepo; From 3215773fbe418b750b4e95599103e0017d5db417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 5 Feb 2020 12:09:58 +0100 Subject: [PATCH 11/58] [FIX] Search function shuld contains wildcard --- repositories/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repositories/users.js b/repositories/users.js index 495d835..8faad46 100644 --- a/repositories/users.js +++ b/repositories/users.js @@ -22,7 +22,7 @@ module.exports = function (context) { }; usersRepo.searchUserByUnitAcronym = function (unitAcronym, next) { - client.executeQuery('(&(objectClass=posixAccount)(ou=' + unitAcronym + '))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(ou=*' + unitAcronym + '*))', userFactory, context.options.modelsMapper.user, false, next); }; /* The plural forms always return a list, regarding of whether the search From cc6b150746bb0e8f7d7390d29e1f871b9f488e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 5 Feb 2020 12:10:14 +0100 Subject: [PATCH 12/58] [TST] Cover all `user.js` function --- test/sciperTest.js | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/test/sciperTest.js b/test/sciperTest.js index 7386895..8cdebba 100644 --- a/test/sciperTest.js +++ b/test/sciperTest.js @@ -2,27 +2,61 @@ var fullLdapContext = require('../context')(); fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; -describe('Scipers', function () { +describe('Sciper', function () { - it('Kermit La Grenouille', function (done) { + it('getUserBySciper should get Kermit La Grenouille', function (done) { fullLdapContext.users.getUserBySciper(133134, function (err, data) { assert.equal(data.displayName, "Kermit La Grenouille"); done(); }); }); - it('have two email', function(done) { + it('getUserBySciper should handle users with two email', function(done) { fullLdapContext.users.getUserBySciper(162314, function (err, data) { assert.ok(data.emails.length === 2, "User have 2 email"); done(); }); }); - it('29 chars email', function (done) { + it('getUserBySciper should return correct email length', function (done) { fullLdapContext.users.getUserBySciper(169419, function (err, data) { assert.ok(data.emails[0].length === 23, "email adresse is long"); done(); }); }); + it('getUserByName should find Kermit La Grenouille', function (done) { + fullLdapContext.users.getUserByName('Kermit La Grenouille', function (err, data) { + assert.equal(data[0].displayName, 'Kermit La Grenouille'); + done(); + }); + }); + + it('searchUserByName should search Kermit La Grenouille', function (done) { + fullLdapContext.users.searchUserByName('Kermit', function (err, data) { + assert.equal(data[0].displayName, 'Kermit La Grenouille'); + done(); + }); + }); + + it('searchUserByUnitAcronym should search all members of IDEV-F*, including Kermit', function (done) { + fullLdapContext.users.searchUserByUnitAcronym('IDEV-F', function (err, data) { + let k = data.filter(obj => { + return obj.displayName === 'Kermit La Grenouille'; + }) + assert.equal(k[0].displayName, 'Kermit La Grenouille'); + done(); + }); + }); + + it('getUsersByUnitAcronym should search all members of IDEV-FSD, including Kermit', function (done) { + fullLdapContext.users.getUsersByUnitAcronym('IDEV-FSD', function (err, data) { + let k = data.filter(obj => { + return obj.displayName === 'Kermit La Grenouille'; + }) + assert.equal(k[0].displayName, 'Kermit La Grenouille'); + done(); + }); + }); + }); From df9ed2259bfe3072e80cf305f0bfdeccabe38e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 5 Feb 2020 12:10:25 +0100 Subject: [PATCH 13/58] [VER] Bump to 0.7.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 46135f5..ce6a999 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "epfl-ldap", - "version": "0.6.0", + "version": "0.7.0", "description": "epfl-ldap", "main": "context.js", "homepage": "https://github.com/epfl-idevelop/epfl-ldap-js", @@ -22,7 +22,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/epfl-idevelop/epfl-ldap.git" + "url": "git+https://github.com/epfl-idevelop/epfl-ldap-js.git" }, "keywords": [ "epfl", From 899209d32b9623a40d55f40e9974167c0924e05a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 5 Feb 2020 12:13:09 +0100 Subject: [PATCH 14/58] [BTF] Uniformize the 4 spaces --- test/unitTest.js | 59 ++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/test/unitTest.js b/test/unitTest.js index 3c118ee..3b5d198 100644 --- a/test/unitTest.js +++ b/test/unitTest.js @@ -1,41 +1,42 @@ var assert = require('assert'); var fullLdapContext = require('../context')(); fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; + describe('Units', function () { - it('get unit by id', function(done) { - fullLdapContext.units.getUnitById('1906', function (err, data) { - assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); - done(); + it('get unit by id', function(done) { + fullLdapContext.units.getUnitById('1906', function (err, data) { + assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); + done(); + }); }); - }); - - it('get unit by accounting number', function (done) { - fullLdapContext.units.getUnitByAccountingNumber('1906', function (err, data) { - assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); - done(); + + it('get unit by accounting number', function (done) { + fullLdapContext.units.getUnitByAccountingNumber('1906', function (err, data) { + assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); + done(); + }); }); - }); - - it('get unit by unique identifier', function (done) { - fullLdapContext.units.getUnitByUniqueIdentifier(13030, function (err, data) { - assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); - done(); + + it('get unit by unique identifier', function (done) { + fullLdapContext.units.getUnitByUniqueIdentifier(13030, function (err, data) { + assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); + done(); + }); }); - }); - - it('get unit by name', function (done) { - fullLdapContext.units.getUnitByName("SI - Full-Stack Development", function (err, data) { - assert.ok(data.uniqueIdentifier === '13030', "Unit unique identifier"); - done(); + + it('get unit by name', function (done) { + fullLdapContext.units.getUnitByName("SI - Full-Stack Development", function (err, data) { + assert.ok(data.uniqueIdentifier === '13030', "Unit unique identifier"); + done(); + }); }); - }); - - it('search unit by name', function (done) { - fullLdapContext.units.searchUnitByName("Full-Stack Development", function (err, data) { - assert.ok(data[0].uniqueIdentifier === '13030', "Unit unique identifier"); - done(); + + it('search unit by name', function (done) { + fullLdapContext.units.searchUnitByName("Full-Stack Development", function (err, data) { + assert.ok(data[0].uniqueIdentifier === '13030', "Unit unique identifier"); + done(); + }); }); - }); }); \ No newline at end of file From fd278e6a8c170368c95d1b3ffda330c1adb04e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 5 Feb 2020 12:14:03 +0100 Subject: [PATCH 15/58] [DOC] README updated * Intro improved * No more TODOs --- README.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/README.md b/README.md index 2ae4b36..12652af 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # epfl-ldap -Simple wrapper to query the epfl ldap +Simple wrapper to query the EPFL LDAP. ## Usage ```javascript @@ -51,9 +51,3 @@ customLdapContext.users.getUserBySciper(169419, function (err, data) { ⚠ this library *"try"* to use ES2015 (or ES6) capabilities, don't use it with nodejs under 4.x? - -## TODO - -- [ ] add tests -- [ ] add samples -- [ ] implement query validation with the package `epfl-exceptions` From f07d30c5c86eec5fc606aa021c903f494d03b1f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 5 Feb 2020 12:14:25 +0100 Subject: [PATCH 16/58] [VER] Bump to v0.8.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ce6a999..0ca68c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "epfl-ldap", - "version": "0.7.0", + "version": "0.8.0", "description": "epfl-ldap", "main": "context.js", "homepage": "https://github.com/epfl-idevelop/epfl-ldap-js", From 320b81e1cfeec97248809ba41768f00482e407e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Mon, 10 Feb 2020 10:07:40 +0100 Subject: [PATCH 17/58] [FIX] node-cache update --- context.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/context.js b/context.js index 3034992..b09fba1 100644 --- a/context.js +++ b/context.js @@ -9,7 +9,7 @@ module.exports = function ldapContext(options) { context.viewModelsMappers = require('./viewModels/mappers')(); if (options == undefined || options.memoryCache == undefined ) { - context.memoryCache = new NodeCache({ stdTTL: 14400 }); // 4 hour of cache + context.memoryCache = new NodeCache({ stdTTL: 14400, enableLegacyCallbacks: true }); // 4 hour of cache } else { context.memoryCache = new NodeCache(options.memoryCache); } From e385f4f6cddf57877f8c8fc3ae85b7721c4214f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Mon, 10 Feb 2020 10:19:22 +0100 Subject: [PATCH 18/58] [VER] Bump to v0.9.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0ca68c1..3486918 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "epfl-ldap", - "version": "0.8.0", + "version": "0.9.0", "description": "epfl-ldap", "main": "context.js", "homepage": "https://github.com/epfl-idevelop/epfl-ldap-js", From dcd7fb2e090fd653c536d111e4f9dd9101c2a17b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 10:26:23 +0100 Subject: [PATCH 19/58] [ADD] flushing cache before all tests --- repositories/units.js | 4 ++-- test/init.js | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 test/init.js diff --git a/repositories/units.js b/repositories/units.js index 7dd9003..44233a6 100644 --- a/repositories/units.js +++ b/repositories/units.js @@ -1,7 +1,7 @@ 'use strict'; module.exports = function (context) { let unitFactory = require('../models/unit'); - + let unitsRepo = {}; let client = context.client; @@ -25,6 +25,6 @@ module.exports = function (context) { unitsRepo.searchUnitByName = function (unit, next) { client.executeQuery('(&(objectClass=organizationalunit)(ou=*' + unit + '*))', unitFactory, context.options.modelsMapper.unit, false, next); }; - + return unitsRepo; }; \ No newline at end of file diff --git a/test/init.js b/test/init.js new file mode 100644 index 0000000..0ed348e --- /dev/null +++ b/test/init.js @@ -0,0 +1,11 @@ +before(function() { + //console.log('before test in every file'); +}); + + +beforeEach(function() { + // Be sure to clear the cache before the tests... + // console.log('clearing cache...'); + var fullLdapContext = require('../context')(); + fullLdapContext.memoryCache.flushAll(); +}); From 8e258ce22cdefd8b7ef232920eb92237f5f43164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 10:34:39 +0100 Subject: [PATCH 20/58] [TST] Test for searchUserByPhone added * See #1 --- test/sciperTest.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/sciperTest.js b/test/sciperTest.js index 8cdebba..3116e42 100644 --- a/test/sciperTest.js +++ b/test/sciperTest.js @@ -32,6 +32,7 @@ describe('Sciper', function () { }); }); + it('searchUserByName should search Kermit La Grenouille', function (done) { fullLdapContext.users.searchUserByName('Kermit', function (err, data) { assert.equal(data[0].displayName, 'Kermit La Grenouille'); @@ -39,6 +40,13 @@ describe('Sciper', function () { }); }); + it('searchUserByPhone should return 169419', function (done) { + fullLdapContext.users.searchUserByPhone('35455', function (err, data) { + assert.equal(data[0].sciper, '169419'); + done(); + }); + }); + it('searchUserByUnitAcronym should search all members of IDEV-F*, including Kermit', function (done) { fullLdapContext.users.searchUserByUnitAcronym('IDEV-F', function (err, data) { let k = data.filter(obj => { @@ -49,6 +57,7 @@ describe('Sciper', function () { }); }); + it('getUsersByUnitAcronym should search all members of IDEV-FSD, including Kermit', function (done) { fullLdapContext.users.getUsersByUnitAcronym('IDEV-FSD', function (err, data) { let k = data.filter(obj => { From d10d9b5271c95eb7b9b1815dbeedbe696b033d5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 11:06:46 +0100 Subject: [PATCH 21/58] [BTF] 4 spaces --- samples/sample-getUnit.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/sample-getUnit.js b/samples/sample-getUnit.js index fd6f9a4..d62834c 100644 --- a/samples/sample-getUnit.js +++ b/samples/sample-getUnit.js @@ -10,11 +10,11 @@ publicLdapContext.units.getUnitByName('enac-it', function(err, data) { }); publicLdapContext.units.getUnitById('0184', function(err, data) { - console.log(JSON.stringify(data, null, 2)); + console.log(JSON.stringify(data, null, 2)); }); publicLdapContext.units.getUnitByUniqueIdentifier(10208, function(err, data) { - console.log(JSON.stringify(data, null, 2)); + console.log(JSON.stringify(data, null, 2)); }); From 658438a220a58066b02be7ded77f2f6a310b3614 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 11:07:37 +0100 Subject: [PATCH 22/58] [RFA] Organise test in category --- test/sciperTest.js | 10 ++++++++-- test/unitTest.js | 10 +++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/test/sciperTest.js b/test/sciperTest.js index 3116e42..1a1838d 100644 --- a/test/sciperTest.js +++ b/test/sciperTest.js @@ -2,7 +2,7 @@ var fullLdapContext = require('../context')(); fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; -describe('Sciper', function () { +describe('User::get', function () { it('getUserBySciper should get Kermit La Grenouille', function (done) { fullLdapContext.users.getUserBySciper(133134, function (err, data) { @@ -27,11 +27,14 @@ describe('Sciper', function () { it('getUserByName should find Kermit La Grenouille', function (done) { fullLdapContext.users.getUserByName('Kermit La Grenouille', function (err, data) { - assert.equal(data[0].displayName, 'Kermit La Grenouille'); + assert.equal(data.displayName, 'Kermit La Grenouille'); done(); }); }); +}); + +describe('User::search', function () { it('searchUserByName should search Kermit La Grenouille', function (done) { fullLdapContext.users.searchUserByName('Kermit', function (err, data) { @@ -57,6 +60,9 @@ describe('Sciper', function () { }); }); +}); + +describe('Users::get', function () { it('getUsersByUnitAcronym should search all members of IDEV-FSD, including Kermit', function (done) { fullLdapContext.users.getUsersByUnitAcronym('IDEV-FSD', function (err, data) { diff --git a/test/unitTest.js b/test/unitTest.js index 3b5d198..c5cb69d 100644 --- a/test/unitTest.js +++ b/test/unitTest.js @@ -2,7 +2,7 @@ var assert = require('assert'); var fullLdapContext = require('../context')(); fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; -describe('Units', function () { +describe('Units::get', function () { it('get unit by id', function(done) { fullLdapContext.units.getUnitById('1906', function (err, data) { @@ -17,7 +17,7 @@ describe('Units', function () { done(); }); }); - + it('get unit by unique identifier', function (done) { fullLdapContext.units.getUnitByUniqueIdentifier(13030, function (err, data) { assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); @@ -31,7 +31,11 @@ describe('Units', function () { done(); }); }); - + +}); + +describe('Units::search', function () { + it('search unit by name', function (done) { fullLdapContext.units.searchUnitByName("Full-Stack Development", function (err, data) { assert.ok(data[0].uniqueIdentifier === '13030', "Unit unique identifier"); From f3cc2efeace5dcff66b5c1fae0f413cee37f5776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 11:08:01 +0100 Subject: [PATCH 23/58] [FIX] Ensure getUserByName return one result --- repositories/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repositories/users.js b/repositories/users.js index 8faad46..e382302 100644 --- a/repositories/users.js +++ b/repositories/users.js @@ -10,7 +10,7 @@ module.exports = function (context) { }; usersRepo.getUserByName = function (name, next) { - client.executeQuery('(&(objectClass=posixAccount)(cn=' + name + '))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(cn=' + name + '))', userFactory, context.options.modelsMapper.user, true, next); }; usersRepo.searchUserByName = function (name, next) { From b799724e1de3fb1e6f240b88acfc6acdb30024fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 11:09:11 +0100 Subject: [PATCH 24/58] =?UTF-8?q?[REN]=20sciperTest=20=E2=86=92=20userTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/{sciperTest.js => userTest.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{sciperTest.js => userTest.js} (100%) diff --git a/test/sciperTest.js b/test/userTest.js similarity index 100% rename from test/sciperTest.js rename to test/userTest.js From cc68afe95b2b164a2e7005499ff3e973a8f5c03a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 11:20:55 +0100 Subject: [PATCH 25/58] [TST] More tests for getUserS * See #1 --- test/userTest.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/userTest.js b/test/userTest.js index 1a1838d..95d27d2 100644 --- a/test/userTest.js +++ b/test/userTest.js @@ -64,6 +64,29 @@ describe('User::search', function () { describe('Users::get', function () { + it('getUsersBySciper should get Kermit La Grenouille', function (done) { + fullLdapContext.users.getUsersBySciper(133134, function (err, data) { + // Note: it should be an array... + assert.equal(data.displayName, 'Kermit La Grenouille'); + done(); + }); + }); + + it('getUsersByName should get Kermit La Grenouille', function (done) { + fullLdapContext.users.getUsersByName('Kermit La Grenouille', function (err, data) { + // Note: it should be an array... + assert.equal(data.displayName, 'Kermit La Grenouille'); + done(); + }); + }); + + it('getUsersByPhone should get 169419', function (done) { + fullLdapContext.users.getUsersByPhone('35455', function (err, data) { + assert.equal(data[0].sciper, '169419'); + done(); + }); + }); + it('getUsersByUnitAcronym should search all members of IDEV-FSD, including Kermit', function (done) { fullLdapContext.users.getUsersByUnitAcronym('IDEV-FSD', function (err, data) { let k = data.filter(obj => { From 52df440fe5787501a0862023205601a356400882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Tue, 11 Feb 2020 13:56:54 +0100 Subject: [PATCH 26/58] Update README.md Co-Authored-By: stefanonepa --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 12652af..bb6c45e 100644 --- a/README.md +++ b/README.md @@ -49,5 +49,4 @@ customLdapContext.users.getUserBySciper(169419, function (err, data) { ⚠ Carefull with the results formats (Object or Array) -⚠ this library *"try"* to use ES2015 (or ES6) capabilities, don't use it with nodejs under 4.x? - +⚠ this library *"try"* to use ES2015 (or ES6) capabilities, don't use it with nodejs under 5.x? From b3f458e46100fce76f1176c0d20ed7a13790f41d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 10:26:23 +0100 Subject: [PATCH 27/58] [ADD] flushing cache before all tests --- repositories/units.js | 4 ++-- test/init.js | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 test/init.js diff --git a/repositories/units.js b/repositories/units.js index 7dd9003..44233a6 100644 --- a/repositories/units.js +++ b/repositories/units.js @@ -1,7 +1,7 @@ 'use strict'; module.exports = function (context) { let unitFactory = require('../models/unit'); - + let unitsRepo = {}; let client = context.client; @@ -25,6 +25,6 @@ module.exports = function (context) { unitsRepo.searchUnitByName = function (unit, next) { client.executeQuery('(&(objectClass=organizationalunit)(ou=*' + unit + '*))', unitFactory, context.options.modelsMapper.unit, false, next); }; - + return unitsRepo; }; \ No newline at end of file diff --git a/test/init.js b/test/init.js new file mode 100644 index 0000000..0ed348e --- /dev/null +++ b/test/init.js @@ -0,0 +1,11 @@ +before(function() { + //console.log('before test in every file'); +}); + + +beforeEach(function() { + // Be sure to clear the cache before the tests... + // console.log('clearing cache...'); + var fullLdapContext = require('../context')(); + fullLdapContext.memoryCache.flushAll(); +}); From f8180f8bdba94dd66eaec5d5ed4b34c030664ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 10:34:39 +0100 Subject: [PATCH 28/58] [TST] Test for searchUserByPhone added * See #1 --- test/sciperTest.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/sciperTest.js b/test/sciperTest.js index 8cdebba..3116e42 100644 --- a/test/sciperTest.js +++ b/test/sciperTest.js @@ -32,6 +32,7 @@ describe('Sciper', function () { }); }); + it('searchUserByName should search Kermit La Grenouille', function (done) { fullLdapContext.users.searchUserByName('Kermit', function (err, data) { assert.equal(data[0].displayName, 'Kermit La Grenouille'); @@ -39,6 +40,13 @@ describe('Sciper', function () { }); }); + it('searchUserByPhone should return 169419', function (done) { + fullLdapContext.users.searchUserByPhone('35455', function (err, data) { + assert.equal(data[0].sciper, '169419'); + done(); + }); + }); + it('searchUserByUnitAcronym should search all members of IDEV-F*, including Kermit', function (done) { fullLdapContext.users.searchUserByUnitAcronym('IDEV-F', function (err, data) { let k = data.filter(obj => { @@ -49,6 +57,7 @@ describe('Sciper', function () { }); }); + it('getUsersByUnitAcronym should search all members of IDEV-FSD, including Kermit', function (done) { fullLdapContext.users.getUsersByUnitAcronym('IDEV-FSD', function (err, data) { let k = data.filter(obj => { From d39b39309c6bf99f4cc6663202d079cc24e8336c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 11:06:46 +0100 Subject: [PATCH 29/58] [BTF] 4 spaces --- samples/sample-getUnit.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/sample-getUnit.js b/samples/sample-getUnit.js index fd6f9a4..d62834c 100644 --- a/samples/sample-getUnit.js +++ b/samples/sample-getUnit.js @@ -10,11 +10,11 @@ publicLdapContext.units.getUnitByName('enac-it', function(err, data) { }); publicLdapContext.units.getUnitById('0184', function(err, data) { - console.log(JSON.stringify(data, null, 2)); + console.log(JSON.stringify(data, null, 2)); }); publicLdapContext.units.getUnitByUniqueIdentifier(10208, function(err, data) { - console.log(JSON.stringify(data, null, 2)); + console.log(JSON.stringify(data, null, 2)); }); From 048ce596d27efb847ce573efc57bd8c9d952d33d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 11:07:37 +0100 Subject: [PATCH 30/58] [RFA] Organise test in category --- test/sciperTest.js | 10 ++++++++-- test/unitTest.js | 10 +++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/test/sciperTest.js b/test/sciperTest.js index 3116e42..1a1838d 100644 --- a/test/sciperTest.js +++ b/test/sciperTest.js @@ -2,7 +2,7 @@ var fullLdapContext = require('../context')(); fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; -describe('Sciper', function () { +describe('User::get', function () { it('getUserBySciper should get Kermit La Grenouille', function (done) { fullLdapContext.users.getUserBySciper(133134, function (err, data) { @@ -27,11 +27,14 @@ describe('Sciper', function () { it('getUserByName should find Kermit La Grenouille', function (done) { fullLdapContext.users.getUserByName('Kermit La Grenouille', function (err, data) { - assert.equal(data[0].displayName, 'Kermit La Grenouille'); + assert.equal(data.displayName, 'Kermit La Grenouille'); done(); }); }); +}); + +describe('User::search', function () { it('searchUserByName should search Kermit La Grenouille', function (done) { fullLdapContext.users.searchUserByName('Kermit', function (err, data) { @@ -57,6 +60,9 @@ describe('Sciper', function () { }); }); +}); + +describe('Users::get', function () { it('getUsersByUnitAcronym should search all members of IDEV-FSD, including Kermit', function (done) { fullLdapContext.users.getUsersByUnitAcronym('IDEV-FSD', function (err, data) { diff --git a/test/unitTest.js b/test/unitTest.js index 3b5d198..c5cb69d 100644 --- a/test/unitTest.js +++ b/test/unitTest.js @@ -2,7 +2,7 @@ var assert = require('assert'); var fullLdapContext = require('../context')(); fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; -describe('Units', function () { +describe('Units::get', function () { it('get unit by id', function(done) { fullLdapContext.units.getUnitById('1906', function (err, data) { @@ -17,7 +17,7 @@ describe('Units', function () { done(); }); }); - + it('get unit by unique identifier', function (done) { fullLdapContext.units.getUnitByUniqueIdentifier(13030, function (err, data) { assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); @@ -31,7 +31,11 @@ describe('Units', function () { done(); }); }); - + +}); + +describe('Units::search', function () { + it('search unit by name', function (done) { fullLdapContext.units.searchUnitByName("Full-Stack Development", function (err, data) { assert.ok(data[0].uniqueIdentifier === '13030', "Unit unique identifier"); From 8808f9a74a1f7a6acea110cd55231a1dbca8576a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 11:08:01 +0100 Subject: [PATCH 31/58] [FIX] Ensure getUserByName return one result --- repositories/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repositories/users.js b/repositories/users.js index 8faad46..e382302 100644 --- a/repositories/users.js +++ b/repositories/users.js @@ -10,7 +10,7 @@ module.exports = function (context) { }; usersRepo.getUserByName = function (name, next) { - client.executeQuery('(&(objectClass=posixAccount)(cn=' + name + '))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(cn=' + name + '))', userFactory, context.options.modelsMapper.user, true, next); }; usersRepo.searchUserByName = function (name, next) { From 9b5aed75a859ecbc509467caa226a953fc0a0c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 11:09:11 +0100 Subject: [PATCH 32/58] =?UTF-8?q?[REN]=20sciperTest=20=E2=86=92=20userTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/{sciperTest.js => userTest.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{sciperTest.js => userTest.js} (100%) diff --git a/test/sciperTest.js b/test/userTest.js similarity index 100% rename from test/sciperTest.js rename to test/userTest.js From e8a66c808a3cde819c85f3e224120fc0b58f3e35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Mon, 10 Feb 2020 11:20:55 +0100 Subject: [PATCH 33/58] [TST] More tests for getUserS * See #1 --- test/userTest.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/userTest.js b/test/userTest.js index 1a1838d..95d27d2 100644 --- a/test/userTest.js +++ b/test/userTest.js @@ -64,6 +64,29 @@ describe('User::search', function () { describe('Users::get', function () { + it('getUsersBySciper should get Kermit La Grenouille', function (done) { + fullLdapContext.users.getUsersBySciper(133134, function (err, data) { + // Note: it should be an array... + assert.equal(data.displayName, 'Kermit La Grenouille'); + done(); + }); + }); + + it('getUsersByName should get Kermit La Grenouille', function (done) { + fullLdapContext.users.getUsersByName('Kermit La Grenouille', function (err, data) { + // Note: it should be an array... + assert.equal(data.displayName, 'Kermit La Grenouille'); + done(); + }); + }); + + it('getUsersByPhone should get 169419', function (done) { + fullLdapContext.users.getUsersByPhone('35455', function (err, data) { + assert.equal(data[0].sciper, '169419'); + done(); + }); + }); + it('getUsersByUnitAcronym should search all members of IDEV-FSD, including Kermit', function (done) { fullLdapContext.users.getUsersByUnitAcronym('IDEV-FSD', function (err, data) { let k = data.filter(obj => { From 6120109ae23fa09d3ea0e786fc582f3dda58ed8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 12 Feb 2020 10:22:43 +0100 Subject: [PATCH 34/58] [RFC] As commented here: https://github.com/stefanonepa/epfl-ldap/pull/4#discussion_r375255479 --- models/user.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/models/user.js b/models/user.js index 772d961..1d9dbd4 100644 --- a/models/user.js +++ b/models/user.js @@ -29,10 +29,9 @@ module.exports = function User(ldapUserArray) { ldapUserArray.map(function (userEntry) { if (userEntry.mail != undefined) { if (userEntry.mail instanceof Array) { - userEntry.mail.map(function(mail) { - userModel.emails.push(mail); - }); - userModel.emails = [...new Set(userModel.emails)]; + // @stefanonepa suggestion's: + // https://github.com/stefanonepa/epfl-ldap/pull/4#discussion_r375255479 + userModel.emails = [...new Set(userEntry.mail)]; } else { userModel.emails.push(userEntry.mail); } From 4a068e6fa52cdc21b04cc016e09e4e777bc16217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 12 Feb 2020 10:24:51 +0100 Subject: [PATCH 35/58] [FT.] ByMail method + better phone handling * Now one can query the ldap using user's email * Querying with phone will now handle "12345" and "+41 21 6912345" --- repositories/users.js | 24 ++++++++++++++++++------ test/userTest.js | 32 +++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/repositories/users.js b/repositories/users.js index e382302..d0b193e 100644 --- a/repositories/users.js +++ b/repositories/users.js @@ -8,19 +8,27 @@ module.exports = function (context) { usersRepo.getUserBySciper = function (sciper, next) { client.executeQuery('(&(objectClass=posixAccount)(uniqueIdentifier=' + sciper + '))', userFactory, context.options.modelsMapper.user, true, next); }; - + usersRepo.getUserByName = function (name, next) { client.executeQuery('(&(objectClass=posixAccount)(cn=' + name + '))', userFactory, context.options.modelsMapper.user, true, next); }; - + + usersRepo.getUserByPhone = function (phone, next) { + client.executeQuery('(&(objectClass=posixAccount)(|(telephoneNumber=' + phone + ')(telephoneNumber=+41 21 69' + phone + ')))', userFactory, context.options.modelsMapper.user, true, next); + }; + + usersRepo.getUserByMail = function (mail, next) { + client.executeQuery('(&(objectClass=posixAccount)(mail=' + mail + '))', userFactory, context.options.modelsMapper.user, true, next); + }; + usersRepo.searchUserByName = function (name, next) { client.executeQuery('(&(objectClass=posixAccount)(cn=' + name + '*))', userFactory, context.options.modelsMapper.user, false, next); }; - + usersRepo.searchUserByPhone = function (phone, next) { client.executeQuery('(&(objectClass=posixAccount)(telephoneNumber=*' + phone + '*))', userFactory, context.options.modelsMapper.user, false, next); }; - + usersRepo.searchUserByUnitAcronym = function (unitAcronym, next) { client.executeQuery('(&(objectClass=posixAccount)(ou=*' + unitAcronym + '*))', userFactory, context.options.modelsMapper.user, false, next); }; @@ -37,12 +45,16 @@ module.exports = function (context) { }; usersRepo.getUsersByPhone = function (phone, next) { - client.executeQuery('(&(objectClass=posixAccount)(telephoneNumber=*' + phone + '*))', userFactory, context.options.modelsMapper.user, false, next); + client.executeQuery('(&(objectClass=posixAccount)(|(telephoneNumber=' + phone + ')(telephoneNumber=+41 21 69' + phone + ')))', userFactory, context.options.modelsMapper.user, false, next); + }; + + usersRepo.getUsersByMail = function (mail, next) { + client.executeQuery('(&(objectClass=posixAccount)(mail=' + mail + '))', userFactory, context.options.modelsMapper.user, false, next); }; usersRepo.getUsersByUnitAcronym = function (unitAcronym, next) { client.executeQuery('(&(objectClass=posixAccount)(ou=' + unitAcronym + '))', userFactory, context.options.modelsMapper.user, false, next); }; - + return usersRepo; }; \ No newline at end of file diff --git a/test/userTest.js b/test/userTest.js index 95d27d2..7006547 100644 --- a/test/userTest.js +++ b/test/userTest.js @@ -20,7 +20,7 @@ describe('User::get', function () { it('getUserBySciper should return correct email length', function (done) { fullLdapContext.users.getUserBySciper(169419, function (err, data) { - assert.ok(data.emails[0].length === 23, "email adresse is long"); + assert.ok(data.emails[0].length === 23, "Email adresse has the correct length"); done(); }); }); @@ -32,6 +32,28 @@ describe('User::get', function () { }); }); + it('getUserByPhone should find 169419', function (done) { + fullLdapContext.users.getUserByPhone('+41 21 6935455', function (err, data) { + assert.equal(data.sciper, '169419'); + done(); + }); + }); + + it('getUserByPhone should find 169419', function (done) { + fullLdapContext.users.getUserByPhone('35455', function (err, data) { + assert.equal(data.sciper, '169419'); + done(); + }); + }); + + // Watch out: user with guest account on their EPFL email can appear first. + it('getUserByMail should find 188475', function (done) { + fullLdapContext.users.getUserByMail('gregory.charmier@epfl.ch', function (err, data) { + assert.equal(data.sciper, '188475'); + done(); + }); + }); + }); describe('User::search', function () { @@ -82,6 +104,14 @@ describe('Users::get', function () { it('getUsersByPhone should get 169419', function (done) { fullLdapContext.users.getUsersByPhone('35455', function (err, data) { + // Note: it should be an array... + assert.equal(data.sciper, '169419'); + done(); + }); + }); + + it('getUsersByMail should find 169419', function (done) { + fullLdapContext.users.getUsersByMail('nicolas.borboen@epfl.ch', function (err, data) { assert.equal(data[0].sciper, '169419'); done(); }); From 0808dd3cfb205fe2cfc80aa3b643c67da9d9e15f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 12 Feb 2020 11:15:45 +0100 Subject: [PATCH 36/58] [BTF] OCD --- client.js | 6 +++--- repositories/users.js | 2 +- viewModels/custom/modelsMapper.js | 2 +- viewModels/full/modelsMapper.js | 6 +++--- viewModels/public/modelsMapper.js | 8 ++++---- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/client.js b/client.js index 8d1fa77..c8cd898 100644 --- a/client.js +++ b/client.js @@ -1,7 +1,7 @@ 'use strict'; module.exports = function ldapClient(context) { - + let ldap = require('ldapjs'); let client = ldap.createClient({ url: 'ldap://ldap.epfl.ch', @@ -14,7 +14,7 @@ module.exports = function ldapClient(context) { filter: ldapQuery, scope: 'sub' }; - + client.search(context.options.searchBase, opts, function (err, ldapRes) { let groupedObject = {}; @@ -42,7 +42,7 @@ module.exports = function ldapClient(context) { }); ldapRes.on('end', function () { let objectsGroup = Array(); - + for (let userEntry in groupedObject) { if (groupedObject.hasOwnProperty(userEntry)) { if (isResultUniq) { diff --git a/repositories/users.js b/repositories/users.js index d0b193e..c61f51e 100644 --- a/repositories/users.js +++ b/repositories/users.js @@ -4,7 +4,7 @@ module.exports = function (context) { let userFactory = require('../models/user'); let usersRepo = {}; let client = context.client; - + usersRepo.getUserBySciper = function (sciper, next) { client.executeQuery('(&(objectClass=posixAccount)(uniqueIdentifier=' + sciper + '))', userFactory, context.options.modelsMapper.user, true, next); }; diff --git a/viewModels/custom/modelsMapper.js b/viewModels/custom/modelsMapper.js index 513e0fe..cbdc7be 100644 --- a/viewModels/custom/modelsMapper.js +++ b/viewModels/custom/modelsMapper.js @@ -20,6 +20,6 @@ module.exports = function () { throw new Error("No schema for unit"); } } - + return mapper; } \ No newline at end of file diff --git a/viewModels/full/modelsMapper.js b/viewModels/full/modelsMapper.js index 2a24b6f..c19f163 100644 --- a/viewModels/full/modelsMapper.js +++ b/viewModels/full/modelsMapper.js @@ -2,14 +2,14 @@ module.exports = function () { let mapper = {}; - + mapper.user = function (inputModel) { return inputModel; } - + mapper.unit = function (inputModel) { return inputModel; } - + return mapper; } \ No newline at end of file diff --git a/viewModels/public/modelsMapper.js b/viewModels/public/modelsMapper.js index dd424bc..7a78531 100644 --- a/viewModels/public/modelsMapper.js +++ b/viewModels/public/modelsMapper.js @@ -3,7 +3,7 @@ module.exports = function () { let omapper = require('o-mapper'); let mapper = {}; - + mapper.user = function(inputModel) { let schema = { displayName: { @@ -22,10 +22,10 @@ module.exports = function () { key: 'accreds' } }; - + return omapper(inputModel, schema); } - + mapper.unit = function (inputModel) { let schema = { cn: { @@ -47,7 +47,7 @@ module.exports = function () { key: 'address' } }; - + return omapper(inputModel, schema); } From 9740adc411d4440283d95abd4460a6d909a2a1d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 12 Feb 2020 11:18:11 +0100 Subject: [PATCH 37/58] [FT.] Fix cache issues The cache wasn't taking into consideration the param "isResultUniq", meaning that getUser and getUsers would return the same data, regardless of the isResultUniq param that should either return an Array or a single result. --- client.js | 4 ++-- test/userTest.js | 9 +++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/client.js b/client.js index c8cd898..9e2cdda 100644 --- a/client.js +++ b/client.js @@ -58,11 +58,11 @@ module.exports = function ldapClient(context) { } client.executeQuery = function(ldapQuery, objectFactory, modelMapper, isResultUniq, next) { - context.memoryCache.get(ldapQuery, function (err, data) { + context.memoryCache.get(ldapQuery+isResultUniq, function (err, data) { if (!err) { if (data == undefined) { cacheQuery(ldapQuery, objectFactory, modelMapper, isResultUniq, function(err, data) { - context.memoryCache.set(ldapQuery, data, function (err, success) { + context.memoryCache.set(ldapQuery+isResultUniq, data, function (err, success) { if (!err && success) { next(null, data); } else { diff --git a/test/userTest.js b/test/userTest.js index 7006547..5876086 100644 --- a/test/userTest.js +++ b/test/userTest.js @@ -88,24 +88,21 @@ describe('Users::get', function () { it('getUsersBySciper should get Kermit La Grenouille', function (done) { fullLdapContext.users.getUsersBySciper(133134, function (err, data) { - // Note: it should be an array... - assert.equal(data.displayName, 'Kermit La Grenouille'); + assert.equal(data[0].displayName, 'Kermit La Grenouille'); done(); }); }); it('getUsersByName should get Kermit La Grenouille', function (done) { fullLdapContext.users.getUsersByName('Kermit La Grenouille', function (err, data) { - // Note: it should be an array... - assert.equal(data.displayName, 'Kermit La Grenouille'); + assert.equal(data[0].displayName, 'Kermit La Grenouille'); done(); }); }); it('getUsersByPhone should get 169419', function (done) { fullLdapContext.users.getUsersByPhone('35455', function (err, data) { - // Note: it should be an array... - assert.equal(data.sciper, '169419'); + assert.equal(data[0].sciper, '169419'); done(); }); }); From 36b51dd98a5758470a8318953383f3296520c507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 12 Feb 2020 11:23:24 +0100 Subject: [PATCH 38/58] [DOC] Better comments and OCD --- models/user.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/models/user.js b/models/user.js index 1d9dbd4..2236a9e 100644 --- a/models/user.js +++ b/models/user.js @@ -10,9 +10,8 @@ module.exports = function User(ldapUserArray) { userModel.accreds = Array(); userModel.memberOf = Array(); userModel.photoUrl = 'http://people.epfl.ch/cgi-bin/people/getPhoto?id=' + userModel.sciper; - + if (ldapUserArray[0].memberOf !== undefined) { - // Note: if only one group, typeof string // if groups, typeof object. // Username banla have only one group @@ -25,12 +24,11 @@ module.exports = function User(ldapUserArray) { userModel.memberOf = ldapUserArray[0].memberOf; } } - + ldapUserArray.map(function (userEntry) { if (userEntry.mail != undefined) { if (userEntry.mail instanceof Array) { - // @stefanonepa suggestion's: - // https://github.com/stefanonepa/epfl-ldap/pull/4#discussion_r375255479 + // This remove duplicated entries and allow more than one email userModel.emails = [...new Set(userEntry.mail)]; } else { userModel.emails.push(userEntry.mail); @@ -49,8 +47,8 @@ module.exports = function User(ldapUserArray) { } ); }); - - //All ldap properties + + // All ldap properties userModel.optionalProperties = ldapUserArray; return userModel; From e7d00c8b811c32ef66e149a11198f7fa7667cf40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 12 Feb 2020 12:57:39 +0100 Subject: [PATCH 39/58] [FIX] WARNING! node-cache legacy callback support will drop in v6.x Close #3 * Get rid of cache callbacks * Use the same context for all the tests --- client.js | 30 ++++++++++++------------------ context.js | 12 +++++++----- test/init.js | 10 ++++++---- test/unitTest.js | 18 ++++++++---------- test/userTest.js | 34 +++++++++++++++++----------------- 5 files changed, 50 insertions(+), 54 deletions(-) diff --git a/client.js b/client.js index 9e2cdda..1763211 100644 --- a/client.js +++ b/client.js @@ -57,26 +57,20 @@ module.exports = function ldapClient(context) { }); } - client.executeQuery = function(ldapQuery, objectFactory, modelMapper, isResultUniq, next) { - context.memoryCache.get(ldapQuery+isResultUniq, function (err, data) { - if (!err) { - if (data == undefined) { - cacheQuery(ldapQuery, objectFactory, modelMapper, isResultUniq, function(err, data) { - context.memoryCache.set(ldapQuery+isResultUniq, data, function (err, success) { - if (!err && success) { - next(null, data); - } else { - next({ Error: "aararrggghhh!" }, null); - } - }); - }); - } else { + client.executeQuery = function(ldapQuery, objectFactory, modelMapper, isResultUniq, next) { + let data = context.memoryCache.get(ldapQuery+isResultUniq) + if (data == undefined) { + cacheQuery(ldapQuery, objectFactory, modelMapper, isResultUniq, function(err, data) { + let success = context.memoryCache.set(ldapQuery+isResultUniq, data); + if (success) { next(null, data); + } else { + next({ Error: "Error setting cache" }, null); } - } else { - next({ Error: "aararrggghhh!" }, null); - } - }); + }); + } else { + next(null, data); + } }; return client; diff --git a/context.js b/context.js index b09fba1..2620a49 100644 --- a/context.js +++ b/context.js @@ -1,6 +1,6 @@ 'use strict'; +let NodeCache = require("node-cache"); module.exports = function ldapContext(options) { - let NodeCache = require("node-cache"); let context = {}; context.client = require('./client')(context); context.options = require('./options')(); @@ -8,10 +8,12 @@ module.exports = function ldapContext(options) { context.units = require('./repositories/units')(context); context.viewModelsMappers = require('./viewModels/mappers')(); - if (options == undefined || options.memoryCache == undefined ) { - context.memoryCache = new NodeCache({ stdTTL: 14400, enableLegacyCallbacks: true }); // 4 hour of cache - } else { - context.memoryCache = new NodeCache(options.memoryCache); + if (context.memoryCache == undefined) { + if (options == undefined || options.memoryCache == undefined ) { + context.memoryCache = new NodeCache({ stdTTL: 14400 }); // 4 hour of cache + } else { + context.memoryCache = new NodeCache(options.memoryCache); + } } return context; }; \ No newline at end of file diff --git a/test/init.js b/test/init.js index 0ed348e..e2331b7 100644 --- a/test/init.js +++ b/test/init.js @@ -1,11 +1,13 @@ before(function() { - //console.log('before test in every file'); + // console.log('before test in every file'); + var fullLdapContext = require('../context')(); + fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; + // create a context for all the test, allowing to create/remove cache + this.fullLdapContext = fullLdapContext; }); - beforeEach(function() { // Be sure to clear the cache before the tests... // console.log('clearing cache...'); - var fullLdapContext = require('../context')(); - fullLdapContext.memoryCache.flushAll(); + this.fullLdapContext.memoryCache.flushAll(); }); diff --git a/test/unitTest.js b/test/unitTest.js index c5cb69d..d6774a8 100644 --- a/test/unitTest.js +++ b/test/unitTest.js @@ -1,32 +1,30 @@ var assert = require('assert'); -var fullLdapContext = require('../context')(); -fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; describe('Units::get', function () { it('get unit by id', function(done) { - fullLdapContext.units.getUnitById('1906', function (err, data) { + this.fullLdapContext.units.getUnitById('1906', function (err, data) { assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); done(); }); }); - + it('get unit by accounting number', function (done) { - fullLdapContext.units.getUnitByAccountingNumber('1906', function (err, data) { + this.fullLdapContext.units.getUnitByAccountingNumber('1906', function (err, data) { assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); done(); }); }); - + it('get unit by unique identifier', function (done) { - fullLdapContext.units.getUnitByUniqueIdentifier(13030, function (err, data) { + this.fullLdapContext.units.getUnitByUniqueIdentifier(13030, function (err, data) { assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); done(); }); }); - + it('get unit by name', function (done) { - fullLdapContext.units.getUnitByName("SI - Full-Stack Development", function (err, data) { + this.fullLdapContext.units.getUnitByName("SI - Full-Stack Development", function (err, data) { assert.ok(data.uniqueIdentifier === '13030', "Unit unique identifier"); done(); }); @@ -37,7 +35,7 @@ describe('Units::get', function () { describe('Units::search', function () { it('search unit by name', function (done) { - fullLdapContext.units.searchUnitByName("Full-Stack Development", function (err, data) { + this.fullLdapContext.units.searchUnitByName("Full-Stack Development", function (err, data) { assert.ok(data[0].uniqueIdentifier === '13030', "Unit unique identifier"); done(); }); diff --git a/test/userTest.js b/test/userTest.js index 5876086..279804c 100644 --- a/test/userTest.js +++ b/test/userTest.js @@ -1,46 +1,46 @@ var assert = require('assert'); -var fullLdapContext = require('../context')(); -fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; +// var fullLdapContext = require('../context')(); +// fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; describe('User::get', function () { it('getUserBySciper should get Kermit La Grenouille', function (done) { - fullLdapContext.users.getUserBySciper(133134, function (err, data) { + this.fullLdapContext.users.getUserBySciper(133134, function (err, data) { assert.equal(data.displayName, "Kermit La Grenouille"); done(); }); }); it('getUserBySciper should handle users with two email', function(done) { - fullLdapContext.users.getUserBySciper(162314, function (err, data) { + this.fullLdapContext.users.getUserBySciper(162314, function (err, data) { assert.ok(data.emails.length === 2, "User have 2 email"); done(); }); }); it('getUserBySciper should return correct email length', function (done) { - fullLdapContext.users.getUserBySciper(169419, function (err, data) { + this.fullLdapContext.users.getUserBySciper(169419, function (err, data) { assert.ok(data.emails[0].length === 23, "Email adresse has the correct length"); done(); }); }); it('getUserByName should find Kermit La Grenouille', function (done) { - fullLdapContext.users.getUserByName('Kermit La Grenouille', function (err, data) { + this.fullLdapContext.users.getUserByName('Kermit La Grenouille', function (err, data) { assert.equal(data.displayName, 'Kermit La Grenouille'); done(); }); }); it('getUserByPhone should find 169419', function (done) { - fullLdapContext.users.getUserByPhone('+41 21 6935455', function (err, data) { + this.fullLdapContext.users.getUserByPhone('+41 21 6935455', function (err, data) { assert.equal(data.sciper, '169419'); done(); }); }); it('getUserByPhone should find 169419', function (done) { - fullLdapContext.users.getUserByPhone('35455', function (err, data) { + this.fullLdapContext.users.getUserByPhone('35455', function (err, data) { assert.equal(data.sciper, '169419'); done(); }); @@ -48,7 +48,7 @@ describe('User::get', function () { // Watch out: user with guest account on their EPFL email can appear first. it('getUserByMail should find 188475', function (done) { - fullLdapContext.users.getUserByMail('gregory.charmier@epfl.ch', function (err, data) { + this.fullLdapContext.users.getUserByMail('gregory.charmier@epfl.ch', function (err, data) { assert.equal(data.sciper, '188475'); done(); }); @@ -59,21 +59,21 @@ describe('User::get', function () { describe('User::search', function () { it('searchUserByName should search Kermit La Grenouille', function (done) { - fullLdapContext.users.searchUserByName('Kermit', function (err, data) { + this.fullLdapContext.users.searchUserByName('Kermit', function (err, data) { assert.equal(data[0].displayName, 'Kermit La Grenouille'); done(); }); }); it('searchUserByPhone should return 169419', function (done) { - fullLdapContext.users.searchUserByPhone('35455', function (err, data) { + this.fullLdapContext.users.searchUserByPhone('35455', function (err, data) { assert.equal(data[0].sciper, '169419'); done(); }); }); it('searchUserByUnitAcronym should search all members of IDEV-F*, including Kermit', function (done) { - fullLdapContext.users.searchUserByUnitAcronym('IDEV-F', function (err, data) { + this.fullLdapContext.users.searchUserByUnitAcronym('IDEV-F', function (err, data) { let k = data.filter(obj => { return obj.displayName === 'Kermit La Grenouille'; }) @@ -87,35 +87,35 @@ describe('User::search', function () { describe('Users::get', function () { it('getUsersBySciper should get Kermit La Grenouille', function (done) { - fullLdapContext.users.getUsersBySciper(133134, function (err, data) { + this.fullLdapContext.users.getUsersBySciper(133134, function (err, data) { assert.equal(data[0].displayName, 'Kermit La Grenouille'); done(); }); }); it('getUsersByName should get Kermit La Grenouille', function (done) { - fullLdapContext.users.getUsersByName('Kermit La Grenouille', function (err, data) { + this.fullLdapContext.users.getUsersByName('Kermit La Grenouille', function (err, data) { assert.equal(data[0].displayName, 'Kermit La Grenouille'); done(); }); }); it('getUsersByPhone should get 169419', function (done) { - fullLdapContext.users.getUsersByPhone('35455', function (err, data) { + this.fullLdapContext.users.getUsersByPhone('35455', function (err, data) { assert.equal(data[0].sciper, '169419'); done(); }); }); it('getUsersByMail should find 169419', function (done) { - fullLdapContext.users.getUsersByMail('nicolas.borboen@epfl.ch', function (err, data) { + this.fullLdapContext.users.getUsersByMail('nicolas.borboen@epfl.ch', function (err, data) { assert.equal(data[0].sciper, '169419'); done(); }); }); it('getUsersByUnitAcronym should search all members of IDEV-FSD, including Kermit', function (done) { - fullLdapContext.users.getUsersByUnitAcronym('IDEV-FSD', function (err, data) { + this.fullLdapContext.users.getUsersByUnitAcronym('IDEV-FSD', function (err, data) { let k = data.filter(obj => { return obj.displayName === 'Kermit La Grenouille'; }) From 25231c634a154712f1648144bc909bdf26a3e8be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 12 Feb 2020 14:59:07 +0100 Subject: [PATCH 40/58] =?UTF-8?q?[RFA]=20epfl-idevelop=20=E2=86=92=20epfl-?= =?UTF-8?q?si?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 3486918..e763a92 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.9.0", "description": "epfl-ldap", "main": "context.js", - "homepage": "https://github.com/epfl-idevelop/epfl-ldap-js", + "homepage": "https://github.com/epfl-si/epfl-ldap-js", "author": "stefanonepa, idev-fsd", "dependencies": { "ldapjs": "^1.0.2", @@ -15,14 +15,14 @@ "mocha": "*" }, "bugs": { - "url": "https://github.com/epfl-idevelop/epfl-ldap-js/issues" + "url": "https://github.com/epfl-si/epfl-ldap-js/issues" }, "directories": { "test": "test" }, "repository": { "type": "git", - "url": "git+https://github.com/epfl-idevelop/epfl-ldap-js.git" + "url": "git+https://github.com/epfl-si/epfl-ldap-js.git" }, "keywords": [ "epfl", From 67e905bace774d70aafe1d48742bc29ceb5f582d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Tue, 3 Mar 2020 13:53:36 +0100 Subject: [PATCH 41/58] Closes the LDAP connection --- client.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client.js b/client.js index 1763211..df6c1aa 100644 --- a/client.js +++ b/client.js @@ -71,6 +71,9 @@ module.exports = function ldapClient(context) { } else { next(null, data); } + // Closes the LDAP connection + client.unbind(); + client.destroy(); }; return client; From be25ea6d6d447a33d544fbad85c2cda598effc15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Tue, 3 Mar 2020 14:01:38 +0100 Subject: [PATCH 42/58] Closes the LDAP connection --- client.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client.js b/client.js index 1763211..df6c1aa 100644 --- a/client.js +++ b/client.js @@ -71,6 +71,9 @@ module.exports = function ldapClient(context) { } else { next(null, data); } + // Closes the LDAP connection + client.unbind(); + client.destroy(); }; return client; From 5c22053b28685ab169c0582cf6ba74bb815553aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Tue, 3 Mar 2020 16:03:52 +0100 Subject: [PATCH 43/58] Rename cacheQuery to _executeQuery + hoist to top level --- client.js | 102 ++++++++++++++++++++++++++---------------------------- 1 file changed, 50 insertions(+), 52 deletions(-) diff --git a/client.js b/client.js index df6c1aa..887e2ba 100644 --- a/client.js +++ b/client.js @@ -1,5 +1,53 @@ 'use strict'; +function _executeQuery(client, searchBase, ldapQuery, objectFactory, modelMapper, isResultUniq, next) { + let opts = { + filter: ldapQuery, + scope: 'sub' + }; + + client.search(searchBase, opts, function (err, ldapRes) { + let groupedObject = {}; + + ldapRes.on('searchEntry', function (entry) { + if (typeof entry.json != 'undefined') { + let objectIdentifier = entry.object.uniqueIdentifier; + if (groupedObject[objectIdentifier] === undefined) { + groupedObject[objectIdentifier] = Array(); + } + groupedObject[objectIdentifier].push(entry.object); + } else { + next(null, groupedObject); + } + }); + ldapRes.on('searchReference', function (referral) { + //console.log('referral: ' + referral.uris.join()); + }); + ldapRes.on('error', function (err) { + console.error('error: ' + err.message); + next(err, null); + }); + ldapRes.on('timeout', function (err) { + console.error('error: ' + err.message); + next(err, null); + }); + ldapRes.on('end', function () { + let objectsGroup = Array(); + + for (let userEntry in groupedObject) { + if (groupedObject.hasOwnProperty(userEntry)) { + if (isResultUniq) { + objectsGroup = modelMapper(objectFactory(groupedObject[userEntry])); + } else { + objectsGroup.push(modelMapper(objectFactory(groupedObject[userEntry]))); + } + } + } + next(null, objectsGroup); + }); + }); +} + module.exports = function ldapClient(context) { let ldap = require('ldapjs'); @@ -9,58 +57,11 @@ module.exports = function ldapClient(context) { sizeLimit: 10 }); - function cacheQuery(ldapQuery, objectFactory, modelMapper, isResultUniq, next) { - let opts = { - filter: ldapQuery, - scope: 'sub' - }; - - client.search(context.options.searchBase, opts, function (err, ldapRes) { - let groupedObject = {}; - - ldapRes.on('searchEntry', function (entry) { - if (typeof entry.json != 'undefined') { - let objectIdentifier = entry.object.uniqueIdentifier; - if (groupedObject[objectIdentifier] === undefined) { - groupedObject[objectIdentifier] = Array(); - } - groupedObject[objectIdentifier].push(entry.object); - } else { - next(null, groupedObject); - } - }); - ldapRes.on('searchReference', function (referral) { - //console.log('referral: ' + referral.uris.join()); - }); - ldapRes.on('error', function (err) { - console.error('error: ' + err.message); - next(err, null); - }); - ldapRes.on('timeout', function (err) { - console.error('error: ' + err.message); - next(err, null); - }); - ldapRes.on('end', function () { - let objectsGroup = Array(); - - for (let userEntry in groupedObject) { - if (groupedObject.hasOwnProperty(userEntry)) { - if (isResultUniq) { - objectsGroup = modelMapper(objectFactory(groupedObject[userEntry])); - } else { - objectsGroup.push(modelMapper(objectFactory(groupedObject[userEntry]))); - } - } - } - next(null, objectsGroup); - }); - }); - } - client.executeQuery = function(ldapQuery, objectFactory, modelMapper, isResultUniq, next) { let data = context.memoryCache.get(ldapQuery+isResultUniq) if (data == undefined) { - cacheQuery(ldapQuery, objectFactory, modelMapper, isResultUniq, function(err, data) { + let searchBase = context.options.searchBase; + _executeQuery(client, searchBase, ldapQuery, objectFactory, modelMapper, isResultUniq, function(err, data) { let success = context.memoryCache.set(ldapQuery+isResultUniq, data); if (success) { next(null, data); @@ -71,9 +72,6 @@ module.exports = function ldapClient(context) { } else { next(null, data); } - // Closes the LDAP connection - client.unbind(); - client.destroy(); }; return client; From edc8f6d57a7af3ed3aa7809513013bba187c5ada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Tue, 3 Mar 2020 16:14:23 +0100 Subject: [PATCH 44/58] Refactor to extract uniqueness logic --- client.js | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/client.js b/client.js index 887e2ba..7d65893 100644 --- a/client.js +++ b/client.js @@ -1,6 +1,7 @@ 'use strict'; -function _executeQuery(client, searchBase, ldapQuery, objectFactory, modelMapper, isResultUniq, next) { + +function _executeQuery(client, searchBase, ldapQuery, next) { let opts = { filter: ldapQuery, scope: 'sub' @@ -32,18 +33,8 @@ function _executeQuery(client, searchBase, ldapQuery, objectFactory, modelMapper next(err, null); }); ldapRes.on('end', function () { - let objectsGroup = Array(); - - for (let userEntry in groupedObject) { - if (groupedObject.hasOwnProperty(userEntry)) { - if (isResultUniq) { - objectsGroup = modelMapper(objectFactory(groupedObject[userEntry])); - } else { - objectsGroup.push(modelMapper(objectFactory(groupedObject[userEntry]))); - } - } - } - next(null, objectsGroup); + + next(null, groupedObject); }); }); } @@ -58,19 +49,32 @@ module.exports = function ldapClient(context) { }); client.executeQuery = function(ldapQuery, objectFactory, modelMapper, isResultUniq, next) { - let data = context.memoryCache.get(ldapQuery+isResultUniq) - if (data == undefined) { + let objectsGroup = context.memoryCache.get(ldapQuery+isResultUniq) + if (objectsGroup == undefined) { let searchBase = context.options.searchBase; - _executeQuery(client, searchBase, ldapQuery, objectFactory, modelMapper, isResultUniq, function(err, data) { - let success = context.memoryCache.set(ldapQuery+isResultUniq, data); + _executeQuery(client, searchBase, ldapQuery, function(err, data) { + + let objectsGroup = Array(); + + for (let userEntry in data) { + if (data.hasOwnProperty(userEntry)) { + if (isResultUniq) { + objectsGroup = modelMapper(objectFactory(data[userEntry])); + } else { + objectsGroup.push(modelMapper(objectFactory(data[userEntry]))); + } + } + } + + let success = context.memoryCache.set(ldapQuery+isResultUniq, objectsGroup); if (success) { - next(null, data); + next(null, objectsGroup); } else { next({ Error: "Error setting cache" }, null); } }); } else { - next(null, data); + next(null, objectsGroup); } }; From 7b5668cf08df52b18fd346834efdc0de79fcec8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Tue, 3 Mar 2020 16:27:14 +0100 Subject: [PATCH 45/58] convert next() to Promise --- client.js | 82 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 47 insertions(+), 35 deletions(-) diff --git a/client.js b/client.js index 7d65893..9325379 100644 --- a/client.js +++ b/client.js @@ -1,43 +1,55 @@ 'use strict'; +function _executeQuery(client, searchBase, ldapQuery, next) { + _executeQueryPromise(client, searchBase, ldapQuery).then( + (data) => { + next(null, data); + } + ).catch( + (err) => { + next(err, null); + } + ) +} -function _executeQuery(client, searchBase, ldapQuery, next) { - let opts = { - filter: ldapQuery, - scope: 'sub' - }; - - client.search(searchBase, opts, function (err, ldapRes) { - let groupedObject = {}; +function _executeQueryPromise(client, searchBase, ldapQuery) { + let opts = { + filter: ldapQuery, + scope: 'sub' + }; - ldapRes.on('searchEntry', function (entry) { - if (typeof entry.json != 'undefined') { - let objectIdentifier = entry.object.uniqueIdentifier; - if (groupedObject[objectIdentifier] === undefined) { - groupedObject[objectIdentifier] = Array(); - } - groupedObject[objectIdentifier].push(entry.object); - } else { - next(null, groupedObject); - } - }); - ldapRes.on('searchReference', function (referral) { - //console.log('referral: ' + referral.uris.join()); - }); - ldapRes.on('error', function (err) { - console.error('error: ' + err.message); - next(err, null); - }); - ldapRes.on('timeout', function (err) { - console.error('error: ' + err.message); - next(err, null); - }); - ldapRes.on('end', function () { - - next(null, groupedObject); - }); - }); + return new Promise((resolve, reject) => { + client.search(searchBase, opts, function (err, ldapRes) { + let groupedObject = {}; + ldapRes.on('searchEntry', function (entry) { + if (typeof entry.json != 'undefined') { + let objectIdentifier = entry.object.uniqueIdentifier; + if (groupedObject[objectIdentifier] === undefined) { + groupedObject[objectIdentifier] = Array(); + } + groupedObject[objectIdentifier].push(entry.object); + } else { + resolve(groupedObject); + } + }); + ldapRes.on('searchReference', function (referral) { + //console.log('referral: ' + referral.uris.join()); + }); + ldapRes.on('error', function (err) { + console.error('error: ' + err.message); + reject(err); + }); + ldapRes.on('timeout', function (err) { + console.error('error: ' + err.message); + reject(err); + }); + ldapRes.on('end', function () { + resolve(groupedObject); + }); + }); + }); } + module.exports = function ldapClient(context) { From 21fc9b2e81746b323bc32b6b4781058e38a9d772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Tue, 3 Mar 2020 16:51:44 +0100 Subject: [PATCH 46/58] [refactor] extract ldapjs-promise.js --- client.js | 47 +++++++---------------------------------------- ldapjs-promise.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 40 deletions(-) create mode 100644 ldapjs-promise.js diff --git a/client.js b/client.js index 9325379..f6e2ca8 100644 --- a/client.js +++ b/client.js @@ -1,5 +1,7 @@ 'use strict'; +const _executeQueryPromise = require('./ldapjs-promise'); + function _executeQuery(client, searchBase, ldapQuery, next) { _executeQueryPromise(client, searchBase, ldapQuery).then( (data) => { @@ -12,45 +14,6 @@ function _executeQuery(client, searchBase, ldapQuery, next) { ) } -function _executeQueryPromise(client, searchBase, ldapQuery) { - let opts = { - filter: ldapQuery, - scope: 'sub' - }; - - return new Promise((resolve, reject) => { - client.search(searchBase, opts, function (err, ldapRes) { - let groupedObject = {}; - ldapRes.on('searchEntry', function (entry) { - if (typeof entry.json != 'undefined') { - let objectIdentifier = entry.object.uniqueIdentifier; - if (groupedObject[objectIdentifier] === undefined) { - groupedObject[objectIdentifier] = Array(); - } - groupedObject[objectIdentifier].push(entry.object); - } else { - resolve(groupedObject); - } - }); - ldapRes.on('searchReference', function (referral) { - //console.log('referral: ' + referral.uris.join()); - }); - ldapRes.on('error', function (err) { - console.error('error: ' + err.message); - reject(err); - }); - ldapRes.on('timeout', function (err) { - console.error('error: ' + err.message); - reject(err); - }); - ldapRes.on('end', function () { - resolve(groupedObject); - }); - }); - }); -} - - module.exports = function ldapClient(context) { let ldap = require('ldapjs'); @@ -64,7 +27,11 @@ module.exports = function ldapClient(context) { let objectsGroup = context.memoryCache.get(ldapQuery+isResultUniq) if (objectsGroup == undefined) { let searchBase = context.options.searchBase; - _executeQuery(client, searchBase, ldapQuery, function(err, data) { + let opts = { + filter: ldapQuery, + scope: 'sub' + }; + _executeQuery(client, searchBase, opts, function(err, data) { let objectsGroup = Array(); diff --git a/ldapjs-promise.js b/ldapjs-promise.js new file mode 100644 index 0000000..b02772e --- /dev/null +++ b/ldapjs-promise.js @@ -0,0 +1,32 @@ +module.exports = function _executeQueryPromise(client, searchBase, opts) { + return new Promise((resolve, reject) => { + client.search(searchBase, opts, function (err, ldapRes) { + let groupedObject = {}; + ldapRes.on('searchEntry', function (entry) { + if (typeof entry.json != 'undefined') { + let objectIdentifier = entry.object.uniqueIdentifier; + if (groupedObject[objectIdentifier] === undefined) { + groupedObject[objectIdentifier] = Array(); + } + groupedObject[objectIdentifier].push(entry.object); + } else { + resolve(groupedObject); + } + }); + ldapRes.on('searchReference', function (referral) { + //console.log('referral: ' + referral.uris.join()); + }); + ldapRes.on('error', function (err) { + console.error('error: ' + err.message); + reject(err); + }); + ldapRes.on('timeout', function (err) { + console.error('error: ' + err.message); + reject(err); + }); + ldapRes.on('end', function () { + resolve(groupedObject); + }); + }); + }); +} \ No newline at end of file From 8f37efc5d49a5ef6f493880f93ffe9d5129ea414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Wed, 4 Mar 2020 10:03:25 +0100 Subject: [PATCH 47/58] tiny improvements --- test.js | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 test.js diff --git a/test.js b/test.js new file mode 100644 index 0000000..ea52b88 --- /dev/null +++ b/test.js @@ -0,0 +1,114 @@ +const PSemaphore = require('promise-semaphore'); +const ldap = require('ldapjs'); +const executeQueryPromise = require('./ldapjs-promise'); + +class ConnectionPool { + + constructor(n, create, destroy) { + this.roomsLength = n; + this.pSemaphore = new PSemaphore({rooms: this.roomsLength}); + this.create = create; + this.destroy = destroy; + this.rooms = [ + //{ free: false, client: null} + ]; + } + + add(f) { + return this.pSemaphore.add(() => { + let client = this._get(); + try { + return f(client); + } finally { + this._put(client); + } + }); + } + + _get() { + for(let i=0; i < this.roomsLength; i++) { + if (!this.rooms[i]) { + this.rooms[i] = { + free: true, + client: this.create() + } + } + // Room is furnished + if (this.rooms[i].free) { + this.rooms[i].free = false; + return this.rooms[i].client; + } else { + // continue + } + } + } + + _put(client) { + this.rooms.forEach(room => { + if (room.client === client) { + room.free = true; + } + }) + } + + close() { + this.rooms.forEach(room => { + this.destroy(room.client); + }) + } +} + +const pool = new ConnectionPool( + 3, + () =>ldap.createClient({ + url: 'ldap://ldap.epfl.ch', + timeLimit: 1, + sizeLimit: 10 + }), + (client) => client.unbind() +); + +sleep = (secondes) => { + return new Promise((resolve,reject) => { + setTimeout(() => resolve(), secondes*1000); + }) +} + +doSomething = async(client, mail) => +{ + let opts = { + filter: `(&(mail=${mail}@epfl.ch))`, + scope: 'sub', + }; + await sleep(1); + let result = await executeQueryPromise(client, "o=epfl,c=ch", opts); + console.log(result); +} + +pool.add(function(client) { + return doSomething(client, "gregory.charmier"); +}).then(function(){ console.log("job 1 done")}) + +pool.add(function(client) { + return doSomething(client, "dominique.quatravaux"); +}).then(function(){ console.log("job 2 done")}) + +pool.add(function(client) { + return doSomething(client, "nicolas.borboen"); +}).then(function(){ console.log("job 3 done")}) + +pool.add(function(client) { + return doSomething(client, "julien.delasoie"); +}).then(function(){ console.log("job 4 done")}) + +pool.add(function(client) { + return doSomething(client, "christian.zufferey"); +}).then(function(){ console.log("job 5 done")}) + +pool.add(function(client) { + return doSomething(client, "nicolas.reymond"); +}).then(function(){ console.log("job 6 done")}) + +pool.add(function() { + return pool.close(); +}).then(function(){ console.log("Close all LDAP connections")}) From bc794bb8b23a122009a76de7b134f290aa93fe77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 4 Mar 2020 10:55:02 +0100 Subject: [PATCH 48/58] [refactor] Export the ConnectionPool class * clean up the test.js * improve the package.json script --- connection-pool.js | 60 ++++++++++++++++ package-lock.json | 172 +++++++++++++++++++++++++++++++++++++++++++-- package.json | 9 ++- test.js | 62 ++-------------- 4 files changed, 237 insertions(+), 66 deletions(-) create mode 100644 connection-pool.js diff --git a/connection-pool.js b/connection-pool.js new file mode 100644 index 0000000..5169971 --- /dev/null +++ b/connection-pool.js @@ -0,0 +1,60 @@ +const debug = require('debug')('connection-pool'); +const PSemaphore = require('promise-semaphore'); + +module.exports = class ConnectionPool { + + constructor(n, create, destroy) { + this.roomsLength = n; + this.pSemaphore = new PSemaphore({rooms: this.roomsLength}); + this.create = create; + this.destroy = destroy; + this.rooms = [ + //{ free: false, client: null} + ]; + } + + add(f) { + return this.pSemaphore.add(async () => { + debug("GET"); + let client = this._get(); + try { + return await f(client); + } finally { + debug("PUT"); + this._put(client); + } + }); + } + + _get() { + for(let i=0; i < this.roomsLength; i++) { + if (!this.rooms[i]) { + this.rooms[i] = { + free: true, + client: this.create() + } + } + // Room is furnished + if (this.rooms[i].free) { + this.rooms[i].free = false; + return this.rooms[i].client; + } else { + // continue + } + } + } + + _put(client) { + this.rooms.forEach(room => { + if (room.client === client) { + room.free = true; + } + }) + } + + close() { + this.rooms.forEach(room => { + this.destroy(room.client); + }) + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index db212e4..5f65594 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "epfl-ldap", - "version": "0.6.0", + "version": "0.9.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -271,10 +271,9 @@ "dev": true }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } @@ -777,6 +776,15 @@ "yargs-unparser": "1.6.0" }, "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -808,8 +816,7 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, "mv": { "version": "2.1.1", @@ -951,6 +958,157 @@ "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" }, + "promise-semaphore": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/promise-semaphore/-/promise-semaphore-0.2.8.tgz", + "integrity": "sha1-x+O1Vr2YIE5rzHHZTQ3m350rAlo=", + "requires": { + "bluebird": "^3.3.1" + }, + "dependencies": { + "assertion-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.1.tgz", + "integrity": "sha1-NaruwzCX8R9COZ7K3zP6zNJ/XEw=" + }, + "bluebird": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.1.tgz", + "integrity": "sha1-+Xrhlw9B2FF3KDBT6aEgFg5mxh0=" + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" + } + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=" + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=" + }, + "glob": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", + "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", + "requires": { + "graceful-fs": "~2.0.0", + "inherits": "2", + "minimatch": "~0.2.11" + } + }, + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + }, + "growl": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz", + "integrity": "sha1-Sy3sjZB+k9szZiTc7AGDUC+MlCg=" + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=" + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" + } + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=" + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" + } + } + }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", diff --git a/package.json b/package.json index e763a92..de54a48 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,11 @@ "homepage": "https://github.com/epfl-si/epfl-ldap-js", "author": "stefanonepa, idev-fsd", "dependencies": { + "debug": "^4.1.1", "ldapjs": "^1.0.2", "node-cache": "^5.1.0", - "o-mapper": "^1.0.0" + "o-mapper": "^1.0.0", + "promise-semaphore": "^0.2.8" }, "devDependencies": { "jshint": "^2.11.0", @@ -30,6 +32,9 @@ ], "license": "ISC", "scripts": { - "test": "mocha --exit" + "test": "mocha --exit", + "sample1": "node samples/sample-getUnit.js", + "sample2": "node samples/sample-getUserBySciper.js", + "debug": "DEBUG=test,connection-pool node test.js" } } diff --git a/test.js b/test.js index ea52b88..aebde5a 100644 --- a/test.js +++ b/test.js @@ -1,62 +1,9 @@ -const PSemaphore = require('promise-semaphore'); +const debug = require('debug')('test'); + +const ConnectionPool = require('./connection-pool.js'); const ldap = require('ldapjs'); const executeQueryPromise = require('./ldapjs-promise'); -class ConnectionPool { - - constructor(n, create, destroy) { - this.roomsLength = n; - this.pSemaphore = new PSemaphore({rooms: this.roomsLength}); - this.create = create; - this.destroy = destroy; - this.rooms = [ - //{ free: false, client: null} - ]; - } - - add(f) { - return this.pSemaphore.add(() => { - let client = this._get(); - try { - return f(client); - } finally { - this._put(client); - } - }); - } - - _get() { - for(let i=0; i < this.roomsLength; i++) { - if (!this.rooms[i]) { - this.rooms[i] = { - free: true, - client: this.create() - } - } - // Room is furnished - if (this.rooms[i].free) { - this.rooms[i].free = false; - return this.rooms[i].client; - } else { - // continue - } - } - } - - _put(client) { - this.rooms.forEach(room => { - if (room.client === client) { - room.free = true; - } - }) - } - - close() { - this.rooms.forEach(room => { - this.destroy(room.client); - }) - } -} const pool = new ConnectionPool( 3, @@ -80,7 +27,8 @@ doSomething = async(client, mail) => filter: `(&(mail=${mail}@epfl.ch))`, scope: 'sub', }; - await sleep(1); + await sleep(4); + debug("Slept..."); let result = await executeQueryPromise(client, "o=epfl,c=ch", opts); console.log(result); } From 6a6cd2bb567afe7b863262718027d733068ac2f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 4 Mar 2020 10:55:25 +0100 Subject: [PATCH 49/58] [refactor] uses the connectionPool in client.js --- client.js | 101 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 36 deletions(-) diff --git a/client.js b/client.js index f6e2ca8..2a40fcc 100644 --- a/client.js +++ b/client.js @@ -1,59 +1,88 @@ 'use strict'; const _executeQueryPromise = require('./ldapjs-promise'); +const ConnectionPool = require('./connection-pool.js'); function _executeQuery(client, searchBase, ldapQuery, next) { _executeQueryPromise(client, searchBase, ldapQuery).then( - (data) => { + (data) => { next(null, data); } ).catch( - (err) => { + (err) => { next(err, null); } ) } +function _executeQueryInPool(pool, searchBase, ldapQuery, next) { + pool.add(function(client) { + _executeQueryPromise(client, searchBase, ldapQuery) + .then( + (data) => { + next(null, data); + } + ) + .catch( + (err) => { + next(err, null); + } + ) + }); +} + +function createPool (clientFactory, opts) { + const pool = new ConnectionPool( + opts.poolSize, + clientFactory, + (client) => client.unbind() + ); + return pool; // TODO: improve +} module.exports = function ldapClient(context) { let ldap = require('ldapjs'); - let client = ldap.createClient({ - url: 'ldap://ldap.epfl.ch', - timeLimit: 1, - sizeLimit: 10 - }); - - client.executeQuery = function(ldapQuery, objectFactory, modelMapper, isResultUniq, next) { - let objectsGroup = context.memoryCache.get(ldapQuery+isResultUniq) - if (objectsGroup == undefined) { - let searchBase = context.options.searchBase; - let opts = { - filter: ldapQuery, - scope: 'sub' - }; - _executeQuery(client, searchBase, opts, function(err, data) { - - let objectsGroup = Array(); - - for (let userEntry in data) { - if (data.hasOwnProperty(userEntry)) { - if (isResultUniq) { - objectsGroup = modelMapper(objectFactory(data[userEntry])); - } else { - objectsGroup.push(modelMapper(objectFactory(data[userEntry]))); + let pool = createPool(() => ldap.createClient({ + url: 'ldap://ldap.epfl.ch', + timeLimit: 1, + sizeLimit: 10 + }), + { poolSize : context.poolSize || 3 } + ); + + const client = { + executeQuery: function(ldapQuery, objectFactory, modelMapper, isResultUniq, next) { + let objectsGroup = context.memoryCache.get(ldapQuery+isResultUniq) + if (objectsGroup == undefined) { + let searchBase = context.options.searchBase; + let opts = { + filter: ldapQuery, + scope: 'sub' + }; + _executeQueryInPool(pool, searchBase, opts, function(err, data) { + + let objectsGroup = Array(); + + for (let userEntry in data) { + if (data.hasOwnProperty(userEntry)) { + if (isResultUniq) { + objectsGroup = modelMapper(objectFactory(data[userEntry])); + } else { + objectsGroup.push(modelMapper(objectFactory(data[userEntry]))); + } } } - } - let success = context.memoryCache.set(ldapQuery+isResultUniq, objectsGroup); - if (success) { - next(null, objectsGroup); - } else { - next({ Error: "Error setting cache" }, null); - } - }); - } else { - next(null, objectsGroup); + let success = context.memoryCache.set(ldapQuery+isResultUniq, objectsGroup); + if (success) { + next(null, objectsGroup); + } else { + next({ Error: "Error setting cache" }, null); + } + }); + } else { + next(null, objectsGroup); + } } }; From 42c9cca8e14826d981eaba56908e50ae1387e499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 4 Mar 2020 11:00:21 +0100 Subject: [PATCH 50/58] [remove] dead code --- client.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/client.js b/client.js index 2a40fcc..86e8695 100644 --- a/client.js +++ b/client.js @@ -3,17 +3,6 @@ const _executeQueryPromise = require('./ldapjs-promise'); const ConnectionPool = require('./connection-pool.js'); -function _executeQuery(client, searchBase, ldapQuery, next) { - _executeQueryPromise(client, searchBase, ldapQuery).then( - (data) => { - next(null, data); - } - ).catch( - (err) => { - next(err, null); - } - ) -} function _executeQueryInPool(pool, searchBase, ldapQuery, next) { pool.add(function(client) { _executeQueryPromise(client, searchBase, ldapQuery) From 948d8bab0126eda13f8651b5589b0f0da11d6afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 4 Mar 2020 11:00:46 +0100 Subject: [PATCH 51/58] [move] test.js as connectionPool sample, tests scripts updated --- package.json | 2 +- test.js => samples/sample-connectionPool.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename test.js => samples/sample-connectionPool.js (90%) diff --git a/package.json b/package.json index de54a48..925a992 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,6 @@ "test": "mocha --exit", "sample1": "node samples/sample-getUnit.js", "sample2": "node samples/sample-getUserBySciper.js", - "debug": "DEBUG=test,connection-pool node test.js" + "sample3": "DEBUG=connection-pool node samples/sample-connectionPool.js" } } diff --git a/test.js b/samples/sample-connectionPool.js similarity index 90% rename from test.js rename to samples/sample-connectionPool.js index aebde5a..c125b98 100644 --- a/test.js +++ b/samples/sample-connectionPool.js @@ -1,8 +1,8 @@ -const debug = require('debug')('test'); +const debug = require('debug')('connection-pool'); -const ConnectionPool = require('./connection-pool.js'); +const ConnectionPool = require('../connection-pool.js'); const ldap = require('ldapjs'); -const executeQueryPromise = require('./ldapjs-promise'); +const executeQueryPromise = require('../ldapjs-promise'); const pool = new ConnectionPool( From 7d9678dc5c800bc0111d434596fc2dedbe1b711e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 4 Mar 2020 11:26:50 +0100 Subject: [PATCH 52/58] [doc] example with custom search base --- README.md | 11 +++++++++++ package.json | 6 +++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bb6c45e..65a3902 100644 --- a/README.md +++ b/README.md @@ -43,8 +43,19 @@ customLdapContext.options.modelsMapper = customModelsMapper; customLdapContext.users.getUserBySciper(169419, function (err, data) { console.log(JSON.stringify(data, null, 2)); }); + + +/* + * Custom LDAP search base + */ +var publicLdapContext = require('epfl-ldap')(); +publicLdapContext.options.searchBase = 'ou=si-idev,ou=si,o=epfl,c=ch'; // <- specify search base here +publicLdapContext.users.getUserBySciper(169419, function(err, data) { + console.log(JSON.stringify(data, null, 2)); +}); ``` + ## Notes ⚠ Carefull with the results formats (Object or Array) diff --git a/package.json b/package.json index 925a992..f4f55b9 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,8 @@ "license": "ISC", "scripts": { "test": "mocha --exit", - "sample1": "node samples/sample-getUnit.js", - "sample2": "node samples/sample-getUserBySciper.js", - "sample3": "DEBUG=connection-pool node samples/sample-connectionPool.js" + "sample-unit": "node samples/sample-getUnit.js", + "sample-sciper": "node samples/sample-getUserBySciper.js", + "sample-connection-pool": "DEBUG=connection-pool node samples/sample-connectionPool.js" } } From 719cd6346ccf4a42a12560ca01c6ced29629dd5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Wed, 4 Mar 2020 13:07:33 +0100 Subject: [PATCH 53/58] [feature] Options for poolSize and searchBase --- README.md | 8 +++++--- client.js | 14 +++++++------- context.js | 8 +++++++- options.js | 9 +++++++-- samples/sample-getUnit.js | 2 -- samples/sample-getUserBySciper.js | 2 +- 6 files changed, 27 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 65a3902..c108d78 100644 --- a/README.md +++ b/README.md @@ -46,10 +46,12 @@ customLdapContext.users.getUserBySciper(169419, function (err, data) { /* - * Custom LDAP search base + * Custom Options */ -var publicLdapContext = require('epfl-ldap')(); -publicLdapContext.options.searchBase = 'ou=si-idev,ou=si,o=epfl,c=ch'; // <- specify search base here +var publicLdapContext = require('epfl-ldap')({ + searchBase:'ou=si-idev,ou=si,o=epfl,c=ch', + poolSize: 4 + }); publicLdapContext.users.getUserBySciper(169419, function(err, data) { console.log(JSON.stringify(data, null, 2)); }); diff --git a/client.js b/client.js index 86e8695..d7bef65 100644 --- a/client.js +++ b/client.js @@ -19,24 +19,24 @@ function _executeQueryInPool(pool, searchBase, ldapQuery, next) { }); } -function createPool (clientFactory, opts) { +function createPool(clientFactory, opts) { const pool = new ConnectionPool( opts.poolSize, clientFactory, (client) => client.unbind() ); - return pool; // TODO: improve + return pool; } module.exports = function ldapClient(context) { let ldap = require('ldapjs'); let pool = createPool(() => ldap.createClient({ - url: 'ldap://ldap.epfl.ch', - timeLimit: 1, - sizeLimit: 10 - }), - { poolSize : context.poolSize || 3 } + url: 'ldap://ldap.epfl.ch', + timeLimit: 1, + sizeLimit: 10 + }), + { poolSize : context.poolSize } ); const client = { diff --git a/context.js b/context.js index 2620a49..2117cc3 100644 --- a/context.js +++ b/context.js @@ -2,8 +2,14 @@ let NodeCache = require("node-cache"); module.exports = function ldapContext(options) { let context = {}; + // Define the pool size + if (options == undefined || options.poolSize == undefined ) { + context.poolSize = 3; + } else { + context.poolSize = options.poolSize; + } + context.options = require('./options')(options); context.client = require('./client')(context); - context.options = require('./options')(); context.users = require('./repositories/users')(context); context.units = require('./repositories/units')(context); context.viewModelsMappers = require('./viewModels/mappers')(); diff --git a/options.js b/options.js index ec909a4..ffcd9b2 100644 --- a/options.js +++ b/options.js @@ -1,7 +1,12 @@ 'use strict'; -module.exports = function () { +module.exports = function (options) { let ldapOptions = {}; - ldapOptions.searchBase = 'c=ch'; + // Define the searchBase + if (options == undefined || options.searchBase == undefined ) { + ldapOptions.searchBase = 'c=ch'; + } else { + ldapOptions.searchBase = options.searchBase; + } ldapOptions.modelsMapper = require('./viewModels/public/modelsMapper')(); return ldapOptions; }; diff --git a/samples/sample-getUnit.js b/samples/sample-getUnit.js index d62834c..31a4049 100644 --- a/samples/sample-getUnit.js +++ b/samples/sample-getUnit.js @@ -4,7 +4,6 @@ * Public */ let publicLdapContext = require('../context')(); - publicLdapContext.units.getUnitByName('enac-it', function(err, data) { console.log(JSON.stringify(data, null, 2)); }); @@ -24,7 +23,6 @@ publicLdapContext.units.getUnitByUniqueIdentifier(10208, function(err, data) { let fullLdapContext = require('../context')(); fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; - console.time("first"); fullLdapContext.units.searchUnitByName('enac', function(err, data) { //console.log(JSON.stringify(data, null, 2)); diff --git a/samples/sample-getUserBySciper.js b/samples/sample-getUserBySciper.js index c512386..b330b9a 100644 --- a/samples/sample-getUserBySciper.js +++ b/samples/sample-getUserBySciper.js @@ -44,4 +44,4 @@ customLdapContext.users.getUserBySciper(169419, function (err, data) { */ publicLdapContext.users.getUsersByUnitAcronym('ENAC-IT', function (err, data) { console.log(JSON.stringify(data, null, 2)); -}); \ No newline at end of file +}); From 1604ffcd3ae9a091efa7668bba1ab2f6b61ada1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Wed, 4 Mar 2020 14:51:10 +0100 Subject: [PATCH 54/58] 1.0.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5f65594..24391e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "epfl-ldap", - "version": "0.9.0", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f4f55b9..d4c6107 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "epfl-ldap", - "version": "0.9.0", + "version": "1.0.0", "description": "epfl-ldap", "main": "context.js", "homepage": "https://github.com/epfl-si/epfl-ldap-js", From 28d87e1a2b9c35f98cd9aff57ac7d4b092f69177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goy=20Charmier?= Date: Wed, 4 Mar 2020 14:53:18 +0100 Subject: [PATCH 55/58] [release] convert package-lock.json to npm-shrinkwrap.json --- package-lock.json => npm-shrinkwrap.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename package-lock.json => npm-shrinkwrap.json (100%) diff --git a/package-lock.json b/npm-shrinkwrap.json similarity index 100% rename from package-lock.json rename to npm-shrinkwrap.json From e0dfa5d0b6f90b16fa42ad93b5abbeb79842cb41 Mon Sep 17 00:00:00 2001 From: William Belle Date: Mon, 17 Feb 2025 14:34:20 +0100 Subject: [PATCH 56/58] [fix] Tests data (#8) --- test/unitTest.js | 8 +++---- test/userTest.js | 56 +++++++++++++++++++++++------------------------- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/test/unitTest.js b/test/unitTest.js index d6774a8..4f05088 100644 --- a/test/unitTest.js +++ b/test/unitTest.js @@ -4,27 +4,27 @@ describe('Units::get', function () { it('get unit by id', function(done) { this.fullLdapContext.units.getUnitById('1906', function (err, data) { - assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); + assert.ok(data.name === "Full-Stack Development", "Unit name"); done(); }); }); it('get unit by accounting number', function (done) { this.fullLdapContext.units.getUnitByAccountingNumber('1906', function (err, data) { - assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); + assert.ok(data.name === "Full-Stack Development", "Unit name"); done(); }); }); it('get unit by unique identifier', function (done) { this.fullLdapContext.units.getUnitByUniqueIdentifier(13030, function (err, data) { - assert.ok(data.name === "SI - Full-Stack Development", "Unit name"); + assert.ok(data.name === "Full-Stack Development", "Unit name"); done(); }); }); it('get unit by name', function (done) { - this.fullLdapContext.units.getUnitByName("SI - Full-Stack Development", function (err, data) { + this.fullLdapContext.units.getUnitByName("Full-Stack Development", function (err, data) { assert.ok(data.uniqueIdentifier === '13030', "Unit unique identifier"); done(); }); diff --git a/test/userTest.js b/test/userTest.js index 279804c..0506a33 100644 --- a/test/userTest.js +++ b/test/userTest.js @@ -1,19 +1,17 @@ var assert = require('assert'); -// var fullLdapContext = require('../context')(); -// fullLdapContext.options.modelsMapper = fullLdapContext.viewModelsMappers.full; describe('User::get', function () { - it('getUserBySciper should get Kermit La Grenouille', function (done) { + it('getUserBySciper should get Kermi La Grenouille', function (done) { this.fullLdapContext.users.getUserBySciper(133134, function (err, data) { - assert.equal(data.displayName, "Kermit La Grenouille"); + assert.equal(data.displayName, "Kermi La Grenouille"); done(); }); }); - it('getUserBySciper should handle users with two email', function(done) { - this.fullLdapContext.users.getUserBySciper(162314, function (err, data) { - assert.ok(data.emails.length === 2, "User have 2 email"); + it('getUserBySciper should handle users with two emails', function(done) { + this.fullLdapContext.users.getUserBySciper(133134, function (err, data) { + assert.ok(data.emails.length === 2, "User have 2 emails"); done(); }); }); @@ -25,9 +23,9 @@ describe('User::get', function () { }); }); - it('getUserByName should find Kermit La Grenouille', function (done) { - this.fullLdapContext.users.getUserByName('Kermit La Grenouille', function (err, data) { - assert.equal(data.displayName, 'Kermit La Grenouille'); + it('getUserByName should find Kermi La Grenouille', function (done) { + this.fullLdapContext.users.getUserByName('Kermi La Grenouille', function (err, data) { + assert.equal(data.displayName, 'Kermi La Grenouille'); done(); }); }); @@ -47,9 +45,9 @@ describe('User::get', function () { }); // Watch out: user with guest account on their EPFL email can appear first. - it('getUserByMail should find 188475', function (done) { - this.fullLdapContext.users.getUserByMail('gregory.charmier@epfl.ch', function (err, data) { - assert.equal(data.sciper, '188475'); + it('getUserByMail should find 169419', function (done) { + this.fullLdapContext.users.getUserByMail('nicolas.borboen@epfl.ch', function (err, data) { + assert.equal(data.sciper, '169419'); done(); }); }); @@ -58,9 +56,9 @@ describe('User::get', function () { describe('User::search', function () { - it('searchUserByName should search Kermit La Grenouille', function (done) { - this.fullLdapContext.users.searchUserByName('Kermit', function (err, data) { - assert.equal(data[0].displayName, 'Kermit La Grenouille'); + it('searchUserByName should search Kermi La Grenouille', function (done) { + this.fullLdapContext.users.searchUserByName('Kermi', function (err, data) { + assert.equal(data[0].displayName, 'Kermi La Grenouille'); done(); }); }); @@ -72,12 +70,12 @@ describe('User::search', function () { }); }); - it('searchUserByUnitAcronym should search all members of IDEV-F*, including Kermit', function (done) { - this.fullLdapContext.users.searchUserByUnitAcronym('IDEV-F', function (err, data) { + it('searchUserByUnitAcronym should search all members of ISAS-G*, including Kermi', function (done) { + this.fullLdapContext.users.searchUserByUnitAcronym('ISAS-G', function (err, data) { let k = data.filter(obj => { - return obj.displayName === 'Kermit La Grenouille'; + return obj.displayName === 'Kermi La Grenouille'; }) - assert.equal(k[0].displayName, 'Kermit La Grenouille'); + assert.equal(k[0].displayName, 'Kermi La Grenouille'); done(); }); }); @@ -86,16 +84,16 @@ describe('User::search', function () { describe('Users::get', function () { - it('getUsersBySciper should get Kermit La Grenouille', function (done) { + it('getUsersBySciper should get Kermi La Grenouille', function (done) { this.fullLdapContext.users.getUsersBySciper(133134, function (err, data) { - assert.equal(data[0].displayName, 'Kermit La Grenouille'); + assert.equal(data[0].displayName, 'Kermi La Grenouille'); done(); }); }); - it('getUsersByName should get Kermit La Grenouille', function (done) { - this.fullLdapContext.users.getUsersByName('Kermit La Grenouille', function (err, data) { - assert.equal(data[0].displayName, 'Kermit La Grenouille'); + it('getUsersByName should get Kermi La Grenouille', function (done) { + this.fullLdapContext.users.getUsersByName('Kermi La Grenouille', function (err, data) { + assert.equal(data[0].displayName, 'Kermi La Grenouille'); done(); }); }); @@ -114,12 +112,12 @@ describe('Users::get', function () { }); }); - it('getUsersByUnitAcronym should search all members of IDEV-FSD, including Kermit', function (done) { - this.fullLdapContext.users.getUsersByUnitAcronym('IDEV-FSD', function (err, data) { + it('getUsersByUnitAcronym should search all members of ISAS-GE, including Kermi', function (done) { + this.fullLdapContext.users.getUsersByUnitAcronym('ISAS-GE', function (err, data) { let k = data.filter(obj => { - return obj.displayName === 'Kermit La Grenouille'; + return obj.displayName === 'Kermi La Grenouille'; }) - assert.equal(k[0].displayName, 'Kermit La Grenouille'); + assert.equal(k[0].displayName, 'Kermi La Grenouille'); done(); }); }); From c8df1d75f2a238a5bee24154e7daa8442a46f1e6 Mon Sep 17 00:00:00 2001 From: William Belle Date: Mon, 17 Feb 2025 14:34:56 +0100 Subject: [PATCH 57/58] [fix] Revert npm-shrinkwrap.json to package-lock.json (#9) --- npm-shrinkwrap.json | 1423 ---------------------------------------- package-lock.json | 1509 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1509 insertions(+), 1423 deletions(-) delete mode 100644 npm-shrinkwrap.json create mode 100644 package-lock.json diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json deleted file mode 100644 index 24391e1..0000000 --- a/npm-shrinkwrap.json +++ /dev/null @@ -1,1423 +0,0 @@ -{ - "name": "epfl-ldap", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "requires": { - "precond": "0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "bunyan": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", - "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", - "requires": { - "dtrace-provider": "~0.8", - "moment": "^2.10.6", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - } - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", - "dev": true - }, - "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "optional": true, - "requires": { - "nan": "^2.14.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "extsprintf": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", - "integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jshint": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.11.0.tgz", - "integrity": "sha512-ooaD/hrBPhu35xXW4gn+o3SOuzht73gdBuffgJzrZBJZPGgGiiTvJEgTyxFvBO2nz0+X1G6etF8SzUODTlLY6Q==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.11", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - } - }, - "ldap-filter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz", - "integrity": "sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=", - "requires": { - "assert-plus": "0.1.5" - }, - "dependencies": { - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" - } - } - }, - "ldapjs": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz", - "integrity": "sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "^1.0.0", - "backoff": "^2.5.0", - "bunyan": "^1.8.3", - "dashdash": "^1.14.0", - "dtrace-provider": "~0.8", - "ldap-filter": "0.2.2", - "once": "^1.4.0", - "vasync": "^1.6.4", - "verror": "^1.8.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.1.tgz", - "integrity": "sha512-9eWmWTdHLXh72rGrdZjNbG3aa1/3NRPpul1z0D979QpEnFdCG0Q5tv834N+94QEN2cysfV72YocQ3fn87s70fg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.0", - "yargs-parser": "13.1.1", - "yargs-unparser": "1.6.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", - "optional": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "optional": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true - }, - "node-cache": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.0.tgz", - "integrity": "sha512-gFQwYdoOztBuPlwg6DKQEf50G+gkK69aqLnw4djkmlHCzeVrLJfwvg9xl4RCAGviTIMUVoqcyoZ/V/wPEu/VVg==", - "requires": { - "clone": "2.x" - } - }, - "node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "o-mapper": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/o-mapper/-/o-mapper-1.0.0.tgz", - "integrity": "sha512-gADMK7WrUGAOrrmqU+5S7iFu0GwY7Bwi2vlbCZAlwXTAkqi4gKg3tspeEF/gSwHEh4vxvOsdUNgYrwHRm+8FyQ==" - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", - "dev": true - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" - }, - "promise-semaphore": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/promise-semaphore/-/promise-semaphore-0.2.8.tgz", - "integrity": "sha1-x+O1Vr2YIE5rzHHZTQ3m350rAlo=", - "requires": { - "bluebird": "^3.3.1" - }, - "dependencies": { - "assertion-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.1.tgz", - "integrity": "sha1-NaruwzCX8R9COZ7K3zP6zNJ/XEw=" - }, - "bluebird": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.1.tgz", - "integrity": "sha1-+Xrhlw9B2FF3KDBT6aEgFg5mxh0=" - }, - "commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=" - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - } - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "requires": { - "type-detect": "0.1.1" - }, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" - } - } - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=" - }, - "escape-string-regexp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=" - }, - "glob": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", - "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", - "requires": { - "graceful-fs": "~2.0.0", - "inherits": "2", - "minimatch": "~0.2.11" - } - }, - "graceful-fs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" - }, - "growl": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz", - "integrity": "sha1-Sy3sjZB+k9szZiTc7AGDUC+MlCg=" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", - "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=" - }, - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" - } - } - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, - "supports-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", - "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=" - }, - "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" - } - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.4" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "optional": true, - "requires": { - "glob": "^6.0.1" - } - }, - "safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "vasync": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", - "integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=", - "requires": { - "verror": "1.6.0" - }, - "dependencies": { - "verror": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", - "integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=", - "requires": { - "extsprintf": "1.2.0" - } - } - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - } - } - } -} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ffb1b2d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1509 @@ +{ + "name": "epfl-ldap", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "epfl-ldap", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "debug": "^4.1.1", + "ldapjs": "^1.0.2", + "node-cache": "^5.1.0", + "o-mapper": "^1.0.0", + "promise-semaphore": "^0.2.8" + }, + "devDependencies": { + "jshint": "^2.11.0", + "mocha": "*" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asn1": { + "version": "0.2.3", + "license": "MIT" + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/backoff": { + "version": "2.5.0", + "license": "MIT", + "dependencies": { + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "devOptional": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/bunyan": { + "version": "1.8.12", + "engines": [ + "node >=0.10.0" + ], + "license": "MIT", + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.10.6", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.1" + } + }, + "node_modules/cli": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "exit": "0.1.2", + "glob": "^7.1.1" + }, + "engines": { + "node": ">=0.2.5" + } + }, + "node_modules/cli/node_modules/glob": { + "version": "7.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "devOptional": true, + "license": "MIT" + }, + "node_modules/console-browserify": { + "version": "1.1.0", + "dev": true, + "dependencies": { + "date-now": "^0.1.4" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/date-now": { + "version": "0.1.4", + "dev": true + }, + "node_modules/debug": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/diff": { + "version": "3.5.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.0.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "2.3.0", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.5.1", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "hasInstallScript": true, + "license": "BSD-2-Clause", + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "1.0.0", + "dev": true, + "license": "BSD-like" + }, + "node_modules/es-abstract": { + "version": "1.17.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/extsprintf": { + "version": "1.2.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat": { + "version": "4.1.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "6.0.4", + "license": "ISC", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/growl": { + "version": "1.10.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/htmlparser2": { + "version": "3.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "devOptional": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "devOptional": true, + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-regex": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jshint": { + "version": "2.11.0", + "dev": true, + "license": "(MIT AND JSON)", + "dependencies": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.11", + "minimatch": "~3.0.2", + "shelljs": "0.3.x", + "strip-json-comments": "1.0.x" + }, + "bin": { + "jshint": "bin/jshint" + } + }, + "node_modules/ldap-filter": { + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "assert-plus": "0.1.5" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ldap-filter/node_modules/assert-plus": { + "version": "0.1.5", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ldapjs": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "asn1": "0.2.3", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "bunyan": "^1.8.3", + "dashdash": "^1.14.0", + "ldap-filter": "0.2.2", + "once": "^1.4.0", + "vasync": "^1.6.4", + "verror": "^1.8.1" + }, + "bin": { + "ldapjs-add": "bin/ldapjs-add", + "ldapjs-compare": "bin/ldapjs-compare", + "ldapjs-delete": "bin/ldapjs-delete", + "ldapjs-modify": "bin/ldapjs-modify", + "ldapjs-search": "bin/ldapjs-search" + }, + "engines": { + "node": ">=0.10" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.15", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "devOptional": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "0.0.8", + "devOptional": true, + "license": "MIT" + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.0", + "yargs-parser": "13.1.1", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "3.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/moment": { + "version": "2.24.0", + "license": "MIT", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/mv": { + "version": "2.1.1", + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nan": { + "version": "2.14.0", + "license": "MIT", + "optional": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "license": "MIT", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/node-cache": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "clone": "2.x" + }, + "engines": { + "node": ">= 0.4.6" + } + }, + "node_modules/node-environment-flags": { + "version": "1.0.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/o-mapper": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/object-inspect": { + "version": "1.7.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/precond": { + "version": "0.2.3", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/promise-semaphore": { + "version": "0.2.8", + "license": "MIT", + "dependencies": { + "bluebird": "^3.3.1" + } + }, + "node_modules/promise-semaphore/node_modules/bluebird": { + "version": "3.3.1", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/rimraf": { + "version": "2.4.5", + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "license": "MIT", + "optional": true + }, + "node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/shelljs": { + "version": "0.3.0", + "dev": true, + "license": "BSD*", + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trimleft": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimright": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-color": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/vasync": { + "version": "1.6.4", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "verror": "1.6.0" + } + }, + "node_modules/vasync/node_modules/verror": { + "version": "1.6.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "extsprintf": "1.2.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/wide-align": { + "version": "1.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/y18n": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "13.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-unparser": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + } + } +} From d73a83bb93ee4535828a5a1ed3511a590daa5e41 Mon Sep 17 00:00:00 2001 From: William Belle Date: Mon, 17 Feb 2025 14:38:47 +0100 Subject: [PATCH 58/58] [chore] bump version to 1.0.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ffb1b2d..b1037f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "epfl-ldap", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "epfl-ldap", - "version": "1.0.0", + "version": "1.0.1", "license": "ISC", "dependencies": { "debug": "^4.1.1", diff --git a/package.json b/package.json index d4c6107..8b7641a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "epfl-ldap", - "version": "1.0.0", + "version": "1.0.1", "description": "epfl-ldap", "main": "context.js", "homepage": "https://github.com/epfl-si/epfl-ldap-js",