From eadfbb0487d212347250e4a3b94d235fd49549c4 Mon Sep 17 00:00:00 2001 From: nhh1603 Date: Thu, 1 Feb 2024 09:24:25 +0100 Subject: [PATCH 1/2] password re-enforcement + new File Browser in FileBrowser3 (not factorized ver) --- package-lock.json | 1398 +++++++++++++++-------------- source/class/desk/Actions.js | 20 +- source/class/desk/FileBrowser2.js | 373 ++++++++ source/class/desk/FileBrowser3.js | 1340 +++++++++++++++++++++++++++ 4 files changed, 2447 insertions(+), 684 deletions(-) create mode 100644 source/class/desk/FileBrowser2.js create mode 100644 source/class/desk/FileBrowser3.js diff --git a/package-lock.json b/package-lock.json index dd1cc72..a2ec752 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3567,24 +3567,6 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/@qooxdoo/framework/node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/@qooxdoo/framework/node_modules/assert": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", @@ -3625,15 +3607,6 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/@qooxdoo/framework/node_modules/babelify": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", @@ -3646,18 +3619,6 @@ "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, - "node_modules/@qooxdoo/framework/node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, "node_modules/@qooxdoo/framework/node_modules/browser-pack": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", @@ -3728,20 +3689,6 @@ "xtend": "^4.0.0" } }, - "node_modules/@qooxdoo/framework/node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/@qooxdoo/framework/node_modules/browserify-cipher": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", @@ -3765,44 +3712,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/@qooxdoo/framework/node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/@qooxdoo/framework/node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/@qooxdoo/framework/node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, "node_modules/@qooxdoo/framework/node_modules/browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", @@ -3843,12 +3752,6 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, "node_modules/@qooxdoo/framework/node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -3861,16 +3764,6 @@ "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/@qooxdoo/framework/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -3964,33 +3857,6 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/@qooxdoo/framework/node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/@qooxdoo/framework/node_modules/crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -4090,27 +3956,6 @@ "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/@qooxdoo/framework/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/@qooxdoo/framework/node_modules/es-abstract": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", @@ -4196,16 +4041,6 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "node_modules/@qooxdoo/framework/node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -4222,12 +4057,6 @@ "path-exists": "^4.0.0" } }, - "node_modules/@qooxdoo/framework/node_modules/follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", - "dev": true - }, "node_modules/@qooxdoo/framework/node_modules/foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", @@ -4316,33 +4145,6 @@ "isobject": "^3.0.1" } }, - "node_modules/@qooxdoo/framework/node_modules/github-api": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/github-api/-/github-api-3.4.0.tgz", - "integrity": "sha512-2yYqYS6Uy4br1nw0D3VrlYWxtGTkUhIZrumBrcBwKdBOzMT8roAe8IvI6kjIOkxqxapKR5GkEsHtz3Du/voOpA==", - "dev": true, - "dependencies": { - "axios": "^0.21.1", - "debug": "^2.2.0", - "js-base64": "^2.1.9", - "utf8": "^2.1.1" - } - }, - "node_modules/@qooxdoo/framework/node_modules/github-api/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@qooxdoo/framework/node_modules/github-api/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/@qooxdoo/framework/node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -4401,49 +4203,6 @@ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/@qooxdoo/framework/node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/@qooxdoo/framework/node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/@qooxdoo/framework/node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/@qooxdoo/framework/node_modules/htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", @@ -4622,12 +4381,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, "node_modules/@qooxdoo/framework/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -4690,17 +4443,6 @@ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/@qooxdoo/framework/node_modules/miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -4717,18 +4459,6 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/@qooxdoo/framework/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "node_modules/@qooxdoo/framework/node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", @@ -4851,19 +4581,6 @@ "path-platform": "~0.11.15" } }, - "node_modules/@qooxdoo/framework/node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "node_modules/@qooxdoo/framework/node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -4885,19 +4602,6 @@ "through": "~2.3" } }, - "node_modules/@qooxdoo/framework/node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/@qooxdoo/framework/node_modules/prettier": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", @@ -4960,15 +4664,6 @@ "inherits": "~2.0.3" } }, - "node_modules/@qooxdoo/framework/node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/@qooxdoo/framework/node_modules/randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", @@ -5045,16 +4740,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "node_modules/@qooxdoo/framework/node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5080,16 +4765,6 @@ "isobject": "^3.0.1" } }, - "node_modules/@qooxdoo/framework/node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/@qooxdoo/framework/node_modules/shasum-object": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", @@ -5475,12 +5150,6 @@ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true }, - "node_modules/@qooxdoo/framework/node_modules/utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=", - "dev": true - }, "node_modules/@qooxdoo/framework/node_modules/util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", @@ -5908,6 +5577,24 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, "node_modules/astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -5923,6 +5610,15 @@ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", @@ -6057,6 +5753,12 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -6243,6 +5945,12 @@ "node": ">=8" } }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, "node_modules/brotli": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", @@ -6252,6 +5960,64 @@ "base64-js": "^1.1.2" } }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/browserslist": { "version": "4.22.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", @@ -6345,6 +6111,12 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -6566,6 +6338,16 @@ "node": ">=8" } }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/cldr": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/cldr/-/cldr-7.5.0.tgz", @@ -6807,6 +6589,33 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -7618,6 +7427,27 @@ "integrity": "sha512-V52j+P5z6cdRqTjPR/bYNxx7ETCHIkm5VIGuyCy3CMrfSnbEpIlLnk5oHmZo7gYvDfh2TfHeanB6rawyQ23ktg==", "dev": true }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -8059,6 +7889,16 @@ "node": ">= 0.6" } }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -8355,6 +8195,26 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/fontkit": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.2.tgz", @@ -8511,6 +8371,33 @@ "node": ">=4" } }, + "node_modules/github-api": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/github-api/-/github-api-3.4.0.tgz", + "integrity": "sha512-2yYqYS6Uy4br1nw0D3VrlYWxtGTkUhIZrumBrcBwKdBOzMT8roAe8IvI6kjIOkxqxapKR5GkEsHtz3Du/voOpA==", + "dev": true, + "dependencies": { + "axios": "^0.21.1", + "debug": "^2.2.0", + "js-base64": "^2.1.9", + "utf8": "^2.1.1" + } + }, + "node_modules/github-api/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/github-api/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -8764,6 +8651,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "node_modules/hashish": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/hashish/-/hashish-0.0.4.tgz", @@ -8782,6 +8707,17 @@ "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", "dev": true }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -9265,6 +9201,12 @@ "node": ">= 4" } }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9585,6 +9527,17 @@ "node": ">= 12" } }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -9722,6 +9675,18 @@ "node": ">=4" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -10138,6 +10103,19 @@ "node": ">=6" } }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -10182,17 +10160,33 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/pegjs": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", @@ -10403,6 +10397,15 @@ "integrity": "sha512-CRUyWmnzmZBA7RZSVGq0xMqmgCyPPxbiKNLFA5ud7KenojVX2s7Gv+V7eB52beKTPGxWRnVZ7D/tCIgYJJ8vNQ==", "dev": true }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -10740,6 +10743,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, "node_modules/robust-predicates": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", @@ -11001,6 +11014,19 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -11910,6 +11936,12 @@ "node": ">= 4" } }, + "node_modules/utf8": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", + "integrity": "sha512-QXo+O/QkLP/x1nyi54uQiG0XrODxdysuQvE5dtVqv7F5K2Qb6FsN+qbr6KhF5wQ20tfcV3VQp0/2x1e1MRSPWg==", + "dev": true + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -14898,26 +14930,6 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, "assert": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", @@ -14960,15 +14972,6 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, "babelify": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", @@ -14981,18 +14984,6 @@ "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", "dev": true }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, "browser-pack": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", @@ -15090,20 +15081,6 @@ } } }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "browserify-cipher": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", @@ -15127,46 +15104,6 @@ "safe-buffer": "^5.1.2" } }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", @@ -15184,12 +15121,6 @@ } } }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -15202,16 +15133,6 @@ "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", "dev": true }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -15311,33 +15232,6 @@ } } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -15439,29 +15333,6 @@ "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==", "dev": true }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, "es-abstract": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", @@ -15549,16 +15420,6 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -15575,12 +15436,6 @@ "path-exists": "^4.0.0" } }, - "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", - "dev": true - }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", @@ -15671,35 +15526,6 @@ "isobject": "^3.0.1" } }, - "github-api": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/github-api/-/github-api-3.4.0.tgz", - "integrity": "sha512-2yYqYS6Uy4br1nw0D3VrlYWxtGTkUhIZrumBrcBwKdBOzMT8roAe8IvI6kjIOkxqxapKR5GkEsHtz3Du/voOpA==", - "dev": true, - "requires": { - "axios": "^0.21.1", - "debug": "^2.2.0", - "js-base64": "^2.1.9", - "utf8": "^2.1.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -15760,51 +15586,6 @@ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", @@ -15983,12 +15764,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -16051,17 +15826,6 @@ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -16080,18 +15844,6 @@ } } }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", @@ -16216,19 +15968,6 @@ "path-platform": "~0.11.15" } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -16250,19 +15989,6 @@ "through": "~2.3" } }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "prettier": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", @@ -16327,15 +16053,6 @@ "inherits": "~2.0.3" } }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", @@ -16414,16 +16131,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -16451,16 +16158,6 @@ } } }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "shasum-object": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", @@ -16858,12 +16555,6 @@ } } }, - "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=", - "dev": true - }, "util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", @@ -17238,6 +16929,26 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -17250,6 +16961,15 @@ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.0" + } + }, "babel-plugin-polyfill-corejs2": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", @@ -17351,6 +17071,12 @@ "safe-buffer": "^5.1.1" } }, + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, "body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -17489,6 +17215,12 @@ "fill-range": "^7.0.1" } }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, "brotli": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", @@ -17498,6 +17230,60 @@ "base64-js": "^1.1.2" } }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "dev": true, + "requires": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "browserslist": { "version": "4.22.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", @@ -17554,6 +17340,12 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, "builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -17695,6 +17487,16 @@ "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "cldr": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/cldr/-/cldr-7.5.0.tgz", @@ -17882,6 +17684,33 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -18497,6 +18326,29 @@ "integrity": "sha512-V52j+P5z6cdRqTjPR/bYNxx7ETCHIkm5VIGuyCy3CMrfSnbEpIlLnk5oHmZo7gYvDfh2TfHeanB6rawyQ23ktg==", "dev": true }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -18816,6 +18668,16 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, "express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -19067,6 +18929,12 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "follow-redirects": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "dev": true + }, "fontkit": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.2.tgz", @@ -19188,6 +19056,35 @@ "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "dev": true }, + "github-api": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/github-api/-/github-api-3.4.0.tgz", + "integrity": "sha512-2yYqYS6Uy4br1nw0D3VrlYWxtGTkUhIZrumBrcBwKdBOzMT8roAe8IvI6kjIOkxqxapKR5GkEsHtz3Du/voOpA==", + "dev": true, + "requires": { + "axios": "^0.21.1", + "debug": "^2.2.0", + "js-base64": "^2.1.9", + "utf8": "^2.1.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -19373,6 +19270,40 @@ "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", "dev": true }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "hashish": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/hashish/-/hashish-0.0.4.tgz", @@ -19388,6 +19319,17 @@ "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", "dev": true }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -19734,6 +19676,12 @@ "is-object": "^1.0.1" } }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -19980,6 +19928,17 @@ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -20084,6 +20043,18 @@ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -20390,6 +20361,19 @@ "callsites": "^3.0.0" } }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -20430,6 +20414,19 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "pegjs": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", @@ -20572,6 +20569,15 @@ "integrity": "sha512-CRUyWmnzmZBA7RZSVGq0xMqmgCyPPxbiKNLFA5ud7KenojVX2s7Gv+V7eB52beKTPGxWRnVZ7D/tCIgYJJ8vNQ==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -20834,6 +20840,16 @@ "glob": "^7.1.3" } }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, "robust-predicates": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", @@ -21030,6 +21046,16 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -21748,6 +21774,12 @@ "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", "dev": true }, + "utf8": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", + "integrity": "sha512-QXo+O/QkLP/x1nyi54uQiG0XrODxdysuQvE5dtVqv7F5K2Qb6FsN+qbr6KhF5wQ20tfcV3VQp0/2x1e1MRSPWg==", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/source/class/desk/Actions.js b/source/class/desk/Actions.js index 70f36d5..2e6858e 100644 --- a/source/class/desk/Actions.js +++ b/source/class/desk/Actions.js @@ -819,15 +819,33 @@ qx.Class.define("desk.Actions", button.addListener('execute', function () { var win = new qx.ui.window.Window(); win.setLayout(new qx.ui.layout.VBox()); + + var currPass = new qx.ui.form.PasswordField(); + win.add(new qx.ui.basic.Label("Enter current password:")); + win.add(currPass, { + flex: 1 + }); + currPass.addListenerOnce('appear', currPass.focus, currPass); + var pass = new qx.ui.form.PasswordField(); win.add( new qx.ui.basic.Label( "Enter new password:" ) ); win.add(pass, {flex : 1}); - pass.addListenerOnce( 'appear', pass.focus, pass ); + // pass.addListenerOnce( 'appear', pass.focus, pass ); win.add( new qx.ui.basic.Label( "Retype password:" ) ); var pass2 = new qx.ui.form.PasswordField(); win.add(pass2, {flex : 1}); var button = new qx.ui.form.Button( "Save password" ); button.addListener( 'execute', function () { + if (!currPass.getValue().length) { + alert('Please enter current password'); + } else { + this.__socket.emit('checkPassword', currPass.getValue()); + this.__socket.on('checkPasswordResult', (data) => { + if (!data) { + alert('Wrong password! Please retry'); + } + }); + } if ( pass.getValue().length && ( pass.getValue() === pass2.getValue() ) ){ this.__socket.emit( 'password', pass.getValue() ); win.close(); diff --git a/source/class/desk/FileBrowser2.js b/source/class/desk/FileBrowser2.js new file mode 100644 index 0000000..1f61f8e --- /dev/null +++ b/source/class/desk/FileBrowser2.js @@ -0,0 +1,373 @@ +qx.Class.define("desk.FileBrowser2", +{ + extend: qx.ui.window.Window, + + construct: function() { + this.base(arguments, "File Explorer"); + + // Layout for the window + var layout = new qx.ui.layout.VBox(); + this.setLayout(layout); + + // Toolbar for navigation buttons and search + var toolbar = new qx.ui.toolbar.ToolBar(); + this.add(toolbar); + + // Create navigation buttons (prev and next) + var prevButton = new qx.ui.toolbar.Button("<"); + var nextButton = new qx.ui.toolbar.Button(">"); + toolbar.add(prevButton); + toolbar.add(nextButton); + + // Create a toolbar part for the folder path + var pathPart = new qx.ui.toolbar.Part(); + toolbar.add(pathPart); + var parentMap = new Map(); + + // // Create a spacer to push the search bar to the right + // toolbar.addSpacer(); + + // // Create a search bar + // var searchBar = new qx.ui.form.TextField().set({ + // placeholder: "Search...", + // visibility: "excluded", // Initially hidden + // marginLeft: 4 + // }); + // toolbar.add(searchBar); + + // // Create a button with a magnifying glass icon to trigger the search bar + // var searchButton = new qx.ui.toolbar.Button(null, "icon/22/actions/system-search.png"); + // toolbar.add(searchButton); + + // // Event listener to toggle the visibility of the search bar + // searchButton.addListener("execute", function() { + // searchBar.setVisibility(searchBar.getVisibility() === "visible" ? "excluded" : "visible"); + // searchBar.focus(); + // }); + + // Create a search bar + var searchBar = new qx.ui.form.TextField().set({ + placeholder: "Search...", + marginLeft: 4 + }); + toolbar.addSpacer(); + toolbar.add(searchBar); + + // Function to recursively search for files + function searchFiles(node, query) { + let matchingFiles = []; + + // Check if the current node matches the query + if (node.get("label").includes(query)) { + matchingFiles.push(node); + } + + // Recursively search the children of the node + if (typeof node.getChildren === "function" ) { + let children = node.get("children"); + if (children) { + children.toArray().forEach(function(child) { + matchingFiles = matchingFiles.concat(searchFiles(child, query)); + }); + } + } + + return matchingFiles; + } + + // Add an input event listener to the search bar + searchBar.addListener("input", function(e) { + let query = e.getData(); + + // Clear the existing results + rightContainer.removeAll(); + + // Search for files that match the query + let matchingFiles = searchFiles(model, query); + + // Display the matching files + matchingFiles.forEach(function(file) { + let label = new qx.ui.basic.Label(file.get("label")); + rightContainer.add(label); + }); + }); + + // Create an HBox for the main content + var mainContainer = new qx.ui.container.Composite(new qx.ui.layout.HBox()); + this.add(mainContainer, { flex: 1 }); + + // Create a VBox for the left side (tree view) + var leftContainer = new qx.ui.container.Composite(new qx.ui.layout.VBox()); + // leftContainer.set({ + // height: 700 + // }); + + mainContainer.add(leftContainer, { + flex: 1 + + }); + + // Create the model + let model = qx.data.marshal.Json.createModel({ + label: "root", + date: "2003-01-02", + children: [ + {label: "Desktop"}, + {label: "Home"}, + { + label: "Filesystem", + children: [ + {label: "C:", + date: "2002-03-16" + }, + {label: "D:", + date: "2022-02-17" + }, + { + label: "B:", + date: "2004-03-02", + children: [ + {label: "fileB.txt", + date: "2012-03-16" + }, + {label: "fileA.txt", + date: "2014-07-16" + } + ] + } + ] + } + ] + }, true); + + // Create the tree + let tree = new qx.ui.tree.VirtualTree(model, "label", "children"); + + // Add the tree to the VBox + leftContainer.add(tree); + + tree.addListener("open", function (e) { + var selectedItem = tree.getSelection().getItem(0); // Assuming single selection + console.log(selectedItem); + console.log(new qx.ui.tree.TreeFolder()); + if (selectedItem instanceof qx.ui.tree.TreeFolder) { + // Handle the selected folder + console.log("Selected Folder:", selectedItem.getLabel()); + } + }, this); + + tree.setDelegate({ + configureItem: function(item) { + var img = new qx.ui.basic.Image( + "icon/16/status/dialog-information.png" + ); + item.addWidget(img); + } + }); + + // Create a VBox for the right side (detail view) + var rightContainer = new qx.ui.container.Composite(new qx.ui.layout.VBox()); + mainContainer.add(rightContainer, { flex: 3 }); + + // Create the table model + let tableModel = new qx.ui.table.model.Simple(); + // tableModel.setColumns(["Name", "Date", "Type", "Size"]); + tableModel.setColumns(["Name", "Date"]); + // console.log(new Date("2002-03-16")); + // Set the comparator for the Date column + tableModel.setSortMethods(1, function(row1, row2) { + let date1 = new Date(row1[1]); + let date2 = new Date(row2[1]); + return date1.getTime() - date2.getTime(); + }); + + // Create the table + let table = new qx.ui.table.Table(tableModel); + table.set({ + columnVisibilityButtonVisible: false, + statusBarVisible: false + }); + + // Add a custom cell renderer for the "Name" column + // table.getTableColumnModel().setDataCellRenderer(0, new qx.ui.table.cellrenderer.Abstract((cellInfo) => { + // console.log(cellInfo); + // return cellInfo; + // })); + // let name = new qx.ui.container.Composite(new qx.ui.layout.HBox(8)); + // let label = cellInfo.get("label"); + // let type; + // if (typeof cellInfo.getChildren === "function" ) { + // type = "folder"; + // } else { + // type = "file"; + // } + + // let icon = new qx.ui.basic.Image("../../source/resource/desk/folder_icon.png"); + // name.add(icon); + + // let nameLabel = new qx.ui.basic.Label(label); + // name.add(nameLabel); + + // return name; + // })); + // let icon = new qx.ui.basic.Image("../../source/resource/desk/folder_icon.png"); + // console.log(icon); + + // Function to create a tree for a file + function createFileTree(file) { + // Create a tree + let tree = new qx.ui.tree.VirtualTree(file, "label", "children"); + + // Set the delegate to create a composite for each node + tree.setDelegate({ + createItem: function() { + return new qx.ui.tree.VirtualTreeItem(); + }, + bindItem: function(controller, item, id) { + controller.bindDefaultProperties(item, id); + controller.bindProperty("", "model", null, item, id); + }, + configureItem: function(item) { + let model = item.getModel(); + let iconSource; + if (model.getChildren) { + iconSource = "../../source/resource/desk/folder_icon.png"; + } else if (model.getLabel().endsWith(".js")) { + iconSource = "../../source/resource/desk/folder_icon.png"; + } else { + iconSource = "../../source/resource/desk/folder_icon.png"; + } + item.setIcon(iconSource); + } + }); + + return tree; + } + + // Function to add a file to the table + function addFileToTable(file) { + // Create a tree for the file + let tree = createFileTree(file); + + // Add a row to the table for the file + // tableModel.addRows([[tree, file.getDate(), file.getType(), file.getSize()]]); + tableModel.addRows([[tree, file.getDate()]]); + } + + // Add the files to the table + // model.forEach(addFileToTable); + + rightContainer.add(table, {flex: 1}); + + // Function to populate the parent map + function populateParentMap(node, parent) { + parentMap.set(node, parent); + if (typeof node.getChildren === "function" ) { + let children = node.get("children"); + if (children) { + children.toArray().forEach(function(child) { + populateParentMap(child, node); + }); + } + } + } + + // Populate the parent map + populateParentMap(model, null); + + // Add a selection change listener to the tree + tree.getSelection().addListener("change", function(e) { + // Get the selected folder + let selectedFolder = tree.getSelection().getItem(0); + // let selectedFolder = e.getItem(0); + // console.log(e); + // console.log(tree.getSelection()); + + if (typeof selectedFolder.getChildren === "function" ) { + // Get the files in the selected folder + let files = selectedFolder.get("children").toArray(); + // console.log(files); + + // Update the table + let rowData = files.map(function(file) { + return [file.get("label"), file.get("date")]; + }); + tableModel.setData(rowData); + } + // Update the folder path + updateFolderPath(selectedFolder); + }); + + // Function to update the folder path + function updateFolderPath(folder) { + // Clear the existing path + pathPart.removeAll(); + + // Get the path to the folder + let path = []; + while (folder) { + path.unshift(folder.get("label")); + folder = parentMap.get(folder); + } + + // Add a button for each part of the path + path.forEach(function(part, index) { + let button = new qx.ui.toolbar.Button(part); + pathPart.add(button); + + // Add a click listener to the button + button.addListener("execute", function() { + let selectedFolder; + for (let [key, value] of parentMap.entries()) { + if (key.getLabel() === part) { + selectedFolder = key; + } + } + tree.setSelection([selectedFolder]); + }); + + // Add a separator after the button, except for the last one + if (index < path.length - 1) { + pathPart.add(new qx.ui.toolbar.Separator()); + } + }); + } + + // Open the window + this.set({ + width: 800, + height: 500, + showMinimize: false, + resizable: true, + }); + + this.open(); + }, + + // destruct : function() { + + // }, + + members : { + __window : null, + // __layout : null, + + __createTreeColumns : function () { + var scroller = new qx.ui.container.Scroll(); + var container = new qx.ui.container.Composite(new qx.ui.layout.Basic()); + container.setAllowGrowX(false); + container.setAllowStretchX(false); + scroller.add(container); + + + + return scroller; + }, + + __configureTreeItem(treeItem, vLabel, vIcon) { + + } + } +}); + +new desk.FileBrowser2(); diff --git a/source/class/desk/FileBrowser3.js b/source/class/desk/FileBrowser3.js new file mode 100644 index 0000000..5eaf6d6 --- /dev/null +++ b/source/class/desk/FileBrowser3.js @@ -0,0 +1,1340 @@ +/** + * A file browser, with customizable launch options + * + * @ignore (async.each) + * @ignore (confirm) + * @ignore (prompt) + * @lint ignoreDeprecated (alert) + * @lint ignoreDeprecated (confirm) + * @asset(qx/icon/${qx.icontheme}/22/places/folder.png) + * @asset(qx/icon/${qx.icontheme}/22/mimetypes/office-document.png) + * @ignore (_.*) +*/ + +qx.Class.define("desk.FileBrowser3", +{ + extend : qx.ui.container.Composite, + /** + * Creates a new file browser + * @param baseDir {String} directory to browse. Defaults to "data" + * @param standAlone {bool} defines whether the container should be + * embedded in a window or not (default : false). + */ + construct : function(baseDir, standAlone) { + baseDir = baseDir || "data"; + if(baseDir.substr(-1) === '/') { + baseDir = baseDir.substr(0, baseDir.length - 1); + } + + this.base(arguments); + this.__fileBrowsers.push(this); + + this.setLayout(new qx.ui.layout.VBox(8)); + // this.setLayout(new qx.ui.layout.HBox(8)); + this.__standAlone = standAlone || false; + + this.__createToolbar(); + + this.__actionCallbacks = []; + this.__actionNames = []; + + this.__files = new qx.ui.tree.VirtualTree(null, "name", "children"); + this.__files.setIconPath(""); + this.__files.setIconOptions(this.__iconOptions); + this.__files.set({ + draggable : true, + droppable : true, + showTopLevelOpenCloseIcons : true, + selectionMode : "multi" + }); + this.__files.addListener("open", this.__onOpen, this); + + if (this.__standAlone) { + this.add(this.__getShortcutsContainer()); + } + + // this.__populateParentMap(this.__files, null); + // console.log(this.__parentMap); + var mainContainer = new qx.ui.container.Composite(new qx.ui.layout.HBox()); + this.add(mainContainer, { flex: 1 }); + var leftContainer = new qx.ui.container.Composite(new qx.ui.layout.VBox()); + // mainContainer.add(this.__createSortToolbar()); + leftContainer.add(this.__files, { flex : 1}); + + var rightContainer = new qx.ui.container.Composite(new qx.ui.layout.VBox()); + this.__tree = new qx.ui.tree.Tree().set({ + width: 200, + height: 500, + }) + this.__createTree(); + + rightContainer.add(this.__createSortToolbar()); + rightContainer.add(this.__tree, { flex : 1}); + mainContainer.add(leftContainer, { flex: 1}); + mainContainer.add(rightContainer, { flex: 3}); + // mainContainer.add(this.__files, { flex: 4}); + // mainContainer.add(this.__getExpandedContainer(), { flex: 1}); +// this.add(this.__files, {flex: 1}); + this.__createFilter(); + + // add root directory + this.updateRoot(baseDir); + + this.setFileHandler(this.__defaultFileHandler); + desk.Actions.init(this.__createDefaultStaticActions, this); + + this.__files.addListener("dbltap", this.__onDbltap, this); + this.__files.addListener("dragstart", this.__onDragstart, this); + this.__files.addListener("dragend", this.__onDragEnd, this); + this.__files.addListener("droprequest", this.__onDropRequest, this); + this.__files.addListener('drop', this.__onDrop, this); + + // this code is for backwards compatibility, may be removed later +// this.__files.getSelection().addListener("change", function (e) { +// // this.__files.fireDataEvent("changeSelection", this.__files.getSelection()); +// console.log(this.__files.getSelection()); +// }, this); + + this.__files.getSelection().addListener("change", this.__changeSelection, this); + + // this.__setDelegateTreeColumns(this.__files); + // this.__setDelegateTreeColumns(); + + if (this.__standAlone) { + var win = this.__window = new qx.ui.window.Window(); + win.set({ShowMinimize : false, + layout : new qx.ui.layout.VBox(), + caption : this.__baseDir, + width : 800, + height : 600 + }); + win.add(this, {flex : 1}); + win.addListener('close', function () { + this.destroy(); + win.destroy(); + }, this); + win.open(); + } + }, + + destruct : function() { + + desk.Actions.getInstance().removeListenerById( this.__actionListener ); + if ( this.__standAlone ) this.__window.destroy(); + this.__files.dispose(); + + qx.util.DisposeUtil.destroyContainer(this); + for (var i = 0; i < this.__fileBrowsers.length; i++) { + if (this.__fileBrowsers[i] === this) { + this.__fileBrowsers.splice(i, 1); + return; + } + } + }, + + members : { + __displayHiddenFiles : false, + __actionListener: null, // listens for action updates; + + __iconOptions : { + converter : function(value, model) { + if (model.getChildren) { + return "icon/22/places/folder.png"; + } else { + var image = "icon/22/mimetypes/office-document.png"; + switch (desk.FileSystem.getFileExtension(model.getName())) { + case "vtk": + case "ply": + case "obj": + case "stl": + image = "desk/tris.png"; + break; + case "gz" : + if ( model.getName().split( "." ).slice( -2 ).join( "." ) !== "nii.gz" ) break; + case "mhd": + case "jpg": + case "png": + case "hdr": + case "tif": + case "nii": + image = "desk/img.png"; + break; + default: + break; + } + return image; + } + } + }, + + /** + * Creates the filter container + */ + __createFilter : function () { + var self = this; + // create the filter bar + var filterBox = new qx.ui.container.Composite(); + filterBox.setLayout(new qx.ui.layout.HBox(10)); + var filterText = new qx.ui.basic.Label("Filter files :"); + filterBox.add(filterText); + var filterField = new qx.ui.form.TextField(); + filterField.setValue(""); + filterField.addListener("input", this.__files.refresh, this.__files); + filterBox.add(filterField, {flex:1}); + this.__filterField = filterField; + + var resetButton = new qx.ui.form.Button("Reset filter"); + resetButton.setAllowGrowY(false); + resetButton.addListener("execute",function(e){ + filterField.setValue(""); + this.__files.refresh(); + }, this); + + filterBox.add(resetButton); + this.__files.setDelegate({ + filter : function (node) { + var name = node.getName().toLowerCase(); + if (!this.__displayHiddenFiles && name.indexOf(".") === 0) { + return false; + } + return node.getChildren || name.indexOf(filterField.getValue().toLowerCase()) != -1; + }.bind(this) + }); + + if(this.__standAlone) { + this.add(filterBox); + } + }, + + /** + * Fired whenever a file is double-clicked + * @param e {qx.event.type.Event} + */ + __onDbltap : function (e) { + var node = e.getTarget(); + if (node && node.getModel && e.isLeftPressed() && !e.isCtrlOrCommandPressed()) { + if (!node.getModel().getChildren && this.__fileHandler) { + this.__fileHandler(node.getModel().getFullName()); + } + } + }, + + /** + * Fired whenever a directory is opened + * @param e {qx.event.type.Event} + */ + __onOpen : function (e) { + var node = e.getData(); + this.__expandDirectoryListing(node); + }, + + /** + * Fired whenever a directory is closed + * @param e {qx.event.type.Event} + */ + __onClose : function (e) { + var node = e.getData(); + node.getChildren().removeAll(); + node.getChildren().push( + qx.data.marshal.Json.createModel({name: "Loading", loading : false}) + ); + this.__files.refresh(); + }, + + /** + * Fired whenever a file drag starts + * @param e {qx.event.type.Drag} + */ + __onDragstart : function(e) { + e.addAction("move"); + e.addType("fileBrowser"); + e.addType("file"); + var selection = this.getSelectedFiles(); + var dragged = e.getDragTarget().getModel().getFullName(); + if (_.indexOf(selection, dragged) < 0) { + selection = [dragged]; + } + this.__draggedNodes = selection; + }, + + /** + * Fired whenever a file drag ends + * @param e {qx.event.type.Drag} + */ + __onDragEnd : function(e) { + this.__draggedNodes = null; + }, + + /** + * Fired at each drop request + * @param e {qx.event.type.Drop} + */ + __onDropRequest : function(e) { + var type = e.getCurrentType(); + switch (type) { + case "file": + e.addData(type, e.getDragTarget().getModel().getFullName()); + break; + case "fileBrowser": + e.addData(type, this); + break; + default : + break; + } + }, + + /** + * Fired at each drop + * @param e {qx.event.type.Drop} + */ + __onDrop : function (e) { + if (!e.supportsType('fileBrowser')) { + return; + } + + var browser = e.getData('fileBrowser'); + if (browser === this) { + return; + } + var source = e.getDragTarget().getModel().getFullName(); + var selection = browser.__files.getSelection().toArray() + .map(function(node) {return node.getFullName()}); + var files; + if (_.indexOf(selection, source) >= 0) { + files = selection; + } else { + files = [source]; + } + + var target = e.getOriginalTarget().getModel(); + var destination = target.getFullName(); + if (!target.getChildren) { + destination = desk.FileSystem.getFileDirectory(destination); + } + var actionType = prompt('Copy or move? \n0 : copy, 1 : move', '0'); + actionType = actionType === '1' ? 'move' : 'copy' + + if (!confirm ('Are you sure you want to ' + actionType + ' move these files:\n' + + files.join('\n') + ' to :\n' + destination)) return; + + async.each(files, function (file, callback) { + desk.Actions.execute({ + action : actionType, + source : file, + destination : destination, + recursive : true + }, + callback); + }, function (err) { + var directories = files.map(function (file) { + return desk.FileSystem.getFileDirectory(file); + }); + directories.push(destination); + this.__updateDirectories(directories); + }.bind(this)); + }, + + // array to store all file browsers, usefull for updates + __fileBrowsers : [], + + // defines whether the file browser is a standalone one + // i.e. whether it needs to create a window + __standAlone : false, + + // the window containing the widget when in standalone mode + __window : null, + __fileHandler : null, + __baseDir : null, + __root : null, + __files : null, + __rootId : null, + __filterField : null, + __actionButton : null, + + __actionNames : null, + __actionCallbacks : null, + + /** + * Creates the top shortcuts + * @return {qx.ui.container.Composite} + */ + __getShortcutsContainer : function() { + const all = new qx.ui.container.Composite(); + all.setLayout( new qx.ui.layout.HBox( 5 ) ); + const container = new qx.ui.container.SlideBar( "horizontal" ); + + container.addListener( "mousewheel", e => { + container.scrollBy( e.getWheelDelta() * 10 ); + } ); + + container.setScrollStep( 50 ); + var settings = desk.Actions.getInstance().getSettings(); + var dataDirs = settings.dataDirs; + var permissions = settings.permissions; + var dirs = Object.keys(dataDirs); + dirs.sort(this.__caseInsensitiveSort); + var hiddenDirs = []; + container.add( new qx.ui.core.Spacer( 5 ) ); + + dirs.forEach( dir => { + + const settings = dataDirs[ dir ]; + if ( ( settings.listed != undefined ) && !settings.listed ) + return; + + if ((dir === "cache") || (dir === "application") || + ((permissions === 0) && (dir ==="actions")) || + dataDirs[dir].hidden) { + hiddenDirs.push(dir); + return; + } + + var button = new qx.ui.form.Button(dir); + button.addListener("click", function ( e ) { + if ( e.isMiddlePressed() ) { + var browser = new desk.FileBrowser(dir, true); + browser.getWindow().center(); + } else { + this.updateRoot(dir); + } + }, this); + button.setAllowShrinkX( false ); + container.add(button, { flex : 1 }); + container.add( new qx.ui.core.Spacer( 5 ) ); + var menu = new qx.ui.menu.Menu(); + var openButton = new qx.ui.menu.Button('open in new window'); + openButton.addListener('execute', function () { + var browser = new desk.FileBrowser(dir, true); + browser.getWindow().center(); + }); + menu.add(openButton); + button.setContextMenu(menu); + } ); + + var menu = new qx.ui.menu.Menu(); + var button = new qx.ui.form.MenuButton( '...', null, menu); + all.add( container, { flex : 1 } ); + all.add(button); + + // console.log(hiddenDirs); + + hiddenDirs.forEach(function (dir) { + var button = new qx.ui.menu.Button(dir); + button.addListener("click", function ( e ) { + if ( e.isMiddlePressed() ) { + var browser = new desk.FileBrowser(dir, true); + browser.getWindow().center(); + } else { + this.updateRoot(dir); + } + }, this); + menu.add(button, {flex : 1}); + var menu2 = new qx.ui.menu.Menu(); + var openButton = new qx.ui.menu.Button('open in new window'); + openButton.addListener('execute', function (e) { + var browser = new desk.FileBrowser(dir, true); + browser.getWindow().center(); + }); + menu2.add(openButton); + button.setContextMenu(menu2); + }, this); + + return all; + }, + + /** Returns the window containing the container in standalone mode + * @return {qx.ui.window.Window} the file browser window + */ + getWindow : function() { + return this.__window; + }, + + /** + * Returns the field used to filter files + * @return {qx.ui.form.TextField} the filter field + */ + getFileFilter : function() { + return this.__filterField; + }, + + /** + * returns the directory for the given file, session type and Id + * @param file {String} file + * @param sessionType {String} type of session + * @param sessionId {Int} Id for the session + * @return {String} session directory + */ + getSessionDirectory : function (file,sessionType,sessionId) { + return file + "." + sessionType + "."+sessionId; + }, + + /** + * Updates/changes the root + * @param newRoot {String} new root + */ + updateRoot : function (newRoot) { + this.__baseDir = newRoot || this.__baseDir; + + this.__root = qx.data.marshal.Json.createModel({ + name: this.__baseDir, + fullName : this.__baseDir, + children: [], + icon: "default", + loading: false + }, true); + + if (this.__window) { + this.__window.setCaption(newRoot); + } + this.__root.getChildren().push( + qx.data.marshal.Json.createModel({name: "Loading", loading : false}) + ); + + this.__files.setModel(this.__root); +// console.log(this.__root); +// this.__treeController.setModel(this.__root); +// this.__tree.getRoot().setOpen(true); + }, + + /** + * Handles file double-click + * @param file {String} file to handle + */ + __defaultFileHandler : function (file) { + var extension = desk.FileSystem.getFileExtension(file); + switch (extension) + { + case 'js': + if (desk.Actions.getInstance().getSettings().permissions) { + desk.FileSystem.executeScript(file); + } else { + desk.Ace.TabbedEditor.open(file); + } + break; + case 'log': + case 'txt': + case 'cpp': + case 'cxx': + case 'h': + case 'py': + desk.Ace.TabbedEditor.open(file); + break; + case "vtk": + case "ply": + case "obj": + case "stl": + case "ctm": + case "off": + new desk.THREE.Viewer(file); + break; + case "xml": + desk.FileSystem.readFile(file, function (error, xmlDoc) { + xmlDoc = (new DOMParser()).parseFromString(xmlDoc, "text/xml") + if (xmlDoc.getElementsByTagName("mesh").length !== 0) { + new desk.THREE.Viewer(file); + } else { + alert ('xml file of unknown type!'); + } + }); + break; + case "gz" : + if ( file.split( "." ).slice( -2 ).join( "." ) !== "nii.gz" ) break; + case "png": + case "jpg": + case "bmp": + case "mhd": + case "nii": + case "hdr": + case "tif": + new desk.MPR.Viewer(file); + break; + case "vol": + if (desk.Actions.getInstance().getAction("vol_slice") != null) { + new desk.MPR.Viewer(file); + } else { + console.log("vol_slice action does not exist. Skipping this filetype handler.") + } + break; + case "json": + desk.Action.CREATEFROMFILE(file); + break; + default: + alert("no file handler exists for extension "+extension); + break; + } + }, + + /** + * Launches Out-of-core volume visualization + * @param node {Object} file node + */ + __OOCViewAction : function (node) { + if (!node.getChildren) { + new desk.MPR.Viewer(node.getFullName(), { + ooc : true, + format : 0, + nbOrientations : 1 + }); + } else { + alert("Cannot view a directory!"); + } + }, + + /** + * Launches the file download + * @param node {Object} file node + */ + __downloadAction : function (node) { + if (!node.getChildren) { + desk.FileSystem.downloadFile( node.getFullName() ); + } else { + alert("Cannot download a directory!"); + } + }, + + /** + * Launches an uploader + * @param node {Object} file node + */ + __uploadAction : function (node) { + node = node || this.__root; + var dir = node.getFullName(); + if (!node.getChildren) { + dir = desk.FileSystem.getFileDirectory(dir); + node = this.__getFileNode(dir); + } + var uploader = new desk.Uploader(dir); + uploader.addListener("upload", + _.throttle(function () { + this.__expandDirectoryListing(node); + }.bind(this), 2000) + ); + }, + + /** + * Creates a directory + * @param node {Object} file node + */ + __newDirectoryAction : function (node) { + var dir = node.getFullName(); + if (!node.getChildren) { + dir = desk.FileSystem.getFileDirectory(dir); + } + var newDir = prompt('Name of the directory to create','new_dir'); + if (!newDir) return; + desk.Actions.execute({ + "action" : "create_directory", + "directory" : dir + '/' + newDir}, + function () { + this.updateDirectory(dir); + }, this); + }, + + /** + * Deletes a file/directory + * @param node {Object} file node + */ + __deleteAction : function (node) { + var nodes = this.__files.getSelection().toArray(); + var message = 'Are you shure you want to delete those files/directories? \n'; + var dirs = nodes.map(function (node) { + var file = node.getFullName(); + message += file + '\n'; + return desk.FileSystem.getFileDirectory(file); + }, this); + if (!confirm(message)) return; + + async.each(nodes, function (node, callback) { + desk.Actions.execute({ + action : node.getChildren ? 'delete_directory' : 'delete_file', + file_name : node.getFullName(), + directory : node.getFullName()}, + callback + ); + }, function (err) { + this.__updateDirectories(dirs); + }.bind(this)); + }, + + /** + * Renames file/directory + * @param node {Object} file node + */ + __renameAction : function (node) { + var file = node.getFullName(); + var newFile = prompt('enter new file name : ', desk.FileSystem.getFileName(file)); + if (newFile === null) { + return; + } + var dir = desk.FileSystem.getFileDirectory(file); + desk.Actions.execute({ + action : "move", + source : file, + destination : dir + newFile + }, + function () { + this.updateDirectory(dir); + }, this); + }, + + /** + * Creates a new file + * @param node {Object} file node + */ + __newFileAction : function (node) { + var dir = node.getFullName(); + if (!node.getChildren) { + dir = desk.FileSystem.getFileDirectory(dir); + } + var baseName = prompt('enter new file name : ', "newFile"); + if (baseName !== null) { + desk.FileSystem.writeFile(dir + '/' + baseName, '', + function () { + this.updateDirectory(dir); + }.bind(this)); + } + }, + + /** + * Launches the text editor on the file + * @param node {Object} file node + */ + __viewEditAction : function (node) { + if (!node.getChildren) { + desk.Ace.TabbedEditor.open(node.getFullName());; + } + }, + + /** + * Creates he default menu + */ + __createDefaultStaticActions : function () { + var menu = new qx.ui.menu.Menu(); + + var hideButton = new qx.ui.menu.CheckBox("Show hidden files"); + hideButton.setBlockToolTip(false); + hideButton.setToolTipText("Enable this to see hidden files"); + hideButton.addListener("changeValue", function (event) { + this.__displayHiddenFiles = event.getData(); + this.__files.refresh(); + }, this); + menu.add(hideButton); + + // the default "open" button + var openButton = new qx.ui.menu.Button("Open"); + openButton.addListener("execute", this.__onDbltap, this); + + menu.addSeparator(); + menu.add(openButton); + menu.addSeparator(); + + this.__actionButton = new qx.ui.menu.Button("Actions"); + menu.add(this.__actionButton); + menu.addSeparator(); + + this.__files.setContextMenu(menu); + qx.util.DisposeUtil.disposeTriggeredBy(menu, this); + + this.__actionListener = desk.Actions.getInstance().addListener( 'update', this.__updateActions, this); + this.__updateActions(); + + if (desk.Actions.getInstance().getSettings().permissions < 1) { + return; + } + + this.addAction("OOC Volume viewer", this.__OOCViewAction, this); + this.addAction("download", this.__downloadAction, this); + this.addAction("upload", this.__uploadAction, this); + this.addAction("view/edit text", this.__viewEditAction, this); + this.addAction("new directory", this.__newDirectoryAction, this); + this.addAction("delete", this.__deleteAction, this); + this.addAction('rename', this.__renameAction, this); + this.addAction('new file', this.__newFileAction, this); + this.addAction('properties', function (node) { + // console.log(node); + alert(node.getName() + " : " + node.getSize() + " bytes"); + }); + }, + + /** + * updates action list + */ + __updateActions : function () { + this.__files.addListenerOnce( "contextmenu", function (e) { + const actionMenu = new qx.ui.menu.Menu(); + this.__actionButton.setMenu( actionMenu ); + const actions = desk.Actions.getInstance().getSettings().actions; + const libs = {}; + + for ( let [ name, action ] of Object.entries(actions) ) { + if ( !libs[ action.lib ] ) libs[ action.lib ] = []; + libs[ action.lib ].push( name ); + } + + for ( let lib of Object.keys( libs ).sort( this.__caseInsensitiveSort ) ) { + const menu = new qx.ui.menu.Menu(); + const menubutton = new qx.ui.menu.Button( lib, null, null, menu ); + for ( let name of libs[ lib ].sort( this.__caseInsensitiveSort ) ) { + if ( actions[ name ].alias == name ) continue; + const button = new qx.ui.menu.Button( name ); + const description = actions[ name ].description; + if ( description ) { + button.setBlockToolTip( false ); + button.setToolTipText( description ); + } + button.addListener( "execute", this.__launch, this ); + menu.add( button ); + } + actionMenu.add( menubutton ); + } + }, this); + }, + + /** + * fired when an action is launched via the action menu + * @param e {qx.event.type.Event} button event + */ + __launch : function (e) { + var name = e.getTarget().getLabel(); + var action = new desk.Action(name, {standalone : true}); + _.some(desk.Actions.getInstance().getSettings().actions[name].parameters, function (param) { + if ((param.type !== "file") && (param.type !== "directory")) { + return false; + } + var parameters = {}; + parameters[param.name] = this.getSelectedFiles()[0]; + action.setParameters(parameters); + return true; + }.bind(this)); + action.setOutputDirectory("actions/"); + }, + + /** + * Adds a new action in context menu + * @param actionName {String} : label for the action + * @param callback {Function} : callback for the action + * @param context {Object} : optional context for the callback + */ + addAction : function (actionName, callback, context) { + if (this.__actionNames.indexOf(actionName) == -1) { + this.__actionNames.push(actionName); + } else { + console.log ('Warning : action "' + actionName + '" already exists, is overwritten!'); + } + + this.__actionCallbacks[actionName] = callback; + + var button = new qx.ui.menu.Button(actionName); + button.setUserData("fileBrowser", this); + button.setUserData("actionName", actionName); + button.addListener("execute", function (e) { + var fileBrowser = button.getUserData("fileBrowser"); + var actionName = button.getUserData("actionName"); + var node = fileBrowser.__files.getSelection().getItem(0); + fileBrowser.__actionCallbacks[actionName].call(context, node); + }, this); + this.__files.getContextMenu().add(button); + }, + + /** + * Changes the callback when a double click is performed + * @param callback {Function} callback when a file is double clicked + */ + setFileHandler : function (callback) { + this.__fileHandler = callback; + }, + + /** + * Returns the qx.ui.treevirtual.TreeVirtual underneath + * @return {qx.ui.treevirtual.TreeVirtual} the virtual tree + */ + getTree : function () { + return this.__files; + }, + + __draggedNodes : null, + + /** + * Returns an array containing currently selected files + * @return {Array} array of files (strings) + */ + getSelectedFiles : function () { + return this.__draggedNodes || this.__files.getSelection() + .toArray().map(function(node) { + return node.getFullName() + }); + }, + + /** + * Returns the base directory + * @return {String} base directory + */ + getRootDir : function () { + var baseDir = this.__baseDir + '/'; + if (baseDir.charAt(baseDir.length - 1) === '/') { + baseDir = baseDir.substring(0, baseDir.length -1); + } + return baseDir; + }, + + /** + * Returns node matching the file string, null if it does not exist + * @param file {String} the file + * @return {Object} the file node + */ + __getFileNode : function (file) { + var baseDir = this.getRootDir(); + if (file.indexOf(baseDir) !== 0) { + return null; + } + var inFile = file.substring(baseDir.length + 1); + var hierarchy = inFile.length ? inFile.split('/') : [""]; + if (hierarchy[hierarchy.length - 1].length === 0) { + hierarchy.pop(); + } + var node = this.__root; + for (var i = 0; i < hierarchy.length; i++) { + if (!_.find(node.getChildren().toArray(), function (child) { + if (child.getName() === hierarchy[i]) { + node = child; + return true; + } + return false; + })) { + return null; + } + } + return node; + }, + + /** + * Updates a directory + * @param file {String} directory to update + */ + updateDirectory : function (file) { + this.__fileBrowsers.forEach(function (browser) { + var nodeId = browser.__getFileNode(file); + if (nodeId) { + browser.__expandDirectoryListing(nodeId); + } + }); + }, + + /** + * Updates directories for all matching file browsers + * @param files {Array} array of directories/files + */ + __updateDirectories : function (files) { + _.uniq(files).forEach(this.updateDirectory, this); + }, + + /** + * sorting function to + * @param a {String} first element to compare + * @param b {String} second element to compare + * @return {Boolean} returns true if a < b + */ + __caseInsensitiveSort : function (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }, + + /** + * sorting function to + * @param a {String} first element to compare + * @param b {String} second element to compare + * @return {Boolean} returns true if a < b + */ + __caseInsensitiveSort2 : function (a, b) { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); + }, + + /** + * populates directory node with contained files + * @param node {Object} directory node to populate + */ + __expandDirectoryListing : function(node) { + var directory = node.getFullName(); + var children = node.getChildren(); + desk.FileSystem.readDir(directory, function (err, files) { + children.removeAll(); + files.sort(this.__caseInsensitiveSort2) + files.forEach(function (file) { + file.fullName = directory + "/" + file.name; + if (file.isDirectory) { + file.children = []; + file.loading = false; + var model = qx.data.marshal.Json.createModel(file); + children.push(model); + model.getChildren().push( + qx.data.marshal.Json.createModel({name: "Loading", loading : false}) + ); + } + }); + files.forEach(function (file) { + if (!file.isDirectory) { + file.loading = false; + children.push(qx.data.marshal.Json.createModel(file)); + } + }); + this.__files.refresh(); + }, this); + }, + + __parentMap : new Map(), + __pathPart : new qx.ui.toolbar.Part(), + __tableModel : new qx.ui.table.model.Simple(), + __sortCriterion : "name", + __sortDescending : "false", + __tree : new qx.ui.tree.Tree(), + __treeController : new qx.data.controller.Tree(), + __currDir : null, + + __createToolbar : function() { + // Toolbar for navigation buttons and search + var toolbar = new qx.ui.toolbar.ToolBar(); + this.add(toolbar); + + // Create navigation buttons (prev and next) + var prevButton = new qx.ui.toolbar.Button("<"); + var nextButton = new qx.ui.toolbar.Button(">"); + toolbar.add(prevButton); + toolbar.add(nextButton); + + // Create a toolbar part for the folder path + this.__pathPart = new qx.ui.toolbar.Part(); + toolbar.add(this.__pathPart); + }, + + __populateParentMap : function(node, parent) { + var self = this; + this.__parentMap.set(node, parent); + if (typeof node.getChildren === "function") { + let children = node.get("children"); + if (children) { + children.toArray().forEach(function(child) { + self.__populateParentMap(child, node); + }, this); + } + } + }, + + __updateFolderPath : function(folder) { + this.__pathPart.removeAll(); + + var self = this; + let path = []; + // console.log(folder); + // console.log(this.__parentMap); + // this.__populateParentMap(self.__files, null); + // console.log(this.__parentMap); + while(folder) { + path.unshift(folder.get("name")); + folder = self.__parentMap.get(folder); + } + + // console.log(path); + + path.forEach(function(part, index) { + let button = new qx.ui.toolbar.Button(part); + self.__pathPart.add(button); + + button.addListener("execute", function() { + let selectedFolder; + for (let [key, _] of this.__parentMap.entries()) { + if (ket.getName() === part) { + selectedFolder = key; + } + } + self.__files.setSelection([selectedFolder]); + }); + + if (index < path.length - 1) { + pathPart.add(new qx.ui.toolbar.Separator()); + } + }); + }, + + __changeSelection : function(e) { + let selectedFolder = this.__files.getSelection().getItem(0); + + if (selectedFolder && selectedFolder.getChildren) { + var model = qx.data.marshal.Json.createModel(selectedFolder); + this.__treeController.setModel(model); + this.__tree.getRoot().setOpen(true); + this.__tree.setHideRoot(true); + } + // if (typeof selectedFolder.getChildren === "function") { + // let files = selectedFolder.getChildren().toArray(); + + // let rowData = files.map((file) => { + // // console.log(file); + // if (file.getSize) { + // var date = new Date(file.getMtime()); + + // // Extract the day, month, and year components + // let day = date.getDate(); + // let month = date.getMonth() + 1; // Months are zero-based, so add 1 + // let year = date.getFullYear(); + + // // Pad single-digit day and month with leading zeros + // day = day < 10 ? '0' + day : day; + // month = month < 10 ? '0' + month : month; + + // // Format the date as dd/mm/yyyy + // var formattedDate = day + '/' + month + '/' + year; + + // return [file.getName(), formattedDate, file.getSize() + " KB"]; + // } + // return [file.getName()]; + // }); + + // this.__tableModel.setData(rowData); + // } + + this.__updateFolderPath(selectedFolder); + }, + + __getExpandedContainer : function() { + const all = new qx.ui.container.Composite(new qx.ui.layout.VBox()); + this.__tableModel.setColumns(["Name", "Date", "Size"]); + + //Sort + this.__tableModel.setSortMethods(1, function(row1, row2) { + let date1 = new Date(row1[1]); + let date2 = new Date(row2[1]); + return date1.getTime() - date2.getTime(); + }); + + this.__tableModel.setSortMethods(2, function(row1, row2) { + let size1 = parseInt(row1[2].split(" ")[0]); + let size2 = parseInt(row2[2].split(" ")[0]); + return size1 - size2; + }) + + let table = new qx.ui.table.Table(this.__tableModel); + table.set({ + columnVisibilityButtonVisible: false, + statusBarVisible: false + }); + + // table.addListener("cellTap", function(e) { + // let rowIndex = e.getRow(); + // let rowData = table.getTableModel().getRowData(rowIndex); + // table.getSelectionModel().setSelectionInterval(rowIndex, rowIndex); + // }); + + // table.getTableColumnModel().setDataCellRenderer(0, new desk.IconTextCellRenderer()); + + table.setColumnWidth(0, 200); + table.setColumnWidth(1, 100); + table.setColumnWidth(2, 100); + + + all.add(table, {flex: 1}); + + return all + }, + + __setDelegateTreeColumns : function() { + this.__files.setDelegate({ + bindItem : function(controller, item, id) { + controller.bindDefaultProperties(item, id); + controller.bindProperty("name", "label", null, item, id); + controller.bindProperty("size", "size", null, item, id); + }, + + configureItem : function(item) { + if (item.getUserData("timeoutId")) { + clearTimeout(item.getUserData("timeoutId")); + } + + var timeoutId = setTimeout(() => { + // if (item.getSize() === null) { + // console.log(item.getIcon()); + var name = item.getLabel(); + var size = item.getSize(); + //Name + item.addLabel(name); + item.addWidget(new qx.ui.core.Spacer(), { flex: 1 }); + + // // Date + // let dateLabel; + // if(typeof model.getMtime === "function") { + // var date = new Date(model.getMtime()); + // // Extract the day, month, and year components + // let day = date.getDate(); + // let month = date.getMonth() + 1; // Months are zero-based, so add 1 + // let year = date.getFullYear(); + + // // Pad single-digit day and month with leading zeros + // day = day < 10 ? '0' + day : day; + // month = month < 10 ? '0' + month : month; + + // // Format the date as dd/mm/yyyy + // var formattedDate = day + '/' + month + '/' + year; + // dateLabel = new qx.ui.basic.Label(formattedDate); + // dateLabel.setWidth(150); + // // item.addWidget(text); + // } else { + // dateLabel = new qx.ui.basic.Label(""); + // dateLabel.setWidth(150); + // // item.addWidget(text); + // } + + // //Size + // let sizeLabel; + // if(model.getSize) { + // sizeLabel = new qx.ui.basic.Label(model.getSize() + " kb"); + // sizeLabel.setWidth(100); + // // item.addWidget(text); + // } else { + // sizeLabel = new qx.ui.basic.Label(""); + // sizeLabel.setWidth(100); + // // item.addWidget(text); + // } + + sizeLabel = new qx.ui.basic.Label(size + " kb"); + sizeLabel.setWidth(100); + // item.addWidget(dateLabel); + item.addWidget(sizeLabel); + // self.__files.refresh(); + // } + + }, 200); + + item.setUserData("timeoutId", timeoutId); + }, + + // sorter: function(a, b) { + // var propA = a.get(this.__sortCriterion).toLowerCase(); + // var propB = b.get(this.__sortCriterion).toLowerCase(); + + // var result = this.__sortDescending ? propA.localeCompare(propB) : propB.localeCompare(propA); + + // return result; + // }, + + createItem : function() { + return new desk.CustomTreeItem(); + }, + }) + }, + + __createSortToolbar : function () { + var self = this; + var toolbar = new qx.ui.toolbar.ToolBar(); + // var model = this.__files.getModel(); + + var nameButton = new qx.ui.toolbar.Button("Sort by Name"); + nameButton.addListener("execute", function() { + var model = this.__treeController.getModel(); + this.__sortCriterion = "name"; + this.__sortDescending = !(this.__sortDescending); + console.log(model.getChildren().sort(this.__sort)); + this.__treeController.setModel(null); + this.__treeController.setModel(model); + this.__tree.getRoot().setOpen(true); + + }, this); + toolbar.add(nameButton, { flex : 1}); + + var dateButton = new qx.ui.toolbar.Button("Sort by Date"); + toolbar.add(dateButton, { flex : 1}); + + var sizeButton = new qx.ui.toolbar.Button("Sort by Size"); + toolbar.add(sizeButton, { flex : 1}); + + return toolbar; + + }, + + __createTree : function() { + this.__treeController = new qx.data.controller.Tree( + null, + this.__tree, + "children", + "name", + ); + + this.__treeController.setDelegate({ + configureItem : function (item) { + setTimeout(() => { + if (item.getLabel() !== "Loading") { + var model = item.getModel(); + + // Icon + let iconLabel; + if(model.getChildren) { + iconLabel = "icon/22/places/folder.png"; + } else { + iconLabel = "icon/22/mimetypes/office-document.png" + } + item.setIcon(iconLabel); + + // Name + var nameLabel = item.getLabel(); + item.addLabel(nameLabel); + item.addWidget(new qx.ui.core.Spacer(), { flex: 1 }); + + // Date + let dateLabel; + if(typeof model.getMtime === "function") { + var date = new Date(model.getMtime()); + // Extract the day, month, and year components + let day = date.getDate(); + let month = date.getMonth() + 1; // Months are zero-based, so add 1 + let year = date.getFullYear(); + + // Pad single-digit day and month with leading zeros + day = day < 10 ? '0' + day : day; + month = month < 10 ? '0' + month : month; + + // Format the date as dd/mm/yyyy + var formattedDate = day + '/' + month + '/' + year; + dateLabel = new qx.ui.basic.Label(formattedDate); + dateLabel.setWidth(150); + } else { + dateLabel = new qx.ui.basic.Label(""); + dateLabel.setWidth(150); + } + item.addWidget(dateLabel); + + // Size + let sizeLabel; + if(model.getSize) { + sizeLabel = new qx.ui.basic.Label(model.getSize() + " kb"); + sizeLabel.setWidth(100); + } else { + sizeLabel = new qx.ui.basic.Label(""); + sizeLabel.setWidth(100); + } + item.addWidget(sizeLabel); + } + + }, 100); + }, + + sorter : function(a, b) { + // console.log(a); + var propA = a.get(this.__sortCriterion).toLowerCase(); + var propB = b.get(this.__sortCriterion).toLowerCase(); + var result = this.__sortDescending ? propA.localeCompare(propB) : propB.localeCompare(propA); + + return result; + }.bind(this), + + }); + }, + + __sort : function(a, b) { + // console.log(a); + var propA = a.get(this.__sortCriterion).toLowerCase(); + var propB = b.get(this.__sortCriterion).toLowerCase(); + var result = this.__sortDescending ? propA.localeCompare(propB) : propB.localeCompare(propA); + + return result; + }, + } +}); + +new desk.FileBrowser3("code", true); \ No newline at end of file From 11b3c3919da7d71ddb120dd2db69a0b0c09e1350 Mon Sep 17 00:00:00 2001 From: nhh1603 Date: Fri, 2 Feb 2024 09:45:18 +0100 Subject: [PATCH 2/2] add the gallery view, still need some changes but all important code has been implemented --- source/class/desk/AbstractGallery.js | 151 +++++++++++++++++++++++++++ source/class/desk/FileBrowser3.js | 9 +- source/class/desk/GalleryCell.js | 45 ++++++++ source/class/desk/WidgetGallery.js | 97 +++++++++++++++++ 4 files changed, 300 insertions(+), 2 deletions(-) create mode 100644 source/class/desk/AbstractGallery.js create mode 100644 source/class/desk/GalleryCell.js create mode 100644 source/class/desk/WidgetGallery.js diff --git a/source/class/desk/AbstractGallery.js b/source/class/desk/AbstractGallery.js new file mode 100644 index 0000000..2bd0b3e --- /dev/null +++ b/source/class/desk/AbstractGallery.js @@ -0,0 +1,151 @@ +qx.Class.define("desk.AbstractGallery", { + extend: qx.ui.window.Window, + type: "abstract", + + construct(title, folder) { + this.base(arguments, title); + + this.folder = folder; + + this.set({ + contentPadding: 0, + // showClose: false, + showMinimize: false, + width: 320, + height: 400, + }); + + this.setLayout(new qx.ui.layout.Grow()); + this.moveTo(30, 50); + this.open(); + + this.itemHeight = 65; + this.itemWidth = 70; + this.itemCount = 431; + this.itemPerLine = 1; + // this.items = this._generateItems(this.itemCount); + this.items = this._generateItems(this.folder); + + var scroller = this._createScroller(); + scroller.set({ + scrollbarX: "off", + scrollbarY: "auto", + }); + + scroller.getPane().addListener("resize", this._onPaneResize, this); + this.add(scroller); + + this.manager = new qx.ui.virtual.selection.CellRectangle( + scroller.getPane(), + this + ).set({ + mode: "multi", + drag: true, + }); + + this.manager.attachPointerEvents(); + this.manager.attachKeyEvents(scroller); + }, + + members: { + folder : null, + + getItemData(row, column) { + return this.items[row * this.itemPerLine + column]; + }, + + _createScroller() { + // abstract method + }, + + isItemSelectable(item) { + return !!this.getItemData(item.row, item.column); + }, + + styleSelectable(item, type, wasAdded) { + // abstract method + }, + + _onPaneResize(e) { + var pane = e.getTarget(); + var width = e.getData().width; + + var colCount = Math.max(1, Math.floor(width / this.itemWidth)); + if (colCount == this.itemsPerLine) { + return; + } + this.itemPerLine = colCount; + var rowCount = Math.ceil(this.itemCount / colCount); + + pane.getColumnConfig().setItemCount(colCount); + pane.getRowConfig().setItemCount(rowCount); + }, + + // _generateItems(count) { + // var items = []; + // var iconImages = [ + // "folder.png", + // "user-trash.png", + // "network-server.png", + // "network-workgroup.png", + // "user-desktop.png", + // "file.png", + // ]; + + // var aliasManager = qx.util.AliasManager.getInstance(); + // var resourceManager = qx.util.ResourceManager.getInstance(); + + // for (var i = 0; i < count; i++) { + // var icon = + // "icon/32/places/" + + // iconImages[Math.floor(Math.random() * iconImages.length)]; + // var resolved = aliasManager.resolve(icon); + // var url = resourceManager.toUri(resolved); + + // items[i] = { + // label: "Icon #" + (i + 1), + // icon: icon, + // resolvedIcon: url, + // }; + // } + + // return items; + // }, + + _generateItems(folder) { + var files = folder.getChildren().toArray(); + + var aliasManager = qx.util.AliasManager.getInstance(); + var resourceManager = qx.util.ResourceManager.getInstance(); + + var items = files.map((file) => { + var name = file.getName(); + var icon; + + if(file.getChildren) { + icon = "icon/22/places/folder.png"; + } else { + icon = "icon/22/mimetypes/office-document.png"; + } + + var resolved = aliasManager.resolve(icon); + var url = resourceManager.toUri(resolved); + + var item = { + label: name, + icon: icon, + resolvedIcon: url, + }; + return item; + }); + + return items; + + } + }, + + destruct() { + this.items = null; + this._disposeObjects("manager"); + }, +}); \ No newline at end of file diff --git a/source/class/desk/FileBrowser3.js b/source/class/desk/FileBrowser3.js index 5eaf6d6..b930486 100644 --- a/source/class/desk/FileBrowser3.js +++ b/source/class/desk/FileBrowser3.js @@ -1056,8 +1056,13 @@ qx.Class.define("desk.FileBrowser3", __changeSelection : function(e) { let selectedFolder = this.__files.getSelection().getItem(0); - + // console.log(selectedFolder.getChildren().toArray()); if (selectedFolder && selectedFolder.getChildren) { + // For instance, because of the constraint of time, this code allows us to show the detail of the + // folder in the Gallery form but in another window. Need some changes and add a button to alternate + // between 2 types of view + new desk.WidgetGallery(selectedFolder.getName(), selectedFolder); + var model = qx.data.marshal.Json.createModel(selectedFolder); this.__treeController.setModel(model); this.__tree.getRoot().setOpen(true); @@ -1267,7 +1272,7 @@ qx.Class.define("desk.FileBrowser3", if(model.getChildren) { iconLabel = "icon/22/places/folder.png"; } else { - iconLabel = "icon/22/mimetypes/office-document.png" + iconLabel = "icon/22/mimetypes/office-document.png"; } item.setIcon(iconLabel); diff --git a/source/class/desk/GalleryCell.js b/source/class/desk/GalleryCell.js new file mode 100644 index 0000000..05074a1 --- /dev/null +++ b/source/class/desk/GalleryCell.js @@ -0,0 +1,45 @@ +qx.Class.define("desk.GalleryCell", { + extend: qx.ui.virtual.cell.AbstractWidget, + + members: { + _createWidget() { + var widget = new qx.ui.basic.Atom().set({ + iconPosition: "top", + }); + + widget.getChildControl("label").set({ + padding: [0, 4], + }); + + widget.getChildControl("icon").set({ + padding: 4, + }); + + return widget; + }, + + updateData(widget, data) { + widget.set({ + icon: data.icon, + label: data.label, + }); + }, + + updateStates(widget, states) { + var label = widget.getChildControl("label"); + var icon = widget.getChildControl("icon"); + + if (states.selected) { + label.setBackgroundColor("background-selected"); + label.setTextColor("text-selected"); + icon.setDecorator("white-box"); + icon.setBackgroundColor("background"); + } else { + label.resetBackgroundColor(); + label.resetTextColor(); + icon.resetDecorator(); + icon.resetBackgroundColor(); + } + }, + }, +}); diff --git a/source/class/desk/WidgetGallery.js b/source/class/desk/WidgetGallery.js new file mode 100644 index 0000000..684e438 --- /dev/null +++ b/source/class/desk/WidgetGallery.js @@ -0,0 +1,97 @@ +qx.Class.define("desk.WidgetGallery", { + extend: desk.AbstractGallery, + + construct(title, folder) { + this.base(arguments, title, folder); + this.__cell = new desk.GalleryCell(); + }, + + members: { + __cell: null, + + _createScroller() { + var scroller = new qx.ui.virtual.core.Scroller( + 1, + this.itemPerLine, + this.itemHeight, + this.itemWidth + ); + + this.layer = new qx.ui.virtual.layer.WidgetCell(this); + scroller.getPane().addLayer(this.layer); + + // Creates the prefetch behavior + new qx.ui.virtual.behavior.Prefetch(scroller, { + minLeft: 0, + maxLeft: 0, + minRight: 0, + maxRight: 0, + minAbove: 200, + maxAbove: 300, + minBelow: 600, + maxBelow: 800, + }).set({ + interval: 500, + }); + + return scroller; + }, + + styleSelectable(item, type, wasAdded) { + if (type !== "selected") { + return; + } + + var widgets = this.layer.getChildren(); + for (var i = 0; i < widgets.length; i++) { + var widget = widgets[i]; + var cell = widget.getUserData("cell"); + + if (item.row !== cell.row || item.column !== cell.column) { + continue; + } + + if (wasAdded) { + this.__cell.updateStates(widget, { selected: 1 }); + } else { + this.__cell.updateStates(widget, {}); + } + } + }, + + getCellWidget(row, column) { + var itemData = this.getItemData(row, column); + + if (!itemData) { + return null; + } + + var cell = { row: row, column: column }; + var states = {}; + if (this.manager.isItemSelected(cell)) { + states.selected = true; + } + + var widget = this.__cell.getCellWidget(itemData, states); + widget.setUserData("cell", cell); + + return widget; + }, + + poolCellWidget(widget) { + this.__cell.pool(widget); + }, + }, + + /* + ***************************************************************************** + DESTRUCT + ***************************************************************************** + */ + + destruct() { + this._disposeObjects("__cell", "layer"); + }, +}); + +// new desk.WidgetGallery("Gallery (widgets)"); \ No newline at end of file