diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000..f05e3b0 Binary files /dev/null and b/dump.rdb differ diff --git a/package.json b/package.json index c09d894..148c7b6 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "numeral": "^2.0.6", "passport": "^0.4.0", "passport-jwt": "^4.0.0", + "pdf-creator-node": "^2.3.4", "pm2": "^5.1.0", "redis": "^3.1.2", "sequelize": "^6.6.5", diff --git a/src/modules/inventory/stockCorrection/controller.js b/src/modules/inventory/stockCorrection/controller.js index 90b5add..2b563e7 100644 --- a/src/modules/inventory/stockCorrection/controller.js +++ b/src/modules/inventory/stockCorrection/controller.js @@ -1,4 +1,6 @@ const httpStatus = require('http-status'); +const fs = require('fs'); +const pdf = require('pdf-creator-node'); const catchAsync = require('@src/utils/catchAsync'); const apiServices = require('./services/apis'); @@ -164,6 +166,23 @@ const deleteFormRejectByToken = catchAsync(async (req, res) => { res.status(httpStatus.OK).send({ data: stockCorrection, meta: { projectName: project.name } }); }); +const generatePdf = catchAsync(async (req, res) => { + const { + currentTenantDatabase, + params: { stockCorrectionId }, + } = req; + const {document, options} = await new apiServices.GeneratePdf(currentTenantDatabase, stockCorrectionId).call(); + + pdf.create(document, options).then((stream) => { + const file = fs.createReadStream(stream.path); + const stat = fs.statSync(stream.path); + res.setHeader('Content-Length', stat.size); + res.setHeader('Content-Type', 'application/pdf'); + res.setHeader('Content-Disposition', `attachment; filename=stock-correction.pdf`); + return file.pipe(res); + }); +}); + module.exports = { findAll, findOne, @@ -178,4 +197,5 @@ module.exports = { deleteFormApproveByToken, deleteFormReject, deleteFormRejectByToken, + generatePdf, }; diff --git a/src/modules/inventory/stockCorrection/models/stockCorrectionItem.model.js b/src/modules/inventory/stockCorrection/models/stockCorrectionItem.model.js index 67f65a7..fdc48f0 100644 --- a/src/modules/inventory/stockCorrection/models/stockCorrectionItem.model.js +++ b/src/modules/inventory/stockCorrection/models/stockCorrectionItem.model.js @@ -5,7 +5,6 @@ module.exports = (sequelize, DataTypes, projectCode) => { class StockCorrectionItem extends Model { static associate({ [projectCode]: models }) { this.belongsTo(models.StockCorrection, { as: 'stockCorrection', onUpdate: 'CASCADE', onDelete: 'CASCADE' }); - this.belongsTo(models.Allocation, { as: 'allocation', onDelete: 'RESTRICT' }); this.belongsTo(models.Item, { as: 'item', onUpdate: 'RESTRICT', onDelete: 'RESTRICT' }); } @@ -20,13 +19,6 @@ module.exports = (sequelize, DataTypes, projectCode) => { type: DataTypes.INTEGER.UNSIGNED, allowNull: false, }, - initialStock: { - type: DataTypes.DECIMAL, - allowNull: true, - get() { - return parseFloat(this.getDataValue('initialStock')); - }, - }, quantity: { type: DataTypes.DECIMAL, allowNull: false, @@ -34,13 +26,6 @@ module.exports = (sequelize, DataTypes, projectCode) => { return parseFloat(this.getDataValue('quantity')); }, }, - finalStock: { - type: DataTypes.DECIMAL, - allowNull: true, - get() { - return parseFloat(this.getDataValue('finalStock')); - }, - }, expiryDate: { type: DataTypes.DATE, allowNull: true, @@ -69,9 +54,6 @@ module.exports = (sequelize, DataTypes, projectCode) => { type: DataTypes.STRING, allowNull: true, }, - allocationId: { - type: DataTypes.INTEGER, - }, }, { hooks: {}, diff --git a/src/modules/inventory/stockCorrection/routes.js b/src/modules/inventory/stockCorrection/routes.js index c455180..c0948b6 100644 --- a/src/modules/inventory/stockCorrection/routes.js +++ b/src/modules/inventory/stockCorrection/routes.js @@ -113,4 +113,13 @@ router controller.updateForm ); +// ADD WATERMARK ON REJECTED STOCK-CORRECTION PDF +router + .route('/pdf/:stockCorrectionId') + .get( + celebrate(requestValidations.requireAuth), + celebrate(requestValidations.requireStockCorrectionId), + controller.generatePdf + ); + module.exports = router; diff --git a/src/modules/inventory/stockCorrection/services/apis/GeneratePdf.js b/src/modules/inventory/stockCorrection/services/apis/GeneratePdf.js new file mode 100644 index 0000000..123871f --- /dev/null +++ b/src/modules/inventory/stockCorrection/services/apis/GeneratePdf.js @@ -0,0 +1,84 @@ +const fs = require('fs'); +const httpStatus = require('http-status'); +const ApiError = require('@src/utils/ApiError'); + +class GeneratePdf { + constructor(tenantDatabase, stockCorrectionId) { + this.tenantDatabase = tenantDatabase; + this.stockCorrectionId = stockCorrectionId; + } + + async call() { + let items = []; + let templatePath = 'stockCorrection'; + + const stockCorrection = await this.tenantDatabase.StockCorrection.findOne({ + where: { + id: this.stockCorrectionId, + }, + include: [ + { + model: this.tenantDatabase.Form, + as: 'form', + include: [ + { model: this.tenantDatabase.User, as: 'createdByUser' }, + { model: this.tenantDatabase.User, as: 'requestApprovalToUser' }, + ], + }, + { model: this.tenantDatabase.Warehouse, as: 'warehouse' }, + { + model: this.tenantDatabase.StockCorrectionItem, + as: 'items', + include: [ + { model: this.tenantDatabase.Item, as: 'item', include: [{ model: this.tenantDatabase.ItemUnit, as: 'units' }] }, + ], + }, + ], + }); + if (!stockCorrection) { + throw new ApiError(httpStatus.NOT_FOUND, 'Stock correction is not exist'); + } + + const date = new Date(stockCorrection.form.date).toLocaleDateString('id', { dateStyle: 'long' }); + stockCorrection.items.forEach((e) => { + let obj = {}; + obj.item = e.item.name; + obj.stockDatabase = parseInt(e.item.stock); + obj.stockCorrectionQty = e.quantity; + obj.balance = parseInt(e.item.stock) - e.quantity; + items.push(obj); + }); + + if (stockCorrection.form.approvalStatus === 0) { + templatePath = 'stockCorrectionWatermarked'; + } + + const html = fs.readFileSync(`src/modules/inventory/stockCorrection/templates/${templatePath}.html`, 'utf-8'); + const options = { + height: '297mm', + width: '210mm', + orientation: 'portrait', + localUrlAccess: true, + }; + + const document = { + html, + data: { + date, + formNumber: stockCorrection.form.number, + warehouse: stockCorrection.warehouse.name, + address: stockCorrection.warehouse.address, + phone: stockCorrection.warehouse.phone, + items, + createdBy: stockCorrection.form.createdByUser?.name, + approveBy: stockCorrection.form.requestApprovalToUser?.name, + }, + path: './stock-correction.pdf', + type: 'stream', + }; + + return {document, options} + } +} + +module.exports = GeneratePdf; diff --git a/src/modules/inventory/stockCorrection/services/apis/GeneratePdf.test.js b/src/modules/inventory/stockCorrection/services/apis/GeneratePdf.test.js new file mode 100644 index 0000000..f6effcc --- /dev/null +++ b/src/modules/inventory/stockCorrection/services/apis/GeneratePdf.test.js @@ -0,0 +1,27 @@ +const httpStatus = require('http-status'); +const ApiError = require('@src/utils/ApiError'); +const tenantDatabase = require('@src/models').tenant; +const GeneratePdf = require('./GeneratePdf'); + +describe('Stock Correction - Generate Pdf', () => { + describe('validations', () => { + it('throw error when stock correction is not exist', async () => { + await expect(async () => { + await new GeneratePdf(tenantDatabase, (stockCorrectionId = 'invalid-id')).call(); + }).rejects.toThrow(new ApiError(httpStatus.NOT_FOUND, 'Stock correction is not exist')); + }); + }); + + describe('success', () => { + let options; + it('Pdf Generated', async () => { + ({ options } = await new GeneratePdf(tenantDatabase, 1).call()); + expect(options).toEqual({ + height: '297mm', + width: '210mm', + orientation: 'portrait', + localUrlAccess: true, + }); + }); + }); +}); diff --git a/src/modules/inventory/stockCorrection/services/apis/index.js b/src/modules/inventory/stockCorrection/services/apis/index.js index 4093275..6bec9d4 100644 --- a/src/modules/inventory/stockCorrection/services/apis/index.js +++ b/src/modules/inventory/stockCorrection/services/apis/index.js @@ -11,6 +11,7 @@ const DeleteFormRequest = require('./DeleteFormRequest'); const FindAll = require('./FindAll'); const FindOne = require('./FindOne'); const UpdateForm = require('./UpdateForm'); +const GeneratePdf = require('./GeneratePdf'); module.exports = { CreateFormRequest, @@ -26,4 +27,5 @@ module.exports = { FindAll, FindOne, UpdateForm, + GeneratePdf, }; diff --git a/src/modules/inventory/stockCorrection/templates/stockCorrection.html b/src/modules/inventory/stockCorrection/templates/stockCorrection.html new file mode 100644 index 0000000..30b6769 --- /dev/null +++ b/src/modules/inventory/stockCorrection/templates/stockCorrection.html @@ -0,0 +1,63 @@ + + + + + + + Stock Correction + + +
+ +
+

Stock Correction

+

PT.GANESHA MANDIRI BHAKTI

+

Jln. Musi No 21 Tegalsari Surabaya

+

Phone : (021)-29339383

+
+
+
+
+
+

Date : {{date}}

+

Form Number : {{formNumber}}

+
+
+

Warehouse : {{warehouse}}

+

Addrress : {{address}}

+

Phone Number : {{phone}}

+
+
+
+ + + + + + + + + {{#each items}} + + + + + {{/each}} + +
ItemStock DatabaseStock CorrectionBalance
{{this.item}}{{this.stockDatabase}}{{this.stockCorrectionQty}}{{this.balance}}
+
+
+
+

CreatedBy

+

{{createdBy}}

+
+
+

ApprovedBy

+

{{approveBy}}

+
+
+ + diff --git a/src/modules/inventory/stockCorrection/templates/stockCorrectionWatermarked.html b/src/modules/inventory/stockCorrection/templates/stockCorrectionWatermarked.html new file mode 100644 index 0000000..692298e --- /dev/null +++ b/src/modules/inventory/stockCorrection/templates/stockCorrectionWatermarked.html @@ -0,0 +1,64 @@ + + + + + + + Stock Correction + + +
Cancelled
+
+ +
+

Stock Correction

+

PT.GANESHA MANDIRI BHAKTI

+

Jln. Musi No 21 Tegalsari Surabaya

+

Phone : (021)-29339383

+
+
+
+
+
+

Date : {{date}}

+

Form Number : {{formNumber}}

+
+
+

Warehouse : {{warehouse}}

+

Addrress : {{address}}

+

Phone Number : {{phone}}

+
+
+
+ + + + + + + + + {{#each items}} + + + + + {{/each}} + +
ItemStock DatabaseStock CorrectionBalance
{{this.item}}{{this.stockDatabase}}{{this.stockCorrectionQty}}{{this.balance}}
+
+
+
+

CreatedBy

+

{{createdBy}}

+
+
+

ApprovedBy

+

{{approveBy}}

+
+
+ + diff --git a/yarn.lock b/yarn.lock index 521042d..cb76fea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2738,7 +2738,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.2: +concat-stream@^1.5.2, concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3301,6 +3301,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -3731,6 +3736,16 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-zip@^1.6.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + extract-zip@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -3997,6 +4012,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -4239,6 +4263,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== +graceful-fs@^4.1.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -4339,6 +4368,14 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hasha@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + integrity sha512-jZ38TU/EBiGKrmyTNNZgnvCZHNowiRI4+w/I9noMlekHTZH3KyGgvJLmhSgykeAQ9j2SYPDosM0Bg3wHfzibAQ== + dependencies: + is-stream "^1.0.1" + pinkie-promise "^2.0.0" + helmet@^4.1.0: version "4.6.0" resolved "https://registry.yarnpkg.com/helmet/-/helmet-4.6.0.tgz#579971196ba93c5978eb019e4e8ec0e50076b4df" @@ -4370,6 +4407,13 @@ html-pdf-node@^1.0.7: handlebars "^4.7.6" puppeteer "^5.1.0" +html-pdf@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-pdf/-/html-pdf-3.0.1.tgz#5a8f7b6bd49d624345938952f24b47e4a08f14db" + integrity sha512-CKNSacmQn+CKJ2GNfT4UYKaPy/T3Ndj82yJ2aju/UPmnvWNjIpyumqRqkFU0mwT6BTHBFhFGTnXN8dBn4Bdj0Q== + optionalDependencies: + phantomjs-prebuilt "^2.1.16" + http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -4839,7 +4883,7 @@ is-shared-array-buffer@^1.0.1: resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== -is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -5513,6 +5557,13 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -5563,6 +5614,11 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +kew@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + integrity sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ== + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -5594,6 +5650,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + optionalDependencies: + graceful-fs "^4.1.9" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -6670,6 +6733,14 @@ pause@0.0.1: resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= +pdf-creator-node@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/pdf-creator-node/-/pdf-creator-node-2.3.4.tgz#d860217b29d7ad73026d027bea579ed24805140f" + integrity sha512-em2s088cu1ipeiivmp6NKL5cDDBdC5UlLBHtHtKPw34ddC8Dbf+jP8sXhW6ql8ooTeKzsUVi624STkK4qY5zhQ== + dependencies: + handlebars "^4.7.6" + html-pdf "^3.0.1" + peek-readable@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.0.1.tgz#9a045f291db254111c3412c1ce4fec27ddd4d202" @@ -6685,6 +6756,21 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +phantomjs-prebuilt@^2.1.16: + version "2.1.16" + resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef" + integrity sha512-PIiRzBhW85xco2fuj41FmsyuYHKjKuXWmhjy3A/Y+CMpN/63TV+s9uzfVhsUwFe0G77xWtHBG8xmXf5BqEUEuQ== + dependencies: + es6-promise "^4.0.3" + extract-zip "^1.6.5" + fs-extra "^1.0.0" + hasha "^2.2.0" + kew "^0.7.0" + progress "^1.1.8" + request "^2.81.0" + request-progress "^2.0.1" + which "^1.2.10" + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" @@ -6702,6 +6788,18 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" @@ -6888,6 +6986,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + integrity sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw== + progress@^2.0.0, progress@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -7229,7 +7332,14 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -request@^2.88.2: +request-progress@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + integrity sha512-dxdraeZVUNEn9AvLrxkgB2k6buTlym71dJk1fk4v8j3Ou3RKNm07BcgbHdj2lLgYGfqX71F+awb1MR+tWPFJzA== + dependencies: + throttleit "^1.0.0" + +request@^2.81.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -8096,6 +8206,11 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== + through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -8603,7 +8718,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9: +which@^1.2.10, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==